@medyll/idae-slotui-svelte 0.120.0 → 0.122.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 (208) hide show
  1. package/README.md +47 -47
  2. package/dist/base/alert/Alert.demo.svelte +62 -62
  3. package/dist/base/alert/Alert.svelte +121 -121
  4. package/dist/base/alert/alert.scss +93 -93
  5. package/dist/base/avatar/Avatar.demo.svelte +41 -41
  6. package/dist/base/avatar/Avatar.preview.svelte +6 -6
  7. package/dist/base/avatar/Avatar.svelte +65 -65
  8. package/dist/base/avatar/avatar.scss +17 -17
  9. package/dist/base/backdrop/Backdrop.demo.svelte +49 -49
  10. package/dist/base/backdrop/Backdrop.svelte +78 -78
  11. package/dist/base/backdrop/backdrop.scss +34 -34
  12. package/dist/base/badge/Badge.svelte +31 -31
  13. package/dist/base/badge/badge.scss +19 -19
  14. package/dist/base/box/Box.demo.svelte +54 -54
  15. package/dist/base/box/Box.svelte +72 -72
  16. package/dist/base/box/box.scss +33 -33
  17. package/dist/base/breadCrumb/BreadCrumb.svelte +23 -23
  18. package/dist/base/breadCrumb/breadcrumb.scss +11 -11
  19. package/dist/base/cartouche/Cartouche.demo.svelte +108 -108
  20. package/dist/base/cartouche/Cartouche.svelte +114 -114
  21. package/dist/base/cartouche/cartouche.scss +114 -114
  22. package/dist/base/chipper/Chipper.demo.svelte +45 -45
  23. package/dist/base/chipper/Chipper.svelte +36 -36
  24. package/dist/base/chipper/chipper.scss +65 -65
  25. package/dist/base/columner/Column.svelte +62 -62
  26. package/dist/base/columner/Columner.demo.svelte +15 -15
  27. package/dist/base/columner/Columner.svelte +21 -21
  28. package/dist/base/contentSwitcher/ContentSwitcher.demo.svelte +45 -45
  29. package/dist/base/contentSwitcher/ContentSwitcher.svelte +63 -63
  30. package/dist/base/contentSwitcher/content-switcher.scss +22 -22
  31. package/dist/base/debug/Debug.svelte +21 -21
  32. package/dist/base/demoer/DemoPage.svelte +40 -40
  33. package/dist/base/demoer/Demoer.svelte +170 -170
  34. package/dist/base/demoer/DemoerCode.svelte +45 -45
  35. package/dist/base/demoer/DemoerComponent.svelte +50 -50
  36. package/dist/base/divider/Divider.demo.svelte +34 -34
  37. package/dist/base/divider/Divider.svelte +68 -68
  38. package/dist/base/divider/divider.scss +19 -19
  39. package/dist/base/icon/Icon.demo.svelte +24 -24
  40. package/dist/base/icon/Icon.svelte +117 -117
  41. package/dist/base/icon/Icon.svelte.d.ts +1 -1
  42. package/dist/base/icon/icon.scss +17 -17
  43. package/dist/base/paper/Paper.demo.svelte +31 -31
  44. package/dist/base/paper/Paper.svelte +20 -20
  45. package/dist/base/paper/paper.scss +15 -15
  46. package/dist/base/titleBar/TitleBar.demo.svelte +30 -30
  47. package/dist/base/titleBar/TitleBar.svelte +40 -40
  48. package/dist/base/titleBar/title-bar.scss +29 -29
  49. package/dist/controls/autocomplete/AutoComplete.demo.svelte +88 -88
  50. package/dist/controls/autocomplete/AutoComplete.svelte +152 -152
  51. package/dist/controls/autocomplete/auto-complete.scss +15 -15
  52. package/dist/controls/button/Button.demo.svelte +165 -165
  53. package/dist/controls/button/Button.svelte +95 -95
  54. package/dist/controls/button/Button.svelte.d.ts +1 -1
  55. package/dist/controls/button/ButtonAction.svelte +55 -55
  56. package/dist/controls/button/ButtonMenu.svelte +55 -55
  57. package/dist/controls/button/IconButton.svelte +45 -45
  58. package/dist/controls/button/button-action.scss +8 -8
  59. package/dist/controls/button/button-menu.scss +36 -36
  60. package/dist/controls/button/button.scss +293 -293
  61. package/dist/controls/checkbox/Checkbox.demo.svelte +29 -29
  62. package/dist/controls/checkbox/Checkbox.svelte +59 -59
  63. package/dist/controls/checkbox/checkbox.scss +115 -115
  64. package/dist/controls/confirm/Confirm.demo.svelte +60 -60
  65. package/dist/controls/confirm/Confirm.preview.svelte +14 -14
  66. package/dist/controls/confirm/Confirm.svelte +156 -156
  67. package/dist/controls/confirm/confirm.scss +12 -12
  68. package/dist/controls/inplaceedit/InPlaceEdit.demo.svelte +41 -41
  69. package/dist/controls/inplaceedit/InPlaceEdit.svelte +109 -109
  70. package/dist/controls/progress/Progress.demo.svelte +30 -30
  71. package/dist/controls/progress/Progress.svelte +26 -26
  72. package/dist/controls/progress/progress.scss +23 -23
  73. package/dist/controls/rating/Rating.demo.svelte +45 -45
  74. package/dist/controls/rating/Rating.svelte +44 -44
  75. package/dist/controls/rating/Rating.svelte.d.ts +1 -1
  76. package/dist/controls/rating/rating.scss +9 -9
  77. package/dist/controls/select/Select.demo.svelte +101 -101
  78. package/dist/controls/select/Select.svelte +125 -125
  79. package/dist/controls/select/select.scss +13 -13
  80. package/dist/controls/slider/Slider.demo.svelte +34 -34
  81. package/dist/controls/slider/Slider.svelte +153 -153
  82. package/dist/controls/slider/slider.scss +51 -51
  83. package/dist/controls/stepper/Stepper.demo.svelte +32 -32
  84. package/dist/controls/stepper/Stepper.svelte +30 -30
  85. package/dist/controls/stepper/stepper.scss +23 -23
  86. package/dist/controls/switch/Switch.demo.svelte +61 -61
  87. package/dist/controls/switch/Switch.svelte +45 -45
  88. package/dist/controls/switch/switch.scss +73 -73
  89. package/dist/controls/textfield/TextField.demo.svelte +79 -79
  90. package/dist/controls/textfield/TextField.svelte +86 -86
  91. package/dist/controls/textfield/TextField.svelte.d.ts +1 -1
  92. package/dist/controls/textfield/textfield.scss +68 -68
  93. package/dist/csss/csss.scss +10 -10
  94. package/dist/data/dataList/DataList.demo.svelte +151 -151
  95. package/dist/data/dataList/DataList.preview.svelte +23 -23
  96. package/dist/data/dataList/DataList.svelte +233 -233
  97. package/dist/data/dataList/DataListCell.svelte +212 -212
  98. package/dist/data/dataList/DataListHead.svelte +75 -75
  99. package/dist/data/dataList/DataListRow.svelte +93 -93
  100. package/dist/data/dataList/datalist.scss +157 -157
  101. package/dist/data/finder/Finder.demo.svelte +55 -55
  102. package/dist/data/finder/Finder.svelte +166 -166
  103. package/dist/data/finder/finder.scss +14 -14
  104. package/dist/data/grouper/Grouper.demo.svelte +36 -36
  105. package/dist/data/grouper/Grouper.svelte +85 -85
  106. package/dist/data/jsoner/Jsoner.svelte +40 -40
  107. package/dist/data/list/List.svelte +16 -16
  108. package/dist/data/list/ListItem.svelte +10 -10
  109. package/dist/data/list/ListTitle.svelte +8 -8
  110. package/dist/data/loader/Loader.demo.svelte +95 -95
  111. package/dist/data/loader/Loader.preview.svelte +7 -7
  112. package/dist/data/loader/Loader.svelte +99 -99
  113. package/dist/data/loader/loader.scss +50 -50
  114. package/dist/data/sorter/Sorter.demo.svelte +62 -62
  115. package/dist/data/sorter/Sorter.svelte +80 -80
  116. package/dist/data/sorter/Sorterer.svelte +27 -27
  117. package/dist/data/sorter/sorterer.scss +11 -11
  118. package/dist/index.d.ts +46 -47
  119. package/dist/index.js +46 -47
  120. package/dist/navigation/drawer/Drawer.demo.svelte +52 -52
  121. package/dist/navigation/drawer/Drawer.svelte +163 -163
  122. package/dist/navigation/drawer/drawer.scss +69 -69
  123. package/dist/navigation/tabs/Tabs.demo.svelte +83 -83
  124. package/dist/navigation/tabs/Tabs.preview.svelte +22 -22
  125. package/dist/navigation/tabs/Tabs.svelte +158 -158
  126. package/dist/navigation/tabs/tabs.scss +92 -92
  127. package/dist/slotui-css/slotui-css.css +288 -288
  128. package/dist/slotui-css/slotui-min-css.css +288 -288
  129. package/dist/styles/slotui-mixins.scss +168 -168
  130. package/dist/styles/slotui-presets.scss +56 -56
  131. package/dist/styles/slotuisheet/SlotuiSheet.svelte +36 -36
  132. package/dist/styles/slotuisheet/SlotyuiSheet.demo.svelte +28 -28
  133. package/dist/styles/slotuisheet/sheetConfig.scss +7 -7
  134. package/dist/styles/slotuisheet/slotui-sheet.scss +192 -192
  135. package/dist/styles/slotuisheet/stylesheet-container.scss +147 -147
  136. package/dist/styles/slotuisheet/stylesheet.scss +156 -156
  137. package/dist/types/slotui-ambient.d.ts +27 -27
  138. package/dist/ui/bootstrapp/BootStrApp.svelte +92 -92
  139. package/dist/ui/chromeFrame/ChromeFrame.svelte +43 -43
  140. package/dist/ui/chromeFrame/ChromeFrameButtonList.svelte +33 -33
  141. package/dist/ui/chromeFrame/ChromeFrameList.svelte +106 -106
  142. package/dist/ui/chromeFrame/chrome-frame.scss +34 -34
  143. package/dist/ui/frame/Frame.demo.svelte +48 -48
  144. package/dist/ui/frame/Frame.svelte +90 -90
  145. package/dist/ui/frame/frame.scss +46 -46
  146. package/dist/ui/login/Login.demo.svelte +62 -62
  147. package/dist/ui/login/Login.svelte +102 -102
  148. package/dist/ui/marquee/Marquee.demo.svelte +33 -33
  149. package/dist/ui/marquee/Marquee.svelte +97 -97
  150. package/dist/ui/marquee/marquee.scss +34 -34
  151. package/dist/ui/menu/Menu.svelte +9 -9
  152. package/dist/ui/menu/MenuItem.svelte +9 -9
  153. package/dist/ui/menu/MenuTitle.svelte +10 -10
  154. package/dist/ui/menu/menu.scss +61 -61
  155. package/dist/ui/menuList/MenuList.demo.svelte +73 -73
  156. package/dist/ui/menuList/MenuList.svelte +143 -143
  157. package/dist/ui/menuList/MenuListItem.svelte +134 -134
  158. package/dist/ui/menuList/MenuListTitle.svelte +10 -10
  159. package/dist/ui/menuList/menu-list.scss +120 -120
  160. package/dist/ui/panel/Panel.demo.svelte +169 -169
  161. package/dist/ui/panel/Panel.svelte +96 -96
  162. package/dist/ui/panel/PanelGrid.svelte +62 -62
  163. package/dist/ui/panel/PanelSlide.svelte +156 -156
  164. package/dist/ui/panel/Paneler.svelte +63 -63
  165. package/dist/ui/panel/panel.scss +32 -32
  166. package/dist/ui/popper/Popper.demo.svelte +92 -92
  167. package/dist/ui/popper/Popper.svelte +160 -160
  168. package/dist/ui/popper/popper.scss +108 -108
  169. package/dist/ui/preview/Preview.svelte +41 -41
  170. package/dist/ui/serviceBox/ServiceBox.svelte +24 -24
  171. package/dist/ui/startMenu/BootMenu.svelte +102 -102
  172. package/dist/ui/startMenu/boot-menu.scss +86 -86
  173. package/dist/ui/taskbar/TaskBarContent.svelte +20 -20
  174. package/dist/ui/taskbar/Taskbar.svelte +26 -26
  175. package/dist/ui/taskbar/taskbar.scss +28 -28
  176. package/dist/ui/themeswitcher/ThemeSwitcher.svelte +18 -18
  177. package/dist/ui/toast/Toast.demo.svelte +19 -19
  178. package/dist/ui/toast/Toast.svelte +60 -60
  179. package/dist/ui/toast/Toaster.svelte +18 -18
  180. package/dist/ui/toggleBar/ToggleBar.demo.svelte +114 -114
  181. package/dist/ui/toggleBar/ToggleBar.svelte +58 -58
  182. package/dist/ui/toggleBar/ToggleBar.svelte.d.ts +1 -1
  183. package/dist/ui/toggleBar/toggle-bar.scss +45 -45
  184. package/dist/ui/toolBar/ToolBar.demo.svelte +98 -98
  185. package/dist/ui/toolBar/ToolBar.svelte +30 -30
  186. package/dist/ui/toolBar/toolbar.scss +32 -32
  187. package/dist/ui/tree/Tree.demo.svelte +84 -84
  188. package/dist/ui/tree/Tree.preview.svelte +19 -19
  189. package/dist/ui/tree/Tree.svelte +182 -182
  190. package/dist/ui/tree/tree.scss +38 -38
  191. package/dist/ui/window/Window.demo.svelte +111 -111
  192. package/dist/ui/window/Window.svelte +177 -177
  193. package/dist/ui/window/window.scss +66 -66
  194. package/dist/utils/content/Content.svelte +78 -78
  195. package/dist/utils/contextRooter/ContextRooter.demo.svelte +33 -33
  196. package/dist/utils/contextRooter/ContextRooter.svelte +6 -6
  197. package/dist/utils/css/Css.demo.svelte +5 -5
  198. package/dist/utils/css/Css.svelte +64 -64
  199. package/dist/utils/effects/transitions.js +6 -6
  200. package/dist/utils/looper/Looper.demo.svelte +36 -36
  201. package/dist/utils/looper/Looper.svelte +47 -47
  202. package/dist/utils/slotted/Slotted.svelte +21 -21
  203. package/dist/utils/stylesheet/StyleSheet.demo.svelte +28 -28
  204. package/dist/utils/stylesheet/StyleSheet.svelte +30 -30
  205. package/dist/utils/stylesheet/containerConfig.scss +7 -7
  206. package/dist/utils/stylesheet/stylesheet.scss +147 -147
  207. package/dist/utils/uses/sx4u/sx4uPreprocess.js +34 -34
  208. package/package.json +4 -4
@@ -1,235 +1,235 @@
1
- <script lang="ts" generics="T=Data">
2
- import { getContext, hasContext, setContext } from 'svelte';
3
- import { writable, type Writable } from 'svelte/store';
4
- import DataListRow from './DataListRow.svelte';
5
- import type { DataCellType, DataListProps, DataListStoreType } from './types.js';
6
- import { dataOp } from '../../utils/engine/utils.js';
7
- import DataListHead from './DataListHead.svelte';
8
- import Icon from '../../base/icon/Icon.svelte';
9
- import Button from '../../controls/button/Button.svelte';
10
- import type { Data, ExpandProps } from '../../types/index.js';
11
- import ContextRooter from '../../utils/contextRooter/ContextRooter.svelte';
12
- import sanitizeHtml from 'sanitize-html';
13
- import Slotted from '../../utils/slotted/Slotted.svelte';
14
-
15
- export const sortingIcons = {
16
- default: ['mdi:dots-horizontal', 'mdi:sort-bool-ascending', 'mdi:sort-bool-descending'],
17
- numeric: ['mdi:dots-horizontal', 'mdi:sort-bool-ascending', 'mdi:sort-bool-descending']
18
- };
19
-
20
- let {
21
- class: className = '',
22
- style = '',
23
- element = null,
24
- showHeader = true,
25
- isSortable = true,
26
- sortByOrder = 'none',
27
- groupByField = undefined,
28
- groupByOptions = {
29
- showMainHeader: true,
30
- showSubGroupsHeader: true,
31
- showEmptyGroup: false
32
- },
33
- selectorField = 'id',
34
- selectorFieldValue = undefined,
35
- activeCommonSortField = '',
36
- noWrap = true,
37
- noWrapHeader = true,
38
- dataTypes = undefined,
39
- data = [],
40
- idField = undefined,
41
- columns = {},
42
- virtualizer = false,
43
- isLoading = false,
44
- fieldValue,
45
- dataListRow,
46
- dataListHead,
47
- dataListCell,
48
- dataListFooter,
49
- groupTitleSlot
50
- }: ExpandProps<DataListProps<T>> = $props();
51
-
52
- let hidedGroups: Data = {};
53
-
54
- let sortedData: any[] = $derived(data?.filter((x) => x));
55
-
56
- let groups = $derived(
57
- groupByField
58
- ? dataOp.groupBy(data, groupByField, {
59
- keepUngroupedData: Boolean(groupByOptions.showEmptyGroup)
60
- })
61
- : {}
62
- );
63
-
64
- let dataListContext: Writable<DataListStoreType>;
65
-
66
- if (hasContext('dataListContext')) {
67
- getContext<Writable<DataListStoreType>>('dataListContext');
68
- } else {
69
- /** context store for dataList config and state */
70
- let dataListStore = writable<DataListStoreType>({
71
- config: {
72
- isSortable,
73
- defaultSortByField: undefined,
74
- defaultSortByOrder: sortByOrder,
75
- sortingIcons,
76
- noWrap,
77
- dataTypes
78
- },
79
- sortBy: {
80
- activeSortByField: undefined,
81
- activeSortByOrder: 'none'
82
- },
83
- groupBy: {
84
- groupByField,
85
- groupByOptions
86
- },
87
- idField,
88
- columns,
89
- hasColumnsProps: Boolean(Object.keys(columns).length),
90
- data
91
- });
92
-
93
- setContext<Writable<DataListStoreType>>('dataListContext', dataListStore);
94
- }
95
-
96
- function doSort(e: CustomEvent<{ field: string; order: string }>) {
97
- if (e.detail.field) {
98
- activeCommonSortField = e.detail.field;
99
- sortByOrder = e.detail.order;
100
-
101
- if (e.detail.order === 'none') {
102
- //sortedData = data;
103
- } else {
104
- //sortedData = dataOp.sortBy(data, e.detail.field, e.detail.order);
105
- }
106
- }
107
- }
108
-
109
- function doSelect(e: CustomEvent<Data>) {
110
- const selectedItem = e.detail;
111
- selectorFieldValue = selectedItem?.[selectorField];
112
- }
113
-
114
- function getGroupProps(content: any) {
115
- return {
116
- ...content,
117
- columns,
118
- style,
119
- groupByField: undefined,
120
- groupByOptions,
121
- showHeader: groupByOptions.showSubGroupsHeader,
122
- selectorField,
123
- selectorFieldValue,
124
- virtualizer,
125
- isLoading
126
- };
127
- }
128
-
129
- function checkGetter(columns: Record<string, DataCellType>, field: string, data: Data) {
130
- const ret = columns[field]?.getter
131
- ? columns[field]?.getter(data)
132
- : dataOp.resolveDotPath(data, field);
133
- return sanitizeHtml(ret);
134
- }
135
-
136
- $effect(() => {
137
- element?.addEventListener('datalist:sorted', doSort);
138
- element?.addEventListener('datalist:select', doSelect);
139
- });
140
- </script>
141
-
142
- {#snippet listCell(item, inItem)}
143
- {@render dataListCell?.({
144
- fieldName: $dataListContext.columns[inItem]?.field,
145
- fieldType: $dataListContext.columns[inItem]?.fieldType,
146
- fieldValue: sanitizeHtml(checkGetter({ ...$dataListContext.columns }, inItem, item)),
147
- fieldRawValue: sanitizeHtml(checkGetter({ ...$dataListContext.columns }, inItem, item))
148
- })}
149
- {/snippet}
150
-
151
- <ContextRooter bind:contextRoot={dataListContext} contextKey="dataListContext" />
152
- {#if groupByField}
153
- {#if groupByOptions?.showMainHeader}
154
- <DataListHead />
155
- {/if}
156
- <div bind:this={element} class="datalist-group-wrapper">
157
- {#each Object.keys(groups) as red}
158
- {@const groupProps = getGroupProps({ data: groups[red] })}
159
- {@const item = groups[red]}
160
- <div class="datalist-group">
161
- <header>
162
- <Slotted child={groupTitleSlot} slotArgs={{ item }}>
163
- <!-- svelte-ignore a11y_click_events_have_key_events -->
164
- <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
165
- <!-- svelte-ignore a11y_no_static_element_interactions -->
166
- <div
167
- class="datalist-group-head"
168
- onclick={() => {
169
- hidedGroups[red] = !hidedGroups[red];
170
- }}
171
- >
172
- <div class="datalist-group-head-icon">
173
- <Icon class="datalist-group-head-icon" icon="cil:object-group" />
174
- </div>
175
- <div>{groupByField} : <span class="text-bold">{red}</span></div>
176
- <div class="datalist-group-head-divider" />
177
- <div>{groups[red]?.length}</div>
178
- <div class="datalist-group-head-icon">
179
- <Button
180
- onclick={() => {
181
- hidedGroups[red] = !hidedGroups[red];
182
- }}
183
- icon={hidedGroups[red] ? 'chevron-up' : 'chevron-down'}
184
- variant="naked"
185
- />
186
- </div>
187
- </div>
188
- </Slotted>
189
- </header>
190
- <div class="datalist-group-body">
191
- {#if !hidedGroups[red]}
192
- <svelte:self {...groupProps}>
193
- <Slotted child={dataListCell} slotArgs={{ fieldType, fieldName, fieldValue }} />
194
- <Slotted child={groupTitleSlot} slotArgs={{ item: {} }} />
195
- </svelte:self>
196
- {/if}
197
- </div>
198
- </div>
199
- {/each}
200
- </div>
201
- {:else}
202
- <!-- svelte-ignore a11y_click_events_have_key_events -->
203
- <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
204
- <table bind:this={element} class="datalist {className}" {style} tabindex="0">
205
- {#if element}
206
- {#if showHeader}
207
- <Slotted child={dataListHead}><DataListHead /></Slotted>
208
- {/if}
209
- {#each sortedData as item}
210
- <Slotted child={dataListRow} slotArgs={{ rawData: item, item }}>
211
- <DataListRow
212
- class={item[selectorField] === selectorFieldValue ? 'theme-bg-paper' : ''}
213
- data={item}
214
- >
215
- {#if $dataListContext.hasColumnsProps}
216
- {#each Object.keys($dataListContext.columns) as inItem}
217
- {@render listCell(item, inItem)}
218
- {/each}
219
- {:else}
220
- {#each Object.keys(item) as inItem}
221
- {@render listCell(item, inItem)}
222
- {/each}
223
- {/if}
224
- </DataListRow>
225
- </Slotted>
226
- {/each}
227
- {/if}
228
-
229
- <Slotted child={dataListFooter} />
230
- </table>
231
- {/if}
232
-
1
+ <script lang="ts" generics="T=Data">
2
+ import { getContext, hasContext, setContext } from 'svelte';
3
+ import { writable, type Writable } from 'svelte/store';
4
+ import DataListRow from './DataListRow.svelte';
5
+ import type { DataCellType, DataListProps, DataListStoreType } from './types.js';
6
+ import { dataOp } from '../../utils/engine/utils.js';
7
+ import DataListHead from './DataListHead.svelte';
8
+ import Icon from '../../base/icon/Icon.svelte';
9
+ import Button from '../../controls/button/Button.svelte';
10
+ import type { Data, ExpandProps } from '../../types/index.js';
11
+ import ContextRooter from '../../utils/contextRooter/ContextRooter.svelte';
12
+ import sanitizeHtml from 'sanitize-html';
13
+ import Slotted from '../../utils/slotted/Slotted.svelte';
14
+
15
+ export const sortingIcons = {
16
+ default: ['mdi:dots-horizontal', 'mdi:sort-bool-ascending', 'mdi:sort-bool-descending'],
17
+ numeric: ['mdi:dots-horizontal', 'mdi:sort-bool-ascending', 'mdi:sort-bool-descending']
18
+ };
19
+
20
+ let {
21
+ class: className = '',
22
+ style = '',
23
+ element = null,
24
+ showHeader = true,
25
+ isSortable = true,
26
+ sortByOrder = 'none',
27
+ groupByField = undefined,
28
+ groupByOptions = {
29
+ showMainHeader: true,
30
+ showSubGroupsHeader: true,
31
+ showEmptyGroup: false
32
+ },
33
+ selectorField = 'id',
34
+ selectorFieldValue = undefined,
35
+ activeCommonSortField = '',
36
+ noWrap = true,
37
+ noWrapHeader = true,
38
+ dataTypes = undefined,
39
+ data = [],
40
+ idField = undefined,
41
+ columns = {},
42
+ virtualizer = false,
43
+ isLoading = false,
44
+ fieldValue,
45
+ dataListRow,
46
+ dataListHead,
47
+ dataListCell,
48
+ dataListFooter,
49
+ groupTitleSlot
50
+ }: ExpandProps<DataListProps<T>> = $props();
51
+
52
+ let hidedGroups: Data = {};
53
+
54
+ let sortedData: any[] = $derived(data?.filter((x) => x));
55
+
56
+ let groups = $derived(
57
+ groupByField
58
+ ? dataOp.groupBy(data, groupByField, {
59
+ keepUngroupedData: Boolean(groupByOptions.showEmptyGroup)
60
+ })
61
+ : {}
62
+ );
63
+
64
+ let dataListContext: Writable<DataListStoreType>;
65
+
66
+ if (hasContext('dataListContext')) {
67
+ getContext<Writable<DataListStoreType>>('dataListContext');
68
+ } else {
69
+ /** context store for dataList config and state */
70
+ let dataListStore = writable<DataListStoreType>({
71
+ config: {
72
+ isSortable,
73
+ defaultSortByField: undefined,
74
+ defaultSortByOrder: sortByOrder,
75
+ sortingIcons,
76
+ noWrap,
77
+ dataTypes
78
+ },
79
+ sortBy: {
80
+ activeSortByField: undefined,
81
+ activeSortByOrder: 'none'
82
+ },
83
+ groupBy: {
84
+ groupByField,
85
+ groupByOptions
86
+ },
87
+ idField,
88
+ columns,
89
+ hasColumnsProps: Boolean(Object.keys(columns).length),
90
+ data
91
+ });
92
+
93
+ setContext<Writable<DataListStoreType>>('dataListContext', dataListStore);
94
+ }
95
+
96
+ function doSort(e: CustomEvent<{ field: string; order: string }>) {
97
+ if (e.detail.field) {
98
+ activeCommonSortField = e.detail.field;
99
+ sortByOrder = e.detail.order;
100
+
101
+ if (e.detail.order === 'none') {
102
+ //sortedData = data;
103
+ } else {
104
+ //sortedData = dataOp.sortBy(data, e.detail.field, e.detail.order);
105
+ }
106
+ }
107
+ }
108
+
109
+ function doSelect(e: CustomEvent<Data>) {
110
+ const selectedItem = e.detail;
111
+ selectorFieldValue = selectedItem?.[selectorField];
112
+ }
113
+
114
+ function getGroupProps(content: any) {
115
+ return {
116
+ ...content,
117
+ columns,
118
+ style,
119
+ groupByField: undefined,
120
+ groupByOptions,
121
+ showHeader: groupByOptions.showSubGroupsHeader,
122
+ selectorField,
123
+ selectorFieldValue,
124
+ virtualizer,
125
+ isLoading
126
+ };
127
+ }
128
+
129
+ function checkGetter(columns: Record<string, DataCellType>, field: string, data: Data) {
130
+ const ret = columns[field]?.getter
131
+ ? columns[field]?.getter(data)
132
+ : dataOp.resolveDotPath(data, field);
133
+ return sanitizeHtml(ret);
134
+ }
135
+
136
+ $effect(() => {
137
+ element?.addEventListener('datalist:sorted', doSort);
138
+ element?.addEventListener('datalist:select', doSelect);
139
+ });
140
+ </script>
141
+
142
+ {#snippet listCell(item, inItem)}
143
+ {@render dataListCell?.({
144
+ fieldName: $dataListContext.columns[inItem]?.field,
145
+ fieldType: $dataListContext.columns[inItem]?.fieldType,
146
+ fieldValue: sanitizeHtml(checkGetter({ ...$dataListContext.columns }, inItem, item)),
147
+ fieldRawValue: sanitizeHtml(checkGetter({ ...$dataListContext.columns }, inItem, item))
148
+ })}
149
+ {/snippet}
150
+
151
+ <ContextRooter bind:contextRoot={dataListContext} contextKey="dataListContext" />
152
+ {#if groupByField}
153
+ {#if groupByOptions?.showMainHeader}
154
+ <DataListHead />
155
+ {/if}
156
+ <div bind:this={element} class="datalist-group-wrapper">
157
+ {#each Object.keys(groups) as red}
158
+ {@const groupProps = getGroupProps({ data: groups[red] })}
159
+ {@const item = groups[red]}
160
+ <div class="datalist-group">
161
+ <header>
162
+ <Slotted child={groupTitleSlot} slotArgs={{ item }}>
163
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
164
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
165
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
166
+ <div
167
+ class="datalist-group-head"
168
+ onclick={() => {
169
+ hidedGroups[red] = !hidedGroups[red];
170
+ }}
171
+ >
172
+ <div class="datalist-group-head-icon">
173
+ <Icon class="datalist-group-head-icon" icon="cil:object-group" />
174
+ </div>
175
+ <div>{groupByField} : <span class="text-bold">{red}</span></div>
176
+ <div class="datalist-group-head-divider" />
177
+ <div>{groups[red]?.length}</div>
178
+ <div class="datalist-group-head-icon">
179
+ <Button
180
+ onclick={() => {
181
+ hidedGroups[red] = !hidedGroups[red];
182
+ }}
183
+ icon={hidedGroups[red] ? 'chevron-up' : 'chevron-down'}
184
+ variant="naked"
185
+ />
186
+ </div>
187
+ </div>
188
+ </Slotted>
189
+ </header>
190
+ <div class="datalist-group-body">
191
+ {#if !hidedGroups[red]}
192
+ <svelte:self {...groupProps}>
193
+ <Slotted child={dataListCell} slotArgs={{ fieldType, fieldName, fieldValue }} />
194
+ <Slotted child={groupTitleSlot} slotArgs={{ item: {} }} />
195
+ </svelte:self>
196
+ {/if}
197
+ </div>
198
+ </div>
199
+ {/each}
200
+ </div>
201
+ {:else}
202
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
203
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
204
+ <table bind:this={element} class="datalist {className}" {style} tabindex="0">
205
+ {#if element}
206
+ {#if showHeader}
207
+ <Slotted child={dataListHead}><DataListHead /></Slotted>
208
+ {/if}
209
+ {#each sortedData as item}
210
+ <Slotted child={dataListRow} slotArgs={{ rawData: item, item }}>
211
+ <DataListRow
212
+ class={item[selectorField] === selectorFieldValue ? 'theme-bg-paper' : ''}
213
+ data={item}
214
+ >
215
+ {#if $dataListContext.hasColumnsProps}
216
+ {#each Object.keys($dataListContext.columns) as inItem}
217
+ {@render listCell(item, inItem)}
218
+ {/each}
219
+ {:else}
220
+ {#each Object.keys(item) as inItem}
221
+ {@render listCell(item, inItem)}
222
+ {/each}
223
+ {/if}
224
+ </DataListRow>
225
+ </Slotted>
226
+ {/each}
227
+ {/if}
228
+
229
+ <Slotted child={dataListFooter} />
230
+ </table>
231
+ {/if}
232
+
233
233
  <style global>:root {
234
234
  --datalist-pad: var(--sld-pad-med);
235
235
  --datalist-gap: var(--sld-gap-med);
@@ -365,4 +365,4 @@
365
365
  overflow: hidden;
366
366
  text-overflow: ellipsis;
367
367
  white-space: nowrap;
368
- }</style>
368
+ }</style>