UNPKG

@extclp/vexip-ui

Version:

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

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