@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
+ A powerful and flexible data table component featuring sorting, row selection, inline expansion, custom cell formatting, action columns, frozen columns, and row actions. Perfect for displaying large datasets with complex data structures and user interactions.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @ticatec/uniface-element
9
+ ```
10
+
11
+ ## Import
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
+ ## Basic Usage
19
+
20
+ ```svelte
21
+ <script>
22
+ import DataTable from "@ticatec/uniface-element/DataTable";
23
+
24
+ const columns = [
25
+ { text: "Name", field: "name", width: 150 },
26
+ { text: "Age", field: "age", width: 80, align: "center" },
27
+ { text: "Email", field: "email", width: 200 }
28
+ ];
29
+
30
+ const list = [
31
+ { name: "John Doe", age: 30, email: "john@example.com" },
32
+ { name: "Jane Smith", age: 25, email: "jane@example.com" }
33
+ ];
34
+ </script>
35
+
36
+ <DataTable {columns} {list} />
37
+ ```
38
+
39
+ ## Props
40
+
41
+ | Prop | Type | Default | Description |
42
+ |------|------|---------|-------------|
43
+ | `columns` | `Array<DataColumn>` | required | Column configuration array |
44
+ | `list` | `Array<any>` | required | Data array to display |
45
+ | `actionsColumn` | `ActionsColumn \| null` | `null` | Configuration for actions column |
46
+ | `indicatorColumn` | `IndicatorColumn \| null` | `null` | Configuration for indicator/selection column |
47
+ | `selectedRows` | `Array<any>` | `[]` | Array of selected row data |
48
+ | `rowHeight` | `number` | `42` | Height of regular rows in pixels |
49
+ | `inlineRowHeight` | `number` | `80` | Height of expanded inline rows |
50
+ | `rowBorder` | `boolean` | `false` | Whether to show horizontal row borders |
51
+ | `colBorder` | `boolean` | `false` | Whether to show vertical column borders |
52
+ | `emptyIndicator` | `string \| undefined` | `undefined` | Text to show when no data is available |
53
+ | `style` | `string` | `""` | Additional CSS styles |
54
+
55
+ ## Types
56
+
57
+ ### DataColumn
58
+
59
+ ```typescript
60
+ interface DataColumn {
61
+ text: string; // Column header text
62
+ field?: string; // Data field name
63
+ width: number; // Column width in pixels
64
+ frozen?: boolean; // Whether column is frozen/fixed
65
+ align?: 'left' | 'center' | 'right'; // Text alignment
66
+ minWidth?: number; // Minimum column width
67
+ warp?: boolean; // Whether text can wrap
68
+ formatter?: FormatCell; // Cell formatting function
69
+ escapeHTML?: boolean; // Whether to escape HTML in content
70
+ href?: HrefBuilder; // Link builder function
71
+ hint?: CellHint; // Tooltip/hint function
72
+ render?: any; // Custom Svelte component renderer
73
+ visible?: boolean; // Column visibility
74
+ resizable?: boolean; // Whether column is resizable
75
+ compareFunction?: CompareFunction; // Sorting comparison function
76
+ }
77
+ ```
78
+
79
+ ### ActionsColumn
80
+
81
+ ```typescript
82
+ interface ActionsColumn {
83
+ width: number; // Column width in pixels
84
+ getActions: GetRowActions; // Function returning actions for each row
85
+ align?: 'left' | 'center'; // Actions alignment
86
+ }
87
+ ```
88
+
89
+ ### IndicatorColumn
90
+
91
+ ```typescript
92
+ interface IndicatorColumn {
93
+ width: number; // Column width in pixels
94
+ selectable?: boolean; // Whether rows are selectable
95
+ displayNo?: boolean; // Whether to show row numbers
96
+ buildInlineComponent?: (data: any) => Promise<any>; // Inline component builder
97
+ }
98
+ ```
99
+
100
+ ### RowAction
101
+
102
+ ```typescript
103
+ interface RowAction {
104
+ label: string; // Action button text
105
+ icon?: string; // Optional icon name
106
+ type?: "primary" | "secondary"; // Button type/style
107
+ callback: ActionFunction; // Click handler function
108
+ }
109
+ ```
110
+
111
+ ## Examples
112
+
113
+ ### Basic Data Table
114
+
115
+ ```svelte
116
+ <script>
117
+ import DataTable from "@ticatec/uniface-element/DataTable";
118
+
119
+ const columns = [
120
+ {
121
+ text: "Product Name",
122
+ field: "name",
123
+ width: 200,
124
+ resizable: true
125
+ },
126
+ {
127
+ text: "Price",
128
+ field: "price",
129
+ width: 100,
130
+ align: "right",
131
+ formatter: (value) => `$${value?.toFixed(2) ?? '0.00'}`
132
+ },
133
+ {
134
+ text: "Category",
135
+ field: "category",
136
+ width: 150,
137
+ align: "center"
138
+ },
139
+ {
140
+ text: "Stock",
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: "Laptop", price: 999.99, category: "Electronics", stock: 15 },
150
+ { name: "Phone", price: 599.99, category: "Electronics", stock: 25 },
151
+ { name: "Book", price: 19.99, category: "Education", stock: 100 },
152
+ { name: "Headphones", price: 149.99, category: "Electronics", 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
+ ### Table with Row Selection and Actions
171
+
172
+ ```svelte
173
+ <script>
174
+ import DataTable from "@ticatec/uniface-element/DataTable";
175
+
176
+ const columns = [
177
+ { text: "Name", field: "name", width: 150 },
178
+ { text: "Email", field: "email", width: 200 },
179
+ { text: "Role", field: "role", width: 120 },
180
+ { text: "Status", 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: 'Edit',
201
+ icon: 'icon_google_create',
202
+ callback: () => handleEdit(user)
203
+ },
204
+ {
205
+ label: 'Delete',
206
+ icon: 'icon_google_delete',
207
+ type: 'secondary',
208
+ callback: () => handleDelete(user)
209
+ }
210
+ ]
211
+ };
212
+
213
+ const users = [
214
+ { name: "Alice Johnson", email: "alice@company.com", role: "Admin", status: "active" },
215
+ { name: "Bob Smith", email: "bob@company.com", role: "User", status: "active" },
216
+ { name: "Carol Brown", email: "carol@company.com", role: "Manager", status: "pending" }
217
+ ];
218
+
219
+ let selectedRows = [];
220
+
221
+ function handleEdit(user) {
222
+ console.log('Editing user:', user);
223
+ }
224
+
225
+ function handleDelete(user) {
226
+ console.log('Deleting user:', user);
227
+ }
228
+
229
+ $: console.log('Selected users:', 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
+ ### Table with Custom Cell Rendering and Sorting
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: "User",
253
+ field: "user",
254
+ width: 200,
255
+ render: UserAvatar
256
+ },
257
+ {
258
+ text: "Score",
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: "Last Login",
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() : 'Never';
276
+ }
277
+ },
278
+ {
279
+ text: "Actions",
280
+ field: "website",
281
+ width: 120,
282
+ href: (item) => [{
283
+ text: "Visit Profile",
284
+ action: () => window.open(`/profile/${item.id}`, '_blank')
285
+ }, {
286
+ text: "Send Message",
287
+ action: () => handleSendMessage(item)
288
+ }]
289
+ }
290
+ ];
291
+
292
+ const userData = [
293
+ {
294
+ id: 1,
295
+ user: { name: "John Doe", avatar: "/avatars/john.jpg" },
296
+ score: 85,
297
+ lastLogin: "2024-01-15",
298
+ website: "john-portfolio.com"
299
+ },
300
+ {
301
+ id: 2,
302
+ user: { name: "Jane Smith", avatar: "/avatars/jane.jpg" },
303
+ score: 92,
304
+ lastLogin: "2024-01-10",
305
+ website: "jane-designs.com"
306
+ }
307
+ ];
308
+
309
+ function handleSendMessage(user) {
310
+ console.log('Sending message to:', user.user.name);
311
+ }
312
+ </script>
313
+
314
+ <DataTable {columns} list={userData} rowHeight={50} />
315
+ ```
316
+
317
+ ### Table with Inline Row Expansion
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: "Order ID", field: "orderId", width: 120 },
326
+ { text: "Customer", field: "customer", width: 150 },
327
+ { text: "Total", field: "total", width: 100, align: "right",
328
+ formatter: (value) => `$${value?.toFixed(2) ?? '0.00'}`
329
+ },
330
+ { text: "Status", field: "status", width: 120, align: "center" },
331
+ { text: "Date", field: "orderDate", width: 120 }
332
+ ];
333
+
334
+ const indicatorColumn = {
335
+ width: 50,
336
+ selectable: false,
337
+ displayNo: false,
338
+ buildInlineComponent: async (orderData) => {
339
+ // Simulate API call to fetch order details
340
+ await new Promise(resolve => setTimeout(resolve, 1000));
341
+ return OrderDetails;
342
+ }
343
+ };
344
+
345
+ const orders = [
346
+ {
347
+ orderId: "ORD-001",
348
+ customer: "John Doe",
349
+ total: 299.99,
350
+ status: "Shipped",
351
+ orderDate: "2024-01-15",
352
+ items: [
353
+ { product: "Laptop", quantity: 1, price: 299.99 }
354
+ ]
355
+ },
356
+ {
357
+ orderId: "ORD-002",
358
+ customer: "Jane Smith",
359
+ total: 149.98,
360
+ status: "Processing",
361
+ orderDate: "2024-01-14",
362
+ items: [
363
+ { product: "Mouse", quantity: 2, price: 24.99 },
364
+ { product: "Keyboard", quantity: 1, price: 99.99 }
365
+ ]
366
+ }
367
+ ];
368
+ </script>
369
+
370
+ <DataTable
371
+ {columns}
372
+ list={orders}
373
+ {indicatorColumn}
374
+ inlineRowHeight={200}
375
+ emptyIndicator="No orders found"
376
+ />
377
+ ```
378
+
379
+ ### Table with Frozen Columns
380
+
381
+ ```svelte
382
+ <script>
383
+ import DataTable from "@ticatec/uniface-element/DataTable";
384
+
385
+ const columns = [
386
+ {
387
+ text: "Name",
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: "Department", field: "department", width: 150 },
401
+ { text: "Position", field: "position", width: 180 },
402
+ { text: "Salary", field: "salary", width: 120, align: "right",
403
+ formatter: (value) => `$${value?.toLocaleString() ?? '0'}`
404
+ },
405
+ { text: "Start Date", field: "startDate", width: 120 },
406
+ { text: "Manager", field: "manager", width: 150 },
407
+ { text: "Location", field: "location", width: 200 },
408
+ { text: "Phone", field: "phone", width: 140 },
409
+ { text: "Email", field: "email", width: 200 }
410
+ ];
411
+
412
+ const employees = [
413
+ {
414
+ name: "John Doe",
415
+ employeeId: "EMP001",
416
+ department: "Engineering",
417
+ position: "Senior Developer",
418
+ salary: 95000,
419
+ startDate: "2022-03-15",
420
+ manager: "Alice Johnson",
421
+ location: "New York",
422
+ phone: "555-0123",
423
+ email: "john.doe@company.com"
424
+ },
425
+ // ... more employee records
426
+ ];
427
+ </script>
428
+
429
+ <div style="width: 800px; height: 400px;">
430
+ <DataTable {columns} list={employees} />
431
+ </div>
432
+ ```
433
+
434
+ ### Advanced Table with All Features
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: "Image",
445
+ field: "image",
446
+ width: 80,
447
+ frozen: true,
448
+ render: ProductImage,
449
+ align: "center"
450
+ },
451
+ {
452
+ text: "Product",
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: "Price",
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: "Stock",
470
+ field: "stock",
471
+ width: 80,
472
+ align: "center",
473
+ formatter: (value) => {
474
+ if (value === 0) return '<span style="color: red">Out of Stock</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: "Category",
483
+ field: "category",
484
+ width: 120,
485
+ compareFunction: (a, b) => (a?.category ?? '').localeCompare(b?.category ?? '')
486
+ },
487
+ {
488
+ text: "Supplier",
489
+ field: "supplier",
490
+ width: 150,
491
+ href: (item) => [{
492
+ text: "Contact Supplier",
493
+ action: () => openSupplierContact(item.supplierId)
494
+ }]
495
+ },
496
+ {
497
+ text: "Last Updated",
498
+ field: "updatedAt",
499
+ width: 140,
500
+ formatter: (value) => new Date(value).toLocaleDateString(),
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
+ // Simulate loading product details
515
+ return ProductDetails;
516
+ }
517
+ };
518
+
519
+ const actionsColumn = {
520
+ width: 140,
521
+ align: 'center',
522
+ getActions: (product) => {
523
+ const actions = [
524
+ {
525
+ label: 'Edit',
526
+ icon: 'icon_google_create',
527
+ callback: () => editProduct(product)
528
+ },
529
+ {
530
+ label: 'Clone',
531
+ icon: 'icon_google_content_copy',
532
+ callback: () => cloneProduct(product)
533
+ }
534
+ ];
535
+
536
+ if (product.stock === 0) {
537
+ actions.push({
538
+ label: 'Restock',
539
+ icon: 'icon_google_add_shopping_cart',
540
+ type: 'primary',
541
+ callback: () => restockProduct(product)
542
+ });
543
+ }
544
+
545
+ actions.push({
546
+ label: 'Delete',
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: "Wireless Headphones",
560
+ sku: "WH-001",
561
+ price: 199.99,
562
+ stock: 25,
563
+ category: "Electronics",
564
+ supplier: "TechCorp Inc.",
565
+ supplierId: "SUP001",
566
+ image: "/images/headphones.jpg",
567
+ updatedAt: "2024-01-15T10:30:00Z"
568
+ },
569
+ // ... more products
570
+ ];
571
+
572
+ let selectedRows = [];
573
+
574
+ function editProduct(product) {
575
+ console.log('Editing product:', product);
576
+ }
577
+
578
+ function cloneProduct(product) {
579
+ console.log('Cloning product:', product);
580
+ }
581
+
582
+ function restockProduct(product) {
583
+ console.log('Restocking product:', product);
584
+ }
585
+
586
+ function deleteProduct(product) {
587
+ console.log('Deleting product:', product);
588
+ }
589
+
590
+ function openSupplierContact(supplierId) {
591
+ console.log('Opening supplier contact:', supplierId);
592
+ }
593
+
594
+ $: console.log('Selected products:', selectedRows);
595
+ </script>
596
+
597
+ <div class="advanced-table">
598
+ <h2>Product Inventory Management</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="No products found. Add some products to get started."
611
+ />
612
+ </div>
613
+
614
+ {#if selectedRows.length > 0}
615
+ <div class="selection-info">
616
+ <p>{selectedRows.length} product(s) selected</p>
617
+ <button on:click={() => console.log('Bulk edit:', selectedRows)}>
618
+ Bulk Edit
619
+ </button>
620
+ <button on:click={() => console.log('Bulk delete:', selectedRows)}>
621
+ Bulk Delete
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
+ ## Styling
667
+
668
+ The DataTable component supports extensive styling customization through CSS custom properties and classes:
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
+ /* Custom row styling */
680
+ .uniface-data-table.row-border .table-row {
681
+ border-bottom: 1px solid var(--table-border-color);
682
+ }
683
+
684
+ /* Custom column styling */
685
+ .uniface-data-table.cell-border .table-cell {
686
+ border-right: 1px solid var(--table-border-color);
687
+ }
688
+ ```
689
+
690
+ ## Accessibility
691
+
692
+ The DataTable component includes several accessibility features:
693
+
694
+ - Keyboard navigation support
695
+ - ARIA labels for screen readers
696
+ - Focus management for interactive elements
697
+ - Semantic table structure
698
+ - Row selection announcements
699
+
700
+ ## Best Practices
701
+
702
+ 1. **Performance**: For large datasets (1000+ rows), consider implementing virtual scrolling or pagination
703
+ 2. **Column Width**: Set appropriate widths based on content to prevent layout shifts
704
+ 3. **Frozen Columns**: Use frozen columns sparingly - typically for key identifiers only
705
+ 4. **Actions**: Limit row actions to 3-5 most important operations
706
+ 5. **Loading States**: Always provide loading indicators for async operations
707
+ 6. **Error Handling**: Implement proper error handling for failed inline component loading
708
+ 7. **Responsive Design**: Consider hiding less important columns on smaller screens
709
+
710
+ ## License
711
+
712
+ MIT