UNPKG

vexip-ui

Version:

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

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