@rebasepro/cms 0.17.3 → 0.18.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/{CollectionEditorDialog-B-akreOU.js → CollectionEditorDialog-BeX4b92r.js} +13 -7
- package/dist/{CollectionEditorDialog-B-akreOU.js.map → CollectionEditorDialog-BeX4b92r.js.map} +1 -1
- package/dist/{PropertyEditView-CiY84wkR.js → PropertyEditView-C7thfj4L.js} +3 -3
- package/dist/{PropertyEditView-CiY84wkR.js.map → PropertyEditView-C7thfj4L.js.map} +1 -1
- package/dist/{RouterCollectionsStudioView-DkAWda4N.js → RouterCollectionsStudioView-BtjzvB6E.js} +4 -4
- package/dist/{RouterCollectionsStudioView-DkAWda4N.js.map → RouterCollectionsStudioView-BtjzvB6E.js.map} +1 -1
- package/dist/{SchemaChangeDialog-DceT8QFX.js → SchemaChangeDialog-CkqK6KOC.js} +4 -2
- package/dist/{SchemaChangeDialog-DceT8QFX.js.map → SchemaChangeDialog-CkqK6KOC.js.map} +1 -1
- package/dist/collection_editor/api/generateCollectionApi.d.ts +1 -2
- package/dist/collection_editor_ui.d.ts +2 -0
- package/dist/collection_editor_ui.js +6 -5
- package/dist/collection_editor_ui.js.map +1 -1
- package/dist/components/DeleteEntityDialog.d.ts +2 -3
- package/dist/components/RebaseLayout.d.ts +11 -4
- package/dist/components/field_configs.d.ts +1 -1
- package/dist/editor/sanitize-html.d.ts +15 -0
- package/dist/editor.js +195 -10
- package/dist/editor.js.map +1 -1
- package/dist/{export-Ben8E355.js → export--arni_VY.js} +2 -2
- package/dist/{export-Ben8E355.js.map → export--arni_VY.js.map} +1 -1
- package/dist/form/components/LabelWithIcon.d.ts +10 -0
- package/dist/{history-DIEVd26f.js → history-C2TpoQwi.js} +2 -2
- package/dist/{history-DIEVd26f.js.map → history-C2TpoQwi.js.map} +1 -1
- package/dist/hooks/navigation/useBuildNavigationStateController.d.ts +1 -1
- package/dist/hooks/navigation/useResolvedViews.d.ts +1 -1
- package/dist/hooks/navigation/useTopLevelNavigation.d.ts +1 -1
- package/dist/{import-D25x7ko-.js → import-DTkXNoBg.js} +2 -2
- package/dist/{import-D25x7ko-.js.map → import-DTkXNoBg.js.map} +1 -1
- package/dist/index.js +78 -33
- package/dist/index.js.map +1 -1
- package/dist/util/propertyConfigMapper.d.ts +1 -1
- package/dist/util-CfLFggP7.js +57 -0
- package/dist/util-CfLFggP7.js.map +1 -0
- package/dist/{util-DVqnqlLn.js → util-DE1WQW6h.js} +134 -112
- package/dist/util-DE1WQW6h.js.map +1 -0
- package/package.json +42 -34
- package/dist/util-DVqnqlLn.js.map +0 -1
- package/src/collection_editor/CollectionEditorDialogsContext.tsx +0 -25
- package/src/collection_editor/ConfigControllerProvider.tsx +0 -395
- package/src/collection_editor/_cms_internals.ts +0 -41
- package/src/collection_editor/api/generateCollectionApi.ts +0 -126
- package/src/collection_editor/api/index.ts +0 -1
- package/src/collection_editor/extensibility_types.ts +0 -168
- package/src/collection_editor/index.ts +0 -108
- package/src/collection_editor/liveSchemaClient.ts +0 -285
- package/src/collection_editor/relation_kinds.ts +0 -44
- package/src/collection_editor/serializable_types.ts +0 -535
- package/src/collection_editor/serializable_utils.ts +0 -729
- package/src/collection_editor/types/collection_editor_controller.tsx +0 -62
- package/src/collection_editor/types/collection_inference.ts +0 -18
- package/src/collection_editor/types/config_controller.tsx +0 -121
- package/src/collection_editor/ui/AddKanbanColumnAction.tsx +0 -199
- package/src/collection_editor/ui/CollectionViewHeaderAction.tsx +0 -51
- package/src/collection_editor/ui/EditorCollectionAction.tsx +0 -54
- package/src/collection_editor/ui/EditorCollectionActionStart.tsx +0 -90
- package/src/collection_editor/ui/EditorEntityAction.tsx +0 -50
- package/src/collection_editor/ui/HomePageEditorCollectionAction.tsx +0 -114
- package/src/collection_editor/ui/KanbanSetupAction.tsx +0 -43
- package/src/collection_editor/ui/MissingReferenceWidget.tsx +0 -35
- package/src/collection_editor/ui/NewCollectionButton.tsx +0 -27
- package/src/collection_editor/ui/NewCollectionCard.tsx +0 -48
- package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +0 -49
- package/src/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.tsx +0 -260
- package/src/collection_editor/ui/collection_editor/AIModifiedPathsContext.tsx +0 -90
- package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +0 -388
- package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +0 -1098
- package/src/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.tsx +0 -301
- package/src/collection_editor/ui/collection_editor/CollectionJsonImportDialog.tsx +0 -172
- package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +0 -620
- package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +0 -530
- package/src/collection_editor/ui/collection_editor/CollectionRelationsTab.tsx +0 -462
- package/src/collection_editor/ui/collection_editor/CollectionStudioView.tsx +0 -104
- package/src/collection_editor/ui/collection_editor/CollectionYupValidation.tsx +0 -9
- package/src/collection_editor/ui/collection_editor/CollectionsStudioView.tsx +0 -199
- package/src/collection_editor/ui/collection_editor/DisplaySettingsForm.tsx +0 -315
- package/src/collection_editor/ui/collection_editor/EntityActionsEditTab.tsx +0 -164
- package/src/collection_editor/ui/collection_editor/EntityActionsSelectDialog.tsx +0 -40
- package/src/collection_editor/ui/collection_editor/EntityCustomViewsSelectDialog.tsx +0 -39
- package/src/collection_editor/ui/collection_editor/EnumForm.tsx +0 -373
- package/src/collection_editor/ui/collection_editor/GeneralSettingsForm.tsx +0 -288
- package/src/collection_editor/ui/collection_editor/GetCodeDialog.tsx +0 -141
- package/src/collection_editor/ui/collection_editor/KanbanConfigSection.tsx +0 -194
- package/src/collection_editor/ui/collection_editor/LayoutModeSwitch.tsx +0 -53
- package/src/collection_editor/ui/collection_editor/PropertyEditView.tsx +0 -980
- package/src/collection_editor/ui/collection_editor/PropertyFieldPreview.tsx +0 -164
- package/src/collection_editor/ui/collection_editor/PropertyTree.tsx +0 -364
- package/src/collection_editor/ui/collection_editor/RouterCollectionStudioView.tsx +0 -44
- package/src/collection_editor/ui/collection_editor/RouterCollectionsStudioView.tsx +0 -41
- package/src/collection_editor/ui/collection_editor/SchemaChangeDialog.tsx +0 -470
- package/src/collection_editor/ui/collection_editor/SubcollectionsEditTab.tsx +0 -256
- package/src/collection_editor/ui/collection_editor/SwitchControl.tsx +0 -39
- package/src/collection_editor/ui/collection_editor/ViewModeSwitch.tsx +0 -68
- package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.tsx +0 -67
- package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.tsx +0 -296
- package/src/collection_editor/ui/collection_editor/import/clean_import_data.ts +0 -57
- package/src/collection_editor/ui/collection_editor/properties/BlockPropertyField.tsx +0 -147
- package/src/collection_editor/ui/collection_editor/properties/BooleanPropertyField.tsx +0 -41
- package/src/collection_editor/ui/collection_editor/properties/CommonPropertyFields.tsx +0 -113
- package/src/collection_editor/ui/collection_editor/properties/DateTimePropertyField.tsx +0 -250
- package/src/collection_editor/ui/collection_editor/properties/EnumPropertyField.tsx +0 -126
- package/src/collection_editor/ui/collection_editor/properties/KeyValuePropertyField.tsx +0 -20
- package/src/collection_editor/ui/collection_editor/properties/MapPropertyField.tsx +0 -153
- package/src/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.tsx +0 -217
- package/src/collection_editor/ui/collection_editor/properties/NumberPropertyField.tsx +0 -117
- package/src/collection_editor/ui/collection_editor/properties/ReferencePropertyField.tsx +0 -129
- package/src/collection_editor/ui/collection_editor/properties/RelationPropertyField.tsx +0 -335
- package/src/collection_editor/ui/collection_editor/properties/RepeatPropertyField.tsx +0 -107
- package/src/collection_editor/ui/collection_editor/properties/StoragePropertyField.tsx +0 -403
- package/src/collection_editor/ui/collection_editor/properties/StringPropertyField.tsx +0 -148
- package/src/collection_editor/ui/collection_editor/properties/UrlPropertyField.tsx +0 -91
- package/src/collection_editor/ui/collection_editor/properties/VectorPropertyField.tsx +0 -34
- package/src/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx +0 -49
- package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.tsx +0 -925
- package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsPanel.tsx +0 -28
- package/src/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.tsx +0 -626
- package/src/collection_editor/ui/collection_editor/properties/conditions/index.ts +0 -6
- package/src/collection_editor/ui/collection_editor/properties/conditions/property_paths.ts +0 -93
- package/src/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx +0 -52
- package/src/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx +0 -63
- package/src/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx +0 -114
- package/src/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.tsx +0 -154
- package/src/collection_editor/ui/collection_editor/properties/validation/ValidationPanel.tsx +0 -28
- package/src/collection_editor/ui/collection_editor/templates/blog_template.ts +0 -112
- package/src/collection_editor/ui/collection_editor/templates/pages_template.ts +0 -183
- package/src/collection_editor/ui/collection_editor/templates/products_template.ts +0 -88
- package/src/collection_editor/ui/collection_editor/templates/users_template.ts +0 -42
- package/src/collection_editor/ui/collection_editor/util.ts +0 -28
- package/src/collection_editor/ui/collection_editor/utils/strings.ts +0 -1
- package/src/collection_editor/ui/collection_editor/utils/supported_fields.tsx +0 -39
- package/src/collection_editor/ui/collection_editor/utils/update_property_for_widget.ts +0 -276
- package/src/collection_editor/useCollectionEditorController.tsx +0 -9
- package/src/collection_editor/useCollectionsConfigController.tsx +0 -9
- package/src/collection_editor/useJsonCollectionsConfigController.tsx +0 -297
- package/src/collection_editor/useLiveSchemaEditing.tsx +0 -315
- package/src/collection_editor/useLocalCollectionsConfigController.tsx +0 -341
- package/src/collection_editor/useSafeSnackbarController.ts +0 -9
- package/src/collection_editor/validateCollectionJson.ts +0 -440
- package/src/collection_editor_ui.ts +0 -21
- package/src/components/AdditionalFieldValue.tsx +0 -68
- package/src/components/AdminModeSyncer.tsx +0 -56
- package/src/components/ArrayContainer.tsx +0 -542
- package/src/components/ClearFilterSortButton.tsx +0 -56
- package/src/components/CollectionEditorDialogs.tsx +0 -69
- package/src/components/CollectionPanel.tsx +0 -179
- package/src/components/CollectionTableBinding/CollectionRowActions.tsx +0 -244
- package/src/components/CollectionTableBinding/CollectionTableBinding.tsx +0 -394
- package/src/components/CollectionTableBinding/CollectionTableBindingProps.tsx +0 -172
- package/src/components/CollectionTableBinding/PropertyTableCell.tsx +0 -350
- package/src/components/CollectionTableBinding/column_utils.tsx +0 -155
- package/src/components/CollectionTableBinding/fields/TableMultipleRelationField.tsx +0 -131
- package/src/components/CollectionTableBinding/fields/TableReferenceField.tsx +0 -193
- package/src/components/CollectionTableBinding/fields/TableRelationField.tsx +0 -192
- package/src/components/CollectionTableBinding/fields/TableRelationSelectorField.tsx +0 -42
- package/src/components/CollectionTableBinding/fields/TableStorageUpload.tsx +0 -324
- package/src/components/CollectionTableBinding/fields/VirtualTableSelect.tsx +0 -132
- package/src/components/CollectionTableBinding/fields/VirtualTableUserSelect.tsx +0 -41
- package/src/components/CollectionTableBinding/index.tsx +0 -14
- package/src/components/CollectionTableBinding/internal/CollectionTableToolbar.tsx +0 -96
- package/src/components/CollectionTableBinding/internal/EntityTableCell.tsx +0 -309
- package/src/components/CollectionTableBinding/internal/EntityTableCellActions.tsx +0 -80
- package/src/components/CollectionTableBinding/internal/common.tsx +0 -74
- package/src/components/CollectionTableBinding/internal/popup_field/PopupFormField.tsx +0 -422
- package/src/components/CollectionTableBinding/internal/popup_field/useDraggable.tsx +0 -99
- package/src/components/CollectionTableBinding/internal/popup_field/useWindowSize.tsx +0 -22
- package/src/components/CollectionTableBinding/table_bindings.tsx +0 -350
- package/src/components/CollectionViewBinding/BoardCardBinding.tsx +0 -263
- package/src/components/CollectionViewBinding/CollectionBoardViewBinding.tsx +0 -662
- package/src/components/CollectionViewBinding/CollectionCardViewBinding.tsx +0 -159
- package/src/components/CollectionViewBinding/CollectionListViewBinding.tsx +0 -1430
- package/src/components/CollectionViewBinding/CollectionViewActions.tsx +0 -227
- package/src/components/CollectionViewBinding/CollectionViewBinding.tsx +0 -1603
- package/src/components/CollectionViewBinding/CollectionViewStartActions.tsx +0 -240
- package/src/components/CollectionViewBinding/EntityCardBinding.tsx +0 -239
- package/src/components/CollectionViewBinding/FilterPresetsButton.tsx +0 -298
- package/src/components/CollectionViewBinding/FiltersDialog.tsx +0 -218
- package/src/components/CollectionViewBinding/SearchExplanation.tsx +0 -106
- package/src/components/CollectionViewBinding/SearchHighlight.tsx +0 -311
- package/src/components/CollectionViewBinding/SlotValue.tsx +0 -156
- package/src/components/CollectionViewBinding/SortButton.tsx +0 -354
- package/src/components/CollectionViewBinding/SplitListCloseButton.tsx +0 -49
- package/src/components/CollectionViewBinding/SplitListShowButton.tsx +0 -28
- package/src/components/CollectionViewBinding/SplitListView.tsx +0 -488
- package/src/components/CollectionViewBinding/SplitViewContext.tsx +0 -34
- package/src/components/CollectionViewBinding/ViewModeToggle.tsx +0 -250
- package/src/components/CollectionViewBinding/hooks/useCollectionInlineEditor.ts +0 -81
- package/src/components/CollectionViewBinding/hooks/useKanbanDragAndDrop.ts +0 -181
- package/src/components/CollectionViewBinding/useBoardDataController.tsx +0 -802
- package/src/components/CollectionViewBinding/usePreviewSlots.ts +0 -703
- package/src/components/CollectionViewBinding/useSelectionController.tsx +0 -40
- package/src/components/CollectionViewBinding/utils.ts +0 -22
- package/src/components/DefaultAppBar.tsx +0 -264
- package/src/components/DefaultDrawer.tsx +0 -593
- package/src/components/DeleteEntityDialog.tsx +0 -205
- package/src/components/DetailViewBinding.tsx +0 -731
- package/src/components/DrawerNavigationGroup.tsx +0 -141
- package/src/components/DrawerNavigationItem.tsx +0 -115
- package/src/components/EditFormActions.tsx +0 -303
- package/src/components/EditViewBinding.tsx +0 -1069
- package/src/components/EntityDisplayHeader.tsx +0 -170
- package/src/components/EntityIdentityBar.tsx +0 -428
- package/src/components/EntityInspector.tsx +0 -156
- package/src/components/EntityPreviewBinding.tsx +0 -432
- package/src/components/EntityPreviewNesting.tsx +0 -50
- package/src/components/EntityViewBinding.tsx +0 -374
- package/src/components/FieldCaption.tsx +0 -14
- package/src/components/HomePage/ContentHomePage.tsx +0 -586
- package/src/components/HomePage/FavouritesView.tsx +0 -60
- package/src/components/HomePage/HomePageDnD.tsx +0 -704
- package/src/components/HomePage/NavigationCard.tsx +0 -81
- package/src/components/HomePage/NavigationCardBinding.tsx +0 -107
- package/src/components/HomePage/NavigationGroup.tsx +0 -156
- package/src/components/HomePage/RenameGroupDialog.tsx +0 -123
- package/src/components/HomePage/SmallNavigationCard.tsx +0 -41
- package/src/components/HomePage/index.tsx +0 -5
- package/src/components/InlineEntityPreview.tsx +0 -149
- package/src/components/JsonPreviewBinding.tsx +0 -66
- package/src/components/PropertyCollectionView.tsx +0 -336
- package/src/components/PropertyConfigBadge.tsx +0 -28
- package/src/components/PropertyIdCopyTooltip.tsx +0 -47
- package/src/components/RebaseAuthGate.tsx +0 -44
- package/src/components/RebaseCMS.tsx +0 -30
- package/src/components/RebaseLayout.tsx +0 -80
- package/src/components/RebaseNavigation.tsx +0 -369
- package/src/components/RebaseRouteDefs.tsx +0 -127
- package/src/components/RebaseShell.tsx +0 -83
- package/src/components/ReferenceTable/SelectionTableBinding.tsx +0 -389
- package/src/components/ReferenceWidget.tsx +0 -156
- package/src/components/RelationSelector.tsx +0 -926
- package/src/components/SearchIconsView.tsx +0 -78
- package/src/components/SelectableTable/SelectableTable.tsx +0 -309
- package/src/components/SelectableTable/SelectableTableContext.tsx +0 -7
- package/src/components/SelectableTable/SelectionStore.ts +0 -43
- package/src/components/SelectableTable/filters/BooleanFilterField.tsx +0 -59
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +0 -146
- package/src/components/SelectableTable/filters/FilterFieldBinding.tsx +0 -190
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +0 -250
- package/src/components/SelectableTable/filters/RelationFilterField.tsx +0 -238
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +0 -282
- package/src/components/SelectableTable/filters/null_filter.ts +0 -63
- package/src/components/SideDialogs.tsx +0 -238
- package/src/components/SidePanelBinding.tsx +0 -361
- package/src/components/SidePanelProvider.tsx +0 -80
- package/src/components/UserSelector.tsx +0 -513
- package/src/components/admin/CreationResultDialog.tsx +0 -138
- package/src/components/admin/index.ts +0 -1
- package/src/components/app/AppBar.tsx +0 -17
- package/src/components/app/Drawer.tsx +0 -38
- package/src/components/app/Scaffold.tsx +0 -366
- package/src/components/app/index.ts +0 -4
- package/src/components/app/useApp.tsx +0 -36
- package/src/components/common/default_entity_actions.tsx +0 -440
- package/src/components/common/index.ts +0 -1
- package/src/components/field_configs.tsx +0 -506
- package/src/components/history/EntityHistoryEntry.tsx +0 -203
- package/src/components/history/EntityHistoryView.tsx +0 -206
- package/src/components/history/LastEditedByFormAction.tsx +0 -24
- package/src/components/history/LastEditedByIndicator.tsx +0 -95
- package/src/components/history/UserChip.tsx +0 -15
- package/src/components/history/index.tsx +0 -5
- package/src/components/index.ts +0 -63
- package/src/contexts/BreacrumbsContext.tsx +0 -45
- package/src/contexts/SideDialogsControllerContext.tsx +0 -5
- package/src/contexts/SidePanelControllerContext.tsx +0 -5
- package/src/data_export/export/BasicExportAction.tsx +0 -142
- package/src/data_export/export/ExportCollectionAction.tsx +0 -321
- package/src/data_export/export/export.ts +0 -295
- package/src/data_export/export/fetch_export_data.ts +0 -90
- package/src/data_export/export/index.ts +0 -4
- package/src/data_export/index.ts +0 -1
- package/src/data_import/components/DataNewPropertiesMapping.tsx +0 -261
- package/src/data_import/components/ImportFileUpload.tsx +0 -42
- package/src/data_import/components/ImportNewPropertyFieldPreview.tsx +0 -58
- package/src/data_import/components/ImportSaveInProgress.tsx +0 -121
- package/src/data_import/components/index.ts +0 -4
- package/src/data_import/hooks/index.ts +0 -1
- package/src/data_import/hooks/useImportConfig.tsx +0 -34
- package/src/data_import/import/ImportCollectionAction.tsx +0 -461
- package/src/data_import/import/index.ts +0 -1
- package/src/data_import/index.ts +0 -5
- package/src/data_import/types/column_mapping.ts +0 -32
- package/src/data_import/types/index.ts +0 -1
- package/src/data_import/utils/csv.ts +0 -153
- package/src/data_import/utils/data.ts +0 -181
- package/src/data_import/utils/file_headers.ts +0 -14
- package/src/data_import/utils/file_to_json.ts +0 -149
- package/src/data_import/utils/get_import_inference_type.ts +0 -33
- package/src/data_import/utils/get_properties_mapping.ts +0 -67
- package/src/data_import/utils/index.ts +0 -5
- package/src/data_import/utils/save_entities.ts +0 -138
- package/src/data_import/utils/transforms.ts +0 -70
- package/src/editor/components/SlashCommandMenu.tsx +0 -532
- package/src/editor/components/editor-bubble-item.tsx +0 -32
- package/src/editor/components/editor-bubble.tsx +0 -143
- package/src/editor/components/image-bubble.tsx +0 -183
- package/src/editor/components/index.ts +0 -14
- package/src/editor/components/table-bubble.tsx +0 -233
- package/src/editor/editor.tsx +0 -529
- package/src/editor/extensions/HighlightDecorationExtension.ts +0 -115
- package/src/editor/extensions/Image.ts +0 -159
- package/src/editor/extensions/TextLoadingDecorationExtension.tsx +0 -107
- package/src/editor/extensions/clipboard.ts +0 -72
- package/src/editor/extensions/custom-keymap.ts +0 -25
- package/src/editor/extensions/drag-and-drop.tsx +0 -508
- package/src/editor/hooks/useProseMirror.ts +0 -126
- package/src/editor/hooks/useProseMirrorContext.ts +0 -15
- package/src/editor/index.ts +0 -2
- package/src/editor/markdown-it-plugins.d.ts +0 -24
- package/src/editor/markdown.ts +0 -204
- package/src/editor/nodeViews/ImageComponent.tsx +0 -20
- package/src/editor/nodeViews/ReactNodeView.tsx +0 -89
- package/src/editor/nodeViews/TaskItemComponent.tsx +0 -30
- package/src/editor/nodeViews/index.ts +0 -35
- package/src/editor/plugins/index.ts +0 -58
- package/src/editor/plugins/inputrules.ts +0 -82
- package/src/editor/plugins/placeholderPlugin.ts +0 -55
- package/src/editor/plugins/slashCommandPlugin.ts +0 -65
- package/src/editor/schema.ts +0 -339
- package/src/editor/selectors/ai-selector.tsx +0 -110
- package/src/editor/selectors/color-selector.tsx +0 -199
- package/src/editor/selectors/link-selector.tsx +0 -122
- package/src/editor/selectors/node-selector.tsx +0 -159
- package/src/editor/selectors/text-buttons.tsx +0 -79
- package/src/editor/types.ts +0 -6
- package/src/editor/useProseMirror.ts +0 -125
- package/src/editor/utils/prosemirror-utils.ts +0 -113
- package/src/editor/utils/remove_classes.ts +0 -18
- package/src/editor/utils/useDebouncedCallback.ts +0 -25
- package/src/form/EntityForm.tsx +0 -761
- package/src/form/EntityFormActions.tsx +0 -160
- package/src/form/EntityFormBinding.tsx +0 -342
- package/src/form/PropertyFieldBinding.tsx +0 -348
- package/src/form/components/ErrorFocus.tsx +0 -44
- package/src/form/components/FieldBlock.tsx +0 -189
- package/src/form/components/FieldHelperText.tsx +0 -84
- package/src/form/components/FormRail.tsx +0 -153
- package/src/form/components/FormSections.tsx +0 -145
- package/src/form/components/LabelWithIcon.tsx +0 -43
- package/src/form/components/LabelWithIconAndTooltip.tsx +0 -28
- package/src/form/components/LocalChangesMenu.tsx +0 -147
- package/src/form/components/StorageItemPreview.tsx +0 -81
- package/src/form/components/StorageUploadProgress.tsx +0 -118
- package/src/form/components/index.tsx +0 -6
- package/src/form/components/useRailVisible.tsx +0 -47
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +0 -109
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +0 -172
- package/src/form/field_bindings/BinaryFieldBinding.tsx +0 -177
- package/src/form/field_bindings/BlockFieldBinding.tsx +0 -282
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +0 -78
- package/src/form/field_bindings/GeopointFieldBinding.tsx +0 -200
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +0 -574
- package/src/form/field_bindings/MapFieldBinding.tsx +0 -120
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +0 -259
- package/src/form/field_bindings/MultiSelectFieldBinding.tsx +0 -130
- package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +0 -168
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +0 -94
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +0 -146
- package/src/form/field_bindings/RelationFieldBinding.tsx +0 -202
- package/src/form/field_bindings/RepeatFieldBinding.tsx +0 -143
- package/src/form/field_bindings/SelectFieldBinding.tsx +0 -111
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +0 -521
- package/src/form/field_bindings/SwitchFieldBinding.tsx +0 -70
- package/src/form/field_bindings/TextFieldBinding.tsx +0 -189
- package/src/form/field_bindings/UserSelectFieldBinding.tsx +0 -71
- package/src/form/field_bindings/VectorFieldBinding.tsx +0 -209
- package/src/form/form_utils.ts +0 -243
- package/src/form/index.tsx +0 -36
- package/src/form/useClearRestoreValue.tsx +0 -36
- package/src/form/useUndoableDiscard.ts +0 -39
- package/src/form/validation.ts +0 -583
- package/src/hooks/index.ts +0 -16
- package/src/hooks/navigation/contexts/CollectionRegistryContext.tsx +0 -22
- package/src/hooks/navigation/contexts/NavigationStateContext.tsx +0 -16
- package/src/hooks/navigation/contexts/UrlContext.tsx +0 -24
- package/src/hooks/navigation/contexts/index.ts +0 -14
- package/src/hooks/navigation/useAsyncResolver.ts +0 -100
- package/src/hooks/navigation/useBuildCollectionRegistryController.tsx +0 -218
- package/src/hooks/navigation/useBuildNavigationStateController.tsx +0 -134
- package/src/hooks/navigation/useBuildUrlController.tsx +0 -66
- package/src/hooks/navigation/useNavigationResolution.ts +0 -271
- package/src/hooks/navigation/useResolvedCollections.ts +0 -102
- package/src/hooks/navigation/useResolvedViews.tsx +0 -139
- package/src/hooks/navigation/useTopLevelNavigation.ts +0 -273
- package/src/hooks/navigation/utils.ts +0 -200
- package/src/hooks/useAdminContext.tsx +0 -83
- package/src/hooks/useBreadcrumbsController.tsx +0 -17
- package/src/hooks/useBuildSideDialogsController.tsx +0 -145
- package/src/hooks/useBuildSidePanel.tsx +0 -315
- package/src/hooks/useChildViewSource.ts +0 -46
- package/src/hooks/useEntityDisplay.tsx +0 -262
- package/src/hooks/useEntityDisplayTitle.tsx +0 -49
- package/src/hooks/useHistory.ts +0 -178
- package/src/hooks/useRecordActions.tsx +0 -69
- package/src/hooks/useResolvedNavigationFrom.tsx +0 -167
- package/src/hooks/useResolvedUsers.ts +0 -148
- package/src/hooks/useSelectionDialog.tsx +0 -58
- package/src/hooks/useSideDialogsController.tsx +0 -25
- package/src/hooks/useSidePanel.tsx +0 -13
- package/src/index.ts +0 -124
- package/src/preview/PropertyPreview.tsx +0 -331
- package/src/preview/compact_text.ts +0 -68
- package/src/preview/components/ArrayEnumPreview.tsx +0 -39
- package/src/preview/components/BooleanPreview.tsx +0 -28
- package/src/preview/components/DatePreview.tsx +0 -106
- package/src/preview/components/EmptyValue.tsx +0 -10
- package/src/preview/components/EnumValuesChip.tsx +0 -39
- package/src/preview/components/ImagePreview.tsx +0 -144
- package/src/preview/components/InlineEntityListPreview.tsx +0 -42
- package/src/preview/components/ReferencePreview.tsx +0 -235
- package/src/preview/components/RelationPreview.tsx +0 -271
- package/src/preview/components/StorageThumbnail.tsx +0 -147
- package/src/preview/components/UrlComponentPreview.tsx +0 -116
- package/src/preview/components/UserPreview.tsx +0 -30
- package/src/preview/components/date_fns_locales.ts +0 -125
- package/src/preview/index.ts +0 -26
- package/src/preview/property_previews/ArrayOfMapsPreview.tsx +0 -73
- package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +0 -67
- package/src/preview/property_previews/ArrayOfRelationsPreview.tsx +0 -77
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +0 -49
- package/src/preview/property_previews/ArrayOfStringsPreview.tsx +0 -70
- package/src/preview/property_previews/ArrayOneOfPreview.tsx +0 -79
- package/src/preview/property_previews/ArrayPropertyEnumPreview.tsx +0 -35
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +0 -79
- package/src/preview/property_previews/MapPropertyPreview.tsx +0 -198
- package/src/preview/property_previews/NumberPropertyPreview.tsx +0 -39
- package/src/preview/property_previews/SkeletonPropertyComponent.tsx +0 -276
- package/src/preview/property_previews/StringPropertyPreview.tsx +0 -70
- package/src/preview/util.ts +0 -39
- package/src/routes/CustomViewRoute.tsx +0 -33
- package/src/routes/RebaseRoute.tsx +0 -467
- package/src/routes/index.ts +0 -2
- package/src/types/components/EntityFormActionsProps.tsx +0 -20
- package/src/types/components/EntityFormProps.tsx +0 -119
- package/src/types/components/PropertyPreviewProps.tsx +0 -85
- package/src/types/components/formex.tsx +0 -2
- package/src/types/components/index.ts +0 -3
- package/src/types/fields.tsx +0 -340
- package/src/types/index.ts +0 -4
- package/src/util/dataControllerAdapter.ts +0 -88
- package/src/util/entity_actions.ts +0 -28
- package/src/util/index.ts +0 -5
- package/src/util/navigation_utils.ts +0 -89
- package/src/util/number_format.ts +0 -46
- package/src/util/previews.ts +0 -131
- package/src/util/propertyConfigMapper.ts +0 -134
- package/src/util/property_utils.tsx +0 -236
- package/src/util/resolutions.ts +0 -96
- package/src/util/view_constants.ts +0 -33
- package/src/util/view_mode.ts +0 -176
|
@@ -1,282 +0,0 @@
|
|
|
1
|
-
import React, { useState } from "react";
|
|
2
|
-
import { EnumValuesChip } from "../../../preview";
|
|
3
|
-
import {
|
|
4
|
-
IconButton,
|
|
5
|
-
MultiSelect,
|
|
6
|
-
MultiSelectItem,
|
|
7
|
-
Select,
|
|
8
|
-
SelectItem,
|
|
9
|
-
TextField,
|
|
10
|
-
VirtualTableWhereFilterOp,
|
|
11
|
-
XIcon
|
|
12
|
-
} from "@rebasepro/ui";
|
|
13
|
-
import { EnumValueConfig } from "@rebasepro/types";
|
|
14
|
-
import { useTranslation } from "@rebasepro/app";
|
|
15
|
-
|
|
16
|
-
interface StringNumberFilterFieldProps {
|
|
17
|
-
name: string,
|
|
18
|
-
type: "string" | "number";
|
|
19
|
-
value?: [op: VirtualTableWhereFilterOp, fieldValue: unknown];
|
|
20
|
-
setValue: (value?: [op: VirtualTableWhereFilterOp, newValue: unknown]) => void;
|
|
21
|
-
isArray?: boolean;
|
|
22
|
-
enumValues?: EnumValueConfig[];
|
|
23
|
-
title?: string;
|
|
24
|
-
/**
|
|
25
|
-
* Restrict the offered operators (already resolved against engine
|
|
26
|
-
* capabilities and property config). When omitted, all operators this
|
|
27
|
-
* field can render are offered.
|
|
28
|
-
*/
|
|
29
|
-
operators?: readonly VirtualTableWhereFilterOp[];
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const operationLabels = {
|
|
33
|
-
"==": "==",
|
|
34
|
-
"!=": "!=",
|
|
35
|
-
">": ">",
|
|
36
|
-
"<": "<",
|
|
37
|
-
">=": ">=",
|
|
38
|
-
"<=": "<=",
|
|
39
|
-
in: "In",
|
|
40
|
-
"not-in": "Not in",
|
|
41
|
-
"array-contains": "Contains",
|
|
42
|
-
"array-contains-any": "Any",
|
|
43
|
-
"ilike": "Contains",
|
|
44
|
-
"not-ilike": "Not contains",
|
|
45
|
-
"is-null": "Is null",
|
|
46
|
-
"is-not-null": "Is not null"
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
const multipleSelectOperations = ["array-contains-any", "in", "not-in"];
|
|
50
|
-
|
|
51
|
-
/** Operators that match a substring, wrapped in SQL wildcards (`%value%`). */
|
|
52
|
-
const containsOperations = ["ilike", "not-ilike"];
|
|
53
|
-
|
|
54
|
-
/** Strip the surrounding `%` wildcards a contains-filter adds, for display. */
|
|
55
|
-
function unwrapContains(value: unknown): string {
|
|
56
|
-
if (typeof value !== "string") return "";
|
|
57
|
-
return value.replace(/^%/, "").replace(/%$/, "");
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export function StringNumberFilterField({
|
|
61
|
-
name,
|
|
62
|
-
value,
|
|
63
|
-
setValue,
|
|
64
|
-
type,
|
|
65
|
-
isArray,
|
|
66
|
-
enumValues,
|
|
67
|
-
title,
|
|
68
|
-
operators
|
|
69
|
-
}: StringNumberFilterFieldProps) {
|
|
70
|
-
const { t } = useTranslation();
|
|
71
|
-
|
|
72
|
-
let possibleOperations: (keyof typeof operationLabels)[] = isArray
|
|
73
|
-
? ["array-contains"]
|
|
74
|
-
: ["==", "!=", ">", "<", ">=", "<=", "is-null", "is-not-null"];
|
|
75
|
-
|
|
76
|
-
// Case-insensitive substring matching is only meaningful for free-text
|
|
77
|
-
// string columns (not numbers, arrays, or enums).
|
|
78
|
-
if (!isArray && !enumValues && type === "string") {
|
|
79
|
-
possibleOperations.push("ilike", "not-ilike");
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
if (enumValues) {
|
|
83
|
-
if (isArray) {
|
|
84
|
-
possibleOperations.push("array-contains-any");
|
|
85
|
-
} else {
|
|
86
|
-
possibleOperations.push("in", "not-in");
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
if (operators) {
|
|
91
|
-
possibleOperations = possibleOperations.filter(op => (operators as readonly string[]).includes(op));
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];
|
|
95
|
-
// Read back both the canonical null operators and the legacy `["==", null]` /
|
|
96
|
-
// `["!=", null]` form saved by older filter presets.
|
|
97
|
-
const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(
|
|
98
|
-
fieldOperation === "==" && fieldValue === null ? "is-null"
|
|
99
|
-
: fieldOperation === "!=" && fieldValue === null ? "is-not-null"
|
|
100
|
-
: fieldOperation
|
|
101
|
-
);
|
|
102
|
-
const [internalValue, setInternalValue] = useState<string | number | string[] | number[] | null | undefined>(
|
|
103
|
-
containsOperations.includes(fieldOperation) ? unwrapContains(fieldValue) : (fieldValue as string | number | string[] | number[] | null | undefined)
|
|
104
|
-
);
|
|
105
|
-
|
|
106
|
-
const isNullOperation = operation === "is-null" || operation === "is-not-null";
|
|
107
|
-
|
|
108
|
-
// All renderable operators were filtered out (engine/property narrowing).
|
|
109
|
-
if (possibleOperations.length === 0) return null;
|
|
110
|
-
|
|
111
|
-
function updateFilter(op: VirtualTableWhereFilterOp, val: string | number | string[] | number[] | null | undefined) {
|
|
112
|
-
// Null-testing operators ignore their value.
|
|
113
|
-
if (op === "is-null" || op === "is-not-null") {
|
|
114
|
-
setOperation(op);
|
|
115
|
-
setInternalValue(null);
|
|
116
|
-
setValue([op, null]);
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// Substring matching: keep the raw text in the field, emit it wrapped
|
|
121
|
-
// in SQL wildcards so the backend runs `column ILIKE '%value%'`.
|
|
122
|
-
if (op === "ilike" || op === "not-ilike") {
|
|
123
|
-
const raw = typeof val === "string" ? val : "";
|
|
124
|
-
setOperation(op);
|
|
125
|
-
setInternalValue(raw);
|
|
126
|
-
if (raw.length > 0) {
|
|
127
|
-
setValue([op, `%${raw}%`]);
|
|
128
|
-
} else {
|
|
129
|
-
setValue(undefined);
|
|
130
|
-
}
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
let newValue = val;
|
|
135
|
-
const prevOpIsArray = multipleSelectOperations.includes(operation);
|
|
136
|
-
const newOpIsArray = multipleSelectOperations.includes(op);
|
|
137
|
-
if (prevOpIsArray !== newOpIsArray) {
|
|
138
|
-
if (newOpIsArray) {
|
|
139
|
-
if (typeof val === "string") newValue = [val];
|
|
140
|
-
else if (typeof val === "number") newValue = [val];
|
|
141
|
-
else newValue = [];
|
|
142
|
-
} else {
|
|
143
|
-
newValue = undefined;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
if (typeof newValue === "number" && isNaN(newValue))
|
|
148
|
-
newValue = undefined;
|
|
149
|
-
|
|
150
|
-
setOperation(op);
|
|
151
|
-
setInternalValue(newValue);
|
|
152
|
-
|
|
153
|
-
const hasNewValue = newValue !== null && Array.isArray(newValue)
|
|
154
|
-
? newValue.length > 0
|
|
155
|
-
: newValue !== undefined;
|
|
156
|
-
if (op && hasNewValue) {
|
|
157
|
-
setValue(
|
|
158
|
-
[op, newValue]
|
|
159
|
-
);
|
|
160
|
-
} else {
|
|
161
|
-
setValue(
|
|
162
|
-
undefined
|
|
163
|
-
);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
const multiple = multipleSelectOperations.includes(operation);
|
|
168
|
-
|
|
169
|
-
return (
|
|
170
|
-
|
|
171
|
-
<div className="flex w-full">
|
|
172
|
-
<div className={"w-[100px]"}>
|
|
173
|
-
<Select value={operation}
|
|
174
|
-
size={"medium"}
|
|
175
|
-
fullWidth={true}
|
|
176
|
-
position={"item-aligned"}
|
|
177
|
-
onValueChange={(value) => {
|
|
178
|
-
updateFilter(value as VirtualTableWhereFilterOp, internalValue);
|
|
179
|
-
}}
|
|
180
|
-
renderValue={(op) => operationLabels[op as keyof typeof operationLabels]}>
|
|
181
|
-
{possibleOperations.map((op) => (
|
|
182
|
-
<SelectItem key={op} value={op}>
|
|
183
|
-
{operationLabels[op]}
|
|
184
|
-
</SelectItem>
|
|
185
|
-
))}
|
|
186
|
-
</Select>
|
|
187
|
-
</div>
|
|
188
|
-
|
|
189
|
-
<div className="grow ml-2 flex flex-col gap-2">
|
|
190
|
-
|
|
191
|
-
{!enumValues && <TextField
|
|
192
|
-
size={"medium"}
|
|
193
|
-
aria-label={`${title ?? name} filter value`}
|
|
194
|
-
type={type === "number" ? "number" : undefined}
|
|
195
|
-
value={internalValue !== undefined && internalValue != null ? String(internalValue) : ""}
|
|
196
|
-
disabled={isNullOperation}
|
|
197
|
-
placeholder={isNullOperation ? "null" : undefined}
|
|
198
|
-
onChange={(evt) => {
|
|
199
|
-
const val = type === "number"
|
|
200
|
-
? parseFloat(evt.target.value)
|
|
201
|
-
: evt.target.value;
|
|
202
|
-
updateFilter(operation, val);
|
|
203
|
-
}}
|
|
204
|
-
endAdornment={internalValue !== undefined && internalValue != null && <IconButton
|
|
205
|
-
onClick={(e) => updateFilter(operation, undefined)}>
|
|
206
|
-
<XIcon/>
|
|
207
|
-
</IconButton>}
|
|
208
|
-
/>}
|
|
209
|
-
|
|
210
|
-
{enumValues && !multiple &&
|
|
211
|
-
<Select
|
|
212
|
-
size={"medium"}
|
|
213
|
-
position={"item-aligned"}
|
|
214
|
-
fullWidth={true}
|
|
215
|
-
disabled={isNullOperation}
|
|
216
|
-
value={typeof internalValue === "string" ? internalValue : ""}
|
|
217
|
-
onValueChange={(value) => {
|
|
218
|
-
if (value !== "")
|
|
219
|
-
updateFilter(operation, type === "number" ? parseInt(value as string) : value as string)
|
|
220
|
-
}}
|
|
221
|
-
endAdornment={internalValue && <IconButton
|
|
222
|
-
onClick={(e) => updateFilter(operation, undefined)}>
|
|
223
|
-
<XIcon/>
|
|
224
|
-
</IconButton>}
|
|
225
|
-
renderValue={(enumKey) => {
|
|
226
|
-
if (enumKey === null)
|
|
227
|
-
return t("filter_for_null_values");
|
|
228
|
-
if (enumKey === undefined)
|
|
229
|
-
return null;
|
|
230
|
-
|
|
231
|
-
return <EnumValuesChip
|
|
232
|
-
key={`select_value_${name}_${enumKey}`}
|
|
233
|
-
enumKey={enumKey}
|
|
234
|
-
enumValues={enumValues}
|
|
235
|
-
size={"small"}/>;
|
|
236
|
-
}}>
|
|
237
|
-
{enumValues.map((enumConfig) => (
|
|
238
|
-
<SelectItem key={`select_item_${name}_${enumConfig.id}`}
|
|
239
|
-
value={String(enumConfig.id)}>
|
|
240
|
-
<EnumValuesChip
|
|
241
|
-
enumKey={String(enumConfig.id)}
|
|
242
|
-
enumValues={enumValues}
|
|
243
|
-
size={"small"}/>
|
|
244
|
-
</SelectItem>
|
|
245
|
-
))}
|
|
246
|
-
</Select>
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
{enumValues && multiple &&
|
|
250
|
-
<MultiSelect
|
|
251
|
-
size={"medium"}
|
|
252
|
-
position={"item-aligned"}
|
|
253
|
-
value={Array.isArray(internalValue) ? internalValue.map(e => String(e)) : []}
|
|
254
|
-
disabled={isNullOperation}
|
|
255
|
-
onValueChange={(value) => {
|
|
256
|
-
updateFilter(operation, type === "number" ? (value ?? []).map(v => parseInt(v)) : value)
|
|
257
|
-
}}
|
|
258
|
-
multiple={multiple}
|
|
259
|
-
endAdornment={internalValue && <IconButton
|
|
260
|
-
className="absolute right-2 top-3"
|
|
261
|
-
onClick={(e) => updateFilter(operation, undefined)}>
|
|
262
|
-
<XIcon/>
|
|
263
|
-
</IconButton>}
|
|
264
|
-
>
|
|
265
|
-
{enumValues.map((enumConfig) => (
|
|
266
|
-
<MultiSelectItem key={`select_value_${name}_${enumConfig.id}`}
|
|
267
|
-
value={String(enumConfig.id)}>
|
|
268
|
-
<EnumValuesChip
|
|
269
|
-
enumKey={String(enumConfig.id)}
|
|
270
|
-
enumValues={enumValues}
|
|
271
|
-
size={"small"}/>
|
|
272
|
-
</MultiSelectItem>
|
|
273
|
-
))}
|
|
274
|
-
</MultiSelect>
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
</div>
|
|
278
|
-
|
|
279
|
-
</div>
|
|
280
|
-
);
|
|
281
|
-
|
|
282
|
-
}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { WhereFilterOp } from "@rebasepro/types";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* The "filter for null values" checkbox, expressed portably.
|
|
5
|
-
*
|
|
6
|
-
* The checkbox used to emit `[whichever operator is selected, null]` and leave
|
|
7
|
-
* the driver to work out that a null value means a null check. That reads as
|
|
8
|
-
* an engine-neutral convention and is not one:
|
|
9
|
-
*
|
|
10
|
-
* - Postgres took `["==", null]` as `IS NULL`, but dropped `["in", null]`
|
|
11
|
-
* entirely — a dropped condition widens, so ticking the box returned every
|
|
12
|
-
* row instead of the ones with no value.
|
|
13
|
-
* - MongoDB maps `in`/`not-in` straight onto `$in`/`$nin`, and Mongo rejects
|
|
14
|
-
* those with a non-array: `$in needs an array`. The read fails outright.
|
|
15
|
-
* - A Firestore driver is supplied by the developer, and the Firestore SDK
|
|
16
|
-
* likewise refuses `in` without a non-empty array.
|
|
17
|
-
*
|
|
18
|
-
* Only `==`/`!=` ever worked, and only because two engines independently chose
|
|
19
|
-
* to special-case a null operand. Nothing in the filter contract promises that,
|
|
20
|
-
* and a filter field is shared by every engine the admin can talk to.
|
|
21
|
-
*
|
|
22
|
-
* `is-null`/`is-not-null` are the operators that mean this, they are in
|
|
23
|
-
* {@link ALL_WHERE_FILTER_OPS}, and every driver already handles them
|
|
24
|
-
* explicitly rather than by inference. So the checkbox emits those, and the
|
|
25
|
-
* question of what a null operand means to a given engine stops being asked.
|
|
26
|
-
*/
|
|
27
|
-
export const NULL_FILTER_OPERATORS: readonly WhereFilterOp[] = ["is-null", "is-not-null"];
|
|
28
|
-
|
|
29
|
-
/** Whether `op` asks about absence rather than about a value. */
|
|
30
|
-
export function isNullFilterOperator(op: WhereFilterOp | undefined): boolean {
|
|
31
|
-
return op === "is-null" || op === "is-not-null";
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* The null check carrying the same sense as `op`.
|
|
36
|
-
*
|
|
37
|
-
* The checkbox is a toggle, not an operator, so the operator it is ticked
|
|
38
|
-
* alongside is what says which way round it means: `==`/`in` are asking for
|
|
39
|
-
* a match, so their null form is "has nothing"; `!=`/`not-in` are asking for
|
|
40
|
-
* the absence of one, so theirs is "has something".
|
|
41
|
-
*/
|
|
42
|
-
export function nullFilterOperatorFor(op: WhereFilterOp | undefined): WhereFilterOp {
|
|
43
|
-
if (op === "!=" || op === "not-in" || op === "is-not-null") return "is-not-null";
|
|
44
|
-
return "is-null";
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* The value operator to return to when the checkbox is unticked.
|
|
49
|
-
*
|
|
50
|
-
* `is-null` could have been reached from `==` or from `in` — the field cannot
|
|
51
|
-
* know which, and it does not matter. What matters is landing on an operator
|
|
52
|
-
* the dropdown actually offers, in the same sense, so the control does not
|
|
53
|
-
* come back showing something it cannot render.
|
|
54
|
-
*/
|
|
55
|
-
export function valueOperatorFor(
|
|
56
|
-
op: WhereFilterOp | undefined,
|
|
57
|
-
offered: readonly WhereFilterOp[]
|
|
58
|
-
): WhereFilterOp | undefined {
|
|
59
|
-
const negative = op === "is-not-null";
|
|
60
|
-
const wanted: WhereFilterOp[] = negative ? ["!=", "not-in"] : ["==", "in", "array-contains"];
|
|
61
|
-
return wanted.find(candidate => offered.includes(candidate))
|
|
62
|
-
?? offered.find(candidate => !isNullFilterOperator(candidate));
|
|
63
|
-
}
|
|
@@ -1,238 +0,0 @@
|
|
|
1
|
-
import type { SideDialogPanelProps } from "../hooks/useSideDialogsController";
|
|
2
|
-
import React, { useCallback, useContext, useEffect, useState, useMemo } from "react";
|
|
3
|
-
import { useSideDialogsController } from "../hooks";
|
|
4
|
-
import { Sheet, Dialog } from "@rebasepro/ui";
|
|
5
|
-
import { useUnsavedChangesDialog, UnsavedChangesDialog } from "@rebasepro/app";
|
|
6
|
-
import { ErrorBoundary } from "@rebasepro/ui";
|
|
7
|
-
import type { SidePanelBindingProps } from "@rebasepro/cms-types";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
export type SideDialogController = {
|
|
11
|
-
blocked: boolean,
|
|
12
|
-
setBlocked: (blocked: boolean) => void,
|
|
13
|
-
setBlockedNavigationMessage: (message?: React.ReactNode) => void,
|
|
14
|
-
width?: string,
|
|
15
|
-
close: (force?: boolean) => void;
|
|
16
|
-
pendingClose: boolean,
|
|
17
|
-
setPendingClose: (pendingClose: boolean) => void
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const SideDialogContext = React.createContext<SideDialogController>({
|
|
21
|
-
width: "",
|
|
22
|
-
blocked: false,
|
|
23
|
-
setBlocked: (blocked: boolean) => {
|
|
24
|
-
},
|
|
25
|
-
setBlockedNavigationMessage: (message?: React.ReactNode) => {
|
|
26
|
-
},
|
|
27
|
-
close: () => {
|
|
28
|
-
},
|
|
29
|
-
pendingClose: false,
|
|
30
|
-
setPendingClose: () => {
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* This hook is used to access the properties of a particular side dialog,
|
|
37
|
-
* in contrast with {@link useSideDialogsController} which handles the
|
|
38
|
-
* state of all the dialogs.
|
|
39
|
-
*/
|
|
40
|
-
export const useSideDialogContext = () => useContext<SideDialogController>(SideDialogContext);
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* This is the component in charge of rendering the side dialogs used
|
|
44
|
-
* for editing entities. Use the {@link useSidePanel} to open
|
|
45
|
-
* and control the dialogs.
|
|
46
|
-
* This component needs a parent {@link Rebase}
|
|
47
|
-
* {@link useSideDialogsController}
|
|
48
|
-
* @group Components
|
|
49
|
-
*/
|
|
50
|
-
export function SideDialogs() {
|
|
51
|
-
|
|
52
|
-
const sideDialogsController = useSideDialogsController();
|
|
53
|
-
|
|
54
|
-
const sidePanels = sideDialogsController.sidePanels;
|
|
55
|
-
|
|
56
|
-
// A trailing `undefined` slot ("ghost panel") is always appended so that
|
|
57
|
-
// close animations work correctly. Index-based keys ensure that when the
|
|
58
|
-
// last real panel is removed, the ghost inherits key=0 — re-using the
|
|
59
|
-
// same SideDialogView instance so the Sheet smoothly transitions from
|
|
60
|
-
// open → closed rather than unmounting instantly.
|
|
61
|
-
const panels: (SideDialogPanelProps | undefined)[] = [...sidePanels];
|
|
62
|
-
panels.push(undefined);
|
|
63
|
-
|
|
64
|
-
return <>
|
|
65
|
-
{
|
|
66
|
-
panels.map((panel, index) =>
|
|
67
|
-
<SideDialogView
|
|
68
|
-
key={`side_dialog_${index}`}
|
|
69
|
-
panel={panel}
|
|
70
|
-
panelIndex={index}
|
|
71
|
-
offsetPosition={sidePanels.length - index - 1}
|
|
72
|
-
isTopPanel={index === sidePanels.length - 1}/>)
|
|
73
|
-
}
|
|
74
|
-
</>;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
function SideDialogView({
|
|
78
|
-
offsetPosition,
|
|
79
|
-
panel,
|
|
80
|
-
panelIndex,
|
|
81
|
-
isTopPanel
|
|
82
|
-
}: {
|
|
83
|
-
offsetPosition: number,
|
|
84
|
-
panel?: SideDialogPanelProps,
|
|
85
|
-
panelIndex: number,
|
|
86
|
-
isTopPanel: boolean
|
|
87
|
-
}) {
|
|
88
|
-
|
|
89
|
-
// was the closing of the dialog requested by the drawer
|
|
90
|
-
const [drawerCloseRequested, setDrawerCloseRequested] = useState<boolean>(false);
|
|
91
|
-
const [blocked, setBlocked] = useState(false);
|
|
92
|
-
const [blockedNavigationMessage, setBlockedNavigationMessage] = useState<React.ReactNode | undefined>();
|
|
93
|
-
|
|
94
|
-
// Held in a ref, read through a getter, because of *when* it is written and
|
|
95
|
-
// read. "Save and close" raises it and submits the form in one click
|
|
96
|
-
// handler, and the callback that acts on it — the form's `onSaved` — was
|
|
97
|
-
// captured before React could re-render with the new value. As state the
|
|
98
|
-
// flag was therefore always read one save late: the first "save and close"
|
|
99
|
-
// saved and left the panel open, and the *next* save closed it.
|
|
100
|
-
// Nothing renders from it, so a ref loses nothing.
|
|
101
|
-
const pendingCloseRef = React.useRef(false);
|
|
102
|
-
const setPendingClose = useCallback((value: boolean) => {
|
|
103
|
-
pendingCloseRef.current = value;
|
|
104
|
-
}, []);
|
|
105
|
-
|
|
106
|
-
const widthRef = React.useRef<string | undefined>(panel?.width);
|
|
107
|
-
const width = widthRef.current;
|
|
108
|
-
|
|
109
|
-
const sideDialogsController = useSideDialogsController();
|
|
110
|
-
|
|
111
|
-
// Prevent non-topmost dialogs from being dismissed by outside clicks.
|
|
112
|
-
// When stacked Sheets exist, clicking the overlay of the topmost dialog
|
|
113
|
-
// would otherwise propagate and dismiss lower dialogs too.
|
|
114
|
-
const preventDismiss = useCallback((e: Event) => {
|
|
115
|
-
e.preventDefault();
|
|
116
|
-
}, []);
|
|
117
|
-
|
|
118
|
-
const { dialogProps, triggerDialog } = useUnsavedChangesDialog(
|
|
119
|
-
blocked,
|
|
120
|
-
() => setBlocked(false)
|
|
121
|
-
);
|
|
122
|
-
|
|
123
|
-
useEffect(() => {
|
|
124
|
-
if (panel)
|
|
125
|
-
widthRef.current = panel.width;
|
|
126
|
-
}, [panel])
|
|
127
|
-
|
|
128
|
-
const handleDrawerCloseOk = () => {
|
|
129
|
-
setBlocked(false);
|
|
130
|
-
setDrawerCloseRequested(false);
|
|
131
|
-
sideDialogsController.close();
|
|
132
|
-
panel?.onClose?.();
|
|
133
|
-
};
|
|
134
|
-
|
|
135
|
-
const handleDrawerCloseCancel = () => {
|
|
136
|
-
setDrawerCloseRequested(false);
|
|
137
|
-
};
|
|
138
|
-
|
|
139
|
-
const onCloseRequest = useCallback((force?: boolean) => {
|
|
140
|
-
if (blocked && !force) {
|
|
141
|
-
setDrawerCloseRequested(true);
|
|
142
|
-
triggerDialog();
|
|
143
|
-
} else {
|
|
144
|
-
sideDialogsController.close();
|
|
145
|
-
panel?.onClose?.();
|
|
146
|
-
}
|
|
147
|
-
}, [blocked, triggerDialog, sideDialogsController, panel]);
|
|
148
|
-
|
|
149
|
-
const contextValue = useMemo(() => ({
|
|
150
|
-
blocked,
|
|
151
|
-
setBlocked,
|
|
152
|
-
setBlockedNavigationMessage,
|
|
153
|
-
width,
|
|
154
|
-
close: onCloseRequest,
|
|
155
|
-
get pendingClose() {
|
|
156
|
-
return pendingCloseRef.current;
|
|
157
|
-
},
|
|
158
|
-
setPendingClose
|
|
159
|
-
}), [blocked, setBlockedNavigationMessage, width, onCloseRequest, setPendingClose]);
|
|
160
|
-
|
|
161
|
-
const additionalProps = panel?.additional as SidePanelBindingProps | undefined;
|
|
162
|
-
const isDialogMode = additionalProps?.collection?.openEntityMode === "dialog";
|
|
163
|
-
|
|
164
|
-
return (
|
|
165
|
-
<SideDialogContext.Provider value={contextValue}>
|
|
166
|
-
|
|
167
|
-
{isDialogMode ? (
|
|
168
|
-
<Dialog
|
|
169
|
-
open={Boolean(panel)}
|
|
170
|
-
onOpenChange={(open) => {
|
|
171
|
-
if (!open) {
|
|
172
|
-
onCloseRequest();
|
|
173
|
-
}
|
|
174
|
-
}}
|
|
175
|
-
maxWidth="4xl"
|
|
176
|
-
scrollable={false}
|
|
177
|
-
>
|
|
178
|
-
{panel && (
|
|
179
|
-
<div className="flex flex-col h-[75vh] min-h-[500px] w-full min-w-0 max-w-full overflow-hidden">
|
|
180
|
-
<ErrorBoundary>
|
|
181
|
-
{panel.component}
|
|
182
|
-
</ErrorBoundary>
|
|
183
|
-
</div>
|
|
184
|
-
)}
|
|
185
|
-
</Dialog>
|
|
186
|
-
) : (
|
|
187
|
-
<Sheet
|
|
188
|
-
open={Boolean(panel)}
|
|
189
|
-
includeBackgroundOverlay={true}
|
|
190
|
-
overlayStyle={{ zIndex: 40 + panelIndex * 10 }}
|
|
191
|
-
style={{ zIndex: 45 + panelIndex * 10 }}
|
|
192
|
-
onOpenChange={(open) => {
|
|
193
|
-
if (!open) {
|
|
194
|
-
onCloseRequest();
|
|
195
|
-
}
|
|
196
|
-
}}
|
|
197
|
-
onPointerDownOutside={!isTopPanel ? preventDismiss : undefined}
|
|
198
|
-
onInteractOutside={!isTopPanel ? preventDismiss : undefined}
|
|
199
|
-
title={"Side dialog " + panel?.key}
|
|
200
|
-
>
|
|
201
|
-
{panel &&
|
|
202
|
-
<div
|
|
203
|
-
className={"transform max-w-[100vw] lg:max-w-[95vw] flex flex-col h-full transition-all duration-250 ease-in-out bg-white dark:bg-surface-800 "}
|
|
204
|
-
style={{
|
|
205
|
-
width: panel.width,
|
|
206
|
-
transform: `translateX(-${offsetPosition * 200}px)`
|
|
207
|
-
}}
|
|
208
|
-
>
|
|
209
|
-
<ErrorBoundary>
|
|
210
|
-
{panel.component}
|
|
211
|
-
</ErrorBoundary>
|
|
212
|
-
</div>}
|
|
213
|
-
|
|
214
|
-
{!panel && <div style={{ width }}/>}
|
|
215
|
-
|
|
216
|
-
</Sheet>
|
|
217
|
-
)}
|
|
218
|
-
|
|
219
|
-
<UnsavedChangesDialog
|
|
220
|
-
{...dialogProps}
|
|
221
|
-
handleOk={() => {
|
|
222
|
-
dialogProps.handleOk();
|
|
223
|
-
if (drawerCloseRequested) {
|
|
224
|
-
handleDrawerCloseOk();
|
|
225
|
-
}
|
|
226
|
-
}}
|
|
227
|
-
handleCancel={() => {
|
|
228
|
-
dialogProps.handleCancel();
|
|
229
|
-
if (drawerCloseRequested) {
|
|
230
|
-
handleDrawerCloseCancel();
|
|
231
|
-
}
|
|
232
|
-
}}
|
|
233
|
-
body={blockedNavigationMessage || "There are unsaved changes"}/>
|
|
234
|
-
|
|
235
|
-
</SideDialogContext.Provider>
|
|
236
|
-
|
|
237
|
-
);
|
|
238
|
-
}
|