@dashadmin/dash-auto-admin 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 (176) hide show
  1. package/dist/DashAutoAdminComponentRegistry.js +64 -1
  2. package/dist/DashAutoAdminForm.js +137 -1
  3. package/dist/DashAutoAdminResizableDrawer.js +63 -1
  4. package/dist/DashAutoAdminSaveButton.js +57 -1
  5. package/dist/DashAutoCreate.js +102 -1
  6. package/dist/DashAutoDrawer.js +256 -1
  7. package/dist/DashAutoEdit.js +99 -1
  8. package/dist/DashAutoFiltersGenerator.js +193 -1
  9. package/dist/DashAutoFormGroups.js +118 -1
  10. package/dist/DashAutoFormLayout.js +68 -1
  11. package/dist/DashAutoFormMuiTabs.js +291 -1
  12. package/dist/DashAutoFormTabs.js +132 -1
  13. package/dist/DashAutoGroup.js +27 -1
  14. package/dist/DashAutoLayout.js +31 -1
  15. package/dist/DashAutoList.js +218 -1
  16. package/dist/DashAutoPostFilterForm.js +47 -1
  17. package/dist/DashAutoReferenceTab.js +10 -1
  18. package/dist/DashAutoResource.js +77 -1
  19. package/dist/DashAutoResourceLayout.js +16 -1
  20. package/dist/DashAutoShow.js +195 -1
  21. package/dist/DashAutoTabbedForm.js +244 -1
  22. package/dist/DashAutoTabbedForm.review.js +221 -1
  23. package/dist/DashAutoTabs.js +11 -1
  24. package/dist/DashFilterWrapper.js +62 -1
  25. package/dist/DashRedirect.js +56 -1
  26. package/dist/TabbedLayout.js +38 -1
  27. package/dist/common/DashAutoTitle.js +33 -1
  28. package/dist/common/components/FabButton.js +59 -1
  29. package/dist/common/components/TranslatedLabel.js +60 -1
  30. package/dist/common/settings/Settings.js +196 -1
  31. package/dist/common/settings/SettingsBarIcons.js +61 -1
  32. package/dist/context/DashAutoAdminFormContext.js +15 -1
  33. package/dist/hooks/useAutoAdminLoadingStateMediator.js +36 -1
  34. package/dist/hooks/useAutoAdminTranslate.js +61 -1
  35. package/dist/hooks/useHash.js +24 -1
  36. package/dist/hooks/useLogger.js +20 -1
  37. package/dist/hooks/useRoutePathPattern.js +20 -1
  38. package/dist/hooks/useVirtualHash.js +28 -1
  39. package/dist/index.js +77 -3406
  40. package/dist/list/DashAutoListActions.js +57 -1
  41. package/dist/list/DashAutoListDatagridWrapper.js +68 -1
  42. package/dist/list/DashAutoListDefaultActionsWrapper.js +14 -1
  43. package/dist/list/DashAutoListFilterFormWithButton.js +80 -1
  44. package/dist/list/DashAutoListTopToolbar.js +180 -1
  45. package/dist/mui/AttributeToField.js +576 -1
  46. package/dist/mui/AttributeToInput.js +630 -1
  47. package/dist/mui/AutoAdminResizableDrawer.js +63 -1
  48. package/dist/mui/AutoDataGrid.js +120 -1
  49. package/dist/mui/AutoReferenceFormTab.js +53 -1
  50. package/dist/mui/AutoReferenceTab.js +46 -1
  51. package/dist/mui/AutoTabs.js +19 -1
  52. package/dist/mui/components/ExtendedPagination.js +34 -1
  53. package/dist/mui/components/ListStringField.js +25 -1
  54. package/dist/providers/DashAuthProvider.js +215 -1
  55. package/dist/providers/DashDataProvider.js +310 -1
  56. package/dist/providers/index.js +10 -1
  57. package/dist/react-admin.d.js +0 -0
  58. package/dist/toolbar/buttons/BottomToolbarButtons.js +65 -1
  59. package/dist/toolbar/buttons/DashResourceButton.js +181 -1
  60. package/dist/toolbar/buttons/ListButtons.js +80 -1
  61. package/dist/toolbar/buttons/ToolbarButtons.js +135 -1
  62. package/dist/types/ActionCallback.d.js +0 -0
  63. package/dist/utils/SimpleLogger.js +52 -1
  64. package/dist/utils/enumToChoices.js +5 -1
  65. package/dist/utils/evalActionPermission.js +11 -1
  66. package/dist/utils/groupByTabs.js +21 -1
  67. package/dist/utils/hashedGroupByTabs.js +12 -1
  68. package/dist/utils/invertMap.js +12 -1
  69. package/dist/utils/isClassComponent.js +7 -1
  70. package/dist/utils/isComponent.js +29 -1
  71. package/dist/utils/isEnum.js +5 -1
  72. package/dist/utils/isFC.js +8 -1
  73. package/dist/utils/replaceParams.js +9 -1
  74. package/dist/utils/validate.js +19 -1
  75. package/dist/wrappers/UserAction.js +60 -1
  76. package/dist/wrappers/index.js +4 -1
  77. package/package.json +135 -120
  78. package/src/DashAutoAdminComponentRegistry.tsx +75 -0
  79. package/src/DashAutoAdminForm.tsx +155 -0
  80. package/src/DashAutoAdminResizableDrawer.tsx +69 -0
  81. package/src/DashAutoAdminSaveButton.tsx +116 -0
  82. package/src/DashAutoCreate.tsx +118 -0
  83. package/src/DashAutoDrawer.tsx +288 -0
  84. package/src/DashAutoEdit.tsx +109 -0
  85. package/src/DashAutoFiltersGenerator.tsx +208 -0
  86. package/src/DashAutoFormGroups.tsx +146 -0
  87. package/src/DashAutoFormLayout.tsx.review +113 -0
  88. package/src/DashAutoFormMuiTabs.tsx +368 -0
  89. package/src/DashAutoFormTabs.tsx +177 -0
  90. package/src/DashAutoGroup.tsx +42 -0
  91. package/src/DashAutoLayout.tsx +57 -0
  92. package/src/DashAutoList.tsx +237 -0
  93. package/src/DashAutoPostFilterForm.tsx +35 -0
  94. package/src/DashAutoReferenceTab.tsx +9 -0
  95. package/src/DashAutoResource.tsx +85 -0
  96. package/src/DashAutoResourceLayout.tsx +50 -0
  97. package/src/DashAutoShow.tsx +200 -0
  98. package/src/DashAutoTabbedForm.review.tsx +262 -0
  99. package/src/DashAutoTabbedForm.tsx +324 -0
  100. package/src/DashAutoTabs.tsx +19 -0
  101. package/src/DashFilterWrapper.tsx +43 -0
  102. package/src/DashRedirect.tsx +46 -0
  103. package/src/TabbedLayout.tsx +29 -0
  104. package/src/common/DashAutoTitle.tsx +24 -0
  105. package/src/common/components/FabButton.tsx +40 -0
  106. package/src/common/components/TranslatedLabel.tsx +81 -0
  107. package/src/common/settings/Settings.tsx +236 -0
  108. package/src/common/settings/SettingsBarIcons.tsx +72 -0
  109. package/src/context/DashAutoAdminFormContext.tsx +31 -0
  110. package/src/hooks/useAutoAdminLoadingStateMediator.tsx +42 -0
  111. package/src/hooks/useAutoAdminTranslate.tsx +106 -0
  112. package/src/hooks/useHash.tsx +27 -0
  113. package/src/hooks/useLogger.tsx +23 -0
  114. package/src/hooks/useRoutePathPattern.tsx +24 -0
  115. package/src/hooks/useVirtualHash.tsx +34 -0
  116. package/src/index.ts +85 -0
  117. package/src/interfaces/ICustomResourceSubComponent.ts +11 -0
  118. package/src/interfaces/IDashApplicationLayoutMainAction.ts +37 -0
  119. package/src/interfaces/IDashApplicationLayoutMenuItem.ts +24 -0
  120. package/src/interfaces/IDashAutoAdminAttribute.ts +104 -0
  121. package/src/interfaces/IDashAutoAdminCustomFieldComponent.ts +18 -0
  122. package/src/interfaces/IDashAutoAdminFormOptions.ts +22 -0
  123. package/src/interfaces/IDashAutoAdminListActions.ts +13 -0
  124. package/src/interfaces/IDashAutoAdminReference.ts +16 -0
  125. package/src/interfaces/IDashAutoAdminResourceConfig.ts +360 -0
  126. package/src/interfaces/IDashAutoForm.ts +24 -0
  127. package/src/interfaces/IDashAutoGridButton.ts +35 -0
  128. package/src/interfaces/IDashAutoShow.ts +12 -0
  129. package/src/interfaces/IGroupExtraData.ts +8 -0
  130. package/src/interfaces/IRecord.ts +7 -0
  131. package/src/interfaces/IReferenceFilter.ts +55 -0
  132. package/src/interfaces/IResourceComponent.ts +8 -0
  133. package/src/interfaces/IToolbarButton.ts +11 -0
  134. package/src/list/DashAutoListActions.tsx +88 -0
  135. package/src/list/DashAutoListDatagridWrapper.tsx +74 -0
  136. package/src/list/DashAutoListDefaultActionsWrapper.tsx +31 -0
  137. package/src/list/DashAutoListFilterFormWithButton.tsx +93 -0
  138. package/src/list/DashAutoListTopToolbar.tsx +240 -0
  139. package/src/mui/AttributeToField.tsx +657 -0
  140. package/src/mui/AttributeToInput.tsx +728 -0
  141. package/src/mui/AutoAdminResizableDrawer.tsx +69 -0
  142. package/src/mui/AutoDataGrid.tsx +127 -0
  143. package/src/mui/AutoReferenceFormTab.tsx +51 -0
  144. package/src/mui/AutoReferenceTab.tsx +45 -0
  145. package/src/mui/AutoTabs.tsx +32 -0
  146. package/src/mui/components/ExtendedPagination.tsx +23 -0
  147. package/src/mui/components/ListStringField.tsx +32 -0
  148. package/src/providers/DashAuthProvider.ts +341 -0
  149. package/src/providers/DashDataProvider.ts +466 -0
  150. package/src/providers/index.ts +17 -0
  151. package/src/toolbar/buttons/BottomToolbarButtons.tsx +59 -0
  152. package/src/toolbar/buttons/DashResourceButton.tsx +223 -0
  153. package/src/toolbar/buttons/ListButtons.tsx +137 -0
  154. package/src/toolbar/buttons/ToolbarButtons.tsx +186 -0
  155. package/src/utils/SimpleLogger.tsx +46 -0
  156. package/src/utils/enumToChoices.tsx +3 -0
  157. package/src/utils/evalActionPermission.tsx +14 -0
  158. package/src/utils/groupByTabs.tsx +23 -0
  159. package/src/utils/hashedGroupByTabs.tsx +16 -0
  160. package/src/utils/invertMap.tsx +10 -0
  161. package/src/utils/isClassComponent.tsx +9 -0
  162. package/src/utils/isComponent.tsx +45 -0
  163. package/src/utils/isEnum.tsx +3 -0
  164. package/src/utils/isFC.tsx +6 -0
  165. package/src/utils/replaceParams.tsx +6 -0
  166. package/src/utils/validate.tsx +24 -0
  167. package/src/wrappers/UserAction.tsx +67 -0
  168. package/src/wrappers/index.tsx +1 -0
  169. /package/{dist → src}/DashAutoAdminSaveButton.tsx.bkup +0 -0
  170. /package/{dist/DashAutoFormLayout.tsx.review → src/DashAutoFormLayout.tsx} +0 -0
  171. /package/{dist → src}/DashAutoFormTabs.review +0 -0
  172. /package/{dist → src}/DashAutoFormTabs.tsx.formcontext.wip +0 -0
  173. /package/{dist → src}/mui/AttributeToField.tsx.review +0 -0
  174. /package/{dist → src}/mui/AttributeToInput.tsx.review +0 -0
  175. /package/{dist → src}/react-admin.d.ts +0 -0
  176. /package/{dist → src}/types/ActionCallback.d.ts +0 -0
@@ -0,0 +1,657 @@
1
+ import { InputLabel } from '@mui/material';
2
+
3
+ import {
4
+ ImageInput,
5
+ FileInput,
6
+ DateTimeInput,
7
+ ArrayField,
8
+ BooleanField,
9
+ ChipField,
10
+ Datagrid,
11
+ DateField,
12
+ NumberField,
13
+ ImageField,
14
+ ReferenceArrayField,
15
+ ReferenceField,
16
+ SingleFieldList,
17
+ TextField,
18
+ FileField,
19
+ FunctionField,
20
+ } from 'react-admin';
21
+
22
+ import IDashAutoAdminAttribute from '../interfaces/IDashAutoAdminAttribute';
23
+ import IDashAutoAdminFormOptions from '../interfaces/IDashAutoAdminFormOptions';
24
+
25
+ import { UserAction } from '../wrappers';
26
+ import ListStringsField from './components/ListStringField';
27
+ import IRecord from '../interfaces/IRecord';
28
+ import React from 'react';
29
+ import IDashAutoAdminResourceConfig from '../interfaces/IDashAutoAdminResourceConfig';
30
+ import IDashAutoAdminCustomFieldComponent from '../interfaces/IDashAutoAdminCustomFieldComponent';
31
+ import isEnum from '../utils/isEnum';
32
+ import replaceParams from '../utils/replaceParams';
33
+ import { useParams } from 'react-router';
34
+ import { useComponentRegistry } from '../DashAutoAdminComponentRegistry';
35
+
36
+ export const AttributeToField = (
37
+ method: 'view' | 'list' | 'create' | 'edit',
38
+ resourceConfig: IDashAutoAdminResourceConfig,
39
+ input: IDashAutoAdminAttribute,
40
+ index?: number,
41
+ options?: IDashAutoAdminFormOptions,
42
+ resource?: string,
43
+ record?: IRecord,
44
+ ) => {
45
+ // Locale is available in options?.locale
46
+ // Get the component registry
47
+ const { components } = useComponentRegistry();
48
+
49
+ const params = useParams();
50
+
51
+ const sortableField = input.sortable === true ? true : false;
52
+
53
+ const typeComponentMapper = (type: string) => {
54
+ const component = components[type];
55
+
56
+
57
+ if (component) {
58
+ return { custom: true, type: "component", component };
59
+ }
60
+
61
+ return { custom: true, type: "component", component: () => <>No component for {type}</> };
62
+ };
63
+
64
+
65
+
66
+ const ComponentWrapper =
67
+ resourceConfig?.fieldWrapper &&
68
+ typeof resourceConfig.fieldWrapper === 'function'
69
+ ? resourceConfig.fieldWrapper
70
+ : ({
71
+ _record,
72
+ _method,
73
+ _attribute,
74
+ _resourceConfig,
75
+ children,
76
+ }: IDashAutoAdminCustomFieldComponent) => {
77
+ return children;
78
+ };
79
+
80
+ record = options?.record ? options.record : record;
81
+
82
+ if (
83
+ options &&
84
+ options.useReadOnlyInputAsTextField === true &&
85
+ input.readOnly
86
+ ) {
87
+ return (
88
+ <ComponentWrapper
89
+ key={index}
90
+ label={input.label}
91
+ sortable={sortableField}
92
+ source={input.listAttribute ? input.listAttribute : input.attribute}
93
+ {...(record && { record: record })}
94
+ method={method}
95
+ attribute={input}
96
+ resourceConfig={resourceConfig}
97
+ >
98
+ <TextField
99
+ {...(record && { record: record })}
100
+ sortable={sortableField}
101
+ {...(sortableField && {
102
+ sortBy: input.listAttribute || input.attribute,
103
+ })}
104
+ key={index}
105
+ label={input.label}
106
+ source={input.listAttribute ? input.listAttribute : input.attribute}
107
+ {...{
108
+ ...input.fieldProps,
109
+ editable: false,
110
+ InputProps: { readOnly: true },
111
+ }}
112
+ disabled
113
+ />
114
+ </ComponentWrapper>
115
+ );
116
+ } else if (options && options.readOnlyComponent && input.readOnly) {
117
+ return (
118
+ <ComponentWrapper
119
+ {...(record && { record: record })}
120
+ method={method}
121
+ attribute={input}
122
+ key={index}
123
+ label={input.label}
124
+ sortable={sortableField}
125
+ source={input.listAttribute ? input.listAttribute : input.attribute}
126
+ resourceConfig={resourceConfig}
127
+ >
128
+ <options.readOnlyComponent
129
+ key={index}
130
+ {...(record && { record: record })}
131
+ sortable={sortableField}
132
+ {...(sortableField && {
133
+ sortBy: input.listAttribute || input.attribute,
134
+ })}
135
+ input={input}
136
+ label={input.label}
137
+ source={input.listAttribute ? input.listAttribute : input.attribute}
138
+ {...{
139
+ ...input.fieldProps,
140
+ editable: false,
141
+ InputProps: { readOnly: true },
142
+ }}
143
+ />
144
+ </ComponentWrapper>
145
+ );
146
+ }
147
+
148
+ // Check if input type is a string and not an array or enum
149
+
150
+ if (typeof input.type === "string" && !input.type.includes(".") && !Array.isArray(input.type)) {
151
+ switch (input.type) {
152
+ case 'string':
153
+ case 'text':
154
+ case 'String':
155
+ input.type = String;
156
+ break;
157
+ case 'number':
158
+ case 'Number':
159
+ case 'integer':
160
+ input.type = Number;
161
+ break;
162
+ case 'boolean':
163
+ case 'Boolean':
164
+ input.type = Boolean;
165
+ break;
166
+ case 'date':
167
+ case 'Date':
168
+ input.type = Date;
169
+ break;
170
+ case 'custom':
171
+ default:
172
+
173
+ input.custom = true;
174
+ if(typeof input?.component === "string") {
175
+ input = { ...input, ...typeComponentMapper( input.component ) };
176
+ }
177
+ break;
178
+ }
179
+ }
180
+
181
+ // CUSTOM COMPONENT
182
+ if (
183
+ (input.custom && input.component) ||
184
+ (input.type === 'component' && input.component)
185
+ ) {
186
+
187
+ return (
188
+ <FunctionField
189
+ key={`function_field_${index}`}
190
+ label={input.label}
191
+ sortable={sortableField}
192
+ {...(sortableField && {
193
+ sortBy: input.listAttribute || input.attribute,
194
+ })}
195
+ render={(r) => {
196
+ return <ComponentWrapper
197
+ {...(r && { record: r })}
198
+ method={method}
199
+ attribute={input}
200
+ key={index}
201
+ label={input.label}
202
+ sortable={sortableField}
203
+ source={
204
+ input.listAttribute ? input.listAttribute : input.attribute
205
+ }
206
+ resourceConfig={resourceConfig}
207
+ >
208
+ <UserAction
209
+ key={`custom_component_${index}`}
210
+ {...(r && { record: r })}
211
+ method={method}
212
+ attribute={input}
213
+ resourceConfig={resourceConfig}
214
+ options={options}
215
+ />
216
+ </ComponentWrapper>
217
+
218
+ }}
219
+ />
220
+ );
221
+ }
222
+
223
+ if (Array.isArray(input.type) && input.type.length > 0) {
224
+ const inputType: string | IDashAutoAdminAttribute = input.type[0];
225
+
226
+ /* Force the label to be the attribute name */
227
+ if (!input.label) {
228
+ input.label = input.attribute;
229
+ }
230
+ /* Array of enum values – We use a SelectArrayInput */
231
+ if (isEnum(inputType)) {
232
+ return (
233
+ <ComponentWrapper
234
+ {...(record && { record: record })}
235
+ method={method}
236
+ attribute={input}
237
+ key={index}
238
+ label={input.label}
239
+ sortable={sortableField}
240
+ source={input.listAttribute ? input.listAttribute : input.attribute}
241
+ resourceConfig={resourceConfig}
242
+ >
243
+ <ListStringsField
244
+ key={index}
245
+ label={input.label}
246
+ source={input.listAttribute ? input.listAttribute : input.attribute}
247
+ map={inputType}
248
+
249
+ />
250
+ </ComponentWrapper>
251
+ );
252
+ }
253
+
254
+ if (typeof inputType === 'string') {
255
+ const _params = {...params,...(location.hash.match(/\d+/g) || []).map(Number).reduce((acc, curr, index) => {
256
+ acc[index] = curr;
257
+ return acc;
258
+ }, {})};
259
+
260
+ const _inputType = replaceParams(_params,inputType);
261
+
262
+ const [reference, sourceName] = _inputType.split('.');
263
+
264
+ return (
265
+ <ComponentWrapper
266
+ {...(record && { record: record })}
267
+ method={method}
268
+ attribute={input}
269
+ key={index}
270
+ label={input.label}
271
+ sortable={sortableField}
272
+ source={input.listAttribute ? input.listAttribute : input.attribute}
273
+ resourceConfig={resourceConfig}
274
+ >
275
+ <>
276
+ <ReferenceArrayField
277
+ key={index}
278
+ sortable={sortableField}
279
+ {...(sortableField && {
280
+ sortBy: input.listAttribute || input.attribute,
281
+ })}
282
+ label={input.label}
283
+ source={
284
+ input.listAttribute ? input.listAttribute : input.attribute
285
+ }
286
+ reference={reference}
287
+ {...input.componentProps}
288
+ >
289
+ <SingleFieldList {...input.fieldProps}>
290
+ <ChipField source={sourceName} />
291
+ </SingleFieldList>
292
+ </ReferenceArrayField>
293
+ </>
294
+ </ComponentWrapper>
295
+ );
296
+ } else {
297
+ const inputTypeArray = input.type as IDashAutoAdminAttribute[];
298
+ return (
299
+ <ComponentWrapper
300
+ {...(record && { record: record })}
301
+ method={method}
302
+ attribute={input}
303
+ key={index}
304
+ label={input.label}
305
+ sortable={sortableField}
306
+ source={input.listAttribute ? input.listAttribute : input.attribute}
307
+ resourceConfig={resourceConfig}
308
+ {...input.componentProps}
309
+ >
310
+ <>
311
+ <ArrayField
312
+ key={index}
313
+ sortable={sortableField}
314
+ {...(sortableField && {
315
+ sortBy: input.listAttribute || input.attribute,
316
+ })}
317
+ label={input.label}
318
+ source={
319
+ input.listAttribute ? input.listAttribute : input.attribute
320
+ }
321
+ {...input.fieldProps}
322
+ >
323
+ <Datagrid>
324
+ {inputTypeArray.map((attribute, idx) =>
325
+ AttributeToField(
326
+ method,
327
+ resourceConfig,
328
+ attribute,
329
+ idx,
330
+ options,
331
+ ),
332
+ )}
333
+ </Datagrid>
334
+ </ArrayField>
335
+ </>
336
+ </ComponentWrapper>
337
+ );
338
+ }
339
+ }
340
+
341
+ if (typeof input.type === 'string') {
342
+ const _params = {...params,...(location.hash.match(/\d+/g) || []).map(Number).reduce((acc, curr, index) => {
343
+ acc[index] = curr;
344
+ return acc;
345
+ }, {})};
346
+
347
+ const _inputType = replaceParams(_params,input.type);
348
+ const [reference, sourceName] = _inputType.split('.');
349
+
350
+ if (input && input.multiple === false) {
351
+ const componentWrapperProps = {
352
+ ...(record && { record: record }),
353
+ method,
354
+ attribute: input,
355
+ label: input.label,
356
+ sortable: sortableField,
357
+ source: input.listAttribute ? input.listAttribute : input.attribute,
358
+ resourceConfig
359
+ }
360
+
361
+ const componentProps = {
362
+ ...(record && { record: record }),
363
+ sortable: sortableField,
364
+ ...(sortableField && {
365
+ sortBy: input.listAttribute || input.attribute,
366
+ }),
367
+ label: input.label,
368
+ link: 'show',
369
+ source: input.listAttribute ? input.listAttribute : input.attribute,
370
+ reference: reference,
371
+ ...input.componentProps
372
+ }
373
+
374
+ return <ComponentWrapper
375
+ {...componentWrapperProps}
376
+ >
377
+ <ReferenceField
378
+ {...componentProps}
379
+ />
380
+ </ComponentWrapper>
381
+ }
382
+
383
+ const componentWrapperProps = {
384
+ ...(record && { record: record }),
385
+ method: method,
386
+ attribute: input,
387
+ label: input.label,
388
+ sortable: sortableField,
389
+ source: input.listAttribute ? input.listAttribute : input.attribute,
390
+ resourceConfig: resourceConfig
391
+ }
392
+
393
+ const componentProps = {
394
+ ...(record && { record: record }),
395
+ sortable: sortableField,
396
+ ...(sortableField && {
397
+ sortBy: input.listAttribute || input.attribute,
398
+ }),
399
+ label: input.label,
400
+ source: input.listAttribute ? input.listAttribute : input.attribute,
401
+ reference: reference,
402
+
403
+ }
404
+
405
+ return (
406
+ <ComponentWrapper {...componentWrapperProps} >
407
+ {/* @ts-ignore - Record type compatibility */}
408
+ <ReferenceArrayField {...componentProps} >
409
+
410
+ <SingleFieldList {...input.fieldProps}>
411
+ <ChipField source={sourceName} />
412
+ </SingleFieldList>
413
+ </ReferenceArrayField>
414
+ </ComponentWrapper>
415
+ );
416
+ }
417
+
418
+ switch (input.type) {
419
+ case Number:
420
+ return (
421
+ <FunctionField
422
+ label={input.label}
423
+ sortable={sortableField}
424
+ {...(sortableField && {
425
+ sortBy: input.listAttribute || input.attribute,
426
+ })}
427
+ key={`function_field_${index}`}
428
+ render={(r) => {
429
+ return (
430
+ <ComponentWrapper
431
+ {...(r && { record: r })}
432
+ method={method}
433
+ attribute={input}
434
+ key={index}
435
+ label={input.label}
436
+ sortable={sortableField}
437
+ source={
438
+ input.listAttribute ? input.listAttribute : input.attribute
439
+ }
440
+ resourceConfig={resourceConfig}
441
+ >
442
+ <NumberField
443
+ key={`number_field_${index}`}
444
+ label={input.label}
445
+ {...(record && { record: record })}
446
+ sortable={input.sortable === true ? true : false}
447
+ source={
448
+ input.listAttribute ? input.listAttribute : input.attribute
449
+ }
450
+ {...input.fieldProps}
451
+ />
452
+ </ComponentWrapper>
453
+ );
454
+ }}
455
+ />
456
+ );
457
+
458
+ case Boolean:
459
+ return record ? (
460
+ <>
461
+ {input?.showLabel !== false && (
462
+ <ComponentWrapper
463
+ {...(record && { record: record })}
464
+ method={method}
465
+ attribute={input}
466
+ key={index}
467
+ label={input.label}
468
+ sortable={sortableField}
469
+ source={
470
+ input.listAttribute ? input.listAttribute : input.attribute
471
+ }
472
+ resourceConfig={resourceConfig}
473
+ >
474
+ <InputLabel
475
+ htmlFor={
476
+ input.listAttribute ? input.listAttribute : input.attribute
477
+ }
478
+ >
479
+ {input.label}
480
+ </InputLabel>
481
+ </ComponentWrapper>
482
+ )}
483
+ <ComponentWrapper
484
+ {...(record && { record: record })}
485
+ method={method}
486
+ attribute={input}
487
+ key={index}
488
+ label={input.label}
489
+ sortable={sortableField}
490
+ source={input.listAttribute ? input.listAttribute : input.attribute}
491
+ resourceConfig={resourceConfig}
492
+ >
493
+ <BooleanField
494
+ sortable={sortableField}
495
+ {...(sortableField && {
496
+ sortBy: input.listAttribute || input.attribute,
497
+ })}
498
+ record={record}
499
+ key={index}
500
+ id={input.listAttribute ? input.listAttribute : input.attribute}
501
+ label={input.label}
502
+ source={
503
+ input.listAttribute ? input.listAttribute : input.attribute
504
+ }
505
+ {...input.fieldProps}
506
+ />
507
+ </ComponentWrapper>
508
+ </>
509
+ ) : (
510
+ <FunctionField
511
+ label={input.label}
512
+ sortable={sortableField}
513
+ {...(sortableField && {
514
+ sortBy: input.listAttribute || input.attribute,
515
+ })}
516
+ render={(r) => (
517
+ <>
518
+ <ComponentWrapper
519
+ {...(r && { record: r })}
520
+ method={method}
521
+ attribute={input}
522
+ key={index}
523
+ label={input.label}
524
+ sortable={sortableField}
525
+ source={
526
+ input.listAttribute ? input.listAttribute : input.attribute
527
+ }
528
+ resourceConfig={resourceConfig}
529
+ >
530
+ <BooleanField
531
+ record={record}
532
+ key={index}
533
+ id={
534
+ input.listAttribute ? input.listAttribute : input.attribute
535
+ }
536
+ label={input.label}
537
+ source={
538
+ input.listAttribute ? input.listAttribute : input.attribute
539
+ }
540
+ {...input.fieldProps}
541
+ />
542
+ </ComponentWrapper>
543
+ </>
544
+ )}
545
+ />
546
+ );
547
+
548
+ case DateTimeInput:
549
+ case Date:
550
+ return (
551
+ <ComponentWrapper
552
+ {...(record && { record: record })}
553
+ method={method}
554
+ attribute={input}
555
+ label={input.label}
556
+ sortable={sortableField}
557
+ source={input.listAttribute ? input.listAttribute : input.attribute}
558
+ key={index}
559
+ resourceConfig={resourceConfig}
560
+ >
561
+ <DateField
562
+ {...(record && { record: record })}
563
+ key={index}
564
+ sortable={sortableField}
565
+ {...(sortableField && {
566
+ sortBy: input.listAttribute || input.attribute,
567
+ })}
568
+ label={input.label}
569
+ showTime={
570
+ (input.fieldProps && input.fieldProps.showTime) || false
571
+ }
572
+ source={input.listAttribute ? input.listAttribute : input.attribute}
573
+ {...input.fieldProps}
574
+ />
575
+ </ComponentWrapper>
576
+ );
577
+
578
+ case ImageInput:
579
+ return (
580
+ <ComponentWrapper
581
+ {...(record && { record: record })}
582
+ method={method}
583
+ attribute={input}
584
+ key={index}
585
+ label={input.label}
586
+ sortable={sortableField}
587
+ source={input.listAttribute ? input.listAttribute : input.attribute}
588
+ resourceConfig={resourceConfig}
589
+ >
590
+ <ImageField
591
+ {...(record && { record: record })}
592
+ sortable={sortableField}
593
+ {...(sortableField && {
594
+ sortBy: input.listAttribute || input.attribute,
595
+ })}
596
+ key={index}
597
+ source={input.attribute}
598
+ label={input.label}
599
+ />
600
+ </ComponentWrapper>
601
+ );
602
+
603
+ case FileInput:
604
+ return (
605
+ <ComponentWrapper
606
+ {...(record && { record: record })}
607
+ method={method}
608
+ attribute={input}
609
+ key={index}
610
+ label={input.label}
611
+ sortable={sortableField}
612
+ source={input.listAttribute ? input.listAttribute : input.attribute}
613
+ resourceConfig={resourceConfig}
614
+ >
615
+ <FileField
616
+ {...(record && { record: record })}
617
+ sortable={sortableField}
618
+ {...(sortableField && {
619
+ sortBy: input.listAttribute || input.attribute,
620
+ })}
621
+ key={index}
622
+ source={input.listAttribute ?? input.attribute}
623
+ title={input.listAttribute}
624
+ download={true}
625
+ />
626
+ </ComponentWrapper>
627
+ );
628
+ }
629
+
630
+ const textFieldProps = {
631
+ ...(record && { record: record }),
632
+ sortable: sortableField,
633
+ ...(sortableField && {
634
+ sortBy: input.listAttribute || input.attribute,
635
+ }),
636
+ label: input.label,
637
+ source: input.listAttribute ? input.listAttribute : input.attribute,
638
+ ...input.fieldProps,
639
+ ...(input.slotProps ? { slotProps: input.slotProps } : {})
640
+ }
641
+
642
+ return (
643
+ <ComponentWrapper
644
+ label={input.label}
645
+ sortable={sortableField}
646
+ source={input.listAttribute ? input.listAttribute : input.attribute}
647
+ {...(record && { record: record })}
648
+ method={method}
649
+ attribute={input}
650
+ resourceConfig={resourceConfig}
651
+ >
652
+ <TextField
653
+ {...textFieldProps}
654
+ />
655
+ </ComponentWrapper>
656
+ );
657
+ };