element-plus
Version:
A Component Library for Vue 3
1 lines • 13.2 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","names":["FilterPanel"],"sources":["../../../../../../../packages/components/table/src/table-header/index.ts"],"sourcesContent":["import {\n defineComponent,\n getCurrentInstance,\n h,\n inject,\n nextTick,\n onBeforeUnmount,\n onMounted,\n reactive,\n ref,\n watch,\n} from 'vue'\nimport ElCheckbox from '@element-plus/components/checkbox'\nimport { useNamespace } from '@element-plus/hooks'\nimport { useLocale } from '@element-plus/hooks/use-locale'\nimport FilterPanel from '../filter-panel.vue'\nimport useLayoutObserver from '../layout-observer'\nimport { TABLE_INJECTION_KEY } from '../tokens'\nimport useEvent from './event-helper'\nimport useStyle from './style.helper'\nimport useUtils from './utils-helper'\n\nimport type TableLayout from '../table-layout'\nimport type { ComponentInternalInstance, PropType, Ref } from 'vue'\nimport type { DefaultRow, Sort } from '../table/defaults'\nimport type { Store } from '../store'\n\nexport interface TableHeader extends ComponentInternalInstance {\n state: {\n onColumnsChange: (layout: TableLayout<any>) => void\n onScrollableChange: (layout: TableLayout<any>) => void\n }\n filterPanels: Ref<DefaultRow>\n}\nexport interface TableHeaderProps<T extends DefaultRow> {\n fixed: string\n store: Store<T>\n border: boolean\n defaultSort: Sort\n allowDragLastColumn: boolean\n}\n\nexport default defineComponent({\n name: 'ElTableHeader',\n components: {\n ElCheckbox,\n },\n props: {\n fixed: {\n type: String,\n default: '',\n },\n store: {\n required: true,\n type: Object as PropType<TableHeaderProps<any>['store']>,\n },\n border: Boolean,\n defaultSort: {\n type: Object as PropType<TableHeaderProps<any>['defaultSort']>,\n default: () => {\n return {\n prop: '',\n order: '',\n }\n },\n },\n appendFilterPanelTo: {\n type: String,\n },\n allowDragLastColumn: {\n type: Boolean,\n },\n },\n setup(props, { emit }) {\n const instance = getCurrentInstance() as TableHeader\n const parent = inject(TABLE_INJECTION_KEY)\n const ns = useNamespace('table')\n const filterPanels = ref({})\n const { onColumnsChange, onScrollableChange } = useLayoutObserver(parent!)\n\n const isTableLayoutAuto = parent?.props.tableLayout === 'auto'\n const saveIndexSelection = reactive(new Map())\n const theadRef = ref()\n\n let delayId: ReturnType<typeof setTimeout> | undefined\n const updateFixedColumnStyle = () => {\n delayId = setTimeout(() => {\n if (saveIndexSelection.size > 0) {\n saveIndexSelection.forEach((column, key) => {\n const el = theadRef.value.querySelector(\n `.${key.replace(/\\s/g, '.')}`\n )\n if (el) {\n const width = el.getBoundingClientRect().width\n column.width = width || column.width\n }\n })\n saveIndexSelection.clear()\n }\n })\n }\n\n watch(saveIndexSelection, updateFixedColumnStyle)\n onBeforeUnmount(() => {\n if (delayId) {\n clearTimeout(delayId)\n delayId = undefined\n }\n })\n\n onMounted(async () => {\n // Need double await, because updateColumns is executed after nextTick for now\n await nextTick()\n await nextTick()\n const { prop, order } = props.defaultSort\n parent?.store.commit('sort', { prop, order, init: true })\n\n updateFixedColumnStyle()\n })\n\n const {\n handleHeaderClick,\n handleHeaderContextMenu,\n handleMouseDown,\n handleMouseMove,\n handleMouseOut,\n handleSortClick,\n handleFilterClick,\n } = useEvent(props as TableHeaderProps<any>, emit)\n const {\n getHeaderRowStyle,\n getHeaderRowClass,\n getHeaderCellStyle,\n getHeaderCellClass,\n } = useStyle(props as TableHeaderProps<any>)\n const { isGroup, toggleAllSelection, columnRows } = useUtils(\n props as TableHeaderProps<any>\n )\n\n const { t } = useLocale()\n\n instance.state = {\n onColumnsChange,\n onScrollableChange,\n }\n instance.filterPanels = filterPanels\n\n return {\n ns,\n t,\n filterPanels,\n onColumnsChange,\n onScrollableChange,\n columnRows,\n getHeaderRowClass,\n getHeaderRowStyle,\n getHeaderCellClass,\n getHeaderCellStyle,\n handleHeaderClick,\n handleHeaderContextMenu,\n handleMouseDown,\n handleMouseMove,\n handleMouseOut,\n handleSortClick,\n handleFilterClick,\n isGroup,\n toggleAllSelection,\n saveIndexSelection,\n isTableLayoutAuto,\n theadRef,\n updateFixedColumnStyle,\n }\n },\n render() {\n const {\n ns,\n t,\n isGroup,\n columnRows,\n getHeaderCellStyle,\n getHeaderCellClass,\n getHeaderRowClass,\n getHeaderRowStyle,\n handleHeaderClick,\n handleHeaderContextMenu,\n handleMouseDown,\n handleMouseMove,\n handleSortClick,\n handleMouseOut,\n store,\n $parent,\n saveIndexSelection,\n isTableLayoutAuto,\n } = this\n let rowSpan = 1\n return h(\n 'thead',\n {\n ref: 'theadRef',\n class: ns.is('group', isGroup),\n },\n columnRows.map((subColumns, rowIndex) =>\n h(\n 'tr',\n {\n class: getHeaderRowClass(rowIndex),\n key: rowIndex,\n style: getHeaderRowStyle(rowIndex),\n },\n subColumns.map((column, cellIndex) => {\n if (column.rowSpan > rowSpan) {\n rowSpan = column.rowSpan\n }\n const _class = getHeaderCellClass(\n rowIndex,\n cellIndex,\n subColumns,\n column\n )\n if (isTableLayoutAuto && column.fixed) {\n saveIndexSelection.set(_class, column)\n }\n return h(\n 'th',\n {\n class: _class,\n colspan: column.colSpan,\n key: `${column.id}-thead`,\n rowspan: column.rowSpan,\n scope: column.colSpan > 1 ? 'colgroup' : 'col',\n ariaSort: column.sortable ? column.order : undefined,\n style: getHeaderCellStyle(\n rowIndex,\n cellIndex,\n subColumns,\n column\n ),\n onClick: ($event: Event) => {\n if (\n ($event.currentTarget as Element)?.classList.contains(\n 'noclick'\n )\n ) {\n return\n }\n handleHeaderClick($event, column)\n },\n onContextmenu: ($event: MouseEvent) =>\n handleHeaderContextMenu($event, column),\n onMousedown: ($event: MouseEvent) =>\n handleMouseDown($event, column),\n onMousemove: ($event: MouseEvent) =>\n handleMouseMove($event, column),\n onMouseout: handleMouseOut,\n },\n [\n h(\n 'div',\n {\n class: [\n 'cell',\n column.filteredValue && column.filteredValue.length > 0\n ? 'highlight'\n : '',\n ],\n },\n [\n column.renderHeader\n ? column.renderHeader({\n column,\n $index: cellIndex,\n store,\n _self: $parent,\n })\n : column.label,\n column.sortable &&\n h(\n 'button',\n {\n type: 'button',\n class: 'caret-wrapper',\n 'aria-label': t('el.table.sortLabel', {\n column: column.label || '',\n }),\n onClick: ($event: Event) =>\n handleSortClick($event, column),\n },\n [\n h('i', {\n onClick: ($event: Event) =>\n handleSortClick($event, column, 'ascending'),\n class: 'sort-caret ascending',\n }),\n h('i', {\n onClick: ($event: Event) =>\n handleSortClick($event, column, 'descending'),\n class: 'sort-caret descending',\n }),\n ]\n ),\n column.filterable &&\n h(\n FilterPanel as any,\n {\n store,\n placement: column.filterPlacement || 'bottom-start',\n appendTo: ($parent as any)?.appendFilterPanelTo,\n column,\n upDataColumn: (key: never, value: never) => {\n column[key] = value\n },\n },\n {\n 'filter-icon': () =>\n column.renderFilterIcon\n ? column.renderFilterIcon({\n filterOpened: column.filterOpened,\n })\n : null,\n }\n ),\n ]\n ),\n ]\n )\n })\n )\n )\n )\n },\n})\n"],"mappings":"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"}