element-plus
Version:
A Component Library for Vue 3
1 lines • 6.85 kB
Source Map (JSON)
{"version":3,"file":"index2.mjs","names":[],"sources":["../../../../../../../packages/components/table/src/table-column/index.vue"],"sourcesContent":["<template>\n <TableColumnRenderer />\n</template>\n\n<script lang=\"ts\" setup generic=\"T extends DefaultRow = DefaultRow\">\nimport {\n Fragment,\n computed,\n getCurrentInstance,\n h,\n onBeforeMount,\n onBeforeUnmount,\n onMounted,\n ref,\n} from 'vue'\nimport { useGlobalConfig } from '@element-plus/components/config-provider'\nimport { isArray, isString, isUndefined } from '@element-plus/utils'\nimport { cellStarts } from '../config'\nimport { compose, createTableColumnId, mergeOptions } from '../util'\nimport useWatcher from './watcher-helper'\nimport useRender from './render-helper'\n\nimport type { VNode } from 'vue'\nimport type { TableColumn, TableColumnCtx, TableColumnProps } from './defaults'\nimport type { DefaultRow } from '../table/defaults'\n\ndefineOptions({\n name: 'ElTableColumn',\n})\n\nconst props = withDefaults(defineProps<TableColumnProps<T>>(), {\n type: 'default',\n width: '',\n minWidth: '',\n sortable: false,\n resizable: true,\n showOverflowTooltip: undefined,\n filterMultiple: true,\n sortOrders: () => ['ascending', 'descending', null],\n})\nconst slots = defineSlots<{\n default?: (props: {\n row: T\n column: TableColumnCtx<T>\n $index: number\n }) => any\n header?: (props: { column: TableColumnCtx<T>; $index: number }) => any\n expand?: (props: { expanded: boolean; expandable: boolean }) => any\n 'filter-icon'?: (props: { filterOpened: boolean }) => any\n}>()\n\nconst instance = getCurrentInstance() as TableColumn<T>\nconst globalConfig = useGlobalConfig('table')\nconst columnConfig = ref<Partial<TableColumnCtx<T>>>({})\nconst owner = computed(() => {\n let parent = instance.parent as any\n while (parent && !parent.tableId) {\n parent = parent.parent\n }\n return parent\n})\n\nconst { registerNormalWatchers, registerComplexWatchers } = useWatcher<T>(\n owner,\n props\n)\nconst {\n columnId,\n isSubColumn,\n realHeaderAlign,\n columnOrTableParent,\n setColumnWidth,\n setColumnForcedProps,\n setColumnRenders,\n getPropsData,\n getColumnElIndex,\n realAlign,\n updateColumnOrder,\n} = useRender<T>(props as unknown as TableColumnCtx<T>, slots, owner)\n\nconst parent = columnOrTableParent.value\nconst parentId = 'tableId' in parent ? parent.tableId : parent.columnId\ncolumnId.value = createTableColumnId(parentId)\n\nonBeforeMount(() => {\n isSubColumn.value = owner.value !== parent\n\n const type = (props.type as keyof typeof cellStarts) || 'default'\n const sortable = props.sortable === '' ? true : props.sortable\n //The selection column should not be affected by `showOverflowTooltip`.\n const showOverflowTooltip =\n type === 'selection'\n ? false\n : isUndefined(props.showOverflowTooltip)\n ? (parent.props.showOverflowTooltip ??\n globalConfig.value?.showOverflowTooltip)\n : props.showOverflowTooltip\n const tooltipFormatter = isUndefined(props.tooltipFormatter)\n ? (parent.props.tooltipFormatter ?? globalConfig.value?.tooltipFormatter)\n : props.tooltipFormatter\n const defaults = {\n ...cellStarts[type],\n id: columnId.value,\n type,\n property: props.prop || props.property,\n align: realAlign,\n headerAlign: realHeaderAlign,\n showOverflowTooltip,\n tooltipFormatter,\n // filter 相关属性\n filterable: props.filters || props.filterMethod,\n filteredValue: [],\n filterPlacement: '',\n filterClassName: '',\n isColumnGroup: false,\n isSubColumn: false,\n filterOpened: false,\n // sort 相关属性\n sortable,\n // index 列\n index: props.index,\n // <el-table-column key=\"xxx\" />\n rawColumnKey: instance.vnode.key,\n }\n\n const basicProps = [\n 'columnKey',\n 'label',\n 'className',\n 'labelClassName',\n 'type',\n 'renderHeader',\n 'formatter',\n 'fixed',\n 'resizable',\n ]\n const sortProps = ['sortMethod', 'sortBy', 'sortOrders']\n const selectProps = ['selectable', 'reserveSelection']\n const filterProps = [\n 'filterMethod',\n 'filters',\n 'filterMultiple',\n 'filterOpened',\n 'filteredValue',\n 'filterPlacement',\n 'filterClassName',\n ]\n\n let column = getPropsData(basicProps, sortProps, selectProps, filterProps)\n\n column = mergeOptions(defaults, column)\n // 注意 compose 中函数执行的顺序是从右到左\n const chains = compose(setColumnRenders, setColumnWidth, setColumnForcedProps)\n column = chains(column) as unknown as TableColumnCtx<T>\n columnConfig.value = column\n\n // 注册 watcher\n registerNormalWatchers()\n registerComplexWatchers()\n})\n\nonMounted(() => {\n const parent = columnOrTableParent.value\n const children = isSubColumn.value\n ? parent.vnode.el?.children\n : parent.refs.hiddenColumns?.children\n const getColumnIndex = () =>\n getColumnElIndex(children || [], instance.vnode.el)\n columnConfig.value.getColumnIndex = getColumnIndex\n const columnIndex = getColumnIndex()\n columnIndex > -1 &&\n owner.value.store.commit(\n 'insertColumn',\n columnConfig.value,\n isSubColumn.value\n ? 'columnConfig' in parent && parent.columnConfig.value\n : null,\n updateColumnOrder\n )\n})\n\nonBeforeUnmount(() => {\n const getColumnIndex = columnConfig.value.getColumnIndex\n const columnIndex = getColumnIndex ? getColumnIndex() : -1\n columnIndex > -1 &&\n owner.value.store.commit(\n 'removeColumn',\n columnConfig.value,\n isSubColumn.value\n ? 'columnConfig' in parent && parent.columnConfig.value\n : null,\n updateColumnOrder\n )\n})\n\ninstance.columnId = columnId.value\n\ninstance.columnConfig = columnConfig as any\n\nconst TableColumnRenderer = () => {\n try {\n const renderDefault = slots.default?.({\n row: {} as T,\n column: {} as TableColumnCtx<T>,\n $index: -1,\n })\n const children = []\n if (isArray(renderDefault)) {\n for (const childNode of renderDefault) {\n if (\n (childNode.type as any)?.name === 'ElTableColumn' ||\n childNode.shapeFlag & 2\n ) {\n children.push(childNode)\n } else if (childNode.type === Fragment && isArray(childNode.children)) {\n childNode.children.forEach((vnode: VNode) => {\n // No rendering when vnode is dynamic slot or text\n if (\n (vnode as VNode)?.patchFlag !== 1024 &&\n !isString((vnode as VNode)?.children)\n ) {\n children.push(vnode)\n }\n })\n }\n }\n }\n return h('div', children)\n } catch {\n return h('div', [])\n }\n}\n</script>\n"],"mappings":""}