@dashadmin/dash-app-common 1.3.25 → 1.3.26

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 (165) hide show
  1. package/dist/DashApp.js +176 -1
  2. package/dist/DashAppLoader.js +348 -3
  3. package/dist/DashDefaultResources.js +10 -1
  4. package/dist/components/DashDefaultPrivateApp.js +150 -1
  5. package/dist/components/DashDefaultPrivateResources.js +10 -1
  6. package/dist/components/DashDefaultPublicApp.js +20 -1
  7. package/dist/components/DashResourceLoader.js +245 -1
  8. package/dist/defaults/extensions/bootstrap/DashDefaultErrorBoundary.js +78 -1
  9. package/dist/defaults/extensions/bootstrap/dashDefaultInitializeApp.js +59 -1
  10. package/dist/defaults/extensions/bootstrap/index.js +24 -1
  11. package/dist/defaults/extensions/components/DashDefaultLoader.js +43 -2
  12. package/dist/defaults/extensions/components/dashDefaultAutoAdminComponents.js +67 -1
  13. package/dist/defaults/extensions/components/dashDefaultNotification.js +28 -1
  14. package/dist/defaults/extensions/components/dashDefaultStaticComponents.js +15 -1
  15. package/dist/defaults/extensions/components/index.js +13 -1
  16. package/dist/defaults/extensions/electron/dashDefaultIpcListeners.js +38 -1
  17. package/dist/defaults/extensions/electron/index.js +5 -1
  18. package/dist/defaults/extensions/hooks/index.js +12 -1
  19. package/dist/defaults/extensions/hooks/useDashDefaultLazyAutoAdminComponents.js +17 -1
  20. package/dist/defaults/extensions/hooks/useDashDefaultLazyI18nProvider.js +51 -1
  21. package/dist/defaults/extensions/hooks/useDashDefaultLazyResources.js +19 -1
  22. package/dist/defaults/extensions/hooks/useDashDefaultMountTracker.js +22 -1
  23. package/dist/defaults/extensions/hooks/useDashDefaultRoutePath.js +17 -1
  24. package/dist/defaults/extensions/i18n/dashDefaultI18nProvider.js +44 -1
  25. package/dist/defaults/extensions/i18n/dashDefaultTranslations.js +87 -1
  26. package/dist/defaults/extensions/i18n/index.js +24 -1
  27. package/dist/defaults/extensions/index.js +190 -1
  28. package/dist/defaults/extensions/layout/dashDefaultDomainAppLayout.js +58 -1
  29. package/dist/defaults/extensions/layout/index.js +12 -1
  30. package/dist/defaults/extensions/managers/DashDefaultWSMessagesManager.js +84 -1
  31. package/dist/defaults/extensions/managers/index.js +5 -1
  32. package/dist/defaults/extensions/providers/dashDefaultAuthProvider.js +220 -1
  33. package/dist/defaults/extensions/providers/dashDefaultDataProvider.js +395 -1
  34. package/dist/defaults/extensions/providers/index.js +24 -1
  35. package/dist/defaults/extensions/router/DashDefaultLanding.js +46 -1
  36. package/dist/defaults/extensions/router/dashDefaultPrivateRoutes.js +38 -1
  37. package/dist/defaults/extensions/router/dashDefaultPublicRoutes.js +65 -1
  38. package/dist/defaults/extensions/router/dashDefaultRouter.js +39 -1
  39. package/dist/defaults/extensions/router/dashDefaultSharedRoutes.js +40 -1
  40. package/dist/defaults/extensions/router/index.js +12 -1
  41. package/dist/defaults/extensions/state/dashDefaultAppCommon.js +57 -1
  42. package/dist/defaults/extensions/state/dashDefaultAppSettings.js +38 -1
  43. package/dist/defaults/extensions/state/dashDefaultInitialAppState.js +31 -1
  44. package/dist/defaults/extensions/state/dashDefaultLayoutSettings.js +48 -1
  45. package/dist/defaults/extensions/state/dashDefaultQueryClient.js +58 -1
  46. package/dist/defaults/extensions/state/dashDefaultResourcesIcons.js +24 -1
  47. package/dist/defaults/extensions/state/index.js +29 -1
  48. package/dist/defaults/extensions/styles/index.js +2 -1
  49. package/dist/defaults/extensions/theme/dashDefaultThemeOptions.js +74 -1
  50. package/dist/defaults/extensions/theme/index.js +6 -1
  51. package/dist/defaults/extensions/utils/IPCMessageBrokerContext.js +12 -1
  52. package/dist/defaults/extensions/utils/dashDefaultAuthProviderUtils.js +29 -1
  53. package/dist/defaults/extensions/utils/dashDefaultDataProviderUtils.js +37 -1
  54. package/dist/defaults/extensions/utils/dashDefaultNotificationsProcessor.js +149 -1
  55. package/dist/defaults/extensions/utils/index.js +44 -1
  56. package/dist/defaults/filters/demo/dashDefaultDemoFilters.js +36 -1
  57. package/dist/defaults/filters/demo/index.js +4 -1
  58. package/dist/defaults/filters/index.js +5 -1
  59. package/dist/defaults/index.js +14 -1
  60. package/dist/defaults/pages/Account/DashDefaultRegister.js +282 -1
  61. package/dist/defaults/pages/Account/DashDefaultSignUp.js +420 -1
  62. package/dist/defaults/pages/Account/DashDefaultSignUpSuccess.js +101 -1
  63. package/dist/defaults/pages/Account/index.js +8 -1
  64. package/dist/defaults/pages/DashDefaultLogin.js +218 -1
  65. package/dist/defaults/pages/Misc/DashDefaultNotFound.js +74 -1
  66. package/dist/defaults/pages/Misc/DashDefaultServerError.js +79 -1
  67. package/dist/defaults/pages/Misc/DashDefaultUnauthorized.js +90 -1
  68. package/dist/defaults/pages/Misc/index.js +8 -1
  69. package/dist/defaults/pages/Static/DashDefaultPrivacyPage.js +48 -1
  70. package/dist/defaults/pages/Static/DashDefaultStaticPage.js +55 -1
  71. package/dist/defaults/pages/Static/DashDefaultTermsPage.js +52 -1
  72. package/dist/defaults/pages/Static/index.js +8 -1
  73. package/dist/defaults/pages/index.js +25 -1
  74. package/dist/defaults/schemas/dashDefaultSchema.js +14 -1
  75. package/dist/defaults/schemas/demo/dashDefaultTodoSchema.js +24 -1
  76. package/dist/defaults/schemas/demo/index.js +4 -1
  77. package/dist/defaults/schemas/index.js +7 -1
  78. package/dist/filters/demo/todoFilters.js +36 -1
  79. package/dist/index.js +56 -5975
  80. package/dist/resources/demo/todoResource.js +58 -1
  81. package/dist/schemas/defaultSchema.js +14 -1
  82. package/dist/schemas/demo/todoSchema.js +24 -1
  83. package/package.json +132 -77
  84. package/src/DashApp.tsx +294 -0
  85. package/src/DashAppLoader.tsx +717 -0
  86. package/src/DashDefaultResources.tsx +10 -0
  87. package/src/components/DashDefaultPrivateApp.tsx +358 -0
  88. package/src/components/DashDefaultPrivateResources.tsx +10 -0
  89. package/src/components/DashDefaultPublicApp.tsx +40 -0
  90. package/src/components/DashResourceLoader.tsx +564 -0
  91. package/src/defaults/extensions/bootstrap/DashDefaultErrorBoundary.tsx +113 -0
  92. package/src/defaults/extensions/bootstrap/dashDefaultInitializeApp.ts +81 -0
  93. package/src/defaults/extensions/bootstrap/index.ts +32 -0
  94. package/src/defaults/extensions/components/DashDefaultLoader.tsx +59 -0
  95. package/src/defaults/extensions/components/dashDefaultAutoAdminComponents.tsx +49 -0
  96. package/src/defaults/extensions/components/dashDefaultNotification.tsx +37 -0
  97. package/src/defaults/extensions/components/dashDefaultStaticComponents.tsx +34 -0
  98. package/src/defaults/extensions/components/index.ts +17 -0
  99. package/src/defaults/extensions/electron/dashDefaultIpcListeners.ts +62 -0
  100. package/src/defaults/extensions/electron/index.ts +7 -0
  101. package/src/defaults/extensions/hooks/index.ts +11 -0
  102. package/src/defaults/extensions/hooks/useDashDefaultLazyAutoAdminComponents.ts +25 -0
  103. package/src/defaults/extensions/hooks/useDashDefaultLazyI18nProvider.ts +38 -0
  104. package/src/defaults/extensions/hooks/useDashDefaultLazyResources.ts +29 -0
  105. package/src/defaults/extensions/hooks/useDashDefaultMountTracker.ts +28 -0
  106. package/src/defaults/extensions/hooks/useDashDefaultRoutePath.ts +27 -0
  107. package/src/defaults/extensions/i18n/dashDefaultI18nProvider.ts +66 -0
  108. package/src/defaults/extensions/i18n/dashDefaultTranslations.ts +82 -0
  109. package/src/defaults/extensions/i18n/index.ts +22 -0
  110. package/src/defaults/extensions/index.ts +177 -0
  111. package/src/defaults/extensions/layout/dashDefaultDomainAppLayout.tsx +126 -0
  112. package/src/defaults/extensions/layout/index.ts +12 -0
  113. package/src/defaults/extensions/managers/DashDefaultWSMessagesManager.tsx +99 -0
  114. package/src/defaults/extensions/managers/index.ts +7 -0
  115. package/src/defaults/extensions/providers/dashDefaultAuthProvider.ts +256 -0
  116. package/src/defaults/extensions/providers/dashDefaultDataProvider.ts +513 -0
  117. package/src/defaults/extensions/providers/index.ts +25 -0
  118. package/src/defaults/extensions/router/DashDefaultLanding.tsx +51 -0
  119. package/src/defaults/extensions/router/dashDefaultPrivateRoutes.tsx +50 -0
  120. package/src/defaults/extensions/router/dashDefaultPublicRoutes.tsx +86 -0
  121. package/src/defaults/extensions/router/dashDefaultRouter.tsx +54 -0
  122. package/src/defaults/extensions/router/dashDefaultSharedRoutes.tsx +56 -0
  123. package/src/defaults/extensions/router/index.ts +13 -0
  124. package/src/defaults/extensions/state/dashDefaultAppCommon.ts +54 -0
  125. package/src/defaults/extensions/state/dashDefaultAppSettings.ts +29 -0
  126. package/src/defaults/extensions/state/dashDefaultInitialAppState.ts +75 -0
  127. package/src/defaults/extensions/state/dashDefaultLayoutSettings.ts +59 -0
  128. package/src/defaults/extensions/state/dashDefaultQueryClient.ts +59 -0
  129. package/src/defaults/extensions/state/dashDefaultResourcesIcons.tsx +23 -0
  130. package/src/defaults/extensions/state/index.ts +29 -0
  131. package/src/defaults/extensions/styles/index.ts +17 -0
  132. package/src/defaults/extensions/theme/dashDefaultThemeOptions.ts +89 -0
  133. package/src/defaults/extensions/theme/index.ts +7 -0
  134. package/src/defaults/extensions/utils/IPCMessageBrokerContext.tsx +22 -0
  135. package/src/defaults/extensions/utils/dashDefaultAuthProviderUtils.ts +36 -0
  136. package/src/defaults/extensions/utils/dashDefaultDataProviderUtils.ts +46 -0
  137. package/src/defaults/extensions/utils/dashDefaultNotificationsProcessor.tsx +208 -0
  138. package/src/defaults/extensions/utils/index.ts +42 -0
  139. package/src/defaults/filters/demo/dashDefaultDemoFilters.tsx +50 -0
  140. package/src/defaults/filters/demo/index.ts +6 -0
  141. package/src/defaults/filters/index.ts +11 -0
  142. package/src/defaults/index.ts +27 -0
  143. package/src/defaults/pages/Account/DashDefaultRegister.tsx +281 -0
  144. package/src/defaults/pages/Account/DashDefaultSignUp.tsx +492 -0
  145. package/src/defaults/pages/Account/DashDefaultSignUpSuccess.tsx +113 -0
  146. package/src/defaults/pages/Account/index.ts +8 -0
  147. package/src/defaults/pages/DashDefaultLogin.tsx +224 -0
  148. package/src/defaults/pages/Misc/DashDefaultNotFound.tsx +96 -0
  149. package/src/defaults/pages/Misc/DashDefaultServerError.tsx +102 -0
  150. package/src/defaults/pages/Misc/DashDefaultUnauthorized.tsx +116 -0
  151. package/src/defaults/pages/Misc/index.ts +8 -0
  152. package/src/defaults/pages/Static/DashDefaultPrivacyPage.tsx +85 -0
  153. package/src/defaults/pages/Static/DashDefaultStaticPage.tsx +75 -0
  154. package/src/defaults/pages/Static/DashDefaultTermsPage.tsx +69 -0
  155. package/src/defaults/pages/Static/index.ts +8 -0
  156. package/src/defaults/pages/index.ts +28 -0
  157. package/src/defaults/schemas/dashDefaultSchema.tsx +25 -0
  158. package/src/defaults/schemas/demo/dashDefaultTodoSchema.tsx +39 -0
  159. package/src/defaults/schemas/demo/index.ts +6 -0
  160. package/src/defaults/schemas/index.ts +14 -0
  161. package/src/filters/demo/todoFilters.tsx +39 -0
  162. package/src/index.ts +131 -0
  163. package/src/resources/demo/todoResource.tsx +68 -0
  164. package/src/schemas/defaultSchema.tsx +14 -0
  165. package/src/schemas/demo/todoSchema.tsx +27 -0
@@ -0,0 +1,513 @@
1
+ /**
2
+ * Dash Default Data Provider Extension
3
+ *
4
+ * This file wraps the dash-auto-admin DashDataProvider factory,
5
+ * providing default app overrides and customizations.
6
+ */
7
+
8
+ import {
9
+ createDashDataProvider,
10
+ type DashDataProviderConfig,
11
+ type DashDataProviderOverrides
12
+ } from 'dash-auto-admin';
13
+ import { AxiosError } from 'axios';
14
+ import queryString from 'query-string';
15
+ import { processAxiosError, useAxios } from 'dash-axios-hook';
16
+ import { cacheInvalidatorHash } from 'dash-admin/src/utils/cache/CacheInvalidatorContext';
17
+ import { IDashAutoAdminDefaultBackendStructure } from 'dash-axios-hook/src/interfaces/IDashAutoAdminBackendError';
18
+ import { getResourceConfig, processFormData, processPostData } from 'dash-utils';
19
+ import { dashStorage } from 'dash-utils';
20
+
21
+ /**
22
+ * Dash default data provider configuration
23
+ */
24
+ export const dashDefaultDataProviderConfig: DashDataProviderConfig = {
25
+ useAxios: useAxios,
26
+ storage: dashStorage,
27
+ getCacheHash: cacheInvalidatorHash,
28
+ getResourceConfig: getResourceConfig,
29
+ processPostData: processPostData as (resource: string, data: any, operation: string) => any,
30
+ processFormData: processFormData,
31
+ processAxiosError: processAxiosError,
32
+ };
33
+
34
+ /**
35
+ * Dash default data provider overrides
36
+ * These override the default implementations from dash-auto-admin
37
+ */
38
+ export const dashDefaultDataProviderOverrides: DashDataProviderOverrides = {
39
+ /**
40
+ * Dash default getList implementation with Dash-specific logic
41
+ */
42
+ getList: async (resource, params) => {
43
+ const tenant_id = dashStorage.getItem('tenant_id');
44
+
45
+ let payload = processPostData(
46
+ resource,
47
+ { ...params.filter, ...{ tenant_id: tenant_id } },
48
+ 'getList',
49
+ );
50
+
51
+ const axios = useAxios();
52
+
53
+ const pagination =
54
+ params.filter && !!params.filter.pagination
55
+ ? params.filter.pagination
56
+ : params.pagination
57
+ ? params.pagination
58
+ : false;
59
+
60
+ if (pagination) {
61
+ payload = { ...payload, pagination: true, ...pagination };
62
+ } else {
63
+ payload = { ...payload, pagination: false };
64
+ }
65
+
66
+ payload = { ...payload, ...params.meta };
67
+
68
+ const hasSort = params.sort && params.sort.field && params.sort.order;
69
+
70
+ if (hasSort && !params.meta?.removeSortFilters) {
71
+ payload = {
72
+ ...payload,
73
+ ...{ ...params.sort, order: (params.sort.order).toLowerCase() },
74
+ };
75
+ }
76
+
77
+ const hash = cacheInvalidatorHash(resource);
78
+
79
+ if (hash) {
80
+ payload = {
81
+ ...payload,
82
+ hash
83
+ };
84
+ }
85
+
86
+ const processedQuery = queryString.stringify(payload, { arrayFormat: 'bracket' });
87
+
88
+ let url = `${resource}?${processedQuery}`;
89
+
90
+ const origin = url.includes('forSelect') ? 'forSelect' : url.includes('getMany') ? 'getMany' : 'getList';
91
+
92
+ window.dispatchEvent(
93
+ new MessageEvent('auto-admin-loading-state', {
94
+ data: true,
95
+ origin: origin,
96
+ lastEventId: url,
97
+ }),
98
+ );
99
+
100
+ try {
101
+ const response = await axios.get(url);
102
+ let results: { data: any[]; total: number };
103
+
104
+ if (typeof response.data?.data?.total !== 'undefined') {
105
+ results = response.data.data;
106
+ } else if (response?.data?.data && Array.isArray(response.data.data)) {
107
+ results = { data: response.data.data, total: response.data.total || response.data.data.length };
108
+ } else if (response?.data && Array.isArray(response.data)) {
109
+ results = { data: response.data, total: response.data.length };
110
+ } else {
111
+ results = { data: [], total: 0 };
112
+ }
113
+
114
+ window.dispatchEvent(
115
+ new MessageEvent('auto-admin-loading-state', {
116
+ data: false,
117
+ origin: origin,
118
+ lastEventId: url,
119
+ }),
120
+ );
121
+
122
+ return results;
123
+ } catch (e: any) {
124
+ window.dispatchEvent(new MessageEvent('DASHGlobalError', { data: { error: e, config: { dialog: true } } }));
125
+ return { data: [], total: 0 };
126
+ } finally {
127
+ window.dispatchEvent(
128
+ new MessageEvent('auto-admin-loading-state', {
129
+ data: false,
130
+ origin: origin,
131
+ lastEventId: url,
132
+ }),
133
+ );
134
+ }
135
+ },
136
+
137
+ /**
138
+ * Default getOne implementation
139
+ */
140
+ getOne: async (resource, params) => {
141
+ const axios = useAxios();
142
+
143
+ try {
144
+ const response = await axios.get(
145
+ `${resource}/${params.id}`,
146
+ params.meta ? { params: params.meta } : {},
147
+ );
148
+
149
+ return {
150
+ data: response.data,
151
+ };
152
+ } catch (e: any) {
153
+ // Error handling can be customized here
154
+ }
155
+ },
156
+
157
+ /**
158
+ * Default getMany implementation
159
+ */
160
+ getMany: async (resource, params) => {
161
+ const axios = useAxios();
162
+
163
+ const paramsIds =
164
+ Array.isArray(params.ids) &&
165
+ params.ids.length > 0 &&
166
+ Array.isArray(params.ids[0])
167
+ ? params.ids[0]
168
+ : params.ids;
169
+
170
+ let query: any = {
171
+ ids:
172
+ Array.isArray(paramsIds) &&
173
+ paramsIds.length > 0 &&
174
+ (paramsIds[0] as any)?.id
175
+ ? paramsIds.map((object: any) => object.id)
176
+ : paramsIds,
177
+ };
178
+
179
+ query = { ...query, pagination: false };
180
+
181
+ const hash = cacheInvalidatorHash(resource);
182
+ if (hash) {
183
+ query = {
184
+ ...query,
185
+ hash
186
+ };
187
+ }
188
+
189
+ const _query = queryString.stringify(query, {
190
+ arrayFormat: 'bracket',
191
+ });
192
+
193
+ const url = `${resource}/getMany?${_query}`;
194
+
195
+ try {
196
+ const response = await axios.get(url);
197
+ const results = response.data;
198
+
199
+ return {
200
+ data: results.data,
201
+ total:
202
+ results.data && results.data.total
203
+ ? results.data.total
204
+ : parseInt(response.headers['content-range']) || 0,
205
+ };
206
+ } catch (e: any) {
207
+ // Error handling can be customized here
208
+ }
209
+ },
210
+
211
+ /**
212
+ * Default getManyReference implementation
213
+ */
214
+ getManyReference: async (resource, params) => {
215
+ const tenant_id = dashStorage.getItem('tenant_id');
216
+ const pagination =
217
+ params.filter && (params.filter as any).pagination
218
+ ? (params.filter as any).pagination
219
+ : false;
220
+
221
+ const axios = useAxios();
222
+
223
+ let query: any = {
224
+ ...params.filter,
225
+ [params.target]: params.id,
226
+ tenant_id,
227
+ };
228
+
229
+ if (pagination) {
230
+ query = { ...query, pagination: true, ...pagination };
231
+ } else {
232
+ query = { ...query, pagination: false };
233
+ }
234
+
235
+ const url = `${resource}/getManyReference?${queryString.stringify(query, {
236
+ arrayFormat: 'bracket',
237
+ })}`;
238
+
239
+ try {
240
+ const response = await axios.get(url);
241
+ const results = response.data;
242
+
243
+ return {
244
+ data: results,
245
+ total:
246
+ results.data && results.data.total
247
+ ? results.data.total
248
+ : parseInt(response.headers['content-range']) || 0,
249
+ };
250
+ } catch (e: any) {
251
+ // Error handling can be customized here
252
+ }
253
+ },
254
+
255
+ /**
256
+ * Default update implementation
257
+ */
258
+ update: async (resource, params) => {
259
+ const axios = useAxios();
260
+ const resourceConfig = getResourceConfig(resource);
261
+ const isFormData =
262
+ resourceConfig?.isFormData === true ||
263
+ params.data?.isFormData === true ||
264
+ params.meta?.isFormData === true;
265
+
266
+ const tenant_id =
267
+ params && params.data && params.data.tenant_id
268
+ ? params.data.tenant_id
269
+ : dashStorage.getItem('tenant_id');
270
+
271
+ const resourcePath = /\/\d+(?:\/[^\/]*)?$/.test(resource) ? resource : (params.id ? `${resource}/${params.id}` : resource);
272
+
273
+ const postData = processPostData(
274
+ resourcePath,
275
+ { ...params.data, ...{ tenant_id: tenant_id } },
276
+ 'update',
277
+ );
278
+
279
+ let method: 'POST' | 'PUT' = params.meta?.method
280
+ ? params.meta.method
281
+ : 'PUT';
282
+
283
+ method = postData?.axiosMethod ? postData.axiosMethod : method;
284
+ delete postData.axiosMethod;
285
+
286
+ const action = axios.post;
287
+ if (method === "PUT") {
288
+ postData._method = "PUT";
289
+ }
290
+
291
+ try {
292
+ if (isFormData) {
293
+ const form: FormData = processFormData(resource, postData);
294
+ const response = await action(resourcePath, form, {
295
+ headers: { 'Content-Type': 'multipart/form-data' },
296
+ });
297
+
298
+ return response;
299
+ }
300
+
301
+ const response = await action(resourcePath, postData);
302
+
303
+ return response;
304
+ } catch (e: unknown) {
305
+ const error = e as AxiosError<IDashAutoAdminDefaultBackendStructure>;
306
+ throw processAxiosError(error, resource, 'update');
307
+ }
308
+ },
309
+
310
+ /**
311
+ * Default create implementation
312
+ */
313
+ create: async (resource, params) => {
314
+ const axios = useAxios();
315
+ const resourceConfig = getResourceConfig(resource);
316
+ const isFormData =
317
+ resourceConfig?.isFormData === true ||
318
+ params.data?.isFormData === true ||
319
+ params.meta?.isFormData === true;
320
+
321
+ const resourcePath = /\/[\w-]+$/.test(resource) ? resource : ((params.meta as any)?.id ? `${resource}/${(params.meta as any).id}` : resource);
322
+
323
+ let tenant_id = params.data?.tenant_id;
324
+
325
+ if (resource !== 'system/user' && !tenant_id) {
326
+ tenant_id = dashStorage.getItem('tenant_id');
327
+ }
328
+
329
+ const method: 'POST' | 'PUT' = params.meta?.method
330
+ ? params.meta.method
331
+ : 'POST';
332
+
333
+ const action = method === 'POST' ? axios.post : axios.put;
334
+
335
+ const postData = processPostData(
336
+ resourcePath,
337
+ {
338
+ ...params.data,
339
+ ...(tenant_id ? { tenant_id: tenant_id } : {})
340
+ },
341
+ 'create',
342
+ );
343
+
344
+ try {
345
+ if (isFormData) {
346
+ const form: FormData = processFormData(resource, postData);
347
+ return await action(resourcePath, form, {
348
+ headers: { 'Content-Type': 'multipart/form-data' },
349
+ });
350
+ }
351
+
352
+ return await action(resourcePath, postData);
353
+
354
+ } catch (e: unknown) {
355
+ const error = e as AxiosError<IDashAutoAdminDefaultBackendStructure>;
356
+ throw processAxiosError(error, resource, 'create');
357
+ }
358
+ },
359
+
360
+ /**
361
+ * Default updateMany implementation
362
+ */
363
+ updateMany: async (resource, params) => {
364
+ const tenant_id = dashStorage.getItem('tenant_id');
365
+ const axios = useAxios();
366
+
367
+ const query = {
368
+ filter: JSON.stringify({ ids: params.ids }),
369
+ tenant_id,
370
+ };
371
+
372
+ const method: 'POST' | 'PUT' = params.meta?.method
373
+ ? params.meta.method
374
+ : 'POST';
375
+ const action = method === 'POST' ? axios.post : axios.put;
376
+
377
+ try {
378
+ const response = await action(
379
+ `${resource}/updateMany?${queryString.stringify(query, {
380
+ arrayFormat: 'bracket',
381
+ })}`,
382
+ params.data,
383
+ );
384
+
385
+ return response;
386
+ } catch (e: any) {
387
+ window.dispatchEvent(
388
+ new MessageEvent('dash-global-loader', { data: false }),
389
+ );
390
+ }
391
+ },
392
+
393
+ /**
394
+ * Default delete implementation
395
+ */
396
+ delete: async (resource, params) => {
397
+ const tenant_id = dashStorage.getItem('tenant_id');
398
+ const axios = useAxios();
399
+
400
+ const { data } = await axios.delete(`${resource}/${params.id}`, {
401
+ data: { tenant_id: tenant_id },
402
+ });
403
+
404
+ return {
405
+ data,
406
+ };
407
+ },
408
+
409
+ /**
410
+ * Default deleteMany implementation
411
+ */
412
+ deleteMany: async (resource, params) => {
413
+ const tenant_id = dashStorage.getItem('tenant_id');
414
+ const axios = useAxios();
415
+
416
+ const query = {
417
+ ids: params.ids ? params.ids : [],
418
+ tenant_id,
419
+ };
420
+
421
+ const data = await axios.post(
422
+ `${resource}/deleteMany?${queryString.stringify(query, {
423
+ arrayFormat: 'bracket',
424
+ })}`,
425
+ );
426
+
427
+ return data;
428
+ },
429
+ };
430
+
431
+ /**
432
+ * Additional dash default methods for the data provider
433
+ * These are app-specific and not part of the base react-admin DataProvider
434
+ */
435
+ export const dashDefaultDataProviderExtensions = {
436
+ /**
437
+ * Dash default import method for bulk data import
438
+ */
439
+ import: async (resource: string, params: any) => {
440
+ const axios = useAxios();
441
+ const processedData = processPostData(resource, params.data, 'import');
442
+
443
+ if (dashStorage.getItem('tenant_id')) {
444
+ if (processedData && !processedData.tenant_id)
445
+ processedData.tenant_id = dashStorage.getItem('tenant_id');
446
+ }
447
+
448
+ const form: FormData = processFormData(resource, processedData);
449
+
450
+ const method: 'POST' | 'PUT' = params.meta?.method
451
+ ? params.meta.method
452
+ : 'POST';
453
+ const action = method === 'POST' ? axios.post : axios.put;
454
+
455
+ try {
456
+ const results = await action(`${resource}`, form, {
457
+ headers: { 'Content-Type': 'multipart/form-data' },
458
+ });
459
+
460
+ return results;
461
+ } catch (e: any) {
462
+ window.dispatchEvent(
463
+ new MessageEvent('dash-global-loader', { data: false }),
464
+ );
465
+ }
466
+ },
467
+
468
+ /**
469
+ * @deprecated Use the auth provider's checkError instead
470
+ */
471
+ checkError: (error: any) => {
472
+ const status = error.status;
473
+ if (status >= 400 && status < 499) {
474
+ let message = error.message;
475
+ if (status === 401) message = 'You are not authenticated';
476
+ if (status === 403) message = 'You do not have permission to access this resource';
477
+ if (status === 404) message = 'The requested resource was not found';
478
+ if (status === 422) message = 'Validation error';
479
+
480
+ const formattedError = new Error(message);
481
+ (formattedError as any).status = status;
482
+ (formattedError as any).body = error.body;
483
+
484
+ return Promise.reject(formattedError);
485
+ }
486
+
487
+ if (status >= 500) {
488
+ console.error('Server error', error);
489
+ return Promise.reject(new Error('A server error occurred. Please try again later.'));
490
+ }
491
+
492
+ return Promise.resolve();
493
+ }
494
+ };
495
+
496
+ /**
497
+ * Create the dash default data provider using the factory
498
+ * This combines the base implementation with app-specific overrides
499
+ */
500
+ const baseDataProvider = createDashDataProvider(
501
+ dashDefaultDataProviderConfig,
502
+ dashDefaultDataProviderOverrides
503
+ );
504
+
505
+ /**
506
+ * Extend the base provider with dash default methods
507
+ */
508
+ export const dashDefaultDataProvider = {
509
+ ...baseDataProvider,
510
+ ...dashDefaultDataProviderExtensions,
511
+ };
512
+
513
+ export default dashDefaultDataProvider;
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Default Providers Extension Index
3
+ *
4
+ * This module exports all default provider extensions for the app.
5
+ * These providers wrap the dash-auto-admin factories with default logic.
6
+ */
7
+
8
+ // Auth Provider
9
+ export {
10
+ dashDefaultAuthProvider,
11
+ dashDefaultAuthProviderConfig,
12
+ dashDefaultAuthProviderOverrides
13
+ } from './dashDefaultAuthProvider';
14
+
15
+ // Data Provider
16
+ export {
17
+ dashDefaultDataProvider,
18
+ dashDefaultDataProviderConfig,
19
+ dashDefaultDataProviderOverrides,
20
+ dashDefaultDataProviderExtensions
21
+ } from './dashDefaultDataProvider';
22
+
23
+ // Default exports for convenience
24
+ export { default as dashAuthProvider } from './dashDefaultAuthProvider';
25
+ export { default as dashDataProvider } from './dashDefaultDataProvider';
@@ -0,0 +1,51 @@
1
+ /**
2
+ * DashDefaultLanding
3
+ *
4
+ * Simple default landing page for the public app.
5
+ * Separated into its own file to support lazy loading,
6
+ * which ensures useNavigate is called inside Router context.
7
+ */
8
+ import React from 'react';
9
+ import { useNavigate } from 'react-router-dom';
10
+
11
+ const DashDefaultLanding: React.FC = () => {
12
+ const navigate = useNavigate();
13
+
14
+ return (
15
+ <div
16
+ style={{
17
+ display: 'flex',
18
+ flexDirection: 'column',
19
+ justifyContent: 'center',
20
+ alignItems: 'center',
21
+ height: '100vh',
22
+ color: 'var(--text-color, @text-color--dark)',
23
+ fontFamily: 'system-ui, -apple-system, sans-serif',
24
+ textAlign: 'center'
25
+ }}
26
+ >
27
+ <h1 style={{ marginBottom: '16px', fontSize: '2rem' }}>Welcome to Dash</h1>
28
+ <p style={{ marginBottom: '24px', opacity: 0.7 }}>
29
+ Please login to continue
30
+ </p>
31
+ <button
32
+ type="button"
33
+ onClick={() => navigate('/login')}
34
+ style={{
35
+ padding: '12px 24px',
36
+ backgroundColor: '#1976d2',
37
+ color: 'white',
38
+ borderRadius: '8px',
39
+ textDecoration: 'none',
40
+ fontWeight: 500,
41
+ border: 'none',
42
+ cursor: 'pointer'
43
+ }}
44
+ >
45
+ Go to Login
46
+ </button>
47
+ </div>
48
+ );
49
+ };
50
+
51
+ export default DashDefaultLanding;
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Dash Default Private Routes Extension
3
+ *
4
+ * Routes that require authentication.
5
+ * These routes are rendered when the user is logged in.
6
+ */
7
+ import React, { Suspense } from 'react';
8
+ import { Route } from 'react-router-dom';
9
+ import { DashDefaultLoader } from '../components/DashDefaultLoader';
10
+
11
+ // Dash default simple landing component for authenticated users
12
+ const DashDefaultAuthenticatedLanding = () => (
13
+ <div style={{
14
+ display: 'flex',
15
+ justifyContent: 'center',
16
+ alignItems: 'center',
17
+ height: '100vh',
18
+ background: 'linear-gradient(to bottom, var(--bodybg-primary), var(--bodybg-secondary))',
19
+ color: 'var(--text-color, @text-color--dark)'
20
+ }}>
21
+ <h1>Welcome back!</h1>
22
+ </div>
23
+ );
24
+
25
+ /**
26
+ * Dash Default Private routes configuration
27
+ * These routes require authentication
28
+ */
29
+ export const dashDefaultPrivateRoutes = () => [
30
+ // Landing page (authenticated view)
31
+ <Route
32
+ key="landing"
33
+ data-layout="no-layout"
34
+ path="/"
35
+ element={
36
+ <Suspense fallback={<DashDefaultLoader />}>
37
+ <DashDefaultAuthenticatedLanding />
38
+ </Suspense>
39
+ }
40
+ />,
41
+
42
+ // Login redirect (when already authenticated)
43
+ <Route
44
+ key="login-redirect"
45
+ path="/login"
46
+ element={<></>}
47
+ />,
48
+ ];
49
+
50
+ export default dashDefaultPrivateRoutes;