@strapi/content-manager 5.48.0 → 5.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/components/ActionsDrawer.js +3 -2
- package/dist/admin/components/ActionsDrawer.js.map +1 -1
- package/dist/admin/components/ComponentIcon.js +4 -3
- package/dist/admin/components/ComponentIcon.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/EditFieldForm.js +3 -2
- package/dist/admin/components/ConfigurationForm/EditFieldForm.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/Fields.js +3 -2
- package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/Form.js +7 -3
- package/dist/admin/components/ConfigurationForm/Form.js.map +1 -1
- package/dist/admin/components/LeftMenu.js +3 -2
- package/dist/admin/components/LeftMenu.js.map +1 -1
- package/dist/admin/components/RelativeTime.js +3 -2
- package/dist/admin/components/RelativeTime.js.map +1 -1
- package/dist/admin/components/Widgets.js +3 -2
- package/dist/admin/components/Widgets.js.map +1 -1
- package/dist/admin/features/DocumentRBAC.js +12 -3
- package/dist/admin/features/DocumentRBAC.js.map +1 -1
- package/dist/admin/features/DocumentRBAC.mjs +9 -1
- package/dist/admin/features/DocumentRBAC.mjs.map +1 -1
- package/dist/admin/history/components/VersionContent.js +7 -3
- package/dist/admin/history/components/VersionContent.js.map +1 -1
- package/dist/admin/history/components/VersionHeader.js +3 -2
- package/dist/admin/history/components/VersionHeader.js.map +1 -1
- package/dist/admin/history/components/VersionInputRenderer.js +3 -2
- package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
- package/dist/admin/history/pages/History.js +3 -2
- package/dist/admin/history/pages/History.js.map +1 -1
- package/dist/admin/history/routes.js +3 -2
- package/dist/admin/history/routes.js.map +1 -1
- package/dist/admin/hooks/useContentTypeSchema.js +40 -19
- package/dist/admin/hooks/useContentTypeSchema.js.map +1 -1
- package/dist/admin/hooks/useContentTypeSchema.mjs +37 -17
- package/dist/admin/hooks/useContentTypeSchema.mjs.map +1 -1
- package/dist/admin/hooks/useDocument.js +3 -2
- package/dist/admin/hooks/useDocument.js.map +1 -1
- package/dist/admin/hooks/useDocumentActions.js +3 -2
- package/dist/admin/hooks/useDocumentActions.js.map +1 -1
- package/dist/admin/hooks/useDocumentContext.js +3 -2
- package/dist/admin/hooks/useDocumentContext.js.map +1 -1
- package/dist/admin/hooks/useDocumentLayout.js +46 -6
- package/dist/admin/hooks/useDocumentLayout.js.map +1 -1
- package/dist/admin/hooks/useDocumentLayout.mjs +43 -4
- package/dist/admin/hooks/useDocumentLayout.mjs.map +1 -1
- package/dist/admin/hooks/useDragAndDrop.js +3 -2
- package/dist/admin/hooks/useDragAndDrop.js.map +1 -1
- package/dist/admin/hooks/useKeyboardDragAndDrop.js +3 -2
- package/dist/admin/hooks/useKeyboardDragAndDrop.js.map +1 -1
- package/dist/admin/hooks/useOnce.js +3 -2
- package/dist/admin/hooks/useOnce.js.map +1 -1
- package/dist/admin/hooks/usePersistentQueryParams.js +7 -2
- package/dist/admin/hooks/usePersistentQueryParams.js.map +1 -1
- package/dist/admin/pages/ComponentConfigurationPage.js +9 -5
- package/dist/admin/pages/ComponentConfigurationPage.js.map +1 -1
- package/dist/admin/pages/ComponentConfigurationPage.mjs +6 -3
- package/dist/admin/pages/ComponentConfigurationPage.mjs.map +1 -1
- package/dist/admin/pages/EditConfigurationPage.js +3 -2
- package/dist/admin/pages/EditConfigurationPage.js.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.js +3 -2
- package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.js +80 -39
- package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.mjs +67 -33
- package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/EditorToolbarObserver.js +3 -2
- package/dist/admin/pages/EditView/components/EditorToolbarObserver.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js +4 -3
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.js +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +8 -4
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +5 -2
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.js +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +4 -3
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +14 -4
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +11 -2
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +16 -7
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +9 -4
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +7 -3
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/UID.js +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js +8 -4
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Field.js +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Field.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.js +5 -28
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.mjs +2 -26
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/continueList.js +5 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/continueList.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/mdRenderer.js +15 -2
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/mdRenderer.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.js +76 -0
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.mjs +70 -0
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormLayout.js +3 -2
- package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/Header.js +3 -2
- package/dist/admin/pages/EditView/components/Header.js.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js +3 -2
- package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
- package/dist/admin/pages/EditView/components/Panels.js +3 -2
- package/dist/admin/pages/EditView/components/Panels.js.map +1 -1
- package/dist/admin/pages/EditView/utils/data.js +5 -1
- package/dist/admin/pages/EditView/utils/data.js.map +1 -1
- package/dist/admin/pages/EditView/utils/keyboardShortcuts.js +35 -0
- package/dist/admin/pages/EditView/utils/keyboardShortcuts.js.map +1 -0
- package/dist/admin/pages/EditView/utils/keyboardShortcuts.mjs +33 -0
- package/dist/admin/pages/EditView/utils/keyboardShortcuts.mjs.map +1 -0
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js +7 -10
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs +5 -9
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.js +3 -2
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js +3 -2
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/Settings.js +3 -2
- package/dist/admin/pages/ListConfiguration/components/Settings.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js +9 -12
- package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs +6 -10
- package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.js +3 -2
- package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/Actions.js +3 -2
- package/dist/admin/pages/ListView/components/BulkActions/Actions.js.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js +3 -2
- package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js +3 -2
- package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.js +10 -11
- package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.mjs +7 -9
- package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/TableActions.js +3 -2
- package/dist/admin/pages/ListView/components/TableActions.js.map +1 -1
- package/dist/admin/pages/ListView/components/TableCells/CellContent.js +7 -3
- package/dist/admin/pages/ListView/components/TableCells/CellContent.js.map +1 -1
- package/dist/admin/pages/ListView/components/TableCells/CellValue.js +7 -2
- package/dist/admin/pages/ListView/components/TableCells/CellValue.js.map +1 -1
- package/dist/admin/pages/ListView/components/TableCells/Media.js +5 -4
- package/dist/admin/pages/ListView/components/TableCells/Media.js.map +1 -1
- package/dist/admin/pages/ListView/components/TableCells/Media.mjs +5 -4
- package/dist/admin/pages/ListView/components/TableCells/Media.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/TableCells/Relations.js +3 -2
- package/dist/admin/pages/ListView/components/TableCells/Relations.js.map +1 -1
- package/dist/admin/pages/formatComponentConfigurationEditLayout.js +15 -9
- package/dist/admin/pages/formatComponentConfigurationEditLayout.js.map +1 -1
- package/dist/admin/pages/formatComponentConfigurationEditLayout.mjs +15 -9
- package/dist/admin/pages/formatComponentConfigurationEditLayout.mjs.map +1 -1
- package/dist/admin/preview/components/InputPopover.js +3 -2
- package/dist/admin/preview/components/InputPopover.js.map +1 -1
- package/dist/admin/preview/hooks/usePreviewInputManager.js +3 -2
- package/dist/admin/preview/hooks/usePreviewInputManager.js.map +1 -1
- package/dist/admin/preview/pages/Preview.js +3 -2
- package/dist/admin/preview/pages/Preview.js.map +1 -1
- package/dist/admin/preview/routes.js +3 -2
- package/dist/admin/preview/routes.js.map +1 -1
- package/dist/admin/services/components.js +3 -2
- package/dist/admin/services/components.js.map +1 -1
- package/dist/admin/services/components.mjs +3 -2
- package/dist/admin/services/components.mjs.map +1 -1
- package/dist/admin/services/contentTypes.js +4 -3
- package/dist/admin/services/contentTypes.js.map +1 -1
- package/dist/admin/services/contentTypes.mjs +4 -3
- package/dist/admin/services/contentTypes.mjs.map +1 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.d.ts +2 -0
- package/dist/admin/src/pages/EditView/utils/keyboardShortcuts.d.ts +18 -0
- package/dist/admin/src/pages/ListConfiguration/components/SortDisplayedFields.d.ts +2 -2
- package/dist/admin/src/pages/ListView/components/TableCells/Media.d.ts +2 -2
- package/dist/admin/src/pages/formatComponentConfigurationEditLayout.d.ts +3 -1
- package/dist/admin/src/utils/layouts/normalizeContentManagerLayout.d.ts +24 -0
- package/dist/admin/translations/cs.json.js +2 -1
- package/dist/admin/translations/cs.json.js.map +1 -1
- package/dist/admin/translations/cs.json.mjs +2 -1
- package/dist/admin/translations/cs.json.mjs.map +1 -1
- package/dist/admin/translations/de.json.js +2 -1
- package/dist/admin/translations/de.json.js.map +1 -1
- package/dist/admin/translations/de.json.mjs +2 -1
- package/dist/admin/translations/de.json.mjs.map +1 -1
- package/dist/admin/translations/en.json.js +3 -1
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +3 -1
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/es.json.js +2 -1
- package/dist/admin/translations/es.json.js.map +1 -1
- package/dist/admin/translations/es.json.mjs +2 -1
- package/dist/admin/translations/es.json.mjs.map +1 -1
- package/dist/admin/translations/fr.json.js +2 -1
- package/dist/admin/translations/fr.json.js.map +1 -1
- package/dist/admin/translations/fr.json.mjs +2 -1
- package/dist/admin/translations/fr.json.mjs.map +1 -1
- package/dist/admin/translations/nl.json.js +2 -1
- package/dist/admin/translations/nl.json.js.map +1 -1
- package/dist/admin/translations/nl.json.mjs +2 -1
- package/dist/admin/translations/nl.json.mjs.map +1 -1
- package/dist/admin/translations/pl.json.js +2 -1
- package/dist/admin/translations/pl.json.js.map +1 -1
- package/dist/admin/translations/pl.json.mjs +2 -1
- package/dist/admin/translations/pl.json.mjs.map +1 -1
- package/dist/admin/translations/sk.json.js +2 -1
- package/dist/admin/translations/sk.json.js.map +1 -1
- package/dist/admin/translations/sk.json.mjs +2 -1
- package/dist/admin/translations/sk.json.mjs.map +1 -1
- package/dist/admin/utils/attributes.js +17 -2
- package/dist/admin/utils/attributes.js.map +1 -1
- package/dist/admin/utils/attributes.mjs +17 -2
- package/dist/admin/utils/attributes.mjs.map +1 -1
- package/dist/admin/utils/layouts/normalizeContentManagerLayout.js +329 -0
- package/dist/admin/utils/layouts/normalizeContentManagerLayout.js.map +1 -0
- package/dist/admin/utils/layouts/normalizeContentManagerLayout.mjs +321 -0
- package/dist/admin/utils/layouts/normalizeContentManagerLayout.mjs.map +1 -0
- package/dist/admin/utils/objects.js +9 -4
- package/dist/admin/utils/objects.js.map +1 -1
- package/dist/admin/utils/validation.js +7 -3
- package/dist/admin/utils/validation.js.map +1 -1
- package/dist/server/controllers/collection-types.js +7 -2
- package/dist/server/controllers/collection-types.js.map +1 -1
- package/dist/server/controllers/collection-types.mjs +7 -2
- package/dist/server/controllers/collection-types.mjs.map +1 -1
- package/dist/server/controllers/utils/clone.js +5 -1
- package/dist/server/controllers/utils/clone.js.map +1 -1
- package/dist/server/controllers/utils/clone.mjs.map +1 -1
- package/dist/server/controllers/validation/index.js +6 -2
- package/dist/server/controllers/validation/index.js.map +1 -1
- package/dist/server/homepage/services/homepage.js +6 -1
- package/dist/server/homepage/services/homepage.js.map +1 -1
- package/dist/server/homepage/services/homepage.mjs +6 -1
- package/dist/server/homepage/services/homepage.mjs.map +1 -1
- package/dist/server/mcp/handlers/collection-handlers.js +15 -18
- package/dist/server/mcp/handlers/collection-handlers.js.map +1 -1
- package/dist/server/mcp/handlers/collection-handlers.mjs +16 -19
- package/dist/server/mcp/handlers/collection-handlers.mjs.map +1 -1
- package/dist/server/mcp/handlers/single-type-handlers.js +12 -12
- package/dist/server/mcp/handlers/single-type-handlers.js.map +1 -1
- package/dist/server/mcp/handlers/single-type-handlers.mjs +13 -13
- package/dist/server/mcp/handlers/single-type-handlers.mjs.map +1 -1
- package/dist/server/mcp/register-content-manager-mcp-tools.js +4 -1
- package/dist/server/mcp/register-content-manager-mcp-tools.js.map +1 -1
- package/dist/server/mcp/register-content-manager-mcp-tools.mjs +4 -1
- package/dist/server/mcp/register-content-manager-mcp-tools.mjs.map +1 -1
- package/dist/server/mcp/sanitizers/shape-relations.js +108 -0
- package/dist/server/mcp/sanitizers/shape-relations.js.map +1 -0
- package/dist/server/mcp/sanitizers/shape-relations.mjs +103 -0
- package/dist/server/mcp/sanitizers/shape-relations.mjs.map +1 -0
- package/dist/server/mcp/schemas/data-schema.js +0 -3
- package/dist/server/mcp/schemas/data-schema.js.map +1 -1
- package/dist/server/mcp/schemas/data-schema.mjs +0 -3
- package/dist/server/mcp/schemas/data-schema.mjs.map +1 -1
- package/dist/server/mcp/schemas/output-schemas.js +30 -4
- package/dist/server/mcp/schemas/output-schemas.js.map +1 -1
- package/dist/server/mcp/schemas/output-schemas.mjs +30 -4
- package/dist/server/mcp/schemas/output-schemas.mjs.map +1 -1
- package/dist/server/mcp/utils.js +30 -3
- package/dist/server/mcp/utils.js.map +1 -1
- package/dist/server/mcp/utils.mjs +30 -4
- package/dist/server/mcp/utils.mjs.map +1 -1
- package/dist/server/middlewares/routing.js +5 -1
- package/dist/server/middlewares/routing.js.map +1 -1
- package/dist/server/services/populate-builder.js.map +1 -1
- package/dist/server/services/populate-builder.mjs.map +1 -1
- package/dist/server/services/uid.js +9 -4
- package/dist/server/services/uid.js.map +1 -1
- package/dist/server/services/utils/configuration/attributes.js +14 -10
- package/dist/server/services/utils/configuration/attributes.js.map +1 -1
- package/dist/server/services/utils/configuration/layouts.js +8 -4
- package/dist/server/services/utils/configuration/layouts.js.map +1 -1
- package/dist/server/services/utils/configuration/metadatas.js +19 -15
- package/dist/server/services/utils/configuration/metadatas.js.map +1 -1
- package/dist/server/services/utils/configuration/settings.js +5 -1
- package/dist/server/services/utils/configuration/settings.js.map +1 -1
- package/dist/server/services/utils/draft.js +5 -1
- package/dist/server/services/utils/draft.js.map +1 -1
- package/dist/server/services/utils/populate.js +8 -4
- package/dist/server/services/utils/populate.js.map +1 -1
- package/dist/server/services/utils/populate.mjs.map +1 -1
- package/dist/server/services/utils/store.js +9 -5
- package/dist/server/services/utils/store.js.map +1 -1
- package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
- package/dist/server/src/controllers/utils/clone.d.ts +1 -1
- package/dist/server/src/controllers/utils/clone.d.ts.map +1 -1
- package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +3 -1
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/mcp/handlers/collection-handlers.d.ts.map +1 -1
- package/dist/server/src/mcp/handlers/single-type-handlers.d.ts.map +1 -1
- package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts +2 -1
- package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts.map +1 -1
- package/dist/server/src/mcp/sanitizers/shape-relations.d.ts +38 -0
- package/dist/server/src/mcp/sanitizers/shape-relations.d.ts.map +1 -0
- package/dist/server/src/mcp/schemas/data-schema.d.ts +0 -3
- package/dist/server/src/mcp/schemas/data-schema.d.ts.map +1 -1
- package/dist/server/src/mcp/schemas/output-schemas.d.ts +2 -2
- package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -1
- package/dist/server/src/mcp/types.d.ts +2 -2
- package/dist/server/src/mcp/types.d.ts.map +1 -1
- package/dist/server/src/mcp/utils.d.ts +19 -1
- package/dist/server/src/mcp/utils.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +3 -1
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/populate-builder.d.ts +3 -1
- package/dist/server/src/services/populate-builder.d.ts.map +1 -1
- package/dist/server/src/services/utils/populate.d.ts +3 -1
- package/dist/server/src/services/utils/populate.d.ts.map +1 -1
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routing.js","sources":["../../../server/src/middlewares/routing.ts"],"sourcesContent":["import type { UID, Core, Struct } from '@strapi/types';\nimport type { Context, Next } from 'koa';\nimport isNil from 'lodash/isNil';\n\ninterface ContentType extends Struct.ContentTypeSchema {\n plugin?: string;\n}\n\nexport default async (ctx: Context, next: Next) => {\n const { model }: { model: UID.ContentType } = ctx.params;\n\n const ct: ContentType = strapi.contentTypes[model];\n\n if (!ct) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n let controllers;\n if (!ct.plugin || ct.plugin === 'admin') {\n controllers = strapi.admin.controllers;\n } else {\n controllers = strapi.plugin(ct.plugin).controllers;\n }\n\n const { route }: { route: Core.Route } = ctx.state;\n\n if (typeof route.handler !== 'string') {\n return next();\n }\n\n const [, action] = route.handler.split('.');\n\n let actionConfig: any;\n if (!ct.plugin || ct.plugin === 'admin') {\n actionConfig = strapi.config.get(`admin.layout.${ct.modelName}.actions.${action}`);\n } else {\n actionConfig = strapi.plugin(ct.plugin).config(`layout.${ct.modelName}.actions.${action}`);\n }\n\n if (!isNil(actionConfig)) {\n const [controller, action] = actionConfig.split('.');\n\n if (controller && action) {\n return controllers[controller.toLowerCase()][action](ctx, next);\n }\n }\n\n await next();\n};\n"],"names":["ctx","next","model","params","ct","strapi","contentTypes","send","error","controllers","plugin","admin","route","state","handler","action","split","actionConfig","config","get","modelName","isNil","controller","toLowerCase"],"mappings":"
|
|
1
|
+
{"version":3,"file":"routing.js","sources":["../../../server/src/middlewares/routing.ts"],"sourcesContent":["import type { UID, Core, Struct } from '@strapi/types';\nimport type { Context, Next } from 'koa';\nimport isNil from 'lodash/isNil';\n\ninterface ContentType extends Struct.ContentTypeSchema {\n plugin?: string;\n}\n\nexport default async (ctx: Context, next: Next) => {\n const { model }: { model: UID.ContentType } = ctx.params;\n\n const ct: ContentType = strapi.contentTypes[model];\n\n if (!ct) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n let controllers;\n if (!ct.plugin || ct.plugin === 'admin') {\n controllers = strapi.admin.controllers;\n } else {\n controllers = strapi.plugin(ct.plugin).controllers;\n }\n\n const { route }: { route: Core.Route } = ctx.state;\n\n if (typeof route.handler !== 'string') {\n return next();\n }\n\n const [, action] = route.handler.split('.');\n\n let actionConfig: any;\n if (!ct.plugin || ct.plugin === 'admin') {\n actionConfig = strapi.config.get(`admin.layout.${ct.modelName}.actions.${action}`);\n } else {\n actionConfig = strapi.plugin(ct.plugin).config(`layout.${ct.modelName}.actions.${action}`);\n }\n\n if (!isNil(actionConfig)) {\n const [controller, action] = actionConfig.split('.');\n\n if (controller && action) {\n return controllers[controller.toLowerCase()][action](ctx, next);\n }\n }\n\n await next();\n};\n"],"names":["ctx","next","model","params","ct","strapi","contentTypes","send","error","controllers","plugin","admin","route","state","handler","action","split","actionConfig","config","get","modelName","isNil","controller","toLowerCase"],"mappings":";;;;;;;;AAQA,cAAe,CAAA,OAAOA,GAAAA,EAAcC,IAAAA,GAAAA;AAClC,IAAA,MAAM,EAAEC,KAAK,EAAE,GAA+BF,IAAIG,MAAM;AAExD,IAAA,MAAMC,EAAAA,GAAkBC,MAAAA,CAAOC,YAAY,CAACJ,KAAAA,CAAM;AAElD,IAAA,IAAI,CAACE,EAAAA,EAAI;QACP,OAAOJ,GAAAA,CAAIO,IAAI,CAAC;YAAEC,KAAAA,EAAO;SAAuB,EAAG,GAAA,CAAA;AACrD,IAAA;IAEA,IAAIC,WAAAA;AACJ,IAAA,IAAI,CAACL,EAAAA,CAAGM,MAAM,IAAIN,EAAAA,CAAGM,MAAM,KAAK,OAAA,EAAS;QACvCD,WAAAA,GAAcJ,MAAAA,CAAOM,KAAK,CAACF,WAAW;IACxC,CAAA,MAAO;AACLA,QAAAA,WAAAA,GAAcJ,OAAOK,MAAM,CAACN,EAAAA,CAAGM,MAAM,EAAED,WAAW;AACpD,IAAA;AAEA,IAAA,MAAM,EAAEG,KAAK,EAAE,GAA0BZ,IAAIa,KAAK;AAElD,IAAA,IAAI,OAAOD,KAAAA,CAAME,OAAO,KAAK,QAAA,EAAU;QACrC,OAAOb,IAAAA,EAAAA;AACT,IAAA;AAEA,IAAA,MAAM,GAAGc,MAAAA,CAAO,GAAGH,MAAME,OAAO,CAACE,KAAK,CAAC,GAAA,CAAA;IAEvC,IAAIC,YAAAA;AACJ,IAAA,IAAI,CAACb,EAAAA,CAAGM,MAAM,IAAIN,EAAAA,CAAGM,MAAM,KAAK,OAAA,EAAS;AACvCO,QAAAA,YAAAA,GAAeZ,MAAAA,CAAOa,MAAM,CAACC,GAAG,CAAC,CAAC,aAAa,EAAEf,EAAAA,CAAGgB,SAAS,CAAC,SAAS,EAAEL,MAAAA,CAAAA,CAAQ,CAAA;IACnF,CAAA,MAAO;AACLE,QAAAA,YAAAA,GAAeZ,OAAOK,MAAM,CAACN,EAAAA,CAAGM,MAAM,EAAEQ,MAAM,CAAC,CAAC,OAAO,EAAEd,EAAAA,CAAGgB,SAAS,CAAC,SAAS,EAAEL,MAAAA,CAAAA,CAAQ,CAAA;AAC3F,IAAA;IAEA,IAAI,CAACM,uBAAMJ,YAAAA,CAAAA,EAAe;AACxB,QAAA,MAAM,CAACK,UAAAA,EAAYP,MAAAA,CAAO,GAAGE,YAAAA,CAAaD,KAAK,CAAC,GAAA,CAAA;AAEhD,QAAA,IAAIM,cAAcP,MAAAA,EAAQ;YACxB,OAAON,WAAW,CAACa,UAAAA,CAAWC,WAAW,GAAG,CAACR,MAAAA,CAAO,CAACf,GAAAA,EAAKC,IAAAA,CAAAA;AAC5D,QAAA;AACF,IAAA;IAEA,MAAMA,IAAAA,EAAAA;AACR,CAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"populate-builder.js","sources":["../../../server/src/services/populate-builder.ts"],"sourcesContent":["import { isNil, merge } from 'lodash/fp';\nimport type { UID } from '@strapi/types';\nimport { type Populate, getDeepPopulate, getQueryPopulate } from './utils/populate';\n\n/**\n * Builder to create a Strapi populate object.\n *\n * @param uid - Content type UID\n *\n * @example\n * const populate = await populateBuilder('api::article.article').countRelations().build();\n * // populate = { article: { populate: { count: true } } }\n *\n */\nconst populateBuilder = (uid: UID.Schema) => {\n let getInitialPopulate = async (): Promise<undefined | Populate> => {\n return undefined;\n };\n const deepPopulateOptions = {\n countMany: false,\n countOne: false,\n maxLevel: -1,\n };\n\n const builder = {\n /**\n * Populates all attribute fields present in a query.\n * @param query - Strapi query object\n */\n populateFromQuery(query: object) {\n getInitialPopulate = async () => getQueryPopulate(uid, query);\n return builder;\n },\n\n /**\n * Populate relations as count.\n * @param [options]\n * @param [options.toMany] - Populate XtoMany relations as count if true.\n * @param [options.toOne] - Populate XtoOne relations as count if true.\n */\n countRelations({ toMany, toOne } = { toMany: true, toOne: true }) {\n if (!isNil(toMany)) {\n deepPopulateOptions.countMany = toMany;\n }\n if (!isNil(toOne)) {\n deepPopulateOptions.countOne = toOne;\n }\n return builder;\n },\n\n /**\n * Populate relations deeply, up to a certain level.\n * @param [level=Infinity] - Max level of nested populate.\n */\n populateDeep(level = Infinity) {\n deepPopulateOptions.maxLevel = level;\n return builder;\n },\n\n /**\n * Override the populate for specific attributes, taking precedence over\n * query-derived or deep populate defaults.\n *\n * @param overrides - Populate overrides to merge (e.g. { localizations: { fields: ['locale'] } })\n */\n withPopulateOverride(overrides: Record<string, any>) {\n const prev = getInitialPopulate;\n // merge(base, overrides): overrides win for overlapping keys, so e.g. localizations\n getInitialPopulate = async () => merge((await prev()) || {}, overrides);\n return builder;\n },\n\n /**\n * Construct the populate object based on the builder options.\n * @returns Populate object\n */\n async build() {\n const initialPopulate = await getInitialPopulate();\n\n if (deepPopulateOptions.maxLevel === -1) {\n return initialPopulate;\n }\n\n return getDeepPopulate(uid, {
|
|
1
|
+
{"version":3,"file":"populate-builder.js","sources":["../../../server/src/services/populate-builder.ts"],"sourcesContent":["import { isNil, merge } from 'lodash/fp';\nimport type { UID } from '@strapi/types';\nimport { type Populate, getDeepPopulate, getQueryPopulate } from './utils/populate';\n\n/**\n * Builder to create a Strapi populate object.\n *\n * @param uid - Content type UID\n *\n * @example\n * const populate = await populateBuilder('api::article.article').countRelations().build();\n * // populate = { article: { populate: { count: true } } }\n *\n */\nconst populateBuilder = (uid: UID.Schema) => {\n let getInitialPopulate = async (): Promise<undefined | Populate> => {\n return undefined;\n };\n const deepPopulateOptions = {\n countMany: false,\n countOne: false,\n maxLevel: -1,\n };\n\n const builder = {\n /**\n * Populates all attribute fields present in a query.\n * @param query - Strapi query object\n */\n populateFromQuery(query: object) {\n getInitialPopulate = async () => getQueryPopulate(uid, query);\n return builder;\n },\n\n /**\n * Populate relations as count.\n * @param [options]\n * @param [options.toMany] - Populate XtoMany relations as count if true.\n * @param [options.toOne] - Populate XtoOne relations as count if true.\n */\n countRelations({ toMany, toOne } = { toMany: true, toOne: true }) {\n if (!isNil(toMany)) {\n deepPopulateOptions.countMany = toMany;\n }\n if (!isNil(toOne)) {\n deepPopulateOptions.countOne = toOne;\n }\n return builder;\n },\n\n /**\n * Populate relations deeply, up to a certain level.\n * @param [level=Infinity] - Max level of nested populate.\n */\n populateDeep(level = Infinity) {\n deepPopulateOptions.maxLevel = level;\n return builder;\n },\n\n /**\n * Override the populate for specific attributes, taking precedence over\n * query-derived or deep populate defaults.\n *\n * @param overrides - Populate overrides to merge (e.g. { localizations: { fields: ['locale'] } })\n */\n withPopulateOverride(overrides: Record<string, any>) {\n const prev = getInitialPopulate;\n // merge(base, overrides): overrides win for overlapping keys, so e.g. localizations\n getInitialPopulate = async () => merge((await prev()) || {}, overrides);\n return builder;\n },\n\n /**\n * Construct the populate object based on the builder options.\n * @returns Populate object\n */\n async build() {\n const initialPopulate = await getInitialPopulate();\n\n if (deepPopulateOptions.maxLevel === -1) {\n return initialPopulate;\n }\n\n return getDeepPopulate(uid, {\n ...deepPopulateOptions,\n initialPopulate,\n });\n },\n };\n\n return builder;\n};\n\nexport default () => populateBuilder;\n"],"names":["populateBuilder","uid","getInitialPopulate","undefined","deepPopulateOptions","countMany","countOne","maxLevel","builder","populateFromQuery","query","getQueryPopulate","countRelations","toMany","toOne","isNil","populateDeep","level","Infinity","withPopulateOverride","overrides","prev","merge","build","initialPopulate","getDeepPopulate"],"mappings":";;;;;AAIA;;;;;;;;;IAUA,MAAMA,kBAAkB,CAACC,GAAAA,GAAAA;AACvB,IAAA,IAAIC,kBAAAA,GAAqB,UAAA;QACvB,OAAOC,SAAAA;AACT,IAAA,CAAA;AACA,IAAA,MAAMC,mBAAAA,GAAsB;QAC1BC,SAAAA,EAAW,KAAA;QACXC,QAAAA,EAAU,KAAA;AACVC,QAAAA,QAAAA,EAAU;AACZ,KAAA;AAEA,IAAA,MAAMC,OAAAA,GAAU;AACd;;;AAGC,QACDC,mBAAkBC,KAAa,EAAA;YAC7BR,kBAAAA,GAAqB,UAAYS,0BAAiBV,GAAAA,EAAKS,KAAAA,CAAAA;YACvD,OAAOF,OAAAA;AACT,QAAA,CAAA;AAEA;;;;;AAKC,QACDI,gBAAe,EAAEC,MAAM,EAAEC,KAAK,EAAE,GAAG;YAAED,MAAAA,EAAQ,IAAA;YAAMC,KAAAA,EAAO;SAAM,EAAA;YAC9D,IAAI,CAACC,SAAMF,MAAAA,CAAAA,EAAS;AAClBT,gBAAAA,mBAAAA,CAAoBC,SAAS,GAAGQ,MAAAA;AAClC,YAAA;YACA,IAAI,CAACE,SAAMD,KAAAA,CAAAA,EAAQ;AACjBV,gBAAAA,mBAAAA,CAAoBE,QAAQ,GAAGQ,KAAAA;AACjC,YAAA;YACA,OAAON,OAAAA;AACT,QAAA,CAAA;AAEA;;;QAIAQ,YAAAA,CAAAA,CAAaC,QAAQC,QAAQ,EAAA;AAC3Bd,YAAAA,mBAAAA,CAAoBG,QAAQ,GAAGU,KAAAA;YAC/B,OAAOT,OAAAA;AACT,QAAA,CAAA;AAEA;;;;;AAKC,QACDW,sBAAqBC,SAA8B,EAAA;AACjD,YAAA,MAAMC,IAAAA,GAAOnB,kBAAAA;;AAEbA,YAAAA,kBAAAA,GAAqB,UAAYoB,QAAAA,CAAO,MAAMD,IAAAA,EAAAA,IAAW,EAAC,EAAGD,SAAAA,CAAAA;YAC7D,OAAOZ,OAAAA;AACT,QAAA,CAAA;AAEA;;;AAGC,QACD,MAAMe,KAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMC,kBAAkB,MAAMtB,kBAAAA,EAAAA;AAE9B,YAAA,IAAIE,mBAAAA,CAAoBG,QAAQ,KAAK,EAAC,EAAG;gBACvC,OAAOiB,eAAAA;AACT,YAAA;AAEA,YAAA,OAAOC,yBAAgBxB,GAAAA,EAAK;AAC1B,gBAAA,GAAGG,mBAAmB;AACtBoB,gBAAAA;AACF,aAAA,CAAA;AACF,QAAA;AACF,KAAA;IAEA,OAAOhB,OAAAA;AACT,CAAA;AAEA,wBAAe,CAAA,IAAMR,eAAc;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"populate-builder.mjs","sources":["../../../server/src/services/populate-builder.ts"],"sourcesContent":["import { isNil, merge } from 'lodash/fp';\nimport type { UID } from '@strapi/types';\nimport { type Populate, getDeepPopulate, getQueryPopulate } from './utils/populate';\n\n/**\n * Builder to create a Strapi populate object.\n *\n * @param uid - Content type UID\n *\n * @example\n * const populate = await populateBuilder('api::article.article').countRelations().build();\n * // populate = { article: { populate: { count: true } } }\n *\n */\nconst populateBuilder = (uid: UID.Schema) => {\n let getInitialPopulate = async (): Promise<undefined | Populate> => {\n return undefined;\n };\n const deepPopulateOptions = {\n countMany: false,\n countOne: false,\n maxLevel: -1,\n };\n\n const builder = {\n /**\n * Populates all attribute fields present in a query.\n * @param query - Strapi query object\n */\n populateFromQuery(query: object) {\n getInitialPopulate = async () => getQueryPopulate(uid, query);\n return builder;\n },\n\n /**\n * Populate relations as count.\n * @param [options]\n * @param [options.toMany] - Populate XtoMany relations as count if true.\n * @param [options.toOne] - Populate XtoOne relations as count if true.\n */\n countRelations({ toMany, toOne } = { toMany: true, toOne: true }) {\n if (!isNil(toMany)) {\n deepPopulateOptions.countMany = toMany;\n }\n if (!isNil(toOne)) {\n deepPopulateOptions.countOne = toOne;\n }\n return builder;\n },\n\n /**\n * Populate relations deeply, up to a certain level.\n * @param [level=Infinity] - Max level of nested populate.\n */\n populateDeep(level = Infinity) {\n deepPopulateOptions.maxLevel = level;\n return builder;\n },\n\n /**\n * Override the populate for specific attributes, taking precedence over\n * query-derived or deep populate defaults.\n *\n * @param overrides - Populate overrides to merge (e.g. { localizations: { fields: ['locale'] } })\n */\n withPopulateOverride(overrides: Record<string, any>) {\n const prev = getInitialPopulate;\n // merge(base, overrides): overrides win for overlapping keys, so e.g. localizations\n getInitialPopulate = async () => merge((await prev()) || {}, overrides);\n return builder;\n },\n\n /**\n * Construct the populate object based on the builder options.\n * @returns Populate object\n */\n async build() {\n const initialPopulate = await getInitialPopulate();\n\n if (deepPopulateOptions.maxLevel === -1) {\n return initialPopulate;\n }\n\n return getDeepPopulate(uid, {
|
|
1
|
+
{"version":3,"file":"populate-builder.mjs","sources":["../../../server/src/services/populate-builder.ts"],"sourcesContent":["import { isNil, merge } from 'lodash/fp';\nimport type { UID } from '@strapi/types';\nimport { type Populate, getDeepPopulate, getQueryPopulate } from './utils/populate';\n\n/**\n * Builder to create a Strapi populate object.\n *\n * @param uid - Content type UID\n *\n * @example\n * const populate = await populateBuilder('api::article.article').countRelations().build();\n * // populate = { article: { populate: { count: true } } }\n *\n */\nconst populateBuilder = (uid: UID.Schema) => {\n let getInitialPopulate = async (): Promise<undefined | Populate> => {\n return undefined;\n };\n const deepPopulateOptions = {\n countMany: false,\n countOne: false,\n maxLevel: -1,\n };\n\n const builder = {\n /**\n * Populates all attribute fields present in a query.\n * @param query - Strapi query object\n */\n populateFromQuery(query: object) {\n getInitialPopulate = async () => getQueryPopulate(uid, query);\n return builder;\n },\n\n /**\n * Populate relations as count.\n * @param [options]\n * @param [options.toMany] - Populate XtoMany relations as count if true.\n * @param [options.toOne] - Populate XtoOne relations as count if true.\n */\n countRelations({ toMany, toOne } = { toMany: true, toOne: true }) {\n if (!isNil(toMany)) {\n deepPopulateOptions.countMany = toMany;\n }\n if (!isNil(toOne)) {\n deepPopulateOptions.countOne = toOne;\n }\n return builder;\n },\n\n /**\n * Populate relations deeply, up to a certain level.\n * @param [level=Infinity] - Max level of nested populate.\n */\n populateDeep(level = Infinity) {\n deepPopulateOptions.maxLevel = level;\n return builder;\n },\n\n /**\n * Override the populate for specific attributes, taking precedence over\n * query-derived or deep populate defaults.\n *\n * @param overrides - Populate overrides to merge (e.g. { localizations: { fields: ['locale'] } })\n */\n withPopulateOverride(overrides: Record<string, any>) {\n const prev = getInitialPopulate;\n // merge(base, overrides): overrides win for overlapping keys, so e.g. localizations\n getInitialPopulate = async () => merge((await prev()) || {}, overrides);\n return builder;\n },\n\n /**\n * Construct the populate object based on the builder options.\n * @returns Populate object\n */\n async build() {\n const initialPopulate = await getInitialPopulate();\n\n if (deepPopulateOptions.maxLevel === -1) {\n return initialPopulate;\n }\n\n return getDeepPopulate(uid, {\n ...deepPopulateOptions,\n initialPopulate,\n });\n },\n };\n\n return builder;\n};\n\nexport default () => populateBuilder;\n"],"names":["populateBuilder","uid","getInitialPopulate","undefined","deepPopulateOptions","countMany","countOne","maxLevel","builder","populateFromQuery","query","getQueryPopulate","countRelations","toMany","toOne","isNil","populateDeep","level","Infinity","withPopulateOverride","overrides","prev","merge","build","initialPopulate","getDeepPopulate"],"mappings":";;;AAIA;;;;;;;;;IAUA,MAAMA,oBAAkB,CAACC,GAAAA,GAAAA;AACvB,IAAA,IAAIC,kBAAAA,GAAqB,UAAA;QACvB,OAAOC,SAAAA;AACT,IAAA,CAAA;AACA,IAAA,MAAMC,mBAAAA,GAAsB;QAC1BC,SAAAA,EAAW,KAAA;QACXC,QAAAA,EAAU,KAAA;AACVC,QAAAA,QAAAA,EAAU;AACZ,KAAA;AAEA,IAAA,MAAMC,OAAAA,GAAU;AACd;;;AAGC,QACDC,mBAAkBC,KAAa,EAAA;YAC7BR,kBAAAA,GAAqB,UAAYS,iBAAiBV,GAAAA,EAAKS,KAAAA,CAAAA;YACvD,OAAOF,OAAAA;AACT,QAAA,CAAA;AAEA;;;;;AAKC,QACDI,gBAAe,EAAEC,MAAM,EAAEC,KAAK,EAAE,GAAG;YAAED,MAAAA,EAAQ,IAAA;YAAMC,KAAAA,EAAO;SAAM,EAAA;YAC9D,IAAI,CAACC,MAAMF,MAAAA,CAAAA,EAAS;AAClBT,gBAAAA,mBAAAA,CAAoBC,SAAS,GAAGQ,MAAAA;AAClC,YAAA;YACA,IAAI,CAACE,MAAMD,KAAAA,CAAAA,EAAQ;AACjBV,gBAAAA,mBAAAA,CAAoBE,QAAQ,GAAGQ,KAAAA;AACjC,YAAA;YACA,OAAON,OAAAA;AACT,QAAA,CAAA;AAEA;;;QAIAQ,YAAAA,CAAAA,CAAaC,QAAQC,QAAQ,EAAA;AAC3Bd,YAAAA,mBAAAA,CAAoBG,QAAQ,GAAGU,KAAAA;YAC/B,OAAOT,OAAAA;AACT,QAAA,CAAA;AAEA;;;;;AAKC,QACDW,sBAAqBC,SAA8B,EAAA;AACjD,YAAA,MAAMC,IAAAA,GAAOnB,kBAAAA;;AAEbA,YAAAA,kBAAAA,GAAqB,UAAYoB,KAAAA,CAAO,MAAMD,IAAAA,EAAAA,IAAW,EAAC,EAAGD,SAAAA,CAAAA;YAC7D,OAAOZ,OAAAA;AACT,QAAA,CAAA;AAEA;;;AAGC,QACD,MAAMe,KAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMC,kBAAkB,MAAMtB,kBAAAA,EAAAA;AAE9B,YAAA,IAAIE,mBAAAA,CAAoBG,QAAQ,KAAK,EAAC,EAAG;gBACvC,OAAOiB,eAAAA;AACT,YAAA;AAEA,YAAA,OAAOC,gBAAgBxB,GAAAA,EAAK;AAC1B,gBAAA,GAAGG,mBAAmB;AACtBoB,gBAAAA;AACF,aAAA,CAAA;AACF,QAAA;AACF,KAAA;IAEA,OAAOhB,OAAAA;AACT,CAAA;AAEA,sBAAe,CAAA,IAAMR,iBAAc;;;;"}
|
|
@@ -3,25 +3,30 @@
|
|
|
3
3
|
var _ = require('lodash');
|
|
4
4
|
var slugify = require('@sindresorhus/slugify');
|
|
5
5
|
|
|
6
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
|
|
8
|
+
var ___default = /*#__PURE__*/_interopDefault(_);
|
|
9
|
+
var slugify__default = /*#__PURE__*/_interopDefault(slugify);
|
|
10
|
+
|
|
6
11
|
var uid = (({ strapi })=>({
|
|
7
12
|
async generateUIDField ({ contentTypeUID, field, data, locale }) {
|
|
8
13
|
const contentType = strapi.contentTypes[contentTypeUID];
|
|
9
14
|
const { attributes } = contentType;
|
|
10
15
|
const { targetField, default: defaultValue, options } = attributes[field];
|
|
11
16
|
// @ts-expect-error targetField can be undefined
|
|
12
|
-
const targetValue =
|
|
13
|
-
if (!
|
|
17
|
+
const targetValue = ___default.default.get(data, targetField);
|
|
18
|
+
if (!___default.default.isEmpty(targetValue)) {
|
|
14
19
|
return this.findUniqueUID({
|
|
15
20
|
contentTypeUID,
|
|
16
21
|
field,
|
|
17
|
-
value:
|
|
22
|
+
value: slugify__default.default(targetValue, options),
|
|
18
23
|
locale
|
|
19
24
|
});
|
|
20
25
|
}
|
|
21
26
|
return this.findUniqueUID({
|
|
22
27
|
contentTypeUID,
|
|
23
28
|
field,
|
|
24
|
-
value:
|
|
29
|
+
value: slugify__default.default(___default.default.isFunction(defaultValue) ? defaultValue() : defaultValue || contentType.modelName, options),
|
|
25
30
|
locale
|
|
26
31
|
});
|
|
27
32
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uid.js","sources":["../../../server/src/services/uid.ts"],"sourcesContent":["import _ from 'lodash';\nimport slugify from '@sindresorhus/slugify';\n\nimport type { Core, Schema, UID } from '@strapi/types';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n async generateUIDField({\n contentTypeUID,\n field,\n data,\n locale,\n }: {\n contentTypeUID: UID.ContentType;\n field: string;\n data: Record<string, any>;\n locale?: string;\n }) {\n const contentType = strapi.contentTypes[contentTypeUID];\n const { attributes } = contentType;\n\n const {\n targetField,\n default: defaultValue,\n options,\n } = attributes[field] as Schema.Attribute.UID;\n\n // @ts-expect-error targetField can be undefined\n const targetValue = _.get(data, targetField);\n\n if (!_.isEmpty(targetValue)) {\n return this.findUniqueUID({\n contentTypeUID,\n field,\n value: slugify(targetValue, options),\n locale,\n });\n }\n\n return this.findUniqueUID({\n contentTypeUID,\n field,\n value: slugify(\n _.isFunction(defaultValue) ? defaultValue() : defaultValue || contentType.modelName,\n options\n ),\n locale,\n });\n },\n\n async findUniqueUID({\n contentTypeUID,\n field,\n value,\n locale,\n }: {\n contentTypeUID: UID.ContentType;\n field: string;\n value: string;\n locale?: string;\n }) {\n const foundDocuments = await strapi.documents(contentTypeUID).findMany({\n filters: {\n [field]: { $startsWith: value },\n },\n locale,\n // TODO: Check UX. When modifying an entry, it only makes sense to check for collisions with other drafts\n // However, when publishing this \"available\" UID might collide with another published entry\n status: 'draft',\n });\n\n if (!foundDocuments || foundDocuments.length === 0) {\n // If there are no documents found we can return the value as is\n return value;\n }\n\n let possibleCollisions: string[];\n if (!Array.isArray(foundDocuments)) {\n possibleCollisions = [foundDocuments[field]];\n } else {\n possibleCollisions = foundDocuments.map((doc: any) => doc[field]);\n }\n\n // If there are no documents sharing the proposed UID, we can return the value as is\n if (!possibleCollisions.includes(value)) {\n return value;\n }\n\n let i = 1;\n let tmpUId = `${value}-${i}`;\n while (possibleCollisions.includes(tmpUId)) {\n // While there are documents sharing the proposed UID, we need to find a new one\n // by incrementing the suffix until we find a unique one\n i += 1;\n tmpUId = `${value}-${i}`;\n }\n\n return tmpUId;\n },\n\n async checkUIDAvailability({\n contentTypeUID,\n field,\n value,\n locale,\n }: {\n contentTypeUID: UID.ContentType;\n field: string;\n value: string;\n locale?: string;\n }) {\n const documentCount = await strapi.documents(contentTypeUID).count({\n filters: {\n [field]: value,\n },\n locale,\n // TODO: Check UX. When modifying an entry, it only makes sense to check for collisions with other drafts\n // However, when publishing this \"available\" UID might collide with another published entry\n status: 'draft',\n });\n\n if (documentCount && documentCount > 0) {\n // If there are documents sharing the proposed UID, we can return false\n return false;\n }\n\n return true;\n },\n});\n"],"names":["strapi","generateUIDField","contentTypeUID","field","data","locale","contentType","contentTypes","attributes","targetField","default","defaultValue","options","targetValue","_","get","isEmpty","findUniqueUID","value","slugify","isFunction","modelName","foundDocuments","documents","findMany","filters","$startsWith","status","length","possibleCollisions","Array","isArray","map","doc","includes","i","tmpUId","checkUIDAvailability","documentCount","count"],"mappings":"
|
|
1
|
+
{"version":3,"file":"uid.js","sources":["../../../server/src/services/uid.ts"],"sourcesContent":["import _ from 'lodash';\nimport slugify from '@sindresorhus/slugify';\n\nimport type { Core, Schema, UID } from '@strapi/types';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n async generateUIDField({\n contentTypeUID,\n field,\n data,\n locale,\n }: {\n contentTypeUID: UID.ContentType;\n field: string;\n data: Record<string, any>;\n locale?: string;\n }) {\n const contentType = strapi.contentTypes[contentTypeUID];\n const { attributes } = contentType;\n\n const {\n targetField,\n default: defaultValue,\n options,\n } = attributes[field] as Schema.Attribute.UID;\n\n // @ts-expect-error targetField can be undefined\n const targetValue = _.get(data, targetField);\n\n if (!_.isEmpty(targetValue)) {\n return this.findUniqueUID({\n contentTypeUID,\n field,\n value: slugify(targetValue, options),\n locale,\n });\n }\n\n return this.findUniqueUID({\n contentTypeUID,\n field,\n value: slugify(\n _.isFunction(defaultValue) ? defaultValue() : defaultValue || contentType.modelName,\n options\n ),\n locale,\n });\n },\n\n async findUniqueUID({\n contentTypeUID,\n field,\n value,\n locale,\n }: {\n contentTypeUID: UID.ContentType;\n field: string;\n value: string;\n locale?: string;\n }) {\n const foundDocuments = await strapi.documents(contentTypeUID).findMany({\n filters: {\n [field]: { $startsWith: value },\n },\n locale,\n // TODO: Check UX. When modifying an entry, it only makes sense to check for collisions with other drafts\n // However, when publishing this \"available\" UID might collide with another published entry\n status: 'draft',\n });\n\n if (!foundDocuments || foundDocuments.length === 0) {\n // If there are no documents found we can return the value as is\n return value;\n }\n\n let possibleCollisions: string[];\n if (!Array.isArray(foundDocuments)) {\n possibleCollisions = [foundDocuments[field]];\n } else {\n possibleCollisions = foundDocuments.map((doc: any) => doc[field]);\n }\n\n // If there are no documents sharing the proposed UID, we can return the value as is\n if (!possibleCollisions.includes(value)) {\n return value;\n }\n\n let i = 1;\n let tmpUId = `${value}-${i}`;\n while (possibleCollisions.includes(tmpUId)) {\n // While there are documents sharing the proposed UID, we need to find a new one\n // by incrementing the suffix until we find a unique one\n i += 1;\n tmpUId = `${value}-${i}`;\n }\n\n return tmpUId;\n },\n\n async checkUIDAvailability({\n contentTypeUID,\n field,\n value,\n locale,\n }: {\n contentTypeUID: UID.ContentType;\n field: string;\n value: string;\n locale?: string;\n }) {\n const documentCount = await strapi.documents(contentTypeUID).count({\n filters: {\n [field]: value,\n },\n locale,\n // TODO: Check UX. When modifying an entry, it only makes sense to check for collisions with other drafts\n // However, when publishing this \"available\" UID might collide with another published entry\n status: 'draft',\n });\n\n if (documentCount && documentCount > 0) {\n // If there are documents sharing the proposed UID, we can return false\n return false;\n }\n\n return true;\n },\n});\n"],"names":["strapi","generateUIDField","contentTypeUID","field","data","locale","contentType","contentTypes","attributes","targetField","default","defaultValue","options","targetValue","_","get","isEmpty","findUniqueUID","value","slugify","isFunction","modelName","foundDocuments","documents","findMany","filters","$startsWith","status","length","possibleCollisions","Array","isArray","map","doc","includes","i","tmpUId","checkUIDAvailability","documentCount","count"],"mappings":"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"}
|
|
@@ -4,6 +4,10 @@ var _ = require('lodash');
|
|
|
4
4
|
var fp = require('lodash/fp');
|
|
5
5
|
var strapiUtils = require('@strapi/utils');
|
|
6
6
|
|
|
7
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var ___default = /*#__PURE__*/_interopDefault(_);
|
|
10
|
+
|
|
7
11
|
const { getNonVisibleAttributes, getWritableAttributes } = strapiUtils.contentTypes;
|
|
8
12
|
const { PUBLISHED_AT_ATTRIBUTE, CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } = strapiUtils.contentTypes.constants;
|
|
9
13
|
const NON_SORTABLES = [
|
|
@@ -33,10 +37,10 @@ const LISTABLE_RELATIONS = [
|
|
|
33
37
|
];
|
|
34
38
|
// hidden fields are fields that are configured to be hidden from list, and edit views
|
|
35
39
|
const isHidden = (schema, name)=>{
|
|
36
|
-
if (!
|
|
40
|
+
if (!___default.default.has(schema.attributes, name)) {
|
|
37
41
|
return false;
|
|
38
42
|
}
|
|
39
|
-
const isHidden =
|
|
43
|
+
const isHidden = ___default.default.get(schema, [
|
|
40
44
|
'config',
|
|
41
45
|
'attributes',
|
|
42
46
|
name,
|
|
@@ -48,7 +52,7 @@ const isHidden = (schema, name)=>{
|
|
|
48
52
|
return false;
|
|
49
53
|
};
|
|
50
54
|
const isListable = (schema, name)=>{
|
|
51
|
-
if (!
|
|
55
|
+
if (!___default.default.has(schema.attributes, name)) {
|
|
52
56
|
return false;
|
|
53
57
|
}
|
|
54
58
|
if (isHidden(schema, name)) {
|
|
@@ -64,7 +68,7 @@ const isListable = (schema, name)=>{
|
|
|
64
68
|
return true;
|
|
65
69
|
};
|
|
66
70
|
const isSortable = (schema, name)=>{
|
|
67
|
-
if (!
|
|
71
|
+
if (!___default.default.has(schema.attributes, name)) {
|
|
68
72
|
return false;
|
|
69
73
|
}
|
|
70
74
|
if (schema.modelType === 'component' && name === 'id') return false;
|
|
@@ -81,7 +85,7 @@ const isSearchable = (schema, name)=>{
|
|
|
81
85
|
return isSortable(schema, name);
|
|
82
86
|
};
|
|
83
87
|
const isVisible = (schema, name)=>{
|
|
84
|
-
if (!
|
|
88
|
+
if (!___default.default.has(schema.attributes, name)) {
|
|
85
89
|
return false;
|
|
86
90
|
}
|
|
87
91
|
if (isHidden(schema, name)) {
|
|
@@ -100,7 +104,7 @@ const isVisible = (schema, name)=>{
|
|
|
100
104
|
};
|
|
101
105
|
const isPublicationField = (name)=>PUBLISHED_AT_ATTRIBUTE === name;
|
|
102
106
|
const isTimestamp = (schema, name)=>{
|
|
103
|
-
if (!
|
|
107
|
+
if (!___default.default.has(schema.attributes, name)) {
|
|
104
108
|
return false;
|
|
105
109
|
}
|
|
106
110
|
const timestamps = strapiUtils.contentTypes.getTimestamps(schema);
|
|
@@ -112,7 +116,7 @@ const isTimestamp = (schema, name)=>{
|
|
|
112
116
|
}
|
|
113
117
|
};
|
|
114
118
|
const isCreatorField = (schema, name)=>{
|
|
115
|
-
if (!
|
|
119
|
+
if (!___default.default.has(schema.attributes, name)) {
|
|
116
120
|
return false;
|
|
117
121
|
}
|
|
118
122
|
const creatorFields = strapiUtils.contentTypes.getCreatorFields(schema);
|
|
@@ -125,7 +129,7 @@ const isCreatorField = (schema, name)=>{
|
|
|
125
129
|
};
|
|
126
130
|
const isRelation = (attribute)=>attribute.type === 'relation';
|
|
127
131
|
const hasRelationAttribute = (schema, name)=>{
|
|
128
|
-
if (!
|
|
132
|
+
if (!___default.default.has(schema.attributes, name)) {
|
|
129
133
|
return false;
|
|
130
134
|
}
|
|
131
135
|
if (isHidden(schema, name)) {
|
|
@@ -137,7 +141,7 @@ const hasRelationAttribute = (schema, name)=>{
|
|
|
137
141
|
return isRelation(schema.attributes[name]);
|
|
138
142
|
};
|
|
139
143
|
const hasEditableAttribute = (schema, name)=>{
|
|
140
|
-
if (!
|
|
144
|
+
if (!___default.default.has(schema.attributes, name)) {
|
|
141
145
|
return false;
|
|
142
146
|
}
|
|
143
147
|
if (isHidden(schema, name)) {
|
|
@@ -164,7 +168,7 @@ const getDefaultMainField = (schema)=>findFirstStringAttribute(schema) || 'id';
|
|
|
164
168
|
const validAttributes = Object.keys(schema.attributes).filter((key)=>isListable(schema, key));
|
|
165
169
|
const model = strapi.getModel(schema.uid);
|
|
166
170
|
const nonVisibleWritableAttributes = fp.intersection(getNonVisibleAttributes(model), getWritableAttributes(model));
|
|
167
|
-
const identifierField =
|
|
171
|
+
const identifierField = ___default.default.has(schema.attributes, 'documentId') ? 'documentId' : 'id';
|
|
168
172
|
return [
|
|
169
173
|
identifierField,
|
|
170
174
|
...validAttributes,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attributes.js","sources":["../../../../../server/src/services/utils/configuration/attributes.ts"],"sourcesContent":["import _ from 'lodash';\nimport { intersection } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\n\nconst { getNonVisibleAttributes, getWritableAttributes } = contentTypesUtils;\nconst { PUBLISHED_AT_ATTRIBUTE, CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } =\n contentTypesUtils.constants;\n\nconst NON_SORTABLES = ['component', 'json', 'media', 'richtext', 'dynamiczone', 'blocks'];\nconst SORTABLE_RELATIONS = ['oneToOne', 'manyToOne'];\n\nconst NON_LISTABLES = ['json', 'password', 'richtext', 'dynamiczone', 'blocks'];\nconst LISTABLE_RELATIONS = ['oneToOne', 'oneToMany', 'manyToOne', 'manyToMany'];\n\n// hidden fields are fields that are configured to be hidden from list, and edit views\nconst isHidden = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const isHidden = _.get(schema, ['config', 'attributes', name, 'hidden'], false);\n if (isHidden === true) {\n return true;\n }\n\n return false;\n};\n\nconst isListable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n const attribute = schema.attributes[name];\n if (NON_LISTABLES.includes(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !LISTABLE_RELATIONS.includes(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSortable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (schema.modelType === 'component' && name === 'id') return false;\n\n const attribute = schema.attributes[name];\n if (NON_SORTABLES.includes(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !SORTABLE_RELATIONS.includes(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSearchable = (schema: any, name: any) => {\n return isSortable(schema, name);\n};\n\nconst isVisible = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (isTimestamp(schema, name) || name === 'id' || name === 'documentId') {\n return false;\n }\n\n if (isPublicationField(name)) {\n return false;\n }\n\n if (isCreatorField(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst isPublicationField = (name: any) => PUBLISHED_AT_ATTRIBUTE === name;\n\nconst isTimestamp = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const timestamps = contentTypesUtils.getTimestamps(schema);\n if (!timestamps || !Array.isArray(timestamps)) {\n return false;\n }\n\n if (timestamps.includes(name)) {\n return true;\n }\n};\n\nconst isCreatorField = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const creatorFields = contentTypesUtils.getCreatorFields(schema);\n if (!creatorFields || !Array.isArray(creatorFields)) {\n return false;\n }\n\n if (creatorFields.includes(name)) {\n return true;\n }\n};\n\nconst isRelation = (attribute: any) => attribute.type === 'relation';\n\nconst hasRelationAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return isRelation(schema.attributes[name]);\n};\n\nconst hasEditableAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst findFirstStringAttribute = (schema: any) => {\n return Object.keys(schema.attributes || {}).find((key) => {\n const { type } = schema.attributes[key];\n return type === 'string' && key !== 'id';\n });\n};\n\nconst getDefaultMainField = (schema: any) => findFirstStringAttribute(schema) || 'id';\n\n/**\n * Returns list of all sortable attributes for a given content type schema\n * TODO V5: Refactor non visible fields to be a part of content-manager schema so we can use isSortable instead\n * @param {*} schema\n * @returns\n */\nconst getSortableAttributes = (schema: any) => {\n const validAttributes = Object.keys(schema.attributes).filter((key) => isListable(schema, key));\n\n const model = strapi.getModel(schema.uid);\n const nonVisibleWritableAttributes = intersection(\n getNonVisibleAttributes(model),\n getWritableAttributes(model)\n );\n\n const identifierField = _.has(schema.attributes, 'documentId') ? 'documentId' : 'id';\n return [\n identifierField,\n ...validAttributes,\n ...nonVisibleWritableAttributes,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n ];\n};\n\nexport {\n isSortable,\n isVisible,\n isSearchable,\n isRelation,\n isListable,\n hasEditableAttribute,\n hasRelationAttribute,\n getDefaultMainField,\n getSortableAttributes,\n};\n"],"names":["getNonVisibleAttributes","getWritableAttributes","contentTypesUtils","PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","constants","NON_SORTABLES","SORTABLE_RELATIONS","NON_LISTABLES","LISTABLE_RELATIONS","isHidden","schema","name","_","has","attributes","get","isListable","attribute","includes","type","isRelation","relationType","isSortable","modelType","isSearchable","isVisible","isTimestamp","isPublicationField","isCreatorField","timestamps","getTimestamps","Array","isArray","creatorFields","getCreatorFields","hasRelationAttribute","hasEditableAttribute","findFirstStringAttribute","Object","keys","find","key","getDefaultMainField","getSortableAttributes","validAttributes","filter","model","strapi","getModel","uid","nonVisibleWritableAttributes","intersection","identifierField"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"attributes.js","sources":["../../../../../server/src/services/utils/configuration/attributes.ts"],"sourcesContent":["import _ from 'lodash';\nimport { intersection } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\n\nconst { getNonVisibleAttributes, getWritableAttributes } = contentTypesUtils;\nconst { PUBLISHED_AT_ATTRIBUTE, CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } =\n contentTypesUtils.constants;\n\nconst NON_SORTABLES = ['component', 'json', 'media', 'richtext', 'dynamiczone', 'blocks'];\nconst SORTABLE_RELATIONS = ['oneToOne', 'manyToOne'];\n\nconst NON_LISTABLES = ['json', 'password', 'richtext', 'dynamiczone', 'blocks'];\nconst LISTABLE_RELATIONS = ['oneToOne', 'oneToMany', 'manyToOne', 'manyToMany'];\n\n// hidden fields are fields that are configured to be hidden from list, and edit views\nconst isHidden = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const isHidden = _.get(schema, ['config', 'attributes', name, 'hidden'], false);\n if (isHidden === true) {\n return true;\n }\n\n return false;\n};\n\nconst isListable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n const attribute = schema.attributes[name];\n if (NON_LISTABLES.includes(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !LISTABLE_RELATIONS.includes(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSortable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (schema.modelType === 'component' && name === 'id') return false;\n\n const attribute = schema.attributes[name];\n if (NON_SORTABLES.includes(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !SORTABLE_RELATIONS.includes(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSearchable = (schema: any, name: any) => {\n return isSortable(schema, name);\n};\n\nconst isVisible = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (isTimestamp(schema, name) || name === 'id' || name === 'documentId') {\n return false;\n }\n\n if (isPublicationField(name)) {\n return false;\n }\n\n if (isCreatorField(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst isPublicationField = (name: any) => PUBLISHED_AT_ATTRIBUTE === name;\n\nconst isTimestamp = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const timestamps = contentTypesUtils.getTimestamps(schema);\n if (!timestamps || !Array.isArray(timestamps)) {\n return false;\n }\n\n if (timestamps.includes(name)) {\n return true;\n }\n};\n\nconst isCreatorField = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const creatorFields = contentTypesUtils.getCreatorFields(schema);\n if (!creatorFields || !Array.isArray(creatorFields)) {\n return false;\n }\n\n if (creatorFields.includes(name)) {\n return true;\n }\n};\n\nconst isRelation = (attribute: any) => attribute.type === 'relation';\n\nconst hasRelationAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return isRelation(schema.attributes[name]);\n};\n\nconst hasEditableAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst findFirstStringAttribute = (schema: any) => {\n return Object.keys(schema.attributes || {}).find((key) => {\n const { type } = schema.attributes[key];\n return type === 'string' && key !== 'id';\n });\n};\n\nconst getDefaultMainField = (schema: any) => findFirstStringAttribute(schema) || 'id';\n\n/**\n * Returns list of all sortable attributes for a given content type schema\n * TODO V5: Refactor non visible fields to be a part of content-manager schema so we can use isSortable instead\n * @param {*} schema\n * @returns\n */\nconst getSortableAttributes = (schema: any) => {\n const validAttributes = Object.keys(schema.attributes).filter((key) => isListable(schema, key));\n\n const model = strapi.getModel(schema.uid);\n const nonVisibleWritableAttributes = intersection(\n getNonVisibleAttributes(model),\n getWritableAttributes(model)\n );\n\n const identifierField = _.has(schema.attributes, 'documentId') ? 'documentId' : 'id';\n return [\n identifierField,\n ...validAttributes,\n ...nonVisibleWritableAttributes,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n ];\n};\n\nexport {\n isSortable,\n isVisible,\n isSearchable,\n isRelation,\n isListable,\n hasEditableAttribute,\n hasRelationAttribute,\n getDefaultMainField,\n getSortableAttributes,\n};\n"],"names":["getNonVisibleAttributes","getWritableAttributes","contentTypesUtils","PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","constants","NON_SORTABLES","SORTABLE_RELATIONS","NON_LISTABLES","LISTABLE_RELATIONS","isHidden","schema","name","_","has","attributes","get","isListable","attribute","includes","type","isRelation","relationType","isSortable","modelType","isSearchable","isVisible","isTimestamp","isPublicationField","isCreatorField","timestamps","getTimestamps","Array","isArray","creatorFields","getCreatorFields","hasRelationAttribute","hasEditableAttribute","findFirstStringAttribute","Object","keys","find","key","getDefaultMainField","getSortableAttributes","validAttributes","filter","model","strapi","getModel","uid","nonVisibleWritableAttributes","intersection","identifierField"],"mappings":"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"}
|
|
@@ -4,6 +4,10 @@ var _ = require('lodash');
|
|
|
4
4
|
var index = require('../../../utils/index.js');
|
|
5
5
|
var attributes = require('./attributes.js');
|
|
6
6
|
|
|
7
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var ___default = /*#__PURE__*/_interopDefault(_);
|
|
10
|
+
|
|
7
11
|
const DEFAULT_LIST_LENGTH = 4;
|
|
8
12
|
const MAX_ROW_SIZE = 12;
|
|
9
13
|
const isAllowedFieldSize = (type, size)=>{
|
|
@@ -27,7 +31,7 @@ async function createDefaultLayouts(schema) {
|
|
|
27
31
|
list: createDefaultListLayout(schema),
|
|
28
32
|
// @ts-expect-error necessary to provide this default layout
|
|
29
33
|
edit: createDefaultEditLayout(schema),
|
|
30
|
-
...
|
|
34
|
+
...___default.default.pick(___default.default.get(schema, [
|
|
31
35
|
'config',
|
|
32
36
|
'layouts'
|
|
33
37
|
], {}), [
|
|
@@ -45,7 +49,7 @@ function createDefaultEditLayout(schema) {
|
|
|
45
49
|
return appendToEditLayout([], keys, schema);
|
|
46
50
|
}
|
|
47
51
|
/** Synchronisation functions */ function syncLayouts(configuration, schema) {
|
|
48
|
-
if (
|
|
52
|
+
if (___default.default.isEmpty(configuration.layouts)) return createDefaultLayouts(schema);
|
|
49
53
|
const { list = [], editRelations = [], edit = [] } = configuration.layouts || {};
|
|
50
54
|
let cleanList = list.filter((attr)=>attributes.isListable(schema, attr));
|
|
51
55
|
// TODO V5: remove editRelations
|
|
@@ -77,11 +81,11 @@ function createDefaultEditLayout(schema) {
|
|
|
77
81
|
}
|
|
78
82
|
}
|
|
79
83
|
cleanEdit = appendToEditLayout(cleanEdit, elementsToReAppend, schema);
|
|
80
|
-
const newAttributes =
|
|
84
|
+
const newAttributes = ___default.default.difference(Object.keys(schema.attributes), Object.keys(configuration.metadatas));
|
|
81
85
|
/** Add new attributes where they belong */ if (cleanList.length < DEFAULT_LIST_LENGTH) {
|
|
82
86
|
// add newAttributes
|
|
83
87
|
// only add valid listable attributes
|
|
84
|
-
cleanList =
|
|
88
|
+
cleanList = ___default.default.uniq(cleanList.concat(newAttributes.filter((key)=>attributes.isListable(schema, key))).slice(0, DEFAULT_LIST_LENGTH));
|
|
85
89
|
}
|
|
86
90
|
// add new attributes to edit view
|
|
87
91
|
const newEditAttributes = newAttributes.filter((key)=>attributes.hasEditableAttribute(schema, key));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layouts.js","sources":["../../../../../server/src/services/utils/configuration/layouts.ts"],"sourcesContent":["import _ from 'lodash';\nimport { getService } from '../../../utils';\nimport { isListable, hasEditableAttribute, hasRelationAttribute } from './attributes';\n\nconst DEFAULT_LIST_LENGTH = 4;\nconst MAX_ROW_SIZE = 12;\n\nconst isAllowedFieldSize = (type: any, size: any) => {\n const { getFieldSize } = getService('field-sizes');\n const fieldSize = getFieldSize(type);\n\n // Check if field was locked to another size\n if (!fieldSize.isResizable && size !== fieldSize.default) {\n return false;\n }\n\n // Otherwise allow unless it's bigger than a row\n return size <= MAX_ROW_SIZE;\n};\n\nconst getDefaultFieldSize = (attribute: any) => {\n const { hasFieldSize, getFieldSize } = getService('field-sizes');\n\n // Check if it's a custom field with a custom size and get the default size for the field type\n return getFieldSize(hasFieldSize(attribute.customField) ? attribute.customField : attribute.type)\n .default;\n};\n\nasync function createDefaultLayouts(schema: any) {\n return {\n // @ts-expect-error necessary to provide this default layout\n list: createDefaultListLayout(schema),\n // @ts-expect-error necessary to provide this default layout\n edit: createDefaultEditLayout(schema),\n ..._.pick(_.get(schema, ['config', 'layouts'], {}), ['list', 'edit']),\n };\n}\n\nfunction createDefaultListLayout(schema: any) {\n return Object.keys(schema.attributes)\n .filter((name) => isListable(schema, name) && name !== 'documentId')\n .slice(0, DEFAULT_LIST_LENGTH);\n}\n\nconst rowSize = (els: any) => els.reduce((sum: any, el: any) => sum + el.size, 0);\n\nfunction createDefaultEditLayout(schema: any) {\n const keys = Object.keys(schema.attributes).filter((name) => hasEditableAttribute(schema, name));\n\n return appendToEditLayout([], keys, schema);\n}\n\n/** Synchronisation functions */\n\nfunction syncLayouts(configuration: any, schema: any) {\n if (_.isEmpty(configuration.layouts)) return createDefaultLayouts(schema);\n\n const { list = [], editRelations = [], edit = [] } = configuration.layouts || {};\n\n let cleanList = list.filter((attr: any) => isListable(schema, attr));\n\n // TODO V5: remove editRelations\n const cleanEditRelations = editRelations.filter((attr: any) =>\n hasRelationAttribute(schema, attr)\n );\n\n // backward compatibility with when relations were on the side of the layout\n // it migrates the displayed relations to the main edit layout\n const elementsToReAppend = [...cleanEditRelations];\n let cleanEdit: unknown[] = [];\n for (const row of edit) {\n const newRow: unknown[] = [];\n\n for (const el of row) {\n if (!hasEditableAttribute(schema, el.name)) continue;\n\n // Check if the field is a custom field with a custom size.\n // If so, use the custom size instead of the type size\n const { hasFieldSize } = getService('field-sizes');\n const fieldType = hasFieldSize(schema.attributes[el.name].customField)\n ? schema.attributes[el.name].customField\n : schema.attributes[el.name].type;\n\n /* if the type of a field was changed (ex: string -> json) or a new field was added in the schema\n and the new type doesn't allow the size of the previous type, append the field at the end of layouts\n */\n if (!isAllowedFieldSize(fieldType, el.size)) {\n elementsToReAppend.push(el.name);\n continue;\n }\n\n newRow.push(el);\n }\n\n if (newRow.length > 0) {\n cleanEdit.push(newRow);\n }\n }\n\n cleanEdit = appendToEditLayout(cleanEdit as any, elementsToReAppend, schema);\n\n const newAttributes = _.difference(\n Object.keys(schema.attributes),\n Object.keys(configuration.metadatas)\n );\n\n /** Add new attributes where they belong */\n\n if (cleanList.length < DEFAULT_LIST_LENGTH) {\n // add newAttributes\n // only add valid listable attributes\n cleanList = _.uniq(\n cleanList\n .concat(newAttributes.filter((key) => isListable(schema, key)))\n .slice(0, DEFAULT_LIST_LENGTH)\n );\n }\n\n // add new attributes to edit view\n const newEditAttributes = newAttributes.filter((key) => hasEditableAttribute(schema, key));\n\n cleanEdit = appendToEditLayout(cleanEdit, newEditAttributes, schema);\n\n return {\n list: cleanList.length > 0 ? cleanList : createDefaultListLayout(schema),\n edit: cleanEdit.length > 0 ? cleanEdit : createDefaultEditLayout(schema),\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/default-param-last\nconst appendToEditLayout = (layout: any = [], keysToAppend: any, schema: any) => {\n if (keysToAppend.length === 0) return layout;\n let currentRowIndex = Math.max(layout.length - 1, 0);\n\n // init currentRow if necessary\n if (!layout[currentRowIndex]) {\n layout[currentRowIndex] = [];\n }\n\n for (const key of keysToAppend) {\n const attribute = schema.attributes[key];\n\n const attributeSize = getDefaultFieldSize(attribute);\n const currenRowSize = rowSize(layout[currentRowIndex]);\n\n if (currenRowSize + attributeSize > MAX_ROW_SIZE) {\n currentRowIndex += 1;\n layout[currentRowIndex] = [];\n }\n\n layout[currentRowIndex].push({\n name: key,\n size: attributeSize,\n });\n }\n\n return layout;\n};\n\nexport { createDefaultLayouts, syncLayouts };\n"],"names":["DEFAULT_LIST_LENGTH","MAX_ROW_SIZE","isAllowedFieldSize","type","size","getFieldSize","getService","fieldSize","isResizable","default","getDefaultFieldSize","attribute","hasFieldSize","customField","createDefaultLayouts","schema","list","createDefaultListLayout","edit","createDefaultEditLayout","_","pick","get","Object","keys","attributes","filter","name","isListable","slice","rowSize","els","reduce","sum","el","hasEditableAttribute","appendToEditLayout","syncLayouts","configuration","isEmpty","layouts","editRelations","cleanList","attr","cleanEditRelations","hasRelationAttribute","elementsToReAppend","cleanEdit","row","newRow","fieldType","push","length","newAttributes","difference","metadatas","uniq","concat","key","newEditAttributes","layout","keysToAppend","currentRowIndex","Math","max","attributeSize","currenRowSize"],"mappings":";;;;;;AAIA,MAAMA,mBAAAA,GAAsB,CAAA;AAC5B,MAAMC,YAAAA,GAAe,EAAA;AAErB,MAAMC,kBAAAA,GAAqB,CAACC,IAAAA,EAAWC,IAAAA,GAAAA;AACrC,IAAA,MAAM,EAAEC,YAAY,EAAE,GAAGC,gBAAAA,CAAW,aAAA,CAAA;AACpC,IAAA,MAAMC,YAAYF,YAAAA,CAAaF,IAAAA,CAAAA;;AAG/B,IAAA,IAAI,CAACI,SAAAA,CAAUC,WAAW,IAAIJ,IAAAA,KAASG,SAAAA,CAAUE,OAAO,EAAE;QACxD,OAAO,KAAA;AACT,IAAA;;AAGA,IAAA,OAAOL,IAAAA,IAAQH,YAAAA;AACjB,CAAA;AAEA,MAAMS,sBAAsB,CAACC,SAAAA,GAAAA;AAC3B,IAAA,MAAM,EAAEC,YAAY,EAAEP,YAAY,EAAE,GAAGC,gBAAAA,CAAW,aAAA,CAAA;;IAGlD,OAAOD,YAAAA,CAAaO,YAAAA,CAAaD,SAAAA,CAAUE,WAAW,CAAA,GAAIF,SAAAA,CAAUE,WAAW,GAAGF,SAAAA,CAAUR,IAAI,CAAA,CAC7FM,OAAO;AACZ,CAAA;AAEA,eAAeK,qBAAqBC,MAAW,EAAA;IAC7C,OAAO;;AAELC,QAAAA,IAAAA,EAAMC,uBAAAA,CAAwBF,MAAAA,CAAAA;;AAE9BG,QAAAA,IAAAA,EAAMC,uBAAAA,CAAwBJ,MAAAA,CAAAA;AAC9B,QAAA,GAAGK,EAAEC,IAAI,CAACD,CAAAA,CAAEE,GAAG,CAACP,MAAAA,EAAQ;AAAC,YAAA,QAAA;AAAU,YAAA;AAAU,SAAA,EAAE,EAAC,CAAA,EAAI;AAAC,YAAA,MAAA;AAAQ,YAAA;SAAO;AACtE,KAAA;AACF;AAEA,SAASE,wBAAwBF,MAAW,EAAA;AAC1C,IAAA,OAAOQ,OAAOC,IAAI,CAACT,MAAAA,CAAOU,UAAU,EACjCC,MAAM,CAAC,CAACC,IAAAA,GAASC,sBAAWb,MAAAA,EAAQY,IAAAA,CAAAA,IAASA,SAAS,YAAA,CAAA,CACtDE,KAAK,CAAC,CAAA,EAAG7B,mBAAAA,CAAAA;AACd;AAEA,MAAM8B,OAAAA,GAAU,CAACC,GAAAA,GAAaA,GAAAA,CAAIC,MAAM,CAAC,CAACC,GAAAA,EAAUC,EAAAA,GAAYD,GAAAA,GAAMC,EAAAA,CAAG9B,IAAI,EAAE,CAAA,CAAA;AAE/E,SAASe,wBAAwBJ,MAAW,EAAA;AAC1C,IAAA,MAAMS,IAAAA,GAAOD,MAAAA,CAAOC,IAAI,CAACT,MAAAA,CAAOU,UAAU,CAAA,CAAEC,MAAM,CAAC,CAACC,IAAAA,GAASQ,+BAAAA,CAAqBpB,MAAAA,EAAQY,IAAAA,CAAAA,CAAAA;IAE1F,OAAOS,kBAAAA,CAAmB,EAAE,EAAEZ,IAAAA,EAAMT,MAAAA,CAAAA;AACtC;AAEA,iCAEA,SAASsB,WAAAA,CAAYC,aAAkB,EAAEvB,MAAW,EAAA;AAClD,IAAA,IAAIK,EAAEmB,OAAO,CAACD,cAAcE,OAAO,CAAA,EAAG,OAAO1B,oBAAAA,CAAqBC,MAAAA,CAAAA;AAElE,IAAA,MAAM,EAAEC,IAAAA,GAAO,EAAE,EAAEyB,gBAAgB,EAAE,EAAEvB,IAAAA,GAAO,EAAE,EAAE,GAAGoB,aAAAA,CAAcE,OAAO,IAAI,EAAC;AAE/E,IAAA,IAAIE,YAAY1B,IAAAA,CAAKU,MAAM,CAAC,CAACiB,IAAAA,GAAcf,sBAAWb,MAAAA,EAAQ4B,IAAAA,CAAAA,CAAAA;;AAG9D,IAAA,MAAMC,qBAAqBH,aAAAA,CAAcf,MAAM,CAAC,CAACiB,IAAAA,GAC/CE,gCAAqB9B,MAAAA,EAAQ4B,IAAAA,CAAAA,CAAAA;;;AAK/B,IAAA,MAAMG,kBAAAA,GAAqB;AAAIF,QAAAA,GAAAA;AAAmB,KAAA;AAClD,IAAA,IAAIG,YAAuB,EAAE;IAC7B,KAAK,MAAMC,OAAO9B,IAAAA,CAAM;AACtB,QAAA,MAAM+B,SAAoB,EAAE;QAE5B,KAAK,MAAMf,MAAMc,GAAAA,CAAK;AACpB,YAAA,IAAI,CAACb,+BAAAA,CAAqBpB,MAAAA,EAAQmB,EAAAA,CAAGP,IAAI,CAAA,EAAG;;;AAI5C,YAAA,MAAM,EAAEf,YAAY,EAAE,GAAGN,gBAAAA,CAAW,aAAA,CAAA;YACpC,MAAM4C,SAAAA,GAAYtC,YAAAA,CAAaG,MAAAA,CAAOU,UAAU,CAACS,EAAAA,CAAGP,IAAI,CAAC,CAACd,WAAW,CAAA,GACjEE,MAAAA,CAAOU,UAAU,CAACS,EAAAA,CAAGP,IAAI,CAAC,CAACd,WAAW,GACtCE,MAAAA,CAAOU,UAAU,CAACS,EAAAA,CAAGP,IAAI,CAAC,CAACxB,IAAI;AAEnC;;AAEA,SACA,IAAI,CAACD,kBAAAA,CAAmBgD,SAAAA,EAAWhB,EAAAA,CAAG9B,IAAI,CAAA,EAAG;gBAC3C0C,kBAAAA,CAAmBK,IAAI,CAACjB,EAAAA,CAAGP,IAAI,CAAA;AAC/B,gBAAA;AACF,YAAA;AAEAsB,YAAAA,MAAAA,CAAOE,IAAI,CAACjB,EAAAA,CAAAA;AACd,QAAA;QAEA,IAAIe,MAAAA,CAAOG,MAAM,GAAG,CAAA,EAAG;AACrBL,YAAAA,SAAAA,CAAUI,IAAI,CAACF,MAAAA,CAAAA;AACjB,QAAA;AACF,IAAA;IAEAF,SAAAA,GAAYX,kBAAAA,CAAmBW,WAAkBD,kBAAAA,EAAoB/B,MAAAA,CAAAA;AAErE,IAAA,MAAMsC,aAAAA,GAAgBjC,CAAAA,CAAEkC,UAAU,CAChC/B,OAAOC,IAAI,CAACT,MAAAA,CAAOU,UAAU,CAAA,EAC7BF,MAAAA,CAAOC,IAAI,CAACc,cAAciB,SAAS,CAAA,CAAA;AAGrC,gDAEA,IAAIb,SAAAA,CAAUU,MAAM,GAAGpD,mBAAAA,EAAqB;;;AAG1C0C,QAAAA,SAAAA,GAAYtB,EAAEoC,IAAI,CAChBd,SAAAA,CACGe,MAAM,CAACJ,aAAAA,CAAc3B,MAAM,CAAC,CAACgC,MAAQ9B,qBAAAA,CAAWb,MAAAA,EAAQ2C,GAAAA,CAAAA,CAAAA,CAAAA,CACxD7B,KAAK,CAAC,CAAA,EAAG7B,mBAAAA,CAAAA,CAAAA;AAEhB,IAAA;;AAGA,IAAA,MAAM2D,oBAAoBN,aAAAA,CAAc3B,MAAM,CAAC,CAACgC,GAAAA,GAAQvB,gCAAqBpB,MAAAA,EAAQ2C,GAAAA,CAAAA,CAAAA;IAErFX,SAAAA,GAAYX,kBAAAA,CAAmBW,WAAWY,iBAAAA,EAAmB5C,MAAAA,CAAAA;IAE7D,OAAO;AACLC,QAAAA,IAAAA,EAAM0B,SAAAA,CAAUU,MAAM,GAAG,CAAA,GAAIV,YAAYzB,uBAAAA,CAAwBF,MAAAA,CAAAA;AACjEG,QAAAA,IAAAA,EAAM6B,SAAAA,CAAUK,MAAM,GAAG,CAAA,GAAIL,YAAY5B,uBAAAA,CAAwBJ,MAAAA;AACnE,KAAA;AACF;AAEA;AACA,MAAMqB,kBAAAA,GAAqB,CAACwB,MAAAA,GAAc,EAAE,EAAEC,YAAAA,EAAmB9C,MAAAA,GAAAA;AAC/D,IAAA,IAAI8C,YAAAA,CAAaT,MAAM,KAAK,CAAA,EAAG,OAAOQ,MAAAA;AACtC,IAAA,IAAIE,kBAAkBC,IAAAA,CAAKC,GAAG,CAACJ,MAAAA,CAAOR,MAAM,GAAG,CAAA,EAAG,CAAA,CAAA;;AAGlD,IAAA,IAAI,CAACQ,MAAM,CAACE,eAAAA,CAAgB,EAAE;QAC5BF,MAAM,CAACE,eAAAA,CAAgB,GAAG,EAAE;AAC9B,IAAA;IAEA,KAAK,MAAMJ,OAAOG,YAAAA,CAAc;AAC9B,QAAA,MAAMlD,SAAAA,GAAYI,MAAAA,CAAOU,UAAU,CAACiC,GAAAA,CAAI;AAExC,QAAA,MAAMO,gBAAgBvD,mBAAAA,CAAoBC,SAAAA,CAAAA;AAC1C,QAAA,MAAMuD,aAAAA,GAAgBpC,OAAAA,CAAQ8B,MAAM,CAACE,eAAAA,CAAgB,CAAA;QAErD,IAAII,aAAAA,GAAgBD,gBAAgBhE,YAAAA,EAAc;YAChD6D,eAAAA,IAAmB,CAAA;YACnBF,MAAM,CAACE,eAAAA,CAAgB,GAAG,EAAE;AAC9B,QAAA;AAEAF,QAAAA,MAAM,CAACE,eAAAA,CAAgB,CAACX,IAAI,CAAC;YAC3BxB,IAAAA,EAAM+B,GAAAA;YACNtD,IAAAA,EAAM6D;AACR,SAAA,CAAA;AACF,IAAA;IAEA,OAAOL,MAAAA;AACT,CAAA;;;;;"}
|
|
1
|
+
{"version":3,"file":"layouts.js","sources":["../../../../../server/src/services/utils/configuration/layouts.ts"],"sourcesContent":["import _ from 'lodash';\nimport { getService } from '../../../utils';\nimport { isListable, hasEditableAttribute, hasRelationAttribute } from './attributes';\n\nconst DEFAULT_LIST_LENGTH = 4;\nconst MAX_ROW_SIZE = 12;\n\nconst isAllowedFieldSize = (type: any, size: any) => {\n const { getFieldSize } = getService('field-sizes');\n const fieldSize = getFieldSize(type);\n\n // Check if field was locked to another size\n if (!fieldSize.isResizable && size !== fieldSize.default) {\n return false;\n }\n\n // Otherwise allow unless it's bigger than a row\n return size <= MAX_ROW_SIZE;\n};\n\nconst getDefaultFieldSize = (attribute: any) => {\n const { hasFieldSize, getFieldSize } = getService('field-sizes');\n\n // Check if it's a custom field with a custom size and get the default size for the field type\n return getFieldSize(hasFieldSize(attribute.customField) ? attribute.customField : attribute.type)\n .default;\n};\n\nasync function createDefaultLayouts(schema: any) {\n return {\n // @ts-expect-error necessary to provide this default layout\n list: createDefaultListLayout(schema),\n // @ts-expect-error necessary to provide this default layout\n edit: createDefaultEditLayout(schema),\n ..._.pick(_.get(schema, ['config', 'layouts'], {}), ['list', 'edit']),\n };\n}\n\nfunction createDefaultListLayout(schema: any) {\n return Object.keys(schema.attributes)\n .filter((name) => isListable(schema, name) && name !== 'documentId')\n .slice(0, DEFAULT_LIST_LENGTH);\n}\n\nconst rowSize = (els: any) => els.reduce((sum: any, el: any) => sum + el.size, 0);\n\nfunction createDefaultEditLayout(schema: any) {\n const keys = Object.keys(schema.attributes).filter((name) => hasEditableAttribute(schema, name));\n\n return appendToEditLayout([], keys, schema);\n}\n\n/** Synchronisation functions */\n\nfunction syncLayouts(configuration: any, schema: any) {\n if (_.isEmpty(configuration.layouts)) return createDefaultLayouts(schema);\n\n const { list = [], editRelations = [], edit = [] } = configuration.layouts || {};\n\n let cleanList = list.filter((attr: any) => isListable(schema, attr));\n\n // TODO V5: remove editRelations\n const cleanEditRelations = editRelations.filter((attr: any) =>\n hasRelationAttribute(schema, attr)\n );\n\n // backward compatibility with when relations were on the side of the layout\n // it migrates the displayed relations to the main edit layout\n const elementsToReAppend = [...cleanEditRelations];\n let cleanEdit: unknown[] = [];\n for (const row of edit) {\n const newRow: unknown[] = [];\n\n for (const el of row) {\n if (!hasEditableAttribute(schema, el.name)) continue;\n\n // Check if the field is a custom field with a custom size.\n // If so, use the custom size instead of the type size\n const { hasFieldSize } = getService('field-sizes');\n const fieldType = hasFieldSize(schema.attributes[el.name].customField)\n ? schema.attributes[el.name].customField\n : schema.attributes[el.name].type;\n\n /* if the type of a field was changed (ex: string -> json) or a new field was added in the schema\n and the new type doesn't allow the size of the previous type, append the field at the end of layouts\n */\n if (!isAllowedFieldSize(fieldType, el.size)) {\n elementsToReAppend.push(el.name);\n continue;\n }\n\n newRow.push(el);\n }\n\n if (newRow.length > 0) {\n cleanEdit.push(newRow);\n }\n }\n\n cleanEdit = appendToEditLayout(cleanEdit as any, elementsToReAppend, schema);\n\n const newAttributes = _.difference(\n Object.keys(schema.attributes),\n Object.keys(configuration.metadatas)\n );\n\n /** Add new attributes where they belong */\n\n if (cleanList.length < DEFAULT_LIST_LENGTH) {\n // add newAttributes\n // only add valid listable attributes\n cleanList = _.uniq(\n cleanList\n .concat(newAttributes.filter((key) => isListable(schema, key)))\n .slice(0, DEFAULT_LIST_LENGTH)\n );\n }\n\n // add new attributes to edit view\n const newEditAttributes = newAttributes.filter((key) => hasEditableAttribute(schema, key));\n\n cleanEdit = appendToEditLayout(cleanEdit, newEditAttributes, schema);\n\n return {\n list: cleanList.length > 0 ? cleanList : createDefaultListLayout(schema),\n edit: cleanEdit.length > 0 ? cleanEdit : createDefaultEditLayout(schema),\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/default-param-last\nconst appendToEditLayout = (layout: any = [], keysToAppend: any, schema: any) => {\n if (keysToAppend.length === 0) return layout;\n let currentRowIndex = Math.max(layout.length - 1, 0);\n\n // init currentRow if necessary\n if (!layout[currentRowIndex]) {\n layout[currentRowIndex] = [];\n }\n\n for (const key of keysToAppend) {\n const attribute = schema.attributes[key];\n\n const attributeSize = getDefaultFieldSize(attribute);\n const currenRowSize = rowSize(layout[currentRowIndex]);\n\n if (currenRowSize + attributeSize > MAX_ROW_SIZE) {\n currentRowIndex += 1;\n layout[currentRowIndex] = [];\n }\n\n layout[currentRowIndex].push({\n name: key,\n size: attributeSize,\n });\n }\n\n return layout;\n};\n\nexport { createDefaultLayouts, syncLayouts };\n"],"names":["DEFAULT_LIST_LENGTH","MAX_ROW_SIZE","isAllowedFieldSize","type","size","getFieldSize","getService","fieldSize","isResizable","default","getDefaultFieldSize","attribute","hasFieldSize","customField","createDefaultLayouts","schema","list","createDefaultListLayout","edit","createDefaultEditLayout","_","pick","get","Object","keys","attributes","filter","name","isListable","slice","rowSize","els","reduce","sum","el","hasEditableAttribute","appendToEditLayout","syncLayouts","configuration","isEmpty","layouts","editRelations","cleanList","attr","cleanEditRelations","hasRelationAttribute","elementsToReAppend","cleanEdit","row","newRow","fieldType","push","length","newAttributes","difference","metadatas","uniq","concat","key","newEditAttributes","layout","keysToAppend","currentRowIndex","Math","max","attributeSize","currenRowSize"],"mappings":"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"}
|
|
@@ -4,6 +4,10 @@ var _ = require('lodash');
|
|
|
4
4
|
var index = require('../../../utils/index.js');
|
|
5
5
|
var attributes = require('./attributes.js');
|
|
6
6
|
|
|
7
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var ___default = /*#__PURE__*/_interopDefault(_);
|
|
10
|
+
|
|
7
11
|
function createDefaultMetadatas(schema) {
|
|
8
12
|
return {
|
|
9
13
|
...Object.keys(schema.attributes).reduce((acc, name)=>{
|
|
@@ -44,7 +48,7 @@ function createDefaultMetadata(schema, name) {
|
|
|
44
48
|
edit.mainField = attributes.getDefaultMainField(targetSchema);
|
|
45
49
|
}
|
|
46
50
|
}
|
|
47
|
-
|
|
51
|
+
___default.default.assign(edit, ___default.default.pick(___default.default.get(schema, [
|
|
48
52
|
'config',
|
|
49
53
|
'metadatas',
|
|
50
54
|
name,
|
|
@@ -64,7 +68,7 @@ function createDefaultMetadata(schema, name) {
|
|
|
64
68
|
searchable: attributes.isSearchable(schema, name),
|
|
65
69
|
// @ts-expect-error we need to specify these properties
|
|
66
70
|
sortable: attributes.isSortable(schema, name),
|
|
67
|
-
...
|
|
71
|
+
...___default.default.pick(___default.default.get(schema, [
|
|
68
72
|
'config',
|
|
69
73
|
'metadatas',
|
|
70
74
|
name,
|
|
@@ -82,13 +86,13 @@ function createDefaultMetadata(schema, name) {
|
|
|
82
86
|
}
|
|
83
87
|
/** Synchronisation functions */ async function syncMetadatas(configuration, schema) {
|
|
84
88
|
// clear all keys that do not exist anymore
|
|
85
|
-
if (
|
|
89
|
+
if (___default.default.isEmpty(configuration.metadatas)) {
|
|
86
90
|
return createDefaultMetadatas(schema);
|
|
87
91
|
}
|
|
88
92
|
// remove old keys
|
|
89
|
-
const metasWithValidKeys =
|
|
93
|
+
const metasWithValidKeys = ___default.default.pick(configuration.metadatas, Object.keys(schema.attributes));
|
|
90
94
|
// add new keys and missing fields
|
|
91
|
-
const metasWithDefaults =
|
|
95
|
+
const metasWithDefaults = ___default.default.merge({}, createDefaultMetadatas(schema), metasWithValidKeys);
|
|
92
96
|
// clear the invalid mainFields
|
|
93
97
|
const updatedMetas = Object.keys(metasWithDefaults).reduce((acc, key)=>{
|
|
94
98
|
const { edit, list } = metasWithDefaults[key];
|
|
@@ -99,30 +103,30 @@ function createDefaultMetadata(schema, name) {
|
|
|
99
103
|
};
|
|
100
104
|
// update sortable attr
|
|
101
105
|
if (list.sortable && !attributes.isSortable(schema, key)) {
|
|
102
|
-
|
|
106
|
+
___default.default.set(updatedMeta, [
|
|
103
107
|
'list',
|
|
104
108
|
'sortable'
|
|
105
109
|
], false);
|
|
106
|
-
|
|
110
|
+
___default.default.set(acc, [
|
|
107
111
|
key
|
|
108
112
|
], updatedMeta);
|
|
109
113
|
}
|
|
110
114
|
if (list.searchable && !attributes.isSearchable(schema, key)) {
|
|
111
|
-
|
|
115
|
+
___default.default.set(updatedMeta, [
|
|
112
116
|
'list',
|
|
113
117
|
'searchable'
|
|
114
118
|
], false);
|
|
115
|
-
|
|
119
|
+
___default.default.set(acc, [
|
|
116
120
|
key
|
|
117
121
|
], updatedMeta);
|
|
118
122
|
}
|
|
119
|
-
if (!
|
|
123
|
+
if (!___default.default.has(edit, 'mainField')) return acc;
|
|
120
124
|
// remove mainField if the attribute is not a relation anymore
|
|
121
125
|
if (!attributes.isRelation(attr)) {
|
|
122
|
-
|
|
126
|
+
___default.default.set(updatedMeta, 'edit', ___default.default.omit(edit, [
|
|
123
127
|
'mainField'
|
|
124
128
|
]));
|
|
125
|
-
|
|
129
|
+
___default.default.set(acc, [
|
|
126
130
|
key
|
|
127
131
|
], updatedMeta);
|
|
128
132
|
return acc;
|
|
@@ -133,18 +137,18 @@ function createDefaultMetadata(schema, name) {
|
|
|
133
137
|
const targetSchema = getTargetSchema(attr.targetModel);
|
|
134
138
|
if (!targetSchema) return acc;
|
|
135
139
|
if (!attributes.isSortable(targetSchema, edit.mainField) && !attributes.isListable(targetSchema, edit.mainField)) {
|
|
136
|
-
|
|
140
|
+
___default.default.set(updatedMeta, [
|
|
137
141
|
'edit',
|
|
138
142
|
'mainField'
|
|
139
143
|
], attributes.getDefaultMainField(targetSchema));
|
|
140
|
-
|
|
144
|
+
___default.default.set(acc, [
|
|
141
145
|
key
|
|
142
146
|
], updatedMeta);
|
|
143
147
|
return acc;
|
|
144
148
|
}
|
|
145
149
|
return acc;
|
|
146
150
|
}, {});
|
|
147
|
-
return
|
|
151
|
+
return ___default.default.assign(metasWithDefaults, updatedMetas);
|
|
148
152
|
}
|
|
149
153
|
const getTargetSchema = (targetModel)=>{
|
|
150
154
|
return index.getService('content-types').findContentType(targetModel);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadatas.js","sources":["../../../../../server/src/services/utils/configuration/metadatas.ts"],"sourcesContent":["import _ from 'lodash';\nimport { getService } from '../../../utils';\nimport {\n isSortable,\n isSearchable,\n isVisible,\n isListable,\n isRelation,\n getDefaultMainField,\n} from './attributes';\n\nfunction createDefaultMetadatas(schema: any) {\n return {\n ...Object.keys(schema.attributes).reduce((acc: any, name) => {\n acc[name] = createDefaultMetadata(schema, name);\n return acc;\n }, {}),\n id: {\n edit: {},\n list: {\n label: 'id',\n searchable: true,\n sortable: true,\n },\n },\n documentId: {\n edit: {},\n list: {\n label: 'documentId',\n searchable: true,\n sortable: true,\n },\n },\n };\n}\n\nfunction createDefaultMetadata(schema: any, name: any) {\n const edit = {\n label: name,\n description: '',\n placeholder: '',\n visible: isVisible(schema, name),\n editable: true,\n } as any;\n\n const fieldAttributes = schema.attributes[name];\n if (isRelation(fieldAttributes)) {\n const { targetModel } = fieldAttributes;\n\n const targetSchema = getTargetSchema(targetModel);\n\n if (targetSchema) {\n edit.mainField = getDefaultMainField(targetSchema);\n }\n }\n\n _.assign(\n edit,\n _.pick(_.get(schema, ['config', 'metadatas', name, 'edit'], {}), [\n 'label',\n 'description',\n 'placeholder',\n 'visible',\n 'editable',\n 'mainField',\n ])\n );\n\n const list = {\n // @ts-expect-error we need to specify these properties\n label: name,\n // @ts-expect-error we need to specify these properties\n searchable: isSearchable(schema, name),\n // @ts-expect-error we need to specify these properties\n sortable: isSortable(schema, name),\n ..._.pick(_.get(schema, ['config', 'metadatas', name, 'list'], {}), [\n 'label',\n 'searchable',\n 'sortable',\n ]),\n };\n\n return { edit, list };\n}\n\n/** Synchronisation functions */\n\nasync function syncMetadatas(configuration: any, schema: any) {\n // clear all keys that do not exist anymore\n if (_.isEmpty(configuration.metadatas)) {\n return createDefaultMetadatas(schema);\n }\n\n // remove old keys\n const metasWithValidKeys = _.pick(configuration.metadatas, Object.keys(schema.attributes));\n\n // add new keys and missing fields\n const metasWithDefaults = _.merge({}, createDefaultMetadatas(schema), metasWithValidKeys);\n\n // clear the invalid mainFields\n const updatedMetas = Object.keys(metasWithDefaults).reduce((acc, key) => {\n const { edit, list } = metasWithDefaults[key];\n const attr = schema.attributes[key];\n\n const updatedMeta = { edit, list };\n\n // update sortable attr\n if (list.sortable && !isSortable(schema, key)) {\n _.set(updatedMeta, ['list', 'sortable'], false);\n _.set(acc, [key], updatedMeta);\n }\n\n if (list.searchable && !isSearchable(schema, key)) {\n _.set(updatedMeta, ['list', 'searchable'], false);\n _.set(acc, [key], updatedMeta);\n }\n\n if (!_.has(edit, 'mainField')) return acc;\n\n // remove mainField if the attribute is not a relation anymore\n if (!isRelation(attr)) {\n _.set(updatedMeta, 'edit', _.omit(edit, ['mainField']));\n _.set(acc, [key], updatedMeta);\n return acc;\n }\n\n // if the mainField is id you can keep it\n if (edit.mainField === 'id') return acc;\n\n // check the mainField in the targetModel\n const targetSchema = getTargetSchema(attr.targetModel);\n\n if (!targetSchema) return acc;\n\n if (!isSortable(targetSchema, edit.mainField) && !isListable(targetSchema, edit.mainField)) {\n _.set(updatedMeta, ['edit', 'mainField'], getDefaultMainField(targetSchema));\n _.set(acc, [key], updatedMeta);\n return acc;\n }\n\n return acc;\n }, {});\n\n return _.assign(metasWithDefaults, updatedMetas);\n}\n\nconst getTargetSchema = (targetModel: any) => {\n return getService('content-types').findContentType(targetModel);\n};\n\nexport { createDefaultMetadatas, syncMetadatas };\n"],"names":["createDefaultMetadatas","schema","Object","keys","attributes","reduce","acc","name","createDefaultMetadata","id","edit","list","label","searchable","sortable","documentId","description","placeholder","visible","isVisible","editable","fieldAttributes","isRelation","targetModel","targetSchema","getTargetSchema","mainField","getDefaultMainField","_","assign","pick","get","isSearchable","isSortable","syncMetadatas","configuration","isEmpty","metadatas","metasWithValidKeys","metasWithDefaults","merge","updatedMetas","key","attr","updatedMeta","set","has","omit","isListable","getService","findContentType"],"mappings":"
|
|
1
|
+
{"version":3,"file":"metadatas.js","sources":["../../../../../server/src/services/utils/configuration/metadatas.ts"],"sourcesContent":["import _ from 'lodash';\nimport { getService } from '../../../utils';\nimport {\n isSortable,\n isSearchable,\n isVisible,\n isListable,\n isRelation,\n getDefaultMainField,\n} from './attributes';\n\nfunction createDefaultMetadatas(schema: any) {\n return {\n ...Object.keys(schema.attributes).reduce((acc: any, name) => {\n acc[name] = createDefaultMetadata(schema, name);\n return acc;\n }, {}),\n id: {\n edit: {},\n list: {\n label: 'id',\n searchable: true,\n sortable: true,\n },\n },\n documentId: {\n edit: {},\n list: {\n label: 'documentId',\n searchable: true,\n sortable: true,\n },\n },\n };\n}\n\nfunction createDefaultMetadata(schema: any, name: any) {\n const edit = {\n label: name,\n description: '',\n placeholder: '',\n visible: isVisible(schema, name),\n editable: true,\n } as any;\n\n const fieldAttributes = schema.attributes[name];\n if (isRelation(fieldAttributes)) {\n const { targetModel } = fieldAttributes;\n\n const targetSchema = getTargetSchema(targetModel);\n\n if (targetSchema) {\n edit.mainField = getDefaultMainField(targetSchema);\n }\n }\n\n _.assign(\n edit,\n _.pick(_.get(schema, ['config', 'metadatas', name, 'edit'], {}), [\n 'label',\n 'description',\n 'placeholder',\n 'visible',\n 'editable',\n 'mainField',\n ])\n );\n\n const list = {\n // @ts-expect-error we need to specify these properties\n label: name,\n // @ts-expect-error we need to specify these properties\n searchable: isSearchable(schema, name),\n // @ts-expect-error we need to specify these properties\n sortable: isSortable(schema, name),\n ..._.pick(_.get(schema, ['config', 'metadatas', name, 'list'], {}), [\n 'label',\n 'searchable',\n 'sortable',\n ]),\n };\n\n return { edit, list };\n}\n\n/** Synchronisation functions */\n\nasync function syncMetadatas(configuration: any, schema: any) {\n // clear all keys that do not exist anymore\n if (_.isEmpty(configuration.metadatas)) {\n return createDefaultMetadatas(schema);\n }\n\n // remove old keys\n const metasWithValidKeys = _.pick(configuration.metadatas, Object.keys(schema.attributes));\n\n // add new keys and missing fields\n const metasWithDefaults = _.merge({}, createDefaultMetadatas(schema), metasWithValidKeys);\n\n // clear the invalid mainFields\n const updatedMetas = Object.keys(metasWithDefaults).reduce((acc, key) => {\n const { edit, list } = metasWithDefaults[key];\n const attr = schema.attributes[key];\n\n const updatedMeta = { edit, list };\n\n // update sortable attr\n if (list.sortable && !isSortable(schema, key)) {\n _.set(updatedMeta, ['list', 'sortable'], false);\n _.set(acc, [key], updatedMeta);\n }\n\n if (list.searchable && !isSearchable(schema, key)) {\n _.set(updatedMeta, ['list', 'searchable'], false);\n _.set(acc, [key], updatedMeta);\n }\n\n if (!_.has(edit, 'mainField')) return acc;\n\n // remove mainField if the attribute is not a relation anymore\n if (!isRelation(attr)) {\n _.set(updatedMeta, 'edit', _.omit(edit, ['mainField']));\n _.set(acc, [key], updatedMeta);\n return acc;\n }\n\n // if the mainField is id you can keep it\n if (edit.mainField === 'id') return acc;\n\n // check the mainField in the targetModel\n const targetSchema = getTargetSchema(attr.targetModel);\n\n if (!targetSchema) return acc;\n\n if (!isSortable(targetSchema, edit.mainField) && !isListable(targetSchema, edit.mainField)) {\n _.set(updatedMeta, ['edit', 'mainField'], getDefaultMainField(targetSchema));\n _.set(acc, [key], updatedMeta);\n return acc;\n }\n\n return acc;\n }, {});\n\n return _.assign(metasWithDefaults, updatedMetas);\n}\n\nconst getTargetSchema = (targetModel: any) => {\n return getService('content-types').findContentType(targetModel);\n};\n\nexport { createDefaultMetadatas, syncMetadatas };\n"],"names":["createDefaultMetadatas","schema","Object","keys","attributes","reduce","acc","name","createDefaultMetadata","id","edit","list","label","searchable","sortable","documentId","description","placeholder","visible","isVisible","editable","fieldAttributes","isRelation","targetModel","targetSchema","getTargetSchema","mainField","getDefaultMainField","_","assign","pick","get","isSearchable","isSortable","syncMetadatas","configuration","isEmpty","metadatas","metasWithValidKeys","metasWithDefaults","merge","updatedMetas","key","attr","updatedMeta","set","has","omit","isListable","getService","findContentType"],"mappings":"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"}
|
|
@@ -5,6 +5,10 @@ var strapiUtils = require('@strapi/utils');
|
|
|
5
5
|
var qs = require('qs');
|
|
6
6
|
var attributes = require('./attributes.js');
|
|
7
7
|
|
|
8
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
|
|
10
|
+
var qs__default = /*#__PURE__*/_interopDefault(qs);
|
|
11
|
+
|
|
8
12
|
/** General settings */ const DEFAULT_SETTINGS = {
|
|
9
13
|
bulkable: true,
|
|
10
14
|
filterable: true,
|
|
@@ -27,7 +31,7 @@ const getModelSettings = fp.pipe([
|
|
|
27
31
|
fp.pick(settingsFields)
|
|
28
32
|
]);
|
|
29
33
|
async function isValidDefaultSort(schema, value) {
|
|
30
|
-
const parsedValue =
|
|
34
|
+
const parsedValue = qs__default.default.parse(value);
|
|
31
35
|
const omitNonSortableAttributes = ({ schema, key }, { remove })=>{
|
|
32
36
|
const sortableAttributes = attributes.getSortableAttributes(schema);
|
|
33
37
|
if (!sortableAttributes.includes(key)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sources":["../../../../../server/src/services/utils/configuration/settings.ts"],"sourcesContent":["import { isEmpty, pick, pipe, propOr, isEqual } from 'lodash/fp';\nimport { traverse } from '@strapi/utils';\nimport qs from 'qs';\nimport { isSortable, getDefaultMainField, getSortableAttributes } from './attributes';\n\n/** General settings */\nconst DEFAULT_SETTINGS = {\n bulkable: true,\n filterable: true,\n searchable: true,\n pageSize: 10,\n relationOpenMode: 'modal' as const,\n};\n\nconst settingsFields = [\n 'searchable',\n 'filterable',\n 'bulkable',\n 'pageSize',\n 'mainField',\n 'defaultSortBy',\n 'defaultSortOrder',\n 'relationOpenMode',\n];\n\nconst getModelSettings = pipe([propOr({}, 'config.settings'), pick(settingsFields)]);\n\nasync function isValidDefaultSort(schema: any, value: any) {\n const parsedValue = qs.parse(value);\n\n const omitNonSortableAttributes = ({ schema, key }: any, { remove }: any) => {\n const sortableAttributes = getSortableAttributes(schema);\n if (!sortableAttributes.includes(key)) {\n remove(key);\n }\n };\n\n const sanitizedValue = await traverse.traverseQuerySort(\n omitNonSortableAttributes,\n { schema, getModel: strapi.getModel.bind(strapi) },\n parsedValue\n );\n\n // If any of the keys has been removed, the sort attribute is not valid\n return isEqual(parsedValue, sanitizedValue);\n}\n\nconst createDefaultSettings = async (schema: any) => {\n const defaultField = getDefaultMainField(schema);\n\n return {\n ...DEFAULT_SETTINGS,\n mainField: defaultField,\n defaultSortBy: defaultField,\n defaultSortOrder: 'ASC',\n ...getModelSettings(schema),\n };\n};\n\nconst syncSettings = async (configuration: any, schema: any) => {\n if (isEmpty(configuration.settings)) return createDefaultSettings(schema);\n\n const defaultField = getDefaultMainField(schema);\n\n const { mainField = defaultField, defaultSortBy = defaultField } = configuration.settings || {};\n\n return {\n ...configuration.settings,\n mainField: isSortable(schema, mainField) ? mainField : defaultField,\n defaultSortBy: (await isValidDefaultSort(schema, defaultSortBy)) ? defaultSortBy : defaultField,\n };\n};\n\nexport { isValidDefaultSort, createDefaultSettings, syncSettings };\n"],"names":["DEFAULT_SETTINGS","bulkable","filterable","searchable","pageSize","relationOpenMode","settingsFields","getModelSettings","pipe","propOr","pick","isValidDefaultSort","schema","value","parsedValue","qs","parse","omitNonSortableAttributes","key","remove","sortableAttributes","getSortableAttributes","includes","sanitizedValue","traverse","traverseQuerySort","getModel","strapi","bind","isEqual","createDefaultSettings","defaultField","getDefaultMainField","mainField","defaultSortBy","defaultSortOrder","syncSettings","configuration","isEmpty","settings","isSortable"],"mappings":"
|
|
1
|
+
{"version":3,"file":"settings.js","sources":["../../../../../server/src/services/utils/configuration/settings.ts"],"sourcesContent":["import { isEmpty, pick, pipe, propOr, isEqual } from 'lodash/fp';\nimport { traverse } from '@strapi/utils';\nimport qs from 'qs';\nimport { isSortable, getDefaultMainField, getSortableAttributes } from './attributes';\n\n/** General settings */\nconst DEFAULT_SETTINGS = {\n bulkable: true,\n filterable: true,\n searchable: true,\n pageSize: 10,\n relationOpenMode: 'modal' as const,\n};\n\nconst settingsFields = [\n 'searchable',\n 'filterable',\n 'bulkable',\n 'pageSize',\n 'mainField',\n 'defaultSortBy',\n 'defaultSortOrder',\n 'relationOpenMode',\n];\n\nconst getModelSettings = pipe([propOr({}, 'config.settings'), pick(settingsFields)]);\n\nasync function isValidDefaultSort(schema: any, value: any) {\n const parsedValue = qs.parse(value);\n\n const omitNonSortableAttributes = ({ schema, key }: any, { remove }: any) => {\n const sortableAttributes = getSortableAttributes(schema);\n if (!sortableAttributes.includes(key)) {\n remove(key);\n }\n };\n\n const sanitizedValue = await traverse.traverseQuerySort(\n omitNonSortableAttributes,\n { schema, getModel: strapi.getModel.bind(strapi) },\n parsedValue\n );\n\n // If any of the keys has been removed, the sort attribute is not valid\n return isEqual(parsedValue, sanitizedValue);\n}\n\nconst createDefaultSettings = async (schema: any) => {\n const defaultField = getDefaultMainField(schema);\n\n return {\n ...DEFAULT_SETTINGS,\n mainField: defaultField,\n defaultSortBy: defaultField,\n defaultSortOrder: 'ASC',\n ...getModelSettings(schema),\n };\n};\n\nconst syncSettings = async (configuration: any, schema: any) => {\n if (isEmpty(configuration.settings)) return createDefaultSettings(schema);\n\n const defaultField = getDefaultMainField(schema);\n\n const { mainField = defaultField, defaultSortBy = defaultField } = configuration.settings || {};\n\n return {\n ...configuration.settings,\n mainField: isSortable(schema, mainField) ? mainField : defaultField,\n defaultSortBy: (await isValidDefaultSort(schema, defaultSortBy)) ? defaultSortBy : defaultField,\n };\n};\n\nexport { isValidDefaultSort, createDefaultSettings, syncSettings };\n"],"names":["DEFAULT_SETTINGS","bulkable","filterable","searchable","pageSize","relationOpenMode","settingsFields","getModelSettings","pipe","propOr","pick","isValidDefaultSort","schema","value","parsedValue","qs","parse","omitNonSortableAttributes","key","remove","sortableAttributes","getSortableAttributes","includes","sanitizedValue","traverse","traverseQuerySort","getModel","strapi","bind","isEqual","createDefaultSettings","defaultField","getDefaultMainField","mainField","defaultSortBy","defaultSortOrder","syncSettings","configuration","isEmpty","settings","isSortable"],"mappings":";;;;;;;;;;;AAKA,wBACA,MAAMA,gBAAAA,GAAmB;IACvBC,QAAAA,EAAU,IAAA;IACVC,UAAAA,EAAY,IAAA;IACZC,UAAAA,EAAY,IAAA;IACZC,QAAAA,EAAU,EAAA;IACVC,gBAAAA,EAAkB;AACpB,CAAA;AAEA,MAAMC,cAAAA,GAAiB;AACrB,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA,UAAA;AACA,IAAA,UAAA;AACA,IAAA,WAAA;AACA,IAAA,eAAA;AACA,IAAA,kBAAA;AACA,IAAA;AACD,CAAA;AAED,MAAMC,mBAAmBC,OAAAA,CAAK;AAACC,IAAAA,SAAAA,CAAO,EAAC,EAAG,iBAAA,CAAA;IAAoBC,OAAAA,CAAKJ,cAAAA;AAAgB,CAAA,CAAA;AAEnF,eAAeK,kBAAAA,CAAmBC,MAAW,EAAEC,KAAU,EAAA;IACvD,MAAMC,WAAAA,GAAcC,mBAAAA,CAAGC,KAAK,CAACH,KAAAA,CAAAA;IAE7B,MAAMI,yBAAAA,GAA4B,CAAC,EAAEL,MAAM,EAAEM,GAAG,EAAO,EAAE,EAAEC,MAAM,EAAO,GAAA;AACtE,QAAA,MAAMC,qBAAqBC,gCAAAA,CAAsBT,MAAAA,CAAAA;AACjD,QAAA,IAAI,CAACQ,kBAAAA,CAAmBE,QAAQ,CAACJ,GAAAA,CAAAA,EAAM;YACrCC,MAAAA,CAAOD,GAAAA,CAAAA;AACT,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMK,cAAAA,GAAiB,MAAMC,oBAAAA,CAASC,iBAAiB,CACrDR,yBAAAA,EACA;AAAEL,QAAAA,MAAAA;AAAQc,QAAAA,QAAAA,EAAUC,MAAAA,CAAOD,QAAQ,CAACE,IAAI,CAACD,MAAAA;KAAQ,EACjDb,WAAAA,CAAAA;;AAIF,IAAA,OAAOe,WAAQf,WAAAA,EAAaS,cAAAA,CAAAA;AAC9B;AAEA,MAAMO,wBAAwB,OAAOlB,MAAAA,GAAAA;AACnC,IAAA,MAAMmB,eAAeC,8BAAAA,CAAoBpB,MAAAA,CAAAA;IAEzC,OAAO;AACL,QAAA,GAAGZ,gBAAgB;QACnBiC,SAAAA,EAAWF,YAAAA;QACXG,aAAAA,EAAeH,YAAAA;QACfI,gBAAAA,EAAkB,KAAA;AAClB,QAAA,GAAG5B,iBAAiBK,MAAAA;AACtB,KAAA;AACF;AAEA,MAAMwB,YAAAA,GAAe,OAAOC,aAAAA,EAAoBzB,MAAAA,GAAAA;AAC9C,IAAA,IAAI0B,UAAAA,CAAQD,aAAAA,CAAcE,QAAQ,CAAA,EAAG,OAAOT,qBAAAA,CAAsBlB,MAAAA,CAAAA;AAElE,IAAA,MAAMmB,eAAeC,8BAAAA,CAAoBpB,MAAAA,CAAAA;IAEzC,MAAM,EAAEqB,SAAAA,GAAYF,YAAY,EAAEG,aAAAA,GAAgBH,YAAY,EAAE,GAAGM,aAAAA,CAAcE,QAAQ,IAAI,EAAC;IAE9F,OAAO;AACL,QAAA,GAAGF,cAAcE,QAAQ;QACzBN,SAAAA,EAAWO,qBAAAA,CAAW5B,MAAAA,EAAQqB,SAAAA,CAAAA,GAAaA,SAAAA,GAAYF,YAAAA;AACvDG,QAAAA,aAAAA,EAAe,MAAOvB,kBAAAA,CAAmBC,MAAAA,EAAQsB,iBAAkBA,aAAAA,GAAgBH;AACrF,KAAA;AACF;;;;;;"}
|
|
@@ -3,7 +3,11 @@
|
|
|
3
3
|
var fp = require('lodash/fp');
|
|
4
4
|
var strapiUtils = require('@strapi/utils');
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
|
|
8
|
+
var strapiUtils__default = /*#__PURE__*/_interopDefault(strapiUtils);
|
|
9
|
+
|
|
10
|
+
const { isVisibleAttribute, hasDraftAndPublish } = strapiUtils__default.default.contentTypes;
|
|
7
11
|
/**
|
|
8
12
|
* sumDraftCounts works recursively on the attributes of a model counting the
|
|
9
13
|
* number of draft relations
|