hongluan-ui
Version:
Hongluan Component Library for Vue 3
1 lines • 21.1 kB
Source Map (JSON)
{"version":3,"file":"virtual-table.mjs","sources":["../../../../../../packages/components/simple-table/src/virtual-table.vue"],"sourcesContent":["<template>\n <div :class=\"namespace\">\n <table class=\"table-header\" :class=\"tableClass\" :style=\"tableStyle\">\n <thead v-if=\"showHeader\" :class=\"{ 'fixed-top': true }\">\n <tr\n v-for=\"(row, rowIndex) in realColsInfo.headerRows\"\n :key=\"rowIndex\"\n :class=\"getHeaderRowClass({ row, rowIndex })\"\n :style=\"getHeaderRowStyle({ row, rowIndex })\"\n >\n <th\n v-for=\"(column, columnIndex) of row\"\n v-show=\"isShowCol(column)\"\n :ref=\"el => (thRefs[columnIndex] = el)\"\n :key=\"columnIndex\"\n :rowspan=\"column.rowSpan\"\n :colspan=\"column.colSpan\"\n :style=\"[\n {\n 'width': column.width ? column.width: false,\n 'min-width': column.width ? column.width: false,\n 'max-width': column.width ? column.width: false,\n ...getHeaderCellStyle({ row, column, rowIndex, columnIndex })\n },\n !!column.fixed && getColFixed(column).distance ? '--table-fixed-distance:' + getColFixed(column).distance : ''\n ]\"\n :class=\"[\n {\n ['fixed-' + getColFixed(column).position]: !!column.fixed,\n 'show-shadow': getColFixed(column).hasShadow,\n },\n getHeaderCellClass({ row, column, rowIndex, columnIndex })\n ]\"\n >\n <div v-if=\"column.headerSlotName\" class=\"cell\" :style=\"column.align ? `justify-content:${column.align}` : ''\">\n <slot :name=\"column.headerSlotName\" :col=\"{ ...column, columnIndex }\"></slot>\n </div>\n <div v-else class=\"cell\" :style=\"column.align ? `justify-content:${column.align}` : ''\">\n {{ column.title }}\n <sortable-icon :sortable=\"column.sortable\" @sort-change=\"val => $emit('sort-change', column.prop, val)\" />\n <filter-icon\n v-if=\"column.filter?.slotName\"\n :placement=\"column.filter.placement\"\n :effect=\"column.filter.effect\"\n :popper-class=\"column.filter.popperClass\"\n :trigger=\"column.filter.trigger\"\n >\n <template #default=\"{ close }\">\n <slot :name=\"column.filter.slotName\" :close=\"close\">\n </slot>\n </template>\n </filter-icon>\n </div>\n </th>\n </tr>\n </thead>\n </table>\n <table\n v-if=\"data === null || data === undefined || data.length === 0\"\n class=\"table-body no-data\"\n :class=\"tableClass\"\n :style=\"tableStyle\"\n >\n <tbody>\n <tr v-if=\"data?.length === 0\" class=\"empty-content\">\n <td :colspan=\"realColsInfo.realCols.length\">\n <slot name=\"empty\">\n {{ t('hl.simpletable.emptyText') }}\n </slot>\n </td>\n </tr>\n <tr v-if=\"data === null || data === undefined\" class=\"unknown-content\">\n <td :colspan=\"realColsInfo.realCols.length\">\n <slot name=\"unknown\">\n </slot>\n </td>\n </tr>\n </tbody>\n </table>\n <fixed-size-list\n v-else\n :class-name=\"['table-body', ...tableClass]\"\n :style=\"tableStyle\"\n :data=\"realData\"\n :total=\"virtualTotal\"\n :height=\"height\"\n :item-size=\"itemSize\"\n :perf-mode=\"true\"\n :scrollbar-always-on=\"scrollbarAlwaysOn\"\n :cache=\"cache\"\n container-element=\"table\"\n inner-element=\"tbody\"\n @item-rendered=\"(...args) => $emit('item-rendered', ...args)\"\n >\n <template #default=\"{ data, index: rowIndex, style }\">\n <tr v-if=\"!data[rowIndex]\" class=\"loading-row\" :style=\"style\">\n <td :colspan=\"realColsInfo.realCols.length\">\n <slot name=\"loading\" :rowIndex=\"rowIndex\"></slot>\n </td>\n </tr>\n <tr\n v-else-if=\"data[rowIndex]['$type$'] === 'EXPANDED_ROW'\"\n :key=\"getRowKey(data[rowIndex]['refRow']) + data[rowIndex]['slotName']\"\n :class=\"['expand-row', data[rowIndex]['slotName']]\"\n :style=\"style\"\n @click=\"$event => $emit('row-click', data[rowIndex], rowIndex, $event)\"\n >\n <td :colspan=\"realColsInfo.realCols.length\">\n <slot :name=\"data[rowIndex]['slotName']\" :row=\"data[rowIndex]['refRow']\"></slot>\n </td>\n </tr>\n <tr\n v-else\n :key=\"getRowKey(data[rowIndex])\"\n :class=\"[\n typeof rowClassName === 'string' ? rowClassName : rowClassName({ row: data[rowIndex], rowIndex }),\n currentSelectedRow === data[rowIndex] ? 'current-row' : ''\n ]\"\n :style=\"[\n typeof rowStyle === 'function' ? rowStyle({ row: data[rowIndex], rowIndex }) : rowStyle,\n data[rowIndex]['$level$'] && `--tree-level:${data[rowIndex]['$level$']}`,\n style\n ]\"\n @click=\"$event => $emit('row-click', data[rowIndex], rowIndex, $event)\"\n >\n <template v-for=\"(column, columnIndex) of realColsInfo.realCols\" :key=\"columnIndex\">\n <cell\n :column=\"column\"\n :column-index=\"columnIndex\"\n :row=\"data[rowIndex]\"\n :row-index=\"rowIndex\"\n :cell-class-name=\"cellClassName\"\n :cell-style=\"cellStyle\"\n :span=\"getSpan({ row: data[rowIndex], column, rowIndex, columnIndex })\"\n :expanded=\"expandedKeyExisted(data[rowIndex], column.expand?.slotName)\"\n :tree-expanded=\"tableTreeMap[getRowKey(data[rowIndex])]?.expanded\"\n :show-tooltip=\"column.showTooltip && isShowTooltipMap[rowIndex + '/' + columnIndex]\"\n :has-children=\"hasChildren(data[rowIndex])\"\n :is-loading=\"tableTreeMap[getRowKey(data[rowIndex])]?.isLoading\"\n :first-column-index=\"firstColumnIndex\"\n :width=\"tdWidths[columnIndex]\"\n @cell-click=\"$event => $emit('cell-click', data[rowIndex], column, rowIndex, columnIndex, $event)\"\n @expand=\"toggleExpandVirtualRow(data[rowIndex], rowIndex, columnIndex, column.expand?.slotName)\"\n @tree-expand=\"toggleExpandVirtualTree(data[rowIndex], rowIndex)\"\n @mouseover=\"$event => tdMouseover($event, rowIndex, columnIndex)\"\n @mouseleave=\"tdMouseleave\"\n >\n <slot :name=\"column.slotName\" :row=\"{ ...data[rowIndex], rowIndex, columnIndex }\"></slot>\n </cell>\n </template>\n </tr>\n </template>\n </fixed-size-list>\n <table class=\"table-footer\" :class=\"tableClass\" :style=\"tableStyle\">\n <colgroup>\n <col v-for=\"(w, idx) in tdWidths\" :key=\"idx\" :width=\"w\">\n </colgroup>\n <tfoot>\n <slot name=\"foot\"></slot>\n </tfoot>\n </table>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, ref, provide, watch, onMounted, toRefs } from 'vue'\nimport { cloneDeep, findLast } from 'lodash-unified'\nimport { useLocale, useNamespace } from '@hongluan-ui/hooks'\nimport { FixedSizeList } from '@hongluan-ui/components/virtual-list'\nimport SortableIcon from './sortable.vue'\nimport FilterIcon from './filter.vue'\nimport Cell from './body/cell'\nimport { virtualTableProps, simpleTableContextKey } from './simple-table'\nimport { useExpand, useTree, useTooltip } from './composables'\nimport { convertCols } from './utils'\n\nimport type { Nullable } from '@hongluan-ui/utils'\nimport type { ColumnType, VirtualTableContext } from './simple-table'\n\nexport default defineComponent({\n name: 'VirtualTable',\n components: { Cell, SortableIcon, FilterIcon, FixedSizeList },\n props: virtualTableProps,\n emits: ['row-click', 'cell-click', 'sort-change', 'expand', 'tree-expand', 'current-change', 'item-rendered'],\n setup(props, { emit }) {\n const { t } = useLocale()\n const { namespace: simpleTableNS } = useNamespace('simple-table')\n const { namespace } = useNamespace('virtual-table')\n const tableRef = ref<HTMLTableElement>()\n const thRefs = ref([])\n const tdWidths = ref<string[]>([])\n const currentSelectedRow = ref<Nullable<unknown>>(null)\n const {\n expandRowKeys,\n defaultExpandAll,\n cols,\n data: realData,\n } = toRefs(props)\n\n const realColsInfo = computed(() => convertCols(cloneDeep(cols.value)))\n const slotNames = computed(() => realColsInfo.value.realCols.filter(c => c.slotName).map(c => c.slotName))\n const expandSlotNames = computed(() => realColsInfo.value.realCols.filter(c => c.expand?.slotName).map(c => c.expand?.slotName))\n const virtualTotal = computed(() => props.total ?? (realData.value ? realData.value.length : 0))\n\n const tableClass = computed(() => [\n simpleTableNS.value,\n props.size,\n props.border,\n {\n 'hover': props.hover,\n 'list': props.list,\n 'auto-height': props.autoHeight,\n },\n props.stripe == 'even' ? 'striped-even' : '',\n props.stripe == 'odd' ? 'striped-odd' : '',\n typeof props.stripe === 'boolean' && props.stripe ? 'striped-odd' : '',\n ])\n const tableStyle = computed(() => [\n props.padding ? `--table-padding: ${props.padding}` : '',\n props.cellPadding ? `--table-td-padding: ${props.cellPadding}` : '',\n props.gap ? `--table-gap: ${props.gap}` : '',\n props.gapX ? `--table-gap-x: ${props.gapX}` : '',\n props.gapY ? `--table-gap-y: ${props.gapY}` : '',\n ])\n\n const {\n toggleExpandRow,\n expandedKeyExisted,\n } = useExpand({\n expandRowKeys,\n getRowKey,\n defaultExpandAll,\n })\n\n const {\n isShowTooltipMap,\n clearTooltip,\n tdMouseover,\n tdMouseleave,\n } = useTooltip(realColsInfo)\n\n const {\n tableTreeMap,\n hasChildren,\n toggleExpandTree,\n walkTreeNode,\n } = useTree({\n load: props.load,\n treeProps: props.treeProps,\n getRowKey,\n expandRowKeys,\n defaultExpandAll,\n })\n\n function getRowKey(row: unknown): string {\n const rowKey = props.rowKey\n if (!row) throw new Error('Row is required when get row identity')\n if (typeof rowKey === 'string') {\n if (rowKey.indexOf('.') < 0) {\n return row[rowKey] + ''\n }\n const key = rowKey.split('.')\n let current = row\n for (let i = 0; i < key.length; i++) {\n current = current[key[i]]\n }\n return current + ''\n } else if (typeof rowKey === 'function') {\n return rowKey.call(null, row)\n }\n }\n\n const isShowCol = (col: ColumnType) => {\n return !('$show$' in col) || col.$show$\n }\n const toggleColumn = (index: number, show?: boolean) => {\n cols.value[index].$show$ = show ?? !('$show$' in cols.value[index] ? cols.value[index].$show$ : true)\n }\n const getColFixed = (col: ColumnType) => {\n const pos = (col: ColumnType) => typeof col.fixed === 'string' ? col.fixed : col.fixed?.position\n const result = {\n hasShadow: false,\n position: pos(col),\n distance: typeof col.fixed === 'string' ? 0 : col.fixed?.distance,\n }\n if (result.position === 'left') {\n result.hasShadow = findLast(realColsInfo.value.realCols, c => pos(c) === 'left') === col\n } else if (result.position === 'right') {\n result.hasShadow = realColsInfo.value.realCols.find(c => pos(c) === 'right') === col\n }\n return result\n }\n\n const getHeaderRowClass = ({ row, rowIndex }) => {\n return typeof props.headerRowClassName === 'string' ? props.headerRowClassName : props.headerRowClassName({ row, rowIndex })\n }\n const getHeaderRowStyle = ({ row, rowIndex }) => {\n return typeof props.headerRowStyle === 'function' ? props.headerRowStyle({ row, rowIndex }) : props.headerRowStyle\n }\n const getHeaderCellClass = ({ row, column, rowIndex, columnIndex }) => {\n return typeof props.headerCellClassName === 'string' ? props.headerCellClassName : props.headerCellClassName({ row, column, rowIndex, columnIndex })\n }\n const getHeaderCellStyle = ({ row, column, rowIndex, columnIndex }) => {\n return typeof props.headerCellStyle === 'function' ? props.headerCellStyle({ row, column, rowIndex, columnIndex }) : props.headerCellStyle\n }\n\n const rowClicked = (row, rowIndex, $event) => {\n if (props.highlightCurrentRow) {\n emit('current-change', row, cloneDeep(currentSelectedRow.value))\n currentSelectedRow.value = currentSelectedRow.value === row ? null : row\n }\n emit('row-click', row, rowIndex, $event)\n }\n const setCurrentRow = row => {\n if (props.highlightCurrentRow) {\n emit('current-change', row, cloneDeep(currentSelectedRow.value))\n currentSelectedRow.value = row ?? null\n }\n }\n\n const getSpan = ({ row, column, rowIndex, columnIndex }) => {\n const span = { rowspan: 1, colspan: 1 }\n if (props.spanMethod) {\n const result = props.spanMethod({ row, column, rowIndex, columnIndex })\n if (Array.isArray(result)) {\n span.rowspan = result[0]\n span.colspan = result[1]\n } else if (typeof result === 'object') {\n Object.assign(span, result)\n }\n }\n return span\n }\n\n const toggleExpandVirtualRow = (row: unknown, rowIndex: number, columnIndex: number, slotName: string) => {\n toggleExpandRow(row, slotName)\n if (expandedKeyExisted(row, slotName)) {\n for(let start = rowIndex + 1; start < realData.value.length; start++) {\n if (realData.value[start]['$type$'] !== 'EXPANDED_ROW' ||\n realData.value[start]['$type$'] === 'TREE_ROW' ||\n realData.value[start]['columnIndex'] > columnIndex) {\n realData.value.splice(start, 0, { '$type$': 'EXPANDED_ROW', refRow: row, rowIndex, columnIndex, slotName })\n break\n }\n }\n } else {\n for(let start = rowIndex + 1; start < realData.value.length; start++) {\n if (realData.value[start]['$type$'] === 'EXPANDED_ROW') {\n if (realData.value[start]['columnIndex'] === columnIndex) {\n realData.value.splice(start, 1)\n break\n }\n } else break\n }\n }\n }\n\n const toggleExpandVirtualTree = async (row: unknown, rowIndex: number) => {\n await toggleExpandTree(row)\n\n let start = rowIndex + 1\n while(realData.value[start]['$type$'] === 'EXPANDED_ROW') {\n start++\n }\n\n const rowKey = getRowKey(row)\n const level = tableTreeMap.value[rowKey].level\n if (tableTreeMap.value[rowKey]?.expanded) {\n const children: unknown[] = row[props.treeProps.children] ?? []\n for(let i = children.length - 1; i >= 0; i--){\n const child = children[i]\n child['$type$'] = 'TREE_ROW'\n child['$level$'] = level + 1\n realData.value.splice(start, 0, children[i])\n }\n } else {\n let count = 0\n for(let i = start; ; i++) {\n if (realData.value[i]['$type$'] !== 'TREE_ROW') break\n if (realData.value[i]['$level$'] <= level) break\n count++\n\n const treeRowKey = getRowKey(realData.value[i])\n if (tableTreeMap.value[treeRowKey]) {\n tableTreeMap.value[treeRowKey].expanded = false\n }\n }\n realData.value.splice(start, count)\n }\n }\n\n watch(realData, () => {\n walkTreeNode(realData.value)\n })\n\n onMounted(() => {\n walkTreeNode(realData.value)\n\n tdWidths.value = thRefs.value.map(thRef => thRef.offsetWidth + 'px')\n })\n\n provide<VirtualTableContext>(simpleTableContextKey, {\n isShowCol,\n getColFixed,\n })\n\n return {\n t,\n namespace,\n virtualTotal,\n tableStyle,\n tableClass,\n tableRef,\n thRefs,\n tdWidths,\n isShowCol,\n getColFixed,\n realColsInfo,\n slotNames,\n expandSlotNames,\n realData,\n getHeaderRowClass,\n getHeaderRowStyle,\n getHeaderCellClass,\n getHeaderCellStyle,\n setCurrentRow,\n toggleExpandVirtualRow,\n toggleExpandVirtualTree,\n rowClicked,\n toggleColumn,\n getRowKey,\n getSpan,\n expandedKeyExisted,\n isShowTooltipMap,\n tdMouseleave,\n tdMouseover,\n clearTooltip,\n currentSelectedRow,\n tableTreeMap,\n hasChildren,\n }\n },\n})\n</script>\n"],"names":["_openBlock","_normalizeStyle"],"mappings":"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"}