@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,731 +0,0 @@
|
|
|
1
|
-
import type { ComponentRef } from "@rebasepro/types";
|
|
2
|
-
import type { EntityCustomViewParams, FormViewConfig, AdminCollection } from "@rebasepro/cms-types";
|
|
3
|
-
import type { FormContext } from "../types/fields";
|
|
4
|
-
import type { PluginFormActionProps } from "@rebasepro/cms-types";
|
|
5
|
-
import React, { lazy, Suspense, useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
6
|
-
import { Entity, EntityStatus, getCollectionDataPath, Property } from "@rebasepro/types";
|
|
7
|
-
import { PluginProviderStack, resolveComponentRef, useComponentOverride, CollectionScopeProvider, getAdminEntityChildViews } from "@rebasepro/app";
|
|
8
|
-
|
|
9
|
-
import { CollectionViewBinding } from "./CollectionViewBinding/CollectionViewBinding";
|
|
10
|
-
import { EntityViewBinding } from "./EntityViewBinding";
|
|
11
|
-
import { EntityIdentityBar } from "./EntityIdentityBar";
|
|
12
|
-
import { SplitListCloseButton } from "./CollectionViewBinding/SplitListCloseButton";
|
|
13
|
-
import { SplitListShowButton } from "./CollectionViewBinding/SplitListShowButton";
|
|
14
|
-
import { EntityInspector, InspectorTab } from "./EntityInspector";
|
|
15
|
-
import { CircularProgressCenter, iconSize } from "@rebasepro/ui";
|
|
16
|
-
import {
|
|
17
|
-
Alert,
|
|
18
|
-
Button,
|
|
19
|
-
CenteredView,
|
|
20
|
-
cls,
|
|
21
|
-
CodeIcon,
|
|
22
|
-
defaultBorderMixin,
|
|
23
|
-
HistoryIcon,
|
|
24
|
-
IconButton,
|
|
25
|
-
Maximize2Icon,
|
|
26
|
-
PencilIcon,
|
|
27
|
-
Skeleton,
|
|
28
|
-
Tab,
|
|
29
|
-
Tabs,
|
|
30
|
-
Tooltip,
|
|
31
|
-
Typography
|
|
32
|
-
} from "@rebasepro/ui";
|
|
33
|
-
import { ErrorBoundary } from "@rebasepro/ui";
|
|
34
|
-
import { ErrorView, createFormexStub, usePermissions, useTranslation, getIcon } from "@rebasepro/app";
|
|
35
|
-
|
|
36
|
-
import { removeInitialAndTrailingSlashes, resolveDefaultSelectedView } from "@rebasepro/app";
|
|
37
|
-
import { withViewMode } from "../util/view_mode";
|
|
38
|
-
import { resolvedSelectedEntityView } from "../util/resolutions";
|
|
39
|
-
import {
|
|
40
|
-
useCustomizationController,
|
|
41
|
-
useFetch,
|
|
42
|
-
useRebaseContext,
|
|
43
|
-
useLargeLayout,
|
|
44
|
-
useSlot
|
|
45
|
-
} from "@rebasepro/app";
|
|
46
|
-
import { useUrlController } from "../hooks/navigation/contexts/UrlContext";
|
|
47
|
-
import { useCollectionRegistryController } from "../hooks/navigation/contexts/CollectionRegistryContext";
|
|
48
|
-
import { useNavigate } from "react-router";
|
|
49
|
-
import { useEntityDisplayTitle } from "../hooks/useEntityDisplayTitle";
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
import {
|
|
53
|
-
MAIN_TAB_VALUE,
|
|
54
|
-
JSON_TAB_VALUE,
|
|
55
|
-
HISTORY_TAB_VALUE,
|
|
56
|
-
ENTITY_VIEW_TAB_BAR_CLASS,
|
|
57
|
-
ENTITY_VIEW_TAB_CLASS,
|
|
58
|
-
ENTITY_VIEW_TAB_LABEL_CLASS
|
|
59
|
-
} from "../util/view_constants";
|
|
60
|
-
|
|
61
|
-
export type BarActionsParams = {
|
|
62
|
-
values: object,
|
|
63
|
-
status: EntityStatus,
|
|
64
|
-
path: string,
|
|
65
|
-
entityId?: string | number;
|
|
66
|
-
/** Always false here — this view reads a record, it does not edit one. */
|
|
67
|
-
dirty: boolean;
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
export type OnTabChangeParams<M extends Record<string, unknown>> = {
|
|
71
|
-
path: string;
|
|
72
|
-
entityId?: string | number;
|
|
73
|
-
selectedTab?: string;
|
|
74
|
-
collection: AdminCollection<M>;
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
export interface DetailViewBindingProps<M extends Record<string, unknown> = Record<string, unknown>> {
|
|
78
|
-
path: string;
|
|
79
|
-
collection: AdminCollection<M>;
|
|
80
|
-
entityId: string | number;
|
|
81
|
-
selectedTab?: string;
|
|
82
|
-
parentCollectionSlugs: string[];
|
|
83
|
-
parentEntityIds: string[];
|
|
84
|
-
onTabChange?: (props: OnTabChangeParams<M>) => void;
|
|
85
|
-
onEditClick?: () => void;
|
|
86
|
-
/**
|
|
87
|
-
* Dismiss this record — the ✕ at the identity bar's trailing edge.
|
|
88
|
-
*
|
|
89
|
-
* Set by the layouts that own the record's place on screen but are not side
|
|
90
|
-
* dialogs: the split, where dismissing is navigating back to the collection.
|
|
91
|
-
*/
|
|
92
|
-
onCloseRequest?: () => void;
|
|
93
|
-
layout?: "side_panel" | "full_screen" | "split" | "dialog";
|
|
94
|
-
barActions?: (params: BarActionsParams) => React.ReactNode;
|
|
95
|
-
/**
|
|
96
|
-
* Controls the owning panel puts at the identity bar's leading edge, ahead
|
|
97
|
-
* of the breadcrumb — the side panel's close button.
|
|
98
|
-
*/
|
|
99
|
-
barActionsStart?: React.ReactNode;
|
|
100
|
-
/**
|
|
101
|
-
* Full screen only: bring the list back beside this record. Set when the
|
|
102
|
-
* record was opened out of a split collection, so folding the list away is
|
|
103
|
-
* reversible; it takes the place of the back arrow when present.
|
|
104
|
-
*/
|
|
105
|
-
onShowList?: () => void;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
export function DetailViewBinding<M extends Record<string, unknown>>({
|
|
109
|
-
entityId,
|
|
110
|
-
...props
|
|
111
|
-
}: DetailViewBindingProps<M>) {
|
|
112
|
-
|
|
113
|
-
const {
|
|
114
|
-
entity,
|
|
115
|
-
dataLoading,
|
|
116
|
-
dataLoadingError
|
|
117
|
-
} = useFetch<M>({
|
|
118
|
-
path: props.path,
|
|
119
|
-
entityId: entityId,
|
|
120
|
-
collection: props.collection,
|
|
121
|
-
useCache: false
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
if (!dataLoading && dataLoadingError) {
|
|
125
|
-
return <CenteredView>
|
|
126
|
-
<ErrorView error={dataLoadingError} />
|
|
127
|
-
</CenteredView>;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
if (!dataLoading && !entity) {
|
|
131
|
-
return <CenteredView>
|
|
132
|
-
<Typography variant="label">Entity not found</Typography>
|
|
133
|
-
</CenteredView>;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
const content = (
|
|
137
|
-
<DetailViewBindingInner<M>
|
|
138
|
-
{...props}
|
|
139
|
-
entityId={entityId}
|
|
140
|
-
entity={entity}
|
|
141
|
-
dataLoading={dataLoading}
|
|
142
|
-
/>
|
|
143
|
-
);
|
|
144
|
-
|
|
145
|
-
return (
|
|
146
|
-
<CollectionScopeProvider collection={props.collection}>
|
|
147
|
-
{content}
|
|
148
|
-
</CollectionScopeProvider>
|
|
149
|
-
);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
function DetailViewBindingInner<M extends Record<string, unknown>>({
|
|
153
|
-
path,
|
|
154
|
-
entityId,
|
|
155
|
-
selectedTab: selectedTabProp,
|
|
156
|
-
collection,
|
|
157
|
-
parentCollectionSlugs,
|
|
158
|
-
parentEntityIds,
|
|
159
|
-
onTabChange,
|
|
160
|
-
onEditClick,
|
|
161
|
-
onCloseRequest,
|
|
162
|
-
entity,
|
|
163
|
-
dataLoading,
|
|
164
|
-
layout = "full_screen",
|
|
165
|
-
barActions,
|
|
166
|
-
barActionsStart,
|
|
167
|
-
onShowList
|
|
168
|
-
}: DetailViewBindingProps<M> & {
|
|
169
|
-
entity?: Entity<M>,
|
|
170
|
-
dataLoading: boolean,
|
|
171
|
-
}) {
|
|
172
|
-
const ResolvedCollectionView = useComponentOverride("Collection.View", CollectionViewBinding);
|
|
173
|
-
const { t } = useTranslation();
|
|
174
|
-
const context = useRebaseContext();
|
|
175
|
-
const urlController = useUrlController();
|
|
176
|
-
const navigate = useNavigate();
|
|
177
|
-
const customizationController = useCustomizationController();
|
|
178
|
-
const plugins = customizationController.plugins;
|
|
179
|
-
const collectionRegistryController = useCollectionRegistryController();
|
|
180
|
-
const { canEdit: canEditHook } = usePermissions();
|
|
181
|
-
|
|
182
|
-
const canEdit = useMemo(() => {
|
|
183
|
-
return entity ? canEditHook(collection, path, entity) : false;
|
|
184
|
-
}, [canEditHook, entity, collection, path]);
|
|
185
|
-
|
|
186
|
-
const [usedEntity, setUsedEntity] = useState<Entity<M> | undefined>(entity);
|
|
187
|
-
useEffect(() => {
|
|
188
|
-
if (entity) setUsedEntity(entity);
|
|
189
|
-
}, [entity]);
|
|
190
|
-
|
|
191
|
-
const defaultSelectedView = useMemo(() => resolveDefaultSelectedView(
|
|
192
|
-
collection.defaultSelectedView,
|
|
193
|
-
{ status: "existing",
|
|
194
|
-
entityId }
|
|
195
|
-
), [collection, entityId]);
|
|
196
|
-
|
|
197
|
-
// Track whether the user has explicitly clicked a tab in this component
|
|
198
|
-
// instance. See EditViewBindingInner for full explanation.
|
|
199
|
-
const userHasChangedTab = useRef(false);
|
|
200
|
-
|
|
201
|
-
const [selectedTab, setSelectedTab] = useState<string>(() => {
|
|
202
|
-
const val = selectedTabProp ?? defaultSelectedView ?? MAIN_TAB_VALUE;
|
|
203
|
-
return val === "edit" ? MAIN_TAB_VALUE : val;
|
|
204
|
-
});
|
|
205
|
-
useEffect(() => {
|
|
206
|
-
const val = userHasChangedTab.current
|
|
207
|
-
? (selectedTabProp ?? MAIN_TAB_VALUE)
|
|
208
|
-
: (selectedTabProp ?? defaultSelectedView ?? MAIN_TAB_VALUE);
|
|
209
|
-
const target = val === "edit" ? MAIN_TAB_VALUE : val;
|
|
210
|
-
if (target !== selectedTab) {
|
|
211
|
-
setSelectedTab(target);
|
|
212
|
-
}
|
|
213
|
-
}, [selectedTabProp, defaultSelectedView]);
|
|
214
|
-
|
|
215
|
-
// `hideFromEntityViews`, not `hideFromNavigation`: the latter governs the
|
|
216
|
-
// drawer. Filtering tabs on it defeated the introspection generator, which
|
|
217
|
-
// sets `hideFromNavigation` on owned-child tables precisely *because* "every
|
|
218
|
-
// inbound foreign key renders as a tab on the parent" — so the rows it
|
|
219
|
-
// deliberately kept out of the drawer became reachable from nowhere.
|
|
220
|
-
const childViews = getAdminEntityChildViews(collection).filter(v => !v.collection.hideFromEntityViews);
|
|
221
|
-
const subcollections = childViews.map(v => v.collection);
|
|
222
|
-
const subcollectionsCount = subcollections?.length ?? 0;
|
|
223
|
-
const customViews = collection.entityViews ?? [];
|
|
224
|
-
const customViewsCount = customViews?.length ?? 0;
|
|
225
|
-
const includeJsonView = collection.includeJsonView === undefined ? true : collection.includeJsonView;
|
|
226
|
-
const includeHistoryView = Boolean(collection.history);
|
|
227
|
-
// Same split as the edit view: the strip is for destinations, the inspector
|
|
228
|
-
// for the developer tools that used to sit in front of them.
|
|
229
|
-
const hasAdditionalViews = customViewsCount > 0 || subcollectionsCount > 0;
|
|
230
|
-
|
|
231
|
-
const [inspectorTab, setInspectorTab] = useState<InspectorTab | null>(null);
|
|
232
|
-
|
|
233
|
-
const legacyInspectorTab: InspectorTab | undefined = selectedTab === JSON_TAB_VALUE
|
|
234
|
-
? "json"
|
|
235
|
-
: selectedTab === HISTORY_TAB_VALUE ? "history" : undefined;
|
|
236
|
-
useEffect(() => {
|
|
237
|
-
if (legacyInspectorTab) setInspectorTab(legacyInspectorTab);
|
|
238
|
-
}, [legacyInspectorTab]);
|
|
239
|
-
|
|
240
|
-
const {
|
|
241
|
-
resolvedEntityViews
|
|
242
|
-
} = resolvedSelectedEntityView(customViews, customizationController, undefined, canEdit);
|
|
243
|
-
|
|
244
|
-
const validTabValues = useMemo(() => {
|
|
245
|
-
const set = new Set<string>([
|
|
246
|
-
MAIN_TAB_VALUE,
|
|
247
|
-
...resolvedEntityViews.map(v => v.key),
|
|
248
|
-
...subcollections.map(s => s.slug)
|
|
249
|
-
]);
|
|
250
|
-
return set;
|
|
251
|
-
}, [resolvedEntityViews, subcollections]);
|
|
252
|
-
|
|
253
|
-
const activeTab = validTabValues.has(selectedTab) ? selectedTab : MAIN_TAB_VALUE;
|
|
254
|
-
|
|
255
|
-
const {
|
|
256
|
-
selectedEntityView
|
|
257
|
-
} = resolvedSelectedEntityView(customViews, customizationController, activeTab, canEdit);
|
|
258
|
-
|
|
259
|
-
const mainViewVisible = activeTab === MAIN_TAB_VALUE;
|
|
260
|
-
|
|
261
|
-
// Track which custom view tabs have been visited
|
|
262
|
-
const mountedTabsRef = useRef<Set<string>>(new Set());
|
|
263
|
-
if (activeTab) {
|
|
264
|
-
mountedTabsRef.current.add(activeTab);
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
// Read-only form context for custom entity views
|
|
268
|
-
const readOnlyFormContext = useMemo<FormContext<M> | undefined>(() => {
|
|
269
|
-
if (!entityId) return undefined;
|
|
270
|
-
const formexStub = createFormexStub<M>(usedEntity?.values ?? {} as M);
|
|
271
|
-
return {
|
|
272
|
-
entityId,
|
|
273
|
-
disabled: true,
|
|
274
|
-
readOnly: true,
|
|
275
|
-
openEntityMode: layout,
|
|
276
|
-
status: "existing",
|
|
277
|
-
values: usedEntity?.values ?? ({} as M),
|
|
278
|
-
setFieldValue: () => {
|
|
279
|
-
throw new Error("Cannot update values in read-only detail view");
|
|
280
|
-
},
|
|
281
|
-
save: () => {
|
|
282
|
-
throw new Error("Cannot save in read-only detail view");
|
|
283
|
-
},
|
|
284
|
-
submit: () => {
|
|
285
|
-
throw new Error("Cannot submit in read-only detail view");
|
|
286
|
-
},
|
|
287
|
-
collection,
|
|
288
|
-
path,
|
|
289
|
-
entity: usedEntity,
|
|
290
|
-
savingError: undefined,
|
|
291
|
-
formex: formexStub
|
|
292
|
-
};
|
|
293
|
-
}, [entityId, layout, usedEntity, collection, path]);
|
|
294
|
-
|
|
295
|
-
// Plugin slots
|
|
296
|
-
const formActionTopProps: PluginFormActionProps = useMemo(() => ({
|
|
297
|
-
entityId,
|
|
298
|
-
parentCollectionSlugs,
|
|
299
|
-
parentEntityIds,
|
|
300
|
-
path,
|
|
301
|
-
status: "existing",
|
|
302
|
-
collection: collection!,
|
|
303
|
-
context,
|
|
304
|
-
formContext: readOnlyFormContext as FormContext<Record<string, unknown>> | undefined,
|
|
305
|
-
openEntityMode: layout,
|
|
306
|
-
disabled: true
|
|
307
|
-
}), [entityId, parentCollectionSlugs, parentEntityIds, path, collection, context, readOnlyFormContext, layout]);
|
|
308
|
-
const pluginActionsTop = useSlot("form.actions.top", formActionTopProps);
|
|
309
|
-
|
|
310
|
-
// Resolve formView.Builder if provided
|
|
311
|
-
const formViewConfig = (collection as AdminCollection<M> & { formView?: FormViewConfig<M> }).formView;
|
|
312
|
-
const FormViewBuilder = formViewConfig?.Builder ? resolveComponentRef<EntityCustomViewParams>(formViewConfig.Builder as ComponentRef<EntityCustomViewParams>) : null;
|
|
313
|
-
|
|
314
|
-
// The heading, resolved the one way — this used to be a copy of
|
|
315
|
-
// `useEntityDisplayTitle`'s body, and the two had already drifted.
|
|
316
|
-
const title = useEntityDisplayTitle({
|
|
317
|
-
collection,
|
|
318
|
-
entity: usedEntity,
|
|
319
|
-
status: "existing"
|
|
320
|
-
});
|
|
321
|
-
|
|
322
|
-
// Non-action custom views
|
|
323
|
-
const nonActionCustomViews = useMemo(() =>
|
|
324
|
-
resolvedEntityViews.filter(e => !e.includeActions),
|
|
325
|
-
[resolvedEntityViews]
|
|
326
|
-
);
|
|
327
|
-
|
|
328
|
-
const customViewsView = customViews && nonActionCustomViews
|
|
329
|
-
.map((customView) => {
|
|
330
|
-
if (!customView) return null;
|
|
331
|
-
const Builder = resolveComponentRef<EntityCustomViewParams>(customView.Builder);
|
|
332
|
-
if (!Builder) return null;
|
|
333
|
-
if (!entityId) return null;
|
|
334
|
-
|
|
335
|
-
const isActive = activeTab === customView.key;
|
|
336
|
-
const hasBeenMounted = mountedTabsRef.current.has(customView.key);
|
|
337
|
-
if (!isActive && !hasBeenMounted) return null;
|
|
338
|
-
|
|
339
|
-
return <div
|
|
340
|
-
className={cls(defaultBorderMixin,
|
|
341
|
-
"relative flex-1 w-full h-full overflow-auto",
|
|
342
|
-
{ "hidden": !isActive }
|
|
343
|
-
)}
|
|
344
|
-
key={`custom_view_${customView.key}`}
|
|
345
|
-
role="tabpanel">
|
|
346
|
-
<ErrorBoundary>
|
|
347
|
-
<Suspense fallback={<CircularProgressCenter />}>
|
|
348
|
-
{readOnlyFormContext && <Builder
|
|
349
|
-
collection={collection}
|
|
350
|
-
parentCollectionSlugs={parentCollectionSlugs}
|
|
351
|
-
parentEntityIds={parentEntityIds}
|
|
352
|
-
entity={usedEntity}
|
|
353
|
-
modifiedValues={usedEntity?.values}
|
|
354
|
-
formContext={readOnlyFormContext as FormContext<Record<string, unknown>>}
|
|
355
|
-
/>}
|
|
356
|
-
</Suspense>
|
|
357
|
-
</ErrorBoundary>
|
|
358
|
-
</div>;
|
|
359
|
-
}).filter(Boolean);
|
|
360
|
-
|
|
361
|
-
const globalLoading = dataLoading && !usedEntity;
|
|
362
|
-
|
|
363
|
-
// Subcollection views
|
|
364
|
-
const subCollectionsViews = childViews && childViews.map(({ collection: subcollection }) => {
|
|
365
|
-
const subcollectionId = subcollection.slug;
|
|
366
|
-
const newFullPath = usedEntity ? `${path}/${usedEntity?.id}/${removeInitialAndTrailingSlashes(getCollectionDataPath(subcollection))}` : undefined;
|
|
367
|
-
|
|
368
|
-
if (activeTab !== subcollectionId) return null;
|
|
369
|
-
return (
|
|
370
|
-
<div
|
|
371
|
-
className={"relative flex-1 h-full overflow-auto w-full"}
|
|
372
|
-
key={`subcol_${subcollectionId}`}
|
|
373
|
-
role="tabpanel">
|
|
374
|
-
{globalLoading && <CircularProgressCenter />}
|
|
375
|
-
{!globalLoading &&
|
|
376
|
-
(usedEntity && newFullPath
|
|
377
|
-
? <ResolvedCollectionView
|
|
378
|
-
path={newFullPath}
|
|
379
|
-
parentCollectionSlugs={[...parentCollectionSlugs, collection.slug]}
|
|
380
|
-
parentEntityIds={[...parentEntityIds, String(usedEntity?.id)]}
|
|
381
|
-
updateUrl={false}
|
|
382
|
-
{...subcollection}
|
|
383
|
-
openEntityMode={layout} />
|
|
384
|
-
: <div className="flex items-center justify-center w-full h-full p-3">
|
|
385
|
-
<Typography variant={"label"}>
|
|
386
|
-
{/* No `?? "…"` here: `t` returns the key itself
|
|
387
|
-
when it cannot find one, never null, so the
|
|
388
|
-
fallback never ran and this rendered the raw
|
|
389
|
-
`save_entity_before_subcollections`. The key
|
|
390
|
-
exists now, in all seven locales. */}
|
|
391
|
-
{t("save_entity_before_subcollections")}
|
|
392
|
-
</Typography>
|
|
393
|
-
</div>)
|
|
394
|
-
}
|
|
395
|
-
</div>
|
|
396
|
-
);
|
|
397
|
-
}).filter(Boolean);
|
|
398
|
-
|
|
399
|
-
const onSideTabClick = useCallback((value: string) => {
|
|
400
|
-
userHasChangedTab.current = true;
|
|
401
|
-
setSelectedTab(value);
|
|
402
|
-
onTabChange?.({
|
|
403
|
-
path,
|
|
404
|
-
entityId,
|
|
405
|
-
selectedTab: value === MAIN_TAB_VALUE ? undefined : value,
|
|
406
|
-
collection
|
|
407
|
-
});
|
|
408
|
-
}, [onTabChange, path, entityId, collection]);
|
|
409
|
-
|
|
410
|
-
const propertyDetailView = () => {
|
|
411
|
-
// formView.Builder replaces the default property display. It gets the
|
|
412
|
-
// centred column the record used to be given here; the default display
|
|
413
|
-
// now lays itself out, rail included.
|
|
414
|
-
if (FormViewBuilder && usedEntity) {
|
|
415
|
-
return <div className={"@container/form flex-1 min-w-0 overflow-y-auto flex justify-center items-start"}>
|
|
416
|
-
<div className={cls(
|
|
417
|
-
// Same widths as the default form (see EntityForm).
|
|
418
|
-
"w-full max-w-3xl @7xl/form:max-w-4xl 2xl:max-w-4xl flex flex-col",
|
|
419
|
-
layout === "dialog"
|
|
420
|
-
? "pt-5 pb-12 px-6 sm:px-8"
|
|
421
|
-
: "pt-6 pb-16 px-5 sm:px-8"
|
|
422
|
-
)}>
|
|
423
|
-
<ErrorBoundary>
|
|
424
|
-
<Suspense fallback={<CircularProgressCenter />}>
|
|
425
|
-
<FormViewBuilder
|
|
426
|
-
collection={collection}
|
|
427
|
-
parentCollectionSlugs={parentCollectionSlugs}
|
|
428
|
-
parentEntityIds={parentEntityIds}
|
|
429
|
-
entity={usedEntity}
|
|
430
|
-
modifiedValues={usedEntity?.values}
|
|
431
|
-
formContext={readOnlyFormContext as FormContext<Record<string, unknown>>}
|
|
432
|
-
/>
|
|
433
|
-
</Suspense>
|
|
434
|
-
</ErrorBoundary>
|
|
435
|
-
</div>
|
|
436
|
-
</div>;
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
return (
|
|
440
|
-
<>
|
|
441
|
-
{usedEntity && <EntityViewBinding
|
|
442
|
-
entity={usedEntity}
|
|
443
|
-
collection={collection}
|
|
444
|
-
path={path}
|
|
445
|
-
asPage
|
|
446
|
-
openEntityMode={layout}
|
|
447
|
-
formContext={readOnlyFormContext}
|
|
448
|
-
/>}
|
|
449
|
-
</>
|
|
450
|
-
);
|
|
451
|
-
};
|
|
452
|
-
|
|
453
|
-
// Tabs
|
|
454
|
-
const subcollectionTabs = subcollections && subcollections.map((subcollection) => {
|
|
455
|
-
const icon = getIcon(subcollection.icon, undefined, undefined, "smallest");
|
|
456
|
-
return (
|
|
457
|
-
<Tab
|
|
458
|
-
className={cls(ENTITY_VIEW_TAB_CLASS, ENTITY_VIEW_TAB_LABEL_CLASS)}
|
|
459
|
-
value={subcollection.slug}
|
|
460
|
-
key={`entity_detail_collection_tab_${subcollection.name}`}>
|
|
461
|
-
<span className="flex items-center gap-1.5">
|
|
462
|
-
{icon}
|
|
463
|
-
{subcollection.name}
|
|
464
|
-
</span>
|
|
465
|
-
</Tab>
|
|
466
|
-
);
|
|
467
|
-
});
|
|
468
|
-
|
|
469
|
-
const customViewTabsStart = resolvedEntityViews.filter(view => view.position === "start")
|
|
470
|
-
.map((view) => {
|
|
471
|
-
const icon = getIcon(view.icon, undefined, undefined, "smallest");
|
|
472
|
-
return (
|
|
473
|
-
<Tab
|
|
474
|
-
className={cls(ENTITY_VIEW_TAB_CLASS, !view.tabComponent && ENTITY_VIEW_TAB_LABEL_CLASS)}
|
|
475
|
-
value={view.key}
|
|
476
|
-
key={`entity_detail_collection_tab_${view.name}`}>
|
|
477
|
-
{view.tabComponent ?? (
|
|
478
|
-
<span className="flex items-center gap-1.5">
|
|
479
|
-
{icon}
|
|
480
|
-
{view.name}
|
|
481
|
-
</span>
|
|
482
|
-
)}
|
|
483
|
-
</Tab>
|
|
484
|
-
);
|
|
485
|
-
});
|
|
486
|
-
const customViewTabsEnd = resolvedEntityViews.filter(view => !view.position || view.position === "end")
|
|
487
|
-
.map((view) => {
|
|
488
|
-
const icon = getIcon(view.icon, undefined, undefined, "smallest");
|
|
489
|
-
return (
|
|
490
|
-
<Tab
|
|
491
|
-
className={cls(ENTITY_VIEW_TAB_CLASS, !view.tabComponent && ENTITY_VIEW_TAB_LABEL_CLASS)}
|
|
492
|
-
value={view.key}
|
|
493
|
-
key={`entity_detail_collection_tab_${view.name}`}>
|
|
494
|
-
{view.tabComponent ?? (
|
|
495
|
-
<span className="flex items-center gap-1.5">
|
|
496
|
-
{icon}
|
|
497
|
-
{view.name}
|
|
498
|
-
</span>
|
|
499
|
-
)}
|
|
500
|
-
</Tab>
|
|
501
|
-
);
|
|
502
|
-
});
|
|
503
|
-
|
|
504
|
-
// The breadcrumb's destination, and the back arrow's when it renders. Both
|
|
505
|
-
// keep the view mode: a collection reached from one of its own records must
|
|
506
|
-
// come back as the user left it.
|
|
507
|
-
const collectionUrl = withViewMode(urlController.buildUrlCollectionPath(path));
|
|
508
|
-
|
|
509
|
-
// Full screen is the one layout with no way out of its own: a side panel and a
|
|
510
|
-
// dialog can be dismissed, and a split keeps the list beside it, but opening an
|
|
511
|
-
// entity full screen replaces the collection entirely and left browser Back as
|
|
512
|
-
// the only route back to it — which is not an affordance the page shows, and is
|
|
513
|
-
// wrong anyway once the user has moved between tabs inside the entity.
|
|
514
|
-
//
|
|
515
|
-
// Unless the list can be unfolded back beside the record: that chevron
|
|
516
|
-
// leads to the same collection while keeping the record open, so it stands
|
|
517
|
-
// alone rather than beside an arrow going almost the same place.
|
|
518
|
-
//
|
|
519
|
-
// It goes to the bar's leading edge — where a back control reads as back,
|
|
520
|
-
// and where the edit view has always put the same arrow — rather than to
|
|
521
|
-
// the trailing edge among the record's own actions.
|
|
522
|
-
const backToCollection = layout === "full_screen" && !onShowList
|
|
523
|
-
? () => navigate(collectionUrl)
|
|
524
|
-
: undefined;
|
|
525
|
-
|
|
526
|
-
const fullScreenButton = !barActions && // Not in split: the list panel beside it carries the close control,
|
|
527
|
-
// and an expand button there competes with it.
|
|
528
|
-
(layout === "side_panel" || layout === "dialog") && entityId ? (
|
|
529
|
-
<Tooltip title={"Open full screen"}>
|
|
530
|
-
<IconButton
|
|
531
|
-
size="small"
|
|
532
|
-
onClick={() => {
|
|
533
|
-
const entityUrl = urlController.buildUrlCollectionPath(`${path}/${entityId}`);
|
|
534
|
-
navigate(`${entityUrl}#full`);
|
|
535
|
-
}}
|
|
536
|
-
>
|
|
537
|
-
<Maximize2Icon size={iconSize.smallest} />
|
|
538
|
-
</IconButton>
|
|
539
|
-
</Tooltip>
|
|
540
|
-
) : null;
|
|
541
|
-
|
|
542
|
-
// Edit button — only rendered when the user has edit permissions
|
|
543
|
-
const editButton = canEdit && onEditClick ? (
|
|
544
|
-
<Button
|
|
545
|
-
variant="filled"
|
|
546
|
-
color="primary"
|
|
547
|
-
size="small"
|
|
548
|
-
startIcon={<PencilIcon size={iconSize.smallest} />}
|
|
549
|
-
onClick={onEditClick}>
|
|
550
|
-
{t("edit_entity")}
|
|
551
|
-
</Button>
|
|
552
|
-
) : null;
|
|
553
|
-
|
|
554
|
-
// Main content view. The title, the `path/id` chip and the empty band under
|
|
555
|
-
// them have moved into the identity bar, and the `w-80 2xl:w-96` rail that
|
|
556
|
-
// held a single Edit button is gone — the bar holds it now.
|
|
557
|
-
//
|
|
558
|
-
// The scroll now lives on the record's own column rather than on this row,
|
|
559
|
-
// so the metadata rail beside it stays put while the record scrolls — the
|
|
560
|
-
// same arrangement the form uses.
|
|
561
|
-
const mainView = <div
|
|
562
|
-
className={cls(
|
|
563
|
-
"flex-1 flex flex-row w-full min-h-0",
|
|
564
|
-
!mainViewVisible ? "hidden" : ""
|
|
565
|
-
)}>
|
|
566
|
-
{propertyDetailView()}
|
|
567
|
-
</div>;
|
|
568
|
-
|
|
569
|
-
let result = <div className="relative flex flex-col h-full w-full bg-white dark:bg-surface-800">
|
|
570
|
-
|
|
571
|
-
<EntityIdentityBar
|
|
572
|
-
collection={collection as AdminCollection}
|
|
573
|
-
collectionUrl={layout === "full_screen" || layout === "split" ? collectionUrl : undefined}
|
|
574
|
-
title={title}
|
|
575
|
-
entityId={entityId}
|
|
576
|
-
status={"existing"}
|
|
577
|
-
dirty={false}
|
|
578
|
-
saving={false}
|
|
579
|
-
onBack={backToCollection}
|
|
580
|
-
onClose={onCloseRequest}
|
|
581
|
-
onInspect={includeJsonView ? () => setInspectorTab("json") : undefined}
|
|
582
|
-
onViewHistory={includeHistoryView ? () => setInspectorTab("history") : undefined}
|
|
583
|
-
externalLink={usedEntity
|
|
584
|
-
? customizationController?.entityLinkBuilder?.({ entity: usedEntity })
|
|
585
|
-
: undefined}
|
|
586
|
-
leading={<>
|
|
587
|
-
{barActionsStart}
|
|
588
|
-
{/* Split view: closing the list is opening this record
|
|
589
|
-
full screen, and the control for it belongs at this
|
|
590
|
-
bar's leading edge. Full screen carries its mirror. */}
|
|
591
|
-
{layout === "split" && <SplitListCloseButton/>}
|
|
592
|
-
{layout === "full_screen" && onShowList && <SplitListShowButton onClick={onShowList}/>}
|
|
593
|
-
</>}
|
|
594
|
-
trailing={<>
|
|
595
|
-
{editButton}
|
|
596
|
-
{pluginActionsTop}
|
|
597
|
-
{fullScreenButton}
|
|
598
|
-
{barActions?.({
|
|
599
|
-
path,
|
|
600
|
-
entityId,
|
|
601
|
-
values: usedEntity?.values ?? {},
|
|
602
|
-
status: "existing",
|
|
603
|
-
dirty: false
|
|
604
|
-
})}
|
|
605
|
-
</>}
|
|
606
|
-
/>
|
|
607
|
-
|
|
608
|
-
{hasAdditionalViews && <div className={cls(
|
|
609
|
-
"h-10 shrink-0 flex items-stretch border-b px-2 min-w-0",
|
|
610
|
-
ENTITY_VIEW_TAB_BAR_CLASS,
|
|
611
|
-
defaultBorderMixin
|
|
612
|
-
)}>
|
|
613
|
-
<Tabs
|
|
614
|
-
className={"!w-full items-stretch"}
|
|
615
|
-
innerClassName={"h-full"}
|
|
616
|
-
variant={"boxy"}
|
|
617
|
-
value={activeTab}
|
|
618
|
-
onValueChange={(value) => {
|
|
619
|
-
onSideTabClick(value);
|
|
620
|
-
}}>
|
|
621
|
-
|
|
622
|
-
{/* Before the record, not after it.
|
|
623
|
-
|
|
624
|
-
`position: "start"` used to mean "first among the custom
|
|
625
|
-
views", which put it after a tab it was already after: the
|
|
626
|
-
record's own tab is drawn here unconditionally, so "start"
|
|
627
|
-
and "end" only ever ordered the custom views against each
|
|
628
|
-
other, and no collection could open with anything but the
|
|
629
|
-
form on the left.
|
|
630
|
-
|
|
631
|
-
A cover — a read-only summary of the record, the thing an
|
|
632
|
-
operator opens a row to see — belongs in front of the form
|
|
633
|
-
that edits it. That is what `defaultSelectedView` already
|
|
634
|
-
allowed, and the strip contradicted it by drawing the
|
|
635
|
-
selected tab second. Views that say nothing still land after
|
|
636
|
-
the record, so nothing moves for a collection that never
|
|
637
|
-
asked. */}
|
|
638
|
-
{customViewTabsStart}
|
|
639
|
-
|
|
640
|
-
<Tab value={MAIN_TAB_VALUE}
|
|
641
|
-
className={cls(ENTITY_VIEW_TAB_CLASS, ENTITY_VIEW_TAB_LABEL_CLASS)}>
|
|
642
|
-
<span className="flex items-center gap-1.5">
|
|
643
|
-
{getIcon(collection.icon, undefined, undefined, "smallest")}
|
|
644
|
-
{collection.singularName ?? collection.name}
|
|
645
|
-
</span>
|
|
646
|
-
</Tab>
|
|
647
|
-
|
|
648
|
-
{customViewTabsEnd}
|
|
649
|
-
{subcollectionTabs}
|
|
650
|
-
</Tabs>
|
|
651
|
-
</div>}
|
|
652
|
-
|
|
653
|
-
{/* See EditViewBinding: the inspector docks beside the record rather
|
|
654
|
-
than over it, so the record stays readable and scrollable. */}
|
|
655
|
-
<div className={"flex-1 min-h-0 flex"}>
|
|
656
|
-
|
|
657
|
-
<div className={"flex-1 min-w-0 flex flex-col"}>
|
|
658
|
-
{globalLoading
|
|
659
|
-
? <DetailViewSkeleton collection={collection} />
|
|
660
|
-
: mainView}
|
|
661
|
-
|
|
662
|
-
{customViewsView}
|
|
663
|
-
{subCollectionsViews}
|
|
664
|
-
</div>
|
|
665
|
-
|
|
666
|
-
<EntityInspector
|
|
667
|
-
tab={inspectorTab}
|
|
668
|
-
onTabChange={setInspectorTab}
|
|
669
|
-
onClose={() => setInspectorTab(null)}
|
|
670
|
-
collection={collection as AdminCollection}
|
|
671
|
-
entity={usedEntity as Entity<Record<string, unknown>> | undefined}
|
|
672
|
-
formContext={readOnlyFormContext as FormContext<Record<string, unknown>> | undefined}
|
|
673
|
-
values={usedEntity?.values}
|
|
674
|
-
includeHistory={includeHistoryView}/>
|
|
675
|
-
</div>
|
|
676
|
-
|
|
677
|
-
</div>;
|
|
678
|
-
|
|
679
|
-
if (plugins && plugins.length > 0) {
|
|
680
|
-
result = (
|
|
681
|
-
<PluginProviderStack
|
|
682
|
-
plugins={plugins}
|
|
683
|
-
scope="form"
|
|
684
|
-
scopeProps={{
|
|
685
|
-
status: "existing",
|
|
686
|
-
path,
|
|
687
|
-
collection,
|
|
688
|
-
entity: usedEntity,
|
|
689
|
-
context,
|
|
690
|
-
formContext: readOnlyFormContext
|
|
691
|
-
}}>
|
|
692
|
-
{result}
|
|
693
|
-
</PluginProviderStack>
|
|
694
|
-
);
|
|
695
|
-
}
|
|
696
|
-
|
|
697
|
-
return result;
|
|
698
|
-
}
|
|
699
|
-
|
|
700
|
-
function DetailViewSkeleton({ collection }: { collection: AdminCollection<Record<string, unknown>> }) {
|
|
701
|
-
return (
|
|
702
|
-
<div className="flex-1 flex flex-row w-full overflow-y-auto justify-center">
|
|
703
|
-
<div className="relative flex flex-row max-w-4xl lg:max-w-3xl xl:max-w-4xl 2xl:max-w-6xl w-full h-fit">
|
|
704
|
-
<div className="flex flex-col w-full pt-12 pb-16 px-4 sm:px-8 md:px-10">
|
|
705
|
-
<div className="w-full flex flex-col items-start my-4 lg:my-6">
|
|
706
|
-
<div className={`py-1 my-4 w-2/3 ${collection.hideIdFromForm ? "mb-6" : ""}`}>
|
|
707
|
-
<Skeleton height={28} className="w-full rounded-md" />
|
|
708
|
-
</div>
|
|
709
|
-
<Skeleton height={32} className="w-full rounded-md" />
|
|
710
|
-
</div>
|
|
711
|
-
<div className="mt-12 flex flex-col gap-8">
|
|
712
|
-
<div className="flex flex-wrap gap-x-4 w-full space-y-8">
|
|
713
|
-
<div className="relative w-full">
|
|
714
|
-
<Skeleton height={60} className="w-full rounded-md" />
|
|
715
|
-
</div>
|
|
716
|
-
<div className="relative w-full">
|
|
717
|
-
<Skeleton height={60} className="w-full rounded-md" />
|
|
718
|
-
</div>
|
|
719
|
-
<div className="relative w-full">
|
|
720
|
-
<Skeleton height={60} className="w-full rounded-md" />
|
|
721
|
-
</div>
|
|
722
|
-
<div className="relative w-full">
|
|
723
|
-
<Skeleton height={60} className="w-full rounded-md" />
|
|
724
|
-
</div>
|
|
725
|
-
</div>
|
|
726
|
-
</div>
|
|
727
|
-
</div>
|
|
728
|
-
</div>
|
|
729
|
-
</div>
|
|
730
|
-
);
|
|
731
|
-
}
|