@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.
- package/LICENSE +21 -6
- package/README.md +139 -0
- package/dist/CollectionEditorDialog-DKGlYDPc.js +3630 -0
- package/dist/CollectionEditorDialog-DKGlYDPc.js.map +1 -0
- package/dist/PropertyEditView-h0N-AMCY.js +3808 -0
- package/dist/PropertyEditView-h0N-AMCY.js.map +1 -0
- package/dist/RouterCollectionsStudioView-DdEStpFk.js +192 -0
- package/dist/RouterCollectionsStudioView-DdEStpFk.js.map +1 -0
- package/dist/collection_editor/ConfigControllerProvider.d.ts +2 -11
- package/dist/collection_editor/_cms_internals.d.ts +4 -4
- package/dist/collection_editor/api/generateCollectionApi.d.ts +10 -9
- package/dist/collection_editor/extensibility_types.d.ts +135 -0
- package/dist/collection_editor/index.d.ts +6 -1
- package/dist/collection_editor/pgColumnToProperty.d.ts +3 -3
- package/dist/collection_editor/serializable_types.d.ts +370 -0
- package/dist/collection_editor/serializable_utils.d.ts +50 -0
- package/dist/collection_editor/types/collection_editor_controller.d.ts +11 -10
- package/dist/collection_editor/types/collection_inference.d.ts +2 -2
- package/dist/collection_editor/types/config_controller.d.ts +21 -14
- package/dist/collection_editor/ui/AddKanbanColumnAction.d.ts +7 -5
- package/dist/collection_editor/ui/CollectionViewHeaderAction.d.ts +7 -5
- package/dist/collection_editor/ui/EditorCollectionAction.d.ts +1 -1
- package/dist/collection_editor/ui/EditorCollectionActionStart.d.ts +1 -1
- package/dist/collection_editor/ui/EditorEntityAction.d.ts +1 -1
- package/dist/collection_editor/ui/HomePageEditorCollectionAction.d.ts +1 -1
- package/dist/collection_editor/ui/KanbanSetupAction.d.ts +7 -5
- package/dist/collection_editor/ui/MissingReferenceWidget.d.ts +1 -1
- package/dist/collection_editor/ui/NewCollectionButton.d.ts +1 -1
- package/dist/collection_editor/ui/NewCollectionCard.d.ts +1 -1
- package/dist/collection_editor/ui/PropertyAddColumnComponent.d.ts +6 -5
- package/dist/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.d.ts +4 -4
- package/dist/collection_editor/ui/collection_editor/AIModifiedPathsContext.d.ts +1 -1
- package/dist/collection_editor/ui/collection_editor/CollectionDetailsForm.d.ts +7 -7
- package/dist/collection_editor/ui/collection_editor/CollectionEditorDialog.d.ts +10 -11
- package/dist/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.d.ts +4 -4
- package/dist/collection_editor/ui/collection_editor/CollectionJsonImportDialog.d.ts +4 -3
- package/dist/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.d.ts +17 -7
- package/dist/collection_editor/ui/collection_editor/CollectionRLSTab.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/CollectionRelationsTab.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/CollectionStudioView.d.ts +14 -1
- package/dist/collection_editor/ui/collection_editor/CollectionYupValidation.d.ts +1 -9
- package/dist/collection_editor/ui/collection_editor/CollectionsStudioView.d.ts +25 -2
- package/dist/collection_editor/ui/collection_editor/DisplaySettingsForm.d.ts +4 -2
- package/dist/collection_editor/ui/collection_editor/EntityActionsEditTab.d.ts +4 -3
- package/dist/collection_editor/ui/collection_editor/EntityActionsSelectDialog.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/EntityCustomViewsSelectDialog.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/EnumForm.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/GeneralSettingsForm.d.ts +8 -4
- package/dist/collection_editor/ui/collection_editor/GetCodeDialog.d.ts +4 -3
- package/dist/collection_editor/ui/collection_editor/KanbanConfigSection.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/LayoutModeSwitch.d.ts +3 -3
- package/dist/collection_editor/ui/collection_editor/PropertyEditView.d.ts +17 -5
- package/dist/collection_editor/ui/collection_editor/PropertyFieldPreview.d.ts +2 -2
- package/dist/collection_editor/ui/collection_editor/PropertyTree.d.ts +2 -2
- package/dist/collection_editor/ui/collection_editor/RouterCollectionStudioView.d.ts +15 -0
- package/dist/collection_editor/ui/collection_editor/RouterCollectionsStudioView.d.ts +14 -0
- package/dist/collection_editor/ui/collection_editor/SubcollectionsEditTab.d.ts +8 -6
- package/dist/collection_editor/ui/collection_editor/SwitchControl.d.ts +3 -2
- package/dist/collection_editor/ui/collection_editor/ViewModeSwitch.d.ts +1 -1
- package/dist/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.d.ts +1 -1
- package/dist/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.d.ts +3 -2
- package/dist/collection_editor/ui/collection_editor/properties/BlockPropertyField.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/BooleanPropertyField.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/DateTimePropertyField.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/EnumPropertyField.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/KeyValuePropertyField.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/MapPropertyField.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/NumberPropertyField.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/ReferencePropertyField.d.ts +3 -2
- package/dist/collection_editor/ui/collection_editor/properties/RelationPropertyField.d.ts +3 -8
- package/dist/collection_editor/ui/collection_editor/properties/RepeatPropertyField.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/StoragePropertyField.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/StringPropertyField.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/UrlPropertyField.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/VectorPropertyField.d.ts +4 -0
- package/dist/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/conditions/ConditionsPanel.d.ts +1 -1
- package/dist/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/validation/ValidationPanel.d.ts +1 -1
- package/dist/collection_editor/ui/collection_editor/templates/blog_template.d.ts +2 -2
- package/dist/collection_editor/ui/collection_editor/templates/pages_template.d.ts +2 -2
- package/dist/collection_editor/ui/collection_editor/templates/products_template.d.ts +2 -2
- package/dist/collection_editor/ui/collection_editor/templates/users_template.d.ts +2 -2
- package/dist/collection_editor/useJsonCollectionsConfigController.d.ts +37 -0
- package/dist/collection_editor/useLocalCollectionsConfigController.d.ts +2 -2
- package/dist/collection_editor/useSafeSnackbarController.d.ts +2 -0
- package/dist/collection_editor/validateCollectionJson.d.ts +2 -2
- package/dist/collection_editor_ui.d.ts +4 -0
- package/dist/collection_editor_ui.js +33 -11
- package/dist/collection_editor_ui.js.map +1 -1
- package/dist/components/ArrayContainer.d.ts +5 -5
- package/dist/components/ClearFilterSortButton.d.ts +1 -1
- package/dist/components/CollectionEditorDialogs.d.ts +2 -1
- package/dist/components/CollectionPanel.d.ts +58 -0
- package/dist/components/{EntityCollectionTable/EntityCollectionRowActions.d.ts → CollectionTableBinding/CollectionRowActions.d.ts} +5 -5
- package/dist/components/CollectionTableBinding/CollectionTableBinding.d.ts +28 -0
- package/dist/components/{EntityCollectionTable/EntityCollectionTableProps.d.ts → CollectionTableBinding/CollectionTableBindingProps.d.ts} +4 -4
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/column_utils.d.ts +2 -2
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableMultipleRelationField.d.ts +6 -6
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableReferenceField.d.ts +6 -6
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationField.d.ts +6 -6
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationSelectorField.d.ts +3 -2
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableStorageUpload.d.ts +4 -4
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableSelect.d.ts +1 -1
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableUserSelect.d.ts +1 -1
- package/dist/components/CollectionTableBinding/index.d.ts +6 -0
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/CollectionTableToolbar.d.ts +5 -1
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCell.d.ts +3 -3
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCellActions.d.ts +1 -1
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/common.d.ts +2 -2
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/PopupFormField.d.ts +7 -6
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/table_bindings.d.ts +4 -3
- package/dist/components/CollectionViewBinding/BoardCardBinding.d.ts +31 -0
- package/dist/components/CollectionViewBinding/CollectionBoardViewBinding.d.ts +22 -0
- package/dist/components/{EntityCollectionView/EntityCollectionCardView.d.ts → CollectionViewBinding/CollectionCardViewBinding.d.ts} +5 -5
- package/dist/components/CollectionViewBinding/CollectionListViewBinding.d.ts +50 -0
- package/dist/components/CollectionViewBinding/CollectionViewActions.d.ts +20 -0
- package/dist/components/CollectionViewBinding/CollectionViewBinding.d.ts +41 -0
- package/dist/components/CollectionViewBinding/CollectionViewStartActions.d.ts +21 -0
- package/dist/components/CollectionViewBinding/EntityCardBinding.d.ts +21 -0
- package/dist/components/CollectionViewBinding/FilterPresetsButton.d.ts +22 -0
- package/dist/components/{EntityCollectionView → CollectionViewBinding}/FiltersDialog.d.ts +3 -2
- package/dist/components/{EntityCollectionView → CollectionViewBinding}/SplitListView.d.ts +6 -5
- package/dist/components/{EntityCollectionView → CollectionViewBinding}/ViewModeToggle.d.ts +2 -1
- package/dist/components/{EntityCollectionView → CollectionViewBinding}/hooks/useCollectionInlineEditor.d.ts +3 -3
- package/dist/components/{EntityCollectionView → CollectionViewBinding}/hooks/useKanbanDragAndDrop.d.ts +7 -6
- package/dist/components/{EntityCollectionView → CollectionViewBinding}/useBoardDataController.d.ts +2 -2
- package/dist/components/{EntityCollectionView/useEntityPreviewSlots.d.ts → CollectionViewBinding/usePreviewSlots.d.ts} +5 -5
- package/dist/components/DefaultAppBar.d.ts +18 -1
- package/dist/components/DefaultDrawer.d.ts +53 -5
- package/dist/components/DeleteEntityDialog.d.ts +6 -5
- package/dist/components/DetailViewBinding.d.ts +28 -0
- package/dist/components/DrawerNavigationGroup.d.ts +1 -1
- package/dist/components/DrawerNavigationItem.d.ts +1 -1
- package/dist/components/EditFormActions.d.ts +3 -0
- package/dist/components/EditViewBinding.d.ts +58 -0
- package/dist/components/{EntityPreview.d.ts → EntityPreviewBinding.d.ts} +14 -14
- package/dist/components/EntityViewBinding.d.ts +13 -0
- package/dist/components/FieldCaption.d.ts +1 -1
- package/dist/components/HomePage/ContentHomePage.d.ts +1 -1
- package/dist/components/HomePage/FavouritesView.d.ts +1 -1
- package/dist/components/HomePage/HomePageDnD.d.ts +7 -7
- package/dist/components/HomePage/NavigationCard.d.ts +1 -1
- package/dist/components/HomePage/NavigationCardBinding.d.ts +2 -1
- package/dist/components/HomePage/NavigationGroup.d.ts +2 -2
- package/dist/components/HomePage/RenameGroupDialog.d.ts +2 -1
- package/dist/components/HomePage/SmallNavigationCard.d.ts +1 -1
- package/dist/components/JsonPreviewBinding.d.ts +4 -0
- package/dist/components/PropertyCollectionView.d.ts +3 -2
- package/dist/components/PropertyIdCopyTooltip.d.ts +3 -3
- package/dist/components/{RebaseCMS.d.ts → RebaseAdmin.d.ts} +2 -2
- package/dist/components/RebaseAuthGate.d.ts +1 -1
- package/dist/components/RebaseLayout.d.ts +6 -5
- package/dist/components/RebaseNavigation.d.ts +2 -2
- package/dist/components/RebaseRouteDefs.d.ts +2 -2
- package/dist/components/RebaseShell.d.ts +2 -1
- package/dist/components/ReferenceTable/{EntitySelectionTable.d.ts → SelectionTableBinding.d.ts} +6 -6
- package/dist/components/ReferenceWidget.d.ts +3 -2
- package/dist/components/RelationSelector.d.ts +1 -1
- package/dist/components/SearchIconsView.d.ts +2 -1
- package/dist/components/SelectableTable/SelectableTable.d.ts +11 -11
- package/dist/components/SelectableTable/SelectableTableContext.d.ts +3 -3
- package/dist/components/SelectableTable/SelectionStore.d.ts +16 -22
- package/dist/components/SelectableTable/filters/BooleanFilterField.d.ts +9 -3
- package/dist/components/SelectableTable/filters/DateTimeFilterField.d.ts +10 -3
- package/dist/components/SelectableTable/filters/FilterFieldBinding.d.ts +40 -0
- package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +10 -3
- package/dist/components/SelectableTable/filters/RelationFilterField.d.ts +8 -1
- package/dist/components/SelectableTable/filters/StringNumberFilterField.d.ts +10 -3
- package/dist/components/SideDialogs.d.ts +2 -2
- package/dist/components/SidePanelBinding.d.ts +11 -0
- package/dist/components/{SideEntityProvider.d.ts → SidePanelProvider.d.ts} +8 -8
- package/dist/components/admin/CreationResultDialog.d.ts +6 -0
- package/dist/components/admin/index.d.ts +1 -3
- package/dist/components/app/AppBar.d.ts +1 -1
- package/dist/components/app/Drawer.d.ts +9 -2
- package/dist/components/common/default_entity_actions.d.ts +8 -1
- package/dist/components/field_configs.d.ts +1 -1
- package/dist/components/history/EntityHistoryEntry.d.ts +3 -3
- package/dist/components/history/EntityHistoryView.d.ts +1 -1
- package/dist/components/history/LastEditedByFormAction.d.ts +2 -1
- package/dist/components/history/LastEditedByIndicator.d.ts +4 -3
- package/dist/components/history/UserChip.d.ts +1 -1
- package/dist/components/index.d.ts +16 -13
- package/dist/contexts/SidePanelControllerContext.d.ts +3 -0
- package/dist/data_export/export/BasicExportAction.d.ts +2 -1
- package/dist/data_export/export/ExportCollectionAction.d.ts +4 -4
- package/dist/data_export/export/export.d.ts +3 -3
- package/dist/data_import/components/DataNewPropertiesMapping.d.ts +1 -1
- package/dist/data_import/components/ImportFileUpload.d.ts +1 -1
- package/dist/data_import/components/ImportNewPropertyFieldPreview.d.ts +2 -1
- package/dist/data_import/components/ImportSaveInProgress.d.ts +3 -3
- package/dist/data_import/import/ImportCollectionAction.d.ts +4 -3
- package/dist/data_import/utils/data.d.ts +1 -1
- package/dist/data_import/utils/file_headers.d.ts +6 -1
- package/dist/data_import/utils/file_to_json.d.ts +1 -11
- package/dist/data_import/utils/transforms.d.ts +11 -0
- package/dist/editor/components/SlashCommandMenu.d.ts +2 -1
- package/dist/editor/components/editor-bubble.d.ts +5 -1
- package/dist/editor/components/image-bubble.d.ts +5 -1
- package/dist/editor/components/index.d.ts +3 -3
- package/dist/editor/components/table-bubble.d.ts +5 -1
- package/dist/editor/editor.d.ts +4 -4
- package/dist/editor/nodeViews/ReactNodeView.d.ts +4 -1
- package/dist/editor/selectors/color-selector.d.ts +1 -1
- package/dist/editor/selectors/link-selector.d.ts +1 -1
- package/dist/editor/selectors/node-selector.d.ts +1 -1
- package/dist/editor/selectors/text-buttons.d.ts +1 -1
- package/dist/editor/useProseMirror.d.ts +2 -2
- package/dist/editor/utils/remove_classes.d.ts +1 -1
- package/dist/editor.js +2625 -3569
- package/dist/editor.js.map +1 -1
- package/dist/form/EntityForm.d.ts +11 -9
- package/dist/form/EntityFormActions.d.ts +2 -1
- package/dist/form/EntityFormBinding.d.ts +27 -0
- package/dist/form/PropertyFieldBinding.d.ts +1 -1
- package/dist/form/components/FieldHelperText.d.ts +1 -1
- package/dist/form/components/FormEntry.d.ts +1 -1
- package/dist/form/components/FormLayout.d.ts +1 -1
- package/dist/form/components/LabelWithIconAndTooltip.d.ts +1 -1
- package/dist/form/components/LocalChangesMenu.d.ts +3 -2
- package/dist/form/components/StorageItemPreview.d.ts +2 -1
- package/dist/form/components/StorageUploadProgress.d.ts +10 -4
- package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/BlockFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/DateTimeFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/MapFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +4 -3
- package/dist/form/field_bindings/MultiSelectFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/MultipleRelationFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/RelationFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/RepeatFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/SelectFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +5 -4
- package/dist/form/field_bindings/SwitchFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/TextFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/UserSelectFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/VectorFieldBinding.d.ts +12 -0
- package/dist/form/form_utils.d.ts +8 -0
- package/dist/form/index.d.ts +6 -2
- package/dist/form/validation.d.ts +3 -3
- package/dist/history-C0FdqGNz.js +311 -0
- package/dist/history-C0FdqGNz.js.map +1 -0
- package/dist/hooks/index.d.ts +4 -4
- package/dist/hooks/navigation/contexts/CollectionRegistryContext.d.ts +2 -2
- package/dist/hooks/navigation/useAsyncResolver.d.ts +26 -0
- package/dist/hooks/navigation/useBuildCollectionRegistryController.d.ts +2 -0
- package/dist/hooks/navigation/useBuildNavigationStateController.d.ts +6 -8
- package/dist/hooks/navigation/useNavigationResolution.d.ts +6 -7
- package/dist/hooks/navigation/useResolvedCollections.d.ts +11 -7
- package/dist/hooks/navigation/useResolvedViews.d.ts +2 -5
- package/dist/hooks/navigation/useTopLevelNavigation.d.ts +3 -3
- package/dist/hooks/navigation/utils.d.ts +5 -5
- package/dist/hooks/useBreadcrumbsController.d.ts +2 -32
- package/dist/hooks/useBuildSidePanel.d.ts +6 -0
- package/dist/hooks/useCMSContext.d.ts +2 -2
- package/dist/hooks/{useEntityHistory.d.ts → useHistory.d.ts} +2 -2
- package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
- package/dist/hooks/{useEntitySelectionDialog.d.ts → useSelectionDialog.d.ts} +2 -2
- package/dist/hooks/useSideDialogsController.d.ts +1 -1
- package/dist/hooks/useSidePanel.d.ts +11 -0
- package/dist/index.d.ts +6 -3
- package/dist/index.js +2 -799
- package/dist/markdown-CklalUUk.js +526 -0
- package/dist/markdown-CklalUUk.js.map +1 -0
- package/dist/preview/components/ArrayEnumPreview.d.ts +2 -1
- package/dist/preview/components/EmptyValue.d.ts +2 -1
- package/dist/preview/components/EnumValuesChip.d.ts +1 -1
- package/dist/preview/components/ImagePreview.d.ts +2 -1
- package/dist/preview/components/ReferencePreview.d.ts +2 -1
- package/dist/preview/components/RelationPreview.d.ts +2 -1
- package/dist/preview/components/StorageThumbnail.d.ts +3 -1
- package/dist/preview/components/UrlComponentPreview.d.ts +1 -0
- package/dist/preview/components/UserPreview.d.ts +6 -3
- package/dist/preview/property_previews/ArrayOfMapsPreview.d.ts +2 -1
- package/dist/preview/property_previews/ArrayOfReferencesPreview.d.ts +1 -1
- package/dist/preview/property_previews/ArrayOfRelationsPreview.d.ts +1 -1
- package/dist/preview/property_previews/ArrayOfStorageComponentsPreview.d.ts +2 -1
- package/dist/preview/property_previews/ArrayOfStringsPreview.d.ts +2 -1
- package/dist/preview/property_previews/ArrayOneOfPreview.d.ts +2 -1
- package/dist/preview/property_previews/ArrayPropertyEnumPreview.d.ts +1 -1
- package/dist/preview/property_previews/ArrayPropertyPreview.d.ts +2 -1
- package/dist/preview/property_previews/MapPropertyPreview.d.ts +3 -2
- package/dist/preview/property_previews/SkeletonPropertyComponent.d.ts +5 -4
- package/dist/rolldown-runtime-D7D4PA-g.js +13 -0
- package/dist/routes/CustomViewRoute.d.ts +2 -1
- package/dist/routes/RebaseRoute.d.ts +1 -1
- package/dist/src-DLAFyeZI.js +24222 -0
- package/dist/src-DLAFyeZI.js.map +1 -0
- package/dist/types/components/EntityFormActionsProps.d.ts +4 -4
- package/dist/types/components/EntityFormProps.d.ts +65 -5
- package/dist/types/components/PropertyPreviewProps.d.ts +6 -1
- package/dist/types/components/formex.d.ts +1 -40
- package/dist/types/fields.d.ts +23 -12
- package/dist/util/dataControllerAdapter.d.ts +27 -0
- package/dist/util/navigation_utils.d.ts +16 -6
- package/dist/util/previews.d.ts +8 -3
- package/dist/util/propertyConfigMapper.d.ts +17 -0
- package/dist/util/property_utils.d.ts +3 -3
- package/dist/util/resolutions.d.ts +1 -2
- package/dist/util/view_constants.d.ts +6 -0
- package/package.json +56 -55
- package/src/collection_editor/ConfigControllerProvider.tsx +37 -53
- package/src/collection_editor/_cms_internals.ts +4 -4
- package/src/collection_editor/api/generateCollectionApi.ts +10 -9
- package/src/collection_editor/extensibility_types.ts +168 -0
- package/src/collection_editor/index.ts +47 -3
- package/src/collection_editor/pgColumnToProperty.ts +23 -6
- package/src/collection_editor/serializable_types.ts +474 -0
- package/src/collection_editor/serializable_utils.ts +576 -0
- package/src/collection_editor/types/collection_editor_controller.tsx +8 -11
- package/src/collection_editor/types/collection_inference.ts +2 -2
- package/src/collection_editor/types/config_controller.tsx +14 -14
- package/src/collection_editor/ui/AddKanbanColumnAction.tsx +21 -9
- package/src/collection_editor/ui/CollectionViewHeaderAction.tsx +8 -8
- package/src/collection_editor/ui/EditorCollectionAction.tsx +9 -14
- package/src/collection_editor/ui/EditorCollectionActionStart.tsx +13 -18
- package/src/collection_editor/ui/EditorEntityAction.tsx +9 -14
- package/src/collection_editor/ui/HomePageEditorCollectionAction.tsx +13 -19
- package/src/collection_editor/ui/KanbanSetupAction.tsx +8 -6
- package/src/collection_editor/ui/MissingReferenceWidget.tsx +5 -3
- package/src/collection_editor/ui/NewCollectionButton.tsx +4 -4
- package/src/collection_editor/ui/NewCollectionCard.tsx +8 -13
- package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +11 -16
- package/src/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.tsx +20 -12
- package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +29 -59
- package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +213 -135
- package/src/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.tsx +21 -7
- package/src/collection_editor/ui/collection_editor/CollectionJsonImportDialog.tsx +29 -23
- package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +142 -112
- package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +49 -12
- package/src/collection_editor/ui/collection_editor/CollectionRelationsTab.tsx +29 -10
- package/src/collection_editor/ui/collection_editor/CollectionStudioView.tsx +26 -23
- package/src/collection_editor/ui/collection_editor/CollectionsStudioView.tsx +104 -37
- package/src/collection_editor/ui/collection_editor/DisplaySettingsForm.tsx +26 -14
- package/src/collection_editor/ui/collection_editor/EntityActionsEditTab.tsx +21 -8
- package/src/collection_editor/ui/collection_editor/EntityActionsSelectDialog.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/EntityCustomViewsSelectDialog.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/EnumForm.tsx +20 -5
- package/src/collection_editor/ui/collection_editor/GeneralSettingsForm.tsx +45 -12
- package/src/collection_editor/ui/collection_editor/GetCodeDialog.tsx +10 -12
- package/src/collection_editor/ui/collection_editor/KanbanConfigSection.tsx +5 -6
- package/src/collection_editor/ui/collection_editor/LayoutModeSwitch.tsx +17 -5
- package/src/collection_editor/ui/collection_editor/PropertyEditView.tsx +190 -27
- package/src/collection_editor/ui/collection_editor/PropertyFieldPreview.tsx +58 -49
- package/src/collection_editor/ui/collection_editor/PropertyTree.tsx +17 -4
- package/src/collection_editor/ui/collection_editor/RouterCollectionStudioView.tsx +44 -0
- package/src/collection_editor/ui/collection_editor/RouterCollectionsStudioView.tsx +41 -0
- package/src/collection_editor/ui/collection_editor/SubcollectionsEditTab.tsx +27 -13
- package/src/collection_editor/ui/collection_editor/SwitchControl.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/ViewModeSwitch.tsx +9 -2
- package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.tsx +4 -4
- package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.tsx +4 -4
- package/src/collection_editor/ui/collection_editor/properties/BlockPropertyField.tsx +5 -6
- package/src/collection_editor/ui/collection_editor/properties/BooleanPropertyField.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/CommonPropertyFields.tsx +5 -5
- package/src/collection_editor/ui/collection_editor/properties/DateTimePropertyField.tsx +10 -10
- package/src/collection_editor/ui/collection_editor/properties/EnumPropertyField.tsx +10 -9
- package/src/collection_editor/ui/collection_editor/properties/MapPropertyField.tsx +7 -8
- package/src/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.tsx +17 -10
- package/src/collection_editor/ui/collection_editor/properties/NumberPropertyField.tsx +7 -7
- package/src/collection_editor/ui/collection_editor/properties/ReferencePropertyField.tsx +19 -53
- package/src/collection_editor/ui/collection_editor/properties/RelationPropertyField.tsx +43 -60
- package/src/collection_editor/ui/collection_editor/properties/RepeatPropertyField.tsx +3 -3
- package/src/collection_editor/ui/collection_editor/properties/StoragePropertyField.tsx +56 -13
- package/src/collection_editor/ui/collection_editor/properties/StringPropertyField.tsx +7 -7
- package/src/collection_editor/ui/collection_editor/properties/UrlPropertyField.tsx +4 -3
- package/src/collection_editor/ui/collection_editor/properties/VectorPropertyField.tsx +34 -0
- package/src/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx +5 -6
- package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.tsx +18 -9
- package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsPanel.tsx +1 -2
- package/src/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.tsx +17 -5
- package/src/collection_editor/ui/collection_editor/properties/conditions/property_paths.ts +1 -1
- package/src/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx +4 -4
- package/src/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx +3 -3
- package/src/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx +6 -9
- package/src/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.tsx +6 -6
- package/src/collection_editor/ui/collection_editor/properties/validation/ValidationPanel.tsx +1 -2
- package/src/collection_editor/ui/collection_editor/templates/blog_template.ts +3 -3
- package/src/collection_editor/ui/collection_editor/templates/pages_template.ts +3 -3
- package/src/collection_editor/ui/collection_editor/templates/products_template.ts +4 -4
- package/src/collection_editor/ui/collection_editor/templates/users_template.ts +2 -2
- package/src/collection_editor/ui/collection_editor/utils/supported_fields.tsx +0 -1
- package/src/collection_editor/ui/collection_editor/utils/update_property_for_widget.ts +7 -29
- package/src/collection_editor/useJsonCollectionsConfigController.tsx +286 -0
- package/src/collection_editor/useLocalCollectionsConfigController.tsx +11 -8
- package/src/collection_editor/useSafeSnackbarController.ts +9 -0
- package/src/collection_editor/validateCollectionJson.ts +111 -24
- package/src/collection_editor_ui.ts +6 -0
- package/src/components/AdminModeSyncer.tsx +2 -2
- package/src/components/ArrayContainer.tsx +28 -24
- package/src/components/ClearFilterSortButton.tsx +2 -3
- package/src/components/CollectionEditorDialogs.tsx +1 -1
- package/src/components/CollectionPanel.tsx +178 -0
- package/src/components/{EntityCollectionTable/EntityCollectionRowActions.tsx → CollectionTableBinding/CollectionRowActions.tsx} +26 -16
- package/src/components/{EntityCollectionTable/EntityCollectionTable.tsx → CollectionTableBinding/CollectionTableBinding.tsx} +34 -31
- package/src/components/{EntityCollectionTable/EntityCollectionTableProps.tsx → CollectionTableBinding/CollectionTableBindingProps.tsx} +4 -4
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/PropertyTableCell.tsx +14 -12
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/column_utils.tsx +4 -4
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableMultipleRelationField.tsx +13 -13
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableReferenceField.tsx +39 -19
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationField.tsx +14 -14
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationSelectorField.tsx +3 -3
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableStorageUpload.tsx +29 -27
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableSelect.tsx +0 -1
- package/src/components/CollectionTableBinding/index.tsx +14 -0
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/CollectionTableToolbar.tsx +22 -28
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCell.tsx +8 -9
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCellActions.tsx +2 -3
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/common.tsx +7 -7
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/PopupFormField.tsx +12 -13
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useDraggable.tsx +5 -2
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/table_bindings.tsx +101 -104
- package/src/components/{EntityCollectionView/EntityBoardCard.tsx → CollectionViewBinding/BoardCardBinding.tsx} +39 -40
- package/src/components/{EntityCollectionView/EntityCollectionBoardView.tsx → CollectionViewBinding/CollectionBoardViewBinding.tsx} +88 -52
- package/src/components/CollectionViewBinding/CollectionCardViewBinding.tsx +157 -0
- package/src/components/{EntityCollectionView/EntityCollectionListView.tsx → CollectionViewBinding/CollectionListViewBinding.tsx} +234 -151
- package/src/components/{EntityCollectionView/EntityCollectionViewActions.tsx → CollectionViewBinding/CollectionViewActions.tsx} +36 -26
- package/src/components/{EntityCollectionView/EntityCollectionView.tsx → CollectionViewBinding/CollectionViewBinding.tsx} +392 -213
- package/src/components/{EntityCollectionView/EntityCollectionViewStartActions.tsx → CollectionViewBinding/CollectionViewStartActions.tsx} +42 -23
- package/src/components/{EntityCollectionView/EntityCard.tsx → CollectionViewBinding/EntityCardBinding.tsx} +14 -14
- package/src/components/CollectionViewBinding/FilterPresetsButton.tsx +294 -0
- package/src/components/{EntityCollectionView → CollectionViewBinding}/FiltersDialog.tsx +37 -79
- package/src/components/{EntityCollectionView → CollectionViewBinding}/SplitListView.tsx +97 -30
- package/src/components/{EntityCollectionView → CollectionViewBinding}/ViewModeToggle.tsx +20 -8
- package/src/components/{EntityCollectionView → CollectionViewBinding}/hooks/useCollectionInlineEditor.ts +9 -8
- package/src/components/{EntityCollectionView → CollectionViewBinding}/hooks/useKanbanDragAndDrop.ts +17 -16
- package/src/components/{EntityCollectionView → CollectionViewBinding}/useBoardDataController.tsx +118 -70
- package/src/components/{EntityCollectionView/useEntityPreviewSlots.ts → CollectionViewBinding/usePreviewSlots.ts} +136 -48
- package/src/components/DefaultAppBar.tsx +73 -41
- package/src/components/DefaultDrawer.tsx +317 -85
- package/src/components/DeleteEntityDialog.tsx +7 -7
- package/src/components/DetailViewBinding.tsx +670 -0
- package/src/components/DrawerNavigationGroup.tsx +11 -11
- package/src/components/DrawerNavigationItem.tsx +6 -6
- package/src/components/{EntityEditViewFormActions.tsx → EditFormActions.tsx} +78 -59
- package/src/components/EditViewBinding.tsx +761 -0
- package/src/components/{EntityPreview.tsx → EntityPreviewBinding.tsx} +53 -39
- package/src/components/{EntityView.tsx → EntityViewBinding.tsx} +8 -9
- package/src/components/HomePage/ContentHomePage.tsx +35 -17
- package/src/components/HomePage/FavouritesView.tsx +2 -3
- package/src/components/HomePage/HomePageDnD.tsx +3 -2
- package/src/components/HomePage/NavigationCard.tsx +9 -16
- package/src/components/HomePage/NavigationCardBinding.tsx +6 -7
- package/src/components/HomePage/NavigationGroup.tsx +4 -5
- package/src/components/HomePage/RenameGroupDialog.tsx +1 -1
- package/src/components/HomePage/SmallNavigationCard.tsx +0 -5
- package/src/components/{EntityJsonPreview.tsx → JsonPreviewBinding.tsx} +2 -2
- package/src/components/PropertyCollectionView.tsx +2 -1
- package/src/components/PropertyIdCopyTooltip.tsx +2 -3
- package/src/components/{RebaseCMS.tsx → RebaseAdmin.tsx} +8 -6
- package/src/components/RebaseAuthGate.tsx +5 -3
- package/src/components/RebaseLayout.tsx +10 -9
- package/src/components/RebaseNavigation.tsx +107 -31
- package/src/components/RebaseRouteDefs.tsx +10 -13
- package/src/components/RebaseShell.tsx +18 -14
- package/src/components/ReferenceTable/{EntitySelectionTable.tsx → SelectionTableBinding.tsx} +40 -33
- package/src/components/ReferenceWidget.tsx +7 -7
- package/src/components/RelationSelector.tsx +82 -24
- package/src/components/SearchIconsView.tsx +13 -12
- package/src/components/SelectableTable/SelectableTable.tsx +68 -115
- package/src/components/SelectableTable/SelectableTableContext.tsx +4 -3
- package/src/components/SelectableTable/SelectionStore.ts +20 -44
- package/src/components/SelectableTable/filters/BooleanFilterField.tsx +13 -5
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +37 -16
- package/src/components/SelectableTable/filters/FilterFieldBinding.tsx +187 -0
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +27 -13
- package/src/components/SelectableTable/filters/RelationFilterField.tsx +17 -3
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +95 -35
- package/src/components/SideDialogs.tsx +58 -40
- package/src/components/SidePanelBinding.tsx +261 -0
- package/src/components/{SideEntityProvider.tsx → SidePanelProvider.tsx} +17 -16
- package/src/components/UserSelector.tsx +123 -9
- package/src/components/admin/CreationResultDialog.tsx +138 -0
- package/src/components/admin/index.ts +1 -3
- package/src/components/app/Drawer.tsx +9 -1
- package/src/components/app/Scaffold.tsx +16 -9
- package/src/components/common/default_entity_actions.tsx +270 -29
- package/src/components/field_configs.tsx +68 -46
- package/src/components/history/EntityHistoryEntry.tsx +4 -5
- package/src/components/history/EntityHistoryView.tsx +18 -8
- package/src/components/history/LastEditedByIndicator.tsx +4 -4
- package/src/components/index.ts +20 -17
- package/src/contexts/BreacrumbsContext.tsx +15 -6
- package/src/contexts/SidePanelControllerContext.tsx +5 -0
- package/src/data_export/export/BasicExportAction.tsx +42 -43
- package/src/data_export/export/ExportCollectionAction.tsx +55 -54
- package/src/data_export/export/export.ts +17 -17
- package/src/data_import/components/DataNewPropertiesMapping.tsx +17 -4
- package/src/data_import/components/ImportFileUpload.tsx +2 -3
- package/src/data_import/components/ImportNewPropertyFieldPreview.tsx +2 -3
- package/src/data_import/components/ImportSaveInProgress.tsx +4 -4
- package/src/data_import/import/ImportCollectionAction.tsx +26 -13
- package/src/data_import/utils/data.ts +26 -8
- package/src/data_import/utils/file_headers.ts +13 -89
- package/src/data_import/utils/file_to_json.ts +43 -68
- package/src/data_import/utils/get_properties_mapping.ts +1 -1
- package/src/data_import/utils/transforms.ts +47 -0
- package/src/editor/components/SlashCommandMenu.tsx +17 -2
- package/src/editor/components/editor-bubble-item.tsx +1 -1
- package/src/editor/components/editor-bubble.tsx +32 -9
- package/src/editor/components/image-bubble.tsx +28 -12
- package/src/editor/components/index.ts +3 -3
- package/src/editor/components/table-bubble.tsx +80 -18
- package/src/editor/editor.tsx +34 -15
- package/src/editor/extensions/HighlightDecorationExtension.ts +3 -2
- package/src/editor/extensions/Image/index.ts +3 -3
- package/src/editor/extensions/Image.ts +3 -3
- package/src/editor/extensions/clipboard.ts +2 -2
- package/src/editor/markdown-it-plugins.d.ts +24 -0
- package/src/editor/markdown.ts +2 -3
- package/src/editor/nodeViews/ReactNodeView.tsx +1 -1
- package/src/editor/nodeViews/TaskItemComponent.tsx +9 -8
- package/src/editor/schema.ts +135 -59
- package/src/editor/selectors/ai-selector.tsx +0 -1
- package/src/editor/selectors/color-selector.tsx +1 -2
- package/src/editor/selectors/link-selector.tsx +9 -7
- package/src/editor/selectors/node-selector.tsx +17 -3
- package/src/editor/selectors/text-buttons.tsx +1 -2
- package/src/editor/useProseMirror.ts +2 -2
- package/src/editor/utils/prosemirror-utils.ts +1 -1
- package/src/editor/utils/remove_classes.ts +6 -5
- package/src/form/EntityForm.tsx +222 -442
- package/src/form/EntityFormActions.tsx +49 -55
- package/src/form/EntityFormBinding.tsx +323 -0
- package/src/form/PropertyFieldBinding.tsx +81 -84
- package/src/form/components/ErrorFocus.tsx +1 -1
- package/src/form/components/FieldHelperText.tsx +6 -7
- package/src/form/components/FormLayout.tsx +1 -1
- package/src/form/components/LocalChangesMenu.tsx +20 -5
- package/src/form/components/StorageItemPreview.tsx +2 -3
- package/src/form/components/StorageUploadProgress.tsx +14 -7
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +5 -5
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +12 -13
- package/src/form/field_bindings/BlockFieldBinding.tsx +59 -58
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +2 -2
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +319 -303
- package/src/form/field_bindings/MapFieldBinding.tsx +14 -56
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +28 -10
- package/src/form/field_bindings/MultiSelectFieldBinding.tsx +3 -4
- package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +11 -12
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +9 -2
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +17 -15
- package/src/form/field_bindings/RelationFieldBinding.tsx +157 -156
- package/src/form/field_bindings/RepeatFieldBinding.tsx +8 -8
- package/src/form/field_bindings/SelectFieldBinding.tsx +3 -4
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +107 -103
- package/src/form/field_bindings/SwitchFieldBinding.tsx +17 -17
- package/src/form/field_bindings/TextFieldBinding.tsx +90 -78
- package/src/form/field_bindings/UserSelectFieldBinding.tsx +18 -18
- package/src/form/field_bindings/VectorFieldBinding.tsx +202 -0
- package/src/form/form_utils.ts +163 -0
- package/src/form/index.tsx +15 -6
- package/src/form/useClearRestoreValue.tsx +1 -1
- package/src/form/validation.ts +104 -50
- package/src/hooks/index.ts +4 -4
- package/src/hooks/navigation/contexts/CollectionRegistryContext.tsx +5 -4
- package/src/hooks/navigation/contexts/NavigationStateContext.tsx +2 -2
- package/src/hooks/navigation/contexts/UrlContext.tsx +1 -2
- package/src/hooks/navigation/useAsyncResolver.ts +100 -0
- package/src/hooks/navigation/useBuildCollectionRegistryController.tsx +40 -21
- package/src/hooks/navigation/useBuildNavigationStateController.tsx +21 -22
- package/src/hooks/navigation/useNavigationResolution.ts +193 -21
- package/src/hooks/navigation/useResolvedCollections.ts +45 -77
- package/src/hooks/navigation/useResolvedViews.tsx +44 -123
- package/src/hooks/navigation/useTopLevelNavigation.ts +22 -18
- package/src/hooks/navigation/utils.ts +12 -9
- package/src/hooks/useBreadcrumbsController.tsx +2 -34
- package/src/hooks/{useBuildSideEntityController.tsx → useBuildSidePanel.tsx} +63 -24
- package/src/hooks/useCMSContext.tsx +7 -7
- package/src/hooks/{useEntityHistory.ts → useHistory.ts} +9 -4
- package/src/hooks/useResolvedNavigationFrom.tsx +8 -5
- package/src/hooks/{useEntitySelectionDialog.tsx → useSelectionDialog.tsx} +7 -7
- package/src/hooks/useSideDialogsController.tsx +1 -1
- package/src/hooks/useSidePanel.tsx +13 -0
- package/src/index.ts +34 -20
- package/src/preview/PropertyPreview.tsx +34 -41
- package/src/preview/components/DatePreview.tsx +1 -1
- package/src/preview/components/EnumValuesChip.tsx +1 -1
- package/src/preview/components/ImagePreview.tsx +4 -3
- package/src/preview/components/ReferencePreview.tsx +69 -18
- package/src/preview/components/RelationPreview.tsx +107 -18
- package/src/preview/components/StorageThumbnail.tsx +28 -8
- package/src/preview/components/UrlComponentPreview.tsx +12 -4
- package/src/preview/components/UserPreview.tsx +6 -15
- package/src/preview/property_previews/ArrayOfMapsPreview.tsx +5 -5
- package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +5 -5
- package/src/preview/property_previews/ArrayOfRelationsPreview.tsx +4 -4
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +4 -4
- package/src/preview/property_previews/ArrayOfStringsPreview.tsx +3 -2
- package/src/preview/property_previews/ArrayOneOfPreview.tsx +7 -9
- package/src/preview/property_previews/ArrayPropertyEnumPreview.tsx +1 -1
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +4 -4
- package/src/preview/property_previews/MapPropertyPreview.tsx +4 -3
- package/src/preview/property_previews/NumberPropertyPreview.tsx +5 -3
- package/src/preview/property_previews/SkeletonPropertyComponent.tsx +24 -25
- package/src/preview/property_previews/StringPropertyPreview.tsx +13 -11
- package/src/routes/CustomViewRoute.tsx +14 -6
- package/src/routes/RebaseRoute.tsx +112 -36
- package/src/types/components/EntityFormActionsProps.tsx +4 -4
- package/src/types/components/EntityFormProps.tsx +75 -5
- package/src/types/components/PropertyPreviewProps.tsx +6 -1
- package/src/types/components/formex.tsx +1 -45
- package/src/types/fields.tsx +26 -15
- package/src/util/dataControllerAdapter.ts +87 -0
- package/src/util/navigation_utils.ts +43 -13
- package/src/util/previews.ts +149 -13
- package/src/util/propertyConfigMapper.ts +134 -0
- package/src/util/property_utils.tsx +24 -9
- package/src/util/resolutions.ts +4 -8
- package/src/util/view_constants.ts +6 -0
- package/dist/CollectionEditorDialog-B2M9lCyL.js +0 -4720
- package/dist/CollectionEditorDialog-B2M9lCyL.js.map +0 -1
- package/dist/CollectionsStudioView-WG6soyfs.js +0 -218
- package/dist/CollectionsStudioView-WG6soyfs.js.map +0 -1
- package/dist/ContentHomePage-CDF_a6Lp.js +0 -1786
- package/dist/ContentHomePage-CDF_a6Lp.js.map +0 -1
- package/dist/ExportCollectionAction-Dc0VOWMN.js +0 -439
- package/dist/ExportCollectionAction-Dc0VOWMN.js.map +0 -1
- package/dist/ImportCollectionAction-DpCagAOy.js +0 -686
- package/dist/ImportCollectionAction-DpCagAOy.js.map +0 -1
- package/dist/PropertyEditView-DS67DxoT.js +0 -8138
- package/dist/PropertyEditView-DS67DxoT.js.map +0 -1
- package/dist/RoleChip-QtUFXeTp.js +0 -67
- package/dist/RoleChip-QtUFXeTp.js.map +0 -1
- package/dist/RolesView-CIuYBimF.js +0 -424
- package/dist/RolesView-CIuYBimF.js.map +0 -1
- package/dist/UsersView-B5zelXnH.js +0 -493
- package/dist/UsersView-B5zelXnH.js.map +0 -1
- package/dist/collection_editor/types/config_permissions.d.ts +0 -19
- package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +0 -27
- package/dist/components/EntityCollectionTable/fields/VirtualTableDateField.d.ts +0 -12
- package/dist/components/EntityCollectionTable/fields/VirtualTableInput.d.ts +0 -9
- package/dist/components/EntityCollectionTable/fields/VirtualTableNumberInput.d.ts +0 -8
- package/dist/components/EntityCollectionTable/fields/VirtualTableSwitch.d.ts +0 -7
- package/dist/components/EntityCollectionTable/index.d.ts +0 -6
- package/dist/components/EntityCollectionView/Board.d.ts +0 -2
- package/dist/components/EntityCollectionView/BoardColumn.d.ts +0 -42
- package/dist/components/EntityCollectionView/BoardColumnTitle.d.ts +0 -9
- package/dist/components/EntityCollectionView/BoardSortableList.d.ts +0 -14
- package/dist/components/EntityCollectionView/EntityBoardCard.d.ts +0 -31
- package/dist/components/EntityCollectionView/EntityCard.d.ts +0 -20
- package/dist/components/EntityCollectionView/EntityCollectionBoardView.d.ts +0 -21
- package/dist/components/EntityCollectionView/EntityCollectionListView.d.ts +0 -34
- package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +0 -64
- package/dist/components/EntityCollectionView/EntityCollectionViewActions.d.ts +0 -18
- package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +0 -18
- package/dist/components/EntityCollectionView/board_types.d.ts +0 -105
- package/dist/components/EntityEditView.d.ts +0 -49
- package/dist/components/EntityEditViewFormActions.d.ts +0 -2
- package/dist/components/EntityJsonPreview.d.ts +0 -3
- package/dist/components/EntitySidePanel.d.ts +0 -10
- package/dist/components/EntityView.d.ts +0 -12
- package/dist/components/admin/RoleChip.d.ts +0 -4
- package/dist/components/admin/RolesView.d.ts +0 -4
- package/dist/components/admin/UsersView.d.ts +0 -4
- package/dist/contexts/SideEntityControllerContext.d.ts +0 -3
- package/dist/form/field_bindings/ReferenceAsStringFieldBinding.d.ts +0 -10
- package/dist/hooks/navigation/useNavigationRegistry.d.ts +0 -11
- package/dist/hooks/navigation/useNavigationURLs.d.ts +0 -11
- package/dist/hooks/useBuildSideEntityController.d.ts +0 -6
- package/dist/hooks/useSideEntityController.d.ts +0 -11
- package/dist/index-CBhrgpR7.js +0 -12
- package/dist/index-CBhrgpR7.js.map +0 -1
- package/dist/index-CHxgwt6E.js +0 -456
- package/dist/index-CHxgwt6E.js.map +0 -1
- package/dist/index-Dey5WJpO.js +0 -8
- package/dist/index-Dey5WJpO.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/markdown-z2Ir7Cgo.js +0 -618
- package/dist/markdown-z2Ir7Cgo.js.map +0 -1
- package/dist/useEntityHistory-Dcj4zhGj.js +0 -121
- package/dist/useEntityHistory-Dcj4zhGj.js.map +0 -1
- package/dist/util-BQ82ySL3.js +0 -27720
- package/dist/util-BQ82ySL3.js.map +0 -1
- package/src/collection_editor/types/config_permissions.ts +0 -20
- package/src/components/EntityCollectionTable/fields/VirtualTableDateField.tsx +0 -39
- package/src/components/EntityCollectionTable/fields/VirtualTableInput.tsx +0 -90
- package/src/components/EntityCollectionTable/fields/VirtualTableNumberInput.tsx +0 -80
- package/src/components/EntityCollectionTable/fields/VirtualTableSwitch.tsx +0 -32
- package/src/components/EntityCollectionTable/index.tsx +0 -14
- package/src/components/EntityCollectionView/Board.tsx +0 -474
- package/src/components/EntityCollectionView/BoardColumn.tsx +0 -158
- package/src/components/EntityCollectionView/BoardColumnTitle.tsx +0 -45
- package/src/components/EntityCollectionView/BoardSortableList.tsx +0 -177
- package/src/components/EntityCollectionView/EntityCollectionCardView.tsx +0 -267
- package/src/components/EntityCollectionView/board_types.ts +0 -113
- package/src/components/EntityEditView.tsx +0 -632
- package/src/components/EntitySidePanel.tsx +0 -160
- package/src/components/admin/RoleChip.tsx +0 -23
- package/src/components/admin/RolesView.tsx +0 -419
- package/src/components/admin/UsersView.tsx +0 -782
- package/src/contexts/SideEntityControllerContext.tsx +0 -5
- package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +0 -141
- package/src/hooks/navigation/useNavigationRegistry.ts +0 -153
- package/src/hooks/navigation/useNavigationURLs.ts +0 -56
- package/src/hooks/useSideEntityController.tsx +0 -13
- /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/PropertyTableCell.d.ts +0 -0
- /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useDraggable.d.ts +0 -0
- /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useWindowSize.d.ts +0 -0
- /package/dist/components/{EntityCollectionView → CollectionViewBinding}/useSelectionController.d.ts +0 -0
- /package/dist/components/{EntityCollectionView → CollectionViewBinding}/utils.d.ts +0 -0
- /package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableUserSelect.tsx +0 -0
- /package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useWindowSize.tsx +0 -0
- /package/src/components/{EntityCollectionView → CollectionViewBinding}/useSelectionController.tsx +0 -0
- /package/src/components/{EntityCollectionView → CollectionViewBinding}/utils.ts +0 -0
package/src/form/EntityForm.tsx
CHANGED
|
@@ -1,146 +1,44 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CollectionConfig, EntityCustomViewParams, AdditionalFieldDelegateProps } from "@rebasepro/types";
|
|
2
2
|
import type { FormContext, PropertyFieldBindingProps } from "../types/fields";
|
|
3
|
-
import type {
|
|
3
|
+
import type { PropertyConfig } from "@rebasepro/types";
|
|
4
4
|
import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
5
|
-
import {
|
|
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 "
|
|
11
|
-
import { getDefaultValuesFor,
|
|
12
|
-
|
|
13
|
-
import {
|
|
14
|
-
import { getFormFieldKeys } from "@rebasepro/
|
|
15
|
-
import { Alert, Chip, cls, iconSize, paperMixin, Tooltip, Typography } from "@rebasepro/ui";
|
|
16
|
-
import { Formex, FormexController,
|
|
17
|
-
|
|
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 {
|
|
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 {
|
|
34
|
-
import {
|
|
35
|
-
import {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
169
|
-
const
|
|
170
|
-
const collectionRegistryController = useCollectionRegistryController();
|
|
83
|
+
|
|
84
|
+
const customizationController = useCustomizationController();
|
|
171
85
|
|
|
172
86
|
const navigateBack = useCallback(() => {
|
|
173
|
-
if (
|
|
174
|
-
|
|
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
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
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
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
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
|
|
231
|
-
|
|
232
|
-
|
|
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
|
-
|
|
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
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
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
|
|
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
|
-
}, [
|
|
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
|
-
|
|
196
|
+
onResetProp?.();
|
|
295
197
|
onValuesModified?.(false, initialValues as M);
|
|
296
198
|
},
|
|
297
|
-
onValuesChangeDeferred:
|
|
298
|
-
|
|
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 (
|
|
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
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
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
|
|
532
|
-
|
|
533
|
-
|
|
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
|
-
|
|
327
|
+
// Default no-op unique field validator — always passes
|
|
328
|
+
const defaultUniqueFieldValidator: CustomFieldValidator = useCallback(async () => true, []);
|
|
542
329
|
|
|
543
|
-
const uniqueFieldValidator: CustomFieldValidator =
|
|
544
|
-
|
|
545
|
-
|
|
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
|
-
|
|
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
|
|
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:
|
|
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
|
|
636
|
-
if (!
|
|
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
|
|
640
|
-
|
|
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
|
-
{
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
{
|
|
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<
|
|
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={
|
|
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={() =>
|
|
749
|
-
|
|
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(
|
|
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
|
|
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={
|
|
585
|
+
cacheKey={localChangesCacheKey}
|
|
764
586
|
properties={collection.properties}
|
|
765
587
|
cachedData={localChangesData as Partial<M>}
|
|
766
588
|
formex={formex}
|
|
767
|
-
onClearLocalChanges={() =>
|
|
589
|
+
onClearLocalChanges={() => {
|
|
590
|
+
setLocalChangesCleared(true);
|
|
591
|
+
onClearLocalChanges?.();
|
|
592
|
+
}}
|
|
768
593
|
/>}
|
|
769
594
|
|
|
770
|
-
{
|
|
771
|
-
? <Tooltip title={
|
|
772
|
-
<Chip size={"small"} className={"py-1"} colorScheme={"
|
|
773
|
-
<
|
|
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
|
-
:
|
|
777
|
-
<
|
|
778
|
-
<
|
|
779
|
-
|
|
780
|
-
|
|
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
|
-
|
|
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
|
-
|