vexip-ui
Version:
A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good
1 lines • 13.3 kB
Source Map (JSON)
{"version":3,"file":"table-column.cjs","sources":["../../../components/table/table-column.ts"],"sourcesContent":["import {\n computed,\n defineComponent,\n inject,\n onBeforeUnmount,\n reactive,\n renderSlot,\n watch,\n} from 'vue'\n\nimport { createSizeProp, useProps } from '@vexip-ui/config'\nimport { isNull, warnOnce } from '@vexip-ui/utils'\nimport { tableColumnProps } from './props'\nimport { COLUMN_GROUP_ACTIONS, TABLE_ACTIONS, columnTypes, noopFormatter } from './symbol'\n\nimport type { ColumnWithKey, Data, TableRowState, TableTextAlign } from './symbol'\n\ntype ColumnPropKey = keyof typeof tableColumnProps\n\nconst propKeys = Object.keys(tableColumnProps) as ColumnPropKey[]\nconst aliases: Partial<Record<ColumnPropKey, string>> = {\n idKey: 'key',\n}\nconst ignoredProps: ColumnPropKey[] = [\n 'renderer',\n 'headRenderer',\n 'filterRenderer',\n 'summaryRenderer',\n]\nconst triggerProps: ColumnPropKey[] = [\n 'idKey',\n 'fixed',\n 'type',\n 'width',\n 'minWidth',\n 'maxWidth',\n 'sorter',\n 'order',\n 'orderLabel',\n 'disableRow',\n 'headSpan',\n 'cellSpan',\n]\nconst aligns: TableTextAlign[] = ['left', 'center', 'right']\n\nconst funcProp = {\n default: null,\n isFunc: true,\n static: true,\n}\n\nexport default defineComponent({\n name: 'TableColumn',\n inheritAttrs: false,\n props: tableColumnProps,\n setup(_props, { slots }) {\n const props = useProps('tableColumn', _props, {\n idKey: {\n default: null,\n validator: value => !isNull(value),\n static: true,\n },\n name: {\n default: '',\n static: true,\n },\n accessor: {\n default: null,\n isFunc: true,\n static: true,\n },\n fixed: {\n default: false,\n static: true,\n },\n class: null,\n style: null,\n attrs: null,\n type: {\n default: null,\n validator: value => columnTypes.includes(value),\n static: true,\n },\n width: null,\n minWidth: 10,\n maxWidth: null,\n filter: null,\n sorter: false,\n renderer: funcProp,\n headRenderer: funcProp,\n filterRenderer: funcProp,\n order: {\n default: 0,\n static: true,\n },\n ellipsis: null,\n checkboxSize: {\n ...createSizeProp(),\n default: null,\n },\n selectionSize: {\n ...createSizeProp(),\n default: null,\n },\n disableRow: {\n default: null,\n isFunc: true,\n },\n truthIndex: false,\n orderLabel: {\n default: null,\n isFunc: true,\n },\n meta: null,\n textAlign: {\n default: 'left',\n validator: value => aligns.includes(value),\n },\n headSpan: {\n default: 1,\n static: true,\n },\n cellSpan: funcProp,\n noSummary: false,\n summaryRenderer: funcProp,\n indented: false,\n formatter: {\n default: null,\n isFunc: true,\n },\n singleSelect: false,\n })\n\n const selectionSize = computed(() => {\n if (props.checkboxSize) {\n warnOnce(\"'checkboxSize' has been deprecated, please use 'selectionSize' instead.\")\n }\n\n return props.selectionSize ?? props.checkboxSize ?? 'default'\n })\n\n const tableAction = inject(TABLE_ACTIONS, null)\n const parentActions = inject(COLUMN_GROUP_ACTIONS, null)\n const options = reactive({}) as ColumnWithKey\n\n for (const key of propKeys) {\n if (ignoredProps.includes(key)) continue\n\n if (key === 'selectionSize' || key === 'checkboxSize') {\n ;(options as any).selectionSize = selectionSize.value\n\n watch(selectionSize, value => {\n ;(options as any).selectionSize = value\n tableAction?.setColumnProp(options.key, 'selectionSize', value)\n })\n\n continue\n }\n\n const aliasKey = (aliases[key] || key) as keyof ColumnWithKey\n\n ;(options[aliasKey] as any) = props[key]\n\n if (key === 'idKey') {\n const update = (value: string | number) => {\n if (isNull(value) && props.type) {\n ;(options[aliasKey] as any) = value = `__vxp_${props.type}`\n } else {\n ;(options[aliasKey] as any) = value\n }\n }\n\n update(props.idKey)\n watch(\n () => props.idKey,\n value => {\n update(value)\n tableAction?.updateColumns()\n },\n )\n } else if (key === 'filter') {\n const filterWithoutMeta = computed(() => {\n if (props.filter) {\n const { meta, ...filter } = props.filter\n return filter\n }\n\n return props.filter\n })\n\n watch(\n filterWithoutMeta,\n () => {\n options.filter = props.filter\n tableAction?.updateColumns()\n },\n { deep: true },\n )\n } else {\n const trigger = triggerProps.includes(key)\n\n watch(\n () => props[key],\n value => {\n ;(options[aliasKey] as any) = value\n trigger\n ? tableAction?.updateColumns()\n : tableAction?.setColumnProp(options.key, key, value)\n },\n )\n }\n }\n\n watch(() => props.renderer, setRenderer)\n watch(() => props.headRenderer, setHeadRenderer)\n watch(() => props.filterRenderer, setFilterRenderer)\n watch(() => props.summaryRenderer, setSummaryRenderer)\n\n setRenderer()\n setHeadRenderer()\n setFilterRenderer()\n setSummaryRenderer()\n\n if (parentActions) {\n parentActions.increaseColumn(options)\n\n onBeforeUnmount(() => {\n parentActions.decreaseColumn(options)\n })\n } else {\n tableAction?.increaseColumn(options)\n\n onBeforeUnmount(() => {\n tableAction?.decreaseColumn(options)\n })\n }\n\n // TODO: 在动态列时会触发无限 watch,初步估计是重置单元格合并状态导致的\n // onBeforeUpdate(() => {\n // setRenderer()\n // setHeadRenderer()\n // setFilterRenderer()\n // }\n\n function setRenderer() {\n if (options.type && options.type !== 'expand') {\n ;(options as any).renderer = undefined\n return\n }\n\n options.renderer = (data: any) => {\n if (typeof slots.default === 'function') {\n return renderSlot(slots, 'default', data)\n }\n\n if (typeof props.renderer === 'function') {\n return props.renderer(data)\n }\n\n if (options.type === 'expand') {\n return ''\n }\n\n const row = data.row\n const rowIndex = data.rowIndex as number\n const formatter =\n typeof options.formatter === 'function' ? options.formatter : noopFormatter\n\n const result = formatter(\n typeof props.accessor === 'function'\n ? props.accessor(row as Data, rowIndex)\n : (row as TableRowState)[options.key as unknown as keyof TableRowState],\n )\n\n return isNull(result) ? '' : String(result)\n }\n }\n\n function setHeadRenderer() {\n if (options.type === 'selection') {\n ;(options as any).renderer = undefined\n return\n }\n\n options.headRenderer = data => {\n if (typeof slots.head === 'function') {\n return renderSlot(slots, 'head', data)\n }\n\n if (typeof props.headRenderer === 'function') {\n return props.headRenderer(data)\n }\n\n return props.name\n }\n }\n\n function setFilterRenderer() {\n if (typeof slots.filter === 'function' || typeof props.filterRenderer === 'function') {\n options.filterRenderer = data => {\n if (typeof slots.filter === 'function') {\n return renderSlot(slots, 'filter', data)\n }\n\n return props.filterRenderer(data)\n }\n } else {\n options.filterRenderer = undefined\n }\n }\n\n function setSummaryRenderer() {\n if (typeof slots.summary === 'function' || typeof props.summaryRenderer === 'function') {\n options.summaryRenderer = data => {\n if (typeof slots.summary === 'function') {\n return renderSlot(slots, 'summary', data)\n }\n\n if (typeof props.summaryRenderer === 'function') {\n return props.summaryRenderer(data)\n }\n\n return ''\n }\n } else {\n options.summaryRenderer = undefined\n }\n }\n\n return () => null\n },\n})\n"],"names":["propKeys","tableColumnProps","aliases","ignoredProps","triggerProps","aligns","funcProp","TableColumn","defineComponent","_props","slots","props","useProps","value","isNull","columnTypes","createSizeProp","selectionSize","computed","warnOnce","tableAction","inject","TABLE_ACTIONS","parentActions","COLUMN_GROUP_ACTIONS","options","reactive","key","watch","aliasKey","update","filterWithoutMeta","meta","filter","trigger","setRenderer","setHeadRenderer","setFilterRenderer","setSummaryRenderer","onBeforeUnmount","data","renderSlot","row","rowIndex","result","noopFormatter"],"mappings":"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"}