@ticatec/uniface-element 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/README.md +320 -1
  2. package/README_CN.md +392 -0
  3. package/dist/accordion/Accordion.svelte +1 -1
  4. package/dist/action-bar/ActionBar.svelte +7 -1
  5. package/dist/attachment-files/FileRender.svelte +1 -1
  6. package/dist/attachment-files/FileUploadBar.svelte +7 -6
  7. package/dist/attachment-files/FileUploadPanel.svelte +2 -2
  8. package/dist/base-calendar/DateContext.js +5 -4
  9. package/dist/base-calendar/YearPickupPanel.svelte +4 -4
  10. package/dist/card/Card.svelte +1 -1
  11. package/dist/card/Card.svelte.d.ts +1 -1
  12. package/dist/cascade-options-select/CascadeOptionSelect.svelte +2 -3
  13. package/dist/cascade-options-select/CascadeOptionSelect.svelte.d.ts +46 -1
  14. package/dist/cascade-options-select/CascadePanel.svelte +1 -1
  15. package/dist/checkbox/CheckBox.svelte +1 -1
  16. package/dist/color-picker/ColorPicker.svelte +9 -9
  17. package/dist/color-picker/ColorPicker.svelte.d.ts +0 -2
  18. package/dist/color-picker/ColorPickerPanel.svelte +11 -15
  19. package/dist/color-picker/ColorPickerPanel.svelte.d.ts +1 -1
  20. package/dist/common/CommonPicker.svelte +2 -2
  21. package/dist/common/CommonPicker.svelte.d.ts +1 -1
  22. package/dist/common/MouseClickHandler.d.ts +1 -1
  23. package/dist/common/Popover.svelte +28 -6
  24. package/dist/common/Popover.svelte.d.ts +9 -3
  25. package/dist/common/uniface-utils.js +6 -4
  26. package/dist/common-editor/CommonEditor.svelte +1 -1
  27. package/dist/common-editor/CommonEditor.svelte.d.ts +1 -1
  28. package/dist/common-editor/NumberInput.svelte +1 -1
  29. package/dist/common-editor/NumberInput.svelte.d.ts +1 -1
  30. package/dist/concise-data-table/ConciseListTable.svelte +7 -2
  31. package/dist/concise-data-table/ConciseListTable.svelte.d.ts +1 -0
  32. package/dist/concise-data-table/DataRow.svelte +1 -1
  33. package/dist/concise-data-table/TableOptions.d.ts +1 -1
  34. package/dist/data-table/DataTable.svelte +1 -1
  35. package/dist/data-table/parts/ActionsPanel.svelte +4 -3
  36. package/dist/data-table/parts/ActionsRow.svelte +3 -3
  37. package/dist/data-table/parts/ContentPanel.svelte +3 -2
  38. package/dist/data-table/parts/FixedColumnsPanel.svelte +0 -1
  39. package/dist/data-table/parts/FixedColumnsPanel.svelte.d.ts +1 -2
  40. package/dist/data-table/parts/FixedHeaderPanel.svelte +2 -2
  41. package/dist/data-table/parts/FixedRow.svelte +2 -1
  42. package/dist/data-table/parts/FixedRow.svelte.d.ts +1 -1
  43. package/dist/data-table/parts/HrefCell.svelte +23 -2
  44. package/dist/data-table/parts/PopupMenu.svelte +25 -2
  45. package/dist/data-table/parts/PopupMenu.svelte.d.ts +8 -1
  46. package/dist/date-picker/DatePicker.svelte +0 -1
  47. package/dist/date-picker/DateTimePicker.svelte +3 -3
  48. package/dist/date-picker/ScrollBar.svelte +4 -7
  49. package/dist/date-range/DateRangeEditor.svelte +1 -1
  50. package/dist/dialog/CommonDialog.svelte +8 -5
  51. package/dist/dialog/CommonDialog.svelte.d.ts +2 -1
  52. package/dist/dialog/Dialog.svelte +37 -12
  53. package/dist/dialog/Dialog.svelte.d.ts +4 -3
  54. package/dist/dialog/DialogBoard.svelte +11 -8
  55. package/dist/dialog/DialogWrapper.svelte +10 -0
  56. package/dist/{common-editor/DateInput.svelte.d.ts → dialog/DialogWrapper.svelte.d.ts} +6 -13
  57. package/dist/dialog/Dialogs.js +1 -1
  58. package/dist/dialog/ModalResult.d.ts +5 -0
  59. package/dist/dialog/ModalResult.js +5 -0
  60. package/dist/drawer/Drawer.svelte +1 -1
  61. package/dist/form-field/FormField.svelte +2 -1
  62. package/dist/form-field/FormField.svelte.d.ts +1 -0
  63. package/dist/form-panel/flex-row-form/FormContainer.svelte +1 -1
  64. package/dist/form-panel/grid-form/EmptyCell.svelte +8 -7
  65. package/dist/form-panel/grid-form/EmptyCell.svelte.d.ts +2 -2
  66. package/dist/form-panel/grid-form/GridField.svelte +1 -1
  67. package/dist/i18nRes/i18nRes.d.ts +2 -0
  68. package/dist/i18nRes/i18nRes.js +44 -0
  69. package/dist/i18nRes/index.d.ts +2 -0
  70. package/dist/i18nRes/index.js +2 -0
  71. package/dist/image-files/ImageFilesField.svelte +1 -1
  72. package/dist/indicator/IndicatorBoard.svelte +1 -1
  73. package/dist/inline-cell-editor/InvalidEditor.svelte +1 -0
  74. package/dist/input-options-select/InputOptionsSelect.svelte +6 -6
  75. package/dist/input-options-select/InputOptionsSelect.svelte.d.ts +1 -1
  76. package/dist/layout/flex/FlexBlock.svelte +1 -1
  77. package/dist/lookup-editor/LookupEditor.svelte +1 -1
  78. package/dist/memo-editor/MemoEditor.svelte +2 -2
  79. package/dist/message-box/IMessageBox.d.ts +2 -4
  80. package/dist/message-box/IMessageBox.js +4 -6
  81. package/dist/message-box/MessageBoxBoard.svelte +1 -3
  82. package/dist/options-multi-select/OptionsMultiSelect.svelte +1 -1
  83. package/dist/prompts-text-editor/PromptsTextEditor.svelte +2 -2
  84. package/dist/prompts-text-editor/PromptsTextEditor.svelte.d.ts +1 -1
  85. package/dist/property-editor/PropertyEditor.svelte +3 -3
  86. package/dist/text-editor/PasswordEditor.svelte +1 -1
  87. package/dist/transfer/Transfer.svelte +17 -12
  88. package/dist/transfer/Transfer.svelte.d.ts +0 -1
  89. package/dist/unit-number-editor/UnitNumberEditor.svelte +2 -2
  90. package/docs/buttons/cn/ActionBar.md +459 -0
  91. package/docs/buttons/cn/Button.md +228 -0
  92. package/docs/buttons/cn/IconButton.md +294 -0
  93. package/docs/buttons/cn/README.md +600 -0
  94. package/docs/buttons/cn/TextButton.md +163 -0
  95. package/docs/buttons/en/ActionBar.md +459 -0
  96. package/docs/buttons/en/Button.md +228 -0
  97. package/docs/buttons/en/IconButton.md +294 -0
  98. package/docs/buttons/en/README.md +600 -0
  99. package/docs/buttons/en/TextButton.md +163 -0
  100. package/docs/containers/cn/accordion.md +622 -0
  101. package/docs/containers/cn/box.md +445 -0
  102. package/docs/containers/cn/card.md +404 -0
  103. package/docs/containers/cn/page.md +576 -0
  104. package/docs/containers/cn/tabs.md +686 -0
  105. package/docs/containers/en/accordion.md +622 -0
  106. package/docs/containers/en/box.md +445 -0
  107. package/docs/containers/en/card.md +404 -0
  108. package/docs/containers/en/page.md +576 -0
  109. package/docs/containers/en/tabs.md +686 -0
  110. package/docs/data-display/cn/concise-data-table.md +731 -0
  111. package/docs/data-display/cn/listbox.md +786 -0
  112. package/docs/data-display/cn/treeview.md +863 -0
  113. package/docs/data-display/en/concise-data-table.md +732 -0
  114. package/docs/data-display/en/listbox.md +786 -0
  115. package/docs/data-display/en/treeview.md +863 -0
  116. package/docs/data-table/cn/README.md +596 -0
  117. package/docs/data-table/en/README.md +596 -0
  118. package/docs/dialog/cn/README.md +767 -0
  119. package/docs/dialog/en/README.md +767 -0
  120. package/docs/form/cn/README.md +847 -0
  121. package/docs/form/en/README.md +847 -0
  122. package/docs/form-components/cn/README.md +495 -0
  123. package/docs/form-components/cn/attachmentfilesfield.md +757 -0
  124. package/docs/form-components/cn/cascade-options-select.md +374 -0
  125. package/docs/form-components/cn/checkbox.md +58 -0
  126. package/docs/form-components/cn/date-picker.md +138 -0
  127. package/docs/form-components/cn/datetime-picker.md +228 -0
  128. package/docs/form-components/cn/group-checkbox.md +405 -0
  129. package/docs/form-components/cn/group-radiobox.md +525 -0
  130. package/docs/form-components/cn/imagefilesfield.md +651 -0
  131. package/docs/form-components/cn/input-options-select.md +250 -0
  132. package/docs/form-components/cn/lookup-editor.md +406 -0
  133. package/docs/form-components/cn/memoeditor.md +409 -0
  134. package/docs/form-components/cn/number-editor.md +261 -0
  135. package/docs/form-components/cn/options-multi-select.md +177 -0
  136. package/docs/form-components/cn/options-select.md +83 -0
  137. package/docs/form-components/cn/passwordeditor.md +538 -0
  138. package/docs/form-components/cn/prompts-text-editor.md +241 -0
  139. package/docs/form-components/cn/radiobutton.md +84 -0
  140. package/docs/form-components/cn/switch.md +178 -0
  141. package/docs/form-components/cn/text-editor.md +142 -0
  142. package/docs/form-components/cn/time-editor.md +159 -0
  143. package/docs/form-components/cn/unit-number-editor.md +164 -0
  144. package/docs/form-components/en/README.md +463 -0
  145. package/docs/form-components/en/attachmentfilesfield.md +757 -0
  146. package/docs/form-components/en/cascade-options-select.md +358 -0
  147. package/docs/form-components/en/checkbox.md +59 -0
  148. package/docs/form-components/en/date-picker.md +138 -0
  149. package/docs/form-components/en/datetime-picker.md +228 -0
  150. package/docs/form-components/en/group-checkbox.md +395 -0
  151. package/docs/form-components/en/group-radiobox.md +498 -0
  152. package/docs/form-components/en/imagefilesfield.md +651 -0
  153. package/docs/form-components/en/input-options-select.md +239 -0
  154. package/docs/form-components/en/lookup-editor.md +389 -0
  155. package/docs/form-components/en/memoeditor.md +409 -0
  156. package/docs/form-components/en/number-editor.md +249 -0
  157. package/docs/form-components/en/options-multi-select.md +177 -0
  158. package/docs/form-components/en/options-select.md +83 -0
  159. package/docs/form-components/en/passwordeditor.md +538 -0
  160. package/docs/form-components/en/prompts-text-editor.md +241 -0
  161. package/docs/form-components/en/radiobutton.md +84 -0
  162. package/docs/form-components/en/switch.md +180 -0
  163. package/docs/form-components/en/text-editor.md +142 -0
  164. package/docs/form-components/en/time-editor.md +159 -0
  165. package/docs/form-components/en/unit-number-editor.md +164 -0
  166. package/docs/form-layout/cn/criteria-field.md +652 -0
  167. package/docs/form-layout/cn/flex-form.md +454 -0
  168. package/docs/form-layout/cn/flex-row-form.md +542 -0
  169. package/docs/form-layout/cn/form-field.md +923 -0
  170. package/docs/form-layout/cn/grid-form.md +676 -0
  171. package/docs/form-layout/en/criteria-field.md +652 -0
  172. package/docs/form-layout/en/flex-form.md +454 -0
  173. package/docs/form-layout/en/flex-row-form.md +542 -0
  174. package/docs/form-layout/en/form-field.md +923 -0
  175. package/docs/form-layout/en/grid-form.md +676 -0
  176. package/docs/global/cn/README.md +534 -0
  177. package/docs/global/en/README.md +534 -0
  178. package/docs/layout/cn/classiclayout.md +460 -0
  179. package/docs/layout/cn/headerlayout.md +524 -0
  180. package/docs/layout/cn/sidebarlayout.md +263 -0
  181. package/docs/layout/en/classiclayout.md +951 -0
  182. package/docs/layout/en/headerlayout.md +524 -0
  183. package/docs/layout/en/sidebarlayout.md +262 -0
  184. package/docs/misc/cn/README.md +1217 -0
  185. package/docs/misc/en/README.md +1217 -0
  186. package/docs/navigation/cn/breadcrumb.md +291 -0
  187. package/docs/navigation/cn/navigator.md +322 -0
  188. package/docs/navigation/cn/navigatormenu.md +512 -0
  189. package/docs/navigation/cn/progressbar.md +199 -0
  190. package/docs/navigation/cn/progressstepbar.md +299 -0
  191. package/docs/navigation/en/breadcrumb.md +291 -0
  192. package/docs/navigation/en/navigator.md +322 -0
  193. package/docs/navigation/en/navigatormenu.md +512 -0
  194. package/docs/navigation/en/progressbar.md +199 -0
  195. package/docs/navigation/en/progressstepbar.md +299 -0
  196. package/docs/search-filters/cn/daterange.md +1156 -0
  197. package/docs/search-filters/cn/numberrange.md +688 -0
  198. package/docs/search-filters/cn/searchbox.md +1582 -0
  199. package/docs/search-filters/en/daterange.md +1156 -0
  200. package/docs/search-filters/en/numberrange.md +688 -0
  201. package/docs/search-filters/en/searchbox.md +1582 -0
  202. package/package.json +53 -13
  203. package/dist/common-editor/DateInput.svelte +0 -27
  204. package/dist/i18n_resources/index.d.ts +0 -3
  205. package/dist/i18n_resources/index.js +0 -3
  206. /package/dist/{i18n_resources → i18nRes}/uniface_cn_resource.d.ts +0 -0
  207. /package/dist/{i18n_resources → i18nRes}/uniface_cn_resource.js +0 -0
  208. /package/dist/{i18n_resources → i18nRes}/uniface_en_resource.d.ts +0 -0
  209. /package/dist/{i18n_resources → i18nRes}/uniface_en_resource.js +0 -0
@@ -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. **用户反馈** - 为可点击行等交互元素提供清晰的视觉反馈