@ticatec/uniface-element 0.2.0 → 0.2.1

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 (126) hide show
  1. package/README.md +273 -1
  2. package/README_CN.md +341 -0
  3. package/dist/common/MouseClickHandler.d.ts +1 -1
  4. package/dist/dialog/CommonDialog.svelte +6 -3
  5. package/dist/dialog/CommonDialog.svelte.d.ts +2 -1
  6. package/dist/dialog/Dialog.svelte +36 -10
  7. package/dist/dialog/Dialog.svelte.d.ts +4 -3
  8. package/dist/dialog/DialogBoard.svelte +11 -8
  9. package/dist/dialog/DialogWrapper.svelte +10 -0
  10. package/dist/dialog/DialogWrapper.svelte.d.ts +22 -0
  11. package/dist/dialog/Dialogs.js +1 -1
  12. package/dist/dialog/ModalResult.d.ts +5 -0
  13. package/dist/dialog/ModalResult.js +5 -0
  14. package/docs/buttons/cn/ActionBar.md +459 -0
  15. package/docs/buttons/cn/Button.md +228 -0
  16. package/docs/buttons/cn/IconButton.md +294 -0
  17. package/docs/buttons/cn/README.md +600 -0
  18. package/docs/buttons/cn/TextButton.md +163 -0
  19. package/docs/buttons/en/ActionBar.md +459 -0
  20. package/docs/buttons/en/Button.md +228 -0
  21. package/docs/buttons/en/IconButton.md +294 -0
  22. package/docs/buttons/en/README.md +600 -0
  23. package/docs/buttons/en/TextButton.md +163 -0
  24. package/docs/containers/cn/accordion.md +622 -0
  25. package/docs/containers/cn/box.md +445 -0
  26. package/docs/containers/cn/card.md +404 -0
  27. package/docs/containers/cn/page.md +576 -0
  28. package/docs/containers/cn/tabs.md +686 -0
  29. package/docs/containers/en/accordion.md +622 -0
  30. package/docs/containers/en/box.md +445 -0
  31. package/docs/containers/en/card.md +404 -0
  32. package/docs/containers/en/page.md +576 -0
  33. package/docs/containers/en/tabs.md +686 -0
  34. package/docs/data-display/cn/concise-data-table.md +731 -0
  35. package/docs/data-display/cn/listbox.md +786 -0
  36. package/docs/data-display/cn/treeview.md +863 -0
  37. package/docs/data-display/en/concise-data-table.md +732 -0
  38. package/docs/data-display/en/listbox.md +786 -0
  39. package/docs/data-display/en/treeview.md +863 -0
  40. package/docs/data-table/cn/README.md +596 -0
  41. package/docs/data-table/en/README.md +596 -0
  42. package/docs/dialog/cn/README.md +767 -0
  43. package/docs/dialog/en/README.md +767 -0
  44. package/docs/form/cn/README.md +847 -0
  45. package/docs/form/en/README.md +847 -0
  46. package/docs/form-components/cn/README.md +495 -0
  47. package/docs/form-components/cn/attachmentfilesfield.md +757 -0
  48. package/docs/form-components/cn/cascade-options-select.md +374 -0
  49. package/docs/form-components/cn/checkbox.md +58 -0
  50. package/docs/form-components/cn/date-picker.md +138 -0
  51. package/docs/form-components/cn/datetime-picker.md +228 -0
  52. package/docs/form-components/cn/group-checkbox.md +405 -0
  53. package/docs/form-components/cn/group-radiobox.md +525 -0
  54. package/docs/form-components/cn/imagefilesfield.md +651 -0
  55. package/docs/form-components/cn/input-options-select.md +250 -0
  56. package/docs/form-components/cn/lookup-editor.md +406 -0
  57. package/docs/form-components/cn/memoeditor.md +409 -0
  58. package/docs/form-components/cn/number-editor.md +261 -0
  59. package/docs/form-components/cn/options-multi-select.md +177 -0
  60. package/docs/form-components/cn/options-select.md +83 -0
  61. package/docs/form-components/cn/passwordeditor.md +538 -0
  62. package/docs/form-components/cn/prompts-text-editor.md +241 -0
  63. package/docs/form-components/cn/radiobutton.md +84 -0
  64. package/docs/form-components/cn/switch.md +178 -0
  65. package/docs/form-components/cn/text-editor.md +142 -0
  66. package/docs/form-components/cn/time-editor.md +159 -0
  67. package/docs/form-components/cn/unit-number-editor.md +164 -0
  68. package/docs/form-components/en/README.md +463 -0
  69. package/docs/form-components/en/attachmentfilesfield.md +757 -0
  70. package/docs/form-components/en/cascade-options-select.md +358 -0
  71. package/docs/form-components/en/checkbox.md +59 -0
  72. package/docs/form-components/en/date-picker.md +138 -0
  73. package/docs/form-components/en/datetime-picker.md +228 -0
  74. package/docs/form-components/en/group-checkbox.md +395 -0
  75. package/docs/form-components/en/group-radiobox.md +498 -0
  76. package/docs/form-components/en/imagefilesfield.md +651 -0
  77. package/docs/form-components/en/input-options-select.md +239 -0
  78. package/docs/form-components/en/lookup-editor.md +389 -0
  79. package/docs/form-components/en/memoeditor.md +409 -0
  80. package/docs/form-components/en/number-editor.md +249 -0
  81. package/docs/form-components/en/options-multi-select.md +177 -0
  82. package/docs/form-components/en/options-select.md +83 -0
  83. package/docs/form-components/en/passwordeditor.md +538 -0
  84. package/docs/form-components/en/prompts-text-editor.md +241 -0
  85. package/docs/form-components/en/radiobutton.md +84 -0
  86. package/docs/form-components/en/switch.md +180 -0
  87. package/docs/form-components/en/text-editor.md +142 -0
  88. package/docs/form-components/en/time-editor.md +159 -0
  89. package/docs/form-components/en/unit-number-editor.md +164 -0
  90. package/docs/form-layout/cn/criteria-field.md +652 -0
  91. package/docs/form-layout/cn/flex-form.md +454 -0
  92. package/docs/form-layout/cn/flex-row-form.md +542 -0
  93. package/docs/form-layout/cn/form-field.md +923 -0
  94. package/docs/form-layout/cn/grid-form.md +676 -0
  95. package/docs/form-layout/en/criteria-field.md +652 -0
  96. package/docs/form-layout/en/flex-form.md +454 -0
  97. package/docs/form-layout/en/flex-row-form.md +542 -0
  98. package/docs/form-layout/en/form-field.md +923 -0
  99. package/docs/form-layout/en/grid-form.md +676 -0
  100. package/docs/global/cn/README.md +534 -0
  101. package/docs/global/en/README.md +534 -0
  102. package/docs/layout/cn/classiclayout.md +460 -0
  103. package/docs/layout/cn/headerlayout.md +524 -0
  104. package/docs/layout/cn/sidebarlayout.md +263 -0
  105. package/docs/layout/en/classiclayout.md +951 -0
  106. package/docs/layout/en/headerlayout.md +524 -0
  107. package/docs/layout/en/sidebarlayout.md +262 -0
  108. package/docs/misc/cn/README.md +1217 -0
  109. package/docs/misc/en/README.md +1217 -0
  110. package/docs/navigation/cn/breadcrumb.md +291 -0
  111. package/docs/navigation/cn/navigator.md +322 -0
  112. package/docs/navigation/cn/navigatormenu.md +512 -0
  113. package/docs/navigation/cn/progressbar.md +199 -0
  114. package/docs/navigation/cn/progressstepbar.md +299 -0
  115. package/docs/navigation/en/breadcrumb.md +291 -0
  116. package/docs/navigation/en/navigator.md +322 -0
  117. package/docs/navigation/en/navigatormenu.md +512 -0
  118. package/docs/navigation/en/progressbar.md +199 -0
  119. package/docs/navigation/en/progressstepbar.md +299 -0
  120. package/docs/search-filters/cn/daterange.md +1156 -0
  121. package/docs/search-filters/cn/numberrange.md +688 -0
  122. package/docs/search-filters/cn/searchbox.md +1582 -0
  123. package/docs/search-filters/en/daterange.md +1156 -0
  124. package/docs/search-filters/en/numberrange.md +688 -0
  125. package/docs/search-filters/en/searchbox.md +1582 -0
  126. package/package.json +38 -5
@@ -0,0 +1,731 @@
1
+ # ConciseDataTable 简洁数据表格组件
2
+
3
+ 一个轻量级、功能丰富的数据表格组件,具有自动滚动功能、灵活的列配置和可定制样式,用于高效显示表格数据。
4
+
5
+ ## 概述
6
+
7
+ ConciseDataTable 组件为以表格格式显示结构化数据提供了简化的解决方案。它具有大数据集的自动滚动功能、具有固定和比例宽度的灵活列定义、自定义数据格式化和全面的主题选项。非常适合仪表板、数据监控系统和需要连续数据显示的应用程序。
8
+
9
+ ## 安装
10
+
11
+ ```typescript
12
+ import ConciseDataTable from '@ticatec/uniface-element/ConciseDataTable';
13
+ import type { Column, TableOptions, RowClickHandler } from '@ticatec/uniface-element/ConciseDataTable';
14
+ ```
15
+
16
+ ## 基本用法
17
+
18
+ ```svelte
19
+ <script lang="ts">
20
+ import ConciseDataTable from '@ticatec/uniface-element/ConciseDataTable';
21
+ import type { Column, TableOptions } from '@ticatec/uniface-element/ConciseDataTable';
22
+
23
+ let data = [
24
+ { id: 1, name: '张三', department: '工程部', salary: 75000, joinDate: '2023-01-15' },
25
+ { id: 2, name: '李四', department: '市场部', salary: 68000, joinDate: '2023-02-20' },
26
+ { id: 3, name: '王五', department: '销售部', salary: 72000, joinDate: '2023-03-10' }
27
+ ];
28
+
29
+ const columns: Column[] = [
30
+ { title: '姓名', field: 'name', width: 150 },
31
+ { title: '部门', field: 'department', width: 120 },
32
+ { title: '薪资', field: 'salary', width: 100, align: 'right' },
33
+ { title: '入职日期', field: 'joinDate', width: 120, align: 'center' }
34
+ ];
35
+
36
+ const options: TableOptions = {
37
+ headerHeight: 40,
38
+ rowHeight: 35
39
+ };
40
+ </script>
41
+
42
+ <ConciseDataTable
43
+ list={data}
44
+ {columns}
45
+ {options}
46
+ />
47
+ ```
48
+
49
+ ## 属性
50
+
51
+ | 属性 | 类型 | 默认值 | 描述 |
52
+ |------|------|--------|------|
53
+ | `list` | `Array<any>` | - | 要显示的数据对象数组 |
54
+ | `columns` | `Array<Column>` | - | 表格的列定义 |
55
+ | `autoScroll` | `boolean` | `false` | 启用自动滚动 |
56
+ | `scrollInterval` | `number` | `2000` | 滚动步骤之间的毫秒数 |
57
+ | `rowClickHandler` | `RowClickHandler \| null` | `null` | 行点击的处理函数 |
58
+ | `options` | `TableOptions` | `{}` | 表格样式和行为选项 |
59
+
60
+ ## 类型定义
61
+
62
+ ```typescript
63
+ /**
64
+ * 列配置接口
65
+ */
66
+ interface Column {
67
+ title: string; // 列标题的显示文本
68
+ field: string; // 数据对象中的字段名
69
+ width: number; // 以像素为单位的宽度
70
+ align?: "left" | "center" | "right"; // 文本对齐方式(默认: "left")
71
+ weight?: number; // 弹性权重(0 = 固定,>0 = 比例)
72
+ formatter?: (value: any) => string; // 自定义格式化函数
73
+ escapeHTML?: boolean; // 允许 HTML 内容(默认: false)
74
+ }
75
+
76
+ /**
77
+ * 表格样式和行为选项
78
+ */
79
+ interface TableOptions {
80
+ backgroundColor?: string; // 表格背景色
81
+ color?: string; // 表格文字颜色
82
+ headerHeight?: number; // 标题行高度(默认: 36px)
83
+ headerBackgroundColor?: string; // 标题背景色
84
+ headerColor?: string; // 标题文字颜色
85
+ alternativeBackgroundColor?: string; // 交替行背景色
86
+ alternativeColor?: string; // 交替行文字颜色
87
+ rowHeight?: number; // 数据行高度(默认: 32px)
88
+ }
89
+
90
+ /**
91
+ * 行点击处理函数
92
+ */
93
+ type RowClickHandler = (row: any) => (event: MouseEvent) => void;
94
+ ```
95
+
96
+ ## 使用示例
97
+
98
+ ### 自动滚动表格
99
+
100
+ ```svelte
101
+ <script lang="ts">
102
+ import ConciseDataTable from '@ticatec/uniface-element/ConciseDataTable';
103
+ import type { Column, TableOptions } from '@ticatec/uniface-element/ConciseDataTable';
104
+
105
+ // 监控用的实时数据示例
106
+ let serverStats = [
107
+ { server: 'Web-01', cpu: '45%', memory: '68%', disk: '32%', status: '在线' },
108
+ { server: 'Web-02', cpu: '62%', memory: '71%', disk: '28%', status: '在线' },
109
+ { server: 'DB-01', cpu: '78%', memory: '85%', disk: '65%', status: '警告' },
110
+ { server: 'Cache-01', cpu: '23%', memory: '34%', disk: '12%', status: '在线' },
111
+ { server: 'API-01', cpu: '56%', memory: '67%', disk: '45%', status: '在线' },
112
+ { server: 'API-02', cpu: '89%', memory: '92%', disk: '78%', status: '严重' },
113
+ { server: 'Load-01', cpu: '34%', memory: '45%', disk: '23%', status: '在线' },
114
+ { server: 'Monitor-01', cpu: '12%', memory: '28%', disk: '15%', status: '在线' }
115
+ ];
116
+
117
+ const columns: Column[] = [
118
+ {
119
+ title: '服务器',
120
+ field: 'server',
121
+ width: 120,
122
+ align: 'center'
123
+ },
124
+ {
125
+ title: 'CPU使用率',
126
+ field: 'cpu',
127
+ width: 100,
128
+ align: 'center'
129
+ },
130
+ {
131
+ title: '内存',
132
+ field: 'memory',
133
+ width: 100,
134
+ align: 'center'
135
+ },
136
+ {
137
+ title: '磁盘',
138
+ field: 'disk',
139
+ width: 100,
140
+ align: 'center'
141
+ },
142
+ {
143
+ title: '状态',
144
+ field: 'status',
145
+ width: 120,
146
+ align: 'center',
147
+ formatter: (status) => {
148
+ const colors = {
149
+ '在线': '#10b981',
150
+ '警告': '#f59e0b',
151
+ '严重': '#ef4444'
152
+ };
153
+ return `<span style="color: ${colors[status] || '#6b7280'}; font-weight: 500;">${status}</span>`;
154
+ },
155
+ escapeHTML: true
156
+ }
157
+ ];
158
+
159
+ const options: TableOptions = {
160
+ headerHeight: 40,
161
+ rowHeight: 36,
162
+ headerBackgroundColor: '#1f2937',
163
+ headerColor: '#f9fafb',
164
+ backgroundColor: '#ffffff',
165
+ alternativeBackgroundColor: '#f8fafc'
166
+ };
167
+
168
+ // 模拟数据更新
169
+ setInterval(() => {
170
+ serverStats = serverStats.map(server => ({
171
+ ...server,
172
+ cpu: Math.floor(Math.random() * 100) + '%',
173
+ memory: Math.floor(Math.random() * 100) + '%',
174
+ disk: Math.floor(Math.random() * 100) + '%'
175
+ }));
176
+ }, 3000);
177
+ </script>
178
+
179
+ <div class="monitoring-dashboard">
180
+ <h2>服务器监控仪表板</h2>
181
+
182
+ <ConciseDataTable
183
+ list={serverStats}
184
+ {columns}
185
+ {options}
186
+ autoScroll={true}
187
+ scrollInterval={4000}
188
+ />
189
+ </div>
190
+
191
+ <style>
192
+ .monitoring-dashboard {
193
+ padding: 20px;
194
+ max-width: 800px;
195
+ margin: 0 auto;
196
+ }
197
+
198
+ h2 {
199
+ color: #1f2937;
200
+ margin-bottom: 20px;
201
+ text-align: center;
202
+ }
203
+ </style>
204
+ ```
205
+
206
+ ### 带格式化器的金融数据表格
207
+
208
+ ```svelte
209
+ <script lang="ts">
210
+ import ConciseDataTable from '@ticatec/uniface-element/ConciseDataTable';
211
+ import type { Column, TableOptions, RowClickHandler } from '@ticatec/uniface-element/ConciseDataTable';
212
+
213
+ interface StockData {
214
+ symbol: string;
215
+ company: string;
216
+ price: number;
217
+ change: number;
218
+ changePercent: number;
219
+ volume: number;
220
+ marketCap: number;
221
+ }
222
+
223
+ let stockData: StockData[] = [
224
+ { symbol: 'AAPL', company: '苹果公司', price: 182.52, change: 2.34, changePercent: 1.30, volume: 45678912, marketCap: 2847000000000 },
225
+ { symbol: 'MSFT', company: '微软公司', price: 378.85, change: -1.23, changePercent: -0.32, volume: 23456789, marketCap: 2817000000000 },
226
+ { symbol: 'GOOGL', company: '谷歌公司', price: 142.56, change: 0.87, changePercent: 0.61, volume: 34567890, marketCap: 1798000000000 },
227
+ { symbol: 'AMZN', company: '亚马逊公司', price: 151.23, change: -2.45, changePercent: -1.59, volume: 56789012, marketCap: 1567000000000 }
228
+ ];
229
+
230
+ const columns: Column[] = [
231
+ {
232
+ title: '代码',
233
+ field: 'symbol',
234
+ width: 80,
235
+ align: 'center'
236
+ },
237
+ {
238
+ title: '公司',
239
+ field: 'company',
240
+ width: 200,
241
+ weight: 1 // 此列将扩展以填充可用空间
242
+ },
243
+ {
244
+ title: '价格',
245
+ field: 'price',
246
+ width: 100,
247
+ align: 'right',
248
+ formatter: (value) => `$${value.toFixed(2)}`
249
+ },
250
+ {
251
+ title: '涨跌',
252
+ field: 'change',
253
+ width: 100,
254
+ align: 'right',
255
+ formatter: (value) => {
256
+ const sign = value >= 0 ? '+' : '';
257
+ const color = value >= 0 ? '#10b981' : '#ef4444';
258
+ return `<span style="color: ${color}; font-weight: 500;">${sign}${value.toFixed(2)}</span>`;
259
+ },
260
+ escapeHTML: true
261
+ },
262
+ {
263
+ title: '涨跌幅%',
264
+ field: 'changePercent',
265
+ width: 100,
266
+ align: 'right',
267
+ formatter: (value) => {
268
+ const sign = value >= 0 ? '+' : '';
269
+ const color = value >= 0 ? '#10b981' : '#ef4444';
270
+ return `<span style="color: ${color}; font-weight: 500;">${sign}${value.toFixed(2)}%</span>`;
271
+ },
272
+ escapeHTML: true
273
+ },
274
+ {
275
+ title: '成交量',
276
+ field: 'volume',
277
+ width: 120,
278
+ align: 'right',
279
+ formatter: (value) => {
280
+ if (value >= 1000000) {
281
+ return `${(value / 1000000).toFixed(1)}M`;
282
+ } else if (value >= 1000) {
283
+ return `${(value / 1000).toFixed(1)}K`;
284
+ }
285
+ return value.toString();
286
+ }
287
+ },
288
+ {
289
+ title: '市值',
290
+ field: 'marketCap',
291
+ width: 120,
292
+ align: 'right',
293
+ formatter: (value) => {
294
+ if (value >= 1000000000000) {
295
+ return `$${(value / 1000000000000).toFixed(2)}T`;
296
+ } else if (value >= 1000000000) {
297
+ return `$${(value / 1000000000).toFixed(2)}B`;
298
+ }
299
+ return `$${(value / 1000000).toFixed(2)}M`;
300
+ }
301
+ }
302
+ ];
303
+
304
+ const options: TableOptions = {
305
+ headerHeight: 45,
306
+ rowHeight: 40,
307
+ headerBackgroundColor: '#0f172a',
308
+ headerColor: '#f1f5f9',
309
+ backgroundColor: '#ffffff',
310
+ alternativeBackgroundColor: '#f8fafc',
311
+ color: '#334155'
312
+ };
313
+
314
+ const handleRowClick: RowClickHandler = (stock) => (event) => {
315
+ console.log(`点击了 ${stock.symbol} - ${stock.company}`);
316
+ alert(`股票详情:\n${stock.company} (${stock.symbol})\n价格: $${stock.price.toFixed(2)}`);
317
+ };
318
+
319
+ // 模拟实时价格更新
320
+ setInterval(() => {
321
+ stockData = stockData.map(stock => ({
322
+ ...stock,
323
+ price: stock.price + (Math.random() - 0.5) * 5,
324
+ change: (Math.random() - 0.5) * 4,
325
+ changePercent: (Math.random() - 0.5) * 3,
326
+ volume: Math.floor(Math.random() * 100000000)
327
+ }));
328
+ }, 2000);
329
+ </script>
330
+
331
+ <div class="stock-tracker">
332
+ <h2>股票价格跟踪器</h2>
333
+
334
+ <ConciseDataTable
335
+ list={stockData}
336
+ {columns}
337
+ {options}
338
+ rowClickHandler={handleRowClick}
339
+ />
340
+
341
+ <div class="disclaimer">
342
+ <p><em>点击任意行查看股票详情。价格每2秒更新一次。</em></p>
343
+ </div>
344
+ </div>
345
+
346
+ <style>
347
+ .stock-tracker {
348
+ padding: 20px;
349
+ max-width: 1000px;
350
+ margin: 0 auto;
351
+ }
352
+
353
+ h2 {
354
+ color: #0f172a;
355
+ margin-bottom: 20px;
356
+ text-align: center;
357
+ font-size: 1.8rem;
358
+ }
359
+
360
+ .disclaimer {
361
+ margin-top: 16px;
362
+ text-align: center;
363
+ color: #64748b;
364
+ font-size: 0.875rem;
365
+ }
366
+ </style>
367
+ ```
368
+
369
+ ### 带交互功能的员工目录
370
+
371
+ ```svelte
372
+ <script lang="ts">
373
+ import ConciseDataTable from '@ticatec/uniface-element/ConciseDataTable';
374
+ import type { Column, TableOptions, RowClickHandler } from '@ticatec/uniface-element/ConciseDataTable';
375
+
376
+ interface Employee {
377
+ id: number;
378
+ name: string;
379
+ email: string;
380
+ department: string;
381
+ position: string;
382
+ salary: number;
383
+ joinDate: string;
384
+ status: '在职' | '请假' | '远程';
385
+ }
386
+
387
+ let employees: Employee[] = [
388
+ { id: 1, name: '张三', email: 'zhangsan@company.com', department: '工程部', position: '高级开发工程师', salary: 95000, joinDate: '2022-01-15', status: '在职' },
389
+ { id: 2, name: '李四', email: 'lisi@company.com', department: '市场部', position: '市场经理', salary: 78000, joinDate: '2021-11-20', status: '在职' },
390
+ { id: 3, name: '王五', email: 'wangwu@company.com', department: '销售部', position: '销售代表', salary: 65000, joinDate: '2023-03-10', status: '远程' },
391
+ { id: 4, name: '赵六', email: 'zhaoliu@company.com', department: '人事部', position: '人事专员', salary: 58000, joinDate: '2022-07-08', status: '请假' },
392
+ { id: 5, name: '钱七', email: 'qianqi@company.com', department: '工程部', position: '技术主管', salary: 110000, joinDate: '2020-05-12', status: '在职' }
393
+ ];
394
+
395
+ const columns: Column[] = [
396
+ {
397
+ title: 'ID',
398
+ field: 'id',
399
+ width: 60,
400
+ align: 'center'
401
+ },
402
+ {
403
+ title: '姓名',
404
+ field: 'name',
405
+ width: 140,
406
+ align: 'left'
407
+ },
408
+ {
409
+ title: '邮箱',
410
+ field: 'email',
411
+ width: 200,
412
+ weight: 1,
413
+ formatter: (email) => `<a href="mailto:${email}" style="color: #3b82f6; text-decoration: none;">${email}</a>`,
414
+ escapeHTML: true
415
+ },
416
+ {
417
+ title: '部门',
418
+ field: 'department',
419
+ width: 120,
420
+ align: 'center'
421
+ },
422
+ {
423
+ title: '职位',
424
+ field: 'position',
425
+ width: 150,
426
+ align: 'left'
427
+ },
428
+ {
429
+ title: '薪资',
430
+ field: 'salary',
431
+ width: 100,
432
+ align: 'right',
433
+ formatter: (value) => `¥${value.toLocaleString()}`
434
+ },
435
+ {
436
+ title: '入职日期',
437
+ field: 'joinDate',
438
+ width: 110,
439
+ align: 'center',
440
+ formatter: (date) => new Date(date).toLocaleDateString()
441
+ },
442
+ {
443
+ title: '状态',
444
+ field: 'status',
445
+ width: 100,
446
+ align: 'center',
447
+ formatter: (status) => {
448
+ const statusConfig = {
449
+ '在职': { color: '#10b981', bg: '#ecfdf5' },
450
+ '远程': { color: '#3b82f6', bg: '#eff6ff' },
451
+ '请假': { color: '#f59e0b', bg: '#fffbeb' }
452
+ };
453
+ const config = statusConfig[status] || { color: '#6b7280', bg: '#f9fafb' };
454
+ return `<span style="background: ${config.bg}; color: ${config.color}; padding: 4px 8px; border-radius: 12px; font-size: 0.75rem; font-weight: 500;">${status}</span>`;
455
+ },
456
+ escapeHTML: true
457
+ }
458
+ ];
459
+
460
+ const options: TableOptions = {
461
+ headerHeight: 48,
462
+ rowHeight: 44,
463
+ headerBackgroundColor: '#f8fafc',
464
+ headerColor: '#374151',
465
+ backgroundColor: '#ffffff',
466
+ alternativeBackgroundColor: '#f9fafb',
467
+ color: '#374151'
468
+ };
469
+
470
+ const handleEmployeeClick: RowClickHandler = (employee) => (event) => {
471
+ console.log('点击了员工:', employee);
472
+ showEmployeeDetails(employee);
473
+ };
474
+
475
+ let selectedEmployee: Employee | null = null;
476
+ let showModal = false;
477
+
478
+ function showEmployeeDetails(employee: Employee) {
479
+ selectedEmployee = employee;
480
+ showModal = true;
481
+ }
482
+
483
+ function closeModal() {
484
+ showModal = false;
485
+ selectedEmployee = null;
486
+ }
487
+ </script>
488
+
489
+ <div class="employee-directory">
490
+ <h2>员工目录</h2>
491
+ <p class="subtitle">点击任意员工行查看详细信息</p>
492
+
493
+ <ConciseDataTable
494
+ list={employees}
495
+ {columns}
496
+ {options}
497
+ rowClickHandler={handleEmployeeClick}
498
+ />
499
+ </div>
500
+
501
+ {#if showModal && selectedEmployee}
502
+ <div class="modal-overlay" on:click={closeModal}>
503
+ <div class="modal" on:click|stopPropagation>
504
+ <div class="modal-header">
505
+ <h3>员工详情</h3>
506
+ <button class="close-btn" on:click={closeModal}>&times;</button>
507
+ </div>
508
+ <div class="modal-content">
509
+ <div class="employee-info">
510
+ <div class="info-row">
511
+ <span class="label">姓名:</span>
512
+ <span class="value">{selectedEmployee.name}</span>
513
+ </div>
514
+ <div class="info-row">
515
+ <span class="label">员工编号:</span>
516
+ <span class="value">#{selectedEmployee.id.toString().padStart(4, '0')}</span>
517
+ </div>
518
+ <div class="info-row">
519
+ <span class="label">邮箱:</span>
520
+ <span class="value">{selectedEmployee.email}</span>
521
+ </div>
522
+ <div class="info-row">
523
+ <span class="label">部门:</span>
524
+ <span class="value">{selectedEmployee.department}</span>
525
+ </div>
526
+ <div class="info-row">
527
+ <span class="label">职位:</span>
528
+ <span class="value">{selectedEmployee.position}</span>
529
+ </div>
530
+ <div class="info-row">
531
+ <span class="label">年薪:</span>
532
+ <span class="value">¥{selectedEmployee.salary.toLocaleString()}</span>
533
+ </div>
534
+ <div class="info-row">
535
+ <span class="label">入职日期:</span>
536
+ <span class="value">{new Date(selectedEmployee.joinDate).toLocaleDateString()}</span>
537
+ </div>
538
+ <div class="info-row">
539
+ <span class="label">状态:</span>
540
+ <span class="value status-{selectedEmployee.status.toLowerCase().replace(' ', '-')}">{selectedEmployee.status}</span>
541
+ </div>
542
+ </div>
543
+ </div>
544
+ </div>
545
+ </div>
546
+ {/if}
547
+
548
+ <style>
549
+ .employee-directory {
550
+ padding: 20px;
551
+ max-width: 1200px;
552
+ margin: 0 auto;
553
+ }
554
+
555
+ h2 {
556
+ color: #111827;
557
+ margin-bottom: 8px;
558
+ text-align: center;
559
+ font-size: 2rem;
560
+ }
561
+
562
+ .subtitle {
563
+ color: #6b7280;
564
+ text-align: center;
565
+ margin-bottom: 24px;
566
+ font-style: italic;
567
+ }
568
+
569
+ .modal-overlay {
570
+ position: fixed;
571
+ top: 0;
572
+ left: 0;
573
+ right: 0;
574
+ bottom: 0;
575
+ background: rgba(0, 0, 0, 0.5);
576
+ display: flex;
577
+ align-items: center;
578
+ justify-content: center;
579
+ z-index: 1000;
580
+ }
581
+
582
+ .modal {
583
+ background: white;
584
+ border-radius: 12px;
585
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
586
+ max-width: 500px;
587
+ width: 90%;
588
+ max-height: 80vh;
589
+ overflow: hidden;
590
+ }
591
+
592
+ .modal-header {
593
+ display: flex;
594
+ justify-content: space-between;
595
+ align-items: center;
596
+ padding: 20px 24px;
597
+ background: #f8fafc;
598
+ border-bottom: 1px solid #e2e8f0;
599
+ }
600
+
601
+ .modal-header h3 {
602
+ margin: 0;
603
+ color: #1f2937;
604
+ font-size: 1.25rem;
605
+ }
606
+
607
+ .close-btn {
608
+ background: none;
609
+ border: none;
610
+ font-size: 24px;
611
+ cursor: pointer;
612
+ color: #6b7280;
613
+ padding: 0;
614
+ width: 30px;
615
+ height: 30px;
616
+ display: flex;
617
+ align-items: center;
618
+ justify-content: center;
619
+ border-radius: 50%;
620
+ transition: background-color 0.2s;
621
+ }
622
+
623
+ .close-btn:hover {
624
+ background: #e5e7eb;
625
+ color: #374151;
626
+ }
627
+
628
+ .modal-content {
629
+ padding: 24px;
630
+ }
631
+
632
+ .employee-info {
633
+ display: grid;
634
+ gap: 16px;
635
+ }
636
+
637
+ .info-row {
638
+ display: flex;
639
+ justify-content: space-between;
640
+ align-items: center;
641
+ padding: 12px 0;
642
+ border-bottom: 1px solid #f3f4f6;
643
+ }
644
+
645
+ .info-row:last-child {
646
+ border-bottom: none;
647
+ }
648
+
649
+ .label {
650
+ font-weight: 500;
651
+ color: #374151;
652
+ }
653
+
654
+ .value {
655
+ color: #111827;
656
+ }
657
+
658
+ .value.status-在职 {
659
+ color: #10b981;
660
+ font-weight: 500;
661
+ }
662
+
663
+ .value.status-远程 {
664
+ color: #3b82f6;
665
+ font-weight: 500;
666
+ }
667
+
668
+ .value.status-请假 {
669
+ color: #f59e0b;
670
+ font-weight: 500;
671
+ }
672
+ </style>
673
+ ```
674
+
675
+ ## 样式
676
+
677
+ ConciseDataTable 组件使用以下 CSS 类和自定义属性:
678
+
679
+ ```css
680
+ .uniface-concise-table {
681
+ /* 主要表格容器 */
682
+ }
683
+
684
+ .concise-table-header {
685
+ /* 标题行样式 */
686
+ }
687
+
688
+ .concise-table-row {
689
+ /* 数据行样式 */
690
+ }
691
+
692
+ .concise-table-cell {
693
+ /* 单个单元格样式 */
694
+ }
695
+
696
+ /* 主题化的 CSS 自定义属性 */
697
+ :root {
698
+ --uniface-concise-table-primary-color: #374151;
699
+ --uniface-concise-table-primary-background-color: #ffffff;
700
+ --uniface-concise-table-header-background: #f8fafc;
701
+ --uniface-concise-table-header-color: #374151;
702
+ --uniface-concise-table-row-alter-bg: #f9fafb;
703
+ --uniface-concise-table-row-alter-color: #374151;
704
+ }
705
+ ```
706
+
707
+ ## API 参考
708
+
709
+ ### ConciseDataTable 组件属性
710
+
711
+ ```typescript
712
+ interface ConciseDataTableProps {
713
+ list: Array<any>; // 要显示的数据数组
714
+ columns: Array<Column>; // 列定义
715
+ autoScroll?: boolean; // 启用自动滚动
716
+ scrollInterval?: number; // 滚动间隔(毫秒)
717
+ rowClickHandler?: RowClickHandler; // 行点击处理器
718
+ options?: TableOptions; // 样式选项
719
+ }
720
+ ```
721
+
722
+ ## 最佳实践
723
+
724
+ 1. **性能优化** - 对于大数据集,谨慎使用自动滚动以避免性能问题
725
+ 2. **列设计** - 使用 `weight` 属性平衡固定宽度和弹性列
726
+ 3. **数据格式化** - 使用格式化器实现一致的数据呈现(货币、日期、百分比)
727
+ 4. **可访问性** - 确保足够的颜色对比度和有意义的行点击行为
728
+ 5. **移动响应** - 对于包含多列的表格,考虑水平滚动
729
+ 6. **错误处理** - 在传递给组件之前验证数据结构
730
+ 7. **内存管理** - 对于自动滚动表格,监控大数据集的内存使用情况
731
+ 8. **用户反馈** - 为可点击行等交互元素提供清晰的视觉反馈