vue3-smart-table 1.0.5 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/LICENSE +21 -0
  3. package/README.md +1 -1
  4. package/dist/types/components/SmartTable/config.d.ts +50 -0
  5. package/dist/types/components/SmartTable/hooks/useOperationColumn.d.ts +19 -0
  6. package/dist/types/components/SmartTable/hooks/useTableColumns.d.ts +28 -0
  7. package/dist/types/components/SmartTable/index.vue.d.ts +89 -0
  8. package/dist/types/components/SmartTable/renderer.d.ts +57 -0
  9. package/dist/types/components/SmartTable/renderers/index.d.ts +46 -0
  10. package/dist/types/components/SmartTable/renderers/input.vue.d.ts +11 -0
  11. package/dist/types/components/SmartTable/renderers/inputNumber.vue.d.ts +12 -0
  12. package/dist/types/components/SmartTable/renderers/select.vue.d.ts +12 -0
  13. package/dist/types/components/SmartTable/types.d.ts +193 -0
  14. package/dist/types/components/SmartTable/utils/path.d.ts +9 -0
  15. package/dist/types/index.d.ts +13 -0
  16. package/dist/types/types/enhanced.d.ts +58 -0
  17. package/dist/vue3-smart-table.cjs.js +1 -1
  18. package/dist/vue3-smart-table.cjs.js.map +1 -1
  19. package/dist/vue3-smart-table.es.js +130 -126
  20. package/dist/vue3-smart-table.es.js.map +1 -1
  21. package/dist/vue3-smart-table.umd.js +2 -2
  22. package/dist/vue3-smart-table.umd.js.map +1 -1
  23. package/package.json +45 -10
  24. package/src/components/SmartTable/index.vue +1 -0
  25. package/src/components/SmartTable/renderer.ts +3 -2
  26. package/src/components/SmartTable/renderers/index.ts +3 -2
  27. package/src/components/SmartTable/renderers/input.vue +1 -0
  28. package/src/components/SmartTable/renderers/inputNumber.vue +1 -0
  29. package/src/components/SmartTable/renderers/select.vue +1 -0
  30. package/src/components/SmartTable/types.ts +11 -1
@@ -1 +1 @@
1
- {"version":3,"file":"vue3-smart-table.es.js","sources":["../src/components/SmartTable/hooks/useTableColumns.ts","../src/components/SmartTable/hooks/useOperationColumn.ts","../src/components/SmartTable/renderer.ts","../src/components/SmartTable/utils/path.ts","../src/components/SmartTable/renderers/input.vue","../src/components/SmartTable/renderers/inputNumber.vue","../src/components/SmartTable/renderers/select.vue","../src/components/SmartTable/renderers/index.ts","../src/components/SmartTable/index.vue","../src/components/SmartTable/config.ts","../src/types/enhanced.ts"],"sourcesContent":["import { ref, watch } from 'vue'\r\n\r\n\r\n/**\r\n * 合并默认列配置和缓存配置\r\n *\r\n * 设计原则:\r\n * 1️⃣ 列顺序:以 defaultColumns 为准\r\n * 2️⃣ 列增减:以 defaultColumns 为准\r\n * 3️⃣ 缓存只覆盖用户可配置字段(如 visible)\r\n */\r\nfunction mergeColumns(\r\n defaultColumns: any[],\r\n cacheColumns: Array<{ key: string; visible?: boolean }>\r\n) {\r\n if (!cacheColumns?.length) return defaultColumns\r\n\r\n // 建立 key => cache 映射表,提升查找效率\r\n const cacheMap = new Map(\r\n cacheColumns.map(c => [c.key, c])\r\n )\r\n\r\n return defaultColumns.map(col => {\r\n const cacheCol = cacheMap.get(col.key)\r\n\r\n // 只允许缓存覆盖「可配置字段」\r\n if (!cacheCol) return col\r\n\r\n return {\r\n ...col,\r\n visible:\r\n typeof cacheCol.visible === 'boolean'\r\n ? cacheCol.visible\r\n : col.visible\r\n }\r\n })\r\n}\r\n\r\n\r\n/**\r\n * useTableColumns\r\n *\r\n * 表格列管理 Hook\r\n *\r\n * 职责:\r\n * - 管理表格列顺序\r\n * - 管理列显示 / 隐藏\r\n * - 持久化用户配置\r\n */\r\nexport function useTableColumns(\r\n defaultColumns: any[],\r\n options?: {\r\n /** 缓存唯一标识 */\r\n cacheKey?: string\r\n /** 存储介质,默认 localStorage */\r\n storage?: Storage\r\n }\r\n) {\r\n\r\n /** 解构参数并设置默认值 */\r\n const { cacheKey, storage = localStorage } = options || {}\r\n\r\n /**\r\n * 如果没有 cacheKey,则不启用缓存\r\n * (例如公共页面、未登录页面)\r\n * 从缓存中读取列配置\r\n */\r\n const cache = cacheKey ? storage.getItem(cacheKey) : null\r\n\r\n /**\r\n * 响应式列配置\r\n * 初始化时合并默认列和缓存列\r\n */\r\n const columns = ref(\r\n mergeColumns(\r\n defaultColumns,\r\n cache ? JSON.parse(cache) : []\r\n )\r\n )\r\n\r\n /**\r\n * 监听列变化,自动写入缓存\r\n */\r\n watch(\r\n columns,\r\n (newVal: any) => {\r\n if (!cacheKey) return\r\n\r\n /**\r\n * ⚠️ 只保存“轻量配置”\r\n * 避免把 render / action / 函数序列化进 localStorage\r\n */\r\n const lightColumns = newVal.map((col: any) => ({\r\n key: col.key,\r\n visible: col.visible,\r\n columnOpts: col.columnOpts\r\n }))\r\n\r\n storage.setItem(\r\n cacheKey,\r\n JSON.stringify(lightColumns)\r\n )\r\n },\r\n { deep: true }\r\n )\r\n\r\n /**\r\n * 对外暴露的 API\r\n */\r\n return {\r\n /** 当前列配置(响应式) */\r\n columns,\r\n\r\n /**\r\n * 主动设置列配置\r\n * 常用于:列设置弹窗 / 拖拽排序完成\r\n */\r\n setColumns(newColumns: any[]) {\r\n columns.value = mergeColumns(\r\n defaultColumns,\r\n newColumns\r\n )\r\n\r\n if (cacheKey) {\r\n storage.setItem(\r\n cacheKey,\r\n JSON.stringify(newColumns)\r\n )\r\n }\r\n },\r\n\r\n /**\r\n * 重置为默认列配置\r\n */\r\n resetColumns() {\r\n columns.value = defaultColumns\r\n\r\n if (cacheKey) {\r\n storage.removeItem(cacheKey)\r\n }\r\n }\r\n }\r\n}\r\n","import { computed } from 'vue'\r\n\r\nimport { ButtonConfig } from \"../types\"\r\n\r\n/**\r\n * useOperationColumn\r\n *\r\n * 操作列专用逻辑 Hook,负责:\r\n * 1. 根据权限判断操作列是否需要显示\r\n * 2. 计算操作列宽度(支持按钮自定义宽度)\r\n * 3. 支持行级 visible 配置\r\n * @param buttonConfigs 操作列按钮配置\r\n * @param maxbtn 操作列最多显示按钮数量(超过的不参与宽度计算)\r\n * @param userPermissions 当前用户权限列表\r\n */\r\nexport function useOperationColumn(\r\n buttonConfigs: ButtonConfig[],\r\n maxbtn = 10,\r\n userPermissions: string[] = []\r\n) {\r\n /** 默认按钮宽度 */\r\n const defaultWidth = 55\r\n\r\n /** 超级权限标识 */\r\n const all_permission = '*:*:*'\r\n\r\n /** --------------------------\r\n * 权限判断\r\n * -------------------------- */\r\n\r\n /**\r\n * 判断是否具备按钮权限\r\n *\r\n * 规则:\r\n * - permission 未配置 ⇒ 永远有权限\r\n * - permission 为 string | string[] ⇒ 与用户权限匹配\r\n */\r\n const hasPermi = (value?: string | string[]) => {\r\n if (!value) return true\r\n\r\n const permArray = Array.isArray(value) ? value : [value]\r\n return userPermissions.some(\r\n p => p === all_permission || permArray.includes(p)\r\n )\r\n }\r\n\r\n /** --------------------------\r\n * 仅基于权限(不考虑行级 visible)\r\n * 适用于:表格未加载数据时的判断\r\n * -------------------------- */\r\n\r\n /**\r\n * 是否至少存在一个有权限的按钮\r\n * 用于判断操作列是否需要渲染\r\n */\r\n const hasAnyButton = computed(() => {\r\n return buttonConfigs.some(btn => hasPermi(btn.permission))\r\n })\r\n\r\n /**\r\n * 操作列宽度(仅基于权限)\r\n * 用于无行数据时的兜底宽度计算\r\n *\r\n * 注意:这里不考虑 visible,因为没有 row 数据无法执行 visible 函数\r\n * 实际使用时会根据行数据重新计算\r\n */\r\n const optWidth = computed(() => {\r\n const permittedBtns = buttonConfigs\r\n .filter(btn => hasPermi(btn.permission))\r\n .slice(0, maxbtn)\r\n\r\n return permittedBtns.reduce(\r\n (sum, btn) => sum + (btn.width ?? defaultWidth),\r\n 0\r\n )\r\n })\r\n\r\n /** --------------------------\r\n * 权限 + 行级 visible\r\n * -------------------------- */\r\n\r\n /**\r\n * 判断某个按钮在某一行是否可见\r\n */\r\n const isButtonVisible = (btn: ButtonConfig, row: any) => {\r\n return (\r\n hasPermi(btn.permission) &&\r\n (btn.visible ? btn.visible(row) : true)\r\n )\r\n }\r\n\r\n /**\r\n * 单行操作列宽度\r\n */\r\n const optRowWidth = (row: any) => {\r\n const visibleBtns = buttonConfigs\r\n .filter(btn => isButtonVisible(btn, row))\r\n .slice(0, maxbtn)\r\n\r\n return visibleBtns.reduce(\r\n (sum, btn) => sum + (btn.width ?? defaultWidth),\r\n 0\r\n )\r\n }\r\n\r\n /**\r\n * 遍历所有行,获取最大操作列宽度\r\n */\r\n const getMaxOptWidth = (rows: any[]) => {\r\n if (!rows?.length) return optWidth.value\r\n return rows.reduce(\r\n (max, row) => Math.max(max, optRowWidth(row)),\r\n 0\r\n )\r\n }\r\n\r\n /**\r\n * 判断是否至少有一行存在可见按钮\r\n */\r\n const hasAnyVisibleButton = (rows: any[]) => {\r\n if (!rows?.length) return false\r\n return rows.some(row =>\r\n buttonConfigs.some(btn => isButtonVisible(btn, row))\r\n )\r\n }\r\n\r\n const getVisibleButtons = (row: any) => {\r\n return buttonConfigs\r\n .filter(btn => isButtonVisible(btn, row))\r\n .slice(0, maxbtn)\r\n }\r\n\r\n return {\r\n hasAnyButton,\r\n optWidth,\r\n hasAnyVisibleButton,\r\n getMaxOptWidth,\r\n getVisibleButtons\r\n }\r\n}\r\n","/**\r\n * SmartTable 内部渲染器管理系统\r\n * 移动到组件内部,保证组件的自包含性\r\n */\r\nimport { defineComponent, h, Component } from 'vue'\r\nimport type { Renderer } from './types'\r\n\r\n/**\r\n * 渲染器注册表接口\r\n */\r\nexport interface RendererRegistry {\r\n register(name: string, renderer: Renderer): void\r\n registerMultiple(renderers: Record<string, Renderer>): void\r\n get(name: string): Renderer | undefined\r\n has(name: string): boolean\r\n unregister(name: string): boolean\r\n clear(): void\r\n names(): string[]\r\n}\r\n\r\n/**\r\n * 渲染器管理器类\r\n */\r\nclass RendererManager implements RendererRegistry {\r\n private renderers: Map<string, Renderer> = new Map()\r\n\r\n register(name: string, renderer: Renderer): void {\r\n if (this.renderers.has(name)) {\r\n // 批量注册时不警告,只在单独注册时警告\r\n if (process.env.NODE_ENV === 'development') {\r\n console.debug(`[SmartTable] Renderer \"${name}\" already registered, skipping.`)\r\n }\r\n }\r\n this.renderers.set(name, renderer)\r\n }\r\n\r\n registerMultiple(renderers: Record<string, Renderer>): void {\r\n Object.entries(renderers).forEach(([name, renderer]) => {\r\n if (!this.renderers.has(name)) {\r\n this.renderers.set(name, renderer)\r\n }\r\n })\r\n }\r\n\r\n get(name: string): Renderer | undefined {\r\n return this.renderers.get(name)\r\n }\r\n\r\n has(name: string): boolean {\r\n return this.renderers.has(name)\r\n }\r\n\r\n unregister(name: string): boolean {\r\n return this.renderers.delete(name)\r\n }\r\n\r\n clear(): void {\r\n this.renderers.clear()\r\n }\r\n\r\n names(): string[] {\r\n return Array.from(this.renderers.keys())\r\n }\r\n}\r\n\r\n/**\r\n * 全局渲染器管理器单例\r\n */\r\nlet globalRendererManager: RendererManager | null = null\r\n\r\n/**\r\n * 获取渲染器管理器\r\n */\r\nexport function getRendererManager(): RendererManager {\r\n if (!globalRendererManager) {\r\n globalRendererManager = new RendererManager()\r\n }\r\n return globalRendererManager\r\n}\r\n\r\n/**\r\n * 包装 SFC 组件为渲染器\r\n */\r\nexport function wrapSFCComponent(comp: Component): Renderer {\r\n return defineComponent({\r\n props: ['row', 'col', 'onCellChange', 'onCellBlur', 'onCellEnter', 'onClick'],\r\n setup(props) {\r\n return () => h(comp, props)\r\n }\r\n })\r\n}\r\n\r\n/**\r\n * 创建函数式渲染器\r\n */\r\nexport function createFunctionalRenderer(\r\n render: (props: {\r\n row: any\r\n col: any\r\n onCellChange?: (row: any, col: any) => void\r\n onCellBlur?: (row: any, col: any) => void\r\n onCellEnter?: (row: any, col: any) => void\r\n onClick?: (row: any, col: any) => void\r\n }) => any\r\n): Renderer {\r\n return defineComponent({\r\n props: ['row', 'col', 'onCellChange', 'onCellBlur', 'onCellEnter', 'onClick'],\r\n setup(props) {\r\n return () => render(props)\r\n }\r\n })\r\n}\r\n\r\n/**\r\n * 验证渲染器配置\r\n * 在开发环境下验证 renderProps 的正确性\r\n */\r\nexport function validateRendererProps(\r\n rendererName: string,\r\n renderProps: Record<string, any> | undefined\r\n): void {\r\n if (process.env.NODE_ENV !== 'production' && renderProps) {\r\n switch (rendererName) {\r\n case 'dict':\r\n if (!renderProps.options || !Array.isArray(renderProps.options)) {\r\n console.warn(\r\n `[SmartTable] 'dict' renderer requires 'options' array, received:`,\r\n renderProps.options\r\n )\r\n }\r\n break\r\n\r\n case 'select':\r\n if (!renderProps.options || !Array.isArray(renderProps.options)) {\r\n console.warn(\r\n `[SmartTable] 'select' renderer requires 'options' array, received:`,\r\n renderProps.options\r\n )\r\n } else if (renderProps.options.length === 0) {\r\n console.warn(`[SmartTable] 'select' renderer 'options' array is empty`)\r\n }\r\n break\r\n\r\n case 'map':\r\n if (!renderProps.options || typeof renderProps.options !== 'object') {\r\n console.warn(\r\n `[SmartTable] 'map' renderer requires 'options' object, received:`,\r\n renderProps.options\r\n )\r\n }\r\n break\r\n\r\n case 'link':\r\n if (!renderProps.href || typeof renderProps.href !== 'string') {\r\n console.warn(\r\n `[SmartTable] 'link' renderer requires 'href' string, received:`,\r\n renderProps.href\r\n )\r\n }\r\n break\r\n\r\n case 'input-number':\r\n if (renderProps.min !== undefined && renderProps.max !== undefined) {\r\n if (renderProps.min > renderProps.max) {\r\n console.warn(\r\n `[SmartTable] 'input-number' renderer: min (${renderProps.min}) should not be greater than max (${renderProps.max})`\r\n )\r\n }\r\n }\r\n break\r\n }\r\n }\r\n}\r\n","/**\r\n * 安全获取对象深层属性\r\n * 支持 a.b.c / a.0.b\r\n */\r\nexport function getValueByPath(obj: any, path?: string) {\r\n if (!obj || !path) return undefined\r\n return path.split('.').reduce((acc, key) => acc?.[key], obj)\r\n }\r\n \r\n /**\r\n * 安全设置对象深层属性(用于可编辑表格)\r\n */\r\n export function setValueByPath(\r\n obj: any,\r\n path: string,\r\n value: any\r\n ) {\r\n if (!obj || !path) return\r\n const keys = path.split('.')\r\n const lastKey = keys.pop()!\r\n \r\n const target = keys.reduce((acc, key) => {\r\n if (!acc[key]) acc[key] = {}\r\n return acc[key]\r\n }, obj)\r\n \r\n target[lastKey] = value\r\n }\r\n ","<template>\n <el-input\n v-model=\"value\"\n v-bind=\"{ placeholder: '', size: 'small', clearable: true, ...col.renderProps }\"\n @blur=\"onBlur\"\n @keyup.enter=\"onEnter\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport type { ColumnConfig } from '../types'\nimport { getValueByPath, setValueByPath } from '../utils/path'\n\ninterface Props {\n readonly row: any\n readonly col: ColumnConfig\n onCellBlur?: (row: any, col: ColumnConfig) => void\n onCellEnter?: (row: any, col: ColumnConfig) => void\n}\n\nconst props = defineProps<Props>()\nconst value = ref(getValueByPath(props.row, props.col.key))\n\nwatch(value, (v) => {\n setValueByPath(props.row, props.col.key, v)\n})\n\nconst onBlur = () => props.onCellBlur?.(props.row, props.col)\nconst onEnter = () => props.onCellEnter?.(props.row, props.col)\n</script>\n","<template>\n <el-input-number\n v-model=\"value\"\n v-bind=\"{ min: 0, max: 99999, controls: false, size: 'small', ...col.renderProps }\"\n @blur=\"onBlur\"\n @keyup.enter=\"onEnter\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport type { ColumnConfig } from '../types'\nimport { getValueByPath, setValueByPath } from '../utils/path'\n\ninterface Props {\n readonly row: any\n readonly col: ColumnConfig\n onCellChange?: (row: any, col: ColumnConfig) => void\n onCellBlur?: (row: any, col: ColumnConfig) => void\n onCellEnter?: (row: any, col: ColumnConfig) => void\n}\n\nconst props = defineProps<Props>()\nconst value = ref(getValueByPath(props.row, props.col.key))\n\nwatch(value, (v) => {\n setValueByPath(props.row, props.col.key, v)\n props.onCellChange?.(props.row, props.col)\n})\n\nconst onBlur = () => props.onCellBlur?.(props.row, props.col)\nconst onEnter = () => props.onCellEnter?.(props.row, props.col)\n</script>\n","<template>\n <el-select\n v-model=\"value\"\n v-bind=\"{ placeholder: '请选择', size: 'small', clearable: true, ...col.renderProps }\"\n @change=\"onChange\"\n @blur=\"onBlur\"\n @keyup.enter=\"onEnter\"\n >\n <el-option\n v-for=\"opt in col.renderProps?.options || []\"\n :key=\"opt.value\"\n :label=\"opt.label\"\n :value=\"opt.value\"\n />\n </el-select>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport type { ColumnConfig } from '../types'\nimport { getValueByPath, setValueByPath } from '../utils/path'\n\ninterface Props {\n readonly row: any\n readonly col: ColumnConfig\n onCellChange?: (row: any, col: ColumnConfig) => void\n onCellBlur?: (row: any, col: ColumnConfig) => void\n onCellEnter?: (row: any, col: ColumnConfig) => void\n}\n\nconst props = defineProps<Props>()\nconst value = ref(getValueByPath(props.row, props.col.key))\n\nwatch(value, (v) => {\n setValueByPath(props.row, props.col.key, v)\n})\n\nconst onChange = () => props.onCellChange?.(props.row, props.col)\nconst onBlur = () => props.onCellBlur?.(props.row, props.col)\nconst onEnter = () => props.onCellEnter?.(props.row, props.col)\n</script>\n","/**\r\n * 内置渲染器集合\r\n * 可以按需引入或批量注册\r\n */\r\nimport { h } from 'vue'\r\nimport { ElButton, ElTag, ElImage, ElMessage } from 'element-plus'\r\nimport { DocumentCopy, CopyDocument } from '@element-plus/icons-vue'\r\nimport type { ColumnConfig } from '../types'\r\nimport { getValueByPath } from '../utils/path'\r\nimport { wrapSFCComponent, createFunctionalRenderer } from '../renderer'\r\nimport EditableInput from './input.vue'\r\nimport EditableNumber from './inputNumber.vue'\r\nimport EditableSelect from './select.vue'\r\n\r\n/**\r\n * 包装 SFC 组件\r\n */\r\nconst input = wrapSFCComponent(EditableInput)\r\nconst inputNumber = wrapSFCComponent(EditableNumber)\r\nconst select = wrapSFCComponent(EditableSelect)\r\n\r\n/**\r\n * button 渲染器\r\n */\r\nconst button = createFunctionalRenderer((props) => {\r\n const rp = props.col.renderProps || {}\r\n const val = getValueByPath(props.row, props.col.key)\r\n return h(ElButton as any, {\r\n type: rp.type || 'primary',\r\n ...rp,\r\n onClick: () => props.onClick?.(props.row, props.col)\r\n }, () => rp.label || val)\r\n})\r\n\r\n/**\r\n * link 渲染器\r\n */\r\nconst link = createFunctionalRenderer((props) => {\r\n const rp = props.col.renderProps || {}\r\n const val = getValueByPath(props.row, props.col.key)\r\n return h('a', {\r\n href: rp.href || '#',\r\n target: rp.blank ? '_blank' : '_self',\r\n style: rp.style || 'color:#409EFF;cursor:pointer;',\r\n }, rp.label || val)\r\n})\r\n\r\n/**\r\n * html 渲染器\r\n */\r\nconst html = createFunctionalRenderer((props) => {\r\n const val = getValueByPath(props.row, props.col.key)\r\n return h('div', {\r\n class: 'line-clamp-2',\r\n innerHTML: val ?? '',\r\n ...(props.col?.renderProps || {})\r\n })\r\n})\r\n\r\n/**\r\n * copy 渲染器\r\n */\r\nconst copy = createFunctionalRenderer((props) => {\r\n const val = getValueByPath(props.row, props.col.key) ?? ''\r\n const rp = props.col.renderProps ?? {}\r\n const butStyle = {\r\n 'position': 'absolute',\r\n 'right': '-5px',\r\n 'top': '50%',\r\n 'transform': 'translateY(-50%)',\r\n 'cursor': 'pointer',\r\n 'display': 'none',\r\n 'font-size': '12px',\r\n 'color': rp.iconColor || '#409EFF',\r\n 'user-select': 'none'\r\n }\r\n const testStyle = {\r\n 'padding-right': '10px',\r\n 'display': '-webkit-box',\r\n '-webkit-box-orient': 'vertical',\r\n '-webkit-line-clamp': rp.lineClamp ?? 2,\r\n 'overflow': 'hidden',\r\n ...rp.textStyles\r\n }\r\n return h('div', {\r\n class: 'st_copy_wrapper',\r\n style: 'width: 100%; position: relative; display: inline-block;'\r\n },\r\n [\r\n h('span', {\r\n class: `st_copy_text ${rp.textClass ?? ''}`,\r\n style: testStyle,\r\n title: val\r\n }, val),\r\n val && h('span', {\r\n class: 'st_copy_btn',\r\n style: butStyle,\r\n title: rp.copyTitle || '复制',\r\n onClick: () => {\r\n if (!val) return\r\n try {\r\n if (navigator.clipboard && navigator.clipboard.writeText) {\r\n navigator.clipboard.writeText(val).then(() => {\r\n ElMessage.success(rp.successText ?? '复制成功')\r\n }).catch(() => {\r\n ElMessage.error(rp.errorText ?? '复制失败')\r\n })\r\n } else {\r\n const textarea = document.createElement('textarea')\r\n textarea.value = val\r\n textarea.style.position = 'fixed'\r\n textarea.style.opacity = '0'\r\n document.body.appendChild(textarea)\r\n textarea.select()\r\n const successful = document.execCommand('copy')\r\n document.body.removeChild(textarea)\r\n\r\n if (successful) {\r\n ElMessage.success(rp.successText ?? '复制成功')\r\n } else {\r\n ElMessage.error(rp.errorText ?? '复制失败')\r\n }\r\n }\r\n } catch (err) {\r\n ElMessage.error(rp.errorText ?? '复制失败')\r\n }\r\n }\r\n }, [h(DocumentCopy, {\r\n style: 'width: 1em; height: 1em;'\r\n })])\r\n ].filter(Boolean)\r\n )\r\n})\r\n\r\n/**\r\n * img 渲染器\r\n */\r\nconst img = createFunctionalRenderer((props) => {\r\n const val = getValueByPath(props.row, props.col.key) ?? ''\r\n const rp = props.col?.renderProps || {}\r\n\r\n const getImageList = () => {\r\n if (!val) return []\r\n if (Array.isArray(val)) {\r\n return val.filter(item => item && typeof item === 'string')\r\n }\r\n return [val]\r\n }\r\n\r\n const imageList = getImageList()\r\n\r\n if (imageList.length === 0) {\r\n return rp.placeholder || ''\r\n }\r\n\r\n const defaultStyle = {\r\n width: rp.width || '80px',\r\n height: rp.height || '80px',\r\n marginRight: imageList.length > 1 ? '4px' : '0',\r\n ...(rp.style || {})\r\n }\r\n\r\n if (imageList.length === 1) {\r\n return h(ElImage, {\r\n src: imageList[0],\r\n previewSrcList: rp.previewSrcList || imageList,\r\n previewTeleported: true, \r\n fit: rp.fit || 'contain',\r\n style: defaultStyle,\r\n ...rp\r\n })\r\n }\r\n\r\n return h('div',\r\n {\r\n class: 'st_img_wrapper',\r\n style: 'display: flex; align-items: center; position: relative'\r\n },\r\n [\r\n h(ElImage, {\r\n src: imageList[0],\r\n previewSrcList: rp.previewSrcList || imageList,\r\n previewTeleported: true, \r\n fit: rp.fit || 'contain',\r\n style: defaultStyle,\r\n ...rp\r\n }),\r\n imageList.length > 1 && h('span', {\r\n class: 'st_img_total',\r\n style: `position: absolute; top: 0; right: 0; `,\r\n title: `${imageList.length}`\r\n }, [h(CopyDocument, { style: `width: 1em; height: 1em; ` })])\r\n ]\r\n )\r\n})\r\n\r\n/**\r\n * dict 渲染器\r\n */\r\nconst dict = createFunctionalRenderer((props) => {\r\n const val = getValueByPath(props.row, props.col.key) ?? ''\r\n const rp = props.col.renderProps || {}\r\n const options = rp.options ?? []\r\n const showValue = rp.showValue ?? false\r\n\r\n if (val === null || val === undefined || val === '') return ''\r\n\r\n const values = Array.isArray(val) ? val.map(String) : [String(val)]\r\n const matchedOptions = options.filter((opt: any) => values.includes(String(opt.value)))\r\n const unmatched = values.filter(v => !options.some((opt: any) => String(opt.value) === v))\r\n\r\n const children = matchedOptions.map((item: any, _index: number) => {\r\n return h(\r\n ElTag,\r\n { key: item.value, type: item.listClass, class: item.cssClass, disableTransitions: true },\r\n { default: () => item.label + ' ' }\r\n )\r\n })\r\n\r\n if (showValue && unmatched.length > 0) {\r\n children.push(h('span', {}, unmatched.join(' ')))\r\n }\r\n\r\n return h('div', {}, children)\r\n})\r\n\r\n/**\r\n * map 渲染器\r\n */\r\nconst map = createFunctionalRenderer((props) => {\r\n const val = getValueByPath(props.row, props.col.key) ?? ''\r\n const options = (props.col.renderProps?.options ?? {}) as Record<string, any>\r\n return val != null ? options[val] ?? '' : ''\r\n})\r\n\r\n/**\r\n * formatter 渲染器\r\n */\r\nexport function isDataColumn(\r\n col: ColumnConfig\r\n): col is any {\r\n return typeof (col as any).formatter === 'function'\r\n}\r\n\r\nconst formatter = createFunctionalRenderer((props) => {\r\n const { col, row } = props\r\n const val = getValueByPath(props.row, props.col.key) ?? ''\r\n if (isDataColumn(col)) {\r\n return col.formatter?.(val, row)\r\n }\r\n return val ?? ''\r\n})\r\n\r\n/**\r\n * icon 渲染器\r\n */\r\nconst icon = createFunctionalRenderer((props) => {\r\n const val = getValueByPath(props.row, props.col.key) ?? ''\r\n const rp = props.col.renderProps || {}\r\n if (!val) return ''\r\n // 判断网络图片\r\n if (/^https?:\\/\\//.test(val)) {\r\n return h(ElImage, {\r\n src: val,\r\n previewSrcList: [val],\r\n previewTeleported: true, \r\n fit: 'contain',\r\n style: 'width:40px;height:40px',\r\n ...rp\r\n })\r\n }\r\n // 判断 svg 源码\r\n if (/^\\s*<svg[\\s\\S]*<\\/svg>\\s*$/.test(val)) {\r\n return h('div', {\r\n innerHTML: val,\r\n style: `width:40px;height:40px;display:inline-block;${rp.style || ''}`,\r\n ...rp\r\n })\r\n }\r\n // 默认当作 iconfont\r\n return h('i', {\r\n class: val,\r\n style: `font-size:20px;${rp.style || ''}`,\r\n ...rp\r\n })\r\n})\r\n\r\n/**\r\n * 所有内置渲染器\r\n */\r\nexport const builtInRenderers = {\r\n input,\r\n 'input-number': inputNumber,\r\n select,\r\n button,\r\n link,\r\n html,\r\n copy,\r\n img,\r\n dict,\r\n map,\r\n formatter,\r\n icon,\r\n}\r\n\r\n/**\r\n * 安装所有内置渲染器\r\n */\r\nexport function registerBuiltInRenderers(registry: { registerMultiple: (renderers: Record<string, any>) => void }) {\r\n registry.registerMultiple(builtInRenderers)\r\n}\r\n\r\n/**\r\n * 创建默认渲染器集合(兼容旧 API)\r\n * @deprecated 建议使用插件化架构\r\n */\r\nexport function createRenderer() {\r\n return builtInRenderers\r\n}\r\n","<template>\r\n <el-table ref=\"tableRef\"\r\n v-bind=\"$attrs\"\r\n :data=\"data\"\r\n :row-key=\"rowKey\"\r\n class=\"smart_table\"\r\n v-loading=\"loading\">\r\n\r\n <!-- ========== selection 列 ========== -->\r\n <el-table-column\r\n v-for=\"col in selectionColumns\"\r\n key=\"selection\"\r\n type=\"selection\"\r\n v-bind=\"col.columnProps\"\r\n />\r\n\r\n <!-- ========== index 列 ========== -->\r\n <el-table-column\r\n v-for=\"col in indexColumns\"\r\n key=\"index\"\r\n type=\"index\"\r\n :label=\"col.label || '#'\"\r\n align=\"center\"\r\n v-bind=\"col.columnProps\"\r\n >\r\n <template #default=\"{ $index }\">\r\n {{ computeIndex($index) }}\r\n </template>\r\n </el-table-column>\r\n\r\n <!-- ========== operation 列 ========== -->\r\n <el-table-column\r\n v-for=\"col in getOperationColumns()\"\r\n :key=\"col.key\"\r\n :label=\"col.label || '操作'\"\r\n align=\"center\"\r\n v-bind=\"{\r\n ...col.columnProps,\r\n width: getOperationWidth(col)\r\n }\"\r\n >\r\n <template #default=\"{ row }\">\r\n <el-button\r\n v-for=\"btn in getVisibleButtons(col, row)\"\r\n :key=\"btn.label\"\r\n :type=\"btn.type || 'primary'\"\r\n link\r\n @click=\"btn.action(row)\"\r\n >\r\n {{ btn.label }}\r\n </el-button>\r\n </template>\r\n </el-table-column>\r\n\r\n <!-- ========== 普通数据列 ========== -->\r\n <el-table-column\r\n v-for=\"col in dataColumns\"\r\n :key=\"col.key\"\r\n :label=\"col.label\"\r\n align=\"center\"\r\n v-bind=\"col.columnProps || {}\"\r\n >\r\n <template #default=\"scope\">\r\n <!-- 父组件插槽优先 -->\r\n <template v-if=\"col.render === 'slot'\">\r\n <slot :name=\"col?.slot || col.key\" v-bind=\"scope\" />\r\n </template>\r\n\r\n <!-- renderer -->\r\n <component\r\n v-else-if=\"col.render && renderer[col.render]\"\r\n :is=\"renderer[col.render]\"\r\n :row=\"scope.row\"\r\n :col=\"col\"\r\n :onCellChange=\"handleCellChange\"\r\n :onCellBlur=\"handleCellBlur\"\r\n :onCellEnter=\"handleCellEnter\"\r\n :onClick=\"handleCellClick\"\r\n />\r\n <!-- 默认文本 -->\r\n <span v-else\r\n :style=\"col.renderProps?.style || ''\"\r\n :class=\"col.renderProps?.class || ''\"\r\n :title=\"getValueByPath(scope.row, col.key)\">\r\n {{ getValueByPath(scope.row, col.key) }}\r\n </span>\r\n </template>\r\n </el-table-column>\r\n\r\n <!-- 动态插槽 -->\r\n <template v-for=\"col in dataColumns\" #[col.key]=\"slotProps\">\r\n <slot :name=\"col.key\" v-bind=\"slotProps\" />\r\n </template>\r\n </el-table>\r\n</template>\r\n\r\n<script setup lang=\"ts\" name=\"SmartTable\">\r\n import { PropType, ref, watch, computed } from 'vue'\r\n import type { BaseColumn, ColumnConfig } from './types'\r\n import { useTableColumns } from \"./hooks/useTableColumns\"\r\n import { useOperationColumn } from './hooks/useOperationColumn'\r\n import { getRendererManager } from './renderer'\r\n import { registerBuiltInRenderers } from './renderers'\r\n import { getValueByPath } from './utils/path'\r\n\r\n const props = defineProps({\r\n data: { type: Array, default: () => [] },\r\n columns: { type: Array, default: () => [] },\r\n rowKey: { type: String, default: 'id' },\r\n loading: { type: Boolean, default: false },\r\n permissions: {\r\n type: Array as PropType<string[]>,\r\n default: () => []\r\n },\r\n cacheKey: String,\r\n pagination: { type: Object, default: () => ({}) },\r\n })\r\n\r\n const emit = defineEmits([\r\n 'update:columns',\r\n 'cellChange',\r\n 'cellBlur',\r\n 'cellEnter',\r\n 'cell-click',\r\n ])\r\n\r\n // ------------------ columns 处理 ------------------\r\n const { columns: cachedColumns } = useTableColumns(props.columns, {\r\n cacheKey: props.cacheKey ?? '',\r\n })\r\n watch(\r\n cachedColumns,\r\n (val: ColumnConfig[]) => emit(\"update:columns\", val),\r\n { deep: true, immediate: true },\r\n )\r\n\r\n // ------------------ 将行数据传递给 operation 列 ------------------\r\n watch(\r\n () => props.data,\r\n (newData) => {\r\n if (!newData) return\r\n\r\n // 为 operation 列注入 __rows,用于计算宽度\r\n cachedColumns.value.forEach((col: ColumnConfig) => {\r\n if (col.type === 'operation') {\r\n col.__rows = newData\r\n }\r\n })\r\n },\r\n { deep: true, immediate: true }\r\n )\r\n\r\n // ------------------ 列分类 ------------------\r\n const selectionColumns = computed(() =>\r\n cachedColumns.value.filter(col => col.type === 'selection')\r\n )\r\n\r\n const indexColumns = computed(() =>\r\n cachedColumns.value.filter(col => col.type === 'index')\r\n )\r\n\r\n const operationColumns = computed(() =>\r\n cachedColumns.value.filter(col => col.type === 'operation')\r\n )\r\n\r\n const dataColumns = computed(() =>\r\n cachedColumns.value.filter(col => {\r\n if (col.type === 'selection' || col.type === 'index') return false\r\n if (col.type === 'operation') return false\r\n if (col.visible === false) return false\r\n return true\r\n })\r\n )\r\n\r\n // ------------------ index 列序号计算 ------------------\r\n const computeIndex = (index: number) => {\r\n const page = props.pagination?.page\r\n const size = props.pagination?.size\r\n return page && size ? (page - 1) * size + index + 1 : index + 1\r\n }\r\n\r\n // ------------------ renderer 注册 ------------------\r\n registerBuiltInRenderers(getRendererManager())\r\n\r\n const renderer = computed(() => {\r\n const manager = getRendererManager()\r\n const allRenderers: Record<string, any> = {}\r\n\r\n manager.names().forEach((name: string) => {\r\n const r = manager.get(name)\r\n if (r) allRenderers[name] = r\r\n })\r\n\r\n return allRenderers\r\n })\r\n\r\n // ------------------ operation 列逻辑 ------------------\r\n // 为每个 operation 列创建 useOperationColumn 实例\r\n const operationColumnMap = computed(() => {\r\n const map = new Map<string, ReturnType<typeof useOperationColumn>>()\r\n\r\n operationColumns.value.forEach(col => {\r\n const hook = useOperationColumn(\r\n col.buttons || [],\r\n col.maxbtn ?? 10,\r\n props.permissions || []\r\n )\r\n map.set(col.key, hook)\r\n })\r\n\r\n return map\r\n })\r\n\r\n const getOperationColumnHook = (col: ColumnConfig) => {\r\n return operationColumnMap.value.get(col.key)\r\n }\r\n\r\n const getOperationWidth = (col: ColumnConfig) => {\r\n const hook = getOperationColumnHook(col)\r\n if (!hook) return 0\r\n\r\n // 无行数据,用静态宽度\r\n if (!col.__rows) return hook.optWidth.value\r\n // 有行数据,取最大宽度\r\n return hook.getMaxOptWidth(col.__rows)\r\n }\r\n\r\n const getVisibleButtons = (col: ColumnConfig, row: any) => {\r\n const hook = getOperationColumnHook(col)\r\n if (!hook) return []\r\n\r\n // 检查 operation 列是否应该显示\r\n const buttons = col.buttons || []\r\n if (!buttons.length) return []\r\n\r\n const rows = col.__rows || []\r\n if (!rows.length) {\r\n // 无行数据,基于权限判断\r\n return hook.getVisibleButtons(row)\r\n }\r\n\r\n // 有行数据,基于权限 + visible 判断\r\n return hook.getVisibleButtons(row)\r\n }\r\n\r\n const getOperationColumns = () => {\r\n return operationColumns.value.filter(col => {\r\n const hook = getOperationColumnHook(col)\r\n if (!hook) return false\r\n\r\n const buttons = col.buttons || []\r\n if (!buttons.length) return false\r\n\r\n const rows = col.__rows || []\r\n if (!rows.length) return hook.hasAnyButton.value\r\n\r\n return hook.hasAnyVisibleButton(col.__rows || [])\r\n })\r\n }\r\n\r\n // ----------------事件封装 ------------------\r\n const handleCellChange = (row: any, key: string) => {\r\n emit('cellChange', row, key)\r\n }\r\n const handleCellBlur = (row: any, key: string) => {\r\n emit('cellBlur', row, key)\r\n }\r\n const handleCellEnter = (row: any, key: string) => {\r\n emit('cellEnter', row, key)\r\n }\r\n const handleCellClick = (row: any, col: any) => {\r\n if(!col) return\r\n emit('cell-click', row, col)\r\n }\r\n\r\n // el-table\r\n const tableRef = ref();\r\n defineExpose({\r\n tableRef,\r\n });\r\n\r\n</script>\r\n\r\n<style>\r\n .smart_table {\r\n width: 100%;\r\n }\r\n \r\n .st_copy_wrapper:hover .st_copy_btn {\r\n display: inline-block !important;\r\n }\r\n\r\n .st_copy_btn:hover {\r\n transform: translateY(-50%) scale(1.1);\r\n }\r\n</style>\r\n","/**\r\n * 全局配置管理\r\n */\r\nimport type { SmartTableConfig } from './types'\r\nimport { getRendererManager } from './renderer'\r\n\r\n/**\r\n * 默认配置\r\n */\r\nconst defaultConfig: SmartTableConfig = {\r\n defaultPagination: {\r\n page: 1,\r\n size: 10,\r\n total: 0\r\n },\r\n defaultTableProps: {},\r\n defaultColumnProps: {}\r\n}\r\n\r\n/**\r\n * 全局配置类\r\n */\r\nclass ConfigManager {\r\n private config: SmartTableConfig = { ...defaultConfig }\r\n\r\n /**\r\n * 获取所有配置\r\n */\r\n getConfig(): SmartTableConfig {\r\n return { ...this.config }\r\n }\r\n\r\n /**\r\n * 设置配置\r\n */\r\n setConfig(config: Partial<SmartTableConfig>): void {\r\n this.config = this.mergeConfig(this.config, config)\r\n\r\n // 如果有自定义渲染器,自动注册\r\n if (config.renderers) {\r\n const manager = getRendererManager()\r\n manager.registerMultiple(config.renderers)\r\n }\r\n }\r\n\r\n /**\r\n * 获取特定配置项\r\n */\r\n get<K extends keyof SmartTableConfig>(key: K): SmartTableConfig[K] {\r\n return this.config[key]\r\n }\r\n\r\n /**\r\n * 重置为默认配置\r\n */\r\n reset(): void {\r\n this.config = { ...defaultConfig }\r\n }\r\n\r\n /**\r\n * 深度合并配置\r\n */\r\n private mergeConfig(target: any, source: any): any {\r\n const result = { ...target }\r\n\r\n for (const key in source) {\r\n if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {\r\n result[key] = this.mergeConfig(target[key] || {}, source[key])\r\n } else {\r\n result[key] = source[key]\r\n }\r\n }\r\n\r\n return result\r\n }\r\n}\r\n\r\n/**\r\n * 全局配置管理器单例\r\n */\r\nlet globalConfigManager: ConfigManager | null = null\r\n\r\n/**\r\n * 获取全局配置管理器\r\n */\r\nexport function getConfigManager(): ConfigManager {\r\n if (!globalConfigManager) {\r\n globalConfigManager = new ConfigManager()\r\n }\r\n return globalConfigManager\r\n}\r\n\r\n/**\r\n * 安装插件(用于 Vue.use())\r\n */\r\nexport interface SmartTablePlugin {\r\n install: (options?: SmartTableConfig) => void\r\n}\r\n\r\n/**\r\n * 创建插件实例\r\n */\r\nexport function createSmartTablePlugin(defaultOptions?: SmartTableConfig): SmartTablePlugin {\r\n return {\r\n install(options?: SmartTableConfig) {\r\n const manager = getConfigManager()\r\n const config = { ...defaultOptions, ...options }\r\n if (config) {\r\n manager.setConfig(config)\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 全局配置快捷方法\r\n */\r\nexport function setSmartTableConfig(config: Partial<SmartTableConfig>): void {\r\n getConfigManager().setConfig(config)\r\n}\r\n\r\nexport function getSmartTableConfig(): SmartTableConfig {\r\n return getConfigManager().getConfig()\r\n}\r\n","/**\r\n * 增强类型系统 - 提供更好的类型推断\r\n */\r\nimport type { ColumnConfig, RendererName } from '../components/SmartTable/types'\r\n\r\n/**\r\n * 提取行数据的类型\r\n */\r\nexport type ExtractRowType<T> = T extends ColumnConfig<infer R> ? R : never\r\n\r\n/**\r\n * 根据列配置提取表格数据类型\r\n */\r\nexport type TableDataFromColumns<T extends ColumnConfig[]> = T extends (infer C)[]\r\n ? C extends ColumnConfig<infer R>\r\n ? R\r\n : any\r\n : any\r\n\r\n/**\r\n * 渲染器 Props 类型推断\r\n */\r\nexport type InferRendererProps<T extends RendererName> =\r\n T extends 'html'\r\n ? { style?: string; class?: string; [key: string]: any }\r\n : T extends 'copy'\r\n ? { successText?: string; errorText?: string; iconColor?: string; [key: string]: any }\r\n : T extends 'img'\r\n ? { width?: string | number; height?: string | number; fit?: string; previewSrcList?: string[]; [key: string]: any }\r\n : T extends 'dict'\r\n ? { options: Array<{ label: string; value: string | number; listClass?: string; cssClass?: string }>; showValue?: boolean }\r\n : T extends 'map'\r\n ? { options: Record<string | number, any> }\r\n : T extends 'input'\r\n ? { placeholder?: string; size?: 'small' | 'default' | 'large'; clearable?: boolean }\r\n : T extends 'select'\r\n ? { options: Array<{ label: string; value: string | number }>; placeholder?: string; clearable?: boolean }\r\n : { [key: string]: any }\r\n\r\n/**\r\n * 快捷创建列的辅助函数(类型安全简化版)\r\n */\r\nexport function defineColumn(\r\n key: string,\r\n config?: Partial<Omit<ColumnConfig, 'key'>>\r\n): ColumnConfig {\r\n return {\r\n key,\r\n ...config\r\n } as ColumnConfig\r\n}\r\n"],"names":["mergeColumns","defaultColumns","cacheColumns","cacheMap","c","col","cacheCol","useTableColumns","options","cacheKey","storage","cache","columns","ref","watch","newVal","lightColumns","newColumns","useOperationColumn","buttonConfigs","maxbtn","userPermissions","all_permission","hasPermi","value","permArray","p","hasAnyButton","computed","btn","optWidth","sum","isButtonVisible","row","optRowWidth","rows","max","RendererManager","__publicField","name","renderer","renderers","globalRendererManager","getRendererManager","wrapSFCComponent","comp","defineComponent","props","h","createFunctionalRenderer","render","validateRendererProps","rendererName","renderProps","getValueByPath","obj","path","acc","key","setValueByPath","keys","lastKey","target","__props","v","onBlur","_a","onEnter","_openBlock","_createBlock","_component_el_input","_mergeProps","$event","_component_el_input_number","onChange","_component_el_select","_createElementBlock","_Fragment","opt","_component_el_option","input","EditableInput","inputNumber","EditableNumber","select","EditableSelect","button","rp","val","ElButton","link","html","copy","butStyle","testStyle","ElMessage","textarea","successful","DocumentCopy","img","imageList","item","defaultStyle","ElImage","CopyDocument","dict","showValue","values","matchedOptions","unmatched","children","_index","ElTag","map","isDataColumn","formatter","icon","builtInRenderers","registerBuiltInRenderers","registry","createRenderer","emit","__emit","cachedColumns","newData","selectionColumns","indexColumns","operationColumns","dataColumns","computeIndex","index","page","size","_b","manager","allRenderers","r","operationColumnMap","hook","getOperationColumnHook","getOperationWidth","getVisibleButtons","getOperationColumns","handleCellChange","handleCellBlur","handleCellEnter","handleCellClick","tableRef","__expose","_withDirectives","_component_el_table","$attrs","_renderList","_component_el_table_column","_withCtx","$index","_createTextVNode","_toDisplayString","_component_el_button","scope","_renderSlot","_ctx","_resolveDynamicComponent","_normalizeStyle","_normalizeClass","_unref","_hoisted_1","slotProps","defaultConfig","ConfigManager","config","source","result","globalConfigManager","getConfigManager","setSmartTableConfig","getSmartTableConfig","defineColumn"],"mappings":";;;;;;AAWA,SAASA,GACPC,GACAC,GACA;AACA,MAAI,EAACA,KAAA,QAAAA,EAAc,QAAQ,QAAOD;AAGlC,QAAME,IAAW,IAAI;AAAA,IACnBD,EAAa,IAAI,CAAAE,MAAK,CAACA,EAAE,KAAKA,CAAC,CAAC;AAAA,EAAA;AAGlC,SAAOH,EAAe,IAAI,CAAAI,MAAO;AAC/B,UAAMC,IAAWH,EAAS,IAAIE,EAAI,GAAG;AAGrC,WAAKC,IAEE;AAAA,MACL,GAAGD;AAAA,MACH,SACE,OAAOC,EAAS,WAAY,YACxBA,EAAS,UACTD,EAAI;AAAA,IAAA,IAPUA;AAAA,EASxB,CAAC;AACH;AAaO,SAASE,GACdN,GACAO,GAMA;AAGA,QAAM,EAAE,UAAAC,GAAU,SAAAC,IAAU,aAAA,IAAiBF,KAAW,CAAA,GAOlDG,IAAQF,IAAWC,EAAQ,QAAQD,CAAQ,IAAI,MAM/CG,IAAUC;AAAA,IACdb;AAAA,MACEC;AAAA,MACAU,IAAQ,KAAK,MAAMA,CAAK,IAAI,CAAA;AAAA,IAAC;AAAA,EAC/B;AAMF,SAAAG;AAAA,IACEF;AAAA,IACA,CAACG,MAAgB;AACf,UAAI,CAACN,EAAU;AAMf,YAAMO,IAAeD,EAAO,IAAI,CAACV,OAAc;AAAA,QAC7C,KAAKA,EAAI;AAAA,QACT,SAASA,EAAI;AAAA,QACb,YAAYA,EAAI;AAAA,MAAA,EAChB;AAEF,MAAAK,EAAQ;AAAA,QACND;AAAA,QACA,KAAK,UAAUO,CAAY;AAAA,MAAA;AAAA,IAE/B;AAAA,IACA,EAAE,MAAM,GAAA;AAAA,EAAK,GAMR;AAAA;AAAA,IAEL,SAAAJ;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,WAAWK,GAAmB;AAC5B,MAAAL,EAAQ,QAAQZ;AAAA,QACdC;AAAA,QACAgB;AAAA,MAAA,GAGER,KACFC,EAAQ;AAAA,QACND;AAAA,QACA,KAAK,UAAUQ,CAAU;AAAA,MAAA;AAAA,IAG/B;AAAA;AAAA;AAAA;AAAA,IAKA,eAAe;AACb,MAAAL,EAAQ,QAAQX,GAEZQ,KACFC,EAAQ,WAAWD,CAAQ;AAAA,IAE/B;AAAA,EAAA;AAEJ;AC/HO,SAASS,GACdC,GACAC,IAAS,IACTC,IAA4B,CAAA,GAC5B;AAKA,QAAMC,IAAiB,SAajBC,IAAW,CAACC,MAA8B;AAC9C,QAAI,CAACA,EAAO,QAAO;AAEnB,UAAMC,IAAY,MAAM,QAAQD,CAAK,IAAIA,IAAQ,CAACA,CAAK;AACvD,WAAOH,EAAgB;AAAA,MACrB,CAAAK,MAAKA,MAAMJ,KAAkBG,EAAU,SAASC,CAAC;AAAA,IAAA;AAAA,EAErD,GAWMC,IAAeC,EAAS,MACrBT,EAAc,KAAK,CAAAU,MAAON,EAASM,EAAI,UAAU,CAAC,CAC1D,GASKC,IAAWF,EAAS,MACFT,EACnB,OAAO,CAAAU,MAAON,EAASM,EAAI,UAAU,CAAC,EACtC,MAAM,GAAGT,CAAM,EAEG;AAAA,IACnB,CAACW,GAAKF,MAAQE,KAAOF,EAAI,SAAS;AAAA,IAClC;AAAA,EAAA,CAEH,GASKG,IAAkB,CAACH,GAAmBI,MAExCV,EAASM,EAAI,UAAU,MACtBA,EAAI,UAAUA,EAAI,QAAQI,CAAG,IAAI,KAOhCC,IAAc,CAACD,MACCd,EACjB,OAAO,CAAAU,MAAOG,EAAgBH,GAAKI,CAAG,CAAC,EACvC,MAAM,GAAGb,CAAM,EAEC;AAAA,IACjB,CAACW,GAAKF,MAAQE,KAAOF,EAAI,SAAS;AAAA,IAClC;AAAA,EAAA;AA+BJ,SAAO;AAAA,IACL,cAAAF;AAAA,IACA,UAAAG;AAAA,IACA,qBAhB0B,CAACK,MACtBA,KAAA,QAAAA,EAAM,SACJA,EAAK;AAAA,MAAK,OACfhB,EAAc,KAAK,OAAOa,EAAgBH,GAAKI,CAAG,CAAC;AAAA,IAAA,IAF3B;AAAA,IAgB1B,gBA5BqB,CAACE,MACjBA,KAAA,QAAAA,EAAM,SACJA,EAAK;AAAA,MACV,CAACC,GAAKH,MAAQ,KAAK,IAAIG,GAAKF,EAAYD,CAAG,CAAC;AAAA,MAC5C;AAAA,IAAA,IAHwBH,EAAS;AAAA,IA4BnC,mBAXwB,CAACG,MAClBd,EACJ,OAAO,CAAAU,MAAOG,EAAgBH,GAAKI,CAAG,CAAC,EACvC,MAAM,GAAGb,CAAM;AAAA,EAQlB;AAEJ;ACpHA,MAAMiB,GAA4C;AAAA,EAAlD;AACU,IAAAC,EAAA,uCAAuC,IAAA;AAAA;AAAA,EAE/C,SAASC,GAAcC,GAA0B;AAC/C,IAAI,KAAK,UAAU,IAAID,CAAI,KAErB,QAAQ,IAAI,aAAa,iBAC3B,QAAQ,MAAM,0BAA0BA,CAAI,iCAAiC,GAGjF,KAAK,UAAU,IAAIA,GAAMC,CAAQ;AAAA,EACnC;AAAA,EAEA,iBAAiBC,GAA2C;AAC1D,WAAO,QAAQA,CAAS,EAAE,QAAQ,CAAC,CAACF,GAAMC,CAAQ,MAAM;AACtD,MAAK,KAAK,UAAU,IAAID,CAAI,KAC1B,KAAK,UAAU,IAAIA,GAAMC,CAAQ;AAAA,IAErC,CAAC;AAAA,EACH;AAAA,EAEA,IAAID,GAAoC;AACtC,WAAO,KAAK,UAAU,IAAIA,CAAI;AAAA,EAChC;AAAA,EAEA,IAAIA,GAAuB;AACzB,WAAO,KAAK,UAAU,IAAIA,CAAI;AAAA,EAChC;AAAA,EAEA,WAAWA,GAAuB;AAChC,WAAO,KAAK,UAAU,OAAOA,CAAI;AAAA,EACnC;AAAA,EAEA,QAAc;AACZ,SAAK,UAAU,MAAA;AAAA,EACjB;AAAA,EAEA,QAAkB;AAChB,WAAO,MAAM,KAAK,KAAK,UAAU,MAAM;AAAA,EACzC;AACF;AAKA,IAAIG,IAAgD;AAK7C,SAASC,IAAsC;AACpD,SAAKD,MACHA,IAAwB,IAAIL,GAAA,IAEvBK;AACT;AAKO,SAASE,EAAiBC,GAA2B;AAC1D,SAAOC,EAAgB;AAAA,IACrB,OAAO,CAAC,OAAO,OAAO,gBAAgB,cAAc,eAAe,SAAS;AAAA,IAC5E,MAAMC,GAAO;AACX,aAAO,MAAMC,EAAEH,GAAME,CAAK;AAAA,IAC5B;AAAA,EAAA,CACD;AACH;AAKO,SAASE,EACdC,GAQU;AACV,SAAOJ,EAAgB;AAAA,IACrB,OAAO,CAAC,OAAO,OAAO,gBAAgB,cAAc,eAAe,SAAS;AAAA,IAC5E,MAAMC,GAAO;AACX,aAAO,MAAMG,EAAOH,CAAK;AAAA,IAC3B;AAAA,EAAA,CACD;AACH;AAMO,SAASI,GACdC,GACAC,GACM;AACN,MAAI,QAAQ,IAAI,aAAa,gBAAgBA;AAC3C,YAAQD,GAAA;AAAA,MACN,KAAK;AACH,SAAI,CAACC,EAAY,WAAW,CAAC,MAAM,QAAQA,EAAY,OAAO,MAC5D,QAAQ;AAAA,UACN;AAAA,UACAA,EAAY;AAAA,QAAA;AAGhB;AAAA,MAEF,KAAK;AACH,QAAI,CAACA,EAAY,WAAW,CAAC,MAAM,QAAQA,EAAY,OAAO,IAC5D,QAAQ;AAAA,UACN;AAAA,UACAA,EAAY;AAAA,QAAA,IAELA,EAAY,QAAQ,WAAW,KACxC,QAAQ,KAAK,yDAAyD;AAExE;AAAA,MAEF,KAAK;AACH,SAAI,CAACA,EAAY,WAAW,OAAOA,EAAY,WAAY,aACzD,QAAQ;AAAA,UACN;AAAA,UACAA,EAAY;AAAA,QAAA;AAGhB;AAAA,MAEF,KAAK;AACH,SAAI,CAACA,EAAY,QAAQ,OAAOA,EAAY,QAAS,aACnD,QAAQ;AAAA,UACN;AAAA,UACAA,EAAY;AAAA,QAAA;AAGhB;AAAA,MAEF,KAAK;AACH,QAAIA,EAAY,QAAQ,UAAaA,EAAY,QAAQ,UACnDA,EAAY,MAAMA,EAAY,OAChC,QAAQ;AAAA,UACN,8CAA8CA,EAAY,GAAG,qCAAqCA,EAAY,GAAG;AAAA,QAAA;AAIvH;AAAA,IAAA;AAGR;ACxKO,SAASC,EAAeC,GAAUC,GAAe;AACpD,MAAI,GAACD,KAAO,CAACC;AACb,WAAOA,EAAK,MAAM,GAAG,EAAE,OAAO,CAACC,GAAKC,MAAQD,KAAA,gBAAAA,EAAMC,IAAMH,CAAG;AAC7D;AAKO,SAASI,EACdJ,GACAC,GACAhC,GACA;AACA,MAAI,CAAC+B,KAAO,CAACC,EAAM;AACnB,QAAMI,IAAOJ,EAAK,MAAM,GAAG,GACrBK,IAAUD,EAAK,IAAA,GAEfE,IAASF,EAAK,OAAO,CAACH,GAAKC,OAC1BD,EAAIC,CAAG,MAAGD,EAAIC,CAAG,IAAI,CAAA,IACnBD,EAAIC,CAAG,IACbH,CAAG;AAEN,EAAAO,EAAOD,CAAO,IAAIrC;AACpB;;;;;;;;;;ACNF,UAAMuB,IAAQgB,GACRvC,IAAQX,EAAIyC,EAAeP,EAAM,KAAKA,EAAM,IAAI,GAAG,CAAC;AAE1D,IAAAjC,EAAMU,GAAO,CAACwC,MAAM;AAClB,MAAAL,EAAeZ,EAAM,KAAKA,EAAM,IAAI,KAAKiB,CAAC;AAAA,IAC5C,CAAC;AAED,UAAMC,IAAS,MAAA;;AAAM,cAAAC,IAAAnB,EAAM,eAAN,gBAAAmB,EAAA,KAAAnB,GAAmBA,EAAM,KAAKA,EAAM;AAAA,OACnDoB,IAAU,MAAA;;AAAM,cAAAD,IAAAnB,EAAM,gBAAN,gBAAAmB,EAAA,KAAAnB,GAAoBA,EAAM,KAAKA,EAAM;AAAA;;;AA5BzD,aAAAqB,EAAA,GAAAC,EAKEC,GALFC,EAKE;AAAA,oBAJS/C,EAAA;AAAA,sDAAAA,EAAK,QAAAgD;AAAA,MAAA,GACgD,EAAA,aAAA,IAAA,MAAA,SAAA,WAAA,IAAA,GAAAT,EAAA,IAAI,YAAA,GAAW;AAAA,QAC5E,QAAAE;AAAA,QACA,WAAaE,GAAO,CAAA,OAAA,CAAA;AAAA,MAAA;;;;;;;;;;;;;ACiBzB,UAAMpB,IAAQgB,GACRvC,IAAQX,EAAIyC,EAAeP,EAAM,KAAKA,EAAM,IAAI,GAAG,CAAC;AAE1D,IAAAjC,EAAMU,GAAO,CAACwC,MAAM;;AAClB,MAAAL,EAAeZ,EAAM,KAAKA,EAAM,IAAI,KAAKiB,CAAC,IAC1CE,IAAAnB,EAAM,iBAAN,QAAAmB,EAAA,KAAAnB,GAAqBA,EAAM,KAAKA,EAAM;AAAA,IACxC,CAAC;AAED,UAAMkB,IAAS,MAAA;;AAAM,cAAAC,IAAAnB,EAAM,eAAN,gBAAAmB,EAAA,KAAAnB,GAAmBA,EAAM,KAAKA,EAAM;AAAA,OACnDoB,IAAU,MAAA;;AAAM,cAAAD,IAAAnB,EAAM,gBAAN,gBAAAmB,EAAA,KAAAnB,GAAoBA,EAAM,KAAKA,EAAM;AAAA;;;AA9BzD,aAAAqB,EAAA,GAAAC,EAKEI,GALFF,EAKE;AAAA,oBAJS/C,EAAA;AAAA,sDAAAA,EAAK,QAAAgD;AAAA,MAAA,GACmD,EAAA,KAAA,GAAA,KAAA,OAAA,UAAA,IAAA,MAAA,SAAA,GAAAT,EAAA,IAAI,eAAW;AAAA,QAC/E,QAAAE;AAAA,QACA,WAAaE,GAAO,CAAA,OAAA,CAAA;AAAA,MAAA;;;;;;;;;;;;;ACyBzB,UAAMpB,IAAQgB,GACRvC,IAAQX,EAAIyC,EAAeP,EAAM,KAAKA,EAAM,IAAI,GAAG,CAAC;AAE1D,IAAAjC,EAAMU,GAAO,CAACwC,MAAM;AAClB,MAAAL,EAAeZ,EAAM,KAAKA,EAAM,IAAI,KAAKiB,CAAC;AAAA,IAC5C,CAAC;AAED,UAAMU,IAAW,MAAA;;AAAM,cAAAR,IAAAnB,EAAM,iBAAN,gBAAAmB,EAAA,KAAAnB,GAAqBA,EAAM,KAAKA,EAAM;AAAA,OACvDkB,IAAS,MAAA;;AAAM,cAAAC,IAAAnB,EAAM,eAAN,gBAAAmB,EAAA,KAAAnB,GAAmBA,EAAM,KAAKA,EAAM;AAAA,OACnDoB,IAAU,MAAA;;AAAM,cAAAD,IAAAnB,EAAM,gBAAN,gBAAAmB,EAAA,KAAAnB,GAAoBA,EAAM,KAAKA,EAAM;AAAA;;;AAtCzD,aAAAqB,EAAA,GAAAC,EAaYM,GAbZJ,EAaY;AAAA,oBAZD/C,EAAA;AAAA,sDAAAA,EAAK,QAAAgD;AAAA,MAAA,GACmD,EAAA,aAAA,OAAA,MAAA,SAAA,WAAA,IAAA,GAAAT,EAAA,IAAI,YAAA,GAAW;AAAA,QAC/E,UAAAW;AAAA,QACA,QAAAT;AAAA,QACA,WAAaE,GAAO,CAAA,OAAA,CAAA;AAAA,MAAA;mBAGnB,MAAA;;AAA6C;AAAA,aAD/CC,EAAA,EAAA,GAAAQ,EAKEC,aAJcX,IAAAH,EAAA,IAAI,gBAAJ,gBAAAG,EAAiB,iBAAxBY,YADTT,EAKEU,GAAA;AAAA,cAHC,KAAKD,EAAI;AAAA,cACT,OAAOA,EAAI;AAAA,cACX,OAAOA,EAAI;AAAA,YAAA;;;;;;;ICKZE,KAAQpC,EAAiBqC,EAAa,GACtCC,KAActC,EAAiBuC,EAAc,GAC7CC,KAASxC,EAAiByC,EAAc,GAKxCC,KAASrC,EAAyB,CAACF,MAAU;AACjD,QAAMwC,IAAKxC,EAAM,IAAI,eAAe,CAAA,GAC9ByC,IAAMlC,EAAeP,EAAM,KAAKA,EAAM,IAAI,GAAG;AACnD,SAAOC,EAAEyC,IAAiB;AAAA,IACxB,MAAMF,EAAG,QAAQ;AAAA,IACjB,GAAGA;AAAA,IACH,SAAS,MAAA;;AAAM,cAAArB,IAAAnB,EAAM,YAAN,gBAAAmB,EAAA,KAAAnB,GAAgBA,EAAM,KAAKA,EAAM;AAAA;AAAA,EAAG,GAClD,MAAMwC,EAAG,SAASC,CAAG;AAC1B,CAAC,GAKKE,KAAOzC,EAAyB,CAACF,MAAU;AAC/C,QAAMwC,IAAKxC,EAAM,IAAI,eAAe,CAAA,GAC9ByC,IAAMlC,EAAeP,EAAM,KAAKA,EAAM,IAAI,GAAG;AACnD,SAAOC,EAAE,KAAK;AAAA,IACZ,MAAMuC,EAAG,QAAQ;AAAA,IACjB,QAAQA,EAAG,QAAQ,WAAW;AAAA,IAC9B,OAAOA,EAAG,SAAS;AAAA,EAAA,GAClBA,EAAG,SAASC,CAAG;AACpB,CAAC,GAKKG,KAAO1C,EAAyB,CAACF,MAAU;;AAC/C,QAAMyC,IAAMlC,EAAeP,EAAM,KAAKA,EAAM,IAAI,GAAG;AACnD,SAAOC,EAAE,OAAO;AAAA,IACd,OAAO;AAAA,IACP,WAAWwC,KAAO;AAAA,IAClB,KAAItB,IAAAnB,EAAM,QAAN,gBAAAmB,EAAW,gBAAe,CAAA;AAAA,EAAC,CAChC;AACH,CAAC,GAKK0B,KAAO3C,EAAyB,CAACF,MAAU;AAC/C,QAAMyC,IAAMlC,EAAeP,EAAM,KAAKA,EAAM,IAAI,GAAG,KAAK,IAClDwC,IAAKxC,EAAM,IAAI,eAAe,CAAA,GAC9B8C,IAAW;AAAA,IACf,UAAY;AAAA,IACZ,OAAS;AAAA,IACT,KAAO;AAAA,IACP,WAAa;AAAA,IACb,QAAU;AAAA,IACV,SAAW;AAAA,IACX,aAAa;AAAA,IACb,OAASN,EAAG,aAAa;AAAA,IACzB,eAAe;AAAA,EAAA,GAEXO,IAAY;AAAA,IAChB,iBAAiB;AAAA,IACjB,SAAW;AAAA,IACX,sBAAsB;AAAA,IACtB,sBAAsBP,EAAG,aAAa;AAAA,IACtC,UAAY;AAAA,IACZ,GAAGA,EAAG;AAAA,EAAA;AAER,SAAOvC;AAAA,IAAE;AAAA,IAAO;AAAA,MACZ,OAAO;AAAA,MACP,OAAO;AAAA,IAAA;AAAA,IAET;AAAA,MACEA,EAAE,QAAQ;AAAA,QACR,OAAO,gBAAgBuC,EAAG,aAAa,EAAE;AAAA,QACzC,OAAOO;AAAA,QACP,OAAON;AAAA,MAAA,GACNA,CAAG;AAAA,MACNA,KAAOxC,EAAE,QAAQ;AAAA,QACf,OAAO;AAAA,QACP,OAAO6C;AAAA,QACP,OAAON,EAAG,aAAa;AAAA,QACvB,SAAS,MAAM;AACb,cAAKC;AACL,gBAAI;AACF,kBAAI,UAAU,aAAa,UAAU,UAAU;AAC7C,0BAAU,UAAU,UAAUA,CAAG,EAAE,KAAK,MAAM;AAC5C,kBAAAO,EAAU,QAAQR,EAAG,eAAe,MAAM;AAAA,gBAC5C,CAAC,EAAE,MAAM,MAAM;AACb,kBAAAQ,EAAU,MAAMR,EAAG,aAAa,MAAM;AAAA,gBACxC,CAAC;AAAA,mBACI;AACL,sBAAMS,IAAW,SAAS,cAAc,UAAU;AAClD,gBAAAA,EAAS,QAAQR,GACjBQ,EAAS,MAAM,WAAW,SAC1BA,EAAS,MAAM,UAAU,KACzB,SAAS,KAAK,YAAYA,CAAQ,GAClCA,EAAS,OAAA;AACT,sBAAMC,IAAa,SAAS,YAAY,MAAM;AAC9C,yBAAS,KAAK,YAAYD,CAAQ,GAE9BC,IACFF,EAAU,QAAQR,EAAG,eAAe,MAAM,IAE1CQ,EAAU,MAAMR,EAAG,aAAa,MAAM;AAAA,cAE1C;AAAA,YACF,QAAc;AACZ,cAAAQ,EAAU,MAAMR,EAAG,aAAa,MAAM;AAAA,YACxC;AAAA,QACF;AAAA,MAAA,GACC,CAACvC,EAAEkD,IAAc;AAAA,QAClB,OAAO;AAAA,MAAA,CACR,CAAC,CAAC;AAAA,IAAA,EACH,OAAO,OAAO;AAAA,EAAA;AAEpB,CAAC,GAKKC,KAAMlD,EAAyB,CAACF,MAAU;;AAC9C,QAAMyC,IAAMlC,EAAeP,EAAM,KAAKA,EAAM,IAAI,GAAG,KAAK,IAClDwC,MAAKrB,IAAAnB,EAAM,QAAN,gBAAAmB,EAAW,gBAAe,CAAA,GAU/BkC,IAPCZ,IACD,MAAM,QAAQA,CAAG,IACZA,EAAI,OAAO,CAAAa,MAAQA,KAAQ,OAAOA,KAAS,QAAQ,IAErD,CAACb,CAAG,IAJM,CAAA;AASnB,MAAIY,EAAU,WAAW;AACvB,WAAOb,EAAG,eAAe;AAG3B,QAAMe,IAAe;AAAA,IACnB,OAAOf,EAAG,SAAS;AAAA,IACnB,QAAQA,EAAG,UAAU;AAAA,IACrB,aAAaa,EAAU,SAAS,IAAI,QAAQ;AAAA,IAC5C,GAAIb,EAAG,SAAS,CAAA;AAAA,EAAC;AAGnB,SAAIa,EAAU,WAAW,IAChBpD,EAAEuD,GAAS;AAAA,IAChB,KAAKH,EAAU,CAAC;AAAA,IAChB,gBAAgBb,EAAG,kBAAkBa;AAAA,IACrC,mBAAmB;AAAA,IACnB,KAAKb,EAAG,OAAO;AAAA,IACf,OAAOe;AAAA,IACP,GAAGf;AAAA,EAAA,CACJ,IAGIvC;AAAA,IAAE;AAAA,IACP;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,IAAA;AAAA,IAET;AAAA,MACEA,EAAEuD,GAAS;AAAA,QACT,KAAKH,EAAU,CAAC;AAAA,QAChB,gBAAgBb,EAAG,kBAAkBa;AAAA,QACrC,mBAAmB;AAAA,QACnB,KAAKb,EAAG,OAAO;AAAA,QACf,OAAOe;AAAA,QACP,GAAGf;AAAA,MAAA,CACJ;AAAA,MACDa,EAAU,SAAS,KAAKpD,EAAE,QAAQ;AAAA,QAChC,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO,GAAGoD,EAAU,MAAM;AAAA,MAAA,GACzB,CAACpD,EAAEwD,IAAc,EAAE,OAAO,4BAAA,CAA6B,CAAC,CAAC;AAAA,IAAA;AAAA,EAC9D;AAEJ,CAAC,GAKKC,KAAOxD,EAAyB,CAACF,MAAU;AAC/C,QAAMyC,IAAMlC,EAAeP,EAAM,KAAKA,EAAM,IAAI,GAAG,KAAK,IAClDwC,IAAKxC,EAAM,IAAI,eAAe,CAAA,GAC9BvC,IAAU+E,EAAG,WAAW,CAAA,GACxBmB,IAAYnB,EAAG,aAAa;AAElC,MAAIC,KAAQ,QAA6BA,MAAQ,GAAI,QAAO;AAE5D,QAAMmB,IAAS,MAAM,QAAQnB,CAAG,IAAIA,EAAI,IAAI,MAAM,IAAI,CAAC,OAAOA,CAAG,CAAC,GAC5DoB,IAAiBpG,EAAQ,OAAO,CAACsE,MAAa6B,EAAO,SAAS,OAAO7B,EAAI,KAAK,CAAC,CAAC,GAChF+B,IAAYF,EAAO,OAAO,CAAA3C,MAAK,CAACxD,EAAQ,KAAK,CAACsE,MAAa,OAAOA,EAAI,KAAK,MAAMd,CAAC,CAAC,GAEnF8C,IAAWF,EAAe,IAAI,CAACP,GAAWU,MACvC/D;AAAA,IACLgE;AAAA,IACA,EAAE,KAAKX,EAAK,OAAO,MAAMA,EAAK,WAAW,OAAOA,EAAK,UAAU,oBAAoB,GAAA;AAAA,IACnF,EAAE,SAAS,MAAMA,EAAK,QAAQ,IAAA;AAAA,EAAI,CAErC;AAED,SAAIK,KAAaG,EAAU,SAAS,KAClCC,EAAS,KAAK9D,EAAE,QAAQ,CAAA,GAAI6D,EAAU,KAAK,GAAG,CAAC,CAAC,GAG3C7D,EAAE,OAAO,CAAA,GAAI8D,CAAQ;AAC9B,CAAC,GAKKG,KAAMhE,EAAyB,CAACF,MAAU;;AAC9C,QAAMyC,IAAMlC,EAAeP,EAAM,KAAKA,EAAM,IAAI,GAAG,KAAK,IAClDvC,MAAW0D,IAAAnB,EAAM,IAAI,gBAAV,gBAAAmB,EAAuB,YAAW,CAAA;AACnD,SAAOsB,KAAO,OAAOhF,EAAQgF,CAAG,KAAK,KAAK;AAC5C,CAAC;AAKM,SAAS0B,GACd7G,GACY;AACZ,SAAO,OAAQA,EAAY,aAAc;AAC3C;AAEA,MAAM8G,KAAYlE,EAAyB,CAACF,MAAU;;AACpD,QAAM,EAAE,KAAA1C,GAAK,KAAA4B,EAAA,IAAQc,GACfyC,IAAMlC,EAAeP,EAAM,KAAKA,EAAM,IAAI,GAAG,KAAK;AACxD,SAAImE,GAAa7G,CAAG,KACX6D,IAAA7D,EAAI,cAAJ,gBAAA6D,EAAA,KAAA7D,GAAgBmF,GAAKvD,KAEvBuD,KAAO;AAChB,CAAC,GAKK4B,KAAOnE,EAAyB,CAACF,MAAU;AAC/C,QAAMyC,IAAMlC,EAAeP,EAAM,KAAKA,EAAM,IAAI,GAAG,KAAK,IAClDwC,IAAKxC,EAAM,IAAI,eAAe,CAAA;AACpC,SAAKyC,IAED,eAAe,KAAKA,CAAG,IAClBxC,EAAEuD,GAAS;AAAA,IAChB,KAAKf;AAAA,IACL,gBAAgB,CAACA,CAAG;AAAA,IACpB,mBAAmB;AAAA,IACnB,KAAK;AAAA,IACL,OAAO;AAAA,IACP,GAAGD;AAAA,EAAA,CACJ,IAGC,6BAA6B,KAAKC,CAAG,IAChCxC,EAAE,OAAO;AAAA,IACd,WAAWwC;AAAA,IACX,OAAO,+CAA+CD,EAAG,SAAS,EAAE;AAAA,IACpE,GAAGA;AAAA,EAAA,CACJ,IAGIvC,EAAE,KAAK;AAAA,IACZ,OAAOwC;AAAA,IACP,OAAO,kBAAkBD,EAAG,SAAS,EAAE;AAAA,IACvC,GAAGA;AAAA,EAAA,CACJ,IAzBgB;AA0BnB,CAAC,GAKY8B,KAAmB;AAAA,EAC9B,OAAArC;AAAA,EACA,gBAAgBE;AAAA,EAChB,QAAAE;AAAA,EACA,QAAAE;AAAA,EACA,MAAAI;AAAA,EACA,MAAAC;AAAA,EACA,MAAAC;AAAA,EACA,KAAAO;AAAA,EACA,MAAAM;AAAA,EACA,KAAAQ;AAAA,EACA,WAAAE;AAAA,EACA,MAAAC;AACF;AAKO,SAASE,GAAyBC,GAA0E;AACjH,EAAAA,EAAS,iBAAiBF,EAAgB;AAC5C;AAMO,SAASG,KAAiB;AAC/B,SAAOH;AACT;;;;;;;;;;;;;;;;;;;;;;;ACrNE,UAAMtE,IAAQgB,GAaR0D,IAAOC,GASP,EAAE,SAASC,EAAA,IAAkBpH,GAAgBwC,EAAM,SAAS;AAAA,MAChE,UAAUA,EAAM,YAAY;AAAA,IAAA,CAC7B;AACD,IAAAjC;AAAA,MACE6G;AAAA,MACA,CAACnC,MAAwBiC,EAAK,kBAAkBjC,CAAG;AAAA,MACnD,EAAE,MAAM,IAAM,WAAW,GAAA;AAAA,IAAK,GAIhC1E;AAAA,MACE,MAAMiC,EAAM;AAAA,MACZ,CAAC6E,MAAY;AACX,QAAKA,KAGLD,EAAc,MAAM,QAAQ,CAACtH,MAAsB;AACjD,UAAIA,EAAI,SAAS,gBACfA,EAAI,SAASuH;AAAA,QAEjB,CAAC;AAAA,MACH;AAAA,MACA,EAAE,MAAM,IAAM,WAAW,GAAA;AAAA,IAAK;AAIhC,UAAMC,IAAmBjG;AAAA,MAAS,MAChC+F,EAAc,MAAM,OAAO,CAAAtH,MAAOA,EAAI,SAAS,WAAW;AAAA,IAAA,GAGtDyH,IAAelG;AAAA,MAAS,MAC5B+F,EAAc,MAAM,OAAO,CAAAtH,MAAOA,EAAI,SAAS,OAAO;AAAA,IAAA,GAGlD0H,IAAmBnG;AAAA,MAAS,MAChC+F,EAAc,MAAM,OAAO,CAAAtH,MAAOA,EAAI,SAAS,WAAW;AAAA,IAAA,GAGtD2H,IAAcpG;AAAA,MAAS,MAC3B+F,EAAc,MAAM,OAAO,CAAAtH,MACrB,EAAAA,EAAI,SAAS,eAAeA,EAAI,SAAS,WACzCA,EAAI,SAAS,eACbA,EAAI,YAAY,GAErB;AAAA,IAAA,GAIG4H,IAAe,CAACC,MAAkB;;AACtC,YAAMC,KAAOjE,IAAAnB,EAAM,eAAN,gBAAAmB,EAAkB,MACzBkE,KAAOC,IAAAtF,EAAM,eAAN,gBAAAsF,EAAkB;AAC/B,aAAOF,KAAQC,KAAQD,IAAO,KAAKC,IAAOF,IAAQ,IAAIA,IAAQ;AAAA,IAChE;AAGA,IAAAZ,GAAyB3E,GAAoB;AAE7C,UAAMH,IAAWZ,EAAS,MAAM;AAC9B,YAAM0G,IAAU3F,EAAA,GACV4F,IAAoC,CAAA;AAE1C,aAAAD,EAAQ,MAAA,EAAQ,QAAQ,CAAC/F,MAAiB;AACxC,cAAMiG,IAAIF,EAAQ,IAAI/F,CAAI;AAC1B,QAAIiG,MAAGD,EAAahG,CAAI,IAAIiG;AAAA,MAC9B,CAAC,GAEMD;AAAA,IACT,CAAC,GAIKE,IAAqB7G,EAAS,MAAM;AACxC,YAAMqF,wBAAU,IAAA;AAEhB,aAAAc,EAAiB,MAAM,QAAQ,CAAA1H,MAAO;AACpC,cAAMqI,IAAOxH;AAAA,UACXb,EAAI,WAAW,CAAA;AAAA,UACfA,EAAI,UAAU;AAAA,UACd0C,EAAM,eAAe,CAAA;AAAA,QAAC;AAExB,QAAAkE,EAAI,IAAI5G,EAAI,KAAKqI,CAAI;AAAA,MACvB,CAAC,GAEMzB;AAAA,IACT,CAAC,GAEK0B,IAAyB,CAACtI,MACvBoI,EAAmB,MAAM,IAAIpI,EAAI,GAAG,GAGvCuI,IAAoB,CAACvI,MAAsB;AAC/C,YAAMqI,IAAOC,EAAuBtI,CAAG;AACvC,aAAKqI,IAGArI,EAAI,SAEFqI,EAAK,eAAerI,EAAI,MAAM,IAFbqI,EAAK,SAAS,QAHpB;AAAA,IAMpB,GAEMG,IAAoB,CAACxI,GAAmB4B,MAAa;AACzD,YAAMyG,IAAOC,EAAuBtI,CAAG;AACvC,aAAKqI,KAGWrI,EAAI,WAAW,CAAA,GAClB,WAEAA,EAAI,UAAU,CAAA,GACjB,QAMHqI,EAAK,kBAAkBzG,CAAG,KATL,CAAA,IAJV,CAAA;AAAA,IAcpB,GAEM6G,IAAsB,MACnBf,EAAiB,MAAM,OAAO,CAAA1H,MAAO;AAC1C,YAAMqI,IAAOC,EAAuBtI,CAAG;AAIvC,aAHI,CAACqI,KAGD,EADYrI,EAAI,WAAW,CAAA,GAClB,SAAe,MAEfA,EAAI,UAAU,CAAA,GACjB,SAEHqI,EAAK,oBAAoBrI,EAAI,UAAU,CAAA,CAAE,IAFvBqI,EAAK,aAAa;AAAA,IAG7C,CAAC,GAIGK,KAAmB,CAAC9G,GAAUyB,MAAgB;AAClD,MAAA+D,EAAK,cAAcxF,GAAKyB,CAAG;AAAA,IAC7B,GACMsF,KAAiB,CAAC/G,GAAUyB,MAAgB;AAChD,MAAA+D,EAAK,YAAYxF,GAAKyB,CAAG;AAAA,IAC3B,GACMuF,KAAkB,CAAChH,GAAUyB,MAAgB;AACjD,MAAA+D,EAAK,aAAaxF,GAAKyB,CAAG;AAAA,IAC5B,GACMwF,KAAkB,CAACjH,GAAU5B,MAAa;AAC9C,MAAIA,KACJoH,EAAK,cAAcxF,GAAK5B,CAAG;AAAA,IAC7B,GAGM8I,IAAWtI,EAAA;AACjB,WAAAuI,EAAa;AAAA,MACX,UAAAD;AAAA,IAAA,CACD;;AAtRD,aAAAE,IAAAjF,EAAA,GAAAC,EA4FWiF,GA5FX/E,EA4FW;AAAA,iBA5FG;AAAA,QAAJ,KAAI4E;AAAA,MAAA,GACJI,EAAAA,QAAM;AAAA,QACb,MAAMxF,EAAA;AAAA,QACN,WAASA,EAAA;AAAA,QACV,OAAM;AAAA,MAAA;mBAKJ,MAA+B;AAAA,kBADjCa,EAKEC,GAAA,MAAA2E,EAJc3B,EAAA,OAAgB,CAAvBxH,OADT+D,EAAA,GAAAC,EAKEoF,GALFlF,EAKE;AAAA,YAHA,KAAI;AAAA,YACJ,MAAK;AAAA,UAAA,GACG,EAAA,SAAA,GAAA,GAAAlE,EAAI,WAAW,GAAA,MAAA,EAAA;kBAIzBuE,EAWkBC,GAAA,MAAA2E,EAVF1B,EAAA,OAAY,CAAnBzH,OADT+D,EAAA,GAAAC,EAWkBoF,GAXlBlF,EAWkB;AAAA,YAThB,KAAI;AAAA,YACJ,MAAK;AAAA,YACJ,OAAOlE,EAAI,SAAK;AAAA,YACjB,OAAM;AAAA,UAAA,GACE,EAAA,SAAA,MAAAA,EAAI,WAAW,GAAA;AAAA,YAEZ,SAAOqJ,EAChB,CAA0B,EADN,QAAAC,QAAM;AAAA,cACvBC,EAAAC,EAAA5B,EAAa0B,CAAM,CAAA,GAAA,CAAA;AAAA,YAAA;;;kBAK1B/E,EAqBkBC,GAAA,MAAA2E,EApBFV,KAAmB,CAA1BzI,OADT+D,EAAA,GAAAC,EAqBkBoF,GArBlBlF,EAqBkB;AAAA,YAnBf,KAAKlE,EAAI;AAAA,YACT,OAAOA,EAAI,SAAK;AAAA,YACjB,OAAM;AAAA,UAAA;YACgB,GAAAA,EAAI;AAAA,YAA6B,OAAAuI,EAAkBvI,CAAG;AAAA,UAAA;YAKjE,SAAOqJ,EAEd,CAA0C,EAFxB,KAAAzH,QAAG;AAAA,eACvBmC,EAAA,EAAA,GAAAQ,EAQYC,WAPIgE,EAAkBxI,GAAK4B,CAAG,IAAjCJ,YADTwC,EAQYyF,GAAA;AAAA,gBANT,KAAKjI,EAAI;AAAA,gBACT,MAAMA,EAAI,QAAI;AAAA,gBACf,MAAA;AAAA,gBACC,SAAK,CAAA2C,MAAE3C,EAAI,OAAOI,CAAG;AAAA,cAAA;2BAEtB,MAAe;AAAA,kBAAZ2H,EAAAC,EAAAhI,EAAI,KAAK,GAAA,CAAA;AAAA,gBAAA;;;;;;kBAMlB+C,EAgCkBC,GAAA,MAAA2E,EA/BFxB,EAAA,OAAW,CAAlB3H,OADT+D,EAAA,GAAAC,EAgCkBoF,GAhClBlF,EAgCkB;AAAA,YA9Bf,KAAKlE,EAAI;AAAA,YACT,OAAOA,EAAI;AAAA,YACZ,OAAM;AAAA,UAAA,GACE,EAAA,SAAA,GAAA,GAAAA,EAAI,eAAW,CAAA,CAAA,GAAA;AAAA,YAEZ,SAAOqJ,EAEhB,CAEWK,MAAA;;AAJY;AAAA,gBAEP1J,EAAI,WAAM,SACxB2J,EAAoDC,EAAA,SAAvC5J,KAAA,gBAAAA,EAAK,SAAQA,EAAI,KAA9BkE,EAAoD;AAAA;;mBAATwF,CAAK,CAAA,IAKrC1J,EAAI,UAAUmC,QAASnC,EAAI,MAAM,KAD9C+D,EAAA,GAAAC,EASE6F,GAPK1H,EAAA,MAASnC,EAAI,MAAM,CAAA,GAAA;AAAA;kBACvB,KAAK0J,EAAM;AAAA,kBACX,KAAA1J;AAAA,kBACA,cAAc0I;AAAA,kBACd,YAAYC;AAAA,kBACZ,aAAaC;AAAA,kBACb,SAASC;AAAA,gBAAA,sCAGZtE,EAKO,QAAA;AAAA;kBAJJ,OAAKuF,KAAEjG,IAAA7D,EAAI,gBAAJ,gBAAA6D,EAAiB,UAAK,EAAA;AAAA,kBAC7B,OAAKkG,KAAE/B,IAAAhI,EAAI,gBAAJ,gBAAAgI,EAAiB,UAAK,EAAA;AAAA,kBAC7B,OAAOgC,MAAeN,EAAM,KAAK1J,EAAI,GAAG;AAAA,gBAAA,GACtCwJ,EAAAQ,GAAA/G,CAAA,EAAeyG,EAAM,KAAK1J,EAAI,GAAG,CAAA,GAAA,IAAAiK,EAAA;AAAA,cAAA;AAAA;;;;;;QAMlBd,EAAAxB,EAAA,QAAP3H;UAAqB,MAAAA,EAAI;AAAA,UACxC,IAAAqJ,EAAA,CAD+Ca,MAAS;AAAA,YACxDP,EAA2CC,EAAA,QAA9B5J,EAAI,WAAakK,CAAS,CAAA,CAAA;AAAA,UAAA;;;aArF9BxG,EAAA,OAAO;AAAA,MAAA;;;ICGhByG,KAAkC;AAAA,EACtC,mBAAmB;AAAA,IACjB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAAA,EAET,mBAAmB,CAAA;AAAA,EACnB,oBAAoB,CAAA;AACtB;AAKA,MAAMC,GAAc;AAAA,EAApB;AACU,IAAAnI,EAAA,gBAA2B,EAAE,GAAGkI,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKxC,YAA8B;AAC5B,WAAO,EAAE,GAAG,KAAK,OAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAUE,GAAyC;AACjD,SAAK,SAAS,KAAK,YAAY,KAAK,QAAQA,CAAM,GAG9CA,EAAO,aACO/H,EAAA,EACR,iBAAiB+H,EAAO,SAAS;AAAA,EAE7C;AAAA;AAAA;AAAA;AAAA,EAKA,IAAsChH,GAA6B;AACjE,WAAO,KAAK,OAAOA,CAAG;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,SAAS,EAAE,GAAG8G,GAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY1G,GAAa6G,GAAkB;AACjD,UAAMC,IAAS,EAAE,GAAG9G,EAAA;AAEpB,eAAWJ,KAAOiH;AAChB,MAAIA,EAAOjH,CAAG,KAAK,OAAOiH,EAAOjH,CAAG,KAAM,YAAY,CAAC,MAAM,QAAQiH,EAAOjH,CAAG,CAAC,IAC9EkH,EAAOlH,CAAG,IAAI,KAAK,YAAYI,EAAOJ,CAAG,KAAK,CAAA,GAAIiH,EAAOjH,CAAG,CAAC,IAE7DkH,EAAOlH,CAAG,IAAIiH,EAAOjH,CAAG;AAI5B,WAAOkH;AAAA,EACT;AACF;AAKA,IAAIC,IAA4C;AAKzC,SAASC,KAAkC;AAChD,SAAKD,MACHA,IAAsB,IAAIJ,GAAA,IAErBI;AACT;AA2BO,SAASE,GAAoBL,GAAyC;AAC3E,EAAAI,GAAA,EAAmB,UAAUJ,CAAM;AACrC;AAEO,SAASM,KAAwC;AACtD,SAAOF,GAAA,EAAmB,UAAA;AAC5B;ACjFO,SAASG,GACdvH,GACAgH,GACc;AACd,SAAO;AAAA,IACL,KAAAhH;AAAA,IACA,GAAGgH;AAAA,EAAA;AAEP;"}
1
+ {"version":3,"file":"vue3-smart-table.es.js","sources":["../src/components/SmartTable/hooks/useTableColumns.ts","../src/components/SmartTable/hooks/useOperationColumn.ts","../src/components/SmartTable/renderer.ts","../src/components/SmartTable/utils/path.ts","../src/components/SmartTable/renderers/input.vue","../src/components/SmartTable/renderers/inputNumber.vue","../src/components/SmartTable/renderers/select.vue","../src/components/SmartTable/renderers/index.ts","../src/components/SmartTable/index.vue","../src/components/SmartTable/config.ts","../src/types/enhanced.ts"],"sourcesContent":["import { ref, watch } from 'vue'\r\n\r\n\r\n/**\r\n * 合并默认列配置和缓存配置\r\n *\r\n * 设计原则:\r\n * 1️⃣ 列顺序:以 defaultColumns 为准\r\n * 2️⃣ 列增减:以 defaultColumns 为准\r\n * 3️⃣ 缓存只覆盖用户可配置字段(如 visible)\r\n */\r\nfunction mergeColumns(\r\n defaultColumns: any[],\r\n cacheColumns: Array<{ key: string; visible?: boolean }>\r\n) {\r\n if (!cacheColumns?.length) return defaultColumns\r\n\r\n // 建立 key => cache 映射表,提升查找效率\r\n const cacheMap = new Map(\r\n cacheColumns.map(c => [c.key, c])\r\n )\r\n\r\n return defaultColumns.map(col => {\r\n const cacheCol = cacheMap.get(col.key)\r\n\r\n // 只允许缓存覆盖「可配置字段」\r\n if (!cacheCol) return col\r\n\r\n return {\r\n ...col,\r\n visible:\r\n typeof cacheCol.visible === 'boolean'\r\n ? cacheCol.visible\r\n : col.visible\r\n }\r\n })\r\n}\r\n\r\n\r\n/**\r\n * useTableColumns\r\n *\r\n * 表格列管理 Hook\r\n *\r\n * 职责:\r\n * - 管理表格列顺序\r\n * - 管理列显示 / 隐藏\r\n * - 持久化用户配置\r\n */\r\nexport function useTableColumns(\r\n defaultColumns: any[],\r\n options?: {\r\n /** 缓存唯一标识 */\r\n cacheKey?: string\r\n /** 存储介质,默认 localStorage */\r\n storage?: Storage\r\n }\r\n) {\r\n\r\n /** 解构参数并设置默认值 */\r\n const { cacheKey, storage = localStorage } = options || {}\r\n\r\n /**\r\n * 如果没有 cacheKey,则不启用缓存\r\n * (例如公共页面、未登录页面)\r\n * 从缓存中读取列配置\r\n */\r\n const cache = cacheKey ? storage.getItem(cacheKey) : null\r\n\r\n /**\r\n * 响应式列配置\r\n * 初始化时合并默认列和缓存列\r\n */\r\n const columns = ref(\r\n mergeColumns(\r\n defaultColumns,\r\n cache ? JSON.parse(cache) : []\r\n )\r\n )\r\n\r\n /**\r\n * 监听列变化,自动写入缓存\r\n */\r\n watch(\r\n columns,\r\n (newVal: any) => {\r\n if (!cacheKey) return\r\n\r\n /**\r\n * ⚠️ 只保存“轻量配置”\r\n * 避免把 render / action / 函数序列化进 localStorage\r\n */\r\n const lightColumns = newVal.map((col: any) => ({\r\n key: col.key,\r\n visible: col.visible,\r\n columnOpts: col.columnOpts\r\n }))\r\n\r\n storage.setItem(\r\n cacheKey,\r\n JSON.stringify(lightColumns)\r\n )\r\n },\r\n { deep: true }\r\n )\r\n\r\n /**\r\n * 对外暴露的 API\r\n */\r\n return {\r\n /** 当前列配置(响应式) */\r\n columns,\r\n\r\n /**\r\n * 主动设置列配置\r\n * 常用于:列设置弹窗 / 拖拽排序完成\r\n */\r\n setColumns(newColumns: any[]) {\r\n columns.value = mergeColumns(\r\n defaultColumns,\r\n newColumns\r\n )\r\n\r\n if (cacheKey) {\r\n storage.setItem(\r\n cacheKey,\r\n JSON.stringify(newColumns)\r\n )\r\n }\r\n },\r\n\r\n /**\r\n * 重置为默认列配置\r\n */\r\n resetColumns() {\r\n columns.value = defaultColumns\r\n\r\n if (cacheKey) {\r\n storage.removeItem(cacheKey)\r\n }\r\n }\r\n }\r\n}\r\n","import { computed } from 'vue'\r\n\r\nimport { ButtonConfig } from \"../types\"\r\n\r\n/**\r\n * useOperationColumn\r\n *\r\n * 操作列专用逻辑 Hook,负责:\r\n * 1. 根据权限判断操作列是否需要显示\r\n * 2. 计算操作列宽度(支持按钮自定义宽度)\r\n * 3. 支持行级 visible 配置\r\n * @param buttonConfigs 操作列按钮配置\r\n * @param maxbtn 操作列最多显示按钮数量(超过的不参与宽度计算)\r\n * @param userPermissions 当前用户权限列表\r\n */\r\nexport function useOperationColumn(\r\n buttonConfigs: ButtonConfig[],\r\n maxbtn = 10,\r\n userPermissions: string[] = []\r\n) {\r\n /** 默认按钮宽度 */\r\n const defaultWidth = 55\r\n\r\n /** 超级权限标识 */\r\n const all_permission = '*:*:*'\r\n\r\n /** --------------------------\r\n * 权限判断\r\n * -------------------------- */\r\n\r\n /**\r\n * 判断是否具备按钮权限\r\n *\r\n * 规则:\r\n * - permission 未配置 ⇒ 永远有权限\r\n * - permission 为 string | string[] ⇒ 与用户权限匹配\r\n */\r\n const hasPermi = (value?: string | string[]) => {\r\n if (!value) return true\r\n\r\n const permArray = Array.isArray(value) ? value : [value]\r\n return userPermissions.some(\r\n p => p === all_permission || permArray.includes(p)\r\n )\r\n }\r\n\r\n /** --------------------------\r\n * 仅基于权限(不考虑行级 visible)\r\n * 适用于:表格未加载数据时的判断\r\n * -------------------------- */\r\n\r\n /**\r\n * 是否至少存在一个有权限的按钮\r\n * 用于判断操作列是否需要渲染\r\n */\r\n const hasAnyButton = computed(() => {\r\n return buttonConfigs.some(btn => hasPermi(btn.permission))\r\n })\r\n\r\n /**\r\n * 操作列宽度(仅基于权限)\r\n * 用于无行数据时的兜底宽度计算\r\n *\r\n * 注意:这里不考虑 visible,因为没有 row 数据无法执行 visible 函数\r\n * 实际使用时会根据行数据重新计算\r\n */\r\n const optWidth = computed(() => {\r\n const permittedBtns = buttonConfigs\r\n .filter(btn => hasPermi(btn.permission))\r\n .slice(0, maxbtn)\r\n\r\n return permittedBtns.reduce(\r\n (sum, btn) => sum + (btn.width ?? defaultWidth),\r\n 0\r\n )\r\n })\r\n\r\n /** --------------------------\r\n * 权限 + 行级 visible\r\n * -------------------------- */\r\n\r\n /**\r\n * 判断某个按钮在某一行是否可见\r\n */\r\n const isButtonVisible = (btn: ButtonConfig, row: any) => {\r\n return (\r\n hasPermi(btn.permission) &&\r\n (btn.visible ? btn.visible(row) : true)\r\n )\r\n }\r\n\r\n /**\r\n * 单行操作列宽度\r\n */\r\n const optRowWidth = (row: any) => {\r\n const visibleBtns = buttonConfigs\r\n .filter(btn => isButtonVisible(btn, row))\r\n .slice(0, maxbtn)\r\n\r\n return visibleBtns.reduce(\r\n (sum, btn) => sum + (btn.width ?? defaultWidth),\r\n 0\r\n )\r\n }\r\n\r\n /**\r\n * 遍历所有行,获取最大操作列宽度\r\n */\r\n const getMaxOptWidth = (rows: any[]) => {\r\n if (!rows?.length) return optWidth.value\r\n return rows.reduce(\r\n (max, row) => Math.max(max, optRowWidth(row)),\r\n 0\r\n )\r\n }\r\n\r\n /**\r\n * 判断是否至少有一行存在可见按钮\r\n */\r\n const hasAnyVisibleButton = (rows: any[]) => {\r\n if (!rows?.length) return false\r\n return rows.some(row =>\r\n buttonConfigs.some(btn => isButtonVisible(btn, row))\r\n )\r\n }\r\n\r\n const getVisibleButtons = (row: any) => {\r\n return buttonConfigs\r\n .filter(btn => isButtonVisible(btn, row))\r\n .slice(0, maxbtn)\r\n }\r\n\r\n return {\r\n hasAnyButton,\r\n optWidth,\r\n hasAnyVisibleButton,\r\n getMaxOptWidth,\r\n getVisibleButtons\r\n }\r\n}\r\n","/**\r\n * SmartTable 内部渲染器管理系统\r\n * 移动到组件内部,保证组件的自包含性\r\n */\r\nimport { defineComponent, h, Component } from 'vue'\r\nimport type { Renderer } from './types'\r\n\r\n/**\r\n * 渲染器注册表接口\r\n */\r\nexport interface RendererRegistry {\r\n register(name: string, renderer: Renderer): void\r\n registerMultiple(renderers: Record<string, Renderer>): void\r\n get(name: string): Renderer | undefined\r\n has(name: string): boolean\r\n unregister(name: string): boolean\r\n clear(): void\r\n names(): string[]\r\n}\r\n\r\n/**\r\n * 渲染器管理器类\r\n */\r\nclass RendererManager implements RendererRegistry {\r\n private renderers: Map<string, Renderer> = new Map()\r\n\r\n register(name: string, renderer: Renderer): void {\r\n if (this.renderers.has(name)) {\r\n // 批量注册时不警告,只在单独注册时警告\r\n if (process.env.NODE_ENV === 'development') {\r\n console.debug(`[SmartTable] Renderer \"${name}\" already registered, skipping.`)\r\n }\r\n }\r\n this.renderers.set(name, renderer)\r\n }\r\n\r\n registerMultiple(renderers: Record<string, Renderer>): void {\r\n Object.entries(renderers).forEach(([name, renderer]) => {\r\n if (!this.renderers.has(name)) {\r\n this.renderers.set(name, renderer)\r\n }\r\n })\r\n }\r\n\r\n get(name: string): Renderer | undefined {\r\n return this.renderers.get(name)\r\n }\r\n\r\n has(name: string): boolean {\r\n return this.renderers.has(name)\r\n }\r\n\r\n unregister(name: string): boolean {\r\n return this.renderers.delete(name)\r\n }\r\n\r\n clear(): void {\r\n this.renderers.clear()\r\n }\r\n\r\n names(): string[] {\r\n return Array.from(this.renderers.keys())\r\n }\r\n}\r\n\r\n/**\r\n * 全局渲染器管理器单例\r\n */\r\nlet globalRendererManager: RendererManager | null = null\r\n\r\n/**\r\n * 获取渲染器管理器\r\n */\r\nexport function getRendererManager(): RendererManager {\r\n if (!globalRendererManager) {\r\n globalRendererManager = new RendererManager()\r\n }\r\n return globalRendererManager\r\n}\r\n\r\n/**\r\n * 包装 SFC 组件为渲染器\r\n */\r\nexport function wrapSFCComponent(comp: Component): Renderer {\r\n return defineComponent({\r\n props: ['row', 'col', 'index', 'onCellChange', 'onCellBlur', 'onCellEnter', 'onClick'],\r\n setup(props) {\r\n return () => h(comp, props)\r\n }\r\n })\r\n}\r\n\r\n/**\r\n * 创建函数式渲染器\r\n */\r\nexport function createFunctionalRenderer(\r\n render: (props: {\r\n row: any\r\n col: any\r\n index: number\r\n onCellChange?: (row: any, col: any) => void\r\n onCellBlur?: (row: any, col: any) => void\r\n onCellEnter?: (row: any, col: any) => void\r\n onClick?: (row: any, col: any) => void\r\n }) => any\r\n): Renderer {\r\n return defineComponent({\r\n props: ['row', 'col', 'index', 'onCellChange', 'onCellBlur', 'onCellEnter', 'onClick'],\r\n setup(props) {\r\n return () => render(props)\r\n }\r\n })\r\n}\r\n\r\n/**\r\n * 验证渲染器配置\r\n * 在开发环境下验证 renderProps 的正确性\r\n */\r\nexport function validateRendererProps(\r\n rendererName: string,\r\n renderProps: Record<string, any> | undefined\r\n): void {\r\n if (process.env.NODE_ENV !== 'production' && renderProps) {\r\n switch (rendererName) {\r\n case 'dict':\r\n if (!renderProps.options || !Array.isArray(renderProps.options)) {\r\n console.warn(\r\n `[SmartTable] 'dict' renderer requires 'options' array, received:`,\r\n renderProps.options\r\n )\r\n }\r\n break\r\n\r\n case 'select':\r\n if (!renderProps.options || !Array.isArray(renderProps.options)) {\r\n console.warn(\r\n `[SmartTable] 'select' renderer requires 'options' array, received:`,\r\n renderProps.options\r\n )\r\n } else if (renderProps.options.length === 0) {\r\n console.warn(`[SmartTable] 'select' renderer 'options' array is empty`)\r\n }\r\n break\r\n\r\n case 'map':\r\n if (!renderProps.options || typeof renderProps.options !== 'object') {\r\n console.warn(\r\n `[SmartTable] 'map' renderer requires 'options' object, received:`,\r\n renderProps.options\r\n )\r\n }\r\n break\r\n\r\n case 'link':\r\n if (!renderProps.href || typeof renderProps.href !== 'string') {\r\n console.warn(\r\n `[SmartTable] 'link' renderer requires 'href' string, received:`,\r\n renderProps.href\r\n )\r\n }\r\n break\r\n\r\n case 'input-number':\r\n if (renderProps.min !== undefined && renderProps.max !== undefined) {\r\n if (renderProps.min > renderProps.max) {\r\n console.warn(\r\n `[SmartTable] 'input-number' renderer: min (${renderProps.min}) should not be greater than max (${renderProps.max})`\r\n )\r\n }\r\n }\r\n break\r\n }\r\n }\r\n}\r\n","/**\r\n * 安全获取对象深层属性\r\n * 支持 a.b.c / a.0.b\r\n */\r\nexport function getValueByPath(obj: any, path?: string) {\r\n if (!obj || !path) return undefined\r\n return path.split('.').reduce((acc, key) => acc?.[key], obj)\r\n }\r\n \r\n /**\r\n * 安全设置对象深层属性(用于可编辑表格)\r\n */\r\n export function setValueByPath(\r\n obj: any,\r\n path: string,\r\n value: any\r\n ) {\r\n if (!obj || !path) return\r\n const keys = path.split('.')\r\n const lastKey = keys.pop()!\r\n \r\n const target = keys.reduce((acc, key) => {\r\n if (!acc[key]) acc[key] = {}\r\n return acc[key]\r\n }, obj)\r\n \r\n target[lastKey] = value\r\n }\r\n ","<template>\n <el-input\n v-model=\"value\"\n v-bind=\"{ placeholder: '', size: 'small', clearable: true, ...col.renderProps }\"\n @blur=\"onBlur\"\n @keyup.enter=\"onEnter\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport type { ColumnConfig } from '../types'\nimport { getValueByPath, setValueByPath } from '../utils/path'\n\ninterface Props {\n readonly row: any\n readonly col: ColumnConfig\n readonly index: number\n onCellBlur?: (row: any, col: ColumnConfig) => void\n onCellEnter?: (row: any, col: ColumnConfig) => void\n}\n\nconst props = defineProps<Props>()\nconst value = ref(getValueByPath(props.row, props.col.key))\n\nwatch(value, (v) => {\n setValueByPath(props.row, props.col.key, v)\n})\n\nconst onBlur = () => props.onCellBlur?.(props.row, props.col)\nconst onEnter = () => props.onCellEnter?.(props.row, props.col)\n</script>\n","<template>\n <el-input-number\n v-model=\"value\"\n v-bind=\"{ min: 0, max: 99999, controls: false, size: 'small', ...col.renderProps }\"\n @blur=\"onBlur\"\n @keyup.enter=\"onEnter\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport type { ColumnConfig } from '../types'\nimport { getValueByPath, setValueByPath } from '../utils/path'\n\ninterface Props {\n readonly row: any\n readonly col: ColumnConfig\n readonly index: number\n onCellChange?: (row: any, col: ColumnConfig) => void\n onCellBlur?: (row: any, col: ColumnConfig) => void\n onCellEnter?: (row: any, col: ColumnConfig) => void\n}\n\nconst props = defineProps<Props>()\nconst value = ref(getValueByPath(props.row, props.col.key))\n\nwatch(value, (v) => {\n setValueByPath(props.row, props.col.key, v)\n props.onCellChange?.(props.row, props.col)\n})\n\nconst onBlur = () => props.onCellBlur?.(props.row, props.col)\nconst onEnter = () => props.onCellEnter?.(props.row, props.col)\n</script>\n","<template>\n <el-select\n v-model=\"value\"\n v-bind=\"{ placeholder: '请选择', size: 'small', clearable: true, ...col.renderProps }\"\n @change=\"onChange\"\n @blur=\"onBlur\"\n @keyup.enter=\"onEnter\"\n >\n <el-option\n v-for=\"opt in col.renderProps?.options || []\"\n :key=\"opt.value\"\n :label=\"opt.label\"\n :value=\"opt.value\"\n />\n </el-select>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport type { ColumnConfig } from '../types'\nimport { getValueByPath, setValueByPath } from '../utils/path'\n\ninterface Props {\n readonly row: any\n readonly col: ColumnConfig\n readonly index: number\n onCellChange?: (row: any, col: ColumnConfig) => void\n onCellBlur?: (row: any, col: ColumnConfig) => void\n onCellEnter?: (row: any, col: ColumnConfig) => void\n}\n\nconst props = defineProps<Props>()\nconst value = ref(getValueByPath(props.row, props.col.key))\n\nwatch(value, (v) => {\n setValueByPath(props.row, props.col.key, v)\n})\n\nconst onChange = () => props.onCellChange?.(props.row, props.col)\nconst onBlur = () => props.onCellBlur?.(props.row, props.col)\nconst onEnter = () => props.onCellEnter?.(props.row, props.col)\n</script>\n","/**\r\n * 内置渲染器集合\r\n * 可以按需引入或批量注册\r\n */\r\nimport { h } from 'vue'\r\nimport { ElButton, ElTag, ElImage, ElMessage } from 'element-plus'\r\nimport { DocumentCopy, CopyDocument } from '@element-plus/icons-vue'\r\nimport type { ColumnConfig } from '../types'\r\nimport { getValueByPath } from '../utils/path'\r\nimport { wrapSFCComponent, createFunctionalRenderer } from '../renderer'\r\nimport EditableInput from './input.vue'\r\nimport EditableNumber from './inputNumber.vue'\r\nimport EditableSelect from './select.vue'\r\n\r\n/**\r\n * 包装 SFC 组件\r\n */\r\nconst input = wrapSFCComponent(EditableInput)\r\nconst inputNumber = wrapSFCComponent(EditableNumber)\r\nconst select = wrapSFCComponent(EditableSelect)\r\n\r\n/**\r\n * button 渲染器\r\n */\r\nconst button = createFunctionalRenderer((props) => {\r\n const rp = props.col.renderProps || {}\r\n const val = getValueByPath(props.row, props.col.key)\r\n return h(ElButton as any, {\r\n type: rp.type || 'primary',\r\n ...rp,\r\n onClick: () => props.onClick?.(props.row, props.col)\r\n }, () => rp.label || val)\r\n})\r\n\r\n/**\r\n * link 渲染器\r\n */\r\nconst link = createFunctionalRenderer((props) => {\r\n const rp = props.col.renderProps || {}\r\n const val = getValueByPath(props.row, props.col.key)\r\n return h('a', {\r\n href: rp.href || '#',\r\n target: rp.blank ? '_blank' : '_self',\r\n style: rp.style || 'color:#409EFF;cursor:pointer;',\r\n }, rp.label || val)\r\n})\r\n\r\n/**\r\n * html 渲染器\r\n */\r\nconst html = createFunctionalRenderer((props) => {\r\n const val = getValueByPath(props.row, props.col.key)\r\n return h('div', {\r\n class: 'line-clamp-2',\r\n innerHTML: val ?? '',\r\n ...(props.col?.renderProps || {})\r\n })\r\n})\r\n\r\n/**\r\n * copy 渲染器\r\n */\r\nconst copy = createFunctionalRenderer((props) => {\r\n const val = getValueByPath(props.row, props.col.key) ?? ''\r\n const rp = props.col.renderProps ?? {}\r\n const butStyle = {\r\n 'position': 'absolute',\r\n 'right': '-5px',\r\n 'top': '50%',\r\n 'transform': 'translateY(-50%)',\r\n 'cursor': 'pointer',\r\n 'display': 'none',\r\n 'font-size': '12px',\r\n 'color': rp.iconColor || '#409EFF',\r\n 'user-select': 'none'\r\n }\r\n const testStyle = {\r\n 'padding-right': '10px',\r\n 'display': '-webkit-box',\r\n '-webkit-box-orient': 'vertical',\r\n '-webkit-line-clamp': rp.lineClamp ?? 2,\r\n 'overflow': 'hidden',\r\n ...rp.textStyles\r\n }\r\n return h('div', {\r\n class: 'st_copy_wrapper',\r\n style: 'width: 100%; position: relative; display: inline-block;'\r\n },\r\n [\r\n h('span', {\r\n class: `st_copy_text ${rp.textClass ?? ''}`,\r\n style: testStyle,\r\n title: val\r\n }, val),\r\n val && h('span', {\r\n class: 'st_copy_btn',\r\n style: butStyle,\r\n title: rp.copyTitle || '复制',\r\n onClick: () => {\r\n if (!val) return\r\n try {\r\n if (navigator.clipboard && navigator.clipboard.writeText) {\r\n navigator.clipboard.writeText(val).then(() => {\r\n ElMessage.success(rp.successText ?? '复制成功')\r\n }).catch(() => {\r\n ElMessage.error(rp.errorText ?? '复制失败')\r\n })\r\n } else {\r\n const textarea = document.createElement('textarea')\r\n textarea.value = val\r\n textarea.style.position = 'fixed'\r\n textarea.style.opacity = '0'\r\n document.body.appendChild(textarea)\r\n textarea.select()\r\n const successful = document.execCommand('copy')\r\n document.body.removeChild(textarea)\r\n\r\n if (successful) {\r\n ElMessage.success(rp.successText ?? '复制成功')\r\n } else {\r\n ElMessage.error(rp.errorText ?? '复制失败')\r\n }\r\n }\r\n } catch (err) {\r\n ElMessage.error(rp.errorText ?? '复制失败')\r\n }\r\n }\r\n }, [h(DocumentCopy, {\r\n style: 'width: 1em; height: 1em;'\r\n })])\r\n ].filter(Boolean)\r\n )\r\n})\r\n\r\n/**\r\n * img 渲染器\r\n */\r\nconst img = createFunctionalRenderer((props) => {\r\n const val = getValueByPath(props.row, props.col.key) ?? ''\r\n const rp = props.col?.renderProps || {}\r\n\r\n const getImageList = () => {\r\n if (!val) return []\r\n if (Array.isArray(val)) {\r\n return val.filter(item => item && typeof item === 'string')\r\n }\r\n return [val]\r\n }\r\n\r\n const imageList = getImageList()\r\n\r\n if (imageList.length === 0) {\r\n return rp.placeholder || ''\r\n }\r\n\r\n const defaultStyle = {\r\n width: rp.width || '80px',\r\n height: rp.height || '80px',\r\n marginRight: imageList.length > 1 ? '4px' : '0',\r\n ...(rp.style || {})\r\n }\r\n\r\n if (imageList.length === 1) {\r\n return h(ElImage, {\r\n src: imageList[0],\r\n previewSrcList: rp.previewSrcList || imageList,\r\n previewTeleported: true, \r\n fit: rp.fit || 'contain',\r\n style: defaultStyle,\r\n ...rp\r\n })\r\n }\r\n\r\n return h('div',\r\n {\r\n class: 'st_img_wrapper',\r\n style: 'display: flex; align-items: center; position: relative'\r\n },\r\n [\r\n h(ElImage, {\r\n src: imageList[0],\r\n previewSrcList: rp.previewSrcList || imageList,\r\n previewTeleported: true, \r\n fit: rp.fit || 'contain',\r\n style: defaultStyle,\r\n ...rp\r\n }),\r\n imageList.length > 1 && h('span', {\r\n class: 'st_img_total',\r\n style: `position: absolute; top: 0; right: 0; `,\r\n title: `${imageList.length}`\r\n }, [h(CopyDocument, { style: `width: 1em; height: 1em; ` })])\r\n ]\r\n )\r\n})\r\n\r\n/**\r\n * dict 渲染器\r\n */\r\nconst dict = createFunctionalRenderer((props) => {\r\n const val = getValueByPath(props.row, props.col.key) ?? ''\r\n const rp = props.col.renderProps || {}\r\n const options = rp.options ?? []\r\n const showValue = rp.showValue ?? false\r\n\r\n if (val === null || val === undefined || val === '') return ''\r\n\r\n const values = Array.isArray(val) ? val.map(String) : [String(val)]\r\n const matchedOptions = options.filter((opt: any) => values.includes(String(opt.value)))\r\n const unmatched = values.filter(v => !options.some((opt: any) => String(opt.value) === v))\r\n\r\n const children = matchedOptions.map((item: any, _index: number) => {\r\n return h(\r\n ElTag,\r\n { key: item.value, type: item.listClass, class: item.cssClass, disableTransitions: true },\r\n { default: () => item.label + ' ' }\r\n )\r\n })\r\n\r\n if (showValue && unmatched.length > 0) {\r\n children.push(h('span', {}, unmatched.join(' ')))\r\n }\r\n\r\n return h('div', {}, children)\r\n})\r\n\r\n/**\r\n * map 渲染器\r\n */\r\nconst map = createFunctionalRenderer((props) => {\r\n const val = getValueByPath(props.row, props.col.key) ?? ''\r\n const options = (props.col.renderProps?.options ?? {}) as Record<string, any>\r\n return val != null ? options[val] ?? '' : ''\r\n})\r\n\r\n/**\r\n * formatter 渲染器\r\n */\r\nexport function isDataColumn(\r\n col: ColumnConfig\r\n): col is any {\r\n return typeof (col as any).formatter === 'function'\r\n}\r\n\r\nconst formatter = createFunctionalRenderer((props) => {\r\n const { col, row, index } = props\r\n const val = getValueByPath(props.row, props.col.key) ?? ''\r\n if (isDataColumn(col)) {\r\n // formatter 函数签名: (value, row, index) => string\r\n return col.formatter?.(val, row, index)\r\n }\r\n return val ?? ''\r\n})\r\n\r\n/**\r\n * icon 渲染器\r\n */\r\nconst icon = createFunctionalRenderer((props) => {\r\n const val = getValueByPath(props.row, props.col.key) ?? ''\r\n const rp = props.col.renderProps || {}\r\n if (!val) return ''\r\n // 判断网络图片\r\n if (/^https?:\\/\\//.test(val)) {\r\n return h(ElImage, {\r\n src: val,\r\n previewSrcList: [val],\r\n previewTeleported: true, \r\n fit: 'contain',\r\n style: 'width:40px;height:40px',\r\n ...rp\r\n })\r\n }\r\n // 判断 svg 源码\r\n if (/^\\s*<svg[\\s\\S]*<\\/svg>\\s*$/.test(val)) {\r\n return h('div', {\r\n innerHTML: val,\r\n style: `width:40px;height:40px;display:inline-block;${rp.style || ''}`,\r\n ...rp\r\n })\r\n }\r\n // 默认当作 iconfont\r\n return h('i', {\r\n class: val,\r\n style: `font-size:20px;${rp.style || ''}`,\r\n ...rp\r\n })\r\n})\r\n\r\n/**\r\n * 所有内置渲染器\r\n */\r\nexport const builtInRenderers = {\r\n input,\r\n 'input-number': inputNumber,\r\n select,\r\n button,\r\n link,\r\n html,\r\n copy,\r\n img,\r\n dict,\r\n map,\r\n formatter,\r\n icon,\r\n}\r\n\r\n/**\r\n * 安装所有内置渲染器\r\n */\r\nexport function registerBuiltInRenderers(registry: { registerMultiple: (renderers: Record<string, any>) => void }) {\r\n registry.registerMultiple(builtInRenderers)\r\n}\r\n\r\n/**\r\n * 创建默认渲染器集合(兼容旧 API)\r\n * @deprecated 建议使用插件化架构\r\n */\r\nexport function createRenderer() {\r\n return builtInRenderers\r\n}\r\n","<template>\r\n <el-table ref=\"tableRef\"\r\n v-bind=\"$attrs\"\r\n :data=\"data\"\r\n :row-key=\"rowKey\"\r\n class=\"smart_table\"\r\n v-loading=\"loading\">\r\n\r\n <!-- ========== selection 列 ========== -->\r\n <el-table-column\r\n v-for=\"col in selectionColumns\"\r\n key=\"selection\"\r\n type=\"selection\"\r\n v-bind=\"col.columnProps\"\r\n />\r\n\r\n <!-- ========== index 列 ========== -->\r\n <el-table-column\r\n v-for=\"col in indexColumns\"\r\n key=\"index\"\r\n type=\"index\"\r\n :label=\"col.label || '#'\"\r\n align=\"center\"\r\n v-bind=\"col.columnProps\"\r\n >\r\n <template #default=\"{ $index }\">\r\n {{ computeIndex($index) }}\r\n </template>\r\n </el-table-column>\r\n\r\n <!-- ========== operation 列 ========== -->\r\n <el-table-column\r\n v-for=\"col in getOperationColumns()\"\r\n :key=\"col.key\"\r\n :label=\"col.label || '操作'\"\r\n align=\"center\"\r\n v-bind=\"{\r\n ...col.columnProps,\r\n width: getOperationWidth(col)\r\n }\"\r\n >\r\n <template #default=\"{ row }\">\r\n <el-button\r\n v-for=\"btn in getVisibleButtons(col, row)\"\r\n :key=\"btn.label\"\r\n :type=\"btn.type || 'primary'\"\r\n link\r\n @click=\"btn.action(row)\"\r\n >\r\n {{ btn.label }}\r\n </el-button>\r\n </template>\r\n </el-table-column>\r\n\r\n <!-- ========== 普通数据列 ========== -->\r\n <el-table-column\r\n v-for=\"col in dataColumns\"\r\n :key=\"col.key\"\r\n :label=\"col.label\"\r\n align=\"center\"\r\n v-bind=\"col.columnProps || {}\"\r\n >\r\n <template #default=\"scope\">\r\n <!-- 父组件插槽优先 -->\r\n <template v-if=\"col.render === 'slot'\">\r\n <slot :name=\"col?.slot || col.key\" v-bind=\"scope\" />\r\n </template>\r\n\r\n <!-- renderer -->\r\n <component\r\n v-else-if=\"col.render && renderer[col.render]\"\r\n :is=\"renderer[col.render]\"\r\n :row=\"scope.row\"\r\n :col=\"col\"\r\n :index=\"scope.$index\"\r\n :onCellChange=\"handleCellChange\"\r\n :onCellBlur=\"handleCellBlur\"\r\n :onCellEnter=\"handleCellEnter\"\r\n :onClick=\"handleCellClick\"\r\n />\r\n <!-- 默认文本 -->\r\n <span v-else\r\n :style=\"col.renderProps?.style || ''\"\r\n :class=\"col.renderProps?.class || ''\"\r\n :title=\"getValueByPath(scope.row, col.key)\">\r\n {{ getValueByPath(scope.row, col.key) }}\r\n </span>\r\n </template>\r\n </el-table-column>\r\n\r\n <!-- 动态插槽 -->\r\n <template v-for=\"col in dataColumns\" #[col.key]=\"slotProps\">\r\n <slot :name=\"col.key\" v-bind=\"slotProps\" />\r\n </template>\r\n </el-table>\r\n</template>\r\n\r\n<script setup lang=\"ts\" name=\"SmartTable\">\r\n import { PropType, ref, watch, computed } from 'vue'\r\n import type { BaseColumn, ColumnConfig } from './types'\r\n import { useTableColumns } from \"./hooks/useTableColumns\"\r\n import { useOperationColumn } from './hooks/useOperationColumn'\r\n import { getRendererManager } from './renderer'\r\n import { registerBuiltInRenderers } from './renderers'\r\n import { getValueByPath } from './utils/path'\r\n\r\n const props = defineProps({\r\n data: { type: Array, default: () => [] },\r\n columns: { type: Array, default: () => [] },\r\n rowKey: { type: String, default: 'id' },\r\n loading: { type: Boolean, default: false },\r\n permissions: {\r\n type: Array as PropType<string[]>,\r\n default: () => []\r\n },\r\n cacheKey: String,\r\n pagination: { type: Object, default: () => ({}) },\r\n })\r\n\r\n const emit = defineEmits([\r\n 'update:columns',\r\n 'cellChange',\r\n 'cellBlur',\r\n 'cellEnter',\r\n 'cell-click',\r\n ])\r\n\r\n // ------------------ columns 处理 ------------------\r\n const { columns: cachedColumns } = useTableColumns(props.columns, {\r\n cacheKey: props.cacheKey ?? '',\r\n })\r\n watch(\r\n cachedColumns,\r\n (val: ColumnConfig[]) => emit(\"update:columns\", val),\r\n { deep: true, immediate: true },\r\n )\r\n\r\n // ------------------ 将行数据传递给 operation 列 ------------------\r\n watch(\r\n () => props.data,\r\n (newData) => {\r\n if (!newData) return\r\n\r\n // 为 operation 列注入 __rows,用于计算宽度\r\n cachedColumns.value.forEach((col: ColumnConfig) => {\r\n if (col.type === 'operation') {\r\n col.__rows = newData\r\n }\r\n })\r\n },\r\n { deep: true, immediate: true }\r\n )\r\n\r\n // ------------------ 列分类 ------------------\r\n const selectionColumns = computed(() =>\r\n cachedColumns.value.filter(col => col.type === 'selection')\r\n )\r\n\r\n const indexColumns = computed(() =>\r\n cachedColumns.value.filter(col => col.type === 'index')\r\n )\r\n\r\n const operationColumns = computed(() =>\r\n cachedColumns.value.filter(col => col.type === 'operation')\r\n )\r\n\r\n const dataColumns = computed(() =>\r\n cachedColumns.value.filter(col => {\r\n if (col.type === 'selection' || col.type === 'index') return false\r\n if (col.type === 'operation') return false\r\n if (col.visible === false) return false\r\n return true\r\n })\r\n )\r\n\r\n // ------------------ index 列序号计算 ------------------\r\n const computeIndex = (index: number) => {\r\n const page = props.pagination?.page\r\n const size = props.pagination?.size\r\n return page && size ? (page - 1) * size + index + 1 : index + 1\r\n }\r\n\r\n // ------------------ renderer 注册 ------------------\r\n registerBuiltInRenderers(getRendererManager())\r\n\r\n const renderer = computed(() => {\r\n const manager = getRendererManager()\r\n const allRenderers: Record<string, any> = {}\r\n\r\n manager.names().forEach((name: string) => {\r\n const r = manager.get(name)\r\n if (r) allRenderers[name] = r\r\n })\r\n\r\n return allRenderers\r\n })\r\n\r\n // ------------------ operation 列逻辑 ------------------\r\n // 为每个 operation 列创建 useOperationColumn 实例\r\n const operationColumnMap = computed(() => {\r\n const map = new Map<string, ReturnType<typeof useOperationColumn>>()\r\n\r\n operationColumns.value.forEach(col => {\r\n const hook = useOperationColumn(\r\n col.buttons || [],\r\n col.maxbtn ?? 10,\r\n props.permissions || []\r\n )\r\n map.set(col.key, hook)\r\n })\r\n\r\n return map\r\n })\r\n\r\n const getOperationColumnHook = (col: ColumnConfig) => {\r\n return operationColumnMap.value.get(col.key)\r\n }\r\n\r\n const getOperationWidth = (col: ColumnConfig) => {\r\n const hook = getOperationColumnHook(col)\r\n if (!hook) return 0\r\n\r\n // 无行数据,用静态宽度\r\n if (!col.__rows) return hook.optWidth.value\r\n // 有行数据,取最大宽度\r\n return hook.getMaxOptWidth(col.__rows)\r\n }\r\n\r\n const getVisibleButtons = (col: ColumnConfig, row: any) => {\r\n const hook = getOperationColumnHook(col)\r\n if (!hook) return []\r\n\r\n // 检查 operation 列是否应该显示\r\n const buttons = col.buttons || []\r\n if (!buttons.length) return []\r\n\r\n const rows = col.__rows || []\r\n if (!rows.length) {\r\n // 无行数据,基于权限判断\r\n return hook.getVisibleButtons(row)\r\n }\r\n\r\n // 有行数据,基于权限 + visible 判断\r\n return hook.getVisibleButtons(row)\r\n }\r\n\r\n const getOperationColumns = () => {\r\n return operationColumns.value.filter(col => {\r\n const hook = getOperationColumnHook(col)\r\n if (!hook) return false\r\n\r\n const buttons = col.buttons || []\r\n if (!buttons.length) return false\r\n\r\n const rows = col.__rows || []\r\n if (!rows.length) return hook.hasAnyButton.value\r\n\r\n return hook.hasAnyVisibleButton(col.__rows || [])\r\n })\r\n }\r\n\r\n // ----------------事件封装 ------------------\r\n const handleCellChange = (row: any, key: string) => {\r\n emit('cellChange', row, key)\r\n }\r\n const handleCellBlur = (row: any, key: string) => {\r\n emit('cellBlur', row, key)\r\n }\r\n const handleCellEnter = (row: any, key: string) => {\r\n emit('cellEnter', row, key)\r\n }\r\n const handleCellClick = (row: any, col: any) => {\r\n if(!col) return\r\n emit('cell-click', row, col)\r\n }\r\n\r\n // el-table\r\n const tableRef = ref();\r\n defineExpose({\r\n tableRef,\r\n });\r\n\r\n</script>\r\n\r\n<style>\r\n .smart_table {\r\n width: 100%;\r\n }\r\n \r\n .st_copy_wrapper:hover .st_copy_btn {\r\n display: inline-block !important;\r\n }\r\n\r\n .st_copy_btn:hover {\r\n transform: translateY(-50%) scale(1.1);\r\n }\r\n</style>\r\n","/**\r\n * 全局配置管理\r\n */\r\nimport type { SmartTableConfig } from './types'\r\nimport { getRendererManager } from './renderer'\r\n\r\n/**\r\n * 默认配置\r\n */\r\nconst defaultConfig: SmartTableConfig = {\r\n defaultPagination: {\r\n page: 1,\r\n size: 10,\r\n total: 0\r\n },\r\n defaultTableProps: {},\r\n defaultColumnProps: {}\r\n}\r\n\r\n/**\r\n * 全局配置类\r\n */\r\nclass ConfigManager {\r\n private config: SmartTableConfig = { ...defaultConfig }\r\n\r\n /**\r\n * 获取所有配置\r\n */\r\n getConfig(): SmartTableConfig {\r\n return { ...this.config }\r\n }\r\n\r\n /**\r\n * 设置配置\r\n */\r\n setConfig(config: Partial<SmartTableConfig>): void {\r\n this.config = this.mergeConfig(this.config, config)\r\n\r\n // 如果有自定义渲染器,自动注册\r\n if (config.renderers) {\r\n const manager = getRendererManager()\r\n manager.registerMultiple(config.renderers)\r\n }\r\n }\r\n\r\n /**\r\n * 获取特定配置项\r\n */\r\n get<K extends keyof SmartTableConfig>(key: K): SmartTableConfig[K] {\r\n return this.config[key]\r\n }\r\n\r\n /**\r\n * 重置为默认配置\r\n */\r\n reset(): void {\r\n this.config = { ...defaultConfig }\r\n }\r\n\r\n /**\r\n * 深度合并配置\r\n */\r\n private mergeConfig(target: any, source: any): any {\r\n const result = { ...target }\r\n\r\n for (const key in source) {\r\n if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {\r\n result[key] = this.mergeConfig(target[key] || {}, source[key])\r\n } else {\r\n result[key] = source[key]\r\n }\r\n }\r\n\r\n return result\r\n }\r\n}\r\n\r\n/**\r\n * 全局配置管理器单例\r\n */\r\nlet globalConfigManager: ConfigManager | null = null\r\n\r\n/**\r\n * 获取全局配置管理器\r\n */\r\nexport function getConfigManager(): ConfigManager {\r\n if (!globalConfigManager) {\r\n globalConfigManager = new ConfigManager()\r\n }\r\n return globalConfigManager\r\n}\r\n\r\n/**\r\n * 安装插件(用于 Vue.use())\r\n */\r\nexport interface SmartTablePlugin {\r\n install: (options?: SmartTableConfig) => void\r\n}\r\n\r\n/**\r\n * 创建插件实例\r\n */\r\nexport function createSmartTablePlugin(defaultOptions?: SmartTableConfig): SmartTablePlugin {\r\n return {\r\n install(options?: SmartTableConfig) {\r\n const manager = getConfigManager()\r\n const config = { ...defaultOptions, ...options }\r\n if (config) {\r\n manager.setConfig(config)\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 全局配置快捷方法\r\n */\r\nexport function setSmartTableConfig(config: Partial<SmartTableConfig>): void {\r\n getConfigManager().setConfig(config)\r\n}\r\n\r\nexport function getSmartTableConfig(): SmartTableConfig {\r\n return getConfigManager().getConfig()\r\n}\r\n","/**\r\n * 增强类型系统 - 提供更好的类型推断\r\n */\r\nimport type { ColumnConfig, RendererName } from '../components/SmartTable/types'\r\n\r\n/**\r\n * 提取行数据的类型\r\n */\r\nexport type ExtractRowType<T> = T extends ColumnConfig<infer R> ? R : never\r\n\r\n/**\r\n * 根据列配置提取表格数据类型\r\n */\r\nexport type TableDataFromColumns<T extends ColumnConfig[]> = T extends (infer C)[]\r\n ? C extends ColumnConfig<infer R>\r\n ? R\r\n : any\r\n : any\r\n\r\n/**\r\n * 渲染器 Props 类型推断\r\n */\r\nexport type InferRendererProps<T extends RendererName> =\r\n T extends 'html'\r\n ? { style?: string; class?: string; [key: string]: any }\r\n : T extends 'copy'\r\n ? { successText?: string; errorText?: string; iconColor?: string; [key: string]: any }\r\n : T extends 'img'\r\n ? { width?: string | number; height?: string | number; fit?: string; previewSrcList?: string[]; [key: string]: any }\r\n : T extends 'dict'\r\n ? { options: Array<{ label: string; value: string | number; listClass?: string; cssClass?: string }>; showValue?: boolean }\r\n : T extends 'map'\r\n ? { options: Record<string | number, any> }\r\n : T extends 'input'\r\n ? { placeholder?: string; size?: 'small' | 'default' | 'large'; clearable?: boolean }\r\n : T extends 'select'\r\n ? { options: Array<{ label: string; value: string | number }>; placeholder?: string; clearable?: boolean }\r\n : { [key: string]: any }\r\n\r\n/**\r\n * 快捷创建列的辅助函数(类型安全简化版)\r\n */\r\nexport function defineColumn(\r\n key: string,\r\n config?: Partial<Omit<ColumnConfig, 'key'>>\r\n): ColumnConfig {\r\n return {\r\n key,\r\n ...config\r\n } as ColumnConfig\r\n}\r\n"],"names":["mergeColumns","defaultColumns","cacheColumns","cacheMap","c","col","cacheCol","useTableColumns","options","cacheKey","storage","cache","columns","ref","watch","newVal","lightColumns","newColumns","useOperationColumn","buttonConfigs","maxbtn","userPermissions","all_permission","hasPermi","value","permArray","p","hasAnyButton","computed","btn","optWidth","sum","isButtonVisible","row","optRowWidth","rows","max","RendererManager","__publicField","name","renderer","renderers","globalRendererManager","getRendererManager","wrapSFCComponent","comp","defineComponent","props","h","createFunctionalRenderer","render","validateRendererProps","rendererName","renderProps","getValueByPath","obj","path","acc","key","setValueByPath","keys","lastKey","target","__props","v","onBlur","_a","onEnter","_openBlock","_createBlock","_component_el_input","_mergeProps","$event","_component_el_input_number","onChange","_component_el_select","_createElementBlock","_Fragment","opt","_component_el_option","input","EditableInput","inputNumber","EditableNumber","select","EditableSelect","button","rp","val","ElButton","link","html","copy","butStyle","testStyle","ElMessage","textarea","successful","DocumentCopy","img","imageList","item","defaultStyle","ElImage","CopyDocument","dict","showValue","values","matchedOptions","unmatched","children","_index","ElTag","map","isDataColumn","formatter","index","icon","builtInRenderers","registerBuiltInRenderers","registry","createRenderer","emit","__emit","cachedColumns","newData","selectionColumns","indexColumns","operationColumns","dataColumns","computeIndex","page","size","_b","manager","allRenderers","r","operationColumnMap","hook","getOperationColumnHook","getOperationWidth","getVisibleButtons","getOperationColumns","handleCellChange","handleCellBlur","handleCellEnter","handleCellClick","tableRef","__expose","_withDirectives","_component_el_table","$attrs","_renderList","_component_el_table_column","_withCtx","$index","_createTextVNode","_toDisplayString","_component_el_button","scope","_renderSlot","_ctx","_resolveDynamicComponent","_normalizeStyle","_normalizeClass","_unref","_hoisted_1","slotProps","defaultConfig","ConfigManager","config","source","result","globalConfigManager","getConfigManager","setSmartTableConfig","getSmartTableConfig","defineColumn"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- (function(p,t){typeof exports=="object"&&typeof module<"u"?t(exports,require("vue"),require("element-plus"),require("@element-plus/icons-vue")):typeof define=="function"&&define.amd?define(["exports","vue","element-plus","@element-plus/icons-vue"],t):(p=typeof globalThis<"u"?globalThis:p||self,t(p.Vue3SmartTable={},p.Vue,p.ElementPlus,p.ElementPlusIconsVue))})(this,(function(p,t,h,K){"use strict";var Be=Object.defineProperty;var xe=(p,t,h)=>t in p?Be(p,t,{enumerable:!0,configurable:!0,writable:!0,value:h}):p[t]=h;var I=(p,t,h)=>xe(p,typeof t!="symbol"?t+"":t,h);var P=document.createElement("style");P.textContent=`.smart_table{width:100%}.st_copy_wrapper:hover .st_copy_btn{display:inline-block!important}.st_copy_btn:hover{transform:translateY(-50%) scale(1.1)}
2
- /*$vite$:1*/`,document.head.appendChild(P);function z(n,e){if(!(e!=null&&e.length))return n;const r=new Map(e.map(o=>[o.key,o]));return n.map(o=>{const s=r.get(o.key);return s?{...o,visible:typeof s.visible=="boolean"?s.visible:o.visible}:o})}function J(n,e){const{cacheKey:r,storage:o=localStorage}=e||{},s=r?o.getItem(r):null,l=t.ref(z(n,s?JSON.parse(s):[]));return t.watch(l,a=>{if(!r)return;const m=a.map(f=>({key:f.key,visible:f.visible,columnOpts:f.columnOpts}));o.setItem(r,JSON.stringify(m))},{deep:!0}),{columns:l,setColumns(a){l.value=z(n,a),r&&o.setItem(r,JSON.stringify(a))},resetColumns(){l.value=n,r&&o.removeItem(r)}}}function U(n,e=10,r=[]){const s="*:*:*",l=d=>{if(!d)return!0;const g=Array.isArray(d)?d:[d];return r.some(b=>b===s||g.includes(b))},a=t.computed(()=>n.some(d=>l(d.permission))),m=t.computed(()=>n.filter(g=>l(g.permission)).slice(0,e).reduce((g,b)=>g+(b.width??55),0)),f=(d,g)=>l(d.permission)&&(d.visible?d.visible(g):!0),k=d=>n.filter(b=>f(b,d)).slice(0,e).reduce((b,L)=>b+(L.width??55),0);return{hasAnyButton:a,optWidth:m,hasAnyVisibleButton:d=>d!=null&&d.length?d.some(g=>n.some(b=>f(b,g))):!1,getMaxOptWidth:d=>d!=null&&d.length?d.reduce((g,b)=>Math.max(g,k(b)),0):m.value,getVisibleButtons:d=>n.filter(g=>f(g,d)).slice(0,e)}}class Y{constructor(){I(this,"renderers",new Map)}register(e,r){this.renderers.has(e)&&process.env.NODE_ENV==="development"&&console.debug(`[SmartTable] Renderer "${e}" already registered, skipping.`),this.renderers.set(e,r)}registerMultiple(e){Object.entries(e).forEach(([r,o])=>{this.renderers.has(r)||this.renderers.set(r,o)})}get(e){return this.renderers.get(e)}has(e){return this.renderers.has(e)}unregister(e){return this.renderers.delete(e)}clear(){this.renderers.clear()}names(){return Array.from(this.renderers.keys())}}let A=null;function M(){return A||(A=new Y),A}function V(n){return t.defineComponent({props:["row","col","onCellChange","onCellBlur","onCellEnter","onClick"],setup(e){return()=>t.h(n,e)}})}function _(n){return t.defineComponent({props:["row","col","onCellChange","onCellBlur","onCellEnter","onClick"],setup(e){return()=>n(e)}})}function G(n,e){if(process.env.NODE_ENV!=="production"&&e)switch(n){case"dict":(!e.options||!Array.isArray(e.options))&&console.warn("[SmartTable] 'dict' renderer requires 'options' array, received:",e.options);break;case"select":!e.options||!Array.isArray(e.options)?console.warn("[SmartTable] 'select' renderer requires 'options' array, received:",e.options):e.options.length===0&&console.warn("[SmartTable] 'select' renderer 'options' array is empty");break;case"map":(!e.options||typeof e.options!="object")&&console.warn("[SmartTable] 'map' renderer requires 'options' object, received:",e.options);break;case"link":(!e.href||typeof e.href!="string")&&console.warn("[SmartTable] 'link' renderer requires 'href' string, received:",e.href);break;case"input-number":e.min!==void 0&&e.max!==void 0&&e.min>e.max&&console.warn(`[SmartTable] 'input-number' renderer: min (${e.min}) should not be greater than max (${e.max})`);break}}function C(n,e){if(!(!n||!e))return e.split(".").reduce((r,o)=>r==null?void 0:r[o],n)}function F(n,e,r){if(!n||!e)return;const o=e.split("."),s=o.pop(),l=o.reduce((a,m)=>(a[m]||(a[m]={}),a[m]),n);l[s]=r}const Q=t.defineComponent({__name:"input",props:{row:{},col:{},onCellBlur:{type:Function},onCellEnter:{type:Function}},setup(n){const e=n,r=t.ref(C(e.row,e.col.key));t.watch(r,l=>{F(e.row,e.col.key,l)});const o=()=>{var l;return(l=e.onCellBlur)==null?void 0:l.call(e,e.row,e.col)},s=()=>{var l;return(l=e.onCellEnter)==null?void 0:l.call(e,e.row,e.col)};return(l,a)=>{const m=t.resolveComponent("el-input");return t.openBlock(),t.createBlock(m,t.mergeProps({modelValue:r.value,"onUpdate:modelValue":a[0]||(a[0]=f=>r.value=f)},{placeholder:"",size:"small",clearable:!0,...n.col.renderProps},{onBlur:o,onKeyup:t.withKeys(s,["enter"])}),null,16,["modelValue"])}}}),X=t.defineComponent({__name:"inputNumber",props:{row:{},col:{},onCellChange:{type:Function},onCellBlur:{type:Function},onCellEnter:{type:Function}},setup(n){const e=n,r=t.ref(C(e.row,e.col.key));t.watch(r,l=>{var a;F(e.row,e.col.key,l),(a=e.onCellChange)==null||a.call(e,e.row,e.col)});const o=()=>{var l;return(l=e.onCellBlur)==null?void 0:l.call(e,e.row,e.col)},s=()=>{var l;return(l=e.onCellEnter)==null?void 0:l.call(e,e.row,e.col)};return(l,a)=>{const m=t.resolveComponent("el-input-number");return t.openBlock(),t.createBlock(m,t.mergeProps({modelValue:r.value,"onUpdate:modelValue":a[0]||(a[0]=f=>r.value=f)},{min:0,max:99999,controls:!1,size:"small",...n.col.renderProps},{onBlur:o,onKeyup:t.withKeys(s,["enter"])}),null,16,["modelValue"])}}}),Z=t.defineComponent({__name:"select",props:{row:{},col:{},onCellChange:{type:Function},onCellBlur:{type:Function},onCellEnter:{type:Function}},setup(n){const e=n,r=t.ref(C(e.row,e.col.key));t.watch(r,a=>{F(e.row,e.col.key,a)});const o=()=>{var a;return(a=e.onCellChange)==null?void 0:a.call(e,e.row,e.col)},s=()=>{var a;return(a=e.onCellBlur)==null?void 0:a.call(e,e.row,e.col)},l=()=>{var a;return(a=e.onCellEnter)==null?void 0:a.call(e,e.row,e.col)};return(a,m)=>{const f=t.resolveComponent("el-option"),k=t.resolveComponent("el-select");return t.openBlock(),t.createBlock(k,t.mergeProps({modelValue:r.value,"onUpdate:modelValue":m[0]||(m[0]=B=>r.value=B)},{placeholder:"请选择",size:"small",clearable:!0,...n.col.renderProps},{onChange:o,onBlur:s,onKeyup:t.withKeys(l,["enter"])}),{default:t.withCtx(()=>{var B;return[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(((B=n.col.renderProps)==null?void 0:B.options)||[],E=>(t.openBlock(),t.createBlock(f,{key:E.value,label:E.label,value:E.value},null,8,["label","value"]))),128))]}),_:1},16,["modelValue"])}}}),v=V(Q),ee=V(X),te=V(Z),ne=_(n=>{const e=n.col.renderProps||{},r=C(n.row,n.col.key);return t.h(h.ElButton,{type:e.type||"primary",...e,onClick:()=>{var o;return(o=n.onClick)==null?void 0:o.call(n,n.row,n.col)}},()=>e.label||r)}),re=_(n=>{const e=n.col.renderProps||{},r=C(n.row,n.col.key);return t.h("a",{href:e.href||"#",target:e.blank?"_blank":"_self",style:e.style||"color:#409EFF;cursor:pointer;"},e.label||r)}),oe=_(n=>{var r;const e=C(n.row,n.col.key);return t.h("div",{class:"line-clamp-2",innerHTML:e??"",...((r=n.col)==null?void 0:r.renderProps)||{}})}),le=_(n=>{const e=C(n.row,n.col.key)??"",r=n.col.renderProps??{},o={position:"absolute",right:"-5px",top:"50%",transform:"translateY(-50%)",cursor:"pointer",display:"none","font-size":"12px",color:r.iconColor||"#409EFF","user-select":"none"},s={"padding-right":"10px",display:"-webkit-box","-webkit-box-orient":"vertical","-webkit-line-clamp":r.lineClamp??2,overflow:"hidden",...r.textStyles};return t.h("div",{class:"st_copy_wrapper",style:"width: 100%; position: relative; display: inline-block;"},[t.h("span",{class:`st_copy_text ${r.textClass??""}`,style:s,title:e},e),e&&t.h("span",{class:"st_copy_btn",style:o,title:r.copyTitle||"复制",onClick:()=>{if(e)try{if(navigator.clipboard&&navigator.clipboard.writeText)navigator.clipboard.writeText(e).then(()=>{h.ElMessage.success(r.successText??"复制成功")}).catch(()=>{h.ElMessage.error(r.errorText??"复制失败")});else{const l=document.createElement("textarea");l.value=e,l.style.position="fixed",l.style.opacity="0",document.body.appendChild(l),l.select();const a=document.execCommand("copy");document.body.removeChild(l),a?h.ElMessage.success(r.successText??"复制成功"):h.ElMessage.error(r.errorText??"复制失败")}}catch{h.ElMessage.error(r.errorText??"复制失败")}}},[t.h(K.DocumentCopy,{style:"width: 1em; height: 1em;"})])].filter(Boolean))}),ie=_(n=>{var a;const e=C(n.row,n.col.key)??"",r=((a=n.col)==null?void 0:a.renderProps)||{},s=e?Array.isArray(e)?e.filter(m=>m&&typeof m=="string"):[e]:[];if(s.length===0)return r.placeholder||"";const l={width:r.width||"80px",height:r.height||"80px",marginRight:s.length>1?"4px":"0",...r.style||{}};return s.length===1?t.h(h.ElImage,{src:s[0],previewSrcList:r.previewSrcList||s,previewTeleported:!0,fit:r.fit||"contain",style:l,...r}):t.h("div",{class:"st_img_wrapper",style:"display: flex; align-items: center; position: relative"},[t.h(h.ElImage,{src:s[0],previewSrcList:r.previewSrcList||s,previewTeleported:!0,fit:r.fit||"contain",style:l,...r}),s.length>1&&t.h("span",{class:"st_img_total",style:"position: absolute; top: 0; right: 0; ",title:`${s.length}`},[t.h(K.CopyDocument,{style:"width: 1em; height: 1em; "})])])}),se=_(n=>{const e=C(n.row,n.col.key)??"",r=n.col.renderProps||{},o=r.options??[],s=r.showValue??!1;if(e==null||e==="")return"";const l=Array.isArray(e)?e.map(String):[String(e)],a=o.filter(k=>l.includes(String(k.value))),m=l.filter(k=>!o.some(B=>String(B.value)===k)),f=a.map((k,B)=>t.h(h.ElTag,{key:k.value,type:k.listClass,class:k.cssClass,disableTransitions:!0},{default:()=>k.label+" "}));return s&&m.length>0&&f.push(t.h("span",{},m.join(" "))),t.h("div",{},f)}),ae=_(n=>{var o;const e=C(n.row,n.col.key)??"",r=((o=n.col.renderProps)==null?void 0:o.options)??{};return e!=null?r[e]??"":""});function ce(n){return typeof n.formatter=="function"}const ue=_(n=>{var s;const{col:e,row:r}=n,o=C(n.row,n.col.key)??"";return ce(e)?(s=e.formatter)==null?void 0:s.call(e,o,r):o??""}),de=_(n=>{const e=C(n.row,n.col.key)??"",r=n.col.renderProps||{};return e?/^https?:\/\//.test(e)?t.h(h.ElImage,{src:e,previewSrcList:[e],previewTeleported:!0,fit:"contain",style:"width:40px;height:40px",...r}):/^\s*<svg[\s\S]*<\/svg>\s*$/.test(e)?t.h("div",{innerHTML:e,style:`width:40px;height:40px;display:inline-block;${r.style||""}`,...r}):t.h("i",{class:e,style:`font-size:20px;${r.style||""}`,...r}):""}),R={input:v,"input-number":ee,select:te,button:ne,link:re,html:oe,copy:le,img:ie,dict:se,map:ae,formatter:ue,icon:de};function N(n){n.registerMultiple(R)}function pe(){return R}const me=["title"],D=t.defineComponent({__name:"index",props:{data:{type:Array,default:()=>[]},columns:{type:Array,default:()=>[]},rowKey:{type:String,default:"id"},loading:{type:Boolean,default:!1},permissions:{type:Array,default:()=>[]},cacheKey:String,pagination:{type:Object,default:()=>({})}},emits:["update:columns","cellChange","cellBlur","cellEnter","cell-click"],setup(n,{expose:e,emit:r}){const o=n,s=r,{columns:l}=J(o.columns,{cacheKey:o.cacheKey??""});t.watch(l,i=>s("update:columns",i),{deep:!0,immediate:!0}),t.watch(()=>o.data,i=>{i&&l.value.forEach(c=>{c.type==="operation"&&(c.__rows=i)})},{deep:!0,immediate:!0});const a=t.computed(()=>l.value.filter(i=>i.type==="selection")),m=t.computed(()=>l.value.filter(i=>i.type==="index")),f=t.computed(()=>l.value.filter(i=>i.type==="operation")),k=t.computed(()=>l.value.filter(i=>!(i.type==="selection"||i.type==="index"||i.type==="operation"||i.visible===!1))),B=i=>{var x,T;const c=(x=o.pagination)==null?void 0:x.page,y=(T=o.pagination)==null?void 0:T.size;return c&&y?(c-1)*y+i+1:i+1};N(M());const E=t.computed(()=>{const i=M(),c={};return i.names().forEach(y=>{const x=i.get(y);x&&(c[y]=x)}),c}),j=t.computed(()=>{const i=new Map;return f.value.forEach(c=>{const y=U(c.buttons||[],c.maxbtn??10,o.permissions||[]);i.set(c.key,y)}),i}),d=i=>j.value.get(i.key),g=i=>{const c=d(i);return c?i.__rows?c.getMaxOptWidth(i.__rows):c.optWidth.value:0},b=(i,c)=>{const y=d(i);return y?(i.buttons||[]).length?((i.__rows||[]).length,y.getVisibleButtons(c)):[]:[]},L=()=>f.value.filter(i=>{const c=d(i);return!c||!(i.buttons||[]).length?!1:(i.__rows||[]).length?c.hasAnyVisibleButton(i.__rows||[]):c.hasAnyButton.value}),ke=(i,c)=>{s("cellChange",i,c)},Ce=(i,c)=>{s("cellBlur",i,c)},be=(i,c)=>{s("cellEnter",i,c)},we=(i,c)=>{c&&s("cell-click",i,c)},H=t.ref();return e({tableRef:H}),(i,c)=>{const y=t.resolveComponent("el-table-column"),x=t.resolveComponent("el-button"),T=t.resolveComponent("el-table"),_e=t.resolveDirective("loading");return t.withDirectives((t.openBlock(),t.createBlock(T,t.mergeProps({ref_key:"tableRef",ref:H},i.$attrs,{data:n.data,"row-key":n.rowKey,class:"smart_table"}),t.createSlots({default:t.withCtx(()=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(a.value,u=>(t.openBlock(),t.createBlock(y,t.mergeProps({key:"selection",type:"selection"},{ref_for:!0},u.columnProps),null,16))),128)),(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(m.value,u=>(t.openBlock(),t.createBlock(y,t.mergeProps({key:"index",type:"index",label:u.label||"#",align:"center"},{ref_for:!0},u.columnProps),{default:t.withCtx(({$index:w})=>[t.createTextVNode(t.toDisplayString(B(w)),1)]),_:1},16,["label"]))),128)),(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(L(),u=>(t.openBlock(),t.createBlock(y,t.mergeProps({key:u.key,label:u.label||"操作",align:"center"},{ref_for:!0},{...u.columnProps,width:g(u)}),{default:t.withCtx(({row:w})=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(b(u,w),S=>(t.openBlock(),t.createBlock(x,{key:S.label,type:S.type||"primary",link:"",onClick:$=>S.action(w)},{default:t.withCtx(()=>[t.createTextVNode(t.toDisplayString(S.label),1)]),_:2},1032,["type","onClick"]))),128))]),_:2},1040,["label"]))),128)),(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(k.value,u=>(t.openBlock(),t.createBlock(y,t.mergeProps({key:u.key,label:u.label,align:"center"},{ref_for:!0},u.columnProps||{}),{default:t.withCtx(w=>{var S,$;return[u.render==="slot"?t.renderSlot(i.$slots,(u==null?void 0:u.slot)||u.key,t.mergeProps({key:0,ref_for:!0},w)):u.render&&E.value[u.render]?(t.openBlock(),t.createBlock(t.resolveDynamicComponent(E.value[u.render]),{key:1,row:w.row,col:u,onCellChange:ke,onCellBlur:Ce,onCellEnter:be,onClick:we},null,40,["row","col"])):(t.openBlock(),t.createElementBlock("span",{key:2,style:t.normalizeStyle(((S=u.renderProps)==null?void 0:S.style)||""),class:t.normalizeClass((($=u.renderProps)==null?void 0:$.class)||""),title:t.unref(C)(w.row,u.key)},t.toDisplayString(t.unref(C)(w.row,u.key)),15,me))]}),_:2},1040,["label"]))),128))]),_:2},[t.renderList(k.value,u=>({name:u.key,fn:t.withCtx(w=>[t.renderSlot(i.$slots,u.key,t.normalizeProps(t.guardReactiveProps(w)))])}))]),1040,["data","row-key"])),[[_e,n.loading]])}}}),W={defaultPagination:{page:1,size:10,total:0},defaultTableProps:{},defaultColumnProps:{}};class fe{constructor(){I(this,"config",{...W})}getConfig(){return{...this.config}}setConfig(e){this.config=this.mergeConfig(this.config,e),e.renderers&&M().registerMultiple(e.renderers)}get(e){return this.config[e]}reset(){this.config={...W}}mergeConfig(e,r){const o={...e};for(const s in r)r[s]&&typeof r[s]=="object"&&!Array.isArray(r[s])?o[s]=this.mergeConfig(e[s]||{},r[s]):o[s]=r[s];return o}}let O=null;function q(){return O||(O=new fe),O}function ye(n){q().setConfig(n)}function ge(){return q().getConfig()}function he(n,e){return{key:n,...e}}p.SmartTable=D,p.builtInRenderers=R,p.createFunctionalRenderer=_,p.createRenderer=pe,p.default=D,p.defineColumn=he,p.getRendererManager=M,p.getSmartTableConfig=ge,p.registerBuiltInRenderers=N,p.setSmartTableConfig=ye,p.validateRendererProps=G,p.wrapSFCComponent=V,Object.defineProperties(p,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
1
+ (function(m,t){typeof exports=="object"&&typeof module<"u"?t(exports,require("vue"),require("element-plus"),require("@element-plus/icons-vue")):typeof define=="function"&&define.amd?define(["exports","vue","element-plus","@element-plus/icons-vue"],t):(m=typeof globalThis<"u"?globalThis:m||self,t(m.Vue3SmartTable={},m.Vue,m.ElementPlus,m.ElementPlusIconsVue))})(this,(function(m,t,h,K){"use strict";var Be=Object.defineProperty;var xe=(m,t,h)=>t in m?Be(m,t,{enumerable:!0,configurable:!0,writable:!0,value:h}):m[t]=h;var I=(m,t,h)=>xe(m,typeof t!="symbol"?t+"":t,h);var P=document.createElement("style");P.textContent=`.smart_table{width:100%}.st_copy_wrapper:hover .st_copy_btn{display:inline-block!important}.st_copy_btn:hover{transform:translateY(-50%) scale(1.1)}
2
+ /*$vite$:1*/`,document.head.appendChild(P);function z(n,e){if(!(e!=null&&e.length))return n;const r=new Map(e.map(l=>[l.key,l]));return n.map(l=>{const s=r.get(l.key);return s?{...l,visible:typeof s.visible=="boolean"?s.visible:l.visible}:l})}function J(n,e){const{cacheKey:r,storage:l=localStorage}=e||{},s=r?l.getItem(r):null,o=t.ref(z(n,s?JSON.parse(s):[]));return t.watch(o,a=>{if(!r)return;const p=a.map(f=>({key:f.key,visible:f.visible,columnOpts:f.columnOpts}));l.setItem(r,JSON.stringify(p))},{deep:!0}),{columns:o,setColumns(a){o.value=z(n,a),r&&l.setItem(r,JSON.stringify(a))},resetColumns(){o.value=n,r&&l.removeItem(r)}}}function U(n,e=10,r=[]){const s="*:*:*",o=d=>{if(!d)return!0;const g=Array.isArray(d)?d:[d];return r.some(b=>b===s||g.includes(b))},a=t.computed(()=>n.some(d=>o(d.permission))),p=t.computed(()=>n.filter(g=>o(g.permission)).slice(0,e).reduce((g,b)=>g+(b.width??55),0)),f=(d,g)=>o(d.permission)&&(d.visible?d.visible(g):!0),k=d=>n.filter(b=>f(b,d)).slice(0,e).reduce((b,$)=>b+($.width??55),0);return{hasAnyButton:a,optWidth:p,hasAnyVisibleButton:d=>d!=null&&d.length?d.some(g=>n.some(b=>f(b,g))):!1,getMaxOptWidth:d=>d!=null&&d.length?d.reduce((g,b)=>Math.max(g,k(b)),0):p.value,getVisibleButtons:d=>n.filter(g=>f(g,d)).slice(0,e)}}class Y{constructor(){I(this,"renderers",new Map)}register(e,r){this.renderers.has(e)&&process.env.NODE_ENV==="development"&&console.debug(`[SmartTable] Renderer "${e}" already registered, skipping.`),this.renderers.set(e,r)}registerMultiple(e){Object.entries(e).forEach(([r,l])=>{this.renderers.has(r)||this.renderers.set(r,l)})}get(e){return this.renderers.get(e)}has(e){return this.renderers.has(e)}unregister(e){return this.renderers.delete(e)}clear(){this.renderers.clear()}names(){return Array.from(this.renderers.keys())}}let A=null;function M(){return A||(A=new Y),A}function V(n){return t.defineComponent({props:["row","col","index","onCellChange","onCellBlur","onCellEnter","onClick"],setup(e){return()=>t.h(n,e)}})}function _(n){return t.defineComponent({props:["row","col","index","onCellChange","onCellBlur","onCellEnter","onClick"],setup(e){return()=>n(e)}})}function G(n,e){if(process.env.NODE_ENV!=="production"&&e)switch(n){case"dict":(!e.options||!Array.isArray(e.options))&&console.warn("[SmartTable] 'dict' renderer requires 'options' array, received:",e.options);break;case"select":!e.options||!Array.isArray(e.options)?console.warn("[SmartTable] 'select' renderer requires 'options' array, received:",e.options):e.options.length===0&&console.warn("[SmartTable] 'select' renderer 'options' array is empty");break;case"map":(!e.options||typeof e.options!="object")&&console.warn("[SmartTable] 'map' renderer requires 'options' object, received:",e.options);break;case"link":(!e.href||typeof e.href!="string")&&console.warn("[SmartTable] 'link' renderer requires 'href' string, received:",e.href);break;case"input-number":e.min!==void 0&&e.max!==void 0&&e.min>e.max&&console.warn(`[SmartTable] 'input-number' renderer: min (${e.min}) should not be greater than max (${e.max})`);break}}function C(n,e){if(!(!n||!e))return e.split(".").reduce((r,l)=>r==null?void 0:r[l],n)}function F(n,e,r){if(!n||!e)return;const l=e.split("."),s=l.pop(),o=l.reduce((a,p)=>(a[p]||(a[p]={}),a[p]),n);o[s]=r}const Q=t.defineComponent({__name:"input",props:{row:{},col:{},index:{},onCellBlur:{type:Function},onCellEnter:{type:Function}},setup(n){const e=n,r=t.ref(C(e.row,e.col.key));t.watch(r,o=>{F(e.row,e.col.key,o)});const l=()=>{var o;return(o=e.onCellBlur)==null?void 0:o.call(e,e.row,e.col)},s=()=>{var o;return(o=e.onCellEnter)==null?void 0:o.call(e,e.row,e.col)};return(o,a)=>{const p=t.resolveComponent("el-input");return t.openBlock(),t.createBlock(p,t.mergeProps({modelValue:r.value,"onUpdate:modelValue":a[0]||(a[0]=f=>r.value=f)},{placeholder:"",size:"small",clearable:!0,...n.col.renderProps},{onBlur:l,onKeyup:t.withKeys(s,["enter"])}),null,16,["modelValue"])}}}),X=t.defineComponent({__name:"inputNumber",props:{row:{},col:{},index:{},onCellChange:{type:Function},onCellBlur:{type:Function},onCellEnter:{type:Function}},setup(n){const e=n,r=t.ref(C(e.row,e.col.key));t.watch(r,o=>{var a;F(e.row,e.col.key,o),(a=e.onCellChange)==null||a.call(e,e.row,e.col)});const l=()=>{var o;return(o=e.onCellBlur)==null?void 0:o.call(e,e.row,e.col)},s=()=>{var o;return(o=e.onCellEnter)==null?void 0:o.call(e,e.row,e.col)};return(o,a)=>{const p=t.resolveComponent("el-input-number");return t.openBlock(),t.createBlock(p,t.mergeProps({modelValue:r.value,"onUpdate:modelValue":a[0]||(a[0]=f=>r.value=f)},{min:0,max:99999,controls:!1,size:"small",...n.col.renderProps},{onBlur:l,onKeyup:t.withKeys(s,["enter"])}),null,16,["modelValue"])}}}),Z=t.defineComponent({__name:"select",props:{row:{},col:{},index:{},onCellChange:{type:Function},onCellBlur:{type:Function},onCellEnter:{type:Function}},setup(n){const e=n,r=t.ref(C(e.row,e.col.key));t.watch(r,a=>{F(e.row,e.col.key,a)});const l=()=>{var a;return(a=e.onCellChange)==null?void 0:a.call(e,e.row,e.col)},s=()=>{var a;return(a=e.onCellBlur)==null?void 0:a.call(e,e.row,e.col)},o=()=>{var a;return(a=e.onCellEnter)==null?void 0:a.call(e,e.row,e.col)};return(a,p)=>{const f=t.resolveComponent("el-option"),k=t.resolveComponent("el-select");return t.openBlock(),t.createBlock(k,t.mergeProps({modelValue:r.value,"onUpdate:modelValue":p[0]||(p[0]=B=>r.value=B)},{placeholder:"请选择",size:"small",clearable:!0,...n.col.renderProps},{onChange:l,onBlur:s,onKeyup:t.withKeys(o,["enter"])}),{default:t.withCtx(()=>{var B;return[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(((B=n.col.renderProps)==null?void 0:B.options)||[],E=>(t.openBlock(),t.createBlock(f,{key:E.value,label:E.label,value:E.value},null,8,["label","value"]))),128))]}),_:1},16,["modelValue"])}}}),v=V(Q),ee=V(X),te=V(Z),ne=_(n=>{const e=n.col.renderProps||{},r=C(n.row,n.col.key);return t.h(h.ElButton,{type:e.type||"primary",...e,onClick:()=>{var l;return(l=n.onClick)==null?void 0:l.call(n,n.row,n.col)}},()=>e.label||r)}),re=_(n=>{const e=n.col.renderProps||{},r=C(n.row,n.col.key);return t.h("a",{href:e.href||"#",target:e.blank?"_blank":"_self",style:e.style||"color:#409EFF;cursor:pointer;"},e.label||r)}),oe=_(n=>{var r;const e=C(n.row,n.col.key);return t.h("div",{class:"line-clamp-2",innerHTML:e??"",...((r=n.col)==null?void 0:r.renderProps)||{}})}),le=_(n=>{const e=C(n.row,n.col.key)??"",r=n.col.renderProps??{},l={position:"absolute",right:"-5px",top:"50%",transform:"translateY(-50%)",cursor:"pointer",display:"none","font-size":"12px",color:r.iconColor||"#409EFF","user-select":"none"},s={"padding-right":"10px",display:"-webkit-box","-webkit-box-orient":"vertical","-webkit-line-clamp":r.lineClamp??2,overflow:"hidden",...r.textStyles};return t.h("div",{class:"st_copy_wrapper",style:"width: 100%; position: relative; display: inline-block;"},[t.h("span",{class:`st_copy_text ${r.textClass??""}`,style:s,title:e},e),e&&t.h("span",{class:"st_copy_btn",style:l,title:r.copyTitle||"复制",onClick:()=>{if(e)try{if(navigator.clipboard&&navigator.clipboard.writeText)navigator.clipboard.writeText(e).then(()=>{h.ElMessage.success(r.successText??"复制成功")}).catch(()=>{h.ElMessage.error(r.errorText??"复制失败")});else{const o=document.createElement("textarea");o.value=e,o.style.position="fixed",o.style.opacity="0",document.body.appendChild(o),o.select();const a=document.execCommand("copy");document.body.removeChild(o),a?h.ElMessage.success(r.successText??"复制成功"):h.ElMessage.error(r.errorText??"复制失败")}}catch{h.ElMessage.error(r.errorText??"复制失败")}}},[t.h(K.DocumentCopy,{style:"width: 1em; height: 1em;"})])].filter(Boolean))}),ie=_(n=>{var a;const e=C(n.row,n.col.key)??"",r=((a=n.col)==null?void 0:a.renderProps)||{},s=e?Array.isArray(e)?e.filter(p=>p&&typeof p=="string"):[e]:[];if(s.length===0)return r.placeholder||"";const o={width:r.width||"80px",height:r.height||"80px",marginRight:s.length>1?"4px":"0",...r.style||{}};return s.length===1?t.h(h.ElImage,{src:s[0],previewSrcList:r.previewSrcList||s,previewTeleported:!0,fit:r.fit||"contain",style:o,...r}):t.h("div",{class:"st_img_wrapper",style:"display: flex; align-items: center; position: relative"},[t.h(h.ElImage,{src:s[0],previewSrcList:r.previewSrcList||s,previewTeleported:!0,fit:r.fit||"contain",style:o,...r}),s.length>1&&t.h("span",{class:"st_img_total",style:"position: absolute; top: 0; right: 0; ",title:`${s.length}`},[t.h(K.CopyDocument,{style:"width: 1em; height: 1em; "})])])}),se=_(n=>{const e=C(n.row,n.col.key)??"",r=n.col.renderProps||{},l=r.options??[],s=r.showValue??!1;if(e==null||e==="")return"";const o=Array.isArray(e)?e.map(String):[String(e)],a=l.filter(k=>o.includes(String(k.value))),p=o.filter(k=>!l.some(B=>String(B.value)===k)),f=a.map((k,B)=>t.h(h.ElTag,{key:k.value,type:k.listClass,class:k.cssClass,disableTransitions:!0},{default:()=>k.label+" "}));return s&&p.length>0&&f.push(t.h("span",{},p.join(" "))),t.h("div",{},f)}),ae=_(n=>{var l;const e=C(n.row,n.col.key)??"",r=((l=n.col.renderProps)==null?void 0:l.options)??{};return e!=null?r[e]??"":""});function ce(n){return typeof n.formatter=="function"}const ue=_(n=>{var o;const{col:e,row:r,index:l}=n,s=C(n.row,n.col.key)??"";return ce(e)?(o=e.formatter)==null?void 0:o.call(e,s,r,l):s??""}),de=_(n=>{const e=C(n.row,n.col.key)??"",r=n.col.renderProps||{};return e?/^https?:\/\//.test(e)?t.h(h.ElImage,{src:e,previewSrcList:[e],previewTeleported:!0,fit:"contain",style:"width:40px;height:40px",...r}):/^\s*<svg[\s\S]*<\/svg>\s*$/.test(e)?t.h("div",{innerHTML:e,style:`width:40px;height:40px;display:inline-block;${r.style||""}`,...r}):t.h("i",{class:e,style:`font-size:20px;${r.style||""}`,...r}):""}),R={input:v,"input-number":ee,select:te,button:ne,link:re,html:oe,copy:le,img:ie,dict:se,map:ae,formatter:ue,icon:de};function N(n){n.registerMultiple(R)}function me(){return R}const pe=["title"],D=t.defineComponent({__name:"index",props:{data:{type:Array,default:()=>[]},columns:{type:Array,default:()=>[]},rowKey:{type:String,default:"id"},loading:{type:Boolean,default:!1},permissions:{type:Array,default:()=>[]},cacheKey:String,pagination:{type:Object,default:()=>({})}},emits:["update:columns","cellChange","cellBlur","cellEnter","cell-click"],setup(n,{expose:e,emit:r}){const l=n,s=r,{columns:o}=J(l.columns,{cacheKey:l.cacheKey??""});t.watch(o,i=>s("update:columns",i),{deep:!0,immediate:!0}),t.watch(()=>l.data,i=>{i&&o.value.forEach(c=>{c.type==="operation"&&(c.__rows=i)})},{deep:!0,immediate:!0});const a=t.computed(()=>o.value.filter(i=>i.type==="selection")),p=t.computed(()=>o.value.filter(i=>i.type==="index")),f=t.computed(()=>o.value.filter(i=>i.type==="operation")),k=t.computed(()=>o.value.filter(i=>!(i.type==="selection"||i.type==="index"||i.type==="operation"||i.visible===!1))),B=i=>{var x,T;const c=(x=l.pagination)==null?void 0:x.page,y=(T=l.pagination)==null?void 0:T.size;return c&&y?(c-1)*y+i+1:i+1};N(M());const E=t.computed(()=>{const i=M(),c={};return i.names().forEach(y=>{const x=i.get(y);x&&(c[y]=x)}),c}),j=t.computed(()=>{const i=new Map;return f.value.forEach(c=>{const y=U(c.buttons||[],c.maxbtn??10,l.permissions||[]);i.set(c.key,y)}),i}),d=i=>j.value.get(i.key),g=i=>{const c=d(i);return c?i.__rows?c.getMaxOptWidth(i.__rows):c.optWidth.value:0},b=(i,c)=>{const y=d(i);return y?(i.buttons||[]).length?((i.__rows||[]).length,y.getVisibleButtons(c)):[]:[]},$=()=>f.value.filter(i=>{const c=d(i);return!c||!(i.buttons||[]).length?!1:(i.__rows||[]).length?c.hasAnyVisibleButton(i.__rows||[]):c.hasAnyButton.value}),ke=(i,c)=>{s("cellChange",i,c)},Ce=(i,c)=>{s("cellBlur",i,c)},be=(i,c)=>{s("cellEnter",i,c)},we=(i,c)=>{c&&s("cell-click",i,c)},H=t.ref();return e({tableRef:H}),(i,c)=>{const y=t.resolveComponent("el-table-column"),x=t.resolveComponent("el-button"),T=t.resolveComponent("el-table"),_e=t.resolveDirective("loading");return t.withDirectives((t.openBlock(),t.createBlock(T,t.mergeProps({ref_key:"tableRef",ref:H},i.$attrs,{data:n.data,"row-key":n.rowKey,class:"smart_table"}),t.createSlots({default:t.withCtx(()=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(a.value,u=>(t.openBlock(),t.createBlock(y,t.mergeProps({key:"selection",type:"selection"},{ref_for:!0},u.columnProps),null,16))),128)),(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(p.value,u=>(t.openBlock(),t.createBlock(y,t.mergeProps({key:"index",type:"index",label:u.label||"#",align:"center"},{ref_for:!0},u.columnProps),{default:t.withCtx(({$index:w})=>[t.createTextVNode(t.toDisplayString(B(w)),1)]),_:1},16,["label"]))),128)),(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList($(),u=>(t.openBlock(),t.createBlock(y,t.mergeProps({key:u.key,label:u.label||"操作",align:"center"},{ref_for:!0},{...u.columnProps,width:g(u)}),{default:t.withCtx(({row:w})=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(b(u,w),S=>(t.openBlock(),t.createBlock(x,{key:S.label,type:S.type||"primary",link:"",onClick:L=>S.action(w)},{default:t.withCtx(()=>[t.createTextVNode(t.toDisplayString(S.label),1)]),_:2},1032,["type","onClick"]))),128))]),_:2},1040,["label"]))),128)),(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(k.value,u=>(t.openBlock(),t.createBlock(y,t.mergeProps({key:u.key,label:u.label,align:"center"},{ref_for:!0},u.columnProps||{}),{default:t.withCtx(w=>{var S,L;return[u.render==="slot"?t.renderSlot(i.$slots,(u==null?void 0:u.slot)||u.key,t.mergeProps({key:0,ref_for:!0},w)):u.render&&E.value[u.render]?(t.openBlock(),t.createBlock(t.resolveDynamicComponent(E.value[u.render]),{key:1,row:w.row,col:u,index:w.$index,onCellChange:ke,onCellBlur:Ce,onCellEnter:be,onClick:we},null,40,["row","col","index"])):(t.openBlock(),t.createElementBlock("span",{key:2,style:t.normalizeStyle(((S=u.renderProps)==null?void 0:S.style)||""),class:t.normalizeClass(((L=u.renderProps)==null?void 0:L.class)||""),title:t.unref(C)(w.row,u.key)},t.toDisplayString(t.unref(C)(w.row,u.key)),15,pe))]}),_:2},1040,["label"]))),128))]),_:2},[t.renderList(k.value,u=>({name:u.key,fn:t.withCtx(w=>[t.renderSlot(i.$slots,u.key,t.normalizeProps(t.guardReactiveProps(w)))])}))]),1040,["data","row-key"])),[[_e,n.loading]])}}}),W={defaultPagination:{page:1,size:10,total:0},defaultTableProps:{},defaultColumnProps:{}};class fe{constructor(){I(this,"config",{...W})}getConfig(){return{...this.config}}setConfig(e){this.config=this.mergeConfig(this.config,e),e.renderers&&M().registerMultiple(e.renderers)}get(e){return this.config[e]}reset(){this.config={...W}}mergeConfig(e,r){const l={...e};for(const s in r)r[s]&&typeof r[s]=="object"&&!Array.isArray(r[s])?l[s]=this.mergeConfig(e[s]||{},r[s]):l[s]=r[s];return l}}let O=null;function q(){return O||(O=new fe),O}function ye(n){q().setConfig(n)}function ge(){return q().getConfig()}function he(n,e){return{key:n,...e}}m.SmartTable=D,m.builtInRenderers=R,m.createFunctionalRenderer=_,m.createRenderer=me,m.default=D,m.defineColumn=he,m.getRendererManager=M,m.getSmartTableConfig=ge,m.registerBuiltInRenderers=N,m.setSmartTableConfig=ye,m.validateRendererProps=G,m.wrapSFCComponent=V,Object.defineProperties(m,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
3
3
  //# sourceMappingURL=vue3-smart-table.umd.js.map