@rebasepro/admin 0.2.1 → 0.2.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 (214) hide show
  1. package/dist/{CollectionEditorDialog-BXIh2AXg.js → CollectionEditorDialog-D0VqpLPO.js} +73 -256
  2. package/dist/CollectionEditorDialog-D0VqpLPO.js.map +1 -0
  3. package/dist/{CollectionsStudioView-jR8iz_ja.js → CollectionsStudioView-Bc3Rxxc2.js} +5 -4
  4. package/dist/{CollectionsStudioView-jR8iz_ja.js.map → CollectionsStudioView-Bc3Rxxc2.js.map} +1 -1
  5. package/dist/{ExportCollectionAction-CMdiiv1L.js → ExportCollectionAction-Ckc-09BQ.js} +4 -3
  6. package/dist/ExportCollectionAction-Ckc-09BQ.js.map +1 -0
  7. package/dist/{ImportCollectionAction-C05lE0IW.js → ImportCollectionAction-BqjIrC3Z.js} +3 -2
  8. package/dist/{ImportCollectionAction-C05lE0IW.js.map → ImportCollectionAction-BqjIrC3Z.js.map} +1 -1
  9. package/dist/{PropertyEditView-BB5xjnhZ.js → PropertyEditView-CvRSV-A2.js} +430 -445
  10. package/dist/PropertyEditView-CvRSV-A2.js.map +1 -0
  11. package/dist/collection_editor/ConfigControllerProvider.d.ts +0 -5
  12. package/dist/collection_editor/index.d.ts +0 -1
  13. package/dist/collection_editor/types/collection_editor_controller.d.ts +0 -2
  14. package/dist/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.d.ts +3 -3
  15. package/dist/collection_editor/ui/collection_editor/properties/RelationPropertyField.d.ts +1 -7
  16. package/dist/collection_editor_ui.js +3 -3
  17. package/dist/components/ArrayContainer.d.ts +2 -2
  18. package/dist/components/DefaultAppBar.d.ts +18 -1
  19. package/dist/components/DefaultDrawer.d.ts +51 -3
  20. package/dist/components/EntityCollectionTable/fields/TableStorageUpload.d.ts +2 -2
  21. package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +2 -2
  22. package/dist/components/EntityCollectionTable/table_bindings.d.ts +4 -3
  23. package/dist/components/EntityCollectionView/hooks/useKanbanDragAndDrop.d.ts +4 -3
  24. package/dist/components/EntityEditView.d.ts +2 -1
  25. package/dist/components/HomePage/HomePageDnD.d.ts +3 -3
  26. package/dist/components/PropertyCollectionView.d.ts +1 -1
  27. package/dist/components/PropertyIdCopyTooltip.d.ts +1 -1
  28. package/dist/components/SelectableTable/SelectionStore.d.ts +4 -1
  29. package/dist/components/SelectableTable/filters/BooleanFilterField.d.ts +2 -2
  30. package/dist/components/SelectableTable/filters/DateTimeFilterField.d.ts +2 -2
  31. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -2
  32. package/dist/components/SelectableTable/filters/StringNumberFilterField.d.ts +2 -2
  33. package/dist/components/admin/RolesView.d.ts +3 -3
  34. package/dist/components/admin/UsersView.d.ts +3 -3
  35. package/dist/components/app/Drawer.d.ts +8 -1
  36. package/dist/data_export/export/export.d.ts +3 -3
  37. package/dist/editor/components/editor-bubble.d.ts +5 -1
  38. package/dist/editor/components/image-bubble.d.ts +5 -1
  39. package/dist/editor/components/index.d.ts +3 -3
  40. package/dist/editor/components/table-bubble.d.ts +5 -1
  41. package/dist/editor/nodeViews/ReactNodeView.d.ts +4 -1
  42. package/dist/editor/useProseMirror.d.ts +2 -2
  43. package/dist/editor/utils/remove_classes.d.ts +1 -1
  44. package/dist/editor.js +15 -14
  45. package/dist/editor.js.map +1 -1
  46. package/dist/form/EntityForm.d.ts +2 -2
  47. package/dist/form/components/StorageUploadProgress.d.ts +2 -2
  48. package/dist/form/field_bindings/MultiSelectFieldBinding.d.ts +1 -1
  49. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +1 -1
  50. package/dist/form/validation.d.ts +3 -3
  51. package/dist/hooks/navigation/useResolvedCollections.d.ts +6 -0
  52. package/dist/hooks/navigation/useResolvedViews.d.ts +3 -4
  53. package/dist/{index-BAM9KCmM.js → index-BCcLwgfe.js} +3 -2
  54. package/dist/{index-BAM9KCmM.js.map → index-BCcLwgfe.js.map} +1 -1
  55. package/dist/{index-D5OQhv-T.js → index-DY2k5TtG.js} +3 -3
  56. package/dist/index-DY2k5TtG.js.map +1 -0
  57. package/dist/{index-CoSNm3e3.js → index-UQOMHwt1.js} +3 -3
  58. package/dist/index-UQOMHwt1.js.map +1 -0
  59. package/dist/index.d.ts +1 -1
  60. package/dist/index.js +2813 -372
  61. package/dist/index.js.map +1 -1
  62. package/dist/{markdown-z2Ir7Cgo.js → markdown-DD2JDU1X.js} +2 -2
  63. package/dist/markdown-DD2JDU1X.js.map +1 -0
  64. package/dist/preview/components/UrlComponentPreview.d.ts +1 -0
  65. package/dist/types/components/EntityFormActionsProps.d.ts +1 -1
  66. package/dist/types/components/EntityFormProps.d.ts +2 -2
  67. package/dist/types/fields.d.ts +1 -1
  68. package/dist/{util-DtbWD7LF.js → util-ZM9gQuCv.js} +2104 -2071
  69. package/dist/util-ZM9gQuCv.js.map +1 -0
  70. package/package.json +10 -9
  71. package/src/collection_editor/ConfigControllerProvider.tsx +3 -13
  72. package/src/collection_editor/index.ts +1 -3
  73. package/src/collection_editor/types/collection_editor_controller.tsx +0 -3
  74. package/src/collection_editor/ui/EditorCollectionAction.tsx +1 -6
  75. package/src/collection_editor/ui/EditorCollectionActionStart.tsx +1 -6
  76. package/src/collection_editor/ui/EditorEntityAction.tsx +1 -6
  77. package/src/collection_editor/ui/HomePageEditorCollectionAction.tsx +7 -14
  78. package/src/collection_editor/ui/NewCollectionCard.tsx +1 -5
  79. package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +3 -8
  80. package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +1 -10
  81. package/src/collection_editor/ui/collection_editor/CollectionJsonImportDialog.tsx +8 -12
  82. package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +21 -21
  83. package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +4 -4
  84. package/src/collection_editor/ui/collection_editor/EnumForm.tsx +1 -1
  85. package/src/collection_editor/ui/collection_editor/properties/BlockPropertyField.tsx +3 -3
  86. package/src/collection_editor/ui/collection_editor/properties/CommonPropertyFields.tsx +3 -3
  87. package/src/collection_editor/ui/collection_editor/properties/DateTimePropertyField.tsx +8 -8
  88. package/src/collection_editor/ui/collection_editor/properties/EnumPropertyField.tsx +5 -5
  89. package/src/collection_editor/ui/collection_editor/properties/MapPropertyField.tsx +2 -2
  90. package/src/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.tsx +5 -5
  91. package/src/collection_editor/ui/collection_editor/properties/NumberPropertyField.tsx +5 -5
  92. package/src/collection_editor/ui/collection_editor/properties/ReferencePropertyField.tsx +2 -2
  93. package/src/collection_editor/ui/collection_editor/properties/RelationPropertyField.tsx +37 -57
  94. package/src/collection_editor/ui/collection_editor/properties/RepeatPropertyField.tsx +2 -2
  95. package/src/collection_editor/ui/collection_editor/properties/StoragePropertyField.tsx +8 -8
  96. package/src/collection_editor/ui/collection_editor/properties/StringPropertyField.tsx +5 -5
  97. package/src/collection_editor/ui/collection_editor/properties/UrlPropertyField.tsx +3 -2
  98. package/src/collection_editor/ui/collection_editor/properties/VectorPropertyField.tsx +2 -2
  99. package/src/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx +2 -2
  100. package/src/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx +1 -1
  101. package/src/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx +4 -7
  102. package/src/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.tsx +4 -4
  103. package/src/collection_editor/validateCollectionJson.ts +88 -1
  104. package/src/components/ArrayContainer.tsx +3 -3
  105. package/src/components/DefaultAppBar.tsx +52 -31
  106. package/src/components/DefaultDrawer.tsx +279 -66
  107. package/src/components/DrawerNavigationItem.tsx +1 -1
  108. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +6 -5
  109. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +9 -7
  110. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +5 -5
  111. package/src/components/EntityCollectionTable/fields/VirtualTableNumberInput.tsx +12 -9
  112. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +2 -2
  113. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +1 -1
  114. package/src/components/EntityCollectionTable/table_bindings.tsx +5 -4
  115. package/src/components/EntityCollectionView/EntityCollectionView.tsx +6 -4
  116. package/src/components/EntityCollectionView/hooks/useCollectionInlineEditor.ts +1 -1
  117. package/src/components/EntityCollectionView/hooks/useKanbanDragAndDrop.ts +7 -6
  118. package/src/components/EntityDetailView.tsx +46 -24
  119. package/src/components/EntityEditView.tsx +51 -28
  120. package/src/components/EntityEditViewFormActions.tsx +4 -4
  121. package/src/components/EntityPreview.tsx +9 -4
  122. package/src/components/HomePage/HomePageDnD.tsx +3 -2
  123. package/src/components/PropertyCollectionView.tsx +1 -1
  124. package/src/components/PropertyIdCopyTooltip.tsx +1 -1
  125. package/src/components/RebaseLayout.tsx +5 -1
  126. package/src/components/RebaseNavigation.tsx +2 -2
  127. package/src/components/RebaseRouteDefs.tsx +4 -7
  128. package/src/components/RebaseShell.tsx +16 -13
  129. package/src/components/SearchIconsView.tsx +1 -8
  130. package/src/components/SelectableTable/SelectableTable.tsx +8 -11
  131. package/src/components/SelectableTable/SelectionStore.ts +1 -1
  132. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +3 -3
  133. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +3 -3
  134. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +5 -5
  135. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +3 -3
  136. package/src/components/SideEntityProvider.tsx +2 -1
  137. package/src/components/admin/RolesView.tsx +7 -2
  138. package/src/components/admin/UsersView.tsx +12 -6
  139. package/src/components/app/Drawer.tsx +9 -1
  140. package/src/components/app/Scaffold.tsx +5 -1
  141. package/src/data_export/export/export.ts +17 -17
  142. package/src/data_import/components/DataNewPropertiesMapping.tsx +1 -1
  143. package/src/editor/components/editor-bubble.tsx +32 -9
  144. package/src/editor/components/image-bubble.tsx +27 -11
  145. package/src/editor/components/index.ts +3 -3
  146. package/src/editor/components/table-bubble.tsx +79 -17
  147. package/src/editor/extensions/HighlightDecorationExtension.ts +3 -2
  148. package/src/editor/nodeViews/ReactNodeView.tsx +1 -1
  149. package/src/editor/nodeViews/TaskItemComponent.tsx +9 -8
  150. package/src/editor/schema.ts +135 -59
  151. package/src/editor/selectors/link-selector.tsx +8 -5
  152. package/src/editor/useProseMirror.ts +2 -2
  153. package/src/editor/utils/remove_classes.ts +6 -5
  154. package/src/form/EntityForm.tsx +15 -15
  155. package/src/form/EntityFormActions.tsx +2 -2
  156. package/src/form/PropertyFieldBinding.tsx +64 -64
  157. package/src/form/components/FieldHelperText.tsx +4 -4
  158. package/src/form/components/StorageUploadProgress.tsx +2 -2
  159. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +1 -1
  160. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +1 -1
  161. package/src/form/field_bindings/BlockFieldBinding.tsx +54 -53
  162. package/src/form/field_bindings/KeyValueFieldBinding.tsx +290 -289
  163. package/src/form/field_bindings/MapFieldBinding.tsx +2 -2
  164. package/src/form/field_bindings/MultiSelectFieldBinding.tsx +2 -2
  165. package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +1 -1
  166. package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +1 -1
  167. package/src/form/field_bindings/ReferenceFieldBinding.tsx +8 -6
  168. package/src/form/field_bindings/RelationFieldBinding.tsx +4 -4
  169. package/src/form/field_bindings/RepeatFieldBinding.tsx +1 -1
  170. package/src/form/field_bindings/SelectFieldBinding.tsx +1 -1
  171. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +84 -84
  172. package/src/form/field_bindings/SwitchFieldBinding.tsx +16 -16
  173. package/src/form/field_bindings/TextFieldBinding.tsx +77 -73
  174. package/src/form/field_bindings/UserSelectFieldBinding.tsx +17 -17
  175. package/src/form/validation.ts +43 -43
  176. package/src/hooks/navigation/useBuildNavigationStateController.tsx +3 -5
  177. package/src/hooks/navigation/useResolvedCollections.ts +27 -7
  178. package/src/hooks/navigation/useResolvedViews.tsx +24 -44
  179. package/src/index.ts +2 -0
  180. package/src/preview/PropertyPreview.tsx +2 -2
  181. package/src/preview/components/ImagePreview.tsx +2 -1
  182. package/src/preview/components/UrlComponentPreview.tsx +11 -2
  183. package/src/preview/components/UserPreview.tsx +1 -1
  184. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +2 -2
  185. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +4 -4
  186. package/src/preview/property_previews/ArrayOfRelationsPreview.tsx +3 -3
  187. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +3 -3
  188. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +3 -2
  189. package/src/preview/property_previews/ArrayOneOfPreview.tsx +6 -8
  190. package/src/preview/property_previews/ArrayPropertyEnumPreview.tsx +1 -1
  191. package/src/preview/property_previews/ArrayPropertyPreview.tsx +3 -3
  192. package/src/preview/property_previews/MapPropertyPreview.tsx +4 -3
  193. package/src/preview/property_previews/NumberPropertyPreview.tsx +5 -3
  194. package/src/preview/property_previews/StringPropertyPreview.tsx +10 -8
  195. package/src/types/components/EntityFormActionsProps.tsx +1 -1
  196. package/src/types/components/EntityFormProps.tsx +2 -2
  197. package/src/types/fields.tsx +2 -2
  198. package/dist/CollectionEditorDialog-BXIh2AXg.js.map +0 -1
  199. package/dist/ContentHomePage-BQZWuOFb.js +0 -1784
  200. package/dist/ContentHomePage-BQZWuOFb.js.map +0 -1
  201. package/dist/ExportCollectionAction-CMdiiv1L.js.map +0 -1
  202. package/dist/PropertyEditView-BB5xjnhZ.js.map +0 -1
  203. package/dist/RoleChip-QtUFXeTp.js +0 -67
  204. package/dist/RoleChip-QtUFXeTp.js.map +0 -1
  205. package/dist/RolesView-CULIHWZ9.js +0 -437
  206. package/dist/RolesView-CULIHWZ9.js.map +0 -1
  207. package/dist/UsersView-D7_AtJ44.js +0 -408
  208. package/dist/UsersView-D7_AtJ44.js.map +0 -1
  209. package/dist/collection_editor/types/config_permissions.d.ts +0 -19
  210. package/dist/index-CoSNm3e3.js.map +0 -1
  211. package/dist/index-D5OQhv-T.js.map +0 -1
  212. package/dist/markdown-z2Ir7Cgo.js.map +0 -1
  213. package/dist/util-DtbWD7LF.js.map +0 -1
  214. package/src/collection_editor/types/config_permissions.ts +0 -20
@@ -36,15 +36,15 @@ import { getValueInPath, isObject, mergeDeep } from "@rebasepro/utils";
36
36
  import { useCollectionRegistryController, useSideEntityController, useCMSContext } from "../index";
37
37
 
38
38
  // extract touched values for nested touched trees and map to current values
39
- export function extractTouchedValues(values: any, touched: Record<string, boolean>): Record<string, any> {
40
- let acc: Record<string, any> = {};
39
+ export function extractTouchedValues(values: unknown, touched: Record<string, boolean>): Record<string, unknown> {
40
+ let acc: Record<string, unknown> = {};
41
41
  if (!touched || typeof touched !== "object") {
42
42
  return acc;
43
43
  }
44
44
 
45
45
  Object.entries(touched).forEach(([key, value]) => {
46
46
  if (value) {
47
- acc = setIn(acc, key, getIn(values, key));
47
+ acc = setIn(acc, key, getIn(values, key)) as Record<string, unknown>;
48
48
  }
49
49
  })
50
50
 
@@ -60,20 +60,20 @@ export function extractTouchedValues(values: any, touched: Record<string, boolea
60
60
  /**
61
61
  * CheckIcon if a value is semantically empty (null, undefined, or empty string).
62
62
  */
63
- function isSemanticEmpty(v: any): boolean {
63
+ function isSemanticEmpty(v: unknown): boolean {
64
64
  return v === null || v === undefined || v === "";
65
65
  }
66
66
 
67
- function removeEmptyContainers(obj: any): any {
67
+ function removeEmptyContainers(obj: unknown): unknown {
68
68
  if (Array.isArray(obj)) {
69
69
  const cleaned = obj.map(removeEmptyContainers);
70
70
  // Keep arrays even if they contain only nulls/undefined — that's intentional data
71
71
  return cleaned;
72
72
  }
73
73
  if (obj && typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype) {
74
- const result: Record<string, any> = {};
74
+ const result: Record<string, unknown> = {};
75
75
  for (const key of Object.keys(obj)) {
76
- const cleaned = removeEmptyContainers(obj[key]);
76
+ const cleaned = removeEmptyContainers((obj as Record<string, unknown>)[key]);
77
77
  // Skip empty plain objects
78
78
  if (cleaned && typeof cleaned === "object" && !Array.isArray(cleaned)
79
79
  && Object.getPrototypeOf(cleaned) === Object.prototype
@@ -281,7 +281,7 @@ export function EntityForm<M extends Record<string, unknown>>({
281
281
  return cleaned;
282
282
  }, [localChangesDataRaw, initialValues]);
283
283
 
284
- const hasLocalChanges = !localChangesCleared && localChangesData && Object.keys(localChangesData).length > 0;
284
+ const hasLocalChanges = !localChangesCleared && !!localChangesData && Object.keys(localChangesData as object).length > 0;
285
285
 
286
286
  const internalFormex = useCreateFormex<M>({
287
287
  initialValues: initialValues as M,
@@ -729,7 +729,7 @@ export function EntityForm<M extends Record<string, unknown>>({
729
729
  throw Error("INTERNAL: Collection and path must be defined in form context");
730
730
  }
731
731
 
732
- const EntityFormActionsRender = EntityFormActionsComponent as React.FC<any>;
732
+ const EntityFormActionsRender = EntityFormActionsComponent as React.FC<EntityFormActionsProps>;
733
733
 
734
734
  const dialogActions = <EntityFormActionsRender
735
735
  collection={collection}
@@ -737,14 +737,14 @@ export function EntityForm<M extends Record<string, unknown>>({
737
737
  entity={entity}
738
738
  layout={forceActionsAtTheBottom ? "bottom" : "responsive"}
739
739
  savingError={savingError}
740
- formex={formex}
740
+ formex={formex as any}
741
741
  disabled={actionsDisabled}
742
742
  status={status}
743
743
  pluginActions={pluginFormActions ?? []}
744
744
  openEntityMode={openEntityMode}
745
745
  showDefaultActions={showDefaultActions}
746
746
  navigateBack={navigateBack}
747
- formContext={formContext}
747
+ formContext={formContext as any}
748
748
  />;
749
749
 
750
750
  return (
@@ -844,18 +844,18 @@ export function getInitialEntityValues<M extends Record<string, unknown>>(
844
844
  }
845
845
  }
846
846
 
847
- export function zodToFormErrors(zodError: z.ZodError): Record<string, any> {
848
- let errors: Record<string, any> = {};
847
+ export function zodToFormErrors(zodError: z.ZodError): Record<string, string> {
848
+ let errors: Record<string, string> = {};
849
849
  for (const issue of zodError.issues) {
850
850
  const path = issue.path.join(".");
851
851
  if (path && !getIn(errors, path)) {
852
- errors = setIn(errors, path, issue.message);
852
+ errors = setIn(errors, path, issue.message) as Record<string, string>;
853
853
  }
854
854
  }
855
855
  return errors;
856
856
  }
857
857
 
858
- function useOnAutoSave(autoSave: undefined | boolean, formex: FormexController<any>, lastSavedValues: any, save: (values: EntityValues<any>) => Promise<Entity<any> | void>) {
858
+ function useOnAutoSave(autoSave: undefined | boolean, formex: FormexController<any>, lastSavedValues: React.MutableRefObject<any>, save: (values: EntityValues<any>) => Promise<Entity<any> | void>) {
859
859
  useEffect(() => {
860
860
  if (!autoSave) return;
861
861
  if (formex.values && !equal(formex.values, lastSavedValues.current)) {
@@ -97,11 +97,11 @@ type ActionsViewProps<M extends Record<string, unknown>> = {
97
97
  sideEntityController: SideEntityController,
98
98
  disabled: boolean,
99
99
  status: "new" | "existing" | "copy",
100
- pluginActions?: any[],
100
+ pluginActions?: React.ReactNode[],
101
101
  openEntityMode: "side_panel" | "full_screen" | "split" | "dialog";
102
102
  navigateBack: () => void;
103
103
  formContext: FormContext,
104
- formex: FormexController<any>;
104
+ formex: FormexController<Record<string, unknown>>;
105
105
  t: (key: string) => string;
106
106
  className?: string;
107
107
  };
@@ -6,7 +6,7 @@ import { deepEqual as equal } from "fast-equals"
6
6
 
7
7
  import { resolveComponentRef } from "@rebasepro/core";
8
8
 
9
- import { Field, FieldProps as FormexFieldProps, getIn } from "@rebasepro/formex";
9
+ import { Field, FormexFieldProps, getIn } from "@rebasepro/formex";
10
10
 
11
11
  ;
12
12
  import { ReadOnlyFieldBinding } from "./field_bindings/ReadOnlyFieldBinding";
@@ -42,7 +42,7 @@ import { ErrorBoundary } from "@rebasepro/ui";
42
42
  * @param autoFocus
43
43
  * @group Form custom fields
44
44
  */
45
- export const PropertyFieldBinding = React.memo(PropertyFieldBindingInternal, (a: PropertyFieldBindingProps<any>, b: PropertyFieldBindingProps<any>) => {
45
+ export const PropertyFieldBinding = React.memo(PropertyFieldBindingInternal, (a: PropertyFieldBindingProps<Record<string, unknown>>, b: PropertyFieldBindingProps<Record<string, unknown>>) => {
46
46
  if (a.propertyKey !== b.propertyKey) {
47
47
  return false;
48
48
  }
@@ -70,21 +70,21 @@ export const PropertyFieldBinding = React.memo(PropertyFieldBindingInternal, (a:
70
70
  }) as typeof PropertyFieldBindingInternal;
71
71
 
72
72
  function PropertyFieldBindingInternal<M extends Record<string, unknown> = Record<string, unknown>>
73
- ({
74
- propertyKey,
75
- property,
76
- context,
77
- includeDescription,
78
- underlyingValueHasChanged,
79
- disabled: disabledProp,
80
- partOfArray,
81
- partOfBlock,
82
- minimalistView,
83
- autoFocus,
84
- index,
85
- size,
86
- onPropertyChange
87
- }: PropertyFieldBindingProps<M>): ReactElement<PropertyFieldBindingProps<M>> {
73
+ ({
74
+ propertyKey,
75
+ property,
76
+ context,
77
+ includeDescription,
78
+ underlyingValueHasChanged,
79
+ disabled: disabledProp,
80
+ partOfArray,
81
+ partOfBlock,
82
+ minimalistView,
83
+ autoFocus,
84
+ index,
85
+ size,
86
+ onPropertyChange
87
+ }: PropertyFieldBindingProps<M>): ReactElement<PropertyFieldBindingProps<M>> {
88
88
 
89
89
  const authController = useAuthController();
90
90
  const customizationController = useCustomizationController();
@@ -96,7 +96,7 @@ function PropertyFieldBindingInternal<M extends Record<string, unknown> = Record
96
96
  >
97
97
  {(fieldProps) => {
98
98
 
99
- let Component: ComponentType<FieldProps> | undefined;
99
+ let Component: ComponentType<FieldProps<Property, any, any>> | undefined;
100
100
  const resolvedProperty = resolveProperty({
101
101
  propertyKey,
102
102
  property: property,
@@ -118,7 +118,7 @@ function PropertyFieldBindingInternal<M extends Record<string, unknown> = Record
118
118
  } else if (resolvedProperty.ui?.Field) {
119
119
  const resolved = resolveComponentRef(resolvedProperty.ui.Field);
120
120
  if (resolved) {
121
- Component = resolved as ComponentType<FieldProps<Property, unknown, M>>;
121
+ Component = resolved as ComponentType<FieldProps<Property, any, any>>;
122
122
  }
123
123
  } else {
124
124
  const propertyConfig = getFieldConfig(resolvedProperty, customizationController.propertyConfigs);
@@ -135,7 +135,7 @@ function PropertyFieldBindingInternal<M extends Record<string, unknown> = Record
135
135
  index,
136
136
  authController
137
137
  }) as Property | null;
138
- Component = resolveComponentRef(configProperty?.ui?.Field) as ComponentType<FieldProps> | undefined;
138
+ Component = resolveComponentRef(configProperty?.ui?.Field) as ComponentType<FieldProps<Property, any, any>> | undefined;
139
139
  }
140
140
  if (!Component) {
141
141
  console.warn(`No field component found for property ${propertyKey}`);
@@ -163,9 +163,9 @@ function PropertyFieldBindingInternal<M extends Record<string, unknown> = Record
163
163
  };
164
164
 
165
165
  return <FieldInternal
166
- Component={Component as ComponentType<FieldProps>}
166
+ Component={Component as ComponentType<FieldProps<Property, any, any>>}
167
167
  componentProps={componentProps}
168
- formexFieldProps={fieldProps}/>;
168
+ formexFieldProps={fieldProps as FormexFieldProps<unknown, Record<string, unknown>>}/>;
169
169
  }}
170
170
  </Field>
171
171
  );
@@ -175,68 +175,68 @@ function PropertyFieldBindingInternal<M extends Record<string, unknown> = Record
175
175
  type ResolvedPropertyFieldBindingProps<M extends Record<string, unknown> = Record<string, unknown>> =
176
176
  Omit<PropertyFieldBindingProps<M>, "property">
177
177
  & {
178
- property: Property
179
- };
180
-
181
- function FieldInternal<CustomProps, M extends Record<string, any>>
182
- ({
183
- Component,
184
- componentProps: {
185
- propertyKey,
186
- property,
187
- includeDescription,
188
- underlyingValueHasChanged,
189
- partOfArray,
190
- partOfBlock,
191
- minimalistView,
192
- autoFocus,
193
- context,
194
- disabled,
195
- size,
196
- onPropertyChange
197
- },
198
- formexFieldProps
199
- }:
200
- {
201
- Component: ComponentType<FieldProps>,
202
- componentProps: ResolvedPropertyFieldBindingProps<M>,
203
- formexFieldProps: FormexFieldProps<any, any>
204
- }) {
178
+ property: Property
179
+ };
180
+
181
+ function FieldInternal<CustomProps, M extends Record<string, unknown>>
182
+ ({
183
+ Component,
184
+ componentProps: {
185
+ propertyKey,
186
+ property,
187
+ includeDescription,
188
+ underlyingValueHasChanged,
189
+ partOfArray,
190
+ partOfBlock,
191
+ minimalistView,
192
+ autoFocus,
193
+ context,
194
+ disabled,
195
+ size,
196
+ onPropertyChange
197
+ },
198
+ formexFieldProps
199
+ }:
200
+ {
201
+ Component: ComponentType<FieldProps<Property, any, any>>,
202
+ componentProps: ResolvedPropertyFieldBindingProps<M>,
203
+ formexFieldProps: FormexFieldProps<unknown, Record<string, unknown>>
204
+ }) {
205
205
 
206
206
  const { plugins } = useCustomizationController();
207
207
 
208
- const customFieldProps: any = property.ui?.customProps;
208
+ const customFieldProps: unknown = property.ui?.customProps;
209
209
  const value = formexFieldProps.field.value;
210
210
  const error = getIn(formexFieldProps.form.errors, propertyKey) as string | string[] | undefined;
211
211
  const touched = getIn(formexFieldProps.form.touched, propertyKey) as boolean | undefined;
212
212
 
213
213
  const showError = Boolean(error &&
214
214
  (formexFieldProps.form.submitCount > 0 || property.validation?.unique) &&
215
- (!Array.isArray(error) || !!error.filter((e: any) => !!e).length));
215
+ (!Array.isArray(error) || !!error.filter((e: unknown) => !!e).length));
216
216
 
217
- const WrappedComponent: ComponentType<FieldProps<any, any, M>> | null = useWrappedComponent({
217
+ const WrappedComponent: ComponentType<FieldProps<Property, any, any>> | null = useWrappedComponent<unknown, any>({
218
218
  path: context.path,
219
219
  collection: context.collection,
220
220
  propertyKey: propertyKey,
221
221
  property: property,
222
- Component: Component,
222
+ Component: Component as any, // Cast component here since it is a generic component type
223
223
  plugins: plugins
224
224
  });
225
- const UsedComponent: ComponentType<FieldProps> = WrappedComponent ?? Component;
225
+ const UsedComponent: ComponentType<FieldProps<Property, any, any>> = WrappedComponent ?? Component;
226
226
 
227
227
  const isSubmitting = formexFieldProps.form.isSubmitting;
228
228
 
229
- const setValue = useCallback((value: any | null, shouldValidate?: boolean) => {
229
+ const setValue = useCallback((value: unknown | null, shouldValidate?: boolean) => {
230
230
  formexFieldProps.form.setFieldTouched(propertyKey, true, false);
231
231
  formexFieldProps.form.setFieldValue(propertyKey, value, shouldValidate);
232
232
  }, []);
233
233
 
234
- const setFieldValue = useCallback((otherPropertyKey: string, value: any | null, shouldValidate?: boolean) => {
234
+ const setFieldValue = useCallback((otherPropertyKey: string, value: unknown | null, shouldValidate?: boolean) => {
235
235
  formexFieldProps.form.setFieldTouched(propertyKey, true, false);
236
236
  formexFieldProps.form.setFieldValue(otherPropertyKey, value, shouldValidate);
237
237
  }, []);
238
238
 
239
- const cmsFieldProps: FieldProps<any, CustomProps, M> = {
239
+ const cmsFieldProps: FieldProps<Property, CustomProps, M> = {
240
240
  propertyKey,
241
241
  value,
242
242
  setValue,
@@ -253,7 +253,7 @@ function FieldInternal<CustomProps, M extends Record<string, any>>
253
253
  partOfBlock: partOfBlock ?? false,
254
254
  minimalistView: minimalistView ?? false,
255
255
  autoFocus: autoFocus ?? false,
256
- customProps: customFieldProps,
256
+ customProps: customFieldProps as CustomProps,
257
257
  context,
258
258
  size,
259
259
  onPropertyChange
@@ -295,11 +295,11 @@ interface UseWrappedComponentParams<M extends Record<string, unknown> = Record<s
295
295
  collection?: EntityCollection<M>,
296
296
  propertyKey: string,
297
297
  property: Property,
298
- Component: ComponentType<FieldProps<any, any, M>>,
298
+ Component: ComponentType<FieldProps<Property, unknown, M>>,
299
299
  plugins?: RebasePlugin[]
300
300
  }
301
301
 
302
- function useWrappedComponent<T, M extends Record<string, any> = any>(
302
+ function useWrappedComponent<T, M extends Record<string, unknown> = Record<string, unknown>>(
303
303
  {
304
304
  path,
305
305
  collection,
@@ -308,10 +308,10 @@ function useWrappedComponent<T, M extends Record<string, any> = any>(
308
308
  Component,
309
309
  plugins
310
310
  }: UseWrappedComponentParams<M>
311
- ): ComponentType<FieldProps<any, any, M>> | null {
311
+ ): ComponentType<FieldProps<Property, unknown, M>> | null {
312
312
 
313
- const wrapperRef = useRef<ComponentType<FieldProps<any, any, M>> | null>((() => {
314
- let Wrapper: ComponentType<FieldProps<any, any, M>> | null = null;
313
+ const wrapperRef = useRef<ComponentType<FieldProps<Property, unknown, M>> | null>((() => {
314
+ let Wrapper: ComponentType<FieldProps<Property, unknown, M>> | null = null;
315
315
  if (plugins) {
316
316
  plugins.forEach((plugin) => {
317
317
  const fieldId = getFieldId(property);
@@ -327,7 +327,7 @@ function useWrappedComponent<T, M extends Record<string, any> = any>(
327
327
  };
328
328
  const enabled = plugin.fieldBuilder.enabled?.(params);
329
329
  if (enabled === undefined || enabled)
330
- Wrapper = (plugin.fieldBuilder.wrap(params) as unknown as ComponentType<FieldProps<any, any, M>> | null) ?? Wrapper;
330
+ Wrapper = (plugin.fieldBuilder.wrap(params) as unknown as ComponentType<FieldProps<Property, unknown, M>> | null) ?? Wrapper;
331
331
  }
332
332
  if (!fieldId) {
333
333
  console.warn("INTERNAL: Field id not found for property", property);
@@ -22,16 +22,16 @@ function normalizeError(error: unknown): string | undefined {
22
22
 
23
23
  // Extract all string values from the object (e.g., nested validation errors)
24
24
  const messages: string[] = [];
25
- const extractMessages = (obj: any) => {
25
+ const extractMessages = (obj: Record<string, unknown>) => {
26
26
  for (const key in obj) {
27
27
  if (typeof obj[key] === "string") {
28
- messages.push(obj[key]);
28
+ messages.push(obj[key] as string);
29
29
  } else if (typeof obj[key] === "object" && obj[key] !== null) {
30
- extractMessages(obj[key]);
30
+ extractMessages(obj[key] as Record<string, unknown>);
31
31
  }
32
32
  }
33
33
  };
34
- extractMessages(error);
34
+ extractMessages(error as Record<string, unknown>);
35
35
  if (messages.length > 0) {
36
36
  return Array.from(new Set(messages)).join(", ");
37
37
  }
@@ -7,11 +7,11 @@ import { cls, paperMixin, Skeleton } from "@rebasepro/ui";
7
7
 
8
8
  export interface StorageUploadItemProps {
9
9
  storagePath: string;
10
- metadata?: any,
10
+ metadata?: Record<string, unknown>,
11
11
  entry: StorageFieldItem,
12
12
  onFileUploadComplete: (value: string,
13
13
  entry: StorageFieldItem,
14
- metadata?: any,
14
+ metadata?: Record<string, unknown>,
15
15
  uploadedUrl?: string) => Promise<void>;
16
16
  imageSize: number;
17
17
  simple: boolean;
@@ -77,7 +77,7 @@ export function ArrayCustomShapedFieldBinding({
77
77
  setValue,
78
78
  setFieldValue,
79
79
  customProps
80
- } as FieldProps<any>;
80
+ } as FieldProps;
81
81
  return <div key={`custom_shaped_array_${index}`} className="pb-4">
82
82
  <PropertyFieldBinding {...fieldProps}/>
83
83
  </div>;
@@ -64,7 +64,7 @@ export function ArrayOfReferencesFieldBinding({
64
64
  throw Error(`Couldn't find the corresponding collection for the path: ${ofProperty.path}`);
65
65
  }
66
66
 
67
- const onMultipleEntitiesSelected = useCallback((entities: Entity<any>[]) => {
67
+ const onMultipleEntitiesSelected = useCallback((entities: Entity<Record<string, unknown>>[]) => {
68
68
  const refs = entities.map(e => getReferenceFrom(e));
69
69
  setValue(refs);
70
70
  }, [setValue]);
@@ -7,6 +7,7 @@ import { Field, useFormex } from "@rebasepro/formex";
7
7
  import { FieldHelperText, LabelWithIconAndTooltip } from "../components";
8
8
  import { PropertyFieldBinding } from "../PropertyFieldBinding";
9
9
  import { EnumValuesChip } from "../../preview";
10
+
10
11
  ;
11
12
  import { DEFAULT_ONE_OF_TYPE, DEFAULT_ONE_OF_VALUE, getDefaultValueFor } from "@rebasepro/common";
12
13
  import { getIconForProperty } from "../../util/property_utils";
@@ -25,20 +26,20 @@ import { mergeDeep } from "@rebasepro/utils";
25
26
  * @group Form fields
26
27
  */
27
28
  export function BlockFieldBinding({
28
- propertyKey,
29
- value,
30
- error,
31
- showError,
32
- isSubmitting,
33
- setValue,
34
- setFieldValue,
35
- minimalistView: minimalistViewProp,
36
- property,
37
- includeDescription,
38
- underlyingValueHasChanged,
39
- context,
40
- disabled
41
- }: FieldProps<ArrayProperty>) {
29
+ propertyKey,
30
+ value,
31
+ error,
32
+ showError,
33
+ isSubmitting,
34
+ setValue,
35
+ setFieldValue,
36
+ minimalistView: minimalistViewProp,
37
+ property,
38
+ includeDescription,
39
+ underlyingValueHasChanged,
40
+ context,
41
+ disabled
42
+ }: FieldProps<ArrayProperty>) {
42
43
 
43
44
  const minimalistView = minimalistViewProp || property.ui?.minimalistView;
44
45
  const { t } = useTranslation();
@@ -56,11 +57,11 @@ export function BlockFieldBinding({
56
57
  const [lastAddedId, setLastAddedId] = useState<number | undefined>();
57
58
 
58
59
  const buildEntry = ({
59
- index,
60
- internalId,
61
- storedProps,
62
- storeProps
63
- }: ArrayEntryParams) => {
60
+ index,
61
+ internalId,
62
+ storedProps,
63
+ storeProps
64
+ }: ArrayEntryParams) => {
64
65
 
65
66
  return <BlockEntry
66
67
  key={`array_one_of_${internalId}`}
@@ -87,18 +88,18 @@ export function BlockFieldBinding({
87
88
 
88
89
  const firstOneOfKey = Object.keys(property.oneOf.properties)[0];
89
90
  const body = <ArrayContainer value={value}
90
- className={"flex flex-col gap-3"}
91
- droppableId={propertyKey}
92
- addLabel={property.name ? t("add_to_field", { fieldName: property.name }) : t("add_entry")}
93
- buildEntry={buildEntry}
94
- onInternalIdAdded={setLastAddedId}
95
- disabled={isSubmitting || Boolean(property.ui?.disabled)}
96
- canAddElements={!property.ui?.disabled}
97
- onValueChange={(value) => setFieldValue(propertyKey, value)}
98
- newDefaultEntry={{
99
- [property.oneOf!.typeField ?? DEFAULT_ONE_OF_TYPE]: firstOneOfKey,
100
- [property.oneOf!.valueField ?? DEFAULT_ONE_OF_VALUE]: getDefaultValueFor(property.oneOf.properties[firstOneOfKey])
101
- }}/>;
91
+ className={"flex flex-col gap-3"}
92
+ droppableId={propertyKey}
93
+ addLabel={property.name ? t("add_to_field", { fieldName: property.name }) : t("add_entry")}
94
+ buildEntry={buildEntry}
95
+ onInternalIdAdded={setLastAddedId}
96
+ disabled={isSubmitting || Boolean(property.ui?.disabled)}
97
+ canAddElements={!property.ui?.disabled}
98
+ onValueChange={(value) => setFieldValue(propertyKey, value)}
99
+ newDefaultEntry={{
100
+ [property.oneOf!.typeField ?? DEFAULT_ONE_OF_TYPE]: firstOneOfKey,
101
+ [property.oneOf!.valueField ?? DEFAULT_ONE_OF_VALUE]: getDefaultValueFor(property.oneOf.properties[firstOneOfKey])
102
+ }}/>;
102
103
  return (
103
104
 
104
105
  <>
@@ -114,10 +115,10 @@ export function BlockFieldBinding({
114
115
  {minimalistView && body}
115
116
 
116
117
  <FieldHelperText includeDescription={includeDescription}
117
- showError={showError}
118
- error={error}
119
- disabled={disabled}
120
- property={property}/>
118
+ showError={showError}
119
+ error={error}
120
+ disabled={disabled}
121
+ property={property}/>
121
122
 
122
123
  </>
123
124
  );
@@ -126,7 +127,7 @@ export function BlockFieldBinding({
126
127
  interface BlockEntryProps {
127
128
  name: string;
128
129
  index: number;
129
- value: any;
130
+ value: Record<string, unknown>;
130
131
  /**
131
132
  * Name of the field to use as the discriminator for type
132
133
  * Defaults to `type`
@@ -148,7 +149,7 @@ interface BlockEntryProps {
148
149
  /**
149
150
  * Additional values related to the state of the form or the entity
150
151
  */
151
- context: FormContext<any>;
152
+ context: FormContext;
152
153
 
153
154
  storedProps?: object,
154
155
  storeProps: (props: object) => void
@@ -156,19 +157,19 @@ interface BlockEntryProps {
156
157
  }
157
158
 
158
159
  function BlockEntry({
159
- name,
160
- index,
161
- value,
162
- typeField,
163
- valueField,
164
- properties,
165
- autoFocus,
166
- context,
167
- storedProps,
168
- storeProps
169
- }: BlockEntryProps) {
170
-
171
- const type = value && value[typeField];
160
+ name,
161
+ index,
162
+ value,
163
+ typeField,
164
+ valueField,
165
+ properties,
166
+ autoFocus,
167
+ context,
168
+ storedProps,
169
+ storeProps
170
+ }: BlockEntryProps) {
171
+
172
+ const type = value && (value[typeField] as string | undefined);
172
173
  const [typeInternal, setTypeInternal] = useState<string | undefined>(type ?? undefined);
173
174
 
174
175
  const formex = useFormex();
@@ -218,7 +219,7 @@ function BlockEntry({
218
219
  }
219
220
  : undefined;
220
221
 
221
- const updateType = (newType: any) => {
222
+ const updateType = (newType: string | undefined) => {
222
223
  const newSelectedProperty = newType ? properties[newType] : undefined;
223
224
  setTypeInternal(newType);
224
225
  formex.setFieldTouched(typeFieldName, true);
@@ -239,12 +240,12 @@ function BlockEntry({
239
240
  <Select
240
241
  className="mb-2"
241
242
  placeholder={<Typography variant={"caption"}
242
- className={"px-4 py-2 font-medium"}>{t("type")}</Typography>}
243
+ className={"px-4 py-2 font-medium"}>{t("type")}</Typography>}
243
244
  size={"medium"}
244
245
  fullWidth={true}
245
246
  position={"item-aligned"}
246
247
  value={value1}
247
- renderValue={(enumKey: any) =>
248
+ renderValue={(enumKey: string) =>
248
249
  <EnumValuesChip
249
250
  enumKey={enumKey}
250
251
  enumValues={enumValuesConfigs}