@rebasepro/admin 0.8.0 → 0.9.1-canary.09aaf62
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 +26 -26
- package/dist/{CollectionEditorDialog-BO_aQ-Z4.js → CollectionEditorDialog-DbPpDDwb.js} +40 -18
- package/dist/CollectionEditorDialog-DbPpDDwb.js.map +1 -0
- package/dist/{PropertyEditView-DKzOpMjR.js → PropertyEditView-DfJbZ67t.js} +81 -73
- package/dist/PropertyEditView-DfJbZ67t.js.map +1 -0
- package/dist/{RouterCollectionsStudioView-BQTIExjA.js → RouterCollectionsStudioView-C6XQ7Il5.js} +5 -5
- package/dist/RouterCollectionsStudioView-C6XQ7Il5.js.map +1 -0
- package/dist/collection_editor/_cms_internals.d.ts +3 -3
- package/dist/collection_editor/api/generateCollectionApi.d.ts +8 -8
- package/dist/collection_editor/extensibility_types.d.ts +3 -3
- package/dist/collection_editor/index.d.ts +2 -2
- package/dist/collection_editor/pgColumnToProperty.d.ts +3 -3
- package/dist/collection_editor/serializable_types.d.ts +7 -7
- package/dist/collection_editor/serializable_utils.d.ts +8 -8
- package/dist/collection_editor/types/collection_editor_controller.d.ts +5 -5
- package/dist/collection_editor/types/collection_inference.d.ts +2 -2
- package/dist/collection_editor/types/config_controller.d.ts +7 -7
- package/dist/collection_editor/ui/AddKanbanColumnAction.d.ts +2 -2
- package/dist/collection_editor/ui/CollectionViewHeaderAction.d.ts +2 -2
- package/dist/collection_editor/ui/KanbanSetupAction.d.ts +2 -2
- package/dist/collection_editor/ui/PropertyAddColumnComponent.d.ts +2 -2
- package/dist/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.d.ts +3 -3
- package/dist/collection_editor/ui/collection_editor/CollectionDetailsForm.d.ts +2 -2
- package/dist/collection_editor/ui/collection_editor/CollectionEditorDialog.d.ts +4 -4
- package/dist/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.d.ts +2 -2
- package/dist/collection_editor/ui/collection_editor/CollectionJsonImportDialog.d.ts +2 -2
- package/dist/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.d.ts +4 -4
- package/dist/collection_editor/ui/collection_editor/CollectionStudioView.d.ts +2 -2
- package/dist/collection_editor/ui/collection_editor/CollectionsStudioView.d.ts +2 -2
- package/dist/collection_editor/ui/collection_editor/EntityActionsEditTab.d.ts +2 -2
- package/dist/collection_editor/ui/collection_editor/GeneralSettingsForm.d.ts +2 -2
- package/dist/collection_editor/ui/collection_editor/GetCodeDialog.d.ts +2 -2
- package/dist/collection_editor/ui/collection_editor/PropertyEditView.d.ts +5 -5
- package/dist/collection_editor/ui/collection_editor/SubcollectionsEditTab.d.ts +3 -3
- package/dist/collection_editor/ui/collection_editor/SwitchControl.d.ts +1 -1
- package/dist/collection_editor/ui/collection_editor/templates/blog_template.d.ts +2 -2
- package/dist/collection_editor/ui/collection_editor/templates/pages_template.d.ts +2 -2
- package/dist/collection_editor/ui/collection_editor/templates/products_template.d.ts +2 -2
- package/dist/collection_editor/ui/collection_editor/templates/users_template.d.ts +2 -2
- package/dist/collection_editor/useLocalCollectionsConfigController.d.ts +2 -2
- package/dist/collection_editor/useSafeSnackbarController.d.ts +1 -1
- package/dist/collection_editor/validateCollectionJson.d.ts +2 -2
- package/dist/collection_editor_ui.js +5 -5
- package/dist/collection_editor_ui.js.map +1 -1
- package/dist/components/CollectionPanel.d.ts +4 -4
- package/dist/components/{EntityCollectionTable/EntityCollectionRowActions.d.ts → CollectionTableBinding/CollectionRowActions.d.ts} +3 -3
- package/dist/components/CollectionTableBinding/CollectionTableBinding.d.ts +28 -0
- package/dist/components/{EntityCollectionTable/EntityCollectionTableProps.d.ts → CollectionTableBinding/CollectionTableBindingProps.d.ts} +2 -2
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableMultipleRelationField.d.ts +2 -2
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableReferenceField.d.ts +2 -2
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationField.d.ts +2 -2
- package/dist/components/CollectionTableBinding/index.d.ts +6 -0
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCell.d.ts +1 -1
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/common.d.ts +2 -2
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/PopupFormField.d.ts +3 -3
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/table_bindings.d.ts +1 -1
- package/dist/components/{EntityCollectionView/EntityBoardCard.d.ts → CollectionViewBinding/BoardCardBinding.d.ts} +8 -8
- package/dist/components/{EntityCollectionView/EntityCollectionBoardView.d.ts → CollectionViewBinding/CollectionBoardViewBinding.d.ts} +4 -4
- package/dist/components/{EntityCollectionView/EntityCollectionCardView.d.ts → CollectionViewBinding/CollectionCardViewBinding.d.ts} +5 -5
- package/dist/components/{EntityCollectionView/EntityCollectionListView.d.ts → CollectionViewBinding/CollectionListViewBinding.d.ts} +4 -4
- package/dist/components/{EntityCollectionView/EntityCollectionViewActions.d.ts → CollectionViewBinding/CollectionViewActions.d.ts} +4 -4
- package/dist/components/{EntityCollectionView/EntityCollectionView.d.ts → CollectionViewBinding/CollectionViewBinding.d.ts} +4 -4
- package/dist/components/{EntityCollectionView/EntityCollectionViewStartActions.d.ts → CollectionViewBinding/CollectionViewStartActions.d.ts} +4 -4
- package/dist/components/CollectionViewBinding/EntityCardBinding.d.ts +21 -0
- package/dist/components/{EntityCollectionView → CollectionViewBinding}/SplitListView.d.ts +3 -3
- package/dist/components/{EntityCollectionView → CollectionViewBinding}/hooks/useCollectionInlineEditor.d.ts +3 -3
- package/dist/components/{EntityCollectionView → CollectionViewBinding}/hooks/useKanbanDragAndDrop.d.ts +2 -2
- package/dist/components/{EntityCollectionView → CollectionViewBinding}/useBoardDataController.d.ts +2 -2
- package/dist/components/{EntityCollectionView/useEntityPreviewSlots.d.ts → CollectionViewBinding/usePreviewSlots.d.ts} +5 -5
- package/dist/components/DeleteEntityDialog.d.ts +4 -4
- package/dist/components/{EntityDetailView.d.ts → DetailViewBinding.d.ts} +5 -5
- package/dist/components/EditFormActions.d.ts +3 -0
- package/dist/components/{EntityEditView.d.ts → EditViewBinding.d.ts} +9 -9
- package/dist/components/{EntityPreview.d.ts → EntityPreviewBinding.d.ts} +13 -13
- package/dist/components/EntityViewBinding.d.ts +13 -0
- package/dist/components/{EntityJsonPreview.d.ts → JsonPreviewBinding.d.ts} +1 -1
- package/dist/components/{RebaseCMS.d.ts → RebaseAdmin.d.ts} +2 -2
- package/dist/components/RebaseLayout.d.ts +5 -4
- package/dist/components/RebaseNavigation.d.ts +1 -1
- package/dist/components/RebaseShell.d.ts +1 -0
- package/dist/components/ReferenceTable/{EntitySelectionTable.d.ts → SelectionTableBinding.d.ts} +5 -5
- package/dist/components/SelectableTable/SelectableTable.d.ts +6 -6
- package/dist/components/SelectableTable/SelectableTableContext.d.ts +3 -3
- package/dist/components/SelectableTable/SelectionStore.d.ts +2 -2
- package/dist/components/SelectableTable/filters/BooleanFilterField.d.ts +6 -1
- package/dist/components/SelectableTable/filters/DateTimeFilterField.d.ts +7 -1
- package/dist/components/SelectableTable/filters/FilterFieldBinding.d.ts +40 -0
- package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +7 -1
- package/dist/components/SelectableTable/filters/RelationFilterField.d.ts +7 -1
- package/dist/components/SelectableTable/filters/StringNumberFilterField.d.ts +7 -1
- package/dist/components/SideDialogs.d.ts +1 -1
- package/dist/components/SidePanelBinding.d.ts +11 -0
- package/dist/components/{SideEntityProvider.d.ts → SidePanelProvider.d.ts} +7 -7
- package/dist/components/history/EntityHistoryEntry.d.ts +2 -2
- package/dist/components/history/LastEditedByIndicator.d.ts +2 -2
- package/dist/components/index.d.ts +15 -14
- package/dist/contexts/SidePanelControllerContext.d.ts +3 -0
- package/dist/data_export/export/ExportCollectionAction.d.ts +3 -3
- package/dist/data_import/components/ImportSaveInProgress.d.ts +2 -2
- package/dist/editor.js +1 -1
- package/dist/editor.js.map +1 -1
- package/dist/form/EntityForm.d.ts +1 -1
- package/dist/form/PropertyFieldBinding.d.ts +1 -1
- package/dist/form/components/LocalChangesMenu.d.ts +1 -1
- package/dist/form/components/StorageUploadProgress.d.ts +1 -1
- package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +1 -1
- package/dist/form/form_utils.d.ts +2 -2
- package/dist/{history-B3cqBzEV.js → history-GSa4BgDt.js} +7 -7
- package/dist/history-GSa4BgDt.js.map +1 -0
- package/dist/hooks/index.d.ts +4 -4
- package/dist/hooks/navigation/contexts/CollectionRegistryContext.d.ts +2 -2
- package/dist/hooks/navigation/useBuildNavigationStateController.d.ts +5 -5
- package/dist/hooks/navigation/useNavigationResolution.d.ts +4 -4
- package/dist/hooks/navigation/useResolvedCollections.d.ts +7 -7
- package/dist/hooks/navigation/useTopLevelNavigation.d.ts +2 -2
- package/dist/hooks/navigation/utils.d.ts +5 -5
- package/dist/hooks/useBuildSidePanel.d.ts +6 -0
- package/dist/hooks/useCMSContext.d.ts +2 -2
- package/dist/hooks/{useEntityHistory.d.ts → useHistory.d.ts} +1 -1
- package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
- package/dist/hooks/{useEntitySelectionDialog.d.ts → useSelectionDialog.d.ts} +2 -2
- package/dist/hooks/useSideDialogsController.d.ts +1 -1
- package/dist/hooks/useSidePanel.d.ts +11 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/{src-cxV1ODRG.js → src-B8WuGSPZ.js} +886 -692
- package/dist/src-B8WuGSPZ.js.map +1 -0
- package/dist/types/components/EntityFormActionsProps.d.ts +2 -2
- package/dist/types/components/EntityFormProps.d.ts +3 -3
- package/dist/types/components/formex.d.ts +1 -1
- package/dist/types/fields.d.ts +2 -2
- package/dist/util/dataControllerAdapter.d.ts +2 -5
- package/dist/util/navigation_utils.d.ts +6 -6
- package/dist/util/previews.d.ts +3 -3
- package/dist/util/property_utils.d.ts +2 -2
- package/dist/util/{entity_view_constants.d.ts → view_constants.d.ts} +1 -1
- package/package.json +12 -17
- package/src/collection_editor/ConfigControllerProvider.tsx +11 -11
- package/src/collection_editor/_cms_internals.ts +3 -3
- package/src/collection_editor/api/generateCollectionApi.ts +8 -8
- package/src/collection_editor/extensibility_types.ts +3 -3
- package/src/collection_editor/index.ts +3 -3
- package/src/collection_editor/pgColumnToProperty.ts +3 -3
- package/src/collection_editor/serializable_types.ts +8 -8
- package/src/collection_editor/serializable_utils.ts +17 -17
- package/src/collection_editor/types/collection_editor_controller.tsx +5 -5
- package/src/collection_editor/types/collection_inference.ts +2 -2
- package/src/collection_editor/types/config_controller.tsx +7 -7
- package/src/collection_editor/ui/AddKanbanColumnAction.tsx +3 -3
- package/src/collection_editor/ui/CollectionViewHeaderAction.tsx +3 -3
- package/src/collection_editor/ui/EditorCollectionAction.tsx +3 -3
- package/src/collection_editor/ui/EditorCollectionActionStart.tsx +3 -3
- package/src/collection_editor/ui/EditorEntityAction.tsx +3 -3
- package/src/collection_editor/ui/HomePageEditorCollectionAction.tsx +1 -1
- package/src/collection_editor/ui/KanbanSetupAction.tsx +3 -3
- package/src/collection_editor/ui/MissingReferenceWidget.tsx +1 -1
- package/src/collection_editor/ui/NewCollectionButton.tsx +1 -1
- package/src/collection_editor/ui/NewCollectionCard.tsx +1 -1
- package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +3 -3
- package/src/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.tsx +6 -6
- package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +6 -6
- package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +29 -29
- package/src/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.tsx +5 -5
- package/src/collection_editor/ui/collection_editor/CollectionJsonImportDialog.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +10 -10
- package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +38 -7
- package/src/collection_editor/ui/collection_editor/CollectionRelationsTab.tsx +3 -3
- package/src/collection_editor/ui/collection_editor/CollectionStudioView.tsx +3 -3
- package/src/collection_editor/ui/collection_editor/CollectionsStudioView.tsx +3 -3
- package/src/collection_editor/ui/collection_editor/DisplaySettingsForm.tsx +4 -4
- package/src/collection_editor/ui/collection_editor/EntityActionsEditTab.tsx +5 -5
- package/src/collection_editor/ui/collection_editor/EntityActionsSelectDialog.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/EntityCustomViewsSelectDialog.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/EnumForm.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/GeneralSettingsForm.tsx +7 -7
- package/src/collection_editor/ui/collection_editor/GetCodeDialog.tsx +5 -5
- package/src/collection_editor/ui/collection_editor/KanbanConfigSection.tsx +4 -4
- package/src/collection_editor/ui/collection_editor/PropertyEditView.tsx +9 -9
- package/src/collection_editor/ui/collection_editor/PropertyFieldPreview.tsx +46 -37
- package/src/collection_editor/ui/collection_editor/PropertyTree.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/RouterCollectionStudioView.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/SubcollectionsEditTab.tsx +7 -7
- package/src/collection_editor/ui/collection_editor/SwitchControl.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.tsx +4 -4
- package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.tsx +4 -4
- package/src/collection_editor/ui/collection_editor/properties/BlockPropertyField.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/BooleanPropertyField.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/CommonPropertyFields.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/DateTimePropertyField.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/EnumPropertyField.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/MapPropertyField.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/NumberPropertyField.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/ReferencePropertyField.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/RelationPropertyField.tsx +3 -3
- package/src/collection_editor/ui/collection_editor/properties/RepeatPropertyField.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/StoragePropertyField.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/StringPropertyField.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/UrlPropertyField.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/VectorPropertyField.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.tsx +2 -2
- package/src/collection_editor/ui/collection_editor/templates/blog_template.ts +2 -2
- package/src/collection_editor/ui/collection_editor/templates/pages_template.ts +2 -2
- package/src/collection_editor/ui/collection_editor/templates/products_template.ts +2 -2
- package/src/collection_editor/ui/collection_editor/templates/users_template.ts +2 -2
- package/src/collection_editor/useJsonCollectionsConfigController.tsx +13 -13
- package/src/collection_editor/useLocalCollectionsConfigController.tsx +4 -4
- package/src/collection_editor/useSafeSnackbarController.ts +1 -1
- package/src/collection_editor/validateCollectionJson.ts +3 -3
- package/src/components/AdminModeSyncer.tsx +1 -1
- package/src/components/ArrayContainer.tsx +1 -1
- package/src/components/ClearFilterSortButton.tsx +1 -1
- package/src/components/CollectionPanel.tsx +14 -17
- package/src/components/{EntityCollectionTable/EntityCollectionRowActions.tsx → CollectionTableBinding/CollectionRowActions.tsx} +8 -8
- package/src/components/{EntityCollectionTable/EntityCollectionTable.tsx → CollectionTableBinding/CollectionTableBinding.tsx} +13 -13
- package/src/components/{EntityCollectionTable/EntityCollectionTableProps.tsx → CollectionTableBinding/CollectionTableBindingProps.tsx} +2 -2
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/PropertyTableCell.tsx +1 -1
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/column_utils.tsx +1 -1
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableMultipleRelationField.tsx +7 -7
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableReferenceField.tsx +10 -10
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationField.tsx +7 -7
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableStorageUpload.tsx +1 -1
- package/src/components/CollectionTableBinding/index.tsx +14 -0
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/CollectionTableToolbar.tsx +1 -1
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCell.tsx +2 -2
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCellActions.tsx +1 -1
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/common.tsx +2 -2
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/PopupFormField.tsx +6 -6
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/table_bindings.tsx +1 -1
- package/src/components/{EntityCollectionView/EntityBoardCard.tsx → CollectionViewBinding/BoardCardBinding.tsx} +17 -17
- package/src/components/{EntityCollectionView/EntityCollectionBoardView.tsx → CollectionViewBinding/CollectionBoardViewBinding.tsx} +17 -16
- package/src/components/{EntityCollectionView/EntityCollectionCardView.tsx → CollectionViewBinding/CollectionCardViewBinding.tsx} +9 -9
- package/src/components/{EntityCollectionView/EntityCollectionListView.tsx → CollectionViewBinding/CollectionListViewBinding.tsx} +15 -15
- package/src/components/{EntityCollectionView/EntityCollectionViewActions.tsx → CollectionViewBinding/CollectionViewActions.tsx} +7 -7
- package/src/components/{EntityCollectionView/EntityCollectionView.tsx → CollectionViewBinding/CollectionViewBinding.tsx} +107 -92
- package/src/components/{EntityCollectionView/EntityCollectionViewStartActions.tsx → CollectionViewBinding/CollectionViewStartActions.tsx} +6 -6
- package/src/components/{EntityCollectionView/EntityCard.tsx → CollectionViewBinding/EntityCardBinding.tsx} +12 -12
- package/src/components/{EntityCollectionView → CollectionViewBinding}/FiltersDialog.tsx +49 -72
- package/src/components/{EntityCollectionView → CollectionViewBinding}/SplitListView.tsx +10 -10
- package/src/components/{EntityCollectionView → CollectionViewBinding}/ViewModeToggle.tsx +1 -1
- package/src/components/{EntityCollectionView → CollectionViewBinding}/hooks/useCollectionInlineEditor.ts +6 -6
- package/src/components/{EntityCollectionView → CollectionViewBinding}/hooks/useKanbanDragAndDrop.ts +5 -5
- package/src/components/{EntityCollectionView → CollectionViewBinding}/useBoardDataController.tsx +25 -13
- package/src/components/{EntityCollectionView/useEntityPreviewSlots.ts → CollectionViewBinding/usePreviewSlots.ts} +9 -9
- package/src/components/DefaultAppBar.tsx +3 -3
- package/src/components/DefaultDrawer.tsx +3 -3
- package/src/components/DeleteEntityDialog.tsx +7 -7
- package/src/components/{EntityDetailView.tsx → DetailViewBinding.tsx} +28 -31
- package/src/components/DrawerNavigationGroup.tsx +2 -2
- package/src/components/{EntityEditViewFormActions.tsx → EditFormActions.tsx} +16 -16
- package/src/components/{EntityEditView.tsx → EditViewBinding.tsx} +34 -37
- package/src/components/{EntityPreview.tsx → EntityPreviewBinding.tsx} +30 -30
- package/src/components/{EntityView.tsx → EntityViewBinding.tsx} +7 -7
- package/src/components/HomePage/ContentHomePage.tsx +4 -4
- package/src/components/HomePage/FavouritesView.tsx +1 -1
- package/src/components/HomePage/NavigationCardBinding.tsx +4 -4
- package/src/components/HomePage/NavigationGroup.tsx +1 -1
- package/src/components/HomePage/RenameGroupDialog.tsx +1 -1
- package/src/components/{EntityJsonPreview.tsx → JsonPreviewBinding.tsx} +2 -2
- package/src/components/{RebaseCMS.tsx → RebaseAdmin.tsx} +6 -5
- package/src/components/RebaseAuthGate.tsx +2 -2
- package/src/components/RebaseLayout.tsx +7 -13
- package/src/components/RebaseNavigation.tsx +35 -11
- package/src/components/RebaseRouteDefs.tsx +2 -2
- package/src/components/RebaseShell.tsx +2 -1
- package/src/components/ReferenceTable/{EntitySelectionTable.tsx → SelectionTableBinding.tsx} +27 -24
- package/src/components/ReferenceWidget.tsx +4 -4
- package/src/components/RelationSelector.tsx +15 -13
- package/src/components/SearchIconsView.tsx +2 -2
- package/src/components/SelectableTable/SelectableTable.tsx +35 -88
- package/src/components/SelectableTable/SelectableTableContext.tsx +3 -3
- package/src/components/SelectableTable/SelectionStore.ts +4 -4
- package/src/components/SelectableTable/filters/BooleanFilterField.tsx +10 -2
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +34 -13
- package/src/components/SelectableTable/filters/FilterFieldBinding.tsx +187 -0
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +22 -8
- package/src/components/SelectableTable/filters/RelationFilterField.tsx +17 -3
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +67 -13
- package/src/components/SideDialogs.tsx +4 -4
- package/src/components/{EntitySidePanel.tsx → SidePanelBinding.tsx} +20 -20
- package/src/components/{SideEntityProvider.tsx → SidePanelProvider.tsx} +17 -17
- package/src/components/UserSelector.tsx +1 -1
- package/src/components/admin/CreationResultDialog.tsx +6 -3
- package/src/components/app/Scaffold.tsx +6 -2
- package/src/components/common/default_entity_actions.tsx +132 -34
- package/src/components/field_configs.tsx +1 -1
- package/src/components/history/EntityHistoryEntry.tsx +3 -3
- package/src/components/history/EntityHistoryView.tsx +7 -7
- package/src/components/history/LastEditedByIndicator.tsx +4 -4
- package/src/components/index.ts +16 -15
- package/src/contexts/SidePanelControllerContext.tsx +5 -0
- package/src/data_export/export/BasicExportAction.tsx +1 -1
- package/src/data_export/export/ExportCollectionAction.tsx +5 -5
- package/src/data_import/components/DataNewPropertiesMapping.tsx +1 -1
- package/src/data_import/components/ImportFileUpload.tsx +1 -1
- package/src/data_import/components/ImportNewPropertyFieldPreview.tsx +1 -1
- package/src/data_import/components/ImportSaveInProgress.tsx +4 -4
- package/src/data_import/import/ImportCollectionAction.tsx +6 -6
- package/src/data_import/utils/data.ts +4 -4
- package/src/data_import/utils/get_properties_mapping.ts +1 -1
- package/src/editor/components/image-bubble.tsx +1 -1
- package/src/editor/components/table-bubble.tsx +1 -1
- package/src/editor/editor.tsx +1 -1
- package/src/editor/selectors/link-selector.tsx +1 -1
- package/src/editor/selectors/node-selector.tsx +1 -1
- package/src/form/EntityForm.tsx +6 -6
- package/src/form/EntityFormActions.tsx +4 -4
- package/src/form/EntityFormBinding.tsx +10 -10
- package/src/form/PropertyFieldBinding.tsx +7 -7
- package/src/form/components/ErrorFocus.tsx +1 -1
- package/src/form/components/LocalChangesMenu.tsx +3 -3
- package/src/form/components/StorageItemPreview.tsx +1 -1
- package/src/form/components/StorageUploadProgress.tsx +3 -3
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +1 -1
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +5 -5
- package/src/form/field_bindings/BlockFieldBinding.tsx +2 -2
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +1 -1
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +21 -21
- package/src/form/field_bindings/MapFieldBinding.tsx +1 -1
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +2 -2
- package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +3 -3
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +7 -7
- package/src/form/field_bindings/RelationFieldBinding.tsx +4 -4
- package/src/form/field_bindings/RepeatFieldBinding.tsx +1 -1
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +3 -3
- package/src/form/form_utils.ts +3 -3
- package/src/hooks/index.ts +4 -4
- package/src/hooks/navigation/contexts/CollectionRegistryContext.tsx +2 -2
- package/src/hooks/navigation/useBuildCollectionRegistryController.tsx +11 -11
- package/src/hooks/navigation/useBuildNavigationStateController.tsx +5 -5
- package/src/hooks/navigation/useNavigationResolution.ts +28 -13
- package/src/hooks/navigation/useResolvedCollections.ts +8 -8
- package/src/hooks/navigation/useTopLevelNavigation.ts +2 -2
- package/src/hooks/navigation/utils.ts +5 -5
- package/src/hooks/{useBuildSideEntityController.tsx → useBuildSidePanel.tsx} +29 -29
- package/src/hooks/useCMSContext.tsx +7 -7
- package/src/hooks/{useEntityHistory.ts → useHistory.ts} +2 -2
- package/src/hooks/useResolvedNavigationFrom.tsx +10 -5
- package/src/hooks/{useEntitySelectionDialog.tsx → useSelectionDialog.tsx} +7 -7
- package/src/hooks/useSideDialogsController.tsx +1 -1
- package/src/hooks/useSidePanel.tsx +13 -0
- package/src/index.ts +15 -15
- package/src/preview/PropertyPreview.tsx +2 -2
- package/src/preview/components/DatePreview.tsx +1 -1
- package/src/preview/components/EnumValuesChip.tsx +1 -1
- package/src/preview/components/ImagePreview.tsx +1 -1
- package/src/preview/components/ReferencePreview.tsx +11 -11
- package/src/preview/components/RelationPreview.tsx +13 -12
- package/src/preview/components/StorageThumbnail.tsx +1 -1
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +1 -1
- package/src/preview/property_previews/ArrayOneOfPreview.tsx +1 -1
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +1 -1
- package/src/routes/RebaseRoute.tsx +12 -12
- package/src/types/components/EntityFormActionsProps.tsx +2 -2
- package/src/types/components/EntityFormProps.tsx +3 -3
- package/src/types/components/formex.tsx +1 -1
- package/src/types/fields.tsx +2 -2
- package/src/util/dataControllerAdapter.ts +9 -15
- package/src/util/navigation_utils.ts +7 -7
- package/src/util/previews.ts +7 -5
- package/src/util/property_utils.tsx +2 -2
- package/src/util/{entity_view_constants.ts → view_constants.ts} +1 -1
- package/dist/CollectionEditorDialog-BO_aQ-Z4.js.map +0 -1
- package/dist/PropertyEditView-DKzOpMjR.js.map +0 -1
- package/dist/RouterCollectionsStudioView-BQTIExjA.js.map +0 -1
- package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +0 -28
- package/dist/components/EntityCollectionTable/index.d.ts +0 -6
- package/dist/components/EntityCollectionView/EntityCard.d.ts +0 -21
- package/dist/components/EntityEditViewFormActions.d.ts +0 -3
- package/dist/components/EntitySidePanel.d.ts +0 -11
- package/dist/components/EntityView.d.ts +0 -13
- package/dist/contexts/SideEntityControllerContext.d.ts +0 -3
- package/dist/history-B3cqBzEV.js.map +0 -1
- package/dist/hooks/useBuildSideEntityController.d.ts +0 -6
- package/dist/hooks/useSideEntityController.d.ts +0 -11
- package/dist/src-cxV1ODRG.js.map +0 -1
- package/src/components/EntityCollectionTable/index.tsx +0 -14
- package/src/contexts/SideEntityControllerContext.tsx +0 -5
- package/src/hooks/useSideEntityController.tsx +0 -13
- /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/PropertyTableCell.d.ts +0 -0
- /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/column_utils.d.ts +0 -0
- /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationSelectorField.d.ts +0 -0
- /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableStorageUpload.d.ts +0 -0
- /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableSelect.d.ts +0 -0
- /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableUserSelect.d.ts +0 -0
- /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/CollectionTableToolbar.d.ts +0 -0
- /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCellActions.d.ts +0 -0
- /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useDraggable.d.ts +0 -0
- /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useWindowSize.d.ts +0 -0
- /package/dist/components/{EntityCollectionView → CollectionViewBinding}/FilterPresetsButton.d.ts +0 -0
- /package/dist/components/{EntityCollectionView → CollectionViewBinding}/FiltersDialog.d.ts +0 -0
- /package/dist/components/{EntityCollectionView → CollectionViewBinding}/ViewModeToggle.d.ts +0 -0
- /package/dist/components/{EntityCollectionView → CollectionViewBinding}/useSelectionController.d.ts +0 -0
- /package/dist/components/{EntityCollectionView → CollectionViewBinding}/utils.d.ts +0 -0
- /package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationSelectorField.tsx +0 -0
- /package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableSelect.tsx +0 -0
- /package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableUserSelect.tsx +0 -0
- /package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useDraggable.tsx +0 -0
- /package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useWindowSize.tsx +0 -0
- /package/src/components/{EntityCollectionView → CollectionViewBinding}/FilterPresetsButton.tsx +0 -0
- /package/src/components/{EntityCollectionView → CollectionViewBinding}/useSelectionController.tsx +0 -0
- /package/src/components/{EntityCollectionView → CollectionViewBinding}/utils.ts +0 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type {
|
|
1
|
+
import { useSelectionDialog } from "../../../hooks/useSelectionDialog";
|
|
2
|
+
import type { CollectionConfig } from "@rebasepro/types";
|
|
3
3
|
import React, { useMemo, useState } from "react";
|
|
4
4
|
import { VirtualTableWhereFilterOp } from "@rebasepro/ui";
|
|
5
5
|
import { Entity, EntityReference } from "@rebasepro/types";
|
|
6
6
|
import { ReferencePreview } from "../../../preview";
|
|
7
7
|
import { Button, Checkbox, Label, Select, SelectItem } from "@rebasepro/ui";
|
|
8
8
|
import { getReferenceFrom } from "@rebasepro/common";
|
|
9
|
-
import { useTranslation } from "@rebasepro/
|
|
9
|
+
import { useTranslation } from "@rebasepro/app";
|
|
10
10
|
import { useCollectionRegistryController } from "../../../index";
|
|
11
11
|
|
|
12
12
|
interface ReferenceFilterFieldProps {
|
|
@@ -20,6 +20,12 @@ interface ReferenceFilterFieldProps {
|
|
|
20
20
|
previewProperties?: string[];
|
|
21
21
|
hidden: boolean;
|
|
22
22
|
setHidden: (hidden: boolean) => void;
|
|
23
|
+
/**
|
|
24
|
+
* Restrict the offered operators (already resolved against engine
|
|
25
|
+
* capabilities and property config). When omitted, all operators this
|
|
26
|
+
* field can render are offered.
|
|
27
|
+
*/
|
|
28
|
+
operators?: readonly VirtualTableWhereFilterOp[];
|
|
23
29
|
}
|
|
24
30
|
|
|
25
31
|
const operationLabels = {
|
|
@@ -44,11 +50,12 @@ export function ReferenceFilterField({
|
|
|
44
50
|
path,
|
|
45
51
|
includeId = true,
|
|
46
52
|
previewProperties,
|
|
47
|
-
setHidden
|
|
53
|
+
setHidden,
|
|
54
|
+
operators
|
|
48
55
|
}: ReferenceFilterFieldProps) {
|
|
49
56
|
const { t } = useTranslation();
|
|
50
57
|
|
|
51
|
-
|
|
58
|
+
let possibleOperations: (keyof typeof operationLabels)[] = isArray
|
|
52
59
|
? ["array-contains"]
|
|
53
60
|
: ["==", "!=", ">", "<", ">=", "<="];
|
|
54
61
|
|
|
@@ -58,6 +65,10 @@ export function ReferenceFilterField({
|
|
|
58
65
|
possibleOperations.push("in", "not-in");
|
|
59
66
|
}
|
|
60
67
|
|
|
68
|
+
if (operators) {
|
|
69
|
+
possibleOperations = possibleOperations.filter(op => (operators as readonly string[]).includes(op));
|
|
70
|
+
}
|
|
71
|
+
|
|
61
72
|
const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];
|
|
62
73
|
const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(fieldOperation);
|
|
63
74
|
const [internalValue, setInternalValue] = useState<EntityReference | EntityReference[] | undefined | null>(fieldValue as EntityReference | EntityReference[] | undefined | null);
|
|
@@ -100,7 +111,7 @@ export function ReferenceFilterField({
|
|
|
100
111
|
}
|
|
101
112
|
|
|
102
113
|
const collectionRegistryController = useCollectionRegistryController();
|
|
103
|
-
const collection:
|
|
114
|
+
const collection: CollectionConfig | undefined = useMemo(() => {
|
|
104
115
|
return path ? collectionRegistryController.getCollection(path) : undefined;
|
|
105
116
|
}, [path]);
|
|
106
117
|
|
|
@@ -114,7 +125,7 @@ export function ReferenceFilterField({
|
|
|
114
125
|
|
|
115
126
|
const multiple = multipleSelectOperations.includes(operation);
|
|
116
127
|
|
|
117
|
-
const referenceDialogController =
|
|
128
|
+
const referenceDialogController = useSelectionDialog({
|
|
118
129
|
multiselect: multiple,
|
|
119
130
|
path,
|
|
120
131
|
collection,
|
|
@@ -147,6 +158,9 @@ export function ReferenceFilterField({
|
|
|
147
158
|
);
|
|
148
159
|
};
|
|
149
160
|
|
|
161
|
+
// All renderable operators were filtered out (engine/property narrowing).
|
|
162
|
+
if (possibleOperations.length === 0) return null;
|
|
163
|
+
|
|
150
164
|
return (
|
|
151
165
|
|
|
152
166
|
<div className="flex w-full flex-row">
|
|
@@ -157,7 +171,7 @@ export function ReferenceFilterField({
|
|
|
157
171
|
onValueChange={(value) => {
|
|
158
172
|
updateFilter(value as VirtualTableWhereFilterOp, internalValue);
|
|
159
173
|
}}
|
|
160
|
-
renderValue={(op) => operationLabels[op as
|
|
174
|
+
renderValue={(op) => operationLabels[op as keyof typeof operationLabels]}>
|
|
161
175
|
{possibleOperations.map((op) => (
|
|
162
176
|
<SelectItem key={op} value={op}>
|
|
163
177
|
{operationLabels[op]}
|
|
@@ -11,6 +11,12 @@ interface RelationFilterFieldProps {
|
|
|
11
11
|
relation: Relation; // relation config provided externally
|
|
12
12
|
hidden: boolean;
|
|
13
13
|
setHidden: (value: boolean) => void;
|
|
14
|
+
/**
|
|
15
|
+
* Restrict the offered operators (already resolved against engine
|
|
16
|
+
* capabilities and property config). When omitted, all operators this
|
|
17
|
+
* field can render are offered.
|
|
18
|
+
*/
|
|
19
|
+
operators?: readonly VirtualTableWhereFilterOp[];
|
|
14
20
|
}
|
|
15
21
|
|
|
16
22
|
const operationLabels = {
|
|
@@ -34,15 +40,20 @@ export function RelationFilterField({
|
|
|
34
40
|
relation,
|
|
35
41
|
name: _name,
|
|
36
42
|
hidden: _hidden,
|
|
37
|
-
setHidden: _setHidden
|
|
43
|
+
setHidden: _setHidden,
|
|
44
|
+
operators
|
|
38
45
|
}: RelationFilterFieldProps) {
|
|
39
46
|
|
|
40
47
|
const manyRelation = relation.cardinality === "many";
|
|
41
48
|
|
|
42
|
-
|
|
49
|
+
let possibleOperations: (keyof typeof operationLabels)[] = manyRelation
|
|
43
50
|
? ["array-contains", "array-contains-any"]
|
|
44
51
|
: ["==", "!=", ">", "<", ">=", "<=", "in", "not-in"];
|
|
45
52
|
|
|
53
|
+
if (operators) {
|
|
54
|
+
possibleOperations = possibleOperations.filter(op => (operators as readonly string[]).includes(op));
|
|
55
|
+
}
|
|
56
|
+
|
|
46
57
|
const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];
|
|
47
58
|
const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(fieldOperation);
|
|
48
59
|
const [internalValue, setInternalValue] = useState<EntityRelation | EntityRelation[] | undefined | null>(fieldValue);
|
|
@@ -89,6 +100,9 @@ export function RelationFilterField({
|
|
|
89
100
|
updateFilter(operation, newVal);
|
|
90
101
|
};
|
|
91
102
|
|
|
103
|
+
// All renderable operators were filtered out (engine/property narrowing).
|
|
104
|
+
if (possibleOperations.length === 0) return null;
|
|
105
|
+
|
|
92
106
|
return (
|
|
93
107
|
<div className="flex flex-row">
|
|
94
108
|
<div className="">
|
|
@@ -98,7 +112,7 @@ export function RelationFilterField({
|
|
|
98
112
|
onValueChange={(newOp) => {
|
|
99
113
|
updateFilter(newOp as VirtualTableWhereFilterOp, internalValue);
|
|
100
114
|
}}
|
|
101
|
-
renderValue={(op) => operationLabels[op as
|
|
115
|
+
renderValue={(op) => operationLabels[op as keyof typeof operationLabels]}
|
|
102
116
|
>
|
|
103
117
|
{possibleOperations.map((op) => (
|
|
104
118
|
<SelectItem key={op} value={op}>
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
XIcon
|
|
12
12
|
} from "@rebasepro/ui";
|
|
13
13
|
import { EnumValueConfig } from "@rebasepro/types";
|
|
14
|
-
import { useTranslation } from "@rebasepro/
|
|
14
|
+
import { useTranslation } from "@rebasepro/app";
|
|
15
15
|
|
|
16
16
|
interface StringNumberFilterFieldProps {
|
|
17
17
|
name: string,
|
|
@@ -21,6 +21,12 @@ interface StringNumberFilterFieldProps {
|
|
|
21
21
|
isArray?: boolean;
|
|
22
22
|
enumValues?: EnumValueConfig[];
|
|
23
23
|
title?: string;
|
|
24
|
+
/**
|
|
25
|
+
* Restrict the offered operators (already resolved against engine
|
|
26
|
+
* capabilities and property config). When omitted, all operators this
|
|
27
|
+
* field can render are offered.
|
|
28
|
+
*/
|
|
29
|
+
operators?: readonly VirtualTableWhereFilterOp[];
|
|
24
30
|
}
|
|
25
31
|
|
|
26
32
|
const operationLabels = {
|
|
@@ -34,11 +40,23 @@ const operationLabels = {
|
|
|
34
40
|
"not-in": "Not in",
|
|
35
41
|
"array-contains": "Contains",
|
|
36
42
|
"array-contains-any": "Any",
|
|
37
|
-
"
|
|
43
|
+
"ilike": "Contains",
|
|
44
|
+
"not-ilike": "Not contains",
|
|
45
|
+
"is-null": "Is null",
|
|
46
|
+
"is-not-null": "Is not null"
|
|
38
47
|
};
|
|
39
48
|
|
|
40
49
|
const multipleSelectOperations = ["array-contains-any", "in", "not-in"];
|
|
41
50
|
|
|
51
|
+
/** Operators that match a substring, wrapped in SQL wildcards (`%value%`). */
|
|
52
|
+
const containsOperations = ["ilike", "not-ilike"];
|
|
53
|
+
|
|
54
|
+
/** Strip the surrounding `%` wildcards a contains-filter adds, for display. */
|
|
55
|
+
function unwrapContains(value: unknown): string {
|
|
56
|
+
if (typeof value !== "string") return "";
|
|
57
|
+
return value.replace(/^%/, "").replace(/%$/, "");
|
|
58
|
+
}
|
|
59
|
+
|
|
42
60
|
export function StringNumberFilterField({
|
|
43
61
|
name,
|
|
44
62
|
value,
|
|
@@ -46,13 +64,20 @@ export function StringNumberFilterField({
|
|
|
46
64
|
type,
|
|
47
65
|
isArray,
|
|
48
66
|
enumValues,
|
|
49
|
-
title
|
|
67
|
+
title,
|
|
68
|
+
operators
|
|
50
69
|
}: StringNumberFilterFieldProps) {
|
|
51
70
|
const { t } = useTranslation();
|
|
52
71
|
|
|
53
|
-
|
|
72
|
+
let possibleOperations: (keyof typeof operationLabels)[] = isArray
|
|
54
73
|
? ["array-contains"]
|
|
55
|
-
: ["==", "!=", ">", "<", ">=", "<=", "is-null"];
|
|
74
|
+
: ["==", "!=", ">", "<", ">=", "<=", "is-null", "is-not-null"];
|
|
75
|
+
|
|
76
|
+
// Case-insensitive substring matching is only meaningful for free-text
|
|
77
|
+
// string columns (not numbers, arrays, or enums).
|
|
78
|
+
if (!isArray && !enumValues && type === "string") {
|
|
79
|
+
possibleOperations.push("ilike", "not-ilike");
|
|
80
|
+
}
|
|
56
81
|
|
|
57
82
|
if (enumValues) {
|
|
58
83
|
if (isArray) {
|
|
@@ -62,18 +87,47 @@ export function StringNumberFilterField({
|
|
|
62
87
|
}
|
|
63
88
|
}
|
|
64
89
|
|
|
90
|
+
if (operators) {
|
|
91
|
+
possibleOperations = possibleOperations.filter(op => (operators as readonly string[]).includes(op));
|
|
92
|
+
}
|
|
93
|
+
|
|
65
94
|
const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];
|
|
66
|
-
|
|
67
|
-
|
|
95
|
+
// Read back both the canonical null operators and the legacy `["==", null]` /
|
|
96
|
+
// `["!=", null]` form saved by older filter presets.
|
|
97
|
+
const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(
|
|
98
|
+
fieldOperation === "==" && fieldValue === null ? "is-null"
|
|
99
|
+
: fieldOperation === "!=" && fieldValue === null ? "is-not-null"
|
|
100
|
+
: fieldOperation
|
|
101
|
+
);
|
|
102
|
+
const [internalValue, setInternalValue] = useState<string | number | string[] | number[] | null | undefined>(
|
|
103
|
+
containsOperations.includes(fieldOperation) ? unwrapContains(fieldValue) : (fieldValue as string | number | string[] | number[] | null | undefined)
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
const isNullOperation = operation === "is-null" || operation === "is-not-null";
|
|
68
107
|
|
|
69
|
-
|
|
108
|
+
// All renderable operators were filtered out (engine/property narrowing).
|
|
109
|
+
if (possibleOperations.length === 0) return null;
|
|
70
110
|
|
|
71
|
-
function updateFilter(op: VirtualTableWhereFilterOp
|
|
72
|
-
//
|
|
73
|
-
if (op === "is-null") {
|
|
111
|
+
function updateFilter(op: VirtualTableWhereFilterOp, val: string | number | string[] | number[] | null | undefined) {
|
|
112
|
+
// Null-testing operators ignore their value.
|
|
113
|
+
if (op === "is-null" || op === "is-not-null") {
|
|
74
114
|
setOperation(op);
|
|
75
115
|
setInternalValue(null);
|
|
76
|
-
setValue([
|
|
116
|
+
setValue([op, null]);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Substring matching: keep the raw text in the field, emit it wrapped
|
|
121
|
+
// in SQL wildcards so the backend runs `column ILIKE '%value%'`.
|
|
122
|
+
if (op === "ilike" || op === "not-ilike") {
|
|
123
|
+
const raw = typeof val === "string" ? val : "";
|
|
124
|
+
setOperation(op);
|
|
125
|
+
setInternalValue(raw);
|
|
126
|
+
if (raw.length > 0) {
|
|
127
|
+
setValue([op, `%${raw}%`]);
|
|
128
|
+
} else {
|
|
129
|
+
setValue(undefined);
|
|
130
|
+
}
|
|
77
131
|
return;
|
|
78
132
|
}
|
|
79
133
|
|
|
@@ -121,7 +175,7 @@ export function StringNumberFilterField({
|
|
|
121
175
|
fullWidth={true}
|
|
122
176
|
position={"item-aligned"}
|
|
123
177
|
onValueChange={(value) => {
|
|
124
|
-
updateFilter(value as VirtualTableWhereFilterOp
|
|
178
|
+
updateFilter(value as VirtualTableWhereFilterOp, internalValue);
|
|
125
179
|
}}
|
|
126
180
|
renderValue={(op) => operationLabels[op as keyof typeof operationLabels]}>
|
|
127
181
|
{possibleOperations.map((op) => (
|
|
@@ -2,9 +2,9 @@ import type { SideDialogPanelProps } from "../hooks/useSideDialogsController";
|
|
|
2
2
|
import React, { useCallback, useContext, useEffect, useState, useMemo } from "react";
|
|
3
3
|
import { useSideDialogsController } from "../hooks";
|
|
4
4
|
import { Sheet, Dialog } from "@rebasepro/ui";
|
|
5
|
-
import { useUnsavedChangesDialog, UnsavedChangesDialog } from "@rebasepro/
|
|
5
|
+
import { useUnsavedChangesDialog, UnsavedChangesDialog } from "@rebasepro/app";
|
|
6
6
|
import { ErrorBoundary } from "@rebasepro/ui";
|
|
7
|
-
import type {
|
|
7
|
+
import type { SidePanelBindingProps } from "@rebasepro/types";
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
export type SideDialogController = {
|
|
@@ -41,7 +41,7 @@ export const useSideDialogContext = () => useContext<SideDialogController>(SideD
|
|
|
41
41
|
|
|
42
42
|
/**
|
|
43
43
|
* This is the component in charge of rendering the side dialogs used
|
|
44
|
-
* for editing entities. Use the {@link
|
|
44
|
+
* for editing entities. Use the {@link useSidePanel} to open
|
|
45
45
|
* and control the dialogs.
|
|
46
46
|
* This component needs a parent {@link Rebase}
|
|
47
47
|
* {@link useSideDialogsController}
|
|
@@ -146,7 +146,7 @@ function SideDialogView({
|
|
|
146
146
|
setPendingClose
|
|
147
147
|
}), [blocked, setBlockedNavigationMessage, width, onCloseRequest, pendingClose]);
|
|
148
148
|
|
|
149
|
-
const additionalProps = panel?.additional as
|
|
149
|
+
const additionalProps = panel?.additional as SidePanelBindingProps | undefined;
|
|
150
150
|
const isDialogMode = additionalProps?.collection?.openEntityMode === "dialog";
|
|
151
151
|
|
|
152
152
|
return (
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
1
|
+
import type { CollectionConfig } from "@rebasepro/types";
|
|
2
|
+
import type { SidePanelBindingProps } from "@rebasepro/types";
|
|
3
3
|
import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
4
4
|
|
|
5
5
|
import type { OnUpdateParams } from "../types/components/EntityFormProps";
|
|
6
6
|
import { ErrorBoundary } from "@rebasepro/ui";
|
|
7
7
|
import { IconButton, Maximize2Icon, XIcon } from "@rebasepro/ui";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { EditViewBinding } from "./EditViewBinding";
|
|
9
|
+
import { DetailViewBinding } from "./DetailViewBinding";
|
|
10
10
|
import { useSideDialogContext } from "./SideDialogs";
|
|
11
11
|
import { useNavigate } from "react-router-dom";
|
|
12
|
-
import { saveEntityToMemoryCache, useComponentOverride } from "@rebasepro/
|
|
13
|
-
import { useCollectionRegistryController,
|
|
12
|
+
import { saveEntityToMemoryCache, useComponentOverride } from "@rebasepro/app";
|
|
13
|
+
import { useCollectionRegistryController, useSidePanel } from "../index";
|
|
14
14
|
import { useUrlController } from "../index";
|
|
15
15
|
import { resolveDefaultSelectedView } from "@rebasepro/common";
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
* This is the component in charge of rendering the side dialog used
|
|
19
|
-
* for editing entities. Use the {@link
|
|
19
|
+
* for editing entities. Use the {@link useSidePanel} to open
|
|
20
20
|
* and control the dialogs.
|
|
21
21
|
* This component needs a parent {@link Rebase}
|
|
22
|
-
* {@link
|
|
22
|
+
* {@link useSidePanel}
|
|
23
23
|
* @group Components
|
|
24
24
|
*/
|
|
25
|
-
export function
|
|
25
|
+
export function SidePanelBinding(props: SidePanelBindingProps) {
|
|
26
26
|
|
|
27
27
|
const {
|
|
28
28
|
allowFullScreen = true,
|
|
@@ -32,7 +32,7 @@ export function EntitySidePanel(props: EntitySidePanelProps) {
|
|
|
32
32
|
formProps
|
|
33
33
|
} = props;
|
|
34
34
|
|
|
35
|
-
const ResolvedDetailView = useComponentOverride("
|
|
35
|
+
const ResolvedDetailView = useComponentOverride("DetailView", DetailViewBinding);
|
|
36
36
|
|
|
37
37
|
const {
|
|
38
38
|
blocked,
|
|
@@ -43,7 +43,7 @@ export function EntitySidePanel(props: EntitySidePanelProps) {
|
|
|
43
43
|
|
|
44
44
|
const navigate = useNavigate();
|
|
45
45
|
|
|
46
|
-
const
|
|
46
|
+
const sidePanelController = useSidePanel();
|
|
47
47
|
const collectionRegistryController = useCollectionRegistryController();
|
|
48
48
|
const sideDialogsController = useSideDialogContext();
|
|
49
49
|
const urlController = useUrlController();
|
|
@@ -63,7 +63,7 @@ export function EntitySidePanel(props: EntitySidePanelProps) {
|
|
|
63
63
|
}
|
|
64
64
|
setShowEditInPanel(false);
|
|
65
65
|
if (params.status !== "existing") {
|
|
66
|
-
|
|
66
|
+
sidePanelController.replace({
|
|
67
67
|
path: params.path,
|
|
68
68
|
entityId: params.entityId,
|
|
69
69
|
selectedTab: params.selectedTab,
|
|
@@ -102,7 +102,7 @@ export function EntitySidePanel(props: EntitySidePanelProps) {
|
|
|
102
102
|
// defaultSelectedView, update the panel width and URL to match.
|
|
103
103
|
// This handles cases where defaultSelectedView is set via the collection
|
|
104
104
|
// editor / Studio and is not available on the collection object the
|
|
105
|
-
// caller passed to
|
|
105
|
+
// caller passed to sidePanelController.open().
|
|
106
106
|
const hasCorrectedDefaultView = useRef(false);
|
|
107
107
|
useEffect(() => {
|
|
108
108
|
hasCorrectedDefaultView.current = false;
|
|
@@ -119,7 +119,7 @@ entityId }
|
|
|
119
119
|
);
|
|
120
120
|
if (effectiveDefault && effectiveDefault !== "edit") {
|
|
121
121
|
hasCorrectedDefaultView.current = true;
|
|
122
|
-
|
|
122
|
+
sidePanelController.replace({
|
|
123
123
|
path,
|
|
124
124
|
entityId,
|
|
125
125
|
selectedTab: effectiveDefault,
|
|
@@ -127,7 +127,7 @@ entityId }
|
|
|
127
127
|
collection
|
|
128
128
|
});
|
|
129
129
|
}
|
|
130
|
-
}, [selectedTab, entityId, collection, path,
|
|
130
|
+
}, [selectedTab, entityId, collection, path, sidePanelController]);
|
|
131
131
|
|
|
132
132
|
// Note: beforeunload is handled by useUnsavedChangesDialog in SideDialogView,
|
|
133
133
|
// which listens to the same `blocked` state via SideDialogContext.
|
|
@@ -150,7 +150,7 @@ entityId }
|
|
|
150
150
|
? <ResolvedDetailView
|
|
151
151
|
path={path}
|
|
152
152
|
layout={collection?.openEntityMode === "dialog" ? "dialog" : "side_panel"}
|
|
153
|
-
collection={collection as
|
|
153
|
+
collection={collection as CollectionConfig}
|
|
154
154
|
entityId={entityId!}
|
|
155
155
|
parentCollectionSlugs={parentCollectionSlugs}
|
|
156
156
|
parentEntityIds={parentEntityIds}
|
|
@@ -186,7 +186,7 @@ entityId }
|
|
|
186
186
|
return;
|
|
187
187
|
}
|
|
188
188
|
if (tabEntityId) {
|
|
189
|
-
|
|
189
|
+
sidePanelController.replace({
|
|
190
190
|
path,
|
|
191
191
|
entityId: tabEntityId,
|
|
192
192
|
selectedTab,
|
|
@@ -196,10 +196,10 @@ entityId }
|
|
|
196
196
|
}
|
|
197
197
|
}}
|
|
198
198
|
/>
|
|
199
|
-
: <
|
|
199
|
+
: <EditViewBinding
|
|
200
200
|
{...props}
|
|
201
201
|
layout={collection?.openEntityMode === "dialog" ? "dialog" : "side_panel"}
|
|
202
|
-
collection={collection as
|
|
202
|
+
collection={collection as CollectionConfig}
|
|
203
203
|
parentCollectionSlugs={parentCollectionSlugs} parentEntityIds={parentEntityIds}
|
|
204
204
|
onValuesModified={onValuesModified}
|
|
205
205
|
onSaved={onUpdate}
|
|
@@ -242,7 +242,7 @@ entityId }
|
|
|
242
242
|
return;
|
|
243
243
|
}
|
|
244
244
|
if (tabEntityId) {
|
|
245
|
-
|
|
245
|
+
sidePanelController.replace({
|
|
246
246
|
path,
|
|
247
247
|
entityId: tabEntityId,
|
|
248
248
|
selectedTab,
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { SidePanelController } from "@rebasepro/types";
|
|
2
2
|
import React from "react";
|
|
3
|
-
import {
|
|
3
|
+
import { useBuildSidePanel } from "../hooks/useBuildSidePanel";
|
|
4
4
|
import { useBuildSideDialogsController } from "../hooks/useBuildSideDialogsController";
|
|
5
|
-
import {
|
|
5
|
+
import { SidePanelControllerContext } from "../hooks/useSidePanel";
|
|
6
6
|
import { SideDialogsControllerContext } from "../contexts/SideDialogsControllerContext";
|
|
7
7
|
import { BreadcrumbsProvider } from "../contexts/BreacrumbsContext";
|
|
8
8
|
import { useBreadcrumbsController } from "../hooks/useBreadcrumbsController";
|
|
9
9
|
import { useCollectionRegistryController, useUrlController } from "../index";
|
|
10
10
|
import { useNavigationStateController } from "../index";
|
|
11
|
-
import { useAuthController, useBridgeRegistration } from "@rebasepro/
|
|
11
|
+
import { useAuthController, useBridgeRegistration } from "@rebasepro/app";
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
|
-
* Provider that builds the
|
|
15
|
-
* via the
|
|
14
|
+
* Provider that builds the SidePanelController and makes it available
|
|
15
|
+
* via the SidePanelControllerContext from @rebasepro/app.
|
|
16
16
|
*
|
|
17
|
-
* After the CMS extraction refactor, `
|
|
17
|
+
* After the CMS extraction refactor, `useBuildSidePanel` lives
|
|
18
18
|
* in the CMS package while the context it feeds into lives in core.
|
|
19
19
|
* This provider bridges the two: place it inside the `<Rebase>` tree and
|
|
20
|
-
* above any component that calls `
|
|
20
|
+
* above any component that calls `useSidePanel()`.
|
|
21
21
|
*
|
|
22
22
|
* Also auto-registers the side entity controller and breadcrumbs into the
|
|
23
23
|
* self-assembling Studio bridge (when a StudioBridgeRegistryProvider is
|
|
@@ -27,25 +27,25 @@ import { useAuthController, useBridgeRegistration } from "@rebasepro/core";
|
|
|
27
27
|
* ```tsx
|
|
28
28
|
* <Rebase ...>
|
|
29
29
|
* {({ loading }) => (
|
|
30
|
-
* <
|
|
30
|
+
* <SidePanelProvider>
|
|
31
31
|
* <RebaseRoutes>
|
|
32
32
|
* ...
|
|
33
33
|
* </RebaseRoutes>
|
|
34
|
-
* </
|
|
34
|
+
* </SidePanelProvider>
|
|
35
35
|
* )}
|
|
36
36
|
* </Rebase>
|
|
37
37
|
* ```
|
|
38
38
|
*
|
|
39
39
|
* @group Components
|
|
40
40
|
*/
|
|
41
|
-
export function
|
|
41
|
+
export function SidePanelProvider({ children }: { children: React.ReactNode }) {
|
|
42
42
|
const collectionRegistryController = useCollectionRegistryController();
|
|
43
43
|
const urlController = useUrlController();
|
|
44
44
|
const navigationStateController = useNavigationStateController();
|
|
45
45
|
const sideDialogsController = useBuildSideDialogsController();
|
|
46
46
|
const authController = useAuthController();
|
|
47
47
|
|
|
48
|
-
const
|
|
48
|
+
const sidePanelController = useBuildSidePanel(
|
|
49
49
|
collectionRegistryController,
|
|
50
50
|
urlController,
|
|
51
51
|
navigationStateController,
|
|
@@ -56,10 +56,10 @@ export function SideEntityProvider({ children }: { children: React.ReactNode })
|
|
|
56
56
|
return (
|
|
57
57
|
<BreadcrumbsProvider>
|
|
58
58
|
<SideDialogsControllerContext.Provider value={sideDialogsController}>
|
|
59
|
-
<
|
|
60
|
-
<BridgeAutoRegistrar
|
|
59
|
+
<SidePanelControllerContext.Provider value={sidePanelController}>
|
|
60
|
+
<BridgeAutoRegistrar sidePanelController={sidePanelController}/>
|
|
61
61
|
{children}
|
|
62
|
-
</
|
|
62
|
+
</SidePanelControllerContext.Provider>
|
|
63
63
|
</SideDialogsControllerContext.Provider>
|
|
64
64
|
</BreadcrumbsProvider>
|
|
65
65
|
);
|
|
@@ -69,9 +69,9 @@ export function SideEntityProvider({ children }: { children: React.ReactNode })
|
|
|
69
69
|
* Internal component that auto-registers side entity and breadcrumbs
|
|
70
70
|
* into the Studio bridge. Must be a child of BreadcrumbsProvider.
|
|
71
71
|
*/
|
|
72
|
-
function BridgeAutoRegistrar({
|
|
72
|
+
function BridgeAutoRegistrar({ sidePanelController }: { sidePanelController: SidePanelController }) {
|
|
73
73
|
const breadcrumbs = useBreadcrumbsController();
|
|
74
|
-
useBridgeRegistration("
|
|
74
|
+
useBridgeRegistration("sidePanelController", sidePanelController);
|
|
75
75
|
useBridgeRegistration("breadcrumbs", breadcrumbs);
|
|
76
76
|
return null;
|
|
77
77
|
}
|
|
@@ -21,7 +21,7 @@ import * as React from "react";
|
|
|
21
21
|
import { useCallback, useEffect, useRef, useState } from "react";
|
|
22
22
|
import { Command as CommandPrimitive } from "cmdk";
|
|
23
23
|
import { User } from "@rebasepro/types";
|
|
24
|
-
import { useRebaseClient, useAuthController, UserDisplay } from "@rebasepro/
|
|
24
|
+
import { useRebaseClient, useAuthController, UserDisplay } from "@rebasepro/app";
|
|
25
25
|
import { EmptyValue } from "../preview";
|
|
26
26
|
|
|
27
27
|
interface UserSelectorItem {
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
Tooltip,
|
|
14
14
|
Typography
|
|
15
15
|
} from "@rebasepro/ui";
|
|
16
|
-
import { useSnackbarController, useTranslation } from "@rebasepro/
|
|
16
|
+
import { useSnackbarController, useTranslation } from "@rebasepro/app";
|
|
17
17
|
import { UserCreationResult } from "@rebasepro/types";
|
|
18
18
|
|
|
19
19
|
export function CreationResultDialog({
|
|
@@ -90,8 +90,11 @@ export function CreationResultDialog({
|
|
|
90
90
|
<div className="flex flex-col gap-4 py-2">
|
|
91
91
|
<Alert color="warning">
|
|
92
92
|
<Typography variant="body2">
|
|
93
|
-
{
|
|
94
|
-
"
|
|
93
|
+
{result.emailDeliveryFailed
|
|
94
|
+
? (t("temporary_password_email_failed_description") ??
|
|
95
|
+
"The email could not be delivered. Share this temporary password with the user securely. It will not be shown again.")
|
|
96
|
+
: (t("temporary_password_description") ??
|
|
97
|
+
"Email is not configured. Share this temporary password with the user securely. It will not be shown again.")}
|
|
95
98
|
</Typography>
|
|
96
99
|
</Alert>
|
|
97
100
|
|
|
@@ -3,7 +3,7 @@ import { cls, defaultBorderMixin, IconButton, Sheet, Tooltip } from "@rebasepro/
|
|
|
3
3
|
import { ChevronLeftIcon, ErrorBoundary, MenuIcon } from "@rebasepro/ui";
|
|
4
4
|
import { deepEqual as equal } from "fast-equals"
|
|
5
5
|
|
|
6
|
-
import { useLargeLayout, useAdminModeController, useTranslation } from "@rebasepro/
|
|
6
|
+
import { useLargeLayout, useAdminModeController, useTranslation } from "@rebasepro/app";
|
|
7
7
|
import { AppContext } from "./useApp";
|
|
8
8
|
|
|
9
9
|
export const DRAWER_WIDTH = 280;
|
|
@@ -141,8 +141,12 @@ export const Scaffold = React.memo<PropsWithChildren<ScaffoldProps>>(
|
|
|
141
141
|
|
|
142
142
|
<div
|
|
143
143
|
className={cls(defaultBorderMixin, "bg-surface-50 dark:bg-surface-800", "grow overflow-auto m-0", {
|
|
144
|
-
"lg:mt-4": !hasAppBar,
|
|
145
144
|
"mt-1 lg:m-0 lg:mx-2 lg:mb-2 lg:rounded-lg lg:border-t lg:border-x lg:border-solid": padding,
|
|
145
|
+
// No app bar means no DrawerHeader spacer above, so inset the
|
|
146
|
+
// panel by the same amount as its sides and bottom.
|
|
147
|
+
// Must come after the padding classes, which reset lg margins.
|
|
148
|
+
"lg:mt-2": !hasAppBar && padding,
|
|
149
|
+
"lg:mt-4": !hasAppBar && !padding,
|
|
146
150
|
"border-t": hasAppBar && !padding
|
|
147
151
|
})}>
|
|
148
152
|
|