UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 12.2 kB
{"version":3,"file":"filter-panel.mjs","names":[],"sources":["../../../../../../packages/components/table/src/filter-panel.vue"],"sourcesContent":["<template>\n <el-tooltip\n ref=\"tooltipRef\"\n :offset=\"0\"\n :placement=\"placement\"\n :show-arrow=\"false\"\n trigger=\"click\"\n role=\"dialog\"\n teleported\n effect=\"light\"\n pure\n loop\n :popper-class=\"filterClassName\"\n persistent\n :append-to=\"appendTo\"\n @show=\"handleShowTooltip\"\n @hide=\"handleHideTooltip\"\n >\n <template #content>\n <div\n v-if=\"multiple\"\n ref=\"rootRef\"\n tabindex=\"-1\"\n :class=\"ns.e('multiple')\"\n >\n <div :class=\"ns.e('content')\">\n <el-scrollbar :wrap-class=\"ns.e('wrap')\">\n <el-checkbox-group\n v-model=\"filteredValue\"\n :class=\"ns.e('checkbox-group')\"\n >\n <el-checkbox\n v-for=\"filter in filters\"\n :key=\"filter.value\"\n :value=\"filter.value\"\n >\n {{ filter.text }}\n </el-checkbox>\n </el-checkbox-group>\n </el-scrollbar>\n </div>\n <div :class=\"ns.e('bottom')\">\n <button\n :class=\"ns.is('disabled', filteredValue.length === 0)\"\n :disabled=\"filteredValue.length === 0\"\n type=\"button\"\n @click=\"handleConfirm\"\n >\n {{ t('el.table.confirmFilter') }}\n </button>\n <button type=\"button\" @click=\"handleReset\">\n {{ t('el.table.resetFilter') }}\n </button>\n </div>\n </div>\n <ul\n v-else\n ref=\"rootRef\"\n tabindex=\"-1\"\n role=\"radiogroup\"\n :class=\"ns.e('list')\"\n @keydown=\"handleKeydown\"\n >\n <li\n role=\"radio\"\n :class=\"[\n ns.e('list-item'),\n ns.is('active', isPropAbsent(filterValue)),\n ]\"\n :tabindex=\"checkedIndex === 0 ? 0 : -1\"\n :aria-checked=\"isPropAbsent(filterValue)\"\n @click=\"handleSelect(null, 0)\"\n >\n {{ t('el.table.clearFilter') }}\n </li>\n <li\n v-for=\"(filter, idx) in filters\"\n :key=\"filter.value\"\n role=\"radio\"\n :class=\"[ns.e('list-item'), ns.is('active', isActive(filter))]\"\n :tabindex=\"checkedIndex === idx + 1 ? 0 : -1\"\n :aria-checked=\"isActive(filter)\"\n @click=\"handleSelect(filter.value, idx + 1)\"\n >\n {{ filter.text }}\n </li>\n </ul>\n </template>\n <template #default>\n <button\n type=\"button\"\n :class=\"`${ns.namespace.value}-table__column-filter-trigger`\"\n :aria-label=\"t('el.table.filterLabel', { column: column?.label || '' })\"\n >\n <el-icon>\n <slot name=\"filter-icon\">\n <arrow-up v-if=\"column?.filterOpened\" />\n <arrow-down v-else />\n </slot>\n </el-icon>\n </button>\n </template>\n </el-tooltip>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, getCurrentInstance, ref } from 'vue'\nimport { ElCheckbox, ElCheckboxGroup } from '@element-plus/components/checkbox'\nimport { ElIcon } from '@element-plus/components/icon'\nimport { ArrowDown, ArrowUp } from '@element-plus/icons-vue'\nimport { EVENT_CODE } from '@element-plus/constants'\nimport { useLocale, useNamespace } from '@element-plus/hooks'\nimport {\n ElTooltip,\n useTooltipContentProps,\n} from '@element-plus/components/tooltip'\nimport ElScrollbar from '@element-plus/components/scrollbar'\nimport { getEventCode, isPropAbsent } from '@element-plus/utils'\n\nimport type { DefaultRow } from './table/defaults'\nimport type { TooltipInstance } from '@element-plus/components/tooltip'\nimport type { Placement } from '@element-plus/components/popper'\nimport type { PropType, WritableComputedRef } from 'vue'\nimport type { TableColumnCtx } from './table-column/defaults'\nimport type { TableHeader } from './table-header'\nimport type { Store } from './store'\n\nexport default defineComponent({\n name: 'ElTableFilterPanel',\n components: {\n ElCheckbox,\n ElCheckboxGroup,\n ElScrollbar,\n ElTooltip,\n ElIcon,\n ArrowDown,\n ArrowUp,\n },\n props: {\n placement: {\n type: String as PropType<Placement>,\n default: 'bottom-start',\n },\n store: {\n type: Object as PropType<Store<DefaultRow>>,\n },\n column: {\n type: Object as PropType<TableColumnCtx<DefaultRow>>,\n },\n upDataColumn: {\n type: Function,\n },\n appendTo: useTooltipContentProps.appendTo,\n },\n setup(props) {\n const instance = getCurrentInstance()\n const { t } = useLocale()\n const ns = useNamespace('table-filter')\n const parent = instance?.parent as TableHeader\n if (props.column && !parent.filterPanels.value[props.column.id]) {\n parent.filterPanels.value[props.column.id] = instance\n }\n\n const tooltipRef = ref<TooltipInstance | null>(null)\n const rootRef = ref<HTMLElement | null>(null)\n const checkedIndex = ref(0)\n\n const filters = computed(() => {\n return props.column && props.column.filters\n })\n const filterClassName = computed(() => {\n if (props.column && props.column.filterClassName) {\n return `${ns.b()} ${props.column.filterClassName}`\n }\n return ns.b()\n })\n const filterValue = computed({\n get: () => (props.column?.filteredValue || [])[0],\n set: (value?: string | null) => {\n if (filteredValue.value) {\n if (!isPropAbsent(value)) {\n filteredValue.value.splice(0, 1, value)\n } else {\n filteredValue.value.splice(0, 1)\n }\n }\n },\n })\n const filteredValue: WritableComputedRef<string[]> = computed({\n get() {\n if (props.column) {\n return props.column.filteredValue || []\n }\n return []\n },\n set(value: string[]) {\n if (props.column) {\n props.upDataColumn?.('filteredValue', value)\n }\n },\n })\n const multiple = computed(() => {\n if (props.column) {\n return props.column.filterMultiple\n }\n return true\n })\n const isActive = (filter: { value: string; text: string }) => {\n return filter.value === filterValue.value\n }\n const hidden = () => {\n tooltipRef.value?.onClose()\n }\n const handleConfirm = () => {\n confirmFilter(filteredValue.value)\n hidden()\n }\n const handleReset = () => {\n filteredValue.value = []\n confirmFilter(filteredValue.value)\n hidden()\n }\n const handleSelect = (_filterValue: string | null, index: number) => {\n filterValue.value = _filterValue!\n checkedIndex.value = index\n if (!isPropAbsent(_filterValue)) {\n confirmFilter(filteredValue.value)\n } else {\n confirmFilter([])\n }\n hidden()\n }\n const confirmFilter = (filteredValue: unknown[]) => {\n props.store?.commit('filterChange', {\n column: props.column,\n values: filteredValue,\n })\n props.store?.updateAllSelected()\n }\n const handleShowTooltip = () => {\n rootRef.value?.focus()\n !multiple.value && initCheckedIndex()\n if (props.column) {\n props.upDataColumn?.('filterOpened', true)\n }\n }\n const handleHideTooltip = () => {\n if (props.column) {\n props.upDataColumn?.('filterOpened', false)\n }\n }\n\n const initCheckedIndex = () => {\n if (isPropAbsent(filterValue)) {\n checkedIndex.value = 0\n return\n }\n const idx = (filters.value || []).findIndex((item) => {\n return item.value === filterValue.value\n })\n checkedIndex.value = idx >= 0 ? idx + 1 : 0\n }\n\n const handleKeydown = (event: KeyboardEvent) => {\n const code = getEventCode(event)\n const len = (filters.value ? filters.value.length : 0) + 1\n let index = checkedIndex.value\n let isPreventDefault = true\n\n switch (code) {\n case EVENT_CODE.down:\n case EVENT_CODE.right:\n index = (index + 1) % len\n break\n case EVENT_CODE.up:\n case EVENT_CODE.left:\n index = (index - 1 + len) % len\n break\n case EVENT_CODE.tab:\n hidden()\n isPreventDefault = false\n break\n case EVENT_CODE.enter:\n case EVENT_CODE.space:\n if (index === 0) {\n handleSelect(null, 0)\n } else {\n const item = (filters.value || [])[index - 1]\n item.value && handleSelect(item.value, index)\n }\n break\n default:\n isPreventDefault = false\n break\n }\n\n isPreventDefault && event.preventDefault()\n checkedIndex.value = index\n rootRef.value\n ?.querySelector<HTMLElement>(\n `.${ns.e('list-item')}:nth-child(${index + 1})`\n )\n ?.focus()\n }\n\n return {\n multiple,\n filterClassName,\n filteredValue,\n filterValue,\n filters,\n handleConfirm,\n handleReset,\n handleSelect,\n isPropAbsent,\n isActive,\n t,\n ns,\n tooltipRef,\n rootRef,\n checkedIndex,\n handleShowTooltip,\n handleHideTooltip,\n handleKeydown,\n }\n },\n})\n</script>\n"],"mappings":"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"}