UNPKG

vexip-ui

Version:

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

1 lines 61.3 kB
{"version":3,"file":"table.vue2.cjs","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('viewport-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>\n <slot name=\"empty\">\n <Renderer :renderer=\"props.slots.empty\"></Renderer>\n </slot>\n </template>\n </TableBody>\n </div>\n <TableBody>\n <template v-if=\"slots.empty || props.slots.empty\" #empty>\n <slot name=\"empty\">\n <Renderer :renderer=\"props.slots.empty\"></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>\n <slot name=\"empty\">\n <Renderer :renderer=\"props.slots.empty\"></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","__props","props","useProps","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","Renderer","Scrollbar","_vShow"],"mappings":"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