@ticatec/uniface-element 0.2.4 → 0.3.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 (176) hide show
  1. package/dist/accordion/README.md +169 -0
  2. package/dist/accordion/README_CN.md +176 -0
  3. package/dist/action-bar/README.md +275 -0
  4. package/dist/action-bar/README_CN.md +285 -0
  5. package/dist/app-layout/README.md +374 -0
  6. package/dist/app-layout/README_CN.md +381 -0
  7. package/dist/app-top-bar/README.md +357 -0
  8. package/dist/app-top-bar/README_CN.md +365 -0
  9. package/dist/attachment-files/AttachmentFilesField.svelte +67 -1
  10. package/dist/attachment-files/AttachmentFilesField.svelte.d.ts +8 -1
  11. package/dist/base-calendar/CalendarBase.svelte +0 -3
  12. package/dist/box/README.md +385 -0
  13. package/dist/box/README_CN.md +393 -0
  14. package/dist/breadcrumbs/README.md +442 -0
  15. package/dist/breadcrumbs/README_CN.md +442 -0
  16. package/dist/button/Button.svelte +27 -7
  17. package/dist/button/Button.svelte.d.ts +3 -1
  18. package/dist/button/IconButton.svelte +26 -6
  19. package/dist/button/IconButton.svelte.d.ts +3 -1
  20. package/dist/button/IconButton_README.md +513 -0
  21. package/dist/button/IconButton_README_CN.md +513 -0
  22. package/dist/button/README.md +428 -0
  23. package/dist/button/README_CN.md +428 -0
  24. package/dist/button/TextButton.svelte +26 -6
  25. package/dist/button/TextButton.svelte.d.ts +3 -1
  26. package/dist/button/TextButton_README.md +571 -0
  27. package/dist/button/TextButton_README_CN.md +571 -0
  28. package/dist/card/README.md +666 -0
  29. package/dist/card/README_CN.md +666 -0
  30. package/dist/cascade-options-select/CascadeOptionSelect.svelte +43 -7
  31. package/dist/cascade-options-select/CascadeOptionSelect.svelte.d.ts +3 -4
  32. package/dist/cascade-options-select/README.md +663 -2
  33. package/dist/cascade-options-select/README_CN.md +664 -0
  34. package/dist/checkbox/CheckBox.svelte +20 -6
  35. package/dist/checkbox/CheckBox.svelte.d.ts +4 -2
  36. package/dist/checkbox/README.md +562 -0
  37. package/dist/checkbox/README_CN.md +727 -0
  38. package/dist/common-editor/NumberInput.svelte +39 -26
  39. package/dist/common-editor/NumberInput.svelte.d.ts +5 -1
  40. package/dist/concise-data-table/ConciseListTable.svelte +133 -36
  41. package/dist/concise-data-table/ConciseListTable.svelte.d.ts +8 -1
  42. package/dist/concise-data-table/DataCell.svelte +5 -6
  43. package/dist/concise-data-table/DataRow.svelte +22 -2
  44. package/dist/concise-data-table/DataRow.svelte.d.ts +1 -0
  45. package/dist/concise-data-table/README.md +606 -0
  46. package/dist/concise-data-table/README_CN.md +611 -0
  47. package/dist/context-menu/ContextMenu.svelte +138 -21
  48. package/dist/context-menu/ContextMenu.svelte.d.ts +5 -0
  49. package/dist/context-menu/ContextMenuItem.d.ts +20 -4
  50. package/dist/context-menu/README.md +551 -0
  51. package/dist/context-menu/README_CN.md +551 -0
  52. package/dist/criteria-field/CriteriaField.svelte +3 -5
  53. package/dist/criteria-field/README.md +532 -0
  54. package/dist/criteria-field/README_CN.md +532 -0
  55. package/dist/data-table/README.md +712 -0
  56. package/dist/data-table/README_CN.md +712 -0
  57. package/dist/date-picker/DatePicker.svelte +44 -7
  58. package/dist/date-picker/DatePicker.svelte.d.ts +3 -4
  59. package/dist/date-picker/DateTimePicker.svelte +32 -8
  60. package/dist/date-picker/DateTimePicker.svelte.d.ts +3 -4
  61. package/dist/date-picker/README.md +326 -0
  62. package/dist/date-picker/README_CN.md +316 -0
  63. package/dist/date-picker/ScrollBar.svelte +18 -8
  64. package/dist/date-picker/ScrollBar.svelte.d.ts +1 -1
  65. package/dist/date-picker/TimePanel.svelte +5 -5
  66. package/dist/date-picker/TimePanel.svelte.d.ts +1 -1
  67. package/dist/date-range/README.md +374 -0
  68. package/dist/date-range/README_CN.md +374 -0
  69. package/dist/dialog/README.md +596 -0
  70. package/dist/dialog/README_CN.md +596 -0
  71. package/dist/drawer/README.md +679 -1
  72. package/dist/drawer/README_CN.md +679 -0
  73. package/dist/group-box/group-check-box/GroupCheckBox.svelte +62 -5
  74. package/dist/group-box/group-check-box/GroupCheckBox.svelte.d.ts +7 -2
  75. package/dist/group-box/group-check-box/README.md +749 -0
  76. package/dist/group-box/group-check-box/README_CN.md +750 -0
  77. package/dist/group-box/group-radio-box/GroupRadioBox.svelte +69 -4
  78. package/dist/group-box/group-radio-box/GroupRadioBox.svelte.d.ts +8 -2
  79. package/dist/group-box/group-radio-box/README.md +920 -0
  80. package/dist/group-box/group-radio-box/README_CN.md +920 -0
  81. package/dist/image-files/README.md +1346 -0
  82. package/dist/image-files/README_CN.md +1346 -0
  83. package/dist/input-options-select/InputOptionsSelect.svelte +161 -65
  84. package/dist/input-options-select/InputOptionsSelect.svelte.d.ts +4 -1
  85. package/dist/lib/forwardAllEvents.d.ts +3 -0
  86. package/dist/lib/forwardAllEvents.js +24 -0
  87. package/dist/list-box/README.md +579 -0
  88. package/dist/list-box/README_CN.md +682 -0
  89. package/dist/lookup-editor/LookupEditor.svelte +15 -3
  90. package/dist/lookup-editor/LookupEditor.svelte.d.ts +3 -4
  91. package/dist/lookup-editor/README.md +684 -0
  92. package/dist/lookup-editor/README_CN.md +684 -0
  93. package/dist/memo-editor/MemoEditor.svelte +77 -27
  94. package/dist/memo-editor/MemoEditor.svelte.d.ts +6 -3
  95. package/dist/memo-editor/README.md +819 -0
  96. package/dist/memo-editor/README_CN.md +819 -0
  97. package/dist/message-box/README.md +398 -0
  98. package/dist/message-box/README_CN.md +398 -0
  99. package/dist/number-editor/NumberEditor.svelte +2 -2
  100. package/dist/number-editor/NumberEditor.svelte.d.ts +1 -1
  101. package/dist/number-editor/README.md +353 -22
  102. package/dist/number-editor/README_CN.md +357 -0
  103. package/dist/number-range/README.md +443 -0
  104. package/dist/number-range/README_CN.md +443 -0
  105. package/dist/options-multi-select/OptionsMultiSelect.svelte +87 -12
  106. package/dist/options-multi-select/OptionsMultiSelect.svelte.d.ts +3 -1
  107. package/dist/options-multi-select/README.md +480 -0
  108. package/dist/options-multi-select/README_CN.md +480 -0
  109. package/dist/options-select/OptionsSelect.svelte +36 -5
  110. package/dist/options-select/OptionsSelect.svelte.d.ts +3 -4
  111. package/dist/options-select/README.md +632 -0
  112. package/dist/options-select/README_CN.md +632 -0
  113. package/dist/page/README.md +605 -0
  114. package/dist/page/README_CN.md +605 -0
  115. package/dist/pagination/README.md +946 -0
  116. package/dist/pagination/README_CN.md +946 -0
  117. package/dist/pagination-panel/README.md +1075 -0
  118. package/dist/pagination-panel/README_CN.md +1075 -0
  119. package/dist/popup-hint/README.md +841 -0
  120. package/dist/popup-hint/README_CN.md +840 -0
  121. package/dist/progress-bar/README.md +242 -0
  122. package/dist/progress-bar/README_CN.md +242 -0
  123. package/dist/progress-step-bar/README.md +316 -0
  124. package/dist/progress-step-bar/README_CN.md +316 -0
  125. package/dist/prompts-text-editor/PromptsTextEditor.svelte +6 -3
  126. package/dist/prompts-text-editor/PromptsTextEditor.svelte.d.ts +3 -1
  127. package/dist/prompts-text-editor/README.md +329 -0
  128. package/dist/prompts-text-editor/README_CN.md +329 -0
  129. package/dist/property-editor/README.md +969 -0
  130. package/dist/property-editor/README_CN.md +969 -0
  131. package/dist/radio-button/README.md +372 -0
  132. package/dist/radio-button/README_CN.md +372 -0
  133. package/dist/radio-button/RadioButton.svelte +32 -3
  134. package/dist/radio-button/RadioButton.svelte.d.ts +12 -1
  135. package/dist/search-box/README.md +425 -0
  136. package/dist/search-box/README_CN.md +424 -0
  137. package/dist/search-box/SearchBox.svelte +22 -6
  138. package/dist/search-box/SearchBox.svelte.d.ts +4 -1
  139. package/dist/tabs/README.md +919 -0
  140. package/dist/tabs/README_CN.md +920 -0
  141. package/dist/tag/README.md +922 -0
  142. package/dist/tag/README_CN.md +922 -0
  143. package/dist/text-editor/PasswordEditor.svelte +17 -2
  144. package/dist/text-editor/PasswordEditor.svelte.d.ts +3 -3
  145. package/dist/text-editor/PasswordEditor_README.md +551 -0
  146. package/dist/text-editor/PasswordEditor_README_CN.md +551 -0
  147. package/dist/text-editor/README.md +466 -0
  148. package/dist/text-editor/README_CN.md +466 -0
  149. package/dist/text-editor/TextEditor.svelte +51 -19
  150. package/dist/text-editor/TextEditor.svelte.d.ts +0 -1
  151. package/dist/time-editor/README.md +498 -24
  152. package/dist/time-editor/README_CN.md +498 -0
  153. package/dist/time-editor/TimeEditor.svelte +7 -3
  154. package/dist/time-editor/TimeEditor.svelte.d.ts +3 -1
  155. package/dist/toast/README.md +667 -0
  156. package/dist/toast/README_CN.md +667 -0
  157. package/dist/transfer/README.md +795 -0
  158. package/dist/transfer/Transfer.svelte +6 -4
  159. package/dist/transfer/Transfer.svelte.d.ts +3 -1
  160. package/dist/tree-view/README.md +761 -0
  161. package/dist/tree-view/README_CN.md +761 -0
  162. package/dist/tree-view/TreeView.svelte +5 -3
  163. package/dist/tree-view/TreeView.svelte.d.ts +3 -1
  164. package/dist/unit-number-editor/README.md +546 -20
  165. package/dist/unit-number-editor/README_CN.md +525 -0
  166. package/dist/unit-number-editor/UnitNumberEditor.svelte +62 -8
  167. package/dist/unit-number-editor/UnitNumberEditor.svelte.d.ts +5 -1
  168. package/docs/form-field/cn/README_CN.md +364 -0
  169. package/docs/form-field/en/README.md +364 -0
  170. package/docs/form-panel/flex-form/cn/README_CN.md +586 -0
  171. package/docs/form-panel/flex-form/en/README.md +586 -0
  172. package/docs/form-panel/flex-row-form/cn/README_CN.md +787 -0
  173. package/docs/form-panel/flex-row-form/en/README.md +787 -0
  174. package/docs/form-panel/grid-form/en/README.md +744 -0
  175. package/package.json +1 -1
  176. package/dist/drawer/README-CN.md +0 -1
@@ -0,0 +1,712 @@
1
+ # DataTable 数据表格组件
2
+
3
+ 一个功能强大且灵活的数据表格组件,支持排序、行选择、内联扩展、自定义单元格格式、操作列、冻结列和行操作。非常适合显示大型数据集、复杂数据结构和用户交互。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install @ticatec/uniface-element
9
+ ```
10
+
11
+ ## 导入
12
+
13
+ ```typescript
14
+ import DataTable from "@ticatec/uniface-element/DataTable";
15
+ import type { DataColumn, ActionsColumn, IndicatorColumn, RowAction } from "@ticatec/uniface-element/DataTable";
16
+ ```
17
+
18
+ ## 基本用法
19
+
20
+ ```svelte
21
+ <script>
22
+ import DataTable from "@ticatec/uniface-element/DataTable";
23
+
24
+ const columns = [
25
+ { text: "姓名", field: "name", width: 150 },
26
+ { text: "年龄", field: "age", width: 80, align: "center" },
27
+ { text: "电子邮件", field: "email", width: 200 }
28
+ ];
29
+
30
+ const list = [
31
+ { name: "张伟", age: 30, email: "zhangwei@example.com" },
32
+ { name: "李娜", age: 25, email: "lina@example.com" }
33
+ ];
34
+ </script>
35
+
36
+ <DataTable {columns} {list} />
37
+ ```
38
+
39
+ ## 属性
40
+
41
+ | 属性 | 类型 | 默认值 | 描述 |
42
+ |------|------|---------|-------------|
43
+ | `columns` | `Array<DataColumn>` | 必需 | 列配置数组 |
44
+ | `list` | `Array<any>` | 必需 | 要显示的数据数组 |
45
+ | `actionsColumn` | `ActionsColumn \| null` | `null` | 操作列配置 |
46
+ | `indicatorColumn` | `IndicatorColumn \| null` | `null` | 指示器/选择列配置 |
47
+ | `selectedRows` | `Array<any>` | `[]` | 选中行的数据数组 |
48
+ | `rowHeight` | `number` | `42` | 常规行高度(像素) |
49
+ | `inlineRowHeight` | `number` | `80` | 扩展内联行高度(像素) |
50
+ | `rowBorder` | `boolean` | `false` | 是否显示水平行边框 |
51
+ | `colBorder` | `boolean` | `false` | 是否显示垂直列边框 |
52
+ | `emptyIndicator` | `string \| undefined` | `undefined` | 无数据时显示的文本 |
53
+ | `style` | `string` | `""` | 附加 CSS 样式 |
54
+
55
+ ## 类型
56
+
57
+ ### DataColumn
58
+
59
+ ```typescript
60
+ interface DataColumn {
61
+ text: string; // 列标题文本
62
+ field?: string; // 数据字段名称
63
+ width: number; // 列宽(像素)
64
+ frozen?: boolean; // 列是否冻结/固定
65
+ align?: 'left' | 'center' | 'right'; // 文本对齐方式
66
+ minWidth?: number; // 最小列宽
67
+ warp?: boolean; // 文本是否可换行
68
+ formatter?: FormatCell; // 单元格格式化函数
69
+ escapeHTML?: boolean; // 是否转义 HTML 内容
70
+ href?: HrefBuilder; // 链接生成函数
71
+ hint?: CellHint; // 工具提示/提示函数
72
+ render?: any; // 自定义 Svelte 组件渲染器
73
+ visible?: boolean; // 列可见性
74
+ resizable?: boolean; // 列是否可调整大小
75
+ compareFunction?: CompareFunction; // 排序比较函数
76
+ }
77
+ ```
78
+
79
+ ### ActionsColumn
80
+
81
+ ```typescript
82
+ interface ActionsColumn {
83
+ width: number; // 列宽(像素)
84
+ getActions: GetRowActions; // 返回每行操作的函数
85
+ align?: 'left' | 'center'; // 操作对齐方式
86
+ }
87
+ ```
88
+
89
+ ### IndicatorColumn
90
+
91
+ ```typescript
92
+ interface IndicatorColumn {
93
+ width: number; // 列宽(像素)
94
+ selectable?: boolean; // 行是否可选择
95
+ displayNo?: boolean; // 是否显示行号
96
+ buildInlineComponent?: (data: any) => Promise<any>; // 内联组件生成器
97
+ }
98
+ ```
99
+
100
+ ### RowAction
101
+
102
+ ```typescript
103
+ interface RowAction {
104
+ label: string; // 操作按钮文本
105
+ icon?: string; // 可选图标名称
106
+ type?: "primary" | "secondary"; // 按钮类型/样式
107
+ callback: ActionFunction; // 点击处理函数
108
+ }
109
+ ```
110
+
111
+ ## 示例
112
+
113
+ ### 基本数据表格
114
+
115
+ ```svelte
116
+ <script>
117
+ import DataTable from "@ticatec/uniface-element/DataTable";
118
+
119
+ const columns = [
120
+ {
121
+ text: "产品名称",
122
+ field: "name",
123
+ width: 200,
124
+ resizable: true
125
+ },
126
+ {
127
+ text: "价格",
128
+ field: "price",
129
+ width: 100,
130
+ align: "right",
131
+ formatter: (value) => `¥${value?.toFixed(2) ?? '0.00'}`
132
+ },
133
+ {
134
+ text: "类别",
135
+ field: "category",
136
+ width: 150,
137
+ align: "center"
138
+ },
139
+ {
140
+ text: "库存",
141
+ field: "stock",
142
+ width: 80,
143
+ align: "center",
144
+ compareFunction: (a, b) => (a?.stock ?? 0) - (b?.stock ?? 0)
145
+ }
146
+ ];
147
+
148
+ const products = [
149
+ { name: "笔记本电脑", price: 6999.99, category: "电子产品", stock: 15 },
150
+ { name: "智能手机", price: 4999.99, category: "电子产品", stock: 25 },
151
+ { name: "书籍", price: 99.99, category: "教育", stock: 100 },
152
+ { name: "耳机", price: 999.99, category: "电子产品", stock: 8 }
153
+ ];
154
+ </script>
155
+
156
+ <div class="table-container">
157
+ <DataTable columns={columns} list={products} rowBorder={true} />
158
+ </div>
159
+
160
+ <style>
161
+ .table-container {
162
+ width: 100%;
163
+ height: 400px;
164
+ border: 1px solid #e2e8f0;
165
+ border-radius: 8px;
166
+ }
167
+ </style>
168
+ ```
169
+
170
+ ### 带有行选择和操作的表格
171
+
172
+ ```svelte
173
+ <script>
174
+ import DataTable from "@ticatec/uniface-element/DataTable";
175
+
176
+ const columns = [
177
+ { text: "姓名", field: "name", width: 150 },
178
+ { text: "电子邮件", field: "email", width: 200 },
179
+ { text: "角色", field: "role", width: 120 },
180
+ { text: "状态", field: "status", width: 100, align: "center",
181
+ formatter: (value) => {
182
+ const colors = { active: 'green', inactive: 'red', pending: 'orange' };
183
+ return `<span style="color: ${colors[value] || 'black'}">${value}</span>`;
184
+ },
185
+ escapeHTML: true
186
+ }
187
+ ];
188
+
189
+ const indicatorColumn = {
190
+ width: 60,
191
+ selectable: true,
192
+ displayNo: true
193
+ };
194
+
195
+ const actionsColumn = {
196
+ width: 120,
197
+ align: 'center',
198
+ getActions: (user) => [
199
+ {
200
+ label: '编辑',
201
+ icon: 'icon_google_create',
202
+ callback: () => handleEdit(user)
203
+ },
204
+ {
205
+ label: '删除',
206
+ icon: 'icon_google_delete',
207
+ type: 'secondary',
208
+ callback: () => handleDelete(user)
209
+ }
210
+ ]
211
+ };
212
+
213
+ const users = [
214
+ { name: "张丽", email: "zhangli@company.com", role: "管理员", status: "active" },
215
+ { name: "王强", email: "wangqiang@company.com", role: "用户", status: "active" },
216
+ { name: "李芳", email: "lifang@company.com", role: "经理", status: "pending" }
217
+ ];
218
+
219
+ let selectedRows = [];
220
+
221
+ function handleEdit(user) {
222
+ console.log('正在编辑用户:', user);
223
+ }
224
+
225
+ function handleDelete(user) {
226
+ console.log('正在删除用户:', user);
227
+ }
228
+
229
+ $: console.log('已选择用户:', selectedRows);
230
+ </script>
231
+
232
+ <DataTable
233
+ {columns}
234
+ list={users}
235
+ {indicatorColumn}
236
+ {actionsColumn}
237
+ bind:selectedRows
238
+ rowBorder={true}
239
+ colBorder={true}
240
+ />
241
+ ```
242
+
243
+ ### 带有自定义单元格渲染和排序的表格
244
+
245
+ ```svelte
246
+ <script>
247
+ import DataTable from "@ticatec/uniface-element/DataTable";
248
+ import UserAvatar from "./UserAvatar.svelte";
249
+
250
+ const columns = [
251
+ {
252
+ text: "用户",
253
+ field: "user",
254
+ width: 200,
255
+ render: UserAvatar
256
+ },
257
+ {
258
+ text: "分数",
259
+ field: "score",
260
+ width: 100,
261
+ align: "center",
262
+ formatter: (value) => `${value}/100`,
263
+ compareFunction: (a, b) => (a?.score ?? 0) - (b?.score ?? 0)
264
+ },
265
+ {
266
+ text: "最后登录",
267
+ field: "lastLogin",
268
+ width: 150,
269
+ compareFunction: (a, b) => {
270
+ const dateA = new Date(a?.lastLogin ?? 0);
271
+ const dateB = new Date(b?.lastLogin ?? 0);
272
+ return dateA.getTime() - dateB.getTime();
273
+ },
274
+ formatter: (value) => {
275
+ return value ? new Date(value).toLocaleDateString('zh-CN') : '从未登录';
276
+ }
277
+ },
278
+ {
279
+ text: "操作",
280
+ field: "website",
281
+ width: 120,
282
+ href: (item) => [{
283
+ text: "访问个人资料",
284
+ action: () => window.open(`/profile/${item.id}`, '_blank')
285
+ }, {
286
+ text: "发送消息",
287
+ action: () => handleSendMessage(item)
288
+ }]
289
+ }
290
+ ];
291
+
292
+ const userData = [
293
+ {
294
+ id: 1,
295
+ user: { name: "张伟", avatar: "/avatars/zhangwei.jpg" },
296
+ score: 85,
297
+ lastLogin: "2024-01-15",
298
+ website: "zhangwei-portfolio.com"
299
+ },
300
+ {
301
+ id: 2,
302
+ user: { name: "李娜", avatar: "/avatars/lina.jpg" },
303
+ score: 92,
304
+ lastLogin: "2024-01-10",
305
+ website: "lina-designs.com"
306
+ }
307
+ ];
308
+
309
+ function handleSendMessage(user) {
310
+ console.log('向用户发送消息:', user.user.name);
311
+ }
312
+ </script>
313
+
314
+ <DataTable {columns} list={userData} rowHeight={50} />
315
+ ```
316
+
317
+ ### 带有内联行扩展的表格
318
+
319
+ ```svelte
320
+ <script>
321
+ import DataTable from "@ticatec/uniface-element/DataTable";
322
+ import OrderDetails from "./OrderDetails.svelte";
323
+
324
+ const columns = [
325
+ { text: "订单ID", field: "orderId", width: 120 },
326
+ { text: "客户", field: "customer", width: 150 },
327
+ { text: "总计", field: "total", width: 100, align: "right",
328
+ formatter: (value) => `¥${value?.toFixed(2) ?? '0.00'}`
329
+ },
330
+ { text: "状态", field: "status", width: 120, align: "center" },
331
+ { text: "日期", field: "orderDate", width: 120 }
332
+ ];
333
+
334
+ const indicatorColumn = {
335
+ width: 50,
336
+ selectable: false,
337
+ displayNo: false,
338
+ buildInlineComponent: async (orderData) => {
339
+ // 模拟 API 调用以获取订单详情
340
+ await new Promise(resolve => setTimeout(resolve, 1000));
341
+ return OrderDetails;
342
+ }
343
+ };
344
+
345
+ const orders = [
346
+ {
347
+ orderId: "ORD-001",
348
+ customer: "张伟",
349
+ total: 2999.99,
350
+ status: "已发货",
351
+ orderDate: "2024-01-15",
352
+ items: [
353
+ { product: "笔记本电脑", quantity: 1, price: 2999.99 }
354
+ ]
355
+ },
356
+ {
357
+ orderId: "ORD-002",
358
+ customer: "李娜",
359
+ total: 1499.98,
360
+ status: "处理中",
361
+ orderDate: "2024-01-14",
362
+ items: [
363
+ { product: "鼠标", quantity: 2, price: 249.99 },
364
+ { product: "键盘", quantity: 1, price: 999.99 }
365
+ ]
366
+ }
367
+ ];
368
+ </script>
369
+
370
+ <DataTable
371
+ {columns}
372
+ list={orders}
373
+ {indicatorColumn}
374
+ inlineRowHeight={200}
375
+ emptyIndicator="未找到订单"
376
+ />
377
+ ```
378
+
379
+ ### 带有冻结列的表格
380
+
381
+ ```svelte
382
+ <script>
383
+ import DataTable from "@ticatec/uniface-element/DataTable";
384
+
385
+ const columns = [
386
+ {
387
+ text: "姓名",
388
+ field: "name",
389
+ width: 150,
390
+ frozen: true,
391
+ resizable: false
392
+ },
393
+ {
394
+ text: "员工ID",
395
+ field: "employeeId",
396
+ width: 100,
397
+ frozen: true,
398
+ align: "center"
399
+ },
400
+ { text: "部门", field: "department", width: 150 },
401
+ { text: "职位", field: "position", width: 180 },
402
+ { text: "薪资", field: "salary", width: 120, align: "right",
403
+ formatter: (value) => `¥${value?.toLocaleString() ?? '0'}` }
404
+ },
405
+ { text: "入职日期", field: "startDate", width: 120 },
406
+ { text: "经理", field: "manager", width: 150 },
407
+ { text: "地点", field: "location", width: 200 },
408
+ { text: "电话", field: "phone", width: 140 },
409
+ { text: "电子邮件", field: "email", width: 200 }
410
+ ];
411
+
412
+ const employees = [
413
+ {
414
+ name: "张伟",
415
+ employeeId: "EMP001",
416
+ department: "工程部",
417
+ position: "高级开发人员",
418
+ salary: 95000,
419
+ startDate: "2022-03-15",
420
+ manager: "李芳",
421
+ location: "上海",
422
+ phone: "555-0123",
423
+ email: "zhangwei@company.com"
424
+ },
425
+ // ... 更多员工记录
426
+ ];
427
+ </script>
428
+
429
+ <div style="width: 800px; height: 400px;">
430
+ <DataTable {columns} list={employees} />
431
+ </div>
432
+ ```
433
+
434
+ ### 高级表格(包含所有功能)
435
+
436
+ ```svelte
437
+ <script>
438
+ import DataTable from "@ticatec/uniface-element/DataTable";
439
+ import ProductDetails from "./ProductDetails.svelte";
440
+ import ProductImage from "./ProductImage.svelte";
441
+
442
+ const columns = [
443
+ {
444
+ text: "图片",
445
+ field: "image",
446
+ width: 80,
447
+ frozen: true,
448
+ render: ProductImage,
449
+ align: "center"
450
+ },
451
+ {
452
+ text: "产品",
453
+ field: "name",
454
+ width: 200,
455
+ frozen: true,
456
+ resizable: true,
457
+ hint: (item) => `SKU: ${item.sku}`,
458
+ compareFunction: (a, b) => (a?.name ?? '').localeCompare(b?.name ?? '')
459
+ },
460
+ {
461
+ text: "价格",
462
+ field: "price",
463
+ width: 100,
464
+ align: "right",
465
+ formatter: (value) => `¥${value?.toFixed(2) ?? '0.00'}`,
466
+ compareFunction: (a, b) => (a?.price ?? 0) - (b?.price ?? 0)
467
+ },
468
+ {
469
+ text: "库存",
470
+ field: "stock",
471
+ width: 80,
472
+ align: "center",
473
+ formatter: (value) => {
474
+ if (value === 0) return '<span style="color: red">缺货</span>';
475
+ if (value < 10) return `<span style="color: orange">${value}</span>`;
476
+ return `<span style="color: green">${value}</span>`;
477
+ },
478
+ escapeHTML: true,
479
+ compareFunction: (a, b) => (a?.stock ?? 0) - (b?.stock ?? 0)
480
+ },
481
+ {
482
+ text: "类别",
483
+ field: "category",
484
+ width: 120,
485
+ compareFunction: (a, b) => (a?.category ?? '').localeCompare(b?.category ?? '')
486
+ },
487
+ {
488
+ text: "供应商",
489
+ field: "supplier",
490
+ width: 150,
491
+ href: (item) => [{
492
+ text: "联系供应商",
493
+ action: () => openSupplierContact(item.supplierId)
494
+ }]
495
+ },
496
+ {
497
+ text: "最后更新",
498
+ field: "updatedAt",
499
+ width: 140,
500
+ formatter: (value) => new Date(value).toLocaleDateString('zh-CN'),
501
+ compareFunction: (a, b) => {
502
+ const dateA = new Date(a?.updatedAt ?? 0);
503
+ const dateB = new Date(b?.updatedAt ?? 0);
504
+ return dateA.getTime() - dateB.getTime();
505
+ }
506
+ }
507
+ ];
508
+
509
+ const indicatorColumn = {
510
+ width: 60,
511
+ selectable: true,
512
+ displayNo: true,
513
+ buildInlineComponent: async (product) => {
514
+ // 模拟加载产品详情
515
+ return ProductDetails;
516
+ }
517
+ };
518
+
519
+ const actionsColumn = {
520
+ width: 140,
521
+ align: 'center',
522
+ getActions: (product) => {
523
+ const actions = [
524
+ {
525
+ label: '编辑',
526
+ icon: 'icon_google_create',
527
+ callback: () => editProduct(product)
528
+ },
529
+ {
530
+ label: '复制',
531
+ icon: 'icon_google_content_copy',
532
+ callback: () => cloneProduct(product)
533
+ }
534
+ ];
535
+
536
+ if (product.stock === 0) {
537
+ actions.push({
538
+ label: '补货',
539
+ icon: 'icon_google_add_shopping_cart',
540
+ type: 'primary',
541
+ callback: () => restockProduct(product)
542
+ });
543
+ }
544
+
545
+ actions.push({
546
+ label: '删除',
547
+ icon: 'icon_google_delete',
548
+ type: 'secondary',
549
+ callback: () => deleteProduct(product)
550
+ });
551
+
552
+ return actions;
553
+ }
554
+ };
555
+
556
+ let products = [
557
+ {
558
+ id: 1,
559
+ name: "无线耳机",
560
+ sku: "WH-001",
561
+ price: 1999.99,
562
+ stock: 25,
563
+ category: "电子产品",
564
+ supplier: "科技公司",
565
+ supplierId: "SUP001",
566
+ image: "/images/headphones.jpg",
567
+ updatedAt: "2024-01-15T10:30:00Z"
568
+ },
569
+ // ... 更多产品
570
+ ];
571
+
572
+ let selectedRows = [];
573
+
574
+ function editProduct(product) {
575
+ console.log('正在编辑产品:', product);
576
+ }
577
+
578
+ function cloneProduct(product) {
579
+ console.log('正在复制产品:', product);
580
+ }
581
+
582
+ function restockProduct(product) {
583
+ console.log('正在补货产品:', product);
584
+ }
585
+
586
+ function deleteProduct(product) {
587
+ console.log('正在删除产品:', product);
588
+ }
589
+
590
+ function openSupplierContact(supplierId) {
591
+ console.log('打开供应商联系方式:', supplierId);
592
+ }
593
+
594
+ $: console.log('已选择产品:', selectedRows);
595
+ </script>
596
+
597
+ <div class="advanced-table">
598
+ <h2>产品库存管理</h2>
599
+ <div class="table-wrapper">
600
+ <DataTable
601
+ {columns}
602
+ list={products}
603
+ {indicatorColumn}
604
+ {actionsColumn}
605
+ bind:selectedRows
606
+ rowHeight={60}
607
+ inlineRowHeight={300}
608
+ rowBorder={true}
609
+ colBorder={true}
610
+ emptyIndicator="未找到产品,请添加一些产品以开始。"
611
+ />
612
+ </div>
613
+
614
+ {#if selectedRows.length > 0}
615
+ <div class="selection-info">
616
+ <p>已选择 {selectedRows.length} 个产品</p>
617
+ <button on:click={() => console.log('批量编辑:', selectedRows)}>
618
+ 批量编辑
619
+ </button>
620
+ <button on:click={() => console.log('批量删除:', selectedRows)}>
621
+ 批量删除
622
+ </button>
623
+ </div>
624
+ {/if}
625
+ </div>
626
+
627
+ <style>
628
+ .advanced-table {
629
+ padding: 20px;
630
+ height: 100vh;
631
+ display: flex;
632
+ flex-direction: column;
633
+ }
634
+
635
+ .table-wrapper {
636
+ flex: 1;
637
+ border: 1px solid #e2e8f0;
638
+ border-radius: 8px;
639
+ overflow: hidden;
640
+ }
641
+
642
+ .selection-info {
643
+ margin-top: 16px;
644
+ padding: 12px;
645
+ background: #f8fafc;
646
+ border-radius: 6px;
647
+ display: flex;
648
+ align-items: center;
649
+ gap: 12px;
650
+ }
651
+
652
+ .selection-info button {
653
+ padding: 6px 12px;
654
+ border: 1px solid #d1d5db;
655
+ border-radius: 4px;
656
+ background: white;
657
+ cursor: pointer;
658
+ }
659
+
660
+ .selection-info button:hover {
661
+ background: #f3f4f6;
662
+ }
663
+ </style>
664
+ ```
665
+
666
+ ## 样式
667
+
668
+ DataTable 组件通过 CSS 自定义属性和类支持广泛的样式定制:
669
+
670
+ ```css
671
+ .uniface-data-table {
672
+ --table-header-bg: #f8fafc;
673
+ --table-header-text: #374151;
674
+ --table-row-hover: #f9fafb;
675
+ --table-border-color: #e5e7eb;
676
+ --table-selected-bg: #dbeafe;
677
+ }
678
+
679
+ /* 自定义行样式 */
680
+ .uniface-data-table.row-border .table-row {
681
+ border-bottom: 1px solid var(--table-border-color);
682
+ }
683
+
684
+ /* 自定义列样式 */
685
+ .uniface-data-table.cell-border .table-cell {
686
+ border-right: 1px solid var(--table-border-color);
687
+ }
688
+ ```
689
+
690
+ ## 可访问性
691
+
692
+ DataTable 组件包括以下可访问性功能:
693
+
694
+ - 支持键盘导航
695
+ - 为屏幕阅读器提供 ARIA 标签
696
+ - 交互元素的焦点管理
697
+ - 语义化表格结构
698
+ - 行选择提示
699
+
700
+ ## 最佳实践
701
+
702
+ 1. **性能**:对于大型数据集(1000+ 行),考虑实现虚拟滚动或分页
703
+ 2. **列宽**:根据内容设置合适的宽度以防止布局偏移
704
+ 3. **冻结列**:谨慎使用冻结列,仅用于关键标识符
705
+ 4. **操作**:将行操作限制在 3-5 个最重要的操作
706
+ 5. **加载状态**:始终为异步操作提供加载指示器
707
+ 6. **错误处理**:为内联组件加载失败实现适当的错误处理
708
+ 7. **响应式设计**:在较小的屏幕上考虑隐藏次要列
709
+
710
+ ## 许可证
711
+
712
+ MIT