@rebasepro/cms 0.17.3 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/{CollectionEditorDialog-B-akreOU.js → CollectionEditorDialog-BeX4b92r.js} +13 -7
- package/dist/{CollectionEditorDialog-B-akreOU.js.map → CollectionEditorDialog-BeX4b92r.js.map} +1 -1
- package/dist/{PropertyEditView-CiY84wkR.js → PropertyEditView-C7thfj4L.js} +3 -3
- package/dist/{PropertyEditView-CiY84wkR.js.map → PropertyEditView-C7thfj4L.js.map} +1 -1
- package/dist/{RouterCollectionsStudioView-DkAWda4N.js → RouterCollectionsStudioView-BtjzvB6E.js} +4 -4
- package/dist/{RouterCollectionsStudioView-DkAWda4N.js.map → RouterCollectionsStudioView-BtjzvB6E.js.map} +1 -1
- package/dist/{SchemaChangeDialog-DceT8QFX.js → SchemaChangeDialog-CkqK6KOC.js} +4 -2
- package/dist/{SchemaChangeDialog-DceT8QFX.js.map → SchemaChangeDialog-CkqK6KOC.js.map} +1 -1
- package/dist/collection_editor/api/generateCollectionApi.d.ts +1 -2
- package/dist/collection_editor_ui.d.ts +2 -0
- package/dist/collection_editor_ui.js +6 -5
- package/dist/collection_editor_ui.js.map +1 -1
- package/dist/components/DeleteEntityDialog.d.ts +2 -3
- package/dist/components/RebaseLayout.d.ts +11 -4
- package/dist/components/field_configs.d.ts +1 -1
- package/dist/editor/sanitize-html.d.ts +15 -0
- package/dist/editor.js +195 -10
- package/dist/editor.js.map +1 -1
- package/dist/{export-Ben8E355.js → export--arni_VY.js} +2 -2
- package/dist/{export-Ben8E355.js.map → export--arni_VY.js.map} +1 -1
- package/dist/form/components/LabelWithIcon.d.ts +10 -0
- package/dist/{history-DIEVd26f.js → history-C2TpoQwi.js} +2 -2
- package/dist/{history-DIEVd26f.js.map → history-C2TpoQwi.js.map} +1 -1
- package/dist/hooks/navigation/useBuildNavigationStateController.d.ts +1 -1
- package/dist/hooks/navigation/useResolvedViews.d.ts +1 -1
- package/dist/hooks/navigation/useTopLevelNavigation.d.ts +1 -1
- package/dist/{import-D25x7ko-.js → import-DTkXNoBg.js} +2 -2
- package/dist/{import-D25x7ko-.js.map → import-DTkXNoBg.js.map} +1 -1
- package/dist/index.js +78 -33
- package/dist/index.js.map +1 -1
- package/dist/util/propertyConfigMapper.d.ts +1 -1
- package/dist/util-CfLFggP7.js +57 -0
- package/dist/util-CfLFggP7.js.map +1 -0
- package/dist/{util-DVqnqlLn.js → util-DE1WQW6h.js} +134 -112
- package/dist/util-DE1WQW6h.js.map +1 -0
- package/package.json +42 -34
- package/dist/util-DVqnqlLn.js.map +0 -1
- package/src/collection_editor/CollectionEditorDialogsContext.tsx +0 -25
- package/src/collection_editor/ConfigControllerProvider.tsx +0 -395
- package/src/collection_editor/_cms_internals.ts +0 -41
- package/src/collection_editor/api/generateCollectionApi.ts +0 -126
- package/src/collection_editor/api/index.ts +0 -1
- package/src/collection_editor/extensibility_types.ts +0 -168
- package/src/collection_editor/index.ts +0 -108
- package/src/collection_editor/liveSchemaClient.ts +0 -285
- package/src/collection_editor/relation_kinds.ts +0 -44
- package/src/collection_editor/serializable_types.ts +0 -535
- package/src/collection_editor/serializable_utils.ts +0 -729
- package/src/collection_editor/types/collection_editor_controller.tsx +0 -62
- package/src/collection_editor/types/collection_inference.ts +0 -18
- package/src/collection_editor/types/config_controller.tsx +0 -121
- package/src/collection_editor/ui/AddKanbanColumnAction.tsx +0 -199
- package/src/collection_editor/ui/CollectionViewHeaderAction.tsx +0 -51
- package/src/collection_editor/ui/EditorCollectionAction.tsx +0 -54
- package/src/collection_editor/ui/EditorCollectionActionStart.tsx +0 -90
- package/src/collection_editor/ui/EditorEntityAction.tsx +0 -50
- package/src/collection_editor/ui/HomePageEditorCollectionAction.tsx +0 -114
- package/src/collection_editor/ui/KanbanSetupAction.tsx +0 -43
- package/src/collection_editor/ui/MissingReferenceWidget.tsx +0 -35
- package/src/collection_editor/ui/NewCollectionButton.tsx +0 -27
- package/src/collection_editor/ui/NewCollectionCard.tsx +0 -48
- package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +0 -49
- package/src/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.tsx +0 -260
- package/src/collection_editor/ui/collection_editor/AIModifiedPathsContext.tsx +0 -90
- package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +0 -388
- package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +0 -1098
- package/src/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.tsx +0 -301
- package/src/collection_editor/ui/collection_editor/CollectionJsonImportDialog.tsx +0 -172
- package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +0 -620
- package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +0 -530
- package/src/collection_editor/ui/collection_editor/CollectionRelationsTab.tsx +0 -462
- package/src/collection_editor/ui/collection_editor/CollectionStudioView.tsx +0 -104
- package/src/collection_editor/ui/collection_editor/CollectionYupValidation.tsx +0 -9
- package/src/collection_editor/ui/collection_editor/CollectionsStudioView.tsx +0 -199
- package/src/collection_editor/ui/collection_editor/DisplaySettingsForm.tsx +0 -315
- package/src/collection_editor/ui/collection_editor/EntityActionsEditTab.tsx +0 -164
- package/src/collection_editor/ui/collection_editor/EntityActionsSelectDialog.tsx +0 -40
- package/src/collection_editor/ui/collection_editor/EntityCustomViewsSelectDialog.tsx +0 -39
- package/src/collection_editor/ui/collection_editor/EnumForm.tsx +0 -373
- package/src/collection_editor/ui/collection_editor/GeneralSettingsForm.tsx +0 -288
- package/src/collection_editor/ui/collection_editor/GetCodeDialog.tsx +0 -141
- package/src/collection_editor/ui/collection_editor/KanbanConfigSection.tsx +0 -194
- package/src/collection_editor/ui/collection_editor/LayoutModeSwitch.tsx +0 -53
- package/src/collection_editor/ui/collection_editor/PropertyEditView.tsx +0 -980
- package/src/collection_editor/ui/collection_editor/PropertyFieldPreview.tsx +0 -164
- package/src/collection_editor/ui/collection_editor/PropertyTree.tsx +0 -364
- package/src/collection_editor/ui/collection_editor/RouterCollectionStudioView.tsx +0 -44
- package/src/collection_editor/ui/collection_editor/RouterCollectionsStudioView.tsx +0 -41
- package/src/collection_editor/ui/collection_editor/SchemaChangeDialog.tsx +0 -470
- package/src/collection_editor/ui/collection_editor/SubcollectionsEditTab.tsx +0 -256
- package/src/collection_editor/ui/collection_editor/SwitchControl.tsx +0 -39
- package/src/collection_editor/ui/collection_editor/ViewModeSwitch.tsx +0 -68
- package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.tsx +0 -67
- package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.tsx +0 -296
- package/src/collection_editor/ui/collection_editor/import/clean_import_data.ts +0 -57
- package/src/collection_editor/ui/collection_editor/properties/BlockPropertyField.tsx +0 -147
- package/src/collection_editor/ui/collection_editor/properties/BooleanPropertyField.tsx +0 -41
- package/src/collection_editor/ui/collection_editor/properties/CommonPropertyFields.tsx +0 -113
- package/src/collection_editor/ui/collection_editor/properties/DateTimePropertyField.tsx +0 -250
- package/src/collection_editor/ui/collection_editor/properties/EnumPropertyField.tsx +0 -126
- package/src/collection_editor/ui/collection_editor/properties/KeyValuePropertyField.tsx +0 -20
- package/src/collection_editor/ui/collection_editor/properties/MapPropertyField.tsx +0 -153
- package/src/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.tsx +0 -217
- package/src/collection_editor/ui/collection_editor/properties/NumberPropertyField.tsx +0 -117
- package/src/collection_editor/ui/collection_editor/properties/ReferencePropertyField.tsx +0 -129
- package/src/collection_editor/ui/collection_editor/properties/RelationPropertyField.tsx +0 -335
- package/src/collection_editor/ui/collection_editor/properties/RepeatPropertyField.tsx +0 -107
- package/src/collection_editor/ui/collection_editor/properties/StoragePropertyField.tsx +0 -403
- package/src/collection_editor/ui/collection_editor/properties/StringPropertyField.tsx +0 -148
- package/src/collection_editor/ui/collection_editor/properties/UrlPropertyField.tsx +0 -91
- package/src/collection_editor/ui/collection_editor/properties/VectorPropertyField.tsx +0 -34
- package/src/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx +0 -49
- package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.tsx +0 -925
- package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsPanel.tsx +0 -28
- package/src/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.tsx +0 -626
- package/src/collection_editor/ui/collection_editor/properties/conditions/index.ts +0 -6
- package/src/collection_editor/ui/collection_editor/properties/conditions/property_paths.ts +0 -93
- package/src/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx +0 -52
- package/src/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx +0 -63
- package/src/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx +0 -114
- package/src/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.tsx +0 -154
- package/src/collection_editor/ui/collection_editor/properties/validation/ValidationPanel.tsx +0 -28
- package/src/collection_editor/ui/collection_editor/templates/blog_template.ts +0 -112
- package/src/collection_editor/ui/collection_editor/templates/pages_template.ts +0 -183
- package/src/collection_editor/ui/collection_editor/templates/products_template.ts +0 -88
- package/src/collection_editor/ui/collection_editor/templates/users_template.ts +0 -42
- package/src/collection_editor/ui/collection_editor/util.ts +0 -28
- package/src/collection_editor/ui/collection_editor/utils/strings.ts +0 -1
- package/src/collection_editor/ui/collection_editor/utils/supported_fields.tsx +0 -39
- package/src/collection_editor/ui/collection_editor/utils/update_property_for_widget.ts +0 -276
- package/src/collection_editor/useCollectionEditorController.tsx +0 -9
- package/src/collection_editor/useCollectionsConfigController.tsx +0 -9
- package/src/collection_editor/useJsonCollectionsConfigController.tsx +0 -297
- package/src/collection_editor/useLiveSchemaEditing.tsx +0 -315
- package/src/collection_editor/useLocalCollectionsConfigController.tsx +0 -341
- package/src/collection_editor/useSafeSnackbarController.ts +0 -9
- package/src/collection_editor/validateCollectionJson.ts +0 -440
- package/src/collection_editor_ui.ts +0 -21
- package/src/components/AdditionalFieldValue.tsx +0 -68
- package/src/components/AdminModeSyncer.tsx +0 -56
- package/src/components/ArrayContainer.tsx +0 -542
- package/src/components/ClearFilterSortButton.tsx +0 -56
- package/src/components/CollectionEditorDialogs.tsx +0 -69
- package/src/components/CollectionPanel.tsx +0 -179
- package/src/components/CollectionTableBinding/CollectionRowActions.tsx +0 -244
- package/src/components/CollectionTableBinding/CollectionTableBinding.tsx +0 -394
- package/src/components/CollectionTableBinding/CollectionTableBindingProps.tsx +0 -172
- package/src/components/CollectionTableBinding/PropertyTableCell.tsx +0 -350
- package/src/components/CollectionTableBinding/column_utils.tsx +0 -155
- package/src/components/CollectionTableBinding/fields/TableMultipleRelationField.tsx +0 -131
- package/src/components/CollectionTableBinding/fields/TableReferenceField.tsx +0 -193
- package/src/components/CollectionTableBinding/fields/TableRelationField.tsx +0 -192
- package/src/components/CollectionTableBinding/fields/TableRelationSelectorField.tsx +0 -42
- package/src/components/CollectionTableBinding/fields/TableStorageUpload.tsx +0 -324
- package/src/components/CollectionTableBinding/fields/VirtualTableSelect.tsx +0 -132
- package/src/components/CollectionTableBinding/fields/VirtualTableUserSelect.tsx +0 -41
- package/src/components/CollectionTableBinding/index.tsx +0 -14
- package/src/components/CollectionTableBinding/internal/CollectionTableToolbar.tsx +0 -96
- package/src/components/CollectionTableBinding/internal/EntityTableCell.tsx +0 -309
- package/src/components/CollectionTableBinding/internal/EntityTableCellActions.tsx +0 -80
- package/src/components/CollectionTableBinding/internal/common.tsx +0 -74
- package/src/components/CollectionTableBinding/internal/popup_field/PopupFormField.tsx +0 -422
- package/src/components/CollectionTableBinding/internal/popup_field/useDraggable.tsx +0 -99
- package/src/components/CollectionTableBinding/internal/popup_field/useWindowSize.tsx +0 -22
- package/src/components/CollectionTableBinding/table_bindings.tsx +0 -350
- package/src/components/CollectionViewBinding/BoardCardBinding.tsx +0 -263
- package/src/components/CollectionViewBinding/CollectionBoardViewBinding.tsx +0 -662
- package/src/components/CollectionViewBinding/CollectionCardViewBinding.tsx +0 -159
- package/src/components/CollectionViewBinding/CollectionListViewBinding.tsx +0 -1430
- package/src/components/CollectionViewBinding/CollectionViewActions.tsx +0 -227
- package/src/components/CollectionViewBinding/CollectionViewBinding.tsx +0 -1603
- package/src/components/CollectionViewBinding/CollectionViewStartActions.tsx +0 -240
- package/src/components/CollectionViewBinding/EntityCardBinding.tsx +0 -239
- package/src/components/CollectionViewBinding/FilterPresetsButton.tsx +0 -298
- package/src/components/CollectionViewBinding/FiltersDialog.tsx +0 -218
- package/src/components/CollectionViewBinding/SearchExplanation.tsx +0 -106
- package/src/components/CollectionViewBinding/SearchHighlight.tsx +0 -311
- package/src/components/CollectionViewBinding/SlotValue.tsx +0 -156
- package/src/components/CollectionViewBinding/SortButton.tsx +0 -354
- package/src/components/CollectionViewBinding/SplitListCloseButton.tsx +0 -49
- package/src/components/CollectionViewBinding/SplitListShowButton.tsx +0 -28
- package/src/components/CollectionViewBinding/SplitListView.tsx +0 -488
- package/src/components/CollectionViewBinding/SplitViewContext.tsx +0 -34
- package/src/components/CollectionViewBinding/ViewModeToggle.tsx +0 -250
- package/src/components/CollectionViewBinding/hooks/useCollectionInlineEditor.ts +0 -81
- package/src/components/CollectionViewBinding/hooks/useKanbanDragAndDrop.ts +0 -181
- package/src/components/CollectionViewBinding/useBoardDataController.tsx +0 -802
- package/src/components/CollectionViewBinding/usePreviewSlots.ts +0 -703
- package/src/components/CollectionViewBinding/useSelectionController.tsx +0 -40
- package/src/components/CollectionViewBinding/utils.ts +0 -22
- package/src/components/DefaultAppBar.tsx +0 -264
- package/src/components/DefaultDrawer.tsx +0 -593
- package/src/components/DeleteEntityDialog.tsx +0 -205
- package/src/components/DetailViewBinding.tsx +0 -731
- package/src/components/DrawerNavigationGroup.tsx +0 -141
- package/src/components/DrawerNavigationItem.tsx +0 -115
- package/src/components/EditFormActions.tsx +0 -303
- package/src/components/EditViewBinding.tsx +0 -1069
- package/src/components/EntityDisplayHeader.tsx +0 -170
- package/src/components/EntityIdentityBar.tsx +0 -428
- package/src/components/EntityInspector.tsx +0 -156
- package/src/components/EntityPreviewBinding.tsx +0 -432
- package/src/components/EntityPreviewNesting.tsx +0 -50
- package/src/components/EntityViewBinding.tsx +0 -374
- package/src/components/FieldCaption.tsx +0 -14
- package/src/components/HomePage/ContentHomePage.tsx +0 -586
- package/src/components/HomePage/FavouritesView.tsx +0 -60
- package/src/components/HomePage/HomePageDnD.tsx +0 -704
- package/src/components/HomePage/NavigationCard.tsx +0 -81
- package/src/components/HomePage/NavigationCardBinding.tsx +0 -107
- package/src/components/HomePage/NavigationGroup.tsx +0 -156
- package/src/components/HomePage/RenameGroupDialog.tsx +0 -123
- package/src/components/HomePage/SmallNavigationCard.tsx +0 -41
- package/src/components/HomePage/index.tsx +0 -5
- package/src/components/InlineEntityPreview.tsx +0 -149
- package/src/components/JsonPreviewBinding.tsx +0 -66
- package/src/components/PropertyCollectionView.tsx +0 -336
- package/src/components/PropertyConfigBadge.tsx +0 -28
- package/src/components/PropertyIdCopyTooltip.tsx +0 -47
- package/src/components/RebaseAuthGate.tsx +0 -44
- package/src/components/RebaseCMS.tsx +0 -30
- package/src/components/RebaseLayout.tsx +0 -80
- package/src/components/RebaseNavigation.tsx +0 -369
- package/src/components/RebaseRouteDefs.tsx +0 -127
- package/src/components/RebaseShell.tsx +0 -83
- package/src/components/ReferenceTable/SelectionTableBinding.tsx +0 -389
- package/src/components/ReferenceWidget.tsx +0 -156
- package/src/components/RelationSelector.tsx +0 -926
- package/src/components/SearchIconsView.tsx +0 -78
- package/src/components/SelectableTable/SelectableTable.tsx +0 -309
- package/src/components/SelectableTable/SelectableTableContext.tsx +0 -7
- package/src/components/SelectableTable/SelectionStore.ts +0 -43
- package/src/components/SelectableTable/filters/BooleanFilterField.tsx +0 -59
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +0 -146
- package/src/components/SelectableTable/filters/FilterFieldBinding.tsx +0 -190
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +0 -250
- package/src/components/SelectableTable/filters/RelationFilterField.tsx +0 -238
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +0 -282
- package/src/components/SelectableTable/filters/null_filter.ts +0 -63
- package/src/components/SideDialogs.tsx +0 -238
- package/src/components/SidePanelBinding.tsx +0 -361
- package/src/components/SidePanelProvider.tsx +0 -80
- package/src/components/UserSelector.tsx +0 -513
- package/src/components/admin/CreationResultDialog.tsx +0 -138
- package/src/components/admin/index.ts +0 -1
- package/src/components/app/AppBar.tsx +0 -17
- package/src/components/app/Drawer.tsx +0 -38
- package/src/components/app/Scaffold.tsx +0 -366
- package/src/components/app/index.ts +0 -4
- package/src/components/app/useApp.tsx +0 -36
- package/src/components/common/default_entity_actions.tsx +0 -440
- package/src/components/common/index.ts +0 -1
- package/src/components/field_configs.tsx +0 -506
- package/src/components/history/EntityHistoryEntry.tsx +0 -203
- package/src/components/history/EntityHistoryView.tsx +0 -206
- package/src/components/history/LastEditedByFormAction.tsx +0 -24
- package/src/components/history/LastEditedByIndicator.tsx +0 -95
- package/src/components/history/UserChip.tsx +0 -15
- package/src/components/history/index.tsx +0 -5
- package/src/components/index.ts +0 -63
- package/src/contexts/BreacrumbsContext.tsx +0 -45
- package/src/contexts/SideDialogsControllerContext.tsx +0 -5
- package/src/contexts/SidePanelControllerContext.tsx +0 -5
- package/src/data_export/export/BasicExportAction.tsx +0 -142
- package/src/data_export/export/ExportCollectionAction.tsx +0 -321
- package/src/data_export/export/export.ts +0 -295
- package/src/data_export/export/fetch_export_data.ts +0 -90
- package/src/data_export/export/index.ts +0 -4
- package/src/data_export/index.ts +0 -1
- package/src/data_import/components/DataNewPropertiesMapping.tsx +0 -261
- package/src/data_import/components/ImportFileUpload.tsx +0 -42
- package/src/data_import/components/ImportNewPropertyFieldPreview.tsx +0 -58
- package/src/data_import/components/ImportSaveInProgress.tsx +0 -121
- package/src/data_import/components/index.ts +0 -4
- package/src/data_import/hooks/index.ts +0 -1
- package/src/data_import/hooks/useImportConfig.tsx +0 -34
- package/src/data_import/import/ImportCollectionAction.tsx +0 -461
- package/src/data_import/import/index.ts +0 -1
- package/src/data_import/index.ts +0 -5
- package/src/data_import/types/column_mapping.ts +0 -32
- package/src/data_import/types/index.ts +0 -1
- package/src/data_import/utils/csv.ts +0 -153
- package/src/data_import/utils/data.ts +0 -181
- package/src/data_import/utils/file_headers.ts +0 -14
- package/src/data_import/utils/file_to_json.ts +0 -149
- package/src/data_import/utils/get_import_inference_type.ts +0 -33
- package/src/data_import/utils/get_properties_mapping.ts +0 -67
- package/src/data_import/utils/index.ts +0 -5
- package/src/data_import/utils/save_entities.ts +0 -138
- package/src/data_import/utils/transforms.ts +0 -70
- package/src/editor/components/SlashCommandMenu.tsx +0 -532
- package/src/editor/components/editor-bubble-item.tsx +0 -32
- package/src/editor/components/editor-bubble.tsx +0 -143
- package/src/editor/components/image-bubble.tsx +0 -183
- package/src/editor/components/index.ts +0 -14
- package/src/editor/components/table-bubble.tsx +0 -233
- package/src/editor/editor.tsx +0 -529
- package/src/editor/extensions/HighlightDecorationExtension.ts +0 -115
- package/src/editor/extensions/Image.ts +0 -159
- package/src/editor/extensions/TextLoadingDecorationExtension.tsx +0 -107
- package/src/editor/extensions/clipboard.ts +0 -72
- package/src/editor/extensions/custom-keymap.ts +0 -25
- package/src/editor/extensions/drag-and-drop.tsx +0 -508
- package/src/editor/hooks/useProseMirror.ts +0 -126
- package/src/editor/hooks/useProseMirrorContext.ts +0 -15
- package/src/editor/index.ts +0 -2
- package/src/editor/markdown-it-plugins.d.ts +0 -24
- package/src/editor/markdown.ts +0 -204
- package/src/editor/nodeViews/ImageComponent.tsx +0 -20
- package/src/editor/nodeViews/ReactNodeView.tsx +0 -89
- package/src/editor/nodeViews/TaskItemComponent.tsx +0 -30
- package/src/editor/nodeViews/index.ts +0 -35
- package/src/editor/plugins/index.ts +0 -58
- package/src/editor/plugins/inputrules.ts +0 -82
- package/src/editor/plugins/placeholderPlugin.ts +0 -55
- package/src/editor/plugins/slashCommandPlugin.ts +0 -65
- package/src/editor/schema.ts +0 -339
- package/src/editor/selectors/ai-selector.tsx +0 -110
- package/src/editor/selectors/color-selector.tsx +0 -199
- package/src/editor/selectors/link-selector.tsx +0 -122
- package/src/editor/selectors/node-selector.tsx +0 -159
- package/src/editor/selectors/text-buttons.tsx +0 -79
- package/src/editor/types.ts +0 -6
- package/src/editor/useProseMirror.ts +0 -125
- package/src/editor/utils/prosemirror-utils.ts +0 -113
- package/src/editor/utils/remove_classes.ts +0 -18
- package/src/editor/utils/useDebouncedCallback.ts +0 -25
- package/src/form/EntityForm.tsx +0 -761
- package/src/form/EntityFormActions.tsx +0 -160
- package/src/form/EntityFormBinding.tsx +0 -342
- package/src/form/PropertyFieldBinding.tsx +0 -348
- package/src/form/components/ErrorFocus.tsx +0 -44
- package/src/form/components/FieldBlock.tsx +0 -189
- package/src/form/components/FieldHelperText.tsx +0 -84
- package/src/form/components/FormRail.tsx +0 -153
- package/src/form/components/FormSections.tsx +0 -145
- package/src/form/components/LabelWithIcon.tsx +0 -43
- package/src/form/components/LabelWithIconAndTooltip.tsx +0 -28
- package/src/form/components/LocalChangesMenu.tsx +0 -147
- package/src/form/components/StorageItemPreview.tsx +0 -81
- package/src/form/components/StorageUploadProgress.tsx +0 -118
- package/src/form/components/index.tsx +0 -6
- package/src/form/components/useRailVisible.tsx +0 -47
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +0 -109
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +0 -172
- package/src/form/field_bindings/BinaryFieldBinding.tsx +0 -177
- package/src/form/field_bindings/BlockFieldBinding.tsx +0 -282
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +0 -78
- package/src/form/field_bindings/GeopointFieldBinding.tsx +0 -200
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +0 -574
- package/src/form/field_bindings/MapFieldBinding.tsx +0 -120
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +0 -259
- package/src/form/field_bindings/MultiSelectFieldBinding.tsx +0 -130
- package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +0 -168
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +0 -94
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +0 -146
- package/src/form/field_bindings/RelationFieldBinding.tsx +0 -202
- package/src/form/field_bindings/RepeatFieldBinding.tsx +0 -143
- package/src/form/field_bindings/SelectFieldBinding.tsx +0 -111
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +0 -521
- package/src/form/field_bindings/SwitchFieldBinding.tsx +0 -70
- package/src/form/field_bindings/TextFieldBinding.tsx +0 -189
- package/src/form/field_bindings/UserSelectFieldBinding.tsx +0 -71
- package/src/form/field_bindings/VectorFieldBinding.tsx +0 -209
- package/src/form/form_utils.ts +0 -243
- package/src/form/index.tsx +0 -36
- package/src/form/useClearRestoreValue.tsx +0 -36
- package/src/form/useUndoableDiscard.ts +0 -39
- package/src/form/validation.ts +0 -583
- package/src/hooks/index.ts +0 -16
- package/src/hooks/navigation/contexts/CollectionRegistryContext.tsx +0 -22
- package/src/hooks/navigation/contexts/NavigationStateContext.tsx +0 -16
- package/src/hooks/navigation/contexts/UrlContext.tsx +0 -24
- package/src/hooks/navigation/contexts/index.ts +0 -14
- package/src/hooks/navigation/useAsyncResolver.ts +0 -100
- package/src/hooks/navigation/useBuildCollectionRegistryController.tsx +0 -218
- package/src/hooks/navigation/useBuildNavigationStateController.tsx +0 -134
- package/src/hooks/navigation/useBuildUrlController.tsx +0 -66
- package/src/hooks/navigation/useNavigationResolution.ts +0 -271
- package/src/hooks/navigation/useResolvedCollections.ts +0 -102
- package/src/hooks/navigation/useResolvedViews.tsx +0 -139
- package/src/hooks/navigation/useTopLevelNavigation.ts +0 -273
- package/src/hooks/navigation/utils.ts +0 -200
- package/src/hooks/useAdminContext.tsx +0 -83
- package/src/hooks/useBreadcrumbsController.tsx +0 -17
- package/src/hooks/useBuildSideDialogsController.tsx +0 -145
- package/src/hooks/useBuildSidePanel.tsx +0 -315
- package/src/hooks/useChildViewSource.ts +0 -46
- package/src/hooks/useEntityDisplay.tsx +0 -262
- package/src/hooks/useEntityDisplayTitle.tsx +0 -49
- package/src/hooks/useHistory.ts +0 -178
- package/src/hooks/useRecordActions.tsx +0 -69
- package/src/hooks/useResolvedNavigationFrom.tsx +0 -167
- package/src/hooks/useResolvedUsers.ts +0 -148
- package/src/hooks/useSelectionDialog.tsx +0 -58
- package/src/hooks/useSideDialogsController.tsx +0 -25
- package/src/hooks/useSidePanel.tsx +0 -13
- package/src/index.ts +0 -124
- package/src/preview/PropertyPreview.tsx +0 -331
- package/src/preview/compact_text.ts +0 -68
- package/src/preview/components/ArrayEnumPreview.tsx +0 -39
- package/src/preview/components/BooleanPreview.tsx +0 -28
- package/src/preview/components/DatePreview.tsx +0 -106
- package/src/preview/components/EmptyValue.tsx +0 -10
- package/src/preview/components/EnumValuesChip.tsx +0 -39
- package/src/preview/components/ImagePreview.tsx +0 -144
- package/src/preview/components/InlineEntityListPreview.tsx +0 -42
- package/src/preview/components/ReferencePreview.tsx +0 -235
- package/src/preview/components/RelationPreview.tsx +0 -271
- package/src/preview/components/StorageThumbnail.tsx +0 -147
- package/src/preview/components/UrlComponentPreview.tsx +0 -116
- package/src/preview/components/UserPreview.tsx +0 -30
- package/src/preview/components/date_fns_locales.ts +0 -125
- package/src/preview/index.ts +0 -26
- package/src/preview/property_previews/ArrayOfMapsPreview.tsx +0 -73
- package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +0 -67
- package/src/preview/property_previews/ArrayOfRelationsPreview.tsx +0 -77
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +0 -49
- package/src/preview/property_previews/ArrayOfStringsPreview.tsx +0 -70
- package/src/preview/property_previews/ArrayOneOfPreview.tsx +0 -79
- package/src/preview/property_previews/ArrayPropertyEnumPreview.tsx +0 -35
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +0 -79
- package/src/preview/property_previews/MapPropertyPreview.tsx +0 -198
- package/src/preview/property_previews/NumberPropertyPreview.tsx +0 -39
- package/src/preview/property_previews/SkeletonPropertyComponent.tsx +0 -276
- package/src/preview/property_previews/StringPropertyPreview.tsx +0 -70
- package/src/preview/util.ts +0 -39
- package/src/routes/CustomViewRoute.tsx +0 -33
- package/src/routes/RebaseRoute.tsx +0 -467
- package/src/routes/index.ts +0 -2
- package/src/types/components/EntityFormActionsProps.tsx +0 -20
- package/src/types/components/EntityFormProps.tsx +0 -119
- package/src/types/components/PropertyPreviewProps.tsx +0 -85
- package/src/types/components/formex.tsx +0 -2
- package/src/types/components/index.ts +0 -3
- package/src/types/fields.tsx +0 -340
- package/src/types/index.ts +0 -4
- package/src/util/dataControllerAdapter.ts +0 -88
- package/src/util/entity_actions.ts +0 -28
- package/src/util/index.ts +0 -5
- package/src/util/navigation_utils.ts +0 -89
- package/src/util/number_format.ts +0 -46
- package/src/util/previews.ts +0 -131
- package/src/util/propertyConfigMapper.ts +0 -134
- package/src/util/property_utils.tsx +0 -236
- package/src/util/resolutions.ts +0 -96
- package/src/util/view_constants.ts +0 -33
- package/src/util/view_mode.ts +0 -176
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
import React, { Suspense } from "react";
|
|
2
|
-
import {
|
|
3
|
-
ArrayProperty,
|
|
4
|
-
Property,
|
|
5
|
-
ReferenceProperty,
|
|
6
|
-
RelationProperty,
|
|
7
|
-
WhereFilterOp
|
|
8
|
-
} from "@rebasepro/types";
|
|
9
|
-
import {
|
|
10
|
-
FilterFieldBindingProps
|
|
11
|
-
} from "@rebasepro/cms-types";
|
|
12
|
-
import { enumToObjectEntries } from "@rebasepro/common";
|
|
13
|
-
import { resolveFilterOperators } from "@rebasepro/app";
|
|
14
|
-
import { useCollectionScope, useComponentOverride, useResolvedComponent } from "@rebasepro/app";
|
|
15
|
-
import { StringNumberFilterField } from "./StringNumberFilterField";
|
|
16
|
-
import { BooleanFilterField } from "./BooleanFilterField";
|
|
17
|
-
import { DateTimeFilterField } from "./DateTimeFilterField";
|
|
18
|
-
import { ReferenceFilterField } from "./ReferenceFilterField";
|
|
19
|
-
import { RelationFilterField } from "./RelationFilterField";
|
|
20
|
-
|
|
21
|
-
export interface FilterFieldBindingInput {
|
|
22
|
-
/** Key of the property being filtered (the column id). */
|
|
23
|
-
propertyKey: string;
|
|
24
|
-
/** The raw property — array properties are unwrapped internally. */
|
|
25
|
-
property: Property;
|
|
26
|
-
/**
|
|
27
|
-
* Engine backing the collection (`collection.engine`). Drives which
|
|
28
|
-
* operators the engine can execute. Usually omitted — it is read from
|
|
29
|
-
* the surrounding {@link CollectionScopeProvider}; pass it explicitly
|
|
30
|
-
* only when rendering outside any collection scope.
|
|
31
|
-
*/
|
|
32
|
-
engine?: string;
|
|
33
|
-
value?: [WhereFilterOp, unknown];
|
|
34
|
-
setValue: (value?: [WhereFilterOp, unknown]) => void;
|
|
35
|
-
/** Coordination flags for fields that open their own dialogs. */
|
|
36
|
-
hidden?: boolean;
|
|
37
|
-
setHidden?: (hidden: boolean) => void;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* The single entry point for rendering a collection filter field.
|
|
42
|
-
* Used by both the table header filters ({@link SelectableTable}) and the
|
|
43
|
-
* Filters dialog.
|
|
44
|
-
*
|
|
45
|
-
* Resolution order:
|
|
46
|
-
* 1. `property.admin.Filter` — per-property replacement (rendered even when the
|
|
47
|
-
* resolved operator list is empty; the component owns filterability).
|
|
48
|
-
* 2. `components["Collection.FilterField"]` — collection-level or app-level
|
|
49
|
-
* override (wrap mode supported via `OriginalComponent`).
|
|
50
|
-
* 3. Built-in field dispatched by property type.
|
|
51
|
-
*
|
|
52
|
-
* The operators handed to the field are the intersection of the engine's
|
|
53
|
-
* capabilities, the property-type defaults, and `property.admin.filterOperators`
|
|
54
|
-
* (see `resolveFilterOperators`). When that intersection is empty and no
|
|
55
|
-
* per-property `Filter` is set, nothing is rendered.
|
|
56
|
-
*
|
|
57
|
-
* @group Components
|
|
58
|
-
*/
|
|
59
|
-
export function FilterFieldBinding({
|
|
60
|
-
propertyKey,
|
|
61
|
-
property,
|
|
62
|
-
engine,
|
|
63
|
-
value,
|
|
64
|
-
setValue,
|
|
65
|
-
hidden,
|
|
66
|
-
setHidden
|
|
67
|
-
}: FilterFieldBindingInput): React.ReactNode {
|
|
68
|
-
|
|
69
|
-
const isArray = property.type === "array";
|
|
70
|
-
const ofVal = isArray ? (property as ArrayProperty).of : undefined;
|
|
71
|
-
const baseProperty: Property | undefined = isArray
|
|
72
|
-
? (Array.isArray(ofVal) ? ofVal[0] : ofVal) as Property | undefined
|
|
73
|
-
: property;
|
|
74
|
-
|
|
75
|
-
// Hooks must run unconditionally — before any early return.
|
|
76
|
-
const scopeCollection = useCollectionScope();
|
|
77
|
-
const ResolvedFilterField = useComponentOverride<FilterFieldBindingProps>("Collection.FilterField", DefaultFilterField);
|
|
78
|
-
const PropertyFilter = useResolvedComponent<FilterFieldBindingProps>(baseProperty?.admin?.Filter);
|
|
79
|
-
|
|
80
|
-
if (!baseProperty) return null;
|
|
81
|
-
|
|
82
|
-
const operators = resolveFilterOperators({
|
|
83
|
-
property: baseProperty,
|
|
84
|
-
isArray,
|
|
85
|
-
engine: engine ?? scopeCollection?.engine
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
const bindingProps: FilterFieldBindingProps = {
|
|
89
|
-
propertyKey,
|
|
90
|
-
property: baseProperty,
|
|
91
|
-
isArray,
|
|
92
|
-
operators,
|
|
93
|
-
value,
|
|
94
|
-
setValue,
|
|
95
|
-
title: property.name,
|
|
96
|
-
hidden,
|
|
97
|
-
setHidden
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
// 1. Per-property replacement — always rendered, the dev owns filterability.
|
|
101
|
-
if (PropertyFilter) {
|
|
102
|
-
return (
|
|
103
|
-
<Suspense fallback={null}>
|
|
104
|
-
<PropertyFilter {...bindingProps}/>
|
|
105
|
-
</Suspense>
|
|
106
|
-
);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// 2/3. Override or built-in — only when the property is filterable here.
|
|
110
|
-
if (operators.length === 0) return null;
|
|
111
|
-
|
|
112
|
-
return <ResolvedFilterField {...bindingProps}/>;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Built-in filter field dispatch by property type. This is the
|
|
117
|
-
* `OriginalComponent` received by `"Collection.FilterField"` overrides in
|
|
118
|
-
* wrap mode.
|
|
119
|
-
*/
|
|
120
|
-
function DefaultFilterField({
|
|
121
|
-
propertyKey,
|
|
122
|
-
property,
|
|
123
|
-
isArray,
|
|
124
|
-
operators,
|
|
125
|
-
value,
|
|
126
|
-
setValue,
|
|
127
|
-
title,
|
|
128
|
-
hidden,
|
|
129
|
-
setHidden
|
|
130
|
-
}: FilterFieldBindingProps): React.ReactNode {
|
|
131
|
-
|
|
132
|
-
if (property.type === "reference") {
|
|
133
|
-
const referenceProperty = property as ReferenceProperty;
|
|
134
|
-
return <ReferenceFilterField value={value}
|
|
135
|
-
setValue={setValue}
|
|
136
|
-
name={propertyKey}
|
|
137
|
-
isArray={isArray}
|
|
138
|
-
operators={operators}
|
|
139
|
-
path={referenceProperty.path}
|
|
140
|
-
title={title}
|
|
141
|
-
includeId={referenceProperty.admin?.includeId}
|
|
142
|
-
previewProperties={referenceProperty.admin?.previewProperties}
|
|
143
|
-
hidden={hidden ?? false}
|
|
144
|
-
setHidden={setHidden ?? (() => undefined)}/>;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
if (property.type === "relation") {
|
|
148
|
-
const relation = (property as RelationProperty).relation;
|
|
149
|
-
if (!relation) return null;
|
|
150
|
-
return <RelationFilterField value={value as never}
|
|
151
|
-
setValue={setValue}
|
|
152
|
-
name={propertyKey}
|
|
153
|
-
operators={operators}
|
|
154
|
-
relation={relation}
|
|
155
|
-
hidden={hidden ?? false}
|
|
156
|
-
setHidden={setHidden ?? (() => undefined)}/>;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
if (property.type === "number" || property.type === "string") {
|
|
160
|
-
const enumValues = property.enum ? enumToObjectEntries(property.enum) : undefined;
|
|
161
|
-
return <StringNumberFilterField value={value}
|
|
162
|
-
setValue={setValue}
|
|
163
|
-
name={propertyKey}
|
|
164
|
-
type={property.type}
|
|
165
|
-
isArray={isArray}
|
|
166
|
-
operators={operators}
|
|
167
|
-
enumValues={enumValues}
|
|
168
|
-
title={title}/>;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
if (property.type === "boolean") {
|
|
172
|
-
return <BooleanFilterField value={value}
|
|
173
|
-
setValue={setValue}
|
|
174
|
-
name={propertyKey}
|
|
175
|
-
operators={operators}
|
|
176
|
-
title={title}/>;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
if (property.type === "date") {
|
|
180
|
-
return <DateTimeFilterField value={value}
|
|
181
|
-
setValue={setValue}
|
|
182
|
-
name={propertyKey}
|
|
183
|
-
mode={property.mode}
|
|
184
|
-
isArray={isArray}
|
|
185
|
-
operators={operators}
|
|
186
|
-
title={title}/>;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
return null;
|
|
190
|
-
}
|
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
import { useSelectionDialog } from "../../../hooks/useSelectionDialog";
|
|
2
|
-
|
|
3
|
-
import React, { useId, useMemo, useState } from "react";
|
|
4
|
-
import { VirtualTableWhereFilterOp } from "@rebasepro/ui";
|
|
5
|
-
import { Entity, EntityReference } from "@rebasepro/types";
|
|
6
|
-
import { ReferencePreview } from "../../../preview";
|
|
7
|
-
import { Button, Checkbox, Label, Select, SelectItem } from "@rebasepro/ui";
|
|
8
|
-
import { getReferenceFrom } from "@rebasepro/common";
|
|
9
|
-
import { useTranslation } from "@rebasepro/app";
|
|
10
|
-
import { useCollectionRegistryController } from "../../../hooks/navigation/contexts/CollectionRegistryContext";
|
|
11
|
-
import type { AdminCollection } from "@rebasepro/cms-types";
|
|
12
|
-
import { isNullFilterOperator, nullFilterOperatorFor, valueOperatorFor } from "./null_filter";
|
|
13
|
-
|
|
14
|
-
interface ReferenceFilterFieldProps {
|
|
15
|
-
name: string,
|
|
16
|
-
value?: [op: VirtualTableWhereFilterOp, fieldValue: unknown];
|
|
17
|
-
setValue: (filterValue?: [VirtualTableWhereFilterOp, unknown]) => void;
|
|
18
|
-
isArray?: boolean;
|
|
19
|
-
path?: string;
|
|
20
|
-
title?: string;
|
|
21
|
-
includeId?: boolean;
|
|
22
|
-
previewProperties?: string[];
|
|
23
|
-
hidden: boolean;
|
|
24
|
-
setHidden: (hidden: boolean) => void;
|
|
25
|
-
/**
|
|
26
|
-
* Restrict the offered operators (already resolved against engine
|
|
27
|
-
* capabilities and property config). When omitted, all operators this
|
|
28
|
-
* field can render are offered.
|
|
29
|
-
*/
|
|
30
|
-
operators?: readonly VirtualTableWhereFilterOp[];
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const operationLabels = {
|
|
34
|
-
"==": "==",
|
|
35
|
-
"!=": "!=",
|
|
36
|
-
">": ">",
|
|
37
|
-
"<": "<",
|
|
38
|
-
">=": ">=",
|
|
39
|
-
"<=": "<=",
|
|
40
|
-
in: "In",
|
|
41
|
-
"not-in": "Not in",
|
|
42
|
-
"array-contains": "Contains",
|
|
43
|
-
"array-contains-any": "Contains Any",
|
|
44
|
-
"is-null": "Is null",
|
|
45
|
-
"is-not-null": "Is not null"
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
const multipleSelectOperations = ["array-contains-any", "in", "not-in"];
|
|
49
|
-
|
|
50
|
-
export function ReferenceFilterField({
|
|
51
|
-
value,
|
|
52
|
-
setValue,
|
|
53
|
-
isArray,
|
|
54
|
-
path,
|
|
55
|
-
includeId = true,
|
|
56
|
-
previewProperties,
|
|
57
|
-
setHidden,
|
|
58
|
-
operators
|
|
59
|
-
}: ReferenceFilterFieldProps) {
|
|
60
|
-
const { t } = useTranslation();
|
|
61
|
-
|
|
62
|
-
let possibleOperations: (keyof typeof operationLabels)[] = isArray
|
|
63
|
-
? ["array-contains"]
|
|
64
|
-
: ["==", "!=", ">", "<", ">=", "<="];
|
|
65
|
-
|
|
66
|
-
if (isArray) {
|
|
67
|
-
possibleOperations.push("array-contains-any");
|
|
68
|
-
} else {
|
|
69
|
-
possibleOperations.push("in", "not-in");
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// The null checks take no operand, so they apply either way.
|
|
73
|
-
possibleOperations.push("is-null", "is-not-null");
|
|
74
|
-
|
|
75
|
-
if (operators) {
|
|
76
|
-
possibleOperations = possibleOperations.filter(op => (operators as readonly string[]).includes(op));
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];
|
|
80
|
-
const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(fieldOperation);
|
|
81
|
-
const [internalValue, setInternalValue] = useState<EntityReference | EntityReference[] | undefined | null>(fieldValue as EntityReference | EntityReference[] | undefined | null);
|
|
82
|
-
|
|
83
|
-
const selectedEntityIds = internalValue
|
|
84
|
-
? (Array.isArray(internalValue) ? internalValue.map((ref) => {
|
|
85
|
-
if (!(ref?.isEntityReference && ref?.isEntityReference())) {
|
|
86
|
-
return null;
|
|
87
|
-
}
|
|
88
|
-
return ref.id;
|
|
89
|
-
}).filter(Boolean) as string[] : [internalValue.id])
|
|
90
|
-
: [];
|
|
91
|
-
|
|
92
|
-
function updateFilter(op: VirtualTableWhereFilterOp, val?: EntityReference | EntityReference[] | null) {
|
|
93
|
-
|
|
94
|
-
const prevOpIsArray = multipleSelectOperations.includes(operation);
|
|
95
|
-
const newOpIsArray = multipleSelectOperations.includes(op);
|
|
96
|
-
let newValue = val;
|
|
97
|
-
if (prevOpIsArray !== newOpIsArray) {
|
|
98
|
-
newValue = newOpIsArray
|
|
99
|
-
? (newValue && !Array.isArray(newValue) && newValue.isEntityReference?.() ? [newValue] : [])
|
|
100
|
-
: undefined;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
setOperation(op);
|
|
104
|
-
setInternalValue(newValue);
|
|
105
|
-
|
|
106
|
-
// A null check takes no operand, so it is complete on its own — the
|
|
107
|
-
// value gate below would otherwise clear the filter the moment one is
|
|
108
|
-
// chosen from the dropdown, where there is no value to accompany it.
|
|
109
|
-
if (isNullFilterOperator(op)) {
|
|
110
|
-
setValue([op, null]);
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
const hasNewValue = newValue !== null && Array.isArray(newValue)
|
|
115
|
-
? newValue.length > 0
|
|
116
|
-
: newValue !== undefined;
|
|
117
|
-
if (op && hasNewValue) {
|
|
118
|
-
setValue(
|
|
119
|
-
[op, newValue]
|
|
120
|
-
);
|
|
121
|
-
} else {
|
|
122
|
-
setValue(
|
|
123
|
-
undefined
|
|
124
|
-
);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
const collectionRegistryController = useCollectionRegistryController();
|
|
129
|
-
const collection: AdminCollection | undefined = useMemo(() => {
|
|
130
|
-
return path ? collectionRegistryController.getCollection(path) : undefined;
|
|
131
|
-
}, [path]);
|
|
132
|
-
|
|
133
|
-
const onSingleEntitySelected = (entity: Entity<Record<string, unknown>>) => {
|
|
134
|
-
updateFilter(operation, getReferenceFrom(entity));
|
|
135
|
-
};
|
|
136
|
-
|
|
137
|
-
const onMultipleEntitiesSelected = (entities: Entity<Record<string, unknown>>[]) => {
|
|
138
|
-
updateFilter(operation, entities.map(e => getReferenceFrom(e)));
|
|
139
|
-
};
|
|
140
|
-
|
|
141
|
-
const multiple = multipleSelectOperations.includes(operation);
|
|
142
|
-
const nullFiltered = isNullFilterOperator(operation);
|
|
143
|
-
|
|
144
|
-
// The filters dialog renders every filterable property at once, and this
|
|
145
|
-
// id was the literal string "null-filter" — so clicking any label toggled
|
|
146
|
-
// whichever checkbox the document matched first, never the one clicked.
|
|
147
|
-
const nullFilterId = useId();
|
|
148
|
-
|
|
149
|
-
const referenceDialogController = useSelectionDialog({
|
|
150
|
-
multiselect: multiple,
|
|
151
|
-
path,
|
|
152
|
-
collection,
|
|
153
|
-
onSingleEntitySelected,
|
|
154
|
-
onMultipleEntitiesSelected,
|
|
155
|
-
selectedEntityIds,
|
|
156
|
-
onClose: () => {
|
|
157
|
-
setHidden(false);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
);
|
|
161
|
-
|
|
162
|
-
const doOpenDialog = () => {
|
|
163
|
-
setHidden(true);
|
|
164
|
-
referenceDialogController.open();
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
const buildEntry = (reference: EntityReference) => {
|
|
168
|
-
return (
|
|
169
|
-
<ReferencePreview
|
|
170
|
-
disabled={!path}
|
|
171
|
-
previewProperties={previewProperties}
|
|
172
|
-
size={"medium"}
|
|
173
|
-
onClick={doOpenDialog}
|
|
174
|
-
reference={reference}
|
|
175
|
-
hover={true}
|
|
176
|
-
includeId={includeId}
|
|
177
|
-
includeEntityLink={false}
|
|
178
|
-
/>
|
|
179
|
-
);
|
|
180
|
-
};
|
|
181
|
-
|
|
182
|
-
// All renderable operators were filtered out (engine/property narrowing).
|
|
183
|
-
if (possibleOperations.length === 0) return null;
|
|
184
|
-
|
|
185
|
-
return (
|
|
186
|
-
|
|
187
|
-
<div className="flex w-full flex-row">
|
|
188
|
-
<div className="w-[100px]">
|
|
189
|
-
<Select value={operation}
|
|
190
|
-
size={"medium"}
|
|
191
|
-
fullWidth={true}
|
|
192
|
-
onValueChange={(value) => {
|
|
193
|
-
updateFilter(value as VirtualTableWhereFilterOp, internalValue);
|
|
194
|
-
}}
|
|
195
|
-
renderValue={(op) => operationLabels[op as keyof typeof operationLabels]}>
|
|
196
|
-
{possibleOperations.map((op) => (
|
|
197
|
-
<SelectItem key={op} value={op}>
|
|
198
|
-
{operationLabels[op]}
|
|
199
|
-
</SelectItem>
|
|
200
|
-
))}
|
|
201
|
-
</Select>
|
|
202
|
-
</div>
|
|
203
|
-
|
|
204
|
-
<div className="grow ml-2 h-full gap-2 flex flex-col">
|
|
205
|
-
|
|
206
|
-
{internalValue && Array.isArray(internalValue) && <div>
|
|
207
|
-
{internalValue.map((ref, index) => buildEntry(ref))}
|
|
208
|
-
</div>}
|
|
209
|
-
|
|
210
|
-
{internalValue && !Array.isArray(internalValue) && <div>
|
|
211
|
-
{buildEntry(internalValue)}
|
|
212
|
-
</div>}
|
|
213
|
-
|
|
214
|
-
{(!internalValue || (Array.isArray(internalValue) && internalValue.length === 0)) &&
|
|
215
|
-
<Button onClick={doOpenDialog}
|
|
216
|
-
|
|
217
|
-
size={"medium"}
|
|
218
|
-
className="h-full w-full">
|
|
219
|
-
{multiple ? t("select_references") : t("select_reference")}
|
|
220
|
-
</Button>
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
{/*
|
|
224
|
-
* Switches the operator to the matching null check rather
|
|
225
|
-
* than pairing a null value with whatever operator is
|
|
226
|
-
* selected. Only the operator travels to the driver, and a
|
|
227
|
-
* null *operand* means different things to different ones —
|
|
228
|
-
* Mongo rejects `$in: null` outright. See
|
|
229
|
-
* `nullFilterOperatorFor`.
|
|
230
|
-
*/}
|
|
231
|
-
{!isArray && <Label
|
|
232
|
-
className="border cursor-pointer rounded-md p-2 flex items-center gap-2 bg-surface-50 dark:bg-surface-900 hover:bg-surface-100 dark:hover:bg-surface-800"
|
|
233
|
-
htmlFor={nullFilterId}
|
|
234
|
-
>
|
|
235
|
-
<Checkbox id={nullFilterId}
|
|
236
|
-
checked={nullFiltered}
|
|
237
|
-
size={"small"}
|
|
238
|
-
onCheckedChange={() => {
|
|
239
|
-
if (!nullFiltered) updateFilter(nullFilterOperatorFor(operation), null);
|
|
240
|
-
else updateFilter(valueOperatorFor(operation, possibleOperations) ?? operation, undefined);
|
|
241
|
-
}}/>
|
|
242
|
-
{t("filter_for_null_values")}
|
|
243
|
-
</Label>}
|
|
244
|
-
|
|
245
|
-
</div>
|
|
246
|
-
|
|
247
|
-
</div>
|
|
248
|
-
);
|
|
249
|
-
|
|
250
|
-
}
|
|
@@ -1,238 +0,0 @@
|
|
|
1
|
-
import React, { useId, useMemo, useState } from "react";
|
|
2
|
-
import { VirtualTableWhereFilterOp } from "@rebasepro/ui";
|
|
3
|
-
import { EntityRelation, Relation } from "@rebasepro/types";
|
|
4
|
-
import { Checkbox, Label, Select, SelectItem } from "@rebasepro/ui";
|
|
5
|
-
import { RelationSelector } from "../../RelationSelector";
|
|
6
|
-
import { isNullFilterOperator, nullFilterOperatorFor, valueOperatorFor } from "./null_filter";
|
|
7
|
-
|
|
8
|
-
/** Whether an authored relation yields many rows. Derived from its kind. */
|
|
9
|
-
function relationCardinality(relation: { kind?: string; cardinality?: string } | undefined): "one" | "many" | undefined {
|
|
10
|
-
if (!relation) return undefined;
|
|
11
|
-
if (relation.kind === "via") return relation.cardinality as "one" | "many" | undefined;
|
|
12
|
-
if (relation.kind === "hasMany" || relation.kind === "manyToMany") return "many";
|
|
13
|
-
if (relation.kind === "belongsTo" || relation.kind === "hasOne") return "one";
|
|
14
|
-
return relation.cardinality as "one" | "many" | undefined;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
interface RelationFilterFieldProps {
|
|
19
|
-
name: string,
|
|
20
|
-
value?: [VirtualTableWhereFilterOp, EntityRelation | EntityRelation[] | null];
|
|
21
|
-
setValue: (value?: [VirtualTableWhereFilterOp, EntityRelation | EntityRelation[] | null]) => void;
|
|
22
|
-
relation: Relation; // relation config provided externally
|
|
23
|
-
hidden: boolean;
|
|
24
|
-
setHidden: (value: boolean) => void;
|
|
25
|
-
/**
|
|
26
|
-
* Restrict the offered operators (already resolved against engine
|
|
27
|
-
* capabilities and property config). When omitted, all operators this
|
|
28
|
-
* field can render are offered.
|
|
29
|
-
*/
|
|
30
|
-
operators?: readonly VirtualTableWhereFilterOp[];
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const operationLabels = {
|
|
34
|
-
"==": "==",
|
|
35
|
-
"!=": "!=",
|
|
36
|
-
">": ">",
|
|
37
|
-
"<": "<",
|
|
38
|
-
">=": ">=",
|
|
39
|
-
"<=": "<=",
|
|
40
|
-
in: "In",
|
|
41
|
-
"not-in": "Not in",
|
|
42
|
-
"array-contains": "Contains",
|
|
43
|
-
"array-contains-any": "Contains Any",
|
|
44
|
-
"is-null": "Is empty",
|
|
45
|
-
"is-not-null": "Is not empty"
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
const multipleSelectOperations = ["array-contains-any", "in", "not-in"];
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* What this field can render, before `operators` narrows it.
|
|
52
|
-
*
|
|
53
|
-
* Every relation gets the whole set. The value selector is told how many
|
|
54
|
-
* values to take by the *operator* — see the `multiple` prop passed below —
|
|
55
|
-
* so a to-many relation can be asked `== <one tag>` as readily as
|
|
56
|
-
* `in <several>`, and the question of what shape the relation stores never
|
|
57
|
-
* enters into it.
|
|
58
|
-
*
|
|
59
|
-
* That is a change: this list used to be split by the value the selector
|
|
60
|
-
* produced, because the selector took its multiplicity from the relation's
|
|
61
|
-
* cardinality and so a to-many one could only ever emit a list. Every
|
|
62
|
-
* single-value operator had to be withheld to keep an array from reaching
|
|
63
|
-
* `==`. `ReferenceFilterField` never had the problem — it has always sized its
|
|
64
|
-
* dialog from the operator — which is what made the split look like a
|
|
65
|
-
* property of relations rather than a limitation of one component.
|
|
66
|
-
*
|
|
67
|
-
* The array operators are the exception, and belong only to a to-many link,
|
|
68
|
-
* which is the only one that *is* a list. On a to-one relation the filter
|
|
69
|
-
* compiles to a comparison on a scalar foreign key, and `@>` against one is a
|
|
70
|
-
* type error rather than an empty result.
|
|
71
|
-
*/
|
|
72
|
-
const RELATION_OPERATIONS: (keyof typeof operationLabels)[] =
|
|
73
|
-
["==", "!=", ">", "<", ">=", "<=", "in", "not-in", "is-null", "is-not-null"];
|
|
74
|
-
const LIST_ONLY_OPERATIONS: (keyof typeof operationLabels)[] =
|
|
75
|
-
["array-contains", "array-contains-any"];
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* The operators this field will actually put on screen.
|
|
79
|
-
*
|
|
80
|
-
* Exported because the failure mode is silence: when the intersection of what
|
|
81
|
-
* the field can render and what the engine can run comes out empty, the field
|
|
82
|
-
* returns null and the filter control the table header offered opens onto
|
|
83
|
-
* nothing. That is a rendering outcome no unit test of either side alone
|
|
84
|
-
* catches, so the intersection itself is the thing worth pinning.
|
|
85
|
-
*/
|
|
86
|
-
export function renderableRelationOperators(
|
|
87
|
-
relation: { kind?: string; cardinality?: string } | undefined,
|
|
88
|
-
operators?: readonly VirtualTableWhereFilterOp[]
|
|
89
|
-
): (keyof typeof operationLabels)[] {
|
|
90
|
-
const possible = relationCardinality(relation) === "many"
|
|
91
|
-
? [...RELATION_OPERATIONS, ...LIST_ONLY_OPERATIONS]
|
|
92
|
-
: RELATION_OPERATIONS;
|
|
93
|
-
if (!operators) return possible;
|
|
94
|
-
return possible.filter(op => (operators as readonly string[]).includes(op));
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
export function RelationFilterField({
|
|
98
|
-
value,
|
|
99
|
-
setValue,
|
|
100
|
-
relation,
|
|
101
|
-
name: _name,
|
|
102
|
-
hidden: _hidden,
|
|
103
|
-
setHidden: _setHidden,
|
|
104
|
-
operators
|
|
105
|
-
}: RelationFilterFieldProps) {
|
|
106
|
-
|
|
107
|
-
const manyRelation = relationCardinality(relation) === "many";
|
|
108
|
-
|
|
109
|
-
// The filters dialog renders every filterable property at once, and the
|
|
110
|
-
// checkbox's id was the literal string "null-filter" — so clicking any
|
|
111
|
-
// label toggled whichever checkbox the document matched first. Harmless
|
|
112
|
-
// while one relation per table could show it; not once every relation can.
|
|
113
|
-
const nullFilterId = useId();
|
|
114
|
-
|
|
115
|
-
const possibleOperations = renderableRelationOperators(relation, operators);
|
|
116
|
-
|
|
117
|
-
const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];
|
|
118
|
-
const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(fieldOperation);
|
|
119
|
-
const [internalValue, setInternalValue] = useState<EntityRelation | EntityRelation[] | undefined | null>(fieldValue);
|
|
120
|
-
|
|
121
|
-
function updateFilter(op: VirtualTableWhereFilterOp, val?: EntityRelation | EntityRelation[] | null) {
|
|
122
|
-
|
|
123
|
-
const prevOpIsArray = multipleSelectOperations.includes(operation);
|
|
124
|
-
const newOpIsArray = multipleSelectOperations.includes(op);
|
|
125
|
-
let newValue = val;
|
|
126
|
-
if (prevOpIsArray !== newOpIsArray) {
|
|
127
|
-
newValue = newOpIsArray ? (newValue instanceof EntityRelation ? [newValue] : []) : undefined;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
setOperation(op);
|
|
131
|
-
setInternalValue(newValue);
|
|
132
|
-
|
|
133
|
-
// A null check takes no operand, so it is complete on its own — the
|
|
134
|
-
// value gate below would otherwise clear the filter the moment one is
|
|
135
|
-
// chosen from the dropdown, where there is no value to accompany it.
|
|
136
|
-
if (isNullFilterOperator(op)) {
|
|
137
|
-
setValue([op, null]);
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
const hasNewValue = newValue !== null && Array.isArray(newValue)
|
|
142
|
-
? newValue.length > 0
|
|
143
|
-
: newValue !== undefined;
|
|
144
|
-
if (op && hasNewValue) {
|
|
145
|
-
setValue([op, newValue ?? null]);
|
|
146
|
-
} else {
|
|
147
|
-
setValue(undefined);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
const multiple = multipleSelectOperations.includes(operation);
|
|
152
|
-
const nullFiltered = isNullFilterOperator(operation);
|
|
153
|
-
|
|
154
|
-
const relationSelectorValue = useMemo(() => {
|
|
155
|
-
if (internalValue === null || internalValue === undefined) return undefined;
|
|
156
|
-
if (Array.isArray(internalValue)) return internalValue.map(ref => new EntityRelation(ref.id, ref.path));
|
|
157
|
-
return new EntityRelation(internalValue.id, internalValue.path);
|
|
158
|
-
}, [internalValue]);
|
|
159
|
-
|
|
160
|
-
const handleRelationSelectorChange = (newVal?: EntityRelation | EntityRelation[] | null) => {
|
|
161
|
-
if (newVal === null) {
|
|
162
|
-
updateFilter(operation, null);
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
if (newVal === undefined) {
|
|
166
|
-
updateFilter(operation, undefined);
|
|
167
|
-
return;
|
|
168
|
-
}
|
|
169
|
-
updateFilter(operation, newVal);
|
|
170
|
-
};
|
|
171
|
-
|
|
172
|
-
// All renderable operators were filtered out (engine/property narrowing).
|
|
173
|
-
if (possibleOperations.length === 0) return null;
|
|
174
|
-
|
|
175
|
-
return (
|
|
176
|
-
<div className="flex flex-row">
|
|
177
|
-
<div className="">
|
|
178
|
-
<Select
|
|
179
|
-
value={operation}
|
|
180
|
-
fullWidth={true}
|
|
181
|
-
onValueChange={(newOp) => {
|
|
182
|
-
updateFilter(newOp as VirtualTableWhereFilterOp, internalValue);
|
|
183
|
-
}}
|
|
184
|
-
renderValue={(op) => operationLabels[op as keyof typeof operationLabels]}
|
|
185
|
-
>
|
|
186
|
-
{possibleOperations.map((op) => (
|
|
187
|
-
<SelectItem key={op} value={op}>
|
|
188
|
-
{operationLabels[op]}
|
|
189
|
-
</SelectItem>
|
|
190
|
-
))}
|
|
191
|
-
</Select>
|
|
192
|
-
</div>
|
|
193
|
-
|
|
194
|
-
<div className="grow ml-2 h-full gap-2 flex flex-col w-[340px]">
|
|
195
|
-
<RelationSelector
|
|
196
|
-
relation={relation}
|
|
197
|
-
// The operator, not the relation, decides how many values
|
|
198
|
-
// are being asked for — `updateFilter` already coerces the
|
|
199
|
-
// held value on the same test, so the two cannot disagree.
|
|
200
|
-
multiple={multiple}
|
|
201
|
-
value={relationSelectorValue}
|
|
202
|
-
onValueChange={handleRelationSelectorChange}
|
|
203
|
-
disabled={nullFiltered}
|
|
204
|
-
size={"medium"}
|
|
205
|
-
/>
|
|
206
|
-
|
|
207
|
-
{/*
|
|
208
|
-
* Shown for a to-many relation too. It used to be hidden
|
|
209
|
-
* there because the only operators offered were the array
|
|
210
|
-
* ones, which have no null to ask about — but "posts with no
|
|
211
|
-
* tags" is the question a filter on a link is most often
|
|
212
|
-
* for, and the driver answers it with `NOT EXISTS`.
|
|
213
|
-
*
|
|
214
|
-
* It switches the operator to the matching null check rather
|
|
215
|
-
* than pairing a null value with whatever operator is
|
|
216
|
-
* selected. Only the operator travels to the driver, and
|
|
217
|
-
* `is-null` is a thing every engine implements; a null
|
|
218
|
-
* *operand* is not — see `nullFilterOperatorFor`.
|
|
219
|
-
*/}
|
|
220
|
-
<Label
|
|
221
|
-
className="border cursor-pointer rounded-md p-2 flex items-center gap-2 bg-surface-50 dark:bg-surface-900 hover:bg-surface-100 dark:hover:bg-surface-800"
|
|
222
|
-
htmlFor={nullFilterId}
|
|
223
|
-
>
|
|
224
|
-
<Checkbox
|
|
225
|
-
id={nullFilterId}
|
|
226
|
-
checked={nullFiltered}
|
|
227
|
-
size={"small"}
|
|
228
|
-
onCheckedChange={() => {
|
|
229
|
-
if (!nullFiltered) updateFilter(nullFilterOperatorFor(operation), null);
|
|
230
|
-
else updateFilter(valueOperatorFor(operation, possibleOperations) ?? operation, undefined);
|
|
231
|
-
}}
|
|
232
|
-
/>
|
|
233
|
-
{manyRelation ? "Filter for empty relations" : "Filter for null values"}
|
|
234
|
-
</Label>
|
|
235
|
-
</div>
|
|
236
|
-
</div>
|
|
237
|
-
);
|
|
238
|
-
}
|