@mxmweb/xviewer 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/Preview.d.ts +1 -0
  2. package/PreviewId.d.ts +1 -0
  3. package/README.md +989 -0
  4. package/adopters/DatabaseIdView/index.d.ts +10 -0
  5. package/adopters/DatabaseIdView/server.d.ts +1 -0
  6. package/adopters/DatabaseTableView/index.d.ts +8 -0
  7. package/adopters/DatabaseView/index.d.ts +9 -0
  8. package/adopters/EampleTable/index.d.ts +1 -0
  9. package/adopters/ExampleCards/index.d.ts +1 -0
  10. package/adopters/ExampleForm/AdvancedFormAdopter.d.ts +9 -0
  11. package/adopters/ExampleForm/DynamicFormAdopter.d.ts +9 -0
  12. package/adopters/ExampleForm/DynamicFormExample.d.ts +9 -0
  13. package/adopters/ExampleForm/FormDemo.d.ts +9 -0
  14. package/adopters/ExampleForm/index.d.ts +5 -0
  15. package/adopters/ExampleTabsMultiVIew/$axios.d.ts +6 -0
  16. package/adopters/ExampleTabsMultiVIew/businessService.d.ts +158 -0
  17. package/adopters/ExampleTabsMultiVIew/index.d.ts +9 -0
  18. package/adopters/ExampleTabsMultiVIew/useBusinessData.d.ts +97 -0
  19. package/adopters/SensitiveView/index.d.ts +17 -0
  20. package/adopters/SensitiveView/server.d.ts +1 -0
  21. package/adopters/SensitiveView/size-test.d.ts +7 -0
  22. package/adopters/shared/statusMap.d.ts +37 -0
  23. package/assets/style.css +1 -0
  24. package/core/DynamicCards.d.ts +20 -0
  25. package/core/DynamicDashDataCore.d.ts +58 -0
  26. package/core/DynamicForm.d.ts +22 -0
  27. package/core/DynamicTable.d.ts +52 -0
  28. package/core/components/Button.d.ts +15 -0
  29. package/core/components/DropdownMenu.d.ts +16 -0
  30. package/core/components/cardUI/DatabaseCard.d.ts +28 -0
  31. package/core/components/cardUI/DefaultCard.d.ts +13 -0
  32. package/core/components/cardUI/DesignCard.d.ts +16 -0
  33. package/core/components/cardUI/PrototypeCard.d.ts +16 -0
  34. package/core/components/cardUI/RepositoryCard.d.ts +16 -0
  35. package/core/components/cardUI/common.d.ts +38 -0
  36. package/core/components/cardUI/index.d.ts +13 -0
  37. package/core/components/dataDisplayer/DigitalClockDate.d.ts +6 -0
  38. package/core/components/dataDisplayer/MobileLockDate.d.ts +6 -0
  39. package/core/eventsEnum.d.ts +1 -0
  40. package/core/hooks/animes/useRowAnimation.d.ts +19 -0
  41. package/core/hooks/animes/useStaggerAnimation.d.ts +12 -0
  42. package/core/hooks/useCardStaggerAnimation.d.ts +18 -0
  43. package/core/hooks/useDynamicCards.d.ts +47 -0
  44. package/core/hooks/useDynamicForm.d.ts +62 -0
  45. package/core/hooks/useDynamicTable.d.ts +37 -0
  46. package/core/hooks/useFuzzySearch.d.ts +43 -0
  47. package/core/layout.d.ts +11 -0
  48. package/index.d.ts +2 -0
  49. package/index.js +45997 -0
  50. package/lib_enter.d.ts +12 -0
  51. package/main.d.ts +0 -0
  52. package/package.json +23 -0
  53. package/theme_guideline.d.ts +97 -0
  54. package/vite.svg +1 -0
  55. package/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
  56. package/vs/base/common/worker/simpleWorker.nls.de.js +8 -0
  57. package/vs/base/common/worker/simpleWorker.nls.es.js +8 -0
  58. package/vs/base/common/worker/simpleWorker.nls.fr.js +8 -0
  59. package/vs/base/common/worker/simpleWorker.nls.it.js +8 -0
  60. package/vs/base/common/worker/simpleWorker.nls.ja.js +8 -0
  61. package/vs/base/common/worker/simpleWorker.nls.js +8 -0
  62. package/vs/base/common/worker/simpleWorker.nls.ko.js +8 -0
  63. package/vs/base/common/worker/simpleWorker.nls.ru.js +8 -0
  64. package/vs/base/common/worker/simpleWorker.nls.zh-cn.js +8 -0
  65. package/vs/base/common/worker/simpleWorker.nls.zh-tw.js +8 -0
  66. package/vs/base/worker/workerMain.js +27 -0
  67. package/vs/basic-languages/abap/abap.js +10 -0
  68. package/vs/basic-languages/apex/apex.js +10 -0
  69. package/vs/basic-languages/azcli/azcli.js +10 -0
  70. package/vs/basic-languages/bat/bat.js +10 -0
  71. package/vs/basic-languages/bicep/bicep.js +11 -0
  72. package/vs/basic-languages/cameligo/cameligo.js +10 -0
  73. package/vs/basic-languages/clojure/clojure.js +10 -0
  74. package/vs/basic-languages/coffee/coffee.js +10 -0
  75. package/vs/basic-languages/cpp/cpp.js +10 -0
  76. package/vs/basic-languages/csharp/csharp.js +10 -0
  77. package/vs/basic-languages/csp/csp.js +10 -0
  78. package/vs/basic-languages/css/css.js +12 -0
  79. package/vs/basic-languages/cypher/cypher.js +10 -0
  80. package/vs/basic-languages/dart/dart.js +10 -0
  81. package/vs/basic-languages/dockerfile/dockerfile.js +10 -0
  82. package/vs/basic-languages/ecl/ecl.js +10 -0
  83. package/vs/basic-languages/elixir/elixir.js +10 -0
  84. package/vs/basic-languages/flow9/flow9.js +10 -0
  85. package/vs/basic-languages/freemarker2/freemarker2.js +12 -0
  86. package/vs/basic-languages/fsharp/fsharp.js +10 -0
  87. package/vs/basic-languages/go/go.js +10 -0
  88. package/vs/basic-languages/graphql/graphql.js +10 -0
  89. package/vs/basic-languages/handlebars/handlebars.js +10 -0
  90. package/vs/basic-languages/hcl/hcl.js +10 -0
  91. package/vs/basic-languages/html/html.js +10 -0
  92. package/vs/basic-languages/ini/ini.js +10 -0
  93. package/vs/basic-languages/java/java.js +10 -0
  94. package/vs/basic-languages/javascript/javascript.js +10 -0
  95. package/vs/basic-languages/julia/julia.js +10 -0
  96. package/vs/basic-languages/kotlin/kotlin.js +10 -0
  97. package/vs/basic-languages/less/less.js +11 -0
  98. package/vs/basic-languages/lexon/lexon.js +10 -0
  99. package/vs/basic-languages/liquid/liquid.js +10 -0
  100. package/vs/basic-languages/lua/lua.js +10 -0
  101. package/vs/basic-languages/m3/m3.js +10 -0
  102. package/vs/basic-languages/markdown/markdown.js +10 -0
  103. package/vs/basic-languages/mdx/mdx.js +10 -0
  104. package/vs/basic-languages/mips/mips.js +10 -0
  105. package/vs/basic-languages/msdax/msdax.js +10 -0
  106. package/vs/basic-languages/mysql/mysql.js +10 -0
  107. package/vs/basic-languages/objective-c/objective-c.js +10 -0
  108. package/vs/basic-languages/pascal/pascal.js +10 -0
  109. package/vs/basic-languages/pascaligo/pascaligo.js +10 -0
  110. package/vs/basic-languages/perl/perl.js +10 -0
  111. package/vs/basic-languages/pgsql/pgsql.js +10 -0
  112. package/vs/basic-languages/php/php.js +10 -0
  113. package/vs/basic-languages/pla/pla.js +10 -0
  114. package/vs/basic-languages/postiats/postiats.js +10 -0
  115. package/vs/basic-languages/powerquery/powerquery.js +10 -0
  116. package/vs/basic-languages/powershell/powershell.js +10 -0
  117. package/vs/basic-languages/protobuf/protobuf.js +11 -0
  118. package/vs/basic-languages/pug/pug.js +10 -0
  119. package/vs/basic-languages/python/python.js +10 -0
  120. package/vs/basic-languages/qsharp/qsharp.js +10 -0
  121. package/vs/basic-languages/r/r.js +10 -0
  122. package/vs/basic-languages/razor/razor.js +10 -0
  123. package/vs/basic-languages/redis/redis.js +10 -0
  124. package/vs/basic-languages/redshift/redshift.js +10 -0
  125. package/vs/basic-languages/restructuredtext/restructuredtext.js +10 -0
  126. package/vs/basic-languages/ruby/ruby.js +10 -0
  127. package/vs/basic-languages/rust/rust.js +10 -0
  128. package/vs/basic-languages/sb/sb.js +10 -0
  129. package/vs/basic-languages/scala/scala.js +10 -0
  130. package/vs/basic-languages/scheme/scheme.js +10 -0
  131. package/vs/basic-languages/scss/scss.js +12 -0
  132. package/vs/basic-languages/shell/shell.js +10 -0
  133. package/vs/basic-languages/solidity/solidity.js +10 -0
  134. package/vs/basic-languages/sophia/sophia.js +10 -0
  135. package/vs/basic-languages/sparql/sparql.js +10 -0
  136. package/vs/basic-languages/sql/sql.js +10 -0
  137. package/vs/basic-languages/st/st.js +10 -0
  138. package/vs/basic-languages/swift/swift.js +13 -0
  139. package/vs/basic-languages/systemverilog/systemverilog.js +10 -0
  140. package/vs/basic-languages/tcl/tcl.js +10 -0
  141. package/vs/basic-languages/twig/twig.js +10 -0
  142. package/vs/basic-languages/typescript/typescript.js +10 -0
  143. package/vs/basic-languages/vb/vb.js +10 -0
  144. package/vs/basic-languages/wgsl/wgsl.js +307 -0
  145. package/vs/basic-languages/xml/xml.js +10 -0
  146. package/vs/basic-languages/yaml/yaml.js +10 -0
  147. package/vs/editor/editor.main.css +6 -0
  148. package/vs/editor/editor.main.js +745 -0
  149. package/vs/editor/editor.main.js.gz +0 -0
  150. package/vs/editor/editor.main.nls.de.js +31 -0
  151. package/vs/editor/editor.main.nls.es.js +31 -0
  152. package/vs/editor/editor.main.nls.fr.js +29 -0
  153. package/vs/editor/editor.main.nls.it.js +29 -0
  154. package/vs/editor/editor.main.nls.ja.js +31 -0
  155. package/vs/editor/editor.main.nls.js +29 -0
  156. package/vs/editor/editor.main.nls.ko.js +29 -0
  157. package/vs/editor/editor.main.nls.ru.js +31 -0
  158. package/vs/editor/editor.main.nls.zh-cn.js +31 -0
  159. package/vs/editor/editor.main.nls.zh-tw.js +29 -0
  160. package/vs/language/css/cssMode.js +13 -0
  161. package/vs/language/css/cssWorker.js +81 -0
  162. package/vs/language/css/cssWorker.js.gz +0 -0
  163. package/vs/language/html/htmlMode.js +13 -0
  164. package/vs/language/html/htmlWorker.js +453 -0
  165. package/vs/language/json/jsonMode.js +15 -0
  166. package/vs/language/json/jsonWorker.js +36 -0
  167. package/vs/language/typescript/tsMode.js +20 -0
  168. package/vs/language/typescript/tsWorker.js +37016 -0
  169. package/vs/language/typescript/tsWorker.js.gz +0 -0
  170. package/vs/loader.js +11 -0
  171. package/worker/pdf.worker.min.mjs +21 -0
package/README.md ADDED
@@ -0,0 +1,989 @@
1
+ # 动态生成组件数据传参文档
2
+
3
+ ## 概述
4
+
5
+ 本套动态生成组件系统支持多种视图类型(table、form、card、markdown、customized),通过统一的配置接口实现灵活的数据展示和交互。
6
+
7
+ ## 核心组件
8
+
9
+ - `DynamicDashDataCore`: 主容器组件,负责视图切换和布局
10
+ - `DynamicCards`: 卡片展示组件,支持分页和虚拟滚动
11
+ - `DynamicTable`: 表格展示组件,支持搜索、过滤、操作
12
+ - `DynamicForm`: 表单组件,支持动态表单项配置
13
+
14
+ ## 1. DynamicDashDataCore 主容器
15
+
16
+ ### 基础配置
17
+
18
+ ```typescript
19
+ interface DynamicDashView {
20
+ label?: string; // 标题
21
+ key?: string; // 唯一标识
22
+ defaultActiveId: string; // 默认激活的视图ID
23
+ model?: 'files' | 'tabs' | null; // 布局模式:files(文件树)、tabs(标签页)、null(自动)
24
+ views: ViewType[]; // 视图配置数组
25
+ dataSource?: any; // 数据源
26
+ eventsEmit?: (name: string, data?: any) => any; // 事件回调
27
+ styles?: any; // 样式配置
28
+ }
29
+ ```
30
+
31
+ ### 布局模式详解
32
+
33
+ #### 1.1 `model: 'tabs'` - 标签页模式
34
+
35
+ **功能特性:**
36
+ - 顶部显示标签页导航栏
37
+ - 支持多级下拉菜单嵌套
38
+ - 适合功能模块切换和分类展示
39
+ - 支持无限层级的菜单结构
40
+
41
+ **参数要求:**
42
+ ```typescript
43
+ // 基础配置
44
+ {
45
+ model: 'tabs',
46
+ defaultActiveId: 'view1',
47
+ views: [
48
+ {
49
+ label: '功能模块',
50
+ id: 'module1',
51
+ children: [
52
+ {
53
+ label: '子功能',
54
+ id: 'submodule1',
55
+ children: [
56
+ {
57
+ label: '具体功能',
58
+ id: 'view1',
59
+ type: 'table' // 叶子节点必须有type
60
+ }
61
+ ]
62
+ }
63
+ ]
64
+ }
65
+ ]
66
+ }
67
+
68
+ // 事件处理
69
+ const handleEvents = (name: string, data: any) => {
70
+ switch (name) {
71
+ case 'select':
72
+ // 叶子节点选择事件
73
+ // data: { id: string, type: string }
74
+ setActiveId(data.id);
75
+ break;
76
+ case 'toolbar_${key}':
77
+ // 工具栏操作事件
78
+ // data: { viewId: string }
79
+ break;
80
+ }
81
+ };
82
+ ```
83
+
84
+ **适用场景:**
85
+ - 功能模块导航
86
+ - 分类数据展示
87
+ - 平级功能切换
88
+ - 多级菜单系统
89
+
90
+ #### 1.2 `model: 'files'` - 文件树模式
91
+
92
+ **功能特性:**
93
+ - 左侧显示树形导航结构
94
+ - 支持展开/收起操作
95
+ - 适合层级数据展示和文件管理
96
+ - 支持目录和文件的区分处理
97
+
98
+ **参数要求:**
99
+ ```typescript
100
+ // 基础配置
101
+ {
102
+ model: 'files',
103
+ defaultActiveId: 'file1',
104
+ views: [
105
+ {
106
+ label: '项目文档',
107
+ id: 'project-docs',
108
+ children: [
109
+ {
110
+ label: '需求文档',
111
+ id: 'requirements',
112
+ children: [
113
+ {
114
+ label: '用户需求',
115
+ id: 'user-requirements',
116
+ type: 'table' // 叶子节点必须有type
117
+ }
118
+ ]
119
+ }
120
+ ]
121
+ }
122
+ ]
123
+ }
124
+
125
+ // 事件处理
126
+ const handleEvents = (name: string, data: any) => {
127
+ switch (name) {
128
+ case 'select':
129
+ // 叶子节点选择事件
130
+ // data: { id: string, type: string }
131
+ setActiveId(data.id);
132
+ break;
133
+ case 'filesDir_clicked':
134
+ // 非叶子节点(目录)点击事件 - files模式特有
135
+ // data: { node: ViewType, allChildren: ViewType[] }
136
+ console.log('目录点击:', data.node.label);
137
+ console.log('所有子节点:', data.allChildren);
138
+ break;
139
+ case 'toolbar_${key}':
140
+ // 工具栏操作事件
141
+ // data: { viewId: string }
142
+ break;
143
+ }
144
+ };
145
+ ```
146
+
147
+ **适用场景:**
148
+ - 文件管理器
149
+ - 文档结构展示
150
+ - 层级数据导航
151
+ - 项目目录管理
152
+
153
+ #### 1.3 `model: null` - 自动模式
154
+
155
+ **功能特性:**
156
+ - 无导航栏,直接显示内容
157
+ - 适合单一功能页面
158
+ - 简化布局,专注内容展示
159
+
160
+ **参数要求:**
161
+ ```typescript
162
+ // 基础配置
163
+ {
164
+ model: null, // 或省略此字段
165
+ defaultActiveId: 'view1',
166
+ views: [
167
+ {
168
+ label: '单一视图',
169
+ id: 'view1',
170
+ type: 'table' // 必须有type
171
+ }
172
+ ]
173
+ }
174
+
175
+ // 事件处理
176
+ const handleEvents = (name: string, data: any) => {
177
+ switch (name) {
178
+ case 'select':
179
+ // 视图选择事件(通常不会触发,因为只有一个视图)
180
+ break;
181
+ case 'toolbar_${key}':
182
+ // 工具栏操作事件
183
+ break;
184
+ }
185
+ };
186
+ ```
187
+
188
+ **适用场景:**
189
+ - 单一功能页面
190
+ - 弹窗内容展示
191
+ - 嵌入式组件
192
+ - 简化布局需求
193
+
194
+ ### 模式对比总结
195
+
196
+ | 特性 | Tabs模式 | Files模式 | 自动模式 |
197
+ |------|----------|-----------|----------|
198
+ | **导航方式** | 顶部标签页/下拉菜单 | 左侧树形菜单 | 无导航 |
199
+ | **层级支持** | 多级下拉菜单 | 无限层级树形结构 | 单层 |
200
+ | **展开状态** | 无需管理 | 需要管理展开/收起 | 无需管理 |
201
+ | **特有事件** | 无 | `filesDir_clicked` | 无 |
202
+ | **数据传递** | 根据activeId动态变化 | 根据activeId动态变化 | 静态数据 |
203
+ | **布局复杂度** | 中等 | 高 | 低 |
204
+ | **适用场景** | 功能模块切换 | 文件管理、层级展示 | 单一功能 |
205
+
206
+ ## 2. ViewType 视图配置
207
+
208
+ ### 基础结构
209
+
210
+ ```typescript
211
+ interface ViewType {
212
+ label: string; // 显示名称
213
+ id: string; // 唯一标识
214
+ type?: 'table' | 'form' | 'markdown' | 'card' | 'customized'; // 视图类型
215
+ columns?: Array<{ title: string; id: string; type: string; [key: string]: any }>; // 表格列配置
216
+ children?: ViewType[]; // 子视图(用于多级导航)
217
+ cardType?: string; // 卡片类型
218
+ viewBehavior?: 'pagination' | 'scroll'; // 卡片展示行为
219
+ actions?: CardAction[]; // 卡片操作配置
220
+ toolbar?: ToolbarItem[]; // 工具栏配置
221
+ }
222
+ ```
223
+
224
+ ### 2.1 表格视图 (`type: 'table'`)
225
+
226
+ #### 列配置格式
227
+
228
+ ```typescript
229
+ const columns = [
230
+ {
231
+ id: 'name', // 列标识
232
+ title: '姓名', // 列标题
233
+ type: 'text' // 列类型:text|number|status|image|longText|tag|action|date
234
+ },
235
+ {
236
+ id: 'status',
237
+ title: '状态',
238
+ type: 'status'
239
+ },
240
+ {
241
+ id: 'actions',
242
+ title: '操作',
243
+ type: 'action'
244
+ }
245
+ ];
246
+ ```
247
+
248
+ #### 数据源格式
249
+
250
+ ```typescript
251
+ const dataSource = [
252
+ {
253
+ id: 'row1', // 行唯一标识
254
+ cells: [ // 单元格数组
255
+ {
256
+ columnId: 'name', // 对应列ID
257
+ type: 'text', // 数据类型
258
+ value: '张三' // 显示值
259
+ },
260
+ {
261
+ columnId: 'status',
262
+ type: 'status',
263
+ value: 'active'
264
+ },
265
+ {
266
+ columnId: 'actions',
267
+ type: 'action',
268
+ value: 'edit',
269
+ label: '编辑' // 操作按钮文本
270
+ }
271
+ ]
272
+ }
273
+ ];
274
+ ```
275
+
276
+ #### 支持的数据类型
277
+
278
+ | 类型 | 说明 | 示例 |
279
+ |------|------|------|
280
+ | `text` | 普通文本 | `{ value: '张三' }` |
281
+ | `number` | 数字 | `{ value: 100 }` |
282
+ | `status` | 状态标签 | `{ value: 'active' }` |
283
+ | `image` | 图片 | `{ value: 'https://example.com/avatar.jpg' }` |
284
+ | `longText` | 长文本(带省略) | `{ value: '很长的文本内容...' }` |
285
+ | `tag` | 标签组 | `{ value: ['标签1', '标签2'] }` |
286
+ | `action` | 操作按钮 | `{ value: 'edit', label: '编辑' }` |
287
+ | `date` | 日期 | `{ value: '2024-01-01' }` |
288
+
289
+ ### 2.2 卡片视图 (`type: 'card'`)
290
+
291
+ #### 卡片配置
292
+
293
+ ```typescript
294
+ const cardView = {
295
+ label: '我的数据库',
296
+ id: 'my-db',
297
+ type: 'card',
298
+ cardType: 'database', // 卡片类型
299
+ viewBehavior: 'scroll', // 展示行为:pagination|scroll
300
+ actions: [ // 卡片操作
301
+ { label: '编辑', key: 'edit', allow: true },
302
+ { label: '删除', key: 'delete', allow: false }
303
+ ],
304
+ toolbar: [ // 工具栏
305
+ { type: 'button', key: 'add', label: '添加连接' },
306
+ { type: 'fuzzy_search', key: 'search', label: '搜索', searchKeys: ['name', 'description'] }
307
+ ]
308
+ };
309
+ ```
310
+
311
+ #### 数据源格式
312
+
313
+ ```typescript
314
+ // 数据库卡片
315
+ const databaseCards = [
316
+ {
317
+ id: 'db1',
318
+ name: '订单数据库',
319
+ description: '订单相关数据',
320
+ status: 'connect', // 连接状态:connect|error
321
+ author: 'admin', // 作者
322
+ dbType: 'mysql', // 数据库类型
323
+ url: 'https://example.com', // 连接地址
324
+ port: 3306, // 端口
325
+ username: 'root', // 用户名
326
+ password: '******', // 密码
327
+ actions: [ // 卡片级操作(覆盖全局)
328
+ { label: '查看', key: 'view', allow: true }
329
+ ]
330
+ }
331
+ ];
332
+
333
+ // 设计卡片
334
+ const designCards = [
335
+ {
336
+ id: 'design1',
337
+ name: '登录页面设计',
338
+ description: '用户登录界面的UI设计稿',
339
+ status: 'completed', // 状态:completed|in_progress|pending
340
+ author: 'designer1', // 设计师
341
+ designType: 'figma', // 设计工具:figma|sketch|ps|ai
342
+ url: 'https://figma.com/file/123', // 设计稿链接
343
+ version: 'v1.2', // 版本号
344
+ lastModified: '2024-12-15', // 最后修改时间
345
+ actions: [
346
+ { label: '预览', key: 'preview', allow: true },
347
+ { label: '编辑', key: 'edit', allow: true }
348
+ ]
349
+ }
350
+ ];
351
+
352
+ // 原型卡片
353
+ const prototypeCards = [
354
+ {
355
+ id: 'proto1',
356
+ name: '用户流程原型',
357
+ description: '用户注册到登录的完整流程',
358
+ status: 'completed', // 状态:completed|in_progress|pending
359
+ author: 'ux1', // 设计师
360
+ prototypeType: 'axure', // 原型工具:axure|sketch|figma
361
+ url: 'https://axure.com/proto/123', // 原型链接
362
+ pages: 15, // 页面数量
363
+ lastModified: '2024-12-12', // 最后修改时间
364
+ actions: [
365
+ { label: '查看', key: 'view', allow: true },
366
+ { label: '导出', key: 'export', allow: true }
367
+ ]
368
+ }
369
+ ];
370
+
371
+ // 代码仓库卡片
372
+ const repositoryCards = [
373
+ {
374
+ id: 'repo1',
375
+ name: 'React管理后台',
376
+ description: '基于React的管理系统前端项目',
377
+ status: 'active', // 状态:active|archived|deprecated
378
+ author: 'dev1', // 开发者
379
+ repoType: 'git', // 仓库类型:git|svn
380
+ url: 'https://github.com/company/react-admin', // 仓库地址
381
+ language: 'TypeScript', // 主要语言
382
+ stars: 156, // Star数量
383
+ lastCommit: '2024-12-18', // 最后提交时间
384
+ deployment: 'production', // 部署环境:production|staging|development
385
+ lastDeploy: '2024-12-18', // 最后部署时间
386
+ actions: [
387
+ { label: '克隆', key: 'clone', allow: true },
388
+ { label: '部署', key: 'deploy', allow: true }
389
+ ]
390
+ }
391
+ ];
392
+ ```
393
+
394
+ #### 支持的卡片类型
395
+ | 类型 | 说明 | 特殊字段 |
396
+ |------|------|----------|
397
+ | `design` | 设计卡片 | `designType`, `version`, `lastModified`, `status` |
398
+ | `prototype` | 原型卡片 | `prototypeType`, `pages`, `lastModified`, `status` |
399
+ | `repository` | 代码仓库卡片 | `language`, `stars`, `deployment`, `lastCommit`, `lastDeploy` |
400
+ | `database` | 数据库卡片 | `dbType`, `status`, `url`, `port`, `username` |
401
+ | `default` | 默认卡片 | `title`, `content` |
402
+ | `customized` | 自定义卡片 | 支持自定义 `render` 函数 |
403
+
404
+ #### 工具栏类型
405
+
406
+ | 类型 | 说明 | 配置项 |
407
+ |------|------|--------|
408
+ | `button` | 普通按钮 | `label`, `key` |
409
+ | `fuzzy_search` | 模糊搜索 | `label`, `key`, `searchKeys` |
410
+ | `customized` | 自定义组件 | `render` 函数 |
411
+
412
+ ### 2.3 表单视图 (`type: 'form'`)
413
+
414
+ #### 表单项配置
415
+
416
+ ```typescript
417
+ const formItems = [
418
+ {
419
+ type: 'input', // 表单项类型
420
+ label: '姓名', // 标签
421
+ name: 'name', // 字段名
422
+ required: true, // 是否必填
423
+ placeholder: '请输入姓名', // 占位符
424
+ description: '用户真实姓名' // 描述信息
425
+ },
426
+ {
427
+ type: 'select',
428
+ label: '性别',
429
+ name: 'gender',
430
+ options: [
431
+ { label: '男', value: 'male' },
432
+ { label: '女', value: 'female' }
433
+ ]
434
+ },
435
+ {
436
+ type: 'switch',
437
+ label: '启用通知',
438
+ name: 'notifications',
439
+ controlledItems: ['email', 'sms'] // 受控项
440
+ }
441
+ ];
442
+ ```
443
+
444
+ #### 支持的表单项类型
445
+
446
+ | 类型 | 说明 | 特殊配置 |
447
+ |------|------|----------|
448
+ | `input` | 文本输入 | `placeholder` |
449
+ | `select` | 下拉选择 | `options` |
450
+ | `number` | 数字输入 | `range`, `step`, `unit` |
451
+ | `slider` | 滑块 | `range`, `step`, `unit` |
452
+ | `switch` | 开关 | `controlledItems` |
453
+ | `textarea` | 多行文本 | `autoSize` |
454
+ | `date` | 日期选择 | - |
455
+ | `radio` | 单选 | `options` |
456
+ | `divider` | 分割线 | - |
457
+
458
+ ### 2.4 Markdown视图 (`type: 'markdown'`)
459
+
460
+ #### 数据源格式
461
+
462
+ ```typescript
463
+ const dataSource = {
464
+ content: '# 标题\n\n这是 **Markdown** 内容。'
465
+ };
466
+ ```
467
+
468
+ ### 2.5 自定义视图 (`type: 'customized'`)
469
+
470
+ #### 数据源格式
471
+
472
+ ```typescript
473
+ const dataSource = {
474
+ component: <CustomComponent /> // React组件
475
+ };
476
+ ```
477
+
478
+ ## 3. 事件系统
479
+
480
+ ### 事件类型
481
+
482
+ | 事件名 | 说明 | 数据格式 |
483
+ |--------|------|----------|
484
+ | `select` | 视图切换 | `{ id: string, type: string }` |
485
+ | `filesDir_clicked` | 文件树点击 | `{ node: ViewType, allChildren: ViewType[] }` |
486
+ | `toolbar_${key}` | 工具栏操作 | `{ viewId: string }` |
487
+ | `card_${action}` | 卡片操作 | `{ action: string, data: any }` |
488
+ | `table_action_${action}` | 表格操作 | `{ action: string, row: any }` |
489
+ | `form:submit` | 表单提交 | `{ formName: string, values: any }` |
490
+
491
+ ### 卡片事件详解
492
+
493
+ #### 设计卡片事件 (`cardType: 'design'`)
494
+ ```typescript
495
+ // 事件处理
496
+ const handleDesignEvents = (name: string, data: any) => {
497
+ switch (name) {
498
+ case 'card_preview':
499
+ // 预览设计稿
500
+ // data: { id, name, description, designType, url, version, ... }
501
+ openDesignPreview(data.url);
502
+ break;
503
+ case 'card_edit':
504
+ // 编辑设计稿
505
+ openDesignEditor(data.id);
506
+ break;
507
+ case 'card_delete':
508
+ // 删除设计稿
509
+ confirmDeleteDesign(data.id);
510
+ break;
511
+ }
512
+ };
513
+ ```
514
+
515
+ #### 原型卡片事件 (`cardType: 'prototype'`)
516
+ ```typescript
517
+ // 事件处理
518
+ const handlePrototypeEvents = (name: string, data: any) => {
519
+ switch (name) {
520
+ case 'card_view':
521
+ // 查看原型
522
+ // data: { id, name, description, prototypeType, url, pages, ... }
523
+ openPrototypeViewer(data.url);
524
+ break;
525
+ case 'card_export':
526
+ // 导出原型
527
+ exportPrototype(data.id, data.prototypeType);
528
+ break;
529
+ }
530
+ };
531
+ ```
532
+
533
+ #### 代码仓库事件 (`cardType: 'repository'`)
534
+ ```typescript
535
+ // 事件处理
536
+ const handleRepositoryEvents = (name: string, data: any) => {
537
+ switch (name) {
538
+ case 'card_clone':
539
+ // 克隆项目
540
+ // data: { id, name, url, language, ... }
541
+ gitClone(data.url, data.name);
542
+ break;
543
+ case 'card_view':
544
+ // 查看项目
545
+ openRepository(data.url);
546
+ break;
547
+ case 'card_deploy':
548
+ // 部署项目
549
+ deployProject(data.id, data.deployment);
550
+ break;
551
+ case 'card_monitor':
552
+ // 监控项目
553
+ openMonitoring(data.id);
554
+ break;
555
+ }
556
+ };
557
+ ```
558
+
559
+ ### 事件处理示例
560
+
561
+ ```typescript
562
+ const handleEvents = (name: string, data: any) => {
563
+ switch (name) {
564
+ case 'select':
565
+ console.log('切换到视图:', data.id);
566
+ break;
567
+ case 'card_edit':
568
+ console.log('编辑卡片:', data);
569
+ break;
570
+ case 'form:submit':
571
+ console.log('表单提交:', data.values);
572
+ break;
573
+ }
574
+ };
575
+ ```
576
+
577
+ ## 4. 样式配置
578
+
579
+ ### 主题配置
580
+
581
+ ```typescript
582
+ const theme = {
583
+ colors: {
584
+ primary: '#007bff',
585
+ secondary: '#6c757d',
586
+ success: '#008000',
587
+ warning: '#FFA500',
588
+ error: '#FF0000',
589
+ background: '#f8f9fa',
590
+ text: '#343a40',
591
+ border: '#dee2e6'
592
+ },
593
+ space: {
594
+ sidebar: 'md', // sm|md|lg
595
+ size: 'md', // sm|md|lg
596
+ radius: 'md', // sm|md|lg
597
+ padding: 'md', // sm|md|lg
598
+ margin: 'md', // sm|md|lg
599
+ shadow: 'md', // sm|md|lg
600
+ lineHeight: 'md' // sm|md|lg
601
+ }
602
+ };
603
+ ```
604
+
605
+ ### 样式优先级
606
+
607
+ 1. `props.styles?.theme` - 最高优先级
608
+ 2. `contextTheme` - 上下文主题
609
+ 3. `defaultTheme` - 默认主题
610
+
611
+ ## 5. 完整示例
612
+
613
+ ### 数据库管理页面
614
+
615
+ ```typescript
616
+ const DatabaseView = () => {
617
+ const views = [
618
+ {
619
+ label: '我的数据库',
620
+ id: 'my-db',
621
+ type: 'card',
622
+ cardType: 'database',
623
+ viewBehavior: 'scroll',
624
+ actions: [
625
+ { label: '编辑', key: 'edit', allow: true },
626
+ { label: '删除', key: 'delete', allow: false }
627
+ ],
628
+ toolbar: [
629
+ { type: 'button', key: 'add', label: '添加连接' },
630
+ { type: 'fuzzy_search', key: 'search', label: '搜索', searchKeys: ['name', 'description'] }
631
+ ]
632
+ },
633
+ {
634
+ label: '共享数据库',
635
+ id: 'shared-db',
636
+ type: 'card',
637
+ cardType: 'database',
638
+ actions: [
639
+ { label: '查看', key: 'view', allow: true }
640
+ ],
641
+ toolbar: [
642
+ { type: 'fuzzy_search', key: 'search', label: '搜索' }
643
+ ]
644
+ }
645
+ ];
646
+
647
+ const dataSource = [
648
+ {
649
+ id: 'db1',
650
+ name: '订单数据库',
651
+ description: '订单相关数据',
652
+ status: 'connect',
653
+ author: 'admin',
654
+ dbType: 'mysql',
655
+ url: 'https://example.com',
656
+ port: 3306,
657
+ username: 'root'
658
+ }
659
+ ];
660
+
661
+ return (
662
+ <DynamicDashDataCore
663
+ label="数据库管理"
664
+ model="tabs"
665
+ defaultActiveId="my-db"
666
+ views={views}
667
+ dataSource={dataSource}
668
+ eventsEmit={handleEvents}
669
+ />
670
+ );
671
+ };
672
+ ```
673
+
674
+ ### 用户管理表格
675
+
676
+ ```typescript
677
+ const UserTable = () => {
678
+ const views = [
679
+ {
680
+ label: '用户列表',
681
+ id: 'user-list',
682
+ type: 'table',
683
+ columns: [
684
+ { id: 'name', title: '姓名', type: 'text' },
685
+ { id: 'email', title: '邮箱', type: 'text' },
686
+ { id: 'status', title: '状态', type: 'status' },
687
+ { id: 'actions', title: '操作', type: 'action' }
688
+ ]
689
+ }
690
+ ];
691
+
692
+ const dataSource = [
693
+ {
694
+ id: 'user1',
695
+ cells: [
696
+ { columnId: 'name', type: 'text', value: '张三' },
697
+ { columnId: 'email', type: 'text', value: 'zhangsan@example.com' },
698
+ { columnId: 'status', type: 'status', value: 'active' },
699
+ { columnId: 'actions', type: 'action', value: 'edit', label: '编辑' }
700
+ ]
701
+ }
702
+ ];
703
+
704
+ return (
705
+ <DynamicDashDataCore
706
+ model="tabs"
707
+ defaultActiveId="user-list"
708
+ views={views}
709
+ dataSource={dataSource}
710
+ eventsEmit={handleEvents}
711
+ />
712
+ );
713
+ };
714
+ ```
715
+
716
+ ### 项目资源管理(混合卡片类型)
717
+
718
+ ```typescript
719
+ const ProjectResourceManager = () => {
720
+ const views = [
721
+ {
722
+ label: '设计资源',
723
+ id: 'design-resources',
724
+ type: 'card',
725
+ cardType: 'design',
726
+ viewBehavior: 'scroll',
727
+ actions: [
728
+ { label: '预览', key: 'preview', allow: true },
729
+ { label: '编辑', key: 'edit', allow: true },
730
+ { label: '删除', key: 'delete', allow: false }
731
+ ],
732
+ toolbar: [
733
+ { type: 'button', key: 'upload', label: '上传设计稿' },
734
+ { type: 'fuzzy_search', key: 'search', label: '搜索', searchKeys: ['name', 'description'] }
735
+ ]
736
+ },
737
+ {
738
+ label: '原型资源',
739
+ id: 'prototype-resources',
740
+ type: 'card',
741
+ cardType: 'prototype',
742
+ viewBehavior: 'pagination',
743
+ actions: [
744
+ { label: '查看', key: 'view', allow: true },
745
+ { label: '导出', key: 'export', allow: true }
746
+ ],
747
+ toolbar: [
748
+ { type: 'fuzzy_search', key: 'search', label: '搜索' }
749
+ ]
750
+ },
751
+ {
752
+ label: '代码仓库',
753
+ id: 'code-repositories',
754
+ type: 'card',
755
+ cardType: 'repository',
756
+ viewBehavior: 'scroll',
757
+ actions: [
758
+ { label: '克隆', key: 'clone', allow: true },
759
+ { label: '部署', key: 'deploy', allow: true },
760
+ { label: '监控', key: 'monitor', allow: true }
761
+ ],
762
+ toolbar: [
763
+ { type: 'button', key: 'create', label: '创建仓库' },
764
+ { type: 'fuzzy_search', key: 'search', label: '搜索', searchKeys: ['name', 'language'] }
765
+ ]
766
+ }
767
+ ];
768
+
769
+ // 根据当前激活的视图提供不同的数据
770
+ const getDataSource = (activeId: string) => {
771
+ switch (activeId) {
772
+ case 'design-resources':
773
+ return [
774
+ {
775
+ id: 'design1',
776
+ name: '登录页面设计',
777
+ description: '用户登录界面的UI设计稿',
778
+ status: 'completed',
779
+ author: 'designer1',
780
+ designType: 'figma',
781
+ url: 'https://figma.com/file/123',
782
+ version: 'v1.2',
783
+ lastModified: '2024-12-15'
784
+ },
785
+ {
786
+ id: 'design2',
787
+ name: '仪表板设计',
788
+ description: '数据仪表板界面设计',
789
+ status: 'in_progress',
790
+ author: 'designer2',
791
+ designType: 'sketch',
792
+ url: 'https://sketch.com/file/456',
793
+ version: 'v2.0',
794
+ lastModified: '2024-12-18'
795
+ }
796
+ ];
797
+
798
+ case 'prototype-resources':
799
+ return [
800
+ {
801
+ id: 'proto1',
802
+ name: '用户流程原型',
803
+ description: '用户注册到登录的完整流程',
804
+ status: 'completed',
805
+ author: 'ux1',
806
+ prototypeType: 'axure',
807
+ url: 'https://axure.com/proto/123',
808
+ pages: 15,
809
+ lastModified: '2024-12-12'
810
+ }
811
+ ];
812
+
813
+ case 'code-repositories':
814
+ return [
815
+ {
816
+ id: 'repo1',
817
+ name: 'React管理后台',
818
+ description: '基于React的管理系统前端项目',
819
+ status: 'active',
820
+ author: 'dev1',
821
+ repoType: 'git',
822
+ url: 'https://github.com/company/react-admin',
823
+ language: 'TypeScript',
824
+ stars: 156,
825
+ lastCommit: '2024-12-18',
826
+ deployment: 'production',
827
+ lastDeploy: '2024-12-18'
828
+ }
829
+ ];
830
+
831
+ default:
832
+ return [];
833
+ }
834
+ };
835
+
836
+ const [activeId, setActiveId] = useState('design-resources');
837
+ const dataSource = getDataSource(activeId);
838
+
839
+ const handleEvents = (name: string, data: any) => {
840
+ switch (name) {
841
+ case 'select':
842
+ setActiveId(data.id);
843
+ break;
844
+ case 'card_preview':
845
+ console.log('预览设计稿:', data);
846
+ break;
847
+ case 'card_edit':
848
+ console.log('编辑设计稿:', data);
849
+ break;
850
+ case 'card_view':
851
+ console.log('查看原型:', data);
852
+ break;
853
+ case 'card_export':
854
+ console.log('导出原型:', data);
855
+ break;
856
+ case 'card_clone':
857
+ console.log('克隆项目:', data);
858
+ break;
859
+ case 'card_deploy':
860
+ console.log('部署项目:', data);
861
+ break;
862
+ case 'card_monitor':
863
+ console.log('监控项目:', data);
864
+ break;
865
+ }
866
+ };
867
+
868
+ return (
869
+ <DynamicDashDataCore
870
+ label="项目资源管理"
871
+ model="tabs"
872
+ defaultActiveId={activeId}
873
+ views={views}
874
+ dataSource={dataSource}
875
+ eventsEmit={handleEvents}
876
+ />
877
+ );
878
+ };
879
+ ```
880
+
881
+ ## 6. 注意事项
882
+
883
+ 1. **数据一致性**: 确保 `columns` 配置与 `dataSource` 中的 `cells` 字段对应
884
+ 2. **ID唯一性**: 所有 `id` 字段必须唯一,避免冲突
885
+ 3. **类型匹配**: 确保数据类型与配置的 `type` 字段匹配
886
+ 4. **事件处理**: 根据业务需求实现相应的事件处理逻辑
887
+ 5. **性能优化**: 大量数据时建议使用 `viewBehavior: 'scroll'` 启用虚拟滚动
888
+
889
+ ## 7. 扩展开发
890
+
891
+ ### 自定义卡片类型
892
+
893
+ ```typescript
894
+ // 1. 扩展 CardType 类型定义
895
+ export type CardType = 'database' | 'default' | 'customized' | 'design' | 'prototype' | 'repository' | 'custom';
896
+
897
+ // 2. 在 useDynamicCards 中添加新的 case
898
+ case 'custom':
899
+ return {
900
+ ...card,
901
+ render: (data: any) => {
902
+ const actionsRaw: CardAction[] = data.actions || card.actions || globalActions || [];
903
+ const actions: DropdownMenuAction[] = actionsRaw.filter((a) => a.allow !== false).map((a) => ({
904
+ key: a.key,
905
+ label: a.label,
906
+ icon: a.icon,
907
+ onClick: a.onClick ? () => a.onClick!(data) : undefined,
908
+ }));
909
+ const handleAction = (key: string) => {
910
+ const action = actions.find(a => a.key === key);
911
+ if (action?.onClick) action.onClick();
912
+ else options?.onAction?.(key, data);
913
+ };
914
+
915
+ return (
916
+ <CardWrapper theme={theme} className="group">
917
+ <CardContent>
918
+ <CardHeader>
919
+ <CustomIcon size={20} className="text-blue-500" />
920
+ <CardTitle>{data.name || '自定义卡片'}</CardTitle>
921
+ {data.status && (
922
+ <span style={{ position: 'absolute', right: -5, top: -10, margin: 12 }}>
923
+ <StatusDotWrapper>
924
+ <StatusDot status={data.status} />
925
+ </StatusDotWrapper>
926
+ </span>
927
+ )}
928
+ </CardHeader>
929
+ <CardDesc>{data.description || '暂无描述'}</CardDesc>
930
+ {/* 自定义字段显示 */}
931
+ {data.customField && <CardMeta>自定义字段: <b>{data.customField}</b></CardMeta>}
932
+ {data.url && (
933
+ <span className="text-blue-500 font-normal">
934
+ <span className="underline cursor-pointer">{data.url}</span>
935
+ </span>
936
+ )}
937
+ <div style={{ flex: 1 }} />
938
+ </CardContent>
939
+ {actions.length > 0 && (
940
+ <CardActions>
941
+ <DropdownMenu actions={actions} onAction={handleAction} />
942
+ </CardActions>
943
+ )}
944
+ </CardWrapper>
945
+ );
946
+ },
947
+ };
948
+ ```
949
+
950
+ // 3. 使用自定义卡片类型
951
+ const customCardView = {
952
+ label: '自定义资源',
953
+ id: 'custom-resources',
954
+ type: 'card',
955
+ cardType: 'custom',
956
+ viewBehavior: 'scroll',
957
+ actions: [
958
+ { label: '查看', key: 'view', allow: true },
959
+ { label: '编辑', key: 'edit', allow: true }
960
+ ]
961
+ };
962
+
963
+ const customDataSource = [
964
+ {
965
+ id: 'custom1',
966
+ name: '自定义项目',
967
+ description: '这是一个自定义卡片示例',
968
+ status: 'active',
969
+ customField: '自定义值',
970
+ url: 'https://example.com',
971
+ actions: [
972
+ { label: '查看', key: 'view', allow: true }
973
+ ]
974
+ }
975
+ ];
976
+ ```
977
+
978
+ ### 自定义表单项类型
979
+
980
+ ```typescript
981
+ // 在 useDynamicFormItems 中添加新的 case
982
+ if (item.type === 'custom') {
983
+ return (
984
+ <Form.Item key={item.name} label={renderLabel(item)} name={item.name}>
985
+ <CustomInput {...item} />
986
+ </Form.Item>
987
+ );
988
+ }
989
+ ```