@strapi/content-manager 5.49.0 → 5.50.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.
Files changed (228) hide show
  1. package/dist/admin/layout.js +3 -1
  2. package/dist/admin/layout.js.map +1 -1
  3. package/dist/admin/layout.mjs +5 -3
  4. package/dist/admin/layout.mjs.map +1 -1
  5. package/dist/admin/pages/EditView/components/DocumentActions.js +161 -72
  6. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  7. package/dist/admin/pages/EditView/components/DocumentActions.mjs +161 -73
  8. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  9. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +6 -1
  10. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
  11. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +2 -1
  12. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
  13. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +6 -2
  14. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  15. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +3 -2
  16. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  17. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +6 -1
  18. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  19. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +6 -1
  20. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  21. package/dist/admin/pages/EditView/utils/draftRelationCounts.js +117 -0
  22. package/dist/admin/pages/EditView/utils/draftRelationCounts.js.map +1 -0
  23. package/dist/admin/pages/EditView/utils/draftRelationCounts.mjs +109 -0
  24. package/dist/admin/pages/EditView/utils/draftRelationCounts.mjs.map +1 -0
  25. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js +1 -1
  26. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
  27. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs +1 -1
  28. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs.map +1 -1
  29. package/dist/admin/pages/ListView/components/TableCells/CellContent.js +2 -2
  30. package/dist/admin/pages/ListView/components/TableCells/CellContent.js.map +1 -1
  31. package/dist/admin/pages/ListView/components/TableCells/CellContent.mjs +2 -2
  32. package/dist/admin/pages/ListView/components/TableCells/CellContent.mjs.map +1 -1
  33. package/dist/admin/pages/ListView/components/TableCells/Relations.js +1 -1
  34. package/dist/admin/pages/ListView/components/TableCells/Relations.js.map +1 -1
  35. package/dist/admin/pages/ListView/components/TableCells/Relations.mjs +1 -1
  36. package/dist/admin/pages/ListView/components/TableCells/Relations.mjs.map +1 -1
  37. package/dist/admin/preview/pages/Preview.js +38 -11
  38. package/dist/admin/preview/pages/Preview.js.map +1 -1
  39. package/dist/admin/preview/pages/Preview.mjs +39 -12
  40. package/dist/admin/preview/pages/Preview.mjs.map +1 -1
  41. package/dist/admin/preview/utils/constants.js +9 -15
  42. package/dist/admin/preview/utils/constants.js.map +1 -1
  43. package/dist/admin/preview/utils/constants.mjs +10 -15
  44. package/dist/admin/preview/utils/constants.mjs.map +1 -1
  45. package/dist/admin/src/components/InjectionZone.d.ts +1 -2
  46. package/dist/admin/src/content-manager.d.ts +15 -15
  47. package/dist/admin/src/history/services/historyVersion.d.ts +2 -2
  48. package/dist/admin/src/hooks/useContentTypeSchema.d.ts +1 -1
  49. package/dist/admin/src/hooks/useDocument.d.ts +8 -9
  50. package/dist/admin/src/hooks/useDocumentLayout.d.ts +3 -3
  51. package/dist/admin/src/hooks/useDragAndDrop.d.ts +4 -4
  52. package/dist/admin/src/hooks/useKeyboardDragAndDrop.d.ts +1 -1
  53. package/dist/admin/src/hooks/usePersistentQueryParams.d.ts +0 -1
  54. package/dist/admin/src/modules/app.d.ts +5 -5
  55. package/dist/admin/src/pages/EditView/EditViewPage.d.ts +1 -1
  56. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +12 -1
  57. package/dist/admin/src/pages/EditView/components/EditorToolbarObserver.d.ts +1 -1
  58. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.d.ts +1 -1
  59. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/conversions.d.ts +2 -2
  60. package/dist/admin/src/pages/EditView/components/FormInputs/ComponentContext.d.ts +1 -2
  61. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/Relations.d.ts +4 -4
  62. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.d.ts +2 -2
  63. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +19 -20
  64. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +12 -12
  65. package/dist/admin/src/pages/EditView/utils/draftRelationCounts.d.ts +26 -0
  66. package/dist/admin/src/pages/ListView/components/BulkActions/PublishAction.d.ts +1 -1
  67. package/dist/admin/src/pages/ListView/components/Filters.d.ts +1 -1
  68. package/dist/admin/src/pages/formatComponentConfigurationEditLayout.d.ts +1 -1
  69. package/dist/admin/src/preview/utils/constants.d.ts +1 -7
  70. package/dist/admin/src/preview/utils/getSendMessage.d.ts +0 -1
  71. package/dist/admin/src/services/documents.d.ts +30 -70
  72. package/dist/admin/src/services/relations.d.ts +6 -20
  73. package/dist/admin/src/services/uid.d.ts +5 -5
  74. package/dist/admin/src/utils/layouts/normalizeContentManagerLayout.d.ts +4 -4
  75. package/dist/admin/src/utils/users.d.ts +1 -1
  76. package/dist/admin/src/utils/validation.d.ts +1 -1
  77. package/dist/admin/translations/en.json.js +5 -2
  78. package/dist/admin/translations/en.json.js.map +1 -1
  79. package/dist/admin/translations/en.json.mjs +5 -2
  80. package/dist/admin/translations/en.json.mjs.map +1 -1
  81. package/dist/admin/translations/ja.json.js +262 -87
  82. package/dist/admin/translations/ja.json.js.map +1 -1
  83. package/dist/admin/translations/ja.json.mjs +262 -87
  84. package/dist/admin/translations/ja.json.mjs.map +1 -1
  85. package/dist/server/controllers/collection-types.js +2 -2
  86. package/dist/server/controllers/collection-types.js.map +1 -1
  87. package/dist/server/controllers/collection-types.mjs +2 -2
  88. package/dist/server/controllers/collection-types.mjs.map +1 -1
  89. package/dist/server/controllers/single-types.js +2 -2
  90. package/dist/server/controllers/single-types.js.map +1 -1
  91. package/dist/server/controllers/single-types.mjs +2 -2
  92. package/dist/server/controllers/single-types.mjs.map +1 -1
  93. package/dist/server/preview/controllers/preview.js +9 -0
  94. package/dist/server/preview/controllers/preview.js.map +1 -1
  95. package/dist/server/preview/controllers/preview.mjs +9 -0
  96. package/dist/server/preview/controllers/preview.mjs.map +1 -1
  97. package/dist/server/preview/controllers/previewScript.js +1450 -0
  98. package/dist/server/preview/routes/preview.js +11 -0
  99. package/dist/server/preview/routes/preview.js.map +1 -1
  100. package/dist/server/preview/routes/preview.mjs +11 -0
  101. package/dist/server/preview/routes/preview.mjs.map +1 -1
  102. package/dist/server/services/document-manager.js +13 -19
  103. package/dist/server/services/document-manager.js.map +1 -1
  104. package/dist/server/services/document-manager.mjs +13 -19
  105. package/dist/server/services/document-manager.mjs.map +1 -1
  106. package/dist/server/services/utils/draft-relations.js +9 -0
  107. package/dist/server/services/utils/draft-relations.js.map +1 -0
  108. package/dist/server/services/utils/draft-relations.mjs +7 -0
  109. package/dist/server/services/utils/draft-relations.mjs.map +1 -0
  110. package/dist/server/services/utils/draft.js +118 -25
  111. package/dist/server/services/utils/draft.js.map +1 -1
  112. package/dist/server/services/utils/draft.mjs +118 -25
  113. package/dist/server/services/utils/draft.mjs.map +1 -1
  114. package/dist/server/services/utils/populate.js +15 -1
  115. package/dist/server/services/utils/populate.js.map +1 -1
  116. package/dist/server/services/utils/populate.mjs +15 -1
  117. package/dist/server/services/utils/populate.mjs.map +1 -1
  118. package/dist/server/src/controllers/index.d.ts +1 -1
  119. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  120. package/dist/server/src/controllers/utils/clone.d.ts.map +1 -1
  121. package/dist/server/src/controllers/utils/document-status.d.ts +1 -1
  122. package/dist/server/src/controllers/utils/document-status.d.ts.map +1 -1
  123. package/dist/server/src/controllers/utils/metadata.d.ts +5 -5
  124. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  125. package/dist/server/src/controllers/validation/dimensions.d.ts.map +1 -1
  126. package/dist/server/src/controllers/validation/index.d.ts +3 -3
  127. package/dist/server/src/controllers/validation/index.d.ts.map +1 -1
  128. package/dist/server/src/controllers/validation/model-configuration.d.ts.map +1 -1
  129. package/dist/server/src/controllers/validation/relations.d.ts +2 -2
  130. package/dist/server/src/history/controllers/history-version.d.ts +1 -7
  131. package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
  132. package/dist/server/src/history/controllers/index.d.ts +2 -1
  133. package/dist/server/src/history/controllers/index.d.ts.map +1 -1
  134. package/dist/server/src/history/controllers/validation/history-version.d.ts +1 -1
  135. package/dist/server/src/history/services/history.d.ts +0 -2
  136. package/dist/server/src/history/services/history.d.ts.map +1 -1
  137. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  138. package/dist/server/src/history/services/utils.d.ts +3 -3
  139. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  140. package/dist/server/src/history/utils.d.ts +1 -18
  141. package/dist/server/src/history/utils.d.ts.map +1 -1
  142. package/dist/server/src/homepage/controllers/homepage.d.ts +0 -1
  143. package/dist/server/src/homepage/controllers/homepage.d.ts.map +1 -1
  144. package/dist/server/src/homepage/controllers/index.d.ts +2 -1
  145. package/dist/server/src/homepage/controllers/index.d.ts.map +1 -1
  146. package/dist/server/src/homepage/index.d.ts +4 -8
  147. package/dist/server/src/homepage/index.d.ts.map +1 -1
  148. package/dist/server/src/homepage/services/homepage-query-utils.d.ts.map +1 -1
  149. package/dist/server/src/homepage/services/homepage.d.ts +3 -4
  150. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
  151. package/dist/server/src/homepage/services/index.d.ts +4 -8
  152. package/dist/server/src/homepage/services/index.d.ts.map +1 -1
  153. package/dist/server/src/index.d.ts +79 -85
  154. package/dist/server/src/index.d.ts.map +1 -1
  155. package/dist/server/src/mcp/derive-content-type-mcp-tools.d.ts.map +1 -1
  156. package/dist/server/src/mcp/handlers/collection-handlers.d.ts.map +1 -1
  157. package/dist/server/src/mcp/handlers/single-type-handlers.d.ts.map +1 -1
  158. package/dist/server/src/mcp/permissions.d.ts +1 -1
  159. package/dist/server/src/mcp/permissions.d.ts.map +1 -1
  160. package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts.map +1 -1
  161. package/dist/server/src/mcp/sanitizers/shape-relations.d.ts.map +1 -1
  162. package/dist/server/src/mcp/schemas/blocks-schema.d.ts.map +1 -1
  163. package/dist/server/src/mcp/schemas/data-schema.d.ts.map +1 -1
  164. package/dist/server/src/mcp/schemas/filters-schema.d.ts.map +1 -1
  165. package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -1
  166. package/dist/server/src/mcp/schemas/sort-schema.d.ts.map +1 -1
  167. package/dist/server/src/mcp/utils.d.ts.map +1 -1
  168. package/dist/server/src/middlewares/routing.d.ts.map +1 -1
  169. package/dist/server/src/policies/hasPermissions.d.ts.map +1 -1
  170. package/dist/server/src/policies/index.d.ts.map +1 -1
  171. package/dist/server/src/preview/controllers/index.d.ts +2 -1
  172. package/dist/server/src/preview/controllers/index.d.ts.map +1 -1
  173. package/dist/server/src/preview/controllers/preview.d.ts +5 -0
  174. package/dist/server/src/preview/controllers/preview.d.ts.map +1 -1
  175. package/dist/server/src/preview/controllers/validation/preview.d.ts +1 -2
  176. package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -1
  177. package/dist/server/src/preview/routes/preview.d.ts.map +1 -1
  178. package/dist/server/src/preview/services/index.d.ts +1 -1
  179. package/dist/server/src/preview/services/index.d.ts.map +1 -1
  180. package/dist/server/src/preview/services/preview-config.d.ts +1 -1
  181. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
  182. package/dist/server/src/preview/services/preview.d.ts.map +1 -1
  183. package/dist/server/src/preview/utils.d.ts +1 -16
  184. package/dist/server/src/preview/utils.d.ts.map +1 -1
  185. package/dist/server/src/services/components.d.ts +2 -2
  186. package/dist/server/src/services/components.d.ts.map +1 -1
  187. package/dist/server/src/services/configuration.d.ts.map +1 -1
  188. package/dist/server/src/services/content-types.d.ts.map +1 -1
  189. package/dist/server/src/services/data-mapper.d.ts +5 -5
  190. package/dist/server/src/services/data-mapper.d.ts.map +1 -1
  191. package/dist/server/src/services/document-manager.d.ts +14 -14
  192. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  193. package/dist/server/src/services/document-metadata.d.ts +6 -6
  194. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  195. package/dist/server/src/services/field-sizes.d.ts +2 -2
  196. package/dist/server/src/services/field-sizes.d.ts.map +1 -1
  197. package/dist/server/src/services/index.d.ts +78 -84
  198. package/dist/server/src/services/index.d.ts.map +1 -1
  199. package/dist/server/src/services/metrics.d.ts.map +1 -1
  200. package/dist/server/src/services/permission-checker.d.ts +12 -31
  201. package/dist/server/src/services/permission-checker.d.ts.map +1 -1
  202. package/dist/server/src/services/permission.d.ts.map +1 -1
  203. package/dist/server/src/services/populate-builder.d.ts +4 -4
  204. package/dist/server/src/services/populate-builder.d.ts.map +1 -1
  205. package/dist/server/src/services/uid.d.ts.map +1 -1
  206. package/dist/server/src/services/utils/configuration/attributes.d.ts.map +1 -1
  207. package/dist/server/src/services/utils/configuration/settings.d.ts.map +1 -1
  208. package/dist/server/src/services/utils/count.d.ts.map +1 -1
  209. package/dist/server/src/services/utils/draft-relations.d.ts +19 -0
  210. package/dist/server/src/services/utils/draft-relations.d.ts.map +1 -0
  211. package/dist/server/src/services/utils/draft.d.ts +8 -7
  212. package/dist/server/src/services/utils/draft.d.ts.map +1 -1
  213. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  214. package/dist/server/src/services/utils/store.d.ts.map +1 -1
  215. package/dist/server/src/utils/index.d.ts.map +1 -1
  216. package/dist/server/src/validation/policies/hasPermissions.d.ts +1 -1
  217. package/dist/server/src/validation/zod.d.ts +1 -1
  218. package/dist/server/src/validation/zod.d.ts.map +1 -1
  219. package/dist/shared/contracts/collection-types.d.ts +4 -1
  220. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  221. package/dist/shared/contracts/single-types.d.ts +4 -1
  222. package/dist/shared/contracts/single-types.d.ts.map +1 -1
  223. package/package.json +8 -8
  224. package/dist/admin/preview/utils/previewScript.js +0 -1068
  225. package/dist/admin/preview/utils/previewScript.js.map +0 -1
  226. package/dist/admin/preview/utils/previewScript.mjs +0 -1066
  227. package/dist/admin/preview/utils/previewScript.mjs.map +0 -1
  228. package/dist/admin/src/preview/utils/previewScript.d.ts +0 -32
@@ -96,7 +96,9 @@ var translations = require('./utils/translations.js');
96
96
  /*#__PURE__*/ jsxRuntime.jsx(DragLayer.DragLayer, {
97
97
  renderItem: renderDraglayerItem
98
98
  }),
99
- /*#__PURE__*/ jsxRuntime.jsx(reactRouterDom.Outlet, {})
99
+ /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.LazyOutlet, {
100
+ nested: true
101
+ })
100
102
  ]
101
103
  })
102
104
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"layout.js","sources":["../../admin/src/layout.tsx"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\nimport * as React from 'react';\n\nimport { Page, Layouts, SubNav, useIsMobile } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { Navigate, Outlet, useLocation, useMatch } from 'react-router-dom';\n\nimport { DragLayer, DragLayerProps } from './components/DragLayer';\nimport { CardDragPreview } from './components/DragPreviews/CardDragPreview';\nimport { ComponentDragPreview } from './components/DragPreviews/ComponentDragPreview';\nimport { RelationDragPreview } from './components/DragPreviews/RelationDragPreview';\nimport { LeftMenu } from './components/LeftMenu';\nimport { ItemTypes } from './constants/dragAndDrop';\nimport { useContentManagerInitData } from './hooks/useContentManagerInitData';\nimport { getTranslation } from './utils/translations';\n\n/* -------------------------------------------------------------------------------------------------\n * Layout\n * -----------------------------------------------------------------------------------------------*/\n\nconst Layout = () => {\n const contentTypeMatch = useMatch('/content-manager/:kind/:uid/*');\n const isMobile = useIsMobile();\n\n const { isLoading, collectionTypeLinks, models, singleTypeLinks } = useContentManagerInitData();\n const authorisedModels = [...collectionTypeLinks, ...singleTypeLinks].sort((a, b) =>\n a.title.localeCompare(b.title)\n );\n\n const { pathname } = useLocation();\n const { formatMessage } = useIntl();\n\n if (isLoading) {\n return (\n <>\n <Page.Title>\n {formatMessage({\n id: getTranslation('plugin.name'),\n defaultMessage: 'Content Manager',\n })}\n </Page.Title>\n <Page.Loading />\n </>\n );\n }\n\n // Array of models that are displayed in the content manager\n const supportedModelsToDisplay = models.filter(({ isDisplayed }) => isDisplayed);\n\n // Redirect the user to the 403 page\n if (\n authorisedModels.length === 0 &&\n supportedModelsToDisplay.length > 0 &&\n pathname !== '/content-manager/403'\n ) {\n return <Navigate to=\"/403\" />;\n }\n\n // Redirect the user to the create content type page\n if (supportedModelsToDisplay.length === 0 && pathname !== '/no-content-types') {\n return <Navigate to=\"/no-content-types\" />;\n }\n\n // On /content-manager base route\n if (!contentTypeMatch && authorisedModels.length > 0) {\n // On desktop: redirect to first collection type\n if (!isMobile) {\n return (\n <Navigate\n to={{\n pathname: authorisedModels[0].to,\n search: authorisedModels[0].search ?? '',\n }}\n replace\n />\n );\n }\n\n // On mobile: show navigation page\n return (\n <>\n <Page.Title>\n {formatMessage({\n id: getTranslation('plugin.name'),\n defaultMessage: 'Content Manager',\n })}\n </Page.Title>\n <SubNav.PageWrapper>\n <LeftMenu isFullPage />\n </SubNav.PageWrapper>\n </>\n );\n }\n\n return (\n <>\n <Page.Title>\n {formatMessage({\n id: getTranslation('plugin.name'),\n defaultMessage: 'Content Manager',\n })}\n </Page.Title>\n <Layouts.Root sideNav={<LeftMenu />}>\n <DragLayer renderItem={renderDraglayerItem} />\n <Outlet />\n </Layouts.Root>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * renderDraglayerItem\n * -----------------------------------------------------------------------------------------------*/\n\nfunction renderDraglayerItem({ type, item }: Parameters<DragLayerProps['renderItem']>[0]) {\n if (!type || (type && typeof type !== 'string')) {\n return null;\n }\n\n /**\n * Because a user may have multiple relations / dynamic zones / repeable fields in the same content type,\n * we append the fieldName for the item type to make them unique, however, we then want to extract that\n * first type to apply the correct preview.\n */\n const [actualType] = type.split('_');\n\n switch (actualType) {\n case ItemTypes.EDIT_FIELD:\n case ItemTypes.FIELD:\n return <CardDragPreview label={item.label} />;\n case ItemTypes.COMPONENT:\n case ItemTypes.DYNAMIC_ZONE:\n return <ComponentDragPreview displayedValue={item.displayedValue} />;\n\n case ItemTypes.RELATION:\n return <RelationDragPreview {...item} />;\n\n default:\n return null;\n }\n}\n\nexport { Layout };\n"],"names":["Layout","contentTypeMatch","useMatch","isMobile","useIsMobile","isLoading","collectionTypeLinks","models","singleTypeLinks","useContentManagerInitData","authorisedModels","sort","a","b","title","localeCompare","pathname","useLocation","formatMessage","useIntl","_jsxs","_Fragment","_jsx","Page","Title","id","getTranslation","defaultMessage","Loading","supportedModelsToDisplay","filter","isDisplayed","length","Navigate","to","search","replace","SubNav","PageWrapper","LeftMenu","isFullPage","Layouts","Root","sideNav","DragLayer","renderItem","renderDraglayerItem","Outlet","type","item","actualType","split","ItemTypes","EDIT_FIELD","FIELD","CardDragPreview","label","COMPONENT","DYNAMIC_ZONE","ComponentDragPreview","displayedValue","RELATION","RelationDragPreview"],"mappings":"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"}
1
+ {"version":3,"file":"layout.js","sources":["../../admin/src/layout.tsx"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\nimport * as React from 'react';\n\nimport { Page, Layouts, SubNav, useIsMobile, LazyOutlet } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { Navigate, useLocation, useMatch } from 'react-router-dom';\n\nimport { DragLayer, DragLayerProps } from './components/DragLayer';\nimport { CardDragPreview } from './components/DragPreviews/CardDragPreview';\nimport { ComponentDragPreview } from './components/DragPreviews/ComponentDragPreview';\nimport { RelationDragPreview } from './components/DragPreviews/RelationDragPreview';\nimport { LeftMenu } from './components/LeftMenu';\nimport { ItemTypes } from './constants/dragAndDrop';\nimport { useContentManagerInitData } from './hooks/useContentManagerInitData';\nimport { getTranslation } from './utils/translations';\n\n/* -------------------------------------------------------------------------------------------------\n * Layout\n * -----------------------------------------------------------------------------------------------*/\n\nconst Layout = () => {\n const contentTypeMatch = useMatch('/content-manager/:kind/:uid/*');\n const isMobile = useIsMobile();\n\n const { isLoading, collectionTypeLinks, models, singleTypeLinks } = useContentManagerInitData();\n const authorisedModels = [...collectionTypeLinks, ...singleTypeLinks].sort((a, b) =>\n a.title.localeCompare(b.title)\n );\n\n const { pathname } = useLocation();\n const { formatMessage } = useIntl();\n\n if (isLoading) {\n return (\n <>\n <Page.Title>\n {formatMessage({\n id: getTranslation('plugin.name'),\n defaultMessage: 'Content Manager',\n })}\n </Page.Title>\n <Page.Loading />\n </>\n );\n }\n\n // Array of models that are displayed in the content manager\n const supportedModelsToDisplay = models.filter(({ isDisplayed }) => isDisplayed);\n\n // Redirect the user to the 403 page\n if (\n authorisedModels.length === 0 &&\n supportedModelsToDisplay.length > 0 &&\n pathname !== '/content-manager/403'\n ) {\n return <Navigate to=\"/403\" />;\n }\n\n // Redirect the user to the create content type page\n if (supportedModelsToDisplay.length === 0 && pathname !== '/no-content-types') {\n return <Navigate to=\"/no-content-types\" />;\n }\n\n // On /content-manager base route\n if (!contentTypeMatch && authorisedModels.length > 0) {\n // On desktop: redirect to first collection type\n if (!isMobile) {\n return (\n <Navigate\n to={{\n pathname: authorisedModels[0].to,\n search: authorisedModels[0].search ?? '',\n }}\n replace\n />\n );\n }\n\n // On mobile: show navigation page\n return (\n <>\n <Page.Title>\n {formatMessage({\n id: getTranslation('plugin.name'),\n defaultMessage: 'Content Manager',\n })}\n </Page.Title>\n <SubNav.PageWrapper>\n <LeftMenu isFullPage />\n </SubNav.PageWrapper>\n </>\n );\n }\n\n return (\n <>\n <Page.Title>\n {formatMessage({\n id: getTranslation('plugin.name'),\n defaultMessage: 'Content Manager',\n })}\n </Page.Title>\n <Layouts.Root sideNav={<LeftMenu />}>\n <DragLayer renderItem={renderDraglayerItem} />\n <LazyOutlet nested />\n </Layouts.Root>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * renderDraglayerItem\n * -----------------------------------------------------------------------------------------------*/\n\nfunction renderDraglayerItem({ type, item }: Parameters<DragLayerProps['renderItem']>[0]) {\n if (!type || (type && typeof type !== 'string')) {\n return null;\n }\n\n /**\n * Because a user may have multiple relations / dynamic zones / repeable fields in the same content type,\n * we append the fieldName for the item type to make them unique, however, we then want to extract that\n * first type to apply the correct preview.\n */\n const [actualType] = type.split('_');\n\n switch (actualType) {\n case ItemTypes.EDIT_FIELD:\n case ItemTypes.FIELD:\n return <CardDragPreview label={item.label} />;\n case ItemTypes.COMPONENT:\n case ItemTypes.DYNAMIC_ZONE:\n return <ComponentDragPreview displayedValue={item.displayedValue} />;\n\n case ItemTypes.RELATION:\n return <RelationDragPreview {...item} />;\n\n default:\n return null;\n }\n}\n\nexport { Layout };\n"],"names":["Layout","contentTypeMatch","useMatch","isMobile","useIsMobile","isLoading","collectionTypeLinks","models","singleTypeLinks","useContentManagerInitData","authorisedModels","sort","a","b","title","localeCompare","pathname","useLocation","formatMessage","useIntl","_jsxs","_Fragment","_jsx","Page","Title","id","getTranslation","defaultMessage","Loading","supportedModelsToDisplay","filter","isDisplayed","length","Navigate","to","search","replace","SubNav","PageWrapper","LeftMenu","isFullPage","Layouts","Root","sideNav","DragLayer","renderItem","renderDraglayerItem","LazyOutlet","nested","type","item","actualType","split","ItemTypes","EDIT_FIELD","FIELD","CardDragPreview","label","COMPONENT","DYNAMIC_ZONE","ComponentDragPreview","displayedValue","RELATION","RelationDragPreview"],"mappings":";;;;;;;;;;;;;;;;AAgBA;;AAEkG,2GAE5FA,MAAAA,GAAS,IAAA;AACb,IAAA,MAAMC,mBAAmBC,uBAAAA,CAAS,+BAAA,CAAA;AAClC,IAAA,MAAMC,QAAAA,GAAWC,uBAAAA,EAAAA;IAEjB,MAAM,EAAEC,SAAS,EAAEC,mBAAmB,EAAEC,MAAM,EAAEC,eAAe,EAAE,GAAGC,mDAAAA,EAAAA;AACpE,IAAA,MAAMC,gBAAAA,GAAmB;AAAIJ,QAAAA,GAAAA,mBAAAA;AAAwBE,QAAAA,GAAAA;KAAgB,CAACG,IAAI,CAAC,CAACC,CAAAA,EAAGC,CAAAA,GAC7ED,CAAAA,CAAEE,KAAK,CAACC,aAAa,CAACF,CAAAA,CAAEC,KAAK,CAAA,CAAA;IAG/B,MAAM,EAAEE,QAAQ,EAAE,GAAGC,0BAAAA,EAAAA;IACrB,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAE1B,IAAA,IAAId,SAAAA,EAAW;QACb,qBACEe,eAAA,CAAAC,mBAAA,EAAA;;AACE,8BAAAC,cAAA,CAACC,iBAAKC,KAAK,EAAA;8BACRN,aAAAA,CAAc;AACbO,wBAAAA,EAAAA,EAAIC,2BAAAA,CAAe,aAAA,CAAA;wBACnBC,cAAAA,EAAgB;AAClB,qBAAA;;AAEF,8BAAAL,cAAA,CAACC,iBAAKK,OAAO,EAAA,EAAA;;;AAGnB,IAAA;;IAGA,MAAMC,wBAAAA,GAA2BtB,OAAOuB,MAAM,CAAC,CAAC,EAAEC,WAAW,EAAE,GAAKA,WAAAA,CAAAA;;IAGpE,IACErB,gBAAAA,CAAiBsB,MAAM,KAAK,CAAA,IAC5BH,yBAAyBG,MAAM,GAAG,CAAA,IAClChB,QAAAA,KAAa,sBAAA,EACb;AACA,QAAA,qBAAOM,cAAA,CAACW,uBAAAA,EAAAA;YAASC,EAAAA,EAAG;;AACtB,IAAA;;AAGA,IAAA,IAAIL,wBAAAA,CAAyBG,MAAM,KAAK,CAAA,IAAKhB,aAAa,mBAAA,EAAqB;AAC7E,QAAA,qBAAOM,cAAA,CAACW,uBAAAA,EAAAA;YAASC,EAAAA,EAAG;;AACtB,IAAA;;AAGA,IAAA,IAAI,CAACjC,gBAAAA,IAAoBS,gBAAAA,CAAiBsB,MAAM,GAAG,CAAA,EAAG;;AAEpD,QAAA,IAAI,CAAC7B,QAAAA,EAAU;AACb,YAAA,qBACEmB,cAAA,CAACW,uBAAAA,EAAAA;gBACCC,EAAAA,EAAI;AACFlB,oBAAAA,QAAAA,EAAUN,gBAAgB,CAAC,CAAA,CAAE,CAACwB,EAAE;AAChCC,oBAAAA,MAAAA,EAAQzB,gBAAgB,CAAC,CAAA,CAAE,CAACyB,MAAM,IAAI;AACxC,iBAAA;gBACAC,OAAO,EAAA;;AAGb,QAAA;;QAGA,qBACEhB,eAAA,CAAAC,mBAAA,EAAA;;AACE,8BAAAC,cAAA,CAACC,iBAAKC,KAAK,EAAA;8BACRN,aAAAA,CAAc;AACbO,wBAAAA,EAAAA,EAAIC,2BAAAA,CAAe,aAAA,CAAA;wBACnBC,cAAAA,EAAgB;AAClB,qBAAA;;AAEF,8BAAAL,cAAA,CAACe,mBAAOC,WAAW,EAAA;AACjB,oBAAA,QAAA,gBAAAhB,cAAA,CAACiB,iBAAAA,EAAAA;wBAASC,UAAU,EAAA;;;;;AAI5B,IAAA;IAEA,qBACEpB,eAAA,CAAAC,mBAAA,EAAA;;AACE,0BAAAC,cAAA,CAACC,iBAAKC,KAAK,EAAA;0BACRN,aAAAA,CAAc;AACbO,oBAAAA,EAAAA,EAAIC,2BAAAA,CAAe,aAAA,CAAA;oBACnBC,cAAAA,EAAgB;AAClB,iBAAA;;AAEF,0BAAAP,eAAA,CAACqB,oBAAQC,IAAI,EAAA;AAACC,gBAAAA,OAAAA,gBAASrB,cAAA,CAACiB,iBAAAA,EAAAA,EAAAA,CAAAA;;kCACtBjB,cAAA,CAACsB,mBAAAA,EAAAA;wBAAUC,UAAAA,EAAYC;;kCACvBxB,cAAA,CAACyB,sBAAAA,EAAAA;wBAAWC,MAAM,EAAA;;;;;;AAI1B;AAEA;;AAEkG,qGAElG,SAASF,mBAAAA,CAAoB,EAAEG,IAAI,EAAEC,IAAI,EAA+C,EAAA;AACtF,IAAA,IAAI,CAACD,IAAAA,IAASA,IAAAA,IAAQ,OAAOA,SAAS,QAAA,EAAW;QAC/C,OAAO,IAAA;AACT,IAAA;AAEA;;;;AAIC,MACD,MAAM,CAACE,UAAAA,CAAW,GAAGF,IAAAA,CAAKG,KAAK,CAAC,GAAA,CAAA;IAEhC,OAAQD,UAAAA;AACN,QAAA,KAAKE,sBAAUC,UAAU;AACzB,QAAA,KAAKD,sBAAUE,KAAK;AAClB,YAAA,qBAAOjC,cAAA,CAACkC,+BAAAA,EAAAA;AAAgBC,gBAAAA,KAAAA,EAAOP,KAAKO;;AACtC,QAAA,KAAKJ,sBAAUK,SAAS;AACxB,QAAA,KAAKL,sBAAUM,YAAY;AACzB,YAAA,qBAAOrC,cAAA,CAACsC,yCAAAA,EAAAA;AAAqBC,gBAAAA,cAAAA,EAAgBX,KAAKW;;AAEpD,QAAA,KAAKR,sBAAUS,QAAQ;AACrB,YAAA,qBAAOxC,cAAA,CAACyC,uCAAAA,EAAAA;AAAqB,gBAAA,GAAGb;;AAElC,QAAA;YACE,OAAO,IAAA;AACX;AACF;;;;"}
@@ -1,8 +1,8 @@
1
1
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
2
  import 'react';
3
- import { useIsMobile, Page, SubNav, Layouts } from '@strapi/admin/strapi-admin';
3
+ import { useIsMobile, Page, SubNav, Layouts, LazyOutlet } from '@strapi/admin/strapi-admin';
4
4
  import { useIntl } from 'react-intl';
5
- import { useMatch, useLocation, Navigate, Outlet } from 'react-router-dom';
5
+ import { useMatch, useLocation, Navigate } from 'react-router-dom';
6
6
  import { DragLayer } from './components/DragLayer.mjs';
7
7
  import { CardDragPreview } from './components/DragPreviews/CardDragPreview.mjs';
8
8
  import { ComponentDragPreview } from './components/DragPreviews/ComponentDragPreview.mjs';
@@ -94,7 +94,9 @@ import { getTranslation } from './utils/translations.mjs';
94
94
  /*#__PURE__*/ jsx(DragLayer, {
95
95
  renderItem: renderDraglayerItem
96
96
  }),
97
- /*#__PURE__*/ jsx(Outlet, {})
97
+ /*#__PURE__*/ jsx(LazyOutlet, {
98
+ nested: true
99
+ })
98
100
  ]
99
101
  })
100
102
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"layout.mjs","sources":["../../admin/src/layout.tsx"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\nimport * as React from 'react';\n\nimport { Page, Layouts, SubNav, useIsMobile } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { Navigate, Outlet, useLocation, useMatch } from 'react-router-dom';\n\nimport { DragLayer, DragLayerProps } from './components/DragLayer';\nimport { CardDragPreview } from './components/DragPreviews/CardDragPreview';\nimport { ComponentDragPreview } from './components/DragPreviews/ComponentDragPreview';\nimport { RelationDragPreview } from './components/DragPreviews/RelationDragPreview';\nimport { LeftMenu } from './components/LeftMenu';\nimport { ItemTypes } from './constants/dragAndDrop';\nimport { useContentManagerInitData } from './hooks/useContentManagerInitData';\nimport { getTranslation } from './utils/translations';\n\n/* -------------------------------------------------------------------------------------------------\n * Layout\n * -----------------------------------------------------------------------------------------------*/\n\nconst Layout = () => {\n const contentTypeMatch = useMatch('/content-manager/:kind/:uid/*');\n const isMobile = useIsMobile();\n\n const { isLoading, collectionTypeLinks, models, singleTypeLinks } = useContentManagerInitData();\n const authorisedModels = [...collectionTypeLinks, ...singleTypeLinks].sort((a, b) =>\n a.title.localeCompare(b.title)\n );\n\n const { pathname } = useLocation();\n const { formatMessage } = useIntl();\n\n if (isLoading) {\n return (\n <>\n <Page.Title>\n {formatMessage({\n id: getTranslation('plugin.name'),\n defaultMessage: 'Content Manager',\n })}\n </Page.Title>\n <Page.Loading />\n </>\n );\n }\n\n // Array of models that are displayed in the content manager\n const supportedModelsToDisplay = models.filter(({ isDisplayed }) => isDisplayed);\n\n // Redirect the user to the 403 page\n if (\n authorisedModels.length === 0 &&\n supportedModelsToDisplay.length > 0 &&\n pathname !== '/content-manager/403'\n ) {\n return <Navigate to=\"/403\" />;\n }\n\n // Redirect the user to the create content type page\n if (supportedModelsToDisplay.length === 0 && pathname !== '/no-content-types') {\n return <Navigate to=\"/no-content-types\" />;\n }\n\n // On /content-manager base route\n if (!contentTypeMatch && authorisedModels.length > 0) {\n // On desktop: redirect to first collection type\n if (!isMobile) {\n return (\n <Navigate\n to={{\n pathname: authorisedModels[0].to,\n search: authorisedModels[0].search ?? '',\n }}\n replace\n />\n );\n }\n\n // On mobile: show navigation page\n return (\n <>\n <Page.Title>\n {formatMessage({\n id: getTranslation('plugin.name'),\n defaultMessage: 'Content Manager',\n })}\n </Page.Title>\n <SubNav.PageWrapper>\n <LeftMenu isFullPage />\n </SubNav.PageWrapper>\n </>\n );\n }\n\n return (\n <>\n <Page.Title>\n {formatMessage({\n id: getTranslation('plugin.name'),\n defaultMessage: 'Content Manager',\n })}\n </Page.Title>\n <Layouts.Root sideNav={<LeftMenu />}>\n <DragLayer renderItem={renderDraglayerItem} />\n <Outlet />\n </Layouts.Root>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * renderDraglayerItem\n * -----------------------------------------------------------------------------------------------*/\n\nfunction renderDraglayerItem({ type, item }: Parameters<DragLayerProps['renderItem']>[0]) {\n if (!type || (type && typeof type !== 'string')) {\n return null;\n }\n\n /**\n * Because a user may have multiple relations / dynamic zones / repeable fields in the same content type,\n * we append the fieldName for the item type to make them unique, however, we then want to extract that\n * first type to apply the correct preview.\n */\n const [actualType] = type.split('_');\n\n switch (actualType) {\n case ItemTypes.EDIT_FIELD:\n case ItemTypes.FIELD:\n return <CardDragPreview label={item.label} />;\n case ItemTypes.COMPONENT:\n case ItemTypes.DYNAMIC_ZONE:\n return <ComponentDragPreview displayedValue={item.displayedValue} />;\n\n case ItemTypes.RELATION:\n return <RelationDragPreview {...item} />;\n\n default:\n return null;\n }\n}\n\nexport { Layout };\n"],"names":["Layout","contentTypeMatch","useMatch","isMobile","useIsMobile","isLoading","collectionTypeLinks","models","singleTypeLinks","useContentManagerInitData","authorisedModels","sort","a","b","title","localeCompare","pathname","useLocation","formatMessage","useIntl","_jsxs","_Fragment","_jsx","Page","Title","id","getTranslation","defaultMessage","Loading","supportedModelsToDisplay","filter","isDisplayed","length","Navigate","to","search","replace","SubNav","PageWrapper","LeftMenu","isFullPage","Layouts","Root","sideNav","DragLayer","renderItem","renderDraglayerItem","Outlet","type","item","actualType","split","ItemTypes","EDIT_FIELD","FIELD","CardDragPreview","label","COMPONENT","DYNAMIC_ZONE","ComponentDragPreview","displayedValue","RELATION","RelationDragPreview"],"mappings":"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"}
1
+ {"version":3,"file":"layout.mjs","sources":["../../admin/src/layout.tsx"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\nimport * as React from 'react';\n\nimport { Page, Layouts, SubNav, useIsMobile, LazyOutlet } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { Navigate, useLocation, useMatch } from 'react-router-dom';\n\nimport { DragLayer, DragLayerProps } from './components/DragLayer';\nimport { CardDragPreview } from './components/DragPreviews/CardDragPreview';\nimport { ComponentDragPreview } from './components/DragPreviews/ComponentDragPreview';\nimport { RelationDragPreview } from './components/DragPreviews/RelationDragPreview';\nimport { LeftMenu } from './components/LeftMenu';\nimport { ItemTypes } from './constants/dragAndDrop';\nimport { useContentManagerInitData } from './hooks/useContentManagerInitData';\nimport { getTranslation } from './utils/translations';\n\n/* -------------------------------------------------------------------------------------------------\n * Layout\n * -----------------------------------------------------------------------------------------------*/\n\nconst Layout = () => {\n const contentTypeMatch = useMatch('/content-manager/:kind/:uid/*');\n const isMobile = useIsMobile();\n\n const { isLoading, collectionTypeLinks, models, singleTypeLinks } = useContentManagerInitData();\n const authorisedModels = [...collectionTypeLinks, ...singleTypeLinks].sort((a, b) =>\n a.title.localeCompare(b.title)\n );\n\n const { pathname } = useLocation();\n const { formatMessage } = useIntl();\n\n if (isLoading) {\n return (\n <>\n <Page.Title>\n {formatMessage({\n id: getTranslation('plugin.name'),\n defaultMessage: 'Content Manager',\n })}\n </Page.Title>\n <Page.Loading />\n </>\n );\n }\n\n // Array of models that are displayed in the content manager\n const supportedModelsToDisplay = models.filter(({ isDisplayed }) => isDisplayed);\n\n // Redirect the user to the 403 page\n if (\n authorisedModels.length === 0 &&\n supportedModelsToDisplay.length > 0 &&\n pathname !== '/content-manager/403'\n ) {\n return <Navigate to=\"/403\" />;\n }\n\n // Redirect the user to the create content type page\n if (supportedModelsToDisplay.length === 0 && pathname !== '/no-content-types') {\n return <Navigate to=\"/no-content-types\" />;\n }\n\n // On /content-manager base route\n if (!contentTypeMatch && authorisedModels.length > 0) {\n // On desktop: redirect to first collection type\n if (!isMobile) {\n return (\n <Navigate\n to={{\n pathname: authorisedModels[0].to,\n search: authorisedModels[0].search ?? '',\n }}\n replace\n />\n );\n }\n\n // On mobile: show navigation page\n return (\n <>\n <Page.Title>\n {formatMessage({\n id: getTranslation('plugin.name'),\n defaultMessage: 'Content Manager',\n })}\n </Page.Title>\n <SubNav.PageWrapper>\n <LeftMenu isFullPage />\n </SubNav.PageWrapper>\n </>\n );\n }\n\n return (\n <>\n <Page.Title>\n {formatMessage({\n id: getTranslation('plugin.name'),\n defaultMessage: 'Content Manager',\n })}\n </Page.Title>\n <Layouts.Root sideNav={<LeftMenu />}>\n <DragLayer renderItem={renderDraglayerItem} />\n <LazyOutlet nested />\n </Layouts.Root>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * renderDraglayerItem\n * -----------------------------------------------------------------------------------------------*/\n\nfunction renderDraglayerItem({ type, item }: Parameters<DragLayerProps['renderItem']>[0]) {\n if (!type || (type && typeof type !== 'string')) {\n return null;\n }\n\n /**\n * Because a user may have multiple relations / dynamic zones / repeable fields in the same content type,\n * we append the fieldName for the item type to make them unique, however, we then want to extract that\n * first type to apply the correct preview.\n */\n const [actualType] = type.split('_');\n\n switch (actualType) {\n case ItemTypes.EDIT_FIELD:\n case ItemTypes.FIELD:\n return <CardDragPreview label={item.label} />;\n case ItemTypes.COMPONENT:\n case ItemTypes.DYNAMIC_ZONE:\n return <ComponentDragPreview displayedValue={item.displayedValue} />;\n\n case ItemTypes.RELATION:\n return <RelationDragPreview {...item} />;\n\n default:\n return null;\n }\n}\n\nexport { Layout };\n"],"names":["Layout","contentTypeMatch","useMatch","isMobile","useIsMobile","isLoading","collectionTypeLinks","models","singleTypeLinks","useContentManagerInitData","authorisedModels","sort","a","b","title","localeCompare","pathname","useLocation","formatMessage","useIntl","_jsxs","_Fragment","_jsx","Page","Title","id","getTranslation","defaultMessage","Loading","supportedModelsToDisplay","filter","isDisplayed","length","Navigate","to","search","replace","SubNav","PageWrapper","LeftMenu","isFullPage","Layouts","Root","sideNav","DragLayer","renderItem","renderDraglayerItem","LazyOutlet","nested","type","item","actualType","split","ItemTypes","EDIT_FIELD","FIELD","CardDragPreview","label","COMPONENT","DYNAMIC_ZONE","ComponentDragPreview","displayedValue","RELATION","RelationDragPreview"],"mappings":"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"}
@@ -23,6 +23,7 @@ var documents = require('../../../services/documents.js');
23
23
  var api = require('../../../utils/api.js');
24
24
  var translations = require('../../../utils/translations.js');
25
25
  var data = require('../utils/data.js');
26
+ var draftRelationCounts = require('../utils/draftRelationCounts.js');
26
27
  var keyboardShortcuts = require('../utils/keyboardShortcuts.js');
27
28
  var RelationModal = require('./FormInputs/Relations/RelationModal.js');
28
29
 
@@ -52,6 +53,10 @@ var get__default = /*#__PURE__*/_interopDefault(get);
52
53
  var merge__default = /*#__PURE__*/_interopDefault(merge);
53
54
  var set__default = /*#__PURE__*/_interopDefault(set);
54
55
 
56
+ const publishConfirmDialogOpeners = new Map();
57
+ const openPublishConfirmDialog = (scope)=>{
58
+ publishConfirmDialogOpeners.get(scope)?.();
59
+ };
55
60
  const connectRelationToParent = (parentDataToUpdate, fieldToConnect, data, fieldToConnectUID)=>{
56
61
  /*
57
62
  * Check if the fieldToConnect is already present in the parentDataToUpdate.
@@ -179,6 +184,24 @@ const DocumentActions = ({ actions })=>{
179
184
  const DocumentActionButton = ({ buttonType = 'button', ...action })=>{
180
185
  const [dialogId, setDialogId] = React__namespace.useState(null);
181
186
  const { toggleNotification } = strapiAdmin.useNotification();
187
+ React__namespace.useEffect(()=>{
188
+ const scope = action.publishConfirmScope;
189
+ if (action.type !== 'publish' || !action.dialog || !scope) {
190
+ return;
191
+ }
192
+ const open = ()=>setDialogId(action.id);
193
+ publishConfirmDialogOpeners.set(scope, open);
194
+ return ()=>{
195
+ if (publishConfirmDialogOpeners.get(scope) === open) {
196
+ publishConfirmDialogOpeners.delete(scope);
197
+ }
198
+ };
199
+ }, [
200
+ action.type,
201
+ action.dialog,
202
+ action.id,
203
+ action.publishConfirmScope
204
+ ]);
182
205
  const handleClick = (action)=>async (e)=>{
183
206
  const { onClick = ()=>false, dialog, id } = action;
184
207
  const muteDialog = await onClick(e);
@@ -329,7 +352,7 @@ const DocumentActionsMenu = ({ actions, children, label, variant = 'tertiary' })
329
352
  ]
330
353
  });
331
354
  };
332
- const DocumentActionConfirmDialog = ({ onClose, onCancel, onConfirm, title, content, isOpen, variant = 'secondary', loading })=>{
355
+ const DocumentActionConfirmDialog = ({ onClose, onCancel, onConfirm, title, content, bodyIcon, confirmLabel, isOpen, variant = 'secondary', loading })=>{
333
356
  const { formatMessage } = reactIntl.useIntl();
334
357
  const handleClose = async ()=>{
335
358
  if (onCancel) {
@@ -343,6 +366,28 @@ const DocumentActionConfirmDialog = ({ onClose, onCancel, onConfirm, title, cont
343
366
  }
344
367
  onClose();
345
368
  };
369
+ const dialogBody = bodyIcon ? /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
370
+ direction: "column",
371
+ alignItems: "stretch",
372
+ gap: 2,
373
+ children: [
374
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
375
+ justifyContent: "center",
376
+ children: /*#__PURE__*/ jsxRuntime.jsx(Icons.WarningCircle, {
377
+ width: "24px",
378
+ height: "24px",
379
+ fill: bodyIcon === 'danger' ? 'danger600' : 'primary600'
380
+ })
381
+ }),
382
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
383
+ id: "confirm-description",
384
+ tag: "p",
385
+ variant: "omega",
386
+ textAlign: "center",
387
+ children: content
388
+ })
389
+ ]
390
+ }) : content;
346
391
  return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Dialog.Root, {
347
392
  open: isOpen,
348
393
  onOpenChange: handleClose,
@@ -352,7 +397,7 @@ const DocumentActionConfirmDialog = ({ onClose, onCancel, onConfirm, title, cont
352
397
  children: title
353
398
  }),
354
399
  /*#__PURE__*/ jsxRuntime.jsx(designSystem.Dialog.Body, {
355
- children: content
400
+ children: dialogBody
356
401
  }),
357
402
  /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Dialog.Footer, {
358
403
  children: [
@@ -371,7 +416,7 @@ const DocumentActionConfirmDialog = ({ onClose, onCancel, onConfirm, title, cont
371
416
  variant: variant,
372
417
  fullWidth: true,
373
418
  loading: loading,
374
- children: formatMessage({
419
+ children: confirmLabel ?? formatMessage({
375
420
  id: 'app.components.Button.confirm',
376
421
  defaultMessage: 'Confirm'
377
422
  })
@@ -439,10 +484,11 @@ const transformData = (data)=>{
439
484
  canReadFields
440
485
  }));
441
486
  const { publish, isLoading } = useDocumentActions.useDocumentActions();
442
- const onPreview = Preview.usePreviewContext('UpdateAction', (state)=>state.onPreview, false);
443
- const [countDraftRelations, { isLoading: isLoadingDraftRelations, isError: isErrorDraftRelations }] = documents.useGetDraftRelationCountQuery();
444
- const [localCountOfDraftRelations, setLocalCountOfDraftRelations] = React__namespace.useState(0);
445
- const [serverCountOfDraftRelations, setServerCountOfDraftRelations] = React__namespace.useState(0);
487
+ const onPreview = Preview.usePreviewContext('PublishAction', (state)=>state.onPreview, false);
488
+ const [countDraftRelations, { isError: isErrorDraftRelations }] = documents.useGetDraftRelationCountQuery();
489
+ const [localDraftRelationCounts, setLocalDraftRelationCounts] = React__namespace.useState(draftRelationCounts.EMPTY_DRAFT_RELATION_COUNTS);
490
+ const [serverDraftRelationCounts, setServerDraftRelationCounts] = React__namespace.useState(draftRelationCounts.EMPTY_DRAFT_RELATION_COUNTS);
491
+ const [isFetchingDraftRelations, setIsFetchingDraftRelations] = React__namespace.useState(false);
446
492
  const [{ rawQuery }] = strapiAdmin.useQueryParams();
447
493
  const modified = strapiAdmin.useForm('PublishAction', ({ modified })=>modified);
448
494
  const setSubmitting = strapiAdmin.useForm('PublishAction', ({ setSubmitting })=>setSubmitting);
@@ -456,6 +502,8 @@ const transformData = (data)=>{
456
502
  // need to discriminate if the publish is coming from a relation modal or in the edit view
457
503
  const relationContext = RelationModal.useRelationModal('PublishAction', ()=>true, false);
458
504
  const fromRelationModal = relationContext != undefined;
505
+ const isRelationModalOpen = RelationModal.useRelationModal('PublishAction', (state)=>state.state.isModalOpen, false);
506
+ const publishConfirmScope = fromRelationModal ? 'relation-modal' : onPreview ? 'preview' : 'panel';
459
507
  const dispatch = RelationModal.useRelationModal('PublishAction', (state)=>state.dispatch);
460
508
  const fieldToConnect = RelationModal.useRelationModal('PublishAction', (state)=>state.state.fieldToConnect, false);
461
509
  const fieldToConnectUID = RelationModal.useRelationModal('PublishAction', (state)=>state.state.fieldToConnectUID, false);
@@ -482,49 +530,19 @@ const transformData = (data)=>{
482
530
  formatMessage
483
531
  ]);
484
532
  React__namespace.useEffect(()=>{
485
- const localDraftRelations = new Set();
486
- /**
487
- * Extracts draft relations from the provided data object.
488
- * It checks for a connect array of relations.
489
- * If a relation has a status of 'draft', its id is added to the localDraftRelations set.
490
- */ const extractDraftRelations = (data)=>{
491
- const relations = data.connect || [];
492
- relations.forEach((relation)=>{
493
- if (relation.status === 'draft') {
494
- localDraftRelations.add(relation.id);
495
- }
496
- });
497
- };
498
- /**
499
- * Recursively traverses the provided data object to extract draft relations from arrays within 'connect' keys.
500
- * If the data is an object, it looks for 'connect' keys to pass their array values to extractDraftRelations.
501
- * It recursively calls itself for any non-null objects it contains.
502
- */ const traverseAndExtract = (data)=>{
503
- Object.entries(data).forEach(([key, value])=>{
504
- if (key === 'connect' && Array.isArray(value)) {
505
- extractDraftRelations({
506
- connect: value
507
- });
508
- } else if (typeof value === 'object' && value !== null) {
509
- traverseAndExtract(value);
510
- }
511
- });
512
- };
513
- if (!documentId || modified) {
514
- traverseAndExtract(formValues);
515
- setLocalCountOfDraftRelations(localDraftRelations.size);
516
- }
533
+ setLocalDraftRelationCounts(draftRelationCounts.countLocalDraftRelations(formValues, schema, components, model));
517
534
  }, [
518
- documentId,
519
- modified,
535
+ components,
520
536
  formValues,
521
- setLocalCountOfDraftRelations
537
+ model,
538
+ schema
522
539
  ]);
523
- React__namespace.useEffect(()=>{
524
- if (!document || !document.documentId || isListView) {
540
+ const fetchDraftRelationsCount = React__namespace.useCallback(async ()=>{
541
+ if (!document?.documentId || isListView) {
525
542
  return;
526
543
  }
527
- const fetchDraftRelationsCount = async ()=>{
544
+ setIsFetchingDraftRelations(true);
545
+ try {
528
546
  const { data, error } = await countDraftRelations({
529
547
  collectionType,
530
548
  model,
@@ -535,18 +553,36 @@ const transformData = (data)=>{
535
553
  throw error;
536
554
  }
537
555
  if (data) {
538
- setServerCountOfDraftRelations(data.data);
556
+ setServerDraftRelationCounts(draftRelationCounts.normalizeDraftRelationCounts(data));
539
557
  }
540
- };
541
- fetchDraftRelationsCount();
558
+ } finally{
559
+ setIsFetchingDraftRelations(false);
560
+ }
542
561
  }, [
543
- isListView,
544
- document,
545
- documentId,
546
- countDraftRelations,
547
562
  collectionType,
548
- model,
549
- currentDocumentMeta.params
563
+ countDraftRelations,
564
+ currentDocumentMeta.params,
565
+ document?.documentId,
566
+ documentId,
567
+ isListView,
568
+ model
569
+ ]);
570
+ React__namespace.useEffect(()=>{
571
+ fetchDraftRelationsCount();
572
+ }, [
573
+ fetchDraftRelationsCount,
574
+ document?.updatedAt
575
+ ]);
576
+ React__namespace.useEffect(()=>{
577
+ const handleWindowFocus = ()=>{
578
+ fetchDraftRelationsCount();
579
+ };
580
+ window.addEventListener('focus', handleWindowFocus);
581
+ return ()=>{
582
+ window.removeEventListener('focus', handleWindowFocus);
583
+ };
584
+ }, [
585
+ fetchDraftRelationsCount
550
586
  ]);
551
587
  const parentDocumentMetaToUpdate = documentHistory?.at(-2) ?? rootDocumentMeta;
552
588
  const parentDocumentData = useDocument.useDocument({
@@ -688,11 +724,18 @@ const transformData = (data)=>{
688
724
  }
689
725
  }
690
726
  };
691
- const totalDraftRelations = localCountOfDraftRelations + serverCountOfDraftRelations;
692
- // TODO skipping this for now as there is a bug with the draft relation count that will be worked on separately
693
- // see RFC "Count draft relations" in Notion
694
- const enableDraftRelationsCount = false;
695
- const hasDraftRelations = enableDraftRelationsCount;
727
+ const getFreshDraftRelationCounts = React__namespace.useCallback(()=>draftRelationCounts.resolveDraftRelationCounts(documentId, modified, draftRelationCounts.countLocalDraftRelations(getValues(), schema, components, model), serverDraftRelationCounts), [
728
+ components,
729
+ documentId,
730
+ getValues,
731
+ model,
732
+ modified,
733
+ schema,
734
+ serverDraftRelationCounts
735
+ ]);
736
+ const draftRelationCounts$1 = draftRelationCounts.resolveDraftRelationCounts(documentId, modified, localDraftRelationCounts, serverDraftRelationCounts);
737
+ const { hasUnpublishedRelations, hasDraftM2mLinks, dialogVariant, bodyIcon, confirmLabel } = draftRelationCounts.getDraftRelationsPublishState(draftRelationCounts$1);
738
+ const supportsDraftRelationWarning = Boolean(schema?.options?.draftAndPublish);
696
739
  /**
697
740
  * Disabled when:
698
741
  * - currently if you're cloning a document we don't support publish & clone at the same time.
@@ -701,7 +744,7 @@ const transformData = (data)=>{
701
744
  * - the document is already published & not modified
702
745
  * - the document is being created & not modified
703
746
  * - the user doesn't have the permission to publish
704
- */ const isDisabled = isCloning || isSubmitting || isLoadingDraftRelations || activeTab === 'published' || !modified && isDocumentPublished || !modified && !document?.documentId || !canPublish;
747
+ */ const isDisabled = isCloning || isSubmitting || isFetchingDraftRelations || activeTab === 'published' || !modified && isDocumentPublished || !modified && !document?.documentId || !canPublish;
705
748
  // Publish on CMD+Shift+Enter (macOS) / CTRL+Shift+Enter (Windows/Linux).
706
749
  // Saving a draft (CMD/CTRL+Enter) is handled by the UpdateAction.
707
750
  React__namespace.useEffect(()=>{
@@ -713,18 +756,29 @@ const transformData = (data)=>{
713
756
  return;
714
757
  }
715
758
  e.preventDefault();
716
- if (!isDisabled && !hasDraftRelations) {
717
- performPublish();
759
+ if (!fromRelationModal && isRelationModalOpen) {
760
+ return;
761
+ }
762
+ if (isDisabled) {
763
+ return;
718
764
  }
765
+ if (draftRelationCounts.getDraftRelationsPublishState(getFreshDraftRelationCounts()).hasDraftRelations) {
766
+ openPublishConfirmDialog(publishConfirmScope);
767
+ return;
768
+ }
769
+ performPublish();
719
770
  };
720
771
  window.addEventListener('keydown', handleKeyDown);
721
772
  return ()=>{
722
773
  window.removeEventListener('keydown', handleKeyDown);
723
774
  };
724
775
  }, [
725
- hasDraftRelations,
776
+ fromRelationModal,
777
+ getFreshDraftRelationCounts,
726
778
  isDisabled,
779
+ isRelationModalOpen,
727
780
  performPublish,
781
+ publishConfirmScope,
728
782
  schema?.options?.draftAndPublish
729
783
  ]);
730
784
  if (!schema?.options?.draftAndPublish) {
@@ -739,26 +793,60 @@ const transformData = (data)=>{
739
793
  'relation-modal'
740
794
  ],
741
795
  disabled: isDisabled,
796
+ publishConfirmScope: supportsDraftRelationWarning ? publishConfirmScope : undefined,
742
797
  label: formatMessage({
743
798
  id: 'app.utils.publish',
744
799
  defaultMessage: 'Publish'
745
800
  }),
746
801
  onClick: async ()=>{
802
+ if (draftRelationCounts.getDraftRelationsPublishState(getFreshDraftRelationCounts()).hasDraftRelations) {
803
+ // Let DocumentActionButton open the confirmation dialog.
804
+ return;
805
+ }
747
806
  await performPublish();
807
+ // Skip the registered dialog when publishing directly.
808
+ return true;
748
809
  },
749
- dialog: hasDraftRelations ? {
810
+ dialog: supportsDraftRelationWarning ? {
750
811
  type: 'dialog',
751
- variant: 'danger',
752
- footer: null,
812
+ variant: dialogVariant,
813
+ bodyIcon,
753
814
  title: formatMessage({
754
- id: translations.getTranslation(`popUpwarning.warning.bulk-has-draft-relations.title`),
815
+ id: translations.getTranslation('popUpWarning.warning.has-draft-relations.title'),
755
816
  defaultMessage: 'Confirmation'
756
817
  }),
757
- content: formatMessage({
758
- id: translations.getTranslation(`popUpwarning.warning.bulk-has-draft-relations.message`),
759
- defaultMessage: 'This entry is related to {count, plural, one {# draft entry} other {# draft entries}}. Publishing it could leave broken links in your app.'
760
- }, {
761
- count: totalDraftRelations
818
+ content: /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
819
+ children: [
820
+ hasUnpublishedRelations ? formatMessage({
821
+ id: translations.getTranslation('popUpWarning.warning.has-draft-relations.message'),
822
+ defaultMessage: 'This entry is related to {count, plural, one {# draft entry} other {# draft entries}}. {count, plural, one {That relation will not be included in the published version.} other {Those relations will not be included in the published version.}}'
823
+ }, {
824
+ count: draftRelationCounts$1.unpublishedRelations
825
+ }) : formatMessage({
826
+ id: translations.getTranslation('popUpWarning.warning.has-draft-m2m-relations.message'),
827
+ defaultMessage: '{count, plural, one {# linked entry is still in draft. It will appear on the live site once that entry is published.} other {# linked entries are still in draft. They will appear on the live site once those entries are published.}}'
828
+ }, {
829
+ count: draftRelationCounts$1.draftM2mLinks
830
+ }),
831
+ hasUnpublishedRelations && hasDraftM2mLinks ? ` ${formatMessage({
832
+ id: translations.getTranslation('popUpWarning.warning.has-draft-m2m-relations.additional'),
833
+ defaultMessage: '{count, plural, one {# many-to-many link points} other {# many-to-many links point}} to draft entries that will become visible once published.'
834
+ }, {
835
+ count: draftRelationCounts$1.draftM2mLinks
836
+ })}` : null,
837
+ ' ',
838
+ formatMessage({
839
+ id: translations.getTranslation('popUpWarning.warning.publish-question'),
840
+ defaultMessage: 'Do you still want to publish?'
841
+ })
842
+ ]
843
+ }),
844
+ confirmLabel: confirmLabel === 'publish' ? formatMessage({
845
+ id: 'app.utils.publish',
846
+ defaultMessage: 'Publish'
847
+ }) : formatMessage({
848
+ id: translations.getTranslation('popUpwarning.warning.has-draft-relations.button-confirm'),
849
+ defaultMessage: 'Publish without relations'
762
850
  }),
763
851
  onConfirm: async ()=>{
764
852
  await performPublish();
@@ -1236,4 +1324,5 @@ exports.DEFAULT_ACTIONS = DEFAULT_ACTIONS;
1236
1324
  exports.DocumentActionButton = DocumentActionButton;
1237
1325
  exports.DocumentActions = DocumentActions;
1238
1326
  exports.DocumentActionsMenu = DocumentActionsMenu;
1327
+ exports.openPublishConfirmDialog = openPublishConfirmDialog;
1239
1328
  //# sourceMappingURL=DocumentActions.js.map