@rebasepro/cms 0.17.3 → 0.18.1
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/README.md +4 -0
- package/dist/{CollectionEditorDialog-B-akreOU.js → CollectionEditorDialog-BeX4b92r.js} +13 -7
- package/dist/{CollectionEditorDialog-B-akreOU.js.map → CollectionEditorDialog-BeX4b92r.js.map} +1 -1
- package/dist/{PropertyEditView-CiY84wkR.js → PropertyEditView-C7thfj4L.js} +3 -3
- package/dist/{PropertyEditView-CiY84wkR.js.map → PropertyEditView-C7thfj4L.js.map} +1 -1
- package/dist/{RouterCollectionsStudioView-DkAWda4N.js → RouterCollectionsStudioView-BtjzvB6E.js} +4 -4
- package/dist/{RouterCollectionsStudioView-DkAWda4N.js.map → RouterCollectionsStudioView-BtjzvB6E.js.map} +1 -1
- package/dist/{SchemaChangeDialog-DceT8QFX.js → SchemaChangeDialog-CkqK6KOC.js} +4 -2
- package/dist/{SchemaChangeDialog-DceT8QFX.js.map → SchemaChangeDialog-CkqK6KOC.js.map} +1 -1
- package/dist/collection_editor/api/generateCollectionApi.d.ts +1 -2
- package/dist/collection_editor_ui.d.ts +2 -0
- package/dist/collection_editor_ui.js +6 -5
- package/dist/collection_editor_ui.js.map +1 -1
- package/dist/components/DeleteEntityDialog.d.ts +2 -3
- package/dist/components/RebaseLayout.d.ts +11 -4
- package/dist/components/field_configs.d.ts +1 -1
- package/dist/editor/sanitize-html.d.ts +15 -0
- package/dist/editor.js +195 -10
- package/dist/editor.js.map +1 -1
- package/dist/{export-Ben8E355.js → export--arni_VY.js} +2 -2
- package/dist/{export-Ben8E355.js.map → export--arni_VY.js.map} +1 -1
- package/dist/form/components/LabelWithIcon.d.ts +10 -0
- package/dist/{history-DIEVd26f.js → history-C2TpoQwi.js} +2 -2
- package/dist/{history-DIEVd26f.js.map → history-C2TpoQwi.js.map} +1 -1
- package/dist/hooks/navigation/useBuildNavigationStateController.d.ts +1 -1
- package/dist/hooks/navigation/useResolvedViews.d.ts +1 -1
- package/dist/hooks/navigation/useTopLevelNavigation.d.ts +1 -1
- package/dist/{import-D25x7ko-.js → import-DTkXNoBg.js} +2 -2
- package/dist/{import-D25x7ko-.js.map → import-DTkXNoBg.js.map} +1 -1
- package/dist/index.js +78 -33
- package/dist/index.js.map +1 -1
- package/dist/util/propertyConfigMapper.d.ts +1 -1
- package/dist/util-CfLFggP7.js +57 -0
- package/dist/util-CfLFggP7.js.map +1 -0
- package/dist/{util-DVqnqlLn.js → util-DE1WQW6h.js} +134 -112
- package/dist/util-DE1WQW6h.js.map +1 -0
- package/package.json +42 -34
- package/dist/util-DVqnqlLn.js.map +0 -1
- package/src/collection_editor/CollectionEditorDialogsContext.tsx +0 -25
- package/src/collection_editor/ConfigControllerProvider.tsx +0 -395
- package/src/collection_editor/_cms_internals.ts +0 -41
- package/src/collection_editor/api/generateCollectionApi.ts +0 -126
- package/src/collection_editor/api/index.ts +0 -1
- package/src/collection_editor/extensibility_types.ts +0 -168
- package/src/collection_editor/index.ts +0 -108
- package/src/collection_editor/liveSchemaClient.ts +0 -285
- package/src/collection_editor/relation_kinds.ts +0 -44
- package/src/collection_editor/serializable_types.ts +0 -535
- package/src/collection_editor/serializable_utils.ts +0 -729
- package/src/collection_editor/types/collection_editor_controller.tsx +0 -62
- package/src/collection_editor/types/collection_inference.ts +0 -18
- package/src/collection_editor/types/config_controller.tsx +0 -121
- package/src/collection_editor/ui/AddKanbanColumnAction.tsx +0 -199
- package/src/collection_editor/ui/CollectionViewHeaderAction.tsx +0 -51
- package/src/collection_editor/ui/EditorCollectionAction.tsx +0 -54
- package/src/collection_editor/ui/EditorCollectionActionStart.tsx +0 -90
- package/src/collection_editor/ui/EditorEntityAction.tsx +0 -50
- package/src/collection_editor/ui/HomePageEditorCollectionAction.tsx +0 -114
- package/src/collection_editor/ui/KanbanSetupAction.tsx +0 -43
- package/src/collection_editor/ui/MissingReferenceWidget.tsx +0 -35
- package/src/collection_editor/ui/NewCollectionButton.tsx +0 -27
- package/src/collection_editor/ui/NewCollectionCard.tsx +0 -48
- package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +0 -49
- package/src/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.tsx +0 -260
- package/src/collection_editor/ui/collection_editor/AIModifiedPathsContext.tsx +0 -90
- package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +0 -388
- package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +0 -1098
- package/src/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.tsx +0 -301
- package/src/collection_editor/ui/collection_editor/CollectionJsonImportDialog.tsx +0 -172
- package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +0 -620
- package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +0 -530
- package/src/collection_editor/ui/collection_editor/CollectionRelationsTab.tsx +0 -462
- package/src/collection_editor/ui/collection_editor/CollectionStudioView.tsx +0 -104
- package/src/collection_editor/ui/collection_editor/CollectionYupValidation.tsx +0 -9
- package/src/collection_editor/ui/collection_editor/CollectionsStudioView.tsx +0 -199
- package/src/collection_editor/ui/collection_editor/DisplaySettingsForm.tsx +0 -315
- package/src/collection_editor/ui/collection_editor/EntityActionsEditTab.tsx +0 -164
- package/src/collection_editor/ui/collection_editor/EntityActionsSelectDialog.tsx +0 -40
- package/src/collection_editor/ui/collection_editor/EntityCustomViewsSelectDialog.tsx +0 -39
- package/src/collection_editor/ui/collection_editor/EnumForm.tsx +0 -373
- package/src/collection_editor/ui/collection_editor/GeneralSettingsForm.tsx +0 -288
- package/src/collection_editor/ui/collection_editor/GetCodeDialog.tsx +0 -141
- package/src/collection_editor/ui/collection_editor/KanbanConfigSection.tsx +0 -194
- package/src/collection_editor/ui/collection_editor/LayoutModeSwitch.tsx +0 -53
- package/src/collection_editor/ui/collection_editor/PropertyEditView.tsx +0 -980
- package/src/collection_editor/ui/collection_editor/PropertyFieldPreview.tsx +0 -164
- package/src/collection_editor/ui/collection_editor/PropertyTree.tsx +0 -364
- package/src/collection_editor/ui/collection_editor/RouterCollectionStudioView.tsx +0 -44
- package/src/collection_editor/ui/collection_editor/RouterCollectionsStudioView.tsx +0 -41
- package/src/collection_editor/ui/collection_editor/SchemaChangeDialog.tsx +0 -470
- package/src/collection_editor/ui/collection_editor/SubcollectionsEditTab.tsx +0 -256
- package/src/collection_editor/ui/collection_editor/SwitchControl.tsx +0 -39
- package/src/collection_editor/ui/collection_editor/ViewModeSwitch.tsx +0 -68
- package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.tsx +0 -67
- package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.tsx +0 -296
- package/src/collection_editor/ui/collection_editor/import/clean_import_data.ts +0 -57
- package/src/collection_editor/ui/collection_editor/properties/BlockPropertyField.tsx +0 -147
- package/src/collection_editor/ui/collection_editor/properties/BooleanPropertyField.tsx +0 -41
- package/src/collection_editor/ui/collection_editor/properties/CommonPropertyFields.tsx +0 -113
- package/src/collection_editor/ui/collection_editor/properties/DateTimePropertyField.tsx +0 -250
- package/src/collection_editor/ui/collection_editor/properties/EnumPropertyField.tsx +0 -126
- package/src/collection_editor/ui/collection_editor/properties/KeyValuePropertyField.tsx +0 -20
- package/src/collection_editor/ui/collection_editor/properties/MapPropertyField.tsx +0 -153
- package/src/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.tsx +0 -217
- package/src/collection_editor/ui/collection_editor/properties/NumberPropertyField.tsx +0 -117
- package/src/collection_editor/ui/collection_editor/properties/ReferencePropertyField.tsx +0 -129
- package/src/collection_editor/ui/collection_editor/properties/RelationPropertyField.tsx +0 -335
- package/src/collection_editor/ui/collection_editor/properties/RepeatPropertyField.tsx +0 -107
- package/src/collection_editor/ui/collection_editor/properties/StoragePropertyField.tsx +0 -403
- package/src/collection_editor/ui/collection_editor/properties/StringPropertyField.tsx +0 -148
- package/src/collection_editor/ui/collection_editor/properties/UrlPropertyField.tsx +0 -91
- package/src/collection_editor/ui/collection_editor/properties/VectorPropertyField.tsx +0 -34
- package/src/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx +0 -49
- package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.tsx +0 -925
- package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsPanel.tsx +0 -28
- package/src/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.tsx +0 -626
- package/src/collection_editor/ui/collection_editor/properties/conditions/index.ts +0 -6
- package/src/collection_editor/ui/collection_editor/properties/conditions/property_paths.ts +0 -93
- package/src/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx +0 -52
- package/src/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx +0 -63
- package/src/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx +0 -114
- package/src/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.tsx +0 -154
- package/src/collection_editor/ui/collection_editor/properties/validation/ValidationPanel.tsx +0 -28
- package/src/collection_editor/ui/collection_editor/templates/blog_template.ts +0 -112
- package/src/collection_editor/ui/collection_editor/templates/pages_template.ts +0 -183
- package/src/collection_editor/ui/collection_editor/templates/products_template.ts +0 -88
- package/src/collection_editor/ui/collection_editor/templates/users_template.ts +0 -42
- package/src/collection_editor/ui/collection_editor/util.ts +0 -28
- package/src/collection_editor/ui/collection_editor/utils/strings.ts +0 -1
- package/src/collection_editor/ui/collection_editor/utils/supported_fields.tsx +0 -39
- package/src/collection_editor/ui/collection_editor/utils/update_property_for_widget.ts +0 -276
- package/src/collection_editor/useCollectionEditorController.tsx +0 -9
- package/src/collection_editor/useCollectionsConfigController.tsx +0 -9
- package/src/collection_editor/useJsonCollectionsConfigController.tsx +0 -297
- package/src/collection_editor/useLiveSchemaEditing.tsx +0 -315
- package/src/collection_editor/useLocalCollectionsConfigController.tsx +0 -341
- package/src/collection_editor/useSafeSnackbarController.ts +0 -9
- package/src/collection_editor/validateCollectionJson.ts +0 -440
- package/src/collection_editor_ui.ts +0 -21
- package/src/components/AdditionalFieldValue.tsx +0 -68
- package/src/components/AdminModeSyncer.tsx +0 -56
- package/src/components/ArrayContainer.tsx +0 -542
- package/src/components/ClearFilterSortButton.tsx +0 -56
- package/src/components/CollectionEditorDialogs.tsx +0 -69
- package/src/components/CollectionPanel.tsx +0 -179
- package/src/components/CollectionTableBinding/CollectionRowActions.tsx +0 -244
- package/src/components/CollectionTableBinding/CollectionTableBinding.tsx +0 -394
- package/src/components/CollectionTableBinding/CollectionTableBindingProps.tsx +0 -172
- package/src/components/CollectionTableBinding/PropertyTableCell.tsx +0 -350
- package/src/components/CollectionTableBinding/column_utils.tsx +0 -155
- package/src/components/CollectionTableBinding/fields/TableMultipleRelationField.tsx +0 -131
- package/src/components/CollectionTableBinding/fields/TableReferenceField.tsx +0 -193
- package/src/components/CollectionTableBinding/fields/TableRelationField.tsx +0 -192
- package/src/components/CollectionTableBinding/fields/TableRelationSelectorField.tsx +0 -42
- package/src/components/CollectionTableBinding/fields/TableStorageUpload.tsx +0 -324
- package/src/components/CollectionTableBinding/fields/VirtualTableSelect.tsx +0 -132
- package/src/components/CollectionTableBinding/fields/VirtualTableUserSelect.tsx +0 -41
- package/src/components/CollectionTableBinding/index.tsx +0 -14
- package/src/components/CollectionTableBinding/internal/CollectionTableToolbar.tsx +0 -96
- package/src/components/CollectionTableBinding/internal/EntityTableCell.tsx +0 -309
- package/src/components/CollectionTableBinding/internal/EntityTableCellActions.tsx +0 -80
- package/src/components/CollectionTableBinding/internal/common.tsx +0 -74
- package/src/components/CollectionTableBinding/internal/popup_field/PopupFormField.tsx +0 -422
- package/src/components/CollectionTableBinding/internal/popup_field/useDraggable.tsx +0 -99
- package/src/components/CollectionTableBinding/internal/popup_field/useWindowSize.tsx +0 -22
- package/src/components/CollectionTableBinding/table_bindings.tsx +0 -350
- package/src/components/CollectionViewBinding/BoardCardBinding.tsx +0 -263
- package/src/components/CollectionViewBinding/CollectionBoardViewBinding.tsx +0 -662
- package/src/components/CollectionViewBinding/CollectionCardViewBinding.tsx +0 -159
- package/src/components/CollectionViewBinding/CollectionListViewBinding.tsx +0 -1430
- package/src/components/CollectionViewBinding/CollectionViewActions.tsx +0 -227
- package/src/components/CollectionViewBinding/CollectionViewBinding.tsx +0 -1603
- package/src/components/CollectionViewBinding/CollectionViewStartActions.tsx +0 -240
- package/src/components/CollectionViewBinding/EntityCardBinding.tsx +0 -239
- package/src/components/CollectionViewBinding/FilterPresetsButton.tsx +0 -298
- package/src/components/CollectionViewBinding/FiltersDialog.tsx +0 -218
- package/src/components/CollectionViewBinding/SearchExplanation.tsx +0 -106
- package/src/components/CollectionViewBinding/SearchHighlight.tsx +0 -311
- package/src/components/CollectionViewBinding/SlotValue.tsx +0 -156
- package/src/components/CollectionViewBinding/SortButton.tsx +0 -354
- package/src/components/CollectionViewBinding/SplitListCloseButton.tsx +0 -49
- package/src/components/CollectionViewBinding/SplitListShowButton.tsx +0 -28
- package/src/components/CollectionViewBinding/SplitListView.tsx +0 -488
- package/src/components/CollectionViewBinding/SplitViewContext.tsx +0 -34
- package/src/components/CollectionViewBinding/ViewModeToggle.tsx +0 -250
- package/src/components/CollectionViewBinding/hooks/useCollectionInlineEditor.ts +0 -81
- package/src/components/CollectionViewBinding/hooks/useKanbanDragAndDrop.ts +0 -181
- package/src/components/CollectionViewBinding/useBoardDataController.tsx +0 -802
- package/src/components/CollectionViewBinding/usePreviewSlots.ts +0 -703
- package/src/components/CollectionViewBinding/useSelectionController.tsx +0 -40
- package/src/components/CollectionViewBinding/utils.ts +0 -22
- package/src/components/DefaultAppBar.tsx +0 -264
- package/src/components/DefaultDrawer.tsx +0 -593
- package/src/components/DeleteEntityDialog.tsx +0 -205
- package/src/components/DetailViewBinding.tsx +0 -731
- package/src/components/DrawerNavigationGroup.tsx +0 -141
- package/src/components/DrawerNavigationItem.tsx +0 -115
- package/src/components/EditFormActions.tsx +0 -303
- package/src/components/EditViewBinding.tsx +0 -1069
- package/src/components/EntityDisplayHeader.tsx +0 -170
- package/src/components/EntityIdentityBar.tsx +0 -428
- package/src/components/EntityInspector.tsx +0 -156
- package/src/components/EntityPreviewBinding.tsx +0 -432
- package/src/components/EntityPreviewNesting.tsx +0 -50
- package/src/components/EntityViewBinding.tsx +0 -374
- package/src/components/FieldCaption.tsx +0 -14
- package/src/components/HomePage/ContentHomePage.tsx +0 -586
- package/src/components/HomePage/FavouritesView.tsx +0 -60
- package/src/components/HomePage/HomePageDnD.tsx +0 -704
- package/src/components/HomePage/NavigationCard.tsx +0 -81
- package/src/components/HomePage/NavigationCardBinding.tsx +0 -107
- package/src/components/HomePage/NavigationGroup.tsx +0 -156
- package/src/components/HomePage/RenameGroupDialog.tsx +0 -123
- package/src/components/HomePage/SmallNavigationCard.tsx +0 -41
- package/src/components/HomePage/index.tsx +0 -5
- package/src/components/InlineEntityPreview.tsx +0 -149
- package/src/components/JsonPreviewBinding.tsx +0 -66
- package/src/components/PropertyCollectionView.tsx +0 -336
- package/src/components/PropertyConfigBadge.tsx +0 -28
- package/src/components/PropertyIdCopyTooltip.tsx +0 -47
- package/src/components/RebaseAuthGate.tsx +0 -44
- package/src/components/RebaseCMS.tsx +0 -30
- package/src/components/RebaseLayout.tsx +0 -80
- package/src/components/RebaseNavigation.tsx +0 -369
- package/src/components/RebaseRouteDefs.tsx +0 -127
- package/src/components/RebaseShell.tsx +0 -83
- package/src/components/ReferenceTable/SelectionTableBinding.tsx +0 -389
- package/src/components/ReferenceWidget.tsx +0 -156
- package/src/components/RelationSelector.tsx +0 -926
- package/src/components/SearchIconsView.tsx +0 -78
- package/src/components/SelectableTable/SelectableTable.tsx +0 -309
- package/src/components/SelectableTable/SelectableTableContext.tsx +0 -7
- package/src/components/SelectableTable/SelectionStore.ts +0 -43
- package/src/components/SelectableTable/filters/BooleanFilterField.tsx +0 -59
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +0 -146
- package/src/components/SelectableTable/filters/FilterFieldBinding.tsx +0 -190
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +0 -250
- package/src/components/SelectableTable/filters/RelationFilterField.tsx +0 -238
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +0 -282
- package/src/components/SelectableTable/filters/null_filter.ts +0 -63
- package/src/components/SideDialogs.tsx +0 -238
- package/src/components/SidePanelBinding.tsx +0 -361
- package/src/components/SidePanelProvider.tsx +0 -80
- package/src/components/UserSelector.tsx +0 -513
- package/src/components/admin/CreationResultDialog.tsx +0 -138
- package/src/components/admin/index.ts +0 -1
- package/src/components/app/AppBar.tsx +0 -17
- package/src/components/app/Drawer.tsx +0 -38
- package/src/components/app/Scaffold.tsx +0 -366
- package/src/components/app/index.ts +0 -4
- package/src/components/app/useApp.tsx +0 -36
- package/src/components/common/default_entity_actions.tsx +0 -440
- package/src/components/common/index.ts +0 -1
- package/src/components/field_configs.tsx +0 -506
- package/src/components/history/EntityHistoryEntry.tsx +0 -203
- package/src/components/history/EntityHistoryView.tsx +0 -206
- package/src/components/history/LastEditedByFormAction.tsx +0 -24
- package/src/components/history/LastEditedByIndicator.tsx +0 -95
- package/src/components/history/UserChip.tsx +0 -15
- package/src/components/history/index.tsx +0 -5
- package/src/components/index.ts +0 -63
- package/src/contexts/BreacrumbsContext.tsx +0 -45
- package/src/contexts/SideDialogsControllerContext.tsx +0 -5
- package/src/contexts/SidePanelControllerContext.tsx +0 -5
- package/src/data_export/export/BasicExportAction.tsx +0 -142
- package/src/data_export/export/ExportCollectionAction.tsx +0 -321
- package/src/data_export/export/export.ts +0 -295
- package/src/data_export/export/fetch_export_data.ts +0 -90
- package/src/data_export/export/index.ts +0 -4
- package/src/data_export/index.ts +0 -1
- package/src/data_import/components/DataNewPropertiesMapping.tsx +0 -261
- package/src/data_import/components/ImportFileUpload.tsx +0 -42
- package/src/data_import/components/ImportNewPropertyFieldPreview.tsx +0 -58
- package/src/data_import/components/ImportSaveInProgress.tsx +0 -121
- package/src/data_import/components/index.ts +0 -4
- package/src/data_import/hooks/index.ts +0 -1
- package/src/data_import/hooks/useImportConfig.tsx +0 -34
- package/src/data_import/import/ImportCollectionAction.tsx +0 -461
- package/src/data_import/import/index.ts +0 -1
- package/src/data_import/index.ts +0 -5
- package/src/data_import/types/column_mapping.ts +0 -32
- package/src/data_import/types/index.ts +0 -1
- package/src/data_import/utils/csv.ts +0 -153
- package/src/data_import/utils/data.ts +0 -181
- package/src/data_import/utils/file_headers.ts +0 -14
- package/src/data_import/utils/file_to_json.ts +0 -149
- package/src/data_import/utils/get_import_inference_type.ts +0 -33
- package/src/data_import/utils/get_properties_mapping.ts +0 -67
- package/src/data_import/utils/index.ts +0 -5
- package/src/data_import/utils/save_entities.ts +0 -138
- package/src/data_import/utils/transforms.ts +0 -70
- package/src/editor/components/SlashCommandMenu.tsx +0 -532
- package/src/editor/components/editor-bubble-item.tsx +0 -32
- package/src/editor/components/editor-bubble.tsx +0 -143
- package/src/editor/components/image-bubble.tsx +0 -183
- package/src/editor/components/index.ts +0 -14
- package/src/editor/components/table-bubble.tsx +0 -233
- package/src/editor/editor.tsx +0 -529
- package/src/editor/extensions/HighlightDecorationExtension.ts +0 -115
- package/src/editor/extensions/Image.ts +0 -159
- package/src/editor/extensions/TextLoadingDecorationExtension.tsx +0 -107
- package/src/editor/extensions/clipboard.ts +0 -72
- package/src/editor/extensions/custom-keymap.ts +0 -25
- package/src/editor/extensions/drag-and-drop.tsx +0 -508
- package/src/editor/hooks/useProseMirror.ts +0 -126
- package/src/editor/hooks/useProseMirrorContext.ts +0 -15
- package/src/editor/index.ts +0 -2
- package/src/editor/markdown-it-plugins.d.ts +0 -24
- package/src/editor/markdown.ts +0 -204
- package/src/editor/nodeViews/ImageComponent.tsx +0 -20
- package/src/editor/nodeViews/ReactNodeView.tsx +0 -89
- package/src/editor/nodeViews/TaskItemComponent.tsx +0 -30
- package/src/editor/nodeViews/index.ts +0 -35
- package/src/editor/plugins/index.ts +0 -58
- package/src/editor/plugins/inputrules.ts +0 -82
- package/src/editor/plugins/placeholderPlugin.ts +0 -55
- package/src/editor/plugins/slashCommandPlugin.ts +0 -65
- package/src/editor/schema.ts +0 -339
- package/src/editor/selectors/ai-selector.tsx +0 -110
- package/src/editor/selectors/color-selector.tsx +0 -199
- package/src/editor/selectors/link-selector.tsx +0 -122
- package/src/editor/selectors/node-selector.tsx +0 -159
- package/src/editor/selectors/text-buttons.tsx +0 -79
- package/src/editor/types.ts +0 -6
- package/src/editor/useProseMirror.ts +0 -125
- package/src/editor/utils/prosemirror-utils.ts +0 -113
- package/src/editor/utils/remove_classes.ts +0 -18
- package/src/editor/utils/useDebouncedCallback.ts +0 -25
- package/src/form/EntityForm.tsx +0 -761
- package/src/form/EntityFormActions.tsx +0 -160
- package/src/form/EntityFormBinding.tsx +0 -342
- package/src/form/PropertyFieldBinding.tsx +0 -348
- package/src/form/components/ErrorFocus.tsx +0 -44
- package/src/form/components/FieldBlock.tsx +0 -189
- package/src/form/components/FieldHelperText.tsx +0 -84
- package/src/form/components/FormRail.tsx +0 -153
- package/src/form/components/FormSections.tsx +0 -145
- package/src/form/components/LabelWithIcon.tsx +0 -43
- package/src/form/components/LabelWithIconAndTooltip.tsx +0 -28
- package/src/form/components/LocalChangesMenu.tsx +0 -147
- package/src/form/components/StorageItemPreview.tsx +0 -81
- package/src/form/components/StorageUploadProgress.tsx +0 -118
- package/src/form/components/index.tsx +0 -6
- package/src/form/components/useRailVisible.tsx +0 -47
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +0 -109
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +0 -172
- package/src/form/field_bindings/BinaryFieldBinding.tsx +0 -177
- package/src/form/field_bindings/BlockFieldBinding.tsx +0 -282
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +0 -78
- package/src/form/field_bindings/GeopointFieldBinding.tsx +0 -200
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +0 -574
- package/src/form/field_bindings/MapFieldBinding.tsx +0 -120
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +0 -259
- package/src/form/field_bindings/MultiSelectFieldBinding.tsx +0 -130
- package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +0 -168
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +0 -94
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +0 -146
- package/src/form/field_bindings/RelationFieldBinding.tsx +0 -202
- package/src/form/field_bindings/RepeatFieldBinding.tsx +0 -143
- package/src/form/field_bindings/SelectFieldBinding.tsx +0 -111
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +0 -521
- package/src/form/field_bindings/SwitchFieldBinding.tsx +0 -70
- package/src/form/field_bindings/TextFieldBinding.tsx +0 -189
- package/src/form/field_bindings/UserSelectFieldBinding.tsx +0 -71
- package/src/form/field_bindings/VectorFieldBinding.tsx +0 -209
- package/src/form/form_utils.ts +0 -243
- package/src/form/index.tsx +0 -36
- package/src/form/useClearRestoreValue.tsx +0 -36
- package/src/form/useUndoableDiscard.ts +0 -39
- package/src/form/validation.ts +0 -583
- package/src/hooks/index.ts +0 -16
- package/src/hooks/navigation/contexts/CollectionRegistryContext.tsx +0 -22
- package/src/hooks/navigation/contexts/NavigationStateContext.tsx +0 -16
- package/src/hooks/navigation/contexts/UrlContext.tsx +0 -24
- package/src/hooks/navigation/contexts/index.ts +0 -14
- package/src/hooks/navigation/useAsyncResolver.ts +0 -100
- package/src/hooks/navigation/useBuildCollectionRegistryController.tsx +0 -218
- package/src/hooks/navigation/useBuildNavigationStateController.tsx +0 -134
- package/src/hooks/navigation/useBuildUrlController.tsx +0 -66
- package/src/hooks/navigation/useNavigationResolution.ts +0 -271
- package/src/hooks/navigation/useResolvedCollections.ts +0 -102
- package/src/hooks/navigation/useResolvedViews.tsx +0 -139
- package/src/hooks/navigation/useTopLevelNavigation.ts +0 -273
- package/src/hooks/navigation/utils.ts +0 -200
- package/src/hooks/useAdminContext.tsx +0 -83
- package/src/hooks/useBreadcrumbsController.tsx +0 -17
- package/src/hooks/useBuildSideDialogsController.tsx +0 -145
- package/src/hooks/useBuildSidePanel.tsx +0 -315
- package/src/hooks/useChildViewSource.ts +0 -46
- package/src/hooks/useEntityDisplay.tsx +0 -262
- package/src/hooks/useEntityDisplayTitle.tsx +0 -49
- package/src/hooks/useHistory.ts +0 -178
- package/src/hooks/useRecordActions.tsx +0 -69
- package/src/hooks/useResolvedNavigationFrom.tsx +0 -167
- package/src/hooks/useResolvedUsers.ts +0 -148
- package/src/hooks/useSelectionDialog.tsx +0 -58
- package/src/hooks/useSideDialogsController.tsx +0 -25
- package/src/hooks/useSidePanel.tsx +0 -13
- package/src/index.ts +0 -124
- package/src/preview/PropertyPreview.tsx +0 -331
- package/src/preview/compact_text.ts +0 -68
- package/src/preview/components/ArrayEnumPreview.tsx +0 -39
- package/src/preview/components/BooleanPreview.tsx +0 -28
- package/src/preview/components/DatePreview.tsx +0 -106
- package/src/preview/components/EmptyValue.tsx +0 -10
- package/src/preview/components/EnumValuesChip.tsx +0 -39
- package/src/preview/components/ImagePreview.tsx +0 -144
- package/src/preview/components/InlineEntityListPreview.tsx +0 -42
- package/src/preview/components/ReferencePreview.tsx +0 -235
- package/src/preview/components/RelationPreview.tsx +0 -271
- package/src/preview/components/StorageThumbnail.tsx +0 -147
- package/src/preview/components/UrlComponentPreview.tsx +0 -116
- package/src/preview/components/UserPreview.tsx +0 -30
- package/src/preview/components/date_fns_locales.ts +0 -125
- package/src/preview/index.ts +0 -26
- package/src/preview/property_previews/ArrayOfMapsPreview.tsx +0 -73
- package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +0 -67
- package/src/preview/property_previews/ArrayOfRelationsPreview.tsx +0 -77
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +0 -49
- package/src/preview/property_previews/ArrayOfStringsPreview.tsx +0 -70
- package/src/preview/property_previews/ArrayOneOfPreview.tsx +0 -79
- package/src/preview/property_previews/ArrayPropertyEnumPreview.tsx +0 -35
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +0 -79
- package/src/preview/property_previews/MapPropertyPreview.tsx +0 -198
- package/src/preview/property_previews/NumberPropertyPreview.tsx +0 -39
- package/src/preview/property_previews/SkeletonPropertyComponent.tsx +0 -276
- package/src/preview/property_previews/StringPropertyPreview.tsx +0 -70
- package/src/preview/util.ts +0 -39
- package/src/routes/CustomViewRoute.tsx +0 -33
- package/src/routes/RebaseRoute.tsx +0 -467
- package/src/routes/index.ts +0 -2
- package/src/types/components/EntityFormActionsProps.tsx +0 -20
- package/src/types/components/EntityFormProps.tsx +0 -119
- package/src/types/components/PropertyPreviewProps.tsx +0 -85
- package/src/types/components/formex.tsx +0 -2
- package/src/types/components/index.ts +0 -3
- package/src/types/fields.tsx +0 -340
- package/src/types/index.ts +0 -4
- package/src/util/dataControllerAdapter.ts +0 -88
- package/src/util/entity_actions.ts +0 -28
- package/src/util/index.ts +0 -5
- package/src/util/navigation_utils.ts +0 -89
- package/src/util/number_format.ts +0 -46
- package/src/util/previews.ts +0 -131
- package/src/util/propertyConfigMapper.ts +0 -134
- package/src/util/property_utils.tsx +0 -236
- package/src/util/resolutions.ts +0 -96
- package/src/util/view_constants.ts +0 -33
- package/src/util/view_mode.ts +0 -176
|
@@ -1,271 +0,0 @@
|
|
|
1
|
-
import type { AuthCollectionConfig } from "@rebasepro/types";
|
|
2
|
-
import type { AppView, AppViewsBuilder, EntityAction, CollectionConfigsBuilder, RebaseContext, RebasePlugin, UserCreationResult, AdminCollection } from "@rebasepro/cms-types";
|
|
3
|
-
import { type User, type RebaseData } from "@rebasepro/types";
|
|
4
|
-
import { type AuthController, resolveAdminCollection } from "@rebasepro/cms-types";
|
|
5
|
-
import { canReadCollection } from "@rebasepro/common";
|
|
6
|
-
import { resetPasswordAction } from "../../components/common/default_entity_actions";
|
|
7
|
-
import { CreationResultDialog } from "../../components/admin/CreationResultDialog";
|
|
8
|
-
import React from "react";
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Check whether a `RebaseCallContext` is actually the full frontend
|
|
12
|
-
* `RebaseContext` (which carries `dialogsController`).
|
|
13
|
-
*/
|
|
14
|
-
function isRebaseContext(ctx: unknown): ctx is RebaseContext {
|
|
15
|
-
return typeof ctx === "object" && ctx !== null && "dialogsController" in ctx;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export function filterOutNotAllowedCollections(resolvedCollections: AdminCollection[], authController: AuthController): AdminCollection[] {
|
|
19
|
-
return resolvedCollections
|
|
20
|
-
.filter((c) => canReadCollection(c, authController))
|
|
21
|
-
.map((c) => {
|
|
22
|
-
if (!c.childCollections) return c;
|
|
23
|
-
return {
|
|
24
|
-
...c,
|
|
25
|
-
childCollections: () => filterOutNotAllowedCollections(c.childCollections!() ?? [], authController)
|
|
26
|
-
};
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export function applyPluginModifyCollection(resolvedCollections: AdminCollection[], modifyCollection: (collection: AdminCollection) => AdminCollection): AdminCollection[] {
|
|
31
|
-
return resolvedCollections.map((collection): AdminCollection => {
|
|
32
|
-
const modifiedCollection = modifyCollection(collection);
|
|
33
|
-
if (modifiedCollection.childCollections) {
|
|
34
|
-
return {
|
|
35
|
-
...modifiedCollection,
|
|
36
|
-
childCollections: () => applyPluginModifyCollection(modifiedCollection.childCollections!() ?? [], modifyCollection)
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
return modifiedCollection;
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Auto-inject auth-specific entity actions and callbacks for collections
|
|
45
|
-
* with `auth: true` or `auth: { enabled: true }`.
|
|
46
|
-
*
|
|
47
|
-
* Injections:
|
|
48
|
-
* 1. **resetPasswordAction** — adds the entity action unless explicitly disabled,
|
|
49
|
-
* or unless the auth adapter reports no `adminPasswordReset` support. Custom
|
|
50
|
-
* adapters mount their own admin routes and may not implement
|
|
51
|
-
* `POST /admin/users/:userId/reset-password`; injecting the action anyway
|
|
52
|
-
* would show a button that can only ever 404.
|
|
53
|
-
* 2. **afterSave callback** — shows the `CreationResultDialog` when a new user
|
|
54
|
-
* is created with `invitationSent` or `temporaryPassword` in the response
|
|
55
|
-
*
|
|
56
|
-
* Skips injection if the collection already has the action/callback present.
|
|
57
|
-
*/
|
|
58
|
-
function injectAuthCollectionConfig(
|
|
59
|
-
collections: AdminCollection[],
|
|
60
|
-
adminPasswordResetSupported: boolean
|
|
61
|
-
): AdminCollection[] {
|
|
62
|
-
return collections.map((collection) => {
|
|
63
|
-
const authProp = collection.auth;
|
|
64
|
-
if (!authProp) return collection;
|
|
65
|
-
|
|
66
|
-
const isAuth = authProp === true || (typeof authProp === "object" && authProp.enabled === true);
|
|
67
|
-
if (!isAuth) return collection;
|
|
68
|
-
|
|
69
|
-
const authConfig: AuthCollectionConfig | undefined = typeof authProp === "object" ? authProp : undefined;
|
|
70
|
-
|
|
71
|
-
let result = collection;
|
|
72
|
-
|
|
73
|
-
// ─── Entity Action injection (resetPassword) ─────────────────────
|
|
74
|
-
const resetPref = authConfig?.actions?.resetPassword;
|
|
75
|
-
let actionToInject: EntityAction | undefined;
|
|
76
|
-
|
|
77
|
-
if (resetPref === false) {
|
|
78
|
-
actionToInject = undefined;
|
|
79
|
-
} else if (typeof resetPref === "object") {
|
|
80
|
-
// An explicitly supplied action is the collection author's own; they
|
|
81
|
-
// own its backend, so the adapter capability doesn't apply.
|
|
82
|
-
// `auth.actions.resetPassword`'s object form is an EntityAction; core
|
|
83
|
-
// types it as `object` because a server never renders one.
|
|
84
|
-
actionToInject = resetPref as EntityAction;
|
|
85
|
-
} else if (!adminPasswordResetSupported) {
|
|
86
|
-
actionToInject = undefined;
|
|
87
|
-
} else {
|
|
88
|
-
actionToInject = resetPasswordAction;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
if (actionToInject) {
|
|
92
|
-
const injectedAction = actionToInject;
|
|
93
|
-
const existing = result.entityActions ?? [];
|
|
94
|
-
// An entry is either the action or the key of an app-level one, and a
|
|
95
|
-
// collection that names `"reset_password"` already has this action — so
|
|
96
|
-
// the string form has to count here too, or the reset action is injected
|
|
97
|
-
// a second time and the user gets two identical buttons.
|
|
98
|
-
const alreadyHas = existing.some((a) =>
|
|
99
|
-
typeof a === "string"
|
|
100
|
-
? a === injectedAction.key
|
|
101
|
-
: a.key != null && a.key === injectedAction.key
|
|
102
|
-
);
|
|
103
|
-
if (!alreadyHas) {
|
|
104
|
-
result = {
|
|
105
|
-
...result,
|
|
106
|
-
entityActions: [...existing, injectedAction]
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// ─── afterSave callback (creation result dialog) ─────────────────
|
|
112
|
-
const existingAfterSave = result.callbacks?.afterSave;
|
|
113
|
-
result = {
|
|
114
|
-
...result,
|
|
115
|
-
callbacks: {
|
|
116
|
-
...result.callbacks,
|
|
117
|
-
afterSave: async (props) => {
|
|
118
|
-
await existingAfterSave?.(props);
|
|
119
|
-
|
|
120
|
-
const { values, status, context } = props;
|
|
121
|
-
if (status !== "new" && status !== "copy") return;
|
|
122
|
-
|
|
123
|
-
const hasCreationInfo = values.invitationSent !== undefined || values.temporaryPassword !== undefined;
|
|
124
|
-
if (!hasCreationInfo || !isRebaseContext(context) || !context.dialogsController) return;
|
|
125
|
-
|
|
126
|
-
const { dialogsController } = context;
|
|
127
|
-
|
|
128
|
-
const creationResult: UserCreationResult = {
|
|
129
|
-
user: {
|
|
130
|
-
uid: String(props.id),
|
|
131
|
-
email: typeof values.email === "string" ? values.email : "",
|
|
132
|
-
displayName: typeof values.displayName === "string" ? values.displayName : "",
|
|
133
|
-
roles: Array.isArray(values.roles) ? values.roles as string[] : [],
|
|
134
|
-
photoURL: typeof values.photoURL === "string"
|
|
135
|
-
? values.photoURL
|
|
136
|
-
: typeof values.photoUrl === "string"
|
|
137
|
-
? values.photoUrl
|
|
138
|
-
: null,
|
|
139
|
-
providerId: "password",
|
|
140
|
-
isAnonymous: false
|
|
141
|
-
},
|
|
142
|
-
invitationSent: !!values.invitationSent,
|
|
143
|
-
temporaryPassword: typeof values.temporaryPassword === "string" ? values.temporaryPassword : undefined,
|
|
144
|
-
emailDeliveryFailed: !!values.emailDeliveryFailed
|
|
145
|
-
};
|
|
146
|
-
|
|
147
|
-
const { closeDialog } = dialogsController.open({
|
|
148
|
-
key: "user_creation_result",
|
|
149
|
-
Component: () => (
|
|
150
|
-
React.createElement(CreationResultDialog, {
|
|
151
|
-
result: creationResult,
|
|
152
|
-
onClose: () => closeDialog()
|
|
153
|
-
})
|
|
154
|
-
)
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
};
|
|
159
|
-
|
|
160
|
-
return result;
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
export async function resolveCollections(
|
|
165
|
-
collections: undefined | AdminCollection[] | CollectionConfigsBuilder,
|
|
166
|
-
authController: AuthController,
|
|
167
|
-
data: RebaseData,
|
|
168
|
-
plugins: RebasePlugin[] | undefined
|
|
169
|
-
): Promise<AdminCollection[]> {
|
|
170
|
-
let resolvedCollections: AdminCollection[] = [];
|
|
171
|
-
if (typeof collections === "function") {
|
|
172
|
-
resolvedCollections = await collections({
|
|
173
|
-
user: authController.user,
|
|
174
|
-
authController,
|
|
175
|
-
data
|
|
176
|
-
});
|
|
177
|
-
} else if (Array.isArray(collections)) {
|
|
178
|
-
resolvedCollections = collections;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// Collections arrive in the authoring shape, with presentation nested under
|
|
182
|
-
// `admin`. Everything downstream — plugins, navigation, the drawer — reads the
|
|
183
|
-
// panel's flat view model, so `admin.group` or `admin.hideFromNavigation`
|
|
184
|
-
// would otherwise be silently ignored.
|
|
185
|
-
resolvedCollections = resolvedCollections.map(resolveAdminCollection);
|
|
186
|
-
|
|
187
|
-
if (plugins) {
|
|
188
|
-
for (const plugin of plugins) {
|
|
189
|
-
if (plugin.hooks?.modifyCollection) {
|
|
190
|
-
resolvedCollections = applyPluginModifyCollection(resolvedCollections, plugin.hooks.modifyCollection);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
if (plugin.hooks?.injectCollections) {
|
|
194
|
-
// A plugin may return collections in the authoring shape too; the
|
|
195
|
-
// flattening is idempotent, so re-running it is safe.
|
|
196
|
-
resolvedCollections = plugin.hooks.injectCollections(resolvedCollections).map(resolveAdminCollection);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
// Auto-inject auth entity actions and callbacks (resetPassword, creation dialog, etc.)
|
|
202
|
-
resolvedCollections = injectAuthCollectionConfig(
|
|
203
|
-
resolvedCollections,
|
|
204
|
-
authController.capabilities?.adminPasswordReset ?? true
|
|
205
|
-
);
|
|
206
|
-
|
|
207
|
-
resolvedCollections = filterOutNotAllowedCollections(resolvedCollections, authController);
|
|
208
|
-
return resolvedCollections;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
export async function resolveAppViews(
|
|
212
|
-
baseViews: AppView[] | AppViewsBuilder | undefined,
|
|
213
|
-
authController: AuthController,
|
|
214
|
-
data: RebaseData,
|
|
215
|
-
plugins?: RebasePlugin[]
|
|
216
|
-
): Promise<AppView[]> {
|
|
217
|
-
let resolvedViews: AppView[] = [];
|
|
218
|
-
if (typeof baseViews === "function") {
|
|
219
|
-
resolvedViews = await baseViews({
|
|
220
|
-
user: authController.user,
|
|
221
|
-
authController,
|
|
222
|
-
data
|
|
223
|
-
}) ?? [];
|
|
224
|
-
} else if (Array.isArray(baseViews)) {
|
|
225
|
-
resolvedViews = baseViews;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
// Inject views from plugins
|
|
229
|
-
if (plugins) {
|
|
230
|
-
for (const plugin of plugins) {
|
|
231
|
-
if (plugin.views && plugin.views.length > 0) {
|
|
232
|
-
resolvedViews = [...resolvedViews, ...plugin.views];
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
// Detect duplicate view slugs (dev warning)
|
|
238
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
239
|
-
const slugCounts = new Map<string, number>();
|
|
240
|
-
resolvedViews.forEach(v => {
|
|
241
|
-
slugCounts.set(v.slug, (slugCounts.get(v.slug) ?? 0) + 1);
|
|
242
|
-
});
|
|
243
|
-
slugCounts.forEach((count, slug) => {
|
|
244
|
-
if (count > 1) {
|
|
245
|
-
console.warn(
|
|
246
|
-
`[Rebase] Duplicate view slug "${slug}" detected (${count} views). ` +
|
|
247
|
-
`Last-write-wins. Ensure unique slugs across admin views and plugins.`
|
|
248
|
-
);
|
|
249
|
-
}
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
// Filter by roles — applies to admin, plugin, and builder-returned views
|
|
254
|
-
resolvedViews = filterViewsByRole(resolvedViews, authController);
|
|
255
|
-
|
|
256
|
-
return resolvedViews;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
/**
|
|
260
|
-
* Filter views by the `roles` field on AppView.
|
|
261
|
-
* When `roles` is set, the view is only included if the current user
|
|
262
|
-
* has at least one of the listed roles. Views without `roles` (or with
|
|
263
|
-
* an empty array) are always included.
|
|
264
|
-
*/
|
|
265
|
-
function filterViewsByRole(views: AppView[], authController: AuthController): AppView[] {
|
|
266
|
-
const userRoles = authController.user?.roles ?? [];
|
|
267
|
-
return views.filter(view => {
|
|
268
|
-
if (!view.roles || view.roles.length === 0) return true;
|
|
269
|
-
return view.roles.some(role => userRoles.includes(role));
|
|
270
|
-
});
|
|
271
|
-
}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import type { RebasePlugin, AdminCollection } from "@rebasepro/cms-types";
|
|
3
|
-
import { useRef, useMemo } from "react";
|
|
4
|
-
|
|
5
|
-
import { CollectionRegistryController, RebaseData, User } from "@rebasepro/types";
|
|
6
|
-
import { AuthController } from "@rebasepro/cms-types";
|
|
7
|
-
import type { CollectionConfigsBuilder } from "@rebasepro/cms-types";
|
|
8
|
-
import { CollectionRegistry } from "@rebasepro/common";
|
|
9
|
-
|
|
10
|
-
import { resolveCollections } from "./useNavigationResolution";
|
|
11
|
-
import { areCollectionListsEqual } from "./utils";
|
|
12
|
-
import { useAsyncResolver } from "./useAsyncResolver";
|
|
13
|
-
|
|
14
|
-
export type UseResolvedCollectionsProps<EC extends AdminCollection, USER extends User> = {
|
|
15
|
-
authController: AuthController<USER>;
|
|
16
|
-
collections?: EC[] | CollectionConfigsBuilder<EC>;
|
|
17
|
-
data: RebaseData;
|
|
18
|
-
plugins?: RebasePlugin[];
|
|
19
|
-
disabled?: boolean;
|
|
20
|
-
collectionRegistryController: CollectionRegistryController<EC> & { collectionRegistryRef: React.MutableRefObject<CollectionRegistry> };
|
|
21
|
-
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
export type UseResolvedCollectionsResult = {
|
|
25
|
-
collections: AdminCollection[];
|
|
26
|
-
loading: boolean;
|
|
27
|
-
error: Error | undefined;
|
|
28
|
-
refresh: () => void;
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Hook that resolves collection props (which may be async builders or arrays)
|
|
33
|
-
* into concrete AdminCollection[], and registers them with the CollectionRegistry.
|
|
34
|
-
*
|
|
35
|
-
* When userManagement is provided, the default users collection is always
|
|
36
|
-
* prepended. Developer collections override via generic slug-based dedup
|
|
37
|
-
* (Map keyed by slug, last-write-wins). No hardcoded string checks.
|
|
38
|
-
*
|
|
39
|
-
* Uses refs for potentially-unstable dependencies (driver, authController,
|
|
40
|
-
* plugins) to avoid re-triggering effects when their object identity changes.
|
|
41
|
-
*/
|
|
42
|
-
export function useResolvedCollections<EC extends AdminCollection, USER extends User>(
|
|
43
|
-
props: UseResolvedCollectionsProps<EC, USER>
|
|
44
|
-
): UseResolvedCollectionsResult {
|
|
45
|
-
|
|
46
|
-
const {
|
|
47
|
-
authController,
|
|
48
|
-
collections: collectionsProp,
|
|
49
|
-
data,
|
|
50
|
-
plugins,
|
|
51
|
-
disabled,
|
|
52
|
-
collectionRegistryController
|
|
53
|
-
} = props;
|
|
54
|
-
|
|
55
|
-
// Stable identity string for the user — avoids re-triggering when the
|
|
56
|
-
// authController object reference changes but uid/roles are the same.
|
|
57
|
-
const userIdentity = authController.user
|
|
58
|
-
? `${authController.user.uid}:${(authController.user.roles ?? []).sort().join(',')}`
|
|
59
|
-
: null;
|
|
60
|
-
|
|
61
|
-
// Use refs for values that may be new objects each render but shouldn't
|
|
62
|
-
// re-trigger the effect. The effect reads them at execution time.
|
|
63
|
-
const dataRef = useRef(data);
|
|
64
|
-
dataRef.current = data;
|
|
65
|
-
const authControllerRef = useRef(authController);
|
|
66
|
-
authControllerRef.current = authController;
|
|
67
|
-
const pluginsRef = useRef(plugins);
|
|
68
|
-
pluginsRef.current = plugins;
|
|
69
|
-
|
|
70
|
-
const { data: collections, loading, error, refresh } = useAsyncResolver<AdminCollection[]>({
|
|
71
|
-
resolver: async () => {
|
|
72
|
-
const resolved = await resolveCollections(
|
|
73
|
-
collectionsProp,
|
|
74
|
-
authControllerRef.current,
|
|
75
|
-
dataRef.current,
|
|
76
|
-
pluginsRef.current
|
|
77
|
-
);
|
|
78
|
-
|
|
79
|
-
const deduped = [...resolved];
|
|
80
|
-
|
|
81
|
-
// Register with the CollectionRegistry; returns true if changed
|
|
82
|
-
const changed = collectionRegistryController.collectionRegistryRef.current.registerMultiple(deduped);
|
|
83
|
-
|
|
84
|
-
if (changed) {
|
|
85
|
-
console.debug("Collections have changed", deduped);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
return deduped;
|
|
89
|
-
},
|
|
90
|
-
initialValue: [],
|
|
91
|
-
isEqual: areCollectionListsEqual,
|
|
92
|
-
deps: [collectionsProp, userIdentity, disabled],
|
|
93
|
-
disabled: disabled || authController.initialLoading,
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
return useMemo(() => ({
|
|
97
|
-
collections,
|
|
98
|
-
loading,
|
|
99
|
-
error,
|
|
100
|
-
refresh
|
|
101
|
-
}), [collections, loading, error, refresh]);
|
|
102
|
-
}
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import type { EffectiveRoleController } from "@rebasepro/types";
|
|
3
|
-
import type { AppView, AppViewsBuilder, RebasePlugin } from "@rebasepro/cms-types";
|
|
4
|
-
import { useMemo, useRef } from "react";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Compare two view arrays by their slug identity.
|
|
8
|
-
* Returns true when the sets of slugs are identical (same order, same values).
|
|
9
|
-
* This avoids deepEqual on React elements, which have unstable internal refs.
|
|
10
|
-
*/
|
|
11
|
-
function viewSlugsEqual(a: AppView[] | undefined, b: AppView[] | undefined): boolean {
|
|
12
|
-
if (a === b) return true;
|
|
13
|
-
if (!a || !b) return false;
|
|
14
|
-
if (a.length !== b.length) return false;
|
|
15
|
-
for (let i = 0; i < a.length; i++) {
|
|
16
|
-
if (a[i].slug !== b[i].slug) return false;
|
|
17
|
-
}
|
|
18
|
-
return true;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
import type { RebaseData, User } from "@rebasepro/types";
|
|
22
|
-
import type { AuthController } from "@rebasepro/cms-types";
|
|
23
|
-
|
|
24
|
-
import { resolveAppViews } from "./useNavigationResolution";
|
|
25
|
-
import { useAsyncResolver } from "./useAsyncResolver";
|
|
26
|
-
|
|
27
|
-
export type UseResolvedViewsProps<USER extends User> = {
|
|
28
|
-
authController: AuthController<USER>;
|
|
29
|
-
views?: AppView[] | AppViewsBuilder;
|
|
30
|
-
adminViews?: AppView[] | AppViewsBuilder;
|
|
31
|
-
data: RebaseData;
|
|
32
|
-
plugins?: RebasePlugin[];
|
|
33
|
-
adminMode?: "cms" | "studio" | "settings";
|
|
34
|
-
effectiveRoleController?: EffectiveRoleController;
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
export type UseResolvedViewsResult = {
|
|
38
|
-
views: AppView[] | undefined;
|
|
39
|
-
adminViews: AppView[] | undefined;
|
|
40
|
-
loading: boolean;
|
|
41
|
-
error: Error | undefined;
|
|
42
|
-
refresh: () => void;
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Combined result type for the async resolver — holds both views and
|
|
47
|
-
* adminViews so they can be resolved together in a single async call.
|
|
48
|
-
*/
|
|
49
|
-
type ResolvedViewsData = {
|
|
50
|
-
views: AppView[] | undefined;
|
|
51
|
-
adminViews: AppView[] | undefined;
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Equality check for the combined views data.
|
|
56
|
-
* Compares both views and adminViews by slug identity.
|
|
57
|
-
*/
|
|
58
|
-
function areResolvedViewsEqual(a: ResolvedViewsData, b: ResolvedViewsData): boolean {
|
|
59
|
-
return viewSlugsEqual(a.views, b.views) && viewSlugsEqual(a.adminViews, b.adminViews);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Hook that resolves view and admin view props (which may be async builders or arrays)
|
|
64
|
-
* into concrete AppView[].
|
|
65
|
-
*
|
|
66
|
-
* Uses refs for potentially-unstable dependencies (driver, authController,
|
|
67
|
-
* plugins) to avoid re-triggering effects when their object identity changes.
|
|
68
|
-
*/
|
|
69
|
-
export function useResolvedViews<USER extends User>(
|
|
70
|
-
props: UseResolvedViewsProps<USER>
|
|
71
|
-
): UseResolvedViewsResult {
|
|
72
|
-
|
|
73
|
-
const {
|
|
74
|
-
authController,
|
|
75
|
-
views: viewsProp,
|
|
76
|
-
adminViews: adminViewsProp,
|
|
77
|
-
data,
|
|
78
|
-
plugins,
|
|
79
|
-
adminMode = "cms",
|
|
80
|
-
effectiveRoleController
|
|
81
|
-
} = props;
|
|
82
|
-
|
|
83
|
-
// Stable identity string for the user — avoids re-triggering when the
|
|
84
|
-
// authController object reference changes but uid/roles are the same.
|
|
85
|
-
const userIdentity = authController.user
|
|
86
|
-
? `${authController.user.uid}:${(authController.user.roles ?? []).sort().join(',')}`
|
|
87
|
-
: null;
|
|
88
|
-
|
|
89
|
-
// Use refs for values that may be new objects each render but shouldn't
|
|
90
|
-
// re-trigger the effect. The effect reads them at execution time.
|
|
91
|
-
const dataRef = useRef(data);
|
|
92
|
-
dataRef.current = data;
|
|
93
|
-
const authControllerRef = useRef(authController);
|
|
94
|
-
authControllerRef.current = authController;
|
|
95
|
-
const pluginsRef = useRef(plugins);
|
|
96
|
-
pluginsRef.current = plugins;
|
|
97
|
-
|
|
98
|
-
// Build the resolved auth controller (with effective role override for studio mode)
|
|
99
|
-
const resolvedAuthController = useMemo(() => {
|
|
100
|
-
if (adminMode === "studio" && effectiveRoleController?.effectiveRole && authController.user) {
|
|
101
|
-
return {
|
|
102
|
-
...authController,
|
|
103
|
-
user: {
|
|
104
|
-
...authController.user,
|
|
105
|
-
roles: [effectiveRoleController.effectiveRole]
|
|
106
|
-
}
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
return authController;
|
|
110
|
-
}, [adminMode, effectiveRoleController?.effectiveRole, authController]);
|
|
111
|
-
|
|
112
|
-
// Store resolvedAuthController in a ref for effect access without re-triggering
|
|
113
|
-
const resolvedAuthControllerRef = useRef(resolvedAuthController);
|
|
114
|
-
resolvedAuthControllerRef.current = resolvedAuthController;
|
|
115
|
-
|
|
116
|
-
const initialLoading = resolvedAuthController.initialLoading;
|
|
117
|
-
|
|
118
|
-
const { data: resolvedData, loading, error, refresh } = useAsyncResolver<ResolvedViewsData>({
|
|
119
|
-
resolver: async () => {
|
|
120
|
-
const [newViews, newAdminViews] = await Promise.all([
|
|
121
|
-
resolveAppViews(viewsProp, resolvedAuthControllerRef.current, dataRef.current, pluginsRef.current),
|
|
122
|
-
resolveAppViews(adminViewsProp, resolvedAuthControllerRef.current, dataRef.current)
|
|
123
|
-
]);
|
|
124
|
-
return { views: newViews, adminViews: newAdminViews };
|
|
125
|
-
},
|
|
126
|
-
initialValue: { views: undefined, adminViews: undefined },
|
|
127
|
-
isEqual: areResolvedViewsEqual,
|
|
128
|
-
deps: [viewsProp, adminViewsProp, adminMode, userIdentity],
|
|
129
|
-
disabled: initialLoading,
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
return useMemo(() => ({
|
|
133
|
-
views: resolvedData.views,
|
|
134
|
-
adminViews: resolvedData.adminViews,
|
|
135
|
-
loading,
|
|
136
|
-
error,
|
|
137
|
-
refresh
|
|
138
|
-
}), [resolvedData, loading, error, refresh]);
|
|
139
|
-
}
|