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