vue3-smart-table 1.0.5 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -0
- package/LICENSE +21 -0
- package/README.md +1 -1
- package/dist/types/components/SmartTable/config.d.ts +50 -0
- package/dist/types/components/SmartTable/hooks/useOperationColumn.d.ts +19 -0
- package/dist/types/components/SmartTable/hooks/useTableColumns.d.ts +28 -0
- package/dist/types/components/SmartTable/index.vue.d.ts +89 -0
- package/dist/types/components/SmartTable/renderer.d.ts +57 -0
- package/dist/types/components/SmartTable/renderers/index.d.ts +46 -0
- package/dist/types/components/SmartTable/renderers/input.vue.d.ts +11 -0
- package/dist/types/components/SmartTable/renderers/inputNumber.vue.d.ts +12 -0
- package/dist/types/components/SmartTable/renderers/select.vue.d.ts +12 -0
- package/dist/types/components/SmartTable/types.d.ts +193 -0
- package/dist/types/components/SmartTable/utils/path.d.ts +9 -0
- package/dist/types/index.d.ts +13 -0
- package/dist/types/types/enhanced.d.ts +58 -0
- package/dist/vue3-smart-table.cjs.js +1 -1
- package/dist/vue3-smart-table.cjs.js.map +1 -1
- package/dist/vue3-smart-table.es.js +130 -126
- package/dist/vue3-smart-table.es.js.map +1 -1
- package/dist/vue3-smart-table.umd.js +2 -2
- package/dist/vue3-smart-table.umd.js.map +1 -1
- package/package.json +45 -10
- package/src/components/SmartTable/index.vue +1 -0
- package/src/components/SmartTable/renderer.ts +3 -2
- package/src/components/SmartTable/renderers/index.ts +3 -2
- package/src/components/SmartTable/renderers/input.vue +1 -0
- package/src/components/SmartTable/renderers/inputNumber.vue +1 -0
- package/src/components/SmartTable/renderers/select.vue +1 -0
- package/src/components/SmartTable/types.ts +11 -1
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [3.0.0] - 2025-12-29
|
|
9
|
+
|
|
10
|
+
### ⚠️ Breaking Changes
|
|
11
|
+
- 重新发布项目,废弃之前的 2.0.0 版本
|
|
12
|
+
- 建议所有用户升级到 3.0.0 版本
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
- 基于 Vue 3 + Element Plus 的高可复用表格组件
|
|
16
|
+
- 插件化架构,支持自定义渲染器
|
|
17
|
+
- 内置 13 种常用渲染器(html、copy、img、dict、map、formatter、icon、input、input-number、select、button、link、slot)
|
|
18
|
+
- 完整的 TypeScript 类型支持
|
|
19
|
+
- 操作列权限控制
|
|
20
|
+
- 列配置缓存
|
|
21
|
+
|
|
22
|
+
## [2.0.0] - 2025-12-29
|
|
23
|
+
|
|
24
|
+
### ⚠️ Deprecated
|
|
25
|
+
- 此版本已被废弃,请升级到 3.0.0 版本
|
|
26
|
+
|
|
27
|
+
### Added
|
|
28
|
+
- 全新重构发布
|
|
29
|
+
- 基于 Vue 3 + Element Plus 的高可复用表格组件
|
|
30
|
+
- 插件化架构,支持自定义渲染器
|
|
31
|
+
- 内置 13 种常用渲染器(html、copy、img、dict、map、formatter、icon、input、input-number、select、button、link、slot)
|
|
32
|
+
- 完整的 TypeScript 类型支持
|
|
33
|
+
- 操作列权限控制
|
|
34
|
+
- 列配置缓存
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 chenx18
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1342,7 +1342,7 @@ import { SmartTable } from 'vue3-smart-table'
|
|
|
1342
1342
|
</SmartTable>
|
|
1343
1343
|
```
|
|
1344
1344
|
## 完整示例代码
|
|
1345
|
-

|
|
1346
1346
|
```vue
|
|
1347
1347
|
<template>
|
|
1348
1348
|
<div class="demo-container" style="padding: 20px;">
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 全局配置管理
|
|
3
|
+
*/
|
|
4
|
+
import type { SmartTableConfig } from './types';
|
|
5
|
+
/**
|
|
6
|
+
* 全局配置类
|
|
7
|
+
*/
|
|
8
|
+
declare class ConfigManager {
|
|
9
|
+
private config;
|
|
10
|
+
/**
|
|
11
|
+
* 获取所有配置
|
|
12
|
+
*/
|
|
13
|
+
getConfig(): SmartTableConfig;
|
|
14
|
+
/**
|
|
15
|
+
* 设置配置
|
|
16
|
+
*/
|
|
17
|
+
setConfig(config: Partial<SmartTableConfig>): void;
|
|
18
|
+
/**
|
|
19
|
+
* 获取特定配置项
|
|
20
|
+
*/
|
|
21
|
+
get<K extends keyof SmartTableConfig>(key: K): SmartTableConfig[K];
|
|
22
|
+
/**
|
|
23
|
+
* 重置为默认配置
|
|
24
|
+
*/
|
|
25
|
+
reset(): void;
|
|
26
|
+
/**
|
|
27
|
+
* 深度合并配置
|
|
28
|
+
*/
|
|
29
|
+
private mergeConfig;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 获取全局配置管理器
|
|
33
|
+
*/
|
|
34
|
+
export declare function getConfigManager(): ConfigManager;
|
|
35
|
+
/**
|
|
36
|
+
* 安装插件(用于 Vue.use())
|
|
37
|
+
*/
|
|
38
|
+
export interface SmartTablePlugin {
|
|
39
|
+
install: (options?: SmartTableConfig) => void;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 创建插件实例
|
|
43
|
+
*/
|
|
44
|
+
export declare function createSmartTablePlugin(defaultOptions?: SmartTableConfig): SmartTablePlugin;
|
|
45
|
+
/**
|
|
46
|
+
* 全局配置快捷方法
|
|
47
|
+
*/
|
|
48
|
+
export declare function setSmartTableConfig(config: Partial<SmartTableConfig>): void;
|
|
49
|
+
export declare function getSmartTableConfig(): SmartTableConfig;
|
|
50
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ButtonConfig } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* useOperationColumn
|
|
4
|
+
*
|
|
5
|
+
* 操作列专用逻辑 Hook,负责:
|
|
6
|
+
* 1. 根据权限判断操作列是否需要显示
|
|
7
|
+
* 2. 计算操作列宽度(支持按钮自定义宽度)
|
|
8
|
+
* 3. 支持行级 visible 配置
|
|
9
|
+
* @param buttonConfigs 操作列按钮配置
|
|
10
|
+
* @param maxbtn 操作列最多显示按钮数量(超过的不参与宽度计算)
|
|
11
|
+
* @param userPermissions 当前用户权限列表
|
|
12
|
+
*/
|
|
13
|
+
export declare function useOperationColumn(buttonConfigs: ButtonConfig[], maxbtn?: number, userPermissions?: string[]): {
|
|
14
|
+
hasAnyButton: import("vue").ComputedRef<boolean>;
|
|
15
|
+
optWidth: import("vue").ComputedRef<number>;
|
|
16
|
+
hasAnyVisibleButton: (rows: any[]) => boolean;
|
|
17
|
+
getMaxOptWidth: (rows: any[]) => any;
|
|
18
|
+
getVisibleButtons: (row: any) => ButtonConfig<any>[];
|
|
19
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useTableColumns
|
|
3
|
+
*
|
|
4
|
+
* 表格列管理 Hook
|
|
5
|
+
*
|
|
6
|
+
* 职责:
|
|
7
|
+
* - 管理表格列顺序
|
|
8
|
+
* - 管理列显示 / 隐藏
|
|
9
|
+
* - 持久化用户配置
|
|
10
|
+
*/
|
|
11
|
+
export declare function useTableColumns(defaultColumns: any[], options?: {
|
|
12
|
+
/** 缓存唯一标识 */
|
|
13
|
+
cacheKey?: string;
|
|
14
|
+
/** 存储介质,默认 localStorage */
|
|
15
|
+
storage?: Storage;
|
|
16
|
+
}): {
|
|
17
|
+
/** 当前列配置(响应式) */
|
|
18
|
+
columns: import("vue").Ref<any[], any[]>;
|
|
19
|
+
/**
|
|
20
|
+
* 主动设置列配置
|
|
21
|
+
* 常用于:列设置弹窗 / 拖拽排序完成
|
|
22
|
+
*/
|
|
23
|
+
setColumns(newColumns: any[]): void;
|
|
24
|
+
/**
|
|
25
|
+
* 重置为默认列配置
|
|
26
|
+
*/
|
|
27
|
+
resetColumns(): void;
|
|
28
|
+
};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { PropType } from 'vue';
|
|
2
|
+
declare var __VLS_44: any, __VLS_45: any, __VLS_54: any, __VLS_55: any;
|
|
3
|
+
type __VLS_Slots = {} & {
|
|
4
|
+
[K in NonNullable<typeof __VLS_44>]?: (props: typeof __VLS_45) => any;
|
|
5
|
+
} & {
|
|
6
|
+
[K in NonNullable<typeof __VLS_54>]?: (props: typeof __VLS_55) => any;
|
|
7
|
+
};
|
|
8
|
+
declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
9
|
+
data: {
|
|
10
|
+
type: ArrayConstructor;
|
|
11
|
+
default: () => never[];
|
|
12
|
+
};
|
|
13
|
+
columns: {
|
|
14
|
+
type: ArrayConstructor;
|
|
15
|
+
default: () => never[];
|
|
16
|
+
};
|
|
17
|
+
rowKey: {
|
|
18
|
+
type: StringConstructor;
|
|
19
|
+
default: string;
|
|
20
|
+
};
|
|
21
|
+
loading: {
|
|
22
|
+
type: BooleanConstructor;
|
|
23
|
+
default: boolean;
|
|
24
|
+
};
|
|
25
|
+
permissions: {
|
|
26
|
+
type: PropType<string[]>;
|
|
27
|
+
default: () => never[];
|
|
28
|
+
};
|
|
29
|
+
cacheKey: StringConstructor;
|
|
30
|
+
pagination: {
|
|
31
|
+
type: ObjectConstructor;
|
|
32
|
+
default: () => {};
|
|
33
|
+
};
|
|
34
|
+
}>, {
|
|
35
|
+
tableRef: import("vue").Ref<any, any>;
|
|
36
|
+
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
37
|
+
"update:columns": (...args: any[]) => void;
|
|
38
|
+
cellChange: (...args: any[]) => void;
|
|
39
|
+
cellBlur: (...args: any[]) => void;
|
|
40
|
+
cellEnter: (...args: any[]) => void;
|
|
41
|
+
"cell-click": (...args: any[]) => void;
|
|
42
|
+
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
43
|
+
data: {
|
|
44
|
+
type: ArrayConstructor;
|
|
45
|
+
default: () => never[];
|
|
46
|
+
};
|
|
47
|
+
columns: {
|
|
48
|
+
type: ArrayConstructor;
|
|
49
|
+
default: () => never[];
|
|
50
|
+
};
|
|
51
|
+
rowKey: {
|
|
52
|
+
type: StringConstructor;
|
|
53
|
+
default: string;
|
|
54
|
+
};
|
|
55
|
+
loading: {
|
|
56
|
+
type: BooleanConstructor;
|
|
57
|
+
default: boolean;
|
|
58
|
+
};
|
|
59
|
+
permissions: {
|
|
60
|
+
type: PropType<string[]>;
|
|
61
|
+
default: () => never[];
|
|
62
|
+
};
|
|
63
|
+
cacheKey: StringConstructor;
|
|
64
|
+
pagination: {
|
|
65
|
+
type: ObjectConstructor;
|
|
66
|
+
default: () => {};
|
|
67
|
+
};
|
|
68
|
+
}>> & Readonly<{
|
|
69
|
+
"onUpdate:columns"?: ((...args: any[]) => any) | undefined;
|
|
70
|
+
onCellChange?: ((...args: any[]) => any) | undefined;
|
|
71
|
+
onCellBlur?: ((...args: any[]) => any) | undefined;
|
|
72
|
+
onCellEnter?: ((...args: any[]) => any) | undefined;
|
|
73
|
+
"onCell-click"?: ((...args: any[]) => any) | undefined;
|
|
74
|
+
}>, {
|
|
75
|
+
data: unknown[];
|
|
76
|
+
loading: boolean;
|
|
77
|
+
columns: unknown[];
|
|
78
|
+
rowKey: string;
|
|
79
|
+
permissions: string[];
|
|
80
|
+
pagination: Record<string, any>;
|
|
81
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
82
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
83
|
+
declare const _default: typeof __VLS_export;
|
|
84
|
+
export default _default;
|
|
85
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
86
|
+
new (): {
|
|
87
|
+
$slots: S;
|
|
88
|
+
};
|
|
89
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SmartTable 内部渲染器管理系统
|
|
3
|
+
* 移动到组件内部,保证组件的自包含性
|
|
4
|
+
*/
|
|
5
|
+
import { Component } from 'vue';
|
|
6
|
+
import type { Renderer } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* 渲染器注册表接口
|
|
9
|
+
*/
|
|
10
|
+
export interface RendererRegistry {
|
|
11
|
+
register(name: string, renderer: Renderer): void;
|
|
12
|
+
registerMultiple(renderers: Record<string, Renderer>): void;
|
|
13
|
+
get(name: string): Renderer | undefined;
|
|
14
|
+
has(name: string): boolean;
|
|
15
|
+
unregister(name: string): boolean;
|
|
16
|
+
clear(): void;
|
|
17
|
+
names(): string[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 渲染器管理器类
|
|
21
|
+
*/
|
|
22
|
+
declare class RendererManager implements RendererRegistry {
|
|
23
|
+
private renderers;
|
|
24
|
+
register(name: string, renderer: Renderer): void;
|
|
25
|
+
registerMultiple(renderers: Record<string, Renderer>): void;
|
|
26
|
+
get(name: string): Renderer | undefined;
|
|
27
|
+
has(name: string): boolean;
|
|
28
|
+
unregister(name: string): boolean;
|
|
29
|
+
clear(): void;
|
|
30
|
+
names(): string[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 获取渲染器管理器
|
|
34
|
+
*/
|
|
35
|
+
export declare function getRendererManager(): RendererManager;
|
|
36
|
+
/**
|
|
37
|
+
* 包装 SFC 组件为渲染器
|
|
38
|
+
*/
|
|
39
|
+
export declare function wrapSFCComponent(comp: Component): Renderer;
|
|
40
|
+
/**
|
|
41
|
+
* 创建函数式渲染器
|
|
42
|
+
*/
|
|
43
|
+
export declare function createFunctionalRenderer(render: (props: {
|
|
44
|
+
row: any;
|
|
45
|
+
col: any;
|
|
46
|
+
index: number;
|
|
47
|
+
onCellChange?: (row: any, col: any) => void;
|
|
48
|
+
onCellBlur?: (row: any, col: any) => void;
|
|
49
|
+
onCellEnter?: (row: any, col: any) => void;
|
|
50
|
+
onClick?: (row: any, col: any) => void;
|
|
51
|
+
}) => any): Renderer;
|
|
52
|
+
/**
|
|
53
|
+
* 验证渲染器配置
|
|
54
|
+
* 在开发环境下验证 renderProps 的正确性
|
|
55
|
+
*/
|
|
56
|
+
export declare function validateRendererProps(rendererName: string, renderProps: Record<string, any> | undefined): void;
|
|
57
|
+
export {};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { ColumnConfig } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* formatter 渲染器
|
|
4
|
+
*/
|
|
5
|
+
export declare function isDataColumn(col: ColumnConfig): col is any;
|
|
6
|
+
/**
|
|
7
|
+
* 所有内置渲染器
|
|
8
|
+
*/
|
|
9
|
+
export declare const builtInRenderers: {
|
|
10
|
+
input: import("../types").Renderer;
|
|
11
|
+
'input-number': import("../types").Renderer;
|
|
12
|
+
select: import("../types").Renderer;
|
|
13
|
+
button: import("../types").Renderer;
|
|
14
|
+
link: import("../types").Renderer;
|
|
15
|
+
html: import("../types").Renderer;
|
|
16
|
+
copy: import("../types").Renderer;
|
|
17
|
+
img: import("../types").Renderer;
|
|
18
|
+
dict: import("../types").Renderer;
|
|
19
|
+
map: import("../types").Renderer;
|
|
20
|
+
formatter: import("../types").Renderer;
|
|
21
|
+
icon: import("../types").Renderer;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* 安装所有内置渲染器
|
|
25
|
+
*/
|
|
26
|
+
export declare function registerBuiltInRenderers(registry: {
|
|
27
|
+
registerMultiple: (renderers: Record<string, any>) => void;
|
|
28
|
+
}): void;
|
|
29
|
+
/**
|
|
30
|
+
* 创建默认渲染器集合(兼容旧 API)
|
|
31
|
+
* @deprecated 建议使用插件化架构
|
|
32
|
+
*/
|
|
33
|
+
export declare function createRenderer(): {
|
|
34
|
+
input: import("../types").Renderer;
|
|
35
|
+
'input-number': import("../types").Renderer;
|
|
36
|
+
select: import("../types").Renderer;
|
|
37
|
+
button: import("../types").Renderer;
|
|
38
|
+
link: import("../types").Renderer;
|
|
39
|
+
html: import("../types").Renderer;
|
|
40
|
+
copy: import("../types").Renderer;
|
|
41
|
+
img: import("../types").Renderer;
|
|
42
|
+
dict: import("../types").Renderer;
|
|
43
|
+
map: import("../types").Renderer;
|
|
44
|
+
formatter: import("../types").Renderer;
|
|
45
|
+
icon: import("../types").Renderer;
|
|
46
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ColumnConfig } from '../types';
|
|
2
|
+
interface Props {
|
|
3
|
+
readonly row: any;
|
|
4
|
+
readonly col: ColumnConfig;
|
|
5
|
+
readonly index: number;
|
|
6
|
+
onCellBlur?: (row: any, col: ColumnConfig) => void;
|
|
7
|
+
onCellEnter?: (row: any, col: ColumnConfig) => void;
|
|
8
|
+
}
|
|
9
|
+
declare const __VLS_export: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
10
|
+
declare const _default: typeof __VLS_export;
|
|
11
|
+
export default _default;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ColumnConfig } from '../types';
|
|
2
|
+
interface Props {
|
|
3
|
+
readonly row: any;
|
|
4
|
+
readonly col: ColumnConfig;
|
|
5
|
+
readonly index: number;
|
|
6
|
+
onCellChange?: (row: any, col: ColumnConfig) => void;
|
|
7
|
+
onCellBlur?: (row: any, col: ColumnConfig) => void;
|
|
8
|
+
onCellEnter?: (row: any, col: ColumnConfig) => void;
|
|
9
|
+
}
|
|
10
|
+
declare const __VLS_export: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
11
|
+
declare const _default: typeof __VLS_export;
|
|
12
|
+
export default _default;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ColumnConfig } from '../types';
|
|
2
|
+
interface Props {
|
|
3
|
+
readonly row: any;
|
|
4
|
+
readonly col: ColumnConfig;
|
|
5
|
+
readonly index: number;
|
|
6
|
+
onCellChange?: (row: any, col: ColumnConfig) => void;
|
|
7
|
+
onCellBlur?: (row: any, col: ColumnConfig) => void;
|
|
8
|
+
onCellEnter?: (row: any, col: ColumnConfig) => void;
|
|
9
|
+
}
|
|
10
|
+
declare const __VLS_export: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
11
|
+
declare const _default: typeof __VLS_export;
|
|
12
|
+
export default _default;
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import type { ButtonProps, TableColumnCtx } from 'element-plus';
|
|
2
|
+
import { DefaultRow } from 'element-plus/es/components/table/src/table/defaults';
|
|
3
|
+
import type { Component } from 'vue';
|
|
4
|
+
export type { validateRendererProps } from './renderer';
|
|
5
|
+
/** 支持额外参数(Element Plus 透传 props) */
|
|
6
|
+
export type WithRestProps<T> = T & {
|
|
7
|
+
[key: string]: any;
|
|
8
|
+
};
|
|
9
|
+
/** Renderer 组件类型 */
|
|
10
|
+
export type Renderer = Component;
|
|
11
|
+
/** 渲染器注册表接口 */
|
|
12
|
+
export interface RendererRegistry {
|
|
13
|
+
register(name: string, renderer: Renderer): void;
|
|
14
|
+
registerMultiple(renderers: Record<string, Renderer>): void;
|
|
15
|
+
get(name: string): Renderer | undefined;
|
|
16
|
+
has(name: string): boolean;
|
|
17
|
+
unregister(name: string): boolean;
|
|
18
|
+
clear(): void;
|
|
19
|
+
names(): string[];
|
|
20
|
+
}
|
|
21
|
+
/** 全局配置接口 */
|
|
22
|
+
export interface SmartTableConfig {
|
|
23
|
+
/** 自定义渲染器 */
|
|
24
|
+
renderers?: Record<string, Renderer>;
|
|
25
|
+
/** 默认分页配置 */
|
|
26
|
+
defaultPagination?: {
|
|
27
|
+
page?: number;
|
|
28
|
+
size?: number;
|
|
29
|
+
total?: number;
|
|
30
|
+
};
|
|
31
|
+
/** 默认表格属性 */
|
|
32
|
+
defaultTableProps?: Record<string, any>;
|
|
33
|
+
/** 默认列属性 */
|
|
34
|
+
defaultColumnProps?: Record<string, any>;
|
|
35
|
+
}
|
|
36
|
+
export interface ButtonConfig<R = any> {
|
|
37
|
+
permission?: string | string[];
|
|
38
|
+
label: string;
|
|
39
|
+
type?: 'primary' | 'success' | 'warning' | 'danger' | 'info';
|
|
40
|
+
action: (row: R) => void;
|
|
41
|
+
visible?: (row: R) => boolean;
|
|
42
|
+
width?: number;
|
|
43
|
+
}
|
|
44
|
+
export type RendererName = 'html' | 'copy' | 'img' | 'dict' | 'map' | 'formatter' | 'icon' | 'input' | 'input-number' | 'select' | 'button' | 'link' | 'slot';
|
|
45
|
+
/** renderer 对应的 renderProps */
|
|
46
|
+
export interface RendererPropsMap {
|
|
47
|
+
html: WithRestProps<{
|
|
48
|
+
style?: string;
|
|
49
|
+
class?: string;
|
|
50
|
+
}>;
|
|
51
|
+
copy: WithRestProps<{
|
|
52
|
+
/** 复制按钮图标颜色 */
|
|
53
|
+
iconColor?: string;
|
|
54
|
+
/** 复制按钮提示文本 */
|
|
55
|
+
copyTitle?: string;
|
|
56
|
+
/** 复制成功提示 */
|
|
57
|
+
successText?: string;
|
|
58
|
+
/** 复制失败提示 */
|
|
59
|
+
errorText?: string;
|
|
60
|
+
lineClamp?: number;
|
|
61
|
+
textStyles?: any;
|
|
62
|
+
textClass?: string;
|
|
63
|
+
}>;
|
|
64
|
+
img: WithRestProps<{
|
|
65
|
+
/** 图片宽度 */
|
|
66
|
+
width?: string | number;
|
|
67
|
+
/** 图片高度 */
|
|
68
|
+
height?: string | number;
|
|
69
|
+
/** 图片适应方式 */
|
|
70
|
+
fit?: 'contain' | 'cover' | 'fill' | 'none' | 'scale-down';
|
|
71
|
+
/** 预览图片列表 */
|
|
72
|
+
previewSrcList?: string[];
|
|
73
|
+
/** 无图片时的占位文本 */
|
|
74
|
+
placeholder?: string;
|
|
75
|
+
/** 自定义样式 */
|
|
76
|
+
style?: string;
|
|
77
|
+
}>;
|
|
78
|
+
dict: WithRestProps<{
|
|
79
|
+
/** 字典配置 */
|
|
80
|
+
options: Array<{
|
|
81
|
+
label: string;
|
|
82
|
+
value: string | number;
|
|
83
|
+
listClass?: string;
|
|
84
|
+
cssClass?: string;
|
|
85
|
+
}>;
|
|
86
|
+
/** 是否显示未匹配的值 */
|
|
87
|
+
showValue?: boolean;
|
|
88
|
+
}>;
|
|
89
|
+
map: WithRestProps<{
|
|
90
|
+
/** key-value 映射 */
|
|
91
|
+
options: Record<string | number, any>;
|
|
92
|
+
}>;
|
|
93
|
+
formatter: never;
|
|
94
|
+
icon: WithRestProps<{
|
|
95
|
+
/** 自定义样式 */
|
|
96
|
+
style?: string;
|
|
97
|
+
/** 图标大小(像素) */
|
|
98
|
+
size?: number;
|
|
99
|
+
/** 自定义类名 */
|
|
100
|
+
class?: string;
|
|
101
|
+
}>;
|
|
102
|
+
input: WithRestProps<{
|
|
103
|
+
/** 占位文本 */
|
|
104
|
+
placeholder?: string;
|
|
105
|
+
/** 输入框尺寸 */
|
|
106
|
+
size?: 'small' | 'default' | 'large';
|
|
107
|
+
/** 是否可清空 */
|
|
108
|
+
clearable?: boolean;
|
|
109
|
+
}>;
|
|
110
|
+
'input-number': WithRestProps<{
|
|
111
|
+
/** 最小值 */
|
|
112
|
+
min?: number;
|
|
113
|
+
/** 最大值 */
|
|
114
|
+
max?: number;
|
|
115
|
+
/** 步长 */
|
|
116
|
+
step?: number;
|
|
117
|
+
/** 精度 */
|
|
118
|
+
precision?: number;
|
|
119
|
+
/** 输入框尺寸 */
|
|
120
|
+
size?: 'small' | 'default' | 'large';
|
|
121
|
+
/** 是否显示增减按钮 */
|
|
122
|
+
controls?: boolean;
|
|
123
|
+
}>;
|
|
124
|
+
select: WithRestProps<{
|
|
125
|
+
/** 选项配置 */
|
|
126
|
+
options: Array<{
|
|
127
|
+
label: string;
|
|
128
|
+
value: string | number;
|
|
129
|
+
}>;
|
|
130
|
+
/** 占位文本 */
|
|
131
|
+
placeholder?: string;
|
|
132
|
+
/** 选择器尺寸 */
|
|
133
|
+
size?: 'small' | 'default' | 'large';
|
|
134
|
+
/** 是否可清空 */
|
|
135
|
+
clearable?: boolean;
|
|
136
|
+
}>;
|
|
137
|
+
button: WithRestProps<ButtonProps & {
|
|
138
|
+
/** 按钮文本 */
|
|
139
|
+
label?: string;
|
|
140
|
+
/** 自定义样式 */
|
|
141
|
+
style?: string;
|
|
142
|
+
/** 自定义类名 */
|
|
143
|
+
class?: string;
|
|
144
|
+
}>;
|
|
145
|
+
link: WithRestProps<{
|
|
146
|
+
/** 链接文本 */
|
|
147
|
+
label?: string;
|
|
148
|
+
/** 链接地址 */
|
|
149
|
+
href: string;
|
|
150
|
+
/** 是否新窗口打开 */
|
|
151
|
+
blank?: boolean;
|
|
152
|
+
/** 自定义样式 */
|
|
153
|
+
style?: string;
|
|
154
|
+
/** 自定义类名 */
|
|
155
|
+
class?: string;
|
|
156
|
+
}>;
|
|
157
|
+
}
|
|
158
|
+
export type ColumnType = 'default' | 'selection' | 'index' | 'operation';
|
|
159
|
+
export interface BaseColumn<R extends DefaultRow> {
|
|
160
|
+
key: keyof R & string;
|
|
161
|
+
label?: string;
|
|
162
|
+
visible?: boolean;
|
|
163
|
+
inControl?: boolean;
|
|
164
|
+
columnProps?: Partial<TableColumnCtx<R>>;
|
|
165
|
+
render?: RendererName;
|
|
166
|
+
slot?: string;
|
|
167
|
+
renderProps?: Partial<RendererPropsMap[keyof RendererPropsMap]>;
|
|
168
|
+
buttons?: ButtonConfig<R>[];
|
|
169
|
+
maxbtn?: number;
|
|
170
|
+
__rows?: R[];
|
|
171
|
+
}
|
|
172
|
+
export interface SelectionColumn<R extends DefaultRow> extends BaseColumn<R> {
|
|
173
|
+
type: 'selection';
|
|
174
|
+
}
|
|
175
|
+
export interface IndexColumn<R extends DefaultRow> extends BaseColumn<R> {
|
|
176
|
+
type: 'index';
|
|
177
|
+
}
|
|
178
|
+
export interface OperationColumn<R extends DefaultRow> extends BaseColumn<R> {
|
|
179
|
+
type: 'operation';
|
|
180
|
+
buttons: ButtonConfig<R>[];
|
|
181
|
+
}
|
|
182
|
+
export interface DataColumn<R extends DefaultRow> extends BaseColumn<R> {
|
|
183
|
+
type?: 'default';
|
|
184
|
+
/**
|
|
185
|
+
* 格式化函数
|
|
186
|
+
* @param value 单元格值
|
|
187
|
+
* @param row 当前行数据
|
|
188
|
+
* @param index 当前行索引(从0开始)
|
|
189
|
+
* @returns 格式化后的显示内容
|
|
190
|
+
*/
|
|
191
|
+
formatter?: (value: any, row: R, index: number) => any;
|
|
192
|
+
}
|
|
193
|
+
export type ColumnConfig<R extends DefaultRow = any> = SelectionColumn<R> | IndexColumn<R> | OperationColumn<R> | DataColumn<R>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vue3 Smart Table - 主入口文件
|
|
3
|
+
*
|
|
4
|
+
* 基于 Vue 3 + Element Plus 的高可复用表格组件库
|
|
5
|
+
*/
|
|
6
|
+
import SmartTable from './components/SmartTable/index.vue';
|
|
7
|
+
export * from './components/SmartTable/types';
|
|
8
|
+
export { getRendererManager, wrapSFCComponent, createFunctionalRenderer, validateRendererProps } from './components/SmartTable/renderer';
|
|
9
|
+
export { setSmartTableConfig, getSmartTableConfig } from './components/SmartTable/config';
|
|
10
|
+
export { builtInRenderers, registerBuiltInRenderers, createRenderer } from './components/SmartTable/renderers';
|
|
11
|
+
export { defineColumn } from './types/enhanced';
|
|
12
|
+
export { SmartTable };
|
|
13
|
+
export default SmartTable;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 增强类型系统 - 提供更好的类型推断
|
|
3
|
+
*/
|
|
4
|
+
import type { ColumnConfig, RendererName } from '../components/SmartTable/types';
|
|
5
|
+
/**
|
|
6
|
+
* 提取行数据的类型
|
|
7
|
+
*/
|
|
8
|
+
export type ExtractRowType<T> = T extends ColumnConfig<infer R> ? R : never;
|
|
9
|
+
/**
|
|
10
|
+
* 根据列配置提取表格数据类型
|
|
11
|
+
*/
|
|
12
|
+
export type TableDataFromColumns<T extends ColumnConfig[]> = T extends (infer C)[] ? C extends ColumnConfig<infer R> ? R : any : any;
|
|
13
|
+
/**
|
|
14
|
+
* 渲染器 Props 类型推断
|
|
15
|
+
*/
|
|
16
|
+
export type InferRendererProps<T extends RendererName> = T extends 'html' ? {
|
|
17
|
+
style?: string;
|
|
18
|
+
class?: string;
|
|
19
|
+
[key: string]: any;
|
|
20
|
+
} : T extends 'copy' ? {
|
|
21
|
+
successText?: string;
|
|
22
|
+
errorText?: string;
|
|
23
|
+
iconColor?: string;
|
|
24
|
+
[key: string]: any;
|
|
25
|
+
} : T extends 'img' ? {
|
|
26
|
+
width?: string | number;
|
|
27
|
+
height?: string | number;
|
|
28
|
+
fit?: string;
|
|
29
|
+
previewSrcList?: string[];
|
|
30
|
+
[key: string]: any;
|
|
31
|
+
} : T extends 'dict' ? {
|
|
32
|
+
options: Array<{
|
|
33
|
+
label: string;
|
|
34
|
+
value: string | number;
|
|
35
|
+
listClass?: string;
|
|
36
|
+
cssClass?: string;
|
|
37
|
+
}>;
|
|
38
|
+
showValue?: boolean;
|
|
39
|
+
} : T extends 'map' ? {
|
|
40
|
+
options: Record<string | number, any>;
|
|
41
|
+
} : T extends 'input' ? {
|
|
42
|
+
placeholder?: string;
|
|
43
|
+
size?: 'small' | 'default' | 'large';
|
|
44
|
+
clearable?: boolean;
|
|
45
|
+
} : T extends 'select' ? {
|
|
46
|
+
options: Array<{
|
|
47
|
+
label: string;
|
|
48
|
+
value: string | number;
|
|
49
|
+
}>;
|
|
50
|
+
placeholder?: string;
|
|
51
|
+
clearable?: boolean;
|
|
52
|
+
} : {
|
|
53
|
+
[key: string]: any;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* 快捷创建列的辅助函数(类型安全简化版)
|
|
57
|
+
*/
|
|
58
|
+
export declare function defineColumn(key: string, config?: Partial<Omit<ColumnConfig, 'key'>>): ColumnConfig;
|