@strapi/content-manager 0.0.0-experimental.e21fe90bf2ab9906267ea6e6ca620bdcc729906c → 0.0.0-experimental.e347d09bda40b82b260af06636f17c00f9286ac2

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 (286) 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/VersionContent.js +24 -3
  10. package/dist/admin/history/components/VersionContent.js.map +1 -1
  11. package/dist/admin/history/components/VersionContent.mjs +25 -4
  12. package/dist/admin/history/components/VersionContent.mjs.map +1 -1
  13. package/dist/admin/history/components/VersionHeader.js +6 -0
  14. package/dist/admin/history/components/VersionHeader.js.map +1 -1
  15. package/dist/admin/history/components/VersionHeader.mjs +7 -1
  16. package/dist/admin/history/components/VersionHeader.mjs.map +1 -1
  17. package/dist/admin/hooks/useDocumentActions.js +12 -4
  18. package/dist/admin/hooks/useDocumentActions.js.map +1 -1
  19. package/dist/admin/hooks/useDocumentActions.mjs +12 -4
  20. package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
  21. package/dist/admin/hooks/useDocumentContext.js.map +1 -1
  22. package/dist/admin/hooks/useDocumentContext.mjs.map +1 -1
  23. package/dist/admin/index.js +3 -3
  24. package/dist/admin/index.js.map +1 -1
  25. package/dist/admin/index.mjs +1 -0
  26. package/dist/admin/index.mjs.map +1 -1
  27. package/dist/admin/pages/EditView/EditViewPage.js +94 -75
  28. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  29. package/dist/admin/pages/EditView/EditViewPage.mjs +95 -76
  30. package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
  31. package/dist/admin/pages/EditView/components/DocumentActions.js +289 -91
  32. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  33. package/dist/admin/pages/EditView/components/DocumentActions.mjs +293 -95
  34. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  35. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +12 -15
  36. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
  37. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +12 -15
  38. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
  39. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +61 -26
  40. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
  41. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs +63 -28
  42. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
  43. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +21 -35
  44. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
  45. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs +21 -35
  46. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs.map +1 -1
  47. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +46 -95
  48. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
  49. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +48 -78
  50. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
  51. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +12 -1
  52. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  53. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +13 -2
  54. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
  55. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +15 -2
  56. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  57. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +16 -3
  58. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  59. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +18 -5
  60. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  61. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +20 -7
  62. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  63. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +129 -55
  64. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  65. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +129 -55
  66. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  67. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +120 -32
  68. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  69. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +124 -36
  70. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  71. package/dist/admin/pages/EditView/components/FormInputs/UID.js +4 -2
  72. package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
  73. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs +4 -2
  74. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs.map +1 -1
  75. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js +1 -1
  76. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -1
  77. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs +1 -1
  78. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs.map +1 -1
  79. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js +50 -97
  80. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js.map +1 -1
  81. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs +51 -79
  82. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs.map +1 -1
  83. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.js +86 -118
  84. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.js.map +1 -1
  85. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.mjs +86 -118
  86. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.mjs.map +1 -1
  87. package/dist/admin/pages/EditView/components/FormLayout.js +47 -27
  88. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  89. package/dist/admin/pages/EditView/components/FormLayout.mjs +47 -27
  90. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  91. package/dist/admin/pages/EditView/utils/data.js +103 -0
  92. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  93. package/dist/admin/pages/EditView/utils/data.mjs +103 -1
  94. package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
  95. package/dist/admin/pages/ListView/ListViewPage.js +86 -0
  96. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  97. package/dist/admin/pages/ListView/ListViewPage.mjs +88 -2
  98. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  99. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js +2 -1
  100. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
  101. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs +2 -1
  102. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs.map +1 -1
  103. package/dist/admin/pages/ListView/components/Filters.js +1 -0
  104. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  105. package/dist/admin/pages/ListView/components/Filters.mjs +1 -0
  106. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
  107. package/dist/admin/pages/ListView/components/TableActions.js +13 -3
  108. package/dist/admin/pages/ListView/components/TableActions.js.map +1 -1
  109. package/dist/admin/pages/ListView/components/TableActions.mjs +13 -3
  110. package/dist/admin/pages/ListView/components/TableActions.mjs.map +1 -1
  111. package/dist/admin/preview/components/PreviewHeader.js +1 -1
  112. package/dist/admin/preview/components/PreviewHeader.js.map +1 -1
  113. package/dist/admin/preview/components/PreviewHeader.mjs +1 -1
  114. package/dist/admin/preview/components/PreviewHeader.mjs.map +1 -1
  115. package/dist/admin/services/api.js +2 -1
  116. package/dist/admin/services/api.js.map +1 -1
  117. package/dist/admin/services/api.mjs +2 -1
  118. package/dist/admin/services/api.mjs.map +1 -1
  119. package/dist/admin/services/documents.js +4 -4
  120. package/dist/admin/services/documents.js.map +1 -1
  121. package/dist/admin/services/documents.mjs +4 -4
  122. package/dist/admin/services/documents.mjs.map +1 -1
  123. package/dist/admin/services/homepage.js +9 -5
  124. package/dist/admin/services/homepage.js.map +1 -1
  125. package/dist/admin/services/homepage.mjs +9 -5
  126. package/dist/admin/services/homepage.mjs.map +1 -1
  127. package/dist/admin/src/components/ConfigurationForm/Fields.d.ts +6 -4
  128. package/dist/admin/src/exports.d.ts +1 -0
  129. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  130. package/dist/admin/src/hooks/useDocumentActions.d.ts +1 -0
  131. package/dist/admin/src/hooks/useDocumentContext.d.ts +1 -1
  132. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.d.ts +2 -2
  133. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.d.ts +26 -5
  134. package/dist/admin/src/pages/EditView/components/FormInputs/UID.d.ts +1 -0
  135. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +7 -8
  136. package/dist/admin/src/pages/EditView/utils/data.d.ts +19 -1
  137. package/dist/admin/src/preview/services/preview.d.ts +1 -1
  138. package/dist/admin/src/services/api.d.ts +1 -1
  139. package/dist/admin/src/services/components.d.ts +2 -2
  140. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  141. package/dist/admin/src/services/documents.d.ts +23 -17
  142. package/dist/admin/src/services/homepage.d.ts +1 -1
  143. package/dist/admin/src/services/init.d.ts +1 -1
  144. package/dist/admin/src/services/relations.d.ts +2 -2
  145. package/dist/admin/src/services/uid.d.ts +3 -3
  146. package/dist/admin/src/utils/validation.d.ts +1 -0
  147. package/dist/admin/translations/en.json.js +3 -1
  148. package/dist/admin/translations/en.json.js.map +1 -1
  149. package/dist/admin/translations/en.json.mjs +3 -1
  150. package/dist/admin/translations/en.json.mjs.map +1 -1
  151. package/dist/admin/translations/fr.json.js +6 -1
  152. package/dist/admin/translations/fr.json.js.map +1 -1
  153. package/dist/admin/translations/fr.json.mjs +6 -1
  154. package/dist/admin/translations/fr.json.mjs.map +1 -1
  155. package/dist/admin/translations/ru.json.js +235 -226
  156. package/dist/admin/translations/ru.json.js.map +1 -1
  157. package/dist/admin/translations/ru.json.mjs +230 -226
  158. package/dist/admin/translations/ru.json.mjs.map +1 -1
  159. package/dist/admin/utils/validation.js +17 -6
  160. package/dist/admin/utils/validation.js.map +1 -1
  161. package/dist/admin/utils/validation.mjs +17 -6
  162. package/dist/admin/utils/validation.mjs.map +1 -1
  163. package/dist/server/controllers/content-types.js +11 -1
  164. package/dist/server/controllers/content-types.js.map +1 -1
  165. package/dist/server/controllers/content-types.mjs +11 -1
  166. package/dist/server/controllers/content-types.mjs.map +1 -1
  167. package/dist/server/controllers/index.js +3 -1
  168. package/dist/server/controllers/index.js.map +1 -1
  169. package/dist/server/controllers/index.mjs +3 -1
  170. package/dist/server/controllers/index.mjs.map +1 -1
  171. package/dist/server/controllers/relations.js +2 -2
  172. package/dist/server/controllers/relations.js.map +1 -1
  173. package/dist/server/controllers/relations.mjs +2 -2
  174. package/dist/server/controllers/relations.mjs.map +1 -1
  175. package/dist/server/controllers/validation/index.js +14 -2
  176. package/dist/server/controllers/validation/index.js.map +1 -1
  177. package/dist/server/controllers/validation/index.mjs +14 -2
  178. package/dist/server/controllers/validation/index.mjs.map +1 -1
  179. package/dist/server/history/services/lifecycles.js +3 -0
  180. package/dist/server/history/services/lifecycles.js.map +1 -1
  181. package/dist/server/history/services/lifecycles.mjs +3 -0
  182. package/dist/server/history/services/lifecycles.mjs.map +1 -1
  183. package/dist/server/homepage/controllers/homepage.js +57 -0
  184. package/dist/server/homepage/controllers/homepage.js.map +1 -0
  185. package/dist/server/homepage/controllers/homepage.mjs +36 -0
  186. package/dist/server/homepage/controllers/homepage.mjs.map +1 -0
  187. package/dist/server/homepage/controllers/index.js +10 -0
  188. package/dist/server/homepage/controllers/index.js.map +1 -0
  189. package/dist/server/homepage/controllers/index.mjs +8 -0
  190. package/dist/server/homepage/controllers/index.mjs.map +1 -0
  191. package/dist/server/homepage/index.js +14 -0
  192. package/dist/server/homepage/index.js.map +1 -0
  193. package/dist/server/homepage/index.mjs +12 -0
  194. package/dist/server/homepage/index.mjs.map +1 -0
  195. package/dist/server/homepage/routes/homepage.js +25 -0
  196. package/dist/server/homepage/routes/homepage.js.map +1 -0
  197. package/dist/server/homepage/routes/homepage.mjs +23 -0
  198. package/dist/server/homepage/routes/homepage.mjs.map +1 -0
  199. package/dist/server/homepage/routes/index.js +13 -0
  200. package/dist/server/homepage/routes/index.js.map +1 -0
  201. package/dist/server/homepage/routes/index.mjs +11 -0
  202. package/dist/server/homepage/routes/index.mjs.map +1 -0
  203. package/dist/server/homepage/services/homepage.js +166 -0
  204. package/dist/server/homepage/services/homepage.js.map +1 -0
  205. package/dist/server/homepage/services/homepage.mjs +164 -0
  206. package/dist/server/homepage/services/homepage.mjs.map +1 -0
  207. package/dist/server/homepage/services/index.js +10 -0
  208. package/dist/server/homepage/services/index.js.map +1 -0
  209. package/dist/server/homepage/services/index.mjs +8 -0
  210. package/dist/server/homepage/services/index.mjs.map +1 -0
  211. package/dist/server/preview/services/preview.js +0 -1
  212. package/dist/server/preview/services/preview.js.map +1 -1
  213. package/dist/server/preview/services/preview.mjs +0 -1
  214. package/dist/server/preview/services/preview.mjs.map +1 -1
  215. package/dist/server/routes/index.js +3 -1
  216. package/dist/server/routes/index.js.map +1 -1
  217. package/dist/server/routes/index.mjs +3 -1
  218. package/dist/server/routes/index.mjs.map +1 -1
  219. package/dist/server/services/data-mapper.js +4 -1
  220. package/dist/server/services/data-mapper.js.map +1 -1
  221. package/dist/server/services/data-mapper.mjs +4 -1
  222. package/dist/server/services/data-mapper.mjs.map +1 -1
  223. package/dist/server/services/document-manager.js +8 -1
  224. package/dist/server/services/document-manager.js.map +1 -1
  225. package/dist/server/services/document-manager.mjs +8 -1
  226. package/dist/server/services/document-manager.mjs.map +1 -1
  227. package/dist/server/services/document-metadata.js +3 -1
  228. package/dist/server/services/document-metadata.js.map +1 -1
  229. package/dist/server/services/document-metadata.mjs +3 -1
  230. package/dist/server/services/document-metadata.mjs.map +1 -1
  231. package/dist/server/services/index.js +3 -1
  232. package/dist/server/services/index.js.map +1 -1
  233. package/dist/server/services/index.mjs +3 -1
  234. package/dist/server/services/index.mjs.map +1 -1
  235. package/dist/server/services/utils/configuration/attributes.js +1 -1
  236. package/dist/server/services/utils/configuration/attributes.js.map +1 -1
  237. package/dist/server/services/utils/configuration/attributes.mjs +1 -1
  238. package/dist/server/services/utils/configuration/attributes.mjs.map +1 -1
  239. package/dist/server/services/utils/configuration/layouts.js +1 -1
  240. package/dist/server/services/utils/configuration/layouts.js.map +1 -1
  241. package/dist/server/services/utils/configuration/layouts.mjs +1 -1
  242. package/dist/server/services/utils/configuration/layouts.mjs.map +1 -1
  243. package/dist/server/services/utils/configuration/metadatas.js +8 -0
  244. package/dist/server/services/utils/configuration/metadatas.js.map +1 -1
  245. package/dist/server/services/utils/configuration/metadatas.mjs +8 -0
  246. package/dist/server/services/utils/configuration/metadatas.mjs.map +1 -1
  247. package/dist/server/services/utils/populate.js +11 -0
  248. package/dist/server/services/utils/populate.js.map +1 -1
  249. package/dist/server/services/utils/populate.mjs +11 -0
  250. package/dist/server/services/utils/populate.mjs.map +1 -1
  251. package/dist/server/src/controllers/content-types.d.ts.map +1 -1
  252. package/dist/server/src/controllers/index.d.ts.map +1 -1
  253. package/dist/server/src/controllers/validation/index.d.ts +6 -1
  254. package/dist/server/src/controllers/validation/index.d.ts.map +1 -1
  255. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  256. package/dist/server/src/homepage/controllers/homepage.d.ts +7 -0
  257. package/dist/server/src/homepage/controllers/homepage.d.ts.map +1 -0
  258. package/dist/server/src/homepage/controllers/index.d.ts +2 -0
  259. package/dist/server/src/homepage/controllers/index.d.ts.map +1 -0
  260. package/dist/server/src/homepage/index.d.ts +18 -0
  261. package/dist/server/src/homepage/index.d.ts.map +1 -0
  262. package/dist/server/src/homepage/routes/homepage.d.ts +4 -0
  263. package/dist/server/src/homepage/routes/homepage.d.ts.map +1 -0
  264. package/dist/server/src/homepage/routes/index.d.ts +8 -0
  265. package/dist/server/src/homepage/routes/index.d.ts.map +1 -0
  266. package/dist/server/src/{services → homepage/services}/homepage.d.ts +3 -1
  267. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -0
  268. package/dist/server/src/homepage/services/index.d.ts +11 -0
  269. package/dist/server/src/homepage/services/index.d.ts.map +1 -0
  270. package/dist/server/src/index.d.ts +10 -0
  271. package/dist/server/src/index.d.ts.map +1 -1
  272. package/dist/server/src/preview/services/preview.d.ts.map +1 -1
  273. package/dist/server/src/routes/index.d.ts +1 -0
  274. package/dist/server/src/routes/index.d.ts.map +1 -1
  275. package/dist/server/src/services/data-mapper.d.ts +1 -0
  276. package/dist/server/src/services/data-mapper.d.ts.map +1 -1
  277. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  278. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  279. package/dist/server/src/services/index.d.ts +9 -0
  280. package/dist/server/src/services/index.d.ts.map +1 -1
  281. package/dist/server/src/services/utils/configuration/metadatas.d.ts.map +1 -1
  282. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  283. package/dist/shared/contracts/collection-types.d.ts +0 -1
  284. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  285. package/package.json +11 -8
  286. package/dist/server/src/services/homepage.d.ts.map +0 -1
@@ -1,24 +1,60 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
- import { useNotification, useAPIErrorHandler, useQueryParams, useForm } from '@strapi/admin/strapi-admin';
4
- import { Menu, Flex, Button, VisuallyHidden, Dialog, Modal, Typography, Radio } from '@strapi/design-system';
3
+ import { unstable_tours, useNotification, useAPIErrorHandler, useQueryParams, useForm } from '@strapi/admin/strapi-admin';
4
+ import { Flex, Button, Menu, VisuallyHidden, Dialog, Modal, Typography, Radio } from '@strapi/design-system';
5
5
  import { More, Cross, WarningCircle } from '@strapi/icons';
6
6
  import mapValues from 'lodash/fp/mapValues';
7
+ import get from 'lodash/get';
8
+ import merge from 'lodash/merge';
9
+ import set from 'lodash/set';
7
10
  import { useIntl } from 'react-intl';
8
11
  import { useNavigate, useMatch, useParams } from 'react-router-dom';
9
- import { styled } from 'styled-components';
10
12
  import { PUBLISHED_AT_ATTRIBUTE_NAME } from '../../../constants/attributes.mjs';
11
13
  import { SINGLE_TYPES } from '../../../constants/collections.mjs';
12
14
  import { useDocumentRBAC } from '../../../features/DocumentRBAC.mjs';
13
- import { useDoc } from '../../../hooks/useDocument.mjs';
15
+ import { useDocument, useDoc } from '../../../hooks/useDocument.mjs';
14
16
  import { useDocumentActions } from '../../../hooks/useDocumentActions.mjs';
15
17
  import { useDocumentContext } from '../../../hooks/useDocumentContext.mjs';
16
18
  import { usePreviewContext } from '../../../preview/pages/Preview.mjs';
17
19
  import { LIST_PATH, CLONE_PATH } from '../../../router.mjs';
18
- import { useGetDraftRelationCountQuery as useLazyGetDraftRelationCountQuery } from '../../../services/documents.mjs';
20
+ import { useGetDraftRelationCountQuery as useLazyGetDraftRelationCountQuery, useUpdateDocumentMutation } from '../../../services/documents.mjs';
19
21
  import { isBaseQueryError, buildValidParams } from '../../../utils/api.mjs';
20
22
  import { getTranslation } from '../../../utils/translations.mjs';
23
+ import { handleInvisibleAttributes } from '../utils/data.mjs';
24
+ import { useRelationModal } from './FormInputs/Relations/RelationModal.mjs';
21
25
 
26
+ const connectRelationToParent = (parentDataToUpdate, fieldToConnect, data, fieldToConnectUID)=>{
27
+ /*
28
+ * Check if the fieldToConnect is already present in the parentDataToUpdate.
29
+ * This happens in particular when in the parentDocument you have created
30
+ * a new component without saving.
31
+ */ const isFieldPresent = !!get(parentDataToUpdate, fieldToConnect);
32
+ const fieldToConnectPath = isFieldPresent ? fieldToConnect : fieldToConnect.split('.').slice(0, -1).join('.');
33
+ const fieldToConnectValue = isFieldPresent ? {
34
+ connect: [
35
+ {
36
+ id: data.documentId,
37
+ documentId: data.documentId,
38
+ locale: data.locale
39
+ }
40
+ ]
41
+ } : {
42
+ [fieldToConnect.split('.').pop()]: {
43
+ connect: [
44
+ {
45
+ id: data.documentId,
46
+ documentId: data.documentId,
47
+ locale: data.locale
48
+ }
49
+ ],
50
+ disconnect: []
51
+ },
52
+ // In case the object was not present you need to pass the componentUID of the parent document
53
+ __component: fieldToConnectUID
54
+ };
55
+ const objectToConnect = set({}, fieldToConnectPath, fieldToConnectValue);
56
+ return merge(parentDataToUpdate, objectToConnect);
57
+ };
22
58
  const DocumentActions = ({ actions })=>{
23
59
  const { formatMessage } = useIntl();
24
60
  const [primaryAction, secondaryAction, ...restActions] = actions.filter((action)=>{
@@ -39,23 +75,33 @@ const DocumentActions = ({ actions })=>{
39
75
  alignItems: "stretch",
40
76
  width: "100%",
41
77
  children: [
42
- /*#__PURE__*/ jsxs(Flex, {
43
- gap: 2,
44
- children: [
45
- /*#__PURE__*/ jsx(DocumentActionButton, {
46
- ...primaryAction,
47
- variant: primaryAction.variant || 'default'
48
- }),
49
- restActions.length > 0 ? /*#__PURE__*/ jsx(DocumentActionsMenu, {
50
- actions: restActions,
51
- label: formatMessage({
52
- id: 'content-manager.containers.edit.panels.default.more-actions',
53
- defaultMessage: 'More document actions'
54
- })
55
- }) : null
56
- ]
78
+ /*#__PURE__*/ jsx(unstable_tours.contentManager.Publish, {
79
+ children: /*#__PURE__*/ jsxs(Flex, {
80
+ gap: 2,
81
+ children: [
82
+ primaryAction.label === 'Publish' ? /*#__PURE__*/ jsx(DocumentActionButton, {
83
+ ...primaryAction,
84
+ variant: primaryAction.variant || 'default'
85
+ }) : /*#__PURE__*/ jsx(DocumentActionButton, {
86
+ ...primaryAction,
87
+ variant: primaryAction.variant || 'default'
88
+ }),
89
+ restActions.length > 0 ? /*#__PURE__*/ jsx(DocumentActionsMenu, {
90
+ actions: restActions,
91
+ label: formatMessage({
92
+ id: 'content-manager.containers.edit.panels.default.more-actions',
93
+ defaultMessage: 'More document actions'
94
+ })
95
+ }) : null
96
+ ]
97
+ })
57
98
  }),
58
- secondaryAction ? /*#__PURE__*/ jsx(DocumentActionButton, {
99
+ secondaryAction ? secondaryAction.label === 'Publish' ? /*#__PURE__*/ jsx(unstable_tours.contentManager.Publish, {
100
+ children: /*#__PURE__*/ jsx(DocumentActionButton, {
101
+ ...secondaryAction,
102
+ variant: secondaryAction.variant || 'secondary'
103
+ })
104
+ }) : /*#__PURE__*/ jsx(DocumentActionButton, {
59
105
  ...secondaryAction,
60
106
  variant: secondaryAction.variant || 'secondary'
61
107
  }) : null
@@ -117,11 +163,6 @@ const DocumentActionButton = (action)=>{
117
163
  ]
118
164
  });
119
165
  };
120
- const MenuItem = styled(Menu.Item)`
121
- &:hover {
122
- background: ${({ theme, isVariantDanger, isDisabled })=>isVariantDanger && !isDisabled ? theme.colors.danger100 : 'neutral'};
123
- }
124
- `;
125
166
  const DocumentActionsMenu = ({ actions, children, label, variant = 'tertiary' })=>{
126
167
  const [isOpen, setIsOpen] = React.useState(false);
127
168
  const [dialogId, setDialogId] = React.useState(null);
@@ -183,27 +224,19 @@ const DocumentActionsMenu = ({ actions, children, label, variant = 'tertiary' })
183
224
  popoverPlacement: "bottom-end",
184
225
  children: [
185
226
  actions.map((action)=>{
186
- return /*#__PURE__*/ jsx(MenuItem, {
227
+ return /*#__PURE__*/ jsx(Menu.Item, {
187
228
  disabled: action.disabled,
188
229
  /* @ts-expect-error – TODO: this is an error in the DS where it is most likely a synthetic event, not regular. */ onSelect: handleClick(action),
189
230
  display: "block",
190
- isVariantDanger: action.variant === 'danger',
191
- isDisabled: action.disabled,
231
+ variant: action.variant === 'danger' ? action.variant : 'default',
232
+ startIcon: action.icon,
192
233
  children: /*#__PURE__*/ jsx(Flex, {
193
234
  justifyContent: "space-between",
194
235
  gap: 4,
195
- children: /*#__PURE__*/ jsxs(Flex, {
196
- color: !action.disabled ? convertActionVariantToColor(action.variant) : 'inherit',
236
+ children: /*#__PURE__*/ jsx(Flex, {
197
237
  gap: 2,
198
238
  tag: "span",
199
- children: [
200
- /*#__PURE__*/ jsx(Flex, {
201
- tag: "span",
202
- color: !action.disabled ? convertActionVariantToIconColor(action.variant) : 'inherit',
203
- children: action.icon
204
- }),
205
- action.label
206
- ]
239
+ children: action.label
207
240
  })
208
241
  })
209
242
  }, action.id);
@@ -231,30 +264,6 @@ const DocumentActionsMenu = ({ actions, children, label, variant = 'tertiary' })
231
264
  ]
232
265
  });
233
266
  };
234
- const convertActionVariantToColor = (variant = 'secondary')=>{
235
- switch(variant){
236
- case 'danger':
237
- return 'danger600';
238
- case 'secondary':
239
- return undefined;
240
- case 'success':
241
- return 'success600';
242
- default:
243
- return 'primary600';
244
- }
245
- };
246
- const convertActionVariantToIconColor = (variant = 'secondary')=>{
247
- switch(variant){
248
- case 'danger':
249
- return 'danger600';
250
- case 'secondary':
251
- return 'neutral500';
252
- case 'success':
253
- return 'success600';
254
- default:
255
- return 'primary600';
256
- }
257
- };
258
267
  const DocumentActionConfirmDialog = ({ onClose, onCancel, onConfirm, title, content, isOpen, variant = 'secondary', loading })=>{
259
268
  const { formatMessage } = useIntl();
260
269
  const handleClose = async ()=>{
@@ -360,7 +369,10 @@ const transformData = (data)=>{
360
369
  const isCloning = useMatch(CLONE_PATH) !== null;
361
370
  const { id } = useParams();
362
371
  const { formatMessage } = useIntl();
363
- const canPublish = useDocumentRBAC('PublishAction', ({ canPublish })=>canPublish);
372
+ const { canPublish, canReadFields } = useDocumentRBAC('PublishAction', ({ canPublish, canReadFields })=>({
373
+ canPublish,
374
+ canReadFields
375
+ }));
364
376
  const { publish, isLoading } = useDocumentActions();
365
377
  const onPreview = usePreviewContext('UpdateAction', (state)=>state.onPreview, false);
366
378
  const [countDraftRelations, { isLoading: isLoadingDraftRelations, isError: isErrorDraftRelations }] = useLazyGetDraftRelationCountQuery();
@@ -374,7 +386,18 @@ const transformData = (data)=>{
374
386
  const setErrors = useForm('PublishAction', (state)=>state.setErrors);
375
387
  const formValues = useForm('PublishAction', ({ values })=>values);
376
388
  const resetForm = useForm('PublishAction', ({ resetForm })=>resetForm);
389
+ const { currentDocument: { components } } = useDocumentContext('PublishAction');
390
+ // need to discriminate if the publish is coming from a relation modal or in the edit view
391
+ const relationContext = useRelationModal('PublishAction', ()=>true, false);
392
+ const fromRelationModal = relationContext != undefined;
393
+ const dispatch = useRelationModal('PublishAction', (state)=>state.dispatch);
394
+ const fieldToConnect = useRelationModal('PublishAction', (state)=>state.state.fieldToConnect, false);
395
+ const fieldToConnectUID = useRelationModal('PublishAction', (state)=>state.state.fieldToConnectUID, false);
396
+ const documentHistory = useRelationModal('PublishAction', (state)=>state.state.documentHistory, false);
397
+ const rootDocumentMeta = useRelationModal('PublishAction', (state)=>state.rootDocumentMeta);
377
398
  const { currentDocumentMeta } = useDocumentContext('PublishAction');
399
+ const [updateDocumentMutation] = useUpdateDocumentMutation();
400
+ const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
378
401
  const idToPublish = currentDocumentMeta.documentId || id;
379
402
  React.useEffect(()=>{
380
403
  if (isErrorDraftRelations) {
@@ -458,6 +481,16 @@ const transformData = (data)=>{
458
481
  model,
459
482
  currentDocumentMeta.params
460
483
  ]);
484
+ const parentDocumentMetaToUpdate = documentHistory?.at(-2) ?? rootDocumentMeta;
485
+ const parentDocumentData = useDocument({
486
+ documentId: parentDocumentMetaToUpdate?.documentId,
487
+ model: parentDocumentMetaToUpdate?.model,
488
+ collectionType: parentDocumentMetaToUpdate?.collectionType,
489
+ params: parentDocumentMetaToUpdate?.params
490
+ }, {
491
+ skip: !parentDocumentMetaToUpdate
492
+ });
493
+ const { getInitialFormValues } = useDoc();
461
494
  const isDocumentPublished = (document?.[PUBLISHED_AT_ATTRIBUTE_NAME] || meta?.availableStatus.some((doc)=>doc[PUBLISHED_AT_ATTRIBUTE_NAME] !== null)) && document?.status !== 'modified';
462
495
  if (!schema?.options?.draftAndPublish) {
463
496
  return null;
@@ -469,21 +502,39 @@ const transformData = (data)=>{
469
502
  status: 'published'
470
503
  });
471
504
  if (errors) {
472
- toggleNotification({
473
- type: 'danger',
474
- message: formatMessage({
475
- id: 'content-manager.validation.error',
476
- defaultMessage: 'There are validation errors in your document. Please fix them before saving.'
477
- })
505
+ const hasUnreadableRequiredField = Object.keys(schema.attributes).some((fieldName)=>{
506
+ const attribute = schema.attributes[fieldName];
507
+ return attribute?.required && !(canReadFields ?? []).includes(fieldName);
478
508
  });
509
+ if (hasUnreadableRequiredField) {
510
+ toggleNotification({
511
+ type: 'danger',
512
+ message: formatMessage({
513
+ id: 'content-manager.validation.error.unreadable-required-field',
514
+ defaultMessage: 'Your current permissions prevent access to certain required fields. Please request access from an administrator to proceed.'
515
+ })
516
+ });
517
+ } else {
518
+ toggleNotification({
519
+ type: 'danger',
520
+ message: formatMessage({
521
+ id: 'content-manager.validation.error',
522
+ defaultMessage: 'There are validation errors in your document. Please fix them before saving.'
523
+ })
524
+ });
525
+ }
479
526
  return;
480
527
  }
528
+ const { data } = handleInvisibleAttributes(transformData(formValues), {
529
+ schema,
530
+ components
531
+ });
481
532
  const res = await publish({
482
533
  collectionType,
483
534
  model,
484
535
  documentId,
485
536
  params: currentDocumentMeta.params
486
- }, transformData(formValues));
537
+ }, data);
487
538
  // Reset form if successful
488
539
  if ('data' in res) {
489
540
  resetForm();
@@ -491,11 +542,59 @@ const transformData = (data)=>{
491
542
  if ('data' in res && collectionType !== SINGLE_TYPES) {
492
543
  /**
493
544
  * TODO: refactor the router so we can just do `../${res.data.documentId}` instead of this.
494
- */ if (idToPublish === 'create') {
545
+ */ if (idToPublish === 'create' && !fromRelationModal) {
495
546
  navigate({
496
547
  pathname: `../${collectionType}/${model}/${res.data.documentId}`,
497
548
  search: rawQuery
498
549
  });
550
+ } else if (fromRelationModal) {
551
+ const newRelation = {
552
+ documentId: res.data.documentId,
553
+ collectionType,
554
+ model,
555
+ params: currentDocumentMeta.params
556
+ };
557
+ /*
558
+ * Update, if needed, the parent relation with the newly published document.
559
+ * Check if in history we have the parent relation otherwise use the
560
+ * rootDocument
561
+ */ if (fieldToConnect && documentHistory && (parentDocumentMetaToUpdate.documentId || parentDocumentMetaToUpdate.collectionType === SINGLE_TYPES)) {
562
+ const parentDataToUpdate = parentDocumentMetaToUpdate.collectionType === SINGLE_TYPES ? getInitialFormValues() : parentDocumentData.getInitialFormValues();
563
+ const metaDocumentToUpdate = documentHistory.at(-2) ?? rootDocumentMeta;
564
+ const dataToUpdate = connectRelationToParent(parentDataToUpdate, fieldToConnect, res.data, fieldToConnectUID);
565
+ try {
566
+ const updateRes = await updateDocumentMutation({
567
+ collectionType: metaDocumentToUpdate.collectionType,
568
+ model: metaDocumentToUpdate.model,
569
+ documentId: metaDocumentToUpdate.collectionType !== SINGLE_TYPES ? metaDocumentToUpdate.documentId : undefined,
570
+ params: metaDocumentToUpdate.params,
571
+ data: dataToUpdate
572
+ });
573
+ if ('error' in updateRes) {
574
+ toggleNotification({
575
+ type: 'danger',
576
+ message: formatAPIError(updateRes.error)
577
+ });
578
+ return;
579
+ }
580
+ } catch (err) {
581
+ toggleNotification({
582
+ type: 'danger',
583
+ message: formatMessage({
584
+ id: 'notification.error',
585
+ defaultMessage: 'An error occurred'
586
+ })
587
+ });
588
+ throw err;
589
+ }
590
+ }
591
+ dispatch({
592
+ type: 'GO_TO_CREATED_RELATION',
593
+ payload: {
594
+ document: newRelation,
595
+ shouldBypassConfirmation: true
596
+ }
597
+ });
499
598
  }
500
599
  } else if ('error' in res && isBaseQueryError(res.error) && res.error.name === 'ValidationError') {
501
600
  setErrors(formatValidationErrors(res.error));
@@ -569,16 +668,40 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
569
668
  const isCloning = cloneMatch !== null;
570
669
  const { formatMessage } = useIntl();
571
670
  const { create, update, clone, isLoading } = useDocumentActions();
671
+ const { currentDocument: { components } } = useDocumentContext('UpdateAction');
572
672
  const [{ rawQuery }] = useQueryParams();
573
673
  const onPreview = usePreviewContext('UpdateAction', (state)=>state.onPreview, false);
674
+ const { getInitialFormValues } = useDoc();
574
675
  const isSubmitting = useForm('UpdateAction', ({ isSubmitting })=>isSubmitting);
575
676
  const modified = useForm('UpdateAction', ({ modified })=>modified);
576
677
  const setSubmitting = useForm('UpdateAction', ({ setSubmitting })=>setSubmitting);
678
+ const initialValues = useForm('UpdateAction', ({ initialValues })=>initialValues);
577
679
  const document = useForm('UpdateAction', ({ values })=>values);
578
680
  const validate = useForm('UpdateAction', (state)=>state.validate);
579
681
  const setErrors = useForm('UpdateAction', (state)=>state.setErrors);
580
- const resetForm = useForm('PublishAction', ({ resetForm })=>resetForm);
682
+ const resetForm = useForm('UpdateAction', ({ resetForm })=>resetForm);
683
+ const dispatch = useRelationModal('UpdateAction', (state)=>state.dispatch);
684
+ // need to discriminate if the update is coming from a relation modal or in the edit view
685
+ const relationContext = useRelationModal('UpdateAction', ()=>true, false);
686
+ const relationalModalSchema = useRelationModal('UpdateAction', (state)=>state.currentDocument.schema, false);
687
+ const fieldToConnect = useRelationModal('UpdateAction', (state)=>state.state.fieldToConnect, false);
688
+ const fieldToConnectUID = useRelationModal('PublishAction', (state)=>state.state.fieldToConnectUID, false);
689
+ const documentHistory = useRelationModal('UpdateAction', (state)=>state.state.documentHistory, false);
690
+ const rootDocumentMeta = useRelationModal('UpdateAction', (state)=>state.rootDocumentMeta);
691
+ const fromRelationModal = relationContext != undefined;
581
692
  const { currentDocumentMeta } = useDocumentContext('UpdateAction');
693
+ const [updateDocumentMutation] = useUpdateDocumentMutation();
694
+ const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
695
+ const parentDocumentMetaToUpdate = documentHistory?.at(-2) ?? rootDocumentMeta;
696
+ const parentDocumentData = useDocument({
697
+ documentId: parentDocumentMetaToUpdate?.documentId,
698
+ model: parentDocumentMetaToUpdate?.model,
699
+ collectionType: parentDocumentMetaToUpdate?.collectionType,
700
+ params: parentDocumentMetaToUpdate?.params
701
+ }, {
702
+ skip: !parentDocumentMetaToUpdate
703
+ });
704
+ const { schema } = useDoc();
582
705
  const handleUpdate = React.useCallback(async ()=>{
583
706
  setSubmitting(true);
584
707
  try {
@@ -615,30 +738,91 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
615
738
  setErrors(formatValidationErrors(res.error));
616
739
  }
617
740
  } else if (documentId || collectionType === SINGLE_TYPES) {
741
+ const { data } = handleInvisibleAttributes(transformData(document), {
742
+ schema: fromRelationModal ? relationalModalSchema : schema,
743
+ initialValues,
744
+ components
745
+ });
618
746
  const res = await update({
619
747
  collectionType,
620
748
  model,
621
749
  documentId,
622
750
  params: currentDocumentMeta.params
623
- }, transformData(document));
751
+ }, data);
624
752
  if ('error' in res && isBaseQueryError(res.error) && res.error.name === 'ValidationError') {
625
753
  setErrors(formatValidationErrors(res.error));
626
754
  } else {
627
755
  resetForm();
628
756
  }
629
757
  } else {
758
+ const { data } = handleInvisibleAttributes(transformData(document), {
759
+ schema: fromRelationModal ? relationalModalSchema : schema,
760
+ initialValues,
761
+ components
762
+ });
630
763
  const res = await create({
631
764
  model,
632
765
  params: currentDocumentMeta.params
633
- }, transformData(document));
766
+ }, data);
634
767
  if ('data' in res && collectionType !== SINGLE_TYPES) {
635
- navigate({
636
- pathname: `../${res.data.documentId}`,
637
- search: rawQuery
638
- }, {
639
- replace: true,
640
- relative: 'path'
641
- });
768
+ if (fromRelationModal) {
769
+ const createdRelation = {
770
+ documentId: res.data.documentId,
771
+ collectionType,
772
+ model,
773
+ params: currentDocumentMeta.params
774
+ };
775
+ /*
776
+ * Update, if needed, the parent relation with the newly published document.
777
+ * Check if in history we have the parent relation otherwise use the
778
+ * rootDocument
779
+ */ if (fieldToConnect && documentHistory && (parentDocumentMetaToUpdate.documentId || parentDocumentMetaToUpdate.collectionType === SINGLE_TYPES)) {
780
+ const parentDataToUpdate = parentDocumentMetaToUpdate.collectionType === SINGLE_TYPES ? getInitialFormValues() : parentDocumentData.getInitialFormValues();
781
+ const dataToUpdate = connectRelationToParent(parentDataToUpdate, fieldToConnect, res.data, fieldToConnectUID);
782
+ try {
783
+ const updateRes = await updateDocumentMutation({
784
+ collectionType: parentDocumentMetaToUpdate.collectionType,
785
+ model: parentDocumentMetaToUpdate.model,
786
+ documentId: parentDocumentMetaToUpdate.collectionType !== SINGLE_TYPES ? parentDocumentMetaToUpdate.documentId : undefined,
787
+ params: parentDocumentMetaToUpdate.params,
788
+ data: {
789
+ ...dataToUpdate
790
+ }
791
+ });
792
+ if ('error' in updateRes) {
793
+ toggleNotification({
794
+ type: 'danger',
795
+ message: formatAPIError(updateRes.error)
796
+ });
797
+ return;
798
+ }
799
+ } catch (err) {
800
+ toggleNotification({
801
+ type: 'danger',
802
+ message: formatMessage({
803
+ id: 'notification.error',
804
+ defaultMessage: 'An error occurred'
805
+ })
806
+ });
807
+ throw err;
808
+ }
809
+ }
810
+ dispatch({
811
+ type: 'GO_TO_CREATED_RELATION',
812
+ payload: {
813
+ document: createdRelation,
814
+ shouldBypassConfirmation: true
815
+ }
816
+ });
817
+ } else {
818
+ navigate({
819
+ pathname: `../${res.data.documentId}`,
820
+ search: rawQuery
821
+ }, {
822
+ replace: true,
823
+ relative: 'path'
824
+ });
825
+ }
642
826
  } else if ('error' in res && isBaseQueryError(res.error) && res.error.name === 'ValidationError') {
643
827
  setErrors(formatValidationErrors(res.error));
644
828
  }
@@ -650,27 +834,41 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
650
834
  }
651
835
  }
652
836
  }, [
837
+ setSubmitting,
838
+ modified,
839
+ validate,
840
+ isCloning,
841
+ documentId,
842
+ collectionType,
843
+ toggleNotification,
844
+ formatMessage,
653
845
  clone,
846
+ model,
654
847
  cloneMatch?.params.origin,
655
- collectionType,
656
- create,
657
848
  currentDocumentMeta.params,
658
849
  document,
659
- documentId,
660
- formatMessage,
661
- formatValidationErrors,
662
- isCloning,
663
- model,
664
- modified,
665
850
  navigate,
666
851
  rawQuery,
667
- resetForm,
668
852
  setErrors,
669
- setSubmitting,
670
- toggleNotification,
853
+ formatValidationErrors,
671
854
  update,
672
- validate,
673
- onPreview
855
+ resetForm,
856
+ create,
857
+ fromRelationModal,
858
+ fieldToConnect,
859
+ documentHistory,
860
+ parentDocumentMetaToUpdate,
861
+ dispatch,
862
+ getInitialFormValues,
863
+ parentDocumentData,
864
+ fieldToConnectUID,
865
+ updateDocumentMutation,
866
+ formatAPIError,
867
+ onPreview,
868
+ initialValues,
869
+ schema,
870
+ components,
871
+ relationalModalSchema
674
872
  ]);
675
873
  // Auto-save on CMD+S or CMD+Enter on macOS, and CTRL+S or CTRL+Enter on Windows/Linux
676
874
  React.useEffect(()=>{