UNPKG

@extclp/vexip-ui

Version:

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

1 lines 66.5 kB
{"version":3,"file":"table.vue2.mjs","sources":["../../../components/table/table.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { NativeScroll } from '@/components/native-scroll'\r\nimport { Renderer } from '@/components/renderer'\r\nimport { Scrollbar } from '@/components/scrollbar'\r\n\r\nimport {\r\n computed,\r\n nextTick,\r\n onBeforeUnmount,\r\n onMounted,\r\n provide,\r\n reactive,\r\n ref,\r\n renderSlot,\r\n toRef,\r\n watch,\r\n} from 'vue'\r\n\r\nimport TableColumn from './table-column'\r\nimport TableColumnGroup from './table-column-group'\r\nimport TableSummary from './table-summary'\r\nimport TableHead from './table-head.vue'\r\nimport TableBody from './table-body.vue'\r\nimport TableFoot from './table-foot.vue'\r\nimport { emitEvent, useLocale, useNameHelper, useProps } from '@vexip-ui/config'\r\nimport {\r\n debounce,\r\n debounceMinor,\r\n getLast,\r\n isDefined,\r\n isValidNumber,\r\n listToMap,\r\n nextFrameOnce,\r\n noop,\r\n removeArrayItem,\r\n toNumber,\r\n} from '@vexip-ui/utils'\r\nimport { useSetTimeout } from '@vexip-ui/hooks'\r\nimport { tableProps } from './props'\r\nimport { useStore } from './store'\r\nimport { DropType, TABLE_ACTIONS, TABLE_SLOTS, TABLE_STORE } from './symbol'\r\n\r\nimport type { Slots } from 'vue'\r\nimport type { StyleType } from '@vexip-ui/config'\r\nimport type { NativeScrollExposed, NativeScrollPayload } from '@/components/native-scroll'\r\nimport type { ScrollbarExposed } from '@/components/scrollbar'\r\nimport type {\r\n Key,\r\n MouseEventType,\r\n MoveEventType,\r\n StoreOptions,\r\n TableCellPayload,\r\n TableColResizePayload,\r\n TableColumnGroupOptions,\r\n TableColumnOptions,\r\n TableFootPayload,\r\n TableHeadPayload,\r\n TableKeyConfig,\r\n TableRowInstance,\r\n TableRowPayload,\r\n TableRowState,\r\n TableSlots,\r\n TableSummaryOptions,\r\n} from './symbol'\r\n\r\nconst defaultKeyConfig: Required<TableKeyConfig> = {\r\n id: 'id',\r\n children: 'children',\r\n checked: 'checked',\r\n height: 'height',\r\n expanded: 'expanded',\r\n treeExpanded: 'treeExpanded',\r\n}\r\n\r\ndefineOptions({ name: 'Table' })\r\n\r\nconst _props = defineProps(tableProps)\r\nconst props = useProps('table', _props, {\r\n locale: null,\r\n columns: {\r\n default: () => [],\r\n static: true,\r\n },\r\n summaries: {\r\n default: () => [],\r\n static: true,\r\n },\r\n data: {\r\n default: () => [],\r\n static: true,\r\n },\r\n width: null,\r\n height: null,\r\n minHeight: null,\r\n rowClass: null,\r\n rowStyle: null,\r\n rowAttrs: null,\r\n stripe: false,\r\n border: false,\r\n highlight: false,\r\n useXBar: false,\r\n useYBar: false,\r\n barFade: 1500,\r\n rowDraggable: false,\r\n rowHeight: {\r\n default: null,\r\n validator: value => value > 0,\r\n },\r\n rowMinHeight: {\r\n default: 36,\r\n validator: value => value > 0,\r\n },\r\n virtual: false,\r\n bufferCount: {\r\n default: 5,\r\n validator: value => value >= 0,\r\n },\r\n scrollClass: () => ({}),\r\n expandRenderer: {\r\n default: null,\r\n isFunc: true,\r\n },\r\n currentPage: {\r\n default: 1,\r\n validator: value => value > 0,\r\n static: true,\r\n },\r\n pageSize: 0,\r\n transparent: false,\r\n tooltipTheme: {\r\n default: 'dark',\r\n validator: value => ['light', 'dark'].includes(value),\r\n },\r\n tooltipWidth: 500,\r\n singleSorter: false,\r\n singleFilter: false,\r\n cellClass: null,\r\n cellStyle: null,\r\n cellAttrs: null,\r\n headClass: null,\r\n headStyle: null,\r\n headAttrs: null,\r\n footClass: null,\r\n footStyle: null,\r\n footAttrs: null,\r\n customSorter: false,\r\n customFilter: false,\r\n keyConfig: () => ({}),\r\n disabledTree: false,\r\n rowIndent: '16px',\r\n noCascaded: false,\r\n colResizable: false,\r\n cellSpan: {\r\n default: null,\r\n isFunc: true,\r\n },\r\n sidePadding: 0,\r\n icons: () => ({}),\r\n borderWidth: 1,\r\n dataFilter: {\r\n default: null,\r\n isFunc: true,\r\n },\r\n noTransition: false,\r\n ellipsis: false,\r\n slots: () => ({}),\r\n})\r\n\r\n// only for dnd end payload\r\nconst emit = defineEmits(['update:data'])\r\n\r\nconst slots = defineSlots<TableSlots>()\r\n\r\nconst nh = useNameHelper('table')\r\nconst { timer } = useSetTimeout()\r\n\r\nconst bodyHeight = ref<number | undefined>(props.height)\r\nconst bodyMinHeight = ref(props.height || 0)\r\nconst xScrollEnabled = ref(false)\r\nconst yScrollEnabled = ref(false)\r\nconst xScrollPercent = ref(0)\r\nconst yScrollPercent = ref(0)\r\nconst headHeight = ref(0)\r\nconst footHeight = ref(0)\r\nconst indicatorShow = ref(false)\r\nconst indicatorType = ref(DropType.BEFORE)\r\nconst tempColumns = reactive(new Set<TableColumnGroupOptions | TableColumnOptions>())\r\nconst tempSummaries = reactive(new Set<TableSummaryOptions>())\r\nconst tableWidth = ref<number | string>()\r\nconst hasDragColumn = ref(false)\r\nconst bodyWidth = ref(0)\r\n\r\nconst wrapper = ref<HTMLElement>()\r\nconst mainScroll = ref<NativeScrollExposed>()\r\nconst xHeadScroll = ref<NativeScrollExposed>()\r\nconst xAboveScroll = ref<NativeScrollExposed>()\r\nconst xBelowScroll = ref<NativeScrollExposed>()\r\nconst thead = ref<HTMLElement>()\r\nconst aboveTfoot = ref<HTMLElement>()\r\nconst belowTfoot = ref<HTMLElement>()\r\nconst indicator = ref<HTMLElement>()\r\nconst xScrollbar = ref<ScrollbarExposed>()\r\nconst yScrollbar = ref<ScrollbarExposed>()\r\n\r\nlet isMounted = false\r\n\r\nconst locale = useLocale('table', toRef(props, 'locale'))\r\nconst keyConfig = computed(() => ({ ...defaultKeyConfig, ...props.keyConfig }))\r\nconst allColumns = computed(() => Array.from(tempColumns))\r\nconst allSummaries = computed(() => Array.from(tempSummaries))\r\n\r\nconst syncToStoreProps = [\r\n 'rowClass',\r\n 'rowStyle',\r\n 'rowAttrs',\r\n 'cellClass',\r\n 'cellStyle',\r\n 'cellAttrs',\r\n 'headClass',\r\n 'headStyle',\r\n 'headAttrs',\r\n 'footClass',\r\n 'footStyle',\r\n 'footAttrs',\r\n 'border',\r\n 'stripe',\r\n 'highlight',\r\n 'currentPage',\r\n 'pageSize',\r\n 'rowHeight',\r\n 'rowMinHeight',\r\n 'rowDraggable',\r\n 'tooltipTheme',\r\n 'tooltipWidth',\r\n 'singleSorter',\r\n 'singleFilter',\r\n 'customSorter',\r\n 'customFilter',\r\n 'noCascaded',\r\n 'colResizable',\r\n 'expandRenderer',\r\n 'cellSpan',\r\n 'sidePadding',\r\n 'borderWidth',\r\n 'dataFilter',\r\n 'ellipsis',\r\n] as const\r\n\r\nconst store = useStore({\r\n ...(syncToStoreProps.reduce(\r\n (prev, current) => ((prev[current] = props[current]), prev),\r\n {} as any,\r\n ) as StoreOptions),\r\n columns: allColumns.value,\r\n summaries: allSummaries.value,\r\n data: props.data,\r\n dataKey: keyConfig.value.id,\r\n virtual: props.virtual,\r\n locale: locale.value,\r\n keyConfig: keyConfig.value,\r\n disabledTree: props.disabledTree,\r\n colResizable: props.colResizable === true ? 'lazy' : props.colResizable,\r\n sidePadding: Array.isArray(props.sidePadding)\r\n ? props.sidePadding\r\n : [props.sidePadding, props.sidePadding],\r\n})\r\n\r\nprovide(TABLE_STORE, store)\r\nprovide(TABLE_ACTIONS, {\r\n increaseColumn,\r\n decreaseColumn,\r\n increaseSummary,\r\n decreaseSummary,\r\n getTableElement,\r\n refreshXScroll,\r\n emitRowCheck,\r\n emitAllRowCheck,\r\n emitRowExpand,\r\n emitRowTreeExpand,\r\n emitRowFilter,\r\n emitRowSort,\r\n handleRowDragStart,\r\n handleRowDragOver,\r\n handleRowDrop,\r\n handleRowDragEnd,\r\n emitRowEvent,\r\n emitCellEvent,\r\n emitHeadEvent,\r\n emitColResize,\r\n emitFootEvent,\r\n hasIcon: name => !!props.icons[name],\r\n getIcon: name => props.icons[name],\r\n renderTableSlot,\r\n runInLocked,\r\n updateColumns: () => debounceMinor(updateColumns),\r\n setColumnProp,\r\n updateSummaries: () => debounceMinor(updateSummaries),\r\n setSummaryProp,\r\n})\r\nprovide(TABLE_SLOTS, slots as Slots)\r\n\r\nconst { state, getters, mutations } = store\r\n\r\nconst mergedLocked = computed(() => props.noTransition || state.locked || state.barScrolling)\r\nconst className = computed(() => {\r\n return {\r\n [nh.b()]: true,\r\n [nh.bs('vars')]: true,\r\n [nh.bm('inherit')]: props.inherit,\r\n [nh.bm('stripe')]: props.stripe,\r\n [nh.bm('border')]: props.border,\r\n [nh.bm('highlight')]: props.highlight,\r\n [nh.bm('use-y-bar')]: props.useYBar,\r\n [nh.bm('transparent')]: props.transparent,\r\n [nh.bm('virtual')]: props.virtual,\r\n [nh.bm('col-resizable')]: props.colResizable,\r\n [nh.bm('col-resizing')]: state.colResizing,\r\n [nh.bm('locked')]: mergedLocked.value,\r\n [nh.bm('above-foot')]: state.aboveSummaries.length,\r\n [nh.bm('below-foot')]: state.belowSummaries.length,\r\n [nh.bm('using-bar')]: state.barScrolling,\r\n }\r\n})\r\nconst style = computed(() => {\r\n const width = tableWidth.value ?? props.width\r\n const [padLeft, padRight] = state.sidePadding\r\n\r\n const style: StyleType = {\r\n [nh.cv('row-indent-width')]:\r\n typeof props.rowIndent === 'number' ? `${props.rowIndent}px` : props.rowIndent,\r\n [nh.cv('b-width')]: `${props.borderWidth}px`,\r\n [nh.cv('expanded-width')]: `${bodyWidth.value}px`,\r\n }\r\n\r\n if (padLeft) {\r\n style[nh.cv('side-pad-left')] = `${padLeft}px`\r\n }\r\n\r\n if (padRight) {\r\n style[nh.cv('side-pad-right')] = `${padRight}px`\r\n }\r\n\r\n if (isDefined(width)) {\r\n if (typeof width === 'number' || isValidNumber(width, true)) {\r\n style.width = `${width}px`\r\n style.minWidth = `${width}px`\r\n } else {\r\n style.width = width\r\n }\r\n }\r\n\r\n return style\r\n})\r\nconst useXScroll = computed(() => {\r\n return !!(\r\n isDefined(props.width) ||\r\n state.leftFixedColumns.length ||\r\n state.rightFixedColumns.length\r\n )\r\n})\r\nconst bodyScrollHeight = computed(() => {\r\n const { totalHeight } = state\r\n\r\n return bodyHeight.value ? Math.min(bodyHeight.value, totalHeight) : undefined\r\n})\r\nconst xBarLength = computed(() => mainScroll.value?.xBarLength || 35)\r\nconst yBarLength = computed(() => {\r\n const { totalHeight } = state\r\n\r\n if (bodyScrollHeight.value && totalHeight) {\r\n return Math.max(Math.min((bodyScrollHeight.value / totalHeight) * 100, 99), 5) || 35\r\n }\r\n\r\n return 35\r\n})\r\nconst totalWidths = computed(() => {\r\n return (\r\n (getLast(getters.totalWidths) || 0) + (state.sidePadding[0] || 0) + (state.sidePadding[1] || 0)\r\n )\r\n})\r\nconst leftFixedActive = computed(() => xScrollEnabled.value && xScrollPercent.value > 0)\r\nconst rightFixedActive = computed(() => xScrollEnabled.value && xScrollPercent.value < 100)\r\n\r\nconst {\r\n setColumns,\r\n setSummaries,\r\n setData,\r\n setDataKey,\r\n setTableWidth,\r\n setBodyYScroll,\r\n setBodyXScroll,\r\n setRenderRows,\r\n setVirtual,\r\n setLocale,\r\n setDragging,\r\n setKeyConfig,\r\n setDisabledTree,\r\n setLocked,\r\n setBarScrolling,\r\n clearSort,\r\n clearFilter,\r\n refreshRowIndex,\r\n clearCheckAll,\r\n getParentRow,\r\n getCurrentData,\r\n flatTreeRows,\r\n refreshRowDepth,\r\n queryRow,\r\n handleCheck,\r\n setTreeExpanded,\r\n} = mutations\r\n\r\nwatch(allColumns, updateColumns)\r\nwatch(allSummaries, updateSummaries)\r\nwatch(() => keyConfig.value.id, setDataKey)\r\nwatch(() => props.data, forceRefreshData, { deep: true })\r\nwatch(() => props.width, computeTableWidth)\r\nwatch([() => props.height, () => props.borderWidth], () => {\r\n nextTick(computeBodyHeight)\r\n})\r\nwatch(locale, setLocale, { deep: true })\r\nwatch(\r\n () => props.virtual,\r\n value => {\r\n setVirtual(value)\r\n setData(props.data)\r\n refreshPercentScroll()\r\n },\r\n)\r\nwatch(\r\n keyConfig,\r\n config => {\r\n setKeyConfig(config)\r\n setData(props.data)\r\n },\r\n { deep: true },\r\n)\r\nwatch(\r\n () => props.disabledTree,\r\n value => {\r\n setDisabledTree(value)\r\n setData(props.data)\r\n },\r\n)\r\nwatch([() => props.rowHeight, () => props.rowMinHeight], () => {\r\n refresh()\r\n})\r\n\r\nfor (const prop of syncToStoreProps) {\r\n const watchCallback =\r\n mutations[\r\n `set${prop.charAt(0).toLocaleUpperCase()}${prop.slice(1)}` as `set${Capitalize<typeof prop>}`\r\n ]\r\n\r\n watch(() => props[prop], watchCallback as any)\r\n}\r\n\r\nfunction syncBarScroll() {\r\n xScrollbar.value?.handleScroll(xScrollPercent.value)\r\n yScrollbar.value?.handleScroll(yScrollPercent.value)\r\n}\r\n\r\nconst handlerResize = debounce(refresh)\r\n\r\nonMounted(() => {\r\n isMounted = true\r\n\r\n watch(bodyScrollHeight, refreshPercentScroll)\r\n refresh()\r\n window.addEventListener('resize', handlerResize)\r\n nextTick(() => {\r\n hasDragColumn.value = getters.hasDragColumn\r\n })\r\n\r\n if (mainScroll.value) {\r\n xScrollEnabled.value = mainScroll.value.enableXScroll\r\n yScrollEnabled.value = mainScroll.value.enableYScroll\r\n }\r\n})\r\n\r\nonBeforeUnmount(() => {\r\n isMounted = false\r\n\r\n window.removeEventListener('resize', handlerResize)\r\n})\r\n\r\ndefineExpose({\r\n bodyHeight,\r\n xScrollEnabled,\r\n yScrollEnabled,\r\n xScrollPercent,\r\n yScrollPercent,\r\n headHeight,\r\n footHeight,\r\n indicatorShow,\r\n bodyScrollHeight,\r\n totalWidths,\r\n totalHeight: computed(() => state.totalHeight),\r\n locked: mergedLocked,\r\n\r\n store,\r\n\r\n wrapper,\r\n mainScroll,\r\n xHeadScroll,\r\n xAboveScroll,\r\n xBelowScroll,\r\n thead,\r\n aboveTfoot,\r\n belowTfoot,\r\n indicator,\r\n xScrollbar,\r\n yScrollbar,\r\n\r\n clearSort,\r\n clearFilter,\r\n clearSelected: clearCheckAll,\r\n refresh,\r\n refreshData: forceRefreshData,\r\n getSelected,\r\n getData: getCurrentData,\r\n selectRow: setRowChecked,\r\n treeExpandRow: setRowTreeExpanded,\r\n})\r\n\r\nfunction forceRefreshData(data = props.data) {\r\n return runInLocked(() => {\r\n setData(data)\r\n nextTick(() => computeRenderRows(true))\r\n refreshPercentScroll()\r\n })\r\n}\r\n\r\nfunction computeTableWidth() {\r\n const width = props.width\r\n\r\n if (isDefined(width)) {\r\n if (typeof width === 'string' && parseFloat(width).toString() !== width) {\r\n tableWidth.value = width\r\n } else {\r\n tableWidth.value = `${toNumber(width)}px`\r\n }\r\n }\r\n\r\n nextTick(() => {\r\n mainScroll.value?.content && setTableWidth(mainScroll.value.content.offsetWidth)\r\n refreshXScroll()\r\n })\r\n}\r\n\r\nfunction computeBodyHeight() {\r\n const height = props.height\r\n const minHeight = props.minHeight\r\n const borderWidth = props.borderWidth\r\n\r\n let fixedHeight = 0\r\n\r\n if (thead.value || aboveTfoot.value || belowTfoot.value) {\r\n if (thead.value) {\r\n fixedHeight = thead.value.offsetHeight\r\n }\r\n\r\n if (aboveTfoot.value) {\r\n fixedHeight += aboveTfoot.value.offsetHeight\r\n }\r\n\r\n if (belowTfoot.value) {\r\n fixedHeight = belowTfoot.value.offsetHeight\r\n }\r\n } else {\r\n // one row as head placeholder\r\n fixedHeight = props.rowHeight || props.rowMinHeight\r\n }\r\n\r\n fixedHeight += 2 * borderWidth\r\n\r\n if (isDefined(height)) {\r\n bodyHeight.value = height - fixedHeight\r\n } else {\r\n bodyHeight.value = undefined\r\n }\r\n\r\n if (isDefined(minHeight)) {\r\n bodyMinHeight.value = Math.min(minHeight, height ?? Infinity) - fixedHeight\r\n } else {\r\n bodyMinHeight.value = 0\r\n }\r\n}\r\n\r\nfunction handleMainScroll(payload: NativeScrollPayload) {\r\n if (state.barScrolling) return\r\n\r\n if (payload.type !== 'vertical') {\r\n handleXScroll(payload)\r\n }\r\n\r\n if (payload.type !== 'horizontal') {\r\n handleYScroll(payload)\r\n }\r\n}\r\n\r\nfunction handleXScroll({ clientX, percentX }: { clientX: number, percentX: number }) {\r\n if (state.barScrolling) return\r\n\r\n xScrollPercent.value = percentX\r\n setBodyXScroll(clientX)\r\n syncBarScroll()\r\n emitEvent(props.onScroll, {\r\n type: 'horizontal',\r\n client: clientX,\r\n percent: percentX,\r\n })\r\n}\r\n\r\nfunction handleYScroll({ clientY, percentY }: { clientY: number, percentY: number }) {\r\n if (state.barScrolling) return\r\n\r\n yScrollPercent.value = percentY\r\n setBodyYScroll(clientY)\r\n syncBarScroll()\r\n emitYScroll(clientY, percentY)\r\n}\r\n\r\nfunction handleXBarScroll(percent: number) {\r\n if (!mainScroll.value) return\r\n\r\n const client = (mainScroll.value.xScrollLimit * percent) / 100\r\n\r\n xScrollPercent.value = percent\r\n setBodyXScroll(client)\r\n emitEvent(props.onScroll, { type: 'horizontal', client, percent })\r\n}\r\n\r\nfunction handleYBarScroll(percent: number) {\r\n const { totalHeight } = state\r\n const client = (percent * (totalHeight - (bodyScrollHeight.value ?? 0))) / 100\r\n\r\n yScrollPercent.value = percent\r\n setBodyYScroll(client)\r\n emitYScroll(client, percent)\r\n}\r\n\r\nfunction emitYScroll(client: number, percent: number) {\r\n runInLocked()\r\n nextFrameOnce(computeRenderRows)\r\n emitEvent(props.onScroll, { type: 'vertical', client, percent })\r\n}\r\n\r\nfunction handleResize() {\r\n if (mainScroll.value?.content) {\r\n bodyWidth.value = mainScroll.value.content.offsetWidth\r\n }\r\n\r\n isMounted && refresh()\r\n}\r\n\r\nfunction increaseColumn(column: TableColumnOptions) {\r\n tempColumns.add(column)\r\n}\r\n\r\nfunction decreaseColumn(column: TableColumnOptions) {\r\n tempColumns.delete(column)\r\n}\r\n\r\nfunction increaseSummary(summary: TableSummaryOptions) {\r\n tempSummaries.add(summary)\r\n}\r\n\r\nfunction decreaseSummary(summary: TableSummaryOptions) {\r\n tempSummaries.delete(summary)\r\n}\r\n\r\nfunction updateColumns() {\r\n runInLocked(() => {\r\n setColumns(allColumns.value)\r\n isMounted && computeTableWidth()\r\n nextTick(() => {\r\n hasDragColumn.value = getters.hasDragColumn\r\n })\r\n })\r\n}\r\n\r\nfunction setColumnProp(key: Key, prop: string, value: any) {\r\n mutations.setColumnProp(key, prop, value)\r\n}\r\n\r\nfunction updateSummaries() {\r\n runInLocked(() => {\r\n setSummaries(allSummaries.value)\r\n })\r\n}\r\n\r\nfunction setSummaryProp(key: Key, prop: string, value: any) {\r\n mutations.setSummaryProp(key, prop, value)\r\n}\r\n\r\nfunction getTableElement() {\r\n return wrapper.value\r\n}\r\n\r\nfunction refreshXScroll() {\r\n mainScroll.value?.refresh()\r\n xHeadScroll.value?.refresh()\r\n xAboveScroll.value?.refresh()\r\n xBelowScroll.value?.refresh()\r\n}\r\n\r\nfunction emitRowCheck(payload: TableRowPayload & { checked: boolean }) {\r\n emitEvent(props.onRowCheck, payload)\r\n}\r\n\r\nfunction emitAllRowCheck(checked: boolean, partial: boolean) {\r\n emitEvent(props.onRowCheckAll, checked, partial)\r\n}\r\n\r\nfunction emitRowExpand(payload: TableRowPayload & { expanded: boolean }) {\r\n emitEvent(props.onRowExpand, payload)\r\n}\r\n\r\nfunction emitRowTreeExpand(payload: TableRowPayload & { expanded: boolean }) {\r\n emitEvent(props.onRowTreeExpand, payload)\r\n}\r\n\r\nfunction emitRowFilter() {\r\n const { columns, filters } = state\r\n const columnMap = listToMap(columns, 'key')\r\n const profiles = Array.from(filters.keys())\r\n .filter(key => filters.get(key)!.active)\r\n .map(key => {\r\n const column = columnMap[key as string]\r\n\r\n return {\r\n name: column.name,\r\n key: column.key,\r\n meta: column.meta!,\r\n active: filters.get(key)!.active!,\r\n }\r\n })\r\n\r\n computeRenderRows(true)\r\n emitEvent(\r\n props.onRowFilter,\r\n profiles,\r\n getters.filteredData.map(row => row.data),\r\n )\r\n}\r\n\r\nfunction emitRowSort() {\r\n const { columns, sorters } = state\r\n const columnMap = listToMap(columns, 'key')\r\n const profiles = Array.from(sorters.keys())\r\n .filter(key => sorters.get(key)!.type)\r\n .map(key => {\r\n const column = columnMap[key as string]\r\n const sorter = sorters.get(key)!\r\n\r\n return {\r\n name: column.name,\r\n key: column.key,\r\n meta: column.meta!,\r\n type: sorter.type!,\r\n order: sorter.order,\r\n }\r\n })\r\n\r\n computeRenderRows(true)\r\n emitEvent(\r\n props.onRowSort,\r\n profiles,\r\n getters.sortedData.map(row => row.data),\r\n )\r\n}\r\n\r\nlet dragState: {\r\n draggingRow: TableRowState,\r\n tableRect: DOMRect,\r\n willDropRow: TableRowState | null,\r\n dropType: DropType,\r\n dropped: boolean,\r\n} | null\r\n\r\nfunction handleRowDragStart(rowInstance: TableRowInstance, event: DragEvent) {\r\n dragState = {\r\n draggingRow: rowInstance.row,\r\n tableRect: wrapper.value!.getBoundingClientRect(),\r\n willDropRow: null,\r\n dropType: DropType.BEFORE,\r\n dropped: false,\r\n }\r\n\r\n setDragging(true)\r\n emitEvent(props.onRowDragStart, rowInstance.row.data, event)\r\n}\r\n\r\nfunction handleRowDragOver(rowInstance: TableRowInstance, event: DragEvent) {\r\n if (!dragState || !rowInstance.el) return\r\n\r\n const dropRowRect = rowInstance.el.getBoundingClientRect()\r\n const tableRect = dragState.tableRect\r\n const prevPercent = state.disabledTree ? 0.5 : 0.25\r\n const nextPercent = state.disabledTree ? 0.5 : 0.75\r\n const distance = event.clientY - dropRowRect.top\r\n const dropRowHeight = dropRowRect.height\r\n\r\n let dropType: DropType\r\n let indicatorTop = -9999\r\n let isIndicatorShow = true\r\n\r\n if (distance < dropRowHeight * prevPercent) {\r\n dropType = DropType.BEFORE\r\n indicatorTop = dropRowRect.top - tableRect.top\r\n } else if (distance >= dropRowHeight * nextPercent) {\r\n dropType = DropType.AFTER\r\n indicatorTop = dropRowRect.bottom - tableRect.top\r\n } else {\r\n dropType = DropType.INNER\r\n isIndicatorShow = false\r\n }\r\n\r\n if (indicator.value) {\r\n indicator.value.style.top = `${indicatorTop - 2}px`\r\n }\r\n\r\n dragState.willDropRow = rowInstance.row\r\n dragState.dropType = dropType\r\n\r\n indicatorShow.value = isIndicatorShow\r\n indicatorType.value = dropType\r\n\r\n emitEvent(props.onRowDragOver, rowInstance.row.data, event)\r\n}\r\n\r\nfunction isLeftInsideRight(left: TableRowState, right: TableRowState) {\r\n if (!left || !right) return true\r\n\r\n while (left) {\r\n if (left === right || left.key === right.key) {\r\n return true\r\n }\r\n\r\n left = getParentRow(left.key)!\r\n }\r\n\r\n return false\r\n}\r\n\r\nfunction handleRowDrop(rowInstance: TableRowInstance, event: DragEvent) {\r\n if (!dragState) return\r\n\r\n const { draggingRow, willDropRow, dropType } = dragState\r\n\r\n if (!willDropRow || isLeftInsideRight(willDropRow, draggingRow)) return\r\n\r\n let currentKey: Key\r\n let parent: TableRowState | null\r\n\r\n if (draggingRow) {\r\n parent = getParentRow(draggingRow.key)\r\n\r\n if (!parent) {\r\n parent = {\r\n children: state.treeRowData,\r\n } as TableRowState\r\n }\r\n\r\n currentKey = draggingRow.key\r\n removeArrayItem(parent.children, item => item.key === currentKey)\r\n\r\n if (!parent.children?.length) {\r\n parent.treeExpanded = false\r\n }\r\n }\r\n\r\n if (dropType === DropType.INNER) {\r\n if (!Array.isArray(willDropRow.children)) {\r\n willDropRow.children = []\r\n }\r\n\r\n const children = Array.from(willDropRow.children)\r\n\r\n children.push(draggingRow)\r\n\r\n willDropRow.children = children\r\n willDropRow.treeExpanded = true\r\n draggingRow.parent = willDropRow.key\r\n } else {\r\n currentKey = willDropRow.key\r\n parent = getParentRow(willDropRow.key)\r\n\r\n if (!parent) {\r\n parent = {\r\n children: state.treeRowData,\r\n } as TableRowState\r\n }\r\n\r\n const index = parent.children.findIndex(row => row.key === currentKey)\r\n\r\n if (~index) {\r\n parent.children.splice(+(dropType === DropType.AFTER) + index, 0, draggingRow)\r\n\r\n draggingRow.parent = parent.key\r\n }\r\n }\r\n\r\n dragState.dropped = true\r\n\r\n refreshRowDepth()\r\n flatTreeRows()\r\n refreshRowIndex()\r\n emitEvent(props.onRowDrop, rowInstance.row.data, dropType!, event)\r\n}\r\n\r\nfunction handleRowDragEnd(event: DragEvent) {\r\n if (!dragState) return\r\n\r\n const { draggingRow, dropped } = dragState\r\n\r\n dragState = null\r\n indicatorShow.value = false\r\n\r\n nextTick(() => {\r\n const allDataPayload = dropped ? getCurrentData() : state.data\r\n\r\n setDragging(false)\r\n dropped && emit('update:data', allDataPayload)\r\n emitEvent(props.onRowDragEnd, draggingRow.data, allDataPayload, event)\r\n })\r\n}\r\n\r\nfunction emitRowEvent(type: MouseEventType, payload: TableRowPayload) {\r\n emitEvent(props[`onRow${type}`], payload)\r\n}\r\n\r\nfunction emitCellEvent(type: MouseEventType, payload: TableCellPayload) {\r\n emitEvent(props[`onCell${type}`], payload)\r\n}\r\n\r\nfunction emitHeadEvent(type: MouseEventType, payload: TableHeadPayload) {\r\n emitEvent(props[`onHead${type}`], payload)\r\n}\r\n\r\nfunction emitColResize(type: MoveEventType, payload: TableColResizePayload) {\r\n emitEvent(props[`onColResize${type}`], payload)\r\n}\r\n\r\nfunction emitFootEvent(type: MouseEventType, payload: TableFootPayload) {\r\n emitEvent(props[`onFoot${type}`], payload)\r\n}\r\n\r\nfunction computeRenderRows(force = false) {\r\n const { totalHeight, bodyYScroll, heightBITree } = state\r\n const { processedData } = getters\r\n const rowCount = processedData.length\r\n\r\n if (!props.virtual) {\r\n setRenderRows(0, rowCount, force)\r\n\r\n return\r\n }\r\n\r\n const viewHeight = Math.max(\r\n Math.min(bodyHeight.value || 0, bodyScrollHeight.value || 0),\r\n bodyMinHeight.value,\r\n )\r\n\r\n if (!viewHeight) {\r\n setRenderRows(0, 0, force)\r\n }\r\n\r\n let viewStart = bodyYScroll\r\n let viewEnd = bodyYScroll + viewHeight\r\n\r\n if (viewEnd > totalHeight) {\r\n viewEnd = totalHeight\r\n viewStart = viewEnd - viewHeight\r\n }\r\n\r\n const start = heightBITree.boundIndex(viewStart)\r\n const end = heightBITree.boundIndex(viewEnd)\r\n const renderStart = Math.max(start - props.bufferCount, 0)\r\n const renderEnd = Math.min(end + props.bufferCount + 1, rowCount)\r\n\r\n setRenderRows(renderStart, renderEnd, force)\r\n}\r\n\r\nfunction refresh() {\r\n return runInLocked(() => {\r\n nextTick(computeTableWidth)\r\n setTimeout(() => {\r\n computeBodyHeight()\r\n refreshPercentScroll()\r\n nextFrameOnce(computeRenderRows)\r\n }, 0)\r\n })\r\n}\r\n\r\nasync function runInLocked(handler = noop, delay = 250) {\r\n clearTimeout(timer.locked)\r\n\r\n setLocked(true)\r\n await handler()\r\n\r\n return new Promise<void>(resolve => {\r\n timer.locked = setTimeout(() => {\r\n setLocked(false)\r\n resolve()\r\n }, delay)\r\n })\r\n}\r\n\r\nfunction refreshPercentScroll() {\r\n clearTimeout(timer.scroll)\r\n\r\n timer.scroll = setTimeout(() => {\r\n const { totalHeight, bodyYScroll } = state\r\n\r\n yScrollPercent.value = Math.max(\r\n Math.min((bodyYScroll / (totalHeight - (bodyScrollHeight.value ?? 0) || 1)) * 100, 100),\r\n 0,\r\n )\r\n syncBarScroll()\r\n nextTick(() => {\r\n computeBodyHeight()\r\n })\r\n runInLocked()\r\n nextFrameOnce(computeRenderRows)\r\n }, 10)\r\n}\r\n\r\nfunction getSelected() {\r\n const data = state.rowData\r\n const selectedData = []\r\n\r\n for (let i = 0, len = data.length; i < len; ++i) {\r\n const row = data[i]\r\n\r\n if (row.checked) {\r\n selectedData.push(row.data)\r\n }\r\n }\r\n\r\n return selectedData\r\n}\r\n\r\nfunction setRowChecked(keyOrData: Key | Record<any, any>, checked?: boolean) {\r\n const row = queryRow(keyOrData)\r\n\r\n if (!row || getters.disableCheckRows.has(row.key)) return\r\n\r\n handleCheck(row.key, checked ?? !row.checked)\r\n}\r\n\r\nfunction setRowTreeExpanded(keyOrData: Key | Record<any, any>, expanded?: boolean) {\r\n const row = queryRow(keyOrData)\r\n\r\n if (!row) return\r\n\r\n runInLocked()\r\n setTreeExpanded(row.key, expanded ?? !row.treeExpanded)\r\n}\r\n\r\nfunction renderTableSlot({ name }: { name: string }) {\r\n return renderSlot(slots as Slots, name)\r\n}\r\n</script>\r\n\r\n<template>\r\n <div\r\n ref=\"wrapper\"\r\n :class=\"className\"\r\n role=\"table\"\r\n :style=\"style\"\r\n :aria-rowcount=\"props.data.length\"\r\n >\r\n <div v-show=\"false\" role=\"none\" aria-hidden>\r\n <slot></slot>\r\n <template\r\n v-for=\"(column, index) in props.columns\"\r\n :key=\"(column as TableColumnOptions).key ?? `__inner-column-${index}`\"\r\n >\r\n <TableColumnGroup v-if=\"'children' in column\" v-bind=\"column\"></TableColumnGroup>\r\n <TableColumn v-else v-bind=\"column\" :id-key=\"column.key\"></TableColumn>\r\n </template>\r\n <TableSummary\r\n v-for=\"({ key, ...others }, index) in props.summaries\"\r\n v-bind=\"others\"\r\n :key=\"`__inner-summary-${index}`\"\r\n :id-key=\"key\"\r\n ></TableSummary>\r\n </div>\r\n <div ref=\"thead\" :class=\"nh.be('head-wrapper')\">\r\n <NativeScroll\r\n ref=\"xHeadScroll\"\r\n inherit\r\n mode=\"horizontal\"\r\n scroll-only\r\n :class=\"[nh.be('wrapper'), props.scrollClass.horizontal]\"\r\n :scroll-x=\"state.bodyXScroll\"\r\n @scroll=\"handleXScroll\"\r\n >\r\n <div\r\n v-if=\"state.leftFixedColumns.length\"\r\n :class=\"{\r\n [nh.bem('fixed', 'left')]: true,\r\n [nh.bem('fixed', 'active')]: leftFixedActive,\r\n }\"\r\n >\r\n <TableHead fixed=\"left\"></TableHead>\r\n </div>\r\n <TableHead></TableHead>\r\n <div\r\n v-if=\"state.rightFixedColumns.length\"\r\n :class=\"{\r\n [nh.bem('fixed', 'right')]: true,\r\n [nh.bem('fixed', 'active')]: rightFixedActive,\r\n }\"\r\n >\r\n <TableHead fixed=\"right\"></TableHead>\r\n </div>\r\n </NativeScroll>\r\n </div>\r\n <div\r\n v-if=\"state.aboveSummaries.length\"\r\n ref=\"aboveTfoot\"\r\n :class=\"[nh.be('foot-wrapper'), nh.bem('foot-wrapper', 'above')]\"\r\n >\r\n <NativeScroll\r\n ref=\"xAboveScroll\"\r\n inherit\r\n mode=\"horizontal\"\r\n scroll-only\r\n :class=\"[nh.be('wrapper'), props.scrollClass.horizontal]\"\r\n :scroll-x=\"state.bodyXScroll\"\r\n @scroll=\"handleXScroll\"\r\n >\r\n <div\r\n v-if=\"state.leftFixedColumns.length\"\r\n :class=\"{\r\n [nh.bem('fixed', 'left')]: true,\r\n [nh.bem('fixed', 'active')]: leftFixedActive,\r\n }\"\r\n >\r\n <TableFoot fixed=\"left\" above></TableFoot>\r\n </div>\r\n <TableFoot above></TableFoot>\r\n <div\r\n v-if=\"state.rightFixedColumns.length\"\r\n :class=\"{\r\n [nh.bem('fixed', 'right')]: true,\r\n [nh.bem('fixed', 'active')]: rightFixedActive,\r\n }\"\r\n >\r\n <TableFoot fixed=\"right\" above></TableFoot>\r\n </div>\r\n </NativeScroll>\r\n </div>\r\n <div\r\n :class=\"[\r\n nh.be('body-wrapper'),\r\n state.totalHeight >= bodyMinHeight && nh.bem('body-wrapper', 'scrolled'),\r\n ]\"\r\n :style=\"{\r\n ...(!bodyScrollHeight && state.totalHeight\r\n ? {\r\n height: `${state.totalHeight}px`,\r\n transition:\r\n props.noTransition || state.locked\r\n ? undefined\r\n : `height ${nh.gnv('transition-base')}`,\r\n }\r\n : undefined),\r\n minHeight: `${bodyMinHeight}px`,\r\n }\"\r\n >\r\n <NativeScroll\r\n ref=\"mainScroll\"\r\n inherit\r\n mode=\"both\"\r\n scroll-only\r\n observe-deep\r\n :class=\"[nh.be('wrapper'), props.scrollClass.major]\"\r\n :bar-class=\"nh.bem('bar', 'horizontal')\"\r\n :height=\"bodyScrollHeight\"\r\n :scroll-x=\"state.bodyXScroll\"\r\n :scroll-y=\"state.bodyYScroll\"\r\n @scroll=\"handleMainScroll\"\r\n @x-enabled-change=\"xScrollEnabled = $event\"\r\n @y-enabled-change=\"yScrollEnabled = $event\"\r\n @resize=\"handleResize\"\r\n >\r\n <div\r\n v-if=\"state.leftFixedColumns.length\"\r\n :class=\"{\r\n [nh.bem('fixed', 'left')]: true,\r\n [nh.bem('fixed', 'active')]: leftFixedActive,\r\n }\"\r\n :style=\"{ minHeight: `${state.totalHeight}px` }\"\r\n >\r\n <TableBody fixed=\"left\">\r\n <template v-if=\"slots.empty || props.slots.empty\" #empty=\"{ isFixed }\">\r\n <slot name=\"empty\" :is-fixed=\"isFixed\">\r\n <Renderer :renderer=\"props.slots.empty\" :data=\"{ isFixed }\"></Renderer>\r\n </slot>\r\n </template>\r\n </TableBody>\r\n </div>\r\n <TableBody>\r\n <template v-if=\"slots.empty || props.slots.empty\" #empty=\"{ isFixed }\">\r\n <slot name=\"empty\" :is-fixed=\"isFixed\">\r\n <Renderer :renderer=\"props.slots.empty\" :data=\"{ isFixed }\"></Renderer>\r\n </slot>\r\n </template>\r\n </TableBody>\r\n <div\r\n v-if=\"state.rightFixedColumns.length\"\r\n :class=\"{\r\n [nh.bem('fixed', 'right')]: true,\r\n [nh.bem('fixed', 'active')]: rightFixedActive,\r\n }\"\r\n :style=\"{ minHeight: `${state.totalHeight}px` }\"\r\n >\r\n <TableBody fixed=\"right\">\r\n <template v-if=\"slots.empty || props.slots.empty\" #empty=\"{ isFixed }\">\r\n <slot name=\"empty\" :is-fixed=\"isFixed\">\r\n <Renderer :renderer=\"props.slots.empty\" :data=\"{ isFixed }\"></Renderer>\r\n </slot>\r\n </template>\r\n </TableBody>\r\n </div>\r\n </NativeScroll>\r\n </div>\r\n <div\r\n v-if=\"state.belowSummaries.length\"\r\n ref=\"belowTfoot\"\r\n :class=\"[nh.be('foot-wrapper'), nh.bem('foot-wrapper', 'below')]\"\r\n >\r\n <NativeScroll\r\n ref=\"xBelowScroll\"\r\n inherit\r\n mode=\"horizontal\"\r\n scroll-only\r\n :class=\"[nh.be('wrapper'), props.scrollClass.horizontal]\"\r\n :bar-class=\"nh.bem('bar', 'horizontal')\"\r\n :bar-fade=\"props.barFade\"\r\n :scroll-x=\"state.bodyXScroll\"\r\n @scroll=\"handleXScroll\"\r\n >\r\n <div\r\n v-if=\"state.leftFixedColumns.length\"\r\n :class=\"{\r\n [nh.bem('fixed', 'left')]: true,\r\n [nh.bem('fixed', 'active')]: leftFixedActive,\r\n }\"\r\n >\r\n <TableFoot fixed=\"left\"></TableFoot>\r\n </div>\r\n <TableFoot></TableFoot>\r\n <div\r\n v-if=\"state.rightFixedColumns.length\"\r\n :class=\"{\r\n [nh.bem('fixed', 'right')]: true,\r\n [nh.bem('fixed', 'active')]: rightFixedActive,\r\n }\"\r\n >\r\n <TableFoot fixed=\"right\"></TableFoot>\r\n </div>\r\n </NativeScroll>\r\n </div>\r\n <Scrollbar\r\n v-if=\"props.useXBar && useXScroll\"\r\n ref=\"xScrollbar\"\r\n inherit\r\n placement=\"bottom\"\r\n :class=\"nh.bem('bar', 'horizontal')\"\r\n :fade=\"props.barFade\"\r\n :disabled=\"!xScrollEnabled\"\r\n :bar-length=\"xBarLength\"\r\n :style=\"{ bottom: `${footHeight}px` }\"\r\n @scroll-start=\"setBarScrolling(true)\"\r\n @scroll=\"handleXBarScroll\"\r\n @scroll-end=\"setBarScrolling(false)\"\r\n ></Scrollbar>\r\n <Scrollbar\r\n v-if=\"props.useYBar && bodyScrollHeight\"\r\n ref=\"yScrollbar\"\r\n inherit\r\n placement=\"right\"\r\n :class=\"nh.bem('bar', 'vertical')\"\r\n :fade=\"props.barFade\"\r\n :disabled=\"!yScrollEnabled\"\r\n :bar-length=\"yBarLength\"\r\n :style=\"{\r\n top: headHeight ? `${headHeight}px` : undefined,\r\n bottom: footHeight ? `${footHeight}px` : undefined,\r\n }\"\r\n @scroll-start=\"setBarScrolling(true)\"\r\n @scroll=\"handleYBarScroll\"\r\n @scroll-end=\"setBarScrolling(false)\"\r\n ></Scrollbar>\r\n <div\r\n v-if=\"props.rowDraggable || hasDragColumn\"\r\n v-show=\"indicatorShow\"\r\n ref=\"indicator\"\r\n :class=\"[\r\n nh.be('indicator'),\r\n indicatorType === 'before' && nh.bem('indicator', 'before'),\r\n indicatorType === 'after' && nh.bem('indicator', 'after'),\r\n ]\"\r\n ></div>\r\n <div\r\n v-if=\"state.colResizable === 'lazy'\"\r\n v-show=\"state.colResizing\"\r\n :class=\"nh.be('resize-indicator')\"\r\n :style=\"{ left: `${state.resizeLeft}px` }\"\r\n ></div>\r\n </div>\r\n</template>\r\n"],"names":["defaultKeyConfig","props","useProps","__props","value","emit","__emit","slots","_useSlots","nh","useNameHelper","timer","useSetTimeout","bodyHeight","ref","bodyMinHeight","xScrollEnabled","yScrollEnabled","xScrollPercent","yScrollPercent","headHeight","footHeight","indicatorShow","indicatorType","DropType","tempColumns","reactive","tempSummaries","tableWidth","hasDragColumn","bodyWidth","wrapper","mainScroll","xHeadScroll","xAboveScroll","xBelowScroll","thead","aboveTfoot","belowTfoot","indicator","xScrollbar","yScrollbar","isMounted","locale","useLocale","toRef","keyConfig","computed","allColumns","allSummaries","syncToStoreProps","store","useStore","prev","current","provide","TABLE_STORE","TABLE_ACTIONS","increaseColumn","decreaseColumn","increaseSummary","decreaseSummary","getTableElement","refreshXScroll","emitRowCheck","emitAllRowCheck","emitRowExpand","emitRowTreeExpand","emitRowFilter","emitRowSort","handleRowDragStart","handleRowDragOver","handleRowDrop","handleRowDragEnd","emitRowEvent","emitCellEvent","emitHeadEvent","emitColResize","emitFootEvent","name","renderTableSlot","runInLocked","debounceMinor","updateColumns","setColumnProp","updateSummaries","setSummaryProp","TABLE_SLOTS","state","getters","mutations","mergedLocked","className","style","width","padLeft","padRight","isDefined","isValidNumber","useXScroll","bodyScrollHeight","totalHeight","xBarLength","_a","yBarLength","totalWidths","getLast","leftFixedActive","rightFixedActive","setColumns","setSummaries","setData","setDataKey","setTableWidth","setBodyYScroll","setBodyXScroll","setRenderRows","setVirtual","setLocale","setDragging","setKeyConfig","setDisabledTree","setLocked","setBarScrolling","clearSort","clearFilter","refreshRowIndex","clearCheckAll","getParentRow","getCurrentData","flatTreeRows","refreshRowDepth","queryRow","handleCheck","setTreeExpanded","watch","forceRefreshData","computeTableWidth","nextTick","computeBodyHeight","refreshPercentScroll","config","refresh","prop","watchCallback","syncBarScroll","_b","handlerResize","debounce","onMounted","onBeforeUnmount","__expose","getSelected","setRowChecked","setRowTreeExpanded","data","computeRenderRows","toNumber","height","minHeight","borderWidth","fixedHeight","handleMainScroll","payload","handleXScroll","handleYScroll","clientX","percentX","emitEvent","clientY","percentY","emitYScroll","handleXBarScroll","percent","client","handleYBarScroll","nextFrameOnce","handleResize","column","summary","key","_c","_d","checked","partial","columns","filters","columnMap","listToMap","profiles","row","sorters","sorter","dragState","rowInstance","event","dropRowRect","tableRect","prevPercent","nextPercent","distance","dropRowHeight","dropType","indicatorTop","isIndicatorShow","isLeftInsideRight","left","right","draggingRow","willDropRow","currentKey","parent","removeArrayItem","item","children","index","dropped","allDataPayload","type","force","bodyYScroll","heightBITree","processedData","rowCount","viewHeight","viewStart","viewEnd","start","end","renderStart","renderEnd","handler","noop","delay","resolve","selectedData","i","len","keyOrData","expanded","renderSlot","_createElementBlock","_unref","_withDirectives","_createElementVNode","_hoisted_2","_renderSlot","_ctx","_openBlock","_Fragment","_createBlock","_mergeProps","_renderList","others","TableSummary","_normalizeClass","_createVNode","NativeScroll","TableHead","TableFoot","_normalizeStyle","_cache","$event","TableBody","_createSlots","_withCtx","isFixed","Renderer","Scrollbar","_vShow"],"mappings":"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