@rebasepro/cms 0.17.3 → 0.18.0
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,203 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import type { Property } from "@rebasepro/types";
|
|
3
|
-
import * as React from "react";
|
|
4
|
-
|
|
5
|
-
import { ArrowLeftIcon, Chip, cls, defaultBorderMixin, iconSize, Tooltip, Typography } from "@rebasepro/ui";
|
|
6
|
-
import { PreviewSize } from "../../types/components/PropertyPreviewProps";
|
|
7
|
-
import { getPropertyInPath } from "../../util/property_utils";
|
|
8
|
-
import { PropertyPreview } from "../../preview/PropertyPreview";
|
|
9
|
-
import { SkeletonPropertyComponent } from "../../preview/property_previews/SkeletonPropertyComponent";
|
|
10
|
-
import { useAuthController } from "@rebasepro/app";
|
|
11
|
-
import { UserChip } from "./UserChip";
|
|
12
|
-
import { HistoryEntryData } from "../../hooks";
|
|
13
|
-
import { getValueInPath } from "@rebasepro/utils";
|
|
14
|
-
import type { AdminCollection } from "@rebasepro/cms-types";
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Recursive deep equality for primitives, arrays and plain objects.
|
|
18
|
-
*/
|
|
19
|
-
function deepEqual(a: unknown, b: unknown): boolean {
|
|
20
|
-
if (a === b) return true;
|
|
21
|
-
if (a == null || b == null) return a === b;
|
|
22
|
-
if (typeof a !== typeof b) return false;
|
|
23
|
-
if (typeof a !== "object") return false;
|
|
24
|
-
|
|
25
|
-
if (Array.isArray(a)) {
|
|
26
|
-
if (!Array.isArray(b) || a.length !== (b as unknown[]).length) return false;
|
|
27
|
-
return a.every((item, i) => deepEqual(item, (b as unknown[])[i]));
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
if (Array.isArray(b)) return false;
|
|
31
|
-
|
|
32
|
-
const aObj = a as Record<string, unknown>;
|
|
33
|
-
const bObj = b as Record<string, unknown>;
|
|
34
|
-
const aKeys = Object.keys(aObj);
|
|
35
|
-
const bKeys = Object.keys(bObj);
|
|
36
|
-
if (aKeys.length !== bKeys.length) return false;
|
|
37
|
-
return aKeys.every(key => key in bObj && deepEqual(aObj[key], bObj[key]));
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export type EntityHistoryEntryProps = {
|
|
41
|
-
size: PreviewSize;
|
|
42
|
-
actions?: React.ReactNode;
|
|
43
|
-
collection?: AdminCollection;
|
|
44
|
-
hover?: boolean;
|
|
45
|
-
entry: HistoryEntryData;
|
|
46
|
-
onClick?: (e: React.SyntheticEvent) => void;
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
function PreviousValueView({
|
|
50
|
-
previousValueInPath,
|
|
51
|
-
childProperty,
|
|
52
|
-
propertyKey
|
|
53
|
-
}: {
|
|
54
|
-
previousValueInPath: unknown;
|
|
55
|
-
childProperty: Property;
|
|
56
|
-
propertyKey: string;
|
|
57
|
-
}) {
|
|
58
|
-
if (typeof previousValueInPath === "string" || typeof previousValueInPath === "number") {
|
|
59
|
-
return <Typography variant={"caption"} color={"secondary"} className="line-through">
|
|
60
|
-
{previousValueInPath}
|
|
61
|
-
</Typography>;
|
|
62
|
-
} else if (typeof previousValueInPath === "boolean") {
|
|
63
|
-
return <Typography variant={"caption"} color={"secondary"} className="line-through">
|
|
64
|
-
{previousValueInPath ? "true" : "false"}
|
|
65
|
-
</Typography>;
|
|
66
|
-
} else {
|
|
67
|
-
return <Tooltip
|
|
68
|
-
side={"left"}
|
|
69
|
-
title={<div className={"flex flex-col gap-2"}>
|
|
70
|
-
<Typography variant={"caption"} color={"secondary"}>
|
|
71
|
-
Previous value
|
|
72
|
-
</Typography>
|
|
73
|
-
<PropertyPreview
|
|
74
|
-
propertyKey={propertyKey as string}
|
|
75
|
-
value={previousValueInPath as never}
|
|
76
|
-
property={childProperty as Property}
|
|
77
|
-
size={"small"}/>
|
|
78
|
-
</div>}>
|
|
79
|
-
<ArrowLeftIcon size={iconSize.smallest} color={"disabled"} className={"mb-1"}/>
|
|
80
|
-
</Tooltip>
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Displays a single entity history revision entry.
|
|
86
|
-
* Adapted from the entity_history plugin — now reads from backend API data.
|
|
87
|
-
*/
|
|
88
|
-
export function EntityHistoryEntry({
|
|
89
|
-
actions,
|
|
90
|
-
hover,
|
|
91
|
-
collection,
|
|
92
|
-
size,
|
|
93
|
-
entry
|
|
94
|
-
}: EntityHistoryEntryProps) {
|
|
95
|
-
|
|
96
|
-
const authController = useAuthController();
|
|
97
|
-
|
|
98
|
-
// The backend reports the whole row as changed, which includes the columns
|
|
99
|
-
// that cannot meaningfully change: a timestamp it stamps itself on every
|
|
100
|
-
// write, and the primary key, which is what identifies the row being
|
|
101
|
-
// revised. Every revision was listing `updated_at: <now>` and `id: <the id
|
|
102
|
-
// in the title bar>` around the one field the user actually edited.
|
|
103
|
-
const changedFields = React.useMemo(() => {
|
|
104
|
-
const all = entry.changed_fields;
|
|
105
|
-
if (!all || !collection) return all;
|
|
106
|
-
return all.filter(key => {
|
|
107
|
-
const property = getPropertyInPath(collection.properties, key);
|
|
108
|
-
if (!property) return true;
|
|
109
|
-
if ("isId" in property && property.isId) return false;
|
|
110
|
-
return !(property.type === "date" && "autoValue" in property && property.autoValue);
|
|
111
|
-
});
|
|
112
|
-
}, [entry.changed_fields, collection]);
|
|
113
|
-
|
|
114
|
-
const previousValues = entry.previous_values;
|
|
115
|
-
const updatedOn = new Date(entry.updated_at);
|
|
116
|
-
const updatedBy = entry.updated_by;
|
|
117
|
-
|
|
118
|
-
// Resolve user display
|
|
119
|
-
const currentUser = authController.user;
|
|
120
|
-
const userDisplay = updatedBy === currentUser?.uid
|
|
121
|
-
? currentUser
|
|
122
|
-
: undefined;
|
|
123
|
-
|
|
124
|
-
return <div className={"@container/histentry w-full flex flex-col gap-2"}>
|
|
125
|
-
<div className={"flex items-center flex-wrap gap-2"}>
|
|
126
|
-
<Typography variant={"body2"} color={"secondary"}>
|
|
127
|
-
{updatedOn.toLocaleString()}
|
|
128
|
-
</Typography>
|
|
129
|
-
<Chip size={"small"}>
|
|
130
|
-
{entry.action}
|
|
131
|
-
</Chip>
|
|
132
|
-
{!userDisplay && updatedBy && <Chip size={"small"}>{updatedBy}</Chip>}
|
|
133
|
-
{userDisplay && <UserChip user={userDisplay}/>}
|
|
134
|
-
</div>
|
|
135
|
-
<div
|
|
136
|
-
className={cls(
|
|
137
|
-
"bg-white dark:bg-surface-900",
|
|
138
|
-
"min-h-[44px]",
|
|
139
|
-
"w-full",
|
|
140
|
-
"items-center",
|
|
141
|
-
hover ? "hover:bg-surface-accent-50 dark:hover:bg-surface-800" : "",
|
|
142
|
-
size === "small" ? "p-1" : "px-2 py-1",
|
|
143
|
-
"flex border rounded-lg",
|
|
144
|
-
defaultBorderMixin
|
|
145
|
-
)}>
|
|
146
|
-
|
|
147
|
-
{actions}
|
|
148
|
-
|
|
149
|
-
<div className={"flex flex-col grow w-full m-1 shrink min-w-0"}>
|
|
150
|
-
|
|
151
|
-
{changedFields && collection && changedFields.map((key: string) => {
|
|
152
|
-
const childProperty = getPropertyInPath(collection.properties, key);
|
|
153
|
-
const valueInPath = entry.values ? getValueInPath(entry.values, key) : undefined;
|
|
154
|
-
const previousValueInPath = previousValues ? getValueInPath(previousValues, key) : undefined;
|
|
155
|
-
|
|
156
|
-
const element = childProperty
|
|
157
|
-
? <PropertyPreview
|
|
158
|
-
propertyKey={key}
|
|
159
|
-
value={valueInPath as never}
|
|
160
|
-
property={childProperty as Property}
|
|
161
|
-
size={"small"}/>
|
|
162
|
-
: <Typography variant={"body2"}>
|
|
163
|
-
{typeof valueInPath === "string" ? valueInPath : JSON.stringify(valueInPath)}
|
|
164
|
-
</Typography>;
|
|
165
|
-
|
|
166
|
-
// The key column used to be `min-w-[200px] w-1/5` beside a
|
|
167
|
-
// `w-4/5` value — 200px of label and 80% of the row, which
|
|
168
|
-
// adds up to more than the row in anything narrower than a
|
|
169
|
-
// full page. In the inspector that pushed every value off
|
|
170
|
-
// the right edge and wrapped ids one character per line.
|
|
171
|
-
// It stacks until the entry itself is wide enough.
|
|
172
|
-
return (
|
|
173
|
-
<div key={"ref_prev_" + key}
|
|
174
|
-
className="flex flex-col @sm/histentry:flex-row @sm/histentry:items-baseline gap-x-4 gap-y-0.5 w-full my-1.5">
|
|
175
|
-
<Typography variant={"caption"}
|
|
176
|
-
color={"secondary"}
|
|
177
|
-
className="shrink-0 break-all @sm/histentry:w-40 @sm/histentry:text-right @sm/histentry:break-normal @sm/histentry:truncate">
|
|
178
|
-
{key}
|
|
179
|
-
</Typography>
|
|
180
|
-
<div className="min-w-0 flex-1 flex flex-col items-start gap-0.5">
|
|
181
|
-
{previousValueInPath !== undefined && !deepEqual(previousValueInPath, valueInPath) &&
|
|
182
|
-
<PreviousValueView previousValueInPath={previousValueInPath}
|
|
183
|
-
childProperty={childProperty as Property}
|
|
184
|
-
propertyKey={key}/>
|
|
185
|
-
}
|
|
186
|
-
{element}
|
|
187
|
-
</div>
|
|
188
|
-
</div>
|
|
189
|
-
);
|
|
190
|
-
})}
|
|
191
|
-
|
|
192
|
-
{(!changedFields || changedFields.length === 0) && (
|
|
193
|
-
<Typography variant={"caption"} color={"secondary"}>
|
|
194
|
-
{entry.action === "create" ? "Entity created" :
|
|
195
|
-
entry.action === "delete" ? "Entity deleted" : "No field changes recorded"}
|
|
196
|
-
</Typography>
|
|
197
|
-
)}
|
|
198
|
-
|
|
199
|
-
</div>
|
|
200
|
-
|
|
201
|
-
</div>
|
|
202
|
-
</div>;
|
|
203
|
-
}
|
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import type { EntityCustomViewParams } from "@rebasepro/cms-types";
|
|
3
|
-
import { useRef, useEffect } from "react";
|
|
4
|
-
import { cls, IconButton, Label, Tooltip, Typography } from "@rebasepro/ui";
|
|
5
|
-
import { ErrorBoundary, HistoryIcon } from "@rebasepro/ui";
|
|
6
|
-
import { EntityHistoryEntry } from "./EntityHistoryEntry";
|
|
7
|
-
import { useSnackbarController, useAuthController, useTranslation } from "@rebasepro/app";
|
|
8
|
-
import { ConfirmationDialog } from "@rebasepro/app";
|
|
9
|
-
import { useState } from "react";
|
|
10
|
-
import { useHistory } from "../../hooks/useHistory";
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Entity history tab view. Shows a paginated list of entity revisions
|
|
14
|
-
* fetched from the backend API. Supports infinite scroll and revert.
|
|
15
|
-
*/
|
|
16
|
-
export function EntityHistoryView<M extends Record<string, unknown>>({
|
|
17
|
-
entity,
|
|
18
|
-
collection,
|
|
19
|
-
formContext,
|
|
20
|
-
refreshToken
|
|
21
|
-
}: EntityCustomViewParams<M> & {
|
|
22
|
-
/** Bumped once per save, so the list picks up the revision it just made. */
|
|
23
|
-
refreshToken?: number;
|
|
24
|
-
}) {
|
|
25
|
-
|
|
26
|
-
const { t } = useTranslation();
|
|
27
|
-
const snackbarController = useSnackbarController();
|
|
28
|
-
const authController = useAuthController();
|
|
29
|
-
const dirty = formContext?.formex.dirty;
|
|
30
|
-
|
|
31
|
-
const slug = collection.slug;
|
|
32
|
-
const entityId = entity?.id;
|
|
33
|
-
|
|
34
|
-
const {
|
|
35
|
-
entries,
|
|
36
|
-
isLoading,
|
|
37
|
-
hasMore,
|
|
38
|
-
loadMore,
|
|
39
|
-
revert
|
|
40
|
-
} = useHistory({
|
|
41
|
-
slug,
|
|
42
|
-
entityId,
|
|
43
|
-
enabled: !!entityId,
|
|
44
|
-
pageSize: 10,
|
|
45
|
-
refreshToken
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
const [revertHistoryId, setRevertHistoryId] = useState<string | undefined>();
|
|
49
|
-
const [isReverting, setIsReverting] = useState(false);
|
|
50
|
-
|
|
51
|
-
const containerRef = useRef<HTMLDivElement>(null);
|
|
52
|
-
const loadMoreRef = useRef<HTMLDivElement>(null);
|
|
53
|
-
|
|
54
|
-
// Intersection observer for infinite scroll
|
|
55
|
-
useEffect(() => {
|
|
56
|
-
const currentContainer = containerRef.current;
|
|
57
|
-
const currentLoadMore = loadMoreRef.current;
|
|
58
|
-
|
|
59
|
-
if (!currentContainer || !currentLoadMore || !hasMore || isLoading) return;
|
|
60
|
-
|
|
61
|
-
const observer = new IntersectionObserver(
|
|
62
|
-
(observerEntries) => {
|
|
63
|
-
if (observerEntries[0].isIntersecting && hasMore && !isLoading) {
|
|
64
|
-
loadMore();
|
|
65
|
-
}
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
root: currentContainer,
|
|
69
|
-
rootMargin: "0px 0px 200px 0px",
|
|
70
|
-
threshold: 0.01
|
|
71
|
-
}
|
|
72
|
-
);
|
|
73
|
-
|
|
74
|
-
observer.observe(currentLoadMore);
|
|
75
|
-
|
|
76
|
-
return () => observer.disconnect();
|
|
77
|
-
}, [hasMore, isLoading, entries.length, loadMore]);
|
|
78
|
-
|
|
79
|
-
if (!entity) {
|
|
80
|
-
return <div className="flex items-center justify-center h-full">
|
|
81
|
-
<Label>{t("history_new_entity") ?? "History is only available for existing records"}</Label>
|
|
82
|
-
</div>;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
async function doRevert(historyId: string) {
|
|
86
|
-
setIsReverting(true);
|
|
87
|
-
try {
|
|
88
|
-
const revertedValues = await revert(historyId);
|
|
89
|
-
setRevertHistoryId(undefined);
|
|
90
|
-
|
|
91
|
-
// Reset the form with the reverted values so the UI updates
|
|
92
|
-
// immediately without requiring a page refresh.
|
|
93
|
-
if (formContext?.formex?.resetForm && revertedValues) {
|
|
94
|
-
formContext.formex.resetForm({
|
|
95
|
-
values: revertedValues as M,
|
|
96
|
-
submitCount: 0,
|
|
97
|
-
touched: {}
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
snackbarController.open({
|
|
102
|
-
message: t("history_reverted") ?? "Reverted to selected version",
|
|
103
|
-
type: "info"
|
|
104
|
-
});
|
|
105
|
-
} catch (error) {
|
|
106
|
-
console.error("Error reverting entity:", error);
|
|
107
|
-
snackbarController.open({
|
|
108
|
-
message: t("history_revert_error") ?? "Error reverting entity",
|
|
109
|
-
type: "error"
|
|
110
|
-
});
|
|
111
|
-
} finally {
|
|
112
|
-
setIsReverting(false);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
const revertEntry = revertHistoryId
|
|
117
|
-
? entries.find(e => e.id === revertHistoryId)
|
|
118
|
-
: undefined;
|
|
119
|
-
|
|
120
|
-
// `p-8` plus a `mt-24` heading were sized for a full-width tab that no
|
|
121
|
-
// longer exists. In the inspector panel that was 96px of nothing above the
|
|
122
|
-
// first revision, and 32px of gutter on each side of a 448px column.
|
|
123
|
-
return <div
|
|
124
|
-
ref={containerRef}
|
|
125
|
-
className={cls("relative flex-1 h-full overflow-auto w-full flex flex-col gap-4 p-4 sm:p-5")}>
|
|
126
|
-
<div className="flex flex-col gap-2 max-w-6xl mx-auto w-full">
|
|
127
|
-
|
|
128
|
-
{isLoading && entries.length === 0 && (
|
|
129
|
-
<div className="flex flex-col gap-4">
|
|
130
|
-
{[1, 2, 3].map(i => (
|
|
131
|
-
<div key={i} className="flex flex-col gap-2 animate-pulse">
|
|
132
|
-
<div className="h-4 w-48 bg-surface-200 dark:bg-surface-700 rounded"/>
|
|
133
|
-
<div className="h-12 w-full bg-surface-100 dark:bg-surface-900 rounded-lg border border-surface-200 dark:border-surface-700"/>
|
|
134
|
-
</div>
|
|
135
|
-
))}
|
|
136
|
-
</div>
|
|
137
|
-
)}
|
|
138
|
-
|
|
139
|
-
{!isLoading && entries.length === 0 && <>
|
|
140
|
-
<Label>
|
|
141
|
-
{t("history_empty") ?? "No history available"}
|
|
142
|
-
</Label>
|
|
143
|
-
<Typography variant={"caption"}>
|
|
144
|
-
{t("history_empty_description") ?? "When you save a record, a new version is created and stored in the history."}
|
|
145
|
-
</Typography>
|
|
146
|
-
</>}
|
|
147
|
-
|
|
148
|
-
{entries.map((entry) => (
|
|
149
|
-
<div key={entry.id} className="flex flex-col gap-2 w-full">
|
|
150
|
-
<EntityHistoryEntry
|
|
151
|
-
entry={entry}
|
|
152
|
-
collection={collection}
|
|
153
|
-
size={"medium"}
|
|
154
|
-
actions={
|
|
155
|
-
<Tooltip title={t("history_revert") ?? "Revert to this version"}
|
|
156
|
-
className={"m-2 grow-0 self-start"}>
|
|
157
|
-
<IconButton
|
|
158
|
-
onClick={() => {
|
|
159
|
-
if (dirty) {
|
|
160
|
-
snackbarController.open({
|
|
161
|
-
message: t("history_revert_dirty") ?? "Please save or discard your changes before reverting",
|
|
162
|
-
type: "warning"
|
|
163
|
-
});
|
|
164
|
-
} else {
|
|
165
|
-
setRevertHistoryId(entry.id);
|
|
166
|
-
}
|
|
167
|
-
}}>
|
|
168
|
-
<HistoryIcon/>
|
|
169
|
-
</IconButton>
|
|
170
|
-
</Tooltip>
|
|
171
|
-
}
|
|
172
|
-
/>
|
|
173
|
-
</div>
|
|
174
|
-
))}
|
|
175
|
-
|
|
176
|
-
{/* Load more sentinel */}
|
|
177
|
-
{entries.length > 0 && (
|
|
178
|
-
<div ref={loadMoreRef} className="py-4 text-center">
|
|
179
|
-
{isLoading && <Label>{t("loading")}</Label>}
|
|
180
|
-
{!hasMore && entries.length > 10 && <Label>{t("history_no_more") ?? "No more history"}</Label>}
|
|
181
|
-
</div>
|
|
182
|
-
)}
|
|
183
|
-
</div>
|
|
184
|
-
|
|
185
|
-
<ErrorBoundary>
|
|
186
|
-
<ConfirmationDialog
|
|
187
|
-
open={Boolean(revertHistoryId)}
|
|
188
|
-
onAccept={() => {
|
|
189
|
-
if (revertHistoryId) doRevert(revertHistoryId);
|
|
190
|
-
}}
|
|
191
|
-
onCancel={() => setRevertHistoryId(undefined)}
|
|
192
|
-
title={<Typography variant={"subtitle2"}>{t("history_revert_title") ?? "Revert data to this version?"}</Typography>}
|
|
193
|
-
body={revertEntry
|
|
194
|
-
? <div className="p-4">
|
|
195
|
-
<Typography variant={"caption"} color={"secondary"}>
|
|
196
|
-
This will save the entity with the values from{" "}
|
|
197
|
-
{new Date(revertEntry.updated_at).toLocaleString()}.
|
|
198
|
-
A new history entry will be created for the revert.
|
|
199
|
-
</Typography>
|
|
200
|
-
</div>
|
|
201
|
-
: null
|
|
202
|
-
}
|
|
203
|
-
/>
|
|
204
|
-
</ErrorBoundary>
|
|
205
|
-
</div>;
|
|
206
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { PluginFormActionProps } from "@rebasepro/cms-types";
|
|
2
|
-
import React from "react";
|
|
3
|
-
;
|
|
4
|
-
import { LastEditedByIndicator } from "./LastEditedByIndicator";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Renders the "last edited by" indicator in the entity form top bar.
|
|
8
|
-
* Used as a plugin `form.ActionsTop` component.
|
|
9
|
-
*/
|
|
10
|
-
export function LastEditedByFormAction({
|
|
11
|
-
entityId,
|
|
12
|
-
path,
|
|
13
|
-
status,
|
|
14
|
-
collection
|
|
15
|
-
}: PluginFormActionProps) {
|
|
16
|
-
if (status === "new" || status === "copy" || !entityId) return null;
|
|
17
|
-
if (!collection.history) return null;
|
|
18
|
-
|
|
19
|
-
return <LastEditedByIndicator
|
|
20
|
-
path={path}
|
|
21
|
-
entityId={entityId.toString()}
|
|
22
|
-
collection={collection}
|
|
23
|
-
/>;
|
|
24
|
-
}
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import React, { useEffect, useState, useCallback } from "react";
|
|
3
|
-
;
|
|
4
|
-
import { useApiBase, useApiConfig } from "@rebasepro/app";
|
|
5
|
-
import { useAuthController } from "@rebasepro/app";
|
|
6
|
-
import { formatRelativeTime } from "@rebasepro/utils";
|
|
7
|
-
import { HistoryEntryData } from "../../hooks";
|
|
8
|
-
import type { AdminCollection } from "@rebasepro/cms-types";
|
|
9
|
-
|
|
10
|
-
const THIRTY_DAYS_MS = 30 * 24 * 60 * 60 * 1000;
|
|
11
|
-
|
|
12
|
-
function getRelativeTimeString(date: Date): string {
|
|
13
|
-
// An edit is in the past, but the timestamp comes from the server and the
|
|
14
|
-
// phrase is rendered against the browser's clock — a few seconds of skew
|
|
15
|
-
// used to be enough to make a fresh edit read as the wrong thing entirely.
|
|
16
|
-
return formatRelativeTime(date, { maxMs: THIRTY_DAYS_MS }) ?? date.toLocaleDateString();
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Fetches the latest history entry from the backend API and displays
|
|
21
|
-
* who last edited the entity and when.
|
|
22
|
-
*/
|
|
23
|
-
export function LastEditedByIndicator({
|
|
24
|
-
path,
|
|
25
|
-
entityId,
|
|
26
|
-
collection
|
|
27
|
-
}: {
|
|
28
|
-
path: string;
|
|
29
|
-
entityId: string;
|
|
30
|
-
collection: AdminCollection;
|
|
31
|
-
}) {
|
|
32
|
-
const apiConfig = useApiConfig();
|
|
33
|
-
const apiBase = useApiBase();
|
|
34
|
-
const authController = useAuthController();
|
|
35
|
-
const [latestEntry, setLatestEntry] = useState<HistoryEntryData | undefined>();
|
|
36
|
-
|
|
37
|
-
const fetchLatest = useCallback(async () => {
|
|
38
|
-
if (!apiConfig?.apiUrl || !entityId || !collection.slug) return;
|
|
39
|
-
|
|
40
|
-
try {
|
|
41
|
-
const token = await apiConfig.getAuthToken?.();
|
|
42
|
-
const headers: Record<string, string> = {};
|
|
43
|
-
if (token) headers["Authorization"] = `Bearer ${token}`;
|
|
44
|
-
|
|
45
|
-
const url = `${apiBase}/data/${collection.slug}/${entityId}/history?limit=1&offset=0`;
|
|
46
|
-
const response = await fetch(url, { headers });
|
|
47
|
-
|
|
48
|
-
if (response.ok) {
|
|
49
|
-
const result = await response.json();
|
|
50
|
-
if (result.data && result.data.length > 0) {
|
|
51
|
-
setLatestEntry(result.data[0]);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
} catch (error) {
|
|
55
|
-
// Silently fail — this is a non-critical UI indicator
|
|
56
|
-
console.debug("Failed to fetch latest history entry:", error);
|
|
57
|
-
}
|
|
58
|
-
}, [apiConfig, apiBase, entityId, collection.slug]);
|
|
59
|
-
|
|
60
|
-
useEffect(() => {
|
|
61
|
-
fetchLatest();
|
|
62
|
-
}, [fetchLatest]);
|
|
63
|
-
|
|
64
|
-
if (!latestEntry) return null;
|
|
65
|
-
|
|
66
|
-
const uid = latestEntry.updated_by;
|
|
67
|
-
const date = new Date(latestEntry.updated_at);
|
|
68
|
-
const timeString = getRelativeTimeString(date);
|
|
69
|
-
|
|
70
|
-
// Try to match the current user
|
|
71
|
-
const currentUser = authController.user;
|
|
72
|
-
const displayName = uid === currentUser?.uid
|
|
73
|
-
? currentUser?.displayName ?? currentUser?.email ?? uid
|
|
74
|
-
: uid;
|
|
75
|
-
const photoURL = uid === currentUser?.uid ? currentUser?.photoURL : undefined;
|
|
76
|
-
|
|
77
|
-
return (
|
|
78
|
-
<div className="flex items-center gap-2 text-xs text-text-secondary dark:text-text-secondary-dark">
|
|
79
|
-
{photoURL ? (
|
|
80
|
-
<img
|
|
81
|
-
src={photoURL}
|
|
82
|
-
alt={displayName ?? "User"}
|
|
83
|
-
className="rounded-full object-cover w-6 h-6"
|
|
84
|
-
/>
|
|
85
|
-
) : (
|
|
86
|
-
<div className="rounded-full bg-primary/10 dark:bg-primary-dark/20 flex items-center justify-center text-primary dark:text-primary-dark font-medium w-6 h-6 text-xs">
|
|
87
|
-
{(displayName ?? "?").charAt(0).toUpperCase()}
|
|
88
|
-
</div>
|
|
89
|
-
)}
|
|
90
|
-
<span>
|
|
91
|
-
{displayName}{timeString ? ` · ${timeString}` : ""}
|
|
92
|
-
</span>
|
|
93
|
-
</div>
|
|
94
|
-
);
|
|
95
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { User } from "@rebasepro/types";
|
|
2
|
-
import { Chip, Tooltip } from "@rebasepro/ui";
|
|
3
|
-
|
|
4
|
-
export function UserChip({ user }: { user: User }) {
|
|
5
|
-
return (
|
|
6
|
-
<Tooltip title={user.email ?? user.uid}>
|
|
7
|
-
<Chip size={"small"} className={"flex items-center"}>
|
|
8
|
-
{user.photoURL && <img
|
|
9
|
-
className={"rounded-full w-6 h-6 mr-2"}
|
|
10
|
-
src={user.photoURL} alt={user.displayName ?? "User picture"}/>}
|
|
11
|
-
<span>{user.displayName ?? user.email ?? user.uid}</span>
|
|
12
|
-
</Chip>
|
|
13
|
-
</Tooltip>
|
|
14
|
-
);
|
|
15
|
-
}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
export { EntityHistoryView } from "./EntityHistoryView";
|
|
2
|
-
export { EntityHistoryEntry } from "./EntityHistoryEntry";
|
|
3
|
-
export { LastEditedByIndicator } from "./LastEditedByIndicator";
|
|
4
|
-
export { LastEditedByFormAction } from "./LastEditedByFormAction";
|
|
5
|
-
export { UserChip } from "./UserChip";
|
package/src/components/index.ts
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
export type { EntityViewBindingProps } from "./EntityViewBinding";
|
|
2
|
-
export { EntityViewBinding } from "./EntityViewBinding";
|
|
3
|
-
|
|
4
|
-
export type { EntityDisplayHeaderProps } from "./EntityDisplayHeader";
|
|
5
|
-
export { EntityDisplayHeader, HEADER_DISPLAY_ROLES } from "./EntityDisplayHeader";
|
|
6
|
-
|
|
7
|
-
export * from "./DetailViewBinding";
|
|
8
|
-
|
|
9
|
-
export type { SelectionProps } from "./ReferenceTable/SelectionTableBinding";
|
|
10
|
-
export { SelectionTableBinding } from "./ReferenceTable/SelectionTableBinding";
|
|
11
|
-
|
|
12
|
-
export * from "./SelectableTable/SelectableTable";
|
|
13
|
-
export * from "./SelectableTable/SelectableTableContext";
|
|
14
|
-
export * from "./SelectableTable/filters/FilterFieldBinding";
|
|
15
|
-
export * from "./CollectionViewBinding/CollectionViewBinding";
|
|
16
|
-
export * from "./CollectionViewBinding/CollectionViewActions";
|
|
17
|
-
export * from "./CollectionViewBinding/CollectionCardViewBinding";
|
|
18
|
-
export * from "./CollectionViewBinding/EntityCardBinding";
|
|
19
|
-
export * from "./CollectionViewBinding/useSelectionController";
|
|
20
|
-
|
|
21
|
-
export * from "./PropertyConfigBadge";
|
|
22
|
-
export * from "./PropertyIdCopyTooltip";
|
|
23
|
-
|
|
24
|
-
export * from "./CollectionTableBinding";
|
|
25
|
-
// VirtualTable is exported from @rebasepro/ui
|
|
26
|
-
export * from "./ArrayContainer";
|
|
27
|
-
export * from "./ReferenceWidget";
|
|
28
|
-
export * from "./SearchIconsView";
|
|
29
|
-
export * from "./FieldCaption";
|
|
30
|
-
export * from "./EntityPreviewBinding";
|
|
31
|
-
export * from "./EntityPreviewNesting";
|
|
32
|
-
export * from "./InlineEntityPreview";
|
|
33
|
-
|
|
34
|
-
// history is lazy-loaded by EditViewBinding and resolutions.ts
|
|
35
|
-
// export * from "./history";
|
|
36
|
-
export * from "./common";
|
|
37
|
-
export * from "./field_configs";
|
|
38
|
-
|
|
39
|
-
export * from "./SidePanelProvider";
|
|
40
|
-
export * from "./AdminModeSyncer";
|
|
41
|
-
// Admin views: only CreationResultDialog remains (used by resetPasswordAction)
|
|
42
|
-
export * from "./app/AppBar";
|
|
43
|
-
export * from "./app/Drawer";
|
|
44
|
-
export * from "./app/Scaffold";
|
|
45
|
-
export * from "./DefaultAppBar";
|
|
46
|
-
export * from "./DefaultDrawer";
|
|
47
|
-
export * from "./DrawerNavigationItem";
|
|
48
|
-
export * from "./DrawerNavigationGroup";
|
|
49
|
-
// ContentHomePage is lazy-loaded by RebaseRouteDefs
|
|
50
|
-
// export * from "./HomePage/ContentHomePage";
|
|
51
|
-
export * from "./SideDialogs";
|
|
52
|
-
|
|
53
|
-
export * from "./app/useApp";
|
|
54
|
-
export * from "./RebaseCMS";
|
|
55
|
-
export * from "./RebaseShell";
|
|
56
|
-
|
|
57
|
-
// Composable shell layers — each independently usable
|
|
58
|
-
export * from "./RebaseAuthGate";
|
|
59
|
-
export * from "./RebaseNavigation";
|
|
60
|
-
export * from "./RebaseLayout";
|
|
61
|
-
export * from "./RebaseRouteDefs";
|
|
62
|
-
|
|
63
|
-
export * from "./CollectionPanel";
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import React, { useCallback, useMemo, useState } from "react";
|
|
2
|
-
import type { BreadcrumbEntry, BreadcrumbsController } from "@rebasepro/cms-types";
|
|
3
|
-
|
|
4
|
-
const DEFAULT_BREADCRUMBS_CONTROLLER: BreadcrumbsController = {
|
|
5
|
-
breadcrumbs: [],
|
|
6
|
-
set: () => {
|
|
7
|
-
}
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
export const BreadcrumbContext = React.createContext<BreadcrumbsController>(DEFAULT_BREADCRUMBS_CONTROLLER);
|
|
11
|
-
|
|
12
|
-
interface BreadcrumbsProviderProps {
|
|
13
|
-
children: React.ReactNode;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export const BreadcrumbsProvider: React.FC<BreadcrumbsProviderProps> = ({ children }) => {
|
|
17
|
-
|
|
18
|
-
const [breadcrumbs, setBreadcrumbs] = useState<BreadcrumbEntry[]>([]);
|
|
19
|
-
|
|
20
|
-
const set = useCallback((props: {
|
|
21
|
-
breadcrumbs: BreadcrumbEntry[];
|
|
22
|
-
}) => {
|
|
23
|
-
setBreadcrumbs(prev => {
|
|
24
|
-
const next = props.breadcrumbs;
|
|
25
|
-
// Bail out if nothing changed — return same reference to skip re-render
|
|
26
|
-
if (prev.length === next.length && prev.every((p, i) =>
|
|
27
|
-
p.title === next[i].title && p.url === next[i].url && p.id === next[i].id
|
|
28
|
-
)) {
|
|
29
|
-
return prev;
|
|
30
|
-
}
|
|
31
|
-
return next;
|
|
32
|
-
});
|
|
33
|
-
}, []);
|
|
34
|
-
|
|
35
|
-
const value = useMemo(() => ({
|
|
36
|
-
breadcrumbs,
|
|
37
|
-
set
|
|
38
|
-
}), [breadcrumbs, set]);
|
|
39
|
-
|
|
40
|
-
return (
|
|
41
|
-
<BreadcrumbContext.Provider value={value}>
|
|
42
|
-
{children}
|
|
43
|
-
</BreadcrumbContext.Provider>
|
|
44
|
-
);
|
|
45
|
-
};
|