@rebasepro/admin 0.0.1-canary.eae7889 → 0.0.1-canary.eb08332

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 (716) hide show
  1. package/LICENSE +21 -6
  2. package/README.md +139 -0
  3. package/dist/CollectionEditorDialog-DKGlYDPc.js +3630 -0
  4. package/dist/CollectionEditorDialog-DKGlYDPc.js.map +1 -0
  5. package/dist/PropertyEditView-h0N-AMCY.js +3808 -0
  6. package/dist/PropertyEditView-h0N-AMCY.js.map +1 -0
  7. package/dist/RouterCollectionsStudioView-DdEStpFk.js +192 -0
  8. package/dist/RouterCollectionsStudioView-DdEStpFk.js.map +1 -0
  9. package/dist/collection_editor/ConfigControllerProvider.d.ts +2 -11
  10. package/dist/collection_editor/_cms_internals.d.ts +4 -4
  11. package/dist/collection_editor/api/generateCollectionApi.d.ts +10 -9
  12. package/dist/collection_editor/extensibility_types.d.ts +135 -0
  13. package/dist/collection_editor/index.d.ts +6 -1
  14. package/dist/collection_editor/pgColumnToProperty.d.ts +3 -3
  15. package/dist/collection_editor/serializable_types.d.ts +370 -0
  16. package/dist/collection_editor/serializable_utils.d.ts +50 -0
  17. package/dist/collection_editor/types/collection_editor_controller.d.ts +11 -10
  18. package/dist/collection_editor/types/collection_inference.d.ts +2 -2
  19. package/dist/collection_editor/types/config_controller.d.ts +21 -14
  20. package/dist/collection_editor/ui/AddKanbanColumnAction.d.ts +7 -5
  21. package/dist/collection_editor/ui/CollectionViewHeaderAction.d.ts +7 -5
  22. package/dist/collection_editor/ui/EditorCollectionAction.d.ts +1 -1
  23. package/dist/collection_editor/ui/EditorCollectionActionStart.d.ts +1 -1
  24. package/dist/collection_editor/ui/EditorEntityAction.d.ts +1 -1
  25. package/dist/collection_editor/ui/HomePageEditorCollectionAction.d.ts +1 -1
  26. package/dist/collection_editor/ui/KanbanSetupAction.d.ts +7 -5
  27. package/dist/collection_editor/ui/MissingReferenceWidget.d.ts +1 -1
  28. package/dist/collection_editor/ui/NewCollectionButton.d.ts +1 -1
  29. package/dist/collection_editor/ui/NewCollectionCard.d.ts +1 -1
  30. package/dist/collection_editor/ui/PropertyAddColumnComponent.d.ts +6 -5
  31. package/dist/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.d.ts +4 -4
  32. package/dist/collection_editor/ui/collection_editor/AIModifiedPathsContext.d.ts +1 -1
  33. package/dist/collection_editor/ui/collection_editor/CollectionDetailsForm.d.ts +7 -7
  34. package/dist/collection_editor/ui/collection_editor/CollectionEditorDialog.d.ts +10 -11
  35. package/dist/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.d.ts +4 -4
  36. package/dist/collection_editor/ui/collection_editor/CollectionJsonImportDialog.d.ts +4 -3
  37. package/dist/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.d.ts +17 -7
  38. package/dist/collection_editor/ui/collection_editor/CollectionRLSTab.d.ts +2 -1
  39. package/dist/collection_editor/ui/collection_editor/CollectionRelationsTab.d.ts +2 -1
  40. package/dist/collection_editor/ui/collection_editor/CollectionStudioView.d.ts +14 -1
  41. package/dist/collection_editor/ui/collection_editor/CollectionYupValidation.d.ts +1 -9
  42. package/dist/collection_editor/ui/collection_editor/CollectionsStudioView.d.ts +25 -2
  43. package/dist/collection_editor/ui/collection_editor/DisplaySettingsForm.d.ts +4 -2
  44. package/dist/collection_editor/ui/collection_editor/EntityActionsEditTab.d.ts +4 -3
  45. package/dist/collection_editor/ui/collection_editor/EntityActionsSelectDialog.d.ts +2 -1
  46. package/dist/collection_editor/ui/collection_editor/EntityCustomViewsSelectDialog.d.ts +2 -1
  47. package/dist/collection_editor/ui/collection_editor/EnumForm.d.ts +2 -1
  48. package/dist/collection_editor/ui/collection_editor/GeneralSettingsForm.d.ts +8 -4
  49. package/dist/collection_editor/ui/collection_editor/GetCodeDialog.d.ts +4 -3
  50. package/dist/collection_editor/ui/collection_editor/KanbanConfigSection.d.ts +2 -1
  51. package/dist/collection_editor/ui/collection_editor/LayoutModeSwitch.d.ts +3 -3
  52. package/dist/collection_editor/ui/collection_editor/PropertyEditView.d.ts +17 -5
  53. package/dist/collection_editor/ui/collection_editor/PropertyFieldPreview.d.ts +2 -2
  54. package/dist/collection_editor/ui/collection_editor/PropertyTree.d.ts +2 -2
  55. package/dist/collection_editor/ui/collection_editor/RouterCollectionStudioView.d.ts +15 -0
  56. package/dist/collection_editor/ui/collection_editor/RouterCollectionsStudioView.d.ts +14 -0
  57. package/dist/collection_editor/ui/collection_editor/SubcollectionsEditTab.d.ts +8 -6
  58. package/dist/collection_editor/ui/collection_editor/SwitchControl.d.ts +3 -2
  59. package/dist/collection_editor/ui/collection_editor/ViewModeSwitch.d.ts +1 -1
  60. package/dist/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.d.ts +1 -1
  61. package/dist/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.d.ts +3 -2
  62. package/dist/collection_editor/ui/collection_editor/properties/BlockPropertyField.d.ts +2 -1
  63. package/dist/collection_editor/ui/collection_editor/properties/BooleanPropertyField.d.ts +2 -1
  64. package/dist/collection_editor/ui/collection_editor/properties/DateTimePropertyField.d.ts +2 -1
  65. package/dist/collection_editor/ui/collection_editor/properties/EnumPropertyField.d.ts +2 -1
  66. package/dist/collection_editor/ui/collection_editor/properties/KeyValuePropertyField.d.ts +2 -1
  67. package/dist/collection_editor/ui/collection_editor/properties/MapPropertyField.d.ts +2 -1
  68. package/dist/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.d.ts +2 -1
  69. package/dist/collection_editor/ui/collection_editor/properties/NumberPropertyField.d.ts +2 -1
  70. package/dist/collection_editor/ui/collection_editor/properties/ReferencePropertyField.d.ts +3 -2
  71. package/dist/collection_editor/ui/collection_editor/properties/RelationPropertyField.d.ts +3 -8
  72. package/dist/collection_editor/ui/collection_editor/properties/RepeatPropertyField.d.ts +2 -1
  73. package/dist/collection_editor/ui/collection_editor/properties/StoragePropertyField.d.ts +2 -1
  74. package/dist/collection_editor/ui/collection_editor/properties/StringPropertyField.d.ts +2 -1
  75. package/dist/collection_editor/ui/collection_editor/properties/UrlPropertyField.d.ts +2 -1
  76. package/dist/collection_editor/ui/collection_editor/properties/VectorPropertyField.d.ts +4 -0
  77. package/dist/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.d.ts +2 -1
  78. package/dist/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.d.ts +2 -1
  79. package/dist/collection_editor/ui/collection_editor/properties/conditions/ConditionsPanel.d.ts +1 -1
  80. package/dist/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.d.ts +2 -1
  81. package/dist/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.d.ts +2 -1
  82. package/dist/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.d.ts +2 -1
  83. package/dist/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.d.ts +2 -1
  84. package/dist/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.d.ts +2 -1
  85. package/dist/collection_editor/ui/collection_editor/properties/validation/ValidationPanel.d.ts +1 -1
  86. package/dist/collection_editor/ui/collection_editor/templates/blog_template.d.ts +2 -2
  87. package/dist/collection_editor/ui/collection_editor/templates/pages_template.d.ts +2 -2
  88. package/dist/collection_editor/ui/collection_editor/templates/products_template.d.ts +2 -2
  89. package/dist/collection_editor/ui/collection_editor/templates/users_template.d.ts +2 -2
  90. package/dist/collection_editor/useJsonCollectionsConfigController.d.ts +37 -0
  91. package/dist/collection_editor/useLocalCollectionsConfigController.d.ts +2 -2
  92. package/dist/collection_editor/useSafeSnackbarController.d.ts +2 -0
  93. package/dist/collection_editor/validateCollectionJson.d.ts +2 -2
  94. package/dist/collection_editor_ui.d.ts +4 -0
  95. package/dist/collection_editor_ui.js +33 -11
  96. package/dist/collection_editor_ui.js.map +1 -1
  97. package/dist/components/ArrayContainer.d.ts +5 -5
  98. package/dist/components/ClearFilterSortButton.d.ts +1 -1
  99. package/dist/components/CollectionEditorDialogs.d.ts +2 -1
  100. package/dist/components/CollectionPanel.d.ts +58 -0
  101. package/dist/components/{EntityCollectionTable/EntityCollectionRowActions.d.ts → CollectionTableBinding/CollectionRowActions.d.ts} +5 -5
  102. package/dist/components/CollectionTableBinding/CollectionTableBinding.d.ts +28 -0
  103. package/dist/components/{EntityCollectionTable/EntityCollectionTableProps.d.ts → CollectionTableBinding/CollectionTableBindingProps.d.ts} +4 -4
  104. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/column_utils.d.ts +2 -2
  105. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableMultipleRelationField.d.ts +6 -6
  106. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableReferenceField.d.ts +6 -6
  107. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationField.d.ts +6 -6
  108. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationSelectorField.d.ts +3 -2
  109. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableStorageUpload.d.ts +4 -4
  110. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableSelect.d.ts +1 -1
  111. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableUserSelect.d.ts +1 -1
  112. package/dist/components/CollectionTableBinding/index.d.ts +6 -0
  113. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/CollectionTableToolbar.d.ts +5 -1
  114. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCell.d.ts +3 -3
  115. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCellActions.d.ts +1 -1
  116. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/common.d.ts +2 -2
  117. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/PopupFormField.d.ts +7 -6
  118. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/table_bindings.d.ts +4 -3
  119. package/dist/components/CollectionViewBinding/BoardCardBinding.d.ts +31 -0
  120. package/dist/components/CollectionViewBinding/CollectionBoardViewBinding.d.ts +22 -0
  121. package/dist/components/{EntityCollectionView/EntityCollectionCardView.d.ts → CollectionViewBinding/CollectionCardViewBinding.d.ts} +5 -5
  122. package/dist/components/CollectionViewBinding/CollectionListViewBinding.d.ts +50 -0
  123. package/dist/components/CollectionViewBinding/CollectionViewActions.d.ts +20 -0
  124. package/dist/components/CollectionViewBinding/CollectionViewBinding.d.ts +41 -0
  125. package/dist/components/CollectionViewBinding/CollectionViewStartActions.d.ts +21 -0
  126. package/dist/components/CollectionViewBinding/EntityCardBinding.d.ts +21 -0
  127. package/dist/components/CollectionViewBinding/FilterPresetsButton.d.ts +22 -0
  128. package/dist/components/{EntityCollectionView → CollectionViewBinding}/FiltersDialog.d.ts +3 -2
  129. package/dist/components/{EntityCollectionView → CollectionViewBinding}/SplitListView.d.ts +6 -5
  130. package/dist/components/{EntityCollectionView → CollectionViewBinding}/ViewModeToggle.d.ts +2 -1
  131. package/dist/components/{EntityCollectionView → CollectionViewBinding}/hooks/useCollectionInlineEditor.d.ts +3 -3
  132. package/dist/components/{EntityCollectionView → CollectionViewBinding}/hooks/useKanbanDragAndDrop.d.ts +7 -6
  133. package/dist/components/{EntityCollectionView → CollectionViewBinding}/useBoardDataController.d.ts +2 -2
  134. package/dist/components/{EntityCollectionView/useEntityPreviewSlots.d.ts → CollectionViewBinding/usePreviewSlots.d.ts} +5 -5
  135. package/dist/components/DefaultAppBar.d.ts +18 -1
  136. package/dist/components/DefaultDrawer.d.ts +53 -5
  137. package/dist/components/DeleteEntityDialog.d.ts +6 -5
  138. package/dist/components/DetailViewBinding.d.ts +28 -0
  139. package/dist/components/DrawerNavigationGroup.d.ts +1 -1
  140. package/dist/components/DrawerNavigationItem.d.ts +1 -1
  141. package/dist/components/EditFormActions.d.ts +3 -0
  142. package/dist/components/EditViewBinding.d.ts +58 -0
  143. package/dist/components/{EntityPreview.d.ts → EntityPreviewBinding.d.ts} +14 -14
  144. package/dist/components/EntityViewBinding.d.ts +13 -0
  145. package/dist/components/FieldCaption.d.ts +1 -1
  146. package/dist/components/HomePage/ContentHomePage.d.ts +1 -1
  147. package/dist/components/HomePage/FavouritesView.d.ts +1 -1
  148. package/dist/components/HomePage/HomePageDnD.d.ts +7 -7
  149. package/dist/components/HomePage/NavigationCard.d.ts +1 -1
  150. package/dist/components/HomePage/NavigationCardBinding.d.ts +2 -1
  151. package/dist/components/HomePage/NavigationGroup.d.ts +2 -2
  152. package/dist/components/HomePage/RenameGroupDialog.d.ts +2 -1
  153. package/dist/components/HomePage/SmallNavigationCard.d.ts +1 -1
  154. package/dist/components/JsonPreviewBinding.d.ts +4 -0
  155. package/dist/components/PropertyCollectionView.d.ts +3 -2
  156. package/dist/components/PropertyIdCopyTooltip.d.ts +3 -3
  157. package/dist/components/{RebaseCMS.d.ts → RebaseAdmin.d.ts} +2 -2
  158. package/dist/components/RebaseAuthGate.d.ts +1 -1
  159. package/dist/components/RebaseLayout.d.ts +6 -5
  160. package/dist/components/RebaseNavigation.d.ts +2 -2
  161. package/dist/components/RebaseRouteDefs.d.ts +2 -2
  162. package/dist/components/RebaseShell.d.ts +2 -1
  163. package/dist/components/ReferenceTable/{EntitySelectionTable.d.ts → SelectionTableBinding.d.ts} +6 -6
  164. package/dist/components/ReferenceWidget.d.ts +3 -2
  165. package/dist/components/RelationSelector.d.ts +1 -1
  166. package/dist/components/SearchIconsView.d.ts +2 -1
  167. package/dist/components/SelectableTable/SelectableTable.d.ts +11 -11
  168. package/dist/components/SelectableTable/SelectableTableContext.d.ts +3 -3
  169. package/dist/components/SelectableTable/SelectionStore.d.ts +16 -22
  170. package/dist/components/SelectableTable/filters/BooleanFilterField.d.ts +9 -3
  171. package/dist/components/SelectableTable/filters/DateTimeFilterField.d.ts +10 -3
  172. package/dist/components/SelectableTable/filters/FilterFieldBinding.d.ts +40 -0
  173. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +10 -3
  174. package/dist/components/SelectableTable/filters/RelationFilterField.d.ts +8 -1
  175. package/dist/components/SelectableTable/filters/StringNumberFilterField.d.ts +10 -3
  176. package/dist/components/SideDialogs.d.ts +2 -2
  177. package/dist/components/SidePanelBinding.d.ts +11 -0
  178. package/dist/components/{SideEntityProvider.d.ts → SidePanelProvider.d.ts} +8 -8
  179. package/dist/components/admin/CreationResultDialog.d.ts +6 -0
  180. package/dist/components/admin/index.d.ts +1 -3
  181. package/dist/components/app/AppBar.d.ts +1 -1
  182. package/dist/components/app/Drawer.d.ts +9 -2
  183. package/dist/components/common/default_entity_actions.d.ts +8 -1
  184. package/dist/components/field_configs.d.ts +1 -1
  185. package/dist/components/history/EntityHistoryEntry.d.ts +3 -3
  186. package/dist/components/history/EntityHistoryView.d.ts +1 -1
  187. package/dist/components/history/LastEditedByFormAction.d.ts +2 -1
  188. package/dist/components/history/LastEditedByIndicator.d.ts +4 -3
  189. package/dist/components/history/UserChip.d.ts +1 -1
  190. package/dist/components/index.d.ts +16 -13
  191. package/dist/contexts/SidePanelControllerContext.d.ts +3 -0
  192. package/dist/data_export/export/BasicExportAction.d.ts +2 -1
  193. package/dist/data_export/export/ExportCollectionAction.d.ts +4 -4
  194. package/dist/data_export/export/export.d.ts +3 -3
  195. package/dist/data_import/components/DataNewPropertiesMapping.d.ts +1 -1
  196. package/dist/data_import/components/ImportFileUpload.d.ts +1 -1
  197. package/dist/data_import/components/ImportNewPropertyFieldPreview.d.ts +2 -1
  198. package/dist/data_import/components/ImportSaveInProgress.d.ts +3 -3
  199. package/dist/data_import/import/ImportCollectionAction.d.ts +4 -3
  200. package/dist/data_import/utils/data.d.ts +1 -1
  201. package/dist/data_import/utils/file_headers.d.ts +6 -1
  202. package/dist/data_import/utils/file_to_json.d.ts +1 -11
  203. package/dist/data_import/utils/transforms.d.ts +11 -0
  204. package/dist/editor/components/SlashCommandMenu.d.ts +2 -1
  205. package/dist/editor/components/editor-bubble.d.ts +5 -1
  206. package/dist/editor/components/image-bubble.d.ts +5 -1
  207. package/dist/editor/components/index.d.ts +3 -3
  208. package/dist/editor/components/table-bubble.d.ts +5 -1
  209. package/dist/editor/editor.d.ts +4 -4
  210. package/dist/editor/nodeViews/ReactNodeView.d.ts +4 -1
  211. package/dist/editor/selectors/color-selector.d.ts +1 -1
  212. package/dist/editor/selectors/link-selector.d.ts +1 -1
  213. package/dist/editor/selectors/node-selector.d.ts +1 -1
  214. package/dist/editor/selectors/text-buttons.d.ts +1 -1
  215. package/dist/editor/useProseMirror.d.ts +2 -2
  216. package/dist/editor/utils/remove_classes.d.ts +1 -1
  217. package/dist/editor.js +2625 -3569
  218. package/dist/editor.js.map +1 -1
  219. package/dist/form/EntityForm.d.ts +11 -9
  220. package/dist/form/EntityFormActions.d.ts +2 -1
  221. package/dist/form/EntityFormBinding.d.ts +27 -0
  222. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  223. package/dist/form/components/FieldHelperText.d.ts +1 -1
  224. package/dist/form/components/FormEntry.d.ts +1 -1
  225. package/dist/form/components/FormLayout.d.ts +1 -1
  226. package/dist/form/components/LabelWithIconAndTooltip.d.ts +1 -1
  227. package/dist/form/components/LocalChangesMenu.d.ts +3 -2
  228. package/dist/form/components/StorageItemPreview.d.ts +2 -1
  229. package/dist/form/components/StorageUploadProgress.d.ts +10 -4
  230. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +2 -1
  231. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +2 -1
  232. package/dist/form/field_bindings/BlockFieldBinding.d.ts +2 -1
  233. package/dist/form/field_bindings/DateTimeFieldBinding.d.ts +2 -1
  234. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +2 -1
  235. package/dist/form/field_bindings/MapFieldBinding.d.ts +2 -1
  236. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +4 -3
  237. package/dist/form/field_bindings/MultiSelectFieldBinding.d.ts +2 -1
  238. package/dist/form/field_bindings/MultipleRelationFieldBinding.d.ts +2 -1
  239. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +2 -1
  240. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -1
  241. package/dist/form/field_bindings/RelationFieldBinding.d.ts +2 -1
  242. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +2 -1
  243. package/dist/form/field_bindings/SelectFieldBinding.d.ts +2 -1
  244. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +5 -4
  245. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +2 -1
  246. package/dist/form/field_bindings/TextFieldBinding.d.ts +2 -1
  247. package/dist/form/field_bindings/UserSelectFieldBinding.d.ts +2 -1
  248. package/dist/form/field_bindings/VectorFieldBinding.d.ts +12 -0
  249. package/dist/form/form_utils.d.ts +8 -0
  250. package/dist/form/index.d.ts +6 -2
  251. package/dist/form/validation.d.ts +3 -3
  252. package/dist/history-C0FdqGNz.js +311 -0
  253. package/dist/history-C0FdqGNz.js.map +1 -0
  254. package/dist/hooks/index.d.ts +4 -4
  255. package/dist/hooks/navigation/contexts/CollectionRegistryContext.d.ts +2 -2
  256. package/dist/hooks/navigation/useAsyncResolver.d.ts +26 -0
  257. package/dist/hooks/navigation/useBuildCollectionRegistryController.d.ts +2 -0
  258. package/dist/hooks/navigation/useBuildNavigationStateController.d.ts +6 -8
  259. package/dist/hooks/navigation/useNavigationResolution.d.ts +6 -7
  260. package/dist/hooks/navigation/useResolvedCollections.d.ts +11 -7
  261. package/dist/hooks/navigation/useResolvedViews.d.ts +2 -5
  262. package/dist/hooks/navigation/useTopLevelNavigation.d.ts +3 -3
  263. package/dist/hooks/navigation/utils.d.ts +5 -5
  264. package/dist/hooks/useBreadcrumbsController.d.ts +2 -32
  265. package/dist/hooks/useBuildSidePanel.d.ts +6 -0
  266. package/dist/hooks/useCMSContext.d.ts +2 -2
  267. package/dist/hooks/{useEntityHistory.d.ts → useHistory.d.ts} +2 -2
  268. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  269. package/dist/hooks/{useEntitySelectionDialog.d.ts → useSelectionDialog.d.ts} +2 -2
  270. package/dist/hooks/useSideDialogsController.d.ts +1 -1
  271. package/dist/hooks/useSidePanel.d.ts +11 -0
  272. package/dist/index.d.ts +6 -3
  273. package/dist/index.js +2 -799
  274. package/dist/markdown-CklalUUk.js +526 -0
  275. package/dist/markdown-CklalUUk.js.map +1 -0
  276. package/dist/preview/components/ArrayEnumPreview.d.ts +2 -1
  277. package/dist/preview/components/EmptyValue.d.ts +2 -1
  278. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  279. package/dist/preview/components/ImagePreview.d.ts +2 -1
  280. package/dist/preview/components/ReferencePreview.d.ts +2 -1
  281. package/dist/preview/components/RelationPreview.d.ts +2 -1
  282. package/dist/preview/components/StorageThumbnail.d.ts +3 -1
  283. package/dist/preview/components/UrlComponentPreview.d.ts +1 -0
  284. package/dist/preview/components/UserPreview.d.ts +6 -3
  285. package/dist/preview/property_previews/ArrayOfMapsPreview.d.ts +2 -1
  286. package/dist/preview/property_previews/ArrayOfReferencesPreview.d.ts +1 -1
  287. package/dist/preview/property_previews/ArrayOfRelationsPreview.d.ts +1 -1
  288. package/dist/preview/property_previews/ArrayOfStorageComponentsPreview.d.ts +2 -1
  289. package/dist/preview/property_previews/ArrayOfStringsPreview.d.ts +2 -1
  290. package/dist/preview/property_previews/ArrayOneOfPreview.d.ts +2 -1
  291. package/dist/preview/property_previews/ArrayPropertyEnumPreview.d.ts +1 -1
  292. package/dist/preview/property_previews/ArrayPropertyPreview.d.ts +2 -1
  293. package/dist/preview/property_previews/MapPropertyPreview.d.ts +3 -2
  294. package/dist/preview/property_previews/SkeletonPropertyComponent.d.ts +5 -4
  295. package/dist/rolldown-runtime-D7D4PA-g.js +13 -0
  296. package/dist/routes/CustomViewRoute.d.ts +2 -1
  297. package/dist/routes/RebaseRoute.d.ts +1 -1
  298. package/dist/src-DLAFyeZI.js +24222 -0
  299. package/dist/src-DLAFyeZI.js.map +1 -0
  300. package/dist/types/components/EntityFormActionsProps.d.ts +4 -4
  301. package/dist/types/components/EntityFormProps.d.ts +65 -5
  302. package/dist/types/components/PropertyPreviewProps.d.ts +6 -1
  303. package/dist/types/components/formex.d.ts +1 -40
  304. package/dist/types/fields.d.ts +23 -12
  305. package/dist/util/dataControllerAdapter.d.ts +27 -0
  306. package/dist/util/navigation_utils.d.ts +16 -6
  307. package/dist/util/previews.d.ts +8 -3
  308. package/dist/util/propertyConfigMapper.d.ts +17 -0
  309. package/dist/util/property_utils.d.ts +3 -3
  310. package/dist/util/resolutions.d.ts +1 -2
  311. package/dist/util/view_constants.d.ts +6 -0
  312. package/package.json +56 -55
  313. package/src/collection_editor/ConfigControllerProvider.tsx +37 -53
  314. package/src/collection_editor/_cms_internals.ts +4 -4
  315. package/src/collection_editor/api/generateCollectionApi.ts +10 -9
  316. package/src/collection_editor/extensibility_types.ts +168 -0
  317. package/src/collection_editor/index.ts +47 -3
  318. package/src/collection_editor/pgColumnToProperty.ts +23 -6
  319. package/src/collection_editor/serializable_types.ts +474 -0
  320. package/src/collection_editor/serializable_utils.ts +576 -0
  321. package/src/collection_editor/types/collection_editor_controller.tsx +8 -11
  322. package/src/collection_editor/types/collection_inference.ts +2 -2
  323. package/src/collection_editor/types/config_controller.tsx +14 -14
  324. package/src/collection_editor/ui/AddKanbanColumnAction.tsx +21 -9
  325. package/src/collection_editor/ui/CollectionViewHeaderAction.tsx +8 -8
  326. package/src/collection_editor/ui/EditorCollectionAction.tsx +9 -14
  327. package/src/collection_editor/ui/EditorCollectionActionStart.tsx +13 -18
  328. package/src/collection_editor/ui/EditorEntityAction.tsx +9 -14
  329. package/src/collection_editor/ui/HomePageEditorCollectionAction.tsx +13 -19
  330. package/src/collection_editor/ui/KanbanSetupAction.tsx +8 -6
  331. package/src/collection_editor/ui/MissingReferenceWidget.tsx +5 -3
  332. package/src/collection_editor/ui/NewCollectionButton.tsx +4 -4
  333. package/src/collection_editor/ui/NewCollectionCard.tsx +8 -13
  334. package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +11 -16
  335. package/src/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.tsx +20 -12
  336. package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +29 -59
  337. package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +213 -135
  338. package/src/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.tsx +21 -7
  339. package/src/collection_editor/ui/collection_editor/CollectionJsonImportDialog.tsx +29 -23
  340. package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +142 -112
  341. package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +49 -12
  342. package/src/collection_editor/ui/collection_editor/CollectionRelationsTab.tsx +29 -10
  343. package/src/collection_editor/ui/collection_editor/CollectionStudioView.tsx +26 -23
  344. package/src/collection_editor/ui/collection_editor/CollectionsStudioView.tsx +104 -37
  345. package/src/collection_editor/ui/collection_editor/DisplaySettingsForm.tsx +26 -14
  346. package/src/collection_editor/ui/collection_editor/EntityActionsEditTab.tsx +21 -8
  347. package/src/collection_editor/ui/collection_editor/EntityActionsSelectDialog.tsx +1 -1
  348. package/src/collection_editor/ui/collection_editor/EntityCustomViewsSelectDialog.tsx +1 -1
  349. package/src/collection_editor/ui/collection_editor/EnumForm.tsx +20 -5
  350. package/src/collection_editor/ui/collection_editor/GeneralSettingsForm.tsx +45 -12
  351. package/src/collection_editor/ui/collection_editor/GetCodeDialog.tsx +10 -12
  352. package/src/collection_editor/ui/collection_editor/KanbanConfigSection.tsx +5 -6
  353. package/src/collection_editor/ui/collection_editor/LayoutModeSwitch.tsx +17 -5
  354. package/src/collection_editor/ui/collection_editor/PropertyEditView.tsx +190 -27
  355. package/src/collection_editor/ui/collection_editor/PropertyFieldPreview.tsx +58 -49
  356. package/src/collection_editor/ui/collection_editor/PropertyTree.tsx +17 -4
  357. package/src/collection_editor/ui/collection_editor/RouterCollectionStudioView.tsx +44 -0
  358. package/src/collection_editor/ui/collection_editor/RouterCollectionsStudioView.tsx +41 -0
  359. package/src/collection_editor/ui/collection_editor/SubcollectionsEditTab.tsx +27 -13
  360. package/src/collection_editor/ui/collection_editor/SwitchControl.tsx +1 -1
  361. package/src/collection_editor/ui/collection_editor/ViewModeSwitch.tsx +9 -2
  362. package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.tsx +4 -4
  363. package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.tsx +4 -4
  364. package/src/collection_editor/ui/collection_editor/properties/BlockPropertyField.tsx +5 -6
  365. package/src/collection_editor/ui/collection_editor/properties/BooleanPropertyField.tsx +1 -1
  366. package/src/collection_editor/ui/collection_editor/properties/CommonPropertyFields.tsx +5 -5
  367. package/src/collection_editor/ui/collection_editor/properties/DateTimePropertyField.tsx +10 -10
  368. package/src/collection_editor/ui/collection_editor/properties/EnumPropertyField.tsx +10 -9
  369. package/src/collection_editor/ui/collection_editor/properties/MapPropertyField.tsx +7 -8
  370. package/src/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.tsx +17 -10
  371. package/src/collection_editor/ui/collection_editor/properties/NumberPropertyField.tsx +7 -7
  372. package/src/collection_editor/ui/collection_editor/properties/ReferencePropertyField.tsx +19 -53
  373. package/src/collection_editor/ui/collection_editor/properties/RelationPropertyField.tsx +43 -60
  374. package/src/collection_editor/ui/collection_editor/properties/RepeatPropertyField.tsx +3 -3
  375. package/src/collection_editor/ui/collection_editor/properties/StoragePropertyField.tsx +56 -13
  376. package/src/collection_editor/ui/collection_editor/properties/StringPropertyField.tsx +7 -7
  377. package/src/collection_editor/ui/collection_editor/properties/UrlPropertyField.tsx +4 -3
  378. package/src/collection_editor/ui/collection_editor/properties/VectorPropertyField.tsx +34 -0
  379. package/src/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx +5 -6
  380. package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.tsx +18 -9
  381. package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsPanel.tsx +1 -2
  382. package/src/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.tsx +17 -5
  383. package/src/collection_editor/ui/collection_editor/properties/conditions/property_paths.ts +1 -1
  384. package/src/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx +4 -4
  385. package/src/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx +3 -3
  386. package/src/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx +6 -9
  387. package/src/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.tsx +6 -6
  388. package/src/collection_editor/ui/collection_editor/properties/validation/ValidationPanel.tsx +1 -2
  389. package/src/collection_editor/ui/collection_editor/templates/blog_template.ts +3 -3
  390. package/src/collection_editor/ui/collection_editor/templates/pages_template.ts +3 -3
  391. package/src/collection_editor/ui/collection_editor/templates/products_template.ts +4 -4
  392. package/src/collection_editor/ui/collection_editor/templates/users_template.ts +2 -2
  393. package/src/collection_editor/ui/collection_editor/utils/supported_fields.tsx +0 -1
  394. package/src/collection_editor/ui/collection_editor/utils/update_property_for_widget.ts +7 -29
  395. package/src/collection_editor/useJsonCollectionsConfigController.tsx +286 -0
  396. package/src/collection_editor/useLocalCollectionsConfigController.tsx +11 -8
  397. package/src/collection_editor/useSafeSnackbarController.ts +9 -0
  398. package/src/collection_editor/validateCollectionJson.ts +111 -24
  399. package/src/collection_editor_ui.ts +6 -0
  400. package/src/components/AdminModeSyncer.tsx +2 -2
  401. package/src/components/ArrayContainer.tsx +28 -24
  402. package/src/components/ClearFilterSortButton.tsx +2 -3
  403. package/src/components/CollectionEditorDialogs.tsx +1 -1
  404. package/src/components/CollectionPanel.tsx +178 -0
  405. package/src/components/{EntityCollectionTable/EntityCollectionRowActions.tsx → CollectionTableBinding/CollectionRowActions.tsx} +26 -16
  406. package/src/components/{EntityCollectionTable/EntityCollectionTable.tsx → CollectionTableBinding/CollectionTableBinding.tsx} +34 -31
  407. package/src/components/{EntityCollectionTable/EntityCollectionTableProps.tsx → CollectionTableBinding/CollectionTableBindingProps.tsx} +4 -4
  408. package/src/components/{EntityCollectionTable → CollectionTableBinding}/PropertyTableCell.tsx +14 -12
  409. package/src/components/{EntityCollectionTable → CollectionTableBinding}/column_utils.tsx +4 -4
  410. package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableMultipleRelationField.tsx +13 -13
  411. package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableReferenceField.tsx +39 -19
  412. package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationField.tsx +14 -14
  413. package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationSelectorField.tsx +3 -3
  414. package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableStorageUpload.tsx +29 -27
  415. package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableSelect.tsx +0 -1
  416. package/src/components/CollectionTableBinding/index.tsx +14 -0
  417. package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/CollectionTableToolbar.tsx +22 -28
  418. package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCell.tsx +8 -9
  419. package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCellActions.tsx +2 -3
  420. package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/common.tsx +7 -7
  421. package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/PopupFormField.tsx +12 -13
  422. package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useDraggable.tsx +5 -2
  423. package/src/components/{EntityCollectionTable → CollectionTableBinding}/table_bindings.tsx +101 -104
  424. package/src/components/{EntityCollectionView/EntityBoardCard.tsx → CollectionViewBinding/BoardCardBinding.tsx} +39 -40
  425. package/src/components/{EntityCollectionView/EntityCollectionBoardView.tsx → CollectionViewBinding/CollectionBoardViewBinding.tsx} +88 -52
  426. package/src/components/CollectionViewBinding/CollectionCardViewBinding.tsx +157 -0
  427. package/src/components/{EntityCollectionView/EntityCollectionListView.tsx → CollectionViewBinding/CollectionListViewBinding.tsx} +234 -151
  428. package/src/components/{EntityCollectionView/EntityCollectionViewActions.tsx → CollectionViewBinding/CollectionViewActions.tsx} +36 -26
  429. package/src/components/{EntityCollectionView/EntityCollectionView.tsx → CollectionViewBinding/CollectionViewBinding.tsx} +392 -213
  430. package/src/components/{EntityCollectionView/EntityCollectionViewStartActions.tsx → CollectionViewBinding/CollectionViewStartActions.tsx} +42 -23
  431. package/src/components/{EntityCollectionView/EntityCard.tsx → CollectionViewBinding/EntityCardBinding.tsx} +14 -14
  432. package/src/components/CollectionViewBinding/FilterPresetsButton.tsx +294 -0
  433. package/src/components/{EntityCollectionView → CollectionViewBinding}/FiltersDialog.tsx +37 -79
  434. package/src/components/{EntityCollectionView → CollectionViewBinding}/SplitListView.tsx +97 -30
  435. package/src/components/{EntityCollectionView → CollectionViewBinding}/ViewModeToggle.tsx +20 -8
  436. package/src/components/{EntityCollectionView → CollectionViewBinding}/hooks/useCollectionInlineEditor.ts +9 -8
  437. package/src/components/{EntityCollectionView → CollectionViewBinding}/hooks/useKanbanDragAndDrop.ts +17 -16
  438. package/src/components/{EntityCollectionView → CollectionViewBinding}/useBoardDataController.tsx +118 -70
  439. package/src/components/{EntityCollectionView/useEntityPreviewSlots.ts → CollectionViewBinding/usePreviewSlots.ts} +136 -48
  440. package/src/components/DefaultAppBar.tsx +73 -41
  441. package/src/components/DefaultDrawer.tsx +317 -85
  442. package/src/components/DeleteEntityDialog.tsx +7 -7
  443. package/src/components/DetailViewBinding.tsx +670 -0
  444. package/src/components/DrawerNavigationGroup.tsx +11 -11
  445. package/src/components/DrawerNavigationItem.tsx +6 -6
  446. package/src/components/{EntityEditViewFormActions.tsx → EditFormActions.tsx} +78 -59
  447. package/src/components/EditViewBinding.tsx +761 -0
  448. package/src/components/{EntityPreview.tsx → EntityPreviewBinding.tsx} +53 -39
  449. package/src/components/{EntityView.tsx → EntityViewBinding.tsx} +8 -9
  450. package/src/components/HomePage/ContentHomePage.tsx +35 -17
  451. package/src/components/HomePage/FavouritesView.tsx +2 -3
  452. package/src/components/HomePage/HomePageDnD.tsx +3 -2
  453. package/src/components/HomePage/NavigationCard.tsx +9 -16
  454. package/src/components/HomePage/NavigationCardBinding.tsx +6 -7
  455. package/src/components/HomePage/NavigationGroup.tsx +4 -5
  456. package/src/components/HomePage/RenameGroupDialog.tsx +1 -1
  457. package/src/components/HomePage/SmallNavigationCard.tsx +0 -5
  458. package/src/components/{EntityJsonPreview.tsx → JsonPreviewBinding.tsx} +2 -2
  459. package/src/components/PropertyCollectionView.tsx +2 -1
  460. package/src/components/PropertyIdCopyTooltip.tsx +2 -3
  461. package/src/components/{RebaseCMS.tsx → RebaseAdmin.tsx} +8 -6
  462. package/src/components/RebaseAuthGate.tsx +5 -3
  463. package/src/components/RebaseLayout.tsx +10 -9
  464. package/src/components/RebaseNavigation.tsx +107 -31
  465. package/src/components/RebaseRouteDefs.tsx +10 -13
  466. package/src/components/RebaseShell.tsx +18 -14
  467. package/src/components/ReferenceTable/{EntitySelectionTable.tsx → SelectionTableBinding.tsx} +40 -33
  468. package/src/components/ReferenceWidget.tsx +7 -7
  469. package/src/components/RelationSelector.tsx +82 -24
  470. package/src/components/SearchIconsView.tsx +13 -12
  471. package/src/components/SelectableTable/SelectableTable.tsx +68 -115
  472. package/src/components/SelectableTable/SelectableTableContext.tsx +4 -3
  473. package/src/components/SelectableTable/SelectionStore.ts +20 -44
  474. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +13 -5
  475. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +37 -16
  476. package/src/components/SelectableTable/filters/FilterFieldBinding.tsx +187 -0
  477. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +27 -13
  478. package/src/components/SelectableTable/filters/RelationFilterField.tsx +17 -3
  479. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +95 -35
  480. package/src/components/SideDialogs.tsx +58 -40
  481. package/src/components/SidePanelBinding.tsx +261 -0
  482. package/src/components/{SideEntityProvider.tsx → SidePanelProvider.tsx} +17 -16
  483. package/src/components/UserSelector.tsx +123 -9
  484. package/src/components/admin/CreationResultDialog.tsx +138 -0
  485. package/src/components/admin/index.ts +1 -3
  486. package/src/components/app/Drawer.tsx +9 -1
  487. package/src/components/app/Scaffold.tsx +16 -9
  488. package/src/components/common/default_entity_actions.tsx +270 -29
  489. package/src/components/field_configs.tsx +68 -46
  490. package/src/components/history/EntityHistoryEntry.tsx +4 -5
  491. package/src/components/history/EntityHistoryView.tsx +18 -8
  492. package/src/components/history/LastEditedByIndicator.tsx +4 -4
  493. package/src/components/index.ts +20 -17
  494. package/src/contexts/BreacrumbsContext.tsx +15 -6
  495. package/src/contexts/SidePanelControllerContext.tsx +5 -0
  496. package/src/data_export/export/BasicExportAction.tsx +42 -43
  497. package/src/data_export/export/ExportCollectionAction.tsx +55 -54
  498. package/src/data_export/export/export.ts +17 -17
  499. package/src/data_import/components/DataNewPropertiesMapping.tsx +17 -4
  500. package/src/data_import/components/ImportFileUpload.tsx +2 -3
  501. package/src/data_import/components/ImportNewPropertyFieldPreview.tsx +2 -3
  502. package/src/data_import/components/ImportSaveInProgress.tsx +4 -4
  503. package/src/data_import/import/ImportCollectionAction.tsx +26 -13
  504. package/src/data_import/utils/data.ts +26 -8
  505. package/src/data_import/utils/file_headers.ts +13 -89
  506. package/src/data_import/utils/file_to_json.ts +43 -68
  507. package/src/data_import/utils/get_properties_mapping.ts +1 -1
  508. package/src/data_import/utils/transforms.ts +47 -0
  509. package/src/editor/components/SlashCommandMenu.tsx +17 -2
  510. package/src/editor/components/editor-bubble-item.tsx +1 -1
  511. package/src/editor/components/editor-bubble.tsx +32 -9
  512. package/src/editor/components/image-bubble.tsx +28 -12
  513. package/src/editor/components/index.ts +3 -3
  514. package/src/editor/components/table-bubble.tsx +80 -18
  515. package/src/editor/editor.tsx +34 -15
  516. package/src/editor/extensions/HighlightDecorationExtension.ts +3 -2
  517. package/src/editor/extensions/Image/index.ts +3 -3
  518. package/src/editor/extensions/Image.ts +3 -3
  519. package/src/editor/extensions/clipboard.ts +2 -2
  520. package/src/editor/markdown-it-plugins.d.ts +24 -0
  521. package/src/editor/markdown.ts +2 -3
  522. package/src/editor/nodeViews/ReactNodeView.tsx +1 -1
  523. package/src/editor/nodeViews/TaskItemComponent.tsx +9 -8
  524. package/src/editor/schema.ts +135 -59
  525. package/src/editor/selectors/ai-selector.tsx +0 -1
  526. package/src/editor/selectors/color-selector.tsx +1 -2
  527. package/src/editor/selectors/link-selector.tsx +9 -7
  528. package/src/editor/selectors/node-selector.tsx +17 -3
  529. package/src/editor/selectors/text-buttons.tsx +1 -2
  530. package/src/editor/useProseMirror.ts +2 -2
  531. package/src/editor/utils/prosemirror-utils.ts +1 -1
  532. package/src/editor/utils/remove_classes.ts +6 -5
  533. package/src/form/EntityForm.tsx +222 -442
  534. package/src/form/EntityFormActions.tsx +49 -55
  535. package/src/form/EntityFormBinding.tsx +323 -0
  536. package/src/form/PropertyFieldBinding.tsx +81 -84
  537. package/src/form/components/ErrorFocus.tsx +1 -1
  538. package/src/form/components/FieldHelperText.tsx +6 -7
  539. package/src/form/components/FormLayout.tsx +1 -1
  540. package/src/form/components/LocalChangesMenu.tsx +20 -5
  541. package/src/form/components/StorageItemPreview.tsx +2 -3
  542. package/src/form/components/StorageUploadProgress.tsx +14 -7
  543. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +5 -5
  544. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +12 -13
  545. package/src/form/field_bindings/BlockFieldBinding.tsx +59 -58
  546. package/src/form/field_bindings/DateTimeFieldBinding.tsx +2 -2
  547. package/src/form/field_bindings/KeyValueFieldBinding.tsx +319 -303
  548. package/src/form/field_bindings/MapFieldBinding.tsx +14 -56
  549. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +28 -10
  550. package/src/form/field_bindings/MultiSelectFieldBinding.tsx +3 -4
  551. package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +11 -12
  552. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +9 -2
  553. package/src/form/field_bindings/ReferenceFieldBinding.tsx +17 -15
  554. package/src/form/field_bindings/RelationFieldBinding.tsx +157 -156
  555. package/src/form/field_bindings/RepeatFieldBinding.tsx +8 -8
  556. package/src/form/field_bindings/SelectFieldBinding.tsx +3 -4
  557. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +107 -103
  558. package/src/form/field_bindings/SwitchFieldBinding.tsx +17 -17
  559. package/src/form/field_bindings/TextFieldBinding.tsx +90 -78
  560. package/src/form/field_bindings/UserSelectFieldBinding.tsx +18 -18
  561. package/src/form/field_bindings/VectorFieldBinding.tsx +202 -0
  562. package/src/form/form_utils.ts +163 -0
  563. package/src/form/index.tsx +15 -6
  564. package/src/form/useClearRestoreValue.tsx +1 -1
  565. package/src/form/validation.ts +104 -50
  566. package/src/hooks/index.ts +4 -4
  567. package/src/hooks/navigation/contexts/CollectionRegistryContext.tsx +5 -4
  568. package/src/hooks/navigation/contexts/NavigationStateContext.tsx +2 -2
  569. package/src/hooks/navigation/contexts/UrlContext.tsx +1 -2
  570. package/src/hooks/navigation/useAsyncResolver.ts +100 -0
  571. package/src/hooks/navigation/useBuildCollectionRegistryController.tsx +40 -21
  572. package/src/hooks/navigation/useBuildNavigationStateController.tsx +21 -22
  573. package/src/hooks/navigation/useNavigationResolution.ts +193 -21
  574. package/src/hooks/navigation/useResolvedCollections.ts +45 -77
  575. package/src/hooks/navigation/useResolvedViews.tsx +44 -123
  576. package/src/hooks/navigation/useTopLevelNavigation.ts +22 -18
  577. package/src/hooks/navigation/utils.ts +12 -9
  578. package/src/hooks/useBreadcrumbsController.tsx +2 -34
  579. package/src/hooks/{useBuildSideEntityController.tsx → useBuildSidePanel.tsx} +63 -24
  580. package/src/hooks/useCMSContext.tsx +7 -7
  581. package/src/hooks/{useEntityHistory.ts → useHistory.ts} +9 -4
  582. package/src/hooks/useResolvedNavigationFrom.tsx +8 -5
  583. package/src/hooks/{useEntitySelectionDialog.tsx → useSelectionDialog.tsx} +7 -7
  584. package/src/hooks/useSideDialogsController.tsx +1 -1
  585. package/src/hooks/useSidePanel.tsx +13 -0
  586. package/src/index.ts +34 -20
  587. package/src/preview/PropertyPreview.tsx +34 -41
  588. package/src/preview/components/DatePreview.tsx +1 -1
  589. package/src/preview/components/EnumValuesChip.tsx +1 -1
  590. package/src/preview/components/ImagePreview.tsx +4 -3
  591. package/src/preview/components/ReferencePreview.tsx +69 -18
  592. package/src/preview/components/RelationPreview.tsx +107 -18
  593. package/src/preview/components/StorageThumbnail.tsx +28 -8
  594. package/src/preview/components/UrlComponentPreview.tsx +12 -4
  595. package/src/preview/components/UserPreview.tsx +6 -15
  596. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +5 -5
  597. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +5 -5
  598. package/src/preview/property_previews/ArrayOfRelationsPreview.tsx +4 -4
  599. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +4 -4
  600. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +3 -2
  601. package/src/preview/property_previews/ArrayOneOfPreview.tsx +7 -9
  602. package/src/preview/property_previews/ArrayPropertyEnumPreview.tsx +1 -1
  603. package/src/preview/property_previews/ArrayPropertyPreview.tsx +4 -4
  604. package/src/preview/property_previews/MapPropertyPreview.tsx +4 -3
  605. package/src/preview/property_previews/NumberPropertyPreview.tsx +5 -3
  606. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +24 -25
  607. package/src/preview/property_previews/StringPropertyPreview.tsx +13 -11
  608. package/src/routes/CustomViewRoute.tsx +14 -6
  609. package/src/routes/RebaseRoute.tsx +112 -36
  610. package/src/types/components/EntityFormActionsProps.tsx +4 -4
  611. package/src/types/components/EntityFormProps.tsx +75 -5
  612. package/src/types/components/PropertyPreviewProps.tsx +6 -1
  613. package/src/types/components/formex.tsx +1 -45
  614. package/src/types/fields.tsx +26 -15
  615. package/src/util/dataControllerAdapter.ts +87 -0
  616. package/src/util/navigation_utils.ts +43 -13
  617. package/src/util/previews.ts +149 -13
  618. package/src/util/propertyConfigMapper.ts +134 -0
  619. package/src/util/property_utils.tsx +24 -9
  620. package/src/util/resolutions.ts +4 -8
  621. package/src/util/view_constants.ts +6 -0
  622. package/dist/CollectionEditorDialog-B2M9lCyL.js +0 -4720
  623. package/dist/CollectionEditorDialog-B2M9lCyL.js.map +0 -1
  624. package/dist/CollectionsStudioView-WG6soyfs.js +0 -218
  625. package/dist/CollectionsStudioView-WG6soyfs.js.map +0 -1
  626. package/dist/ContentHomePage-CDF_a6Lp.js +0 -1786
  627. package/dist/ContentHomePage-CDF_a6Lp.js.map +0 -1
  628. package/dist/ExportCollectionAction-Dc0VOWMN.js +0 -439
  629. package/dist/ExportCollectionAction-Dc0VOWMN.js.map +0 -1
  630. package/dist/ImportCollectionAction-DpCagAOy.js +0 -686
  631. package/dist/ImportCollectionAction-DpCagAOy.js.map +0 -1
  632. package/dist/PropertyEditView-DS67DxoT.js +0 -8138
  633. package/dist/PropertyEditView-DS67DxoT.js.map +0 -1
  634. package/dist/RoleChip-QtUFXeTp.js +0 -67
  635. package/dist/RoleChip-QtUFXeTp.js.map +0 -1
  636. package/dist/RolesView-CIuYBimF.js +0 -424
  637. package/dist/RolesView-CIuYBimF.js.map +0 -1
  638. package/dist/UsersView-B5zelXnH.js +0 -493
  639. package/dist/UsersView-B5zelXnH.js.map +0 -1
  640. package/dist/collection_editor/types/config_permissions.d.ts +0 -19
  641. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +0 -27
  642. package/dist/components/EntityCollectionTable/fields/VirtualTableDateField.d.ts +0 -12
  643. package/dist/components/EntityCollectionTable/fields/VirtualTableInput.d.ts +0 -9
  644. package/dist/components/EntityCollectionTable/fields/VirtualTableNumberInput.d.ts +0 -8
  645. package/dist/components/EntityCollectionTable/fields/VirtualTableSwitch.d.ts +0 -7
  646. package/dist/components/EntityCollectionTable/index.d.ts +0 -6
  647. package/dist/components/EntityCollectionView/Board.d.ts +0 -2
  648. package/dist/components/EntityCollectionView/BoardColumn.d.ts +0 -42
  649. package/dist/components/EntityCollectionView/BoardColumnTitle.d.ts +0 -9
  650. package/dist/components/EntityCollectionView/BoardSortableList.d.ts +0 -14
  651. package/dist/components/EntityCollectionView/EntityBoardCard.d.ts +0 -31
  652. package/dist/components/EntityCollectionView/EntityCard.d.ts +0 -20
  653. package/dist/components/EntityCollectionView/EntityCollectionBoardView.d.ts +0 -21
  654. package/dist/components/EntityCollectionView/EntityCollectionListView.d.ts +0 -34
  655. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +0 -64
  656. package/dist/components/EntityCollectionView/EntityCollectionViewActions.d.ts +0 -18
  657. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +0 -18
  658. package/dist/components/EntityCollectionView/board_types.d.ts +0 -105
  659. package/dist/components/EntityEditView.d.ts +0 -49
  660. package/dist/components/EntityEditViewFormActions.d.ts +0 -2
  661. package/dist/components/EntityJsonPreview.d.ts +0 -3
  662. package/dist/components/EntitySidePanel.d.ts +0 -10
  663. package/dist/components/EntityView.d.ts +0 -12
  664. package/dist/components/admin/RoleChip.d.ts +0 -4
  665. package/dist/components/admin/RolesView.d.ts +0 -4
  666. package/dist/components/admin/UsersView.d.ts +0 -4
  667. package/dist/contexts/SideEntityControllerContext.d.ts +0 -3
  668. package/dist/form/field_bindings/ReferenceAsStringFieldBinding.d.ts +0 -10
  669. package/dist/hooks/navigation/useNavigationRegistry.d.ts +0 -11
  670. package/dist/hooks/navigation/useNavigationURLs.d.ts +0 -11
  671. package/dist/hooks/useBuildSideEntityController.d.ts +0 -6
  672. package/dist/hooks/useSideEntityController.d.ts +0 -11
  673. package/dist/index-CBhrgpR7.js +0 -12
  674. package/dist/index-CBhrgpR7.js.map +0 -1
  675. package/dist/index-CHxgwt6E.js +0 -456
  676. package/dist/index-CHxgwt6E.js.map +0 -1
  677. package/dist/index-Dey5WJpO.js +0 -8
  678. package/dist/index-Dey5WJpO.js.map +0 -1
  679. package/dist/index.js.map +0 -1
  680. package/dist/markdown-z2Ir7Cgo.js +0 -618
  681. package/dist/markdown-z2Ir7Cgo.js.map +0 -1
  682. package/dist/useEntityHistory-Dcj4zhGj.js +0 -121
  683. package/dist/useEntityHistory-Dcj4zhGj.js.map +0 -1
  684. package/dist/util-BQ82ySL3.js +0 -27720
  685. package/dist/util-BQ82ySL3.js.map +0 -1
  686. package/src/collection_editor/types/config_permissions.ts +0 -20
  687. package/src/components/EntityCollectionTable/fields/VirtualTableDateField.tsx +0 -39
  688. package/src/components/EntityCollectionTable/fields/VirtualTableInput.tsx +0 -90
  689. package/src/components/EntityCollectionTable/fields/VirtualTableNumberInput.tsx +0 -80
  690. package/src/components/EntityCollectionTable/fields/VirtualTableSwitch.tsx +0 -32
  691. package/src/components/EntityCollectionTable/index.tsx +0 -14
  692. package/src/components/EntityCollectionView/Board.tsx +0 -474
  693. package/src/components/EntityCollectionView/BoardColumn.tsx +0 -158
  694. package/src/components/EntityCollectionView/BoardColumnTitle.tsx +0 -45
  695. package/src/components/EntityCollectionView/BoardSortableList.tsx +0 -177
  696. package/src/components/EntityCollectionView/EntityCollectionCardView.tsx +0 -267
  697. package/src/components/EntityCollectionView/board_types.ts +0 -113
  698. package/src/components/EntityEditView.tsx +0 -632
  699. package/src/components/EntitySidePanel.tsx +0 -160
  700. package/src/components/admin/RoleChip.tsx +0 -23
  701. package/src/components/admin/RolesView.tsx +0 -419
  702. package/src/components/admin/UsersView.tsx +0 -782
  703. package/src/contexts/SideEntityControllerContext.tsx +0 -5
  704. package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +0 -141
  705. package/src/hooks/navigation/useNavigationRegistry.ts +0 -153
  706. package/src/hooks/navigation/useNavigationURLs.ts +0 -56
  707. package/src/hooks/useSideEntityController.tsx +0 -13
  708. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/PropertyTableCell.d.ts +0 -0
  709. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useDraggable.d.ts +0 -0
  710. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useWindowSize.d.ts +0 -0
  711. /package/dist/components/{EntityCollectionView → CollectionViewBinding}/useSelectionController.d.ts +0 -0
  712. /package/dist/components/{EntityCollectionView → CollectionViewBinding}/utils.d.ts +0 -0
  713. /package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableUserSelect.tsx +0 -0
  714. /package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useWindowSize.tsx +0 -0
  715. /package/src/components/{EntityCollectionView → CollectionViewBinding}/useSelectionController.tsx +0 -0
  716. /package/src/components/{EntityCollectionView → CollectionViewBinding}/utils.ts +0 -0
@@ -1,146 +1,44 @@
1
- import type { EntityCollection, EntityCustomViewParams } from "@rebasepro/types";
1
+ import type { CollectionConfig, EntityCustomViewParams, AdditionalFieldDelegateProps } from "@rebasepro/types";
2
2
  import type { FormContext, PropertyFieldBindingProps } from "../types/fields";
3
- import type { PluginFormActionProps, PropertyConfig } from "@rebasepro/types";
3
+ import type { PropertyConfig } from "@rebasepro/types";
4
4
  import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
5
- import { AuthController, AnalyticsEvent, Entity, EntityStatus, EntityValues } from "@rebasepro/types";
5
+ import { Entity, EntityStatus, EntityValues } from "@rebasepro/types";
6
6
  import type { EntityFormProps, OnUpdateParams } from "../types/components/EntityFormProps";
7
7
  import { deepEqual as equal } from "fast-equals";
8
8
 
9
9
  import { ErrorBoundary } from "@rebasepro/ui";
10
- import { AlignLeftIcon, CheckIcon, PencilIcon } from "lucide-react";
11
- import { getDefaultValuesFor, getLocalChangesBackup, isHidden, isReadOnly } from "@rebasepro/common";
12
-
13
- import { saveEntityWithCallbacks, useAuthController, useCustomizationController, useData, useSnackbarController, useTranslation, useSlot } from "@rebasepro/core";
14
- import { getFormFieldKeys } from "@rebasepro/core";
15
- import { Alert, Chip, cls, iconSize, paperMixin, Tooltip, Typography } from "@rebasepro/ui";
16
- import { Formex, FormexController, getIn, setIn, useCreateFormex } from "@rebasepro/formex";
17
- import { useAnalyticsController } from "@rebasepro/core";
10
+ import { AlignLeftIcon, CheckIcon, LoaderIcon, PencilIcon, useDebouncedCallback } from "@rebasepro/ui";
11
+ import { getDefaultValuesFor, isHidden, isReadOnly } from "@rebasepro/common";
12
+
13
+ import { useCustomizationController } from "@rebasepro/app";
14
+ import { getFormFieldKeys } from "@rebasepro/app";
15
+ import { Alert, Button, Chip, cls, Dialog, DialogActions, DialogContent, DialogTitle, iconSize, paperMixin, Tooltip, Typography } from "@rebasepro/ui";
16
+ import { Formex, FormexController, useCreateFormex } from "@rebasepro/forms";
17
+
18
18
  import { FormEntry, FormLayout, LabelWithIconAndTooltip, PropertyFieldBinding } from "../form";
19
- import { z } from "zod";
20
- import {
21
- flattenKeys,
22
- getEntityFromCache,
23
- removeEntityFromCache,
24
- removeEntityFromMemoryCache,
25
- saveEntityToCache
26
- } from "@rebasepro/core";
19
+ import { flattenKeys } from "@rebasepro/app";
27
20
  import { ErrorFocus } from "./components/ErrorFocus";
28
21
  import { CustomFieldValidator, getEntitySchema } from "./validation";
29
22
  import { EntityFormActions } from "./EntityFormActions";
30
23
  import type { EntityFormActionsProps } from "../types/components/EntityFormActionsProps";
31
24
  import { LocalChangesMenu } from "./components/LocalChangesMenu";
32
25
 
33
- import { useDebouncedCallback } from "@rebasepro/ui";
34
- import { getEntityTitlePropertyKey } from "../util/previews";
35
- import { getValueInPath, isObject, mergeDeep } from "@rebasepro/utils";
36
- import { useCollectionRegistryController, useSideEntityController, useCMSContext } from "../index";
37
-
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> = {};
41
- if (!touched || typeof touched !== "object") {
42
- return acc;
43
- }
44
-
45
- Object.entries(touched).forEach(([key, value]) => {
46
- if (value) {
47
- acc = setIn(acc, key, getIn(values, key));
48
- }
49
- })
50
-
51
- return acc;
52
- }
26
+ import { getEntityTitlePropertyKey, resolveTitleToString } from "../util/previews";
27
+ import { getValueInPath, mergeDeep } from "@rebasepro/utils";
28
+ import {
29
+ getChanges,
30
+ zodToFormErrors
31
+ } from "./form_utils";
53
32
 
54
33
  /**
55
- * Recursively removes empty plain objects `{}` and empty arrays `[]` from a value tree.
56
- * This prevents ghost containers created by `setIn` intermediate path construction
57
- * (e.g. `{ address: {} }` when only `address.city` was touched but value is undefined)
58
- * from falsely triggering the unsaved local changes indicator.
59
- */
60
- /**
61
- * CheckIcon if a value is semantically empty (null, undefined, or empty string).
34
+ * Headless entity form component.
35
+ *
36
+ * Renders a form for a entity collection without any CMS or backend dependencies.
37
+ * All backend concerns (save, caching, analytics, plugin slots) are provided via
38
+ * callback props. For CMS-connected usage, use {@link EntityFormBinding} instead.
39
+ *
40
+ * @group Components
62
41
  */
63
- function isSemanticEmpty(v: any): boolean {
64
- return v === null || v === undefined || v === "";
65
- }
66
-
67
- function removeEmptyContainers(obj: any): any {
68
- if (Array.isArray(obj)) {
69
- const cleaned = obj.map(removeEmptyContainers);
70
- // Keep arrays even if they contain only nulls/undefined — that's intentional data
71
- return cleaned;
72
- }
73
- if (obj && typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype) {
74
- const result: Record<string, any> = {};
75
- for (const key of Object.keys(obj)) {
76
- const cleaned = removeEmptyContainers(obj[key]);
77
- // Skip empty plain objects
78
- if (cleaned && typeof cleaned === "object" && !Array.isArray(cleaned)
79
- && Object.getPrototypeOf(cleaned) === Object.prototype
80
- && Object.keys(cleaned).length === 0) {
81
- continue;
82
- }
83
- result[key] = cleaned;
84
- }
85
- // After cleaning, check if all remaining values are semantically empty
86
- // (null, undefined, or ""). This catches ghost objects like {type: "", value: null}
87
- // created by oneOf block initialization that aren't meaningful changes.
88
- if (Object.keys(result).length > 0 && Object.values(result).every(isSemanticEmpty)) {
89
- return {};
90
- }
91
- return result;
92
- }
93
- return obj;
94
- }
95
-
96
- export function getChanges<T extends object>(source: Partial<T>, comparison: Partial<T>): Partial<T> {
97
- const changes: Partial<T> = {};
98
-
99
- if (!source) {
100
- return {};
101
- }
102
- if (!comparison) {
103
- return source;
104
- }
105
-
106
- const allKeys = Array.from(new Set([...Object.keys(source), ...Object.keys(comparison)]));
107
-
108
- for (const key of allKeys) {
109
- const sourceValue = (source as Record<string, unknown>)[key];
110
- const comparisonValue = (comparison as Record<string, unknown>)[key];
111
-
112
- if (equal(sourceValue, comparisonValue)) {
113
- continue;
114
- }
115
-
116
- const sourceHasKey = source && typeof source === "object" && Object.prototype.hasOwnProperty.call(source, key);
117
- const comparisonHasKey = comparison && typeof comparison === "object" && Object.prototype.hasOwnProperty.call(comparison, key);
118
-
119
- if (comparisonHasKey && !sourceHasKey) {
120
- (changes as Record<string, unknown>)[key] = undefined;
121
- } else if (Array.isArray(sourceValue)) {
122
- const comparisonArray = Array.isArray(comparisonValue) ? comparisonValue : [];
123
- if (sourceValue.length !== comparisonArray.length) {
124
- (changes as Record<string, unknown>)[key] = sourceValue;
125
- continue;
126
- }
127
- const hasChanges = sourceValue.some((item, index) => !equal(item, comparisonArray[index]));
128
- if (hasChanges) {
129
- (changes as Record<string, unknown>)[key] = sourceValue;
130
- }
131
- } else if (isObject(sourceValue) && sourceValue && isObject(comparisonValue) && comparisonValue) {
132
- const nestedChanges = getChanges(sourceValue, comparisonValue);
133
- if (Object.keys(nestedChanges).length > 0) {
134
- (changes as Record<string, unknown>)[key] = nestedChanges;
135
- }
136
- } else {
137
- (changes as Record<string, unknown>)[key] = sourceValue;
138
- }
139
- }
140
-
141
- return changes;
142
- }
143
-
144
42
  export function EntityForm<M extends Record<string, unknown>>({
145
43
  path,
146
44
  entityId: entityIdProp,
@@ -163,22 +61,34 @@ export function EntityForm<M extends Record<string, unknown>>({
163
61
  EntityFormActionsComponent = EntityFormActions,
164
62
  showDefaultActions = true,
165
63
  showEntityPath = true,
166
- children
64
+ navigateBack: navigateBackProp,
65
+ children,
66
+ // Headless callback props
67
+ onSubmit: onSubmitProp,
68
+ onValuesChangeDeferred: onValuesChangeDeferredProp,
69
+ onReset: onResetProp,
70
+ uniqueFieldValidator: uniqueFieldValidatorProp,
71
+ // Slots
72
+ beforeFields,
73
+ afterFields,
74
+ pluginActions: pluginActionsProp,
75
+ // Local changes (managed externally)
76
+ computedInitialValues,
77
+ hasLocalChanges: hasLocalChangesProp,
78
+ localChangesData,
79
+ manualApplyLocalChanges,
80
+ localChangesCacheKey,
81
+ onClearLocalChanges
167
82
  }: EntityFormProps<M>) {
168
- const { t } = useTranslation();
169
- const sideEntityController = useSideEntityController();
170
- const collectionRegistryController = useCollectionRegistryController();
83
+
84
+ const customizationController = useCustomizationController();
171
85
 
172
86
  const navigateBack = useCallback(() => {
173
- if (openEntityMode === "side_panel") {
174
- // If we are in side panel mode, we close the side panel
175
- sideEntityController.close();
176
- } else {
177
- window.history.back();
87
+ if (navigateBackProp) {
88
+ navigateBackProp();
178
89
  }
179
- }, []);
90
+ }, [navigateBackProp]);
180
91
 
181
- const authController = useAuthController();
182
92
  const [status, setStatus] = useState<EntityStatus>(initialStatus);
183
93
 
184
94
  const updateStatus = (status: EntityStatus) => {
@@ -188,21 +98,13 @@ export function EntityForm<M extends Record<string, unknown>>({
188
98
 
189
99
  const [valuesToBeSaved, setValuesToBeSaved] = useState<EntityValues<M> | undefined>(undefined);
190
100
  useDebouncedCallback(valuesToBeSaved, () => {
191
- if (valuesToBeSaved)
192
- saveEntity({
193
- entityId: entityIdProp,
194
- collection,
195
- path,
196
- values: valuesToBeSaved
197
- });
101
+ if (valuesToBeSaved && onSubmitProp) {
102
+ setIsSavingAutoSave(true);
103
+ Promise.resolve(onSubmitProp(valuesToBeSaved, formex))
104
+ .finally(() => setIsSavingAutoSave(false));
105
+ }
198
106
  }, false, 2000);
199
107
 
200
- const dataClient = useData();
201
- const snackbarController = useSnackbarController();
202
- const customizationController = useCustomizationController();
203
- const context = useCMSContext();
204
- const analyticsController = useAnalyticsController();
205
-
206
108
  const [underlyingChanges] = useState<Partial<EntityValues<M>>>({});
207
109
 
208
110
  const initialEntityId: string | number | undefined = useMemo(() => {
@@ -216,20 +118,29 @@ export function EntityForm<M extends Record<string, unknown>>({
216
118
  const [entityId, setEntityId] = useState<string | number | undefined>(initialEntityId);
217
119
  const [entityIdError, setEntityIdError] = useState<boolean>(false);
218
120
  const [savingError, setSavingError] = useState<Error | undefined>();
121
+ const [isSavingAutoSave, setIsSavingAutoSave] = useState<boolean>(false);
122
+ const [discardDialogOpen, setDiscardDialogOpen] = useState<boolean>(false);
219
123
 
220
124
  const autoSave = collection.formAutoSave;
221
125
 
222
- const baseInitialValues = useMemo(() => getInitialEntityValues(authController, collection, path, status, entity, customizationController.propertyConfigs), [authController, collection, path, status, entity, customizationController.propertyConfigs]);
223
-
224
- const localChangesDataRaw = useMemo(() => entityId
225
- ? getEntityFromCache(path + "/" + entityId)
226
- : getEntityFromCache(path + "#new"), [entityId, path]);
126
+ // Use externally computed initial values if provided, otherwise compute from entity + collection
127
+ const baseInitialValues = useMemo(() => {
128
+ if (computedInitialValues !== undefined) {
129
+ return computedInitialValues;
130
+ }
131
+ // Fallback: compute from entity/collection (requires authController from context)
132
+ // In headless mode without computedInitialValues, use entity values or defaults
133
+ if ((status === "existing" || status === "copy") && entity) {
134
+ return entity.values ?? getDefaultValuesFor(collection.properties);
135
+ }
136
+ return getDefaultValuesFor(collection.properties);
137
+ }, [computedInitialValues, collection.properties, status, entity]);
227
138
 
228
139
  const [localChangesCleared, setLocalChangesCleared] = useState<boolean>(false);
229
140
 
230
- const localChangesBackup = getLocalChangesBackup(collection);
231
- const autoApplyLocalChanges = localChangesBackup === "auto_apply";
232
- const manualApplyLocalChanges = localChangesBackup === "manual_apply";
141
+ const hasLocalChanges = hasLocalChangesProp !== undefined
142
+ ? (hasLocalChangesProp && !localChangesCleared)
143
+ : false;
233
144
 
234
145
  const onSubmit = (values: EntityValues<M>, formexController: FormexController<EntityValues<M>>) => {
235
146
 
@@ -242,13 +153,21 @@ export function EntityForm<M extends Record<string, unknown>>({
242
153
  throw Error("New FormType added, check EntityForm");
243
154
  }
244
155
 
245
- return save(values)
156
+ if (!onSubmitProp) {
157
+ console.warn("EntityForm: no onSubmit callback provided. Form submission has no effect.");
158
+ formexController.setSubmitting(false);
159
+ return;
160
+ }
161
+
162
+ return Promise.resolve(save(values))
246
163
  ?.then((savedEntity) => {
247
- formexController.resetForm({
248
- values: savedEntity?.values || values,
249
- submitCount: 0,
250
- touched: {}
251
- });
164
+ if (savedEntity) {
165
+ formexController.resetForm({
166
+ values: savedEntity.values || values,
167
+ submitCount: 0,
168
+ touched: {}
169
+ });
170
+ }
252
171
  })
253
172
  .finally(() => {
254
173
  formexController.setSubmitting(false);
@@ -256,27 +175,10 @@ export function EntityForm<M extends Record<string, unknown>>({
256
175
  };
257
176
 
258
177
  const [initialValues, initialDirty] = useMemo(() => {
259
- const initialValuesWithLocalChanges: Partial<M> = autoApplyLocalChanges && localChangesDataRaw ? mergeDeep(baseInitialValues, localChangesDataRaw as Partial<M>) : baseInitialValues;
260
- const initialValues = initialDirtyValues ? mergeDeep(initialValuesWithLocalChanges, initialDirtyValues) : initialValuesWithLocalChanges;
178
+ const initialValues = initialDirtyValues ? mergeDeep(baseInitialValues, initialDirtyValues) : baseInitialValues;
261
179
  const initialDirty = Boolean(initialDirtyValues) && initialDirtyValues && Object.keys(initialDirtyValues).length > 0;
262
180
  return [initialValues, initialDirty];
263
- }, [autoApplyLocalChanges, localChangesDataRaw, baseInitialValues, initialDirtyValues]);
264
-
265
- const localChangesData = useMemo(() => {
266
- if (!localChangesDataRaw) {
267
- return undefined;
268
- }
269
- const changes = getChanges(localChangesDataRaw, initialValues);
270
- // Strip ghost empty containers (e.g. {content: {}}) left by intermediate
271
- // path construction so they don't falsely trigger the unsaved-changes banner.
272
- const cleaned = removeEmptyContainers(changes);
273
- if (cleaned && typeof cleaned === "object" && Object.keys(cleaned).length === 0) {
274
- return undefined;
275
- }
276
- return cleaned;
277
- }, [localChangesDataRaw, initialValues]);
278
-
279
- const hasLocalChanges = !localChangesCleared && localChangesData && Object.keys(localChangesData).length > 0;
181
+ }, [baseInitialValues, initialDirtyValues]);
280
182
 
281
183
  const internalFormex = useCreateFormex<M>({
282
184
  initialValues: initialValues as M,
@@ -291,22 +193,11 @@ export function EntityForm<M extends Record<string, unknown>>({
291
193
  : {},
292
194
  onSubmit,
293
195
  onReset: () => {
294
- clearDirtyCache();
196
+ onResetProp?.();
295
197
  onValuesModified?.(false, initialValues as M);
296
198
  },
297
- onValuesChangeDeferred: (values: M, controller: FormexController<M>) => {
298
- const key = (status === "new" || status === "copy") ? path + "#new" : path + "/" + entityId;
299
- if (controller.dirty) {
300
- const touchedValues = removeEmptyContainers(extractTouchedValues(values, controller.touched));
301
- if (touchedValues && Object.keys(touchedValues).length > 0) {
302
- saveEntityToCache(key, touchedValues);
303
- } else {
304
- // Clean up ghost cache entries that contain only empty containers
305
- removeEntityFromCache(key);
306
- }
307
- }
308
- },
309
- validation: async (values) => {
199
+ onValuesChangeDeferred: onValuesChangeDeferredProp,
200
+ validation: async (values): Promise<Record<string, string>> => {
310
201
  if (!validationSchema) return {};
311
202
  const result = await validationSchema.safeParseAsync(values);
312
203
  if (result.success) return {};
@@ -322,8 +213,12 @@ export function EntityForm<M extends Record<string, unknown>>({
322
213
  const isRedo =
323
214
  ((e.metaKey || e.ctrlKey) && e.shiftKey && e.key.toLowerCase() === "z") ||
324
215
  ((e.metaKey || e.ctrlKey) && !e.shiftKey && e.key.toLowerCase() === "y");
216
+ const isSave = (e.metaKey || e.ctrlKey) && e.key.toLowerCase() === "s";
325
217
 
326
- if (isUndo && formex.canUndo) {
218
+ if (isSave && !disabled && formex.dirty) {
219
+ e.preventDefault();
220
+ formex.handleSubmit();
221
+ } else if (isUndo && formex.canUndo) {
327
222
  e.preventDefault();
328
223
  formex.undo();
329
224
  } else if (isRedo && formex.canRedo) {
@@ -337,41 +232,9 @@ export function EntityForm<M extends Record<string, unknown>>({
337
232
 
338
233
  }, [formex]);
339
234
 
340
- const beforeSaveHookError = useCallback((e: Error) => {
341
- snackbarController.open({
342
- type: "error",
343
- message: `${t("error_before_saving")}: ${e?.message}`
344
- });
345
- console.error(e);
346
- }, [snackbarController]);
347
-
348
- const afterSaveHookError = useCallback((e: Error) => {
349
- snackbarController.open({
350
- type: "error",
351
- message: `${t("error_after_saving")}: ${e?.message}`
352
- });
353
- console.error(e);
354
- }, [snackbarController]);
355
-
356
- function clearDirtyCache() {
357
- if (status === "new" || status === "copy") {
358
- removeEntityFromMemoryCache(path + "#new");
359
- removeEntityFromCache(path + "#new");
360
- } else {
361
- removeEntityFromMemoryCache(path + "/" + entityId);
362
- removeEntityFromCache(path + "/" + entityId);
363
- }
364
- }
365
-
366
235
  const afterSave = (updatedEntity: Entity<M>) => {
367
-
368
- clearDirtyCache();
236
+ onResetProp?.();
369
237
  onValuesModified?.(false, updatedEntity.values);
370
- if (!autoSave)
371
- snackbarController.open({
372
- type: "success",
373
- message: `${collection.singularName ?? collection.name}: ${t("saved_correctly")}`
374
- });
375
238
  onEntityChange?.(updatedEntity);
376
239
  updateStatus("existing");
377
240
  setEntityId(updatedEntity.id);
@@ -387,76 +250,6 @@ export function EntityForm<M extends Record<string, unknown>>({
387
250
  }
388
251
  };
389
252
 
390
- const afterSaveError = useCallback((e: Error) => {
391
- snackbarController.open({
392
- type: "error",
393
- title: t("error_saving_entity"),
394
- message: e?.message
395
- });
396
- console.error("Error saving entity", path, entityId, e);
397
- console.error(e);
398
- }, [entityId, path, snackbarController]);
399
-
400
- const saveEntity = ({
401
- values,
402
- previousValues,
403
- entityId,
404
- collection,
405
- path
406
- }: {
407
- collection: EntityCollection<M>,
408
- path: string,
409
- entityId: string | number | undefined,
410
- values: M,
411
- previousValues?: M,
412
- }): Promise<Entity<M>> => {
413
- return saveEntityWithCallbacks({
414
- path: path,
415
- entityId,
416
- values,
417
- previousValues,
418
- collection,
419
- status,
420
- data: dataClient,
421
- context,
422
- afterSave,
423
- afterSaveError
424
- });
425
- };
426
-
427
- type EntityFormSaveParams<M extends Record<string, unknown>> = {
428
- collection: EntityCollection<M>,
429
- path: string,
430
- entityId: string | number | undefined,
431
- values: EntityValues<M>,
432
- previousValues?: EntityValues<M>,
433
- autoSave: boolean
434
- };
435
-
436
- const onSaveEntityRequest = async ({
437
- collection,
438
- path,
439
- entityId,
440
- values,
441
- previousValues,
442
- autoSave
443
- }: EntityFormSaveParams<M>): Promise<Entity<M> | void> => {
444
- if (!status)
445
- return;
446
- if (autoSave) {
447
- setValuesToBeSaved(values);
448
- return Promise.resolve();
449
- } else {
450
- return saveEntity({
451
- collection,
452
- path,
453
- entityId,
454
- values,
455
- previousValues
456
- });
457
- }
458
- };
459
-
460
253
  const lastSavedValues = useRef<EntityValues<M> | undefined>(entity?.values);
461
254
  const save = async (values: EntityValues<M>): Promise<Entity<M> | void> => {
462
255
  const valuesToSave = status === "existing"
@@ -468,35 +261,41 @@ export function EntityForm<M extends Record<string, unknown>>({
468
261
  }
469
262
 
470
263
  lastSavedValues.current = values;
471
- return onSaveEntityRequest({
472
- collection,
473
- path,
474
- entityId,
475
- values: valuesToSave,
476
- previousValues: entity?.values,
477
- autoSave: autoSave ?? false
478
- }).then((savedEntity) => {
479
- const eventName: AnalyticsEvent = status === "new"
480
- ? "new_entity_saved"
481
- : (status === "copy" ? "entity_copied" : (status === "existing" ? "entity_edited" : "unmapped_event"));
482
- analyticsController.onAnalyticsEvent?.(eventName, { path });
483
- return savedEntity;
484
- }).catch(e => {
485
- console.error(e);
486
- setSavingError(e);
487
- });
264
+
265
+ if (!onSubmitProp) {
266
+ return;
267
+ }
268
+
269
+ const autoSaveEnabled = autoSave ?? false;
270
+
271
+ if (autoSaveEnabled) {
272
+ setValuesToBeSaved(values);
273
+ return Promise.resolve();
274
+ }
275
+
276
+ return Promise.resolve(onSubmitProp(valuesToSave as M, formex))
277
+ .then((result) => {
278
+ if (result) {
279
+ afterSave(result as Entity<M>);
280
+ }
281
+ return result as Entity<M> | void;
282
+ })
283
+ .catch(e => {
284
+ console.error(e);
285
+ setSavingError(e);
286
+ });
488
287
  };
489
288
 
490
289
  const disabled = formex.isSubmitting || Boolean(disabledProp);
491
290
 
492
291
  const formContext: FormContext<M> = {
493
-
494
292
  setFieldValue: useCallback((key: string, value: unknown) => formex.setFieldValue(key, value), []),
495
293
  values: formex.values,
496
294
  collection,
497
295
  entityId: entityId as string,
498
296
  path,
499
297
  save,
298
+ submit: formex.handleSubmit,
500
299
  formex,
501
300
  entity,
502
301
  savingError,
@@ -510,27 +309,14 @@ export function EntityForm<M extends Record<string, unknown>>({
510
309
  }, [formex.version, collection, entityId, path]);
511
310
 
512
311
  const actionsDisabled = disabled || formex.isSubmitting || (status === "existing" && !formex.dirty) || Boolean(disabledProp);
513
- const parentCollectionIds = collectionRegistryController.getParentCollectionIds(path);
514
-
515
- const formActionProps: PluginFormActionProps = {
516
- entityId,
517
- parentCollectionIds,
518
- path: path,
519
- status,
520
- collection: collection as EntityCollection,
521
- context,
522
- formContext: formContext as FormContext<Record<string, unknown>>,
523
- openEntityMode,
524
- disabled: actionsDisabled
525
- };
526
- const pluginFormActions = useSlot("form.actions", formActionProps);
527
- const pluginFormBefore = useSlot("form.before", formActionProps);
528
- const pluginFormAfter = useSlot("form.after", formActionProps);
529
312
 
530
313
  const titlePropertyKey = getEntityTitlePropertyKey(collection, customizationController.propertyConfigs);
531
- const title = (formex.values && titlePropertyKey ? getValueInPath(formex.values, titlePropertyKey) as React.ReactNode : undefined)
532
- ?? collection.singularName
533
- ?? collection.name;
314
+ const rawTitle = formex.values && titlePropertyKey ? getValueInPath(formex.values, titlePropertyKey) : undefined;
315
+ const title = rawTitle !== undefined && rawTitle !== null
316
+ ? resolveTitleToString(rawTitle)
317
+ : (collection.singularName ?? collection.name);
318
+
319
+ const modified = formex.dirty;
534
320
 
535
321
  useEffect(() => {
536
322
  if (!autoSave) {
@@ -538,25 +324,15 @@ export function EntityForm<M extends Record<string, unknown>>({
538
324
  }
539
325
  }, [formex.dirty]);
540
326
 
541
- const modified = formex.dirty;
327
+ // Default no-op unique field validator — always passes
328
+ const defaultUniqueFieldValidator: CustomFieldValidator = useCallback(async () => true, []);
542
329
 
543
- const uniqueFieldValidator: CustomFieldValidator = useCallback(async ({
544
- name,
545
- value
546
- }) => {
547
- try {
548
- const accessor = dataClient.collection(path);
549
- const { data } = await accessor.find({
550
- where: { [name]: `eq.${value}` },
551
- limit: 2
552
- });
553
- const otherEntities = entityId ? data.filter(e => e.id !== entityId) : data;
554
- return otherEntities.length === 0;
555
- } catch (e: unknown) {
556
- console.error("Error checking unique field", e);
557
- return true;
330
+ const uniqueFieldValidator: CustomFieldValidator = useMemo(() => {
331
+ if (uniqueFieldValidatorProp) {
332
+ return uniqueFieldValidatorProp as CustomFieldValidator;
558
333
  }
559
- }, [dataClient, path, entityId]);
334
+ return defaultUniqueFieldValidator;
335
+ }, [uniqueFieldValidatorProp, defaultUniqueFieldValidator]);
560
336
 
561
337
  const validationSchema = useMemo(() => getEntitySchema(
562
338
  entityId,
@@ -568,7 +344,7 @@ export function EntityForm<M extends Record<string, unknown>>({
568
344
 
569
345
  useEffect(() => {
570
346
  if (!autoSave && !formex.isSubmitting && underlyingChanges && entity) {
571
- // we update the form fields from the Firestore data
347
+ // we update the form fields from the driver data
572
348
  // if they were not touched
573
349
  Object.entries(underlyingChanges).forEach(([key, value]) => {
574
350
  const formValue = formex.values[key];
@@ -592,6 +368,9 @@ export function EntityForm<M extends Record<string, unknown>>({
592
368
  formContext={formContext}
593
369
  />;
594
370
  }
371
+ const isNewEntity = status === "new" || status === "copy";
372
+ let firstFocusableIndex = -1;
373
+
595
374
  return (
596
375
  <FormLayout>
597
376
  {formFieldKeys.map((key) => {
@@ -605,10 +384,14 @@ export function EntityForm<M extends Record<string, unknown>>({
605
384
  const isNew = status === "new" || status === "copy";
606
385
  const isStringOrNumber = property.type === "string" || property.type === "number";
607
386
  const isIdAndAuto = isStringOrNumber && "isId" in property && typeof property.isId === "string" && property.isId !== "manual";
608
- const disabled = disabledProp || (!autoSave && formex.isSubmitting) || isReadOnly(property) || Boolean(property.disabled) || (!isNew && "isId" in property && Boolean(property.isId)) || (isNew && isIdAndAuto);
387
+ const disabled = disabledProp || (!autoSave && formex.isSubmitting) || isReadOnly(property) || Boolean(property.ui?.disabled) || (!isNew && "isId" in property && Boolean(property.isId)) || (isNew && isIdAndAuto);
609
388
  const hidden = isHidden(property);
610
389
  if (hidden) return null;
611
- const widthPercentage = property.widthPercentage ?? 100;
390
+ const widthPercentage = property.ui?.widthPercentage ?? 100;
391
+
392
+ const shouldAutoFocus = isNewEntity && !disabled && firstFocusableIndex === -1;
393
+ if (shouldAutoFocus) firstFocusableIndex = 0;
394
+
612
395
  const cmsFormFieldProps: PropertyFieldBindingProps<M> = {
613
396
  propertyKey: key,
614
397
  disabled,
@@ -618,7 +401,7 @@ export function EntityForm<M extends Record<string, unknown>>({
618
401
  context: formContext,
619
402
  partOfArray: false,
620
403
  minimalistView: false,
621
- autoFocus: false
404
+ autoFocus: shouldAutoFocus
622
405
  };
623
406
 
624
407
  return (
@@ -632,16 +415,17 @@ export function EntityForm<M extends Record<string, unknown>>({
632
415
 
633
416
  const additionalField = collection.additionalFields?.find(f => f.key === key);
634
417
  if (additionalField && entity) {
635
- const Builder = additionalField.Builder;
636
- if (!Builder && !additionalField.value) {
418
+ const AdditionalFieldBuilder = additionalField.Builder;
419
+ if (!AdditionalFieldBuilder && !additionalField.value) {
637
420
  throw new Error("When using additional fields you need to provide a Builder or a value");
638
421
  }
639
- const child = Builder
640
- ? <Builder entity={entity} context={context}/>
422
+ const additionalFieldContext = formContext as unknown as AdditionalFieldDelegateProps['context'];
423
+ const child = AdditionalFieldBuilder
424
+ ? <AdditionalFieldBuilder entity={entity} context={additionalFieldContext}/>
641
425
  : <div className={"w-full"}>
642
426
  {additionalField.value?.({
643
427
  entity,
644
- context
428
+ context: additionalFieldContext
645
429
  })?.toString()}
646
430
  </div>;
647
431
 
@@ -671,9 +455,11 @@ export function EntityForm<M extends Record<string, unknown>>({
671
455
 
672
456
  const formRef = useRef<HTMLDivElement>(null);
673
457
 
458
+ const hasFormErrors = Object.keys(formex.errors).length > 0 && formex.submitCount > 0;
459
+
674
460
  const formView = <ErrorBoundary>
675
461
  <>
676
- {pluginFormBefore}
462
+ {beforeFields}
677
463
 
678
464
  {!Builder && <div className={"w-full flex flex-col items-start my-4 lg:my-6"}>
679
465
  <Typography
@@ -684,7 +470,7 @@ export function EntityForm<M extends Record<string, unknown>>({
684
470
 
685
471
  {!entity?.values && initialStatus === "existing" &&
686
472
  <Alert color={"warning"} size={"small"} outerClassName={"w-full mb-4 text-xs"}>
687
- {t("entity_does_not_exist")}
473
+ This entity does not exist yet
688
474
  </Alert>}
689
475
 
690
476
  {showEntityPath && <Alert color={"base"} outerClassName={"w-full"} size={"small"}>
@@ -698,7 +484,11 @@ export function EntityForm<M extends Record<string, unknown>>({
698
484
  {children}
699
485
 
700
486
  {initialEntityId && !entity && initialStatus !== "new" && <Alert color={"info"} size={"small"}>
701
- {t("entity_does_not_exist")}
487
+ This entity does not exist yet
488
+ </Alert>}
489
+
490
+ {hasFormErrors && <Alert color={"error"} size={"small"} outerClassName={"w-full mt-2"}>
491
+ Please fix the highlighted errors before saving.
702
492
  </Alert>}
703
493
 
704
494
  {formContext && <>
@@ -708,9 +498,31 @@ export function EntityForm<M extends Record<string, unknown>>({
708
498
  </div>
709
499
  </>}
710
500
 
711
- {pluginFormAfter}
501
+ {afterFields}
712
502
 
713
503
  {forceActionsAtTheBottom && <div className="h-16"/>}
504
+
505
+ <Dialog open={discardDialogOpen} onOpenChange={setDiscardDialogOpen} maxWidth={"sm"}>
506
+ <DialogTitle>{status === "existing" ? "Discard changes?" : "Clear form?"}</DialogTitle>
507
+ <DialogContent>
508
+ <Typography>
509
+ {status === "existing"
510
+ ? "All unsaved changes will be lost. This cannot be undone."
511
+ : "All entered values will be cleared. This cannot be undone."}
512
+ </Typography>
513
+ </DialogContent>
514
+ <DialogActions>
515
+ <Button variant={"text"} onClick={() => setDiscardDialogOpen(false)}>
516
+ Cancel
517
+ </Button>
518
+ <Button variant={"filled"} color={"error"} onClick={() => {
519
+ setDiscardDialogOpen(false);
520
+ formex.resetForm({ values: baseInitialValues as M });
521
+ }}>
522
+ {status === "existing" ? "Discard" : "Clear"}
523
+ </Button>
524
+ </DialogActions>
525
+ </Dialog>
714
526
  </>
715
527
  </ErrorBoundary>;
716
528
 
@@ -723,7 +535,7 @@ export function EntityForm<M extends Record<string, unknown>>({
723
535
  throw Error("INTERNAL: Collection and path must be defined in form context");
724
536
  }
725
537
 
726
- const EntityFormActionsRender = EntityFormActionsComponent as React.FC<any>;
538
+ const EntityFormActionsRender = EntityFormActionsComponent as React.FC<EntityFormActionsProps>;
727
539
 
728
540
  const dialogActions = <EntityFormActionsRender
729
541
  collection={collection}
@@ -731,53 +543,72 @@ export function EntityForm<M extends Record<string, unknown>>({
731
543
  entity={entity}
732
544
  layout={forceActionsAtTheBottom ? "bottom" : "responsive"}
733
545
  savingError={savingError}
734
- formex={formex}
546
+ formex={formex as FormexController<Record<string, unknown>>}
735
547
  disabled={actionsDisabled}
736
548
  status={status}
737
- pluginActions={pluginFormActions ?? []}
549
+ pluginActions={pluginActionsProp ?? []}
738
550
  openEntityMode={openEntityMode}
739
551
  showDefaultActions={showDefaultActions}
740
552
  navigateBack={navigateBack}
741
- formContext={formContext}
553
+ formContext={formContext as FormContext<Record<string, unknown>>}
742
554
  />;
743
555
 
744
556
  return (
745
557
  <Formex value={formex}>
746
558
  <form
747
559
  onSubmit={formex.handleSubmit}
748
- onReset={() => formex.resetForm({
749
- values: baseInitialValues as M
750
- })}
560
+ onReset={(e) => {
561
+ e.preventDefault();
562
+ if (formex.dirty) {
563
+ setDiscardDialogOpen(true);
564
+ } else {
565
+ formex.resetForm({ values: baseInitialValues as M });
566
+ }
567
+ }}
751
568
  noValidate
752
569
  className={cls("@container flex-1 flex flex-row w-full overflow-y-auto justify-center", className)}>
753
570
  <div
754
571
  id={`form_${path}`}
755
572
  className={cls("relative flex flex-row max-w-4xl lg:max-w-3xl xl:max-w-4xl 2xl:max-w-6xl w-full h-fit")}>
756
573
 
757
- <div className={cls("flex flex-col w-full pt-12 pb-16 px-4 sm:px-8 md:px-10")}>
574
+ <div className={cls(
575
+ "flex flex-col w-full",
576
+ openEntityMode === "dialog"
577
+ ? "pt-4 pb-12 px-6 sm:px-8"
578
+ : "pt-12 pb-16 px-4 sm:px-8 md:px-10"
579
+ )}>
758
580
  <div
759
- className={"flex flex-row gap-4 self-end sticky top-4 z-10"}>
581
+ className={"flex flex-row gap-4 justify-end h-0 overflow-visible sticky top-4 z-10"}>
760
582
 
761
- {manualApplyLocalChanges && hasLocalChanges &&
583
+ {manualApplyLocalChanges && hasLocalChanges && localChangesCacheKey &&
762
584
  <LocalChangesMenu<M>
763
- cacheKey={status === "new" || status === "copy" ? path + "#new" : path + "/" + entityId}
585
+ cacheKey={localChangesCacheKey}
764
586
  properties={collection.properties}
765
587
  cachedData={localChangesData as Partial<M>}
766
588
  formex={formex}
767
- onClearLocalChanges={() => setLocalChangesCleared(true)}
589
+ onClearLocalChanges={() => {
590
+ setLocalChangesCleared(true);
591
+ onClearLocalChanges?.();
592
+ }}
768
593
  />}
769
594
 
770
- {formex.dirty
771
- ? <Tooltip title={t("form_modified")}>
772
- <Chip size={"small"} className={"py-1"} colorScheme={"orangeDarker"}>
773
- <PencilIcon size={iconSize.smallest}/>
595
+ {isSavingAutoSave
596
+ ? <Tooltip title={"Saving…"}>
597
+ <Chip size={"small"} className={"py-1"} colorScheme={"blueDarker"}>
598
+ <LoaderIcon size={iconSize.smallest} className={"animate-spin"}/>
774
599
  </Chip>
775
600
  </Tooltip>
776
- : <Tooltip title={t("form_in_sync")}>
777
- <Chip size={"small"} className={"py-1"}>
778
- <CheckIcon size={iconSize.smallest}/>
779
- </Chip>
780
- </Tooltip>}
601
+ : formex.dirty
602
+ ? <Tooltip title={"Form has been modified"}>
603
+ <Chip size={"small"} className={"py-1"} colorScheme={"orangeDarker"}>
604
+ <PencilIcon size={iconSize.smallest}/>
605
+ </Chip>
606
+ </Tooltip>
607
+ : <Tooltip title={"Form is in sync"}>
608
+ <Chip size={"small"} className={"py-1"}>
609
+ <CheckIcon size={iconSize.smallest}/>
610
+ </Chip>
611
+ </Tooltip>}
781
612
  </div>
782
613
 
783
614
  {formView}
@@ -794,57 +625,7 @@ export function EntityForm<M extends Record<string, unknown>>({
794
625
  );
795
626
  }
796
627
 
797
- export function getInitialEntityValues<M extends Record<string, unknown>>(
798
- authController: AuthController,
799
- collection: EntityCollection,
800
- path: string,
801
- status: "new" | "existing" | "copy",
802
- entity: Entity<M> | undefined,
803
- propertyConfigs?: Record<string, PropertyConfig>
804
- ): Partial<EntityValues<M>> {
805
- const properties = collection.properties;
806
- if ((status === "existing" || status === "copy") && entity) {
807
- let values: Partial<EntityValues<M>>;
808
- if (!collection.alwaysApplyDefaultValues) {
809
- values = entity.values ?? getDefaultValuesFor(properties);
810
- } else {
811
- const defaultValues = getDefaultValuesFor(properties);
812
- values = mergeDeep(defaultValues, entity.values ?? {});
813
- }
814
- // When copying, clear ID fields so the database generates new IDs
815
- if (status === "copy") {
816
- const result = { ...values };
817
- for (const [key, property] of Object.entries(properties)) {
818
- if (property && "isId" in property && property.isId) {
819
- delete (result as Record<string, unknown>)[key];
820
- }
821
- }
822
- return result;
823
- }
824
- return values;
825
- } else if (status === "new") {
826
- return getDefaultValuesFor(properties);
827
- } else {
828
- console.error({
829
- status,
830
- entity
831
- });
832
- throw new Error("Form has not been initialised with the correct parameters");
833
- }
834
- }
835
-
836
- export function zodToFormErrors(zodError: z.ZodError): Record<string, any> {
837
- let errors: Record<string, any> = {};
838
- for (const issue of zodError.issues) {
839
- const path = issue.path.join(".");
840
- if (path && !getIn(errors, path)) {
841
- errors = setIn(errors, path, issue.message);
842
- }
843
- }
844
- return errors;
845
- }
846
-
847
- function useOnAutoSave(autoSave: undefined | boolean, formex: FormexController<any>, lastSavedValues: any, save: (values: EntityValues<any>) => Promise<Entity<any> | void>) {
628
+ function useOnAutoSave<M extends Record<string, unknown>>(autoSave: undefined | boolean, formex: FormexController<M>, lastSavedValues: React.MutableRefObject<EntityValues<M> | undefined>, save: (values: EntityValues<M>) => Promise<Entity<M> | void>) {
848
629
  useEffect(() => {
849
630
  if (!autoSave) return;
850
631
  if (formex.values && !equal(formex.values, lastSavedValues.current)) {
@@ -852,4 +633,3 @@ function useOnAutoSave(autoSave: undefined | boolean, formex: FormexController<a
852
633
  }
853
634
  }, [autoSave, formex.values]);
854
635
  }
855
-