@rkosafo/cai.components 0.0.1 → 0.0.3

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 (255) hide show
  1. package/dist/baseEditor/index.svelte +32 -0
  2. package/dist/baseEditor/index.svelte.d.ts +18 -0
  3. package/dist/builders/filters/FilterBuilder.svelte +638 -0
  4. package/dist/builders/filters/FilterBuilder.svelte.d.ts +4 -0
  5. package/dist/builders/filters/index.d.ts +1 -0
  6. package/dist/builders/filters/index.js +1 -0
  7. package/dist/forms/FormCheckbox/FormCheckbox.svelte +53 -0
  8. package/dist/forms/FormCheckbox/FormCheckbox.svelte.d.ts +4 -0
  9. package/dist/forms/FormCheckbox/index.d.ts +1 -0
  10. package/dist/forms/FormCheckbox/index.js +1 -0
  11. package/dist/forms/FormDatepicker/FormDatepicker.svelte +159 -0
  12. package/dist/forms/FormDatepicker/FormDatepicker.svelte.d.ts +13 -0
  13. package/dist/forms/FormDatepicker/index.d.ts +1 -0
  14. package/dist/forms/FormDatepicker/index.js +1 -0
  15. package/dist/forms/FormInput/FormInput.svelte +87 -0
  16. package/dist/forms/FormInput/FormInput.svelte.d.ts +4 -0
  17. package/dist/forms/FormInput/index.d.ts +1 -0
  18. package/dist/forms/FormInput/index.js +1 -0
  19. package/dist/forms/FormRadio/FormRadio.svelte +53 -0
  20. package/dist/forms/FormRadio/FormRadio.svelte.d.ts +4 -0
  21. package/dist/forms/FormRadio/index.d.ts +1 -0
  22. package/dist/forms/FormRadio/index.js +1 -0
  23. package/dist/forms/FormSelect/FormSelect.svelte +86 -0
  24. package/dist/forms/FormSelect/FormSelect.svelte.d.ts +4 -0
  25. package/dist/forms/FormSelect/index.d.ts +1 -0
  26. package/dist/forms/FormSelect/index.js +1 -0
  27. package/dist/forms/FormTextarea/FormTextarea.svelte +77 -0
  28. package/dist/forms/FormTextarea/FormTextarea.svelte.d.ts +4 -0
  29. package/dist/forms/FormTextarea/index.d.ts +1 -0
  30. package/dist/forms/FormTextarea/index.js +1 -0
  31. package/dist/forms/checkbox/Checkbox.svelte +82 -0
  32. package/dist/forms/checkbox/Checkbox.svelte.d.ts +4 -0
  33. package/dist/forms/checkbox/CheckboxButton.svelte +92 -0
  34. package/dist/forms/checkbox/CheckboxButton.svelte.d.ts +18 -0
  35. package/dist/forms/checkbox/index.d.ts +3 -0
  36. package/dist/forms/checkbox/index.js +3 -0
  37. package/dist/forms/checkbox/theme.d.ts +317 -0
  38. package/dist/forms/checkbox/theme.js +113 -0
  39. package/dist/forms/datepicker/Datepicker.svelte +706 -0
  40. package/dist/forms/datepicker/Datepicker.svelte.d.ts +41 -0
  41. package/dist/forms/datepicker/index.d.ts +2 -0
  42. package/dist/forms/datepicker/index.js +2 -0
  43. package/dist/forms/datepicker/theme.d.ts +385 -0
  44. package/dist/forms/datepicker/theme.js +56 -0
  45. package/dist/forms/form/Form.svelte +69 -0
  46. package/dist/forms/form/Form.svelte.d.ts +6 -0
  47. package/dist/forms/form/index.d.ts +2 -0
  48. package/dist/forms/form/index.js +2 -0
  49. package/dist/forms/input/Input.svelte +363 -0
  50. package/dist/forms/input/Input.svelte.d.ts +4 -0
  51. package/dist/forms/input/index.d.ts +4 -0
  52. package/dist/forms/input/index.js +5 -0
  53. package/dist/forms/input/theme.d.ts +301 -0
  54. package/dist/forms/input/theme.js +100 -0
  55. package/dist/forms/label/Label.svelte +38 -0
  56. package/dist/forms/label/Label.svelte.d.ts +15 -0
  57. package/dist/forms/label/index.d.ts +2 -0
  58. package/dist/forms/label/index.js +2 -0
  59. package/dist/forms/label/theme.d.ts +75 -0
  60. package/dist/forms/label/theme.js +29 -0
  61. package/dist/forms/radio/Radio.svelte +48 -0
  62. package/dist/forms/radio/Radio.svelte.d.ts +25 -0
  63. package/dist/forms/radio/RadioButton.svelte +22 -0
  64. package/dist/forms/radio/RadioButton.svelte.d.ts +25 -0
  65. package/dist/forms/radio/index.d.ts +3 -0
  66. package/dist/forms/radio/index.js +3 -0
  67. package/dist/forms/radio/theme.d.ts +290 -0
  68. package/dist/forms/radio/theme.js +95 -0
  69. package/dist/forms/select/Select.svelte +50 -0
  70. package/dist/forms/select/Select.svelte.d.ts +4 -0
  71. package/dist/forms/select/index.d.ts +1 -0
  72. package/dist/forms/select/index.js +1 -0
  73. package/dist/forms/textarea/Textarea.svelte +165 -0
  74. package/dist/forms/textarea/Textarea.svelte.d.ts +4 -0
  75. package/dist/forms/textarea/index.d.ts +2 -0
  76. package/dist/forms/textarea/index.js +2 -0
  77. package/dist/forms/textarea/theme.d.ts +100 -0
  78. package/dist/forms/textarea/theme.js +35 -0
  79. package/dist/index.d.ts +42 -2
  80. package/dist/index.js +42 -2
  81. package/dist/layout/TF/Content/Content.svelte +28 -0
  82. package/dist/layout/TF/Content/Content.svelte.d.ts +8 -0
  83. package/dist/layout/TF/Content/index.d.ts +1 -0
  84. package/dist/layout/TF/Content/index.js +1 -0
  85. package/dist/layout/TF/Header/Header.svelte +159 -0
  86. package/dist/layout/TF/Header/Header.svelte.d.ts +21 -0
  87. package/dist/layout/TF/Header/index.d.ts +1 -0
  88. package/dist/layout/TF/Header/index.js +1 -0
  89. package/dist/layout/TF/Sidebar/Sidebar.svelte +74 -0
  90. package/dist/layout/TF/Sidebar/Sidebar.svelte.d.ts +23 -0
  91. package/dist/layout/TF/Sidebar/index.d.ts +1 -0
  92. package/dist/layout/TF/Sidebar/index.js +1 -0
  93. package/dist/layout/TF/Wrapper/Wrapper.svelte +17 -0
  94. package/dist/layout/TF/Wrapper/Wrapper.svelte.d.ts +8 -0
  95. package/dist/layout/TF/Wrapper/index.d.ts +1 -0
  96. package/dist/layout/TF/Wrapper/index.js +1 -0
  97. package/dist/layout/TF/index.d.ts +5 -0
  98. package/dist/layout/TF/index.js +5 -0
  99. package/dist/themes/ThemeProvider.svelte +20 -0
  100. package/dist/themes/ThemeProvider.svelte.d.ts +9 -0
  101. package/dist/themes/index.d.ts +7 -0
  102. package/dist/themes/index.js +1 -0
  103. package/dist/themes/themeUtils.d.ts +24 -0
  104. package/dist/themes/themeUtils.js +74 -0
  105. package/dist/themes/themes.d.ts +18 -0
  106. package/dist/themes/themes.js +18 -0
  107. package/dist/types/index.d.ts +755 -0
  108. package/dist/types/index.js +1 -0
  109. package/dist/typography/heading/Heading.svelte +35 -0
  110. package/dist/typography/heading/Heading.svelte.d.ts +10 -0
  111. package/dist/typography/heading/index.d.ts +2 -0
  112. package/dist/typography/heading/index.js +2 -0
  113. package/dist/typography/heading/theme.d.ts +30 -0
  114. package/dist/typography/heading/theme.js +17 -0
  115. package/dist/ui/accordion/Accordion.svelte +49 -0
  116. package/dist/ui/accordion/Accordion.svelte.d.ts +4 -0
  117. package/dist/ui/accordion/AccordionItem.svelte +173 -0
  118. package/dist/ui/accordion/AccordionItem.svelte.d.ts +4 -0
  119. package/dist/ui/accordion/index.d.ts +3 -0
  120. package/dist/ui/accordion/index.js +3 -0
  121. package/dist/ui/accordion/theme.d.ts +96 -0
  122. package/dist/ui/accordion/theme.js +59 -0
  123. package/dist/ui/alert/Alert.svelte +83 -0
  124. package/dist/ui/alert/Alert.svelte.d.ts +5 -0
  125. package/dist/ui/alert/index.d.ts +2 -0
  126. package/dist/ui/alert/index.js +2 -0
  127. package/dist/ui/alert/theme.d.ts +108 -0
  128. package/dist/ui/alert/theme.js +149 -0
  129. package/dist/ui/alertDialog/AlertDialog.svelte +40 -0
  130. package/dist/ui/alertDialog/AlertDialog.svelte.d.ts +4 -0
  131. package/dist/ui/alertDialog/index.d.ts +1 -0
  132. package/dist/ui/alertDialog/index.js +1 -0
  133. package/dist/ui/avatar/Avatar.svelte +77 -0
  134. package/dist/ui/avatar/Avatar.svelte.d.ts +4 -0
  135. package/dist/ui/avatar/index.d.ts +2 -0
  136. package/dist/ui/avatar/index.js +2 -0
  137. package/dist/ui/avatar/theme.d.ts +63 -0
  138. package/dist/ui/avatar/theme.js +31 -0
  139. package/dist/ui/buttons/Button.svelte +102 -0
  140. package/dist/ui/buttons/Button.svelte.d.ts +4 -0
  141. package/dist/ui/buttons/GradientButton.svelte +59 -0
  142. package/dist/ui/buttons/GradientButton.svelte.d.ts +4 -0
  143. package/dist/ui/buttons/index.d.ts +3 -0
  144. package/dist/ui/buttons/index.js +3 -0
  145. package/dist/ui/buttons/theme.d.ts +704 -0
  146. package/dist/ui/buttons/theme.js +332 -0
  147. package/dist/ui/datatable/Datatable.svelte +516 -0
  148. package/dist/ui/datatable/Datatable.svelte.d.ts +5 -0
  149. package/dist/ui/datatable/index.d.ts +2 -0
  150. package/dist/ui/datatable/index.js +2 -0
  151. package/dist/ui/drawer/Drawer.svelte +280 -0
  152. package/dist/ui/drawer/Drawer.svelte.d.ts +37 -0
  153. package/dist/ui/drawer/index.d.ts +2 -0
  154. package/dist/ui/drawer/index.js +2 -0
  155. package/dist/ui/drawer/theme.d.ts +211 -0
  156. package/dist/ui/drawer/theme.js +46 -0
  157. package/dist/ui/dropdown/Dropdown.svelte +36 -0
  158. package/dist/ui/dropdown/Dropdown.svelte.d.ts +4 -0
  159. package/dist/ui/dropdown/DropdownDivider.svelte +11 -0
  160. package/dist/ui/dropdown/DropdownDivider.svelte.d.ts +4 -0
  161. package/dist/ui/dropdown/DropdownGroup.svelte +14 -0
  162. package/dist/ui/dropdown/DropdownGroup.svelte.d.ts +4 -0
  163. package/dist/ui/dropdown/DropdownHeader.svelte +14 -0
  164. package/dist/ui/dropdown/DropdownHeader.svelte.d.ts +4 -0
  165. package/dist/ui/dropdown/DropdownItem.svelte +52 -0
  166. package/dist/ui/dropdown/DropdownItem.svelte.d.ts +4 -0
  167. package/dist/ui/dropdown/index.d.ts +6 -0
  168. package/dist/ui/dropdown/index.js +6 -0
  169. package/dist/ui/dropdown/theme.d.ts +55 -0
  170. package/dist/ui/dropdown/theme.js +20 -0
  171. package/dist/ui/footer/Footer.svelte +15 -0
  172. package/dist/ui/footer/Footer.svelte.d.ts +4 -0
  173. package/dist/ui/footer/FooterBrand.svelte +37 -0
  174. package/dist/ui/footer/FooterBrand.svelte.d.ts +4 -0
  175. package/dist/ui/footer/FooterCopyright.svelte +45 -0
  176. package/dist/ui/footer/FooterCopyright.svelte.d.ts +4 -0
  177. package/dist/ui/footer/FooterIcon.svelte +22 -0
  178. package/dist/ui/footer/FooterIcon.svelte.d.ts +4 -0
  179. package/dist/ui/footer/FooterLink.svelte +33 -0
  180. package/dist/ui/footer/FooterLink.svelte.d.ts +4 -0
  181. package/dist/ui/footer/FooterLinkGroup.svelte +13 -0
  182. package/dist/ui/footer/FooterLinkGroup.svelte.d.ts +4 -0
  183. package/dist/ui/footer/index.d.ts +7 -0
  184. package/dist/ui/footer/index.js +7 -0
  185. package/dist/ui/footer/theme.d.ts +137 -0
  186. package/dist/ui/footer/theme.js +39 -0
  187. package/dist/ui/indicator/Indicator.svelte +42 -0
  188. package/dist/ui/indicator/Indicator.svelte.d.ts +4 -0
  189. package/dist/ui/indicator/index.d.ts +2 -0
  190. package/dist/ui/indicator/index.js +2 -0
  191. package/dist/ui/indicator/theme.d.ts +177 -0
  192. package/dist/ui/indicator/theme.js +114 -0
  193. package/dist/ui/modal/Modal.svelte +265 -0
  194. package/dist/ui/modal/Modal.svelte.d.ts +38 -0
  195. package/dist/ui/modal/index.d.ts +2 -0
  196. package/dist/ui/modal/index.js +2 -0
  197. package/dist/ui/modal/theme.d.ts +190 -0
  198. package/dist/ui/modal/theme.js +41 -0
  199. package/dist/ui/notificationList/NotificationList.svelte +123 -0
  200. package/dist/ui/notificationList/NotificationList.svelte.d.ts +25 -0
  201. package/dist/ui/notificationList/index.d.ts +1 -0
  202. package/dist/ui/notificationList/index.js +1 -0
  203. package/dist/ui/pageLoader/PageLoader.svelte +10 -0
  204. package/dist/ui/pageLoader/PageLoader.svelte.d.ts +4 -0
  205. package/dist/ui/pageLoader/index.d.ts +1 -0
  206. package/dist/ui/pageLoader/index.js +1 -0
  207. package/dist/ui/paginate/Paginate.svelte +96 -0
  208. package/dist/ui/paginate/Paginate.svelte.d.ts +4 -0
  209. package/dist/ui/paginate/index.d.ts +1 -0
  210. package/dist/ui/paginate/index.js +1 -0
  211. package/dist/ui/tab/Tab.svelte +65 -0
  212. package/dist/ui/tab/Tab.svelte.d.ts +4 -0
  213. package/dist/ui/tab/index.d.ts +2 -0
  214. package/dist/ui/tab/index.js +2 -0
  215. package/dist/ui/tab/theme.d.ts +135 -0
  216. package/dist/ui/tab/theme.js +83 -0
  217. package/dist/ui/table/Table.svelte +385 -0
  218. package/dist/ui/table/Table.svelte.d.ts +4 -0
  219. package/dist/ui/table/index.d.ts +1 -0
  220. package/dist/ui/table/index.js +1 -0
  221. package/dist/ui/tableLoader/TableLoader.svelte +24 -0
  222. package/dist/ui/tableLoader/TableLoader.svelte.d.ts +13 -0
  223. package/dist/ui/tableLoader/index.d.ts +1 -0
  224. package/dist/ui/tableLoader/index.js +1 -0
  225. package/dist/ui/toolbar/Toolbar.svelte +59 -0
  226. package/dist/ui/toolbar/Toolbar.svelte.d.ts +17 -0
  227. package/dist/ui/toolbar/ToolbarButton.svelte +56 -0
  228. package/dist/ui/toolbar/ToolbarButton.svelte.d.ts +17 -0
  229. package/dist/ui/toolbar/ToolbarGroup.svelte +43 -0
  230. package/dist/ui/toolbar/ToolbarGroup.svelte.d.ts +16 -0
  231. package/dist/ui/toolbar/index.d.ts +4 -0
  232. package/dist/ui/toolbar/index.js +4 -0
  233. package/dist/ui/toolbar/theme.d.ts +320 -0
  234. package/dist/ui/toolbar/theme.js +155 -0
  235. package/dist/utils/Popper.svelte +257 -0
  236. package/dist/utils/Popper.svelte.d.ts +4 -0
  237. package/dist/utils/action.d.ts +16 -0
  238. package/dist/utils/action.js +107 -0
  239. package/dist/utils/closeButton/CloseButton.svelte +88 -0
  240. package/dist/utils/closeButton/CloseButton.svelte.d.ts +12 -0
  241. package/dist/utils/closeButton/index.d.ts +2 -0
  242. package/dist/utils/closeButton/index.js +2 -0
  243. package/dist/utils/closeButton/theme.d.ts +100 -0
  244. package/dist/utils/closeButton/theme.js +69 -0
  245. package/dist/utils/dismissable.d.ts +9 -0
  246. package/dist/utils/dismissable.js +16 -0
  247. package/dist/utils/index.d.ts +8 -0
  248. package/dist/utils/index.js +35 -0
  249. package/dist/utils/paginate.svelte.d.ts +22 -0
  250. package/dist/utils/paginate.svelte.js +167 -0
  251. package/dist/utils/singleSelection.svelte.d.ts +15 -0
  252. package/dist/utils/singleSelection.svelte.js +49 -0
  253. package/dist/utils/svelte-legos.d.ts +7 -0
  254. package/dist/utils/svelte-legos.js +14 -0
  255. package/package.json +24 -2
@@ -0,0 +1,516 @@
1
+ <script lang="ts" module>
2
+ export function refetchDatatable(params?: TableFilter) {
3
+ window.dispatchEvent(
4
+ new CustomEvent('reFetchTableData', {
5
+ detail: params
6
+ })
7
+ );
8
+ }
9
+ </script>
10
+
11
+ <script lang="ts">
12
+ import { goto } from '$app/navigation';
13
+ import { page } from '$app/state';
14
+ import {
15
+ AlertDialog,
16
+ Button,
17
+ Datepicker,
18
+ Drawer,
19
+ extractQueryParam,
20
+ Input,
21
+ loadFromLocalStorage,
22
+ Paginate,
23
+ saveToLocalStorage,
24
+ Select,
25
+ Table,
26
+ TableLoader,
27
+ type DatatableProps,
28
+ type IFormChangeProp,
29
+ type TableFilter
30
+ } from '../../index.js';
31
+ import { PageInfo } from '../../utils/paginate.svelte.js';
32
+ import debounce from 'lodash/debounce';
33
+ import { onMount } from 'svelte';
34
+ import { writable } from 'svelte/store';
35
+ import { slide } from 'svelte/transition';
36
+
37
+ let {
38
+ persitFiltersToUrl = false,
39
+ showTopActionsBackground = true,
40
+ fillSpace = true,
41
+ onAfterAction,
42
+ hideSearchBox = false,
43
+ showAdd = true,
44
+ addButtonLabel = 'Add New',
45
+ searchPlaceholder = 'Search...',
46
+ addNewHeading = 'Add New Record',
47
+ updateHeading = 'Update',
48
+ headerColor = 'blue',
49
+ newRecord = {},
50
+ query = $bindable(''),
51
+ hiddenColumns = [],
52
+ customFilterValues = {},
53
+ onAddNew,
54
+ busy = false,
55
+ showFilterDateRange = false,
56
+ loadingBodySize = 10,
57
+ loadingHeaderSize = 6,
58
+ allowLoadAfterCreate = true,
59
+ allowDispatchAfterAction = false,
60
+ modalSize = 'md',
61
+ take = 15,
62
+ onActionClicked,
63
+ onRowClicked,
64
+ onView,
65
+ onEdit,
66
+ onDelete,
67
+ editor,
68
+ customFilter,
69
+ read = $bindable((skip?: number, take?: number, filter?: TableFilter<any>) => {
70
+ return null;
71
+ }),
72
+ updateEntry = (x: any) => {
73
+ return null;
74
+ },
75
+ createEntry = async (x: any) => {
76
+ return { success: false, data: null, error: null } as any;
77
+ },
78
+ deleteEntry = async (id: string | number) => {
79
+ return { success: false, data: null, error: null } as any;
80
+ },
81
+ ...otherProps
82
+ }: DatatableProps = $props();
83
+
84
+ const PAGE_SIZE_KEY = 'customTablePageSize';
85
+ let editorHeading = $state('');
86
+ let hideForm = $state(true);
87
+ let editing = $state(false);
88
+ let activeEntry = $state<any>({});
89
+ let pageInfo = new PageInfo();
90
+ const rangeDate = $derived(getRange());
91
+ let allColumns = $state(writable<any>([]));
92
+ let pathname = $state('');
93
+ let search = $state('');
94
+ let pageNumber = $state(0);
95
+ let searchParams = $state<any>(null);
96
+ let showAlert = $state(false);
97
+ let tableData = $state<any[]>([]);
98
+ let isLoading = $state(false);
99
+ let deleteLoading = $state(false);
100
+ let isValid = $state(false);
101
+ let viewing = $state(false);
102
+
103
+ function addNew() {
104
+ if (onAddNew) {
105
+ onAddNew();
106
+ return;
107
+ }
108
+ editorHeading = addNewHeading;
109
+ activeEntry = (newRecord && { ...newRecord }) || null;
110
+ editing = false;
111
+ hideForm = false;
112
+ viewing = false;
113
+ }
114
+
115
+ async function fetchData(page: number, params: TableFilter) {
116
+ try {
117
+ let currentPage = 0;
118
+ busy = true;
119
+ if (params.search) {
120
+ pageInfo.setCurrentPage(1);
121
+ currentPage = pageInfo.currentPage;
122
+ } else {
123
+ currentPage = page || pageInfo.currentPage;
124
+ }
125
+ let newParams: any = {
126
+ page: currentPage,
127
+ pageSize: pageInfo.pageSize,
128
+ search: params.search ?? '',
129
+ filter: params.filter ?? {},
130
+ order: params.order ?? []
131
+ };
132
+ const ret = await read(newParams.page, newParams.pageSize, {
133
+ ...params,
134
+ filter: { ...customFilterValues },
135
+ search: newParams.search ?? ''
136
+ });
137
+ if (!ret?.success) {
138
+ // showError(ret?.message || 'Failed to load data');
139
+ return true;
140
+ }
141
+ const xs = ret.data;
142
+ // console.log({xs})
143
+ pageInfo.totalItems = xs.totalCount;
144
+ pageInfo.setHasNextPage(xs.pageInfo.hasNextPage);
145
+ pageInfo.setHasPrevPage(xs.pageInfo.hasPreviousPage);
146
+ tableData = xs.items;
147
+ } catch (e: any) {
148
+ // showError(e.message || e);
149
+ } finally {
150
+ busy = false;
151
+ }
152
+ }
153
+
154
+ const debouncedSearch = debounce(fetchData, 300);
155
+
156
+ function onSearchChange(e: Event) {
157
+ const target = e.target as HTMLInputElement | null;
158
+ const value = target ? target.value : '';
159
+ debouncedSearch(pageNumber, { search: value });
160
+ }
161
+
162
+ function getRange() {
163
+ return { from: undefined, to: undefined };
164
+ }
165
+ function handleDateRangeChange(e) {
166
+ console.log({ e });
167
+ }
168
+
169
+ async function handlePageSize(val: number) {
170
+ pageInfo.setPageSize(val);
171
+ await fetchData(pageInfo.currentPage, { search: query });
172
+
173
+ saveToLocalStorage(PAGE_SIZE_KEY, { pageSize: val });
174
+ }
175
+
176
+ async function getMore() {
177
+ if (pageInfo.gotoNext()) {
178
+ const value = pageInfo.currentPage;
179
+ if (persitFiltersToUrl) {
180
+ const current = new URLSearchParams(Array.from(searchParams.entries()) as any);
181
+
182
+ if (!value) {
183
+ current.delete('page');
184
+ } else {
185
+ current.set('page', String(value));
186
+ }
187
+
188
+ const search = current.toString();
189
+ const page = search ? `?${search}` : '';
190
+ await goto(`${pathname}${page}`);
191
+ }
192
+ await fetchData(value, { search: query });
193
+ }
194
+ }
195
+
196
+ async function getLess() {
197
+ if (pageInfo.gotoPrev()) {
198
+ const value = pageInfo.currentPage;
199
+ if (persitFiltersToUrl) {
200
+ const current = new URLSearchParams(Array.from(searchParams.entries()) as any);
201
+ if (!value) {
202
+ current.delete('page');
203
+ } else {
204
+ current.set('page', String(value));
205
+ }
206
+ const search = current.toString();
207
+ const page = search ? `?${search}` : '';
208
+ await goto(`${pathname}${page}`);
209
+ }
210
+ await fetchData(value, { search: query });
211
+ }
212
+ }
213
+
214
+ function handleExternalFetch(event: CustomEvent) {
215
+ const { page: customPage, params: customParams } = event.detail || {};
216
+ const fetchPage = customPage !== undefined ? customPage : pageNumber;
217
+ const fetchParams = customParams || { search: query };
218
+
219
+ fetchData(fetchPage, fetchParams);
220
+ }
221
+
222
+ function handleEdit(val: any) {
223
+ if (onEdit) {
224
+ onEdit(val);
225
+ return;
226
+ }
227
+ activeEntry = val;
228
+ editorHeading = updateHeading;
229
+ editing = true;
230
+ hideForm = false;
231
+ viewing = false;
232
+ }
233
+ function handleView(val: any) {
234
+ if (onView) {
235
+ onView(val);
236
+ return;
237
+ }
238
+ activeEntry = val;
239
+ editorHeading = 'View Record';
240
+ editing = true;
241
+ hideForm = false;
242
+ viewing = true;
243
+ }
244
+
245
+ function handleRowClicked(val: any) {
246
+ if (onRowClicked) {
247
+ onRowClicked(val);
248
+ return;
249
+ }
250
+ activeEntry = val;
251
+ editorHeading = addNewHeading;
252
+ editing = true;
253
+ hideForm = false;
254
+ }
255
+ function handleDelete(val: any) {
256
+ if (onDelete) {
257
+ onDelete(val);
258
+ return;
259
+ }
260
+ activeEntry = val;
261
+ showAlert = true;
262
+ // editorHeading = updateHeading;
263
+ // editing = true;
264
+ // hideForm = true;
265
+ }
266
+
267
+ function closeSideModal() {
268
+ hideForm = true;
269
+ activeEntry = null;
270
+ viewing = false;
271
+ }
272
+
273
+ async function handleAction({ action, data }: { action: string; data: FormData }) {
274
+ let formData = Object.fromEntries(data.entries());
275
+
276
+ try {
277
+ isLoading = true;
278
+ const ret = editing
279
+ ? await updateEntry({ ...formData, id: activeEntry.id })
280
+ : await createEntry(formData);
281
+
282
+ if (ret?.success) {
283
+ const successMessage = allowLoadAfterCreate
284
+ ? editing
285
+ ? 'Successfully updated record'
286
+ : 'Successfully added record'
287
+ : '';
288
+ // showSuccess(ret.message || successMessage);
289
+ allowLoadAfterCreate && (await fetchData(pageNumber, { search: query }));
290
+
291
+ allowDispatchAfterAction &&
292
+ onAfterAction &&
293
+ onAfterAction({ type: 'create', values: formData, data: ret.data });
294
+
295
+ hideForm = true;
296
+ activeEntry = {};
297
+ closeSideModal();
298
+ } else {
299
+ // showError(ret.message);
300
+ }
301
+ } catch (error) {
302
+ // showError(ret.message);
303
+ } finally {
304
+ isLoading = false;
305
+ }
306
+ }
307
+
308
+ function closeAlert() {
309
+ activeEntry = {};
310
+ if (showAlert) showAlert = false;
311
+ if (deleteLoading) deleteLoading = false;
312
+ }
313
+
314
+ async function doDelete(id: string) {
315
+ try {
316
+ deleteLoading = true;
317
+ const ret = await deleteEntry(id);
318
+ if (!ret?.success) {
319
+ // showError(ret.message);
320
+ return;
321
+ }
322
+ // showSuccess(ret.message);
323
+ closeAlert();
324
+ await fetchData(pageNumber, { search: query });
325
+ } catch (error: any) {
326
+ // showError(error?.message || error);
327
+ } finally {
328
+ deleteLoading = false;
329
+ }
330
+ }
331
+
332
+ function handleFormChange(val: IFormChangeProp<any>) {
333
+ const { values, isValid: validForm } = val;
334
+ isValid = validForm;
335
+ }
336
+
337
+ $effect(() => {
338
+ searchParams = page.url.searchParams;
339
+ search = page.url.search;
340
+ pathname = page.url.pathname;
341
+
342
+ pageNumber = extractQueryParam(page.url.search, 'page')
343
+ ? Number(extractQueryParam(page.url.search, 'page'))
344
+ : pageInfo.currentPage;
345
+ });
346
+
347
+ onMount(() => {
348
+ const res = loadFromLocalStorage<{ pageSize: string }>(PAGE_SIZE_KEY);
349
+ if (res?.pageSize) {
350
+ pageInfo.setPageSize(Number(res?.pageSize));
351
+ } else {
352
+ pageInfo.setPageSize(take);
353
+ }
354
+
355
+ if (pageNumber) {
356
+ pageInfo.setCurrentPage(pageNumber);
357
+ fetchData(pageNumber, { search: query });
358
+ } else {
359
+ fetchData(pageInfo.currentPage, { search: query });
360
+ }
361
+
362
+ // Listen for custom event from parent
363
+ window.addEventListener('reFetchTableData', handleExternalFetch as EventListener);
364
+
365
+ // Cleanup on destroy
366
+ return () => {
367
+ window.removeEventListener('reFetchTableData', handleExternalFetch as EventListener);
368
+ };
369
+ });
370
+ </script>
371
+
372
+ <div class="flex h-full w-full flex-col gap-2">
373
+ <div
374
+ class="flex w-full flex-col gap-2"
375
+ class:custom-container={!fillSpace}
376
+ class:px-4={fillSpace}
377
+ class:table-background={showTopActionsBackground}
378
+ class:py-2={!showTopActionsBackground}
379
+ >
380
+ <div class="flex w-full flex-col gap-2 sm:justify-between lg:flex-row lg:items-center">
381
+ <div class="flex w-full flex-col gap-2 sm:flex-row">
382
+ <div class:hidden={hideSearchBox} class="w-full lg:max-w-lg">
383
+ <Input
384
+ value={query}
385
+ oninput={onSearchChange}
386
+ placeholder={searchPlaceholder}
387
+ class="h-9.5 ps-8"
388
+ >
389
+ {#snippet left()}
390
+ <iconify-icon icon="eva:search-outline" class="text-xl text-gray-500"></iconify-icon>
391
+ {/snippet}
392
+ </Input>
393
+ </div>
394
+ <div class:hidden={!showFilterDateRange} class="w-full sm:max-w-60">
395
+ <Datepicker
396
+ placeholder="Date Range"
397
+ onselect={handleDateRangeChange}
398
+ range
399
+ rangeFrom={rangeDate.from}
400
+ rangeTo={rangeDate.to}
401
+ />
402
+ </div>
403
+ </div>
404
+
405
+ <div class="flex shrink-0 flex-col gap-4 sm:flex-row sm:items-center">
406
+ <div class="flex items-center gap-2">
407
+ <div class="text-sm">Page Size</div>
408
+ <Select
409
+ value={pageInfo.pageSize}
410
+ clearable={false}
411
+ searchable={false}
412
+ options={[
413
+ { value: 15, label: '15' },
414
+ { value: 20, label: '20' },
415
+ { value: 25, label: '25' },
416
+ { value: 30, label: '30' },
417
+ { value: 40, label: '40' },
418
+ { value: 45, label: '45' },
419
+ { value: 50, label: '50' },
420
+ { value: 100, label: '100' }
421
+ ]}
422
+ placeholder="15"
423
+ onChange={(e) => {
424
+ const { value } = e;
425
+ handlePageSize(value);
426
+ }}
427
+ />
428
+ </div>
429
+ <div>
430
+ <Paginate
431
+ onNextPage={getMore}
432
+ onPreviousPage={getLess}
433
+ currentPage={pageInfo.currentPage}
434
+ totalPages={pageInfo.totalPages}
435
+ hasNextPage={pageInfo.hasNextPage}
436
+ hasPreviousPage={pageInfo.hasPrevPage}
437
+ recordCount={pageInfo.totalItems}
438
+ refresh={() => {
439
+ fetchData(pageNumber, { search: query });
440
+ }}
441
+ tableColumns={$allColumns}
442
+ bind:hiddenColumns
443
+ />
444
+ </div>
445
+ <div class:hidden={!showAdd} class="shrink-0">
446
+ <Button onclick={addNew}>{addButtonLabel}</Button>
447
+ </div>
448
+ </div>
449
+ </div>
450
+ </div>
451
+ <div class:custom-container={!fillSpace} class="flex h-full w-full flex-col gap-2">
452
+ {@render customFilter?.({
453
+ pageSize: pageInfo.pageSize ?? 0,
454
+ currentPage: pageInfo.currentPage ?? 0,
455
+ search: query ?? ''
456
+ })}
457
+ {#if busy}
458
+ <TableLoader bodySize={loadingBodySize} headerSize={loadingHeaderSize} />
459
+ {:else}
460
+ <div class="h-full w-full flex-grow overflow-y-auto">
461
+ <Table
462
+ data={tableData}
463
+ {headerColor}
464
+ bind:hiddenColumns
465
+ onEdit={handleEdit}
466
+ onView={handleView}
467
+ onDelete={handleDelete}
468
+ onRowClicked={handleRowClicked}
469
+ {onActionClicked}
470
+ handleCheckbox={(val) => {}}
471
+ {...otherProps}
472
+ />
473
+ </div>
474
+ {/if}
475
+ </div>
476
+ </div>
477
+
478
+ <Drawer
479
+ bind:hidden={hideForm}
480
+ placement="right"
481
+ activateClickOutside={false}
482
+ title={editorHeading}
483
+ size={modalSize}
484
+ onclose={closeSideModal}
485
+ form
486
+ transitionType={slide}
487
+ transitionParams={{
488
+ duration: 300,
489
+ axis: 'x'
490
+ }}
491
+ onaction={handleAction}
492
+ >
493
+ {@render editor?.({
494
+ recordId: activeEntry.id,
495
+ data: activeEntry,
496
+ onChange: handleFormChange as any,
497
+ readonly: viewing
498
+ })}
499
+
500
+ {#snippet footer()}
501
+ {#if !viewing}
502
+ <Button disabled={!isValid} loading={isLoading} type="submit" class="w-full" value="submit"
503
+ >Submit</Button
504
+ >
505
+ {/if}
506
+ {/snippet}
507
+ </Drawer>
508
+
509
+ <AlertDialog
510
+ bind:open={showAlert}
511
+ message="Are you sure you want to delete this?"
512
+ icon="ion:trash"
513
+ onCancel={closeAlert}
514
+ busy={deleteLoading}
515
+ onYes={() => doDelete(activeEntry?.id)}
516
+ />
@@ -0,0 +1,5 @@
1
+ export declare function refetchDatatable(params?: TableFilter): void;
2
+ import { type DatatableProps, type TableFilter } from '../../index.js';
3
+ declare const Datatable: import("svelte").Component<DatatableProps<any>, {}, "query" | "read">;
4
+ type Datatable = ReturnType<typeof Datatable>;
5
+ export default Datatable;
@@ -0,0 +1,2 @@
1
+ export { default as Datatable } from './Datatable.svelte';
2
+ export { refetchDatatable } from './Datatable.svelte';
@@ -0,0 +1,2 @@
1
+ export { default as Datatable } from './Datatable.svelte';
2
+ export { refetchDatatable } from './Datatable.svelte';