@strapi/content-manager 0.0.0-experimental.c23f51fc41b3ef5de081f427d07e87af93cdcb2c → 0.0.0-experimental.c2b08ee20b017fc174cccf35c56c39438b0237b0
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/dist/admin/components/ConfigurationForm/Fields.js +300 -204
- package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/Fields.mjs +304 -209
- package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
- package/dist/admin/components/DragPreviews/RelationDragPreview.js +1 -1
- package/dist/admin/components/DragPreviews/RelationDragPreview.js.map +1 -1
- package/dist/admin/components/DragPreviews/RelationDragPreview.mjs +1 -1
- package/dist/admin/components/DragPreviews/RelationDragPreview.mjs.map +1 -1
- package/dist/admin/components/LeftMenu.js +34 -30
- package/dist/admin/components/LeftMenu.js.map +1 -1
- package/dist/admin/components/LeftMenu.mjs +36 -32
- package/dist/admin/components/LeftMenu.mjs.map +1 -1
- package/dist/admin/components/Widgets.js +414 -0
- package/dist/admin/components/Widgets.js.map +1 -0
- package/dist/admin/components/Widgets.mjs +391 -0
- package/dist/admin/components/Widgets.mjs.map +1 -0
- package/dist/admin/content-manager.js.map +1 -1
- package/dist/admin/content-manager.mjs.map +1 -1
- package/dist/admin/features/DocumentRBAC.js +7 -6
- package/dist/admin/features/DocumentRBAC.js.map +1 -1
- package/dist/admin/features/DocumentRBAC.mjs +7 -6
- package/dist/admin/features/DocumentRBAC.mjs.map +1 -1
- package/dist/admin/history/components/VersionContent.js +24 -3
- package/dist/admin/history/components/VersionContent.js.map +1 -1
- package/dist/admin/history/components/VersionContent.mjs +25 -4
- package/dist/admin/history/components/VersionContent.mjs.map +1 -1
- package/dist/admin/history/components/VersionHeader.js +6 -0
- package/dist/admin/history/components/VersionHeader.js.map +1 -1
- package/dist/admin/history/components/VersionHeader.mjs +7 -1
- package/dist/admin/history/components/VersionHeader.mjs.map +1 -1
- package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
- package/dist/admin/history/components/VersionInputRenderer.mjs.map +1 -1
- package/dist/admin/history/pages/History.js.map +1 -1
- package/dist/admin/history/pages/History.mjs.map +1 -1
- package/dist/admin/hooks/useDocumentActions.js +30 -6
- package/dist/admin/hooks/useDocumentActions.js.map +1 -1
- package/dist/admin/hooks/useDocumentActions.mjs +30 -6
- package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
- package/dist/admin/hooks/useDocumentContext.js +57 -0
- package/dist/admin/hooks/useDocumentContext.js.map +1 -0
- package/dist/admin/hooks/useDocumentContext.mjs +36 -0
- package/dist/admin/hooks/useDocumentContext.mjs.map +1 -0
- package/dist/admin/index.js +81 -5
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +80 -3
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.js +102 -75
- package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.mjs +104 -77
- package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.js +321 -112
- package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.mjs +328 -119
- package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentStatus.js +1 -2
- package/dist/admin/pages/EditView/components/DocumentStatus.js.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentStatus.mjs +1 -2
- package/dist/admin/pages/EditView/components/DocumentStatus.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +12 -15
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +12 -15
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +61 -26
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs +63 -28
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +21 -35
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs +21 -35
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +46 -95
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +48 -78
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js +2 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs +2 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +16 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +17 -3
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +20 -5
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +21 -6
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +17 -8
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +17 -8
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +23 -6
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +26 -9
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +2 -2
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +2 -2
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +622 -0
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +598 -0
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/{Relations.js → Relations/Relations.js} +211 -79
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/{Relations.mjs → Relations/Relations.mjs} +214 -82
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/UID.js +11 -9
- package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/UID.mjs +11 -9
- package/dist/admin/pages/EditView/components/FormInputs/UID.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js +50 -97
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs +51 -79
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.js +86 -118
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.mjs +86 -118
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.js +63 -36
- package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.mjs +63 -36
- package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js +29 -9
- package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.mjs +12 -11
- package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
- package/dist/admin/pages/EditView/utils/data.js +103 -0
- package/dist/admin/pages/EditView/utils/data.js.map +1 -1
- package/dist/admin/pages/EditView/utils/data.mjs +103 -1
- package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.js +227 -132
- package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.mjs +229 -134
- package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js +2 -1
- package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs +2 -1
- package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.js +4 -1
- package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.mjs +4 -1
- package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/TableActions.js +13 -3
- package/dist/admin/pages/ListView/components/TableActions.js.map +1 -1
- package/dist/admin/pages/ListView/components/TableActions.mjs +13 -3
- package/dist/admin/pages/ListView/components/TableActions.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/TableCells/Relations.js +0 -1
- package/dist/admin/pages/ListView/components/TableCells/Relations.js.map +1 -1
- package/dist/admin/pages/ListView/components/TableCells/Relations.mjs +0 -1
- package/dist/admin/pages/ListView/components/TableCells/Relations.mjs.map +1 -1
- package/dist/admin/preview/components/PreviewHeader.js +4 -79
- package/dist/admin/preview/components/PreviewHeader.js.map +1 -1
- package/dist/admin/preview/components/PreviewHeader.mjs +6 -80
- package/dist/admin/preview/components/PreviewHeader.mjs.map +1 -1
- package/dist/admin/preview/components/PreviewSidePanel.js +31 -4
- package/dist/admin/preview/components/PreviewSidePanel.js.map +1 -1
- package/dist/admin/preview/components/PreviewSidePanel.mjs +32 -5
- package/dist/admin/preview/components/PreviewSidePanel.mjs.map +1 -1
- package/dist/admin/preview/pages/Preview.js +138 -72
- package/dist/admin/preview/pages/Preview.js.map +1 -1
- package/dist/admin/preview/pages/Preview.mjs +140 -74
- package/dist/admin/preview/pages/Preview.mjs.map +1 -1
- package/dist/admin/services/api.js +3 -1
- package/dist/admin/services/api.js.map +1 -1
- package/dist/admin/services/api.mjs +3 -1
- package/dist/admin/services/api.mjs.map +1 -1
- package/dist/admin/services/documents.js +48 -16
- package/dist/admin/services/documents.js.map +1 -1
- package/dist/admin/services/documents.mjs +48 -16
- package/dist/admin/services/documents.mjs.map +1 -1
- package/dist/admin/services/homepage.js +39 -0
- package/dist/admin/services/homepage.js.map +1 -0
- package/dist/admin/services/homepage.mjs +36 -0
- package/dist/admin/services/homepage.mjs.map +1 -0
- package/dist/admin/src/components/ConfigurationForm/Fields.d.ts +6 -4
- package/dist/admin/src/components/Widgets.d.ts +4 -0
- package/dist/admin/src/content-manager.d.ts +0 -1
- package/dist/admin/src/exports.d.ts +1 -0
- package/dist/admin/src/features/DocumentRBAC.d.ts +4 -3
- package/dist/admin/src/history/pages/History.d.ts +1 -1
- package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
- package/dist/admin/src/hooks/useDocumentActions.d.ts +2 -1
- package/dist/admin/src/hooks/useDocumentContext.d.ts +30 -0
- package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.d.ts +2 -2
- package/dist/admin/src/pages/EditView/components/FormInputs/ComponentContext.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/Field.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.d.ts +74 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/{Relations.d.ts → Relations/Relations.d.ts} +9 -2
- package/dist/admin/src/pages/EditView/components/FormInputs/UID.d.ts +1 -0
- package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +13 -9
- package/dist/admin/src/pages/EditView/components/InputRenderer.d.ts +7 -4
- package/dist/admin/src/pages/EditView/utils/data.d.ts +19 -1
- package/dist/admin/src/preview/components/PreviewHeader.d.ts +1 -2
- package/dist/admin/src/preview/pages/Preview.d.ts +2 -3
- package/dist/admin/src/preview/services/preview.d.ts +1 -1
- package/dist/admin/src/services/api.d.ts +1 -1
- package/dist/admin/src/services/components.d.ts +2 -2
- package/dist/admin/src/services/contentTypes.d.ts +3 -3
- package/dist/admin/src/services/documents.d.ts +23 -17
- package/dist/admin/src/services/homepage.d.ts +9 -0
- package/dist/admin/src/services/init.d.ts +1 -1
- package/dist/admin/src/services/relations.d.ts +2 -2
- package/dist/admin/src/services/uid.d.ts +3 -3
- package/dist/admin/src/utils/validation.d.ts +1 -0
- package/dist/admin/translations/en.json.js +12 -1
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +12 -1
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/es.json.js +5 -2
- package/dist/admin/translations/es.json.js.map +1 -1
- package/dist/admin/translations/es.json.mjs +5 -2
- package/dist/admin/translations/es.json.mjs.map +1 -1
- package/dist/admin/translations/fr.json.js +10 -2
- package/dist/admin/translations/fr.json.js.map +1 -1
- package/dist/admin/translations/fr.json.mjs +10 -2
- package/dist/admin/translations/fr.json.mjs.map +1 -1
- package/dist/admin/translations/ru.json.js +235 -226
- package/dist/admin/translations/ru.json.js.map +1 -1
- package/dist/admin/translations/ru.json.mjs +230 -226
- package/dist/admin/translations/ru.json.mjs.map +1 -1
- package/dist/admin/translations/zh-Hans.json.js +2 -1
- package/dist/admin/translations/zh-Hans.json.js.map +1 -1
- package/dist/admin/translations/zh-Hans.json.mjs +2 -1
- package/dist/admin/translations/zh-Hans.json.mjs.map +1 -1
- package/dist/admin/utils/validation.js +17 -6
- package/dist/admin/utils/validation.js.map +1 -1
- package/dist/admin/utils/validation.mjs +17 -6
- package/dist/admin/utils/validation.mjs.map +1 -1
- package/dist/server/controllers/content-types.js +11 -1
- package/dist/server/controllers/content-types.js.map +1 -1
- package/dist/server/controllers/content-types.mjs +11 -1
- package/dist/server/controllers/content-types.mjs.map +1 -1
- package/dist/server/controllers/index.js +3 -1
- package/dist/server/controllers/index.js.map +1 -1
- package/dist/server/controllers/index.mjs +3 -1
- package/dist/server/controllers/index.mjs.map +1 -1
- package/dist/server/controllers/relations.js +2 -2
- package/dist/server/controllers/relations.js.map +1 -1
- package/dist/server/controllers/relations.mjs +2 -2
- package/dist/server/controllers/relations.mjs.map +1 -1
- package/dist/server/controllers/validation/index.js +14 -2
- package/dist/server/controllers/validation/index.js.map +1 -1
- package/dist/server/controllers/validation/index.mjs +14 -2
- package/dist/server/controllers/validation/index.mjs.map +1 -1
- package/dist/server/history/services/lifecycles.js +3 -0
- package/dist/server/history/services/lifecycles.js.map +1 -1
- package/dist/server/history/services/lifecycles.mjs +3 -0
- package/dist/server/history/services/lifecycles.mjs.map +1 -1
- package/dist/server/homepage/controllers/homepage.js +62 -0
- package/dist/server/homepage/controllers/homepage.js.map +1 -0
- package/dist/server/homepage/controllers/homepage.mjs +41 -0
- package/dist/server/homepage/controllers/homepage.mjs.map +1 -0
- package/dist/server/homepage/controllers/index.js +10 -0
- package/dist/server/homepage/controllers/index.js.map +1 -0
- package/dist/server/homepage/controllers/index.mjs +8 -0
- package/dist/server/homepage/controllers/index.mjs.map +1 -0
- package/dist/server/homepage/index.js +14 -0
- package/dist/server/homepage/index.js.map +1 -0
- package/dist/server/homepage/index.mjs +12 -0
- package/dist/server/homepage/index.mjs.map +1 -0
- package/dist/server/homepage/routes/homepage.js +36 -0
- package/dist/server/homepage/routes/homepage.js.map +1 -0
- package/dist/server/homepage/routes/homepage.mjs +34 -0
- package/dist/server/homepage/routes/homepage.mjs.map +1 -0
- package/dist/server/homepage/routes/index.js +13 -0
- package/dist/server/homepage/routes/index.js.map +1 -0
- package/dist/server/homepage/routes/index.mjs +11 -0
- package/dist/server/homepage/routes/index.mjs.map +1 -0
- package/dist/server/homepage/services/homepage.js +197 -0
- package/dist/server/homepage/services/homepage.js.map +1 -0
- package/dist/server/homepage/services/homepage.mjs +195 -0
- package/dist/server/homepage/services/homepage.mjs.map +1 -0
- package/dist/server/homepage/services/index.js +10 -0
- package/dist/server/homepage/services/index.js.map +1 -0
- package/dist/server/homepage/services/index.mjs +8 -0
- package/dist/server/homepage/services/index.mjs.map +1 -0
- package/dist/server/preview/services/preview-config.js +5 -1
- package/dist/server/preview/services/preview-config.js.map +1 -1
- package/dist/server/preview/services/preview-config.mjs +5 -1
- package/dist/server/preview/services/preview-config.mjs.map +1 -1
- package/dist/server/preview/services/preview.js +4 -1
- package/dist/server/preview/services/preview.js.map +1 -1
- package/dist/server/preview/services/preview.mjs +4 -1
- package/dist/server/preview/services/preview.mjs.map +1 -1
- package/dist/server/routes/index.js +3 -1
- package/dist/server/routes/index.js.map +1 -1
- package/dist/server/routes/index.mjs +3 -1
- package/dist/server/routes/index.mjs.map +1 -1
- package/dist/server/services/data-mapper.js +4 -1
- package/dist/server/services/data-mapper.js.map +1 -1
- package/dist/server/services/data-mapper.mjs +4 -1
- package/dist/server/services/data-mapper.mjs.map +1 -1
- package/dist/server/services/document-manager.js +8 -1
- package/dist/server/services/document-manager.js.map +1 -1
- package/dist/server/services/document-manager.mjs +8 -1
- package/dist/server/services/document-manager.mjs.map +1 -1
- package/dist/server/services/document-metadata.js +3 -1
- package/dist/server/services/document-metadata.js.map +1 -1
- package/dist/server/services/document-metadata.mjs +3 -1
- package/dist/server/services/document-metadata.mjs.map +1 -1
- package/dist/server/services/index.js +3 -1
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/services/index.mjs +3 -1
- package/dist/server/services/index.mjs.map +1 -1
- package/dist/server/services/utils/configuration/attributes.js +1 -1
- package/dist/server/services/utils/configuration/attributes.js.map +1 -1
- package/dist/server/services/utils/configuration/attributes.mjs +1 -1
- package/dist/server/services/utils/configuration/attributes.mjs.map +1 -1
- package/dist/server/services/utils/configuration/layouts.js +1 -1
- package/dist/server/services/utils/configuration/layouts.js.map +1 -1
- package/dist/server/services/utils/configuration/layouts.mjs +1 -1
- package/dist/server/services/utils/configuration/layouts.mjs.map +1 -1
- package/dist/server/services/utils/configuration/metadatas.js +8 -0
- package/dist/server/services/utils/configuration/metadatas.js.map +1 -1
- package/dist/server/services/utils/configuration/metadatas.mjs +8 -0
- package/dist/server/services/utils/configuration/metadatas.mjs.map +1 -1
- package/dist/server/services/utils/populate.js +11 -0
- package/dist/server/services/utils/populate.js.map +1 -1
- package/dist/server/services/utils/populate.mjs +11 -0
- package/dist/server/services/utils/populate.mjs.map +1 -1
- package/dist/server/src/controllers/content-types.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/index.d.ts +6 -1
- package/dist/server/src/controllers/validation/index.d.ts.map +1 -1
- package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
- package/dist/server/src/homepage/controllers/homepage.d.ts +8 -0
- package/dist/server/src/homepage/controllers/homepage.d.ts.map +1 -0
- package/dist/server/src/homepage/controllers/index.d.ts +2 -0
- package/dist/server/src/homepage/controllers/index.d.ts.map +1 -0
- package/dist/server/src/homepage/index.d.ts +23 -0
- package/dist/server/src/homepage/index.d.ts.map +1 -0
- package/dist/server/src/homepage/routes/homepage.d.ts +4 -0
- package/dist/server/src/homepage/routes/homepage.d.ts.map +1 -0
- package/dist/server/src/homepage/routes/index.d.ts +8 -0
- package/dist/server/src/homepage/routes/index.d.ts.map +1 -0
- package/dist/server/src/homepage/services/homepage.d.ts +14 -0
- package/dist/server/src/homepage/services/homepage.d.ts.map +1 -0
- package/dist/server/src/homepage/services/index.d.ts +16 -0
- package/dist/server/src/homepage/services/index.d.ts.map +1 -0
- package/dist/server/src/index.d.ts +15 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/preview/services/index.d.ts +1 -0
- package/dist/server/src/preview/services/index.d.ts.map +1 -1
- package/dist/server/src/preview/services/preview-config.d.ts +1 -0
- package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
- package/dist/server/src/preview/services/preview.d.ts.map +1 -1
- package/dist/server/src/preview/utils.d.ts +1 -0
- package/dist/server/src/preview/utils.d.ts.map +1 -1
- package/dist/server/src/routes/index.d.ts +1 -0
- package/dist/server/src/routes/index.d.ts.map +1 -1
- package/dist/server/src/services/data-mapper.d.ts +1 -0
- package/dist/server/src/services/data-mapper.d.ts.map +1 -1
- package/dist/server/src/services/document-manager.d.ts.map +1 -1
- package/dist/server/src/services/document-metadata.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +14 -0
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/utils/configuration/metadatas.d.ts.map +1 -1
- package/dist/server/src/services/utils/populate.d.ts.map +1 -1
- package/dist/shared/contracts/collection-types.d.ts +0 -1
- package/dist/shared/contracts/collection-types.d.ts.map +1 -1
- package/dist/shared/contracts/homepage.d.ts +38 -0
- package/dist/shared/contracts/homepage.d.ts.map +1 -0
- package/package.json +13 -10
- package/dist/admin/pages/EditView/components/FormInputs/Relations.js.map +0 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations.mjs.map +0 -1
- package/dist/admin/preview/components/PreviewContent.js +0 -25
- package/dist/admin/preview/components/PreviewContent.js.map +0 -1
- package/dist/admin/preview/components/PreviewContent.mjs +0 -23
- package/dist/admin/preview/components/PreviewContent.mjs.map +0 -1
- package/dist/admin/src/preview/components/PreviewContent.d.ts +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentRBAC.js","sources":["../../../admin/src/features/DocumentRBAC.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n useRBAC,\n useAuth,\n type Permission,\n createContext,\n Page,\n useQueryParams,\n} from '@strapi/admin/strapi-admin';\nimport { useParams } from 'react-router-dom';\n\nimport type { Schema } from '@strapi/types';\n\n/**\n * The boolean values indicate the global actions a user can perform on the document.\n * The `string[]` values tell us specifically which fields the actions can be performed on,\n * for example, if the `canReadFields` array is empty, than no fields can be read by the user.\n * This can happen even if the user can read the document.\n */\ninterface DocumentRBACContextValue {\n canCreate?: boolean;\n canCreateFields: string[];\n canDelete?: boolean;\n canPublish?: boolean;\n canRead?: boolean;\n canReadFields: string[];\n canUpdate?: boolean;\n canUpdateFields: string[];\n canUserAction: (\n fieldName: string,\n fieldsUserCanAction: string[],\n fieldType: Schema.Attribute.Kind\n ) => boolean;\n isLoading: boolean;\n}\n\nconst [DocumentRBACProvider, useDocumentRBAC] = createContext<DocumentRBACContextValue>(\n 'DocumentRBAC',\n {\n canCreate: false,\n canCreateFields: [],\n canDelete: false,\n canPublish: false,\n canRead: false,\n canReadFields: [],\n canUpdate: false,\n canUpdateFields: [],\n canUserAction: () => false,\n isLoading: false,\n }\n);\n\ninterface DocumentRBACProps {\n children: React.ReactNode;\n permissions: Permission[] | null;\n}\n\n/**\n * @internal This component is not meant to be used outside of the Content Manager plugin.\n * It depends on knowing the slug/model of the content-type using the params of the URL.\n * If you do use the hook outside of the context, we default to `false` for all actions.\n *\n * It then creates an list of `can{Action}` that are passed to the context for consumption\n * within the app to enforce RBAC.\n */\nconst DocumentRBAC = ({ children, permissions }: DocumentRBACProps) => {\n const { slug } = useParams<{ slug: string }>();\n\n if (!slug) {\n throw new Error('Cannot find the slug param in the URL');\n }\n const [{ rawQuery }] = useQueryParams<{ plugins?: { i18n?: { locale?: string } } }>();\n\n const userPermissions = useAuth('DocumentRBAC', (state) => state.permissions);\n\n const contentTypePermissions = React.useMemo(() => {\n const contentTypePermissions = userPermissions.filter(\n (permission) => permission.subject === slug\n );\n return contentTypePermissions.reduce<Record<string, Permission[]>>((acc, permission) => {\n const [action] = permission.action.split('.').slice(-1);\n return { ...acc, [action]: [permission] };\n }, {});\n }, [slug, userPermissions]);\n\n const { isLoading, allowedActions } = useRBAC(\n contentTypePermissions,\n permissions ?? undefined,\n // TODO: useRBAC context should be typed and built differently\n // We are passing raw query as context to the hook so that it can\n // rely on the locale provided from DocumentRBAC for its permission calculations.\n rawQuery\n );\n\n const canCreateFields =\n !isLoading && allowedActions.canCreate\n ? extractAndDedupeFields(contentTypePermissions.create)\n : [];\n\n const canReadFields =\n !isLoading && allowedActions.canRead ? extractAndDedupeFields(contentTypePermissions.read) : [];\n\n const canUpdateFields =\n !isLoading && allowedActions.canUpdate\n ? extractAndDedupeFields(contentTypePermissions.update)\n : [];\n\n /**\n * @description Checks if the user can perform an action on a field based on the field names\n * provided as the second argument.\n */\n const canUserAction: DocumentRBACContextValue['canUserAction'] = React.useCallback(\n (fieldName, fieldsUserCanAction, fieldType) => {\n const name = removeNumericalStrings(fieldName.split('.'));\n\n const componentFieldNames = fieldsUserCanAction\n // filter out fields that aren't components (components are dot separated)\n .filter((field) => field.split('.').length > 1);\n\n if (fieldType === 'component') {\n // check if the field name is within any of those arrays\n return componentFieldNames.some((field) => {\n return field.includes(name.join('.'));\n });\n }\n\n /**\n * The field is within a component.\n */\n if (name.length > 1) {\n return componentFieldNames.includes(name.join('.'));\n }\n\n /**\n * just a regular field\n */\n return fieldsUserCanAction.includes(fieldName);\n },\n []\n );\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n return (\n <DocumentRBACProvider\n isLoading={isLoading}\n canCreateFields={canCreateFields}\n canReadFields={canReadFields}\n canUpdateFields={canUpdateFields}\n canUserAction={canUserAction}\n {...allowedActions}\n >\n {children}\n </DocumentRBACProvider>\n );\n};\n\n/**\n * @internal it's really small, but it's used three times in a row and DRY for something this straight forward.\n */\nconst extractAndDedupeFields = (permissions: Permission[] = []) =>\n permissions\n .flatMap((permission) => permission.properties?.fields)\n .filter(\n (field, index, arr): field is string =>\n arr.indexOf(field) === index && typeof field === 'string'\n );\n\n/**\n * @internal removes numerical strings from arrays.\n * @example\n * ```ts\n * const name = 'a.0.b';\n * const res = removeNumericalStrings(name.split('.'));\n * console.log(res); // ['a', 'b']\n * ```\n */\nconst removeNumericalStrings = (arr: string[]) => arr.filter((item) => isNaN(Number(item)));\n\nexport { DocumentRBAC, useDocumentRBAC, DocumentRBACContextValue, DocumentRBACProps };\n"],"names":["DocumentRBACProvider","useDocumentRBAC","createContext","canCreate","canCreateFields","canDelete","canPublish","canRead","canReadFields","canUpdate","canUpdateFields","canUserAction","isLoading","DocumentRBAC","children","permissions","slug","useParams","Error","rawQuery","useQueryParams","userPermissions","useAuth","state","contentTypePermissions","React","useMemo","filter","permission","subject","reduce","acc","action","split","slice","allowedActions","useRBAC","undefined","extractAndDedupeFields","create","read","update","useCallback","fieldName","fieldsUserCanAction","fieldType","name","removeNumericalStrings","componentFieldNames","field","length","some","includes","join","_jsx","Page","Loading","flatMap","properties","fields","index","arr","indexOf","item","isNaN","Number"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DocumentRBAC.js","sources":["../../../admin/src/features/DocumentRBAC.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n useRBAC,\n useAuth,\n type Permission,\n createContext,\n Page,\n useQueryParams,\n} from '@strapi/admin/strapi-admin';\nimport { useParams } from 'react-router-dom';\n\nimport type { Schema } from '@strapi/types';\n\n/**\n * The boolean values indicate the global actions a user can perform on the document.\n * The `string[]` values tell us specifically which fields the actions can be performed on,\n * for example, if the `canReadFields` array is empty, than no fields can be read by the user.\n * This can happen even if the user can read the document.\n */\ninterface DocumentRBACContextValue {\n canCreate?: boolean;\n canCreateFields: string[];\n canDelete?: boolean;\n canPublish?: boolean;\n canRead?: boolean;\n canReadFields: string[];\n canUpdate?: boolean;\n canUpdateFields: string[];\n canUserAction: (\n fieldName: string,\n fieldsUserCanAction: string[],\n fieldType: Schema.Attribute.Kind\n ) => boolean;\n isLoading: boolean;\n}\n\nconst [DocumentRBACProvider, useDocumentRBAC] = createContext<DocumentRBACContextValue>(\n 'DocumentRBAC',\n {\n canCreate: false,\n canCreateFields: [],\n canDelete: false,\n canPublish: false,\n canRead: false,\n canReadFields: [],\n canUpdate: false,\n canUpdateFields: [],\n canUserAction: () => false,\n isLoading: false,\n }\n);\n\ninterface DocumentRBACProps {\n children: React.ReactNode;\n permissions: Permission[] | null;\n model?: string;\n}\n\n/**\n * @internal This component is not meant to be used outside of the Content Manager plugin.\n * It depends on knowing the slug/model of the content-type using the params of the URL or the model if it is passed as arg.\n * If you do use the hook outside of the context, we default to `false` for all actions.\n *\n * It then creates an list of `can{Action}` that are passed to the context for consumption\n * within the app to enforce RBAC.\n */\nconst DocumentRBAC = ({ children, permissions, model }: DocumentRBACProps) => {\n const { slug } = useParams<{ slug: string }>();\n\n if (!slug && !model) {\n throw new Error('Cannot find the slug param in the URL or the model prop is not provided.');\n }\n\n const contentTypeUid = model ?? slug;\n\n const [{ rawQuery }] = useQueryParams<{ plugins?: { i18n?: { locale?: string } } }>();\n\n const userPermissions = useAuth('DocumentRBAC', (state) => state.permissions);\n\n const contentTypePermissions = React.useMemo(() => {\n const contentTypePermissions = userPermissions.filter(\n (permission) => permission.subject === contentTypeUid\n );\n return contentTypePermissions.reduce<Record<string, Permission[]>>((acc, permission) => {\n const [action] = permission.action.split('.').slice(-1);\n return { ...acc, [action]: [permission] };\n }, {});\n }, [contentTypeUid, userPermissions]);\n\n const { isLoading, allowedActions } = useRBAC(\n contentTypePermissions,\n permissions ?? undefined,\n // TODO: useRBAC context should be typed and built differently\n // We are passing raw query as context to the hook so that it can\n // rely on the locale provided from DocumentRBAC for its permission calculations.\n rawQuery\n );\n\n const canCreateFields =\n !isLoading && allowedActions.canCreate\n ? extractAndDedupeFields(contentTypePermissions.create)\n : [];\n\n const canReadFields =\n !isLoading && allowedActions.canRead ? extractAndDedupeFields(contentTypePermissions.read) : [];\n\n const canUpdateFields =\n !isLoading && allowedActions.canUpdate\n ? extractAndDedupeFields(contentTypePermissions.update)\n : [];\n\n /**\n * @description Checks if the user can perform an action on a field based on the field names\n * provided as the second argument.\n */\n const canUserAction: DocumentRBACContextValue['canUserAction'] = React.useCallback(\n (fieldName, fieldsUserCanAction, fieldType) => {\n const name = removeNumericalStrings(fieldName.split('.'));\n\n const componentFieldNames = fieldsUserCanAction\n // filter out fields that aren't components (components are dot separated)\n .filter((field) => field.split('.').length > 1);\n\n if (fieldType === 'component') {\n // check if the field name is within any of those arrays\n return componentFieldNames.some((field) => {\n return field.includes(name.join('.'));\n });\n }\n\n /**\n * The field is within a component.\n */\n if (name.length > 1) {\n return componentFieldNames.includes(name.join('.'));\n }\n\n /**\n * just a regular field\n */\n return fieldsUserCanAction.includes(fieldName);\n },\n []\n );\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n return (\n <DocumentRBACProvider\n isLoading={isLoading}\n canCreateFields={canCreateFields}\n canReadFields={canReadFields}\n canUpdateFields={canUpdateFields}\n canUserAction={canUserAction}\n {...allowedActions}\n >\n {children}\n </DocumentRBACProvider>\n );\n};\n\n/**\n * @internal it's really small, but it's used three times in a row and DRY for something this straight forward.\n */\nconst extractAndDedupeFields = (permissions: Permission[] = []) =>\n permissions\n .flatMap((permission) => permission.properties?.fields)\n .filter(\n (field, index, arr): field is string =>\n arr.indexOf(field) === index && typeof field === 'string'\n );\n\n/**\n * @internal removes numerical strings from arrays.\n * @example\n * ```ts\n * const name = 'a.0.b';\n * const res = removeNumericalStrings(name.split('.'));\n * console.log(res); // ['a', 'b']\n * ```\n */\nconst removeNumericalStrings = (arr: string[]) => arr.filter((item) => isNaN(Number(item)));\n\nexport { DocumentRBAC, useDocumentRBAC, DocumentRBACContextValue, DocumentRBACProps };\n"],"names":["DocumentRBACProvider","useDocumentRBAC","createContext","canCreate","canCreateFields","canDelete","canPublish","canRead","canReadFields","canUpdate","canUpdateFields","canUserAction","isLoading","DocumentRBAC","children","permissions","model","slug","useParams","Error","contentTypeUid","rawQuery","useQueryParams","userPermissions","useAuth","state","contentTypePermissions","React","useMemo","filter","permission","subject","reduce","acc","action","split","slice","allowedActions","useRBAC","undefined","extractAndDedupeFields","create","read","update","useCallback","fieldName","fieldsUserCanAction","fieldType","name","removeNumericalStrings","componentFieldNames","field","length","some","includes","join","_jsx","Page","Loading","flatMap","properties","fields","index","arr","indexOf","item","isNaN","Number"],"mappings":"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"}
|
|
@@ -17,20 +17,21 @@ const [DocumentRBACProvider, useDocumentRBAC] = createContext('DocumentRBAC', {
|
|
|
17
17
|
});
|
|
18
18
|
/**
|
|
19
19
|
* @internal This component is not meant to be used outside of the Content Manager plugin.
|
|
20
|
-
* It depends on knowing the slug/model of the content-type using the params of the URL.
|
|
20
|
+
* It depends on knowing the slug/model of the content-type using the params of the URL or the model if it is passed as arg.
|
|
21
21
|
* If you do use the hook outside of the context, we default to `false` for all actions.
|
|
22
22
|
*
|
|
23
23
|
* It then creates an list of `can{Action}` that are passed to the context for consumption
|
|
24
24
|
* within the app to enforce RBAC.
|
|
25
|
-
*/ const DocumentRBAC = ({ children, permissions })=>{
|
|
25
|
+
*/ const DocumentRBAC = ({ children, permissions, model })=>{
|
|
26
26
|
const { slug } = useParams();
|
|
27
|
-
if (!slug) {
|
|
28
|
-
throw new Error('Cannot find the slug param in the URL');
|
|
27
|
+
if (!slug && !model) {
|
|
28
|
+
throw new Error('Cannot find the slug param in the URL or the model prop is not provided.');
|
|
29
29
|
}
|
|
30
|
+
const contentTypeUid = model ?? slug;
|
|
30
31
|
const [{ rawQuery }] = useQueryParams();
|
|
31
32
|
const userPermissions = useAuth('DocumentRBAC', (state)=>state.permissions);
|
|
32
33
|
const contentTypePermissions = React.useMemo(()=>{
|
|
33
|
-
const contentTypePermissions = userPermissions.filter((permission)=>permission.subject ===
|
|
34
|
+
const contentTypePermissions = userPermissions.filter((permission)=>permission.subject === contentTypeUid);
|
|
34
35
|
return contentTypePermissions.reduce((acc, permission)=>{
|
|
35
36
|
const [action] = permission.action.split('.').slice(-1);
|
|
36
37
|
return {
|
|
@@ -41,7 +42,7 @@ const [DocumentRBACProvider, useDocumentRBAC] = createContext('DocumentRBAC', {
|
|
|
41
42
|
};
|
|
42
43
|
}, {});
|
|
43
44
|
}, [
|
|
44
|
-
|
|
45
|
+
contentTypeUid,
|
|
45
46
|
userPermissions
|
|
46
47
|
]);
|
|
47
48
|
const { isLoading, allowedActions } = useRBAC(contentTypePermissions, permissions ?? undefined, // TODO: useRBAC context should be typed and built differently
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentRBAC.mjs","sources":["../../../admin/src/features/DocumentRBAC.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n useRBAC,\n useAuth,\n type Permission,\n createContext,\n Page,\n useQueryParams,\n} from '@strapi/admin/strapi-admin';\nimport { useParams } from 'react-router-dom';\n\nimport type { Schema } from '@strapi/types';\n\n/**\n * The boolean values indicate the global actions a user can perform on the document.\n * The `string[]` values tell us specifically which fields the actions can be performed on,\n * for example, if the `canReadFields` array is empty, than no fields can be read by the user.\n * This can happen even if the user can read the document.\n */\ninterface DocumentRBACContextValue {\n canCreate?: boolean;\n canCreateFields: string[];\n canDelete?: boolean;\n canPublish?: boolean;\n canRead?: boolean;\n canReadFields: string[];\n canUpdate?: boolean;\n canUpdateFields: string[];\n canUserAction: (\n fieldName: string,\n fieldsUserCanAction: string[],\n fieldType: Schema.Attribute.Kind\n ) => boolean;\n isLoading: boolean;\n}\n\nconst [DocumentRBACProvider, useDocumentRBAC] = createContext<DocumentRBACContextValue>(\n 'DocumentRBAC',\n {\n canCreate: false,\n canCreateFields: [],\n canDelete: false,\n canPublish: false,\n canRead: false,\n canReadFields: [],\n canUpdate: false,\n canUpdateFields: [],\n canUserAction: () => false,\n isLoading: false,\n }\n);\n\ninterface DocumentRBACProps {\n children: React.ReactNode;\n permissions: Permission[] | null;\n}\n\n/**\n * @internal This component is not meant to be used outside of the Content Manager plugin.\n * It depends on knowing the slug/model of the content-type using the params of the URL.\n * If you do use the hook outside of the context, we default to `false` for all actions.\n *\n * It then creates an list of `can{Action}` that are passed to the context for consumption\n * within the app to enforce RBAC.\n */\nconst DocumentRBAC = ({ children, permissions }: DocumentRBACProps) => {\n const { slug } = useParams<{ slug: string }>();\n\n if (!slug) {\n throw new Error('Cannot find the slug param in the URL');\n }\n const [{ rawQuery }] = useQueryParams<{ plugins?: { i18n?: { locale?: string } } }>();\n\n const userPermissions = useAuth('DocumentRBAC', (state) => state.permissions);\n\n const contentTypePermissions = React.useMemo(() => {\n const contentTypePermissions = userPermissions.filter(\n (permission) => permission.subject === slug\n );\n return contentTypePermissions.reduce<Record<string, Permission[]>>((acc, permission) => {\n const [action] = permission.action.split('.').slice(-1);\n return { ...acc, [action]: [permission] };\n }, {});\n }, [slug, userPermissions]);\n\n const { isLoading, allowedActions } = useRBAC(\n contentTypePermissions,\n permissions ?? undefined,\n // TODO: useRBAC context should be typed and built differently\n // We are passing raw query as context to the hook so that it can\n // rely on the locale provided from DocumentRBAC for its permission calculations.\n rawQuery\n );\n\n const canCreateFields =\n !isLoading && allowedActions.canCreate\n ? extractAndDedupeFields(contentTypePermissions.create)\n : [];\n\n const canReadFields =\n !isLoading && allowedActions.canRead ? extractAndDedupeFields(contentTypePermissions.read) : [];\n\n const canUpdateFields =\n !isLoading && allowedActions.canUpdate\n ? extractAndDedupeFields(contentTypePermissions.update)\n : [];\n\n /**\n * @description Checks if the user can perform an action on a field based on the field names\n * provided as the second argument.\n */\n const canUserAction: DocumentRBACContextValue['canUserAction'] = React.useCallback(\n (fieldName, fieldsUserCanAction, fieldType) => {\n const name = removeNumericalStrings(fieldName.split('.'));\n\n const componentFieldNames = fieldsUserCanAction\n // filter out fields that aren't components (components are dot separated)\n .filter((field) => field.split('.').length > 1);\n\n if (fieldType === 'component') {\n // check if the field name is within any of those arrays\n return componentFieldNames.some((field) => {\n return field.includes(name.join('.'));\n });\n }\n\n /**\n * The field is within a component.\n */\n if (name.length > 1) {\n return componentFieldNames.includes(name.join('.'));\n }\n\n /**\n * just a regular field\n */\n return fieldsUserCanAction.includes(fieldName);\n },\n []\n );\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n return (\n <DocumentRBACProvider\n isLoading={isLoading}\n canCreateFields={canCreateFields}\n canReadFields={canReadFields}\n canUpdateFields={canUpdateFields}\n canUserAction={canUserAction}\n {...allowedActions}\n >\n {children}\n </DocumentRBACProvider>\n );\n};\n\n/**\n * @internal it's really small, but it's used three times in a row and DRY for something this straight forward.\n */\nconst extractAndDedupeFields = (permissions: Permission[] = []) =>\n permissions\n .flatMap((permission) => permission.properties?.fields)\n .filter(\n (field, index, arr): field is string =>\n arr.indexOf(field) === index && typeof field === 'string'\n );\n\n/**\n * @internal removes numerical strings from arrays.\n * @example\n * ```ts\n * const name = 'a.0.b';\n * const res = removeNumericalStrings(name.split('.'));\n * console.log(res); // ['a', 'b']\n * ```\n */\nconst removeNumericalStrings = (arr: string[]) => arr.filter((item) => isNaN(Number(item)));\n\nexport { DocumentRBAC, useDocumentRBAC, DocumentRBACContextValue, DocumentRBACProps };\n"],"names":["DocumentRBACProvider","useDocumentRBAC","createContext","canCreate","canCreateFields","canDelete","canPublish","canRead","canReadFields","canUpdate","canUpdateFields","canUserAction","isLoading","DocumentRBAC","children","permissions","slug","useParams","Error","rawQuery","useQueryParams","userPermissions","useAuth","state","contentTypePermissions","React","useMemo","filter","permission","subject","reduce","acc","action","split","slice","allowedActions","useRBAC","undefined","extractAndDedupeFields","create","read","update","useCallback","fieldName","fieldsUserCanAction","fieldType","name","removeNumericalStrings","componentFieldNames","field","length","some","includes","join","_jsx","Page","Loading","flatMap","properties","fields","index","arr","indexOf","item","isNaN","Number"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DocumentRBAC.mjs","sources":["../../../admin/src/features/DocumentRBAC.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n useRBAC,\n useAuth,\n type Permission,\n createContext,\n Page,\n useQueryParams,\n} from '@strapi/admin/strapi-admin';\nimport { useParams } from 'react-router-dom';\n\nimport type { Schema } from '@strapi/types';\n\n/**\n * The boolean values indicate the global actions a user can perform on the document.\n * The `string[]` values tell us specifically which fields the actions can be performed on,\n * for example, if the `canReadFields` array is empty, than no fields can be read by the user.\n * This can happen even if the user can read the document.\n */\ninterface DocumentRBACContextValue {\n canCreate?: boolean;\n canCreateFields: string[];\n canDelete?: boolean;\n canPublish?: boolean;\n canRead?: boolean;\n canReadFields: string[];\n canUpdate?: boolean;\n canUpdateFields: string[];\n canUserAction: (\n fieldName: string,\n fieldsUserCanAction: string[],\n fieldType: Schema.Attribute.Kind\n ) => boolean;\n isLoading: boolean;\n}\n\nconst [DocumentRBACProvider, useDocumentRBAC] = createContext<DocumentRBACContextValue>(\n 'DocumentRBAC',\n {\n canCreate: false,\n canCreateFields: [],\n canDelete: false,\n canPublish: false,\n canRead: false,\n canReadFields: [],\n canUpdate: false,\n canUpdateFields: [],\n canUserAction: () => false,\n isLoading: false,\n }\n);\n\ninterface DocumentRBACProps {\n children: React.ReactNode;\n permissions: Permission[] | null;\n model?: string;\n}\n\n/**\n * @internal This component is not meant to be used outside of the Content Manager plugin.\n * It depends on knowing the slug/model of the content-type using the params of the URL or the model if it is passed as arg.\n * If you do use the hook outside of the context, we default to `false` for all actions.\n *\n * It then creates an list of `can{Action}` that are passed to the context for consumption\n * within the app to enforce RBAC.\n */\nconst DocumentRBAC = ({ children, permissions, model }: DocumentRBACProps) => {\n const { slug } = useParams<{ slug: string }>();\n\n if (!slug && !model) {\n throw new Error('Cannot find the slug param in the URL or the model prop is not provided.');\n }\n\n const contentTypeUid = model ?? slug;\n\n const [{ rawQuery }] = useQueryParams<{ plugins?: { i18n?: { locale?: string } } }>();\n\n const userPermissions = useAuth('DocumentRBAC', (state) => state.permissions);\n\n const contentTypePermissions = React.useMemo(() => {\n const contentTypePermissions = userPermissions.filter(\n (permission) => permission.subject === contentTypeUid\n );\n return contentTypePermissions.reduce<Record<string, Permission[]>>((acc, permission) => {\n const [action] = permission.action.split('.').slice(-1);\n return { ...acc, [action]: [permission] };\n }, {});\n }, [contentTypeUid, userPermissions]);\n\n const { isLoading, allowedActions } = useRBAC(\n contentTypePermissions,\n permissions ?? undefined,\n // TODO: useRBAC context should be typed and built differently\n // We are passing raw query as context to the hook so that it can\n // rely on the locale provided from DocumentRBAC for its permission calculations.\n rawQuery\n );\n\n const canCreateFields =\n !isLoading && allowedActions.canCreate\n ? extractAndDedupeFields(contentTypePermissions.create)\n : [];\n\n const canReadFields =\n !isLoading && allowedActions.canRead ? extractAndDedupeFields(contentTypePermissions.read) : [];\n\n const canUpdateFields =\n !isLoading && allowedActions.canUpdate\n ? extractAndDedupeFields(contentTypePermissions.update)\n : [];\n\n /**\n * @description Checks if the user can perform an action on a field based on the field names\n * provided as the second argument.\n */\n const canUserAction: DocumentRBACContextValue['canUserAction'] = React.useCallback(\n (fieldName, fieldsUserCanAction, fieldType) => {\n const name = removeNumericalStrings(fieldName.split('.'));\n\n const componentFieldNames = fieldsUserCanAction\n // filter out fields that aren't components (components are dot separated)\n .filter((field) => field.split('.').length > 1);\n\n if (fieldType === 'component') {\n // check if the field name is within any of those arrays\n return componentFieldNames.some((field) => {\n return field.includes(name.join('.'));\n });\n }\n\n /**\n * The field is within a component.\n */\n if (name.length > 1) {\n return componentFieldNames.includes(name.join('.'));\n }\n\n /**\n * just a regular field\n */\n return fieldsUserCanAction.includes(fieldName);\n },\n []\n );\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n return (\n <DocumentRBACProvider\n isLoading={isLoading}\n canCreateFields={canCreateFields}\n canReadFields={canReadFields}\n canUpdateFields={canUpdateFields}\n canUserAction={canUserAction}\n {...allowedActions}\n >\n {children}\n </DocumentRBACProvider>\n );\n};\n\n/**\n * @internal it's really small, but it's used three times in a row and DRY for something this straight forward.\n */\nconst extractAndDedupeFields = (permissions: Permission[] = []) =>\n permissions\n .flatMap((permission) => permission.properties?.fields)\n .filter(\n (field, index, arr): field is string =>\n arr.indexOf(field) === index && typeof field === 'string'\n );\n\n/**\n * @internal removes numerical strings from arrays.\n * @example\n * ```ts\n * const name = 'a.0.b';\n * const res = removeNumericalStrings(name.split('.'));\n * console.log(res); // ['a', 'b']\n * ```\n */\nconst removeNumericalStrings = (arr: string[]) => arr.filter((item) => isNaN(Number(item)));\n\nexport { DocumentRBAC, useDocumentRBAC, DocumentRBACContextValue, DocumentRBACProps };\n"],"names":["DocumentRBACProvider","useDocumentRBAC","createContext","canCreate","canCreateFields","canDelete","canPublish","canRead","canReadFields","canUpdate","canUpdateFields","canUserAction","isLoading","DocumentRBAC","children","permissions","model","slug","useParams","Error","contentTypeUid","rawQuery","useQueryParams","userPermissions","useAuth","state","contentTypePermissions","React","useMemo","filter","permission","subject","reduce","acc","action","split","slice","allowedActions","useRBAC","undefined","extractAndDedupeFields","create","read","update","useCallback","fieldName","fieldsUserCanAction","fieldType","name","removeNumericalStrings","componentFieldNames","field","length","some","includes","join","_jsx","Page","Loading","flatMap","properties","fields","index","arr","indexOf","item","isNaN","Number"],"mappings":"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"}
|
|
@@ -81,9 +81,18 @@ const createLayoutFromFields = (fields)=>{
|
|
|
81
81
|
/* -------------------------------------------------------------------------------------------------
|
|
82
82
|
* FormPanel
|
|
83
83
|
* -----------------------------------------------------------------------------------------------*/ const FormPanel = ({ panel })=>{
|
|
84
|
+
const fieldValues = strapiAdmin.useForm('Fields', (state)=>state.values);
|
|
85
|
+
const rulesEngine = strapiAdmin.createRulesEngine();
|
|
84
86
|
if (panel.some((row)=>row.some((field)=>field.type === 'dynamiczone'))) {
|
|
85
87
|
const [row] = panel;
|
|
86
88
|
const [field] = row;
|
|
89
|
+
const condition = field.attribute?.conditions?.visible;
|
|
90
|
+
if (condition) {
|
|
91
|
+
const isVisible = rulesEngine.evaluate(condition, fieldValues);
|
|
92
|
+
if (!isVisible) {
|
|
93
|
+
return null; // Skip rendering the dynamic zone if the condition is not met
|
|
94
|
+
}
|
|
95
|
+
}
|
|
87
96
|
return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Root, {
|
|
88
97
|
gap: 4,
|
|
89
98
|
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Item, {
|
|
@@ -111,9 +120,20 @@ const createLayoutFromFields = (fields)=>{
|
|
|
111
120
|
direction: "column",
|
|
112
121
|
alignItems: "stretch",
|
|
113
122
|
gap: 6,
|
|
114
|
-
children: panel.map((row, gridRowIndex)
|
|
123
|
+
children: panel.map((row, gridRowIndex)=>{
|
|
124
|
+
const visibleFields = row.filter((field)=>{
|
|
125
|
+
const condition = field.attribute?.conditions?.visible;
|
|
126
|
+
if (condition) {
|
|
127
|
+
return rulesEngine.evaluate(condition, fieldValues);
|
|
128
|
+
}
|
|
129
|
+
return true;
|
|
130
|
+
});
|
|
131
|
+
if (visibleFields.length === 0) {
|
|
132
|
+
return null; // Skip rendering the entire grid row
|
|
133
|
+
}
|
|
134
|
+
return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Root, {
|
|
115
135
|
gap: 4,
|
|
116
|
-
children:
|
|
136
|
+
children: visibleFields.map(({ size, ...field })=>{
|
|
117
137
|
return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Item, {
|
|
118
138
|
col: size,
|
|
119
139
|
s: 12,
|
|
@@ -125,7 +145,8 @@ const createLayoutFromFields = (fields)=>{
|
|
|
125
145
|
})
|
|
126
146
|
}, field.name);
|
|
127
147
|
})
|
|
128
|
-
}, gridRowIndex)
|
|
148
|
+
}, gridRowIndex);
|
|
149
|
+
})
|
|
129
150
|
})
|
|
130
151
|
});
|
|
131
152
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VersionContent.js","sources":["../../../../admin/src/history/components/VersionContent.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Form, Layouts } from '@strapi/admin/strapi-admin';\nimport { Box, Divider, Flex, Grid, Typography } from '@strapi/design-system';\nimport pipe from 'lodash/fp/pipe';\nimport { useIntl } from 'react-intl';\n\nimport { useDoc } from '../../hooks/useDocument';\nimport { useTypedSelector } from '../../modules/hooks';\nimport {\n prepareTempKeys,\n removeFieldsThatDontExistOnSchema,\n} from '../../pages/EditView/utils/data';\nimport { HistoryContextValue, useHistoryContext } from '../pages/History';\n\nimport { VersionInputRenderer } from './VersionInputRenderer';\n\nimport type { Metadatas } from '../../../../shared/contracts/content-types';\nimport type { GetInitData } from '../../../../shared/contracts/init';\nimport type { ComponentsDictionary, Document } from '../../hooks/useDocument';\nimport type { EditFieldLayout } from '../../hooks/useDocumentLayout';\nimport type { Schema } from '@strapi/types';\n\nconst createLayoutFromFields = <T extends EditFieldLayout | UnknownField>(fields: T[]) => {\n return (\n fields\n .reduce<Array<T[]>>((rows, field) => {\n if (field.type === 'dynamiczone') {\n // Dynamic zones take up all the columns in a row\n rows.push([field]);\n\n return rows;\n }\n\n if (!rows[rows.length - 1]) {\n // Create a new row if there isn't one available\n rows.push([]);\n }\n\n // Push fields to the current row, they wrap and handle their own column size\n rows[rows.length - 1].push(field);\n\n return rows;\n }, [])\n // Map the rows to panels\n .map((row) => [row])\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * getRemainingFieldsLayout\n * -----------------------------------------------------------------------------------------------*/\n\ninterface GetRemainingFieldsLayoutOptions\n extends Pick<HistoryContextValue, 'layout'>,\n Pick<GetInitData.Response['data'], 'fieldSizes'> {\n schemaAttributes: HistoryContextValue['schema']['attributes'];\n metadatas: Metadatas;\n}\n\n/**\n * Build a layout for the fields that are were deleted from the edit view layout\n * via the configure the view page. This layout will be merged with the main one.\n * Those fields would be restored if the user restores the history version, which is why it's\n * important to show them, even if they're not in the normal layout.\n */\nfunction getRemaingFieldsLayout({\n layout,\n metadatas,\n schemaAttributes,\n fieldSizes,\n}: GetRemainingFieldsLayoutOptions) {\n const fieldsInLayout = layout.flatMap((panel) =>\n panel.flatMap((row) => row.flatMap((field) => field.name))\n );\n const remainingFields = Object.entries(metadatas).reduce<EditFieldLayout[]>(\n (currentRemainingFields, [name, field]) => {\n // Make sure we do not fields that are not visible, e.g. \"id\"\n if (!fieldsInLayout.includes(name) && field.edit.visible === true) {\n const attribute = schemaAttributes[name];\n // @ts-expect-error not sure why attribute causes type error\n currentRemainingFields.push({\n attribute,\n type: attribute.type,\n visible: true,\n disabled: true,\n label: field.edit.label || name,\n name: name,\n size: fieldSizes[attribute.type].default ?? 12,\n });\n }\n\n return currentRemainingFields;\n },\n []\n );\n\n return createLayoutFromFields(remainingFields);\n}\n\n/* -------------------------------------------------------------------------------------------------\n * FormPanel\n * -----------------------------------------------------------------------------------------------*/\n\nconst FormPanel = ({ panel }: { panel: EditFieldLayout[][] }) => {\n if (panel.some((row) => row.some((field) => field.type === 'dynamiczone'))) {\n const [row] = panel;\n const [field] = row;\n\n return (\n <Grid.Root key={field.name} gap={4}>\n <Grid.Item col={12} s={12} xs={12} direction=\"column\" alignItems=\"stretch\">\n <VersionInputRenderer {...field} />\n </Grid.Item>\n </Grid.Root>\n );\n }\n\n return (\n <Box\n hasRadius\n background=\"neutral0\"\n shadow=\"tableShadow\"\n paddingLeft={6}\n paddingRight={6}\n paddingTop={6}\n paddingBottom={6}\n borderColor=\"neutral150\"\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {panel.map((row, gridRowIndex) => (\n <Grid.Root key={gridRowIndex} gap={4}>\n {row.map(({ size, ...field }) => {\n return (\n <Grid.Item\n col={size}\n key={field.name}\n s={12}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <VersionInputRenderer {...field} />\n </Grid.Item>\n );\n })}\n </Grid.Root>\n ))}\n </Flex>\n </Box>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * VersionContent\n * -----------------------------------------------------------------------------------------------*/\n\ntype UnknownField = EditFieldLayout & { shouldIgnoreRBAC: boolean };\n\nconst VersionContent = () => {\n const { formatMessage } = useIntl();\n const { fieldSizes } = useTypedSelector((state) => state['content-manager'].app);\n const version = useHistoryContext('VersionContent', (state) => state.selectedVersion);\n const layout = useHistoryContext('VersionContent', (state) => state.layout);\n const configuration = useHistoryContext('VersionContent', (state) => state.configuration);\n const schema = useHistoryContext('VersionContent', (state) => state.schema);\n\n // Build a layout for the unknown fields section\n const removedAttributes = version.meta.unknownAttributes.removed;\n const removedAttributesAsFields = Object.entries(removedAttributes).map(\n ([attributeName, attribute]) => {\n const field = {\n attribute,\n shouldIgnoreRBAC: true,\n type: attribute.type,\n visible: true,\n disabled: true,\n label: attributeName,\n name: attributeName,\n size: fieldSizes[attribute.type].default ?? 12,\n } as UnknownField;\n\n return field;\n }\n );\n const unknownFieldsLayout = createLayoutFromFields(removedAttributesAsFields);\n\n // Build a layout for the fields that are were deleted from the layout\n const remainingFieldsLayout = getRemaingFieldsLayout({\n metadatas: configuration.contentType.metadatas,\n layout,\n schemaAttributes: schema.attributes,\n fieldSizes,\n });\n\n const { components } = useDoc();\n\n /**\n * Transform the data before passing it to the form so that each field\n * has a uniquely generated key\n */\n const transformedData = React.useMemo(() => {\n const transform =\n (schemaAttributes: Schema.Attributes, components: ComponentsDictionary = {}) =>\n (document: Omit<Document, 'id'>) => {\n const schema = { attributes: schemaAttributes };\n\n const transformations = pipe(\n removeFieldsThatDontExistOnSchema(schema),\n prepareTempKeys(schema, components)\n );\n return transformations(document);\n };\n\n return transform(version.schema, components)(version.data);\n }, [components, version.data, version.schema]);\n\n return (\n <Layouts.Content>\n <Box paddingBottom={8}>\n <Form disabled={true} method=\"PUT\" initialValues={transformedData}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6} position=\"relative\">\n {[...layout, ...remainingFieldsLayout].map((panel, index) => {\n return <FormPanel key={index} panel={panel} />;\n })}\n </Flex>\n </Form>\n </Box>\n {removedAttributesAsFields.length > 0 && (\n <>\n <Divider />\n <Box paddingTop={8}>\n <Flex direction=\"column\" alignItems=\"flex-start\" paddingBottom={6} gap={1}>\n <Typography variant=\"delta\">\n {formatMessage({\n id: 'content-manager.history.content.unknown-fields.title',\n defaultMessage: 'Unknown fields',\n })}\n </Typography>\n <Typography variant=\"pi\">\n {formatMessage(\n {\n id: 'content-manager.history.content.unknown-fields.message',\n defaultMessage:\n 'These fields have been deleted or renamed in the Content-Type Builder. <b>These fields will not be restored.</b>',\n },\n {\n b: (chunks: React.ReactNode) => (\n <Typography variant=\"pi\" fontWeight=\"bold\">\n {chunks}\n </Typography>\n ),\n }\n )}\n </Typography>\n </Flex>\n <Form disabled={true} method=\"PUT\" initialValues={version.data}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6} position=\"relative\">\n {unknownFieldsLayout.map((panel, index) => {\n return <FormPanel key={index} panel={panel} />;\n })}\n </Flex>\n </Form>\n </Box>\n </>\n )}\n </Layouts.Content>\n );\n};\n\nexport { VersionContent, getRemaingFieldsLayout };\n"],"names":["createLayoutFromFields","fields","reduce","rows","field","type","push","length","map","row","getRemaingFieldsLayout","layout","metadatas","schemaAttributes","fieldSizes","fieldsInLayout","flatMap","panel","name","remainingFields","Object","entries","currentRemainingFields","includes","edit","visible","attribute","disabled","label","size","default","FormPanel","some","_jsx","Grid","Root","gap","Item","col","s","xs","direction","alignItems","VersionInputRenderer","Box","hasRadius","background","shadow","paddingLeft","paddingRight","paddingTop","paddingBottom","borderColor","Flex","gridRowIndex","VersionContent","formatMessage","useIntl","useTypedSelector","state","app","version","useHistoryContext","selectedVersion","configuration","schema","removedAttributes","meta","unknownAttributes","removed","removedAttributesAsFields","attributeName","shouldIgnoreRBAC","unknownFieldsLayout","remainingFieldsLayout","contentType","attributes","components","useDoc","transformedData","React","useMemo","transform","document","transformations","pipe","removeFieldsThatDontExistOnSchema","prepareTempKeys","data","_jsxs","Layouts","Content","Form","method","initialValues","position","index","_Fragment","Divider","Typography","variant","id","defaultMessage","b","chunks","fontWeight"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VersionContent.js","sources":["../../../../admin/src/history/components/VersionContent.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Form, Layouts, useForm, createRulesEngine } from '@strapi/admin/strapi-admin';\nimport { Box, Divider, Flex, Grid, Typography } from '@strapi/design-system';\nimport pipe from 'lodash/fp/pipe';\nimport { useIntl } from 'react-intl';\n\nimport { useDoc } from '../../hooks/useDocument';\nimport { useTypedSelector } from '../../modules/hooks';\nimport {\n prepareTempKeys,\n removeFieldsThatDontExistOnSchema,\n} from '../../pages/EditView/utils/data';\nimport { HistoryContextValue, useHistoryContext } from '../pages/History';\n\nimport { VersionInputRenderer } from './VersionInputRenderer';\n\nimport type { Metadatas } from '../../../../shared/contracts/content-types';\nimport type { GetInitData } from '../../../../shared/contracts/init';\nimport type { ComponentsDictionary, Document } from '../../hooks/useDocument';\nimport type { EditFieldLayout } from '../../hooks/useDocumentLayout';\nimport type { Schema } from '@strapi/types';\n\nconst createLayoutFromFields = <T extends EditFieldLayout | UnknownField>(fields: T[]) => {\n return (\n fields\n .reduce<Array<T[]>>((rows, field) => {\n if (field.type === 'dynamiczone') {\n // Dynamic zones take up all the columns in a row\n rows.push([field]);\n\n return rows;\n }\n\n if (!rows[rows.length - 1]) {\n // Create a new row if there isn't one available\n rows.push([]);\n }\n\n // Push fields to the current row, they wrap and handle their own column size\n rows[rows.length - 1].push(field);\n\n return rows;\n }, [])\n // Map the rows to panels\n .map((row) => [row])\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * getRemainingFieldsLayout\n * -----------------------------------------------------------------------------------------------*/\n\ninterface GetRemainingFieldsLayoutOptions\n extends Pick<HistoryContextValue, 'layout'>,\n Pick<GetInitData.Response['data'], 'fieldSizes'> {\n schemaAttributes: HistoryContextValue['schema']['attributes'];\n metadatas: Metadatas;\n}\n\n/**\n * Build a layout for the fields that are were deleted from the edit view layout\n * via the configure the view page. This layout will be merged with the main one.\n * Those fields would be restored if the user restores the history version, which is why it's\n * important to show them, even if they're not in the normal layout.\n */\nfunction getRemaingFieldsLayout({\n layout,\n metadatas,\n schemaAttributes,\n fieldSizes,\n}: GetRemainingFieldsLayoutOptions) {\n const fieldsInLayout = layout.flatMap((panel) =>\n panel.flatMap((row) => row.flatMap((field) => field.name))\n );\n const remainingFields = Object.entries(metadatas).reduce<EditFieldLayout[]>(\n (currentRemainingFields, [name, field]) => {\n // Make sure we do not fields that are not visible, e.g. \"id\"\n if (!fieldsInLayout.includes(name) && field.edit.visible === true) {\n const attribute = schemaAttributes[name];\n // @ts-expect-error not sure why attribute causes type error\n currentRemainingFields.push({\n attribute,\n type: attribute.type,\n visible: true,\n disabled: true,\n label: field.edit.label || name,\n name: name,\n size: fieldSizes[attribute.type].default ?? 12,\n });\n }\n\n return currentRemainingFields;\n },\n []\n );\n\n return createLayoutFromFields(remainingFields);\n}\n\n/* -------------------------------------------------------------------------------------------------\n * FormPanel\n * -----------------------------------------------------------------------------------------------*/\n\nconst FormPanel = ({ panel }: { panel: EditFieldLayout[][] }) => {\n const fieldValues = useForm('Fields', (state) => state.values);\n const rulesEngine = createRulesEngine();\n if (panel.some((row) => row.some((field) => field.type === 'dynamiczone'))) {\n const [row] = panel;\n const [field] = row;\n const condition = field.attribute?.conditions?.visible;\n\n if (condition) {\n const isVisible = rulesEngine.evaluate(condition, fieldValues);\n if (!isVisible) {\n return null; // Skip rendering the dynamic zone if the condition is not met\n }\n }\n\n return (\n <Grid.Root key={field.name} gap={4}>\n <Grid.Item col={12} s={12} xs={12} direction=\"column\" alignItems=\"stretch\">\n <VersionInputRenderer {...field} />\n </Grid.Item>\n </Grid.Root>\n );\n }\n\n return (\n <Box\n hasRadius\n background=\"neutral0\"\n shadow=\"tableShadow\"\n paddingLeft={6}\n paddingRight={6}\n paddingTop={6}\n paddingBottom={6}\n borderColor=\"neutral150\"\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {panel.map((row, gridRowIndex) => {\n const visibleFields = row.filter((field) => {\n const condition = field.attribute?.conditions?.visible;\n\n if (condition) {\n return rulesEngine.evaluate(condition, fieldValues);\n }\n\n return true;\n });\n\n if (visibleFields.length === 0) {\n return null; // Skip rendering the entire grid row\n }\n\n return (\n <Grid.Root key={gridRowIndex} gap={4}>\n {visibleFields.map(({ size, ...field }) => {\n return (\n <Grid.Item\n col={size}\n key={field.name}\n s={12}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <VersionInputRenderer {...field} />\n </Grid.Item>\n );\n })}\n </Grid.Root>\n );\n })}\n </Flex>\n </Box>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * VersionContent\n * -----------------------------------------------------------------------------------------------*/\n\ntype UnknownField = EditFieldLayout & { shouldIgnoreRBAC: boolean };\n\nconst VersionContent = () => {\n const { formatMessage } = useIntl();\n const { fieldSizes } = useTypedSelector((state) => state['content-manager'].app);\n const version = useHistoryContext('VersionContent', (state) => state.selectedVersion);\n const layout = useHistoryContext('VersionContent', (state) => state.layout);\n const configuration = useHistoryContext('VersionContent', (state) => state.configuration);\n const schema = useHistoryContext('VersionContent', (state) => state.schema);\n\n // Build a layout for the unknown fields section\n const removedAttributes = version.meta.unknownAttributes.removed;\n const removedAttributesAsFields = Object.entries(removedAttributes).map(\n ([attributeName, attribute]) => {\n const field = {\n attribute,\n shouldIgnoreRBAC: true,\n type: attribute.type,\n visible: true,\n disabled: true,\n label: attributeName,\n name: attributeName,\n size: fieldSizes[attribute.type].default ?? 12,\n } as UnknownField;\n\n return field;\n }\n );\n const unknownFieldsLayout = createLayoutFromFields(removedAttributesAsFields);\n\n // Build a layout for the fields that are were deleted from the layout\n const remainingFieldsLayout = getRemaingFieldsLayout({\n metadatas: configuration.contentType.metadatas,\n layout,\n schemaAttributes: schema.attributes,\n fieldSizes,\n });\n\n const { components } = useDoc();\n\n /**\n * Transform the data before passing it to the form so that each field\n * has a uniquely generated key\n */\n const transformedData = React.useMemo(() => {\n const transform =\n (schemaAttributes: Schema.Attributes, components: ComponentsDictionary = {}) =>\n (document: Omit<Document, 'id'>) => {\n const schema = { attributes: schemaAttributes };\n\n const transformations = pipe(\n removeFieldsThatDontExistOnSchema(schema),\n prepareTempKeys(schema, components)\n );\n return transformations(document);\n };\n\n return transform(version.schema, components)(version.data);\n }, [components, version.data, version.schema]);\n\n return (\n <Layouts.Content>\n <Box paddingBottom={8}>\n <Form disabled={true} method=\"PUT\" initialValues={transformedData}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6} position=\"relative\">\n {[...layout, ...remainingFieldsLayout].map((panel, index) => {\n return <FormPanel key={index} panel={panel} />;\n })}\n </Flex>\n </Form>\n </Box>\n {removedAttributesAsFields.length > 0 && (\n <>\n <Divider />\n <Box paddingTop={8}>\n <Flex direction=\"column\" alignItems=\"flex-start\" paddingBottom={6} gap={1}>\n <Typography variant=\"delta\">\n {formatMessage({\n id: 'content-manager.history.content.unknown-fields.title',\n defaultMessage: 'Unknown fields',\n })}\n </Typography>\n <Typography variant=\"pi\">\n {formatMessage(\n {\n id: 'content-manager.history.content.unknown-fields.message',\n defaultMessage:\n 'These fields have been deleted or renamed in the Content-Type Builder. <b>These fields will not be restored.</b>',\n },\n {\n b: (chunks: React.ReactNode) => (\n <Typography variant=\"pi\" fontWeight=\"bold\">\n {chunks}\n </Typography>\n ),\n }\n )}\n </Typography>\n </Flex>\n <Form disabled={true} method=\"PUT\" initialValues={version.data}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6} position=\"relative\">\n {unknownFieldsLayout.map((panel, index) => {\n return <FormPanel key={index} panel={panel} />;\n })}\n </Flex>\n </Form>\n </Box>\n </>\n )}\n </Layouts.Content>\n );\n};\n\nexport { VersionContent, getRemaingFieldsLayout };\n"],"names":["createLayoutFromFields","fields","reduce","rows","field","type","push","length","map","row","getRemaingFieldsLayout","layout","metadatas","schemaAttributes","fieldSizes","fieldsInLayout","flatMap","panel","name","remainingFields","Object","entries","currentRemainingFields","includes","edit","visible","attribute","disabled","label","size","default","FormPanel","fieldValues","useForm","state","values","rulesEngine","createRulesEngine","some","condition","conditions","isVisible","evaluate","_jsx","Grid","Root","gap","Item","col","s","xs","direction","alignItems","VersionInputRenderer","Box","hasRadius","background","shadow","paddingLeft","paddingRight","paddingTop","paddingBottom","borderColor","Flex","gridRowIndex","visibleFields","filter","VersionContent","formatMessage","useIntl","useTypedSelector","app","version","useHistoryContext","selectedVersion","configuration","schema","removedAttributes","meta","unknownAttributes","removed","removedAttributesAsFields","attributeName","shouldIgnoreRBAC","unknownFieldsLayout","remainingFieldsLayout","contentType","attributes","components","useDoc","transformedData","React","useMemo","transform","document","transformations","pipe","removeFieldsThatDontExistOnSchema","prepareTempKeys","data","_jsxs","Layouts","Content","Form","method","initialValues","position","index","_Fragment","Divider","Typography","variant","id","defaultMessage","b","chunks","fontWeight"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import * as React from 'react';
|
|
3
|
-
import { Layouts, Form } from '@strapi/admin/strapi-admin';
|
|
3
|
+
import { Layouts, Form, useForm, createRulesEngine } from '@strapi/admin/strapi-admin';
|
|
4
4
|
import { Box, Flex, Divider, Typography, Grid } from '@strapi/design-system';
|
|
5
5
|
import pipe from 'lodash/fp/pipe';
|
|
6
6
|
import { useIntl } from 'react-intl';
|
|
@@ -60,9 +60,18 @@ const createLayoutFromFields = (fields)=>{
|
|
|
60
60
|
/* -------------------------------------------------------------------------------------------------
|
|
61
61
|
* FormPanel
|
|
62
62
|
* -----------------------------------------------------------------------------------------------*/ const FormPanel = ({ panel })=>{
|
|
63
|
+
const fieldValues = useForm('Fields', (state)=>state.values);
|
|
64
|
+
const rulesEngine = createRulesEngine();
|
|
63
65
|
if (panel.some((row)=>row.some((field)=>field.type === 'dynamiczone'))) {
|
|
64
66
|
const [row] = panel;
|
|
65
67
|
const [field] = row;
|
|
68
|
+
const condition = field.attribute?.conditions?.visible;
|
|
69
|
+
if (condition) {
|
|
70
|
+
const isVisible = rulesEngine.evaluate(condition, fieldValues);
|
|
71
|
+
if (!isVisible) {
|
|
72
|
+
return null; // Skip rendering the dynamic zone if the condition is not met
|
|
73
|
+
}
|
|
74
|
+
}
|
|
66
75
|
return /*#__PURE__*/ jsx(Grid.Root, {
|
|
67
76
|
gap: 4,
|
|
68
77
|
children: /*#__PURE__*/ jsx(Grid.Item, {
|
|
@@ -90,9 +99,20 @@ const createLayoutFromFields = (fields)=>{
|
|
|
90
99
|
direction: "column",
|
|
91
100
|
alignItems: "stretch",
|
|
92
101
|
gap: 6,
|
|
93
|
-
children: panel.map((row, gridRowIndex)
|
|
102
|
+
children: panel.map((row, gridRowIndex)=>{
|
|
103
|
+
const visibleFields = row.filter((field)=>{
|
|
104
|
+
const condition = field.attribute?.conditions?.visible;
|
|
105
|
+
if (condition) {
|
|
106
|
+
return rulesEngine.evaluate(condition, fieldValues);
|
|
107
|
+
}
|
|
108
|
+
return true;
|
|
109
|
+
});
|
|
110
|
+
if (visibleFields.length === 0) {
|
|
111
|
+
return null; // Skip rendering the entire grid row
|
|
112
|
+
}
|
|
113
|
+
return /*#__PURE__*/ jsx(Grid.Root, {
|
|
94
114
|
gap: 4,
|
|
95
|
-
children:
|
|
115
|
+
children: visibleFields.map(({ size, ...field })=>{
|
|
96
116
|
return /*#__PURE__*/ jsx(Grid.Item, {
|
|
97
117
|
col: size,
|
|
98
118
|
s: 12,
|
|
@@ -104,7 +124,8 @@ const createLayoutFromFields = (fields)=>{
|
|
|
104
124
|
})
|
|
105
125
|
}, field.name);
|
|
106
126
|
})
|
|
107
|
-
}, gridRowIndex)
|
|
127
|
+
}, gridRowIndex);
|
|
128
|
+
})
|
|
108
129
|
})
|
|
109
130
|
});
|
|
110
131
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VersionContent.mjs","sources":["../../../../admin/src/history/components/VersionContent.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Form, Layouts } from '@strapi/admin/strapi-admin';\nimport { Box, Divider, Flex, Grid, Typography } from '@strapi/design-system';\nimport pipe from 'lodash/fp/pipe';\nimport { useIntl } from 'react-intl';\n\nimport { useDoc } from '../../hooks/useDocument';\nimport { useTypedSelector } from '../../modules/hooks';\nimport {\n prepareTempKeys,\n removeFieldsThatDontExistOnSchema,\n} from '../../pages/EditView/utils/data';\nimport { HistoryContextValue, useHistoryContext } from '../pages/History';\n\nimport { VersionInputRenderer } from './VersionInputRenderer';\n\nimport type { Metadatas } from '../../../../shared/contracts/content-types';\nimport type { GetInitData } from '../../../../shared/contracts/init';\nimport type { ComponentsDictionary, Document } from '../../hooks/useDocument';\nimport type { EditFieldLayout } from '../../hooks/useDocumentLayout';\nimport type { Schema } from '@strapi/types';\n\nconst createLayoutFromFields = <T extends EditFieldLayout | UnknownField>(fields: T[]) => {\n return (\n fields\n .reduce<Array<T[]>>((rows, field) => {\n if (field.type === 'dynamiczone') {\n // Dynamic zones take up all the columns in a row\n rows.push([field]);\n\n return rows;\n }\n\n if (!rows[rows.length - 1]) {\n // Create a new row if there isn't one available\n rows.push([]);\n }\n\n // Push fields to the current row, they wrap and handle their own column size\n rows[rows.length - 1].push(field);\n\n return rows;\n }, [])\n // Map the rows to panels\n .map((row) => [row])\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * getRemainingFieldsLayout\n * -----------------------------------------------------------------------------------------------*/\n\ninterface GetRemainingFieldsLayoutOptions\n extends Pick<HistoryContextValue, 'layout'>,\n Pick<GetInitData.Response['data'], 'fieldSizes'> {\n schemaAttributes: HistoryContextValue['schema']['attributes'];\n metadatas: Metadatas;\n}\n\n/**\n * Build a layout for the fields that are were deleted from the edit view layout\n * via the configure the view page. This layout will be merged with the main one.\n * Those fields would be restored if the user restores the history version, which is why it's\n * important to show them, even if they're not in the normal layout.\n */\nfunction getRemaingFieldsLayout({\n layout,\n metadatas,\n schemaAttributes,\n fieldSizes,\n}: GetRemainingFieldsLayoutOptions) {\n const fieldsInLayout = layout.flatMap((panel) =>\n panel.flatMap((row) => row.flatMap((field) => field.name))\n );\n const remainingFields = Object.entries(metadatas).reduce<EditFieldLayout[]>(\n (currentRemainingFields, [name, field]) => {\n // Make sure we do not fields that are not visible, e.g. \"id\"\n if (!fieldsInLayout.includes(name) && field.edit.visible === true) {\n const attribute = schemaAttributes[name];\n // @ts-expect-error not sure why attribute causes type error\n currentRemainingFields.push({\n attribute,\n type: attribute.type,\n visible: true,\n disabled: true,\n label: field.edit.label || name,\n name: name,\n size: fieldSizes[attribute.type].default ?? 12,\n });\n }\n\n return currentRemainingFields;\n },\n []\n );\n\n return createLayoutFromFields(remainingFields);\n}\n\n/* -------------------------------------------------------------------------------------------------\n * FormPanel\n * -----------------------------------------------------------------------------------------------*/\n\nconst FormPanel = ({ panel }: { panel: EditFieldLayout[][] }) => {\n if (panel.some((row) => row.some((field) => field.type === 'dynamiczone'))) {\n const [row] = panel;\n const [field] = row;\n\n return (\n <Grid.Root key={field.name} gap={4}>\n <Grid.Item col={12} s={12} xs={12} direction=\"column\" alignItems=\"stretch\">\n <VersionInputRenderer {...field} />\n </Grid.Item>\n </Grid.Root>\n );\n }\n\n return (\n <Box\n hasRadius\n background=\"neutral0\"\n shadow=\"tableShadow\"\n paddingLeft={6}\n paddingRight={6}\n paddingTop={6}\n paddingBottom={6}\n borderColor=\"neutral150\"\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {panel.map((row, gridRowIndex) => (\n <Grid.Root key={gridRowIndex} gap={4}>\n {row.map(({ size, ...field }) => {\n return (\n <Grid.Item\n col={size}\n key={field.name}\n s={12}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <VersionInputRenderer {...field} />\n </Grid.Item>\n );\n })}\n </Grid.Root>\n ))}\n </Flex>\n </Box>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * VersionContent\n * -----------------------------------------------------------------------------------------------*/\n\ntype UnknownField = EditFieldLayout & { shouldIgnoreRBAC: boolean };\n\nconst VersionContent = () => {\n const { formatMessage } = useIntl();\n const { fieldSizes } = useTypedSelector((state) => state['content-manager'].app);\n const version = useHistoryContext('VersionContent', (state) => state.selectedVersion);\n const layout = useHistoryContext('VersionContent', (state) => state.layout);\n const configuration = useHistoryContext('VersionContent', (state) => state.configuration);\n const schema = useHistoryContext('VersionContent', (state) => state.schema);\n\n // Build a layout for the unknown fields section\n const removedAttributes = version.meta.unknownAttributes.removed;\n const removedAttributesAsFields = Object.entries(removedAttributes).map(\n ([attributeName, attribute]) => {\n const field = {\n attribute,\n shouldIgnoreRBAC: true,\n type: attribute.type,\n visible: true,\n disabled: true,\n label: attributeName,\n name: attributeName,\n size: fieldSizes[attribute.type].default ?? 12,\n } as UnknownField;\n\n return field;\n }\n );\n const unknownFieldsLayout = createLayoutFromFields(removedAttributesAsFields);\n\n // Build a layout for the fields that are were deleted from the layout\n const remainingFieldsLayout = getRemaingFieldsLayout({\n metadatas: configuration.contentType.metadatas,\n layout,\n schemaAttributes: schema.attributes,\n fieldSizes,\n });\n\n const { components } = useDoc();\n\n /**\n * Transform the data before passing it to the form so that each field\n * has a uniquely generated key\n */\n const transformedData = React.useMemo(() => {\n const transform =\n (schemaAttributes: Schema.Attributes, components: ComponentsDictionary = {}) =>\n (document: Omit<Document, 'id'>) => {\n const schema = { attributes: schemaAttributes };\n\n const transformations = pipe(\n removeFieldsThatDontExistOnSchema(schema),\n prepareTempKeys(schema, components)\n );\n return transformations(document);\n };\n\n return transform(version.schema, components)(version.data);\n }, [components, version.data, version.schema]);\n\n return (\n <Layouts.Content>\n <Box paddingBottom={8}>\n <Form disabled={true} method=\"PUT\" initialValues={transformedData}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6} position=\"relative\">\n {[...layout, ...remainingFieldsLayout].map((panel, index) => {\n return <FormPanel key={index} panel={panel} />;\n })}\n </Flex>\n </Form>\n </Box>\n {removedAttributesAsFields.length > 0 && (\n <>\n <Divider />\n <Box paddingTop={8}>\n <Flex direction=\"column\" alignItems=\"flex-start\" paddingBottom={6} gap={1}>\n <Typography variant=\"delta\">\n {formatMessage({\n id: 'content-manager.history.content.unknown-fields.title',\n defaultMessage: 'Unknown fields',\n })}\n </Typography>\n <Typography variant=\"pi\">\n {formatMessage(\n {\n id: 'content-manager.history.content.unknown-fields.message',\n defaultMessage:\n 'These fields have been deleted or renamed in the Content-Type Builder. <b>These fields will not be restored.</b>',\n },\n {\n b: (chunks: React.ReactNode) => (\n <Typography variant=\"pi\" fontWeight=\"bold\">\n {chunks}\n </Typography>\n ),\n }\n )}\n </Typography>\n </Flex>\n <Form disabled={true} method=\"PUT\" initialValues={version.data}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6} position=\"relative\">\n {unknownFieldsLayout.map((panel, index) => {\n return <FormPanel key={index} panel={panel} />;\n })}\n </Flex>\n </Form>\n </Box>\n </>\n )}\n </Layouts.Content>\n );\n};\n\nexport { VersionContent, getRemaingFieldsLayout };\n"],"names":["createLayoutFromFields","fields","reduce","rows","field","type","push","length","map","row","getRemaingFieldsLayout","layout","metadatas","schemaAttributes","fieldSizes","fieldsInLayout","flatMap","panel","name","remainingFields","Object","entries","currentRemainingFields","includes","edit","visible","attribute","disabled","label","size","default","FormPanel","some","_jsx","Grid","Root","gap","Item","col","s","xs","direction","alignItems","VersionInputRenderer","Box","hasRadius","background","shadow","paddingLeft","paddingRight","paddingTop","paddingBottom","borderColor","Flex","gridRowIndex","VersionContent","formatMessage","useIntl","useTypedSelector","state","app","version","useHistoryContext","selectedVersion","configuration","schema","removedAttributes","meta","unknownAttributes","removed","removedAttributesAsFields","attributeName","shouldIgnoreRBAC","unknownFieldsLayout","remainingFieldsLayout","contentType","attributes","components","useDoc","transformedData","React","useMemo","transform","document","transformations","pipe","removeFieldsThatDontExistOnSchema","prepareTempKeys","data","_jsxs","Layouts","Content","Form","method","initialValues","position","index","_Fragment","Divider","Typography","variant","id","defaultMessage","b","chunks","fontWeight"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VersionContent.mjs","sources":["../../../../admin/src/history/components/VersionContent.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Form, Layouts, useForm, createRulesEngine } from '@strapi/admin/strapi-admin';\nimport { Box, Divider, Flex, Grid, Typography } from '@strapi/design-system';\nimport pipe from 'lodash/fp/pipe';\nimport { useIntl } from 'react-intl';\n\nimport { useDoc } from '../../hooks/useDocument';\nimport { useTypedSelector } from '../../modules/hooks';\nimport {\n prepareTempKeys,\n removeFieldsThatDontExistOnSchema,\n} from '../../pages/EditView/utils/data';\nimport { HistoryContextValue, useHistoryContext } from '../pages/History';\n\nimport { VersionInputRenderer } from './VersionInputRenderer';\n\nimport type { Metadatas } from '../../../../shared/contracts/content-types';\nimport type { GetInitData } from '../../../../shared/contracts/init';\nimport type { ComponentsDictionary, Document } from '../../hooks/useDocument';\nimport type { EditFieldLayout } from '../../hooks/useDocumentLayout';\nimport type { Schema } from '@strapi/types';\n\nconst createLayoutFromFields = <T extends EditFieldLayout | UnknownField>(fields: T[]) => {\n return (\n fields\n .reduce<Array<T[]>>((rows, field) => {\n if (field.type === 'dynamiczone') {\n // Dynamic zones take up all the columns in a row\n rows.push([field]);\n\n return rows;\n }\n\n if (!rows[rows.length - 1]) {\n // Create a new row if there isn't one available\n rows.push([]);\n }\n\n // Push fields to the current row, they wrap and handle their own column size\n rows[rows.length - 1].push(field);\n\n return rows;\n }, [])\n // Map the rows to panels\n .map((row) => [row])\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * getRemainingFieldsLayout\n * -----------------------------------------------------------------------------------------------*/\n\ninterface GetRemainingFieldsLayoutOptions\n extends Pick<HistoryContextValue, 'layout'>,\n Pick<GetInitData.Response['data'], 'fieldSizes'> {\n schemaAttributes: HistoryContextValue['schema']['attributes'];\n metadatas: Metadatas;\n}\n\n/**\n * Build a layout for the fields that are were deleted from the edit view layout\n * via the configure the view page. This layout will be merged with the main one.\n * Those fields would be restored if the user restores the history version, which is why it's\n * important to show them, even if they're not in the normal layout.\n */\nfunction getRemaingFieldsLayout({\n layout,\n metadatas,\n schemaAttributes,\n fieldSizes,\n}: GetRemainingFieldsLayoutOptions) {\n const fieldsInLayout = layout.flatMap((panel) =>\n panel.flatMap((row) => row.flatMap((field) => field.name))\n );\n const remainingFields = Object.entries(metadatas).reduce<EditFieldLayout[]>(\n (currentRemainingFields, [name, field]) => {\n // Make sure we do not fields that are not visible, e.g. \"id\"\n if (!fieldsInLayout.includes(name) && field.edit.visible === true) {\n const attribute = schemaAttributes[name];\n // @ts-expect-error not sure why attribute causes type error\n currentRemainingFields.push({\n attribute,\n type: attribute.type,\n visible: true,\n disabled: true,\n label: field.edit.label || name,\n name: name,\n size: fieldSizes[attribute.type].default ?? 12,\n });\n }\n\n return currentRemainingFields;\n },\n []\n );\n\n return createLayoutFromFields(remainingFields);\n}\n\n/* -------------------------------------------------------------------------------------------------\n * FormPanel\n * -----------------------------------------------------------------------------------------------*/\n\nconst FormPanel = ({ panel }: { panel: EditFieldLayout[][] }) => {\n const fieldValues = useForm('Fields', (state) => state.values);\n const rulesEngine = createRulesEngine();\n if (panel.some((row) => row.some((field) => field.type === 'dynamiczone'))) {\n const [row] = panel;\n const [field] = row;\n const condition = field.attribute?.conditions?.visible;\n\n if (condition) {\n const isVisible = rulesEngine.evaluate(condition, fieldValues);\n if (!isVisible) {\n return null; // Skip rendering the dynamic zone if the condition is not met\n }\n }\n\n return (\n <Grid.Root key={field.name} gap={4}>\n <Grid.Item col={12} s={12} xs={12} direction=\"column\" alignItems=\"stretch\">\n <VersionInputRenderer {...field} />\n </Grid.Item>\n </Grid.Root>\n );\n }\n\n return (\n <Box\n hasRadius\n background=\"neutral0\"\n shadow=\"tableShadow\"\n paddingLeft={6}\n paddingRight={6}\n paddingTop={6}\n paddingBottom={6}\n borderColor=\"neutral150\"\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {panel.map((row, gridRowIndex) => {\n const visibleFields = row.filter((field) => {\n const condition = field.attribute?.conditions?.visible;\n\n if (condition) {\n return rulesEngine.evaluate(condition, fieldValues);\n }\n\n return true;\n });\n\n if (visibleFields.length === 0) {\n return null; // Skip rendering the entire grid row\n }\n\n return (\n <Grid.Root key={gridRowIndex} gap={4}>\n {visibleFields.map(({ size, ...field }) => {\n return (\n <Grid.Item\n col={size}\n key={field.name}\n s={12}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <VersionInputRenderer {...field} />\n </Grid.Item>\n );\n })}\n </Grid.Root>\n );\n })}\n </Flex>\n </Box>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * VersionContent\n * -----------------------------------------------------------------------------------------------*/\n\ntype UnknownField = EditFieldLayout & { shouldIgnoreRBAC: boolean };\n\nconst VersionContent = () => {\n const { formatMessage } = useIntl();\n const { fieldSizes } = useTypedSelector((state) => state['content-manager'].app);\n const version = useHistoryContext('VersionContent', (state) => state.selectedVersion);\n const layout = useHistoryContext('VersionContent', (state) => state.layout);\n const configuration = useHistoryContext('VersionContent', (state) => state.configuration);\n const schema = useHistoryContext('VersionContent', (state) => state.schema);\n\n // Build a layout for the unknown fields section\n const removedAttributes = version.meta.unknownAttributes.removed;\n const removedAttributesAsFields = Object.entries(removedAttributes).map(\n ([attributeName, attribute]) => {\n const field = {\n attribute,\n shouldIgnoreRBAC: true,\n type: attribute.type,\n visible: true,\n disabled: true,\n label: attributeName,\n name: attributeName,\n size: fieldSizes[attribute.type].default ?? 12,\n } as UnknownField;\n\n return field;\n }\n );\n const unknownFieldsLayout = createLayoutFromFields(removedAttributesAsFields);\n\n // Build a layout for the fields that are were deleted from the layout\n const remainingFieldsLayout = getRemaingFieldsLayout({\n metadatas: configuration.contentType.metadatas,\n layout,\n schemaAttributes: schema.attributes,\n fieldSizes,\n });\n\n const { components } = useDoc();\n\n /**\n * Transform the data before passing it to the form so that each field\n * has a uniquely generated key\n */\n const transformedData = React.useMemo(() => {\n const transform =\n (schemaAttributes: Schema.Attributes, components: ComponentsDictionary = {}) =>\n (document: Omit<Document, 'id'>) => {\n const schema = { attributes: schemaAttributes };\n\n const transformations = pipe(\n removeFieldsThatDontExistOnSchema(schema),\n prepareTempKeys(schema, components)\n );\n return transformations(document);\n };\n\n return transform(version.schema, components)(version.data);\n }, [components, version.data, version.schema]);\n\n return (\n <Layouts.Content>\n <Box paddingBottom={8}>\n <Form disabled={true} method=\"PUT\" initialValues={transformedData}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6} position=\"relative\">\n {[...layout, ...remainingFieldsLayout].map((panel, index) => {\n return <FormPanel key={index} panel={panel} />;\n })}\n </Flex>\n </Form>\n </Box>\n {removedAttributesAsFields.length > 0 && (\n <>\n <Divider />\n <Box paddingTop={8}>\n <Flex direction=\"column\" alignItems=\"flex-start\" paddingBottom={6} gap={1}>\n <Typography variant=\"delta\">\n {formatMessage({\n id: 'content-manager.history.content.unknown-fields.title',\n defaultMessage: 'Unknown fields',\n })}\n </Typography>\n <Typography variant=\"pi\">\n {formatMessage(\n {\n id: 'content-manager.history.content.unknown-fields.message',\n defaultMessage:\n 'These fields have been deleted or renamed in the Content-Type Builder. <b>These fields will not be restored.</b>',\n },\n {\n b: (chunks: React.ReactNode) => (\n <Typography variant=\"pi\" fontWeight=\"bold\">\n {chunks}\n </Typography>\n ),\n }\n )}\n </Typography>\n </Flex>\n <Form disabled={true} method=\"PUT\" initialValues={version.data}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6} position=\"relative\">\n {unknownFieldsLayout.map((panel, index) => {\n return <FormPanel key={index} panel={panel} />;\n })}\n </Flex>\n </Form>\n </Box>\n </>\n )}\n </Layouts.Content>\n );\n};\n\nexport { VersionContent, getRemaingFieldsLayout };\n"],"names":["createLayoutFromFields","fields","reduce","rows","field","type","push","length","map","row","getRemaingFieldsLayout","layout","metadatas","schemaAttributes","fieldSizes","fieldsInLayout","flatMap","panel","name","remainingFields","Object","entries","currentRemainingFields","includes","edit","visible","attribute","disabled","label","size","default","FormPanel","fieldValues","useForm","state","values","rulesEngine","createRulesEngine","some","condition","conditions","isVisible","evaluate","_jsx","Grid","Root","gap","Item","col","s","xs","direction","alignItems","VersionInputRenderer","Box","hasRadius","background","shadow","paddingLeft","paddingRight","paddingTop","paddingBottom","borderColor","Flex","gridRowIndex","visibleFields","filter","VersionContent","formatMessage","useIntl","useTypedSelector","app","version","useHistoryContext","selectedVersion","configuration","schema","removedAttributes","meta","unknownAttributes","removed","removedAttributesAsFields","attributeName","shouldIgnoreRBAC","unknownFieldsLayout","remainingFieldsLayout","contentType","attributes","components","useDoc","transformedData","React","useMemo","transform","document","transformations","pipe","removeFieldsThatDontExistOnSchema","prepareTempKeys","data","_jsxs","Layouts","Content","Form","method","initialValues","position","index","_Fragment","Divider","Typography","variant","id","defaultMessage","b","chunks","fontWeight"],"mappings":"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"}
|
|
@@ -122,6 +122,12 @@ const VersionHeader = ({ headerId })=>{
|
|
|
122
122
|
hour: 'numeric',
|
|
123
123
|
minute: 'numeric'
|
|
124
124
|
}),
|
|
125
|
+
secondaryAction: /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.GradientBadge, {
|
|
126
|
+
label: formatMessage({
|
|
127
|
+
id: 'components.premiumFeature.title',
|
|
128
|
+
defaultMessage: 'Premium feature'
|
|
129
|
+
})
|
|
130
|
+
}),
|
|
125
131
|
subtitle: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
|
|
126
132
|
variant: "epsilon",
|
|
127
133
|
textColor: "neutral600",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VersionHeader.js","sources":["../../../../admin/src/history/components/VersionHeader.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n ConfirmDialog,\n useNotification,\n useQueryParams,\n useTracking,\n useRBAC,\n Layouts,\n} from '@strapi/admin/strapi-admin';\nimport { Button, Typography, Flex, Link, Dialog } from '@strapi/design-system';\nimport { ArrowLeft, WarningCircle } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { NavLink, useNavigate, useParams, type To } from 'react-router-dom';\n\nimport { PERMISSIONS } from '../../constants/plugin';\nimport { useHistoryContext } from '../pages/History';\nimport { useRestoreVersionMutation } from '../services/historyVersion';\n\nimport type { UID } from '@strapi/types';\n\ninterface VersionHeaderProps {\n headerId: string;\n}\n\nexport const VersionHeader = ({ headerId }: VersionHeaderProps) => {\n const [isConfirmDialogOpen, setIsConfirmDialogOpen] = React.useState(false);\n const navigate = useNavigate();\n const { formatMessage, formatDate } = useIntl();\n const { trackUsage } = useTracking();\n const { toggleNotification } = useNotification();\n const [{ query }] = useQueryParams<{\n plugins?: Record<string, unknown>;\n }>();\n const { collectionType, slug } = useParams<{ collectionType: string; slug: UID.ContentType }>();\n const [restoreVersion, { isLoading }] = useRestoreVersionMutation();\n const { allowedActions } = useRBAC(PERMISSIONS.map((action) => ({ action, subject: slug })));\n\n const version = useHistoryContext('VersionHeader', (state) => state.selectedVersion);\n const mainField = useHistoryContext('VersionHeader', (state) => state.mainField);\n const schema = useHistoryContext('VersionHeader', (state) => state.schema);\n const isCurrentVersion = useHistoryContext(\n 'VersionHeader',\n (state) => state.page === 1 && state.versions.data[0].id === state.selectedVersion.id\n );\n\n const mainFieldValue = version.data[mainField];\n\n const getNextNavigation = (): To => {\n const pluginsQueryParams = stringify({ plugins: query.plugins }, { encode: false });\n\n return {\n pathname: '..',\n search: pluginsQueryParams,\n };\n };\n\n const handleRestore = async () => {\n try {\n const response = await restoreVersion({\n documentId: version.relatedDocumentId,\n collectionType,\n params: {\n versionId: version.id,\n contentType: version.contentType,\n },\n body: { contentType: version.contentType },\n });\n\n if ('data' in response) {\n navigate(getNextNavigation(), { relative: 'path' });\n\n toggleNotification({\n type: 'success',\n title: formatMessage({\n id: 'content-manager.restore.success.title',\n defaultMessage: 'Version restored.',\n }),\n message: formatMessage({\n id: 'content-manager.restore.success.message',\n defaultMessage: 'A past version of the content was restored.',\n }),\n });\n\n trackUsage('didRestoreHistoryVersion');\n }\n\n if ('error' in response) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'content-manager.history.restore.error.message',\n defaultMessage: 'Could not restore version.',\n }),\n });\n }\n } catch (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n return (\n <Dialog.Root open={isConfirmDialogOpen} onOpenChange={setIsConfirmDialogOpen}>\n <Layouts.BaseHeader\n id={headerId}\n title={formatDate(new Date(version.createdAt), {\n year: 'numeric',\n month: 'numeric',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n })}\n subtitle={\n <Typography variant=\"epsilon\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: 'content-manager.history.version.subtitle',\n defaultMessage:\n '{hasLocale, select, true {{subtitle}, in {locale}} other {{subtitle}}}',\n },\n {\n hasLocale: Boolean(version.locale),\n subtitle: `${mainFieldValue || ''} (${schema.info.singularName})`.trim(),\n locale: version.locale?.name,\n }\n )}\n </Typography>\n }\n navigationAction={\n <Link\n startIcon={<ArrowLeft />}\n tag={NavLink}\n to={getNextNavigation()}\n relative=\"path\"\n isExternal={false}\n >\n {formatMessage({\n id: 'global.back',\n defaultMessage: 'Back',\n })}\n </Link>\n }\n sticky={false}\n primaryAction={\n <Dialog.Trigger>\n <Button\n disabled={!allowedActions.canUpdate || isCurrentVersion}\n onClick={() => {\n setIsConfirmDialogOpen(true);\n }}\n >\n {formatMessage({\n id: 'content-manager.history.restore.confirm.button',\n defaultMessage: 'Restore',\n })}\n </Button>\n </Dialog.Trigger>\n }\n />\n <ConfirmDialog\n onConfirm={handleRestore}\n endAction={\n <Button variant=\"secondary\" onClick={handleRestore} loading={isLoading}>\n {formatMessage({\n id: 'content-manager.history.restore.confirm.button',\n defaultMessage: 'Restore',\n })}\n </Button>\n }\n >\n <Flex\n direction=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={2}\n textAlign=\"center\"\n >\n <Flex justifyContent=\"center\">\n <WarningCircle width=\"24px\" height=\"24px\" fill=\"danger600\" />\n </Flex>\n <Typography>\n {formatMessage({\n id: 'content-manager.history.restore.confirm.title',\n defaultMessage: 'Are you sure you want to restore this version?',\n })}\n </Typography>\n <Typography>\n {formatMessage(\n {\n id: 'content-manager.history.restore.confirm.message',\n defaultMessage:\n \"{isDraft, select, true {The restored content will override your draft.} other {The restored content won't be published, it will override the draft and be saved as pending changes. You'll be able to publish the changes at anytime.}}\",\n },\n {\n isDraft: version.status === 'draft',\n }\n )}\n </Typography>\n </Flex>\n </ConfirmDialog>\n </Dialog.Root>\n );\n};\n"],"names":["VersionHeader","headerId","isConfirmDialogOpen","setIsConfirmDialogOpen","React","useState","navigate","useNavigate","formatMessage","formatDate","useIntl","trackUsage","useTracking","toggleNotification","useNotification","query","useQueryParams","collectionType","slug","useParams","restoreVersion","isLoading","useRestoreVersionMutation","allowedActions","useRBAC","PERMISSIONS","map","action","subject","version","useHistoryContext","state","selectedVersion","mainField","schema","isCurrentVersion","page","versions","data","id","mainFieldValue","getNextNavigation","pluginsQueryParams","stringify","plugins","encode","pathname","search","handleRestore","response","documentId","relatedDocumentId","params","versionId","contentType","body","relative","type","title","defaultMessage","message","error","_jsxs","Dialog","Root","open","onOpenChange","_jsx","Layouts","BaseHeader","Date","createdAt","year","month","day","hour","minute","subtitle","Typography","variant","textColor","hasLocale","Boolean","locale","info","singularName","trim","name","navigationAction","Link","startIcon","ArrowLeft","tag","NavLink","to","isExternal","sticky","primaryAction","Trigger","Button","disabled","canUpdate","onClick","ConfirmDialog","onConfirm","endAction","loading","Flex","direction","alignItems","justifyContent","gap","textAlign","WarningCircle","width","height","fill","isDraft","status"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VersionHeader.js","sources":["../../../../admin/src/history/components/VersionHeader.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n ConfirmDialog,\n useNotification,\n useQueryParams,\n useTracking,\n useRBAC,\n Layouts,\n GradientBadge,\n} from '@strapi/admin/strapi-admin';\nimport { Button, Typography, Flex, Link, Dialog } from '@strapi/design-system';\nimport { ArrowLeft, WarningCircle } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { NavLink, useNavigate, useParams, type To } from 'react-router-dom';\n\nimport { PERMISSIONS } from '../../constants/plugin';\nimport { useHistoryContext } from '../pages/History';\nimport { useRestoreVersionMutation } from '../services/historyVersion';\n\nimport type { UID } from '@strapi/types';\n\ninterface VersionHeaderProps {\n headerId: string;\n}\n\nexport const VersionHeader = ({ headerId }: VersionHeaderProps) => {\n const [isConfirmDialogOpen, setIsConfirmDialogOpen] = React.useState(false);\n const navigate = useNavigate();\n const { formatMessage, formatDate } = useIntl();\n const { trackUsage } = useTracking();\n const { toggleNotification } = useNotification();\n const [{ query }] = useQueryParams<{\n plugins?: Record<string, unknown>;\n }>();\n const { collectionType, slug } = useParams<{ collectionType: string; slug: UID.ContentType }>();\n const [restoreVersion, { isLoading }] = useRestoreVersionMutation();\n const { allowedActions } = useRBAC(PERMISSIONS.map((action) => ({ action, subject: slug })));\n\n const version = useHistoryContext('VersionHeader', (state) => state.selectedVersion);\n const mainField = useHistoryContext('VersionHeader', (state) => state.mainField);\n const schema = useHistoryContext('VersionHeader', (state) => state.schema);\n const isCurrentVersion = useHistoryContext(\n 'VersionHeader',\n (state) => state.page === 1 && state.versions.data[0].id === state.selectedVersion.id\n );\n\n const mainFieldValue = version.data[mainField];\n\n const getNextNavigation = (): To => {\n const pluginsQueryParams = stringify({ plugins: query.plugins }, { encode: false });\n\n return {\n pathname: '..',\n search: pluginsQueryParams,\n };\n };\n\n const handleRestore = async () => {\n try {\n const response = await restoreVersion({\n documentId: version.relatedDocumentId,\n collectionType,\n params: {\n versionId: version.id,\n contentType: version.contentType,\n },\n body: { contentType: version.contentType },\n });\n\n if ('data' in response) {\n navigate(getNextNavigation(), { relative: 'path' });\n\n toggleNotification({\n type: 'success',\n title: formatMessage({\n id: 'content-manager.restore.success.title',\n defaultMessage: 'Version restored.',\n }),\n message: formatMessage({\n id: 'content-manager.restore.success.message',\n defaultMessage: 'A past version of the content was restored.',\n }),\n });\n\n trackUsage('didRestoreHistoryVersion');\n }\n\n if ('error' in response) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'content-manager.history.restore.error.message',\n defaultMessage: 'Could not restore version.',\n }),\n });\n }\n } catch (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n return (\n <Dialog.Root open={isConfirmDialogOpen} onOpenChange={setIsConfirmDialogOpen}>\n <Layouts.BaseHeader\n id={headerId}\n title={formatDate(new Date(version.createdAt), {\n year: 'numeric',\n month: 'numeric',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n })}\n secondaryAction={\n <GradientBadge\n label={formatMessage({\n id: 'components.premiumFeature.title',\n defaultMessage: 'Premium feature',\n })}\n />\n }\n subtitle={\n <Typography variant=\"epsilon\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: 'content-manager.history.version.subtitle',\n defaultMessage:\n '{hasLocale, select, true {{subtitle}, in {locale}} other {{subtitle}}}',\n },\n {\n hasLocale: Boolean(version.locale),\n subtitle: `${mainFieldValue || ''} (${schema.info.singularName})`.trim(),\n locale: version.locale?.name,\n }\n )}\n </Typography>\n }\n navigationAction={\n <Link\n startIcon={<ArrowLeft />}\n tag={NavLink}\n to={getNextNavigation()}\n relative=\"path\"\n isExternal={false}\n >\n {formatMessage({\n id: 'global.back',\n defaultMessage: 'Back',\n })}\n </Link>\n }\n sticky={false}\n primaryAction={\n <Dialog.Trigger>\n <Button\n disabled={!allowedActions.canUpdate || isCurrentVersion}\n onClick={() => {\n setIsConfirmDialogOpen(true);\n }}\n >\n {formatMessage({\n id: 'content-manager.history.restore.confirm.button',\n defaultMessage: 'Restore',\n })}\n </Button>\n </Dialog.Trigger>\n }\n />\n <ConfirmDialog\n onConfirm={handleRestore}\n endAction={\n <Button variant=\"secondary\" onClick={handleRestore} loading={isLoading}>\n {formatMessage({\n id: 'content-manager.history.restore.confirm.button',\n defaultMessage: 'Restore',\n })}\n </Button>\n }\n >\n <Flex\n direction=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={2}\n textAlign=\"center\"\n >\n <Flex justifyContent=\"center\">\n <WarningCircle width=\"24px\" height=\"24px\" fill=\"danger600\" />\n </Flex>\n <Typography>\n {formatMessage({\n id: 'content-manager.history.restore.confirm.title',\n defaultMessage: 'Are you sure you want to restore this version?',\n })}\n </Typography>\n <Typography>\n {formatMessage(\n {\n id: 'content-manager.history.restore.confirm.message',\n defaultMessage:\n \"{isDraft, select, true {The restored content will override your draft.} other {The restored content won't be published, it will override the draft and be saved as pending changes. You'll be able to publish the changes at anytime.}}\",\n },\n {\n isDraft: version.status === 'draft',\n }\n )}\n </Typography>\n </Flex>\n </ConfirmDialog>\n </Dialog.Root>\n );\n};\n"],"names":["VersionHeader","headerId","isConfirmDialogOpen","setIsConfirmDialogOpen","React","useState","navigate","useNavigate","formatMessage","formatDate","useIntl","trackUsage","useTracking","toggleNotification","useNotification","query","useQueryParams","collectionType","slug","useParams","restoreVersion","isLoading","useRestoreVersionMutation","allowedActions","useRBAC","PERMISSIONS","map","action","subject","version","useHistoryContext","state","selectedVersion","mainField","schema","isCurrentVersion","page","versions","data","id","mainFieldValue","getNextNavigation","pluginsQueryParams","stringify","plugins","encode","pathname","search","handleRestore","response","documentId","relatedDocumentId","params","versionId","contentType","body","relative","type","title","defaultMessage","message","error","_jsxs","Dialog","Root","open","onOpenChange","_jsx","Layouts","BaseHeader","Date","createdAt","year","month","day","hour","minute","secondaryAction","GradientBadge","label","subtitle","Typography","variant","textColor","hasLocale","Boolean","locale","info","singularName","trim","name","navigationAction","Link","startIcon","ArrowLeft","tag","NavLink","to","isExternal","sticky","primaryAction","Trigger","Button","disabled","canUpdate","onClick","ConfirmDialog","onConfirm","endAction","loading","Flex","direction","alignItems","justifyContent","gap","textAlign","WarningCircle","width","height","fill","isDraft","status"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import * as React from 'react';
|
|
3
|
-
import { useTracking, useNotification, useQueryParams, useRBAC, Layouts, ConfirmDialog } from '@strapi/admin/strapi-admin';
|
|
3
|
+
import { useTracking, useNotification, useQueryParams, useRBAC, Layouts, GradientBadge, ConfirmDialog } from '@strapi/admin/strapi-admin';
|
|
4
4
|
import { Dialog, Typography, Link, Button, Flex } from '@strapi/design-system';
|
|
5
5
|
import { ArrowLeft, WarningCircle } from '@strapi/icons';
|
|
6
6
|
import { stringify } from 'qs';
|
|
@@ -101,6 +101,12 @@ const VersionHeader = ({ headerId })=>{
|
|
|
101
101
|
hour: 'numeric',
|
|
102
102
|
minute: 'numeric'
|
|
103
103
|
}),
|
|
104
|
+
secondaryAction: /*#__PURE__*/ jsx(GradientBadge, {
|
|
105
|
+
label: formatMessage({
|
|
106
|
+
id: 'components.premiumFeature.title',
|
|
107
|
+
defaultMessage: 'Premium feature'
|
|
108
|
+
})
|
|
109
|
+
}),
|
|
104
110
|
subtitle: /*#__PURE__*/ jsx(Typography, {
|
|
105
111
|
variant: "epsilon",
|
|
106
112
|
textColor: "neutral600",
|