{"version":3,"file":"render-helper.mjs","names":[],"sources":["../../../../../../../packages/components/table/src/table-column/render-helper.ts"],"sourcesContent":["import {\n  Comment,\n  Fragment,\n  computed,\n  createTextVNode,\n  getCurrentInstance,\n  h,\n  ref,\n  renderSlot,\n  unref,\n  watchEffect,\n} from 'vue'\nimport { debugWarn, isArray, isUndefined } from '@element-plus/utils'\nimport { useNamespace } from '@element-plus/hooks'\nimport {\n  cellForced,\n  defaultRenderCell,\n  getDefaultClassName,\n  treeCellPrefix,\n} from '../config'\nimport { ensureValidVNode, parseMinWidth, parseWidth } from '../util'\n\nimport type { ComputedRef, RendererNode, Slots, VNode } from 'vue'\nimport type { TableColumn, TableColumnCtx } from './defaults'\nimport type { DefaultRow, Table } from '../table/defaults'\n\nfunction useRender<T extends DefaultRow>(\n  props: TableColumnCtx<T>,\n  slots: Slots,\n  owner: ComputedRef<Table<T>>\n) {\n  const instance = getCurrentInstance() as TableColumn<T>\n  const columnId = ref('')\n  const isSubColumn = ref(false)\n  const realAlign = ref<string | null>()\n  const realHeaderAlign = ref<string | null | undefined>()\n  const ns = useNamespace('table')\n  watchEffect(() => {\n    realAlign.value = props.align ? `is-${props.align}` : null\n    // nextline help render\n    realAlign.value\n  })\n  watchEffect(() => {\n    realHeaderAlign.value = props.headerAlign\n      ? `is-${props.headerAlign}`\n      : realAlign.value\n    // nextline help render\n    realHeaderAlign.value\n  })\n  const columnOrTableParent = computed<Table<T> | TableColumn<T>>(() => {\n    let parent: any = instance.vnode.vParent || instance.parent\n    while (parent && !parent.tableId && !parent.columnId) {\n      parent = parent.vnode.vParent || parent.parent\n    }\n    return parent\n  })\n  const hasTreeColumn = computed<boolean>(() => {\n    const { store } = (instance.parent as Table<T>)!\n    if (!store) return false\n    const { treeData } = store.states\n    const treeDataValue = treeData.value\n    return treeDataValue && Object.keys(treeDataValue).length > 0\n  })\n\n  const realWidth = ref(parseWidth(props.width))\n  const realMinWidth = ref(parseMinWidth(props.minWidth))\n  const setColumnWidth = (column: TableColumnCtx<T>) => {\n    if (realWidth.value) column.width = realWidth.value\n    if (realMinWidth.value) {\n      column.minWidth = realMinWidth.value\n    }\n    if (!realWidth.value && realMinWidth.value) {\n      column.width = undefined\n    }\n    if (!column.minWidth) {\n      column.minWidth = 80\n    }\n    column.realWidth = Number(\n      isUndefined(column.width) ? column.minWidth : column.width\n    )\n    return column\n  }\n  const setColumnForcedProps = (column: TableColumnCtx<T>) => {\n    // 对于特定类型的 column，某些属性不允许设置\n    const type = column.type\n    const source = cellForced[type as keyof typeof cellForced] || {}\n    Object.keys(source).forEach((prop) => {\n      const value = source[prop as keyof typeof source]\n      if (prop !== 'className' && !isUndefined(value)) {\n        ;(column as any)[prop] = value\n      }\n    })\n    const className = getDefaultClassName(type)\n    if (className) {\n      const forceClass = `${unref(ns.namespace)}-${className}`\n      column.className = column.className\n        ? `${column.className} ${forceClass}`\n        : forceClass\n    }\n    return column\n  }\n\n  const checkSubColumn = (children: VNode | VNode[]) => {\n    if (isArray(children)) {\n      children.forEach((child) => check(child))\n    } else {\n      check(children)\n    }\n    function check(item: any) {\n      if (item?.type?.name === 'ElTableColumn') {\n        item.vParent = instance\n      }\n    }\n  }\n  const setColumnRenders = (column: TableColumnCtx<T>) => {\n    // renderHeader 属性不推荐使用。\n    //@ts-expect-error\n    if (props.renderHeader) {\n      debugWarn(\n        'TableColumn',\n        'Comparing to render-header, scoped-slot header is easier to use. We recommend users to use scoped-slot header.'\n      )\n    } else if (column.type !== 'selection') {\n      column.renderHeader = (scope) => {\n        // help render\n        instance.columnConfig.value['label']\n\n        if (slots.header) {\n          const slotResult = slots.header(scope)\n          // Manual valid check to support v-if fallback\n          // and bypass renderSlot to support HMR\n          if (ensureValidVNode(slotResult)) {\n            return h(Fragment, slotResult)\n          }\n        }\n\n        return createTextVNode(column.label)\n      }\n    }\n\n    if (slots['filter-icon']) {\n      column.renderFilterIcon = (scope) => {\n        return renderSlot(slots, 'filter-icon', scope)\n      }\n    }\n\n    if (slots.expand) {\n      column.renderExpand = (scope) => {\n        return renderSlot(slots, 'expand', scope)\n      }\n    }\n\n    let originRenderCell = column.renderCell\n    // TODO: 这里的实现调整\n    if (column.type === 'expand') {\n      // 对于展开行，renderCell 不允许配置的。在上一步中已经设置过，这里需要简单封装一下。\n      column.renderCell = (data) =>\n        h(\n          'div',\n          {\n            class: 'cell',\n          },\n          [originRenderCell(data)]\n        )\n      owner.value.renderExpanded = (row) => {\n        return slots.default ? slots.default(row) : slots.default\n      }\n    } else {\n      originRenderCell = originRenderCell || defaultRenderCell\n      // 对 renderCell 进行包装\n      column.renderCell = (data) => {\n        let children: VNode | VNode[] | null = null\n        if (slots.default) {\n          const vnodes = slots.default(data)\n          children = vnodes.some((v) => v.type !== Comment)\n            ? vnodes\n            : originRenderCell(data)\n        } else {\n          children = originRenderCell(data)\n        }\n\n        const { columns } = owner.value.store.states\n        const firstUserColumnIndex = columns.value.findIndex(\n          (item) => item.type === 'default'\n        )\n        const shouldCreatePlaceholder =\n          hasTreeColumn.value && data.cellIndex === firstUserColumnIndex\n        const prefix = treeCellPrefix(data, shouldCreatePlaceholder)\n        const props = {\n          class: 'cell',\n          style: {},\n        }\n        if (column.showOverflowTooltip) {\n          props.class = `${props.class} ${unref(ns.namespace)}-tooltip`\n          props.style = {\n            width: `${\n              (data.column.realWidth || Number(data.column.width)) - 1\n            }px`,\n          }\n        }\n        checkSubColumn(children)\n        return h('div', props, [prefix, children])\n      }\n    }\n    return column\n  }\n  const getPropsData = (...propsKey: string[][]) => {\n    return propsKey.reduce(\n      (prev, cur) => {\n        if (isArray(cur)) {\n          cur.forEach((key) => {\n            prev[key] = props[key as keyof TableColumnCtx<T>]\n          })\n        }\n        return prev\n      },\n      {} as Record<string, any>\n    )\n  }\n  const getColumnElIndex = (children: T[], child: RendererNode | null) => {\n    return Array.prototype.indexOf.call(children, child)\n  }\n\n  const updateColumnOrder = () => {\n    owner.value.store.commit('updateColumnOrder', instance.columnConfig.value)\n  }\n\n  return {\n    columnId,\n    realAlign,\n    isSubColumn,\n    realHeaderAlign,\n    columnOrTableParent,\n    setColumnWidth,\n    setColumnForcedProps,\n    setColumnRenders,\n    getPropsData,\n    getColumnElIndex,\n    updateColumnOrder,\n  }\n}\n\nexport default useRender\n"],"mappings":"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"}