UNPKG

@extclp/vexip-ui

Version:

A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good

1 lines 26.3 kB
{"version":3,"file":"table-head-cell.vue2.mjs","sources":["../../../components/table/table-head-cell.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { Button } from '@/components/button'\nimport { Checkbox } from '@/components/checkbox'\nimport { Ellipsis } from '@/components/ellipsis'\nimport { Renderer } from '@/components/renderer'\nimport { ResizeObserver } from '@/components/resize-observer'\nimport { Tooltip } from '@/components/tooltip'\n\nimport { computed, inject, ref, toRef } from 'vue'\n\nimport { useIcons, useNameHelper } from '@vexip-ui/config'\nimport TableIcon from './table-icon.vue'\nimport { useMoving, useRtl } from '@vexip-ui/hooks'\nimport { getLast, isFunction, nextFrameOnce } from '@vexip-ui/utils'\nimport { TABLE_ACTIONS, TABLE_HEAD_PREFIX, TABLE_STORE, columnTypes } from './symbol'\n\nimport type { PropType, StyleValue } from 'vue'\nimport type { MovingState } from '@vexip-ui/hooks'\nimport type {\n ColumnWithKey,\n ParsedFilterOptions,\n ParsedTableSorterOptions,\n TableRowState,\n TableSelectionColumn,\n TableTypeColumn\n} from './symbol'\n\ndefineOptions({ name: 'TableHeadCell' })\n\nconst props = defineProps({\n column: {\n type: Object as PropType<ColumnWithKey>,\n default: () => ({})\n },\n index: {\n type: Number,\n default: -1\n },\n row: {\n type: Object as PropType<TableRowState>,\n default: () => ({})\n },\n rowIndex: {\n type: Number,\n default: 0\n },\n fixed: {\n type: String as PropType<'left' | 'right' | undefined>,\n default: null\n }\n})\n\nconst { state, getters, mutations } = inject(TABLE_STORE)!\nconst tableActions = inject(TABLE_ACTIONS)!\n\nconst nh = useNameHelper('table')\nconst locale = toRef(state, 'locale')\nconst icons = useIcons()\nconst { isRtl } = useRtl()\n\nconst filterVisible = ref(false)\nconst resizable = toRef(state, 'colResizable')\nconst resizing = computed(() => state.colResizing)\n\nconst wrapper = ref<HTMLElement>()\n\nconst isGroup = computed(() => mutations.isGroupColumn(props.column))\nconst columns = computed(() => {\n return props.fixed === 'left'\n ? state.leftFixedColumns\n : props.fixed === 'right'\n ? state.rightFixedColumns\n : state.normalColumns\n})\nconst cellSpan = computed(() => {\n return (\n state.cellSpanMap.get(props.fixed || 'default')!.get(`h${props.rowIndex},${props.index}`) || {\n colSpan: 1,\n rowSpan: 1\n }\n )\n})\nconst inLast = computed(() => {\n return isGroup.value\n ? props.column.last\n : props.column.index + cellSpan.value.colSpan >= state.columns.length\n})\n\nconst minWidth = 10\n\nlet currentWidth = 0\n\nfunction processColResize(payload: MovingState, lazy = false) {\n const width = Math.max(currentWidth + (payload.isRtl ? -1 : 1) * payload.deltaX, minWidth)\n\n !lazy &&\n mutations.handleColumnResize(\n state.columns\n .slice(props.column.index, props.column.index + cellSpan.value.colSpan)\n .map(column => column.key),\n width\n )\n\n return width\n}\n\nconst { target: resizer } = useMoving({\n capture: false,\n onStart: (payload, event) => {\n if (!resizable.value || resizing.value || isGroup.value) return false\n\n const table = tableActions.getTableElement()\n\n if (!table || !wrapper.value) return false\n\n payload.xStart = payload.clientX - table.getBoundingClientRect().left\n payload.isRtl = isRtl.value\n currentWidth = wrapper.value.getBoundingClientRect().width\n\n mutations.setColumnResizing(true)\n mutations.setResizeLeft(payload.xStart)\n tableActions.emitColResize('Start', {\n ...buildEventPayload(event),\n width: currentWidth\n })\n },\n onMove: (payload, event) => {\n payload.xEnd = Math.max(payload.xStart - currentWidth + minWidth, payload.xEnd)\n\n mutations.setResizeLeft(payload.xEnd)\n tableActions.emitColResize('Move', {\n ...buildEventPayload(event),\n width: processColResize(payload, state.colResizable !== 'responsive')\n })\n },\n onEnd: (payload, event) => {\n mutations.setColumnResizing(false)\n tableActions.emitColResize('End', {\n ...buildEventPayload(event),\n width: processColResize(payload)\n })\n }\n})\n\nconst typed = computed(() => columnTypes.includes((props.column as TableTypeColumn).type))\nconst className = computed(() => {\n let customClass = null\n\n if (typeof state.headClass === 'function') {\n customClass = state.headClass({\n column: props.column,\n index: props.column.colIndex,\n rowIndex: props.rowIndex\n })\n } else {\n customClass = state.headClass\n }\n\n return [\n nh.be('head-cell'),\n {\n [nh.bem('head-cell', 'group')]: isGroup.value,\n [nh.bem('head-cell', 'typed')]: typed.value,\n [nh.bem('head-cell', 'center')]: typed.value || props.column.textAlign === 'center',\n [nh.bem('head-cell', 'right')]: props.column.textAlign === 'right',\n [nh.bem('head-cell', 'last')]: inLast.value\n },\n props.column.class,\n customClass\n ]\n})\nconst customStyle = computed(() => {\n if (typeof state.headStyle === 'function') {\n return state.headStyle({\n column: props.column,\n index: props.column.colIndex,\n rowIndex: props.rowIndex\n })\n }\n\n return state.headStyle\n})\nconst style = computed(() => {\n const totalWidths =\n props.fixed === 'left'\n ? getters.leftFixedWidths\n : props.fixed === 'right'\n ? getters.rightFixedWidths\n : getters.normalWidths\n const { colSpan, rowSpan } = cellSpan.value\n const noFixed = !getters.hasFixedColumn\n const padLeft = noFixed || columns.value[0]?.fixed === 'left' ? state.sidePadding[0] || 0 : 0\n const padRight =\n noFixed || getLast(columns.value)?.fixed === 'right' ? state.sidePadding[1] || 0 : 0\n const width = totalWidths[props.index + colSpan] - totalWidths[props.index]\n\n let height: number | undefined\n\n if (rowSpan > 1) {\n height = 0\n\n for (let i = 0; i < rowSpan; ++i) {\n height += state.rowMap.get(`${TABLE_HEAD_PREFIX}${props.rowIndex + i}`)?.height ?? 0\n }\n }\n\n return [\n props.column.style || '',\n customStyle.value,\n {\n display: !colSpan ? 'none' : undefined,\n width: `${(props.column.index ? 0 : padLeft) + (inLast.value ? padRight : 0) + width}px`,\n height: height ? `${height}px` : undefined,\n visibility: props.column.fixed && !props.fixed ? 'hidden' : undefined,\n borderRightWidth:\n !state.border && colSpan > 1 && props.index + colSpan >= totalWidths.length - 1\n ? 0\n : undefined,\n transform: `translate3d(${isRtl.value ? '-' : ''}${\n (props.column.index ? padLeft : 0) + totalWidths[props.index]\n }px, 0, 0)`\n }\n ] as StyleValue\n})\nconst attrs = computed(() => {\n let customAttrs: Record<string, any>\n\n if (typeof state.headAttrs === 'function') {\n customAttrs = state.headAttrs({\n column: props.column,\n index: props.column.colIndex,\n rowIndex: props.rowIndex\n })\n } else {\n customAttrs = state.headAttrs\n }\n\n return { ...(props.column.attrs || {}), ...(customAttrs || {}) }\n})\nconst sorter = computed(() => {\n return state.sorters.get(props.column.key) || ({} as ParsedTableSorterOptions)\n})\nconst filter = computed(() => {\n return state.filters.get(props.column.key) || ({} as ParsedFilterOptions)\n})\nconst hasFilterActive = computed(() => {\n const options = filter.value.options ?? []\n\n for (let i = 0, len = options.length; i < len; ++i) {\n if (options[i].active) {\n return true\n }\n }\n\n return false\n})\nconst checkboxDisabled = computed(() => {\n if (!isSelection(props.column)) {\n return false\n }\n\n const records = Object.values(getters.disableCheckRows)\n\n return (\n getters.processedData.length === records.length &&\n !Object.values(getters.disableCheckRows).includes(false)\n )\n})\n\nconst refreshXScroll = () => nextFrameOnce(tableActions.refreshXScroll)\n\nfunction isSelection(column: unknown): column is TableSelectionColumn {\n return !isGroup.value && (column as TableTypeColumn).type === 'selection'\n}\n\nfunction buildEventPayload(event: Event) {\n return {\n column: props.column,\n index: props.column.colIndex,\n event\n }\n}\n\nfunction handleMouseEnter(event: MouseEvent) {\n tableActions?.emitHeadEvent('Enter', buildEventPayload(event))\n}\n\nfunction handleMouseLeave(event: MouseEvent) {\n tableActions?.emitHeadEvent('Leave', buildEventPayload(event))\n}\n\nfunction handleClick(event: MouseEvent) {\n tableActions?.emitHeadEvent('Click', buildEventPayload(event))\n}\n\nfunction handleDblclick(event: MouseEvent) {\n tableActions?.emitHeadEvent('Dblclick', buildEventPayload(event))\n}\n\nfunction handleContextmenu(event: MouseEvent) {\n tableActions?.emitHeadEvent('Contextmenu', buildEventPayload(event))\n}\n\nfunction handleSortAsc() {\n const key = props.column.key\n const type = sorter.value.type === 'asc' ? null : 'asc'\n\n mutations.handleSort(key, type)\n tableActions.emitRowSort()\n}\n\nfunction handleSortDesc() {\n const key = props.column.key\n const type = sorter.value.type === 'desc' ? null : 'desc'\n\n mutations.handleSort(key, type)\n tableActions.emitRowSort()\n}\n\nfunction handleFilter(value: ParsedFilterOptions['active']) {\n mutations.handleFilter(props.column.key, value)\n}\n\nfunction handleFilterItemSelect(value: string | number, active: boolean) {\n mutations.toggleFilterItemActive({\n key: props.column.key,\n value,\n active,\n disableOthers: true\n })\n handleFilter(value)\n filterVisible.value = false\n tableActions.emitRowFilter()\n}\n\nfunction handleFilterCheck(value: string | number, checked: boolean) {\n mutations.toggleFilterItemActive({\n key: props.column.key,\n value,\n active: checked\n })\n}\n\nfunction handleFilterMultiple() {\n const options = filter.value.options ?? []\n const activeValues = []\n\n for (let i = 0, len = options.length; i < len; ++i) {\n const option = options[i]\n\n if (option.active) {\n activeValues.push(option.value)\n }\n }\n\n handleFilter(activeValues)\n filterVisible.value = false\n tableActions.emitRowFilter()\n}\n\nfunction handleResetFilter() {\n filterVisible.value = false\n handleFilter(null)\n mutations.toggleFilterItemActive({\n key: props.column.key,\n value: null,\n disableOthers: true\n })\n tableActions.emitRowFilter()\n}\n\nfunction handleCheckAllRow() {\n mutations.handleCheckAll()\n tableActions.emitAllRowCheck(state.checkedAll, state.partial)\n}\n\nfunction handleCellResize(entry: ResizeObserverEntry) {\n mutations.setCellHeight(\n props.row.key,\n props.column.key,\n (entry.borderBoxSize?.[0]?.blockSize ?? entry.contentRect.height) + state.borderWidth\n )\n}\n</script>\n\n<template>\n <div\n v-bind=\"attrs\"\n ref=\"wrapper\"\n :class=\"className\"\n role=\"columnheader\"\n scope=\"col\"\n :colspan=\"cellSpan.colSpan !== 1 ? cellSpan.colSpan : undefined\"\n :rowspan=\"cellSpan.rowSpan !== 1 ? cellSpan.rowSpan : undefined\"\n :style=\"style\"\n :aria-sort=\"\n !isGroup && sorter.able\n ? sorter.type\n ? sorter.type === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none'\n : undefined\n \"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"handleMouseLeave\"\n @click=\"handleClick\"\n @dblclick=\"handleDblclick\"\n @contextmenu=\"handleContextmenu\"\n @transitionend=\"refreshXScroll\"\n >\n <div\n v-if=\"column.index === 0\"\n :class=\"nh.be('side-pad')\"\n role=\"none\"\n aria-hidden\n ></div>\n <template v-if=\"isSelection(column)\">\n <div v-if=\"!column.singleSelect\" :class=\"nh.be('content')\">\n <Checkbox\n inherit\n control\n :class=\"nh.be('selection')\"\n :checked=\"state.checkedAll\"\n :partial=\"state.partial\"\n :disabled=\"checkboxDisabled\"\n :size=\"column.selectionSize || 'default'\"\n @click.prevent=\"handleCheckAllRow\"\n ></Checkbox>\n </div>\n </template>\n <ResizeObserver\n v-else\n :disabled=\"column.ellipsis ?? state.ellipsis\"\n :on-resize=\"handleCellResize\"\n >\n <span :class=\"nh.be('content')\">\n <Ellipsis\n v-if=\"column.ellipsis ?? state.ellipsis\"\n inherit\n :class=\"nh.be('ellipsis')\"\n :tooltip-theme=\"state.tooltipTheme\"\n :tip-max-width=\"state.tooltipWidth\"\n >\n <Renderer\n v-if=\"isGroup && isFunction((column as any).renderer)\"\n :renderer=\"(column as any).renderer\"\n ></Renderer>\n <Renderer\n v-else-if=\"isFunction(column.headRenderer)\"\n :renderer=\"column.headRenderer\"\n :data=\"{ column, index }\"\n ></Renderer>\n <template v-else>\n {{ column.name }}\n </template>\n </Ellipsis>\n <template v-else>\n <Renderer\n v-if=\"isGroup && isFunction((column as any).renderer)\"\n :renderer=\"(column as any).renderer\"\n ></Renderer>\n <Renderer\n v-else-if=\"isFunction(column.headRenderer)\"\n :renderer=\"column.headRenderer\"\n :data=\"{ column, index }\"\n ></Renderer>\n <template v-else>\n {{ column.name }}\n </template>\n </template>\n <template v-if=\"!isGroup\">\n <div v-if=\"sorter.able\" :class=\"nh.be('sorter')\">\n <span\n :class=\"{\n [nh.bem('sorter', 'asc')]: true,\n [nh.bem('sorter', 'active')]: sorter.type === 'asc'\n }\"\n @click=\"handleSortAsc()\"\n >\n <TableIcon name=\"asc\" :origin=\"icons.angleUp\"></TableIcon>\n </span>\n <span\n :class=\"{\n [nh.bem('sorter', 'desc')]: true,\n [nh.bem('sorter', 'active')]: sorter.type === 'desc'\n }\"\n @click=\"handleSortDesc()\"\n >\n <TableIcon name=\"desc\" :origin=\"icons.angleDown\"></TableIcon>\n </span>\n </div>\n <template v-if=\"filter.able\">\n <Renderer\n v-if=\"isFunction(column.filterRenderer)\"\n :renderer=\"column.filterRenderer\"\n :data=\"{ column, index, filter, handleFilter }\"\n ></Renderer>\n <Tooltip\n v-else\n v-model:visible=\"filterVisible\"\n transfer\n placement=\"bottom\"\n trigger=\"click\"\n :class=\"{\n [nh.be('filter')]: true,\n [nh.bem('filter', 'visible')]: filterVisible,\n [nh.bem('filter', 'active')]: filter.active\n }\"\n :tip-class=\"{\n [nh.be('filter-wrapper')]: true,\n [nh.bs('vars')]: true,\n [nh.bem('filter-wrapper', 'multiple')]: filter.multiple\n }\"\n >\n <template #trigger>\n <div :class=\"nh.be('filter-trigger')\">\n <TableIcon name=\"filter\" :origin=\"icons.filter\"></TableIcon>\n </div>\n </template>\n <template v-if=\"filter.multiple\" #default>\n <div vertical :class=\"nh.be('filter-group')\">\n <Checkbox\n v-for=\"item in filter.options\"\n :key=\"item.value\"\n inherit\n :checked=\"item.active\"\n :label=\"item.label\"\n :value=\"item.value\"\n @change=\"handleFilterCheck(item.value, $event)\"\n ></Checkbox>\n </div>\n <div :class=\"nh.be('filter-actions')\">\n <Button\n inherit\n text\n size=\"small\"\n :disabled=\"!hasFilterActive\"\n @click=\"handleFilterMultiple()\"\n >\n {{ locale.filterConfirm }}\n </Button>\n <Button\n inherit\n text\n size=\"small\"\n @click=\"handleResetFilter\"\n >\n {{ locale.filterReset }}\n </Button>\n </div>\n </template>\n <template v-else #default>\n <div\n :class=\"{\n [nh.be('filter-item')]: true,\n [nh.bem('filter-item', 'active')]: !filter.active\n }\"\n @click=\"handleResetFilter\"\n >\n {{ locale.filterAll }}\n </div>\n <div\n v-for=\"item in filter.options\"\n :key=\"item.value\"\n :class=\"{\n [nh.be('filter-item')]: true,\n [nh.bem('filter-item', 'active')]: item.active\n }\"\n @click=\"handleFilterItemSelect(item.value, !item.active)\"\n >\n {{ item.label }}\n </div>\n </template>\n </Tooltip>\n </template>\n </template>\n </span>\n </ResizeObserver>\n <div\n v-if=\"!isGroup && resizable && !typed && !column.last\"\n ref=\"resizer\"\n :class=\"nh.be('resizer')\"\n ></div>\n <div\n v-if=\"inLast\"\n :class=\"[nh.be('side-pad'), nh.bem('side-pad', 'right')]\"\n role=\"none\"\n aria-hidden\n ></div>\n </div>\n</template>\n"],"names":["minWidth","props","__props","state","getters","mutations","inject","TABLE_STORE","tableActions","TABLE_ACTIONS","nh","useNameHelper","locale","toRef","icons","useIcons","isRtl","useRtl","filterVisible","ref","resizable","resizing","computed","wrapper","isGroup","columns","cellSpan","inLast","currentWidth","processColResize","payload","lazy","width","column","resizer","useMoving","event","table","buildEventPayload","typed","columnTypes","className","customClass","customStyle","style","totalWidths","colSpan","rowSpan","noFixed","padLeft","_a","padRight","_b","getLast","height","i","_c","TABLE_HEAD_PREFIX","attrs","customAttrs","sorter","filter","hasFilterActive","options","len","checkboxDisabled","isSelection","records","refreshXScroll","nextFrameOnce","handleMouseEnter","handleMouseLeave","handleClick","handleDblclick","handleContextmenu","handleSortAsc","key","type","handleSortDesc","handleFilter","value","handleFilterItemSelect","active","handleFilterCheck","checked","handleFilterMultiple","activeValues","option","handleResetFilter","handleCheckAllRow","handleCellResize","entry"],"mappings":"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"}