@rkosafo/cai.components 0.0.78 → 0.0.80

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 (103) 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 -119
  13. package/dist/forms/button-toggle/CheckIcon.svelte +28 -28
  14. package/dist/forms/checkbox/Checkbox.svelte +82 -82
  15. package/dist/forms/checkbox/CheckboxButton.svelte +92 -92
  16. package/dist/forms/datepicker/Datepicker.svelte +707 -707
  17. package/dist/forms/form/Form.svelte +69 -69
  18. package/dist/forms/input/Input.svelte +363 -363
  19. package/dist/forms/label/Label.svelte +38 -38
  20. package/dist/forms/radio/Radio.svelte +48 -48
  21. package/dist/forms/radio/RadioButton.svelte +22 -22
  22. package/dist/forms/select/Select.svelte +56 -56
  23. package/dist/forms/textarea/Textarea.svelte +165 -165
  24. package/dist/forms/toggle/Toggle.svelte +70 -70
  25. package/dist/layout/Chat/CategorySelector.svelte +52 -52
  26. package/dist/layout/Chat/ChatEntry.svelte +246 -246
  27. package/dist/layout/Chat/ChatEntrySkeleton.svelte +81 -81
  28. package/dist/layout/Chat/ChatHeader.svelte +172 -172
  29. package/dist/layout/Chat/ChatInput.svelte +207 -207
  30. package/dist/layout/Chat/DraggableWindow.svelte +230 -230
  31. package/dist/layout/Chat/PreviewPage.svelte +182 -182
  32. package/dist/layout/Chat/RichText.svelte +216 -216
  33. package/dist/layout/ComponentCanvas/Canvas.svelte +40 -40
  34. package/dist/layout/ComponentCanvas/ComponentRenderer.svelte +85 -85
  35. package/dist/layout/TF/Content/Content.svelte +21 -21
  36. package/dist/layout/TF/Header/Header.svelte +166 -166
  37. package/dist/layout/TF/Sidebar/Sidebar.svelte +148 -148
  38. package/dist/layout/TF/Wrapper/Wrapper.svelte +17 -17
  39. package/dist/layout/mailing/MailPaginator.svelte +36 -36
  40. package/dist/layout/mailing/MailSidebar.svelte +39 -39
  41. package/dist/layout/mailing/MailToolBar.svelte +174 -174
  42. package/dist/layout/mailing/MailingContent.svelte +10 -10
  43. package/dist/layout/mailing/MailingHeader.svelte +55 -55
  44. package/dist/layout/mailing/MailingMessageCard.svelte +112 -112
  45. package/dist/layout/mailing/MailingMessageViewer.svelte +87 -87
  46. package/dist/layout/mailing/MailingModule.svelte +448 -448
  47. package/dist/styles/docs.css +615 -615
  48. package/dist/styles/tf-layout.css +185 -185
  49. package/dist/themes/ThemeProvider.svelte +20 -20
  50. package/dist/types/index.d.ts +2 -0
  51. package/dist/typography/heading/Heading.svelte +35 -35
  52. package/dist/ui/accordion/Accordion.svelte +49 -49
  53. package/dist/ui/accordion/AccordionItem.svelte +173 -173
  54. package/dist/ui/alert/Alert.svelte +83 -83
  55. package/dist/ui/alertDialog/AlertDialog.svelte +40 -40
  56. package/dist/ui/avatar/Avatar.svelte +77 -77
  57. package/dist/ui/box/Box.svelte +28 -28
  58. package/dist/ui/breadcrumb/Breadcrumb.svelte +39 -39
  59. package/dist/ui/buttons/ActionButton.svelte +234 -234
  60. package/dist/ui/buttons/Button.svelte +102 -102
  61. package/dist/ui/buttons/GradientButton.svelte +59 -59
  62. package/dist/ui/datatable/Datatable.svelte +525 -525
  63. package/dist/ui/drawer/Drawer.svelte +300 -300
  64. package/dist/ui/dropdown/Dropdown.svelte +36 -36
  65. package/dist/ui/dropdown/DropdownDivider.svelte +11 -11
  66. package/dist/ui/dropdown/DropdownGroup.svelte +14 -14
  67. package/dist/ui/dropdown/DropdownHeader.svelte +14 -14
  68. package/dist/ui/dropdown/DropdownItem.svelte +52 -52
  69. package/dist/ui/footer/Footer.svelte +15 -15
  70. package/dist/ui/footer/FooterBrand.svelte +37 -37
  71. package/dist/ui/footer/FooterCopyright.svelte +45 -45
  72. package/dist/ui/footer/FooterIcon.svelte +22 -22
  73. package/dist/ui/footer/FooterLink.svelte +33 -33
  74. package/dist/ui/footer/FooterLinkGroup.svelte +13 -13
  75. package/dist/ui/icons/IconifyIcon.svelte +7 -7
  76. package/dist/ui/indicator/Indicator.svelte +42 -42
  77. package/dist/ui/modal/Modal.svelte +265 -265
  78. package/dist/ui/notificationList/NotificationList.svelte +123 -123
  79. package/dist/ui/pageLoader/PageLoader.svelte +14 -14
  80. package/dist/ui/pageLoader/PageLoader2.svelte +99 -0
  81. package/dist/ui/pageLoader/PageLoader2.svelte.d.ts +24 -0
  82. package/dist/ui/pageLoader/index.d.ts +2 -1
  83. package/dist/ui/pageLoader/index.js +2 -1
  84. package/dist/ui/paginate/Paginate.svelte +96 -96
  85. package/dist/ui/speedDial/SpeedDial.svelte +77 -77
  86. package/dist/ui/speedDial/SpeedDialButton.svelte +75 -75
  87. package/dist/ui/speedDial/SpeedDialTrigger.svelte +79 -79
  88. package/dist/ui/tab/Tab.svelte +93 -67
  89. package/dist/ui/table/Table.svelte +396 -396
  90. package/dist/ui/tableLoader/TableLoader.svelte +24 -24
  91. package/dist/ui/toast/Toast.svelte +337 -337
  92. package/dist/ui/toast/Toast.svelte.d.ts +10 -10
  93. package/dist/ui/toolbar/Toolbar.svelte +59 -59
  94. package/dist/ui/toolbar/ToolbarButton.svelte +56 -56
  95. package/dist/ui/toolbar/ToolbarGroup.svelte +43 -43
  96. package/dist/ui/tooltip/Tooltip.svelte +51 -51
  97. package/dist/utils/Popper.svelte +257 -257
  98. package/dist/utils/closeButton/CloseButton.svelte +88 -88
  99. package/dist/utils/index.d.ts +2 -2
  100. package/dist/utils/index.js +3 -3
  101. package/dist/utils/singleSelection.svelte.js +48 -48
  102. package/dist/youtube/index.svelte +12 -12
  103. package/package.json +1 -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>