@rebasepro/admin 0.0.1-canary.eae7889 → 0.0.1-canary.eb08332
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/LICENSE +21 -6
- package/README.md +139 -0
- package/dist/CollectionEditorDialog-DKGlYDPc.js +3630 -0
- package/dist/CollectionEditorDialog-DKGlYDPc.js.map +1 -0
- package/dist/PropertyEditView-h0N-AMCY.js +3808 -0
- package/dist/PropertyEditView-h0N-AMCY.js.map +1 -0
- package/dist/RouterCollectionsStudioView-DdEStpFk.js +192 -0
- package/dist/RouterCollectionsStudioView-DdEStpFk.js.map +1 -0
- package/dist/collection_editor/ConfigControllerProvider.d.ts +2 -11
- package/dist/collection_editor/_cms_internals.d.ts +4 -4
- package/dist/collection_editor/api/generateCollectionApi.d.ts +10 -9
- package/dist/collection_editor/extensibility_types.d.ts +135 -0
- package/dist/collection_editor/index.d.ts +6 -1
- package/dist/collection_editor/pgColumnToProperty.d.ts +3 -3
- package/dist/collection_editor/serializable_types.d.ts +370 -0
- package/dist/collection_editor/serializable_utils.d.ts +50 -0
- package/dist/collection_editor/types/collection_editor_controller.d.ts +11 -10
- package/dist/collection_editor/types/collection_inference.d.ts +2 -2
- package/dist/collection_editor/types/config_controller.d.ts +21 -14
- package/dist/collection_editor/ui/AddKanbanColumnAction.d.ts +7 -5
- package/dist/collection_editor/ui/CollectionViewHeaderAction.d.ts +7 -5
- package/dist/collection_editor/ui/EditorCollectionAction.d.ts +1 -1
- package/dist/collection_editor/ui/EditorCollectionActionStart.d.ts +1 -1
- package/dist/collection_editor/ui/EditorEntityAction.d.ts +1 -1
- package/dist/collection_editor/ui/HomePageEditorCollectionAction.d.ts +1 -1
- package/dist/collection_editor/ui/KanbanSetupAction.d.ts +7 -5
- package/dist/collection_editor/ui/MissingReferenceWidget.d.ts +1 -1
- package/dist/collection_editor/ui/NewCollectionButton.d.ts +1 -1
- package/dist/collection_editor/ui/NewCollectionCard.d.ts +1 -1
- package/dist/collection_editor/ui/PropertyAddColumnComponent.d.ts +6 -5
- package/dist/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.d.ts +4 -4
- package/dist/collection_editor/ui/collection_editor/AIModifiedPathsContext.d.ts +1 -1
- package/dist/collection_editor/ui/collection_editor/CollectionDetailsForm.d.ts +7 -7
- package/dist/collection_editor/ui/collection_editor/CollectionEditorDialog.d.ts +10 -11
- package/dist/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.d.ts +4 -4
- package/dist/collection_editor/ui/collection_editor/CollectionJsonImportDialog.d.ts +4 -3
- package/dist/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.d.ts +17 -7
- package/dist/collection_editor/ui/collection_editor/CollectionRLSTab.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/CollectionRelationsTab.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/CollectionStudioView.d.ts +14 -1
- package/dist/collection_editor/ui/collection_editor/CollectionYupValidation.d.ts +1 -9
- package/dist/collection_editor/ui/collection_editor/CollectionsStudioView.d.ts +25 -2
- package/dist/collection_editor/ui/collection_editor/DisplaySettingsForm.d.ts +4 -2
- package/dist/collection_editor/ui/collection_editor/EntityActionsEditTab.d.ts +4 -3
- package/dist/collection_editor/ui/collection_editor/EntityActionsSelectDialog.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/EntityCustomViewsSelectDialog.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/EnumForm.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/GeneralSettingsForm.d.ts +8 -4
- package/dist/collection_editor/ui/collection_editor/GetCodeDialog.d.ts +4 -3
- package/dist/collection_editor/ui/collection_editor/KanbanConfigSection.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/LayoutModeSwitch.d.ts +3 -3
- package/dist/collection_editor/ui/collection_editor/PropertyEditView.d.ts +17 -5
- package/dist/collection_editor/ui/collection_editor/PropertyFieldPreview.d.ts +2 -2
- package/dist/collection_editor/ui/collection_editor/PropertyTree.d.ts +2 -2
- package/dist/collection_editor/ui/collection_editor/RouterCollectionStudioView.d.ts +15 -0
- package/dist/collection_editor/ui/collection_editor/RouterCollectionsStudioView.d.ts +14 -0
- package/dist/collection_editor/ui/collection_editor/SubcollectionsEditTab.d.ts +8 -6
- package/dist/collection_editor/ui/collection_editor/SwitchControl.d.ts +3 -2
- package/dist/collection_editor/ui/collection_editor/ViewModeSwitch.d.ts +1 -1
- package/dist/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.d.ts +1 -1
- package/dist/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.d.ts +3 -2
- package/dist/collection_editor/ui/collection_editor/properties/BlockPropertyField.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/BooleanPropertyField.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/DateTimePropertyField.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/EnumPropertyField.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/KeyValuePropertyField.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/MapPropertyField.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/NumberPropertyField.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/ReferencePropertyField.d.ts +3 -2
- package/dist/collection_editor/ui/collection_editor/properties/RelationPropertyField.d.ts +3 -8
- package/dist/collection_editor/ui/collection_editor/properties/RepeatPropertyField.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/StoragePropertyField.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/StringPropertyField.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/UrlPropertyField.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/VectorPropertyField.d.ts +4 -0
- package/dist/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/conditions/ConditionsPanel.d.ts +1 -1
- package/dist/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.d.ts +2 -1
- package/dist/collection_editor/ui/collection_editor/properties/validation/ValidationPanel.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/useJsonCollectionsConfigController.d.ts +37 -0
- package/dist/collection_editor/useLocalCollectionsConfigController.d.ts +2 -2
- package/dist/collection_editor/useSafeSnackbarController.d.ts +2 -0
- package/dist/collection_editor/validateCollectionJson.d.ts +2 -2
- package/dist/collection_editor_ui.d.ts +4 -0
- package/dist/collection_editor_ui.js +33 -11
- package/dist/collection_editor_ui.js.map +1 -1
- package/dist/components/ArrayContainer.d.ts +5 -5
- package/dist/components/ClearFilterSortButton.d.ts +1 -1
- package/dist/components/CollectionEditorDialogs.d.ts +2 -1
- package/dist/components/CollectionPanel.d.ts +58 -0
- package/dist/components/{EntityCollectionTable/EntityCollectionRowActions.d.ts → CollectionTableBinding/CollectionRowActions.d.ts} +5 -5
- package/dist/components/CollectionTableBinding/CollectionTableBinding.d.ts +28 -0
- package/dist/components/{EntityCollectionTable/EntityCollectionTableProps.d.ts → CollectionTableBinding/CollectionTableBindingProps.d.ts} +4 -4
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/column_utils.d.ts +2 -2
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableMultipleRelationField.d.ts +6 -6
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableReferenceField.d.ts +6 -6
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationField.d.ts +6 -6
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationSelectorField.d.ts +3 -2
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableStorageUpload.d.ts +4 -4
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableSelect.d.ts +1 -1
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableUserSelect.d.ts +1 -1
- package/dist/components/CollectionTableBinding/index.d.ts +6 -0
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/CollectionTableToolbar.d.ts +5 -1
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCell.d.ts +3 -3
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCellActions.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 +7 -6
- package/dist/components/{EntityCollectionTable → CollectionTableBinding}/table_bindings.d.ts +4 -3
- package/dist/components/CollectionViewBinding/BoardCardBinding.d.ts +31 -0
- package/dist/components/CollectionViewBinding/CollectionBoardViewBinding.d.ts +22 -0
- package/dist/components/{EntityCollectionView/EntityCollectionCardView.d.ts → CollectionViewBinding/CollectionCardViewBinding.d.ts} +5 -5
- package/dist/components/CollectionViewBinding/CollectionListViewBinding.d.ts +50 -0
- package/dist/components/CollectionViewBinding/CollectionViewActions.d.ts +20 -0
- package/dist/components/CollectionViewBinding/CollectionViewBinding.d.ts +41 -0
- package/dist/components/CollectionViewBinding/CollectionViewStartActions.d.ts +21 -0
- package/dist/components/CollectionViewBinding/EntityCardBinding.d.ts +21 -0
- package/dist/components/CollectionViewBinding/FilterPresetsButton.d.ts +22 -0
- package/dist/components/{EntityCollectionView → CollectionViewBinding}/FiltersDialog.d.ts +3 -2
- package/dist/components/{EntityCollectionView → CollectionViewBinding}/SplitListView.d.ts +6 -5
- package/dist/components/{EntityCollectionView → CollectionViewBinding}/ViewModeToggle.d.ts +2 -1
- package/dist/components/{EntityCollectionView → CollectionViewBinding}/hooks/useCollectionInlineEditor.d.ts +3 -3
- package/dist/components/{EntityCollectionView → CollectionViewBinding}/hooks/useKanbanDragAndDrop.d.ts +7 -6
- 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/DefaultAppBar.d.ts +18 -1
- package/dist/components/DefaultDrawer.d.ts +53 -5
- package/dist/components/DeleteEntityDialog.d.ts +6 -5
- package/dist/components/DetailViewBinding.d.ts +28 -0
- package/dist/components/DrawerNavigationGroup.d.ts +1 -1
- package/dist/components/DrawerNavigationItem.d.ts +1 -1
- package/dist/components/EditFormActions.d.ts +3 -0
- package/dist/components/EditViewBinding.d.ts +58 -0
- package/dist/components/{EntityPreview.d.ts → EntityPreviewBinding.d.ts} +14 -14
- package/dist/components/EntityViewBinding.d.ts +13 -0
- package/dist/components/FieldCaption.d.ts +1 -1
- package/dist/components/HomePage/ContentHomePage.d.ts +1 -1
- package/dist/components/HomePage/FavouritesView.d.ts +1 -1
- package/dist/components/HomePage/HomePageDnD.d.ts +7 -7
- package/dist/components/HomePage/NavigationCard.d.ts +1 -1
- package/dist/components/HomePage/NavigationCardBinding.d.ts +2 -1
- package/dist/components/HomePage/NavigationGroup.d.ts +2 -2
- package/dist/components/HomePage/RenameGroupDialog.d.ts +2 -1
- package/dist/components/HomePage/SmallNavigationCard.d.ts +1 -1
- package/dist/components/JsonPreviewBinding.d.ts +4 -0
- package/dist/components/PropertyCollectionView.d.ts +3 -2
- package/dist/components/PropertyIdCopyTooltip.d.ts +3 -3
- package/dist/components/{RebaseCMS.d.ts → RebaseAdmin.d.ts} +2 -2
- package/dist/components/RebaseAuthGate.d.ts +1 -1
- package/dist/components/RebaseLayout.d.ts +6 -5
- package/dist/components/RebaseNavigation.d.ts +2 -2
- package/dist/components/RebaseRouteDefs.d.ts +2 -2
- package/dist/components/RebaseShell.d.ts +2 -1
- package/dist/components/ReferenceTable/{EntitySelectionTable.d.ts → SelectionTableBinding.d.ts} +6 -6
- package/dist/components/ReferenceWidget.d.ts +3 -2
- package/dist/components/RelationSelector.d.ts +1 -1
- package/dist/components/SearchIconsView.d.ts +2 -1
- package/dist/components/SelectableTable/SelectableTable.d.ts +11 -11
- package/dist/components/SelectableTable/SelectableTableContext.d.ts +3 -3
- package/dist/components/SelectableTable/SelectionStore.d.ts +16 -22
- package/dist/components/SelectableTable/filters/BooleanFilterField.d.ts +9 -3
- package/dist/components/SelectableTable/filters/DateTimeFilterField.d.ts +10 -3
- package/dist/components/SelectableTable/filters/FilterFieldBinding.d.ts +40 -0
- package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +10 -3
- package/dist/components/SelectableTable/filters/RelationFilterField.d.ts +8 -1
- package/dist/components/SelectableTable/filters/StringNumberFilterField.d.ts +10 -3
- package/dist/components/SideDialogs.d.ts +2 -2
- package/dist/components/SidePanelBinding.d.ts +11 -0
- package/dist/components/{SideEntityProvider.d.ts → SidePanelProvider.d.ts} +8 -8
- package/dist/components/admin/CreationResultDialog.d.ts +6 -0
- package/dist/components/admin/index.d.ts +1 -3
- package/dist/components/app/AppBar.d.ts +1 -1
- package/dist/components/app/Drawer.d.ts +9 -2
- package/dist/components/common/default_entity_actions.d.ts +8 -1
- package/dist/components/field_configs.d.ts +1 -1
- package/dist/components/history/EntityHistoryEntry.d.ts +3 -3
- package/dist/components/history/EntityHistoryView.d.ts +1 -1
- package/dist/components/history/LastEditedByFormAction.d.ts +2 -1
- package/dist/components/history/LastEditedByIndicator.d.ts +4 -3
- package/dist/components/history/UserChip.d.ts +1 -1
- package/dist/components/index.d.ts +16 -13
- package/dist/contexts/SidePanelControllerContext.d.ts +3 -0
- package/dist/data_export/export/BasicExportAction.d.ts +2 -1
- package/dist/data_export/export/ExportCollectionAction.d.ts +4 -4
- package/dist/data_export/export/export.d.ts +3 -3
- package/dist/data_import/components/DataNewPropertiesMapping.d.ts +1 -1
- package/dist/data_import/components/ImportFileUpload.d.ts +1 -1
- package/dist/data_import/components/ImportNewPropertyFieldPreview.d.ts +2 -1
- package/dist/data_import/components/ImportSaveInProgress.d.ts +3 -3
- package/dist/data_import/import/ImportCollectionAction.d.ts +4 -3
- package/dist/data_import/utils/data.d.ts +1 -1
- package/dist/data_import/utils/file_headers.d.ts +6 -1
- package/dist/data_import/utils/file_to_json.d.ts +1 -11
- package/dist/data_import/utils/transforms.d.ts +11 -0
- package/dist/editor/components/SlashCommandMenu.d.ts +2 -1
- package/dist/editor/components/editor-bubble.d.ts +5 -1
- package/dist/editor/components/image-bubble.d.ts +5 -1
- package/dist/editor/components/index.d.ts +3 -3
- package/dist/editor/components/table-bubble.d.ts +5 -1
- package/dist/editor/editor.d.ts +4 -4
- package/dist/editor/nodeViews/ReactNodeView.d.ts +4 -1
- package/dist/editor/selectors/color-selector.d.ts +1 -1
- package/dist/editor/selectors/link-selector.d.ts +1 -1
- package/dist/editor/selectors/node-selector.d.ts +1 -1
- package/dist/editor/selectors/text-buttons.d.ts +1 -1
- package/dist/editor/useProseMirror.d.ts +2 -2
- package/dist/editor/utils/remove_classes.d.ts +1 -1
- package/dist/editor.js +2625 -3569
- package/dist/editor.js.map +1 -1
- package/dist/form/EntityForm.d.ts +11 -9
- package/dist/form/EntityFormActions.d.ts +2 -1
- package/dist/form/EntityFormBinding.d.ts +27 -0
- package/dist/form/PropertyFieldBinding.d.ts +1 -1
- package/dist/form/components/FieldHelperText.d.ts +1 -1
- package/dist/form/components/FormEntry.d.ts +1 -1
- package/dist/form/components/FormLayout.d.ts +1 -1
- package/dist/form/components/LabelWithIconAndTooltip.d.ts +1 -1
- package/dist/form/components/LocalChangesMenu.d.ts +3 -2
- package/dist/form/components/StorageItemPreview.d.ts +2 -1
- package/dist/form/components/StorageUploadProgress.d.ts +10 -4
- package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/BlockFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/DateTimeFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/MapFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +4 -3
- package/dist/form/field_bindings/MultiSelectFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/MultipleRelationFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/RelationFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/RepeatFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/SelectFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +5 -4
- package/dist/form/field_bindings/SwitchFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/TextFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/UserSelectFieldBinding.d.ts +2 -1
- package/dist/form/field_bindings/VectorFieldBinding.d.ts +12 -0
- package/dist/form/form_utils.d.ts +8 -0
- package/dist/form/index.d.ts +6 -2
- package/dist/form/validation.d.ts +3 -3
- package/dist/history-C0FdqGNz.js +311 -0
- package/dist/history-C0FdqGNz.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/useAsyncResolver.d.ts +26 -0
- package/dist/hooks/navigation/useBuildCollectionRegistryController.d.ts +2 -0
- package/dist/hooks/navigation/useBuildNavigationStateController.d.ts +6 -8
- package/dist/hooks/navigation/useNavigationResolution.d.ts +6 -7
- package/dist/hooks/navigation/useResolvedCollections.d.ts +11 -7
- package/dist/hooks/navigation/useResolvedViews.d.ts +2 -5
- package/dist/hooks/navigation/useTopLevelNavigation.d.ts +3 -3
- package/dist/hooks/navigation/utils.d.ts +5 -5
- package/dist/hooks/useBreadcrumbsController.d.ts +2 -32
- 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} +2 -2
- 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 +6 -3
- package/dist/index.js +2 -799
- package/dist/markdown-CklalUUk.js +526 -0
- package/dist/markdown-CklalUUk.js.map +1 -0
- package/dist/preview/components/ArrayEnumPreview.d.ts +2 -1
- package/dist/preview/components/EmptyValue.d.ts +2 -1
- package/dist/preview/components/EnumValuesChip.d.ts +1 -1
- package/dist/preview/components/ImagePreview.d.ts +2 -1
- package/dist/preview/components/ReferencePreview.d.ts +2 -1
- package/dist/preview/components/RelationPreview.d.ts +2 -1
- package/dist/preview/components/StorageThumbnail.d.ts +3 -1
- package/dist/preview/components/UrlComponentPreview.d.ts +1 -0
- package/dist/preview/components/UserPreview.d.ts +6 -3
- package/dist/preview/property_previews/ArrayOfMapsPreview.d.ts +2 -1
- package/dist/preview/property_previews/ArrayOfReferencesPreview.d.ts +1 -1
- package/dist/preview/property_previews/ArrayOfRelationsPreview.d.ts +1 -1
- package/dist/preview/property_previews/ArrayOfStorageComponentsPreview.d.ts +2 -1
- package/dist/preview/property_previews/ArrayOfStringsPreview.d.ts +2 -1
- package/dist/preview/property_previews/ArrayOneOfPreview.d.ts +2 -1
- package/dist/preview/property_previews/ArrayPropertyEnumPreview.d.ts +1 -1
- package/dist/preview/property_previews/ArrayPropertyPreview.d.ts +2 -1
- package/dist/preview/property_previews/MapPropertyPreview.d.ts +3 -2
- package/dist/preview/property_previews/SkeletonPropertyComponent.d.ts +5 -4
- package/dist/rolldown-runtime-D7D4PA-g.js +13 -0
- package/dist/routes/CustomViewRoute.d.ts +2 -1
- package/dist/routes/RebaseRoute.d.ts +1 -1
- package/dist/src-DLAFyeZI.js +24222 -0
- package/dist/src-DLAFyeZI.js.map +1 -0
- package/dist/types/components/EntityFormActionsProps.d.ts +4 -4
- package/dist/types/components/EntityFormProps.d.ts +65 -5
- package/dist/types/components/PropertyPreviewProps.d.ts +6 -1
- package/dist/types/components/formex.d.ts +1 -40
- package/dist/types/fields.d.ts +23 -12
- package/dist/util/dataControllerAdapter.d.ts +27 -0
- package/dist/util/navigation_utils.d.ts +16 -6
- package/dist/util/previews.d.ts +8 -3
- package/dist/util/propertyConfigMapper.d.ts +17 -0
- package/dist/util/property_utils.d.ts +3 -3
- package/dist/util/resolutions.d.ts +1 -2
- package/dist/util/view_constants.d.ts +6 -0
- package/package.json +56 -55
- package/src/collection_editor/ConfigControllerProvider.tsx +37 -53
- package/src/collection_editor/_cms_internals.ts +4 -4
- package/src/collection_editor/api/generateCollectionApi.ts +10 -9
- package/src/collection_editor/extensibility_types.ts +168 -0
- package/src/collection_editor/index.ts +47 -3
- package/src/collection_editor/pgColumnToProperty.ts +23 -6
- package/src/collection_editor/serializable_types.ts +474 -0
- package/src/collection_editor/serializable_utils.ts +576 -0
- package/src/collection_editor/types/collection_editor_controller.tsx +8 -11
- package/src/collection_editor/types/collection_inference.ts +2 -2
- package/src/collection_editor/types/config_controller.tsx +14 -14
- package/src/collection_editor/ui/AddKanbanColumnAction.tsx +21 -9
- package/src/collection_editor/ui/CollectionViewHeaderAction.tsx +8 -8
- package/src/collection_editor/ui/EditorCollectionAction.tsx +9 -14
- package/src/collection_editor/ui/EditorCollectionActionStart.tsx +13 -18
- package/src/collection_editor/ui/EditorEntityAction.tsx +9 -14
- package/src/collection_editor/ui/HomePageEditorCollectionAction.tsx +13 -19
- package/src/collection_editor/ui/KanbanSetupAction.tsx +8 -6
- package/src/collection_editor/ui/MissingReferenceWidget.tsx +5 -3
- package/src/collection_editor/ui/NewCollectionButton.tsx +4 -4
- package/src/collection_editor/ui/NewCollectionCard.tsx +8 -13
- package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +11 -16
- package/src/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.tsx +20 -12
- package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +29 -59
- package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +213 -135
- package/src/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.tsx +21 -7
- package/src/collection_editor/ui/collection_editor/CollectionJsonImportDialog.tsx +29 -23
- package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +142 -112
- package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +49 -12
- package/src/collection_editor/ui/collection_editor/CollectionRelationsTab.tsx +29 -10
- package/src/collection_editor/ui/collection_editor/CollectionStudioView.tsx +26 -23
- package/src/collection_editor/ui/collection_editor/CollectionsStudioView.tsx +104 -37
- package/src/collection_editor/ui/collection_editor/DisplaySettingsForm.tsx +26 -14
- package/src/collection_editor/ui/collection_editor/EntityActionsEditTab.tsx +21 -8
- 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 +20 -5
- package/src/collection_editor/ui/collection_editor/GeneralSettingsForm.tsx +45 -12
- package/src/collection_editor/ui/collection_editor/GetCodeDialog.tsx +10 -12
- package/src/collection_editor/ui/collection_editor/KanbanConfigSection.tsx +5 -6
- package/src/collection_editor/ui/collection_editor/LayoutModeSwitch.tsx +17 -5
- package/src/collection_editor/ui/collection_editor/PropertyEditView.tsx +190 -27
- package/src/collection_editor/ui/collection_editor/PropertyFieldPreview.tsx +58 -49
- package/src/collection_editor/ui/collection_editor/PropertyTree.tsx +17 -4
- package/src/collection_editor/ui/collection_editor/RouterCollectionStudioView.tsx +44 -0
- package/src/collection_editor/ui/collection_editor/RouterCollectionsStudioView.tsx +41 -0
- package/src/collection_editor/ui/collection_editor/SubcollectionsEditTab.tsx +27 -13
- package/src/collection_editor/ui/collection_editor/SwitchControl.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/ViewModeSwitch.tsx +9 -2
- 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 +5 -6
- package/src/collection_editor/ui/collection_editor/properties/BooleanPropertyField.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/CommonPropertyFields.tsx +5 -5
- package/src/collection_editor/ui/collection_editor/properties/DateTimePropertyField.tsx +10 -10
- package/src/collection_editor/ui/collection_editor/properties/EnumPropertyField.tsx +10 -9
- package/src/collection_editor/ui/collection_editor/properties/MapPropertyField.tsx +7 -8
- package/src/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.tsx +17 -10
- package/src/collection_editor/ui/collection_editor/properties/NumberPropertyField.tsx +7 -7
- package/src/collection_editor/ui/collection_editor/properties/ReferencePropertyField.tsx +19 -53
- package/src/collection_editor/ui/collection_editor/properties/RelationPropertyField.tsx +43 -60
- package/src/collection_editor/ui/collection_editor/properties/RepeatPropertyField.tsx +3 -3
- package/src/collection_editor/ui/collection_editor/properties/StoragePropertyField.tsx +56 -13
- package/src/collection_editor/ui/collection_editor/properties/StringPropertyField.tsx +7 -7
- package/src/collection_editor/ui/collection_editor/properties/UrlPropertyField.tsx +4 -3
- package/src/collection_editor/ui/collection_editor/properties/VectorPropertyField.tsx +34 -0
- package/src/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx +5 -6
- package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.tsx +18 -9
- package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsPanel.tsx +1 -2
- package/src/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.tsx +17 -5
- package/src/collection_editor/ui/collection_editor/properties/conditions/property_paths.ts +1 -1
- package/src/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx +4 -4
- package/src/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx +3 -3
- package/src/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx +6 -9
- package/src/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.tsx +6 -6
- package/src/collection_editor/ui/collection_editor/properties/validation/ValidationPanel.tsx +1 -2
- package/src/collection_editor/ui/collection_editor/templates/blog_template.ts +3 -3
- package/src/collection_editor/ui/collection_editor/templates/pages_template.ts +3 -3
- package/src/collection_editor/ui/collection_editor/templates/products_template.ts +4 -4
- package/src/collection_editor/ui/collection_editor/templates/users_template.ts +2 -2
- package/src/collection_editor/ui/collection_editor/utils/supported_fields.tsx +0 -1
- package/src/collection_editor/ui/collection_editor/utils/update_property_for_widget.ts +7 -29
- package/src/collection_editor/useJsonCollectionsConfigController.tsx +286 -0
- package/src/collection_editor/useLocalCollectionsConfigController.tsx +11 -8
- package/src/collection_editor/useSafeSnackbarController.ts +9 -0
- package/src/collection_editor/validateCollectionJson.ts +111 -24
- package/src/collection_editor_ui.ts +6 -0
- package/src/components/AdminModeSyncer.tsx +2 -2
- package/src/components/ArrayContainer.tsx +28 -24
- package/src/components/ClearFilterSortButton.tsx +2 -3
- package/src/components/CollectionEditorDialogs.tsx +1 -1
- package/src/components/CollectionPanel.tsx +178 -0
- package/src/components/{EntityCollectionTable/EntityCollectionRowActions.tsx → CollectionTableBinding/CollectionRowActions.tsx} +26 -16
- package/src/components/{EntityCollectionTable/EntityCollectionTable.tsx → CollectionTableBinding/CollectionTableBinding.tsx} +34 -31
- package/src/components/{EntityCollectionTable/EntityCollectionTableProps.tsx → CollectionTableBinding/CollectionTableBindingProps.tsx} +4 -4
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/PropertyTableCell.tsx +14 -12
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/column_utils.tsx +4 -4
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableMultipleRelationField.tsx +13 -13
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableReferenceField.tsx +39 -19
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationField.tsx +14 -14
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationSelectorField.tsx +3 -3
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableStorageUpload.tsx +29 -27
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableSelect.tsx +0 -1
- package/src/components/CollectionTableBinding/index.tsx +14 -0
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/CollectionTableToolbar.tsx +22 -28
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCell.tsx +8 -9
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCellActions.tsx +2 -3
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/common.tsx +7 -7
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/PopupFormField.tsx +12 -13
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useDraggable.tsx +5 -2
- package/src/components/{EntityCollectionTable → CollectionTableBinding}/table_bindings.tsx +101 -104
- package/src/components/{EntityCollectionView/EntityBoardCard.tsx → CollectionViewBinding/BoardCardBinding.tsx} +39 -40
- package/src/components/{EntityCollectionView/EntityCollectionBoardView.tsx → CollectionViewBinding/CollectionBoardViewBinding.tsx} +88 -52
- package/src/components/CollectionViewBinding/CollectionCardViewBinding.tsx +157 -0
- package/src/components/{EntityCollectionView/EntityCollectionListView.tsx → CollectionViewBinding/CollectionListViewBinding.tsx} +234 -151
- package/src/components/{EntityCollectionView/EntityCollectionViewActions.tsx → CollectionViewBinding/CollectionViewActions.tsx} +36 -26
- package/src/components/{EntityCollectionView/EntityCollectionView.tsx → CollectionViewBinding/CollectionViewBinding.tsx} +392 -213
- package/src/components/{EntityCollectionView/EntityCollectionViewStartActions.tsx → CollectionViewBinding/CollectionViewStartActions.tsx} +42 -23
- package/src/components/{EntityCollectionView/EntityCard.tsx → CollectionViewBinding/EntityCardBinding.tsx} +14 -14
- package/src/components/CollectionViewBinding/FilterPresetsButton.tsx +294 -0
- package/src/components/{EntityCollectionView → CollectionViewBinding}/FiltersDialog.tsx +37 -79
- package/src/components/{EntityCollectionView → CollectionViewBinding}/SplitListView.tsx +97 -30
- package/src/components/{EntityCollectionView → CollectionViewBinding}/ViewModeToggle.tsx +20 -8
- package/src/components/{EntityCollectionView → CollectionViewBinding}/hooks/useCollectionInlineEditor.ts +9 -8
- package/src/components/{EntityCollectionView → CollectionViewBinding}/hooks/useKanbanDragAndDrop.ts +17 -16
- package/src/components/{EntityCollectionView → CollectionViewBinding}/useBoardDataController.tsx +118 -70
- package/src/components/{EntityCollectionView/useEntityPreviewSlots.ts → CollectionViewBinding/usePreviewSlots.ts} +136 -48
- package/src/components/DefaultAppBar.tsx +73 -41
- package/src/components/DefaultDrawer.tsx +317 -85
- package/src/components/DeleteEntityDialog.tsx +7 -7
- package/src/components/DetailViewBinding.tsx +670 -0
- package/src/components/DrawerNavigationGroup.tsx +11 -11
- package/src/components/DrawerNavigationItem.tsx +6 -6
- package/src/components/{EntityEditViewFormActions.tsx → EditFormActions.tsx} +78 -59
- package/src/components/EditViewBinding.tsx +761 -0
- package/src/components/{EntityPreview.tsx → EntityPreviewBinding.tsx} +53 -39
- package/src/components/{EntityView.tsx → EntityViewBinding.tsx} +8 -9
- package/src/components/HomePage/ContentHomePage.tsx +35 -17
- package/src/components/HomePage/FavouritesView.tsx +2 -3
- package/src/components/HomePage/HomePageDnD.tsx +3 -2
- package/src/components/HomePage/NavigationCard.tsx +9 -16
- package/src/components/HomePage/NavigationCardBinding.tsx +6 -7
- package/src/components/HomePage/NavigationGroup.tsx +4 -5
- package/src/components/HomePage/RenameGroupDialog.tsx +1 -1
- package/src/components/HomePage/SmallNavigationCard.tsx +0 -5
- package/src/components/{EntityJsonPreview.tsx → JsonPreviewBinding.tsx} +2 -2
- package/src/components/PropertyCollectionView.tsx +2 -1
- package/src/components/PropertyIdCopyTooltip.tsx +2 -3
- package/src/components/{RebaseCMS.tsx → RebaseAdmin.tsx} +8 -6
- package/src/components/RebaseAuthGate.tsx +5 -3
- package/src/components/RebaseLayout.tsx +10 -9
- package/src/components/RebaseNavigation.tsx +107 -31
- package/src/components/RebaseRouteDefs.tsx +10 -13
- package/src/components/RebaseShell.tsx +18 -14
- package/src/components/ReferenceTable/{EntitySelectionTable.tsx → SelectionTableBinding.tsx} +40 -33
- package/src/components/ReferenceWidget.tsx +7 -7
- package/src/components/RelationSelector.tsx +82 -24
- package/src/components/SearchIconsView.tsx +13 -12
- package/src/components/SelectableTable/SelectableTable.tsx +68 -115
- package/src/components/SelectableTable/SelectableTableContext.tsx +4 -3
- package/src/components/SelectableTable/SelectionStore.ts +20 -44
- package/src/components/SelectableTable/filters/BooleanFilterField.tsx +13 -5
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +37 -16
- package/src/components/SelectableTable/filters/FilterFieldBinding.tsx +187 -0
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +27 -13
- package/src/components/SelectableTable/filters/RelationFilterField.tsx +17 -3
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +95 -35
- package/src/components/SideDialogs.tsx +58 -40
- package/src/components/SidePanelBinding.tsx +261 -0
- package/src/components/{SideEntityProvider.tsx → SidePanelProvider.tsx} +17 -16
- package/src/components/UserSelector.tsx +123 -9
- package/src/components/admin/CreationResultDialog.tsx +138 -0
- package/src/components/admin/index.ts +1 -3
- package/src/components/app/Drawer.tsx +9 -1
- package/src/components/app/Scaffold.tsx +16 -9
- package/src/components/common/default_entity_actions.tsx +270 -29
- package/src/components/field_configs.tsx +68 -46
- package/src/components/history/EntityHistoryEntry.tsx +4 -5
- package/src/components/history/EntityHistoryView.tsx +18 -8
- package/src/components/history/LastEditedByIndicator.tsx +4 -4
- package/src/components/index.ts +20 -17
- package/src/contexts/BreacrumbsContext.tsx +15 -6
- package/src/contexts/SidePanelControllerContext.tsx +5 -0
- package/src/data_export/export/BasicExportAction.tsx +42 -43
- package/src/data_export/export/ExportCollectionAction.tsx +55 -54
- package/src/data_export/export/export.ts +17 -17
- package/src/data_import/components/DataNewPropertiesMapping.tsx +17 -4
- package/src/data_import/components/ImportFileUpload.tsx +2 -3
- package/src/data_import/components/ImportNewPropertyFieldPreview.tsx +2 -3
- package/src/data_import/components/ImportSaveInProgress.tsx +4 -4
- package/src/data_import/import/ImportCollectionAction.tsx +26 -13
- package/src/data_import/utils/data.ts +26 -8
- package/src/data_import/utils/file_headers.ts +13 -89
- package/src/data_import/utils/file_to_json.ts +43 -68
- package/src/data_import/utils/get_properties_mapping.ts +1 -1
- package/src/data_import/utils/transforms.ts +47 -0
- package/src/editor/components/SlashCommandMenu.tsx +17 -2
- package/src/editor/components/editor-bubble-item.tsx +1 -1
- package/src/editor/components/editor-bubble.tsx +32 -9
- package/src/editor/components/image-bubble.tsx +28 -12
- package/src/editor/components/index.ts +3 -3
- package/src/editor/components/table-bubble.tsx +80 -18
- package/src/editor/editor.tsx +34 -15
- package/src/editor/extensions/HighlightDecorationExtension.ts +3 -2
- package/src/editor/extensions/Image/index.ts +3 -3
- package/src/editor/extensions/Image.ts +3 -3
- package/src/editor/extensions/clipboard.ts +2 -2
- package/src/editor/markdown-it-plugins.d.ts +24 -0
- package/src/editor/markdown.ts +2 -3
- package/src/editor/nodeViews/ReactNodeView.tsx +1 -1
- package/src/editor/nodeViews/TaskItemComponent.tsx +9 -8
- package/src/editor/schema.ts +135 -59
- package/src/editor/selectors/ai-selector.tsx +0 -1
- package/src/editor/selectors/color-selector.tsx +1 -2
- package/src/editor/selectors/link-selector.tsx +9 -7
- package/src/editor/selectors/node-selector.tsx +17 -3
- package/src/editor/selectors/text-buttons.tsx +1 -2
- package/src/editor/useProseMirror.ts +2 -2
- package/src/editor/utils/prosemirror-utils.ts +1 -1
- package/src/editor/utils/remove_classes.ts +6 -5
- package/src/form/EntityForm.tsx +222 -442
- package/src/form/EntityFormActions.tsx +49 -55
- package/src/form/EntityFormBinding.tsx +323 -0
- package/src/form/PropertyFieldBinding.tsx +81 -84
- package/src/form/components/ErrorFocus.tsx +1 -1
- package/src/form/components/FieldHelperText.tsx +6 -7
- package/src/form/components/FormLayout.tsx +1 -1
- package/src/form/components/LocalChangesMenu.tsx +20 -5
- package/src/form/components/StorageItemPreview.tsx +2 -3
- package/src/form/components/StorageUploadProgress.tsx +14 -7
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +5 -5
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +12 -13
- package/src/form/field_bindings/BlockFieldBinding.tsx +59 -58
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +2 -2
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +319 -303
- package/src/form/field_bindings/MapFieldBinding.tsx +14 -56
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +28 -10
- package/src/form/field_bindings/MultiSelectFieldBinding.tsx +3 -4
- package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +11 -12
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +9 -2
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +17 -15
- package/src/form/field_bindings/RelationFieldBinding.tsx +157 -156
- package/src/form/field_bindings/RepeatFieldBinding.tsx +8 -8
- package/src/form/field_bindings/SelectFieldBinding.tsx +3 -4
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +107 -103
- package/src/form/field_bindings/SwitchFieldBinding.tsx +17 -17
- package/src/form/field_bindings/TextFieldBinding.tsx +90 -78
- package/src/form/field_bindings/UserSelectFieldBinding.tsx +18 -18
- package/src/form/field_bindings/VectorFieldBinding.tsx +202 -0
- package/src/form/form_utils.ts +163 -0
- package/src/form/index.tsx +15 -6
- package/src/form/useClearRestoreValue.tsx +1 -1
- package/src/form/validation.ts +104 -50
- package/src/hooks/index.ts +4 -4
- package/src/hooks/navigation/contexts/CollectionRegistryContext.tsx +5 -4
- package/src/hooks/navigation/contexts/NavigationStateContext.tsx +2 -2
- package/src/hooks/navigation/contexts/UrlContext.tsx +1 -2
- package/src/hooks/navigation/useAsyncResolver.ts +100 -0
- package/src/hooks/navigation/useBuildCollectionRegistryController.tsx +40 -21
- package/src/hooks/navigation/useBuildNavigationStateController.tsx +21 -22
- package/src/hooks/navigation/useNavigationResolution.ts +193 -21
- package/src/hooks/navigation/useResolvedCollections.ts +45 -77
- package/src/hooks/navigation/useResolvedViews.tsx +44 -123
- package/src/hooks/navigation/useTopLevelNavigation.ts +22 -18
- package/src/hooks/navigation/utils.ts +12 -9
- package/src/hooks/useBreadcrumbsController.tsx +2 -34
- package/src/hooks/{useBuildSideEntityController.tsx → useBuildSidePanel.tsx} +63 -24
- package/src/hooks/useCMSContext.tsx +7 -7
- package/src/hooks/{useEntityHistory.ts → useHistory.ts} +9 -4
- package/src/hooks/useResolvedNavigationFrom.tsx +8 -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 +34 -20
- package/src/preview/PropertyPreview.tsx +34 -41
- package/src/preview/components/DatePreview.tsx +1 -1
- package/src/preview/components/EnumValuesChip.tsx +1 -1
- package/src/preview/components/ImagePreview.tsx +4 -3
- package/src/preview/components/ReferencePreview.tsx +69 -18
- package/src/preview/components/RelationPreview.tsx +107 -18
- package/src/preview/components/StorageThumbnail.tsx +28 -8
- package/src/preview/components/UrlComponentPreview.tsx +12 -4
- package/src/preview/components/UserPreview.tsx +6 -15
- package/src/preview/property_previews/ArrayOfMapsPreview.tsx +5 -5
- package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +5 -5
- package/src/preview/property_previews/ArrayOfRelationsPreview.tsx +4 -4
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +4 -4
- package/src/preview/property_previews/ArrayOfStringsPreview.tsx +3 -2
- package/src/preview/property_previews/ArrayOneOfPreview.tsx +7 -9
- package/src/preview/property_previews/ArrayPropertyEnumPreview.tsx +1 -1
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +4 -4
- package/src/preview/property_previews/MapPropertyPreview.tsx +4 -3
- package/src/preview/property_previews/NumberPropertyPreview.tsx +5 -3
- package/src/preview/property_previews/SkeletonPropertyComponent.tsx +24 -25
- package/src/preview/property_previews/StringPropertyPreview.tsx +13 -11
- package/src/routes/CustomViewRoute.tsx +14 -6
- package/src/routes/RebaseRoute.tsx +112 -36
- package/src/types/components/EntityFormActionsProps.tsx +4 -4
- package/src/types/components/EntityFormProps.tsx +75 -5
- package/src/types/components/PropertyPreviewProps.tsx +6 -1
- package/src/types/components/formex.tsx +1 -45
- package/src/types/fields.tsx +26 -15
- package/src/util/dataControllerAdapter.ts +87 -0
- package/src/util/navigation_utils.ts +43 -13
- package/src/util/previews.ts +149 -13
- package/src/util/propertyConfigMapper.ts +134 -0
- package/src/util/property_utils.tsx +24 -9
- package/src/util/resolutions.ts +4 -8
- package/src/util/view_constants.ts +6 -0
- package/dist/CollectionEditorDialog-B2M9lCyL.js +0 -4720
- package/dist/CollectionEditorDialog-B2M9lCyL.js.map +0 -1
- package/dist/CollectionsStudioView-WG6soyfs.js +0 -218
- package/dist/CollectionsStudioView-WG6soyfs.js.map +0 -1
- package/dist/ContentHomePage-CDF_a6Lp.js +0 -1786
- package/dist/ContentHomePage-CDF_a6Lp.js.map +0 -1
- package/dist/ExportCollectionAction-Dc0VOWMN.js +0 -439
- package/dist/ExportCollectionAction-Dc0VOWMN.js.map +0 -1
- package/dist/ImportCollectionAction-DpCagAOy.js +0 -686
- package/dist/ImportCollectionAction-DpCagAOy.js.map +0 -1
- package/dist/PropertyEditView-DS67DxoT.js +0 -8138
- package/dist/PropertyEditView-DS67DxoT.js.map +0 -1
- package/dist/RoleChip-QtUFXeTp.js +0 -67
- package/dist/RoleChip-QtUFXeTp.js.map +0 -1
- package/dist/RolesView-CIuYBimF.js +0 -424
- package/dist/RolesView-CIuYBimF.js.map +0 -1
- package/dist/UsersView-B5zelXnH.js +0 -493
- package/dist/UsersView-B5zelXnH.js.map +0 -1
- package/dist/collection_editor/types/config_permissions.d.ts +0 -19
- package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +0 -27
- package/dist/components/EntityCollectionTable/fields/VirtualTableDateField.d.ts +0 -12
- package/dist/components/EntityCollectionTable/fields/VirtualTableInput.d.ts +0 -9
- package/dist/components/EntityCollectionTable/fields/VirtualTableNumberInput.d.ts +0 -8
- package/dist/components/EntityCollectionTable/fields/VirtualTableSwitch.d.ts +0 -7
- package/dist/components/EntityCollectionTable/index.d.ts +0 -6
- package/dist/components/EntityCollectionView/Board.d.ts +0 -2
- package/dist/components/EntityCollectionView/BoardColumn.d.ts +0 -42
- package/dist/components/EntityCollectionView/BoardColumnTitle.d.ts +0 -9
- package/dist/components/EntityCollectionView/BoardSortableList.d.ts +0 -14
- package/dist/components/EntityCollectionView/EntityBoardCard.d.ts +0 -31
- package/dist/components/EntityCollectionView/EntityCard.d.ts +0 -20
- package/dist/components/EntityCollectionView/EntityCollectionBoardView.d.ts +0 -21
- package/dist/components/EntityCollectionView/EntityCollectionListView.d.ts +0 -34
- package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +0 -64
- package/dist/components/EntityCollectionView/EntityCollectionViewActions.d.ts +0 -18
- package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +0 -18
- package/dist/components/EntityCollectionView/board_types.d.ts +0 -105
- package/dist/components/EntityEditView.d.ts +0 -49
- package/dist/components/EntityEditViewFormActions.d.ts +0 -2
- package/dist/components/EntityJsonPreview.d.ts +0 -3
- package/dist/components/EntitySidePanel.d.ts +0 -10
- package/dist/components/EntityView.d.ts +0 -12
- package/dist/components/admin/RoleChip.d.ts +0 -4
- package/dist/components/admin/RolesView.d.ts +0 -4
- package/dist/components/admin/UsersView.d.ts +0 -4
- package/dist/contexts/SideEntityControllerContext.d.ts +0 -3
- package/dist/form/field_bindings/ReferenceAsStringFieldBinding.d.ts +0 -10
- package/dist/hooks/navigation/useNavigationRegistry.d.ts +0 -11
- package/dist/hooks/navigation/useNavigationURLs.d.ts +0 -11
- package/dist/hooks/useBuildSideEntityController.d.ts +0 -6
- package/dist/hooks/useSideEntityController.d.ts +0 -11
- package/dist/index-CBhrgpR7.js +0 -12
- package/dist/index-CBhrgpR7.js.map +0 -1
- package/dist/index-CHxgwt6E.js +0 -456
- package/dist/index-CHxgwt6E.js.map +0 -1
- package/dist/index-Dey5WJpO.js +0 -8
- package/dist/index-Dey5WJpO.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/markdown-z2Ir7Cgo.js +0 -618
- package/dist/markdown-z2Ir7Cgo.js.map +0 -1
- package/dist/useEntityHistory-Dcj4zhGj.js +0 -121
- package/dist/useEntityHistory-Dcj4zhGj.js.map +0 -1
- package/dist/util-BQ82ySL3.js +0 -27720
- package/dist/util-BQ82ySL3.js.map +0 -1
- package/src/collection_editor/types/config_permissions.ts +0 -20
- package/src/components/EntityCollectionTable/fields/VirtualTableDateField.tsx +0 -39
- package/src/components/EntityCollectionTable/fields/VirtualTableInput.tsx +0 -90
- package/src/components/EntityCollectionTable/fields/VirtualTableNumberInput.tsx +0 -80
- package/src/components/EntityCollectionTable/fields/VirtualTableSwitch.tsx +0 -32
- package/src/components/EntityCollectionTable/index.tsx +0 -14
- package/src/components/EntityCollectionView/Board.tsx +0 -474
- package/src/components/EntityCollectionView/BoardColumn.tsx +0 -158
- package/src/components/EntityCollectionView/BoardColumnTitle.tsx +0 -45
- package/src/components/EntityCollectionView/BoardSortableList.tsx +0 -177
- package/src/components/EntityCollectionView/EntityCollectionCardView.tsx +0 -267
- package/src/components/EntityCollectionView/board_types.ts +0 -113
- package/src/components/EntityEditView.tsx +0 -632
- package/src/components/EntitySidePanel.tsx +0 -160
- package/src/components/admin/RoleChip.tsx +0 -23
- package/src/components/admin/RolesView.tsx +0 -419
- package/src/components/admin/UsersView.tsx +0 -782
- package/src/contexts/SideEntityControllerContext.tsx +0 -5
- package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +0 -141
- package/src/hooks/navigation/useNavigationRegistry.ts +0 -153
- package/src/hooks/navigation/useNavigationURLs.ts +0 -56
- package/src/hooks/useSideEntityController.tsx +0 -13
- /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/PropertyTableCell.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}/useSelectionController.d.ts +0 -0
- /package/dist/components/{EntityCollectionView → CollectionViewBinding}/utils.d.ts +0 -0
- /package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableUserSelect.tsx +0 -0
- /package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useWindowSize.tsx +0 -0
- /package/src/components/{EntityCollectionView → CollectionViewBinding}/useSelectionController.tsx +0 -0
- /package/src/components/{EntityCollectionView → CollectionViewBinding}/utils.ts +0 -0
|
@@ -1,18 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
|
|
1
|
+
import type { AdditionalFieldDelegate, EntityAction, CollectionConfig, Property } from "@rebasepro/types";
|
|
2
|
+
import {
|
|
3
|
+
CollectionSize,
|
|
4
|
+
Entity,
|
|
5
|
+
EntityReference,
|
|
6
|
+
EntityTableController,
|
|
7
|
+
FilterValues,
|
|
8
|
+
getCollectionDataPath,
|
|
9
|
+
PartialCollectionConfig,
|
|
10
|
+
ViewMode
|
|
11
|
+
} from "@rebasepro/types";
|
|
4
12
|
import React, { useCallback, useEffect, useMemo, useState } from "react";
|
|
13
|
+
import { useSearchParams } from "react-router-dom";
|
|
5
14
|
|
|
6
15
|
import { deepEqual as equal } from "fast-equals"
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
import { CollectionSize, Entity, EntityReference, EntityTableController, FilterValues, PartialEntityCollection, SaveEntityProps, ViewMode } from "@rebasepro/types";
|
|
11
|
-
import {
|
|
12
|
-
EntityCollectionRowActions,
|
|
13
|
-
EntityCollectionTable
|
|
14
|
-
} from "../EntityCollectionTable";
|
|
15
|
-
import { CollectionTableToolbar } from "../EntityCollectionTable/internal/CollectionTableToolbar";
|
|
16
|
+
import { CollectionRowActions, CollectionTableBinding } from "../CollectionTableBinding";
|
|
17
|
+
import { CollectionTableToolbar } from "../CollectionTableBinding/internal/CollectionTableToolbar";
|
|
16
18
|
import { getSubcollections } from "@rebasepro/common";
|
|
17
19
|
import { useCollectionInlineEditor } from "./hooks/useCollectionInlineEditor";
|
|
18
20
|
import { navigateToEntity } from "../../util/navigation_utils";
|
|
@@ -21,62 +23,79 @@ import { resolveEntityAction } from "../../util/resolutions";
|
|
|
21
23
|
import { getPropertyInPath } from "../../util/property_utils";
|
|
22
24
|
import { ReferencePreview } from "../../preview";
|
|
23
25
|
import {
|
|
24
|
-
|
|
26
|
+
CollectionScopeProvider,
|
|
27
|
+
OnColumnResizeParams,
|
|
28
|
+
useAnalyticsController,
|
|
25
29
|
useAuthController,
|
|
30
|
+
useColumnIds,
|
|
31
|
+
useComponentOverride,
|
|
26
32
|
useCustomizationController,
|
|
27
33
|
useData,
|
|
28
34
|
useDataTableController,
|
|
29
35
|
useLargeLayout,
|
|
30
36
|
usePermissions,
|
|
37
|
+
useScrollRestoration,
|
|
38
|
+
useSlot,
|
|
31
39
|
useTranslation,
|
|
32
|
-
|
|
33
|
-
} from "@rebasepro/
|
|
34
|
-
import {
|
|
35
|
-
import {
|
|
36
|
-
import {
|
|
37
|
-
import { EntityCollectionListView } from "./EntityCollectionListView";
|
|
40
|
+
useUserConfigurationPersistence
|
|
41
|
+
} from "@rebasepro/app";
|
|
42
|
+
import { CollectionViewActions } from "./CollectionViewActions";
|
|
43
|
+
import { CollectionCardViewBinding } from "./CollectionCardViewBinding";
|
|
44
|
+
import { CollectionListViewBinding } from "./CollectionListViewBinding";
|
|
38
45
|
import { SplitListView } from "./SplitListView";
|
|
39
|
-
import {
|
|
40
|
-
import {
|
|
41
|
-
import { Button, cls, focusedDisabled, IconButton, Markdown, Popover, Skeleton, Tooltip, Typography, VirtualTableColumn , iconSize } from "@rebasepro/ui";
|
|
42
|
-
import { PlusIcon, ArrowRightToLineIcon, SearchIcon } from "lucide-react";
|
|
43
|
-
import { setIn } from "@rebasepro/formex";
|
|
44
|
-
import { getSubcollectionColumnId } from "../EntityCollectionTable/internal/common";
|
|
46
|
+
import { CollectionBoardViewBinding } from "./CollectionBoardViewBinding";
|
|
47
|
+
import { KanbanPropertyOption, ViewModeToggle } from "./ViewModeToggle";
|
|
45
48
|
import {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
49
|
+
ArrowRightToLineIcon,
|
|
50
|
+
Button,
|
|
51
|
+
cls,
|
|
52
|
+
ErrorBoundary,
|
|
53
|
+
focusedDisabled,
|
|
54
|
+
IconButton,
|
|
55
|
+
iconSize,
|
|
56
|
+
PlusIcon,
|
|
57
|
+
Popover,
|
|
58
|
+
SearchIcon,
|
|
59
|
+
TextField,
|
|
60
|
+
Tooltip,
|
|
61
|
+
Typography,
|
|
62
|
+
VirtualTableColumn
|
|
63
|
+
} from "@rebasepro/ui";
|
|
64
|
+
import { getSubcollectionColumnId } from "../CollectionTableBinding/internal/common";
|
|
65
|
+
import { copyEntityAction, deleteEntityAction, editEntityAction } from "../common/default_entity_actions";
|
|
66
|
+
import { PopupFormField } from "../CollectionTableBinding/internal/popup_field/PopupFormField";
|
|
67
|
+
import { GetPropertyForProps } from "../CollectionTableBinding/CollectionTableBindingProps";
|
|
54
68
|
import { DeleteEntityDialog } from "../DeleteEntityDialog";
|
|
55
|
-
import { useAnalyticsController } from "@rebasepro/core";
|
|
56
69
|
import { useSelectionController } from "./useSelectionController";
|
|
57
|
-
import {
|
|
70
|
+
import { CollectionViewStartActions } from "./CollectionViewStartActions";
|
|
58
71
|
import { addRecentId, getRecentIds } from "./utils";
|
|
59
|
-
import { useScrollRestoration } from "@rebasepro/core";
|
|
60
|
-
import { ErrorBoundary } from "@rebasepro/ui";
|
|
61
72
|
import { mergeDeep } from "@rebasepro/utils";
|
|
62
|
-
import {
|
|
63
|
-
|
|
73
|
+
import {
|
|
74
|
+
useBreadcrumbsController,
|
|
75
|
+
useCMSContext,
|
|
76
|
+
useCollectionRegistryController,
|
|
77
|
+
useSidePanel,
|
|
78
|
+
useUrlController
|
|
79
|
+
} from "../../index";
|
|
64
80
|
|
|
65
|
-
const
|
|
81
|
+
const EMPTY_ARRAY: never[] = [];
|
|
82
|
+
const DEFAULT_ENTITY_OPEN_MODE = "split";
|
|
66
83
|
|
|
67
84
|
function getOpenEntityMode(
|
|
68
85
|
viewMode: ViewMode,
|
|
69
|
-
configuredMode?: "side_panel" | "full_screen" | "split"
|
|
70
|
-
): "side_panel" | "full_screen" | "split" {
|
|
86
|
+
configuredMode?: "side_panel" | "full_screen" | "split" | "dialog"
|
|
87
|
+
): "side_panel" | "full_screen" | "split" | "dialog" {
|
|
71
88
|
if (configuredMode) return configuredMode;
|
|
72
89
|
if (viewMode === "kanban") return "side_panel";
|
|
73
|
-
return
|
|
90
|
+
if (viewMode === "table" || viewMode === "cards") return "full_screen";
|
|
91
|
+
// "list" view defaults to split
|
|
92
|
+
return "split";
|
|
74
93
|
}
|
|
75
94
|
|
|
76
95
|
/**
|
|
77
96
|
* @group Components
|
|
78
97
|
*/
|
|
79
|
-
export type
|
|
98
|
+
export type CollectionViewBindingProps<M extends Record<string, unknown>> = {
|
|
80
99
|
/**
|
|
81
100
|
* Complete path where this collection is located.
|
|
82
101
|
* It defaults to the collection path if not provided.
|
|
@@ -89,7 +108,7 @@ export type EntityCollectionViewProps<M extends Record<string, unknown>> = {
|
|
|
89
108
|
/**
|
|
90
109
|
* If this is a subcollection, specify the parent collection ids.
|
|
91
110
|
*/
|
|
92
|
-
|
|
111
|
+
parentCollectionSlugs?: string[], parentEntityIds?: string[];
|
|
93
112
|
/**
|
|
94
113
|
* Whether this is a subcollection or not.
|
|
95
114
|
*/
|
|
@@ -114,23 +133,23 @@ export type EntityCollectionViewProps<M extends Record<string, unknown>> = {
|
|
|
114
133
|
*/
|
|
115
134
|
selectedTab?: string;
|
|
116
135
|
|
|
117
|
-
} &
|
|
136
|
+
} & CollectionConfig<M>;
|
|
118
137
|
|
|
119
138
|
/**
|
|
120
|
-
* This component is in charge of binding a driver path with an {@link
|
|
139
|
+
* This component is in charge of binding a driver path with an {@link CollectionConfig}
|
|
121
140
|
* where it's configuration is defined. It includes an infinite scrolling table
|
|
122
141
|
* and a 'Add' new entities button,
|
|
123
142
|
*
|
|
124
143
|
* This component is the default one used for displaying entity collections
|
|
125
144
|
* and is in charge of generating all the specific actions and customization
|
|
126
|
-
* of the lower level {@link
|
|
145
|
+
* of the lower level {@link CollectionTableBinding}
|
|
127
146
|
*
|
|
128
147
|
* Please **note** that you only need to use this component if you are building
|
|
129
148
|
* a custom view. If you just need to create a default view you can do it
|
|
130
149
|
* exclusively with config options.
|
|
131
150
|
*
|
|
132
151
|
* If you need a lower level implementation with more granular options, you
|
|
133
|
-
* can use {@link
|
|
152
|
+
* can use {@link CollectionTableBinding}.
|
|
134
153
|
*
|
|
135
154
|
* If you need a generic table that is not bound to the driver or entities and
|
|
136
155
|
* properties at all, you can check {@link VirtualTable}
|
|
@@ -140,18 +159,18 @@ export type EntityCollectionViewProps<M extends Record<string, unknown>> = {
|
|
|
140
159
|
|
|
141
160
|
* @group Components
|
|
142
161
|
*/
|
|
143
|
-
|
|
144
|
-
function
|
|
162
|
+
const CollectionViewBindingInner = React.memo(
|
|
163
|
+
function CollectionViewBindingInner<M extends Record<string, unknown>>({
|
|
145
164
|
path: pathProp,
|
|
146
165
|
|
|
147
|
-
|
|
166
|
+
parentCollectionSlugs, parentEntityIds,
|
|
148
167
|
isSubCollection,
|
|
149
168
|
className,
|
|
150
169
|
updateUrl,
|
|
151
170
|
selectedEntityId: selectedEntityIdProp,
|
|
152
171
|
selectedTab: selectedTabProp,
|
|
153
172
|
...collectionProp
|
|
154
|
-
}:
|
|
173
|
+
}: CollectionViewBindingProps<M>
|
|
155
174
|
) {
|
|
156
175
|
|
|
157
176
|
const { t } = useTranslation();
|
|
@@ -159,9 +178,9 @@ export const EntityCollectionView = React.memo(
|
|
|
159
178
|
const collectionRegistry = useCollectionRegistryController();
|
|
160
179
|
const urlController = useUrlController();
|
|
161
180
|
const breadcrumbs = useBreadcrumbsController();
|
|
162
|
-
const path = pathProp ?? collectionProp
|
|
181
|
+
const path = pathProp ?? getCollectionDataPath(collectionProp);
|
|
163
182
|
const dataClient = useData();
|
|
164
|
-
const
|
|
183
|
+
const sidePanelController = useSidePanel();
|
|
165
184
|
const authController = useAuthController();
|
|
166
185
|
const userConfigPersistence = useUserConfigurationPersistence();
|
|
167
186
|
const analyticsController = useAnalyticsController();
|
|
@@ -173,9 +192,10 @@ export const EntityCollectionView = React.memo(
|
|
|
173
192
|
const scrollRestoration = useScrollRestoration();
|
|
174
193
|
|
|
175
194
|
const collection = useMemo(() => {
|
|
195
|
+
const registryCollection = collectionRegistry.getCollection(path) || collectionProp;
|
|
176
196
|
const userOverride = userConfigPersistence?.getCollectionConfig<M>(path);
|
|
177
|
-
return (userOverride ? mergeDeep(
|
|
178
|
-
}, [collectionProp, path, userConfigPersistence
|
|
197
|
+
return (userOverride ? mergeDeep(registryCollection, userOverride) : registryCollection) as CollectionConfig<M>;
|
|
198
|
+
}, [collectionProp, path, userConfigPersistence, collectionRegistry]);
|
|
179
199
|
|
|
180
200
|
const collectionRef = React.useRef(collection);
|
|
181
201
|
useEffect(() => {
|
|
@@ -210,7 +230,7 @@ export const EntityCollectionView = React.memo(
|
|
|
210
230
|
}, 2400);
|
|
211
231
|
}, [highlightedEntity]);
|
|
212
232
|
|
|
213
|
-
const checkInlineEditing = useCallback((entity?: Entity<
|
|
233
|
+
const checkInlineEditing = useCallback((entity?: Entity<M>): boolean => {
|
|
214
234
|
const collection = collectionRef.current;
|
|
215
235
|
if (!canEdit(collection, path, entity ?? null)) {
|
|
216
236
|
return false;
|
|
@@ -225,16 +245,16 @@ export const EntityCollectionView = React.memo(
|
|
|
225
245
|
|
|
226
246
|
// View mode priority: URL > saved user config > collection.defaultViewMode
|
|
227
247
|
const defaultViewMode = collection.defaultViewMode ?? "list";
|
|
248
|
+
const [searchParams, setSearchParams] = useSearchParams();
|
|
228
249
|
|
|
229
|
-
//
|
|
230
|
-
const
|
|
231
|
-
const
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
return urlView as ViewMode;
|
|
250
|
+
// Read view from React Router's searchParams (reactive on back/forward)
|
|
251
|
+
const urlView = useMemo((): ViewMode | null => {
|
|
252
|
+
const v = searchParams.get("__view");
|
|
253
|
+
if (v && ["list", "table", "kanban", "cards"].includes(v)) {
|
|
254
|
+
return v as ViewMode;
|
|
235
255
|
}
|
|
236
256
|
return null;
|
|
237
|
-
}, []);
|
|
257
|
+
}, [searchParams]);
|
|
238
258
|
|
|
239
259
|
// Get saved view from local persistence
|
|
240
260
|
const getSavedView = useCallback((): ViewMode | null => {
|
|
@@ -244,7 +264,6 @@ export const EntityCollectionView = React.memo(
|
|
|
244
264
|
|
|
245
265
|
const [viewMode, setViewModeState] = useState<ViewMode>(() => {
|
|
246
266
|
// Priority: URL > saved config > collection default
|
|
247
|
-
const urlView = getViewFromUrl();
|
|
248
267
|
if (urlView) return urlView;
|
|
249
268
|
const savedView = getSavedView();
|
|
250
269
|
if (savedView) return savedView;
|
|
@@ -255,12 +274,13 @@ export const EntityCollectionView = React.memo(
|
|
|
255
274
|
|
|
256
275
|
// Sync URL with current view on init (if view came from saved config)
|
|
257
276
|
useEffect(() => {
|
|
258
|
-
const urlView = getViewFromUrl();
|
|
259
277
|
if (!urlView && viewMode !== defaultViewMode) {
|
|
260
278
|
// View came from saved config but URL doesn't have it - update URL without push
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
279
|
+
setSearchParams((prev) => {
|
|
280
|
+
const next = new URLSearchParams(prev);
|
|
281
|
+
next.set("__view", viewMode);
|
|
282
|
+
return next;
|
|
283
|
+
}, { replace: true });
|
|
264
284
|
}
|
|
265
285
|
}, []); // Only on mount
|
|
266
286
|
|
|
@@ -268,33 +288,27 @@ export const EntityCollectionView = React.memo(
|
|
|
268
288
|
const setViewMode = useCallback((newMode: ViewMode) => {
|
|
269
289
|
setViewModeState(newMode);
|
|
270
290
|
|
|
271
|
-
// Update URL with __view param
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
url.searchParams.set("__view", newMode);
|
|
277
|
-
}
|
|
278
|
-
window.history.pushState({}, "", url.toString());
|
|
279
|
-
}, [defaultViewMode]);
|
|
280
|
-
|
|
281
|
-
// Listen for browser back/forward
|
|
282
|
-
useEffect(() => {
|
|
283
|
-
const handlePopState = () => {
|
|
284
|
-
const urlView = getViewFromUrl();
|
|
285
|
-
if (urlView) {
|
|
286
|
-
// URL has explicit view - use it
|
|
287
|
-
setViewModeState(urlView);
|
|
291
|
+
// Update URL with __view param via React Router
|
|
292
|
+
setSearchParams((prev) => {
|
|
293
|
+
const next = new URLSearchParams(prev);
|
|
294
|
+
if (newMode === defaultViewMode) {
|
|
295
|
+
next.delete("__view");
|
|
288
296
|
} else {
|
|
289
|
-
|
|
290
|
-
const savedView = getSavedView();
|
|
291
|
-
setViewModeState(savedView ?? defaultViewMode);
|
|
297
|
+
next.set("__view", newMode);
|
|
292
298
|
}
|
|
293
|
-
|
|
299
|
+
return next;
|
|
300
|
+
});
|
|
301
|
+
}, [defaultViewMode, setSearchParams]);
|
|
294
302
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
303
|
+
// Sync viewMode state when URL changes via back/forward navigation
|
|
304
|
+
useEffect(() => {
|
|
305
|
+
if (urlView) {
|
|
306
|
+
setViewModeState(urlView);
|
|
307
|
+
} else {
|
|
308
|
+
const savedView = getSavedView();
|
|
309
|
+
setViewModeState(savedView ?? defaultViewMode);
|
|
310
|
+
}
|
|
311
|
+
}, [urlView, getSavedView, defaultViewMode]);
|
|
298
312
|
|
|
299
313
|
// List view size state - controls row height and info density
|
|
300
314
|
const [listSize, setListSize] = useState<CollectionSize>(collection.defaultSize ?? "m");
|
|
@@ -347,13 +361,14 @@ export const EntityCollectionView = React.memo(
|
|
|
347
361
|
navigateToEntity({
|
|
348
362
|
navigation: urlController,
|
|
349
363
|
path: entityPath,
|
|
350
|
-
|
|
364
|
+
sidePanelController,
|
|
351
365
|
openEntityMode,
|
|
352
366
|
collection,
|
|
353
|
-
entityId: clickedEntity.id
|
|
367
|
+
entityId: clickedEntity.id,
|
|
368
|
+
replace: openEntityMode === "split" && selectedEntityIdProp !== undefined
|
|
354
369
|
});
|
|
355
370
|
|
|
356
|
-
}, [
|
|
371
|
+
}, [sidePanelController, openEntityMode, selectedEntityIdProp, path, urlController, analyticsController]);
|
|
357
372
|
|
|
358
373
|
const onNewClick = useCallback(() => {
|
|
359
374
|
const collection = collectionRef.current;
|
|
@@ -365,11 +380,28 @@ export const EntityCollectionView = React.memo(
|
|
|
365
380
|
collection,
|
|
366
381
|
entityId: undefined,
|
|
367
382
|
path: path,
|
|
368
|
-
|
|
383
|
+
sidePanelController,
|
|
369
384
|
navigation: urlController,
|
|
370
385
|
onClose: unselectNavigatedEntity
|
|
371
386
|
})
|
|
372
|
-
}, [path,
|
|
387
|
+
}, [path, sidePanelController]);
|
|
388
|
+
|
|
389
|
+
const openNewDocument = useCallback((defaultValues?: Record<string, unknown>) => {
|
|
390
|
+
const collection = collectionRef.current;
|
|
391
|
+
analyticsController.onAnalyticsEvent?.("new_entity_click", {
|
|
392
|
+
path: path
|
|
393
|
+
});
|
|
394
|
+
navigateToEntity({
|
|
395
|
+
openEntityMode,
|
|
396
|
+
collection,
|
|
397
|
+
entityId: undefined,
|
|
398
|
+
defaultValues,
|
|
399
|
+
path: path,
|
|
400
|
+
sidePanelController,
|
|
401
|
+
navigation: urlController,
|
|
402
|
+
onClose: unselectNavigatedEntity
|
|
403
|
+
});
|
|
404
|
+
}, [path, sidePanelController, openEntityMode, urlController, unselectNavigatedEntity]);
|
|
373
405
|
|
|
374
406
|
const onMultipleDeleteClick = () => {
|
|
375
407
|
analyticsController.onAnalyticsEvent?.("multiple_delete_dialog_open", {
|
|
@@ -399,14 +431,16 @@ export const EntityCollectionView = React.memo(
|
|
|
399
431
|
|
|
400
432
|
const pluginAddColumnComponents = useSlot("collection.add-column", {
|
|
401
433
|
path,
|
|
402
|
-
|
|
434
|
+
parentCollectionSlugs: parentCollectionSlugs ?? EMPTY_ARRAY,
|
|
435
|
+
parentEntityIds: parentEntityIds ?? EMPTY_ARRAY,
|
|
403
436
|
collection,
|
|
404
437
|
tableController
|
|
405
438
|
});
|
|
406
439
|
|
|
407
440
|
const pluginToolbarWidgets = useSlot("collection.toolbar", {
|
|
408
441
|
path,
|
|
409
|
-
|
|
442
|
+
parentCollectionSlugs: parentCollectionSlugs ?? EMPTY_ARRAY,
|
|
443
|
+
parentEntityIds: parentEntityIds ?? EMPTY_ARRAY,
|
|
410
444
|
collection: collection,
|
|
411
445
|
tableController: tableController,
|
|
412
446
|
selectionController: usedSelectionController
|
|
@@ -414,7 +448,8 @@ export const EntityCollectionView = React.memo(
|
|
|
414
448
|
|
|
415
449
|
const pluginEmptyStates = useSlot("collection.empty-state", {
|
|
416
450
|
path,
|
|
417
|
-
|
|
451
|
+
parentCollectionSlugs: parentCollectionSlugs ?? EMPTY_ARRAY,
|
|
452
|
+
parentEntityIds: parentEntityIds ?? EMPTY_ARRAY,
|
|
418
453
|
collection,
|
|
419
454
|
canCreate: canCreateEntities,
|
|
420
455
|
onNewClick
|
|
@@ -422,11 +457,12 @@ export const EntityCollectionView = React.memo(
|
|
|
422
457
|
|
|
423
458
|
const pluginInsights = useSlot("collection.insights", {
|
|
424
459
|
path,
|
|
425
|
-
|
|
460
|
+
parentCollectionSlugs: parentCollectionSlugs ?? EMPTY_ARRAY,
|
|
461
|
+
parentEntityIds: parentEntityIds ?? EMPTY_ARRAY,
|
|
426
462
|
collection
|
|
427
463
|
});
|
|
428
464
|
|
|
429
|
-
const onCollectionModifiedForUser = useCallback((path: string, partialCollection:
|
|
465
|
+
const onCollectionModifiedForUser = useCallback((path: string, partialCollection: PartialCollectionConfig<M>) => {
|
|
430
466
|
if (userConfigPersistence) {
|
|
431
467
|
const currentStoredConfig = userConfigPersistence.getCollectionConfig(path);
|
|
432
468
|
const updatedConfig = mergeDeep(currentStoredConfig, partialCollection);
|
|
@@ -442,7 +478,7 @@ export const EntityCollectionView = React.memo(
|
|
|
442
478
|
const collection = collectionRef.current;
|
|
443
479
|
// Only for property columns
|
|
444
480
|
if (!getPropertyInPath(collection.properties, key)) return;
|
|
445
|
-
const localCollection = buildPropertyWidthOverwrite(key, width) as
|
|
481
|
+
const localCollection = buildPropertyWidthOverwrite(key, width) as PartialCollectionConfig<M>;
|
|
446
482
|
onCollectionModifiedForUser(path, localCollection);
|
|
447
483
|
}, [onCollectionModifiedForUser, path]);
|
|
448
484
|
|
|
@@ -468,7 +504,7 @@ export const EntityCollectionView = React.memo(
|
|
|
468
504
|
setViewMode(mode);
|
|
469
505
|
// Save to local persistence for next visit
|
|
470
506
|
if (userConfigPersistence) {
|
|
471
|
-
onCollectionModifiedForUser(path, { defaultViewMode: mode } as
|
|
507
|
+
onCollectionModifiedForUser(path, { defaultViewMode: mode } as PartialCollectionConfig<M>);
|
|
472
508
|
}
|
|
473
509
|
}, [setViewMode, userConfigPersistence, onCollectionModifiedForUser, path, analyticsController, viewMode]);
|
|
474
510
|
|
|
@@ -562,7 +598,7 @@ export const EntityCollectionView = React.memo(
|
|
|
562
598
|
setSelectedKanbanProperty(property);
|
|
563
599
|
// Save to local persistence
|
|
564
600
|
if (userConfigPersistence) {
|
|
565
|
-
onCollectionModifiedForUser(path, { kanbanColumnProperty: property } as
|
|
601
|
+
onCollectionModifiedForUser(path, { kanbanColumnProperty: property } as PartialCollectionConfig<M>);
|
|
566
602
|
}
|
|
567
603
|
}, [userConfigPersistence, onCollectionModifiedForUser, path, analyticsController]);
|
|
568
604
|
|
|
@@ -599,7 +635,7 @@ export const EntityCollectionView = React.memo(
|
|
|
599
635
|
const additionalFields = useMemo(() => {
|
|
600
636
|
// v4: use getSubcollections helper to access subcollections
|
|
601
637
|
const subcollectionsList = getSubcollections(collection);
|
|
602
|
-
const subcollectionColumns: AdditionalFieldDelegate<M, any>[] = subcollectionsList.map((subcollection:
|
|
638
|
+
const subcollectionColumns: AdditionalFieldDelegate<M, any>[] = subcollectionsList.map((subcollection: CollectionConfig) => {
|
|
603
639
|
return {
|
|
604
640
|
key: getSubcollectionColumnId(subcollection),
|
|
605
641
|
name: subcollection.name,
|
|
@@ -618,7 +654,7 @@ export const EntityCollectionView = React.memo(
|
|
|
618
654
|
selectedTab: subcollection.slug,
|
|
619
655
|
path: path,
|
|
620
656
|
navigation: urlController,
|
|
621
|
-
|
|
657
|
+
sidePanelController
|
|
622
658
|
})
|
|
623
659
|
}}>
|
|
624
660
|
{subcollection.name}
|
|
@@ -631,7 +667,7 @@ export const EntityCollectionView = React.memo(
|
|
|
631
667
|
...(collection.additionalFields ?? EMPTY_ARRAY),
|
|
632
668
|
...subcollectionColumns
|
|
633
669
|
];
|
|
634
|
-
}, [collection, path,
|
|
670
|
+
}, [collection, path, sidePanelController]);
|
|
635
671
|
|
|
636
672
|
const updateLastDeleteTimestamp = useCallback(() => {
|
|
637
673
|
setLastDeleteTimestamp(Date.now());
|
|
@@ -651,10 +687,14 @@ export const EntityCollectionView = React.memo(
|
|
|
651
687
|
customEntityActions?: EntityAction[]
|
|
652
688
|
}): EntityAction[] => {
|
|
653
689
|
const deleteEnabled = entity ? canDelete(collection, path, entity) : true;
|
|
654
|
-
const
|
|
655
|
-
|
|
690
|
+
const disableActions = collection.disableDefaultActions ?? [];
|
|
691
|
+
const actions: EntityAction[] = [];
|
|
692
|
+
if (!disableActions.includes("edit")) {
|
|
693
|
+
actions.push(editEntityAction);
|
|
694
|
+
}
|
|
695
|
+
if (createEnabled && !disableActions.includes("copy"))
|
|
656
696
|
actions.push(copyEntityAction);
|
|
657
|
-
if (deleteEnabled)
|
|
697
|
+
if (deleteEnabled && !disableActions.includes("delete"))
|
|
658
698
|
actions.push(deleteEntityAction);
|
|
659
699
|
if (customEntityActions)
|
|
660
700
|
return mergeEntityActions(actions, customEntityActions);
|
|
@@ -692,7 +732,7 @@ export const EntityCollectionView = React.memo(
|
|
|
692
732
|
});
|
|
693
733
|
|
|
694
734
|
return (
|
|
695
|
-
<
|
|
735
|
+
<CollectionRowActions
|
|
696
736
|
entity={entity}
|
|
697
737
|
width={width}
|
|
698
738
|
frozen={frozen}
|
|
@@ -714,9 +754,11 @@ export const EntityCollectionView = React.memo(
|
|
|
714
754
|
}, [updateLastDeleteTimestamp, usedSelectionController]);
|
|
715
755
|
|
|
716
756
|
// Update breadcrumb count when count changes
|
|
757
|
+
const updateCountRef = React.useRef(breadcrumbs.updateCount);
|
|
758
|
+
updateCountRef.current = breadcrumbs.updateCount;
|
|
717
759
|
useEffect(() => {
|
|
718
|
-
|
|
719
|
-
}, [docsCount, path
|
|
760
|
+
updateCountRef.current(path, docsCount);
|
|
761
|
+
}, [docsCount, path]);
|
|
720
762
|
|
|
721
763
|
// EntitiesCount fetches count and updates breadcrumb - no visual rendering needed here
|
|
722
764
|
const countFetcher = <EntitiesCount
|
|
@@ -749,16 +791,17 @@ export const EntityCollectionView = React.memo(
|
|
|
749
791
|
propertyKey,
|
|
750
792
|
onHover,
|
|
751
793
|
path,
|
|
752
|
-
collection: collection as
|
|
753
|
-
tableController: tableController as
|
|
754
|
-
|
|
794
|
+
collection: collection as CollectionConfig,
|
|
795
|
+
tableController: tableController as EntityTableController,
|
|
796
|
+
parentCollectionSlugs: parentCollectionSlugs ?? EMPTY_ARRAY,
|
|
797
|
+
parentEntityIds: parentEntityIds ?? EMPTY_ARRAY
|
|
755
798
|
};
|
|
756
799
|
return <>{headerActionContributions.map((s, i) => (
|
|
757
800
|
<ErrorBoundary key={`header_action_${propertyKey}_${i}`}>
|
|
758
801
|
<s.Component {...headerSlotProps} {...(s.props ?? {})}/>
|
|
759
802
|
</ErrorBoundary>
|
|
760
803
|
))}</>;
|
|
761
|
-
}, [headerActionContributions, path,
|
|
804
|
+
}, [headerActionContributions, path, parentCollectionSlugs]);
|
|
762
805
|
|
|
763
806
|
const addColumnComponentInternal = pluginAddColumnComponents.length > 0
|
|
764
807
|
? function () {
|
|
@@ -794,13 +837,19 @@ export const EntityCollectionView = React.memo(
|
|
|
794
837
|
.forEach(plugin => {
|
|
795
838
|
plugin.hooks!.onColumnsReorder!({
|
|
796
839
|
fullPath: path,
|
|
797
|
-
|
|
840
|
+
parentCollectionSlugs: parentCollectionSlugs ?? EMPTY_ARRAY,
|
|
841
|
+
parentEntityIds: parentEntityIds ?? EMPTY_ARRAY,
|
|
798
842
|
collection,
|
|
799
843
|
newPropertiesOrder
|
|
800
844
|
});
|
|
801
845
|
});
|
|
802
846
|
}
|
|
803
|
-
|
|
847
|
+
|
|
848
|
+
// Save to user configuration persistence (local storage)
|
|
849
|
+
if (userConfigPersistence) {
|
|
850
|
+
onCollectionModifiedForUser(path, { propertiesOrder: newPropertiesOrder } as PartialCollectionConfig<M>);
|
|
851
|
+
}
|
|
852
|
+
}, [collection, setLocalPropertiesOrder, customizationController, path, parentCollectionSlugs, parentEntityIds, userConfigPersistence, onCollectionModifiedForUser]);
|
|
804
853
|
|
|
805
854
|
// Popover open state managed at parent level to prevent closing when view changes
|
|
806
855
|
const [viewModePopoverOpen, setViewModePopoverOpen] = useState(false);
|
|
@@ -825,71 +874,73 @@ export const EntityCollectionView = React.memo(
|
|
|
825
874
|
const pluginErrorViews = useSlot("collection.error", {
|
|
826
875
|
path,
|
|
827
876
|
collection,
|
|
828
|
-
|
|
877
|
+
parentCollectionSlugs,
|
|
878
|
+
parentEntityIds,
|
|
829
879
|
error: tableController.dataLoadingError as Error
|
|
830
880
|
});
|
|
831
881
|
const pluginErrorView = tableController.dataLoadingError && pluginErrorViews.length > 0
|
|
832
882
|
? pluginErrorViews[0]
|
|
833
883
|
: null;
|
|
834
884
|
|
|
835
|
-
// Shared empty state — plugin slot takes priority, then default
|
|
836
|
-
const
|
|
885
|
+
// Shared empty state — plugin slot takes priority, then override, then default
|
|
886
|
+
const isSearching = !!tableController.searchString;
|
|
887
|
+
const isFilteredOrSorted = tableController.filterValues !== undefined || tableController.sortBy !== undefined || isSearching;
|
|
888
|
+
const ResolvedEmptyState = useComponentOverride("Collection.EmptyState", DefaultCollectionEmptyState);
|
|
889
|
+
const ResolvedCollectionActions = useComponentOverride("Collection.Actions", CollectionViewActions);
|
|
890
|
+
const ResolvedCollectionTable = useComponentOverride("Collection.Table", CollectionTableBinding) as typeof CollectionTableBinding;
|
|
837
891
|
const emptyComponent = pluginEmptyStates.length > 0
|
|
838
892
|
? <>{pluginEmptyStates}</>
|
|
839
|
-
:
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
>
|
|
846
|
-
<PlusIcon/>
|
|
847
|
-
{t("create_your_first_entry")}
|
|
848
|
-
</Button>
|
|
849
|
-
</div>
|
|
850
|
-
: <Typography variant={"label"}>{t("no_results_filter_sort")}</Typography>;
|
|
893
|
+
: <ResolvedEmptyState
|
|
894
|
+
canCreate={canCreateEntities && !isFilteredOrSorted}
|
|
895
|
+
onNewClick={onNewClick}
|
|
896
|
+
isSearching={isSearching}
|
|
897
|
+
searchString={tableController.searchString ?? ""}
|
|
898
|
+
/>;
|
|
851
899
|
|
|
852
900
|
const toolbarNode = (
|
|
853
901
|
<CollectionTableToolbar
|
|
854
902
|
compact={isCompact}
|
|
855
903
|
loading={tableController.dataLoading}
|
|
856
904
|
onTextSearch={tableController.setSearchString}
|
|
905
|
+
initialSearchText={tableController.searchString}
|
|
857
906
|
viewModeToggle={viewModeToggleElement}
|
|
858
|
-
actionsStart={<
|
|
859
|
-
|
|
907
|
+
actionsStart={<CollectionViewStartActions
|
|
908
|
+
parentCollectionSlugs={parentCollectionSlugs ?? EMPTY_ARRAY} parentEntityIds={parentEntityIds ?? EMPTY_ARRAY}
|
|
860
909
|
collection={collection}
|
|
861
910
|
tableController={tableController}
|
|
862
911
|
path={path}
|
|
863
|
-
relativePath={collection
|
|
912
|
+
relativePath={getCollectionDataPath(collection)}
|
|
864
913
|
selectionController={usedSelectionController}
|
|
865
914
|
collectionEntitiesCount={docsCount ?? undefined}
|
|
866
915
|
resolvedProperties={resolvedCollection.properties}
|
|
916
|
+
openNewDocument={openNewDocument}
|
|
867
917
|
compact={isCompact}/>}
|
|
868
918
|
actions={
|
|
869
|
-
<
|
|
870
|
-
|
|
919
|
+
<ResolvedCollectionActions
|
|
920
|
+
parentCollectionSlugs={parentCollectionSlugs ?? EMPTY_ARRAY} parentEntityIds={parentEntityIds ?? EMPTY_ARRAY}
|
|
871
921
|
collection={collection}
|
|
872
922
|
tableController={tableController}
|
|
873
923
|
onMultipleDeleteClick={onMultipleDeleteClick}
|
|
874
924
|
onNewClick={onNewClick}
|
|
925
|
+
openNewDocument={openNewDocument}
|
|
875
926
|
path={path}
|
|
876
|
-
relativePath={collection
|
|
927
|
+
relativePath={getCollectionDataPath(collection)}
|
|
877
928
|
selectionController={usedSelectionController}
|
|
878
929
|
selectionEnabled={activeSelectionEnabled}
|
|
879
930
|
collectionEntitiesCount={docsCount ?? undefined}
|
|
880
931
|
compact={isCompact}
|
|
881
932
|
>
|
|
882
933
|
{pluginToolbarWidgets}
|
|
883
|
-
</
|
|
934
|
+
</ResolvedCollectionActions>
|
|
884
935
|
}
|
|
885
936
|
/>
|
|
886
937
|
); const innerView = viewMode === "kanban" ? (
|
|
887
|
-
<
|
|
938
|
+
<CollectionBoardViewBinding
|
|
888
939
|
key={`kanban-view-${path}-${selectedKanbanProperty}`}
|
|
889
940
|
collection={collection}
|
|
890
941
|
tableController={tableController}
|
|
891
942
|
fullPath={path}
|
|
892
|
-
|
|
943
|
+
parentCollectionSlugs={parentCollectionSlugs} parentEntityIds={parentEntityIds}
|
|
893
944
|
columnProperty={selectedKanbanProperty}
|
|
894
945
|
onEntityClick={onEntityClick}
|
|
895
946
|
selectionController={usedSelectionController}
|
|
@@ -899,7 +950,7 @@ export const EntityCollectionView = React.memo(
|
|
|
899
950
|
emptyComponent={emptyComponent}
|
|
900
951
|
/>
|
|
901
952
|
) : viewMode === "cards" ? (
|
|
902
|
-
<
|
|
953
|
+
<CollectionCardViewBinding
|
|
903
954
|
key={`cards-view-${path}`}
|
|
904
955
|
collection={collection}
|
|
905
956
|
tableController={tableController}
|
|
@@ -913,7 +964,7 @@ export const EntityCollectionView = React.memo(
|
|
|
913
964
|
emptyComponent={emptyComponent}
|
|
914
965
|
/>
|
|
915
966
|
) : viewMode === "list" ? (
|
|
916
|
-
<
|
|
967
|
+
<CollectionListViewBinding
|
|
917
968
|
key={`list-view-${path}`}
|
|
918
969
|
collection={collection}
|
|
919
970
|
tableController={tableController}
|
|
@@ -923,9 +974,12 @@ export const EntityCollectionView = React.memo(
|
|
|
923
974
|
highlightedEntities={highlightedEntity ? [highlightedEntity] : []}
|
|
924
975
|
size={listSize}
|
|
925
976
|
emptyComponent={emptyComponent}
|
|
977
|
+
getActionsForEntity={getActionsForEntity}
|
|
978
|
+
path={path}
|
|
979
|
+
openEntityMode={openEntityMode}
|
|
926
980
|
/>
|
|
927
981
|
) : (
|
|
928
|
-
<
|
|
982
|
+
<ResolvedCollectionTable
|
|
929
983
|
key={`collection_table_${path}`}
|
|
930
984
|
hideToolbar={true}
|
|
931
985
|
additionalFields={additionalFields}
|
|
@@ -960,12 +1014,20 @@ export const EntityCollectionView = React.memo(
|
|
|
960
1014
|
/>
|
|
961
1015
|
);
|
|
962
1016
|
|
|
963
|
-
|
|
1017
|
+
const mainContent = (
|
|
964
1018
|
<div className={cls("overflow-hidden h-full w-full rounded-md flex flex-col dark:bg-surface-800", className)}
|
|
965
1019
|
ref={containerRef}>
|
|
966
1020
|
|
|
967
1021
|
{countFetcher}
|
|
968
1022
|
|
|
1023
|
+
{tableController.dataLoadingError && tableController.data.length > 0 && (
|
|
1024
|
+
<div className="flex items-center gap-4 px-4 py-2 bg-red-50 dark:bg-red-900/20 border-b border-red-200 dark:border-red-800 flex-shrink-0">
|
|
1025
|
+
<Typography variant="body2" className="text-red-700 dark:text-red-300 flex-1">
|
|
1026
|
+
<strong>Warning:</strong> {tableController.dataLoadingError.message || "Failed to update data."}
|
|
1027
|
+
</Typography>
|
|
1028
|
+
</div>
|
|
1029
|
+
)}
|
|
1030
|
+
|
|
969
1031
|
|
|
970
1032
|
{/* When isSplitLayout, SplitListView is ALWAYS mounted — regardless
|
|
971
1033
|
of viewMode. The toolbar + current view live in the left panel;
|
|
@@ -987,7 +1049,7 @@ export const EntityCollectionView = React.memo(
|
|
|
987
1049
|
size={listSize}
|
|
988
1050
|
emptyComponent={emptyComponent}
|
|
989
1051
|
path={path}
|
|
990
|
-
|
|
1052
|
+
parentCollectionSlugs={parentCollectionSlugs} parentEntityIds={parentEntityIds}
|
|
991
1053
|
selectedEntityId={selectedEntityIdProp}
|
|
992
1054
|
selectedTab={selectedTabProp}
|
|
993
1055
|
toolbar={toolbarNode}
|
|
@@ -1000,7 +1062,7 @@ export const EntityCollectionView = React.memo(
|
|
|
1000
1062
|
className={cls(
|
|
1001
1063
|
"flex flex-col w-full",
|
|
1002
1064
|
selectedEntityIdProp === undefined
|
|
1003
|
-
? "max-w-6xl mx-auto px-3 md:px-4 lg
|
|
1065
|
+
? "max-w-6xl mx-auto px-3 md:px-4 lg:px-6 py-4"
|
|
1004
1066
|
: ""
|
|
1005
1067
|
)}
|
|
1006
1068
|
>
|
|
@@ -1020,11 +1082,20 @@ export const EntityCollectionView = React.memo(
|
|
|
1020
1082
|
</div>
|
|
1021
1083
|
</div>
|
|
1022
1084
|
{pluginInsights.length > 0 && (
|
|
1023
|
-
<div
|
|
1024
|
-
{
|
|
1085
|
+
<div
|
|
1086
|
+
className={cls(
|
|
1087
|
+
"grid transition-[grid-template-rows] duration-150 ease-out",
|
|
1088
|
+
selectedEntityIdProp === undefined
|
|
1089
|
+
? "grid-rows-[1fr]"
|
|
1090
|
+
: "grid-rows-[0fr]"
|
|
1091
|
+
)}
|
|
1092
|
+
>
|
|
1093
|
+
<div className="overflow-hidden flex-shrink-0">
|
|
1094
|
+
{pluginInsights}
|
|
1095
|
+
</div>
|
|
1025
1096
|
</div>
|
|
1026
1097
|
)}
|
|
1027
|
-
<
|
|
1098
|
+
<CollectionListViewBinding
|
|
1028
1099
|
key={`list-view-${path}`}
|
|
1029
1100
|
collection={collection}
|
|
1030
1101
|
tableController={tableController}
|
|
@@ -1035,6 +1106,9 @@ export const EntityCollectionView = React.memo(
|
|
|
1035
1106
|
size={listSize}
|
|
1036
1107
|
emptyComponent={emptyComponent}
|
|
1037
1108
|
selectedEntityId={selectedEntityIdProp}
|
|
1109
|
+
getActionsForEntity={getActionsForEntity}
|
|
1110
|
+
path={path}
|
|
1111
|
+
openEntityMode={openEntityMode}
|
|
1038
1112
|
/>
|
|
1039
1113
|
</div>
|
|
1040
1114
|
) : (
|
|
@@ -1042,15 +1116,47 @@ export const EntityCollectionView = React.memo(
|
|
|
1042
1116
|
)}
|
|
1043
1117
|
</SplitListView>
|
|
1044
1118
|
) : (
|
|
1045
|
-
|
|
1119
|
+
<div className="flex flex-col w-full h-full">
|
|
1046
1120
|
{toolbarNode}
|
|
1047
|
-
{
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1121
|
+
<div className={cls(
|
|
1122
|
+
"flex-1 flex flex-col",
|
|
1123
|
+
(viewMode === "list" || viewMode === "cards") && "overflow-y-auto"
|
|
1124
|
+
)}>
|
|
1125
|
+
{viewMode === "list" ? (
|
|
1126
|
+
<div
|
|
1127
|
+
className={cls(
|
|
1128
|
+
"flex flex-col w-full",
|
|
1129
|
+
selectedEntityIdProp === undefined
|
|
1130
|
+
? "max-w-6xl mx-auto px-3 md:px-4 lg:px-6 py-4"
|
|
1131
|
+
: ""
|
|
1132
|
+
)}
|
|
1133
|
+
>
|
|
1134
|
+
<div
|
|
1135
|
+
className={cls(
|
|
1136
|
+
"grid transition-[grid-template-rows,transform,margin] duration-150 ease-out",
|
|
1137
|
+
selectedEntityIdProp === undefined
|
|
1138
|
+
? "grid-rows-[1fr] translate-y-0 mt-12 mb-6"
|
|
1139
|
+
: "grid-rows-[0fr] -translate-y-2 mt-0 mb-0"
|
|
1140
|
+
)}
|
|
1141
|
+
>
|
|
1142
|
+
<div className="overflow-hidden flex items-center gap-4">
|
|
1143
|
+
<Typography gutterBottom variant="h4" className="grow mb-0" component="h4">
|
|
1144
|
+
{collection.name}
|
|
1145
|
+
</Typography>
|
|
1146
|
+
</div>
|
|
1147
|
+
</div>
|
|
1148
|
+
{pluginInsights.length > 0 && (
|
|
1149
|
+
<div className="flex-shrink-0">
|
|
1150
|
+
{pluginInsights}
|
|
1151
|
+
</div>
|
|
1152
|
+
)}
|
|
1153
|
+
{innerView}
|
|
1154
|
+
</div>
|
|
1155
|
+
) : (
|
|
1156
|
+
innerView
|
|
1157
|
+
)}
|
|
1158
|
+
</div>
|
|
1159
|
+
</div>
|
|
1054
1160
|
)}
|
|
1055
1161
|
|
|
1056
1162
|
{popupCell && <PopupFormField
|
|
@@ -1080,9 +1186,11 @@ export const EntityCollectionView = React.memo(
|
|
|
1080
1186
|
|
|
1081
1187
|
</div>
|
|
1082
1188
|
);
|
|
1189
|
+
|
|
1190
|
+
return mainContent;
|
|
1083
1191
|
}, (a, b) => {
|
|
1084
1192
|
return equal(a.path, b.path) &&
|
|
1085
|
-
equal(a.
|
|
1193
|
+
equal(a.parentCollectionSlugs, b.parentCollectionSlugs) && equal(a.parentEntityIds, b.parentEntityIds) &&
|
|
1086
1194
|
equal(a.isSubCollection, b.isSubCollection) &&
|
|
1087
1195
|
equal(a.className, b.className) &&
|
|
1088
1196
|
equal(a.properties, b.properties) &&
|
|
@@ -1099,10 +1207,77 @@ export const EntityCollectionView = React.memo(
|
|
|
1099
1207
|
equal(a.openEntityMode, b.openEntityMode) &&
|
|
1100
1208
|
equal(a.exportable, b.exportable) &&
|
|
1101
1209
|
equal(a.history, b.history) &&
|
|
1102
|
-
equal(a.
|
|
1210
|
+
equal(a.fixedFilter, b.fixedFilter) &&
|
|
1103
1211
|
equal(a.selectedEntityId, b.selectedEntityId) &&
|
|
1104
1212
|
equal(a.selectedTab, b.selectedTab);
|
|
1105
|
-
}) as React.FunctionComponent<
|
|
1213
|
+
}) as React.FunctionComponent<CollectionViewBindingProps<any>>;
|
|
1214
|
+
|
|
1215
|
+
export const CollectionViewBinding = React.memo(
|
|
1216
|
+
function CollectionViewBinding<M extends Record<string, unknown>>(props: CollectionViewBindingProps<M>) {
|
|
1217
|
+
const collectionRegistry = useCollectionRegistryController();
|
|
1218
|
+
const path = props.path ?? props.slug;
|
|
1219
|
+
const collection = collectionRegistry.getCollection(path) ?? props;
|
|
1220
|
+
|
|
1221
|
+
const content = <CollectionViewBindingInner {...props} />;
|
|
1222
|
+
|
|
1223
|
+
if (collection) {
|
|
1224
|
+
return (
|
|
1225
|
+
<CollectionScopeProvider collection={collection as CollectionConfig}>
|
|
1226
|
+
{content}
|
|
1227
|
+
</CollectionScopeProvider>
|
|
1228
|
+
);
|
|
1229
|
+
}
|
|
1230
|
+
return content;
|
|
1231
|
+
}
|
|
1232
|
+
) as React.FunctionComponent<CollectionViewBindingProps<any>>;
|
|
1233
|
+
|
|
1234
|
+
/**
|
|
1235
|
+
* Default empty state shown when a collection has no entities.
|
|
1236
|
+
* Used as the fallback for the `"Collection.EmptyState"` component override.
|
|
1237
|
+
*
|
|
1238
|
+
* @internal
|
|
1239
|
+
*/
|
|
1240
|
+
function DefaultCollectionEmptyState({
|
|
1241
|
+
canCreate,
|
|
1242
|
+
onNewClick,
|
|
1243
|
+
isSearching,
|
|
1244
|
+
searchString
|
|
1245
|
+
}: {
|
|
1246
|
+
canCreate: boolean;
|
|
1247
|
+
onNewClick: () => void;
|
|
1248
|
+
isSearching: boolean;
|
|
1249
|
+
searchString: string;
|
|
1250
|
+
}) {
|
|
1251
|
+
const { t } = useTranslation();
|
|
1252
|
+
if (canCreate) {
|
|
1253
|
+
return (
|
|
1254
|
+
<div className="flex flex-col items-center justify-center">
|
|
1255
|
+
<Typography variant={"subtitle2"}>{t("so_empty")}</Typography>
|
|
1256
|
+
<Button
|
|
1257
|
+
onClick={onNewClick}
|
|
1258
|
+
className="mt-4"
|
|
1259
|
+
>
|
|
1260
|
+
<PlusIcon/>
|
|
1261
|
+
{t("create_your_first_entry")}
|
|
1262
|
+
</Button>
|
|
1263
|
+
</div>
|
|
1264
|
+
);
|
|
1265
|
+
}
|
|
1266
|
+
return (
|
|
1267
|
+
<Typography variant={"label"}>
|
|
1268
|
+
{isSearching
|
|
1269
|
+
? t("no_results_search", { search: searchString })
|
|
1270
|
+
: t("no_results_filter_sort")}
|
|
1271
|
+
</Typography>
|
|
1272
|
+
);
|
|
1273
|
+
}
|
|
1274
|
+
|
|
1275
|
+
/**
|
|
1276
|
+
* Inflight count request deduplication map.
|
|
1277
|
+
* Keyed by `path|filterKey|sortByProperty|sortDir` so that concurrent
|
|
1278
|
+
* callers (e.g. React StrictMode double-mount) share the same promise.
|
|
1279
|
+
*/
|
|
1280
|
+
const inflightCountRequests = new Map<string, Promise<number>>();
|
|
1106
1281
|
|
|
1107
1282
|
function EntitiesCount({
|
|
1108
1283
|
path,
|
|
@@ -1112,70 +1287,72 @@ function EntitiesCount({
|
|
|
1112
1287
|
onCountChange
|
|
1113
1288
|
}: {
|
|
1114
1289
|
path: string,
|
|
1115
|
-
collection:
|
|
1290
|
+
collection: CollectionConfig,
|
|
1116
1291
|
filter?: FilterValues<any>,
|
|
1117
1292
|
sortBy?: [string, "asc" | "desc"],
|
|
1118
1293
|
onCountChange?: (count: number | null | undefined) => void,
|
|
1119
1294
|
}) {
|
|
1120
1295
|
|
|
1121
1296
|
const dataClient = useData();
|
|
1122
|
-
const navigation = useCollectionRegistryController();
|
|
1123
1297
|
|
|
1124
1298
|
const sortByProperty = sortBy ? sortBy[0] : undefined;
|
|
1125
1299
|
const currentSort = sortBy ? sortBy[1] : undefined;
|
|
1126
|
-
|
|
1127
|
-
|
|
1300
|
+
|
|
1301
|
+
// Use refs for values that should NOT trigger re-fetches
|
|
1302
|
+
const dataClientRef = React.useRef(dataClient);
|
|
1303
|
+
dataClientRef.current = dataClient;
|
|
1304
|
+
const onCountChangeRef = React.useRef(onCountChange);
|
|
1305
|
+
onCountChangeRef.current = onCountChange;
|
|
1306
|
+
|
|
1307
|
+
// Serialize filter to a stable string to avoid re-fetches on object identity changes
|
|
1308
|
+
const filterKey = React.useMemo(() => filter ? JSON.stringify(filter) : "", [filter]);
|
|
1128
1309
|
|
|
1129
1310
|
useEffect(() => {
|
|
1130
|
-
const accessor =
|
|
1131
|
-
if (accessor.count) {
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
const whereMap: Record<string, string> = {};
|
|
1136
|
-
if (filter) {
|
|
1137
|
-
Object.entries(filter).forEach(([key, value]) => {
|
|
1138
|
-
if (value && Array.isArray(value)) {
|
|
1139
|
-
const [op, val] = value;
|
|
1140
|
-
const postgrestOp = op === "==" ? "eq" : op === "!=" ? "neq" : op === ">" ? "gt" : op === ">=" ? "gte" : op === "<" ? "lt" : op === "<=" ? "lte" : op === "in" ? "in" : op === "not-in" ? "nin" : op === "array-contains" ? "cs" : op === "array-contains-any" ? "csa" : "eq";
|
|
1141
|
-
|
|
1142
|
-
let stringVal: string;
|
|
1143
|
-
if (Array.isArray(val)) {
|
|
1144
|
-
stringVal = `(${val.join(",")})`;
|
|
1145
|
-
} else {
|
|
1146
|
-
stringVal = String(val);
|
|
1147
|
-
}
|
|
1148
|
-
whereMap[key] = `${postgrestOp}.${stringVal}`;
|
|
1149
|
-
}
|
|
1150
|
-
});
|
|
1151
|
-
}
|
|
1152
|
-
const whereParams = Object.keys(whereMap).length > 0 ? whereMap : undefined;
|
|
1153
|
-
const orderByParams = sortByProperty ? `${String(sortByProperty)}:${currentSort}` : undefined;
|
|
1311
|
+
const accessor = dataClientRef.current.collection(path);
|
|
1312
|
+
if (!accessor.count) {
|
|
1313
|
+
onCountChangeRef.current?.(undefined);
|
|
1314
|
+
return;
|
|
1315
|
+
}
|
|
1154
1316
|
|
|
1155
|
-
|
|
1317
|
+
let cancelled = false;
|
|
1318
|
+
|
|
1319
|
+
// filterValues is already FilterValues — pass directly
|
|
1320
|
+
const whereParams = filter && Object.keys(filter).length > 0 ? filter : undefined;
|
|
1321
|
+
const orderByParams: [string, "asc" | "desc"] | undefined = sortByProperty && currentSort ? [String(sortByProperty), currentSort] : undefined;
|
|
1322
|
+
|
|
1323
|
+
// Deduplicate inflight count requests (e.g. React StrictMode double-mount)
|
|
1324
|
+
const cacheKey = `${path}|${filterKey}|${sortByProperty ?? ""}|${currentSort ?? ""}`;
|
|
1325
|
+
let countPromise = inflightCountRequests.get(cacheKey);
|
|
1326
|
+
if (!countPromise) {
|
|
1327
|
+
countPromise = accessor.count({
|
|
1156
1328
|
where: whereParams,
|
|
1157
1329
|
orderBy: orderByParams
|
|
1158
|
-
}).then((c) => {
|
|
1159
|
-
if (onCountChange) onCountChange(c);
|
|
1160
|
-
}).catch((e) => {
|
|
1161
|
-
console.warn("Error fetching count", e);
|
|
1162
|
-
if (onCountChange) onCountChange(undefined);
|
|
1163
1330
|
});
|
|
1164
|
-
|
|
1165
|
-
|
|
1331
|
+
inflightCountRequests.set(cacheKey, countPromise);
|
|
1332
|
+
// Clean up the inflight entry once resolved/rejected
|
|
1333
|
+
countPromise.finally(() => inflightCountRequests.delete(cacheKey));
|
|
1166
1334
|
}
|
|
1167
|
-
|
|
1335
|
+
|
|
1336
|
+
countPromise.then((c) => {
|
|
1337
|
+
if (!cancelled) onCountChangeRef.current?.(c);
|
|
1338
|
+
}).catch((e) => {
|
|
1339
|
+
console.warn("Error fetching count", e);
|
|
1340
|
+
if (!cancelled) onCountChangeRef.current?.(undefined);
|
|
1341
|
+
});
|
|
1342
|
+
|
|
1343
|
+
return () => { cancelled = true; };
|
|
1344
|
+
}, [path, filterKey, sortByProperty, currentSort]);
|
|
1168
1345
|
|
|
1169
1346
|
// Count is now displayed in the breadcrumb bar, this component only fetches and reports
|
|
1170
1347
|
return null;
|
|
1171
1348
|
}
|
|
1172
1349
|
|
|
1173
|
-
function buildPropertyWidthOverwrite(key: string, width: number):
|
|
1350
|
+
function buildPropertyWidthOverwrite(key: string, width: number): PartialCollectionConfig {
|
|
1174
1351
|
if (key.includes(".")) {
|
|
1175
1352
|
const [parentKey, ...childKey] = key.split(".");
|
|
1176
|
-
return { properties: { [parentKey]: buildPropertyWidthOverwrite(childKey.join("."), width) } } as
|
|
1353
|
+
return { properties: { [parentKey]: buildPropertyWidthOverwrite(childKey.join("."), width) } } as PartialCollectionConfig;
|
|
1177
1354
|
}
|
|
1178
|
-
return { properties: { [key]: { columnWidth: width } } } as
|
|
1355
|
+
return { properties: { [key]: { ui: { columnWidth: width } } } } as PartialCollectionConfig;
|
|
1179
1356
|
}
|
|
1180
1357
|
|
|
1181
1358
|
function EntityIdHeaderWidget({
|
|
@@ -1183,7 +1360,7 @@ function EntityIdHeaderWidget({
|
|
|
1183
1360
|
path,
|
|
1184
1361
|
idPath
|
|
1185
1362
|
}: {
|
|
1186
|
-
collection:
|
|
1363
|
+
collection: CollectionConfig,
|
|
1187
1364
|
path: string,
|
|
1188
1365
|
idPath: string
|
|
1189
1366
|
}) {
|
|
@@ -1193,7 +1370,7 @@ function EntityIdHeaderWidget({
|
|
|
1193
1370
|
const [openPopup, setOpenPopup] = React.useState(false);
|
|
1194
1371
|
const [searchString, setSearchString] = React.useState("");
|
|
1195
1372
|
const [recentIds, setRecentIds] = React.useState<string[]>(getRecentIds(collection.slug).map(String));
|
|
1196
|
-
const
|
|
1373
|
+
const sidePanelController = useSidePanel();
|
|
1197
1374
|
|
|
1198
1375
|
const openEntityMode = collection?.openEntityMode ?? DEFAULT_ENTITY_OPEN_MODE;
|
|
1199
1376
|
|
|
@@ -1225,22 +1402,24 @@ function EntityIdHeaderWidget({
|
|
|
1225
1402
|
entityId,
|
|
1226
1403
|
path,
|
|
1227
1404
|
|
|
1228
|
-
|
|
1405
|
+
sidePanelController,
|
|
1229
1406
|
navigation: urlController
|
|
1230
1407
|
})
|
|
1231
1408
|
}}
|
|
1232
1409
|
className={"w-96 max-w-full"}>
|
|
1233
1410
|
|
|
1234
1411
|
<div className="flex p-2 w-full gap-2">
|
|
1235
|
-
<
|
|
1412
|
+
<TextField
|
|
1236
1413
|
autoFocus={openPopup}
|
|
1237
1414
|
placeholder={t("find_entity_by_id")}
|
|
1238
|
-
|
|
1415
|
+
size="small"
|
|
1239
1416
|
onChange={(e) => {
|
|
1240
1417
|
setSearchString(e.target.value);
|
|
1241
1418
|
}}
|
|
1242
1419
|
value={searchString}
|
|
1243
|
-
className=
|
|
1420
|
+
className="flex-grow"
|
|
1421
|
+
inputClassName={cls("rounded-lg bg-white dark:bg-surface-900", focusedDisabled)}
|
|
1422
|
+
/>
|
|
1244
1423
|
<Button variant={"text"}
|
|
1245
1424
|
disabled={!(searchString.trim())}
|
|
1246
1425
|
type={"submit"}
|
|
@@ -1261,7 +1440,7 @@ path })}
|
|
|
1261
1440
|
entityId: id,
|
|
1262
1441
|
path,
|
|
1263
1442
|
|
|
1264
|
-
|
|
1443
|
+
sidePanelController,
|
|
1265
1444
|
navigation: urlController
|
|
1266
1445
|
})
|
|
1267
1446
|
}}
|