@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,262 +0,0 @@
|
|
|
1
|
-
import type { AdminCollection, EntityDisplayRole } from "@rebasepro/cms-types";
|
|
2
|
-
import type { Entity, Property } from "@rebasepro/types";
|
|
3
|
-
import { ENTITY_DISPLAY_ROLES } from "@rebasepro/cms-types";
|
|
4
|
-
import { useEffect, useMemo, useSyncExternalStore } from "react";
|
|
5
|
-
import {
|
|
6
|
-
EntityDisplayCache,
|
|
7
|
-
entityDisplayKey,
|
|
8
|
-
getDisplayPropertyKey,
|
|
9
|
-
getDisplayResolver,
|
|
10
|
-
getPropertyInPath,
|
|
11
|
-
useRebaseContext
|
|
12
|
-
} from "@rebasepro/app";
|
|
13
|
-
import { getValueInPath } from "@rebasepro/utils";
|
|
14
|
-
|
|
15
|
-
import { getEntityTitlePropertyKeyForEntity, isUserSelectProperty, resolveTitleToString } from "../util/previews";
|
|
16
|
-
import { getUserLabel, useResolvedUser } from "./useResolvedUsers";
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* What fills one display role for one record.
|
|
20
|
-
*
|
|
21
|
-
* `value` is `undefined` rather than a placeholder when nothing resolved,
|
|
22
|
-
* because the substitute differs by surface and each one knows its own better
|
|
23
|
-
* than this hook does: a page heading wants the singular collection name, a link
|
|
24
|
-
* wants the id, a draft wants "New customer". A single baked-in fallback is
|
|
25
|
-
* exactly what produced three different ones scattered across the consumers.
|
|
26
|
-
*/
|
|
27
|
-
export interface ResolvedDisplayValue<T = unknown> {
|
|
28
|
-
/** What goes in the slot. `undefined` when the record has nothing for it. */
|
|
29
|
-
value: T | undefined;
|
|
30
|
-
/**
|
|
31
|
-
* A resolver is in flight, and `value` currently holds the derived answer or
|
|
32
|
-
* nothing. Surfaces that can show a skeleton may; none has to.
|
|
33
|
-
*/
|
|
34
|
-
loading: boolean;
|
|
35
|
-
/**
|
|
36
|
-
* Set only when the value came from a property of this collection. Carries
|
|
37
|
-
* what a rich renderer needs — a status shows as its enum's coloured chip,
|
|
38
|
-
* an image as a storage thumbnail — which a bare resolved string cannot
|
|
39
|
-
* describe.
|
|
40
|
-
*/
|
|
41
|
-
source?: {
|
|
42
|
-
key: string;
|
|
43
|
-
property: Property | undefined;
|
|
44
|
-
value: unknown;
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* One shared store, so every surface agrees on a record and resolves it once.
|
|
50
|
-
*
|
|
51
|
-
* Module-level rather than a provider: two app instances on one page share a
|
|
52
|
-
* cache keyed by collection path and record id, which *is* the same record.
|
|
53
|
-
* Nothing here is user-specific — a resolver that reads per-user data must
|
|
54
|
-
* invalidate on sign-out, which {@link useEntityDisplayCache} exposes.
|
|
55
|
-
*/
|
|
56
|
-
let sharedCache: EntityDisplayCache | undefined;
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* The store behind {@link useEntityDisplay}, for invalidating after a write.
|
|
60
|
-
*
|
|
61
|
-
* Built on first use rather than at module scope. Importing a module should not
|
|
62
|
-
* construct anything: it runs during SSR where there is nothing to cache, and it
|
|
63
|
-
* made this module unimportable from any test that stubs `@rebasepro/app` —
|
|
64
|
-
* which several do, and which is a legitimate thing for them to do.
|
|
65
|
-
*/
|
|
66
|
-
export function useEntityDisplayCache(): EntityDisplayCache {
|
|
67
|
-
if (!sharedCache) sharedCache = new EntityDisplayCache();
|
|
68
|
-
return sharedCache;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export interface UseEntityDisplayParams<M extends Record<string, unknown>> {
|
|
72
|
-
/**
|
|
73
|
-
* Optional because several callers look the collection up in the registry by
|
|
74
|
-
* path and may not find it — a relation into a collection the panel does not
|
|
75
|
-
* register. A hook that could not be called until that succeeded would have
|
|
76
|
-
* to sit below an early return, which is not where hooks go.
|
|
77
|
-
*/
|
|
78
|
-
collection?: AdminCollection<M>;
|
|
79
|
-
/**
|
|
80
|
-
* The record. A resolver is handed the whole entity — its id and path are
|
|
81
|
-
* how it reaches anything the record does not carry — so a computed value is
|
|
82
|
-
* only available once there is an entity to compute it from.
|
|
83
|
-
*/
|
|
84
|
-
entity?: Entity<M>;
|
|
85
|
-
/**
|
|
86
|
-
* Values to read a declared path from when they are newer than the entity:
|
|
87
|
-
* the live form values while editing. Falls back to `entity.values`.
|
|
88
|
-
*/
|
|
89
|
-
values?: Record<string, unknown>;
|
|
90
|
-
/** Set false to skip resolver work entirely — a draft has nothing to show. */
|
|
91
|
-
enabled?: boolean;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* What fills one display role of one record.
|
|
96
|
-
*
|
|
97
|
-
* This is the only implementation. Before it there were seven for the title
|
|
98
|
-
* alone — the identity bar, the detail header, inline previews, reference cards,
|
|
99
|
-
* list slots, relation chips and the headless view — each re-deriving it from
|
|
100
|
-
* `collection.properties` and disagreeing about the answer.
|
|
101
|
-
*
|
|
102
|
-
* Resolution order, per role:
|
|
103
|
-
*
|
|
104
|
-
* 1. `admin.display[role]` as a **resolver** — awaited, cached per record and
|
|
105
|
-
* role, with the derived value showing meanwhile so nothing flickers empty.
|
|
106
|
-
* 2. `admin.display[role]` as a **property path** (or, for the title, the
|
|
107
|
-
* deprecated `titleProperty`).
|
|
108
|
-
* 3. The **derived** answer: for the title, the best-ranked property carrying a
|
|
109
|
-
* readable value; for the rest, today's per-role heuristics.
|
|
110
|
-
*
|
|
111
|
-
* A user-picker title resolves to the person behind the id, as it always did —
|
|
112
|
-
* that path is now here rather than in two of the seven.
|
|
113
|
-
*/
|
|
114
|
-
export function useEntityDisplay<T = unknown, M extends Record<string, unknown> = Record<string, unknown>>(
|
|
115
|
-
role: EntityDisplayRole,
|
|
116
|
-
{
|
|
117
|
-
collection,
|
|
118
|
-
entity,
|
|
119
|
-
values: valuesProp,
|
|
120
|
-
enabled = true
|
|
121
|
-
}: UseEntityDisplayParams<M>
|
|
122
|
-
): ResolvedDisplayValue<T> {
|
|
123
|
-
|
|
124
|
-
const context = useRebaseContext();
|
|
125
|
-
const cache = useEntityDisplayCache();
|
|
126
|
-
|
|
127
|
-
const values = valuesProp ?? entity?.values;
|
|
128
|
-
|
|
129
|
-
/* ---- the declared or derived key ------------------------------------- */
|
|
130
|
-
|
|
131
|
-
// The title is the one role with a ranking behind it: several candidates,
|
|
132
|
-
// best first, skipping the ones that hold nothing for *this* record. The
|
|
133
|
-
// others are a single declared or derived key.
|
|
134
|
-
const declaredKey = collection ? getDisplayPropertyKey(collection, role) : undefined;
|
|
135
|
-
const propertyKey = collection && role === "title" && !declaredKey
|
|
136
|
-
? getEntityTitlePropertyKeyForEntity(collection, values, entity?.id)
|
|
137
|
-
: declaredKey;
|
|
138
|
-
|
|
139
|
-
const rawValue = values && propertyKey ? getValueInPath(values, propertyKey) : undefined;
|
|
140
|
-
|
|
141
|
-
// A user picker stores an auth id and renders the person: resolved like a
|
|
142
|
-
// relation, and hooked unconditionally so the hook order never changes.
|
|
143
|
-
const titleUser = useResolvedUser(
|
|
144
|
-
collection && role === "title" && isUserSelectProperty(collection, propertyKey) && typeof rawValue === "string"
|
|
145
|
-
? rawValue
|
|
146
|
-
: undefined
|
|
147
|
-
);
|
|
148
|
-
|
|
149
|
-
const derived = useMemo<T | undefined>(() => {
|
|
150
|
-
if (titleUser) return getUserLabel(titleUser) as T;
|
|
151
|
-
if (rawValue === undefined || rawValue === null) return undefined;
|
|
152
|
-
// Only text roles get flattened to a string; a date stays a date and an
|
|
153
|
-
// image stays whatever the storage property holds, so the renderer can
|
|
154
|
-
// still format them.
|
|
155
|
-
if (role === "title" || role === "subtitle" || role === "status") {
|
|
156
|
-
return (resolveTitleToString(rawValue) || undefined) as T | undefined;
|
|
157
|
-
}
|
|
158
|
-
return rawValue as T;
|
|
159
|
-
}, [titleUser, rawValue, role]);
|
|
160
|
-
|
|
161
|
-
/* ---- the computed answer --------------------------------------------- */
|
|
162
|
-
|
|
163
|
-
const resolver = collection ? getDisplayResolver(collection, role) : undefined;
|
|
164
|
-
const canResolve = Boolean(enabled && resolver && entity);
|
|
165
|
-
const key = entity ? entityDisplayKey(entity.path, entity.id, role) : undefined;
|
|
166
|
-
|
|
167
|
-
const resolved = useSyncExternalStore<unknown>(
|
|
168
|
-
// Subscribing unconditionally keeps the hook order stable. The store
|
|
169
|
-
// only notifies when an entry changes, so a collection with no resolver
|
|
170
|
-
// never re-renders from it.
|
|
171
|
-
cb => cache.subscribe(cb),
|
|
172
|
-
() => (canResolve && key ? cache.peek(key) : undefined),
|
|
173
|
-
// Server render: nothing is resolved, so every slot starts at its
|
|
174
|
-
// fallback and hydration does not disagree with the markup.
|
|
175
|
-
() => undefined
|
|
176
|
-
);
|
|
177
|
-
|
|
178
|
-
const loading = Boolean(canResolve && key && resolved === undefined);
|
|
179
|
-
|
|
180
|
-
useEffect(() => {
|
|
181
|
-
if (!canResolve || !key || !resolver || !entity) return;
|
|
182
|
-
if (cache.peek(key) !== undefined) return;
|
|
183
|
-
cache.resolve(key, () => resolver({
|
|
184
|
-
entity,
|
|
185
|
-
context
|
|
186
|
-
})).catch(() => {
|
|
187
|
-
// Unreachable, and kept only so it stays that way: `resolve` records a
|
|
188
|
-
// failure as "nothing" and returns a RESOLVED promise, which is why
|
|
189
|
-
// the warning that used to live here could never run — see the note on
|
|
190
|
-
// `EntityDisplayCache.resolve`. The cache reports the failure itself
|
|
191
|
-
// now, once per key. This exists so that if `resolve` ever starts
|
|
192
|
-
// rejecting, it surfaces as a caught no-op rather than an unhandled
|
|
193
|
-
// rejection during render.
|
|
194
|
-
});
|
|
195
|
-
}, [cache, canResolve, key, resolver, entity, context, role]);
|
|
196
|
-
|
|
197
|
-
/* ---- the answer ------------------------------------------------------ */
|
|
198
|
-
|
|
199
|
-
// A resolver that produced nothing falls back to the derived value rather
|
|
200
|
-
// than to blank: it said this record has no computed answer for the role,
|
|
201
|
-
// not that the role should be empty.
|
|
202
|
-
const computed = canResolve && resolved !== null ? resolved as T | undefined : undefined;
|
|
203
|
-
const value = computed ?? derived;
|
|
204
|
-
|
|
205
|
-
return useMemo(() => ({
|
|
206
|
-
value,
|
|
207
|
-
loading,
|
|
208
|
-
source: collection && propertyKey && value === derived && derived !== undefined
|
|
209
|
-
? {
|
|
210
|
-
key: propertyKey,
|
|
211
|
-
property: getPropertyInPath(collection.properties, propertyKey),
|
|
212
|
-
value: rawValue
|
|
213
|
-
}
|
|
214
|
-
: undefined
|
|
215
|
-
}), [value, loading, propertyKey, derived, collection, rawValue]);
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* Every display role of a record at once — what a list row, a card or a board
|
|
220
|
-
* card needs, in one call rather than six.
|
|
221
|
-
*
|
|
222
|
-
* The role list is iterated from {@link ENTITY_DISPLAY_ROLES} so the hook order
|
|
223
|
-
* is fixed and adding a role does not mean editing every caller.
|
|
224
|
-
*/
|
|
225
|
-
export function useEntityDisplayValues<M extends Record<string, unknown>>(
|
|
226
|
-
params: UseEntityDisplayParams<M>
|
|
227
|
-
): Record<EntityDisplayRole, ResolvedDisplayValue> & { loading: boolean } {
|
|
228
|
-
|
|
229
|
-
// Not a loop over `useEntityDisplay`: the number of hooks a component calls
|
|
230
|
-
// has to be fixed at compile time, and a role added to the array later would
|
|
231
|
-
// silently change it. Written out, it is checked by the return type.
|
|
232
|
-
const title = useEntityDisplay<string, M>("title", params);
|
|
233
|
-
const subtitle = useEntityDisplay<string, M>("subtitle", params);
|
|
234
|
-
const image = useEntityDisplay<string, M>("image", params);
|
|
235
|
-
const status = useEntityDisplay<string, M>("status", params);
|
|
236
|
-
const date = useEntityDisplay<Date | string | number, M>("date", params);
|
|
237
|
-
const tags = useEntityDisplay<string[] | string, M>("tags", params);
|
|
238
|
-
|
|
239
|
-
return useMemo(() => ({
|
|
240
|
-
title,
|
|
241
|
-
subtitle,
|
|
242
|
-
image,
|
|
243
|
-
status,
|
|
244
|
-
date,
|
|
245
|
-
tags,
|
|
246
|
-
loading: title.loading || subtitle.loading || image.loading
|
|
247
|
-
|| status.loading || date.loading || tags.loading
|
|
248
|
-
}), [title, subtitle, image, status, date, tags]);
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* What the record is called — the one role asked for often enough on its own to
|
|
253
|
-
* deserve a name.
|
|
254
|
-
*/
|
|
255
|
-
export function useEntityTitle<M extends Record<string, unknown>>(
|
|
256
|
-
params: UseEntityDisplayParams<M>
|
|
257
|
-
): ResolvedDisplayValue<string> {
|
|
258
|
-
return useEntityDisplay<string, M>("title", params);
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
/** Re-exported so a caller can iterate roles without reaching into types. */
|
|
262
|
-
export { ENTITY_DISPLAY_ROLES };
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import type { AdminCollection } from "@rebasepro/cms-types";
|
|
2
|
-
import type { Entity, EntityStatus } from "@rebasepro/types";
|
|
3
|
-
import { useEntityTitle } from "./useEntityDisplay";
|
|
4
|
-
|
|
5
|
-
export interface UseEntityDisplayTitleParams<M extends Record<string, unknown>> {
|
|
6
|
-
collection: AdminCollection<M>;
|
|
7
|
-
/** The record. Needed for a computed title; see {@link useEntityTitle}. */
|
|
8
|
-
entity?: Entity<M>;
|
|
9
|
-
/** Live form values, when they are ahead of the entity. */
|
|
10
|
-
values?: Record<string, unknown>;
|
|
11
|
-
status: EntityStatus;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* The heading for a record: the identity bar and the breadcrumb.
|
|
16
|
-
*
|
|
17
|
-
* Everything about *what a record is called* lives in {@link useEntityTitle}.
|
|
18
|
-
* What is left here is the heading's own two rules, which are presentation, not
|
|
19
|
-
* identity:
|
|
20
|
-
*
|
|
21
|
-
* The guard on `status` is the first. The title resolver returns the first
|
|
22
|
-
* candidate carrying a value, and on a brand new entity the only values are the
|
|
23
|
-
* property defaults — so creating a blog post opened a page headed **draft**,
|
|
24
|
-
* the default of its `status` enum. A record that does not exist yet has no
|
|
25
|
-
* name; it has an intent.
|
|
26
|
-
*
|
|
27
|
-
* The fallback is the second. A page needs a heading even when the record has
|
|
28
|
-
* nothing readable in it, and the honest one is what kind of thing it is.
|
|
29
|
-
*/
|
|
30
|
-
export function useEntityDisplayTitle<M extends Record<string, unknown>>({
|
|
31
|
-
collection,
|
|
32
|
-
entity,
|
|
33
|
-
values,
|
|
34
|
-
status
|
|
35
|
-
}: UseEntityDisplayTitleParams<M>): string {
|
|
36
|
-
|
|
37
|
-
const isNew = status === "new";
|
|
38
|
-
const singular = collection.singularName ?? collection.name;
|
|
39
|
-
|
|
40
|
-
const { value: title } = useEntityTitle<M>({
|
|
41
|
-
collection,
|
|
42
|
-
entity,
|
|
43
|
-
values,
|
|
44
|
-
enabled: !isNew
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
if (isNew) return `New ${singular.toLowerCase()}`;
|
|
48
|
-
return title ?? singular;
|
|
49
|
-
}
|
package/src/hooks/useHistory.ts
DELETED
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
import { useCallback, useEffect, useRef, useState, useMemo } from "react";
|
|
2
|
-
import { useApiBase, useApiConfig } from "@rebasepro/app";
|
|
3
|
-
import type { EntityHistoryEntry } from "@rebasepro/types";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* What the history REST endpoint returns. The fourth declaration of this shape
|
|
7
|
-
* — the two drivers had one each and disagreed on `updated_at` — now an alias
|
|
8
|
-
* of the one in `@rebasepro/types`.
|
|
9
|
-
*/
|
|
10
|
-
export type HistoryEntryData = EntityHistoryEntry;
|
|
11
|
-
|
|
12
|
-
export interface UseEntityHistoryResult {
|
|
13
|
-
entries: HistoryEntryData[];
|
|
14
|
-
total: number;
|
|
15
|
-
isLoading: boolean;
|
|
16
|
-
hasMore: boolean;
|
|
17
|
-
error?: Error;
|
|
18
|
-
loadMore: () => void;
|
|
19
|
-
revert: (historyId: string) => Promise<Record<string, unknown>>;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Hook to fetch entity history from the backend REST API.
|
|
24
|
-
* Replaces the old subcollection-based approach with a proper API call.
|
|
25
|
-
*/
|
|
26
|
-
export function useHistory(params: {
|
|
27
|
-
slug: string;
|
|
28
|
-
entityId: string | number | undefined;
|
|
29
|
-
enabled?: boolean;
|
|
30
|
-
pageSize?: number;
|
|
31
|
-
/**
|
|
32
|
-
* Bumped by the caller when the record is saved. A save is the one event
|
|
33
|
-
* that adds a revision, and nothing else here would notice it: without
|
|
34
|
-
* this the open panel keeps showing the list it fetched when it opened,
|
|
35
|
-
* so the revision you just created never appears.
|
|
36
|
-
*/
|
|
37
|
-
refreshToken?: number;
|
|
38
|
-
}): UseEntityHistoryResult {
|
|
39
|
-
const { slug, entityId, enabled = true, pageSize = 10, refreshToken } = params;
|
|
40
|
-
const apiConfig = useApiConfig();
|
|
41
|
-
const apiBase = useApiBase();
|
|
42
|
-
|
|
43
|
-
const [entries, setEntries] = useState<HistoryEntryData[]>([]);
|
|
44
|
-
const [total, setTotal] = useState(0);
|
|
45
|
-
const [isLoading, setIsLoading] = useState(false);
|
|
46
|
-
const [hasMore, setHasMore] = useState(true);
|
|
47
|
-
const [error, setError] = useState<Error | undefined>();
|
|
48
|
-
const [offset, setOffset] = useState(0);
|
|
49
|
-
const [refreshTrigger, setRefreshTrigger] = useState(0);
|
|
50
|
-
|
|
51
|
-
// Track the current entity identity so we can detect stale responses.
|
|
52
|
-
// `refreshToken` is part of the identity on purpose: a save makes the list
|
|
53
|
-
// we are holding a stale page of a longer list, which is the same problem
|
|
54
|
-
// as having moved to a different record.
|
|
55
|
-
const entityKey = `${slug}/${entityId}/${refreshToken ?? 0}`;
|
|
56
|
-
const currentEntityRef = useRef<string | undefined>(undefined);
|
|
57
|
-
|
|
58
|
-
const fetchEntries = useCallback(async (
|
|
59
|
-
currentOffset: number,
|
|
60
|
-
signal?: AbortSignal
|
|
61
|
-
) => {
|
|
62
|
-
if (!apiConfig?.apiUrl || !entityId || !enabled) return;
|
|
63
|
-
|
|
64
|
-
setIsLoading(true);
|
|
65
|
-
setError(undefined);
|
|
66
|
-
|
|
67
|
-
try {
|
|
68
|
-
const token = await apiConfig.getAuthToken?.();
|
|
69
|
-
const headers: Record<string, string> = {
|
|
70
|
-
"Content-Type": "application/json"
|
|
71
|
-
};
|
|
72
|
-
if (token) headers["Authorization"] = `Bearer ${token}`;
|
|
73
|
-
|
|
74
|
-
const url = `${apiBase}/data/${slug}/${entityId}/history?limit=${pageSize}&offset=${currentOffset}`;
|
|
75
|
-
const response = await fetch(url, { headers,
|
|
76
|
-
signal });
|
|
77
|
-
|
|
78
|
-
// Check if the request was aborted or the entity changed while in-flight
|
|
79
|
-
if (signal?.aborted) return;
|
|
80
|
-
if (currentEntityRef.current !== entityKey) return;
|
|
81
|
-
|
|
82
|
-
if (!response.ok) {
|
|
83
|
-
const errorData = await response.json().catch(() => ({ error: { message: response.statusText } }));
|
|
84
|
-
throw new Error(errorData.error?.message || `Failed to fetch history (${response.status})`);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
const result = await response.json();
|
|
88
|
-
|
|
89
|
-
if (currentOffset === 0) {
|
|
90
|
-
setEntries(result.data);
|
|
91
|
-
} else {
|
|
92
|
-
setEntries(prev => [...prev, ...result.data]);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
setTotal(result.meta.total);
|
|
96
|
-
setHasMore(result.meta.hasMore);
|
|
97
|
-
} catch (err) {
|
|
98
|
-
// Don't set error state for intentional aborts
|
|
99
|
-
if (err instanceof DOMException && err.name === "AbortError") return;
|
|
100
|
-
setError(err instanceof Error ? err : new Error(String(err)));
|
|
101
|
-
} finally {
|
|
102
|
-
setIsLoading(false);
|
|
103
|
-
}
|
|
104
|
-
}, [apiConfig, apiBase, slug, entityId, entityKey, enabled, pageSize]);
|
|
105
|
-
|
|
106
|
-
// Single unified effect: reset state when entity changes, fetch when offset changes.
|
|
107
|
-
// Uses AbortController to cancel stale requests on entity change or unmount.
|
|
108
|
-
useEffect(() => {
|
|
109
|
-
const isNewEntity = currentEntityRef.current !== entityKey;
|
|
110
|
-
|
|
111
|
-
if (isNewEntity) {
|
|
112
|
-
// Reset state for new entity
|
|
113
|
-
currentEntityRef.current = entityKey;
|
|
114
|
-
setEntries([]);
|
|
115
|
-
setTotal(0);
|
|
116
|
-
setHasMore(true);
|
|
117
|
-
setOffset(0);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
if (!enabled || !entityId) return;
|
|
121
|
-
|
|
122
|
-
const abortController = new AbortController();
|
|
123
|
-
// When entity changed, always fetch from offset 0
|
|
124
|
-
const effectiveOffset = isNewEntity ? 0 : offset;
|
|
125
|
-
fetchEntries(effectiveOffset, abortController.signal);
|
|
126
|
-
|
|
127
|
-
return () => {
|
|
128
|
-
abortController.abort();
|
|
129
|
-
};
|
|
130
|
-
}, [fetchEntries, offset, enabled, entityId, entityKey, refreshTrigger]);
|
|
131
|
-
|
|
132
|
-
const loadMore = useCallback(() => {
|
|
133
|
-
if (!isLoading && hasMore && offset + entries.length < total) {
|
|
134
|
-
setOffset(prev => prev + pageSize);
|
|
135
|
-
}
|
|
136
|
-
}, [isLoading, hasMore, pageSize, offset, entries.length, total]);
|
|
137
|
-
|
|
138
|
-
const revert = useCallback(async (historyId: string): Promise<Record<string, unknown>> => {
|
|
139
|
-
if (!apiConfig?.apiUrl || !entityId) {
|
|
140
|
-
throw new Error("Cannot revert: missing API configuration or entity ID");
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
const token = await apiConfig.getAuthToken?.();
|
|
144
|
-
const headers: Record<string, string> = {
|
|
145
|
-
"Content-Type": "application/json"
|
|
146
|
-
};
|
|
147
|
-
if (token) headers["Authorization"] = `Bearer ${token}`;
|
|
148
|
-
|
|
149
|
-
const url = `${apiBase}/data/${slug}/${entityId}/history/${historyId}/revert`;
|
|
150
|
-
const response = await fetch(url, { method: "POST",
|
|
151
|
-
headers });
|
|
152
|
-
|
|
153
|
-
if (!response.ok) {
|
|
154
|
-
const errorData = await response.json().catch(() => ({ error: { message: response.statusText } }));
|
|
155
|
-
throw new Error(errorData.error?.message || `Failed to revert (${response.status})`);
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
const result = await response.json();
|
|
159
|
-
|
|
160
|
-
// Refresh the history list after revert by resetting the entity ref
|
|
161
|
-
// and triggering the effect.
|
|
162
|
-
currentEntityRef.current = undefined;
|
|
163
|
-
setRefreshTrigger(prev => prev + 1);
|
|
164
|
-
|
|
165
|
-
// Return the reverted entity data so callers can update the form
|
|
166
|
-
return result.data as Record<string, unknown>;
|
|
167
|
-
}, [apiConfig, apiBase, slug, entityId]);
|
|
168
|
-
|
|
169
|
-
return useMemo(() => ({
|
|
170
|
-
entries,
|
|
171
|
-
total,
|
|
172
|
-
isLoading,
|
|
173
|
-
hasMore,
|
|
174
|
-
error,
|
|
175
|
-
loadMore,
|
|
176
|
-
revert
|
|
177
|
-
}), [entries, total, isLoading, hasMore, error, loadMore, revert]);
|
|
178
|
-
}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import type { EntityAction, AdminCollection } from "@rebasepro/cms-types";
|
|
2
|
-
import type { Entity } from "@rebasepro/types";
|
|
3
|
-
import { useMemo } from "react";
|
|
4
|
-
import { useCustomizationController, usePermissions } from "@rebasepro/app";
|
|
5
|
-
import { copyEntityAction, deleteEntityAction, unlinkEntityAction } from "../components/common/default_entity_actions";
|
|
6
|
-
import { mergeEntityActions } from "../util/entity_actions";
|
|
7
|
-
import { resolveEntityAction } from "../util/resolutions";
|
|
8
|
-
import { useChildViewSource } from "./useChildViewSource";
|
|
9
|
-
|
|
10
|
-
export interface UseRecordActionsParams<M extends Record<string, unknown>> {
|
|
11
|
-
collection: AdminCollection<M>;
|
|
12
|
-
path: string;
|
|
13
|
-
entity?: Entity<M>;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* The actions you can perform *on* a record — copy, delete, and whatever the
|
|
18
|
-
* collection adds — resolved against the current user's permissions.
|
|
19
|
-
*
|
|
20
|
-
* Extracted from the form's footer so the identity bar can own them. They are
|
|
21
|
-
* not ways to leave the form, so they never belonged next to Save; putting them
|
|
22
|
-
* in the bar's overflow menu is what let the footer disappear instead of
|
|
23
|
-
* becoming a full-width strip holding two icon buttons.
|
|
24
|
-
*/
|
|
25
|
-
export function useRecordActions<M extends Record<string, unknown>>({
|
|
26
|
-
collection,
|
|
27
|
-
path,
|
|
28
|
-
entity
|
|
29
|
-
}: UseRecordActionsParams<M>): EntityAction[] {
|
|
30
|
-
|
|
31
|
-
const { canCreate, canDelete } = usePermissions();
|
|
32
|
-
const customizationController = useCustomizationController();
|
|
33
|
-
|
|
34
|
-
// Rows shared through a junction: the delete action here removes the link,
|
|
35
|
-
// because that is what the server does for this path.
|
|
36
|
-
const childViewSource = useChildViewSource(path);
|
|
37
|
-
const isLinkedChildView = childViewSource?.kind === "relation" && childViewSource.mode === "linked";
|
|
38
|
-
|
|
39
|
-
return useMemo((): EntityAction[] => {
|
|
40
|
-
const customEntityActions = (collection.entityActions ?? [])
|
|
41
|
-
.map(action => resolveEntityAction(action, customizationController.entityActions))
|
|
42
|
-
.filter(Boolean) as EntityAction[];
|
|
43
|
-
|
|
44
|
-
const createEnabled = canCreate(collection, path);
|
|
45
|
-
const deleteEnabled = entity ? canDelete(collection, path, entity) : false;
|
|
46
|
-
const disableActions = collection.disableDefaultActions ?? [];
|
|
47
|
-
|
|
48
|
-
const actions: EntityAction[] = [];
|
|
49
|
-
if (createEnabled && !disableActions.includes("copy"))
|
|
50
|
-
actions.push(copyEntityAction);
|
|
51
|
-
if (deleteEnabled && !disableActions.includes("delete"))
|
|
52
|
-
actions.push(isLinkedChildView ? unlinkEntityAction : deleteEntityAction);
|
|
53
|
-
|
|
54
|
-
const merged = customEntityActions.length
|
|
55
|
-
? mergeEntityActions(actions, customEntityActions)
|
|
56
|
-
: actions;
|
|
57
|
-
|
|
58
|
-
return merged.filter(a => a.includeInForm === undefined || a.includeInForm);
|
|
59
|
-
}, [
|
|
60
|
-
canCreate,
|
|
61
|
-
canDelete,
|
|
62
|
-
collection,
|
|
63
|
-
path,
|
|
64
|
-
customizationController.entityActions?.length,
|
|
65
|
-
entity,
|
|
66
|
-
collection.disableDefaultActions,
|
|
67
|
-
isLinkedChildView
|
|
68
|
-
]);
|
|
69
|
-
}
|