vue3-smart-table 2.1.0 → 2.1.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"vue3-smart-table.es.js","sources":["../src/components/SmartTable/types.ts","../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/config.ts","../src/components/SmartTable/index.vue","../src/types/enhanced.ts"],"sourcesContent":["import type { ButtonProps, TableColumnCtx } from 'element-plus'\r\nimport { DefaultRow } from 'element-plus/es/components/table/src/table/defaults'\r\nimport type { Component } from 'vue'\r\n\r\n// 导出验证函数类型\r\nexport type { validateRendererProps } from './renderer'\r\n\r\n/* ======================= 基础工具类型 ======================= */\r\n\r\n/** 支持额外参数(Element Plus 透传 props) */\r\nexport type WithRestProps<T> = T & {\r\n [key: string]: any\r\n}\r\n\r\n/* ======================= 渲染器系统 ======================= */\r\n\r\n/** Renderer 组件类型 */\r\nexport type Renderer = Component\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\nexport interface SmartTableConfig {\r\n /** 自定义渲染器 */\r\n renderers?: Record<string, Renderer>\r\n /** 默认分页配置 */\r\n defaultPagination?: {\r\n page?: number\r\n size?: number\r\n total?: number\r\n }\r\n /** 默认表格属性 */\r\n defaultTableProps?: Record<string, any>\r\n /** 默认列属性 */\r\n defaultColumnProps?: Record<string, any>\r\n}\r\n\r\n/* ======================= 分页配置 ======================= */\r\n\r\n/** 分页配置接口 */\r\nexport interface PaginationConfig {\r\n /** 当前页码 */\r\n page?: number\r\n /** 每页条数 */\r\n size?: number\r\n /** 总条数 */\r\n total?: number\r\n}\r\n\r\n/* ======================= 操作列按钮 ======================= */\r\n\r\nexport interface ButtonConfig<R = any> {\r\n permission?: string | string[]\r\n label: string\r\n type?: 'primary' | 'success' | 'warning' | 'danger' | 'info'\r\n action: (row: R) => void\r\n visible?: (row: R) => boolean\r\n width?: number\r\n}\r\n\r\n/* ======================= 列类型 ======================= */\r\n\r\n/**\r\n * 列类型枚举\r\n * 包含特殊列类型和渲染器类型\r\n */\r\nexport type ColumnType =\r\n // 特殊列\r\n | 'selection'\r\n | 'index'\r\n | 'operation'\r\n // 内置渲染器\r\n | 'input'\r\n | 'input-number'\r\n | 'select'\r\n | 'dict'\r\n | 'map'\r\n | 'img'\r\n | 'link'\r\n | 'button'\r\n | 'copy'\r\n | 'html'\r\n | 'formatter'\r\n | 'icon'\r\n | 'slot'\r\n\r\n/* ======================= Props 类型映射 ======================= */\r\n\r\n/** 各类型对应的 props */\r\nexport interface ColumnPropsMap {\r\n // 特殊列\r\n selection: {}\r\n index: {}\r\n operation: {}\r\n\r\n // 渲染器\r\n html: WithRestProps<{\r\n style?: string | Record<string, any>\r\n class?: string\r\n }>\r\n\r\n copy: WithRestProps<{\r\n iconColor?: string\r\n copyTitle?: string\r\n successText?: string\r\n errorText?: string\r\n lineClamp?: number\r\n textStyles?: Record<string, any>\r\n textClass?: string\r\n }>\r\n\r\n img: WithRestProps<{\r\n width?: string | number\r\n height?: string | number\r\n fit?: 'contain' | 'cover' | 'fill' | 'none' | 'scale-down'\r\n previewSrcList?: string[]\r\n placeholder?: string\r\n style?: string | Record<string, any>\r\n }>\r\n\r\n dict: WithRestProps<{\r\n options: Array<{\r\n label: string\r\n value: string | number\r\n listClass?: string\r\n cssClass?: string\r\n tagProps?: Record<string, any>\r\n }>\r\n showValue?: boolean\r\n }>\r\n\r\n map: WithRestProps<{\r\n options: Record<string | number, any>\r\n }>\r\n\r\n formatter: WithRestProps<{}>\r\n\r\n icon: WithRestProps<{\r\n style?: string | Record<string, any>\r\n size?: number\r\n class?: string\r\n }>\r\n\r\n input: WithRestProps<{\r\n placeholder?: string\r\n size?: 'small' | 'default' | 'large'\r\n clearable?: boolean\r\n maxlength?: number\r\n showWordLimit?: boolean\r\n disabled?: boolean\r\n // 事件\r\n onChange?: (val: string, row: any, col: any) => void\r\n onBlur?: (e: FocusEvent, row: any, col: any) => void\r\n onFocus?: (e: FocusEvent, row: any, col: any) => void\r\n onInput?: (val: string, row: any, col: any) => void\r\n onClear?: (row: any, col: any) => void\r\n onEnter?: (e: KeyboardEvent, row: any, col: any) => void\r\n }>\r\n\r\n 'input-number': WithRestProps<{\r\n min?: number\r\n max?: number\r\n step?: number\r\n precision?: number\r\n size?: 'small' | 'default' | 'large'\r\n controls?: boolean\r\n disabled?: boolean\r\n // 事件\r\n onChange?: (val: number | undefined, oldVal: number | undefined, row: any, col: any) => void\r\n onBlur?: (e: FocusEvent, row: any, col: any) => void\r\n onFocus?: (e: FocusEvent, row: any, col: any) => void\r\n onEnter?: (e: KeyboardEvent, row: any, col: any) => void\r\n }>\r\n\r\n select: WithRestProps<{\r\n options: Array<{\r\n label: string\r\n value: string | number\r\n disabled?: boolean\r\n }>\r\n placeholder?: string\r\n size?: 'small' | 'default' | 'large'\r\n clearable?: boolean\r\n filterable?: boolean\r\n multiple?: boolean\r\n disabled?: boolean\r\n // 事件\r\n onChange?: (val: any, row: any, col: any) => void\r\n onBlur?: (e: FocusEvent, row: any, col: any) => void\r\n onFocus?: (e: FocusEvent, row: any, col: any) => void\r\n onVisibleChange?: (visible: boolean, row: any, col: any) => void\r\n onClear?: (row: any, col: any) => void\r\n }>\r\n\r\n button: WithRestProps<ButtonProps & {\r\n label?: string\r\n style?: string | Record<string, any>\r\n class?: string\r\n onClick?: (e: Event, row: any, col: any) => void\r\n }>\r\n\r\n link: WithRestProps<{\r\n label?: string\r\n href?: string\r\n blank?: boolean\r\n style?: string | Record<string, any>\r\n class?: string\r\n }>\r\n\r\n slot: {}\r\n}\r\n\r\n/* ======================= ColumnConfig ======================= */\r\n\r\n/** 列配置基础接口 */\r\nexport interface BaseColumnConfig<R extends DefaultRow = any> {\r\n /** 字段名 */\r\n key: string\r\n /** 列类型 */\r\n type?: ColumnType | string\r\n /** 列标题 */\r\n label?: string\r\n /** 是否显示 */\r\n visible?: boolean\r\n /** 是否在列控制中显示 */\r\n inControl?: boolean\r\n /** el-table-column 原生属性 */\r\n columnProps?: Partial<TableColumnCtx<R>>\r\n /** 插槽名称(type 为 slot 时使用,默认用 key) */\r\n slot?: string\r\n /** 渲染器/组件属性 */\r\n props?: Record<string, any>\r\n}\r\n\r\n/** Selection 列 */\r\nexport interface SelectionColumn<R extends DefaultRow = any> extends BaseColumnConfig<R> {\r\n type: 'selection'\r\n}\r\n\r\n/** Index 列 */\r\nexport interface IndexColumn<R extends DefaultRow = any> extends BaseColumnConfig<R> {\r\n type: 'index'\r\n}\r\n\r\n/** Operation 列 */\r\nexport interface OperationColumn<R extends DefaultRow = any> extends BaseColumnConfig<R> {\r\n type: 'operation'\r\n buttons: ButtonConfig<R>[]\r\n /** 最大显示按钮数 */\r\n maxbtn?: number\r\n}\r\n\r\n/** 数据列 */\r\nexport interface DataColumn<R extends DefaultRow = any> extends BaseColumnConfig<R> {\r\n type?: Exclude<ColumnType, 'selection' | 'index' | 'operation'> | string\r\n /**\r\n * 格式化函数(type 为 formatter 时使用)\r\n */\r\n formatter?: (value: any, row: R, index: number) => any\r\n}\r\n\r\n/** 列配置联合类型 */\r\nexport type ColumnConfig<R extends DefaultRow = any> =\r\n | SelectionColumn<R>\r\n | IndexColumn<R>\r\n | OperationColumn<R>\r\n | DataColumn<R>\r\n\r\n/* ======================= 组件 Props ======================= */\r\n\r\n/**\r\n * SmartTable 组件 Props 接口\r\n */\r\nexport interface SmartTableProps<R extends DefaultRow = any> {\r\n /** 表格数据 */\r\n data: R[]\r\n /** 列配置 */\r\n columns: ColumnConfig<R>[]\r\n /** 行数据的唯一标识字段,默认 'id' */\r\n rowKey?: string\r\n /** 是否显示加载状态 */\r\n loading?: boolean\r\n /** 权限列表,用于操作列按钮权限控制 */\r\n permissions?: string[]\r\n /** 列配置缓存 key,用于持久化列显隐配置 */\r\n cacheKey?: string\r\n /** 分页配置,用于序号列计算 */\r\n pagination?: PaginationConfig\r\n}\r\n\r\n/**\r\n * SmartTable 组件 Emits 接口\r\n */\r\nexport interface SmartTableEmits<R extends DefaultRow = any> {\r\n /** 列配置更新(v-model:columns) */\r\n (e: 'update:columns', columns: ColumnConfig<R>[]): void\r\n /** 单元格值变更 */\r\n (e: 'cellChange', row: R, col: ColumnConfig<R>): void\r\n /** 单元格失焦 */\r\n (e: 'cellBlur', row: R, col: ColumnConfig<R>): void\r\n /** 单元格回车 */\r\n (e: 'cellEnter', row: R, col: ColumnConfig<R>): void\r\n /** 单元格点击(button 类型) */\r\n (e: 'cellClick', row: R, col: ColumnConfig<R>): void\r\n}\r\n\r\n/* ======================= 辅助类型 ======================= */\r\n\r\n/** 特殊列类型 */\r\nexport type SpecialColumnType = 'selection' | 'index' | 'operation'\r\n\r\n/** 判断是否为特殊列 */\r\nexport function isSpecialColumn(type?: string): type is SpecialColumnType {\r\n return type === 'selection' || type === 'index' || type === 'operation'\r\n}\r\n\r\n/** 判断是否为渲染器类型 */\r\nexport function isRendererType(type?: string): boolean {\r\n if (!type) return false\r\n return !isSpecialColumn(type)\r\n}\r\n\r\n/** 判断是否为 operation 列 */\r\nexport function isOperationColumn<R extends DefaultRow = any>(col: ColumnConfig<R>): col is OperationColumn<R> {\r\n return col.type === 'operation'\r\n}\r\n","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=\"inputProps\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @change=\"onChange\"\n @input=\"onInput\"\n @keyup.enter=\"onEnter\"\n @clear=\"onClear\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, computed } 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\n// 合并默认属性和用户自定义属性\nconst inputProps = computed(() => {\n const rp = props.col.props || {}\n const { onBlur, onFocus, onChange, onInput, onClear, onEnter, ...rest } = rp\n return {\n placeholder: '',\n size: 'small' as const,\n clearable: true,\n ...rest\n }\n})\n\nwatch(value, (v) => {\n setValueByPath(props.row, props.col.key, v)\n})\n\nconst onChange = (val: string) => {\n props.onCellChange?.(props.row, props.col)\n props.col.props?.onChange?.(val, props.row, props.col)\n}\n\nconst onBlur = (e: FocusEvent) => {\n props.onCellBlur?.(props.row, props.col)\n props.col.props?.onBlur?.(e, props.row, props.col)\n}\n\nconst onFocus = (e: FocusEvent) => {\n props.col.props?.onFocus?.(e, props.row, props.col)\n}\n\nconst onInput = (val: string) => {\n props.col.props?.onInput?.(val, props.row, props.col)\n}\n\nconst onEnter = (e: KeyboardEvent) => {\n props.onCellEnter?.(props.row, props.col)\n props.col.props?.onEnter?.(e, props.row, props.col)\n}\n\nconst onClear = () => {\n props.col.props?.onClear?.(props.row, props.col)\n}\n</script>\n","<template>\n <el-input-number\n v-model=\"value\"\n v-bind=\"inputProps\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @change=\"onChange\"\n @keyup.enter=\"onEnter\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, computed } 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\n// 合并默认属性和用户自定义属性\nconst inputProps = computed(() => {\n const rp = props.col.props || {}\n const { onBlur, onFocus, onChange, onEnter, ...rest } = rp\n return {\n min: 0,\n max: 99999,\n controls: false,\n size: 'small' as const,\n ...rest\n }\n})\n\nwatch(value, (v) => {\n setValueByPath(props.row, props.col.key, v)\n})\n\nconst onChange = (val: number | undefined, oldVal: number | undefined) => {\n props.onCellChange?.(props.row, props.col)\n props.col.props?.onChange?.(val, oldVal, props.row, props.col)\n}\n\nconst onBlur = (e: FocusEvent) => {\n props.onCellBlur?.(props.row, props.col)\n props.col.props?.onBlur?.(e, props.row, props.col)\n}\n\nconst onFocus = (e: FocusEvent) => {\n props.col.props?.onFocus?.(e, props.row, props.col)\n}\n\nconst onEnter = (e: KeyboardEvent) => {\n props.onCellEnter?.(props.row, props.col)\n props.col.props?.onEnter?.(e, props.row, props.col)\n}\n</script>\n","<template>\n <el-select\n v-model=\"value\"\n v-bind=\"selectProps\"\n @change=\"onChange\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @visible-change=\"onVisibleChange\"\n @clear=\"onClear\"\n @keyup.enter=\"onEnter\"\n >\n <el-option\n v-for=\"opt in options\"\n :key=\"opt.value\"\n :label=\"opt.label\"\n :value=\"opt.value\"\n :disabled=\"opt.disabled\"\n />\n </el-select>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, computed } 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\n// 合并默认属性和用户自定义属性\nconst selectProps = computed(() => {\n const rp = props.col.props || {}\n const { options, onChange, onBlur, onFocus, onVisibleChange, onClear, onEnter, ...rest } = rp\n return {\n placeholder: '请选择',\n size: 'small' as const,\n clearable: true,\n ...rest\n }\n})\n\n// 选项列表\nconst options = computed(() => {\n const rp = props.col.props || {}\n return rp.options || []\n})\n\nwatch(value, (v) => {\n setValueByPath(props.row, props.col.key, v)\n})\n\nconst onChange = (val: any) => {\n props.onCellChange?.(props.row, props.col)\n props.col.props?.onChange?.(val, props.row, props.col)\n}\n\nconst onBlur = (e: FocusEvent) => {\n props.onCellBlur?.(props.row, props.col)\n props.col.props?.onBlur?.(e, props.row, props.col)\n}\n\nconst onFocus = (e: FocusEvent) => {\n props.col.props?.onFocus?.(e, props.row, props.col)\n}\n\nconst onVisibleChange = (visible: boolean) => {\n props.col.props?.onVisibleChange?.(visible, props.row, props.col)\n}\n\nconst onClear = () => {\n props.col.props?.onClear?.(props.row, props.col)\n}\n\nconst onEnter = (e: KeyboardEvent) => {\n props.onCellEnter?.(props.row, props.col)\n props.col.props?.onEnter?.(e, props.row, props.col)\n}\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 * 提取 props 中的事件(on 开头的属性)\r\n */\r\nconst extractEvents = (rp: Record<string, any>) => {\r\n const events: Record<string, any> = {}\r\n const props: Record<string, any> = {}\r\n \r\n Object.keys(rp).forEach(key => {\r\n if (key.startsWith('on') && typeof rp[key] === 'function') {\r\n events[key] = rp[key]\r\n } else {\r\n props[key] = rp[key]\r\n }\r\n })\r\n \r\n return { events, props }\r\n}\r\n\r\n/**\r\n * button 渲染�?\r\n */\r\nconst button = createFunctionalRenderer((props) => {\r\n const rp = props.col.props || {}\r\n const val = getValueByPath(props.row, props.col.key)\r\n const { events, props: restProps } = extractEvents(rp)\r\n \r\n return h(ElButton as any, {\r\n type: 'primary',\r\n ...restProps,\r\n ...events,\r\n onClick: (e: Event) => {\r\n props.onClick?.(props.row, props.col)\r\n // 支持用户自定�?onClick\r\n rp.onClick?.(e, props.row, props.col)\r\n }\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.props || {}\r\n const val = getValueByPath(props.row, props.col.key)\r\n const { href, blank, label, ...restProps } = rp\r\n \r\n return h('a', {\r\n href: href || val || '#',\r\n target: blank ? '_blank' : '_self',\r\n rel: blank ? 'noopener noreferrer' : undefined,\r\n style: 'color:#409EFF;cursor:pointer;text-decoration:none;',\r\n ...restProps,\r\n }, 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 const rp = props.col?.props || {}\r\n const { style, class: className, ...restProps } = rp\r\n \r\n return h('div', {\r\n class: className || 'line-clamp-2',\r\n style,\r\n innerHTML: val ?? '',\r\n ...restProps\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.props ?? {}\r\n const { iconColor, copyTitle, successText, errorText, lineClamp, textStyles, textClass, ...restProps } = rp\r\n \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': iconColor || '#409EFF',\r\n 'user-select': 'none'\r\n }\r\n const textStyleObj = {\r\n 'padding-right': '10px',\r\n 'display': '-webkit-box',\r\n '-webkit-box-orient': 'vertical',\r\n '-webkit-line-clamp': lineClamp ?? 2,\r\n 'overflow': 'hidden',\r\n ...textStyles\r\n }\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 ...restProps\r\n },\r\n [\r\n h('span', {\r\n class: `st_copy_text ${textClass ?? ''}`,\r\n style: textStyleObj,\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: 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(successText ?? '复制成功')\r\n }).catch(() => {\r\n ElMessage.error(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(successText ?? '复制成功')\r\n } else {\r\n ElMessage.error(errorText ?? '复制失败')\r\n }\r\n }\r\n } catch (err) {\r\n ElMessage.error(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?.props || {}\r\n const { width, height, fit, previewSrcList, placeholder, style, ...restProps } = rp\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 placeholder || ''\r\n }\r\n\r\n const defaultStyle = {\r\n width: width || '80px',\r\n height: height || '80px',\r\n marginRight: imageList.length > 1 ? '4px' : '0',\r\n ...(typeof style === 'object' ? style : {})\r\n }\r\n\r\n const imageProps = {\r\n previewSrcList: previewSrcList || imageList,\r\n previewTeleported: true, \r\n fit: fit || 'contain',\r\n style: defaultStyle,\r\n ...restProps\r\n }\r\n\r\n if (imageList.length === 1) {\r\n return h(ElImage, {\r\n src: imageList[0],\r\n ...imageProps\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 ...imageProps\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.props || {}\r\n const { options = [], showValue = false, ...restProps } = rp\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: string) => !options.some((opt: any) => String(opt.value) === v))\r\n\r\n const children = matchedOptions.map((item: any) => {\r\n const { listClass, cssClass, tagProps, ...itemRest } = item\r\n return h(\r\n ElTag,\r\n { \r\n key: item.value, \r\n type: listClass, \r\n class: cssClass, \r\n disableTransitions: true,\r\n ...restProps,\r\n ...tagProps\r\n },\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', { style: 'display: inline-flex; gap: 4px; flex-wrap: wrap;' }, 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 rp = props.col.props || {}\r\n const { options = {}, ...restProps } = rp\r\n const mappedVal = val != null ? options[val] ?? '' : ''\r\n \r\n return h('span', { ...restProps }, mappedVal)\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 const rp = props.col.props || {}\r\n \r\n let content = val\r\n if (isDataColumn(col)) {\r\n content = col.formatter?.(val, row, index) ?? val\r\n }\r\n \r\n return h('span', { ...rp }, content)\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.props || {}\r\n const { style, size, class: className, ...restProps } = rp\r\n \r\n if (!val) return ''\r\n \r\n const iconSize = size ? `${size}px` : '20px'\r\n \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', ...(typeof style === 'object' ? style : {}) },\r\n ...restProps\r\n })\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 class: className,\r\n style: { \r\n width: '40px', \r\n height: '40px', \r\n display: 'inline-block',\r\n ...(typeof style === 'object' ? style : {})\r\n },\r\n ...restProps\r\n })\r\n }\r\n \r\n // 默认当作 iconfont\r\n return h('i', {\r\n class: [val, className].filter(Boolean).join(' '),\r\n style: { \r\n fontSize: iconSize,\r\n ...(typeof style === 'object' ? style : {})\r\n },\r\n ...restProps\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","/**\r\n * 全局配置管理\r\n */\r\nimport type { SmartTableConfig } from './types'\r\nimport { getRendererManager } from './renderer'\r\nimport { registerBuiltInRenderers } from './renderers'\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 private _initialized = false\r\n\r\n /**\r\n * 是否已初始化\r\n */\r\n get initialized(): boolean {\r\n return this._initialized\r\n }\r\n\r\n /**\r\n * 初始化(注册内置渲染器)\r\n */\r\n init(): void {\r\n if (this._initialized) return\r\n registerBuiltInRenderers(getRendererManager())\r\n this._initialized = true\r\n }\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 // 初始化内置渲染器\r\n manager.init()\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","<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 <template v-for=\"(col, idx) in visibleColumns\" :key=\"getColumnKey(col, idx)\">\r\n <!-- ========== selection 列 ========== -->\r\n <el-table-column\r\n v-if=\"col.type === '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-else-if=\"col.type === '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-else-if=\"col.type === 'operation' && isOperationVisible(col)\"\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-else\r\n :label=\"col.label\"\r\n align=\"center\"\r\n v-bind=\"col.columnProps || {}\"\r\n >\r\n <template #default=\"scope\">\r\n <!-- slot 类型 -->\r\n <template v-if=\"col.type === 'slot'\">\r\n <slot v-if=\"scope.$index >= 0\" :name=\"col.slot || col.key\" v-bind=\"scope\" />\r\n </template>\r\n\r\n <!-- 渲染器类型 -->\r\n <component\r\n v-else-if=\"col.type && renderer[col.type]\"\r\n :is=\"renderer[col.type]\"\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 <!-- 默认文本 -->\r\n <span v-else\r\n :style=\"col.props?.style || ''\"\r\n :class=\"col.props?.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 </template>\r\n </el-table>\r\n</template>\r\n\r\n<script setup lang=\"ts\" name=\"SmartTable\">\r\n import { ref, watch, computed } from 'vue'\r\n import type { ColumnConfig, SmartTableProps, SmartTableEmits, OperationColumn } from './types'\r\n import { isSpecialColumn, isOperationColumn } 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 { getConfigManager } from './config'\r\n import { getValueByPath } from './utils/path'\r\n\r\n // Props 定义\r\n const props = withDefaults(defineProps<SmartTableProps>(), {\r\n data: () => [],\r\n columns: () => [],\r\n rowKey: 'id',\r\n loading: false,\r\n permissions: () => [],\r\n pagination: () => ({}),\r\n })\r\n\r\n // Emits 定义\r\n const emit = defineEmits<SmartTableEmits>()\r\n\r\n // ------------------ 初始化渲染器(仅首次) ------------------\r\n getConfigManager().init()\r\n\r\n // ------------------ columns 处理 ------------------\r\n const { columns: cachedColumns } = useTableColumns(props.columns, {\r\n cacheKey: props.cacheKey ?? '',\r\n })\r\n \r\n // 标记是否已初始化,避免初始化时触发不必要的更新\r\n const isInitialized = ref(false)\r\n watch(\r\n cachedColumns,\r\n (val: ColumnConfig[]) => {\r\n if (isInitialized.value) {\r\n emit(\"update:columns\", val)\r\n }\r\n isInitialized.value = true\r\n },\r\n { deep: true, immediate: true },\r\n )\r\n\r\n // ------------------ 列处理 ------------------\r\n \r\n // 可见列(按用户配置顺序)\r\n const visibleColumns = computed(() =>\r\n cachedColumns.value.filter(col => {\r\n // 特殊列始终显示\r\n if (isSpecialColumn(col.type)) return true\r\n // 数据列根据 visible 控制\r\n return col.visible !== false\r\n })\r\n )\r\n\r\n // 生成列的唯一 key\r\n const getColumnKey = (col: ColumnConfig, idx: number) => {\r\n if (col.type === 'selection') return `selection-${idx}`\r\n if (col.type === 'index') return `index-${idx}`\r\n if (col.type === 'operation') return `operation-${col.key}-${idx}`\r\n return `${col.key}-${idx}`\r\n }\r\n\r\n // operation 列集合(用于 hook 管理)\r\n const operationColumns = computed(() =>\r\n cachedColumns.value.filter(col => col.type === 'operation')\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 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 (!props.data?.length) return hook.optWidth.value\r\n // 有行数据,取最大宽度\r\n return hook.getMaxOptWidth(props.data)\r\n }\r\n\r\n const getVisibleButtons = (col: OperationColumn, row: any) => {\r\n const hook = getOperationColumnHook(col)\r\n if (!hook) return []\r\n\r\n const buttons = col.buttons || []\r\n if (!buttons.length) return []\r\n\r\n return hook.getVisibleButtons(row)\r\n }\r\n\r\n // 判断 operation 列是否应该显示\r\n const isOperationVisible = (col: ColumnConfig) => {\r\n if (!isOperationColumn(col)) return false\r\n \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 if (!props.data?.length) return hook.hasAnyButton.value\r\n\r\n return hook.hasAnyVisibleButton(props.data)\r\n }\r\n\r\n // ------------------ 事件封装 ------------------\r\n const handleCellChange = (row: any, col: ColumnConfig) => {\r\n emit('cellChange', row, col)\r\n }\r\n const handleCellBlur = (row: any, col: ColumnConfig) => {\r\n emit('cellBlur', row, col)\r\n }\r\n const handleCellEnter = (row: any, col: ColumnConfig) => {\r\n emit('cellEnter', row, col)\r\n }\r\n const handleCellClick = (row: any, col: ColumnConfig) => {\r\n if (!col) return\r\n emit('cellClick', 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 { ColumnConfig, ColumnType } 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 ColumnType> =\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":["isSpecialColumn","type","isRendererType","isOperationColumn","col","mergeColumns","defaultColumns","cacheColumns","cacheMap","c","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","inputProps","rp","onBlur","onFocus","onChange","onInput","onClear","onEnter","rest","v","val","_a","_c","_b","e","_openBlock","_createBlock","_component_el_input","_mergeProps","$event","oldVal","_component_el_input_number","selectProps","onVisibleChange","visible","_component_el_select","_createElementBlock","_Fragment","_renderList","opt","_component_el_option","input","EditableInput","inputNumber","EditableNumber","select","EditableSelect","extractEvents","events","button","restProps","ElButton","link","href","blank","label","html","style","className","copy","iconColor","copyTitle","successText","errorText","lineClamp","textStyles","textClass","butStyle","textStyleObj","ElMessage","textarea","successful","DocumentCopy","img","width","height","fit","previewSrcList","placeholder","imageList","item","defaultStyle","imageProps","ElImage","CopyDocument","dict","showValue","values","matchedOptions","unmatched","children","listClass","cssClass","tagProps","itemRest","ElTag","map","mappedVal","isDataColumn","formatter","index","content","icon","size","iconSize","builtInRenderers","registerBuiltInRenderers","registry","createRenderer","defaultConfig","ConfigManager","config","source","result","globalConfigManager","getConfigManager","setSmartTableConfig","getSmartTableConfig","emit","__emit","cachedColumns","isInitialized","visibleColumns","getColumnKey","idx","operationColumns","computeIndex","page","manager","allRenderers","r","operationColumnMap","hook","getOperationColumnHook","getOperationWidth","getVisibleButtons","isOperationVisible","handleCellChange","handleCellBlur","handleCellEnter","handleCellClick","tableRef","__expose","_withDirectives","_component_el_table","$attrs","_component_el_table_column","_withCtx","$index","_createTextVNode","_toDisplayString","_component_el_button","scope","_renderSlot","_ctx","_resolveDynamicComponent","_normalizeStyle","_normalizeClass","_unref","_hoisted_1","defineColumn"],"mappings":"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"}
1
+ {"version":3,"file":"vue3-smart-table.es.js","sources":["../src/components/SmartTable/types.ts","../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/config.ts","../src/components/SmartTable/index.vue","../src/types/enhanced.ts"],"sourcesContent":["import type { ButtonProps, TableColumnCtx } from 'element-plus'\r\nimport { DefaultRow } from 'element-plus/es/components/table/src/table/defaults'\r\nimport type { Component } from 'vue'\r\n\r\n// 导出验证函数类型\r\nexport type { validateRendererProps } from './renderer'\r\n\r\n/* ======================= 基础工具类型 ======================= */\r\n\r\n/** 支持额外参数(Element Plus 透传 props) */\r\nexport type WithRestProps<T> = T & {\r\n [key: string]: any\r\n}\r\n\r\n/* ======================= 渲染器系统 ======================= */\r\n\r\n/** Renderer 组件类型 */\r\nexport type Renderer = Component\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\nexport interface SmartTableConfig {\r\n /** 自定义渲染器 */\r\n renderers?: Record<string, Renderer>\r\n /** 默认分页配置 */\r\n defaultPagination?: {\r\n page?: number\r\n size?: number\r\n total?: number\r\n }\r\n /** 默认表格属性 */\r\n defaultTableProps?: Record<string, any>\r\n /** 默认列属性 */\r\n defaultColumnProps?: Record<string, any>\r\n}\r\n\r\n/* ======================= 分页配置 ======================= */\r\n\r\n/** 分页配置接口 */\r\nexport interface PaginationConfig {\r\n /** 当前页码 */\r\n page?: number\r\n /** 每页条数 */\r\n size?: number\r\n /** 总条数 */\r\n total?: number\r\n}\r\n\r\n/* ======================= 操作列按钮 ======================= */\r\n\r\nexport interface ButtonConfig<R = any> {\r\n permission?: string | string[]\r\n label: string\r\n type?: 'primary' | 'success' | 'warning' | 'danger' | 'info'\r\n action: (row: R) => void\r\n visible?: (row: R) => boolean\r\n width?: number\r\n}\r\n\r\n/* ======================= 列类型 ======================= */\r\n\r\n/**\r\n * 列类型枚举\r\n * 包含特殊列类型和渲染器类型\r\n */\r\nexport type ColumnType =\r\n // 特殊列\r\n | 'selection'\r\n | 'index'\r\n | 'operation'\r\n // 内置渲染器\r\n | 'input'\r\n | 'input-number'\r\n | 'select'\r\n | 'dict'\r\n | 'map'\r\n | 'img'\r\n | 'link'\r\n | 'button'\r\n | 'copy'\r\n | 'html'\r\n | 'formatter'\r\n | 'icon'\r\n | 'slot'\r\n\r\n/* ======================= Props 类型映射 ======================= */\r\n\r\n/** 各类型对应的 props */\r\nexport interface ColumnPropsMap {\r\n // 特殊列\r\n selection: {}\r\n index: {}\r\n operation: {}\r\n\r\n // 渲染器\r\n html: WithRestProps<{\r\n style?: string | Record<string, any>\r\n class?: string\r\n }>\r\n\r\n copy: WithRestProps<{\r\n iconColor?: string\r\n copyTitle?: string\r\n successText?: string\r\n errorText?: string\r\n lineClamp?: number\r\n textStyles?: Record<string, any>\r\n textClass?: string\r\n }>\r\n\r\n img: WithRestProps<{\r\n width?: string | number\r\n height?: string | number\r\n fit?: 'contain' | 'cover' | 'fill' | 'none' | 'scale-down'\r\n previewSrcList?: string[]\r\n placeholder?: string\r\n style?: string | Record<string, any>\r\n }>\r\n\r\n dict: WithRestProps<{\r\n options: Array<{\r\n label: string\r\n value: string | number\r\n listClass?: string\r\n cssClass?: string\r\n tagProps?: Record<string, any>\r\n }>\r\n showValue?: boolean\r\n }>\r\n\r\n map: WithRestProps<{\r\n options: Record<string | number, any>\r\n }>\r\n\r\n formatter: WithRestProps<{}>\r\n\r\n icon: WithRestProps<{\r\n style?: string | Record<string, any>\r\n size?: number\r\n class?: string\r\n }>\r\n\r\n input: WithRestProps<{\r\n placeholder?: string\r\n size?: 'small' | 'default' | 'large'\r\n clearable?: boolean\r\n maxlength?: number\r\n showWordLimit?: boolean\r\n disabled?: boolean\r\n // 事件\r\n onChange?: (val: string, row: any, col: any) => void\r\n onBlur?: (e: FocusEvent, row: any, col: any) => void\r\n onFocus?: (e: FocusEvent, row: any, col: any) => void\r\n onInput?: (val: string, row: any, col: any) => void\r\n onClear?: (row: any, col: any) => void\r\n onEnter?: (e: KeyboardEvent, row: any, col: any) => void\r\n }>\r\n\r\n 'input-number': WithRestProps<{\r\n min?: number\r\n max?: number\r\n step?: number\r\n precision?: number\r\n size?: 'small' | 'default' | 'large'\r\n controls?: boolean\r\n disabled?: boolean\r\n // 事件\r\n onChange?: (val: number | undefined, oldVal: number | undefined, row: any, col: any) => void\r\n onBlur?: (e: FocusEvent, row: any, col: any) => void\r\n onFocus?: (e: FocusEvent, row: any, col: any) => void\r\n onEnter?: (e: KeyboardEvent, row: any, col: any) => void\r\n }>\r\n\r\n select: WithRestProps<{\r\n options: Array<{\r\n label: string\r\n value: string | number\r\n disabled?: boolean\r\n }>\r\n placeholder?: string\r\n size?: 'small' | 'default' | 'large'\r\n clearable?: boolean\r\n filterable?: boolean\r\n multiple?: boolean\r\n disabled?: boolean\r\n // 事件\r\n onChange?: (val: any, row: any, col: any) => void\r\n onBlur?: (e: FocusEvent, row: any, col: any) => void\r\n onFocus?: (e: FocusEvent, row: any, col: any) => void\r\n onVisibleChange?: (visible: boolean, row: any, col: any) => void\r\n onClear?: (row: any, col: any) => void\r\n }>\r\n\r\n button: WithRestProps<ButtonProps & {\r\n label?: string\r\n style?: string | Record<string, any>\r\n class?: string\r\n onClick?: (e: Event, row: any, col: any) => void\r\n }>\r\n\r\n link: WithRestProps<{\r\n label?: string\r\n href?: string\r\n blank?: boolean\r\n style?: string | Record<string, any>\r\n class?: string\r\n }>\r\n\r\n slot: {}\r\n}\r\n\r\n/* ======================= ColumnConfig ======================= */\r\n\r\n/** 列配置基础接口 */\r\nexport interface BaseColumnConfig<R extends DefaultRow = any> {\r\n /** 字段名 */\r\n key: string\r\n /** 列类型 */\r\n type?: ColumnType | string\r\n /** 列标题 */\r\n label?: string\r\n /** 是否显示 */\r\n visible?: boolean\r\n /** 是否在列控制中显示 */\r\n inControl?: boolean\r\n /** el-table-column 原生属性 */\r\n columnProps?: Partial<TableColumnCtx<R>>\r\n /** 插槽名称(type 为 slot 时使用,默认用 key) */\r\n slot?: string\r\n /** 渲染器/组件属性 */\r\n props?: Record<string, any>\r\n}\r\n\r\n/** Selection 列 */\r\nexport interface SelectionColumn<R extends DefaultRow = any> extends BaseColumnConfig<R> {\r\n type: 'selection'\r\n}\r\n\r\n/** Index 列 */\r\nexport interface IndexColumn<R extends DefaultRow = any> extends BaseColumnConfig<R> {\r\n type: 'index'\r\n}\r\n\r\n/** Operation 列 */\r\nexport interface OperationColumn<R extends DefaultRow = any> extends BaseColumnConfig<R> {\r\n type: 'operation'\r\n buttons: ButtonConfig<R>[]\r\n /** 最大显示按钮数 */\r\n maxbtn?: number\r\n}\r\n\r\n/** 数据列 */\r\nexport interface DataColumn<R extends DefaultRow = any> extends BaseColumnConfig<R> {\r\n type?: Exclude<ColumnType, 'selection' | 'index' | 'operation'> | string\r\n /**\r\n * 格式化函数(type 为 formatter 时使用)\r\n */\r\n formatter?: (value: any, row: R, index: number) => any\r\n}\r\n\r\n/** 列配置联合类型 */\r\nexport type ColumnConfig<R extends DefaultRow = any> =\r\n | SelectionColumn<R>\r\n | IndexColumn<R>\r\n | OperationColumn<R>\r\n | DataColumn<R>\r\n\r\n/* ======================= 组件 Props ======================= */\r\n\r\n/**\r\n * SmartTable 组件 Props 接口\r\n */\r\nexport interface SmartTableProps<R extends DefaultRow = any> {\r\n /** 表格数据 */\r\n data: R[]\r\n /** 列配置 */\r\n columns: ColumnConfig<R>[]\r\n /** 行数据的唯一标识字段,默认 'id' */\r\n rowKey?: string\r\n /** 是否显示加载状态 */\r\n loading?: boolean\r\n /** 权限列表,用于操作列按钮权限控制 */\r\n permissions?: string[]\r\n /** 列配置缓存 key,用于持久化列显隐配置 */\r\n cacheKey?: string\r\n /** 分页配置,用于序号列计算 */\r\n pagination?: PaginationConfig\r\n}\r\n\r\n/**\r\n * SmartTable 组件 Emits 接口\r\n */\r\nexport interface SmartTableEmits<R extends DefaultRow = any> {\r\n /** 列配置更新(v-model:columns) */\r\n (e: 'update:columns', columns: ColumnConfig<R>[]): void\r\n /** 单元格值变更 */\r\n (e: 'cellChange', row: R, col: ColumnConfig<R>): void\r\n /** 单元格失焦 */\r\n (e: 'cellBlur', row: R, col: ColumnConfig<R>): void\r\n /** 单元格回车 */\r\n (e: 'cellEnter', row: R, col: ColumnConfig<R>): void\r\n /** 单元格点击(button 类型) */\r\n (e: 'cellClick', row: R, col: ColumnConfig<R>): void\r\n}\r\n\r\n/* ======================= 辅助类型 ======================= */\r\n\r\n/** 特殊列类型 */\r\nexport type SpecialColumnType = 'selection' | 'index' | 'operation'\r\n\r\n/** 判断是否为特殊列 */\r\nexport function isSpecialColumn(type?: string): type is SpecialColumnType {\r\n return type === 'selection' || type === 'index' || type === 'operation'\r\n}\r\n\r\n/** 判断是否为渲染器类型 */\r\nexport function isRendererType(type?: string): boolean {\r\n if (!type) return false\r\n return !isSpecialColumn(type)\r\n}\r\n\r\n/** 判断是否为 operation 列 */\r\nexport function isOperationColumn<R extends DefaultRow = any>(col: ColumnConfig<R>): col is OperationColumn<R> {\r\n return col.type === 'operation'\r\n}\r\n","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>\r\n <el-input\r\n v-model=\"value\"\r\n v-bind=\"inputProps\"\r\n @blur=\"onBlur\"\r\n @focus=\"onFocus\"\r\n @change=\"onChange\"\r\n @input=\"onInput\"\r\n @keyup.enter=\"onEnter\"\r\n @clear=\"onClear\"\r\n />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, watch, computed } from 'vue'\r\nimport type { ColumnConfig } from '../types'\r\nimport { getValueByPath, setValueByPath } from '../utils/path'\r\n\r\ninterface Props {\r\n readonly row: any\r\n readonly col: ColumnConfig\r\n readonly index: number\r\n onCellChange?: (row: any, col: ColumnConfig) => void\r\n onCellBlur?: (row: any, col: ColumnConfig) => void\r\n onCellEnter?: (row: any, col: ColumnConfig) => void\r\n}\r\n\r\nconst props = defineProps<Props>()\r\nconst value = ref(getValueByPath(props.row, props.col.key))\r\n\r\n// 合并默认属性和用户自定义属性\r\nconst inputProps = computed(() => {\r\n const rp = props.col.props || {}\r\n const { onBlur, onFocus, onChange, onInput, onClear, onEnter, ...rest } = rp\r\n return {\r\n placeholder: '',\r\n size: 'small' as const,\r\n clearable: true,\r\n ...rest\r\n }\r\n})\r\n\r\nwatch(value, (v) => {\r\n setValueByPath(props.row, props.col.key, v)\r\n})\r\n\r\nconst onChange = (val: string) => {\r\n props.onCellChange?.(props.row, props.col)\r\n props.col.props?.onChange?.(val, props.row, props.col)\r\n}\r\n\r\nconst onBlur = (e: FocusEvent) => {\r\n props.onCellBlur?.(props.row, props.col)\r\n props.col.props?.onBlur?.(e, props.row, props.col)\r\n}\r\n\r\nconst onFocus = (e: FocusEvent) => {\r\n props.col.props?.onFocus?.(e, props.row, props.col)\r\n}\r\n\r\nconst onInput = (val: string) => {\r\n props.col.props?.onInput?.(val, props.row, props.col)\r\n}\r\n\r\nconst onEnter = (e: KeyboardEvent) => {\r\n props.onCellEnter?.(props.row, props.col)\r\n props.col.props?.onEnter?.(e, props.row, props.col)\r\n}\r\n\r\nconst onClear = () => {\r\n props.col.props?.onClear?.(props.row, props.col)\r\n}\r\n</script>\r\n","<template>\r\n <el-input-number\r\n v-model=\"value\"\r\n v-bind=\"inputProps\"\r\n @blur=\"onBlur\"\r\n @focus=\"onFocus\"\r\n @change=\"onChange\"\r\n @keyup.enter=\"onEnter\"\r\n />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, watch, computed } from 'vue'\r\nimport type { ColumnConfig } from '../types'\r\nimport { getValueByPath, setValueByPath } from '../utils/path'\r\n\r\ninterface Props {\r\n readonly row: any\r\n readonly col: ColumnConfig\r\n readonly index: number\r\n onCellChange?: (row: any, col: ColumnConfig) => void\r\n onCellBlur?: (row: any, col: ColumnConfig) => void\r\n onCellEnter?: (row: any, col: ColumnConfig) => void\r\n}\r\n\r\nconst props = defineProps<Props>()\r\nconst value = ref(getValueByPath(props.row, props.col.key))\r\n\r\n// 合并默认属性和用户自定义属性\r\nconst inputProps = computed(() => {\r\n const rp = props.col.props || {}\r\n const { onBlur, onFocus, onChange, onEnter, ...rest } = rp\r\n return {\r\n min: 0,\r\n max: 99999,\r\n controls: false,\r\n size: 'small' as const,\r\n ...rest\r\n }\r\n})\r\n\r\nwatch(value, (v) => {\r\n setValueByPath(props.row, props.col.key, v)\r\n})\r\n\r\nconst onChange = (val: number | undefined, oldVal: number | undefined) => {\r\n props.onCellChange?.(props.row, props.col)\r\n props.col.props?.onChange?.(val, oldVal, props.row, props.col)\r\n}\r\n\r\nconst onBlur = (e: FocusEvent) => {\r\n props.onCellBlur?.(props.row, props.col)\r\n props.col.props?.onBlur?.(e, props.row, props.col)\r\n}\r\n\r\nconst onFocus = (e: FocusEvent) => {\r\n props.col.props?.onFocus?.(e, props.row, props.col)\r\n}\r\n\r\nconst onEnter = (e: KeyboardEvent) => {\r\n props.onCellEnter?.(props.row, props.col)\r\n props.col.props?.onEnter?.(e, props.row, props.col)\r\n}\r\n</script>\r\n","<template>\r\n <el-select\r\n v-model=\"value\"\r\n v-bind=\"selectProps\"\r\n @change=\"onChange\"\r\n @blur=\"onBlur\"\r\n @focus=\"onFocus\"\r\n @visible-change=\"onVisibleChange\"\r\n @clear=\"onClear\"\r\n @keyup.enter=\"onEnter\"\r\n >\r\n <el-option\r\n v-for=\"opt in options\"\r\n :key=\"opt.value\"\r\n :label=\"opt.label\"\r\n :value=\"opt.value\"\r\n :disabled=\"opt.disabled\"\r\n />\r\n </el-select>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, watch, computed } from 'vue'\r\nimport type { ColumnConfig } from '../types'\r\nimport { getValueByPath, setValueByPath } from '../utils/path'\r\n\r\ninterface Props {\r\n readonly row: any\r\n readonly col: ColumnConfig\r\n readonly index: number\r\n onCellChange?: (row: any, col: ColumnConfig) => void\r\n onCellBlur?: (row: any, col: ColumnConfig) => void\r\n onCellEnter?: (row: any, col: ColumnConfig) => void\r\n}\r\n\r\nconst props = defineProps<Props>()\r\nconst value = ref(getValueByPath(props.row, props.col.key))\r\n\r\n// 合并默认属性和用户自定义属性\r\nconst selectProps = computed(() => {\r\n const rp = props.col.props || {}\r\n const { options, onChange, onBlur, onFocus, onVisibleChange, onClear, onEnter, ...rest } = rp\r\n return {\r\n placeholder: '请选择',\r\n size: 'small' as const,\r\n clearable: true,\r\n ...rest\r\n }\r\n})\r\n\r\n// 选项列表\r\nconst options = computed(() => {\r\n const rp = props.col.props || {}\r\n return rp.options || []\r\n})\r\n\r\nwatch(value, (v) => {\r\n setValueByPath(props.row, props.col.key, v)\r\n})\r\n\r\nconst onChange = (val: any) => {\r\n props.onCellChange?.(props.row, props.col)\r\n props.col.props?.onChange?.(val, props.row, props.col)\r\n}\r\n\r\nconst onBlur = (e: FocusEvent) => {\r\n props.onCellBlur?.(props.row, props.col)\r\n props.col.props?.onBlur?.(e, props.row, props.col)\r\n}\r\n\r\nconst onFocus = (e: FocusEvent) => {\r\n props.col.props?.onFocus?.(e, props.row, props.col)\r\n}\r\n\r\nconst onVisibleChange = (visible: boolean) => {\r\n props.col.props?.onVisibleChange?.(visible, props.row, props.col)\r\n}\r\n\r\nconst onClear = () => {\r\n props.col.props?.onClear?.(props.row, props.col)\r\n}\r\n\r\nconst onEnter = (e: KeyboardEvent) => {\r\n props.onCellEnter?.(props.row, props.col)\r\n props.col.props?.onEnter?.(e, props.row, props.col)\r\n}\r\n</script>\r\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 * 提取 props 中的事件(on 开头的属性)\r\n */\r\nconst extractEvents = (rp: Record<string, any>) => {\r\n const events: Record<string, any> = {}\r\n const props: Record<string, any> = {}\r\n \r\n Object.keys(rp).forEach(key => {\r\n if (key.startsWith('on') && typeof rp[key] === 'function') {\r\n events[key] = rp[key]\r\n } else {\r\n props[key] = rp[key]\r\n }\r\n })\r\n \r\n return { events, props }\r\n}\r\n\r\n/**\r\n * button 渲染�?\r\n */\r\nconst button = createFunctionalRenderer((props) => {\r\n const rp = props.col.props || {}\r\n const val = getValueByPath(props.row, props.col.key)\r\n const { events, props: restProps } = extractEvents(rp)\r\n \r\n return h(ElButton as any, {\r\n type: 'primary',\r\n ...restProps,\r\n ...events,\r\n onClick: (e: Event) => {\r\n props.onClick?.(props.row, props.col)\r\n // 支持用户自定�?onClick\r\n rp.onClick?.(e, props.row, props.col)\r\n }\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.props || {}\r\n const val = getValueByPath(props.row, props.col.key)\r\n const { href, blank, label, ...restProps } = rp\r\n \r\n return h('a', {\r\n href: href || val || '#',\r\n target: blank ? '_blank' : '_self',\r\n rel: blank ? 'noopener noreferrer' : undefined,\r\n style: 'color:#409EFF;cursor:pointer;text-decoration:none;',\r\n ...restProps,\r\n }, 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 const rp = props.col?.props || {}\r\n const { style, class: className, ...restProps } = rp\r\n \r\n return h('div', {\r\n class: className || 'line-clamp-2',\r\n style,\r\n innerHTML: val ?? '',\r\n ...restProps\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.props ?? {}\r\n const { iconColor, copyTitle, successText, errorText, lineClamp, textStyles, textClass, ...restProps } = rp\r\n \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': iconColor || '#409EFF',\r\n 'user-select': 'none'\r\n }\r\n const textStyleObj = {\r\n 'padding-right': '10px',\r\n 'display': '-webkit-box',\r\n '-webkit-box-orient': 'vertical',\r\n '-webkit-line-clamp': lineClamp ?? 2,\r\n 'overflow': 'hidden',\r\n ...textStyles\r\n }\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 ...restProps\r\n },\r\n [\r\n h('span', {\r\n class: `st_copy_text ${textClass ?? ''}`,\r\n style: textStyleObj,\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: 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(successText ?? '复制成功')\r\n }).catch(() => {\r\n ElMessage.error(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(successText ?? '复制成功')\r\n } else {\r\n ElMessage.error(errorText ?? '复制失败')\r\n }\r\n }\r\n } catch (err) {\r\n ElMessage.error(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?.props || {}\r\n const { width, height, fit, previewSrcList, placeholder, style, ...restProps } = rp\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 placeholder || ''\r\n }\r\n\r\n const defaultStyle = {\r\n width: width || '80px',\r\n height: height || '80px',\r\n marginRight: imageList.length > 1 ? '4px' : '0',\r\n ...(typeof style === 'object' ? style : {})\r\n }\r\n\r\n const imageProps = {\r\n previewSrcList: previewSrcList || imageList,\r\n previewTeleported: true, \r\n fit: fit || 'contain',\r\n style: defaultStyle,\r\n ...restProps\r\n }\r\n\r\n if (imageList.length === 1) {\r\n return h(ElImage, {\r\n src: imageList[0],\r\n ...imageProps\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 ...imageProps\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.props || {}\r\n const { options = [], showValue = false, ...restProps } = rp\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: string) => !options.some((opt: any) => String(opt.value) === v))\r\n\r\n const children = matchedOptions.map((item: any) => {\r\n const { listClass, cssClass, tagProps, ...itemRest } = item\r\n return h(\r\n ElTag,\r\n { \r\n key: item.value, \r\n type: listClass, \r\n class: cssClass, \r\n disableTransitions: true,\r\n ...restProps,\r\n ...tagProps\r\n },\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', { style: 'display: inline-flex; gap: 4px; flex-wrap: wrap;' }, 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 rp = props.col.props || {}\r\n const { options = {}, ...restProps } = rp\r\n const mappedVal = val != null ? options[val] ?? '' : ''\r\n \r\n return h('span', { ...restProps }, mappedVal)\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 const rp = props.col.props || {}\r\n \r\n let content = val\r\n if (isDataColumn(col)) {\r\n content = col.formatter?.(val, row, index) ?? val\r\n }\r\n \r\n return h('span', { ...rp }, content)\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.props || {}\r\n const { style, size, class: className, ...restProps } = rp\r\n \r\n if (!val) return ''\r\n \r\n const iconSize = size ? `${size}px` : '20px'\r\n \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', ...(typeof style === 'object' ? style : {}) },\r\n ...restProps\r\n })\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 class: className,\r\n style: { \r\n width: '40px', \r\n height: '40px', \r\n display: 'inline-block',\r\n ...(typeof style === 'object' ? style : {})\r\n },\r\n ...restProps\r\n })\r\n }\r\n \r\n // 默认当作 iconfont\r\n return h('i', {\r\n class: [val, className].filter(Boolean).join(' '),\r\n style: { \r\n fontSize: iconSize,\r\n ...(typeof style === 'object' ? style : {})\r\n },\r\n ...restProps\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","/**\r\n * 全局配置管理\r\n */\r\nimport type { SmartTableConfig } from './types'\r\nimport { getRendererManager } from './renderer'\r\nimport { registerBuiltInRenderers } from './renderers'\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 private _initialized = false\r\n\r\n /**\r\n * 是否已初始化\r\n */\r\n get initialized(): boolean {\r\n return this._initialized\r\n }\r\n\r\n /**\r\n * 初始化(注册内置渲染器)\r\n */\r\n init(): void {\r\n if (this._initialized) return\r\n registerBuiltInRenderers(getRendererManager())\r\n this._initialized = true\r\n }\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 // 初始化内置渲染器\r\n manager.init()\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","<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 <template v-for=\"(col, idx) in visibleColumns\" :key=\"getColumnKey(col, idx)\">\r\n <!-- ========== selection 列 ========== -->\r\n <el-table-column\r\n v-if=\"col.type === '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-else-if=\"col.type === '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-else-if=\"col.type === 'operation'\"\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-else\r\n :prop=\"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 <!-- slot 类型 -->\r\n <template v-if=\"col.type === 'slot'\">\r\n <slot v-if=\"scope.$index >= 0\" :name=\"col.slot || col.key\" v-bind=\"scope\" />\r\n </template>\r\n\r\n <!-- 渲染器类型 -->\r\n <component\r\n v-else-if=\"col.type && renderer[col.type]\"\r\n :is=\"renderer[col.type]\"\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 <!-- 默认文本 -->\r\n <span v-else\r\n :style=\"col.props?.style || ''\"\r\n :class=\"col.props?.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 </template>\r\n </el-table>\r\n</template>\r\n\r\n<script setup lang=\"ts\" name=\"SmartTable\">\r\n import { ref, watch, computed } from 'vue'\r\n import type { ColumnConfig, SmartTableProps, SmartTableEmits, OperationColumn } from './types'\r\n import { isSpecialColumn, isOperationColumn } 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 { getConfigManager } from './config'\r\n import { getValueByPath } from './utils/path'\r\n\r\n // Props 定义\r\n const props = withDefaults(defineProps<SmartTableProps>(), {\r\n data: () => [],\r\n columns: () => [],\r\n rowKey: 'id',\r\n loading: false,\r\n permissions: () => [],\r\n pagination: () => ({}),\r\n })\r\n\r\n // Emits 定义\r\n const emit = defineEmits<SmartTableEmits>()\r\n\r\n // ------------------ 初始化渲染器(仅首次) ------------------\r\n getConfigManager().init()\r\n\r\n // ------------------ columns 处理 ------------------\r\n const { columns: cachedColumns } = useTableColumns(props.columns, {\r\n cacheKey: props.cacheKey ?? '',\r\n })\r\n \r\n // 标记是否已初始化,避免初始化时触发不必要的更新\r\n const isInitialized = ref(false)\r\n watch(\r\n cachedColumns,\r\n (val: ColumnConfig[]) => {\r\n if (isInitialized.value) {\r\n emit(\"update:columns\", val)\r\n }\r\n isInitialized.value = true\r\n },\r\n { deep: true, immediate: true },\r\n )\r\n\r\n // ------------------ operation 列逻辑(需要在 visibleColumns 之前定义) ------------------\r\n // operation 列集合\r\n const operationColumns = computed(() =>\r\n cachedColumns.value.filter(col => col.type === 'operation')\r\n )\r\n\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 // 判断 operation 列是否应该显示\r\n const isOperationVisible = (col: ColumnConfig) => {\r\n if (!isOperationColumn(col)) return false\r\n \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 // 无数据时,只要有权限的按钮就显示\r\n if (!props.data?.length) return hook.hasAnyButton.value\r\n\r\n // 有数据时,检查是否至少有一行有可见按钮\r\n return hook.hasAnyVisibleButton(props.data)\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 (!props.data?.length) return hook.optWidth.value\r\n // 有行数据,取最大宽度\r\n return hook.getMaxOptWidth(props.data)\r\n }\r\n\r\n const getVisibleButtons = (col: OperationColumn, row: any) => {\r\n const hook = getOperationColumnHook(col)\r\n if (!hook) return []\r\n\r\n const buttons = col.buttons || []\r\n if (!buttons.length) return []\r\n\r\n return hook.getVisibleButtons(row)\r\n }\r\n\r\n // ------------------ 列处理 ------------------\r\n \r\n // 可见列(按用户配置顺序)\r\n const visibleColumns = computed(() =>\r\n cachedColumns.value.filter(col => {\r\n // operation 列需要判断是否有可见按钮\r\n if (col.type === 'operation') {\r\n return isOperationVisible(col)\r\n }\r\n // selection/index 始终显示\r\n if (isSpecialColumn(col.type)) return true\r\n // 数据列根据 visible 控制\r\n return col.visible !== false\r\n })\r\n )\r\n\r\n // 生成列的唯一 key\r\n const getColumnKey = (col: ColumnConfig, idx: number) => {\r\n if (col.type === 'selection') return `selection-${idx}`\r\n if (col.type === 'index') return `index-${idx}`\r\n if (col.type === 'operation') return `operation-${col.key}-${idx}`\r\n return `${col.key}-${idx}`\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 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 // ------------------ 事件封装 ------------------\r\n const handleCellChange = (row: any, col: ColumnConfig) => {\r\n emit('cellChange', row, col)\r\n }\r\n const handleCellBlur = (row: any, col: ColumnConfig) => {\r\n emit('cellBlur', row, col)\r\n }\r\n const handleCellEnter = (row: any, col: ColumnConfig) => {\r\n emit('cellEnter', row, col)\r\n }\r\n const handleCellClick = (row: any, col: ColumnConfig) => {\r\n if (!col) return\r\n emit('cellClick', 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 { ColumnConfig, ColumnType } 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 ColumnType> =\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":["isSpecialColumn","type","isRendererType","isOperationColumn","col","mergeColumns","defaultColumns","cacheColumns","cacheMap","c","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","inputProps","rp","onBlur","onFocus","onChange","onInput","onClear","onEnter","rest","v","val","_a","_c","_b","e","_openBlock","_createBlock","_component_el_input","_mergeProps","$event","oldVal","_component_el_input_number","selectProps","onVisibleChange","visible","_component_el_select","_createElementBlock","_Fragment","_renderList","opt","_component_el_option","input","EditableInput","inputNumber","EditableNumber","select","EditableSelect","extractEvents","events","button","restProps","ElButton","link","href","blank","label","html","style","className","copy","iconColor","copyTitle","successText","errorText","lineClamp","textStyles","textClass","butStyle","textStyleObj","ElMessage","textarea","successful","DocumentCopy","img","width","height","fit","previewSrcList","placeholder","imageList","item","defaultStyle","imageProps","ElImage","CopyDocument","dict","showValue","values","matchedOptions","unmatched","children","listClass","cssClass","tagProps","itemRest","ElTag","map","mappedVal","isDataColumn","formatter","index","content","icon","size","iconSize","builtInRenderers","registerBuiltInRenderers","registry","createRenderer","defaultConfig","ConfigManager","config","source","result","globalConfigManager","getConfigManager","setSmartTableConfig","getSmartTableConfig","emit","__emit","cachedColumns","isInitialized","operationColumns","operationColumnMap","hook","getOperationColumnHook","isOperationVisible","getOperationWidth","getVisibleButtons","visibleColumns","getColumnKey","idx","computeIndex","page","manager","allRenderers","r","handleCellChange","handleCellBlur","handleCellEnter","handleCellClick","tableRef","__expose","_withDirectives","_component_el_table","$attrs","_component_el_table_column","_withCtx","$index","_createTextVNode","_toDisplayString","_component_el_button","scope","_renderSlot","_ctx","_resolveDynamicComponent","_normalizeStyle","_normalizeClass","_unref","_hoisted_1","defineColumn"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  (function(C,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):(C=typeof globalThis<"u"?globalThis:C||self,t(C.Vue3SmartTable={},C.Vue,C.ElementPlus,C.ElementPlusIconsVue))})(this,(function(C,t,_,W){"use strict";var Te=Object.defineProperty;var Ve=(C,t,_)=>t in C?Te(C,t,{enumerable:!0,configurable:!0,writable:!0,value:_}):C[t]=_;var O=(C,t,_)=>Ve(C,typeof t!="symbol"?t+"":t,_);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 I(n){return n==="selection"||n==="index"||n==="operation"}function X(n){return n?!I(n):!1}function q(n){return n.type==="operation"}function H(n,e){if(!(e!=null&&e.length))return n;const s=new Map(e.map(l=>[l.key,l]));return n.map(l=>{const c=s.get(l.key);return c?{...l,visible:typeof c.visible=="boolean"?c.visible:l.visible}:l})}function Z(n,e){const{cacheKey:s,storage:l=localStorage}=e||{},c=s?l.getItem(s):null,d=t.ref(H(n,c?JSON.parse(c):[]));return t.watch(d,p=>{if(!s)return;const y=p.map(m=>({key:m.key,visible:m.visible,columnOpts:m.columnOpts}));l.setItem(s,JSON.stringify(y))},{deep:!0}),{columns:d,setColumns(p){d.value=H(n,p),s&&l.setItem(s,JSON.stringify(p))},resetColumns(){d.value=n,s&&l.removeItem(s)}}}function v(n,e=10,s=[]){const c="*:*:*",d=o=>{if(!o)return!0;const f=Array.isArray(o)?o:[o];return s.some(b=>b===c||f.includes(b))},p=t.computed(()=>n.some(o=>d(o.permission))),y=t.computed(()=>n.filter(f=>d(f.permission)).slice(0,e).reduce((f,b)=>f+(b.width??55),0)),m=(o,f)=>d(o.permission)&&(o.visible?o.visible(f):!0),g=o=>n.filter(b=>m(b,o)).slice(0,e).reduce((b,T)=>b+(T.width??55),0);return{hasAnyButton:p,optWidth:y,hasAnyVisibleButton:o=>o!=null&&o.length?o.some(f=>n.some(b=>m(b,f))):!1,getMaxOptWidth:o=>o!=null&&o.length?o.reduce((f,b)=>Math.max(f,g(b)),0):y.value,getVisibleButtons:o=>n.filter(f=>m(f,o)).slice(0,e)}}class ee{constructor(){O(this,"renderers",new Map)}register(e,s){this.renderers.has(e)&&process.env.NODE_ENV==="development"&&console.debug(`[SmartTable] Renderer "${e}" already registered, skipping.`),this.renderers.set(e,s)}registerMultiple(e){Object.entries(e).forEach(([s,l])=>{this.renderers.has(s)||this.renderers.set(s,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 V(){return A||(A=new ee),A}function M(n){return t.defineComponent({props:["row","col","index","onCellChange","onCellBlur","onCellEnter","onClick"],setup(e){return()=>t.h(n,e)}})}function S(n){return t.defineComponent({props:["row","col","index","onCellChange","onCellBlur","onCellEnter","onClick"],setup(e){return()=>n(e)}})}function te(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 B(n,e){if(!(!n||!e))return e.split(".").reduce((s,l)=>s==null?void 0:s[l],n)}function z(n,e,s){if(!n||!e)return;const l=e.split("."),c=l.pop(),d=l.reduce((p,y)=>(p[y]||(p[y]={}),p[y]),n);d[c]=s}const ne=t.defineComponent({__name:"input",props:{row:{},col:{},index:{},onCellChange:{type:Function},onCellBlur:{type:Function},onCellEnter:{type:Function}},setup(n){const e=n,s=t.ref(B(e.row,e.col.key)),l=t.computed(()=>{const a=e.col.props||{},{onBlur:r,onFocus:i,onChange:o,onInput:f,onClear:b,onEnter:T,...R}=a;return{placeholder:"",size:"small",clearable:!0,...R}});t.watch(s,a=>{z(e.row,e.col.key,a)});const c=a=>{var r,i,o;(r=e.onCellChange)==null||r.call(e,e.row,e.col),(o=(i=e.col.props)==null?void 0:i.onChange)==null||o.call(i,a,e.row,e.col)},d=a=>{var r,i,o;(r=e.onCellBlur)==null||r.call(e,e.row,e.col),(o=(i=e.col.props)==null?void 0:i.onBlur)==null||o.call(i,a,e.row,e.col)},p=a=>{var r,i;(i=(r=e.col.props)==null?void 0:r.onFocus)==null||i.call(r,a,e.row,e.col)},y=a=>{var r,i;(i=(r=e.col.props)==null?void 0:r.onInput)==null||i.call(r,a,e.row,e.col)},m=a=>{var r,i,o;(r=e.onCellEnter)==null||r.call(e,e.row,e.col),(o=(i=e.col.props)==null?void 0:i.onEnter)==null||o.call(i,a,e.row,e.col)},g=()=>{var a,r;(r=(a=e.col.props)==null?void 0:a.onClear)==null||r.call(a,e.row,e.col)};return(a,r)=>{const i=t.resolveComponent("el-input");return t.openBlock(),t.createBlock(i,t.mergeProps({modelValue:s.value,"onUpdate:modelValue":r[0]||(r[0]=o=>s.value=o)},l.value,{onBlur:d,onFocus:p,onChange:c,onInput:y,onKeyup:t.withKeys(m,["enter"]),onClear:g}),null,16,["modelValue"])}}}),oe=t.defineComponent({__name:"inputNumber",props:{row:{},col:{},index:{},onCellChange:{type:Function},onCellBlur:{type:Function},onCellEnter:{type:Function}},setup(n){const e=n,s=t.ref(B(e.row,e.col.key)),l=t.computed(()=>{const m=e.col.props||{},{onBlur:g,onFocus:a,onChange:r,onEnter:i,...o}=m;return{min:0,max:99999,controls:!1,size:"small",...o}});t.watch(s,m=>{z(e.row,e.col.key,m)});const c=(m,g)=>{var a,r,i;(a=e.onCellChange)==null||a.call(e,e.row,e.col),(i=(r=e.col.props)==null?void 0:r.onChange)==null||i.call(r,m,g,e.row,e.col)},d=m=>{var g,a,r;(g=e.onCellBlur)==null||g.call(e,e.row,e.col),(r=(a=e.col.props)==null?void 0:a.onBlur)==null||r.call(a,m,e.row,e.col)},p=m=>{var g,a;(a=(g=e.col.props)==null?void 0:g.onFocus)==null||a.call(g,m,e.row,e.col)},y=m=>{var g,a,r;(g=e.onCellEnter)==null||g.call(e,e.row,e.col),(r=(a=e.col.props)==null?void 0:a.onEnter)==null||r.call(a,m,e.row,e.col)};return(m,g)=>{const a=t.resolveComponent("el-input-number");return t.openBlock(),t.createBlock(a,t.mergeProps({modelValue:s.value,"onUpdate:modelValue":g[0]||(g[0]=r=>s.value=r)},l.value,{onBlur:d,onFocus:p,onChange:c,onKeyup:t.withKeys(y,["enter"])}),null,16,["modelValue"])}}}),re=t.defineComponent({__name:"select",props:{row:{},col:{},index:{},onCellChange:{type:Function},onCellBlur:{type:Function},onCellEnter:{type:Function}},setup(n){const e=n,s=t.ref(B(e.row,e.col.key)),l=t.computed(()=>{const r=e.col.props||{},{options:i,onChange:o,onBlur:f,onFocus:b,onVisibleChange:T,onClear:R,onEnter:G,...D}=r;return{placeholder:"请选择",size:"small",clearable:!0,...D}}),c=t.computed(()=>(e.col.props||{}).options||[]);t.watch(s,r=>{z(e.row,e.col.key,r)});const d=r=>{var i,o,f;(i=e.onCellChange)==null||i.call(e,e.row,e.col),(f=(o=e.col.props)==null?void 0:o.onChange)==null||f.call(o,r,e.row,e.col)},p=r=>{var i,o,f;(i=e.onCellBlur)==null||i.call(e,e.row,e.col),(f=(o=e.col.props)==null?void 0:o.onBlur)==null||f.call(o,r,e.row,e.col)},y=r=>{var i,o;(o=(i=e.col.props)==null?void 0:i.onFocus)==null||o.call(i,r,e.row,e.col)},m=r=>{var i,o;(o=(i=e.col.props)==null?void 0:i.onVisibleChange)==null||o.call(i,r,e.row,e.col)},g=()=>{var r,i;(i=(r=e.col.props)==null?void 0:r.onClear)==null||i.call(r,e.row,e.col)},a=r=>{var i,o,f;(i=e.onCellEnter)==null||i.call(e,e.row,e.col),(f=(o=e.col.props)==null?void 0:o.onEnter)==null||f.call(o,r,e.row,e.col)};return(r,i)=>{const o=t.resolveComponent("el-option"),f=t.resolveComponent("el-select");return t.openBlock(),t.createBlock(f,t.mergeProps({modelValue:s.value,"onUpdate:modelValue":i[0]||(i[0]=b=>s.value=b)},l.value,{onChange:d,onBlur:p,onFocus:y,onVisibleChange:m,onClear:g,onKeyup:t.withKeys(a,["enter"])}),{default:t.withCtx(()=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(c.value,b=>(t.openBlock(),t.createBlock(o,{key:b.value,label:b.label,value:b.value,disabled:b.disabled},null,8,["label","value","disabled"]))),128))]),_:1},16,["modelValue"])}}}),le=M(ne),se=M(oe),ie=M(re),ae=n=>{const e={},s={};return Object.keys(n).forEach(l=>{l.startsWith("on")&&typeof n[l]=="function"?e[l]=n[l]:s[l]=n[l]}),{events:e,props:s}},ce=S(n=>{const e=n.col.props||{},s=B(n.row,n.col.key),{events:l,props:c}=ae(e);return t.h(_.ElButton,{type:"primary",...c,...l,onClick:d=>{var p,y;(p=n.onClick)==null||p.call(n,n.row,n.col),(y=e.onClick)==null||y.call(e,d,n.row,n.col)}},()=>e.label||s)}),pe=S(n=>{const e=n.col.props||{},s=B(n.row,n.col.key),{href:l,blank:c,label:d,...p}=e;return t.h("a",{href:l||s||"#",target:c?"_blank":"_self",rel:c?"noopener noreferrer":void 0,style:"color:#409EFF;cursor:pointer;text-decoration:none;",...p},d||s)}),ue=S(n=>{var p;const e=B(n.row,n.col.key),s=((p=n.col)==null?void 0:p.props)||{},{style:l,class:c,...d}=s;return t.h("div",{class:c||"line-clamp-2",style:l,innerHTML:e??"",...d})}),de=S(n=>{const e=B(n.row,n.col.key)??"",s=n.col.props??{},{iconColor:l,copyTitle:c,successText:d,errorText:p,lineClamp:y,textStyles:m,textClass:g,...a}=s,r={position:"absolute",right:"-5px",top:"50%",transform:"translateY(-50%)",cursor:"pointer",display:"none","font-size":"12px",color:l||"#409EFF","user-select":"none"},i={"padding-right":"10px",display:"-webkit-box","-webkit-box-orient":"vertical","-webkit-line-clamp":y??2,overflow:"hidden",...m};return t.h("div",{class:"st_copy_wrapper",style:"width: 100%; position: relative; display: inline-block;",...a},[t.h("span",{class:`st_copy_text ${g??""}`,style:i,title:e},e),e&&t.h("span",{class:"st_copy_btn",style:r,title:c||"复制",onClick:()=>{if(e)try{if(navigator.clipboard&&navigator.clipboard.writeText)navigator.clipboard.writeText(e).then(()=>{_.ElMessage.success(d??"复制成功")}).catch(()=>{_.ElMessage.error(p??"复制失败")});else{const o=document.createElement("textarea");o.value=e,o.style.position="fixed",o.style.opacity="0",document.body.appendChild(o),o.select();const f=document.execCommand("copy");document.body.removeChild(o),f?_.ElMessage.success(d??"复制成功"):_.ElMessage.error(p??"复制失败")}}catch{_.ElMessage.error(p??"复制失败")}}},[t.h(W.DocumentCopy,{style:"width: 1em; height: 1em;"})])].filter(Boolean))}),fe=S(n=>{var f;const e=B(n.row,n.col.key)??"",s=((f=n.col)==null?void 0:f.props)||{},{width:l,height:c,fit:d,previewSrcList:p,placeholder:y,style:m,...g}=s,r=e?Array.isArray(e)?e.filter(b=>b&&typeof b=="string"):[e]:[];if(r.length===0)return y||"";const i={width:l||"80px",height:c||"80px",marginRight:r.length>1?"4px":"0",...typeof m=="object"?m:{}},o={previewSrcList:p||r,previewTeleported:!0,fit:d||"contain",style:i,...g};return r.length===1?t.h(_.ElImage,{src:r[0],...o}):t.h("div",{class:"st_img_wrapper",style:"display: flex; align-items: center; position: relative"},[t.h(_.ElImage,{src:r[0],...o}),r.length>1&&t.h("span",{class:"st_img_total",style:"position: absolute; top: 0; right: 0; ",title:`${r.length}`},[t.h(W.CopyDocument,{style:"width: 1em; height: 1em; "})])])}),me=S(n=>{const e=B(n.row,n.col.key)??"",s=n.col.props||{},{options:l=[],showValue:c=!1,...d}=s;if(e==null||e==="")return"";const p=Array.isArray(e)?e.map(String):[String(e)],y=l.filter(a=>p.includes(String(a.value))),m=p.filter(a=>!l.some(r=>String(r.value)===a)),g=y.map(a=>{const{listClass:r,cssClass:i,tagProps:o,...f}=a;return t.h(_.ElTag,{key:a.value,type:r,class:i,disableTransitions:!0,...d,...o},{default:()=>a.label+" "})});return c&&m.length>0&&g.push(t.h("span",{},m.join(" "))),t.h("div",{style:"display: inline-flex; gap: 4px; flex-wrap: wrap;"},g)}),he=S(n=>{const e=B(n.row,n.col.key)??"",s=n.col.props||{},{options:l={},...c}=s,d=e!=null?l[e]??"":"";return t.h("span",{...c},d)});function ge(n){return typeof n.formatter=="function"}const ye=S(n=>{var y;const{col:e,row:s,index:l}=n,c=B(n.row,n.col.key)??"",d=n.col.props||{};let p=c;return ge(e)&&(p=((y=e.formatter)==null?void 0:y.call(e,c,s,l))??c),t.h("span",{...d},p)}),Ce=S(n=>{const e=B(n.row,n.col.key)??"",s=n.col.props||{},{style:l,size:c,class:d,...p}=s;if(!e)return"";const y=c?`${c}px`:"20px";return/^https?:\/\//.test(e)?t.h(_.ElImage,{src:e,previewSrcList:[e],previewTeleported:!0,fit:"contain",style:{width:"40px",height:"40px",...typeof l=="object"?l:{}},...p}):/^\s*<svg[\s\S]*<\/svg>\s*$/.test(e)?t.h("div",{innerHTML:e,class:d,style:{width:"40px",height:"40px",display:"inline-block",...typeof l=="object"?l:{}},...p}):t.h("i",{class:[e,d].filter(Boolean).join(" "),style:{fontSize:y,...typeof l=="object"?l:{}},...p})}),K={input:le,"input-number":se,select:ie,button:ce,link:pe,html:ue,copy:de,img:fe,dict:me,map:he,formatter:ye,icon:Ce};function J(n){n.registerMultiple(K)}function be(){return K}const U={defaultPagination:{page:1,size:10,total:0},defaultTableProps:{},defaultColumnProps:{}};class ke{constructor(){O(this,"config",{...U});O(this,"_initialized",!1)}get initialized(){return this._initialized}init(){this._initialized||(J(V()),this._initialized=!0)}getConfig(){return{...this.config}}setConfig(e){this.config=this.mergeConfig(this.config,e),e.renderers&&V().registerMultiple(e.renderers)}get(e){return this.config[e]}reset(){this.config={...U}}mergeConfig(e,s){const l={...e};for(const c in s)s[c]&&typeof s[c]=="object"&&!Array.isArray(s[c])?l[c]=this.mergeConfig(e[c]||{},s[c]):l[c]=s[c];return l}}let N=null;function j(){return N||(N=new ke),N}function we(n){j().setConfig(n)}function _e(){return j().getConfig()}const Be=["title"],Y=t.defineComponent({__name:"index",props:{data:{default:()=>[]},columns:{default:()=>[]},rowKey:{default:"id"},loading:{type:Boolean,default:!1},permissions:{default:()=>[]},cacheKey:{},pagination:{default:()=>({})}},emits:["update:columns","cellChange","cellBlur","cellEnter","cellClick"],setup(n,{expose:e,emit:s}){const l=n,c=s;j().init();const{columns:d}=Z(l.columns,{cacheKey:l.cacheKey??""}),p=t.ref(!1);t.watch(d,u=>{p.value&&c("update:columns",u),p.value=!0},{deep:!0,immediate:!0});const y=t.computed(()=>d.value.filter(u=>I(u.type)?!0:u.visible!==!1)),m=(u,h)=>u.type==="selection"?`selection-${h}`:u.type==="index"?`index-${h}`:u.type==="operation"?`operation-${u.key}-${h}`:`${u.key}-${h}`,g=t.computed(()=>d.value.filter(u=>u.type==="operation")),a=u=>{var E,$;const h=(E=l.pagination)==null?void 0:E.page,w=($=l.pagination)==null?void 0:$.size;return h&&w?(h-1)*w+u+1:u+1},r=t.computed(()=>{const u=V(),h={};return u.names().forEach(w=>{const E=u.get(w);E&&(h[w]=E)}),h}),i=t.computed(()=>{const u=new Map;return g.value.forEach(h=>{const w=v(h.buttons||[],h.maxbtn??10,l.permissions||[]);u.set(h.key,w)}),u}),o=u=>i.value.get(u.key),f=u=>{var w;const h=o(u);return h?(w=l.data)!=null&&w.length?h.getMaxOptWidth(l.data):h.optWidth.value:0},b=(u,h)=>{const w=o(u);return w?(u.buttons||[]).length?w.getVisibleButtons(h):[]:[]},T=u=>{var E;if(!q(u))return!1;const h=o(u);return!h||!(u.buttons||[]).length?!1:(E=l.data)!=null&&E.length?h.hasAnyVisibleButton(l.data):h.hasAnyButton.value},R=(u,h)=>{c("cellChange",u,h)},G=(u,h)=>{c("cellBlur",u,h)},D=(u,h)=>{c("cellEnter",u,h)},xe=(u,h)=>{h&&c("cellClick",u,h)},Q=t.ref();return e({tableRef:Q}),(u,h)=>{const w=t.resolveComponent("el-table-column"),E=t.resolveComponent("el-button"),$=t.resolveComponent("el-table"),Se=t.resolveDirective("loading");return t.withDirectives((t.openBlock(),t.createBlock($,t.mergeProps({ref_key:"tableRef",ref:Q},u.$attrs,{data:n.data,"row-key":n.rowKey,class:"smart_table"}),{default:t.withCtx(()=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(y.value,(k,Fe)=>(t.openBlock(),t.createElementBlock(t.Fragment,{key:m(k,Fe)},[k.type==="selection"?(t.openBlock(),t.createBlock(w,t.mergeProps({key:0,type:"selection"},{ref_for:!0},k.columnProps),null,16)):k.type==="index"?(t.openBlock(),t.createBlock(w,t.mergeProps({key:1,type:"index",label:k.label||"#",align:"center"},{ref_for:!0},k.columnProps),{default:t.withCtx(({$index:x})=>[t.createTextVNode(t.toDisplayString(a(x)),1)]),_:1},16,["label"])):k.type==="operation"&&T(k)?(t.openBlock(),t.createBlock(w,t.mergeProps({key:2,label:k.label||"操作",align:"center"},{ref_for:!0},{...k.columnProps,width:f(k)}),{default:t.withCtx(({row:x})=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(b(k,x),F=>(t.openBlock(),t.createBlock(E,{key:F.label,type:F.type||"primary",link:"",onClick:L=>F.action(x)},{default:t.withCtx(()=>[t.createTextVNode(t.toDisplayString(F.label),1)]),_:2},1032,["type","onClick"]))),128))]),_:2},1040,["label"])):(t.openBlock(),t.createBlock(w,t.mergeProps({key:3,label:k.label,align:"center"},{ref_for:!0},k.columnProps||{}),{default:t.withCtx(x=>{var F,L;return[k.type==="slot"?(t.openBlock(),t.createElementBlock(t.Fragment,{key:0},[x.$index>=0?t.renderSlot(u.$slots,k.slot||k.key,t.mergeProps({key:0,ref_for:!0},x)):t.createCommentVNode("",!0)],64)):k.type&&r.value[k.type]?(t.openBlock(),t.createBlock(t.resolveDynamicComponent(r.value[k.type]),{key:1,row:x.row,col:k,index:x.$index,onCellChange:R,onCellBlur:G,onCellEnter:D,onClick:xe},null,40,["row","col","index"])):(t.openBlock(),t.createElementBlock("span",{key:2,style:t.normalizeStyle(((F=k.props)==null?void 0:F.style)||""),class:t.normalizeClass(((L=k.props)==null?void 0:L.class)||""),title:t.unref(B)(x.row,k.key)},t.toDisplayString(t.unref(B)(x.row,k.key)),15,Be))]}),_:2},1040,["label"]))],64))),128))]),_:3},16,["data","row-key"])),[[Se,n.loading]])}}});function Ee(n,e){return{key:n,...e}}C.SmartTable=Y,C.builtInRenderers=K,C.createFunctionalRenderer=S,C.createRenderer=be,C.default=Y,C.defineColumn=Ee,C.getRendererManager=V,C.getSmartTableConfig=_e,C.isOperationColumn=q,C.isRendererType=X,C.isSpecialColumn=I,C.registerBuiltInRenderers=J,C.setSmartTableConfig=we,C.validateRendererProps=te,C.wrapSFCComponent=M,Object.defineProperties(C,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
2
+ /*$vite$:1*/`,document.head.appendChild(P);function I(n){return n==="selection"||n==="index"||n==="operation"}function X(n){return n?!I(n):!1}function q(n){return n.type==="operation"}function H(n,e){if(!(e!=null&&e.length))return n;const i=new Map(e.map(l=>[l.key,l]));return n.map(l=>{const c=i.get(l.key);return c?{...l,visible:typeof c.visible=="boolean"?c.visible:l.visible}:l})}function Z(n,e){const{cacheKey:i,storage:l=localStorage}=e||{},c=i?l.getItem(i):null,d=t.ref(H(n,c?JSON.parse(c):[]));return t.watch(d,u=>{if(!i)return;const y=u.map(m=>({key:m.key,visible:m.visible,columnOpts:m.columnOpts}));l.setItem(i,JSON.stringify(y))},{deep:!0}),{columns:d,setColumns(u){d.value=H(n,u),i&&l.setItem(i,JSON.stringify(u))},resetColumns(){d.value=n,i&&l.removeItem(i)}}}function v(n,e=10,i=[]){const c="*:*:*",d=r=>{if(!r)return!0;const f=Array.isArray(r)?r:[r];return i.some(b=>b===c||f.includes(b))},u=t.computed(()=>n.some(r=>d(r.permission))),y=t.computed(()=>n.filter(f=>d(f.permission)).slice(0,e).reduce((f,b)=>f+(b.width??55),0)),m=(r,f)=>d(r.permission)&&(r.visible?r.visible(f):!0),g=r=>n.filter(b=>m(b,r)).slice(0,e).reduce((b,T)=>b+(T.width??55),0);return{hasAnyButton:u,optWidth:y,hasAnyVisibleButton:r=>r!=null&&r.length?r.some(f=>n.some(b=>m(b,f))):!1,getMaxOptWidth:r=>r!=null&&r.length?r.reduce((f,b)=>Math.max(f,g(b)),0):y.value,getVisibleButtons:r=>n.filter(f=>m(f,r)).slice(0,e)}}class ee{constructor(){O(this,"renderers",new Map)}register(e,i){this.renderers.has(e)&&process.env.NODE_ENV==="development"&&console.debug(`[SmartTable] Renderer "${e}" already registered, skipping.`),this.renderers.set(e,i)}registerMultiple(e){Object.entries(e).forEach(([i,l])=>{this.renderers.has(i)||this.renderers.set(i,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 V(){return A||(A=new ee),A}function M(n){return t.defineComponent({props:["row","col","index","onCellChange","onCellBlur","onCellEnter","onClick"],setup(e){return()=>t.h(n,e)}})}function S(n){return t.defineComponent({props:["row","col","index","onCellChange","onCellBlur","onCellEnter","onClick"],setup(e){return()=>n(e)}})}function te(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 B(n,e){if(!(!n||!e))return e.split(".").reduce((i,l)=>i==null?void 0:i[l],n)}function z(n,e,i){if(!n||!e)return;const l=e.split("."),c=l.pop(),d=l.reduce((u,y)=>(u[y]||(u[y]={}),u[y]),n);d[c]=i}const ne=t.defineComponent({__name:"input",props:{row:{},col:{},index:{},onCellChange:{type:Function},onCellBlur:{type:Function},onCellEnter:{type:Function}},setup(n){const e=n,i=t.ref(B(e.row,e.col.key)),l=t.computed(()=>{const a=e.col.props||{},{onBlur:o,onFocus:s,onChange:r,onInput:f,onClear:b,onEnter:T,...R}=a;return{placeholder:"",size:"small",clearable:!0,...R}});t.watch(i,a=>{z(e.row,e.col.key,a)});const c=a=>{var o,s,r;(o=e.onCellChange)==null||o.call(e,e.row,e.col),(r=(s=e.col.props)==null?void 0:s.onChange)==null||r.call(s,a,e.row,e.col)},d=a=>{var o,s,r;(o=e.onCellBlur)==null||o.call(e,e.row,e.col),(r=(s=e.col.props)==null?void 0:s.onBlur)==null||r.call(s,a,e.row,e.col)},u=a=>{var o,s;(s=(o=e.col.props)==null?void 0:o.onFocus)==null||s.call(o,a,e.row,e.col)},y=a=>{var o,s;(s=(o=e.col.props)==null?void 0:o.onInput)==null||s.call(o,a,e.row,e.col)},m=a=>{var o,s,r;(o=e.onCellEnter)==null||o.call(e,e.row,e.col),(r=(s=e.col.props)==null?void 0:s.onEnter)==null||r.call(s,a,e.row,e.col)},g=()=>{var a,o;(o=(a=e.col.props)==null?void 0:a.onClear)==null||o.call(a,e.row,e.col)};return(a,o)=>{const s=t.resolveComponent("el-input");return t.openBlock(),t.createBlock(s,t.mergeProps({modelValue:i.value,"onUpdate:modelValue":o[0]||(o[0]=r=>i.value=r)},l.value,{onBlur:d,onFocus:u,onChange:c,onInput:y,onKeyup:t.withKeys(m,["enter"]),onClear:g}),null,16,["modelValue"])}}}),oe=t.defineComponent({__name:"inputNumber",props:{row:{},col:{},index:{},onCellChange:{type:Function},onCellBlur:{type:Function},onCellEnter:{type:Function}},setup(n){const e=n,i=t.ref(B(e.row,e.col.key)),l=t.computed(()=>{const m=e.col.props||{},{onBlur:g,onFocus:a,onChange:o,onEnter:s,...r}=m;return{min:0,max:99999,controls:!1,size:"small",...r}});t.watch(i,m=>{z(e.row,e.col.key,m)});const c=(m,g)=>{var a,o,s;(a=e.onCellChange)==null||a.call(e,e.row,e.col),(s=(o=e.col.props)==null?void 0:o.onChange)==null||s.call(o,m,g,e.row,e.col)},d=m=>{var g,a,o;(g=e.onCellBlur)==null||g.call(e,e.row,e.col),(o=(a=e.col.props)==null?void 0:a.onBlur)==null||o.call(a,m,e.row,e.col)},u=m=>{var g,a;(a=(g=e.col.props)==null?void 0:g.onFocus)==null||a.call(g,m,e.row,e.col)},y=m=>{var g,a,o;(g=e.onCellEnter)==null||g.call(e,e.row,e.col),(o=(a=e.col.props)==null?void 0:a.onEnter)==null||o.call(a,m,e.row,e.col)};return(m,g)=>{const a=t.resolveComponent("el-input-number");return t.openBlock(),t.createBlock(a,t.mergeProps({modelValue:i.value,"onUpdate:modelValue":g[0]||(g[0]=o=>i.value=o)},l.value,{onBlur:d,onFocus:u,onChange:c,onKeyup:t.withKeys(y,["enter"])}),null,16,["modelValue"])}}}),re=t.defineComponent({__name:"select",props:{row:{},col:{},index:{},onCellChange:{type:Function},onCellBlur:{type:Function},onCellEnter:{type:Function}},setup(n){const e=n,i=t.ref(B(e.row,e.col.key)),l=t.computed(()=>{const o=e.col.props||{},{options:s,onChange:r,onBlur:f,onFocus:b,onVisibleChange:T,onClear:R,onEnter:G,...D}=o;return{placeholder:"请选择",size:"small",clearable:!0,...D}}),c=t.computed(()=>(e.col.props||{}).options||[]);t.watch(i,o=>{z(e.row,e.col.key,o)});const d=o=>{var s,r,f;(s=e.onCellChange)==null||s.call(e,e.row,e.col),(f=(r=e.col.props)==null?void 0:r.onChange)==null||f.call(r,o,e.row,e.col)},u=o=>{var s,r,f;(s=e.onCellBlur)==null||s.call(e,e.row,e.col),(f=(r=e.col.props)==null?void 0:r.onBlur)==null||f.call(r,o,e.row,e.col)},y=o=>{var s,r;(r=(s=e.col.props)==null?void 0:s.onFocus)==null||r.call(s,o,e.row,e.col)},m=o=>{var s,r;(r=(s=e.col.props)==null?void 0:s.onVisibleChange)==null||r.call(s,o,e.row,e.col)},g=()=>{var o,s;(s=(o=e.col.props)==null?void 0:o.onClear)==null||s.call(o,e.row,e.col)},a=o=>{var s,r,f;(s=e.onCellEnter)==null||s.call(e,e.row,e.col),(f=(r=e.col.props)==null?void 0:r.onEnter)==null||f.call(r,o,e.row,e.col)};return(o,s)=>{const r=t.resolveComponent("el-option"),f=t.resolveComponent("el-select");return t.openBlock(),t.createBlock(f,t.mergeProps({modelValue:i.value,"onUpdate:modelValue":s[0]||(s[0]=b=>i.value=b)},l.value,{onChange:d,onBlur:u,onFocus:y,onVisibleChange:m,onClear:g,onKeyup:t.withKeys(a,["enter"])}),{default:t.withCtx(()=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(c.value,b=>(t.openBlock(),t.createBlock(r,{key:b.value,label:b.label,value:b.value,disabled:b.disabled},null,8,["label","value","disabled"]))),128))]),_:1},16,["modelValue"])}}}),le=M(ne),ie=M(oe),se=M(re),ae=n=>{const e={},i={};return Object.keys(n).forEach(l=>{l.startsWith("on")&&typeof n[l]=="function"?e[l]=n[l]:i[l]=n[l]}),{events:e,props:i}},ce=S(n=>{const e=n.col.props||{},i=B(n.row,n.col.key),{events:l,props:c}=ae(e);return t.h(_.ElButton,{type:"primary",...c,...l,onClick:d=>{var u,y;(u=n.onClick)==null||u.call(n,n.row,n.col),(y=e.onClick)==null||y.call(e,d,n.row,n.col)}},()=>e.label||i)}),pe=S(n=>{const e=n.col.props||{},i=B(n.row,n.col.key),{href:l,blank:c,label:d,...u}=e;return t.h("a",{href:l||i||"#",target:c?"_blank":"_self",rel:c?"noopener noreferrer":void 0,style:"color:#409EFF;cursor:pointer;text-decoration:none;",...u},d||i)}),ue=S(n=>{var u;const e=B(n.row,n.col.key),i=((u=n.col)==null?void 0:u.props)||{},{style:l,class:c,...d}=i;return t.h("div",{class:c||"line-clamp-2",style:l,innerHTML:e??"",...d})}),de=S(n=>{const e=B(n.row,n.col.key)??"",i=n.col.props??{},{iconColor:l,copyTitle:c,successText:d,errorText:u,lineClamp:y,textStyles:m,textClass:g,...a}=i,o={position:"absolute",right:"-5px",top:"50%",transform:"translateY(-50%)",cursor:"pointer",display:"none","font-size":"12px",color:l||"#409EFF","user-select":"none"},s={"padding-right":"10px",display:"-webkit-box","-webkit-box-orient":"vertical","-webkit-line-clamp":y??2,overflow:"hidden",...m};return t.h("div",{class:"st_copy_wrapper",style:"width: 100%; position: relative; display: inline-block;",...a},[t.h("span",{class:`st_copy_text ${g??""}`,style:s,title:e},e),e&&t.h("span",{class:"st_copy_btn",style:o,title:c||"复制",onClick:()=>{if(e)try{if(navigator.clipboard&&navigator.clipboard.writeText)navigator.clipboard.writeText(e).then(()=>{_.ElMessage.success(d??"复制成功")}).catch(()=>{_.ElMessage.error(u??"复制失败")});else{const r=document.createElement("textarea");r.value=e,r.style.position="fixed",r.style.opacity="0",document.body.appendChild(r),r.select();const f=document.execCommand("copy");document.body.removeChild(r),f?_.ElMessage.success(d??"复制成功"):_.ElMessage.error(u??"复制失败")}}catch{_.ElMessage.error(u??"复制失败")}}},[t.h(W.DocumentCopy,{style:"width: 1em; height: 1em;"})])].filter(Boolean))}),fe=S(n=>{var f;const e=B(n.row,n.col.key)??"",i=((f=n.col)==null?void 0:f.props)||{},{width:l,height:c,fit:d,previewSrcList:u,placeholder:y,style:m,...g}=i,o=e?Array.isArray(e)?e.filter(b=>b&&typeof b=="string"):[e]:[];if(o.length===0)return y||"";const s={width:l||"80px",height:c||"80px",marginRight:o.length>1?"4px":"0",...typeof m=="object"?m:{}},r={previewSrcList:u||o,previewTeleported:!0,fit:d||"contain",style:s,...g};return o.length===1?t.h(_.ElImage,{src:o[0],...r}):t.h("div",{class:"st_img_wrapper",style:"display: flex; align-items: center; position: relative"},[t.h(_.ElImage,{src:o[0],...r}),o.length>1&&t.h("span",{class:"st_img_total",style:"position: absolute; top: 0; right: 0; ",title:`${o.length}`},[t.h(W.CopyDocument,{style:"width: 1em; height: 1em; "})])])}),me=S(n=>{const e=B(n.row,n.col.key)??"",i=n.col.props||{},{options:l=[],showValue:c=!1,...d}=i;if(e==null||e==="")return"";const u=Array.isArray(e)?e.map(String):[String(e)],y=l.filter(a=>u.includes(String(a.value))),m=u.filter(a=>!l.some(o=>String(o.value)===a)),g=y.map(a=>{const{listClass:o,cssClass:s,tagProps:r,...f}=a;return t.h(_.ElTag,{key:a.value,type:o,class:s,disableTransitions:!0,...d,...r},{default:()=>a.label+" "})});return c&&m.length>0&&g.push(t.h("span",{},m.join(" "))),t.h("div",{style:"display: inline-flex; gap: 4px; flex-wrap: wrap;"},g)}),he=S(n=>{const e=B(n.row,n.col.key)??"",i=n.col.props||{},{options:l={},...c}=i,d=e!=null?l[e]??"":"";return t.h("span",{...c},d)});function ge(n){return typeof n.formatter=="function"}const ye=S(n=>{var y;const{col:e,row:i,index:l}=n,c=B(n.row,n.col.key)??"",d=n.col.props||{};let u=c;return ge(e)&&(u=((y=e.formatter)==null?void 0:y.call(e,c,i,l))??c),t.h("span",{...d},u)}),Ce=S(n=>{const e=B(n.row,n.col.key)??"",i=n.col.props||{},{style:l,size:c,class:d,...u}=i;if(!e)return"";const y=c?`${c}px`:"20px";return/^https?:\/\//.test(e)?t.h(_.ElImage,{src:e,previewSrcList:[e],previewTeleported:!0,fit:"contain",style:{width:"40px",height:"40px",...typeof l=="object"?l:{}},...u}):/^\s*<svg[\s\S]*<\/svg>\s*$/.test(e)?t.h("div",{innerHTML:e,class:d,style:{width:"40px",height:"40px",display:"inline-block",...typeof l=="object"?l:{}},...u}):t.h("i",{class:[e,d].filter(Boolean).join(" "),style:{fontSize:y,...typeof l=="object"?l:{}},...u})}),K={input:le,"input-number":ie,select:se,button:ce,link:pe,html:ue,copy:de,img:fe,dict:me,map:he,formatter:ye,icon:Ce};function J(n){n.registerMultiple(K)}function be(){return K}const U={defaultPagination:{page:1,size:10,total:0},defaultTableProps:{},defaultColumnProps:{}};class ke{constructor(){O(this,"config",{...U});O(this,"_initialized",!1)}get initialized(){return this._initialized}init(){this._initialized||(J(V()),this._initialized=!0)}getConfig(){return{...this.config}}setConfig(e){this.config=this.mergeConfig(this.config,e),e.renderers&&V().registerMultiple(e.renderers)}get(e){return this.config[e]}reset(){this.config={...U}}mergeConfig(e,i){const l={...e};for(const c in i)i[c]&&typeof i[c]=="object"&&!Array.isArray(i[c])?l[c]=this.mergeConfig(e[c]||{},i[c]):l[c]=i[c];return l}}let N=null;function j(){return N||(N=new ke),N}function we(n){j().setConfig(n)}function _e(){return j().getConfig()}const Be=["title"],Y=t.defineComponent({__name:"index",props:{data:{default:()=>[]},columns:{default:()=>[]},rowKey:{default:"id"},loading:{type:Boolean,default:!1},permissions:{default:()=>[]},cacheKey:{},pagination:{default:()=>({})}},emits:["update:columns","cellChange","cellBlur","cellEnter","cellClick"],setup(n,{expose:e,emit:i}){const l=n,c=i;j().init();const{columns:d}=Z(l.columns,{cacheKey:l.cacheKey??""}),u=t.ref(!1);t.watch(d,p=>{u.value&&c("update:columns",p),u.value=!0},{deep:!0,immediate:!0});const y=t.computed(()=>d.value.filter(p=>p.type==="operation")),m=t.computed(()=>{const p=new Map;return y.value.forEach(h=>{const w=v(h.buttons||[],h.maxbtn??10,l.permissions||[]);p.set(h.key,w)}),p}),g=p=>m.value.get(p.key),a=p=>{var E;if(!q(p))return!1;const h=g(p);return!h||!(p.buttons||[]).length?!1:(E=l.data)!=null&&E.length?h.hasAnyVisibleButton(l.data):h.hasAnyButton.value},o=p=>{var w;const h=g(p);return h?(w=l.data)!=null&&w.length?h.getMaxOptWidth(l.data):h.optWidth.value:0},s=(p,h)=>{const w=g(p);return w?(p.buttons||[]).length?w.getVisibleButtons(h):[]:[]},r=t.computed(()=>d.value.filter(p=>p.type==="operation"?a(p):I(p.type)?!0:p.visible!==!1)),f=(p,h)=>p.type==="selection"?`selection-${h}`:p.type==="index"?`index-${h}`:p.type==="operation"?`operation-${p.key}-${h}`:`${p.key}-${h}`,b=p=>{var E,$;const h=(E=l.pagination)==null?void 0:E.page,w=($=l.pagination)==null?void 0:$.size;return h&&w?(h-1)*w+p+1:p+1},T=t.computed(()=>{const p=V(),h={};return p.names().forEach(w=>{const E=p.get(w);E&&(h[w]=E)}),h}),R=(p,h)=>{c("cellChange",p,h)},G=(p,h)=>{c("cellBlur",p,h)},D=(p,h)=>{c("cellEnter",p,h)},xe=(p,h)=>{h&&c("cellClick",p,h)},Q=t.ref();return e({tableRef:Q}),(p,h)=>{const w=t.resolveComponent("el-table-column"),E=t.resolveComponent("el-button"),$=t.resolveComponent("el-table"),Se=t.resolveDirective("loading");return t.withDirectives((t.openBlock(),t.createBlock($,t.mergeProps({ref_key:"tableRef",ref:Q},p.$attrs,{data:n.data,"row-key":n.rowKey,class:"smart_table"}),{default:t.withCtx(()=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(r.value,(k,Fe)=>(t.openBlock(),t.createElementBlock(t.Fragment,{key:f(k,Fe)},[k.type==="selection"?(t.openBlock(),t.createBlock(w,t.mergeProps({key:0,type:"selection"},{ref_for:!0},k.columnProps),null,16)):k.type==="index"?(t.openBlock(),t.createBlock(w,t.mergeProps({key:1,type:"index",label:k.label||"#",align:"center"},{ref_for:!0},k.columnProps),{default:t.withCtx(({$index:x})=>[t.createTextVNode(t.toDisplayString(b(x)),1)]),_:1},16,["label"])):k.type==="operation"?(t.openBlock(),t.createBlock(w,t.mergeProps({key:2,label:k.label||"操作",align:"center"},{ref_for:!0},{...k.columnProps,width:o(k)}),{default:t.withCtx(({row:x})=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(s(k,x),F=>(t.openBlock(),t.createBlock(E,{key:F.label,type:F.type||"primary",link:"",onClick:L=>F.action(x)},{default:t.withCtx(()=>[t.createTextVNode(t.toDisplayString(F.label),1)]),_:2},1032,["type","onClick"]))),128))]),_:2},1040,["label"])):(t.openBlock(),t.createBlock(w,t.mergeProps({key:3,prop:k.key,label:k.label,align:"center"},{ref_for:!0},k.columnProps||{}),{default:t.withCtx(x=>{var F,L;return[k.type==="slot"?(t.openBlock(),t.createElementBlock(t.Fragment,{key:0},[x.$index>=0?t.renderSlot(p.$slots,k.slot||k.key,t.mergeProps({key:0,ref_for:!0},x)):t.createCommentVNode("",!0)],64)):k.type&&T.value[k.type]?(t.openBlock(),t.createBlock(t.resolveDynamicComponent(T.value[k.type]),{key:1,row:x.row,col:k,index:x.$index,onCellChange:R,onCellBlur:G,onCellEnter:D,onClick:xe},null,40,["row","col","index"])):(t.openBlock(),t.createElementBlock("span",{key:2,style:t.normalizeStyle(((F=k.props)==null?void 0:F.style)||""),class:t.normalizeClass(((L=k.props)==null?void 0:L.class)||""),title:t.unref(B)(x.row,k.key)},t.toDisplayString(t.unref(B)(x.row,k.key)),15,Be))]}),_:2},1040,["prop","label"]))],64))),128))]),_:3},16,["data","row-key"])),[[Se,n.loading]])}}});function Ee(n,e){return{key:n,...e}}C.SmartTable=Y,C.builtInRenderers=K,C.createFunctionalRenderer=S,C.createRenderer=be,C.default=Y,C.defineColumn=Ee,C.getRendererManager=V,C.getSmartTableConfig=_e,C.isOperationColumn=q,C.isRendererType=X,C.isSpecialColumn=I,C.registerBuiltInRenderers=J,C.setSmartTableConfig=we,C.validateRendererProps=te,C.wrapSFCComponent=M,Object.defineProperties(C,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
3
3
  //# sourceMappingURL=vue3-smart-table.umd.js.map