@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.
- package/dist/DashApp.js +176 -1
- package/dist/DashAppLoader.js +348 -3
- package/dist/DashDefaultResources.js +10 -1
- package/dist/components/DashDefaultPrivateApp.js +150 -1
- package/dist/components/DashDefaultPrivateResources.js +10 -1
- package/dist/components/DashDefaultPublicApp.js +20 -1
- package/dist/components/DashResourceLoader.js +245 -1
- package/dist/defaults/extensions/bootstrap/DashDefaultErrorBoundary.js +78 -1
- package/dist/defaults/extensions/bootstrap/dashDefaultInitializeApp.js +59 -1
- package/dist/defaults/extensions/bootstrap/index.js +24 -1
- package/dist/defaults/extensions/components/DashDefaultLoader.js +43 -2
- package/dist/defaults/extensions/components/dashDefaultAutoAdminComponents.js +67 -1
- package/dist/defaults/extensions/components/dashDefaultNotification.js +28 -1
- package/dist/defaults/extensions/components/dashDefaultStaticComponents.js +15 -1
- package/dist/defaults/extensions/components/index.js +13 -1
- package/dist/defaults/extensions/electron/dashDefaultIpcListeners.js +38 -1
- package/dist/defaults/extensions/electron/index.js +5 -1
- package/dist/defaults/extensions/hooks/index.js +12 -1
- package/dist/defaults/extensions/hooks/useDashDefaultLazyAutoAdminComponents.js +17 -1
- package/dist/defaults/extensions/hooks/useDashDefaultLazyI18nProvider.js +51 -1
- package/dist/defaults/extensions/hooks/useDashDefaultLazyResources.js +19 -1
- package/dist/defaults/extensions/hooks/useDashDefaultMountTracker.js +22 -1
- package/dist/defaults/extensions/hooks/useDashDefaultRoutePath.js +17 -1
- package/dist/defaults/extensions/i18n/dashDefaultI18nProvider.js +44 -1
- package/dist/defaults/extensions/i18n/dashDefaultTranslations.js +87 -1
- package/dist/defaults/extensions/i18n/index.js +24 -1
- package/dist/defaults/extensions/index.js +190 -1
- package/dist/defaults/extensions/layout/dashDefaultDomainAppLayout.js +58 -1
- package/dist/defaults/extensions/layout/index.js +12 -1
- package/dist/defaults/extensions/managers/DashDefaultWSMessagesManager.js +84 -1
- package/dist/defaults/extensions/managers/index.js +5 -1
- package/dist/defaults/extensions/providers/dashDefaultAuthProvider.js +220 -1
- package/dist/defaults/extensions/providers/dashDefaultDataProvider.js +395 -1
- package/dist/defaults/extensions/providers/index.js +24 -1
- package/dist/defaults/extensions/router/DashDefaultLanding.js +46 -1
- package/dist/defaults/extensions/router/dashDefaultPrivateRoutes.js +38 -1
- package/dist/defaults/extensions/router/dashDefaultPublicRoutes.js +65 -1
- package/dist/defaults/extensions/router/dashDefaultRouter.js +39 -1
- package/dist/defaults/extensions/router/dashDefaultSharedRoutes.js +40 -1
- package/dist/defaults/extensions/router/index.js +12 -1
- package/dist/defaults/extensions/state/dashDefaultAppCommon.js +57 -1
- package/dist/defaults/extensions/state/dashDefaultAppSettings.js +38 -1
- package/dist/defaults/extensions/state/dashDefaultInitialAppState.js +31 -1
- package/dist/defaults/extensions/state/dashDefaultLayoutSettings.js +48 -1
- package/dist/defaults/extensions/state/dashDefaultQueryClient.js +58 -1
- package/dist/defaults/extensions/state/dashDefaultResourcesIcons.js +24 -1
- package/dist/defaults/extensions/state/index.js +29 -1
- package/dist/defaults/extensions/styles/index.js +2 -1
- package/dist/defaults/extensions/theme/dashDefaultThemeOptions.js +74 -1
- package/dist/defaults/extensions/theme/index.js +6 -1
- package/dist/defaults/extensions/utils/IPCMessageBrokerContext.js +12 -1
- package/dist/defaults/extensions/utils/dashDefaultAuthProviderUtils.js +29 -1
- package/dist/defaults/extensions/utils/dashDefaultDataProviderUtils.js +37 -1
- package/dist/defaults/extensions/utils/dashDefaultNotificationsProcessor.js +149 -1
- package/dist/defaults/extensions/utils/index.js +44 -1
- package/dist/defaults/filters/demo/dashDefaultDemoFilters.js +36 -1
- package/dist/defaults/filters/demo/index.js +4 -1
- package/dist/defaults/filters/index.js +5 -1
- package/dist/defaults/index.js +14 -1
- package/dist/defaults/pages/Account/DashDefaultRegister.js +282 -1
- package/dist/defaults/pages/Account/DashDefaultSignUp.js +420 -1
- package/dist/defaults/pages/Account/DashDefaultSignUpSuccess.js +101 -1
- package/dist/defaults/pages/Account/index.js +8 -1
- package/dist/defaults/pages/DashDefaultLogin.js +218 -1
- package/dist/defaults/pages/Misc/DashDefaultNotFound.js +74 -1
- package/dist/defaults/pages/Misc/DashDefaultServerError.js +79 -1
- package/dist/defaults/pages/Misc/DashDefaultUnauthorized.js +90 -1
- package/dist/defaults/pages/Misc/index.js +8 -1
- package/dist/defaults/pages/Static/DashDefaultPrivacyPage.js +48 -1
- package/dist/defaults/pages/Static/DashDefaultStaticPage.js +55 -1
- package/dist/defaults/pages/Static/DashDefaultTermsPage.js +52 -1
- package/dist/defaults/pages/Static/index.js +8 -1
- package/dist/defaults/pages/index.js +25 -1
- package/dist/defaults/schemas/dashDefaultSchema.js +14 -1
- package/dist/defaults/schemas/demo/dashDefaultTodoSchema.js +24 -1
- package/dist/defaults/schemas/demo/index.js +4 -1
- package/dist/defaults/schemas/index.js +7 -1
- package/dist/filters/demo/todoFilters.js +36 -1
- package/dist/index.js +56 -5975
- package/dist/resources/demo/todoResource.js +58 -1
- package/dist/schemas/defaultSchema.js +14 -1
- package/dist/schemas/demo/todoSchema.js +24 -1
- package/package.json +132 -77
- package/src/DashApp.tsx +294 -0
- package/src/DashAppLoader.tsx +717 -0
- package/src/DashDefaultResources.tsx +10 -0
- package/src/components/DashDefaultPrivateApp.tsx +358 -0
- package/src/components/DashDefaultPrivateResources.tsx +10 -0
- package/src/components/DashDefaultPublicApp.tsx +40 -0
- package/src/components/DashResourceLoader.tsx +564 -0
- package/src/defaults/extensions/bootstrap/DashDefaultErrorBoundary.tsx +113 -0
- package/src/defaults/extensions/bootstrap/dashDefaultInitializeApp.ts +81 -0
- package/src/defaults/extensions/bootstrap/index.ts +32 -0
- package/src/defaults/extensions/components/DashDefaultLoader.tsx +59 -0
- package/src/defaults/extensions/components/dashDefaultAutoAdminComponents.tsx +49 -0
- package/src/defaults/extensions/components/dashDefaultNotification.tsx +37 -0
- package/src/defaults/extensions/components/dashDefaultStaticComponents.tsx +34 -0
- package/src/defaults/extensions/components/index.ts +17 -0
- package/src/defaults/extensions/electron/dashDefaultIpcListeners.ts +62 -0
- package/src/defaults/extensions/electron/index.ts +7 -0
- package/src/defaults/extensions/hooks/index.ts +11 -0
- package/src/defaults/extensions/hooks/useDashDefaultLazyAutoAdminComponents.ts +25 -0
- package/src/defaults/extensions/hooks/useDashDefaultLazyI18nProvider.ts +38 -0
- package/src/defaults/extensions/hooks/useDashDefaultLazyResources.ts +29 -0
- package/src/defaults/extensions/hooks/useDashDefaultMountTracker.ts +28 -0
- package/src/defaults/extensions/hooks/useDashDefaultRoutePath.ts +27 -0
- package/src/defaults/extensions/i18n/dashDefaultI18nProvider.ts +66 -0
- package/src/defaults/extensions/i18n/dashDefaultTranslations.ts +82 -0
- package/src/defaults/extensions/i18n/index.ts +22 -0
- package/src/defaults/extensions/index.ts +177 -0
- package/src/defaults/extensions/layout/dashDefaultDomainAppLayout.tsx +126 -0
- package/src/defaults/extensions/layout/index.ts +12 -0
- package/src/defaults/extensions/managers/DashDefaultWSMessagesManager.tsx +99 -0
- package/src/defaults/extensions/managers/index.ts +7 -0
- package/src/defaults/extensions/providers/dashDefaultAuthProvider.ts +256 -0
- package/src/defaults/extensions/providers/dashDefaultDataProvider.ts +513 -0
- package/src/defaults/extensions/providers/index.ts +25 -0
- package/src/defaults/extensions/router/DashDefaultLanding.tsx +51 -0
- package/src/defaults/extensions/router/dashDefaultPrivateRoutes.tsx +50 -0
- package/src/defaults/extensions/router/dashDefaultPublicRoutes.tsx +86 -0
- package/src/defaults/extensions/router/dashDefaultRouter.tsx +54 -0
- package/src/defaults/extensions/router/dashDefaultSharedRoutes.tsx +56 -0
- package/src/defaults/extensions/router/index.ts +13 -0
- package/src/defaults/extensions/state/dashDefaultAppCommon.ts +54 -0
- package/src/defaults/extensions/state/dashDefaultAppSettings.ts +29 -0
- package/src/defaults/extensions/state/dashDefaultInitialAppState.ts +75 -0
- package/src/defaults/extensions/state/dashDefaultLayoutSettings.ts +59 -0
- package/src/defaults/extensions/state/dashDefaultQueryClient.ts +59 -0
- package/src/defaults/extensions/state/dashDefaultResourcesIcons.tsx +23 -0
- package/src/defaults/extensions/state/index.ts +29 -0
- package/src/defaults/extensions/styles/index.ts +17 -0
- package/src/defaults/extensions/theme/dashDefaultThemeOptions.ts +89 -0
- package/src/defaults/extensions/theme/index.ts +7 -0
- package/src/defaults/extensions/utils/IPCMessageBrokerContext.tsx +22 -0
- package/src/defaults/extensions/utils/dashDefaultAuthProviderUtils.ts +36 -0
- package/src/defaults/extensions/utils/dashDefaultDataProviderUtils.ts +46 -0
- package/src/defaults/extensions/utils/dashDefaultNotificationsProcessor.tsx +208 -0
- package/src/defaults/extensions/utils/index.ts +42 -0
- package/src/defaults/filters/demo/dashDefaultDemoFilters.tsx +50 -0
- package/src/defaults/filters/demo/index.ts +6 -0
- package/src/defaults/filters/index.ts +11 -0
- package/src/defaults/index.ts +27 -0
- package/src/defaults/pages/Account/DashDefaultRegister.tsx +281 -0
- package/src/defaults/pages/Account/DashDefaultSignUp.tsx +492 -0
- package/src/defaults/pages/Account/DashDefaultSignUpSuccess.tsx +113 -0
- package/src/defaults/pages/Account/index.ts +8 -0
- package/src/defaults/pages/DashDefaultLogin.tsx +224 -0
- package/src/defaults/pages/Misc/DashDefaultNotFound.tsx +96 -0
- package/src/defaults/pages/Misc/DashDefaultServerError.tsx +102 -0
- package/src/defaults/pages/Misc/DashDefaultUnauthorized.tsx +116 -0
- package/src/defaults/pages/Misc/index.ts +8 -0
- package/src/defaults/pages/Static/DashDefaultPrivacyPage.tsx +85 -0
- package/src/defaults/pages/Static/DashDefaultStaticPage.tsx +75 -0
- package/src/defaults/pages/Static/DashDefaultTermsPage.tsx +69 -0
- package/src/defaults/pages/Static/index.ts +8 -0
- package/src/defaults/pages/index.ts +28 -0
- package/src/defaults/schemas/dashDefaultSchema.tsx +25 -0
- package/src/defaults/schemas/demo/dashDefaultTodoSchema.tsx +39 -0
- package/src/defaults/schemas/demo/index.ts +6 -0
- package/src/defaults/schemas/index.ts +14 -0
- package/src/filters/demo/todoFilters.tsx +39 -0
- package/src/index.ts +131 -0
- package/src/resources/demo/todoResource.tsx +68 -0
- package/src/schemas/defaultSchema.tsx +14 -0
- 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;
|