@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,170 +0,0 @@
|
|
|
1
|
-
import type { AdminCollection } from "@rebasepro/cms-types";
|
|
2
|
-
import type { Entity, Property } from "@rebasepro/types";
|
|
3
|
-
import React from "react";
|
|
4
|
-
import { Chip, cls, Typography } from "@rebasepro/ui";
|
|
5
|
-
|
|
6
|
-
import { useEntityDisplayValues } from "../hooks/useEntityDisplay";
|
|
7
|
-
import { PropertyPreview } from "../preview";
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* The roles whose property the read-only view takes out of its grid.
|
|
11
|
-
*
|
|
12
|
-
* A role rendered here and left in the grid prints the value twice, so the
|
|
13
|
-
* header's own rendering and this list have to agree — but the list is *not*
|
|
14
|
-
* simply "every role the header draws". Two are deliberately absent:
|
|
15
|
-
*
|
|
16
|
-
* `title`, because the heading above a record and a labelled field are not the
|
|
17
|
-
* same thing. `Order #` is a column with a name, a description and a format that
|
|
18
|
-
* someone reads the record to find; `ORD-2026-0043` sitting in the identity bar
|
|
19
|
-
* beside the breadcrumb is a label for the page. Removing the field because the
|
|
20
|
-
* page is named after it takes a value out of the record on the grounds that its
|
|
21
|
-
* text appears elsewhere, which is not a reason — a value in the database is
|
|
22
|
-
* shown.
|
|
23
|
-
*
|
|
24
|
-
* `date`, because the rail's record block already carries the timestamps, and a
|
|
25
|
-
* collection whose `date` role points at a business date — an order date, a due
|
|
26
|
-
* date — wants that field where it declared it.
|
|
27
|
-
*/
|
|
28
|
-
export const HEADER_DISPLAY_ROLES = ["subtitle", "image", "status", "tags"] as const;
|
|
29
|
-
|
|
30
|
-
export interface EntityDisplayHeaderProps<M extends Record<string, unknown>> {
|
|
31
|
-
entity: Entity<M>;
|
|
32
|
-
collection: AdminCollection<M>;
|
|
33
|
-
/**
|
|
34
|
-
* Render the title. Off when an identity bar above already shows it — which
|
|
35
|
-
* is every full-page use — and on inside a dialog that has no bar.
|
|
36
|
-
*/
|
|
37
|
-
showTitle?: boolean;
|
|
38
|
-
className?: string;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* What the record *is*, above the fields that say what it holds.
|
|
43
|
-
*
|
|
44
|
-
* A record's picture, name, state and labels are the things you opened the page
|
|
45
|
-
* to see; on the plain grid they were fields like any other, so an order's
|
|
46
|
-
* status sat in the second cell of the first row at the same size and weight as
|
|
47
|
-
* its shipping cost, and its tags were a wrapped list of grey text.
|
|
48
|
-
*
|
|
49
|
-
* Every role here comes from `admin.display` and nothing is derived except the
|
|
50
|
-
* title, which was already derived for the identity bar. A collection that
|
|
51
|
-
* declares no display block therefore gets no header at all rather than a
|
|
52
|
-
* heuristic guess at which of its enums is a "status" — the panel does not know
|
|
53
|
-
* what these records are, and a wrong guess here is louder than no guess.
|
|
54
|
-
*
|
|
55
|
-
* A role filled by a *property* renders through {@link PropertyPreview}, so a
|
|
56
|
-
* status keeps its enum's colour and an image stays a storage thumbnail. A role
|
|
57
|
-
* filled by a resolver has no property behind it and renders as what it
|
|
58
|
-
* returned.
|
|
59
|
-
*/
|
|
60
|
-
export function EntityDisplayHeader<M extends Record<string, unknown>>({
|
|
61
|
-
entity,
|
|
62
|
-
collection,
|
|
63
|
-
showTitle = false,
|
|
64
|
-
className
|
|
65
|
-
}: EntityDisplayHeaderProps<M>) {
|
|
66
|
-
|
|
67
|
-
const display = useEntityDisplayValues<M>({
|
|
68
|
-
collection,
|
|
69
|
-
entity
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
const title = showTitle ? asText(display.title.value) : undefined;
|
|
73
|
-
const subtitle = asText(display.subtitle.value);
|
|
74
|
-
const tags = asTags(display.tags.value);
|
|
75
|
-
|
|
76
|
-
const hasStatus = display.status.value !== undefined;
|
|
77
|
-
const hasImage = display.image.value !== undefined;
|
|
78
|
-
|
|
79
|
-
if (!title && !subtitle && !hasStatus && !hasImage && !tags.length) return null;
|
|
80
|
-
|
|
81
|
-
return (
|
|
82
|
-
<div className={cls("flex items-start gap-4 min-w-0", className)}>
|
|
83
|
-
|
|
84
|
-
{hasImage && (
|
|
85
|
-
<div className={"shrink-0 w-16 h-16 rounded-lg overflow-hidden flex items-center justify-center bg-surface-100 dark:bg-surface-800"}>
|
|
86
|
-
<RoleValue role={display.image} propertyFallback={
|
|
87
|
-
// A resolver's image is documented as a URL; a storage
|
|
88
|
-
// path only resolves when a property is behind it, which
|
|
89
|
-
// is what carries the storage source.
|
|
90
|
-
typeof display.image.value === "string"
|
|
91
|
-
? <img src={display.image.value}
|
|
92
|
-
alt={""}
|
|
93
|
-
className={"w-full h-full object-cover"}/>
|
|
94
|
-
: null
|
|
95
|
-
}/>
|
|
96
|
-
</div>
|
|
97
|
-
)}
|
|
98
|
-
|
|
99
|
-
<div className={"flex flex-col gap-1.5 min-w-0 flex-1"}>
|
|
100
|
-
|
|
101
|
-
{title && (
|
|
102
|
-
<Typography variant={"h5"} className={"min-w-0 truncate m-0"}>
|
|
103
|
-
{title}
|
|
104
|
-
</Typography>
|
|
105
|
-
)}
|
|
106
|
-
|
|
107
|
-
{subtitle && (
|
|
108
|
-
<Typography variant={"body2"}
|
|
109
|
-
color={"secondary"}
|
|
110
|
-
className={"min-w-0 m-0"}>
|
|
111
|
-
{subtitle}
|
|
112
|
-
</Typography>
|
|
113
|
-
)}
|
|
114
|
-
|
|
115
|
-
{(hasStatus || tags.length > 0) && (
|
|
116
|
-
<div className={"flex flex-wrap items-center gap-1.5"}>
|
|
117
|
-
{hasStatus && (
|
|
118
|
-
<RoleValue role={display.status} propertyFallback={
|
|
119
|
-
<Chip size={"small"}>{asText(display.status.value)}</Chip>
|
|
120
|
-
}/>
|
|
121
|
-
)}
|
|
122
|
-
{tags.map(tag => (
|
|
123
|
-
<Chip key={tag} size={"small"} outlined>{tag}</Chip>
|
|
124
|
-
))}
|
|
125
|
-
</div>
|
|
126
|
-
)}
|
|
127
|
-
</div>
|
|
128
|
-
</div>
|
|
129
|
-
);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* One resolved role, rendered richly when a property is behind it.
|
|
134
|
-
*
|
|
135
|
-
* `source` is set only when the value came from a property of this collection
|
|
136
|
-
* (see `useEntityDisplay`), and it carries what a rich rendering needs. Its
|
|
137
|
-
* absence is exactly the "this was computed" signal, and a computed value is a
|
|
138
|
-
* bare string with no property to describe it — hence the fallback.
|
|
139
|
-
*/
|
|
140
|
-
function RoleValue({
|
|
141
|
-
role,
|
|
142
|
-
propertyFallback
|
|
143
|
-
}: {
|
|
144
|
-
role: { value: unknown, source?: { key: string, property: Property | undefined, value: unknown } };
|
|
145
|
-
propertyFallback: React.ReactNode;
|
|
146
|
-
}) {
|
|
147
|
-
const source = role.source;
|
|
148
|
-
if (!source?.property) return <>{propertyFallback}</>;
|
|
149
|
-
return <PropertyPreview propertyKey={source.key}
|
|
150
|
-
value={source.value}
|
|
151
|
-
property={source.property}
|
|
152
|
-
hideLabel
|
|
153
|
-
size={"medium"}/>;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/** A role's value as a line of text, or nothing when it holds nothing to read. */
|
|
157
|
-
function asText(value: unknown): string | undefined {
|
|
158
|
-
if (value === undefined || value === null) return undefined;
|
|
159
|
-
const text = String(value).trim();
|
|
160
|
-
return text.length ? text : undefined;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
/** The `tags` role, which takes a single string as shorthand for one tag. */
|
|
164
|
-
function asTags(value: unknown): string[] {
|
|
165
|
-
if (value === undefined || value === null) return [];
|
|
166
|
-
const list = Array.isArray(value) ? value : [value];
|
|
167
|
-
return list
|
|
168
|
-
.map(entry => asText(entry))
|
|
169
|
-
.filter((entry): entry is string => Boolean(entry));
|
|
170
|
-
}
|
|
@@ -1,428 +0,0 @@
|
|
|
1
|
-
import type { AdminCollection } from "@rebasepro/cms-types";
|
|
2
|
-
import type { EntityStatus } from "@rebasepro/types";
|
|
3
|
-
import React, { useState } from "react";
|
|
4
|
-
import { Link } from "react-router";
|
|
5
|
-
import { useTranslation } from "@rebasepro/app";
|
|
6
|
-
import {
|
|
7
|
-
Button,
|
|
8
|
-
CheckIcon,
|
|
9
|
-
ChevronDownIcon,
|
|
10
|
-
cls,
|
|
11
|
-
CodeIcon,
|
|
12
|
-
CopyIcon,
|
|
13
|
-
defaultBorderMixin,
|
|
14
|
-
ExternalLinkIcon,
|
|
15
|
-
HistoryIcon,
|
|
16
|
-
IconButton,
|
|
17
|
-
iconSize,
|
|
18
|
-
LoadingButton,
|
|
19
|
-
ArrowLeftIcon,
|
|
20
|
-
Menu,
|
|
21
|
-
MenuItem,
|
|
22
|
-
MoreVerticalIcon,
|
|
23
|
-
Separator,
|
|
24
|
-
Tooltip,
|
|
25
|
-
Typography,
|
|
26
|
-
XIcon
|
|
27
|
-
} from "@rebasepro/ui";
|
|
28
|
-
|
|
29
|
-
export interface EntityIdentityBarProps {
|
|
30
|
-
/** Plural collection name, shown as the breadcrumb ahead of the title. */
|
|
31
|
-
collection: AdminCollection;
|
|
32
|
-
/**
|
|
33
|
-
* Where the breadcrumb points. Without it the collection name is inert text
|
|
34
|
-
* that still reads as a breadcrumb — worse than no breadcrumb at all, and
|
|
35
|
-
* the only way back once a layout drops its back arrow.
|
|
36
|
-
*
|
|
37
|
-
* Left unset by the overlays (side panel, dialog), where the collection is
|
|
38
|
-
* already underneath and navigating would dismiss the record instead.
|
|
39
|
-
*/
|
|
40
|
-
collectionUrl?: string;
|
|
41
|
-
/** Resolved record title, already guarded against showing a field default. */
|
|
42
|
-
title: string;
|
|
43
|
-
entityId?: string | number;
|
|
44
|
-
status: EntityStatus;
|
|
45
|
-
|
|
46
|
-
dirty: boolean;
|
|
47
|
-
saving: boolean;
|
|
48
|
-
/** Undefined hides the Save button — read-only views, or a custom form. */
|
|
49
|
-
onSave?: () => void;
|
|
50
|
-
onDiscard?: () => void;
|
|
51
|
-
saveDisabled?: boolean;
|
|
52
|
-
hasErrors?: boolean;
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Save and dismiss, for the side panel and the dialog where the dominant
|
|
56
|
-
* action is "done with this record" rather than "keep editing".
|
|
57
|
-
*/
|
|
58
|
-
onSaveAndClose?: () => void;
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Where {@link onSaveAndClose} is offered.
|
|
62
|
-
*
|
|
63
|
-
* `"button"` — its own filled button, and Save demotes to text. For the
|
|
64
|
-
* overlays, where you opened the record to do one thing to it and closing is
|
|
65
|
-
* the dominant intent.
|
|
66
|
-
*
|
|
67
|
-
* `"menu"` — a `▾` welded to the Save button. For the split, where the list
|
|
68
|
-
* is right there and `j`/`k` walk from record to record: there, saving and
|
|
69
|
-
* *staying* is the common case, so it keeps the filled button and dismissing
|
|
70
|
-
* is one step further in. The gesture still exists, so muscle memory carried
|
|
71
|
-
* over from the side panel finds it.
|
|
72
|
-
*/
|
|
73
|
-
saveAndClosePlacement?: "button" | "menu";
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Dismiss this record, from the ✕ at the bar's trailing edge.
|
|
77
|
-
*
|
|
78
|
-
* Fenced off from Save by a separator: it is chrome, not the last item in
|
|
79
|
-
* the action row. The panel that supplies it decides what dismissing means —
|
|
80
|
-
* in the split it is a navigation, which the layout's unsaved-changes
|
|
81
|
-
* blocker already guards, so the ✕ cannot drop an edit without asking.
|
|
82
|
-
*/
|
|
83
|
-
onClose?: () => void;
|
|
84
|
-
|
|
85
|
-
onBack?: () => void;
|
|
86
|
-
onInspect?: () => void;
|
|
87
|
-
/** Opens the inspector straight on its history tab. */
|
|
88
|
-
onViewHistory?: () => void;
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Where this record appears on the live site, from `entityLinkBuilder`.
|
|
92
|
-
*
|
|
93
|
-
* Here rather than above the record, where it used to be a single unlabelled
|
|
94
|
-
* icon alone on its own right-aligned row — the only thing between the bar
|
|
95
|
-
* and the first field, and the only control in the view that did not say
|
|
96
|
-
* what it was. It is a thing you do *to* a record, so it belongs with the
|
|
97
|
-
* others.
|
|
98
|
-
*/
|
|
99
|
-
externalLink?: string;
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Actions performed *on* the record — copy, delete, whatever the collection
|
|
103
|
-
* adds — as menu items under the overflow button. They live here rather
|
|
104
|
-
* than in a footer, which is what let the footer go away entirely.
|
|
105
|
-
*/
|
|
106
|
-
recordActions?: React.ReactNode;
|
|
107
|
-
|
|
108
|
-
/** Plugin-contributed actions, rendered inline before Save. */
|
|
109
|
-
pluginActions?: React.ReactNode;
|
|
110
|
-
|
|
111
|
-
/** Close / full-screen buttons supplied by the panel that owns this view. */
|
|
112
|
-
trailing?: React.ReactNode;
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* Controls the owning panel puts at the bar's leading edge, ahead of the
|
|
116
|
-
* breadcrumb — where the side panel's close button lives.
|
|
117
|
-
*/
|
|
118
|
-
leading?: React.ReactNode;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* The persistent header of an entity view: who this record is, and what you can
|
|
123
|
-
* do to it.
|
|
124
|
-
*
|
|
125
|
-
* The title and the id used to live inside the scrolling form, above 72px of
|
|
126
|
-
* empty space — 219px of chrome that carried nothing and scrolled away the
|
|
127
|
-
* moment you touched the wheel, leaving no indication of which record you were
|
|
128
|
-
* editing. They live here instead, and the left half of a bar that was
|
|
129
|
-
* previously empty now does the work.
|
|
130
|
-
*/
|
|
131
|
-
export function EntityIdentityBar({
|
|
132
|
-
collection,
|
|
133
|
-
collectionUrl,
|
|
134
|
-
title,
|
|
135
|
-
entityId,
|
|
136
|
-
status,
|
|
137
|
-
dirty,
|
|
138
|
-
saving,
|
|
139
|
-
onSave,
|
|
140
|
-
onDiscard,
|
|
141
|
-
saveDisabled,
|
|
142
|
-
hasErrors,
|
|
143
|
-
onSaveAndClose,
|
|
144
|
-
saveAndClosePlacement = "button",
|
|
145
|
-
onClose,
|
|
146
|
-
onBack,
|
|
147
|
-
onInspect,
|
|
148
|
-
onViewHistory,
|
|
149
|
-
externalLink,
|
|
150
|
-
recordActions,
|
|
151
|
-
pluginActions,
|
|
152
|
-
trailing,
|
|
153
|
-
leading
|
|
154
|
-
}: EntityIdentityBarProps) {
|
|
155
|
-
|
|
156
|
-
const { t } = useTranslation();
|
|
157
|
-
|
|
158
|
-
const saveLabel = status === "existing"
|
|
159
|
-
? t("save")
|
|
160
|
-
: status === "copy" ? t("create_copy") : t("create");
|
|
161
|
-
const closeLabel = status === "existing"
|
|
162
|
-
? t("save_and_close")
|
|
163
|
-
: status === "copy" ? t("create_copy_and_close") : t("create_and_close");
|
|
164
|
-
const hasMenu = Boolean(recordActions) || Boolean(onInspect) || Boolean(onViewHistory)
|
|
165
|
-
|| Boolean(externalLink);
|
|
166
|
-
|
|
167
|
-
// The two shapes "save and close" takes, so the Save button next to it knows
|
|
168
|
-
// whether it is still the primary action.
|
|
169
|
-
const saveAndCloseButton = Boolean(onSaveAndClose) && saveAndClosePlacement === "button";
|
|
170
|
-
const saveAndCloseMenu = Boolean(onSaveAndClose) && saveAndClosePlacement === "menu";
|
|
171
|
-
|
|
172
|
-
const saveTooltip = hasErrors
|
|
173
|
-
? (t("fix_errors_before_saving") ?? "Fix highlighted errors before saving")
|
|
174
|
-
: undefined;
|
|
175
|
-
|
|
176
|
-
return (
|
|
177
|
-
<div className={cls(
|
|
178
|
-
"h-[52px] shrink-0 flex items-center gap-2 pl-1.5 pr-2 border-b",
|
|
179
|
-
"bg-surface-50 dark:bg-surface-900",
|
|
180
|
-
defaultBorderMixin
|
|
181
|
-
)}>
|
|
182
|
-
{leading}
|
|
183
|
-
|
|
184
|
-
{onBack && (
|
|
185
|
-
<Tooltip title={t("back")}>
|
|
186
|
-
<IconButton size={"small"} onClick={onBack} aria-label={t("back")}>
|
|
187
|
-
<ArrowLeftIcon size={iconSize.smallest}/>
|
|
188
|
-
</IconButton>
|
|
189
|
-
</Tooltip>
|
|
190
|
-
)}
|
|
191
|
-
|
|
192
|
-
{collectionUrl
|
|
193
|
-
? <Link to={collectionUrl}
|
|
194
|
-
className={"visited:text-inherit dark:visited:text-inherit hidden sm:block"}>
|
|
195
|
-
<Typography variant={"caption"}
|
|
196
|
-
className={cls(
|
|
197
|
-
"text-text-disabled dark:text-text-disabled-dark whitespace-nowrap",
|
|
198
|
-
"hover:text-text-primary dark:hover:text-text-primary-dark transition-colors"
|
|
199
|
-
)}>
|
|
200
|
-
{collection.name} /
|
|
201
|
-
</Typography>
|
|
202
|
-
</Link>
|
|
203
|
-
: <Typography variant={"caption"}
|
|
204
|
-
className={"text-text-disabled dark:text-text-disabled-dark whitespace-nowrap hidden sm:block"}>
|
|
205
|
-
{collection.name} /
|
|
206
|
-
</Typography>}
|
|
207
|
-
|
|
208
|
-
<span className={"font-headers font-semibold text-[15px] tracking-tight truncate min-w-0"}
|
|
209
|
-
title={title}>
|
|
210
|
-
{title}
|
|
211
|
-
</span>
|
|
212
|
-
|
|
213
|
-
{entityId !== undefined && <IdChip value={String(entityId)}/>}
|
|
214
|
-
|
|
215
|
-
<div className={"flex-1"}/>
|
|
216
|
-
|
|
217
|
-
{/* Only where there is something to save. The read-only detail
|
|
218
|
-
view has no Save button, and reporting "Saved" there implies an
|
|
219
|
-
editing session the user never started. */}
|
|
220
|
-
{onSave && <SaveState dirty={dirty} saving={saving} status={status} t={t}/>}
|
|
221
|
-
|
|
222
|
-
{pluginActions}
|
|
223
|
-
|
|
224
|
-
{onDiscard && dirty && !saving && (
|
|
225
|
-
<Button variant={"text"} size={"small"} onClick={onDiscard}>
|
|
226
|
-
{status === "existing" ? t("discard") : t("clear")}
|
|
227
|
-
</Button>
|
|
228
|
-
)}
|
|
229
|
-
|
|
230
|
-
{onSave && (
|
|
231
|
-
// `rounded-lg overflow-hidden`: the two halves of the split
|
|
232
|
-
// button are square inside and the group carries the radius, so
|
|
233
|
-
// there is one control with a seam rather than two buttons that
|
|
234
|
-
// happen to touch. Their borders match their own fill, so the
|
|
235
|
-
// seam has to be drawn — see the `▾` half for where and in what.
|
|
236
|
-
<div className={"flex items-stretch rounded-lg overflow-hidden"}>
|
|
237
|
-
<Tooltip title={saveTooltip}>
|
|
238
|
-
<LoadingButton
|
|
239
|
-
// Where a separate close button carries it, closing
|
|
240
|
-
// is the dominant intent and takes the filled
|
|
241
|
-
// treatment. Under the `▾` the record is staying
|
|
242
|
-
// open, so Save keeps it.
|
|
243
|
-
variant={saveAndCloseButton ? "text" : "filled"}
|
|
244
|
-
color={"primary"}
|
|
245
|
-
size={"small"}
|
|
246
|
-
loading={saving && !saveAndCloseButton}
|
|
247
|
-
disabled={saveDisabled}
|
|
248
|
-
onClick={onSave}
|
|
249
|
-
className={saveAndCloseMenu ? "rounded-none" : undefined}>
|
|
250
|
-
{saveLabel}
|
|
251
|
-
</LoadingButton>
|
|
252
|
-
</Tooltip>
|
|
253
|
-
|
|
254
|
-
{saveAndCloseMenu && <>
|
|
255
|
-
<Menu align={"end"}
|
|
256
|
-
trigger={
|
|
257
|
-
<Button variant={"filled"}
|
|
258
|
-
color={"primary"}
|
|
259
|
-
size={"small"}
|
|
260
|
-
disabled={saveDisabled}
|
|
261
|
-
aria-label={closeLabel}
|
|
262
|
-
// The seam is this half's own left border,
|
|
263
|
-
// tinted from `currentColor` — the ink the
|
|
264
|
-
// label is drawn in — so it holds on any
|
|
265
|
-
// button colour and dims with the control
|
|
266
|
-
// rather than needing a case per state. It
|
|
267
|
-
// was a `bg-white/25` span between the
|
|
268
|
-
// halves: a bright hairline scratched over a
|
|
269
|
-
// saturated blue, and, being a sibling of
|
|
270
|
-
// the buttons rather than part of one, it
|
|
271
|
-
// stayed at full strength while `disabled`
|
|
272
|
-
// dropped both halves to `opacity-40` — a
|
|
273
|
-
// rule brighter than the button it bisected.
|
|
274
|
-
// Inline because it has to beat the
|
|
275
|
-
// variant's `border-<color>` on one edge.
|
|
276
|
-
style={{ borderLeftColor: "color-mix(in oklab, currentColor 15%, transparent)" }}
|
|
277
|
-
className={"rounded-none px-1.5"}>
|
|
278
|
-
<ChevronDownIcon size={iconSize.smallest}/>
|
|
279
|
-
</Button>
|
|
280
|
-
}>
|
|
281
|
-
<MenuItem onClick={onSaveAndClose}>
|
|
282
|
-
<CheckIcon size={iconSize.smallest}/>
|
|
283
|
-
{closeLabel}
|
|
284
|
-
</MenuItem>
|
|
285
|
-
</Menu>
|
|
286
|
-
</>}
|
|
287
|
-
</div>
|
|
288
|
-
)}
|
|
289
|
-
|
|
290
|
-
{saveAndCloseButton && (
|
|
291
|
-
<LoadingButton variant={"filled"}
|
|
292
|
-
color={"primary"}
|
|
293
|
-
size={"small"}
|
|
294
|
-
loading={saving}
|
|
295
|
-
disabled={saveDisabled}
|
|
296
|
-
onClick={onSaveAndClose}>
|
|
297
|
-
{closeLabel}
|
|
298
|
-
</LoadingButton>
|
|
299
|
-
)}
|
|
300
|
-
|
|
301
|
-
{hasMenu && (
|
|
302
|
-
<Menu align={"end"}
|
|
303
|
-
trigger={
|
|
304
|
-
<IconButton size={"small"} aria-label={t("more_actions") ?? "More actions"}>
|
|
305
|
-
<MoreVerticalIcon size={iconSize.smallest}/>
|
|
306
|
-
</IconButton>
|
|
307
|
-
}>
|
|
308
|
-
{externalLink && (
|
|
309
|
-
<MenuItem onClick={() => window.open(externalLink, "_blank", "noopener,noreferrer")}>
|
|
310
|
-
<ExternalLinkIcon size={iconSize.smallest}/>
|
|
311
|
-
{t("open_in_live_site") ?? "Open in the live site"}
|
|
312
|
-
</MenuItem>
|
|
313
|
-
)}
|
|
314
|
-
{externalLink && (recordActions || onInspect || onViewHistory) &&
|
|
315
|
-
<Separator orientation={"horizontal"}/>}
|
|
316
|
-
{recordActions}
|
|
317
|
-
{recordActions && (onInspect || onViewHistory) && <Separator orientation={"horizontal"}/>}
|
|
318
|
-
{onViewHistory && (
|
|
319
|
-
<MenuItem onClick={onViewHistory}>
|
|
320
|
-
<HistoryIcon size={iconSize.smallest}/>
|
|
321
|
-
{t("record_history") ?? "History"}
|
|
322
|
-
</MenuItem>
|
|
323
|
-
)}
|
|
324
|
-
{onInspect && (
|
|
325
|
-
<MenuItem onClick={onInspect}>
|
|
326
|
-
<CodeIcon size={iconSize.smallest}/>
|
|
327
|
-
{t("inspect_record") ?? "Inspect record"}
|
|
328
|
-
</MenuItem>
|
|
329
|
-
)}
|
|
330
|
-
</Menu>
|
|
331
|
-
)}
|
|
332
|
-
|
|
333
|
-
{trailing}
|
|
334
|
-
|
|
335
|
-
{/* Last, and behind a rule. A ✕ that sits flush against Save reads
|
|
336
|
-
as the next item in the action row, and the two adjacent controls
|
|
337
|
-
are then "commit this edit" and "abandon it". */}
|
|
338
|
-
{onClose && <>
|
|
339
|
-
<Separator orientation={"vertical"} className={"h-5 mx-1 shrink-0"}/>
|
|
340
|
-
<Tooltip title={`${t("close")} · Esc`}>
|
|
341
|
-
<IconButton size={"small"} onClick={onClose} aria-label={t("close")}>
|
|
342
|
-
<XIcon size={iconSize.smallest}/>
|
|
343
|
-
</IconButton>
|
|
344
|
-
</Tooltip>
|
|
345
|
-
</>}
|
|
346
|
-
</div>
|
|
347
|
-
);
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
/**
|
|
351
|
-
* The words the unlabelled floating circle never said.
|
|
352
|
-
*
|
|
353
|
-
* That indicator was a ✓ / pencil / spinner chip stuck to the top-right of the
|
|
354
|
-
* scroll area in an `h-0 overflow-visible` container, so it drifted across
|
|
355
|
-
* field values as you scrolled — and it duplicated what the Save button was
|
|
356
|
-
* already able to tell you.
|
|
357
|
-
*/
|
|
358
|
-
function SaveState({
|
|
359
|
-
dirty,
|
|
360
|
-
saving,
|
|
361
|
-
status,
|
|
362
|
-
t
|
|
363
|
-
}: {
|
|
364
|
-
dirty: boolean;
|
|
365
|
-
saving: boolean;
|
|
366
|
-
status: EntityStatus;
|
|
367
|
-
t: (key: string) => string;
|
|
368
|
-
}) {
|
|
369
|
-
if (saving) {
|
|
370
|
-
return <StateText>{t("saving")}</StateText>;
|
|
371
|
-
}
|
|
372
|
-
if (dirty) {
|
|
373
|
-
return <StateText>{t("unsaved_changes_title")}</StateText>;
|
|
374
|
-
}
|
|
375
|
-
if (status === "existing") {
|
|
376
|
-
return <StateText>{t("entity_saved") ?? "Saved"}</StateText>;
|
|
377
|
-
}
|
|
378
|
-
return null;
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
function StateText({ children }: { children: React.ReactNode }) {
|
|
382
|
-
return (
|
|
383
|
-
<span className={"text-xs text-text-disabled dark:text-text-disabled-dark whitespace-nowrap hidden md:inline"}>
|
|
384
|
-
{children}
|
|
385
|
-
</span>
|
|
386
|
-
);
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
/**
|
|
390
|
-
* The id, as a chip you can copy rather than a full-width alert holding a UUID.
|
|
391
|
-
*/
|
|
392
|
-
function IdChip({ value }: { value: string }) {
|
|
393
|
-
|
|
394
|
-
const { t } = useTranslation();
|
|
395
|
-
const [copied, setCopied] = useState(false);
|
|
396
|
-
|
|
397
|
-
const truncated = value.length > 14
|
|
398
|
-
? `${value.slice(0, 8)}…${value.slice(-4)}`
|
|
399
|
-
: value;
|
|
400
|
-
|
|
401
|
-
const copy = () => {
|
|
402
|
-
navigator.clipboard?.writeText(value).then(() => {
|
|
403
|
-
setCopied(true);
|
|
404
|
-
setTimeout(() => setCopied(false), 1600);
|
|
405
|
-
}, () => undefined);
|
|
406
|
-
};
|
|
407
|
-
|
|
408
|
-
return (
|
|
409
|
-
<Tooltip title={copied ? t("copied") : value}>
|
|
410
|
-
<button type={"button"}
|
|
411
|
-
onClick={copy}
|
|
412
|
-
aria-label={`${t("copy_id")} ${value}`}
|
|
413
|
-
className={cls(
|
|
414
|
-
// `whitespace-nowrap`: the middle of the id is elided with a
|
|
415
|
-
// `…`, and a line break is allowed after one. In the dialog,
|
|
416
|
-
// where the bar is narrow and every button is on it, the
|
|
417
|
-
// chip broke across two lines inside a 52px row.
|
|
418
|
-
"hidden md:inline-flex items-center gap-1.5 shrink-0 whitespace-nowrap px-2 py-0.5 rounded-md",
|
|
419
|
-
"font-mono text-[11px] text-text-secondary dark:text-text-secondary-dark",
|
|
420
|
-
"bg-surface-accent-200/50 dark:bg-white/[0.055]",
|
|
421
|
-
"hover:bg-surface-accent-200/75 dark:hover:bg-white/[0.09] transition-colors"
|
|
422
|
-
)}>
|
|
423
|
-
{truncated}
|
|
424
|
-
{copied ? <CheckIcon size={iconSize.smallest}/> : <CopyIcon size={iconSize.smallest}/>}
|
|
425
|
-
</button>
|
|
426
|
-
</Tooltip>
|
|
427
|
-
);
|
|
428
|
-
}
|