ding-react-admin 1.0.4 → 2.0.4

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 (230) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +254 -201
  3. package/dist/index.css +2 -0
  4. package/dist/index.js +2073 -1202
  5. package/dist/src/components/NavMenuLabel.d.ts +8 -0
  6. package/dist/src/components/NavMenuLabel.d.ts.map +1 -0
  7. package/dist/src/components/NavMenuSearch.d.ts +9 -0
  8. package/dist/src/components/NavMenuSearch.d.ts.map +1 -0
  9. package/dist/src/components/ScrollableArea.d.ts +10 -0
  10. package/dist/src/components/ScrollableArea.d.ts.map +1 -0
  11. package/dist/src/components/index.d.ts +3 -0
  12. package/dist/src/components/index.d.ts.map +1 -1
  13. package/dist/src/context/AuthProvider.d.ts +2 -0
  14. package/dist/src/context/AuthProvider.d.ts.map +1 -1
  15. package/dist/src/crud/FormGlobalErrorsAlert.d.ts +5 -0
  16. package/dist/src/crud/FormGlobalErrorsAlert.d.ts.map +1 -0
  17. package/dist/src/crud/InlineFormSet.d.ts +2 -17
  18. package/dist/src/crud/InlineFormSet.d.ts.map +1 -1
  19. package/dist/src/crud/ResourceForm.d.ts +2 -10
  20. package/dist/src/crud/ResourceForm.d.ts.map +1 -1
  21. package/dist/src/crud/ResourceFormModal.d.ts +7 -1
  22. package/dist/src/crud/ResourceFormModal.d.ts.map +1 -1
  23. package/dist/src/crud/ResourceList.d.ts.map +1 -1
  24. package/dist/src/crud/ResourceRecordForm.d.ts +27 -0
  25. package/dist/src/crud/ResourceRecordForm.d.ts.map +1 -0
  26. package/dist/src/crud/columns/ImageColumn.d.ts +14 -0
  27. package/dist/src/crud/columns/ImageColumn.d.ts.map +1 -0
  28. package/dist/src/crud/context/InlineFieldsRegistry.d.ts +15 -0
  29. package/dist/src/crud/context/InlineFieldsRegistry.d.ts.map +1 -0
  30. package/dist/src/crud/context/PayloadFieldsContext.d.ts +18 -0
  31. package/dist/src/crud/context/PayloadFieldsContext.d.ts.map +1 -0
  32. package/dist/src/crud/fields/FileField.d.ts +12 -0
  33. package/dist/src/crud/fields/FileField.d.ts.map +1 -0
  34. package/dist/src/crud/fields/ImageField.d.ts +14 -0
  35. package/dist/src/crud/fields/ImageField.d.ts.map +1 -0
  36. package/dist/src/crud/fields/ReferenceField.d.ts +12 -2
  37. package/dist/src/crud/fields/ReferenceField.d.ts.map +1 -1
  38. package/dist/src/crud/fields/ReferenceInputActions.d.ts +16 -0
  39. package/dist/src/crud/fields/ReferenceInputActions.d.ts.map +1 -0
  40. package/dist/src/crud/fields/ReferenceManyField.d.ts +10 -1
  41. package/dist/src/crud/fields/ReferenceManyField.d.ts.map +1 -1
  42. package/dist/src/crud/fields/uploadFieldUtils.d.ts +5 -0
  43. package/dist/src/crud/fields/uploadFieldUtils.d.ts.map +1 -0
  44. package/dist/src/crud/fields/useUploadPreviewUrl.d.ts +4 -0
  45. package/dist/src/crud/fields/useUploadPreviewUrl.d.ts.map +1 -0
  46. package/dist/src/crud/filters/ReferenceFilter.d.ts +1 -1
  47. package/dist/src/crud/filters/ReferenceFilter.d.ts.map +1 -1
  48. package/dist/src/crud/index.d.ts +27 -9
  49. package/dist/src/crud/index.d.ts.map +1 -1
  50. package/dist/src/crud/types.d.ts +21 -7
  51. package/dist/src/crud/types.d.ts.map +1 -1
  52. package/dist/src/crud/utils/buildFormPayload.d.ts +6 -0
  53. package/dist/src/crud/utils/buildFormPayload.d.ts.map +1 -0
  54. package/dist/src/crud/utils/buildInlineRowsPayload.d.ts +6 -0
  55. package/dist/src/crud/utils/buildInlineRowsPayload.d.ts.map +1 -0
  56. package/dist/src/crud/utils/buildResourceFormSubmitBody.d.ts +5 -0
  57. package/dist/src/crud/utils/buildResourceFormSubmitBody.d.ts.map +1 -0
  58. package/dist/src/crud/utils/choiceSelectionUtils.d.ts +10 -0
  59. package/dist/src/crud/utils/choiceSelectionUtils.d.ts.map +1 -0
  60. package/dist/src/crud/utils/choiceSelectionUtils.test.d.ts +2 -0
  61. package/dist/src/crud/utils/choiceSelectionUtils.test.d.ts.map +1 -0
  62. package/dist/src/crud/utils/formErrors.d.ts +18 -7
  63. package/dist/src/crud/utils/formErrors.d.ts.map +1 -1
  64. package/dist/src/crud/utils/formErrors.test.d.ts +2 -0
  65. package/dist/src/crud/utils/formErrors.test.d.ts.map +1 -0
  66. package/dist/src/crud/utils/getFormValue.d.ts +3 -0
  67. package/dist/src/crud/utils/getFormValue.d.ts.map +1 -0
  68. package/dist/src/crud/utils/hasUploadValues.d.ts +3 -0
  69. package/dist/src/crud/utils/hasUploadValues.d.ts.map +1 -0
  70. package/dist/src/crud/utils/nestedFieldPath.d.ts +3 -0
  71. package/dist/src/crud/utils/nestedFieldPath.d.ts.map +1 -0
  72. package/dist/src/crud/utils/prepareFormSubmitBody.d.ts +8 -0
  73. package/dist/src/crud/utils/prepareFormSubmitBody.d.ts.map +1 -0
  74. package/dist/src/crud/utils/referenceSelectNotFoundContent.d.ts +4 -0
  75. package/dist/src/crud/utils/referenceSelectNotFoundContent.d.ts.map +1 -0
  76. package/dist/src/crud/utils/setFormValue.d.ts +3 -0
  77. package/dist/src/crud/utils/setFormValue.d.ts.map +1 -0
  78. package/dist/src/crud/utils/toFormData.d.ts +13 -0
  79. package/dist/src/crud/utils/toFormData.d.ts.map +1 -0
  80. package/dist/src/crud/utils/uploadReferenceUtils.d.ts +5 -0
  81. package/dist/src/crud/utils/uploadReferenceUtils.d.ts.map +1 -0
  82. package/dist/src/crud/utils/useChoices.d.ts +27 -1
  83. package/dist/src/crud/utils/useChoices.d.ts.map +1 -1
  84. package/dist/src/crud/utils/useFormRecord.d.ts +44 -0
  85. package/dist/src/crud/utils/useFormRecord.d.ts.map +1 -0
  86. package/dist/src/data/createRestResourceHandlers.d.ts +5 -5
  87. package/dist/src/data/createRestResourceHandlers.d.ts.map +1 -1
  88. package/dist/src/data/dataProviderTypes.d.ts +6 -5
  89. package/dist/src/data/dataProviderTypes.d.ts.map +1 -1
  90. package/dist/src/data/parseFormErrorHelpers.d.ts +23 -6
  91. package/dist/src/data/parseFormErrorHelpers.d.ts.map +1 -1
  92. package/dist/src/data/resourceHandlers.d.ts +1 -1
  93. package/dist/src/data/resourceHandlers.d.ts.map +1 -1
  94. package/dist/src/index.d.ts +4 -4
  95. package/dist/src/index.d.ts.map +1 -1
  96. package/dist/src/layouts/AdminLayout.d.ts +1 -1
  97. package/dist/src/layouts/AdminLayout.d.ts.map +1 -1
  98. package/dist/src/layouts/AuthPageLayout.d.ts.map +1 -1
  99. package/dist/src/layouts/navFilter.d.ts +5 -0
  100. package/dist/src/layouts/navFilter.d.ts.map +1 -0
  101. package/dist/src/layouts/navMenuItems.d.ts +6 -0
  102. package/dist/src/layouts/navMenuItems.d.ts.map +1 -0
  103. package/dist/src/types.d.ts +12 -0
  104. package/dist/src/types.d.ts.map +1 -1
  105. package/package.json +79 -59
  106. package/src/app/AdminApp.tsx +34 -34
  107. package/src/components/AuthAlternateLink.tsx +23 -23
  108. package/src/components/DensitySwitch.tsx +31 -31
  109. package/src/components/NavMenuLabel.tsx +26 -0
  110. package/src/components/NavMenuSearch.tsx +76 -0
  111. package/src/components/ScrollableArea.tsx +46 -0
  112. package/src/components/ThemeSwitch.tsx +28 -28
  113. package/src/components/ThemeToolbar.tsx +34 -34
  114. package/src/components/index.ts +7 -4
  115. package/src/components/navMenu.css +21 -0
  116. package/src/components/scrollable.css +28 -0
  117. package/src/context/AppThemeProvider.tsx +128 -128
  118. package/src/context/AuthProvider.tsx +89 -77
  119. package/src/context/DataProvider.tsx +30 -30
  120. package/src/context/PermissionsProvider.tsx +57 -57
  121. package/src/crud/FilterBar.tsx +36 -36
  122. package/src/crud/FormGlobalErrorsAlert.tsx +36 -0
  123. package/src/crud/FormSteps.tsx +135 -135
  124. package/src/crud/FormTabs.tsx +126 -126
  125. package/src/crud/InlineFormSet.tsx +162 -219
  126. package/src/crud/ListActionsBar.tsx +106 -106
  127. package/src/crud/ResourceForm.tsx +83 -166
  128. package/src/crud/ResourceFormModal.tsx +75 -133
  129. package/src/crud/ResourceList.tsx +1 -0
  130. package/src/crud/ResourceRecordForm.tsx +166 -0
  131. package/src/crud/columns/BooleanColumn.tsx +32 -32
  132. package/src/crud/columns/CustomColumn.tsx +33 -33
  133. package/src/crud/columns/DateColumn.tsx +28 -28
  134. package/src/crud/columns/ImageColumn.tsx +58 -0
  135. package/src/crud/columns/NumberColumn.tsx +31 -31
  136. package/src/crud/columns/ReferenceColumn.tsx +85 -85
  137. package/src/crud/columns/ReferenceManyColumn.tsx +67 -67
  138. package/src/crud/columns/TextColumn.tsx +38 -38
  139. package/src/crud/context/FilterContext.tsx +71 -71
  140. package/src/crud/context/FormContext.tsx +39 -39
  141. package/src/crud/context/FormSectionContext.tsx +22 -22
  142. package/src/crud/context/InlineFieldsRegistry.tsx +61 -0
  143. package/src/crud/context/ListContext.tsx +93 -93
  144. package/src/crud/context/PayloadFieldsContext.tsx +62 -0
  145. package/src/crud/fields/BooleanField.tsx +38 -38
  146. package/src/crud/fields/DateField.tsx +53 -53
  147. package/src/crud/fields/FieldWrapper.tsx +87 -87
  148. package/src/crud/fields/FileField.tsx +123 -0
  149. package/src/crud/fields/ImageField.tsx +120 -0
  150. package/src/crud/fields/NumberField.tsx +52 -52
  151. package/src/crud/fields/PasswordField.tsx +99 -99
  152. package/src/crud/fields/ReferenceField.tsx +237 -96
  153. package/src/crud/fields/ReferenceInputActions.tsx +106 -0
  154. package/src/crud/fields/ReferenceManyField.tsx +200 -76
  155. package/src/crud/fields/SelectField.tsx +48 -48
  156. package/src/crud/fields/TextField.tsx +46 -46
  157. package/src/crud/fields/uploadFieldUtils.ts +21 -0
  158. package/src/crud/fields/useUploadPreviewUrl.ts +20 -0
  159. package/src/crud/filters/BooleanFilter.tsx +38 -38
  160. package/src/crud/filters/DateFilter.tsx +35 -35
  161. package/src/crud/filters/NumberFilter.tsx +33 -33
  162. package/src/crud/filters/ReferenceFilter.tsx +192 -173
  163. package/src/crud/filters/SelectFilter.tsx +44 -44
  164. package/src/crud/filters/TextFilter.tsx +36 -36
  165. package/src/crud/index.ts +99 -90
  166. package/src/crud/types.ts +146 -132
  167. package/src/crud/utils/buildFormPayload.ts +24 -0
  168. package/src/crud/utils/buildInlineRowsPayload.ts +37 -0
  169. package/src/crud/utils/buildResourceFormSubmitBody.ts +29 -0
  170. package/src/crud/utils/choiceSelectionUtils.test.ts +45 -0
  171. package/src/crud/utils/choiceSelectionUtils.ts +116 -0
  172. package/src/crud/utils/formErrors.test.ts +168 -0
  173. package/src/crud/utils/formErrors.ts +138 -38
  174. package/src/crud/utils/formSectionErrors.ts +85 -85
  175. package/src/crud/utils/{getByPath.ts → getFormValue.ts} +13 -13
  176. package/src/crud/utils/hasUploadValues.ts +9 -0
  177. package/src/crud/utils/nestedFieldPath.ts +8 -0
  178. package/src/crud/utils/prepareFormSubmitBody.ts +22 -0
  179. package/src/crud/utils/referenceSelectNotFoundContent.tsx +7 -0
  180. package/src/crud/utils/{setByPath.ts → setFormValue.ts} +18 -18
  181. package/src/crud/utils/sortQueryParam.ts +37 -37
  182. package/src/crud/utils/toFormData.ts +79 -0
  183. package/src/crud/utils/uploadReferenceUtils.ts +44 -0
  184. package/src/crud/utils/useAbortableEffect.ts +17 -17
  185. package/src/crud/utils/useChoices.ts +330 -182
  186. package/src/crud/utils/useFormRecord.ts +179 -0
  187. package/src/crud/utils/useListQueryState.ts +191 -191
  188. package/src/data/abortError.test.ts +19 -19
  189. package/src/data/abortError.ts +10 -10
  190. package/src/data/createMemoryResourceHandlers.ts +78 -78
  191. package/src/data/createRestResourceHandlers.ts +63 -57
  192. package/src/data/dataProviderTypes.ts +7 -5
  193. package/src/data/dataUtils.test.ts +228 -108
  194. package/src/data/inMemoryList.ts +97 -97
  195. package/src/data/parseFormErrorHelpers.test.ts +201 -84
  196. package/src/data/parseFormErrorHelpers.ts +376 -224
  197. package/src/data/resourceHandlers.ts +1 -1
  198. package/src/data/sortHelpers.ts +48 -48
  199. package/src/index.ts +211 -195
  200. package/src/layouts/AdminLayout.tsx +530 -381
  201. package/src/layouts/AuthPageLayout.tsx +87 -81
  202. package/src/layouts/navFilter.ts +49 -0
  203. package/src/layouts/navMenuItems.tsx +44 -0
  204. package/src/pages/LoginPage.tsx +80 -80
  205. package/src/pages/PlaceholderPage.tsx +9 -9
  206. package/src/permissions/resourcePermissions.ts +47 -47
  207. package/src/router/createAdminRouter.tsx +64 -64
  208. package/src/router/guards.tsx +63 -63
  209. package/src/router/routeAccess.ts +89 -89
  210. package/src/types.ts +10 -0
  211. package/src/vite-env.d.ts +1 -1
  212. package/dist/src/crud/context/SubmitFieldsContext.d.ts +0 -18
  213. package/dist/src/crud/context/SubmitFieldsContext.d.ts.map +0 -1
  214. package/dist/src/crud/utils/getByPath.d.ts +0 -3
  215. package/dist/src/crud/utils/getByPath.d.ts.map +0 -1
  216. package/dist/src/crud/utils/inlineArrayName.d.ts +0 -3
  217. package/dist/src/crud/utils/inlineArrayName.d.ts.map +0 -1
  218. package/dist/src/crud/utils/inlineFieldName.d.ts +0 -3
  219. package/dist/src/crud/utils/inlineFieldName.d.ts.map +0 -1
  220. package/dist/src/crud/utils/pickBySources.d.ts +0 -6
  221. package/dist/src/crud/utils/pickBySources.d.ts.map +0 -1
  222. package/dist/src/crud/utils/setByPath.d.ts +0 -3
  223. package/dist/src/crud/utils/setByPath.d.ts.map +0 -1
  224. package/dist/src/crud/utils/useResourceFormData.d.ts +0 -47
  225. package/dist/src/crud/utils/useResourceFormData.d.ts.map +0 -1
  226. package/src/crud/context/SubmitFieldsContext.tsx +0 -62
  227. package/src/crud/utils/inlineArrayName.ts +0 -4
  228. package/src/crud/utils/inlineFieldName.ts +0 -8
  229. package/src/crud/utils/pickBySources.ts +0 -24
  230. package/src/crud/utils/useResourceFormData.ts +0 -231
@@ -1,231 +0,0 @@
1
- import type { MessageInstance } from "antd/es/message/interface";
2
- import {
3
- useCallback,
4
- useState,
5
- type MutableRefObject,
6
- } from "react";
7
- import type { NavigateFunction } from "react-router-dom";
8
- import type { DataProvider } from "../../data/dataProviderTypes";
9
- import { isAbortError } from "../../data/abortError";
10
- import {
11
- type DefaultValues,
12
- type FieldValues,
13
- type UseFormReturn,
14
- } from "react-hook-form";
15
- import {
16
- loadInlineRows,
17
- saveInlineRows,
18
- type InlineFormSetProps,
19
- } from "../InlineFormSet";
20
- import { inlineArrayName } from "./inlineArrayName";
21
- import { pickBySources } from "./pickBySources";
22
- import { parseAndApplyFormErrors } from "./formErrors";
23
- import { useAbortableEffect } from "./useAbortableEffect";
24
-
25
- export type ResourceFormInlineConfig = Pick<
26
- InlineFormSetProps,
27
- "resource" | "foreignKey" | "name"
28
- >;
29
-
30
- export function resolveInlineArrayName(config: ResourceFormInlineConfig) {
31
- return inlineArrayName(config.resource, config.name);
32
- }
33
-
34
- type LoadOptions<T extends FieldValues> = {
35
- dp: DataProvider;
36
- resource: string;
37
- id: string | undefined;
38
- isNew: boolean;
39
- form: UseFormReturn<T>;
40
- message: MessageInstance;
41
- defaultValues?: Partial<T>;
42
- inlines?: ResourceFormInlineConfig[];
43
- };
44
-
45
- /** Edit mode: fetch parent (+ inline rows) → form.reset → bump formVersion for field arrays. */
46
- export function useResourceFormLoad<T extends FieldValues>({
47
- dp,
48
- resource,
49
- id,
50
- isNew,
51
- form,
52
- message,
53
- defaultValues,
54
- inlines,
55
- }: LoadOptions<T>) {
56
- const [loading, setLoading] = useState(!isNew);
57
- const [formVersion, setFormVersion] = useState(0);
58
- const [existingInlineIds, setExistingInlineIds] = useState<
59
- Record<string, (string | number)[]>
60
- >({});
61
-
62
- const load = useCallback(
63
- async (signal?: AbortSignal) => {
64
- if (isNew || !id) {
65
- if (defaultValues) {
66
- form.reset({ ...defaultValues } as DefaultValues<T>);
67
- }
68
- setLoading(false);
69
- return;
70
- }
71
- setLoading(true);
72
- try {
73
- const res = await dp.getOne(resource, id, { signal });
74
- if (signal?.aborted) return;
75
- const record = res.data as DefaultValues<T>;
76
- if (inlines?.length) {
77
- const merged = { ...record } as DefaultValues<T>;
78
- const idsMap: Record<string, (string | number)[]> = {};
79
- for (const cfg of inlines) {
80
- const arrayName = resolveInlineArrayName(cfg);
81
- const { rows, ids } = await loadInlineRows(
82
- dp,
83
- cfg.resource,
84
- cfg.foreignKey,
85
- id,
86
- );
87
- (merged as Record<string, unknown>)[arrayName] = rows;
88
- idsMap[arrayName] = ids;
89
- }
90
- if (signal?.aborted) return;
91
- form.reset(merged);
92
- setExistingInlineIds(idsMap);
93
- setFormVersion((v) => v + 1);
94
- } else {
95
- form.reset(record);
96
- setFormVersion((v) => v + 1);
97
- }
98
- } catch (e) {
99
- if (!isAbortError(e)) {
100
- message.error(e instanceof Error ? e.message : "Load failed");
101
- }
102
- } finally {
103
- if (!signal?.aborted) setLoading(false);
104
- }
105
- },
106
- [dp, resource, id, isNew, form, message, defaultValues, inlines],
107
- );
108
-
109
- useAbortableEffect((signal) => load(signal), [load]);
110
-
111
- return { loading, formVersion, existingInlineIds };
112
- }
113
-
114
- type SubmitOptions<T extends FieldValues & { id?: unknown }> = {
115
- dp: DataProvider;
116
- resource: string;
117
- id: string | undefined;
118
- isNew: boolean;
119
- form: UseFormReturn<T>;
120
- message: MessageInstance;
121
- navigate: NavigateFunction;
122
- listPath: string;
123
- submitFieldsRef: MutableRefObject<Set<string>>;
124
- inlines?: ResourceFormInlineConfig[];
125
- existingInlineIds: Record<string, (string | number)[]>;
126
- onSaved?: (record: T) => void;
127
- stayOnPage?: boolean;
128
- };
129
-
130
- /** Save: pickBySources → create/update parent → saveInlineRows for each inline config. */
131
- export function useResourceFormSubmit<T extends FieldValues & { id?: unknown }>({
132
- dp,
133
- resource,
134
- id,
135
- isNew,
136
- form,
137
- message,
138
- navigate,
139
- listPath,
140
- submitFieldsRef,
141
- inlines,
142
- existingInlineIds,
143
- onSaved,
144
- stayOnPage,
145
- }: SubmitOptions<T>) {
146
- return useCallback(
147
- async (values: T) => {
148
- try {
149
- const raw = values as Record<string, unknown>;
150
- let payload = pickBySources(raw, Array.from(submitFieldsRef.current));
151
- if (inlines?.length) {
152
- for (const cfg of inlines) {
153
- delete payload[resolveInlineArrayName(cfg)];
154
- }
155
- }
156
-
157
- let saved: T;
158
- if (isNew) {
159
- const res = await dp.create(resource, payload);
160
- saved = res.data as T;
161
- message.success("Created");
162
- } else if (id) {
163
- const res = await dp.update(resource, { id, data: payload });
164
- saved = res.data as T;
165
- message.success("Updated");
166
- } else {
167
- return;
168
- }
169
-
170
- const parentId = saved.id as string | number;
171
- if (inlines?.length && parentId != null) {
172
- for (const cfg of inlines) {
173
- const arrayName = resolveInlineArrayName(cfg);
174
- const rows =
175
- ((form.getValues(arrayName as never) as unknown) as
176
- | Record<string, unknown>[]
177
- | undefined) ?? [];
178
- const inlineOk = await saveInlineRows(dp, {
179
- resource: cfg.resource,
180
- foreignKey: cfg.foreignKey,
181
- parentId,
182
- rows,
183
- existingIds: existingInlineIds[arrayName] ?? [],
184
- onRowError: (e, index) => {
185
- const row = rows[index];
186
- const rowId = row?.id as string | number | undefined;
187
- return parseAndApplyFormErrors(dp, form, message, e, {
188
- resource: cfg.resource,
189
- mutation:
190
- rowId != null &&
191
- (existingInlineIds[arrayName] ?? []).some(
192
- (existingId) => existingId === rowId,
193
- )
194
- ? "update"
195
- : "create",
196
- inlineArrayName: arrayName,
197
- rowIndex: index,
198
- });
199
- },
200
- });
201
- if (!inlineOk) return;
202
- }
203
- }
204
-
205
- onSaved?.(saved);
206
- if (!stayOnPage) navigate(listPath);
207
- } catch (e) {
208
- parseAndApplyFormErrors(dp, form, message, e, {
209
- resource,
210
- mutation: isNew ? "create" : "update",
211
- });
212
- message.error(e instanceof Error ? e.message : "Save failed");
213
- }
214
- },
215
- [
216
- dp,
217
- resource,
218
- id,
219
- isNew,
220
- form,
221
- message,
222
- navigate,
223
- listPath,
224
- submitFieldsRef,
225
- inlines,
226
- existingInlineIds,
227
- onSaved,
228
- stayOnPage,
229
- ],
230
- );
231
- }