UNPKG

element-plus

Version:

A Component Library for Vue 3

393 lines (390 loc) 13.4 kB
import { defineComponent, getCurrentInstance, ref, computed, resolveComponent, openBlock, createBlock, withCtx, createElementBlock, normalizeClass, createElementVNode, createVNode, Fragment, renderList, createTextVNode, toDisplayString, renderSlot } from 'vue'; import { ElCheckbox, ElCheckboxGroup } from '../../checkbox/index.mjs'; import { ElIcon } from '../../icon/index.mjs'; import { ArrowDown, ArrowUp } from '@element-plus/icons-vue'; import { ElTooltip } from '../../tooltip/index.mjs'; import { ElScrollbar } from '../../scrollbar/index.mjs'; import _export_sfc from '../../../_virtual/plugin-vue_export-helper.mjs'; import { useTooltipContentProps } from '../../tooltip/src/content.mjs'; import { useLocale } from '../../../hooks/use-locale/index.mjs'; import { useNamespace } from '../../../hooks/use-namespace/index.mjs'; import { isPropAbsent } from '../../../utils/types.mjs'; import { getEventCode } from '../../../utils/dom/event.mjs'; import { EVENT_CODE } from '../../../constants/aria.mjs'; const _sfc_main = defineComponent({ name: "ElTableFilterPanel", components: { ElCheckbox, ElCheckboxGroup, ElScrollbar, ElTooltip, ElIcon, ArrowDown, ArrowUp }, props: { placement: { type: String, default: "bottom-start" }, store: { type: Object }, column: { type: Object }, upDataColumn: { type: Function }, appendTo: useTooltipContentProps.appendTo }, setup(props) { const instance = getCurrentInstance(); const { t } = useLocale(); const ns = useNamespace("table-filter"); const parent = instance == null ? void 0 : instance.parent; if (props.column && !parent.filterPanels.value[props.column.id]) { parent.filterPanels.value[props.column.id] = instance; } const tooltipRef = ref(null); const rootRef = ref(null); const checkedIndex = ref(0); const filters = computed(() => { return props.column && props.column.filters; }); const filterClassName = computed(() => { if (props.column && props.column.filterClassName) { return `${ns.b()} ${props.column.filterClassName}`; } return ns.b(); }); const filterValue = computed({ get: () => { var _a; return (((_a = props.column) == null ? void 0 : _a.filteredValue) || [])[0]; }, set: (value) => { if (filteredValue.value) { if (!isPropAbsent(value)) { filteredValue.value.splice(0, 1, value); } else { filteredValue.value.splice(0, 1); } } } }); const filteredValue = computed({ get() { if (props.column) { return props.column.filteredValue || []; } return []; }, set(value) { var _a; if (props.column) { (_a = props.upDataColumn) == null ? void 0 : _a.call(props, "filteredValue", value); } } }); const multiple = computed(() => { if (props.column) { return props.column.filterMultiple; } return true; }); const isActive = (filter) => { return filter.value === filterValue.value; }; const hidden = () => { var _a; (_a = tooltipRef.value) == null ? void 0 : _a.onClose(); }; const handleConfirm = () => { confirmFilter(filteredValue.value); hidden(); }; const handleReset = () => { filteredValue.value = []; confirmFilter(filteredValue.value); hidden(); }; const handleSelect = (_filterValue, index) => { filterValue.value = _filterValue; checkedIndex.value = index; if (!isPropAbsent(_filterValue)) { confirmFilter(filteredValue.value); } else { confirmFilter([]); } hidden(); }; const confirmFilter = (filteredValue2) => { var _a, _b; (_a = props.store) == null ? void 0 : _a.commit("filterChange", { column: props.column, values: filteredValue2 }); (_b = props.store) == null ? void 0 : _b.updateAllSelected(); }; const handleShowTooltip = () => { var _a, _b; (_a = rootRef.value) == null ? void 0 : _a.focus(); !multiple.value && initCheckedIndex(); if (props.column) { (_b = props.upDataColumn) == null ? void 0 : _b.call(props, "filterOpened", true); } }; const handleHideTooltip = () => { var _a; if (props.column) { (_a = props.upDataColumn) == null ? void 0 : _a.call(props, "filterOpened", false); } }; const initCheckedIndex = () => { if (isPropAbsent(filterValue)) { checkedIndex.value = 0; return; } const idx = (filters.value || []).findIndex((item) => { return item.value === filterValue.value; }); checkedIndex.value = idx >= 0 ? idx + 1 : 0; }; const handleKeydown = (event) => { var _a, _b; const code = getEventCode(event); const len = (filters.value ? filters.value.length : 0) + 1; let index = checkedIndex.value; let isPreventDefault = true; switch (code) { case EVENT_CODE.down: case EVENT_CODE.right: index = (index + 1) % len; break; case EVENT_CODE.up: case EVENT_CODE.left: index = (index - 1 + len) % len; break; case EVENT_CODE.tab: hidden(); isPreventDefault = false; break; case EVENT_CODE.enter: case EVENT_CODE.space: if (index === 0) { handleSelect(null, 0); } else { const item = (filters.value || [])[index - 1]; item.value && handleSelect(item.value, index); } break; default: isPreventDefault = false; break; } isPreventDefault && event.preventDefault(); checkedIndex.value = index; (_b = (_a = rootRef.value) == null ? void 0 : _a.querySelector( `.${ns.e("list-item")}:nth-child(${index + 1})` )) == null ? void 0 : _b.focus(); }; return { multiple, filterClassName, filteredValue, filterValue, filters, handleConfirm, handleReset, handleSelect, isPropAbsent, isActive, t, ns, tooltipRef, rootRef, checkedIndex, handleShowTooltip, handleHideTooltip, handleKeydown }; } }); const _hoisted_1 = ["disabled"]; const _hoisted_2 = ["tabindex", "aria-checked"]; const _hoisted_3 = ["tabindex", "aria-checked", "onClick"]; const _hoisted_4 = ["aria-label"]; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_el_checkbox = resolveComponent("el-checkbox"); const _component_el_checkbox_group = resolveComponent("el-checkbox-group"); const _component_el_scrollbar = resolveComponent("el-scrollbar"); const _component_arrow_up = resolveComponent("arrow-up"); const _component_arrow_down = resolveComponent("arrow-down"); const _component_el_icon = resolveComponent("el-icon"); const _component_el_tooltip = resolveComponent("el-tooltip"); return openBlock(), createBlock(_component_el_tooltip, { ref: "tooltipRef", offset: 0, placement: _ctx.placement, "show-arrow": false, trigger: "click", role: "dialog", teleported: "", effect: "light", pure: "", loop: "", "popper-class": _ctx.filterClassName, persistent: "", "append-to": _ctx.appendTo, onShow: _ctx.handleShowTooltip, onHide: _ctx.handleHideTooltip }, { content: withCtx(() => [ _ctx.multiple ? (openBlock(), createElementBlock( "div", { key: 0, ref: "rootRef", tabindex: "-1", class: normalizeClass(_ctx.ns.e("multiple")) }, [ createElementVNode( "div", { class: normalizeClass(_ctx.ns.e("content")) }, [ createVNode(_component_el_scrollbar, { "wrap-class": _ctx.ns.e("wrap") }, { default: withCtx(() => [ createVNode(_component_el_checkbox_group, { modelValue: _ctx.filteredValue, "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.filteredValue = $event), class: normalizeClass(_ctx.ns.e("checkbox-group")) }, { default: withCtx(() => [ (openBlock(true), createElementBlock( Fragment, null, renderList(_ctx.filters, (filter) => { return openBlock(), createBlock(_component_el_checkbox, { key: filter.value, value: filter.value }, { default: withCtx(() => [ createTextVNode( toDisplayString(filter.text), 1 ) ]), _: 2 }, 1032, ["value"]); }), 128 )) ]), _: 1 }, 8, ["modelValue", "class"]) ]), _: 1 }, 8, ["wrap-class"]) ], 2 ), createElementVNode( "div", { class: normalizeClass(_ctx.ns.e("bottom")) }, [ createElementVNode("button", { class: normalizeClass(_ctx.ns.is("disabled", _ctx.filteredValue.length === 0)), disabled: _ctx.filteredValue.length === 0, type: "button", onClick: _cache[1] || (_cache[1] = (...args) => _ctx.handleConfirm && _ctx.handleConfirm(...args)) }, toDisplayString(_ctx.t("el.table.confirmFilter")), 11, _hoisted_1), createElementVNode( "button", { type: "button", onClick: _cache[2] || (_cache[2] = (...args) => _ctx.handleReset && _ctx.handleReset(...args)) }, toDisplayString(_ctx.t("el.table.resetFilter")), 1 ) ], 2 ) ], 2 )) : (openBlock(), createElementBlock( "ul", { key: 1, ref: "rootRef", tabindex: "-1", role: "radiogroup", class: normalizeClass(_ctx.ns.e("list")), onKeydown: _cache[4] || (_cache[4] = (...args) => _ctx.handleKeydown && _ctx.handleKeydown(...args)) }, [ createElementVNode("li", { role: "radio", class: normalizeClass([ _ctx.ns.e("list-item"), _ctx.ns.is("active", _ctx.isPropAbsent(_ctx.filterValue)) ]), tabindex: _ctx.checkedIndex === 0 ? 0 : -1, "aria-checked": _ctx.isPropAbsent(_ctx.filterValue), onClick: _cache[3] || (_cache[3] = ($event) => _ctx.handleSelect(null, 0)) }, toDisplayString(_ctx.t("el.table.clearFilter")), 11, _hoisted_2), (openBlock(true), createElementBlock( Fragment, null, renderList(_ctx.filters, (filter, idx) => { return openBlock(), createElementBlock("li", { key: filter.value, role: "radio", class: normalizeClass([_ctx.ns.e("list-item"), _ctx.ns.is("active", _ctx.isActive(filter))]), tabindex: _ctx.checkedIndex === idx + 1 ? 0 : -1, "aria-checked": _ctx.isActive(filter), onClick: ($event) => _ctx.handleSelect(filter.value, idx + 1) }, toDisplayString(filter.text), 11, _hoisted_3); }), 128 )) ], 34 )) ]), default: withCtx(() => { var _a; return [ createElementVNode("button", { type: "button", class: normalizeClass(`${_ctx.ns.namespace.value}-table__column-filter-trigger`), "aria-label": _ctx.t("el.table.filterLabel", { column: ((_a = _ctx.column) == null ? void 0 : _a.label) || "" }) }, [ createVNode(_component_el_icon, null, { default: withCtx(() => [ renderSlot(_ctx.$slots, "filter-icon", {}, () => { var _a2; return [ ((_a2 = _ctx.column) == null ? void 0 : _a2.filterOpened) ? (openBlock(), createBlock(_component_arrow_up, { key: 0 })) : (openBlock(), createBlock(_component_arrow_down, { key: 1 })) ]; }) ]), _: 3 }) ], 10, _hoisted_4) ]; }), _: 3 }, 8, ["placement", "popper-class", "append-to", "onShow", "onHide"]); } var FilterPanel = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__file", "/home/runner/work/element-plus/element-plus/packages/components/table/src/filter-panel.vue"]]); export { FilterPanel as default }; //# sourceMappingURL=filter-panel.mjs.map