@rkosafo/cai.components 0.0.75 → 0.0.78

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 (127) hide show
  1. package/README.md +8 -8
  2. package/dist/baseEditor/index.svelte +32 -32
  3. package/dist/builders/filters/FilterBuilder.svelte +641 -641
  4. package/dist/forms/FormCheckbox/FormCheckbox.svelte +53 -53
  5. package/dist/forms/FormClEditor/ClEdito.svelte +68 -68
  6. package/dist/forms/FormDatepicker/FormDatepicker.svelte +159 -159
  7. package/dist/forms/FormFileUpload/FormFileUplad.svelte +134 -134
  8. package/dist/forms/FormInput/FormInput.svelte +87 -87
  9. package/dist/forms/FormRadio/FormRadio.svelte +53 -53
  10. package/dist/forms/FormSelect/FormSelect.svelte +88 -88
  11. package/dist/forms/FormTextarea/FormTextarea.svelte +78 -78
  12. package/dist/forms/button-toggle/ButtonToggle.svelte +119 -0
  13. package/dist/forms/button-toggle/ButtonToggle.svelte.d.ts +139 -0
  14. package/dist/forms/button-toggle/ButtonToggleGroup.svelte +0 -0
  15. package/dist/forms/button-toggle/ButtonToggleGroup.svelte.d.ts +26 -0
  16. package/dist/forms/button-toggle/CheckIcon.svelte +28 -0
  17. package/dist/forms/button-toggle/CheckIcon.svelte.d.ts +4 -0
  18. package/dist/forms/button-toggle/index.d.ts +4 -0
  19. package/dist/forms/button-toggle/index.js +4 -0
  20. package/dist/forms/button-toggle/theme.d.ts +347 -0
  21. package/dist/forms/button-toggle/theme.js +129 -0
  22. package/dist/forms/checkbox/Checkbox.svelte +82 -82
  23. package/dist/forms/checkbox/CheckboxButton.svelte +92 -92
  24. package/dist/forms/datepicker/Datepicker.svelte +707 -707
  25. package/dist/forms/form/Form.svelte +69 -69
  26. package/dist/forms/input/Input.svelte +363 -363
  27. package/dist/forms/label/Label.svelte +38 -38
  28. package/dist/forms/radio/Radio.svelte +48 -48
  29. package/dist/forms/radio/RadioButton.svelte +22 -22
  30. package/dist/forms/select/Select.svelte +56 -56
  31. package/dist/forms/textarea/Textarea.svelte +165 -165
  32. package/dist/forms/toggle/Toggle.svelte +70 -0
  33. package/dist/forms/toggle/Toggle.svelte.d.ts +3 -0
  34. package/dist/forms/toggle/index.d.ts +2 -0
  35. package/dist/forms/toggle/index.js +2 -0
  36. package/dist/forms/toggle/theme.d.ts +280 -0
  37. package/dist/forms/toggle/theme.js +97 -0
  38. package/dist/index.d.ts +3 -0
  39. package/dist/index.js +3 -0
  40. package/dist/layout/Chat/CategorySelector.svelte +52 -52
  41. package/dist/layout/Chat/ChatEntry.svelte +246 -246
  42. package/dist/layout/Chat/ChatEntrySkeleton.svelte +81 -81
  43. package/dist/layout/Chat/ChatHeader.svelte +172 -172
  44. package/dist/layout/Chat/ChatInput.svelte +207 -207
  45. package/dist/layout/Chat/DraggableWindow.svelte +230 -230
  46. package/dist/layout/Chat/PreviewPage.svelte +182 -182
  47. package/dist/layout/Chat/RichText.svelte +216 -216
  48. package/dist/layout/ComponentCanvas/Canvas.svelte +40 -40
  49. package/dist/layout/ComponentCanvas/ComponentRenderer.svelte +85 -85
  50. package/dist/layout/TF/Content/Content.svelte +21 -21
  51. package/dist/layout/TF/Header/Header.svelte +166 -166
  52. package/dist/layout/TF/Sidebar/Sidebar.svelte +148 -148
  53. package/dist/layout/TF/Wrapper/Wrapper.svelte +17 -17
  54. package/dist/layout/mailing/MailPaginator.svelte +36 -36
  55. package/dist/layout/mailing/MailSidebar.svelte +39 -39
  56. package/dist/layout/mailing/MailToolBar.svelte +174 -174
  57. package/dist/layout/mailing/MailingContent.svelte +10 -10
  58. package/dist/layout/mailing/MailingHeader.svelte +55 -55
  59. package/dist/layout/mailing/MailingMessageCard.svelte +112 -112
  60. package/dist/layout/mailing/MailingMessageViewer.svelte +87 -87
  61. package/dist/layout/mailing/MailingModule.svelte +448 -448
  62. package/dist/styles/docs.css +615 -615
  63. package/dist/styles/tf-layout.css +185 -185
  64. package/dist/themes/ThemeProvider.svelte +20 -20
  65. package/dist/themes/themes.d.ts +3 -0
  66. package/dist/themes/themes.js +3 -0
  67. package/dist/types/index.d.ts +57 -1
  68. package/dist/typography/heading/Heading.svelte +35 -35
  69. package/dist/ui/accordion/Accordion.svelte +49 -49
  70. package/dist/ui/accordion/AccordionItem.svelte +173 -173
  71. package/dist/ui/alert/Alert.svelte +83 -83
  72. package/dist/ui/alertDialog/AlertDialog.svelte +40 -40
  73. package/dist/ui/avatar/Avatar.svelte +77 -77
  74. package/dist/ui/box/Box.svelte +28 -28
  75. package/dist/ui/breadcrumb/Breadcrumb.svelte +39 -39
  76. package/dist/ui/buttons/ActionButton.svelte +234 -234
  77. package/dist/ui/buttons/Button.svelte +102 -102
  78. package/dist/ui/buttons/GradientButton.svelte +59 -59
  79. package/dist/ui/datatable/Datatable.svelte +525 -525
  80. package/dist/ui/drawer/Drawer.svelte +300 -300
  81. package/dist/ui/dropdown/Dropdown.svelte +36 -36
  82. package/dist/ui/dropdown/DropdownDivider.svelte +11 -11
  83. package/dist/ui/dropdown/DropdownGroup.svelte +14 -14
  84. package/dist/ui/dropdown/DropdownHeader.svelte +14 -14
  85. package/dist/ui/dropdown/DropdownItem.svelte +52 -52
  86. package/dist/ui/footer/Footer.svelte +15 -15
  87. package/dist/ui/footer/FooterBrand.svelte +37 -37
  88. package/dist/ui/footer/FooterCopyright.svelte +45 -45
  89. package/dist/ui/footer/FooterIcon.svelte +22 -22
  90. package/dist/ui/footer/FooterLink.svelte +33 -33
  91. package/dist/ui/footer/FooterLinkGroup.svelte +13 -13
  92. package/dist/ui/icons/IconifyIcon.svelte +7 -7
  93. package/dist/ui/indicator/Indicator.svelte +42 -42
  94. package/dist/ui/modal/Modal.svelte +265 -265
  95. package/dist/ui/modal/theme.d.ts +26 -26
  96. package/dist/ui/modal/theme.js +25 -25
  97. package/dist/ui/notificationList/NotificationList.svelte +123 -123
  98. package/dist/ui/pageLoader/PageLoader.svelte +14 -14
  99. package/dist/ui/paginate/Paginate.svelte +96 -96
  100. package/dist/ui/speedDial/SpeedDial.svelte +77 -0
  101. package/dist/ui/speedDial/SpeedDial.svelte.d.ts +21 -0
  102. package/dist/ui/speedDial/SpeedDialButton.svelte +75 -0
  103. package/dist/ui/speedDial/SpeedDialButton.svelte.d.ts +20 -0
  104. package/dist/ui/speedDial/SpeedDialTrigger.svelte +79 -0
  105. package/dist/ui/speedDial/SpeedDialTrigger.svelte.d.ts +18 -0
  106. package/dist/ui/speedDial/index.d.ts +4 -0
  107. package/dist/ui/speedDial/index.js +4 -0
  108. package/dist/ui/speedDial/theme.d.ts +75 -0
  109. package/dist/ui/speedDial/theme.js +35 -0
  110. package/dist/ui/tab/Tab.svelte +67 -67
  111. package/dist/ui/table/Table.svelte +396 -396
  112. package/dist/ui/tableLoader/TableLoader.svelte +24 -24
  113. package/dist/ui/toast/Toast.svelte +337 -337
  114. package/dist/ui/toast/Toast.svelte.d.ts +10 -10
  115. package/dist/ui/toast/index.d.ts +1 -2
  116. package/dist/ui/toast/index.js +3 -1
  117. package/dist/ui/toolbar/Toolbar.svelte +59 -59
  118. package/dist/ui/toolbar/ToolbarButton.svelte +56 -56
  119. package/dist/ui/toolbar/ToolbarGroup.svelte +43 -43
  120. package/dist/ui/tooltip/Tooltip.svelte +51 -51
  121. package/dist/utils/Popper.svelte +257 -257
  122. package/dist/utils/closeButton/CloseButton.svelte +88 -88
  123. package/dist/utils/index.d.ts +3 -2
  124. package/dist/utils/index.js +13 -3
  125. package/dist/utils/singleSelection.svelte.js +48 -48
  126. package/dist/youtube/index.svelte +12 -12
  127. package/package.json +2 -1
@@ -1,396 +1,396 @@
1
- <script lang="ts">
2
- import { Checkbox, Dropdown, DropdownItem, type TableProps } from '../../index.js';
3
- import { clickOutsideAction } from '../../utils/svelte-legos.js';
4
- import { createTable, Render, Subscribe } from 'svelte-headless-table';
5
- import {
6
- addColumnOrder,
7
- addHiddenColumns,
8
- addResizedColumns,
9
- addSelectedRows,
10
- addSortBy
11
- } from 'svelte-headless-table/plugins';
12
- import { writable } from 'svelte/store';
13
-
14
- let {
15
- data = [],
16
- headerColor = 'white',
17
- height = 780,
18
- bgWhite = false,
19
- headerTextColor = 'black',
20
- tableColumns = [],
21
- showActions = false,
22
- showCheckBox = false,
23
- showViewDetails = true,
24
- showEdit = false,
25
- showMiniWidth = false,
26
- rowClickable = false,
27
- hideWhiteSpace = true,
28
- hiddenColumns = $bindable([]),
29
- sortedColumns = $bindable([]),
30
- initialSortKeys = [],
31
- actionLists = [],
32
- showIndex = false,
33
- selectedRows = $bindable([]),
34
- selectAllChecked = $bindable(false),
35
- showDelete = false,
36
- handleCheckbox,
37
- onActionClicked,
38
- onDelete,
39
- onEdit,
40
- onView,
41
- onRowClicked,
42
- showTableBottomPadding = true,
43
- tableBottomContent
44
- }: TableProps = $props();
45
-
46
- let dropdown = $state(-1);
47
- let openDropDown = $state(false);
48
- let tableData = writable(data);
49
-
50
- $effect(() => {
51
- tableData.set(data);
52
- });
53
-
54
- const table = createTable(tableData, {
55
- sort: addSortBy({
56
- disableMultiSort: false,
57
- serverSide: true,
58
- initialSortKeys: initialSortKeys
59
- }),
60
- colOrder: addColumnOrder(),
61
- select: addSelectedRows(),
62
- hideCols: addHiddenColumns({
63
- initialHiddenColumnIds: hiddenColumns
64
- }),
65
- resize: addResizedColumns()
66
- });
67
- const columns = tableColumns.map((x: any) => table.column({ ...x }));
68
- const { headerRows, flatColumns, rows, tableAttrs, tableBodyAttrs, pluginStates, pageRows } =
69
- table.createViewModel(columns);
70
- // $allColumns = flatColumns;
71
- const { hiddenColumnIds } = pluginStates.hideCols;
72
-
73
- $effect(() => hiddenColumnIds.set(hiddenColumns));
74
-
75
- const { sortKeys } = pluginStates.sort;
76
- $effect(() => {
77
- sortedColumns = $sortKeys;
78
- });
79
-
80
- function handleRowCheckboxChange(checked: boolean, row: any) {
81
- let updatedSelectedRows;
82
-
83
- if (checked) {
84
- updatedSelectedRows = [...selectedRows, row];
85
- } else {
86
- updatedSelectedRows = selectedRows.filter((item) => item !== row);
87
- }
88
-
89
- selectedRows = updatedSelectedRows;
90
- if (handleCheckbox) handleCheckbox(updatedSelectedRows);
91
- }
92
-
93
- const handleSelectAllChange = () => {
94
- if (selectAllChecked) {
95
- selectedRows = [];
96
- if (handleCheckbox) handleCheckbox([]);
97
- } else {
98
- const allRows = data.map((x) => x);
99
- selectedRows = allRows;
100
- if (handleCheckbox) handleCheckbox(allRows);
101
- }
102
- selectAllChecked = !selectAllChecked;
103
- };
104
-
105
- function toggleSubmenu(index: any) {
106
- dropdown = dropdown === index ? -1 : index;
107
- }
108
-
109
- function closeDropDown() {
110
- openDropDown = false;
111
- dropdown = -1;
112
- }
113
- function getRow(row: any) {
114
- const { original } = row;
115
- return original;
116
- }
117
- </script>
118
-
119
- <div class="h-full w-full flex-auto">
120
- <div class="grid grid-cols-1 gap-2">
121
- <div
122
- class=" scrollbar-thumb-blue scrollbar-thumb-rounded scrollbar-track-blue-lighter scrollbar-w-2 scrolling-touch h-full w-full max-h-[{height}px] overflow-x-auto"
123
- style="max-height: {height}px; min-height: {showMiniWidth && '250px'};"
124
- >
125
- <table {...$tableAttrs} class="mb-6 w-full pb-6">
126
- <thead
127
- class=" sticky top-0"
128
- class:bg-[#92cbdf]={headerColor === 'sky'}
129
- class:bg-green-300={headerColor === 'green'}
130
- class:bg-[#CF9B14]={headerColor === 'orange'}
131
- class:bg-[#cbc3fa]={headerColor === 'purple'}
132
- class:bg-blue-300={headerColor === 'blue'}
133
- class:bg-red-300={headerColor === 'red'}
134
- class:bg-pink-300={headerColor === 'pink'}
135
- class:bg-white={headerColor === 'white'}
136
- class:text-gray-700={headerTextColor === 'gray'}
137
- class:text-white={headerTextColor === 'white'}
138
- class:text-black={headerTextColor === 'black'}
139
- class:border-b-2={headerColor === 'white'}
140
- >
141
- {#each $headerRows as headerRow (headerRow.id)}
142
- <Subscribe rowAttrs={headerRow.attrs()}>
143
- {#snippet children({ rowAttrs })}
144
- <tr {...rowAttrs}>
145
- {#if showCheckBox}
146
- <th
147
- class="px-6 py-2.5 text-left text-sm font-semibold whitespace-nowrap rtl:text-right"
148
- >
149
- <Checkbox
150
- class="h-5 w-5 cursor-pointer"
151
- checked={selectAllChecked}
152
- onchange={handleSelectAllChange}
153
- />
154
- </th>
155
- {/if}
156
- {#if showActions}
157
- <th
158
- class="px-4 py-2.5 text-left text-sm font-semibold whitespace-nowrap rtl:text-right"
159
- >Actions</th
160
- >
161
- {/if}
162
- {#if showIndex}
163
- <th
164
- class="px-6 py-2.5 text-left text-sm font-semibold whitespace-nowrap rtl:text-right"
165
- >#</th
166
- >
167
- {/if}
168
- {#each headerRow.cells as cell (cell.id)}
169
- <Subscribe attrs={cell.attrs()} props={cell.props()}>
170
- {#snippet children({ attrs, props })}
171
- <!-- use:props.resize : apply to th -->
172
- <th
173
- {...attrs}
174
- onclick={props.sort.toggle}
175
- class="relative cursor-pointer px-6 py-2.5 text-left text-sm font-semibold whitespace-nowrap rtl:text-right"
176
- >
177
- <div class="flex items-center gap-1">
178
- <Render of={cell.render()} />
179
- {#if props.sort?.order === 'asc'}
180
- <iconify-icon icon="ph:caret-up" class="text-gray-500"></iconify-icon>
181
- {:else if props.sort?.order === 'desc'}
182
- <iconify-icon icon="ph:caret-down" class="text-gray-500"
183
- ></iconify-icon>
184
- {:else if props.sort?.disabled == false}
185
- <iconify-icon icon="ph:caret-up-down" class="text-gray-500"
186
- ></iconify-icon>
187
- {/if}
188
- <!-- {#if !props.resize.disabled}
189
- <div class="resizer" use:props.resize.drag />
190
- {/if} -->
191
- </div>
192
- </th>
193
- {/snippet}
194
- </Subscribe>
195
- {/each}
196
- </tr>
197
- {/snippet}
198
- </Subscribe>
199
- {/each}
200
- </thead>
201
- <tbody
202
- {...$tableBodyAttrs}
203
- class="divide-y divide-gray-300"
204
- class:bg-white={bgWhite}
205
- use:clickOutsideAction
206
- onclickoutside={closeDropDown}
207
- >
208
- {#each $pageRows as row, index (row.id)}
209
- <Subscribe rowAttrs={row.attrs()}>
210
- {#snippet children({ rowAttrs })}
211
- <tr
212
- {...rowAttrs}
213
- class:bg-slate-100={index % 2 !== 0}
214
- class:cursor-pointer={rowClickable}
215
- class:hover:bg-gray-100={rowClickable}
216
- class="dark:bg-gray-900 dark:text-white dark:hover:bg-gray-800"
217
- onclick={(e) => {
218
- if (rowClickable) {
219
- const target = e.target as HTMLElement | null;
220
- if (
221
- target &&
222
- (target.localName === 'iconify-icon' ||
223
- target.localName === 'button' ||
224
- target.localName === 'input' ||
225
- target.localName === 'checkbox')
226
- ) {
227
- return;
228
- }
229
- onRowClicked && onRowClicked(getRow(row));
230
- closeDropDown();
231
- }
232
- }}
233
- >
234
- {#if showCheckBox}
235
- <td class="px-6 py-2">
236
- <Checkbox
237
- class="h-5 w-5 cursor-pointer"
238
- onchange={(e) => {
239
- const checked = e?.target?.checked;
240
- handleRowCheckboxChange(checked, getRow(row));
241
- e.stopPropagation();
242
- }}
243
- checked={selectedRows.find((x) => x.id === getRow(row).id) ?? false}
244
- />
245
- </td>
246
- {/if}
247
- {#if showActions}
248
- <td class="px-5 py-2">
249
- <!-- svelte-ignore a11y_consider_explicit_label -->
250
- <button
251
- class="dropdown-{row.id} grid h-7 w-7 place-content-center rounded-[5px] border border-gray-300 bg-gray-200 hover:bg-gray-300 dark:bg-gray-900 dark:hover:bg-gray-700"
252
- >
253
- <iconify-icon class="dots-menu dark:text-white" icon="tabler:dots-vertical"
254
- ></iconify-icon>
255
- </button>
256
- <!-- {#if dropdown === index && openDropDown} -->
257
- <Dropdown
258
- triggeredBy=".dropdown-{row.id}"
259
- placement="right"
260
- class="list-none"
261
- >
262
- {#each actionLists as { name, icon, otherClasses, visible }}
263
- {#if visible}
264
- {#if visible(getRow(row))}
265
- <DropdownItem
266
- data-dropdown-id={`dropdown-${row.id}`}
267
- class="flex w-full items-center gap-1 px-4 py-2 text-sm whitespace-nowrap hover:bg-gray-100 {otherClasses}"
268
- onclick={(e) => {
269
- onActionClicked && onActionClicked({ name, row: getRow(row) });
270
- closeDropDown();
271
- e.stopPropagation();
272
- }}
273
- >
274
- {#if icon}
275
- <iconify-icon {icon} style="font-size: 18px;"></iconify-icon>
276
- {/if}
277
- {name}
278
- </DropdownItem>
279
- {/if}
280
- {:else}
281
- <DropdownItem
282
- data-dropdown-id={`dropdown-${row.id}`}
283
- class=" flex w-full items-center gap-1 px-4 py-2 text-sm whitespace-nowrap hover:bg-gray-100 {otherClasses}"
284
- onclick={(e) => {
285
- onActionClicked && onActionClicked({ name, row: getRow(row) });
286
- closeDropDown();
287
- e.stopPropagation();
288
- }}
289
- >
290
- {#if icon}
291
- <iconify-icon {icon} style="font-size: 18px;"></iconify-icon>
292
- {/if}
293
- {name}
294
- </DropdownItem>
295
- {/if}
296
- {:else}
297
- {#if showViewDetails}
298
- <DropdownItem
299
- data-dropdown-id={`dropdown-${row.id}`}
300
- class="flex items-center px-4 py-2 gap-1 hover:bg-gray-100 w-full text-sm"
301
- onclick={(e) => {
302
- onView && onView(getRow(row));
303
- closeDropDown();
304
- e.stopPropagation();
305
- }}
306
- >
307
- <iconify-icon icon="ion:eye" style="font-size: 18px;"
308
- ></iconify-icon>View Details
309
- </DropdownItem>
310
- {/if}
311
-
312
- {#if showEdit}
313
- <DropdownItem
314
- data-dropdown-id={`dropdown-${row.id}`}
315
- class="flex items-center px-4 py-2 gap-1 hover:bg-gray-100 w-full text-sm"
316
- onclick={(e) => {
317
- onEdit && onEdit(getRow(row));
318
- closeDropDown();
319
- e.stopPropagation();
320
- }}
321
- >
322
- <iconify-icon icon="ri:edit-2-fill" style="font-size: 18px;"
323
- ></iconify-icon>Edit Details
324
- </DropdownItem>
325
- {/if}
326
- {#if showDelete}
327
- <DropdownItem
328
- data-dropdown-id={`dropdown-${row.id}`}
329
- class="flex items-center px-4 py-2 gap-1 text-red-600 hover:bg-red-100 w-full text-sm"
330
- onclick={(e) => {
331
- onDelete && onDelete(getRow(row));
332
- closeDropDown();
333
- e.stopPropagation();
334
- }}
335
- >
336
- <iconify-icon icon="mdi:trash" style="font-size: 18px;"
337
- ></iconify-icon>Delete Details
338
- </DropdownItem>
339
- {/if}
340
- {/each}
341
- </Dropdown>
342
-
343
- <!-- {/if} -->
344
- </td>
345
- {/if}
346
- {#if showIndex}
347
- <td class="px-6 py-2">
348
- {index + 1}
349
- </td>
350
- {/if}
351
- {#each row.cells as cell (cell.id)}
352
- <Subscribe attrs={cell.attrs()}>
353
- {#snippet children({ attrs })}
354
- <td
355
- {...attrs}
356
- class="px-6 py-2 text-left text-sm rtl:text-right"
357
- class:whitespace-nowrap={hideWhiteSpace}
358
- >
359
- <Render of={cell.render()} />
360
- </td>
361
- {/snippet}
362
- </Subscribe>
363
- {/each}
364
- </tr>
365
- {/snippet}
366
- </Subscribe>
367
- {/each}
368
- </tbody>
369
- </table>
370
- {#if tableBottomContent}
371
- {@render tableBottomContent?.()}
372
- {:else if showTableBottomPadding}
373
- <div class="h-12"></div>
374
- {/if}
375
-
376
- {#if !$pageRows.length}
377
- <div class="flex h-72 w-full items-center justify-center">
378
- <div class="rounded-md bg-yellow-200 px-6 py-4">No records found</div>
379
- </div>
380
- {/if}
381
- </div>
382
- </div>
383
- </div>
384
-
385
- <style>
386
- .resizer {
387
- position: absolute;
388
- top: 0;
389
- bottom: 0;
390
- right: -4px;
391
- width: 8px;
392
- background: #6194d9;
393
- cursor: col-resize;
394
- z-index: 1;
395
- }
396
- </style>
1
+ <script lang="ts">
2
+ import { Checkbox, Dropdown, DropdownItem, type TableProps } from '../../index.js';
3
+ import { clickOutsideAction } from '../../utils/svelte-legos.js';
4
+ import { createTable, Render, Subscribe } from 'svelte-headless-table';
5
+ import {
6
+ addColumnOrder,
7
+ addHiddenColumns,
8
+ addResizedColumns,
9
+ addSelectedRows,
10
+ addSortBy
11
+ } from 'svelte-headless-table/plugins';
12
+ import { writable } from 'svelte/store';
13
+
14
+ let {
15
+ data = [],
16
+ headerColor = 'white',
17
+ height = 780,
18
+ bgWhite = false,
19
+ headerTextColor = 'black',
20
+ tableColumns = [],
21
+ showActions = false,
22
+ showCheckBox = false,
23
+ showViewDetails = true,
24
+ showEdit = false,
25
+ showMiniWidth = false,
26
+ rowClickable = false,
27
+ hideWhiteSpace = true,
28
+ hiddenColumns = $bindable([]),
29
+ sortedColumns = $bindable([]),
30
+ initialSortKeys = [],
31
+ actionLists = [],
32
+ showIndex = false,
33
+ selectedRows = $bindable([]),
34
+ selectAllChecked = $bindable(false),
35
+ showDelete = false,
36
+ handleCheckbox,
37
+ onActionClicked,
38
+ onDelete,
39
+ onEdit,
40
+ onView,
41
+ onRowClicked,
42
+ showTableBottomPadding = true,
43
+ tableBottomContent
44
+ }: TableProps = $props();
45
+
46
+ let dropdown = $state(-1);
47
+ let openDropDown = $state(false);
48
+ let tableData = writable(data);
49
+
50
+ $effect(() => {
51
+ tableData.set(data);
52
+ });
53
+
54
+ const table = createTable(tableData, {
55
+ sort: addSortBy({
56
+ disableMultiSort: false,
57
+ serverSide: true,
58
+ initialSortKeys: initialSortKeys
59
+ }),
60
+ colOrder: addColumnOrder(),
61
+ select: addSelectedRows(),
62
+ hideCols: addHiddenColumns({
63
+ initialHiddenColumnIds: hiddenColumns
64
+ }),
65
+ resize: addResizedColumns()
66
+ });
67
+ const columns = tableColumns.map((x: any) => table.column({ ...x }));
68
+ const { headerRows, flatColumns, rows, tableAttrs, tableBodyAttrs, pluginStates, pageRows } =
69
+ table.createViewModel(columns);
70
+ // $allColumns = flatColumns;
71
+ const { hiddenColumnIds } = pluginStates.hideCols;
72
+
73
+ $effect(() => hiddenColumnIds.set(hiddenColumns));
74
+
75
+ const { sortKeys } = pluginStates.sort;
76
+ $effect(() => {
77
+ sortedColumns = $sortKeys;
78
+ });
79
+
80
+ function handleRowCheckboxChange(checked: boolean, row: any) {
81
+ let updatedSelectedRows;
82
+
83
+ if (checked) {
84
+ updatedSelectedRows = [...selectedRows, row];
85
+ } else {
86
+ updatedSelectedRows = selectedRows.filter((item) => item !== row);
87
+ }
88
+
89
+ selectedRows = updatedSelectedRows;
90
+ if (handleCheckbox) handleCheckbox(updatedSelectedRows);
91
+ }
92
+
93
+ const handleSelectAllChange = () => {
94
+ if (selectAllChecked) {
95
+ selectedRows = [];
96
+ if (handleCheckbox) handleCheckbox([]);
97
+ } else {
98
+ const allRows = data.map((x) => x);
99
+ selectedRows = allRows;
100
+ if (handleCheckbox) handleCheckbox(allRows);
101
+ }
102
+ selectAllChecked = !selectAllChecked;
103
+ };
104
+
105
+ function toggleSubmenu(index: any) {
106
+ dropdown = dropdown === index ? -1 : index;
107
+ }
108
+
109
+ function closeDropDown() {
110
+ openDropDown = false;
111
+ dropdown = -1;
112
+ }
113
+ function getRow(row: any) {
114
+ const { original } = row;
115
+ return original;
116
+ }
117
+ </script>
118
+
119
+ <div class="h-full w-full flex-auto">
120
+ <div class="grid grid-cols-1 gap-2">
121
+ <div
122
+ class=" scrollbar-thumb-blue scrollbar-thumb-rounded scrollbar-track-blue-lighter scrollbar-w-2 scrolling-touch h-full w-full max-h-[{height}px] overflow-x-auto"
123
+ style="max-height: {height}px; min-height: {showMiniWidth && '250px'};"
124
+ >
125
+ <table {...$tableAttrs} class="mb-6 w-full pb-6">
126
+ <thead
127
+ class=" sticky top-0"
128
+ class:bg-[#92cbdf]={headerColor === 'sky'}
129
+ class:bg-green-300={headerColor === 'green'}
130
+ class:bg-[#CF9B14]={headerColor === 'orange'}
131
+ class:bg-[#cbc3fa]={headerColor === 'purple'}
132
+ class:bg-blue-300={headerColor === 'blue'}
133
+ class:bg-red-300={headerColor === 'red'}
134
+ class:bg-pink-300={headerColor === 'pink'}
135
+ class:bg-white={headerColor === 'white'}
136
+ class:text-gray-700={headerTextColor === 'gray'}
137
+ class:text-white={headerTextColor === 'white'}
138
+ class:text-black={headerTextColor === 'black'}
139
+ class:border-b-2={headerColor === 'white'}
140
+ >
141
+ {#each $headerRows as headerRow (headerRow.id)}
142
+ <Subscribe rowAttrs={headerRow.attrs()}>
143
+ {#snippet children({ rowAttrs })}
144
+ <tr {...rowAttrs}>
145
+ {#if showCheckBox}
146
+ <th
147
+ class="px-6 py-2.5 text-left text-sm font-semibold whitespace-nowrap rtl:text-right"
148
+ >
149
+ <Checkbox
150
+ class="h-5 w-5 cursor-pointer"
151
+ checked={selectAllChecked}
152
+ onchange={handleSelectAllChange}
153
+ />
154
+ </th>
155
+ {/if}
156
+ {#if showActions}
157
+ <th
158
+ class="px-4 py-2.5 text-left text-sm font-semibold whitespace-nowrap rtl:text-right"
159
+ >Actions</th
160
+ >
161
+ {/if}
162
+ {#if showIndex}
163
+ <th
164
+ class="px-6 py-2.5 text-left text-sm font-semibold whitespace-nowrap rtl:text-right"
165
+ >#</th
166
+ >
167
+ {/if}
168
+ {#each headerRow.cells as cell (cell.id)}
169
+ <Subscribe attrs={cell.attrs()} props={cell.props()}>
170
+ {#snippet children({ attrs, props })}
171
+ <!-- use:props.resize : apply to th -->
172
+ <th
173
+ {...attrs}
174
+ onclick={props.sort.toggle}
175
+ class="relative cursor-pointer px-6 py-2.5 text-left text-sm font-semibold whitespace-nowrap rtl:text-right"
176
+ >
177
+ <div class="flex items-center gap-1">
178
+ <Render of={cell.render()} />
179
+ {#if props.sort?.order === 'asc'}
180
+ <iconify-icon icon="ph:caret-up" class="text-gray-500"></iconify-icon>
181
+ {:else if props.sort?.order === 'desc'}
182
+ <iconify-icon icon="ph:caret-down" class="text-gray-500"
183
+ ></iconify-icon>
184
+ {:else if props.sort?.disabled == false}
185
+ <iconify-icon icon="ph:caret-up-down" class="text-gray-500"
186
+ ></iconify-icon>
187
+ {/if}
188
+ <!-- {#if !props.resize.disabled}
189
+ <div class="resizer" use:props.resize.drag />
190
+ {/if} -->
191
+ </div>
192
+ </th>
193
+ {/snippet}
194
+ </Subscribe>
195
+ {/each}
196
+ </tr>
197
+ {/snippet}
198
+ </Subscribe>
199
+ {/each}
200
+ </thead>
201
+ <tbody
202
+ {...$tableBodyAttrs}
203
+ class="divide-y divide-gray-300"
204
+ class:bg-white={bgWhite}
205
+ use:clickOutsideAction
206
+ onclickoutside={closeDropDown}
207
+ >
208
+ {#each $pageRows as row, index (row.id)}
209
+ <Subscribe rowAttrs={row.attrs()}>
210
+ {#snippet children({ rowAttrs })}
211
+ <tr
212
+ {...rowAttrs}
213
+ class:bg-slate-100={index % 2 !== 0}
214
+ class:cursor-pointer={rowClickable}
215
+ class:hover:bg-gray-100={rowClickable}
216
+ class="dark:bg-gray-900 dark:text-white dark:hover:bg-gray-800"
217
+ onclick={(e) => {
218
+ if (rowClickable) {
219
+ const target = e.target as HTMLElement | null;
220
+ if (
221
+ target &&
222
+ (target.localName === 'iconify-icon' ||
223
+ target.localName === 'button' ||
224
+ target.localName === 'input' ||
225
+ target.localName === 'checkbox')
226
+ ) {
227
+ return;
228
+ }
229
+ onRowClicked && onRowClicked(getRow(row));
230
+ closeDropDown();
231
+ }
232
+ }}
233
+ >
234
+ {#if showCheckBox}
235
+ <td class="px-6 py-2">
236
+ <Checkbox
237
+ class="h-5 w-5 cursor-pointer"
238
+ onchange={(e) => {
239
+ const checked = e?.target?.checked;
240
+ handleRowCheckboxChange(checked, getRow(row));
241
+ e.stopPropagation();
242
+ }}
243
+ checked={selectedRows.find((x) => x.id === getRow(row).id) ?? false}
244
+ />
245
+ </td>
246
+ {/if}
247
+ {#if showActions}
248
+ <td class="px-5 py-2">
249
+ <!-- svelte-ignore a11y_consider_explicit_label -->
250
+ <button
251
+ class="dropdown-{row.id} grid h-7 w-7 place-content-center rounded-[5px] border border-gray-300 bg-gray-200 hover:bg-gray-300 dark:bg-gray-900 dark:hover:bg-gray-700"
252
+ >
253
+ <iconify-icon class="dots-menu dark:text-white" icon="tabler:dots-vertical"
254
+ ></iconify-icon>
255
+ </button>
256
+ <!-- {#if dropdown === index && openDropDown} -->
257
+ <Dropdown
258
+ triggeredBy=".dropdown-{row.id}"
259
+ placement="right"
260
+ class="list-none"
261
+ >
262
+ {#each actionLists as { name, icon, otherClasses, visible }}
263
+ {#if visible}
264
+ {#if visible(getRow(row))}
265
+ <DropdownItem
266
+ data-dropdown-id={`dropdown-${row.id}`}
267
+ class="flex w-full items-center gap-1 px-4 py-2 text-sm whitespace-nowrap hover:bg-gray-100 {otherClasses}"
268
+ onclick={(e) => {
269
+ onActionClicked && onActionClicked({ name, row: getRow(row) });
270
+ closeDropDown();
271
+ e.stopPropagation();
272
+ }}
273
+ >
274
+ {#if icon}
275
+ <iconify-icon {icon} style="font-size: 18px;"></iconify-icon>
276
+ {/if}
277
+ {name}
278
+ </DropdownItem>
279
+ {/if}
280
+ {:else}
281
+ <DropdownItem
282
+ data-dropdown-id={`dropdown-${row.id}`}
283
+ class=" flex w-full items-center gap-1 px-4 py-2 text-sm whitespace-nowrap hover:bg-gray-100 {otherClasses}"
284
+ onclick={(e) => {
285
+ onActionClicked && onActionClicked({ name, row: getRow(row) });
286
+ closeDropDown();
287
+ e.stopPropagation();
288
+ }}
289
+ >
290
+ {#if icon}
291
+ <iconify-icon {icon} style="font-size: 18px;"></iconify-icon>
292
+ {/if}
293
+ {name}
294
+ </DropdownItem>
295
+ {/if}
296
+ {:else}
297
+ {#if showViewDetails}
298
+ <DropdownItem
299
+ data-dropdown-id={`dropdown-${row.id}`}
300
+ class="flex items-center px-4 py-2 gap-1 hover:bg-gray-100 w-full text-sm"
301
+ onclick={(e) => {
302
+ onView && onView(getRow(row));
303
+ closeDropDown();
304
+ e.stopPropagation();
305
+ }}
306
+ >
307
+ <iconify-icon icon="ion:eye" style="font-size: 18px;"
308
+ ></iconify-icon>View Details
309
+ </DropdownItem>
310
+ {/if}
311
+
312
+ {#if showEdit}
313
+ <DropdownItem
314
+ data-dropdown-id={`dropdown-${row.id}`}
315
+ class="flex items-center px-4 py-2 gap-1 hover:bg-gray-100 w-full text-sm"
316
+ onclick={(e) => {
317
+ onEdit && onEdit(getRow(row));
318
+ closeDropDown();
319
+ e.stopPropagation();
320
+ }}
321
+ >
322
+ <iconify-icon icon="ri:edit-2-fill" style="font-size: 18px;"
323
+ ></iconify-icon>Edit Details
324
+ </DropdownItem>
325
+ {/if}
326
+ {#if showDelete}
327
+ <DropdownItem
328
+ data-dropdown-id={`dropdown-${row.id}`}
329
+ class="flex items-center px-4 py-2 gap-1 text-red-600 hover:bg-red-100 w-full text-sm"
330
+ onclick={(e) => {
331
+ onDelete && onDelete(getRow(row));
332
+ closeDropDown();
333
+ e.stopPropagation();
334
+ }}
335
+ >
336
+ <iconify-icon icon="mdi:trash" style="font-size: 18px;"
337
+ ></iconify-icon>Delete Details
338
+ </DropdownItem>
339
+ {/if}
340
+ {/each}
341
+ </Dropdown>
342
+
343
+ <!-- {/if} -->
344
+ </td>
345
+ {/if}
346
+ {#if showIndex}
347
+ <td class="px-6 py-2">
348
+ {index + 1}
349
+ </td>
350
+ {/if}
351
+ {#each row.cells as cell (cell.id)}
352
+ <Subscribe attrs={cell.attrs()}>
353
+ {#snippet children({ attrs })}
354
+ <td
355
+ {...attrs}
356
+ class="px-6 py-2 text-left text-sm rtl:text-right"
357
+ class:whitespace-nowrap={hideWhiteSpace}
358
+ >
359
+ <Render of={cell.render()} />
360
+ </td>
361
+ {/snippet}
362
+ </Subscribe>
363
+ {/each}
364
+ </tr>
365
+ {/snippet}
366
+ </Subscribe>
367
+ {/each}
368
+ </tbody>
369
+ </table>
370
+ {#if tableBottomContent}
371
+ {@render tableBottomContent?.()}
372
+ {:else if showTableBottomPadding}
373
+ <div class="h-12"></div>
374
+ {/if}
375
+
376
+ {#if !$pageRows.length}
377
+ <div class="flex h-72 w-full items-center justify-center">
378
+ <div class="rounded-md bg-yellow-200 px-6 py-4">No records found</div>
379
+ </div>
380
+ {/if}
381
+ </div>
382
+ </div>
383
+ </div>
384
+
385
+ <style>
386
+ .resizer {
387
+ position: absolute;
388
+ top: 0;
389
+ bottom: 0;
390
+ right: -4px;
391
+ width: 8px;
392
+ background: #6194d9;
393
+ cursor: col-resize;
394
+ z-index: 1;
395
+ }
396
+ </style>