@strapi/content-manager 5.61.0 → 5.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. package/dist/admin/components/ConfigurationForm/Fields.js +1 -1
  2. package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
  3. package/dist/admin/components/ConfigurationForm/Fields.mjs +3 -3
  4. package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
  5. package/dist/admin/features/I18nSharedFieldsLock.js +54 -0
  6. package/dist/admin/features/I18nSharedFieldsLock.js.map +1 -0
  7. package/dist/admin/features/I18nSharedFieldsLock.mjs +31 -0
  8. package/dist/admin/features/I18nSharedFieldsLock.mjs.map +1 -0
  9. package/dist/admin/history/components/VersionInputRenderer.js +7 -2
  10. package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
  11. package/dist/admin/history/components/VersionInputRenderer.mjs +7 -3
  12. package/dist/admin/history/components/VersionInputRenderer.mjs.map +1 -1
  13. package/dist/admin/hooks/useContentManagerInitData.js +27 -8
  14. package/dist/admin/hooks/useContentManagerInitData.js.map +1 -1
  15. package/dist/admin/hooks/useContentManagerInitData.mjs +29 -10
  16. package/dist/admin/hooks/useContentManagerInitData.mjs.map +1 -1
  17. package/dist/admin/hooks/useDocument.js +11 -13
  18. package/dist/admin/hooks/useDocument.js.map +1 -1
  19. package/dist/admin/hooks/useDocument.mjs +11 -13
  20. package/dist/admin/hooks/useDocument.mjs.map +1 -1
  21. package/dist/admin/hooks/useI18nFieldLock.js +169 -0
  22. package/dist/admin/hooks/useI18nFieldLock.js.map +1 -0
  23. package/dist/admin/hooks/useI18nFieldLock.mjs +140 -0
  24. package/dist/admin/hooks/useI18nFieldLock.mjs.map +1 -0
  25. package/dist/admin/hooks/usePersistentQueryParams.js +16 -3
  26. package/dist/admin/hooks/usePersistentQueryParams.js.map +1 -1
  27. package/dist/admin/hooks/usePersistentQueryParams.mjs +16 -3
  28. package/dist/admin/hooks/usePersistentQueryParams.mjs.map +1 -1
  29. package/dist/admin/index.js +5 -0
  30. package/dist/admin/index.js.map +1 -1
  31. package/dist/admin/index.mjs +2 -0
  32. package/dist/admin/index.mjs.map +1 -1
  33. package/dist/admin/modules/app.js +8 -1
  34. package/dist/admin/modules/app.js.map +1 -1
  35. package/dist/admin/modules/app.mjs +8 -2
  36. package/dist/admin/modules/app.mjs.map +1 -1
  37. package/dist/admin/pages/EditView/EditViewPage.js +129 -127
  38. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  39. package/dist/admin/pages/EditView/EditViewPage.mjs +129 -127
  40. package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
  41. package/dist/admin/pages/EditView/components/DocumentActions.js +11 -4
  42. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  43. package/dist/admin/pages/EditView/components/DocumentActions.mjs +12 -5
  44. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  45. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +31 -21
  46. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
  47. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +32 -22
  48. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
  49. package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.js +98 -0
  50. package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.js.map +1 -0
  51. package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.mjs +96 -0
  52. package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.mjs.map +1 -0
  53. package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.js +1103 -0
  54. package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.js.map +1 -0
  55. package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.mjs +1077 -0
  56. package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.mjs.map +1 -0
  57. package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.js +211 -0
  58. package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.js.map +1 -0
  59. package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.mjs +183 -0
  60. package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.mjs.map +1 -0
  61. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js +84 -41
  62. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js.map +1 -1
  63. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs +86 -43
  64. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs.map +1 -1
  65. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js +86 -20
  66. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
  67. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs +89 -23
  68. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
  69. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +5 -2
  70. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  71. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +5 -2
  72. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
  73. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +142 -22
  74. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  75. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +143 -23
  76. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  77. package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.js +402 -0
  78. package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.js.map +1 -0
  79. package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.mjs +389 -0
  80. package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.mjs.map +1 -0
  81. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +84 -33
  82. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
  83. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +85 -34
  84. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
  85. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js +5 -1
  86. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js.map +1 -1
  87. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs +5 -1
  88. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs.map +1 -1
  89. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +17 -4
  90. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  91. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +18 -5
  92. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  93. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +54 -6
  94. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  95. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +54 -6
  96. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  97. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +11 -9
  98. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  99. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +12 -10
  100. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  101. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +9 -4
  102. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  103. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +9 -4
  104. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  105. package/dist/admin/pages/EditView/components/FormLayout.js +66 -63
  106. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  107. package/dist/admin/pages/EditView/components/FormLayout.mjs +66 -63
  108. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  109. package/dist/admin/pages/EditView/components/InputRenderer.js +7 -1
  110. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  111. package/dist/admin/pages/EditView/components/InputRenderer.mjs +7 -1
  112. package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
  113. package/dist/admin/pages/EditView/utils/data.js +14 -9
  114. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  115. package/dist/admin/pages/EditView/utils/data.mjs +14 -9
  116. package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
  117. package/dist/admin/pages/EditView/utils/forms.js +34 -0
  118. package/dist/admin/pages/EditView/utils/forms.js.map +1 -1
  119. package/dist/admin/pages/EditView/utils/forms.mjs +34 -1
  120. package/dist/admin/pages/EditView/utils/forms.mjs.map +1 -1
  121. package/dist/admin/pages/ListConfiguration/components/DraggableCard.js +2 -1
  122. package/dist/admin/pages/ListConfiguration/components/DraggableCard.js.map +1 -1
  123. package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs +2 -1
  124. package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs.map +1 -1
  125. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js +7 -6
  126. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js.map +1 -1
  127. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs +7 -6
  128. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs.map +1 -1
  129. package/dist/admin/pages/ListView/ListViewPage.js +11 -2
  130. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  131. package/dist/admin/pages/ListView/ListViewPage.mjs +13 -4
  132. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  133. package/dist/admin/pages/ListView/components/Filters.js +15 -5
  134. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  135. package/dist/admin/pages/ListView/components/Filters.mjs +16 -7
  136. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
  137. package/dist/admin/preview/components/InputPopover.js +18 -8
  138. package/dist/admin/preview/components/InputPopover.js.map +1 -1
  139. package/dist/admin/preview/components/InputPopover.mjs +19 -9
  140. package/dist/admin/preview/components/InputPopover.mjs.map +1 -1
  141. package/dist/admin/preview/pages/Preview.js +5 -16
  142. package/dist/admin/preview/pages/Preview.js.map +1 -1
  143. package/dist/admin/preview/pages/Preview.mjs +5 -16
  144. package/dist/admin/preview/pages/Preview.mjs.map +1 -1
  145. package/dist/admin/preview/utils/fieldUtils.js +2 -0
  146. package/dist/admin/preview/utils/fieldUtils.js.map +1 -1
  147. package/dist/admin/preview/utils/fieldUtils.mjs +2 -1
  148. package/dist/admin/preview/utils/fieldUtils.mjs.map +1 -1
  149. package/dist/admin/services/api.js +2 -1
  150. package/dist/admin/services/api.js.map +1 -1
  151. package/dist/admin/services/api.mjs +2 -1
  152. package/dist/admin/services/api.mjs.map +1 -1
  153. package/dist/admin/services/documents.js +21 -1
  154. package/dist/admin/services/documents.js.map +1 -1
  155. package/dist/admin/services/documents.mjs +21 -2
  156. package/dist/admin/services/documents.mjs.map +1 -1
  157. package/dist/admin/services/relations.js +47 -1
  158. package/dist/admin/services/relations.js.map +1 -1
  159. package/dist/admin/services/relations.mjs +47 -2
  160. package/dist/admin/services/relations.mjs.map +1 -1
  161. package/dist/admin/src/exports.d.ts +2 -0
  162. package/dist/admin/src/features/I18nSharedFieldsLock.d.ts +22 -0
  163. package/dist/admin/src/history/components/VersionInputRenderer.d.ts +7 -1
  164. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  165. package/dist/admin/src/hooks/useI18nFieldLock.d.ts +61 -0
  166. package/dist/admin/src/modules/app.d.ts +4 -1
  167. package/dist/admin/src/pages/EditView/components/FormInputs/Component/AddComponentMenu.d.ts +15 -0
  168. package/dist/admin/src/pages/EditView/components/FormInputs/Component/ComponentCopyModal.d.ts +58 -0
  169. package/dist/admin/src/pages/EditView/components/FormInputs/Component/CopiedComponents.d.ts +41 -0
  170. package/dist/admin/src/pages/EditView/components/FormInputs/Component/Initializer.d.ts +7 -3
  171. package/dist/admin/src/pages/EditView/components/FormInputs/Component/NonRepeatable.d.ts +1 -1
  172. package/dist/admin/src/pages/EditView/components/FormInputs/Component/Repeatable.d.ts +2 -2
  173. package/dist/admin/src/pages/EditView/components/FormInputs/Component/utils/componentCopy.d.ts +115 -0
  174. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.d.ts +6 -3
  175. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.d.ts +2 -1
  176. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +5 -1
  177. package/dist/admin/src/pages/EditView/utils/forms.d.ts +13 -2
  178. package/dist/admin/src/pages/ListView/components/Filters.d.ts +12 -3
  179. package/dist/admin/src/preview/services/preview.d.ts +1 -1
  180. package/dist/admin/src/preview/utils/fieldUtils.d.ts +1 -0
  181. package/dist/admin/src/services/api.d.ts +1 -1
  182. package/dist/admin/src/services/components.d.ts +2 -2
  183. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  184. package/dist/admin/src/services/documents.d.ts +25 -21
  185. package/dist/admin/src/services/homepage.d.ts +1 -1
  186. package/dist/admin/src/services/init.d.ts +1 -1
  187. package/dist/admin/src/services/relations.d.ts +5 -3
  188. package/dist/admin/src/services/uid.d.ts +3 -3
  189. package/dist/admin/translations/en.json.js +41 -0
  190. package/dist/admin/translations/en.json.js.map +1 -1
  191. package/dist/admin/translations/en.json.mjs +41 -0
  192. package/dist/admin/translations/en.json.mjs.map +1 -1
  193. package/dist/server/controllers/relations.js +4 -2
  194. package/dist/server/controllers/relations.js.map +1 -1
  195. package/dist/server/controllers/relations.mjs +4 -2
  196. package/dist/server/controllers/relations.mjs.map +1 -1
  197. package/dist/server/controllers/utils/metadata.js +3 -1
  198. package/dist/server/controllers/utils/metadata.js.map +1 -1
  199. package/dist/server/controllers/utils/metadata.mjs +3 -1
  200. package/dist/server/controllers/utils/metadata.mjs.map +1 -1
  201. package/dist/server/history/services/utils.js +3 -1
  202. package/dist/server/history/services/utils.js.map +1 -1
  203. package/dist/server/history/services/utils.mjs +3 -1
  204. package/dist/server/history/services/utils.mjs.map +1 -1
  205. package/dist/server/homepage/services/homepage-query-utils.js +14 -0
  206. package/dist/server/homepage/services/homepage-query-utils.js.map +1 -1
  207. package/dist/server/homepage/services/homepage-query-utils.mjs +14 -1
  208. package/dist/server/homepage/services/homepage-query-utils.mjs.map +1 -1
  209. package/dist/server/homepage/services/homepage.js +1 -1
  210. package/dist/server/homepage/services/homepage.js.map +1 -1
  211. package/dist/server/homepage/services/homepage.mjs +2 -2
  212. package/dist/server/homepage/services/homepage.mjs.map +1 -1
  213. package/dist/server/mcp/sanitizers/shape-relations.js +1 -3
  214. package/dist/server/mcp/sanitizers/shape-relations.js.map +1 -1
  215. package/dist/server/mcp/sanitizers/shape-relations.mjs +1 -3
  216. package/dist/server/mcp/sanitizers/shape-relations.mjs.map +1 -1
  217. package/dist/server/mcp/schemas/output-schemas.js +2 -1
  218. package/dist/server/mcp/schemas/output-schemas.js.map +1 -1
  219. package/dist/server/mcp/schemas/output-schemas.mjs +2 -1
  220. package/dist/server/mcp/schemas/output-schemas.mjs.map +1 -1
  221. package/dist/server/services/document-manager.js +3 -2
  222. package/dist/server/services/document-manager.js.map +1 -1
  223. package/dist/server/services/document-manager.mjs +3 -2
  224. package/dist/server/services/document-manager.mjs.map +1 -1
  225. package/dist/server/services/document-metadata.js +92 -4
  226. package/dist/server/services/document-metadata.js.map +1 -1
  227. package/dist/server/services/document-metadata.mjs +92 -4
  228. package/dist/server/services/document-metadata.mjs.map +1 -1
  229. package/dist/server/services/permission-checker.js +20 -8
  230. package/dist/server/services/permission-checker.js.map +1 -1
  231. package/dist/server/services/permission-checker.mjs +20 -8
  232. package/dist/server/services/permission-checker.mjs.map +1 -1
  233. package/dist/server/services/uid.js +2 -1
  234. package/dist/server/services/uid.js.map +1 -1
  235. package/dist/server/services/uid.mjs +2 -1
  236. package/dist/server/services/uid.mjs.map +1 -1
  237. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  238. package/dist/server/src/controllers/utils/metadata.d.ts +1 -0
  239. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  240. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  241. package/dist/server/src/homepage/services/homepage-query-utils.d.ts +6 -0
  242. package/dist/server/src/homepage/services/homepage-query-utils.d.ts.map +1 -1
  243. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
  244. package/dist/server/src/index.d.ts +21 -7
  245. package/dist/server/src/index.d.ts.map +1 -1
  246. package/dist/server/src/mcp/sanitizers/shape-relations.d.ts.map +1 -1
  247. package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -1
  248. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  249. package/dist/server/src/services/document-metadata.d.ts +5 -1
  250. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  251. package/dist/server/src/services/index.d.ts +21 -7
  252. package/dist/server/src/services/index.d.ts.map +1 -1
  253. package/dist/server/src/services/permission-checker.d.ts +6 -5
  254. package/dist/server/src/services/permission-checker.d.ts.map +1 -1
  255. package/dist/server/src/services/uid.d.ts.map +1 -1
  256. package/dist/shared/contracts/collection-types.d.ts +7 -0
  257. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  258. package/dist/shared/contracts/single-types.d.ts +4 -0
  259. package/dist/shared/contracts/single-types.d.ts.map +1 -1
  260. package/package.json +9 -9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CopiedComponents.mjs","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/Component/CopiedComponents.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { createContext, useField, useForm } from '@strapi/admin/strapi-admin';\nimport { generateNKeysBetween } from 'fractional-indexing';\nimport toPath from 'lodash/toPath';\n\nimport { getIn, isInteger, isObject } from '../../../../../utils/objects';\n\nimport type { AnyData } from '../../../utils/data';\n\n/* -------------------------------------------------------------------------------------------------\n * Key paths\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * A component is identified by the temp keys of the rows leading to it, not by their indexes:\n * `blocks.[a1].dishes.[a0]`. Rows keep their key when they're reordered, so the identity survives\n * a move, and it's gone with the row when the row is deleted.\n */\nconst KEY_SEGMENT = /^\\[(.+)\\]$/;\n\nconst getTempKey = (row: unknown): string | undefined =>\n isObject(row) && typeof row.__temp_key__ === 'string' ? row.__temp_key__ : undefined;\n\n/**\n * @description Turns the name of a field into its key path: `blocks.1.dishes` becomes\n * `blocks.[a1].dishes`, `a1` being the temp key of the second block.\n */\nconst getFieldKeyPath = (values: unknown, name: string): string => {\n const segments = toPath(name);\n\n return segments\n .map((segment, position) => {\n if (!isInteger(segment)) {\n return segment;\n }\n\n const key = getTempKey(getIn(values, segments.slice(0, position + 1)));\n\n return `[${key ?? segment}]`;\n })\n .join('.');\n};\n\nconst getComponentKeyPath = (fieldKeyPath: string, tempKey: string) =>\n `${fieldKeyPath}.[${tempKey}]`;\n\n/**\n * @description Returns the component at the given key path, if the form still holds it.\n */\nconst getComponentAt = (values: unknown, keyPath: string): unknown => {\n let current: unknown = values;\n\n for (const segment of keyPath.split('.')) {\n const keyMatch = KEY_SEGMENT.exec(segment);\n\n if (keyMatch) {\n current = Array.isArray(current)\n ? current.find((row) => getTempKey(row) === keyMatch[1])\n : undefined;\n } else {\n current = isObject(current) ? current[segment] : undefined;\n }\n\n if (current === undefined || current === null) {\n return undefined;\n }\n }\n\n return current;\n};\n\n/**\n * @description Tells whether the form still holds the component at the given key path.\n */\nconst hasComponentAt = (values: unknown, keyPath: string): boolean =>\n getComponentAt(values, keyPath) !== undefined;\n\n/* -------------------------------------------------------------------------------------------------\n * Copy marker\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * Set on the components put in the form by a copy. Key paths aren't enough to recognise them:\n * \"Fill in from another locale\" replaces the values with rows that reuse the same temp keys\n * (`a0`, `a1`…), so a copy's key path can point to a component that wasn't copied. Editing a field\n * clones the objects on its path with `lodash/clone`, which keeps symbol keys, while values that\n * replace the component don't carry the marker. Symbol keys aren't serialised, so the marker never\n * reaches the API.\n */\nconst COPIED = Symbol('copied');\n\nconst withCopyMarker = (item: AnyData): AnyData => ({ ...item, [COPIED]: true });\n\n/**\n * @description Tells whether the form still holds, at the given key path, the component that was\n * copied there.\n */\nconst hasCopyAt = (values: unknown, keyPath: string): boolean => {\n const component = getComponentAt(values, keyPath);\n\n return isObject(component) && (component as Record<symbol, unknown>)[COPIED] === true;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * CopiedComponentsProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface CopiedComponentsContextValue {\n /**\n * The key paths of the components copied from another entry since the form was last saved.\n */\n copiedPaths: string[];\n markCopied: (keyPaths: string[]) => void;\n}\n\nconst [CopiedComponentsContextProvider, useCopiedComponentsContext] =\n createContext<CopiedComponentsContextValue>('CopiedComponents');\n\ninterface CopiedComponentsProviderProps {\n children: React.ReactNode;\n}\n\n/**\n * Remembers which components of the form were copied from another entry, so that they can be\n * flagged until the entry is saved. The state lives above the fields: a field nested in a block\n * is unmounted when the block collapses and would lose it otherwise. Must be rendered in a `Form`.\n */\nconst CopiedComponentsProvider = ({ children }: CopiedComponentsProviderProps) => {\n const [copiedPaths, setCopiedPaths] = React.useState<string[]>([]);\n const values = useForm('CopiedComponentsProvider', (state) => state.values);\n const isFormModified = useForm('CopiedComponentsProvider', (state) => state.modified);\n\n // Saving the entry, or undoing every change, clears the flags.\n React.useEffect(() => {\n if (!isFormModified) {\n setCopiedPaths((paths) => (paths.length > 0 ? [] : paths));\n }\n }, [isFormModified]);\n\n // A copied component that's removed or replaced (e.g. by \"Fill in from another locale\") drops its\n // flag, so that a component put at the same key path can't inherit it.\n React.useEffect(() => {\n setCopiedPaths((paths) => {\n const kept = paths.filter((path) => hasCopyAt(values, path));\n\n return kept.length === paths.length ? paths : kept;\n });\n }, [values]);\n\n const markCopied = React.useCallback((keyPaths: string[]) => {\n setCopiedPaths((paths) => {\n const added = keyPaths.filter((keyPath) => !paths.includes(keyPath));\n\n return added.length > 0 ? [...paths, ...added] : paths;\n });\n }, []);\n\n return (\n <CopiedComponentsContextProvider copiedPaths={copiedPaths} markCopied={markCopied}>\n {children}\n </CopiedComponentsContextProvider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useCopiedComponents\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @description Inserts copied components in a repeatable component or a dynamic zone field and\n * tells which of its rows are copies. Without a `CopiedComponentsProvider` the copies are still\n * inserted, they're just not flagged.\n */\nconst useCopiedComponents = (name: string) => {\n const copiedPaths = useCopiedComponentsContext(\n 'useCopiedComponents',\n (state) => state.copiedPaths,\n false\n );\n const markCopied = useCopiedComponentsContext(\n 'useCopiedComponents',\n (state) => state.markCopied,\n false\n );\n const { value, onChange } = useField<AnyData[] | null>(name);\n const fieldKeyPath = useForm('useCopiedComponents', (state) =>\n getFieldKeyPath(state.values, name)\n );\n\n const isCopied = React.useCallback(\n (tempKey: string) => copiedPaths?.includes(getComponentKeyPath(fieldKeyPath, tempKey)) ?? false,\n [copiedPaths, fieldKeyPath]\n );\n\n /**\n * The rows are added with their keys already set, so the copies are flagged by key rather than\n * recognised among the rows that appear next.\n */\n const insertCopies = React.useCallback(\n (items: AnyData[]) => {\n const rows = Array.isArray(value) ? value : [];\n const lastKey =\n rows\n .map(getTempKey)\n .filter((key): key is string => key !== undefined && key !== '')\n .sort()\n .pop() ?? null;\n const keys = generateNKeysBetween(lastKey, null, items.length);\n\n onChange(name, [\n ...rows,\n ...items.map((item, index) => withCopyMarker({ ...item, __temp_key__: keys[index] })),\n ]);\n markCopied?.(keys.map((key) => getComponentKeyPath(fieldKeyPath, key)));\n },\n [fieldKeyPath, markCopied, name, onChange, value]\n );\n\n return { isCopied, insertCopies };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useCopiedComponent\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @description Puts a copied component in a non-repeatable component field and tells whether the\n * field holds a copy. The flag is set on the field itself: resetting the field drops it, so a\n * component added afterwards isn't flagged. Without a `CopiedComponentsProvider` the copy is still\n * put in place, it's just not flagged.\n */\nconst useCopiedComponent = (name: string) => {\n const copiedPaths = useCopiedComponentsContext(\n 'useCopiedComponent',\n (state) => state.copiedPaths,\n false\n );\n const markCopied = useCopiedComponentsContext(\n 'useCopiedComponent',\n (state) => state.markCopied,\n false\n );\n const { onChange } = useField<AnyData | null>(name);\n const fieldKeyPath = useForm('useCopiedComponent', (state) =>\n getFieldKeyPath(state.values, name)\n );\n\n const isCopied = copiedPaths?.includes(fieldKeyPath) ?? false;\n\n const insertCopy = React.useCallback(\n (item: AnyData) => {\n onChange(name, withCopyMarker(item));\n markCopied?.([fieldKeyPath]);\n },\n [fieldKeyPath, markCopied, name, onChange]\n );\n\n return { isCopied, insertCopy };\n};\n\nexport {\n CopiedComponentsProvider,\n useCopiedComponents,\n useCopiedComponent,\n getFieldKeyPath,\n hasComponentAt,\n};\nexport type { CopiedComponentsProviderProps };\n"],"names":["KEY_SEGMENT","getTempKey","row","isObject","__temp_key__","undefined","getFieldKeyPath","values","name","segments","toPath","map","segment","position","isInteger","key","getIn","slice","join","getComponentKeyPath","fieldKeyPath","tempKey","getComponentAt","keyPath","current","split","keyMatch","exec","Array","isArray","find","COPIED","Symbol","withCopyMarker","item","hasCopyAt","component","CopiedComponentsContextProvider","useCopiedComponentsContext","createContext","CopiedComponentsProvider","children","copiedPaths","setCopiedPaths","React","useState","useForm","state","isFormModified","modified","useEffect","paths","length","kept","filter","path","markCopied","useCallback","keyPaths","added","includes","_jsx","useCopiedComponents","value","onChange","useField","isCopied","insertCopies","items","rows","lastKey","sort","pop","keys","generateNKeysBetween","index","useCopiedComponent","insertCopy"],"mappings":"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"}
@@ -6,54 +6,97 @@ var strapiAdmin = require('@strapi/admin/strapi-admin');
6
6
  var designSystem = require('@strapi/design-system');
7
7
  var Icons = require('@strapi/icons');
8
8
  var reactIntl = require('react-intl');
9
+ var styledComponents = require('styled-components');
9
10
  var translations = require('../../../../../utils/translations.js');
11
+ var AddComponentMenu = require('./AddComponentMenu.js');
10
12
 
11
- const Initializer = ({ disabled, name, onClick })=>{
13
+ const Initializer = ({ disabled, name, onClick, onCopyClick })=>{
12
14
  const { formatMessage } = reactIntl.useIntl();
13
15
  const field = strapiAdmin.useField(name);
14
- return /*#__PURE__*/ jsxRuntime.jsx(jsxRuntime.Fragment, {
15
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
16
- tag: "button",
17
- background: disabled ? 'neutral150' : 'neutral100',
18
- borderColor: field.error ? 'danger600' : 'neutral200',
19
- hasRadius: true,
20
- disabled: disabled,
21
- onClick: onClick,
22
- paddingTop: 9,
23
- paddingBottom: 9,
24
- type: "button",
25
- style: {
26
- cursor: disabled ? 'not-allowed' : 'pointer'
27
- },
28
- children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
29
- direction: "column",
30
- gap: 2,
31
- children: [
32
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
33
- justifyContent: "center",
34
- color: disabled ? 'neutral500' : 'primary600',
35
- children: /*#__PURE__*/ jsxRuntime.jsx(Icons.PlusCircle, {
36
- width: "3.2rem",
37
- height: "3.2rem"
38
- })
39
- }),
40
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
41
- justifyContent: "center",
42
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
43
- textColor: disabled ? 'neutral600' : 'primary600',
44
- variant: "pi",
45
- fontWeight: "bold",
46
- children: formatMessage({
47
- id: translations.getTranslation('components.empty-repeatable'),
48
- defaultMessage: 'No entry yet. Click to add one.'
49
- })
50
- })
51
- })
52
- ]
16
+ const content = /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
17
+ tag: "span",
18
+ direction: "column",
19
+ gap: 2,
20
+ alignItems: "center",
21
+ children: [
22
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
23
+ tag: "span",
24
+ justifyContent: "center",
25
+ color: disabled ? 'neutral500' : 'primary600',
26
+ children: /*#__PURE__*/ jsxRuntime.jsx(Icons.PlusCircle, {
27
+ width: "3.2rem",
28
+ height: "3.2rem"
29
+ })
30
+ }),
31
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
32
+ tag: "span",
33
+ textColor: disabled ? 'neutral600' : 'primary600',
34
+ variant: "pi",
35
+ fontWeight: "bold",
36
+ children: formatMessage({
37
+ id: translations.getTranslation('components.empty-repeatable'),
38
+ defaultMessage: 'No entry yet. Click to add one.'
39
+ })
53
40
  })
54
- })
41
+ ]
42
+ });
43
+ if (onCopyClick) {
44
+ return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.Root, {
45
+ children: [
46
+ /*#__PURE__*/ jsxRuntime.jsx(InitializerMenuTrigger, {
47
+ disabled: disabled,
48
+ endIcon: null,
49
+ $hasError: !!field.error,
50
+ children: content
51
+ }),
52
+ /*#__PURE__*/ jsxRuntime.jsx(AddComponentMenu.AddComponentMenuContent, {
53
+ kind: "entry",
54
+ onAddEmpty: ()=>onClick?.(),
55
+ onCopy: onCopyClick
56
+ })
57
+ ]
58
+ });
59
+ }
60
+ return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
61
+ tag: "button",
62
+ background: disabled ? 'neutral150' : 'neutral100',
63
+ borderColor: field.error ? 'danger600' : 'neutral200',
64
+ hasRadius: true,
65
+ disabled: disabled,
66
+ onClick: onClick,
67
+ paddingTop: 9,
68
+ paddingBottom: 9,
69
+ type: "button",
70
+ style: {
71
+ cursor: disabled ? 'not-allowed' : 'pointer'
72
+ },
73
+ children: content
55
74
  });
56
75
  };
76
+ /**
77
+ * The menu trigger is a button of the design system, restyled as the placeholder box.
78
+ */ const InitializerMenuTrigger = styledComponents.styled(designSystem.Menu.Trigger)`
79
+ && {
80
+ width: 100%;
81
+ height: auto;
82
+ padding: ${({ theme })=>theme.spaces[9]} 0;
83
+ border: 1px solid
84
+ ${({ theme, $hasError })=>$hasError ? theme.colors.danger600 : theme.colors.neutral200};
85
+ border-radius: ${({ theme })=>theme.borderRadius};
86
+ background: ${({ theme })=>theme.colors.neutral100};
87
+ }
88
+
89
+ &&:not([disabled]):hover,
90
+ &&[data-state='open'] {
91
+ border-color: ${({ theme })=>theme.colors.primary200};
92
+ background: ${({ theme })=>theme.colors.primary100};
93
+ }
94
+
95
+ &&[disabled] {
96
+ background: ${({ theme })=>theme.colors.neutral150};
97
+ cursor: not-allowed;
98
+ }
99
+ `;
57
100
 
58
101
  exports.Initializer = Initializer;
59
102
  //# sourceMappingURL=Initializer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Initializer.js","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/Component/Initializer.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useField } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { PlusCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTranslation } from '../../../../../utils/translations';\n\ninterface InitializerProps {\n disabled?: boolean;\n name: string;\n onClick?: React.MouseEventHandler<HTMLButtonElement> & React.MouseEventHandler<HTMLDivElement>;\n}\n\nconst Initializer = ({ disabled, name, onClick }: InitializerProps) => {\n const { formatMessage } = useIntl();\n\n const field = useField(name);\n\n return (\n <>\n <Box\n tag=\"button\"\n background={disabled ? 'neutral150' : 'neutral100'}\n borderColor={field.error ? 'danger600' : 'neutral200'}\n hasRadius\n disabled={disabled}\n onClick={onClick}\n paddingTop={9}\n paddingBottom={9}\n type=\"button\"\n style={{ cursor: disabled ? 'not-allowed' : 'pointer' }}\n >\n <Flex direction=\"column\" gap={2}>\n <Flex justifyContent=\"center\" color={disabled ? 'neutral500' : 'primary600'}>\n <PlusCircle width=\"3.2rem\" height=\"3.2rem\" />\n </Flex>\n <Flex justifyContent=\"center\">\n <Typography\n textColor={disabled ? 'neutral600' : 'primary600'}\n variant=\"pi\"\n fontWeight=\"bold\"\n >\n {formatMessage({\n id: getTranslation('components.empty-repeatable'),\n defaultMessage: 'No entry yet. Click to add one.',\n })}\n </Typography>\n </Flex>\n </Flex>\n </Box>\n </>\n );\n};\n\nexport { Initializer };\nexport type { InitializerProps };\n"],"names":["Initializer","disabled","name","onClick","formatMessage","useIntl","field","useField","_jsx","_Fragment","Box","tag","background","borderColor","error","hasRadius","paddingTop","paddingBottom","type","style","cursor","_jsxs","Flex","direction","gap","justifyContent","color","PlusCircle","width","height","Typography","textColor","variant","fontWeight","id","getTranslation","defaultMessage"],"mappings":";;;;;;;;;;AAeA,MAAMA,WAAAA,GAAc,CAAC,EAAEC,QAAQ,EAAEC,IAAI,EAAEC,OAAO,EAAoB,GAAA;IAChE,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAE1B,IAAA,MAAMC,QAAQC,oBAAAA,CAASL,IAAAA,CAAAA;IAEvB,qBACEM,cAAA,CAAAC,mBAAA,EAAA;AACE,QAAA,QAAA,gBAAAD,cAAA,CAACE,gBAAAA,EAAAA;YACCC,GAAAA,EAAI,QAAA;AACJC,YAAAA,UAAAA,EAAYX,WAAW,YAAA,GAAe,YAAA;YACtCY,WAAAA,EAAaP,KAAAA,CAAMQ,KAAK,GAAG,WAAA,GAAc,YAAA;YACzCC,SAAS,EAAA,IAAA;YACTd,QAAAA,EAAUA,QAAAA;YACVE,OAAAA,EAASA,OAAAA;YACTa,UAAAA,EAAY,CAAA;YACZC,aAAAA,EAAe,CAAA;YACfC,IAAAA,EAAK,QAAA;YACLC,KAAAA,EAAO;AAAEC,gBAAAA,MAAAA,EAAQnB,WAAW,aAAA,GAAgB;AAAU,aAAA;AAEtD,YAAA,QAAA,gBAAAoB,eAAA,CAACC,iBAAAA,EAAAA;gBAAKC,SAAAA,EAAU,QAAA;gBAASC,GAAAA,EAAK,CAAA;;kCAC5BhB,cAAA,CAACc,iBAAAA,EAAAA;wBAAKG,cAAAA,EAAe,QAAA;AAASC,wBAAAA,KAAAA,EAAOzB,WAAW,YAAA,GAAe,YAAA;AAC7D,wBAAA,QAAA,gBAAAO,cAAA,CAACmB,gBAAAA,EAAAA;4BAAWC,KAAAA,EAAM,QAAA;4BAASC,MAAAA,EAAO;;;kCAEpCrB,cAAA,CAACc,iBAAAA,EAAAA;wBAAKG,cAAAA,EAAe,QAAA;AACnB,wBAAA,QAAA,gBAAAjB,cAAA,CAACsB,uBAAAA,EAAAA;AACCC,4BAAAA,SAAAA,EAAW9B,WAAW,YAAA,GAAe,YAAA;4BACrC+B,OAAAA,EAAQ,IAAA;4BACRC,UAAAA,EAAW,MAAA;sCAEV7B,aAAAA,CAAc;AACb8B,gCAAAA,EAAAA,EAAIC,2BAAAA,CAAe,6BAAA,CAAA;gCACnBC,cAAAA,EAAgB;AAClB,6BAAA;;;;;;;AAOd;;;;"}
1
+ {"version":3,"file":"Initializer.js","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/Component/Initializer.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useField } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, Menu, Typography } from '@strapi/design-system';\nimport { PlusCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslation } from '../../../../../utils/translations';\n\nimport { AddComponentMenuContent } from './AddComponentMenu';\n\ninterface InitializerProps {\n disabled?: boolean;\n name: string;\n onClick?: () => void;\n /**\n * When set, clicking the placeholder offers to start with an empty component or to copy\n * existing content, instead of adding an empty component right away.\n */\n onCopyClick?: () => void;\n}\n\nconst Initializer = ({ disabled, name, onClick, onCopyClick }: InitializerProps) => {\n const { formatMessage } = useIntl();\n\n const field = useField(name);\n\n const content = (\n <Flex tag=\"span\" direction=\"column\" gap={2} alignItems=\"center\">\n <Flex tag=\"span\" justifyContent=\"center\" color={disabled ? 'neutral500' : 'primary600'}>\n <PlusCircle width=\"3.2rem\" height=\"3.2rem\" />\n </Flex>\n <Typography\n tag=\"span\"\n textColor={disabled ? 'neutral600' : 'primary600'}\n variant=\"pi\"\n fontWeight=\"bold\"\n >\n {formatMessage({\n id: getTranslation('components.empty-repeatable'),\n defaultMessage: 'No entry yet. Click to add one.',\n })}\n </Typography>\n </Flex>\n );\n\n if (onCopyClick) {\n return (\n <Menu.Root>\n <InitializerMenuTrigger disabled={disabled} endIcon={null} $hasError={!!field.error}>\n {content}\n </InitializerMenuTrigger>\n <AddComponentMenuContent kind=\"entry\" onAddEmpty={() => onClick?.()} onCopy={onCopyClick} />\n </Menu.Root>\n );\n }\n\n return (\n <Box\n tag=\"button\"\n background={disabled ? 'neutral150' : 'neutral100'}\n borderColor={field.error ? 'danger600' : 'neutral200'}\n hasRadius\n disabled={disabled}\n onClick={onClick}\n paddingTop={9}\n paddingBottom={9}\n type=\"button\"\n style={{ cursor: disabled ? 'not-allowed' : 'pointer' }}\n >\n {content}\n </Box>\n );\n};\n\n/**\n * The menu trigger is a button of the design system, restyled as the placeholder box.\n */\nconst InitializerMenuTrigger = styled(Menu.Trigger)<{ $hasError?: boolean }>`\n && {\n width: 100%;\n height: auto;\n padding: ${({ theme }) => theme.spaces[9]} 0;\n border: 1px solid\n ${({ theme, $hasError }) => ($hasError ? theme.colors.danger600 : theme.colors.neutral200)};\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => theme.colors.neutral100};\n }\n\n &&:not([disabled]):hover,\n &&[data-state='open'] {\n border-color: ${({ theme }) => theme.colors.primary200};\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &&[disabled] {\n background: ${({ theme }) => theme.colors.neutral150};\n cursor: not-allowed;\n }\n`;\n\nexport { Initializer };\nexport type { InitializerProps };\n"],"names":["Initializer","disabled","name","onClick","onCopyClick","formatMessage","useIntl","field","useField","content","_jsxs","Flex","tag","direction","gap","alignItems","_jsx","justifyContent","color","PlusCircle","width","height","Typography","textColor","variant","fontWeight","id","getTranslation","defaultMessage","Menu","Root","InitializerMenuTrigger","endIcon","$hasError","error","AddComponentMenuContent","kind","onAddEmpty","onCopy","Box","background","borderColor","hasRadius","paddingTop","paddingBottom","type","style","cursor","styled","Trigger","theme","spaces","colors","danger600","neutral200","borderRadius","neutral100","primary200","primary100","neutral150"],"mappings":"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"}
@@ -1,57 +1,100 @@
1
- import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import 'react';
3
3
  import { useField } from '@strapi/admin/strapi-admin';
4
- import { Box, Flex, Typography } from '@strapi/design-system';
4
+ import { Menu, Flex, Typography, Box } from '@strapi/design-system';
5
5
  import { PlusCircle } from '@strapi/icons';
6
6
  import { useIntl } from 'react-intl';
7
+ import { styled } from 'styled-components';
7
8
  import { getTranslation } from '../../../../../utils/translations.mjs';
9
+ import { AddComponentMenuContent } from './AddComponentMenu.mjs';
8
10
 
9
- const Initializer = ({ disabled, name, onClick })=>{
11
+ const Initializer = ({ disabled, name, onClick, onCopyClick })=>{
10
12
  const { formatMessage } = useIntl();
11
13
  const field = useField(name);
12
- return /*#__PURE__*/ jsx(Fragment, {
13
- children: /*#__PURE__*/ jsx(Box, {
14
- tag: "button",
15
- background: disabled ? 'neutral150' : 'neutral100',
16
- borderColor: field.error ? 'danger600' : 'neutral200',
17
- hasRadius: true,
18
- disabled: disabled,
19
- onClick: onClick,
20
- paddingTop: 9,
21
- paddingBottom: 9,
22
- type: "button",
23
- style: {
24
- cursor: disabled ? 'not-allowed' : 'pointer'
25
- },
26
- children: /*#__PURE__*/ jsxs(Flex, {
27
- direction: "column",
28
- gap: 2,
29
- children: [
30
- /*#__PURE__*/ jsx(Flex, {
31
- justifyContent: "center",
32
- color: disabled ? 'neutral500' : 'primary600',
33
- children: /*#__PURE__*/ jsx(PlusCircle, {
34
- width: "3.2rem",
35
- height: "3.2rem"
36
- })
37
- }),
38
- /*#__PURE__*/ jsx(Flex, {
39
- justifyContent: "center",
40
- children: /*#__PURE__*/ jsx(Typography, {
41
- textColor: disabled ? 'neutral600' : 'primary600',
42
- variant: "pi",
43
- fontWeight: "bold",
44
- children: formatMessage({
45
- id: getTranslation('components.empty-repeatable'),
46
- defaultMessage: 'No entry yet. Click to add one.'
47
- })
48
- })
49
- })
50
- ]
14
+ const content = /*#__PURE__*/ jsxs(Flex, {
15
+ tag: "span",
16
+ direction: "column",
17
+ gap: 2,
18
+ alignItems: "center",
19
+ children: [
20
+ /*#__PURE__*/ jsx(Flex, {
21
+ tag: "span",
22
+ justifyContent: "center",
23
+ color: disabled ? 'neutral500' : 'primary600',
24
+ children: /*#__PURE__*/ jsx(PlusCircle, {
25
+ width: "3.2rem",
26
+ height: "3.2rem"
27
+ })
28
+ }),
29
+ /*#__PURE__*/ jsx(Typography, {
30
+ tag: "span",
31
+ textColor: disabled ? 'neutral600' : 'primary600',
32
+ variant: "pi",
33
+ fontWeight: "bold",
34
+ children: formatMessage({
35
+ id: getTranslation('components.empty-repeatable'),
36
+ defaultMessage: 'No entry yet. Click to add one.'
37
+ })
51
38
  })
52
- })
39
+ ]
40
+ });
41
+ if (onCopyClick) {
42
+ return /*#__PURE__*/ jsxs(Menu.Root, {
43
+ children: [
44
+ /*#__PURE__*/ jsx(InitializerMenuTrigger, {
45
+ disabled: disabled,
46
+ endIcon: null,
47
+ $hasError: !!field.error,
48
+ children: content
49
+ }),
50
+ /*#__PURE__*/ jsx(AddComponentMenuContent, {
51
+ kind: "entry",
52
+ onAddEmpty: ()=>onClick?.(),
53
+ onCopy: onCopyClick
54
+ })
55
+ ]
56
+ });
57
+ }
58
+ return /*#__PURE__*/ jsx(Box, {
59
+ tag: "button",
60
+ background: disabled ? 'neutral150' : 'neutral100',
61
+ borderColor: field.error ? 'danger600' : 'neutral200',
62
+ hasRadius: true,
63
+ disabled: disabled,
64
+ onClick: onClick,
65
+ paddingTop: 9,
66
+ paddingBottom: 9,
67
+ type: "button",
68
+ style: {
69
+ cursor: disabled ? 'not-allowed' : 'pointer'
70
+ },
71
+ children: content
53
72
  });
54
73
  };
74
+ /**
75
+ * The menu trigger is a button of the design system, restyled as the placeholder box.
76
+ */ const InitializerMenuTrigger = styled(Menu.Trigger)`
77
+ && {
78
+ width: 100%;
79
+ height: auto;
80
+ padding: ${({ theme })=>theme.spaces[9]} 0;
81
+ border: 1px solid
82
+ ${({ theme, $hasError })=>$hasError ? theme.colors.danger600 : theme.colors.neutral200};
83
+ border-radius: ${({ theme })=>theme.borderRadius};
84
+ background: ${({ theme })=>theme.colors.neutral100};
85
+ }
86
+
87
+ &&:not([disabled]):hover,
88
+ &&[data-state='open'] {
89
+ border-color: ${({ theme })=>theme.colors.primary200};
90
+ background: ${({ theme })=>theme.colors.primary100};
91
+ }
92
+
93
+ &&[disabled] {
94
+ background: ${({ theme })=>theme.colors.neutral150};
95
+ cursor: not-allowed;
96
+ }
97
+ `;
55
98
 
56
99
  export { Initializer };
57
100
  //# sourceMappingURL=Initializer.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Initializer.mjs","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/Component/Initializer.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useField } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { PlusCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTranslation } from '../../../../../utils/translations';\n\ninterface InitializerProps {\n disabled?: boolean;\n name: string;\n onClick?: React.MouseEventHandler<HTMLButtonElement> & React.MouseEventHandler<HTMLDivElement>;\n}\n\nconst Initializer = ({ disabled, name, onClick }: InitializerProps) => {\n const { formatMessage } = useIntl();\n\n const field = useField(name);\n\n return (\n <>\n <Box\n tag=\"button\"\n background={disabled ? 'neutral150' : 'neutral100'}\n borderColor={field.error ? 'danger600' : 'neutral200'}\n hasRadius\n disabled={disabled}\n onClick={onClick}\n paddingTop={9}\n paddingBottom={9}\n type=\"button\"\n style={{ cursor: disabled ? 'not-allowed' : 'pointer' }}\n >\n <Flex direction=\"column\" gap={2}>\n <Flex justifyContent=\"center\" color={disabled ? 'neutral500' : 'primary600'}>\n <PlusCircle width=\"3.2rem\" height=\"3.2rem\" />\n </Flex>\n <Flex justifyContent=\"center\">\n <Typography\n textColor={disabled ? 'neutral600' : 'primary600'}\n variant=\"pi\"\n fontWeight=\"bold\"\n >\n {formatMessage({\n id: getTranslation('components.empty-repeatable'),\n defaultMessage: 'No entry yet. Click to add one.',\n })}\n </Typography>\n </Flex>\n </Flex>\n </Box>\n </>\n );\n};\n\nexport { Initializer };\nexport type { InitializerProps };\n"],"names":["Initializer","disabled","name","onClick","formatMessage","useIntl","field","useField","_jsx","_Fragment","Box","tag","background","borderColor","error","hasRadius","paddingTop","paddingBottom","type","style","cursor","_jsxs","Flex","direction","gap","justifyContent","color","PlusCircle","width","height","Typography","textColor","variant","fontWeight","id","getTranslation","defaultMessage"],"mappings":";;;;;;;;AAeA,MAAMA,WAAAA,GAAc,CAAC,EAAEC,QAAQ,EAAEC,IAAI,EAAEC,OAAO,EAAoB,GAAA;IAChE,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAE1B,IAAA,MAAMC,QAAQC,QAAAA,CAASL,IAAAA,CAAAA;IAEvB,qBACEM,GAAA,CAAAC,QAAA,EAAA;AACE,QAAA,QAAA,gBAAAD,GAAA,CAACE,GAAAA,EAAAA;YACCC,GAAAA,EAAI,QAAA;AACJC,YAAAA,UAAAA,EAAYX,WAAW,YAAA,GAAe,YAAA;YACtCY,WAAAA,EAAaP,KAAAA,CAAMQ,KAAK,GAAG,WAAA,GAAc,YAAA;YACzCC,SAAS,EAAA,IAAA;YACTd,QAAAA,EAAUA,QAAAA;YACVE,OAAAA,EAASA,OAAAA;YACTa,UAAAA,EAAY,CAAA;YACZC,aAAAA,EAAe,CAAA;YACfC,IAAAA,EAAK,QAAA;YACLC,KAAAA,EAAO;AAAEC,gBAAAA,MAAAA,EAAQnB,WAAW,aAAA,GAAgB;AAAU,aAAA;AAEtD,YAAA,QAAA,gBAAAoB,IAAA,CAACC,IAAAA,EAAAA;gBAAKC,SAAAA,EAAU,QAAA;gBAASC,GAAAA,EAAK,CAAA;;kCAC5BhB,GAAA,CAACc,IAAAA,EAAAA;wBAAKG,cAAAA,EAAe,QAAA;AAASC,wBAAAA,KAAAA,EAAOzB,WAAW,YAAA,GAAe,YAAA;AAC7D,wBAAA,QAAA,gBAAAO,GAAA,CAACmB,UAAAA,EAAAA;4BAAWC,KAAAA,EAAM,QAAA;4BAASC,MAAAA,EAAO;;;kCAEpCrB,GAAA,CAACc,IAAAA,EAAAA;wBAAKG,cAAAA,EAAe,QAAA;AACnB,wBAAA,QAAA,gBAAAjB,GAAA,CAACsB,UAAAA,EAAAA;AACCC,4BAAAA,SAAAA,EAAW9B,WAAW,YAAA,GAAe,YAAA;4BACrC+B,OAAAA,EAAQ,IAAA;4BACRC,UAAAA,EAAW,MAAA;sCAEV7B,aAAAA,CAAc;AACb8B,gCAAAA,EAAAA,EAAIC,cAAAA,CAAe,6BAAA,CAAA;gCACnBC,cAAAA,EAAgB;AAClB,6BAAA;;;;;;;AAOd;;;;"}
1
+ {"version":3,"file":"Initializer.mjs","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/Component/Initializer.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useField } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, Menu, Typography } from '@strapi/design-system';\nimport { PlusCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslation } from '../../../../../utils/translations';\n\nimport { AddComponentMenuContent } from './AddComponentMenu';\n\ninterface InitializerProps {\n disabled?: boolean;\n name: string;\n onClick?: () => void;\n /**\n * When set, clicking the placeholder offers to start with an empty component or to copy\n * existing content, instead of adding an empty component right away.\n */\n onCopyClick?: () => void;\n}\n\nconst Initializer = ({ disabled, name, onClick, onCopyClick }: InitializerProps) => {\n const { formatMessage } = useIntl();\n\n const field = useField(name);\n\n const content = (\n <Flex tag=\"span\" direction=\"column\" gap={2} alignItems=\"center\">\n <Flex tag=\"span\" justifyContent=\"center\" color={disabled ? 'neutral500' : 'primary600'}>\n <PlusCircle width=\"3.2rem\" height=\"3.2rem\" />\n </Flex>\n <Typography\n tag=\"span\"\n textColor={disabled ? 'neutral600' : 'primary600'}\n variant=\"pi\"\n fontWeight=\"bold\"\n >\n {formatMessage({\n id: getTranslation('components.empty-repeatable'),\n defaultMessage: 'No entry yet. Click to add one.',\n })}\n </Typography>\n </Flex>\n );\n\n if (onCopyClick) {\n return (\n <Menu.Root>\n <InitializerMenuTrigger disabled={disabled} endIcon={null} $hasError={!!field.error}>\n {content}\n </InitializerMenuTrigger>\n <AddComponentMenuContent kind=\"entry\" onAddEmpty={() => onClick?.()} onCopy={onCopyClick} />\n </Menu.Root>\n );\n }\n\n return (\n <Box\n tag=\"button\"\n background={disabled ? 'neutral150' : 'neutral100'}\n borderColor={field.error ? 'danger600' : 'neutral200'}\n hasRadius\n disabled={disabled}\n onClick={onClick}\n paddingTop={9}\n paddingBottom={9}\n type=\"button\"\n style={{ cursor: disabled ? 'not-allowed' : 'pointer' }}\n >\n {content}\n </Box>\n );\n};\n\n/**\n * The menu trigger is a button of the design system, restyled as the placeholder box.\n */\nconst InitializerMenuTrigger = styled(Menu.Trigger)<{ $hasError?: boolean }>`\n && {\n width: 100%;\n height: auto;\n padding: ${({ theme }) => theme.spaces[9]} 0;\n border: 1px solid\n ${({ theme, $hasError }) => ($hasError ? theme.colors.danger600 : theme.colors.neutral200)};\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => theme.colors.neutral100};\n }\n\n &&:not([disabled]):hover,\n &&[data-state='open'] {\n border-color: ${({ theme }) => theme.colors.primary200};\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &&[disabled] {\n background: ${({ theme }) => theme.colors.neutral150};\n cursor: not-allowed;\n }\n`;\n\nexport { Initializer };\nexport type { InitializerProps };\n"],"names":["Initializer","disabled","name","onClick","onCopyClick","formatMessage","useIntl","field","useField","content","_jsxs","Flex","tag","direction","gap","alignItems","_jsx","justifyContent","color","PlusCircle","width","height","Typography","textColor","variant","fontWeight","id","getTranslation","defaultMessage","Menu","Root","InitializerMenuTrigger","endIcon","$hasError","error","AddComponentMenuContent","kind","onAddEmpty","onCopy","Box","background","borderColor","hasRadius","paddingTop","paddingBottom","type","style","cursor","styled","Trigger","theme","spaces","colors","danger600","neutral200","borderRadius","neutral100","primary200","primary100","neutral150"],"mappings":"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"}
@@ -6,13 +6,17 @@ var strapiAdmin = require('@strapi/admin/strapi-admin');
6
6
  var designSystem = require('@strapi/design-system');
7
7
  var Icons = require('@strapi/icons');
8
8
  var reactIntl = require('react-intl');
9
+ var collections = require('../../../../../constants/collections.js');
9
10
  var useDocumentContext = require('../../../../../hooks/useDocumentContext.js');
10
11
  var translations = require('../../../../../utils/translations.js');
11
12
  var data = require('../../../utils/data.js');
12
13
  var forms = require('../../../utils/forms.js');
14
+ var ComponentCopyModal = require('./ComponentCopyModal.js');
15
+ var CopiedComponents = require('./CopiedComponents.js');
13
16
  var Initializer = require('./Initializer.js');
14
17
  var NonRepeatable = require('./NonRepeatable.js');
15
18
  var Repeatable = require('./Repeatable.js');
19
+ var componentCopy = require('./utils/componentCopy.js');
16
20
 
17
21
  function _interopNamespace(e) {
18
22
  if (e && e.__esModule) return e;
@@ -37,51 +41,112 @@ var React__namespace = /*#__PURE__*/_interopNamespace(React);
37
41
  const ComponentInput = ({ label, required, name, attribute, disabled, labelAction, ...props })=>{
38
42
  const { formatMessage } = reactIntl.useIntl();
39
43
  const field = strapiAdmin.useField(name);
40
- const showResetComponent = !attribute.repeatable && field.value !== undefined && field.value !== null && !disabled;
41
- const { currentDocument: { components } } = useDocumentContext.useDocumentContext('ComponentInput');
44
+ const [isCopyModalOpen, setIsCopyModalOpen] = React__namespace.useState(false);
45
+ const { isCopied, insertCopy } = CopiedComponents.useCopiedComponent(name);
46
+ const { currentDocumentMeta, currentDocument: { components, document } } = useDocumentContext.useDocumentContext('ComponentInput');
47
+ // A reference into the document: it only changes when the document is refetched
48
+ const savedComponent = strapiAdmin.useForm('ComponentInput', (state)=>componentCopy.getSavedComponent(document, state.values, name));
49
+ const canCopyFromExisting = currentDocumentMeta.collectionType === collections.COLLECTION_TYPES;
50
+ const hasComponent = !attribute.repeatable && field.value !== undefined && field.value !== null;
51
+ const showResetComponent = hasComponent && !disabled;
52
+ /**
53
+ * A component that was just added is blank: copying into it fills it. Once it holds content,
54
+ * copying into it replaces that content and the user is warned.
55
+ */ const hasContent = hasComponent && !componentCopy.isComponentBlank(field.value, attribute.component, components, savedComponent);
42
56
  const handleInitialisationClick = ()=>{
43
57
  const schema = components[attribute.component];
44
58
  const form = forms.createDefaultForm(schema, components);
45
59
  const data$1 = data.transformDocument(schema, components)(form);
46
60
  field.onChange(name, data$1);
47
61
  };
62
+ /**
63
+ * The copy replaces the component in place. It has no id, so the inputs holding server data for
64
+ * the replaced component (relations) drop it, see `RelationsField`.
65
+ */ const handleCopyComponent = ([componentData])=>{
66
+ insertCopy(componentData);
67
+ return true;
68
+ };
48
69
  return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Field.Root, {
49
70
  error: field.error,
50
71
  required: required,
51
72
  children: [
52
73
  /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
53
74
  justifyContent: "space-between",
75
+ alignItems: "center",
76
+ gap: 2,
54
77
  children: [
55
- /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Field.Label, {
56
- action: labelAction,
78
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
79
+ gap: 2,
57
80
  children: [
58
- label,
59
- attribute.repeatable && /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
81
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Field.Label, {
82
+ action: labelAction,
60
83
  children: [
61
- " (",
62
- Array.isArray(field.value) ? field.value.length : 0,
63
- ")"
84
+ label,
85
+ attribute.repeatable && /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
86
+ children: [
87
+ " (",
88
+ Array.isArray(field.value) ? field.value.length : 0,
89
+ ")"
90
+ ]
91
+ })
64
92
  ]
93
+ }),
94
+ hasComponent && isCopied && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Badge, {
95
+ variant: "success",
96
+ size: "S",
97
+ children: formatMessage({
98
+ id: translations.getTranslation('components.Component.copied'),
99
+ defaultMessage: 'Copied'
100
+ })
65
101
  })
66
102
  ]
67
103
  }),
68
- showResetComponent && /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
69
- label: formatMessage({
70
- id: translations.getTranslation('components.reset-entry'),
71
- defaultMessage: 'Reset Entry'
72
- }),
73
- variant: "ghost",
74
- onClick: ()=>{
75
- field.onChange(name, null);
76
- },
77
- children: /*#__PURE__*/ jsxRuntime.jsx(Icons.Trash, {})
104
+ showResetComponent && /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
105
+ gap: 1,
106
+ children: [
107
+ canCopyFromExisting && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
108
+ variant: "ghost",
109
+ size: "S",
110
+ startIcon: /*#__PURE__*/ jsxRuntime.jsx(Icons.Duplicate, {}),
111
+ onClick: ()=>setIsCopyModalOpen(true),
112
+ children: hasContent ? formatMessage({
113
+ id: translations.getTranslation('components.Component.replace-content'),
114
+ defaultMessage: 'Replace content…'
115
+ }) : formatMessage({
116
+ id: translations.getTranslation('components.AddComponentMenu.copy'),
117
+ defaultMessage: 'Use existing content…'
118
+ })
119
+ }),
120
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
121
+ label: formatMessage({
122
+ id: translations.getTranslation('components.reset-entry'),
123
+ defaultMessage: 'Reset Entry'
124
+ }),
125
+ variant: "ghost",
126
+ onClick: ()=>{
127
+ field.onChange(name, null);
128
+ },
129
+ children: /*#__PURE__*/ jsxRuntime.jsx(Icons.Trash, {})
130
+ })
131
+ ]
78
132
  })
79
133
  ]
80
134
  }),
81
135
  !attribute.repeatable && !field.value && /*#__PURE__*/ jsxRuntime.jsx(Initializer.Initializer, {
82
136
  disabled: disabled,
83
137
  name: name,
84
- onClick: handleInitialisationClick
138
+ onClick: handleInitialisationClick,
139
+ onCopyClick: canCopyFromExisting ? ()=>setIsCopyModalOpen(true) : undefined
140
+ }),
141
+ !attribute.repeatable && isCopyModalOpen && /*#__PURE__*/ jsxRuntime.jsx(ComponentCopyModal.ComponentCopyModal, {
142
+ componentUid: attribute.component,
143
+ fieldLabel: label,
144
+ mode: "component",
145
+ onClose: ()=>setIsCopyModalOpen(false),
146
+ onInsert: handleCopyComponent,
147
+ replacesContent: hasContent,
148
+ selection: "single",
149
+ sourceFieldName: name
85
150
  }),
86
151
  !attribute.repeatable && field.value ? /*#__PURE__*/ jsxRuntime.jsx(NonRepeatable.NonRepeatableComponent, {
87
152
  attribute: attribute,
@@ -92,6 +157,7 @@ const ComponentInput = ({ label, required, name, attribute, disabled, labelActio
92
157
  }) : null,
93
158
  attribute.repeatable && /*#__PURE__*/ jsxRuntime.jsx(Repeatable.RepeatableComponent, {
94
159
  attribute: attribute,
160
+ label: label,
95
161
  name: name,
96
162
  disabled: disabled,
97
163
  ...props,
@@ -1 +1 @@
1
- {"version":3,"file":"Input.js","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/Component/Input.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { InputProps, useField } from '@strapi/admin/strapi-admin';\nimport { Field, Flex, IconButton } from '@strapi/design-system';\nimport { Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useDocumentContext } from '../../../../../hooks/useDocumentContext';\nimport { EditFieldLayout } from '../../../../../hooks/useDocumentLayout';\nimport { getTranslation } from '../../../../../utils/translations';\nimport { type AnyData, transformDocument } from '../../../utils/data';\nimport { createDefaultForm } from '../../../utils/forms';\nimport { type InputRendererProps } from '../../InputRenderer';\n\nimport { Initializer } from './Initializer';\nimport { NonRepeatableComponent } from './NonRepeatable';\nimport { RepeatableComponent } from './Repeatable';\n\ninterface ComponentInputProps\n extends\n Omit<Extract<EditFieldLayout, { type: 'component' }>, 'size' | 'hint'>,\n Pick<InputProps, 'hint'> {\n labelAction?: React.ReactNode;\n children: (props: InputRendererProps) => React.ReactNode;\n /**\n * We need layout to come from the props, and not via a hook, because Content History needs\n * a way to modify the normal component layout to add hidden fields.\n */\n layout: ReadonlyArray<ReadonlyArray<EditFieldLayout>>;\n}\n\nconst ComponentInput = ({\n label,\n required,\n name,\n attribute,\n disabled,\n labelAction,\n ...props\n}: ComponentInputProps) => {\n const { formatMessage } = useIntl();\n const field = useField<AnyData | AnyData[] | null>(name);\n\n const showResetComponent =\n !attribute.repeatable && field.value !== undefined && field.value !== null && !disabled;\n\n const {\n currentDocument: { components },\n } = useDocumentContext('ComponentInput');\n\n const handleInitialisationClick = () => {\n const schema = components[attribute.component];\n const form = createDefaultForm(schema, components);\n const data = transformDocument(schema, components)(form);\n\n field.onChange(name, data);\n };\n\n return (\n <Field.Root error={field.error} required={required}>\n <Flex justifyContent=\"space-between\">\n <Field.Label action={labelAction}>\n {label}\n {attribute.repeatable && (\n <>&nbsp;({Array.isArray(field.value) ? field.value.length : 0})</>\n )}\n </Field.Label>\n\n {showResetComponent && (\n <IconButton\n label={formatMessage({\n id: getTranslation('components.reset-entry'),\n defaultMessage: 'Reset Entry',\n })}\n variant=\"ghost\"\n onClick={() => {\n field.onChange(name, null);\n }}\n >\n <Trash />\n </IconButton>\n )}\n </Flex>\n {/**\n * if the field isn't repeatable then we display a button to start the field\n * TODO: should this just live in the `NonRepeatableComponent`?\n */}\n {!attribute.repeatable && !field.value && (\n <Initializer disabled={disabled} name={name} onClick={handleInitialisationClick} />\n )}\n {!attribute.repeatable && field.value ? (\n <NonRepeatableComponent attribute={attribute} name={name} disabled={disabled} {...props}>\n {props.children}\n </NonRepeatableComponent>\n ) : null}\n {attribute.repeatable && (\n <RepeatableComponent attribute={attribute} name={name} disabled={disabled} {...props}>\n {props.children}\n </RepeatableComponent>\n )}\n <Field.Error />\n </Field.Root>\n );\n};\n\nconst MemoizedComponentInput = React.memo(ComponentInput);\n\nexport { MemoizedComponentInput as ComponentInput };\nexport type { ComponentInputProps };\n"],"names":["ComponentInput","label","required","name","attribute","disabled","labelAction","props","formatMessage","useIntl","field","useField","showResetComponent","repeatable","value","undefined","currentDocument","components","useDocumentContext","handleInitialisationClick","schema","component","form","createDefaultForm","data","transformDocument","onChange","_jsxs","Field","Root","error","Flex","justifyContent","Label","action","_Fragment","Array","isArray","length","_jsx","IconButton","id","getTranslation","defaultMessage","variant","onClick","Trash","Initializer","NonRepeatableComponent","children","RepeatableComponent","Error","MemoizedComponentInput","React","memo"],"mappings":"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"}
1
+ {"version":3,"file":"Input.js","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/Component/Input.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { InputProps, useField, useForm } from '@strapi/admin/strapi-admin';\nimport { Badge, Button, Field, Flex, IconButton } from '@strapi/design-system';\nimport { Duplicate, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { COLLECTION_TYPES } from '../../../../../constants/collections';\nimport { useDocumentContext } from '../../../../../hooks/useDocumentContext';\nimport { EditFieldLayout } from '../../../../../hooks/useDocumentLayout';\nimport { getTranslation } from '../../../../../utils/translations';\nimport { type AnyData, transformDocument } from '../../../utils/data';\nimport { createDefaultForm } from '../../../utils/forms';\nimport { type InputRendererProps } from '../../InputRenderer';\n\nimport { ComponentCopyModal } from './ComponentCopyModal';\nimport { useCopiedComponent } from './CopiedComponents';\nimport { Initializer } from './Initializer';\nimport { NonRepeatableComponent } from './NonRepeatable';\nimport { RepeatableComponent } from './Repeatable';\nimport { getSavedComponent, isComponentBlank } from './utils/componentCopy';\n\ninterface ComponentInputProps\n extends\n Omit<Extract<EditFieldLayout, { type: 'component' }>, 'size' | 'hint'>,\n Pick<InputProps, 'hint'> {\n labelAction?: React.ReactNode;\n children: (props: InputRendererProps) => React.ReactNode;\n /**\n * We need layout to come from the props, and not via a hook, because Content History needs\n * a way to modify the normal component layout to add hidden fields.\n */\n layout: ReadonlyArray<ReadonlyArray<EditFieldLayout>>;\n}\n\nconst ComponentInput = ({\n label,\n required,\n name,\n attribute,\n disabled,\n labelAction,\n ...props\n}: ComponentInputProps) => {\n const { formatMessage } = useIntl();\n const field = useField<AnyData | AnyData[] | null>(name);\n const [isCopyModalOpen, setIsCopyModalOpen] = React.useState(false);\n const { isCopied, insertCopy } = useCopiedComponent(name);\n\n const {\n currentDocumentMeta,\n currentDocument: { components, document },\n } = useDocumentContext('ComponentInput');\n // A reference into the document: it only changes when the document is refetched\n const savedComponent = useForm('ComponentInput', (state) =>\n getSavedComponent(document, state.values, name)\n );\n const canCopyFromExisting = currentDocumentMeta.collectionType === COLLECTION_TYPES;\n\n const hasComponent = !attribute.repeatable && field.value !== undefined && field.value !== null;\n const showResetComponent = hasComponent && !disabled;\n /**\n * A component that was just added is blank: copying into it fills it. Once it holds content,\n * copying into it replaces that content and the user is warned.\n */\n const hasContent =\n hasComponent && !isComponentBlank(field.value, attribute.component, components, savedComponent);\n\n const handleInitialisationClick = () => {\n const schema = components[attribute.component];\n const form = createDefaultForm(schema, components);\n const data = transformDocument(schema, components)(form);\n\n field.onChange(name, data);\n };\n\n /**\n * The copy replaces the component in place. It has no id, so the inputs holding server data for\n * the replaced component (relations) drop it, see `RelationsField`.\n */\n const handleCopyComponent = ([componentData]: AnyData[]) => {\n insertCopy(componentData);\n\n return true;\n };\n\n return (\n <Field.Root error={field.error} required={required}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" gap={2}>\n <Flex gap={2}>\n <Field.Label action={labelAction}>\n {label}\n {attribute.repeatable && (\n <>&nbsp;({Array.isArray(field.value) ? field.value.length : 0})</>\n )}\n </Field.Label>\n {hasComponent && isCopied && (\n <Badge variant=\"success\" size=\"S\">\n {formatMessage({\n id: getTranslation('components.Component.copied'),\n defaultMessage: 'Copied',\n })}\n </Badge>\n )}\n </Flex>\n\n {showResetComponent && (\n <Flex gap={1}>\n {canCopyFromExisting && (\n <Button\n variant=\"ghost\"\n size=\"S\"\n startIcon={<Duplicate />}\n onClick={() => setIsCopyModalOpen(true)}\n >\n {hasContent\n ? formatMessage({\n id: getTranslation('components.Component.replace-content'),\n defaultMessage: 'Replace content…',\n })\n : formatMessage({\n id: getTranslation('components.AddComponentMenu.copy'),\n defaultMessage: 'Use existing content…',\n })}\n </Button>\n )}\n <IconButton\n label={formatMessage({\n id: getTranslation('components.reset-entry'),\n defaultMessage: 'Reset Entry',\n })}\n variant=\"ghost\"\n onClick={() => {\n field.onChange(name, null);\n }}\n >\n <Trash />\n </IconButton>\n </Flex>\n )}\n </Flex>\n {/**\n * if the field isn't repeatable then we display a button to start the field\n * TODO: should this just live in the `NonRepeatableComponent`?\n */}\n {!attribute.repeatable && !field.value && (\n <Initializer\n disabled={disabled}\n name={name}\n onClick={handleInitialisationClick}\n onCopyClick={canCopyFromExisting ? () => setIsCopyModalOpen(true) : undefined}\n />\n )}\n {!attribute.repeatable && isCopyModalOpen && (\n <ComponentCopyModal\n componentUid={attribute.component}\n fieldLabel={label}\n mode=\"component\"\n onClose={() => setIsCopyModalOpen(false)}\n onInsert={handleCopyComponent}\n replacesContent={hasContent}\n selection=\"single\"\n sourceFieldName={name}\n />\n )}\n {!attribute.repeatable && field.value ? (\n <NonRepeatableComponent attribute={attribute} name={name} disabled={disabled} {...props}>\n {props.children}\n </NonRepeatableComponent>\n ) : null}\n {attribute.repeatable && (\n <RepeatableComponent\n attribute={attribute}\n label={label}\n name={name}\n disabled={disabled}\n {...props}\n >\n {props.children}\n </RepeatableComponent>\n )}\n <Field.Error />\n </Field.Root>\n );\n};\n\nconst MemoizedComponentInput = React.memo(ComponentInput);\n\nexport { MemoizedComponentInput as ComponentInput };\nexport type { ComponentInputProps };\n"],"names":["ComponentInput","label","required","name","attribute","disabled","labelAction","props","formatMessage","useIntl","field","useField","isCopyModalOpen","setIsCopyModalOpen","React","useState","isCopied","insertCopy","useCopiedComponent","currentDocumentMeta","currentDocument","components","document","useDocumentContext","savedComponent","useForm","state","getSavedComponent","values","canCopyFromExisting","collectionType","COLLECTION_TYPES","hasComponent","repeatable","value","undefined","showResetComponent","hasContent","isComponentBlank","component","handleInitialisationClick","schema","form","createDefaultForm","data","transformDocument","onChange","handleCopyComponent","componentData","_jsxs","Field","Root","error","Flex","justifyContent","alignItems","gap","Label","action","_Fragment","Array","isArray","length","_jsx","Badge","variant","size","id","getTranslation","defaultMessage","Button","startIcon","Duplicate","onClick","IconButton","Trash","Initializer","onCopyClick","ComponentCopyModal","componentUid","fieldLabel","mode","onClose","onInsert","replacesContent","selection","sourceFieldName","NonRepeatableComponent","children","RepeatableComponent","Error","MemoizedComponentInput","memo"],"mappings":"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"}