{"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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"}