ef432df5c465aadc3883a817af83e06dc971e04f9a7e260c96f9ab84f5eff157753a189d7f876910a045af2ed9db7c1b5d09f69ea16108bca775b0dc83074d 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. import { defineComponent, getCurrentInstance, ref, computed, watch, resolveComponent, resolveDirective, openBlock, createBlock, withCtx, createElementBlock, createElementVNode, normalizeClass, createVNode, Fragment, renderList, createTextVNode, toDisplayString, withDirectives, renderSlot } from 'vue';
  2. import { ElCheckbox } from '../../checkbox/index.mjs';
  3. import { ElIcon } from '../../icon/index.mjs';
  4. import { ArrowDown, ArrowUp } from '@element-plus/icons-vue';
  5. import { ElTooltip } from '../../tooltip/index.mjs';
  6. import { ElScrollbar } from '../../scrollbar/index.mjs';
  7. import _export_sfc from '../../../_virtual/plugin-vue_export-helper.mjs';
  8. import ClickOutside from '../../../directives/click-outside/index.mjs';
  9. import { useTooltipContentProps } from '../../tooltip/src/content.mjs';
  10. import { useLocale } from '../../../hooks/use-locale/index.mjs';
  11. import { useNamespace } from '../../../hooks/use-namespace/index.mjs';
  12. import { isPropAbsent } from '../../../utils/types.mjs';
  13. const { CheckboxGroup: ElCheckboxGroup } = ElCheckbox;
  14. const _sfc_main = defineComponent({
  15. name: "ElTableFilterPanel",
  16. components: {
  17. ElCheckbox,
  18. ElCheckboxGroup,
  19. ElScrollbar,
  20. ElTooltip,
  21. ElIcon,
  22. ArrowDown,
  23. ArrowUp
  24. },
  25. directives: { ClickOutside },
  26. props: {
  27. placement: {
  28. type: String,
  29. default: "bottom-start"
  30. },
  31. store: {
  32. type: Object
  33. },
  34. column: {
  35. type: Object
  36. },
  37. upDataColumn: {
  38. type: Function
  39. },
  40. appendTo: useTooltipContentProps.appendTo
  41. },
  42. setup(props) {
  43. const instance = getCurrentInstance();
  44. const { t } = useLocale();
  45. const ns = useNamespace("table-filter");
  46. const parent = instance == null ? void 0 : instance.parent;
  47. if (props.column && !parent.filterPanels.value[props.column.id]) {
  48. parent.filterPanels.value[props.column.id] = instance;
  49. }
  50. const tooltipVisible = ref(false);
  51. const tooltip = ref(null);
  52. const filters = computed(() => {
  53. return props.column && props.column.filters;
  54. });
  55. const filterClassName = computed(() => {
  56. if (props.column && props.column.filterClassName) {
  57. return `${ns.b()} ${props.column.filterClassName}`;
  58. }
  59. return ns.b();
  60. });
  61. const filterValue = computed({
  62. get: () => {
  63. var _a;
  64. return (((_a = props.column) == null ? void 0 : _a.filteredValue) || [])[0];
  65. },
  66. set: (value) => {
  67. if (filteredValue.value) {
  68. if (!isPropAbsent(value)) {
  69. filteredValue.value.splice(0, 1, value);
  70. } else {
  71. filteredValue.value.splice(0, 1);
  72. }
  73. }
  74. }
  75. });
  76. const filteredValue = computed({
  77. get() {
  78. if (props.column) {
  79. return props.column.filteredValue || [];
  80. }
  81. return [];
  82. },
  83. set(value) {
  84. var _a;
  85. if (props.column) {
  86. (_a = props.upDataColumn) == null ? void 0 : _a.call(props, "filteredValue", value);
  87. }
  88. }
  89. });
  90. const multiple = computed(() => {
  91. if (props.column) {
  92. return props.column.filterMultiple;
  93. }
  94. return true;
  95. });
  96. const isActive = (filter) => {
  97. return filter.value === filterValue.value;
  98. };
  99. const hidden = () => {
  100. tooltipVisible.value = false;
  101. };
  102. const showFilterPanel = (e) => {
  103. e.stopPropagation();
  104. tooltipVisible.value = !tooltipVisible.value;
  105. };
  106. const hideFilterPanel = () => {
  107. tooltipVisible.value = false;
  108. };
  109. const handleConfirm = () => {
  110. confirmFilter(filteredValue.value);
  111. hidden();
  112. };
  113. const handleReset = () => {
  114. filteredValue.value = [];
  115. confirmFilter(filteredValue.value);
  116. hidden();
  117. };
  118. const handleSelect = (_filterValue) => {
  119. filterValue.value = _filterValue;
  120. if (!isPropAbsent(_filterValue)) {
  121. confirmFilter(filteredValue.value);
  122. } else {
  123. confirmFilter([]);
  124. }
  125. hidden();
  126. };
  127. const confirmFilter = (filteredValue2) => {
  128. var _a, _b;
  129. (_a = props.store) == null ? void 0 : _a.commit("filterChange", {
  130. column: props.column,
  131. values: filteredValue2
  132. });
  133. (_b = props.store) == null ? void 0 : _b.updateAllSelected();
  134. };
  135. watch(tooltipVisible, (value) => {
  136. var _a;
  137. if (props.column) {
  138. (_a = props.upDataColumn) == null ? void 0 : _a.call(props, "filterOpened", value);
  139. }
  140. }, {
  141. immediate: true
  142. });
  143. const popperPaneRef = computed(() => {
  144. var _a, _b;
  145. return (_b = (_a = tooltip.value) == null ? void 0 : _a.popperRef) == null ? void 0 : _b.contentRef;
  146. });
  147. return {
  148. tooltipVisible,
  149. multiple,
  150. filterClassName,
  151. filteredValue,
  152. filterValue,
  153. filters,
  154. handleConfirm,
  155. handleReset,
  156. handleSelect,
  157. isPropAbsent,
  158. isActive,
  159. t,
  160. ns,
  161. showFilterPanel,
  162. hideFilterPanel,
  163. popperPaneRef,
  164. tooltip
  165. };
  166. }
  167. });
  168. function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
  169. const _component_el_checkbox = resolveComponent("el-checkbox");
  170. const _component_el_checkbox_group = resolveComponent("el-checkbox-group");
  171. const _component_el_scrollbar = resolveComponent("el-scrollbar");
  172. const _component_arrow_up = resolveComponent("arrow-up");
  173. const _component_arrow_down = resolveComponent("arrow-down");
  174. const _component_el_icon = resolveComponent("el-icon");
  175. const _component_el_tooltip = resolveComponent("el-tooltip");
  176. const _directive_click_outside = resolveDirective("click-outside");
  177. return openBlock(), createBlock(_component_el_tooltip, {
  178. ref: "tooltip",
  179. visible: _ctx.tooltipVisible,
  180. offset: 0,
  181. placement: _ctx.placement,
  182. "show-arrow": false,
  183. "stop-popper-mouse-event": false,
  184. teleported: "",
  185. effect: "light",
  186. pure: "",
  187. "popper-class": _ctx.filterClassName,
  188. persistent: "",
  189. "append-to": _ctx.appendTo
  190. }, {
  191. content: withCtx(() => [
  192. _ctx.multiple ? (openBlock(), createElementBlock("div", { key: 0 }, [
  193. createElementVNode("div", {
  194. class: normalizeClass(_ctx.ns.e("content"))
  195. }, [
  196. createVNode(_component_el_scrollbar, {
  197. "wrap-class": _ctx.ns.e("wrap")
  198. }, {
  199. default: withCtx(() => [
  200. createVNode(_component_el_checkbox_group, {
  201. modelValue: _ctx.filteredValue,
  202. "onUpdate:modelValue": ($event) => _ctx.filteredValue = $event,
  203. class: normalizeClass(_ctx.ns.e("checkbox-group"))
  204. }, {
  205. default: withCtx(() => [
  206. (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.filters, (filter) => {
  207. return openBlock(), createBlock(_component_el_checkbox, {
  208. key: filter.value,
  209. value: filter.value
  210. }, {
  211. default: withCtx(() => [
  212. createTextVNode(toDisplayString(filter.text), 1)
  213. ]),
  214. _: 2
  215. }, 1032, ["value"]);
  216. }), 128))
  217. ]),
  218. _: 1
  219. }, 8, ["modelValue", "onUpdate:modelValue", "class"])
  220. ]),
  221. _: 1
  222. }, 8, ["wrap-class"])
  223. ], 2),
  224. createElementVNode("div", {
  225. class: normalizeClass(_ctx.ns.e("bottom"))
  226. }, [
  227. createElementVNode("button", {
  228. class: normalizeClass({ [_ctx.ns.is("disabled")]: _ctx.filteredValue.length === 0 }),
  229. disabled: _ctx.filteredValue.length === 0,
  230. type: "button",
  231. onClick: _ctx.handleConfirm
  232. }, toDisplayString(_ctx.t("el.table.confirmFilter")), 11, ["disabled", "onClick"]),
  233. createElementVNode("button", {
  234. type: "button",
  235. onClick: _ctx.handleReset
  236. }, toDisplayString(_ctx.t("el.table.resetFilter")), 9, ["onClick"])
  237. ], 2)
  238. ])) : (openBlock(), createElementBlock("ul", {
  239. key: 1,
  240. class: normalizeClass(_ctx.ns.e("list"))
  241. }, [
  242. createElementVNode("li", {
  243. class: normalizeClass([
  244. _ctx.ns.e("list-item"),
  245. {
  246. [_ctx.ns.is("active")]: _ctx.isPropAbsent(_ctx.filterValue)
  247. }
  248. ]),
  249. onClick: ($event) => _ctx.handleSelect(null)
  250. }, toDisplayString(_ctx.t("el.table.clearFilter")), 11, ["onClick"]),
  251. (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.filters, (filter) => {
  252. return openBlock(), createElementBlock("li", {
  253. key: filter.value,
  254. class: normalizeClass([_ctx.ns.e("list-item"), _ctx.ns.is("active", _ctx.isActive(filter))]),
  255. label: filter.value,
  256. onClick: ($event) => _ctx.handleSelect(filter.value)
  257. }, toDisplayString(filter.text), 11, ["label", "onClick"]);
  258. }), 128))
  259. ], 2))
  260. ]),
  261. default: withCtx(() => [
  262. withDirectives((openBlock(), createElementBlock("span", {
  263. class: normalizeClass([
  264. `${_ctx.ns.namespace.value}-table__column-filter-trigger`,
  265. `${_ctx.ns.namespace.value}-none-outline`
  266. ]),
  267. onClick: _ctx.showFilterPanel
  268. }, [
  269. createVNode(_component_el_icon, null, {
  270. default: withCtx(() => [
  271. renderSlot(_ctx.$slots, "filter-icon", {}, () => {
  272. var _a;
  273. return [
  274. ((_a = _ctx.column) == null ? void 0 : _a.filterOpened) ? (openBlock(), createBlock(_component_arrow_up, { key: 0 })) : (openBlock(), createBlock(_component_arrow_down, { key: 1 }))
  275. ];
  276. })
  277. ]),
  278. _: 3
  279. })
  280. ], 10, ["onClick"])), [
  281. [_directive_click_outside, _ctx.hideFilterPanel, _ctx.popperPaneRef]
  282. ])
  283. ]),
  284. _: 3
  285. }, 8, ["visible", "placement", "popper-class", "append-to"]);
  286. }
  287. var FilterPanel = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__file", "filter-panel.vue"]]);
  288. export { FilterPanel as default };
  289. //# sourceMappingURL=filter-panel.mjs.map