{"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":""}