@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,250 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import React, { useMemo } from "react";
|
|
3
|
-
import { CollectionCustomView, CollectionSize, ViewMode } from "@rebasepro/cms-types";
|
|
4
|
-
import {
|
|
5
|
-
Button,
|
|
6
|
-
ColumnsIcon,
|
|
7
|
-
iconSize,
|
|
8
|
-
KanbanIcon,
|
|
9
|
-
LayoutGridIcon,
|
|
10
|
-
ListIcon,
|
|
11
|
-
Popover,
|
|
12
|
-
Select,
|
|
13
|
-
SelectItem,
|
|
14
|
-
TableIcon,
|
|
15
|
-
ToggleButtonGroup,
|
|
16
|
-
ToggleButtonOption
|
|
17
|
-
} from "@rebasepro/ui";
|
|
18
|
-
import { getIcon, useTranslation } from "@rebasepro/app";
|
|
19
|
-
|
|
20
|
-
export type KanbanPropertyOption = {
|
|
21
|
-
key: string;
|
|
22
|
-
label: string;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
export type ViewModeToggleProps = {
|
|
26
|
-
viewMode?: ViewMode;
|
|
27
|
-
onViewModeChange?: (mode: ViewMode) => void;
|
|
28
|
-
/**
|
|
29
|
-
* Which view modes are enabled for this collection, in the order they
|
|
30
|
-
* should appear. Only these modes appear in the toggle.
|
|
31
|
-
* Defaults to the four built-ins.
|
|
32
|
-
*/
|
|
33
|
-
enabledViews?: ViewMode[];
|
|
34
|
-
/**
|
|
35
|
-
* Custom views this collection can render, already resolved. Their `key`s
|
|
36
|
-
* appear in `enabledViews` alongside the built-ins, and each supplies the
|
|
37
|
-
* name and icon its entry is drawn with.
|
|
38
|
-
*/
|
|
39
|
-
customViews?: CollectionCustomView<any>[];
|
|
40
|
-
/**
|
|
41
|
-
* Current size for card/table views
|
|
42
|
-
*/
|
|
43
|
-
size?: CollectionSize;
|
|
44
|
-
/**
|
|
45
|
-
* Callback when size changes
|
|
46
|
-
*/
|
|
47
|
-
onSizeChanged?: (size: CollectionSize) => void;
|
|
48
|
-
/**
|
|
49
|
-
* Controlled open state for the popover
|
|
50
|
-
*/
|
|
51
|
-
open?: boolean;
|
|
52
|
-
/**
|
|
53
|
-
* Callback when popover open state changes
|
|
54
|
-
*/
|
|
55
|
-
onOpenChange?: (open: boolean) => void;
|
|
56
|
-
/**
|
|
57
|
-
* Available properties that can be used for kanban columns (enum properties)
|
|
58
|
-
*/
|
|
59
|
-
kanbanPropertyOptions?: KanbanPropertyOption[];
|
|
60
|
-
/**
|
|
61
|
-
* Currently selected property for kanban columns
|
|
62
|
-
*/
|
|
63
|
-
selectedKanbanProperty?: string;
|
|
64
|
-
/**
|
|
65
|
-
* Callback when the kanban column property changes
|
|
66
|
-
*/
|
|
67
|
-
onKanbanPropertyChange?: (property: string) => void;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const ALL_VIEW_MODES: ViewMode[] = ["list", "table", "cards", "kanban"];
|
|
71
|
-
|
|
72
|
-
export function ViewModeToggle({
|
|
73
|
-
viewMode = "table",
|
|
74
|
-
onViewModeChange,
|
|
75
|
-
enabledViews = ALL_VIEW_MODES,
|
|
76
|
-
customViews,
|
|
77
|
-
size,
|
|
78
|
-
onSizeChanged,
|
|
79
|
-
open,
|
|
80
|
-
onOpenChange,
|
|
81
|
-
kanbanPropertyOptions,
|
|
82
|
-
selectedKanbanProperty,
|
|
83
|
-
onKanbanPropertyChange
|
|
84
|
-
}: ViewModeToggleProps) {
|
|
85
|
-
|
|
86
|
-
const { t } = useTranslation();
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
// Get icon for current view mode.
|
|
90
|
-
//
|
|
91
|
-
// `small` on the trigger, matching the filters button beside it — the two
|
|
92
|
-
// labelled buttons open the toolbar together, and at 16 against its 20 this
|
|
93
|
-
// one read as the smaller of the pair. The options inside the popover stay
|
|
94
|
-
// at `smallest`, which is the size every other menu icon uses.
|
|
95
|
-
const activeCustomView = customViews?.find((v) => v.key === viewMode);
|
|
96
|
-
|
|
97
|
-
const getViewModeIcon = () => {
|
|
98
|
-
if (activeCustomView) {
|
|
99
|
-
// Falls back to the list glyph rather than rendering nothing, so a
|
|
100
|
-
// custom view that declared no icon still gets a trigger the same
|
|
101
|
-
// width as every other mode's.
|
|
102
|
-
return getIcon(activeCustomView.icon, undefined, undefined, "small")
|
|
103
|
-
?? <ListIcon size={iconSize.small}/>;
|
|
104
|
-
}
|
|
105
|
-
if (viewMode === "kanban") return <KanbanIcon size={iconSize.small}/>;
|
|
106
|
-
if (viewMode === "cards") return <LayoutGridIcon size={iconSize.small}/>;
|
|
107
|
-
if (viewMode === "table") return <TableIcon size={iconSize.small}/>;
|
|
108
|
-
return <ListIcon size={iconSize.small}/>;
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
const getViewModeName = () => {
|
|
112
|
-
// The declared name, untranslated — it is app-supplied copy, and there
|
|
113
|
-
// is no key for it in the admin's bundles.
|
|
114
|
-
if (activeCustomView) return activeCustomView.name;
|
|
115
|
-
if (viewMode === "kanban") return t("board");
|
|
116
|
-
if (viewMode === "cards") return t("cards");
|
|
117
|
-
if (viewMode === "table") return t("table_view_mode");
|
|
118
|
-
return t("list");
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
const showSizeSelector = size && onSizeChanged &&
|
|
122
|
-
(activeCustomView
|
|
123
|
-
? activeCustomView.sizeable
|
|
124
|
-
: viewMode === "list" || viewMode === "table" || viewMode === "cards");
|
|
125
|
-
const showKanbanPropertySelector = viewMode === "kanban" &&
|
|
126
|
-
kanbanPropertyOptions &&
|
|
127
|
-
kanbanPropertyOptions.length > 0 &&
|
|
128
|
-
onKanbanPropertyChange;
|
|
129
|
-
|
|
130
|
-
// Build toggle options, in `enabledViews` order.
|
|
131
|
-
//
|
|
132
|
-
// This used to return all four built-ins unconditionally: `enabledViews`
|
|
133
|
-
// was destructured and then read nowhere, so a collection that asked for
|
|
134
|
-
// `["list", "table"]` still offered cards and kanban, and picking one
|
|
135
|
-
// rendered it. Honouring the prop is what the doc comment always claimed,
|
|
136
|
-
// and it is what lets a custom-only `enabledViews` hide the switcher.
|
|
137
|
-
const viewModeOptions: ToggleButtonOption<ViewMode>[] = useMemo(() => {
|
|
138
|
-
const builtIns: Record<string, { label: string, icon: React.ReactNode }> = {
|
|
139
|
-
list: { label: t("list"), icon: <ListIcon size={iconSize.smallest}/> },
|
|
140
|
-
table: { label: t("table_view_mode"), icon: <TableIcon size={iconSize.smallest}/> },
|
|
141
|
-
cards: { label: t("cards"), icon: <LayoutGridIcon size={iconSize.smallest}/> },
|
|
142
|
-
kanban: { label: t("board"), icon: <KanbanIcon size={iconSize.smallest}/> }
|
|
143
|
-
};
|
|
144
|
-
|
|
145
|
-
return enabledViews.flatMap((mode) => {
|
|
146
|
-
const builtIn = builtIns[mode];
|
|
147
|
-
if (builtIn) return [{ value: mode, ...builtIn }];
|
|
148
|
-
|
|
149
|
-
const custom = customViews?.find((v) => v.key === mode);
|
|
150
|
-
// An `enabledViews` entry naming nothing registered is skipped
|
|
151
|
-
// rather than drawn as a nameless button.
|
|
152
|
-
if (!custom) return [];
|
|
153
|
-
return [{
|
|
154
|
-
value: mode,
|
|
155
|
-
label: custom.name,
|
|
156
|
-
icon: getIcon(custom.icon, undefined, undefined, "smallest")
|
|
157
|
-
?? <ListIcon size={iconSize.smallest}/>
|
|
158
|
-
}];
|
|
159
|
-
});
|
|
160
|
-
}, [t, enabledViews, customViews]);
|
|
161
|
-
|
|
162
|
-
// ── Guard (after hooks to preserve Rules of Hooks) ──────────────
|
|
163
|
-
if (!onViewModeChange) {
|
|
164
|
-
return null;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
// Nothing to switch between and nothing else in the popover: a trigger
|
|
168
|
-
// that opens an empty panel is worse than no trigger. The size and
|
|
169
|
-
// group-by selectors live behind the same button, so a single-mode
|
|
170
|
-
// collection that still has one of those keeps it.
|
|
171
|
-
if (viewModeOptions.length <= 1 && !showSizeSelector && !showKanbanPropertySelector) {
|
|
172
|
-
return null;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
return (
|
|
176
|
-
<div className="overflow-visible">
|
|
177
|
-
<Popover
|
|
178
|
-
open={open}
|
|
179
|
-
onOpenChange={onOpenChange}
|
|
180
|
-
modal={false}
|
|
181
|
-
trigger={
|
|
182
|
-
<Button size="small">
|
|
183
|
-
{getViewModeIcon()}
|
|
184
|
-
<span className="ml-1 text-sm">{getViewModeName()}</span>
|
|
185
|
-
</Button>
|
|
186
|
-
}
|
|
187
|
-
>
|
|
188
|
-
<div className="p-3 flex flex-col gap-3 min-w-[240px]">
|
|
189
|
-
{/* View mode toggle using ToggleButtonGroup */}
|
|
190
|
-
{viewModeOptions.length > 1 && (
|
|
191
|
-
<ToggleButtonGroup
|
|
192
|
-
value={viewMode}
|
|
193
|
-
onValueChange={onViewModeChange}
|
|
194
|
-
options={viewModeOptions}
|
|
195
|
-
/>
|
|
196
|
-
)}
|
|
197
|
-
|
|
198
|
-
{/* Size selector */}
|
|
199
|
-
{showSizeSelector && (
|
|
200
|
-
<div className="flex flex-row items-center justify-between gap-2">
|
|
201
|
-
<div className="flex items-center gap-2 text-sm text-surface-600 dark:text-surface-300">
|
|
202
|
-
<ColumnsIcon size={iconSize.smallest}/>
|
|
203
|
-
<span>{t("size_label")}</span>
|
|
204
|
-
</div>
|
|
205
|
-
<Select
|
|
206
|
-
value={size}
|
|
207
|
-
size="small"
|
|
208
|
-
className="w-20"
|
|
209
|
-
onValueChange={(v) => onSizeChanged?.(v as CollectionSize)}
|
|
210
|
-
renderValue={(v) => <span className="font-medium">{v.toUpperCase()}</span>}
|
|
211
|
-
>
|
|
212
|
-
{["xs", "s", "m", "l", "xl"].map((s) => (
|
|
213
|
-
<SelectItem key={s} value={s} className="font-medium text-center">
|
|
214
|
-
{s.toUpperCase()}
|
|
215
|
-
</SelectItem>
|
|
216
|
-
))}
|
|
217
|
-
</Select>
|
|
218
|
-
</div>
|
|
219
|
-
)}
|
|
220
|
-
|
|
221
|
-
{/* KanbanIcon column property selector */}
|
|
222
|
-
{showKanbanPropertySelector && (
|
|
223
|
-
<div className="flex flex-row items-center justify-between gap-2">
|
|
224
|
-
<div className="flex items-center gap-2 text-sm text-surface-600 dark:text-surface-300">
|
|
225
|
-
<KanbanIcon size={iconSize.smallest}/>
|
|
226
|
-
<span>{t("group_by")}</span>
|
|
227
|
-
</div>
|
|
228
|
-
<Select
|
|
229
|
-
value={selectedKanbanProperty}
|
|
230
|
-
size="small"
|
|
231
|
-
className="w-32"
|
|
232
|
-
onValueChange={(v) => onKanbanPropertyChange?.(v)}
|
|
233
|
-
renderValue={(v) => {
|
|
234
|
-
const option = kanbanPropertyOptions?.find(o => o.key === v);
|
|
235
|
-
return <span className="font-medium truncate">{option?.label ?? v}</span>;
|
|
236
|
-
}}
|
|
237
|
-
>
|
|
238
|
-
{kanbanPropertyOptions?.map((option) => (
|
|
239
|
-
<SelectItem key={option.key} value={option.key}>
|
|
240
|
-
{option.label}
|
|
241
|
-
</SelectItem>
|
|
242
|
-
))}
|
|
243
|
-
</Select>
|
|
244
|
-
</div>
|
|
245
|
-
)}
|
|
246
|
-
</div>
|
|
247
|
-
</Popover>
|
|
248
|
-
</div>
|
|
249
|
-
);
|
|
250
|
-
}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { useCallback, useMemo } from "react";
|
|
2
|
-
import { setIn } from "@rebasepro/forms";
|
|
3
|
-
import { RebaseData } from "@rebasepro/types";
|
|
4
|
-
import { RebaseContext, AdminCollection } from "@rebasepro/cms-types";
|
|
5
|
-
import { OnCellValueChange, saveEntityWithCallbacks, SaveEntityWithCallbacksProps, UniqueFieldValidator } from "@rebasepro/app";
|
|
6
|
-
|
|
7
|
-
export interface UseCollectionInlineEditorParams<M extends Record<string, unknown>> {
|
|
8
|
-
path: string;
|
|
9
|
-
collection: AdminCollection<M>;
|
|
10
|
-
dataClient: RebaseData;
|
|
11
|
-
context: RebaseContext;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export function useCollectionInlineEditor<M extends Record<string, unknown>>({
|
|
15
|
-
path,
|
|
16
|
-
collection,
|
|
17
|
-
dataClient,
|
|
18
|
-
context
|
|
19
|
-
}: UseCollectionInlineEditorParams<M>) {
|
|
20
|
-
|
|
21
|
-
// Unique field validator (ported from CollectionViewBinding)
|
|
22
|
-
const uniqueFieldValidator: UniqueFieldValidator = useCallback(
|
|
23
|
-
async ({ name, value, property, entityId }: Parameters<UniqueFieldValidator>[0]) => {
|
|
24
|
-
const accessor = dataClient.collection(path);
|
|
25
|
-
const res = await accessor.find({
|
|
26
|
-
where: { [name]: ["==", value] }
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
const conflictingEntities = res.data;
|
|
30
|
-
const isUnique = conflictingEntities.length === 0 ||
|
|
31
|
-
(conflictingEntities.length === 1 && conflictingEntities[0].id === entityId);
|
|
32
|
-
|
|
33
|
-
return isUnique;
|
|
34
|
-
},
|
|
35
|
-
[path, dataClient]
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
// Partial update payload builder
|
|
39
|
-
const onValueChange: OnCellValueChange<any, any> = useCallback(({
|
|
40
|
-
value,
|
|
41
|
-
propertyKey,
|
|
42
|
-
onValueUpdated,
|
|
43
|
-
setError,
|
|
44
|
-
data: entity
|
|
45
|
-
}) => {
|
|
46
|
-
if (!entity) return;
|
|
47
|
-
|
|
48
|
-
const updatedValues = setIn({}, propertyKey, value) as Partial<Record<string, unknown>>;
|
|
49
|
-
|
|
50
|
-
const saveProps: SaveEntityWithCallbacksProps<Record<string, unknown>> = {
|
|
51
|
-
path: entity.path ?? path,
|
|
52
|
-
entityId: entity.id,
|
|
53
|
-
values: updatedValues,
|
|
54
|
-
previousValues: entity.values,
|
|
55
|
-
collection,
|
|
56
|
-
status: "existing"
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
return saveEntityWithCallbacks({
|
|
60
|
-
...saveProps,
|
|
61
|
-
collection,
|
|
62
|
-
data: dataClient,
|
|
63
|
-
context,
|
|
64
|
-
afterSave: () => {
|
|
65
|
-
setError(undefined);
|
|
66
|
-
onValueUpdated();
|
|
67
|
-
},
|
|
68
|
-
afterSaveError: (e: Error) => {
|
|
69
|
-
console.error("Save failure");
|
|
70
|
-
console.error(e);
|
|
71
|
-
setError(e);
|
|
72
|
-
}
|
|
73
|
-
}).then();
|
|
74
|
-
|
|
75
|
-
}, [path, collection, dataClient, context]);
|
|
76
|
-
|
|
77
|
-
return useMemo(() => ({
|
|
78
|
-
onValueChange,
|
|
79
|
-
uniqueFieldValidator
|
|
80
|
-
}), [onValueChange, uniqueFieldValidator]);
|
|
81
|
-
}
|
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
import { useCallback, useMemo } from "react";
|
|
2
|
-
import { setIn } from "@rebasepro/forms";
|
|
3
|
-
import { RebaseData, Entity } from "@rebasepro/types";
|
|
4
|
-
import { RebaseContext, AnalyticsController, AdminCollection } from "@rebasepro/cms-types";
|
|
5
|
-
import { saveEntityWithCallbacks, SaveEntityWithCallbacksProps } from "@rebasepro/app";
|
|
6
|
-
import { BoardItem } from "@rebasepro/ui";
|
|
7
|
-
import { BoardDataController } from "../useBoardDataController";
|
|
8
|
-
import { generateKeyBetween } from "fractional-indexing";
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* The digits a board order key is built from: base36, lower case only.
|
|
12
|
-
*
|
|
13
|
-
* The library's default alphabet is base62, and its keys only sort correctly
|
|
14
|
-
* under byte ordering. The column is sorted by the *database*, and Postgres'
|
|
15
|
-
* default collation is not byte ordering — under `en_US.UTF-8`, `"aa"` sorts
|
|
16
|
-
* before `"aC"`, so as soon as a board had been dragged around enough to reach
|
|
17
|
-
* the upper-case digits its order stopped matching the keys. One case has no
|
|
18
|
-
* such ambiguity: digits before letters is true of every collation in use.
|
|
19
|
-
*
|
|
20
|
-
* A key written with the old alphabet no longer validates, which is what makes
|
|
21
|
-
* the board offer to initialise the column — one click, and the order is
|
|
22
|
-
* rewritten in a form the database can sort.
|
|
23
|
-
*/
|
|
24
|
-
export const ORDER_KEY_DIGITS = "0123456789abcdefghijklmnopqrstuvwxyz";
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Whether a stored order value is a key `fractional-indexing` can interpolate
|
|
28
|
-
* against.
|
|
29
|
-
*
|
|
30
|
-
* Anything else — a plain `"12"` from a seed or a migration, an empty string —
|
|
31
|
-
* makes `generateKeyBetween` throw, and the fallback below then hands out the
|
|
32
|
-
* same first key to every card, so each drag lands at the bottom of the column
|
|
33
|
-
* on top of the last one that did. Asking the library itself is the only
|
|
34
|
-
* definition of "valid" worth trusting.
|
|
35
|
-
*/
|
|
36
|
-
export function isValidOrderKey(value: unknown): value is string {
|
|
37
|
-
if (typeof value !== "string" || value.length === 0) return false;
|
|
38
|
-
try {
|
|
39
|
-
generateKeyBetween(value, null, ORDER_KEY_DIGITS);
|
|
40
|
-
return true;
|
|
41
|
-
} catch {
|
|
42
|
-
return false;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export interface UseKanbanDragAndDropParams<M extends Record<string, unknown>> {
|
|
47
|
-
collection: AdminCollection<M>;
|
|
48
|
-
fullPath: string;
|
|
49
|
-
columnProperty: string;
|
|
50
|
-
orderProperty?: string;
|
|
51
|
-
dataClient: RebaseData;
|
|
52
|
-
context: RebaseContext;
|
|
53
|
-
boardDataController: BoardDataController<M>;
|
|
54
|
-
analyticsController: AnalyticsController;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export function useKanbanDragAndDrop<M extends Record<string, unknown>>({
|
|
58
|
-
collection,
|
|
59
|
-
fullPath,
|
|
60
|
-
columnProperty,
|
|
61
|
-
orderProperty,
|
|
62
|
-
dataClient,
|
|
63
|
-
context,
|
|
64
|
-
boardDataController,
|
|
65
|
-
analyticsController
|
|
66
|
-
}: UseKanbanDragAndDropParams<M>) {
|
|
67
|
-
|
|
68
|
-
// Handle item reorder and column changes.
|
|
69
|
-
// Uses string-based fractional indexing via `generateKeyBetween`
|
|
70
|
-
// to compute a single new sort key for the moved item.
|
|
71
|
-
// Only one DB write per drag — the moved item gets its new key.
|
|
72
|
-
const handleItemsReorder = useCallback(async (
|
|
73
|
-
items: BoardItem<Entity<M>>[],
|
|
74
|
-
moveInfo?: { itemId: string; sourceColumn: string; targetColumn: string; }
|
|
75
|
-
) => {
|
|
76
|
-
const entity = items.find(item => item.id === moveInfo?.itemId)?.data;
|
|
77
|
-
if (!entity || !moveInfo) return;
|
|
78
|
-
|
|
79
|
-
analyticsController.onAnalyticsEvent?.("kanban_card_moved", {
|
|
80
|
-
path: fullPath,
|
|
81
|
-
entityId: entity.id,
|
|
82
|
-
sourceColumn: moveInfo.sourceColumn,
|
|
83
|
-
targetColumn: moveInfo.targetColumn
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
const isColumnChange = moveInfo.sourceColumn !== moveInfo.targetColumn;
|
|
87
|
-
|
|
88
|
-
// If no orderProperty and not a column change, nothing to do
|
|
89
|
-
if (!orderProperty && !isColumnChange) return;
|
|
90
|
-
|
|
91
|
-
// Build updated values
|
|
92
|
-
let updatedValues: Record<string, unknown> = {};
|
|
93
|
-
|
|
94
|
-
// Calculate new order key using string fractional indexing
|
|
95
|
-
if (orderProperty) {
|
|
96
|
-
// Get items in the target column in their new visual order
|
|
97
|
-
// 'items' passed from Board.tsx is exactly the array of items in the target column
|
|
98
|
-
const targetColumnItems = items;
|
|
99
|
-
|
|
100
|
-
const movedIndex = targetColumnItems.findIndex(item => item.id === moveInfo.itemId);
|
|
101
|
-
|
|
102
|
-
// The order keys of the neighbours. A neighbour whose key is not a
|
|
103
|
-
// valid one counts as no neighbour at all: interpolating against it
|
|
104
|
-
// throws, and the whole move then falls back to a key that ignores
|
|
105
|
-
// where the card was actually dropped.
|
|
106
|
-
const keyAt = (index: number): string | null => {
|
|
107
|
-
const value = targetColumnItems[index]?.data.values?.[orderProperty];
|
|
108
|
-
return isValidOrderKey(value) ? value : null;
|
|
109
|
-
};
|
|
110
|
-
const prevKey = movedIndex > 0 ? keyAt(movedIndex - 1) : null;
|
|
111
|
-
const nextKey = movedIndex < targetColumnItems.length - 1 ? keyAt(movedIndex + 1) : null;
|
|
112
|
-
|
|
113
|
-
try {
|
|
114
|
-
const a = prevKey;
|
|
115
|
-
let b = nextKey;
|
|
116
|
-
if (a !== null && b !== null && a >= b) {
|
|
117
|
-
// Handle duplicate or out-of-order keys to prevent fractional-indexing crash
|
|
118
|
-
b = null;
|
|
119
|
-
}
|
|
120
|
-
const newKey = generateKeyBetween(a, b, ORDER_KEY_DIGITS);
|
|
121
|
-
updatedValues = setIn(updatedValues, orderProperty, newKey) as Record<string, unknown>;
|
|
122
|
-
} catch (e) {
|
|
123
|
-
// Fallback: if keys are somehow invalid, generate from scratch
|
|
124
|
-
console.warn("fractional-indexing error, falling back:", e);
|
|
125
|
-
const newKey = generateKeyBetween(null, null, ORDER_KEY_DIGITS);
|
|
126
|
-
updatedValues = setIn(updatedValues, orderProperty, newKey) as Record<string, unknown>;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// Update column if it changed
|
|
131
|
-
if (isColumnChange) {
|
|
132
|
-
updatedValues = setIn(updatedValues, columnProperty, moveInfo.targetColumn) as Record<string, unknown>;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// Apply optimistic UI update to boardDataController's internal state
|
|
136
|
-
// This ensures the backend state matches the dragged UI state instantly
|
|
137
|
-
// and prevents the Board component from reverting the dragged item
|
|
138
|
-
if (boardDataController.moveItemOptimistically) {
|
|
139
|
-
const targetIndex = items.findIndex(item => item.id === moveInfo.itemId);
|
|
140
|
-
boardDataController.moveItemOptimistically(
|
|
141
|
-
moveInfo.itemId,
|
|
142
|
-
moveInfo.sourceColumn,
|
|
143
|
-
moveInfo.targetColumn,
|
|
144
|
-
updatedValues,
|
|
145
|
-
targetIndex !== -1 ? targetIndex : undefined
|
|
146
|
-
);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
const saveProps: SaveEntityWithCallbacksProps<Record<string, unknown>> = {
|
|
150
|
-
path: entity.path,
|
|
151
|
-
entityId: entity.id,
|
|
152
|
-
values: updatedValues as M,
|
|
153
|
-
previousValues: entity.values,
|
|
154
|
-
collection,
|
|
155
|
-
status: "existing"
|
|
156
|
-
};
|
|
157
|
-
|
|
158
|
-
try {
|
|
159
|
-
await saveEntityWithCallbacks({
|
|
160
|
-
...saveProps,
|
|
161
|
-
collection,
|
|
162
|
-
data: dataClient,
|
|
163
|
-
context,
|
|
164
|
-
afterSave: () => {},
|
|
165
|
-
afterSaveError: (e: Error) => {
|
|
166
|
-
console.error("Failed to save entity after reorder:", e);
|
|
167
|
-
if (boardDataController.refreshAll) {
|
|
168
|
-
boardDataController.refreshAll();
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
});
|
|
172
|
-
} catch (e) {
|
|
173
|
-
console.error("Error saving entity:", e);
|
|
174
|
-
if (boardDataController.refreshAll) {
|
|
175
|
-
boardDataController.refreshAll();
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
}, [collection, columnProperty, orderProperty, context, dataClient, boardDataController, analyticsController, fullPath]);
|
|
179
|
-
|
|
180
|
-
return useMemo(() => ({ handleItemsReorder }), [handleItemsReorder]);
|
|
181
|
-
}
|