@strapi/content-manager 0.0.0-next.e21fe90bf2ab9906267ea6e6ca620bdcc729906c → 0.0.0-next.e3eb76a86aff89979cc9098aec129d2ffa600c56

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 (248) hide show
  1. package/dist/admin/components/ConfigurationForm/Fields.js +300 -204
  2. package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
  3. package/dist/admin/components/ConfigurationForm/Fields.mjs +304 -209
  4. package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
  5. package/dist/admin/components/LeftMenu.js +34 -30
  6. package/dist/admin/components/LeftMenu.js.map +1 -1
  7. package/dist/admin/components/LeftMenu.mjs +36 -32
  8. package/dist/admin/components/LeftMenu.mjs.map +1 -1
  9. package/dist/admin/history/components/VersionHeader.js +6 -0
  10. package/dist/admin/history/components/VersionHeader.js.map +1 -1
  11. package/dist/admin/history/components/VersionHeader.mjs +7 -1
  12. package/dist/admin/history/components/VersionHeader.mjs.map +1 -1
  13. package/dist/admin/hooks/useDocumentActions.js +12 -4
  14. package/dist/admin/hooks/useDocumentActions.js.map +1 -1
  15. package/dist/admin/hooks/useDocumentActions.mjs +12 -4
  16. package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
  17. package/dist/admin/hooks/useDocumentContext.js.map +1 -1
  18. package/dist/admin/hooks/useDocumentContext.mjs.map +1 -1
  19. package/dist/admin/index.js +1 -3
  20. package/dist/admin/index.js.map +1 -1
  21. package/dist/admin/pages/EditView/EditViewPage.js +81 -74
  22. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  23. package/dist/admin/pages/EditView/EditViewPage.mjs +82 -75
  24. package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
  25. package/dist/admin/pages/EditView/components/DocumentActions.js +235 -71
  26. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  27. package/dist/admin/pages/EditView/components/DocumentActions.mjs +238 -74
  28. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  29. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +12 -15
  30. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
  31. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +12 -15
  32. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
  33. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +61 -26
  34. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
  35. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs +63 -28
  36. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
  37. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +21 -35
  38. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
  39. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs +21 -35
  40. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs.map +1 -1
  41. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +46 -95
  42. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
  43. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +48 -78
  44. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
  45. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +2 -0
  46. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  47. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +2 -0
  48. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  49. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +2 -2
  50. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  51. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +3 -3
  52. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  53. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +128 -55
  54. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  55. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +128 -55
  56. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  57. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +120 -32
  58. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  59. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +124 -36
  60. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  61. package/dist/admin/pages/EditView/components/FormInputs/UID.js +4 -2
  62. package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
  63. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs +4 -2
  64. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs.map +1 -1
  65. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js +1 -1
  66. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -1
  67. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs +1 -1
  68. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs.map +1 -1
  69. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js +50 -97
  70. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js.map +1 -1
  71. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs +51 -79
  72. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs.map +1 -1
  73. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.js +86 -118
  74. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.js.map +1 -1
  75. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.mjs +86 -118
  76. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.mjs.map +1 -1
  77. package/dist/admin/pages/EditView/components/FormLayout.js +20 -24
  78. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  79. package/dist/admin/pages/EditView/components/FormLayout.mjs +20 -24
  80. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  81. package/dist/admin/pages/ListView/ListViewPage.js +77 -0
  82. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  83. package/dist/admin/pages/ListView/ListViewPage.mjs +78 -1
  84. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  85. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js +2 -1
  86. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
  87. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs +2 -1
  88. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs.map +1 -1
  89. package/dist/admin/pages/ListView/components/Filters.js +1 -0
  90. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  91. package/dist/admin/pages/ListView/components/Filters.mjs +1 -0
  92. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
  93. package/dist/admin/pages/ListView/components/TableActions.js +13 -3
  94. package/dist/admin/pages/ListView/components/TableActions.js.map +1 -1
  95. package/dist/admin/pages/ListView/components/TableActions.mjs +13 -3
  96. package/dist/admin/pages/ListView/components/TableActions.mjs.map +1 -1
  97. package/dist/admin/preview/components/PreviewHeader.js +1 -1
  98. package/dist/admin/preview/components/PreviewHeader.js.map +1 -1
  99. package/dist/admin/preview/components/PreviewHeader.mjs +1 -1
  100. package/dist/admin/preview/components/PreviewHeader.mjs.map +1 -1
  101. package/dist/admin/services/documents.js +2 -2
  102. package/dist/admin/services/documents.js.map +1 -1
  103. package/dist/admin/services/documents.mjs +2 -2
  104. package/dist/admin/services/documents.mjs.map +1 -1
  105. package/dist/admin/services/homepage.js +9 -5
  106. package/dist/admin/services/homepage.js.map +1 -1
  107. package/dist/admin/services/homepage.mjs +9 -5
  108. package/dist/admin/services/homepage.mjs.map +1 -1
  109. package/dist/admin/src/components/ConfigurationForm/Fields.d.ts +6 -4
  110. package/dist/admin/src/hooks/useDocumentActions.d.ts +1 -0
  111. package/dist/admin/src/hooks/useDocumentContext.d.ts +1 -1
  112. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.d.ts +2 -2
  113. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.d.ts +26 -5
  114. package/dist/admin/src/pages/EditView/components/FormInputs/UID.d.ts +1 -0
  115. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +7 -8
  116. package/dist/admin/src/services/documents.d.ts +7 -1
  117. package/dist/admin/translations/en.json.js +3 -1
  118. package/dist/admin/translations/en.json.js.map +1 -1
  119. package/dist/admin/translations/en.json.mjs +3 -1
  120. package/dist/admin/translations/en.json.mjs.map +1 -1
  121. package/dist/admin/translations/ru.json.js +235 -226
  122. package/dist/admin/translations/ru.json.js.map +1 -1
  123. package/dist/admin/translations/ru.json.mjs +230 -226
  124. package/dist/admin/translations/ru.json.mjs.map +1 -1
  125. package/dist/admin/utils/validation.js +1 -1
  126. package/dist/admin/utils/validation.js.map +1 -1
  127. package/dist/admin/utils/validation.mjs +1 -1
  128. package/dist/admin/utils/validation.mjs.map +1 -1
  129. package/dist/server/controllers/content-types.js +11 -1
  130. package/dist/server/controllers/content-types.js.map +1 -1
  131. package/dist/server/controllers/content-types.mjs +11 -1
  132. package/dist/server/controllers/content-types.mjs.map +1 -1
  133. package/dist/server/controllers/index.js +3 -1
  134. package/dist/server/controllers/index.js.map +1 -1
  135. package/dist/server/controllers/index.mjs +3 -1
  136. package/dist/server/controllers/index.mjs.map +1 -1
  137. package/dist/server/controllers/validation/index.js +14 -2
  138. package/dist/server/controllers/validation/index.js.map +1 -1
  139. package/dist/server/controllers/validation/index.mjs +14 -2
  140. package/dist/server/controllers/validation/index.mjs.map +1 -1
  141. package/dist/server/history/services/lifecycles.js +3 -0
  142. package/dist/server/history/services/lifecycles.js.map +1 -1
  143. package/dist/server/history/services/lifecycles.mjs +3 -0
  144. package/dist/server/history/services/lifecycles.mjs.map +1 -1
  145. package/dist/server/homepage/controllers/homepage.js +57 -0
  146. package/dist/server/homepage/controllers/homepage.js.map +1 -0
  147. package/dist/server/homepage/controllers/homepage.mjs +36 -0
  148. package/dist/server/homepage/controllers/homepage.mjs.map +1 -0
  149. package/dist/server/homepage/controllers/index.js +10 -0
  150. package/dist/server/homepage/controllers/index.js.map +1 -0
  151. package/dist/server/homepage/controllers/index.mjs +8 -0
  152. package/dist/server/homepage/controllers/index.mjs.map +1 -0
  153. package/dist/server/homepage/index.js +14 -0
  154. package/dist/server/homepage/index.js.map +1 -0
  155. package/dist/server/homepage/index.mjs +12 -0
  156. package/dist/server/homepage/index.mjs.map +1 -0
  157. package/dist/server/homepage/routes/homepage.js +25 -0
  158. package/dist/server/homepage/routes/homepage.js.map +1 -0
  159. package/dist/server/homepage/routes/homepage.mjs +23 -0
  160. package/dist/server/homepage/routes/homepage.mjs.map +1 -0
  161. package/dist/server/homepage/routes/index.js +13 -0
  162. package/dist/server/homepage/routes/index.js.map +1 -0
  163. package/dist/server/homepage/routes/index.mjs +11 -0
  164. package/dist/server/homepage/routes/index.mjs.map +1 -0
  165. package/dist/server/homepage/services/homepage.js +157 -0
  166. package/dist/server/homepage/services/homepage.js.map +1 -0
  167. package/dist/server/homepage/services/homepage.mjs +155 -0
  168. package/dist/server/homepage/services/homepage.mjs.map +1 -0
  169. package/dist/server/homepage/services/index.js +10 -0
  170. package/dist/server/homepage/services/index.js.map +1 -0
  171. package/dist/server/homepage/services/index.mjs +8 -0
  172. package/dist/server/homepage/services/index.mjs.map +1 -0
  173. package/dist/server/preview/services/preview.js +0 -1
  174. package/dist/server/preview/services/preview.js.map +1 -1
  175. package/dist/server/preview/services/preview.mjs +0 -1
  176. package/dist/server/preview/services/preview.mjs.map +1 -1
  177. package/dist/server/routes/index.js +3 -1
  178. package/dist/server/routes/index.js.map +1 -1
  179. package/dist/server/routes/index.mjs +3 -1
  180. package/dist/server/routes/index.mjs.map +1 -1
  181. package/dist/server/services/data-mapper.js +4 -1
  182. package/dist/server/services/data-mapper.js.map +1 -1
  183. package/dist/server/services/data-mapper.mjs +4 -1
  184. package/dist/server/services/data-mapper.mjs.map +1 -1
  185. package/dist/server/services/document-manager.js +8 -1
  186. package/dist/server/services/document-manager.js.map +1 -1
  187. package/dist/server/services/document-manager.mjs +8 -1
  188. package/dist/server/services/document-manager.mjs.map +1 -1
  189. package/dist/server/services/document-metadata.js +3 -1
  190. package/dist/server/services/document-metadata.js.map +1 -1
  191. package/dist/server/services/document-metadata.mjs +3 -1
  192. package/dist/server/services/document-metadata.mjs.map +1 -1
  193. package/dist/server/services/index.js +3 -1
  194. package/dist/server/services/index.js.map +1 -1
  195. package/dist/server/services/index.mjs +3 -1
  196. package/dist/server/services/index.mjs.map +1 -1
  197. package/dist/server/services/utils/configuration/attributes.js +1 -1
  198. package/dist/server/services/utils/configuration/attributes.js.map +1 -1
  199. package/dist/server/services/utils/configuration/attributes.mjs +1 -1
  200. package/dist/server/services/utils/configuration/attributes.mjs.map +1 -1
  201. package/dist/server/services/utils/configuration/layouts.js +1 -1
  202. package/dist/server/services/utils/configuration/layouts.js.map +1 -1
  203. package/dist/server/services/utils/configuration/layouts.mjs +1 -1
  204. package/dist/server/services/utils/configuration/layouts.mjs.map +1 -1
  205. package/dist/server/services/utils/configuration/metadatas.js +8 -0
  206. package/dist/server/services/utils/configuration/metadatas.js.map +1 -1
  207. package/dist/server/services/utils/configuration/metadatas.mjs +8 -0
  208. package/dist/server/services/utils/configuration/metadatas.mjs.map +1 -1
  209. package/dist/server/services/utils/populate.js +11 -0
  210. package/dist/server/services/utils/populate.js.map +1 -1
  211. package/dist/server/services/utils/populate.mjs +11 -0
  212. package/dist/server/services/utils/populate.mjs.map +1 -1
  213. package/dist/server/src/controllers/content-types.d.ts.map +1 -1
  214. package/dist/server/src/controllers/index.d.ts.map +1 -1
  215. package/dist/server/src/controllers/validation/index.d.ts +6 -1
  216. package/dist/server/src/controllers/validation/index.d.ts.map +1 -1
  217. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  218. package/dist/server/src/homepage/controllers/homepage.d.ts +7 -0
  219. package/dist/server/src/homepage/controllers/homepage.d.ts.map +1 -0
  220. package/dist/server/src/homepage/controllers/index.d.ts +2 -0
  221. package/dist/server/src/homepage/controllers/index.d.ts.map +1 -0
  222. package/dist/server/src/homepage/index.d.ts +16 -0
  223. package/dist/server/src/homepage/index.d.ts.map +1 -0
  224. package/dist/server/src/homepage/routes/homepage.d.ts +4 -0
  225. package/dist/server/src/homepage/routes/homepage.d.ts.map +1 -0
  226. package/dist/server/src/homepage/routes/index.d.ts +8 -0
  227. package/dist/server/src/homepage/routes/index.d.ts.map +1 -0
  228. package/dist/server/src/{services → homepage/services}/homepage.d.ts +1 -1
  229. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -0
  230. package/dist/server/src/homepage/services/index.d.ts +9 -0
  231. package/dist/server/src/homepage/services/index.d.ts.map +1 -0
  232. package/dist/server/src/index.d.ts +8 -0
  233. package/dist/server/src/index.d.ts.map +1 -1
  234. package/dist/server/src/preview/services/preview.d.ts.map +1 -1
  235. package/dist/server/src/routes/index.d.ts +1 -0
  236. package/dist/server/src/routes/index.d.ts.map +1 -1
  237. package/dist/server/src/services/data-mapper.d.ts +1 -0
  238. package/dist/server/src/services/data-mapper.d.ts.map +1 -1
  239. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  240. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  241. package/dist/server/src/services/index.d.ts +7 -0
  242. package/dist/server/src/services/index.d.ts.map +1 -1
  243. package/dist/server/src/services/utils/configuration/metadatas.d.ts.map +1 -1
  244. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  245. package/dist/shared/contracts/collection-types.d.ts +0 -1
  246. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  247. package/package.json +11 -8
  248. package/dist/server/src/services/homepage.d.ts.map +0 -1
@@ -35,7 +35,7 @@ async function createDefaultLayouts(schema) {
35
35
  };
36
36
  }
37
37
  function createDefaultListLayout(schema) {
38
- return Object.keys(schema.attributes).filter((name)=>isListable(schema, name)).slice(0, DEFAULT_LIST_LENGTH);
38
+ return Object.keys(schema.attributes).filter((name)=>isListable(schema, name) && name !== 'documentId').slice(0, DEFAULT_LIST_LENGTH);
39
39
  }
40
40
  const rowSize = (els)=>els.reduce((sum, el)=>sum + el.size, 0);
41
41
  function createDefaultEditLayout(schema) {
@@ -1 +1 @@
1
- {"version":3,"file":"layouts.mjs","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))\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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"}
1
+ {"version":3,"file":"layouts.mjs","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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"}
@@ -17,6 +17,14 @@ function createDefaultMetadatas(schema) {
17
17
  searchable: true,
18
18
  sortable: true
19
19
  }
20
+ },
21
+ documentId: {
22
+ edit: {},
23
+ list: {
24
+ label: 'documentId',
25
+ searchable: true,
26
+ sortable: true
27
+ }
20
28
  }
21
29
  };
22
30
  }
@@ -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 };\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 // 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","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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"}
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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"}
@@ -15,6 +15,14 @@ function createDefaultMetadatas(schema) {
15
15
  searchable: true,
16
16
  sortable: true
17
17
  }
18
+ },
19
+ documentId: {
20
+ edit: {},
21
+ list: {
22
+ label: 'documentId',
23
+ searchable: true,
24
+ sortable: true
25
+ }
18
26
  }
19
27
  };
20
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"metadatas.mjs","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 };\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 // 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","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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"}
1
+ {"version":3,"file":"metadatas.mjs","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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"}
@@ -140,6 +140,17 @@ const isDynamicZone = fp.propEq('type', 'dynamiczone');
140
140
  }
141
141
  return populateAcc;
142
142
  }
143
+ if (isMedia(attribute)) {
144
+ if (getDoesAttributeRequireValidation(attribute)) {
145
+ populateAcc.populate = populateAcc.populate || {};
146
+ populateAcc.populate[attributeName] = {
147
+ populate: {
148
+ folder: true
149
+ }
150
+ };
151
+ return populateAcc;
152
+ }
153
+ }
143
154
  if (isComponent(attribute)) {
144
155
  // @ts-expect-error - should be a component
145
156
  const component = attribute.component;
@@ -1 +1 @@
1
- {"version":3,"file":"populate.js","sources":["../../../../server/src/services/utils/populate.ts"],"sourcesContent":["import { merge, isEmpty, set, propEq } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\nimport type { UID, Schema, Modules } from '@strapi/types';\nimport { getService } from '../../utils';\n\nconst { isVisibleAttribute, isScalarAttribute, getDoesAttributeRequireValidation } =\n strapiUtils.contentTypes;\nconst { isAnyToMany } = strapiUtils.relations;\nconst { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants;\n\nconst isMorphToRelation = (attribute: any) =>\n isRelation(attribute) && attribute.relation.includes('morphTo');\nconst isMedia = propEq('type', 'media');\nconst isRelation = propEq('type', 'relation');\nconst isComponent = propEq('type', 'component');\nconst isDynamicZone = propEq('type', 'dynamiczone');\n\n// TODO: Import from @strapi/types when it's available there\ntype Model = Parameters<typeof isVisibleAttribute>[0];\nexport type Populate = Modules.EntityService.Params.Populate.Any<UID.Schema>;\n\ntype PopulateOptions = {\n initialPopulate?: Populate;\n countMany?: boolean;\n countOne?: boolean;\n maxLevel?: number;\n};\n\n/**\n * Populate the model for relation\n * @param attribute - Attribute containing a relation\n * @param attribute.relation - type of relation\n * @param model - Model of the populated entity\n * @param attributeName\n * @param options - Options to apply while populating\n */\nfunction getPopulateForRelation(\n attribute: Schema.Attribute.AnyAttribute,\n model: Model,\n attributeName: string,\n { countMany, countOne, initialPopulate }: PopulateOptions\n) {\n const isManyRelation = isAnyToMany(attribute);\n\n if (initialPopulate) {\n return initialPopulate;\n }\n\n // If populating localizations attribute, also include validatable fields\n // Mainly needed for bulk locale publishing, so the Client has all the information necessary to perform validations\n if (attributeName === 'localizations') {\n const validationPopulate = getPopulateForValidation(model.uid as UID.Schema);\n return {\n populate: validationPopulate.populate,\n };\n }\n\n // always populate createdBy, updatedBy, localizations etc.\n if (!isVisibleAttribute(model, attributeName)) {\n return true;\n }\n\n if ((isManyRelation && countMany) || (!isManyRelation && countOne)) {\n return { count: true };\n }\n\n return true;\n}\n\n/**\n * Populate the model for Dynamic Zone components\n * @param attribute - Attribute containing the components\n * @param attribute.components - IDs of components\n * @param options - Options to apply while populating\n */\nfunction getPopulateForDZ(\n attribute: Schema.Attribute.DynamicZone,\n options: PopulateOptions,\n level: number\n) {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => ({\n ...acc,\n [componentUID]: {\n populate: getDeepPopulate(componentUID, options, level + 1),\n },\n }),\n {}\n );\n\n return { on: populatedComponents };\n}\n\n/**\n * Get the populated value based on the type of the attribute\n * @param attributeName - Name of the attribute\n * @param model - Model of the populated entity\n * @param model.attributes\n * @param options - Options to apply while populating\n * @param options.countMany\n * @param options.countOne\n * @param options.maxLevel\n * @param level\n */\nfunction getPopulateFor(\n attributeName: string,\n model: any,\n options: PopulateOptions,\n level: number\n): { [key: string]: boolean | object } {\n const attribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation':\n // @ts-expect-error - TODO: support populate count typing\n return {\n [attributeName]: getPopulateForRelation(attribute, model, attributeName, options),\n };\n case 'component':\n return {\n [attributeName]: {\n populate: getDeepPopulate(attribute.component, options, level + 1),\n },\n };\n case 'media':\n return {\n [attributeName]: {\n populate: {\n folder: true,\n },\n },\n };\n case 'dynamiczone':\n return {\n [attributeName]: getPopulateForDZ(attribute, options, level),\n };\n default:\n return {};\n }\n}\n\n/**\n * Deeply populate a model based on UID\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getDeepPopulate = (\n uid: UID.Schema,\n {\n initialPopulate = {} as any,\n countMany = false,\n countOne = false,\n maxLevel = Infinity,\n }: PopulateOptions = {},\n level = 1\n) => {\n if (level > maxLevel) {\n return {};\n }\n\n const model = strapi.getModel(uid);\n\n if (!model) {\n return {};\n }\n\n return Object.keys(model.attributes).reduce(\n (populateAcc, attributeName: string) =>\n merge(\n populateAcc,\n getPopulateFor(\n attributeName,\n model,\n {\n // @ts-expect-error - improve types\n initialPopulate: initialPopulate?.[attributeName],\n countMany,\n countOne,\n maxLevel,\n },\n level\n )\n ),\n {}\n );\n};\n\n/**\n * Deeply populate a model based on UID. Only populating fields that require validation.\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getPopulateForValidation = (uid: UID.Schema): Record<string, any> => {\n const model = strapi.getModel(uid);\n if (!model) {\n return {};\n }\n\n return Object.entries(model.attributes).reduce((populateAcc: any, [attributeName, attribute]) => {\n if (isScalarAttribute(attribute)) {\n // If the scalar attribute requires validation, add it to the fields array\n if (getDoesAttributeRequireValidation(attribute)) {\n populateAcc.fields = populateAcc.fields || [];\n populateAcc.fields.push(attributeName);\n }\n return populateAcc;\n }\n\n if (isComponent(attribute)) {\n // @ts-expect-error - should be a component\n const component = attribute.component;\n\n // Get the validation result for this component\n const componentResult = getPopulateForValidation(component);\n\n if (Object.keys(componentResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = componentResult;\n }\n\n return populateAcc;\n }\n\n if (isDynamicZone(attribute)) {\n const components = (attribute as Schema.Attribute.DynamicZone).components;\n // Handle dynamic zone components\n const componentsResult = (components || []).reduce(\n (acc, componentUID) => {\n // Get validation populate for this component\n const componentResult = getPopulateForValidation(componentUID);\n\n // Only include component if it has fields requiring validation\n if (Object.keys(componentResult).length > 0) {\n acc[componentUID] = componentResult;\n }\n\n return acc;\n },\n {} as Record<string, any>\n );\n\n // Only add to populate if we have components requiring validation\n if (Object.keys(componentsResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = { on: componentsResult };\n }\n }\n\n return populateAcc;\n }, {});\n};\n\n/**\n * getDeepPopulateDraftCount works recursively on the attributes of a model\n * creating a populated object to count all the unpublished relations within the model\n * These relations can be direct to this content type or contained within components/dynamic zones\n * @param uid of the model\n * @returns result\n * @returns result.populate\n * @returns result.hasRelations\n */\nconst getDeepPopulateDraftCount = (uid: UID.Schema) => {\n const model = strapi.getModel(uid);\n let hasRelations = false;\n\n const populate = Object.keys(model.attributes).reduce((populateAcc: any, attributeName) => {\n const attribute: Schema.Attribute.AnyAttribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation': {\n // TODO: Support polymorphic relations\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n if (isMorphRelation) {\n break;\n }\n\n if (isVisibleAttribute(model, attributeName)) {\n populateAcc[attributeName] = {\n count: true,\n filters: { [PUBLISHED_AT_ATTRIBUTE]: { $null: true } },\n };\n hasRelations = true;\n }\n break;\n }\n case 'component': {\n const { populate, hasRelations: childHasRelations } = getDeepPopulateDraftCount(\n attribute.component\n );\n if (childHasRelations) {\n populateAcc[attributeName] = {\n populate,\n };\n hasRelations = true;\n }\n break;\n }\n case 'dynamiczone': {\n const dzPopulateFragment = attribute.components?.reduce((acc, componentUID) => {\n const { populate: componentPopulate, hasRelations: componentHasRelations } =\n getDeepPopulateDraftCount(componentUID);\n\n if (componentHasRelations) {\n hasRelations = true;\n\n return { ...acc, [componentUID]: { populate: componentPopulate } };\n }\n\n return acc;\n }, {});\n\n if (!isEmpty(dzPopulateFragment)) {\n populateAcc[attributeName] = { on: dzPopulateFragment };\n }\n break;\n }\n default:\n }\n\n return populateAcc;\n }, {});\n\n return { populate, hasRelations };\n};\n\n/**\n * Create a Strapi populate object which populates all attribute fields of a Strapi query.\n */\nconst getQueryPopulate = async (uid: UID.Schema, query: object): Promise<Populate> => {\n let populateQuery: Populate = {};\n\n await strapiUtils.traverse.traverseQueryFilters(\n /**\n *\n * @param {Object} param0\n * @param {string} param0.key - Attribute name\n * @param {Object} param0.attribute - Attribute definition\n * @param {string} param0.path - Content Type path to the attribute\n * @returns\n */\n ({ attribute, path }: any) => {\n // TODO: handle dynamic zones and morph relations\n if (!attribute || isDynamicZone(attribute) || isMorphToRelation(attribute)) {\n return;\n }\n\n // Populate all relations, components and media\n if (isRelation(attribute) || isMedia(attribute) || isComponent(attribute)) {\n const populatePath = path.attribute.replace(/\\./g, '.populate.');\n // @ts-expect-error - lodash doesn't resolve the Populate type correctly\n populateQuery = set(populatePath, {}, populateQuery);\n }\n },\n { schema: strapi.getModel(uid), getModel: strapi.getModel.bind(strapi) },\n query\n );\n\n return populateQuery;\n};\n\nconst buildDeepPopulate = (uid: UID.CollectionType) => {\n return getService('populate-builder')(uid).populateDeep(Infinity).countRelations().build();\n};\n\nexport {\n getDeepPopulate,\n getDeepPopulateDraftCount,\n getPopulateForValidation,\n getQueryPopulate,\n buildDeepPopulate,\n};\n"],"names":["isVisibleAttribute","isScalarAttribute","getDoesAttributeRequireValidation","strapiUtils","contentTypes","isAnyToMany","relations","PUBLISHED_AT_ATTRIBUTE","constants","isMorphToRelation","attribute","isRelation","relation","includes","isMedia","propEq","isComponent","isDynamicZone","getPopulateForRelation","model","attributeName","countMany","countOne","initialPopulate","isManyRelation","validationPopulate","getPopulateForValidation","uid","populate","count","getPopulateForDZ","options","level","populatedComponents","components","reduce","acc","componentUID","getDeepPopulate","on","getPopulateFor","attributes","type","component","folder","maxLevel","Infinity","strapi","getModel","Object","keys","populateAcc","merge","entries","fields","push","componentResult","length","componentsResult","getDeepPopulateDraftCount","hasRelations","isMorphRelation","toLowerCase","startsWith","filters","$null","childHasRelations","dzPopulateFragment","componentPopulate","componentHasRelations","isEmpty","getQueryPopulate","query","populateQuery","traverse","traverseQueryFilters","path","populatePath","replace","set","schema","bind","buildDeepPopulate","getService","populateDeep","countRelations","build"],"mappings":"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"}
1
+ {"version":3,"file":"populate.js","sources":["../../../../server/src/services/utils/populate.ts"],"sourcesContent":["import { merge, isEmpty, set, propEq } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\nimport type { UID, Schema, Modules } from '@strapi/types';\nimport { getService } from '../../utils';\n\nconst { isVisibleAttribute, isScalarAttribute, getDoesAttributeRequireValidation } =\n strapiUtils.contentTypes;\nconst { isAnyToMany } = strapiUtils.relations;\nconst { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants;\n\nconst isMorphToRelation = (attribute: any) =>\n isRelation(attribute) && attribute.relation.includes('morphTo');\nconst isMedia = propEq('type', 'media');\nconst isRelation = propEq('type', 'relation');\nconst isComponent = propEq('type', 'component');\nconst isDynamicZone = propEq('type', 'dynamiczone');\n\n// TODO: Import from @strapi/types when it's available there\ntype Model = Parameters<typeof isVisibleAttribute>[0];\nexport type Populate = Modules.EntityService.Params.Populate.Any<UID.Schema>;\n\ntype PopulateOptions = {\n initialPopulate?: Populate;\n countMany?: boolean;\n countOne?: boolean;\n maxLevel?: number;\n};\n\n/**\n * Populate the model for relation\n * @param attribute - Attribute containing a relation\n * @param attribute.relation - type of relation\n * @param model - Model of the populated entity\n * @param attributeName\n * @param options - Options to apply while populating\n */\nfunction getPopulateForRelation(\n attribute: Schema.Attribute.AnyAttribute,\n model: Model,\n attributeName: string,\n { countMany, countOne, initialPopulate }: PopulateOptions\n) {\n const isManyRelation = isAnyToMany(attribute);\n\n if (initialPopulate) {\n return initialPopulate;\n }\n\n // If populating localizations attribute, also include validatable fields\n // Mainly needed for bulk locale publishing, so the Client has all the information necessary to perform validations\n if (attributeName === 'localizations') {\n const validationPopulate = getPopulateForValidation(model.uid as UID.Schema);\n\n return {\n populate: validationPopulate.populate,\n };\n }\n\n // always populate createdBy, updatedBy, localizations etc.\n if (!isVisibleAttribute(model, attributeName)) {\n return true;\n }\n\n if ((isManyRelation && countMany) || (!isManyRelation && countOne)) {\n return { count: true };\n }\n\n return true;\n}\n\n/**\n * Populate the model for Dynamic Zone components\n * @param attribute - Attribute containing the components\n * @param attribute.components - IDs of components\n * @param options - Options to apply while populating\n */\nfunction getPopulateForDZ(\n attribute: Schema.Attribute.DynamicZone,\n options: PopulateOptions,\n level: number\n) {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => ({\n ...acc,\n [componentUID]: {\n populate: getDeepPopulate(componentUID, options, level + 1),\n },\n }),\n {}\n );\n\n return { on: populatedComponents };\n}\n\n/**\n * Get the populated value based on the type of the attribute\n * @param attributeName - Name of the attribute\n * @param model - Model of the populated entity\n * @param model.attributes\n * @param options - Options to apply while populating\n * @param options.countMany\n * @param options.countOne\n * @param options.maxLevel\n * @param level\n */\nfunction getPopulateFor(\n attributeName: string,\n model: any,\n options: PopulateOptions,\n level: number\n): { [key: string]: boolean | object } {\n const attribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation':\n // @ts-expect-error - TODO: support populate count typing\n return {\n [attributeName]: getPopulateForRelation(attribute, model, attributeName, options),\n };\n case 'component':\n return {\n [attributeName]: {\n populate: getDeepPopulate(attribute.component, options, level + 1),\n },\n };\n case 'media':\n return {\n [attributeName]: {\n populate: {\n folder: true,\n },\n },\n };\n case 'dynamiczone':\n return {\n [attributeName]: getPopulateForDZ(attribute, options, level),\n };\n default:\n return {};\n }\n}\n\n/**\n * Deeply populate a model based on UID\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getDeepPopulate = (\n uid: UID.Schema,\n {\n initialPopulate = {} as any,\n countMany = false,\n countOne = false,\n maxLevel = Infinity,\n }: PopulateOptions = {},\n level = 1\n) => {\n if (level > maxLevel) {\n return {};\n }\n\n const model = strapi.getModel(uid);\n\n if (!model) {\n return {};\n }\n\n return Object.keys(model.attributes).reduce(\n (populateAcc, attributeName: string) =>\n merge(\n populateAcc,\n getPopulateFor(\n attributeName,\n model,\n {\n // @ts-expect-error - improve types\n initialPopulate: initialPopulate?.[attributeName],\n countMany,\n countOne,\n maxLevel,\n },\n level\n )\n ),\n {}\n );\n};\n\n/**\n * Deeply populate a model based on UID. Only populating fields that require validation.\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getPopulateForValidation = (uid: UID.Schema): Record<string, any> => {\n const model = strapi.getModel(uid);\n if (!model) {\n return {};\n }\n\n return Object.entries(model.attributes).reduce((populateAcc: any, [attributeName, attribute]) => {\n if (isScalarAttribute(attribute)) {\n // If the scalar attribute requires validation, add it to the fields array\n if (getDoesAttributeRequireValidation(attribute)) {\n populateAcc.fields = populateAcc.fields || [];\n populateAcc.fields.push(attributeName);\n }\n return populateAcc;\n }\n\n if (isMedia(attribute)) {\n if (getDoesAttributeRequireValidation(attribute)) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = {\n populate: {\n folder: true,\n },\n };\n return populateAcc;\n }\n }\n\n if (isComponent(attribute)) {\n // @ts-expect-error - should be a component\n const component = attribute.component;\n\n // Get the validation result for this component\n const componentResult = getPopulateForValidation(component);\n\n if (Object.keys(componentResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = componentResult;\n }\n\n return populateAcc;\n }\n\n if (isDynamicZone(attribute)) {\n const components = (attribute as Schema.Attribute.DynamicZone).components;\n // Handle dynamic zone components\n const componentsResult = (components || []).reduce(\n (acc, componentUID) => {\n // Get validation populate for this component\n const componentResult = getPopulateForValidation(componentUID);\n\n // Only include component if it has fields requiring validation\n if (Object.keys(componentResult).length > 0) {\n acc[componentUID] = componentResult;\n }\n\n return acc;\n },\n {} as Record<string, any>\n );\n\n // Only add to populate if we have components requiring validation\n if (Object.keys(componentsResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = { on: componentsResult };\n }\n }\n\n return populateAcc;\n }, {});\n};\n\n/**\n * getDeepPopulateDraftCount works recursively on the attributes of a model\n * creating a populated object to count all the unpublished relations within the model\n * These relations can be direct to this content type or contained within components/dynamic zones\n * @param uid of the model\n * @returns result\n * @returns result.populate\n * @returns result.hasRelations\n */\nconst getDeepPopulateDraftCount = (uid: UID.Schema) => {\n const model = strapi.getModel(uid);\n let hasRelations = false;\n\n const populate = Object.keys(model.attributes).reduce((populateAcc: any, attributeName) => {\n const attribute: Schema.Attribute.AnyAttribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation': {\n // TODO: Support polymorphic relations\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n if (isMorphRelation) {\n break;\n }\n\n if (isVisibleAttribute(model, attributeName)) {\n populateAcc[attributeName] = {\n count: true,\n filters: { [PUBLISHED_AT_ATTRIBUTE]: { $null: true } },\n };\n hasRelations = true;\n }\n break;\n }\n case 'component': {\n const { populate, hasRelations: childHasRelations } = getDeepPopulateDraftCount(\n attribute.component\n );\n if (childHasRelations) {\n populateAcc[attributeName] = {\n populate,\n };\n hasRelations = true;\n }\n break;\n }\n case 'dynamiczone': {\n const dzPopulateFragment = attribute.components?.reduce((acc, componentUID) => {\n const { populate: componentPopulate, hasRelations: componentHasRelations } =\n getDeepPopulateDraftCount(componentUID);\n\n if (componentHasRelations) {\n hasRelations = true;\n\n return { ...acc, [componentUID]: { populate: componentPopulate } };\n }\n\n return acc;\n }, {});\n\n if (!isEmpty(dzPopulateFragment)) {\n populateAcc[attributeName] = { on: dzPopulateFragment };\n }\n break;\n }\n default:\n }\n\n return populateAcc;\n }, {});\n\n return { populate, hasRelations };\n};\n\n/**\n * Create a Strapi populate object which populates all attribute fields of a Strapi query.\n */\nconst getQueryPopulate = async (uid: UID.Schema, query: object): Promise<Populate> => {\n let populateQuery: Populate = {};\n\n await strapiUtils.traverse.traverseQueryFilters(\n /**\n *\n * @param {Object} param0\n * @param {string} param0.key - Attribute name\n * @param {Object} param0.attribute - Attribute definition\n * @param {string} param0.path - Content Type path to the attribute\n * @returns\n */\n ({ attribute, path }: any) => {\n // TODO: handle dynamic zones and morph relations\n if (!attribute || isDynamicZone(attribute) || isMorphToRelation(attribute)) {\n return;\n }\n\n // Populate all relations, components and media\n if (isRelation(attribute) || isMedia(attribute) || isComponent(attribute)) {\n const populatePath = path.attribute.replace(/\\./g, '.populate.');\n // @ts-expect-error - lodash doesn't resolve the Populate type correctly\n populateQuery = set(populatePath, {}, populateQuery);\n }\n },\n { schema: strapi.getModel(uid), getModel: strapi.getModel.bind(strapi) },\n query\n );\n\n return populateQuery;\n};\n\nconst buildDeepPopulate = (uid: UID.CollectionType) => {\n return getService('populate-builder')(uid).populateDeep(Infinity).countRelations().build();\n};\n\nexport {\n getDeepPopulate,\n getDeepPopulateDraftCount,\n getPopulateForValidation,\n getQueryPopulate,\n buildDeepPopulate,\n};\n"],"names":["isVisibleAttribute","isScalarAttribute","getDoesAttributeRequireValidation","strapiUtils","contentTypes","isAnyToMany","relations","PUBLISHED_AT_ATTRIBUTE","constants","isMorphToRelation","attribute","isRelation","relation","includes","isMedia","propEq","isComponent","isDynamicZone","getPopulateForRelation","model","attributeName","countMany","countOne","initialPopulate","isManyRelation","validationPopulate","getPopulateForValidation","uid","populate","count","getPopulateForDZ","options","level","populatedComponents","components","reduce","acc","componentUID","getDeepPopulate","on","getPopulateFor","attributes","type","component","folder","maxLevel","Infinity","strapi","getModel","Object","keys","populateAcc","merge","entries","fields","push","componentResult","length","componentsResult","getDeepPopulateDraftCount","hasRelations","isMorphRelation","toLowerCase","startsWith","filters","$null","childHasRelations","dzPopulateFragment","componentPopulate","componentHasRelations","isEmpty","getQueryPopulate","query","populateQuery","traverse","traverseQueryFilters","path","populatePath","replace","set","schema","bind","buildDeepPopulate","getService","populateDeep","countRelations","build"],"mappings":"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"}
@@ -138,6 +138,17 @@ const isDynamicZone = propEq('type', 'dynamiczone');
138
138
  }
139
139
  return populateAcc;
140
140
  }
141
+ if (isMedia(attribute)) {
142
+ if (getDoesAttributeRequireValidation(attribute)) {
143
+ populateAcc.populate = populateAcc.populate || {};
144
+ populateAcc.populate[attributeName] = {
145
+ populate: {
146
+ folder: true
147
+ }
148
+ };
149
+ return populateAcc;
150
+ }
151
+ }
141
152
  if (isComponent(attribute)) {
142
153
  // @ts-expect-error - should be a component
143
154
  const component = attribute.component;
@@ -1 +1 @@
1
- {"version":3,"file":"populate.mjs","sources":["../../../../server/src/services/utils/populate.ts"],"sourcesContent":["import { merge, isEmpty, set, propEq } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\nimport type { UID, Schema, Modules } from '@strapi/types';\nimport { getService } from '../../utils';\n\nconst { isVisibleAttribute, isScalarAttribute, getDoesAttributeRequireValidation } =\n strapiUtils.contentTypes;\nconst { isAnyToMany } = strapiUtils.relations;\nconst { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants;\n\nconst isMorphToRelation = (attribute: any) =>\n isRelation(attribute) && attribute.relation.includes('morphTo');\nconst isMedia = propEq('type', 'media');\nconst isRelation = propEq('type', 'relation');\nconst isComponent = propEq('type', 'component');\nconst isDynamicZone = propEq('type', 'dynamiczone');\n\n// TODO: Import from @strapi/types when it's available there\ntype Model = Parameters<typeof isVisibleAttribute>[0];\nexport type Populate = Modules.EntityService.Params.Populate.Any<UID.Schema>;\n\ntype PopulateOptions = {\n initialPopulate?: Populate;\n countMany?: boolean;\n countOne?: boolean;\n maxLevel?: number;\n};\n\n/**\n * Populate the model for relation\n * @param attribute - Attribute containing a relation\n * @param attribute.relation - type of relation\n * @param model - Model of the populated entity\n * @param attributeName\n * @param options - Options to apply while populating\n */\nfunction getPopulateForRelation(\n attribute: Schema.Attribute.AnyAttribute,\n model: Model,\n attributeName: string,\n { countMany, countOne, initialPopulate }: PopulateOptions\n) {\n const isManyRelation = isAnyToMany(attribute);\n\n if (initialPopulate) {\n return initialPopulate;\n }\n\n // If populating localizations attribute, also include validatable fields\n // Mainly needed for bulk locale publishing, so the Client has all the information necessary to perform validations\n if (attributeName === 'localizations') {\n const validationPopulate = getPopulateForValidation(model.uid as UID.Schema);\n return {\n populate: validationPopulate.populate,\n };\n }\n\n // always populate createdBy, updatedBy, localizations etc.\n if (!isVisibleAttribute(model, attributeName)) {\n return true;\n }\n\n if ((isManyRelation && countMany) || (!isManyRelation && countOne)) {\n return { count: true };\n }\n\n return true;\n}\n\n/**\n * Populate the model for Dynamic Zone components\n * @param attribute - Attribute containing the components\n * @param attribute.components - IDs of components\n * @param options - Options to apply while populating\n */\nfunction getPopulateForDZ(\n attribute: Schema.Attribute.DynamicZone,\n options: PopulateOptions,\n level: number\n) {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => ({\n ...acc,\n [componentUID]: {\n populate: getDeepPopulate(componentUID, options, level + 1),\n },\n }),\n {}\n );\n\n return { on: populatedComponents };\n}\n\n/**\n * Get the populated value based on the type of the attribute\n * @param attributeName - Name of the attribute\n * @param model - Model of the populated entity\n * @param model.attributes\n * @param options - Options to apply while populating\n * @param options.countMany\n * @param options.countOne\n * @param options.maxLevel\n * @param level\n */\nfunction getPopulateFor(\n attributeName: string,\n model: any,\n options: PopulateOptions,\n level: number\n): { [key: string]: boolean | object } {\n const attribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation':\n // @ts-expect-error - TODO: support populate count typing\n return {\n [attributeName]: getPopulateForRelation(attribute, model, attributeName, options),\n };\n case 'component':\n return {\n [attributeName]: {\n populate: getDeepPopulate(attribute.component, options, level + 1),\n },\n };\n case 'media':\n return {\n [attributeName]: {\n populate: {\n folder: true,\n },\n },\n };\n case 'dynamiczone':\n return {\n [attributeName]: getPopulateForDZ(attribute, options, level),\n };\n default:\n return {};\n }\n}\n\n/**\n * Deeply populate a model based on UID\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getDeepPopulate = (\n uid: UID.Schema,\n {\n initialPopulate = {} as any,\n countMany = false,\n countOne = false,\n maxLevel = Infinity,\n }: PopulateOptions = {},\n level = 1\n) => {\n if (level > maxLevel) {\n return {};\n }\n\n const model = strapi.getModel(uid);\n\n if (!model) {\n return {};\n }\n\n return Object.keys(model.attributes).reduce(\n (populateAcc, attributeName: string) =>\n merge(\n populateAcc,\n getPopulateFor(\n attributeName,\n model,\n {\n // @ts-expect-error - improve types\n initialPopulate: initialPopulate?.[attributeName],\n countMany,\n countOne,\n maxLevel,\n },\n level\n )\n ),\n {}\n );\n};\n\n/**\n * Deeply populate a model based on UID. Only populating fields that require validation.\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getPopulateForValidation = (uid: UID.Schema): Record<string, any> => {\n const model = strapi.getModel(uid);\n if (!model) {\n return {};\n }\n\n return Object.entries(model.attributes).reduce((populateAcc: any, [attributeName, attribute]) => {\n if (isScalarAttribute(attribute)) {\n // If the scalar attribute requires validation, add it to the fields array\n if (getDoesAttributeRequireValidation(attribute)) {\n populateAcc.fields = populateAcc.fields || [];\n populateAcc.fields.push(attributeName);\n }\n return populateAcc;\n }\n\n if (isComponent(attribute)) {\n // @ts-expect-error - should be a component\n const component = attribute.component;\n\n // Get the validation result for this component\n const componentResult = getPopulateForValidation(component);\n\n if (Object.keys(componentResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = componentResult;\n }\n\n return populateAcc;\n }\n\n if (isDynamicZone(attribute)) {\n const components = (attribute as Schema.Attribute.DynamicZone).components;\n // Handle dynamic zone components\n const componentsResult = (components || []).reduce(\n (acc, componentUID) => {\n // Get validation populate for this component\n const componentResult = getPopulateForValidation(componentUID);\n\n // Only include component if it has fields requiring validation\n if (Object.keys(componentResult).length > 0) {\n acc[componentUID] = componentResult;\n }\n\n return acc;\n },\n {} as Record<string, any>\n );\n\n // Only add to populate if we have components requiring validation\n if (Object.keys(componentsResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = { on: componentsResult };\n }\n }\n\n return populateAcc;\n }, {});\n};\n\n/**\n * getDeepPopulateDraftCount works recursively on the attributes of a model\n * creating a populated object to count all the unpublished relations within the model\n * These relations can be direct to this content type or contained within components/dynamic zones\n * @param uid of the model\n * @returns result\n * @returns result.populate\n * @returns result.hasRelations\n */\nconst getDeepPopulateDraftCount = (uid: UID.Schema) => {\n const model = strapi.getModel(uid);\n let hasRelations = false;\n\n const populate = Object.keys(model.attributes).reduce((populateAcc: any, attributeName) => {\n const attribute: Schema.Attribute.AnyAttribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation': {\n // TODO: Support polymorphic relations\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n if (isMorphRelation) {\n break;\n }\n\n if (isVisibleAttribute(model, attributeName)) {\n populateAcc[attributeName] = {\n count: true,\n filters: { [PUBLISHED_AT_ATTRIBUTE]: { $null: true } },\n };\n hasRelations = true;\n }\n break;\n }\n case 'component': {\n const { populate, hasRelations: childHasRelations } = getDeepPopulateDraftCount(\n attribute.component\n );\n if (childHasRelations) {\n populateAcc[attributeName] = {\n populate,\n };\n hasRelations = true;\n }\n break;\n }\n case 'dynamiczone': {\n const dzPopulateFragment = attribute.components?.reduce((acc, componentUID) => {\n const { populate: componentPopulate, hasRelations: componentHasRelations } =\n getDeepPopulateDraftCount(componentUID);\n\n if (componentHasRelations) {\n hasRelations = true;\n\n return { ...acc, [componentUID]: { populate: componentPopulate } };\n }\n\n return acc;\n }, {});\n\n if (!isEmpty(dzPopulateFragment)) {\n populateAcc[attributeName] = { on: dzPopulateFragment };\n }\n break;\n }\n default:\n }\n\n return populateAcc;\n }, {});\n\n return { populate, hasRelations };\n};\n\n/**\n * Create a Strapi populate object which populates all attribute fields of a Strapi query.\n */\nconst getQueryPopulate = async (uid: UID.Schema, query: object): Promise<Populate> => {\n let populateQuery: Populate = {};\n\n await strapiUtils.traverse.traverseQueryFilters(\n /**\n *\n * @param {Object} param0\n * @param {string} param0.key - Attribute name\n * @param {Object} param0.attribute - Attribute definition\n * @param {string} param0.path - Content Type path to the attribute\n * @returns\n */\n ({ attribute, path }: any) => {\n // TODO: handle dynamic zones and morph relations\n if (!attribute || isDynamicZone(attribute) || isMorphToRelation(attribute)) {\n return;\n }\n\n // Populate all relations, components and media\n if (isRelation(attribute) || isMedia(attribute) || isComponent(attribute)) {\n const populatePath = path.attribute.replace(/\\./g, '.populate.');\n // @ts-expect-error - lodash doesn't resolve the Populate type correctly\n populateQuery = set(populatePath, {}, populateQuery);\n }\n },\n { schema: strapi.getModel(uid), getModel: strapi.getModel.bind(strapi) },\n query\n );\n\n return populateQuery;\n};\n\nconst buildDeepPopulate = (uid: UID.CollectionType) => {\n return getService('populate-builder')(uid).populateDeep(Infinity).countRelations().build();\n};\n\nexport {\n getDeepPopulate,\n getDeepPopulateDraftCount,\n getPopulateForValidation,\n getQueryPopulate,\n buildDeepPopulate,\n};\n"],"names":["isVisibleAttribute","isScalarAttribute","getDoesAttributeRequireValidation","strapiUtils","contentTypes","isAnyToMany","relations","PUBLISHED_AT_ATTRIBUTE","constants","isMorphToRelation","attribute","isRelation","relation","includes","isMedia","propEq","isComponent","isDynamicZone","getPopulateForRelation","model","attributeName","countMany","countOne","initialPopulate","isManyRelation","validationPopulate","getPopulateForValidation","uid","populate","count","getPopulateForDZ","options","level","populatedComponents","components","reduce","acc","componentUID","getDeepPopulate","on","getPopulateFor","attributes","type","component","folder","maxLevel","Infinity","strapi","getModel","Object","keys","populateAcc","merge","entries","fields","push","componentResult","length","componentsResult","getDeepPopulateDraftCount","hasRelations","isMorphRelation","toLowerCase","startsWith","filters","$null","childHasRelations","dzPopulateFragment","componentPopulate","componentHasRelations","isEmpty","getQueryPopulate","query","populateQuery","traverse","traverseQueryFilters","path","populatePath","replace","set","schema","bind","buildDeepPopulate","getService","populateDeep","countRelations","build"],"mappings":"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"}
1
+ {"version":3,"file":"populate.mjs","sources":["../../../../server/src/services/utils/populate.ts"],"sourcesContent":["import { merge, isEmpty, set, propEq } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\nimport type { UID, Schema, Modules } from '@strapi/types';\nimport { getService } from '../../utils';\n\nconst { isVisibleAttribute, isScalarAttribute, getDoesAttributeRequireValidation } =\n strapiUtils.contentTypes;\nconst { isAnyToMany } = strapiUtils.relations;\nconst { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants;\n\nconst isMorphToRelation = (attribute: any) =>\n isRelation(attribute) && attribute.relation.includes('morphTo');\nconst isMedia = propEq('type', 'media');\nconst isRelation = propEq('type', 'relation');\nconst isComponent = propEq('type', 'component');\nconst isDynamicZone = propEq('type', 'dynamiczone');\n\n// TODO: Import from @strapi/types when it's available there\ntype Model = Parameters<typeof isVisibleAttribute>[0];\nexport type Populate = Modules.EntityService.Params.Populate.Any<UID.Schema>;\n\ntype PopulateOptions = {\n initialPopulate?: Populate;\n countMany?: boolean;\n countOne?: boolean;\n maxLevel?: number;\n};\n\n/**\n * Populate the model for relation\n * @param attribute - Attribute containing a relation\n * @param attribute.relation - type of relation\n * @param model - Model of the populated entity\n * @param attributeName\n * @param options - Options to apply while populating\n */\nfunction getPopulateForRelation(\n attribute: Schema.Attribute.AnyAttribute,\n model: Model,\n attributeName: string,\n { countMany, countOne, initialPopulate }: PopulateOptions\n) {\n const isManyRelation = isAnyToMany(attribute);\n\n if (initialPopulate) {\n return initialPopulate;\n }\n\n // If populating localizations attribute, also include validatable fields\n // Mainly needed for bulk locale publishing, so the Client has all the information necessary to perform validations\n if (attributeName === 'localizations') {\n const validationPopulate = getPopulateForValidation(model.uid as UID.Schema);\n\n return {\n populate: validationPopulate.populate,\n };\n }\n\n // always populate createdBy, updatedBy, localizations etc.\n if (!isVisibleAttribute(model, attributeName)) {\n return true;\n }\n\n if ((isManyRelation && countMany) || (!isManyRelation && countOne)) {\n return { count: true };\n }\n\n return true;\n}\n\n/**\n * Populate the model for Dynamic Zone components\n * @param attribute - Attribute containing the components\n * @param attribute.components - IDs of components\n * @param options - Options to apply while populating\n */\nfunction getPopulateForDZ(\n attribute: Schema.Attribute.DynamicZone,\n options: PopulateOptions,\n level: number\n) {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => ({\n ...acc,\n [componentUID]: {\n populate: getDeepPopulate(componentUID, options, level + 1),\n },\n }),\n {}\n );\n\n return { on: populatedComponents };\n}\n\n/**\n * Get the populated value based on the type of the attribute\n * @param attributeName - Name of the attribute\n * @param model - Model of the populated entity\n * @param model.attributes\n * @param options - Options to apply while populating\n * @param options.countMany\n * @param options.countOne\n * @param options.maxLevel\n * @param level\n */\nfunction getPopulateFor(\n attributeName: string,\n model: any,\n options: PopulateOptions,\n level: number\n): { [key: string]: boolean | object } {\n const attribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation':\n // @ts-expect-error - TODO: support populate count typing\n return {\n [attributeName]: getPopulateForRelation(attribute, model, attributeName, options),\n };\n case 'component':\n return {\n [attributeName]: {\n populate: getDeepPopulate(attribute.component, options, level + 1),\n },\n };\n case 'media':\n return {\n [attributeName]: {\n populate: {\n folder: true,\n },\n },\n };\n case 'dynamiczone':\n return {\n [attributeName]: getPopulateForDZ(attribute, options, level),\n };\n default:\n return {};\n }\n}\n\n/**\n * Deeply populate a model based on UID\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getDeepPopulate = (\n uid: UID.Schema,\n {\n initialPopulate = {} as any,\n countMany = false,\n countOne = false,\n maxLevel = Infinity,\n }: PopulateOptions = {},\n level = 1\n) => {\n if (level > maxLevel) {\n return {};\n }\n\n const model = strapi.getModel(uid);\n\n if (!model) {\n return {};\n }\n\n return Object.keys(model.attributes).reduce(\n (populateAcc, attributeName: string) =>\n merge(\n populateAcc,\n getPopulateFor(\n attributeName,\n model,\n {\n // @ts-expect-error - improve types\n initialPopulate: initialPopulate?.[attributeName],\n countMany,\n countOne,\n maxLevel,\n },\n level\n )\n ),\n {}\n );\n};\n\n/**\n * Deeply populate a model based on UID. Only populating fields that require validation.\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getPopulateForValidation = (uid: UID.Schema): Record<string, any> => {\n const model = strapi.getModel(uid);\n if (!model) {\n return {};\n }\n\n return Object.entries(model.attributes).reduce((populateAcc: any, [attributeName, attribute]) => {\n if (isScalarAttribute(attribute)) {\n // If the scalar attribute requires validation, add it to the fields array\n if (getDoesAttributeRequireValidation(attribute)) {\n populateAcc.fields = populateAcc.fields || [];\n populateAcc.fields.push(attributeName);\n }\n return populateAcc;\n }\n\n if (isMedia(attribute)) {\n if (getDoesAttributeRequireValidation(attribute)) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = {\n populate: {\n folder: true,\n },\n };\n return populateAcc;\n }\n }\n\n if (isComponent(attribute)) {\n // @ts-expect-error - should be a component\n const component = attribute.component;\n\n // Get the validation result for this component\n const componentResult = getPopulateForValidation(component);\n\n if (Object.keys(componentResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = componentResult;\n }\n\n return populateAcc;\n }\n\n if (isDynamicZone(attribute)) {\n const components = (attribute as Schema.Attribute.DynamicZone).components;\n // Handle dynamic zone components\n const componentsResult = (components || []).reduce(\n (acc, componentUID) => {\n // Get validation populate for this component\n const componentResult = getPopulateForValidation(componentUID);\n\n // Only include component if it has fields requiring validation\n if (Object.keys(componentResult).length > 0) {\n acc[componentUID] = componentResult;\n }\n\n return acc;\n },\n {} as Record<string, any>\n );\n\n // Only add to populate if we have components requiring validation\n if (Object.keys(componentsResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = { on: componentsResult };\n }\n }\n\n return populateAcc;\n }, {});\n};\n\n/**\n * getDeepPopulateDraftCount works recursively on the attributes of a model\n * creating a populated object to count all the unpublished relations within the model\n * These relations can be direct to this content type or contained within components/dynamic zones\n * @param uid of the model\n * @returns result\n * @returns result.populate\n * @returns result.hasRelations\n */\nconst getDeepPopulateDraftCount = (uid: UID.Schema) => {\n const model = strapi.getModel(uid);\n let hasRelations = false;\n\n const populate = Object.keys(model.attributes).reduce((populateAcc: any, attributeName) => {\n const attribute: Schema.Attribute.AnyAttribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation': {\n // TODO: Support polymorphic relations\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n if (isMorphRelation) {\n break;\n }\n\n if (isVisibleAttribute(model, attributeName)) {\n populateAcc[attributeName] = {\n count: true,\n filters: { [PUBLISHED_AT_ATTRIBUTE]: { $null: true } },\n };\n hasRelations = true;\n }\n break;\n }\n case 'component': {\n const { populate, hasRelations: childHasRelations } = getDeepPopulateDraftCount(\n attribute.component\n );\n if (childHasRelations) {\n populateAcc[attributeName] = {\n populate,\n };\n hasRelations = true;\n }\n break;\n }\n case 'dynamiczone': {\n const dzPopulateFragment = attribute.components?.reduce((acc, componentUID) => {\n const { populate: componentPopulate, hasRelations: componentHasRelations } =\n getDeepPopulateDraftCount(componentUID);\n\n if (componentHasRelations) {\n hasRelations = true;\n\n return { ...acc, [componentUID]: { populate: componentPopulate } };\n }\n\n return acc;\n }, {});\n\n if (!isEmpty(dzPopulateFragment)) {\n populateAcc[attributeName] = { on: dzPopulateFragment };\n }\n break;\n }\n default:\n }\n\n return populateAcc;\n }, {});\n\n return { populate, hasRelations };\n};\n\n/**\n * Create a Strapi populate object which populates all attribute fields of a Strapi query.\n */\nconst getQueryPopulate = async (uid: UID.Schema, query: object): Promise<Populate> => {\n let populateQuery: Populate = {};\n\n await strapiUtils.traverse.traverseQueryFilters(\n /**\n *\n * @param {Object} param0\n * @param {string} param0.key - Attribute name\n * @param {Object} param0.attribute - Attribute definition\n * @param {string} param0.path - Content Type path to the attribute\n * @returns\n */\n ({ attribute, path }: any) => {\n // TODO: handle dynamic zones and morph relations\n if (!attribute || isDynamicZone(attribute) || isMorphToRelation(attribute)) {\n return;\n }\n\n // Populate all relations, components and media\n if (isRelation(attribute) || isMedia(attribute) || isComponent(attribute)) {\n const populatePath = path.attribute.replace(/\\./g, '.populate.');\n // @ts-expect-error - lodash doesn't resolve the Populate type correctly\n populateQuery = set(populatePath, {}, populateQuery);\n }\n },\n { schema: strapi.getModel(uid), getModel: strapi.getModel.bind(strapi) },\n query\n );\n\n return populateQuery;\n};\n\nconst buildDeepPopulate = (uid: UID.CollectionType) => {\n return getService('populate-builder')(uid).populateDeep(Infinity).countRelations().build();\n};\n\nexport {\n getDeepPopulate,\n getDeepPopulateDraftCount,\n getPopulateForValidation,\n getQueryPopulate,\n buildDeepPopulate,\n};\n"],"names":["isVisibleAttribute","isScalarAttribute","getDoesAttributeRequireValidation","strapiUtils","contentTypes","isAnyToMany","relations","PUBLISHED_AT_ATTRIBUTE","constants","isMorphToRelation","attribute","isRelation","relation","includes","isMedia","propEq","isComponent","isDynamicZone","getPopulateForRelation","model","attributeName","countMany","countOne","initialPopulate","isManyRelation","validationPopulate","getPopulateForValidation","uid","populate","count","getPopulateForDZ","options","level","populatedComponents","components","reduce","acc","componentUID","getDeepPopulate","on","getPopulateFor","attributes","type","component","folder","maxLevel","Infinity","strapi","getModel","Object","keys","populateAcc","merge","entries","fields","push","componentResult","length","componentsResult","getDeepPopulateDraftCount","hasRelations","isMorphRelation","toLowerCase","startsWith","filters","$null","childHasRelations","dzPopulateFragment","componentPopulate","componentHasRelations","isEmpty","getQueryPopulate","query","populateQuery","traverse","traverseQueryFilters","path","populatePath","replace","set","schema","bind","buildDeepPopulate","getService","populateDeep","countRelations","build"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"content-types.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/content-types.ts"],"names":[],"mappings":";0BAY8B,GAAG;kCAeK,GAAG;sCAgBC,GAAG;wCA4BD,GAAG;;AA5D/C,wBA8GE"}
1
+ {"version":3,"file":"content-types.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/content-types.ts"],"names":[],"mappings":";0BAY8B,GAAG;kCAeK,GAAG;sCAgBC,GAAG;wCAsCD,GAAG;;AAtE/C,wBAwHE"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,wBAUE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,wBAWE"}
@@ -1,3 +1,4 @@
1
+ import { UID } from '@strapi/types';
1
2
  import { yup } from '@strapi/utils';
2
3
  import createModelConfigurationSchema from './model-configuration';
3
4
  declare const validateUIDField: (contentTypeUID: any, field: any) => void;
@@ -11,7 +12,11 @@ declare const validateGenerateUIDInput: (body: unknown, errorMessage?: string |
11
12
  field: import("yup/lib/string").RequiredStringSchema<string | undefined, Record<string, any>>;
12
13
  data: import("yup/lib/object").RequiredObjectSchema<import("yup/lib/object").ObjectShape, Record<string, any>, import("yup/lib/object").TypeOfShape<import("yup/lib/object").ObjectShape>>;
13
14
  }>>;
14
- declare const validateCheckUIDAvailabilityInput: (body: unknown, errorMessage?: string | undefined) => Promise<import("yup/lib/object").AssertsShape<{
15
+ declare const validateCheckUIDAvailabilityInput: (body: {
16
+ contentTypeUID: UID.ContentType;
17
+ field: string;
18
+ value: string;
19
+ }) => Promise<import("yup/lib/object").AssertsShape<{
15
20
  contentTypeUID: import("yup/lib/string").RequiredStringSchema<string | undefined, Record<string, any>>;
16
21
  field: import("yup/lib/string").RequiredStringSchema<string | undefined, Record<string, any>>;
17
22
  value: import("yup/lib/string").RequiredStringSchema<string | undefined, Record<string, any>>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../server/src/controllers/validation/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAA6B,MAAM,eAAe,CAAC;AAC/D,OAAO,8BAA8B,MAAM,uBAAuB,CAAC;AA+BnE,QAAA,MAAM,gBAAgB,mBAAoB,GAAG,SAAS,GAAG,SAaxD,CAAC;AAEF,QAAA,MAAM,kBAAkB,uBAAwB,GAAG,SAUlD,CAAC;AAEF,QAAA,MAAM,YAAY,0FAAgC,CAAC;AACnD,QAAA,MAAM,uBAAuB;;GAA2C,CAAC;AACzE,QAAA,MAAM,wBAAwB;;;;GAA4C,CAAC;AAC3E,QAAA,MAAM,iCAAiC;;;;GAAqD,CAAC;AAE7F,OAAO,EACL,8BAA8B,EAC9B,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,uBAAuB,EACvB,wBAAwB,EACxB,iCAAiC,GAClC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../server/src/controllers/validation/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,GAAG,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,GAAG,EAA6B,MAAM,eAAe,CAAC;AAG/D,OAAO,8BAA8B,MAAM,uBAAuB,CAAC;AA0CnE,QAAA,MAAM,gBAAgB,mBAAoB,GAAG,SAAS,GAAG,SAaxD,CAAC;AAEF,QAAA,MAAM,kBAAkB,uBAAwB,GAAG,SAUlD,CAAC;AAEF,QAAA,MAAM,YAAY,0FAAgC,CAAC;AACnD,QAAA,MAAM,uBAAuB;;GAA2C,CAAC;AACzE,QAAA,MAAM,wBAAwB;;;;GAA4C,CAAC;AAC3E,QAAA,MAAM,iCAAiC,SAAU;IAC/C,cAAc,EAAE,IAAI,WAAW,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;;;;GAmBA,CAAC;AAEF,OAAO,EACL,8BAA8B,EAC9B,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,uBAAuB,EACvB,wBAAwB,EACxB,iCAAiC,GAClC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycles.d.ts","sourceRoot":"","sources":["../../../../../server/src/history/services/lifecycles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAgB,MAAM,eAAe,CAAC;AA6FxD,QAAA,MAAM,uBAAuB,eAAgB;IAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE;;;CA8GnE,CAAC;AAEF,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
1
+ {"version":3,"file":"lifecycles.d.ts","sourceRoot":"","sources":["../../../../../server/src/history/services/lifecycles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAgB,MAAM,eAAe,CAAC;AA6FxD,QAAA,MAAM,uBAAuB,eAAgB;IAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE;;;CAkHnE,CAAC;AAEF,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
@@ -0,0 +1,7 @@
1
+ /// <reference types="node" />
2
+ import type { GetRecentDocuments } from '../../../../shared/contracts/homepage';
3
+ declare const createHomepageController: () => {
4
+ getRecentDocuments(ctx: import("koa").Context): Promise<GetRecentDocuments.Response>;
5
+ };
6
+ export { createHomepageController };
7
+ //# sourceMappingURL=homepage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"homepage.d.ts","sourceRoot":"","sources":["../../../../../server/src/homepage/controllers/homepage.ts"],"names":[],"mappings":";AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAEhF,QAAA,MAAM,wBAAwB;oDAWK,QAAQ,2BAA2B,CAAC;CAmBtE,CAAC;AAEF,OAAO,EAAE,wBAAwB,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const controllers: Record<string, import("@strapi/types/dist/core").Controller>;
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../server/src/homepage/controllers/index.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW,8DAM0B,CAAC"}
@@ -0,0 +1,16 @@
1
+ declare const _default: {
2
+ routes: {
3
+ homepage: import("@strapi/types/dist/core").Router;
4
+ };
5
+ controllers: Record<string, import("@strapi/types/dist/core").Controller>;
6
+ services: {
7
+ homepage: ({ strapi }: {
8
+ strapi: import("@strapi/types/dist/core").Strapi;
9
+ }) => {
10
+ getRecentlyPublishedDocuments(): Promise<import("../../../shared/contracts/homepage").RecentDocument[]>;
11
+ getRecentlyUpdatedDocuments(): Promise<import("../../../shared/contracts/homepage").RecentDocument[]>;
12
+ };
13
+ };
14
+ };
15
+ export default _default;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/homepage/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAIA,wBAIE"}
@@ -0,0 +1,4 @@
1
+ import type { Plugin } from '@strapi/types';
2
+ declare const homepageRouter: Plugin.LoadedPlugin['routes'][string];
3
+ export { homepageRouter };
4
+ //# sourceMappingURL=homepage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"homepage.d.ts","sourceRoot":"","sources":["../../../../../server/src/homepage/routes/homepage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAI5C,QAAA,MAAM,cAAc,EAAE,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,MAAM,CAazD,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * The routes will be merged with the other Content Manager routers,
3
+ * so we need to avoid conficts in the router name, and to prefix the path for each route.
4
+ */
5
+ export declare const routes: {
6
+ homepage: import("@strapi/types/dist/core").Router;
7
+ };
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../server/src/homepage/routes/index.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,eAAO,MAAM,MAAM;;CAEsB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
2
  import type { Core } from '@strapi/types';
3
- import type { GetRecentDocuments } from '../../../shared/contracts/homepage';
3
+ import type { GetRecentDocuments } from '../../../../shared/contracts/homepage';
4
4
  declare const createHomepageService: ({ strapi }: {
5
5
  strapi: Core.Strapi;
6
6
  }) => {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"homepage.d.ts","sourceRoot":"","sources":["../../../../../server/src/homepage/services/homepage.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,IAAI,EAAmB,MAAM,eAAe,CAAC;AAG3D,OAAO,KAAK,EAAE,kBAAkB,EAAkB,MAAM,uCAAuC,CAAC;AAEhG,QAAA,MAAM,qBAAqB,eAAgB;IAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE;qCAiJvB,QAAQ,2BAA2B,CAAC,MAAM,CAAC,CAAC;mCAoC9C,QAAQ,2BAA2B,CAAC,MAAM,CAAC,CAAC;CA+BpF,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare const services: {
2
+ homepage: ({ strapi }: {
3
+ strapi: import("@strapi/types/dist/core").Strapi;
4
+ }) => {
5
+ getRecentlyPublishedDocuments(): Promise<import("../../../../shared/contracts/homepage").RecentDocument[]>;
6
+ getRecentlyUpdatedDocuments(): Promise<import("../../../../shared/contracts/homepage").RecentDocument[]>;
7
+ };
8
+ };
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../server/src/homepage/services/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,QAAQ;;;;;;;CAEsB,CAAC"}