@webiny/app-headless-cms-workflows 0.0.0-unstable.0156a4c312

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 (417) hide show
  1. package/Components/CmsEntriesList/CmsReviewMoveEntryAction.d.ts +2 -0
  2. package/Components/CmsEntriesList/CmsReviewMoveEntryAction.js +43 -0
  3. package/Components/CmsEntriesList/CmsReviewMoveEntryAction.js.map +1 -0
  4. package/Components/CmsEntriesList/CmsReviewMoveEntryAction.test.d.ts +1 -0
  5. package/Components/CmsEntriesList/CmsReviewMoveEntryAction.test.js +118 -0
  6. package/Components/CmsEntriesList/CmsReviewMoveEntryAction.test.js.map +1 -0
  7. package/Components/CmsEntriesList/CmsReviewScheduleEntryAction.d.ts +2 -0
  8. package/Components/CmsEntriesList/CmsReviewScheduleEntryAction.js +22 -0
  9. package/Components/CmsEntriesList/CmsReviewScheduleEntryAction.js.map +1 -0
  10. package/Components/CmsEntriesList/CmsReviewScheduleEntryAction.test.d.ts +1 -0
  11. package/Components/CmsEntriesList/CmsReviewScheduleEntryAction.test.js +98 -0
  12. package/Components/CmsEntriesList/CmsReviewScheduleEntryAction.test.js.map +1 -0
  13. package/Components/ContentEntryForm/CmsEntryReviewBar.d.ts +2 -0
  14. package/Components/ContentEntryForm/CmsEntryReviewBar.js +32 -0
  15. package/Components/ContentEntryForm/CmsEntryReviewBar.js.map +1 -0
  16. package/Components/ContentEntryForm/CmsEntryReviewBar.test.d.ts +1 -0
  17. package/Components/ContentEntryForm/CmsEntryReviewBar.test.js +128 -0
  18. package/Components/ContentEntryForm/CmsEntryReviewBar.test.js.map +1 -0
  19. package/Components/ContentEntryForm/CmsEntryReviewBlockedActions.d.ts +2 -0
  20. package/Components/ContentEntryForm/CmsEntryReviewBlockedActions.js +46 -0
  21. package/Components/ContentEntryForm/CmsEntryReviewBlockedActions.js.map +1 -0
  22. package/Components/ContentEntryForm/CmsEntryReviewBlockedActions.test.d.ts +1 -0
  23. package/Components/ContentEntryForm/CmsEntryReviewBlockedActions.test.js +222 -0
  24. package/Components/ContentEntryForm/CmsEntryReviewBlockedActions.test.js.map +1 -0
  25. package/Components/ContentEntryForm/CmsEntryReviewFormLock.d.ts +2 -0
  26. package/Components/ContentEntryForm/CmsEntryReviewFormLock.js +32 -0
  27. package/Components/ContentEntryForm/CmsEntryReviewFormLock.js.map +1 -0
  28. package/Components/ContentEntryForm/CmsEntryReviewFormLock.test.d.ts +1 -0
  29. package/Components/ContentEntryForm/CmsEntryReviewFormLock.test.js +94 -0
  30. package/Components/ContentEntryForm/CmsEntryReviewFormLock.test.js.map +1 -0
  31. package/Components/ContentEntryForm/CmsEntryReviewNewRevision.d.ts +2 -0
  32. package/Components/ContentEntryForm/CmsEntryReviewNewRevision.js +56 -0
  33. package/Components/ContentEntryForm/CmsEntryReviewNewRevision.js.map +1 -0
  34. package/Components/ContentEntryForm/CmsEntryReviewNewRevision.test.d.ts +1 -0
  35. package/Components/ContentEntryForm/CmsEntryReviewNewRevision.test.js +186 -0
  36. package/Components/ContentEntryForm/CmsEntryReviewNewRevision.test.js.map +1 -0
  37. package/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.d.ts +2 -0
  38. package/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.js +26 -0
  39. package/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.js.map +1 -0
  40. package/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.test.d.ts +1 -0
  41. package/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.test.js +78 -0
  42. package/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.test.js.map +1 -0
  43. package/Components/ContentEntryForm/getModelFieldLabels.d.ts +3 -0
  44. package/Components/ContentEntryForm/getModelFieldLabels.js +8 -0
  45. package/Components/ContentEntryForm/getModelFieldLabels.js.map +1 -0
  46. package/Components/ContentEntryForm/index.d.ts +5 -0
  47. package/Components/ContentEntryForm/index.js +5 -0
  48. package/Components/ContentReviews/CmsContentReviews.d.ts +2 -0
  49. package/Components/ContentReviews/CmsContentReviews.js +11 -0
  50. package/Components/ContentReviews/CmsContentReviews.js.map +1 -0
  51. package/Components/ContentReviews/CmsContentReviews.test.d.ts +1 -0
  52. package/Components/ContentReviews/CmsContentReviews.test.js +214 -0
  53. package/Components/ContentReviews/CmsContentReviews.test.js.map +1 -0
  54. package/Components/ContentReviews/CmsContentReviewsMount.d.ts +4 -0
  55. package/Components/ContentReviews/CmsContentReviewsMount.js +44 -0
  56. package/Components/ContentReviews/CmsContentReviewsMount.js.map +1 -0
  57. package/Components/ContentReviews/CmsContentReviewsSidebarItem.d.ts +2 -0
  58. package/Components/ContentReviews/CmsContentReviewsSidebarItem.js +20 -0
  59. package/Components/ContentReviews/CmsContentReviewsSidebarItem.js.map +1 -0
  60. package/Components/ContentReviews/CmsContentReviewsSidebarItem.test.d.ts +1 -0
  61. package/Components/ContentReviews/CmsContentReviewsSidebarItem.test.js +83 -0
  62. package/Components/ContentReviews/CmsContentReviewsSidebarItem.test.js.map +1 -0
  63. package/Components/ModelDelete/ModelBoundToWorkflowErrorData.d.ts +8 -0
  64. package/Components/ModelDelete/ModelBoundToWorkflowErrorData.js +0 -0
  65. package/Components/ModelDelete/ModelDeleteWorkflowCopy.d.ts +10 -0
  66. package/Components/ModelDelete/ModelDeleteWorkflowCopy.js +0 -0
  67. package/Components/ModelDelete/ModelDeleteWorkflowError.d.ts +2 -0
  68. package/Components/ModelDelete/ModelDeleteWorkflowError.js +34 -0
  69. package/Components/ModelDelete/ModelDeleteWorkflowError.js.map +1 -0
  70. package/Components/ModelDelete/ModelDeleteWorkflowError.test.d.ts +1 -0
  71. package/Components/ModelDelete/ModelDeleteWorkflowError.test.js +73 -0
  72. package/Components/ModelDelete/ModelDeleteWorkflowError.test.js.map +1 -0
  73. package/Components/ModelDelete/getModelDeleteWorkflowCopy.d.ts +3 -0
  74. package/Components/ModelDelete/getModelDeleteWorkflowCopy.js +17 -0
  75. package/Components/ModelDelete/getModelDeleteWorkflowCopy.js.map +1 -0
  76. package/Components/ModelDelete/getModelDeleteWorkflowCopy.test.d.ts +1 -0
  77. package/Components/ModelDelete/getModelDeleteWorkflowCopy.test.js +28 -0
  78. package/Components/ModelDelete/getModelDeleteWorkflowCopy.test.js.map +1 -0
  79. package/Components/ignoreAction.d.ts +1 -0
  80. package/Components/ignoreAction.js +4 -0
  81. package/Components/ignoreAction.js.map +1 -0
  82. package/LICENSE +21 -0
  83. package/README.md +11 -0
  84. package/Routes/CmsWorkflowEditor.d.ts +2 -0
  85. package/Routes/CmsWorkflowEditor.js +23 -0
  86. package/Routes/CmsWorkflowEditor.js.map +1 -0
  87. package/Routes/CmsWorkflowEditor.test.d.ts +1 -0
  88. package/Routes/CmsWorkflowEditor.test.js +141 -0
  89. package/Routes/CmsWorkflowEditor.test.js.map +1 -0
  90. package/Routes/index.d.ts +1 -0
  91. package/Routes/index.js +1 -0
  92. package/features/cache/CmsReviewCacheSyncHandler.d.ts +8 -0
  93. package/features/cache/CmsReviewCacheSyncHandler.js +14 -0
  94. package/features/cache/CmsReviewCacheSyncHandler.js.map +1 -0
  95. package/features/cache/CmsReviewCacheWriter.d.ts +14 -0
  96. package/features/cache/CmsReviewCacheWriter.js +39 -0
  97. package/features/cache/CmsReviewCacheWriter.js.map +1 -0
  98. package/features/cache/CmsReviewCacheWriter.test.d.ts +1 -0
  99. package/features/cache/CmsReviewCacheWriter.test.js +207 -0
  100. package/features/cache/CmsReviewCacheWriter.test.js.map +1 -0
  101. package/features/cache/CmsReviewEntriesCacheProviderDecorator.d.ts +12 -0
  102. package/features/cache/CmsReviewEntriesCacheProviderDecorator.js +17 -0
  103. package/features/cache/CmsReviewEntriesCacheProviderDecorator.js.map +1 -0
  104. package/features/cache/CmsReviewEntriesCacheProviderDecorator.test.d.ts +1 -0
  105. package/features/cache/CmsReviewEntriesCacheProviderDecorator.test.js +129 -0
  106. package/features/cache/CmsReviewEntriesCacheProviderDecorator.test.js.map +1 -0
  107. package/features/cache/ReviewPreservingEntriesCache.d.ts +18 -0
  108. package/features/cache/ReviewPreservingEntriesCache.js +54 -0
  109. package/features/cache/ReviewPreservingEntriesCache.js.map +1 -0
  110. package/features/cache/abstractions.d.ts +5 -0
  111. package/features/cache/abstractions.js +5 -0
  112. package/features/cache/abstractions.js.map +1 -0
  113. package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.d.ts +26 -0
  114. package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.js +104 -0
  115. package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.js.map +1 -0
  116. package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.test.d.ts +1 -0
  117. package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.test.js +589 -0
  118. package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.test.js.map +1 -0
  119. package/features/editorGateway/feature.d.ts +1 -0
  120. package/features/editorGateway/feature.js +11 -0
  121. package/features/editorGateway/feature.js.map +1 -0
  122. package/features/editorGateway/feature.test.d.ts +1 -0
  123. package/features/editorGateway/feature.test.js +272 -0
  124. package/features/editorGateway/feature.test.js.map +1 -0
  125. package/features/editorGateway/graphql/cmsEntryFolderExists.d.ts +1 -0
  126. package/features/editorGateway/graphql/cmsEntryFolderExists.js +16 -0
  127. package/features/editorGateway/graphql/cmsEntryFolderExists.js.map +1 -0
  128. package/features/editorGateway/graphql/deleteCmsEntryWorkflow.d.ts +1 -0
  129. package/features/editorGateway/graphql/deleteCmsEntryWorkflow.js +19 -0
  130. package/features/editorGateway/graphql/deleteCmsEntryWorkflow.js.map +1 -0
  131. package/features/editorGateway/graphql/getCmsEntryWorkflow.d.ts +1 -0
  132. package/features/editorGateway/graphql/getCmsEntryWorkflow.js +19 -0
  133. package/features/editorGateway/graphql/getCmsEntryWorkflow.js.map +1 -0
  134. package/features/editorGateway/graphql/inspectCmsEntryRouting.d.ts +1 -0
  135. package/features/editorGateway/graphql/inspectCmsEntryRouting.js +19 -0
  136. package/features/editorGateway/graphql/inspectCmsEntryRouting.js.map +1 -0
  137. package/features/editorGateway/graphql/listCmsEntryWorkflowModels.d.ts +1 -0
  138. package/features/editorGateway/graphql/listCmsEntryWorkflowModels.js +29 -0
  139. package/features/editorGateway/graphql/listCmsEntryWorkflowModels.js.map +1 -0
  140. package/features/editorGateway/graphql/storeCmsEntryWorkflow.d.ts +1 -0
  141. package/features/editorGateway/graphql/storeCmsEntryWorkflow.js +19 -0
  142. package/features/editorGateway/graphql/storeCmsEntryWorkflow.js.map +1 -0
  143. package/features/editorMounting/CmsWorkflowEditorAppAdapter.d.ts +25 -0
  144. package/features/editorMounting/CmsWorkflowEditorAppAdapter.js +51 -0
  145. package/features/editorMounting/CmsWorkflowEditorAppAdapter.js.map +1 -0
  146. package/features/editorMounting/CmsWorkflowEditorAppAdapter.test.d.ts +1 -0
  147. package/features/editorMounting/CmsWorkflowEditorAppAdapter.test.js +185 -0
  148. package/features/editorMounting/CmsWorkflowEditorAppAdapter.test.js.map +1 -0
  149. package/features/editorMounting/abstractions.d.ts +5 -0
  150. package/features/editorMounting/abstractions.js +5 -0
  151. package/features/editorMounting/abstractions.js.map +1 -0
  152. package/features/editorMounting/feature.d.ts +3 -0
  153. package/features/editorMounting/feature.js +19 -0
  154. package/features/editorMounting/feature.js.map +1 -0
  155. package/features/editorMounting/feature.test.d.ts +1 -0
  156. package/features/editorMounting/feature.test.js +100 -0
  157. package/features/editorMounting/feature.test.js.map +1 -0
  158. package/features/editorReview/CmsEntryReview.d.ts +8 -0
  159. package/features/editorReview/CmsEntryReview.js +14 -0
  160. package/features/editorReview/CmsEntryReview.js.map +1 -0
  161. package/features/editorReview/abstractions.d.ts +5 -0
  162. package/features/editorReview/abstractions.js +5 -0
  163. package/features/editorReview/abstractions.js.map +1 -0
  164. package/features/editorReview/feature.d.ts +3 -0
  165. package/features/editorReview/feature.js +17 -0
  166. package/features/editorReview/feature.js.map +1 -0
  167. package/features/editorReview/feature.test.d.ts +1 -0
  168. package/features/editorReview/feature.test.js +46 -0
  169. package/features/editorReview/feature.test.js.map +1 -0
  170. package/features/editorReview/useCmsEntryReview.d.ts +2 -0
  171. package/features/editorReview/useCmsEntryReview.js +8 -0
  172. package/features/editorReview/useCmsEntryReview.js.map +1 -0
  173. package/features/feature.d.ts +1 -0
  174. package/features/feature.js +15 -0
  175. package/features/feature.js.map +1 -0
  176. package/features/gateway/CmsReviewChangeMessageHandler.d.ts +8 -0
  177. package/features/gateway/CmsReviewChangeMessageHandler.js +16 -0
  178. package/features/gateway/CmsReviewChangeMessageHandler.js.map +1 -0
  179. package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.d.ts +16 -0
  180. package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.js +39 -0
  181. package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.js.map +1 -0
  182. package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.test.d.ts +1 -0
  183. package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.test.js +83 -0
  184. package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.test.js.map +1 -0
  185. package/features/gateway/CmsReviewContentAdapter/abstractions.d.ts +5 -0
  186. package/features/gateway/CmsReviewContentAdapter/abstractions.js +5 -0
  187. package/features/gateway/CmsReviewContentAdapter/abstractions.js.map +1 -0
  188. package/features/gateway/CmsReviewGateway/CmsReviewGateway.d.ts +52 -0
  189. package/features/gateway/CmsReviewGateway/CmsReviewGateway.js +221 -0
  190. package/features/gateway/CmsReviewGateway/CmsReviewGateway.js.map +1 -0
  191. package/features/gateway/CmsReviewGateway/CmsReviewGateway.test.d.ts +1 -0
  192. package/features/gateway/CmsReviewGateway/CmsReviewGateway.test.js +689 -0
  193. package/features/gateway/CmsReviewGateway/CmsReviewGateway.test.js.map +1 -0
  194. package/features/gateway/CmsReviewNotificationHandler.d.ts +8 -0
  195. package/features/gateway/CmsReviewNotificationHandler.js +16 -0
  196. package/features/gateway/CmsReviewNotificationHandler.js.map +1 -0
  197. package/features/gateway/CmsReviewRowProvider/CmsReviewRowProvider.d.ts +8 -0
  198. package/features/gateway/CmsReviewRowProvider/CmsReviewRowProvider.js +14 -0
  199. package/features/gateway/CmsReviewRowProvider/CmsReviewRowProvider.js.map +1 -0
  200. package/features/gateway/CmsReviewRowProvider/abstractions.d.ts +5 -0
  201. package/features/gateway/CmsReviewRowProvider/abstractions.js +5 -0
  202. package/features/gateway/CmsReviewRowProvider/abstractions.js.map +1 -0
  203. package/features/gateway/contentReviewsBindings.test.d.ts +1 -0
  204. package/features/gateway/contentReviewsBindings.test.js +125 -0
  205. package/features/gateway/contentReviewsBindings.test.js.map +1 -0
  206. package/features/gateway/feature.d.ts +4 -0
  207. package/features/gateway/feature.js +27 -0
  208. package/features/gateway/feature.js.map +1 -0
  209. package/features/gateway/feature.test.d.ts +1 -0
  210. package/features/gateway/feature.test.js +79 -0
  211. package/features/gateway/feature.test.js.map +1 -0
  212. package/features/gateway/graphql/CmsOperationResponse.d.ts +3 -0
  213. package/features/gateway/graphql/CmsOperationResponse.js +0 -0
  214. package/features/gateway/graphql/approveCmsEntryReviewStep.d.ts +1 -0
  215. package/features/gateway/graphql/approveCmsEntryReviewStep.js +18 -0
  216. package/features/gateway/graphql/approveCmsEntryReviewStep.js.map +1 -0
  217. package/features/gateway/graphql/cancelCmsEntryReview.d.ts +1 -0
  218. package/features/gateway/graphql/cancelCmsEntryReview.js +18 -0
  219. package/features/gateway/graphql/cancelCmsEntryReview.js.map +1 -0
  220. package/features/gateway/graphql/cancelCmsEntryReviewsForDelete.d.ts +1 -0
  221. package/features/gateway/graphql/cancelCmsEntryReviewsForDelete.js +28 -0
  222. package/features/gateway/graphql/cancelCmsEntryReviewsForDelete.js.map +1 -0
  223. package/features/gateway/graphql/getCmsEntryReview.d.ts +1 -0
  224. package/features/gateway/graphql/getCmsEntryReview.js +18 -0
  225. package/features/gateway/graphql/getCmsEntryReview.js.map +1 -0
  226. package/features/gateway/graphql/getCmsEntryReviewStepRun.d.ts +1 -0
  227. package/features/gateway/graphql/getCmsEntryReviewStepRun.js +18 -0
  228. package/features/gateway/graphql/getCmsEntryReviewStepRun.js.map +1 -0
  229. package/features/gateway/graphql/getCmsEntryTargetReview.d.ts +1 -0
  230. package/features/gateway/graphql/getCmsEntryTargetReview.js +18 -0
  231. package/features/gateway/graphql/getCmsEntryTargetReview.js.map +1 -0
  232. package/features/gateway/graphql/listCmsEntryBlockingReviews.d.ts +1 -0
  233. package/features/gateway/graphql/listCmsEntryBlockingReviews.js +18 -0
  234. package/features/gateway/graphql/listCmsEntryBlockingReviews.js.map +1 -0
  235. package/features/gateway/graphql/listCmsEntryReviewStepCandidates.d.ts +1 -0
  236. package/features/gateway/graphql/listCmsEntryReviewStepCandidates.js +18 -0
  237. package/features/gateway/graphql/listCmsEntryReviewStepCandidates.js.map +1 -0
  238. package/features/gateway/graphql/listCmsEntryReviews.d.ts +1 -0
  239. package/features/gateway/graphql/listCmsEntryReviews.js +34 -0
  240. package/features/gateway/graphql/listCmsEntryReviews.js.map +1 -0
  241. package/features/gateway/graphql/listCmsEntryStepCandidates.d.ts +1 -0
  242. package/features/gateway/graphql/listCmsEntryStepCandidates.js +28 -0
  243. package/features/gateway/graphql/listCmsEntryStepCandidates.js.map +1 -0
  244. package/features/gateway/graphql/listCmsEntryWorkflows.d.ts +1 -0
  245. package/features/gateway/graphql/listCmsEntryWorkflows.js +18 -0
  246. package/features/gateway/graphql/listCmsEntryWorkflows.js.map +1 -0
  247. package/features/gateway/graphql/reassignCmsEntryReviewStep.d.ts +1 -0
  248. package/features/gateway/graphql/reassignCmsEntryReviewStep.js +18 -0
  249. package/features/gateway/graphql/reassignCmsEntryReviewStep.js.map +1 -0
  250. package/features/gateway/graphql/rejectCmsEntryReviewStep.d.ts +1 -0
  251. package/features/gateway/graphql/rejectCmsEntryReviewStep.js +18 -0
  252. package/features/gateway/graphql/rejectCmsEntryReviewStep.js.map +1 -0
  253. package/features/gateway/graphql/requestCmsEntryReview.d.ts +1 -0
  254. package/features/gateway/graphql/requestCmsEntryReview.js +28 -0
  255. package/features/gateway/graphql/requestCmsEntryReview.js.map +1 -0
  256. package/features/gateway/graphql/restartCmsEntryReviewStep.d.ts +1 -0
  257. package/features/gateway/graphql/restartCmsEntryReviewStep.js +18 -0
  258. package/features/gateway/graphql/restartCmsEntryReviewStep.js.map +1 -0
  259. package/features/gateway/graphql/startCmsEntryReviewStep.d.ts +1 -0
  260. package/features/gateway/graphql/startCmsEntryReviewStep.js +18 -0
  261. package/features/gateway/graphql/startCmsEntryReviewStep.js.map +1 -0
  262. package/features/gateway/graphql/takeOverCmsEntryReviewStep.d.ts +1 -0
  263. package/features/gateway/graphql/takeOverCmsEntryReviewStep.js +22 -0
  264. package/features/gateway/graphql/takeOverCmsEntryReviewStep.js.map +1 -0
  265. package/features/trash/BulkDeletePresenterReviewDecorator.d.ts +20 -0
  266. package/features/trash/BulkDeletePresenterReviewDecorator.js +81 -0
  267. package/features/trash/BulkDeletePresenterReviewDecorator.js.map +1 -0
  268. package/features/trash/BulkDeletePresenterReviewDecorator.test.d.ts +1 -0
  269. package/features/trash/BulkDeletePresenterReviewDecorator.test.js +693 -0
  270. package/features/trash/BulkDeletePresenterReviewDecorator.test.js.map +1 -0
  271. package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.d.ts +13 -0
  272. package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.js +23 -0
  273. package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.js.map +1 -0
  274. package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.test.d.ts +1 -0
  275. package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.test.js +123 -0
  276. package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.test.js.map +1 -0
  277. package/features/trash/DeleteEntryUseCaseReviewDecorator.d.ts +13 -0
  278. package/features/trash/DeleteEntryUseCaseReviewDecorator.js +23 -0
  279. package/features/trash/DeleteEntryUseCaseReviewDecorator.js.map +1 -0
  280. package/features/trash/DeleteEntryUseCaseReviewDecorator.test.d.ts +1 -0
  281. package/features/trash/DeleteEntryUseCaseReviewDecorator.test.js +139 -0
  282. package/features/trash/DeleteEntryUseCaseReviewDecorator.test.js.map +1 -0
  283. package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.d.ts +13 -0
  284. package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.js +23 -0
  285. package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.js.map +1 -0
  286. package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.test.d.ts +1 -0
  287. package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.test.js +122 -0
  288. package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.test.js.map +1 -0
  289. package/features/trash/feature.d.ts +1 -0
  290. package/features/trash/feature.js +17 -0
  291. package/features/trash/feature.js.map +1 -0
  292. package/features/trash/feature.test.d.ts +1 -0
  293. package/features/trash/feature.test.js +213 -0
  294. package/features/trash/feature.test.js.map +1 -0
  295. package/index.d.ts +2 -0
  296. package/index.editor.test.d.ts +1 -0
  297. package/index.editor.test.js +149 -0
  298. package/index.editor.test.js.map +1 -0
  299. package/index.js +41 -0
  300. package/index.js.map +1 -0
  301. package/index.lists.test.d.ts +1 -0
  302. package/index.lists.test.js +172 -0
  303. package/index.lists.test.js.map +1 -0
  304. package/index.mount.test.d.ts +1 -0
  305. package/index.mount.test.js +49 -0
  306. package/index.mount.test.js.map +1 -0
  307. package/index.test.d.ts +1 -0
  308. package/index.test.js +414 -0
  309. package/index.test.js.map +1 -0
  310. package/package.json +54 -0
  311. package/presentation/CmsEntryContentReloader.d.ts +8 -0
  312. package/presentation/CmsEntryContentReloader.js +20 -0
  313. package/presentation/CmsEntryContentReloader.js.map +1 -0
  314. package/presentation/CmsEntryContentReloader.test.d.ts +1 -0
  315. package/presentation/CmsEntryContentReloader.test.js +118 -0
  316. package/presentation/CmsEntryContentReloader.test.js.map +1 -0
  317. package/presentation/CmsEntryFormPresenterReviewDecorator.d.ts +27 -0
  318. package/presentation/CmsEntryFormPresenterReviewDecorator.js +167 -0
  319. package/presentation/CmsEntryFormPresenterReviewDecorator.js.map +1 -0
  320. package/presentation/CmsEntryFormPresenterReviewDecorator.test.d.ts +1 -0
  321. package/presentation/CmsEntryFormPresenterReviewDecorator.test.js +601 -0
  322. package/presentation/CmsEntryFormPresenterReviewDecorator.test.js.map +1 -0
  323. package/presentation/CmsEntryUnsavedChanges.d.ts +7 -0
  324. package/presentation/CmsEntryUnsavedChanges.js +12 -0
  325. package/presentation/CmsEntryUnsavedChanges.js.map +1 -0
  326. package/presentation/CmsEntryUnsavedChanges.test.d.ts +1 -0
  327. package/presentation/CmsEntryUnsavedChanges.test.js +23 -0
  328. package/presentation/CmsEntryUnsavedChanges.test.js.map +1 -0
  329. package/presentation/CmsReviewFieldSelections.test.d.ts +1 -0
  330. package/presentation/CmsReviewFieldSelections.test.js +27 -0
  331. package/presentation/CmsReviewFieldSelections.test.js.map +1 -0
  332. package/presentation/CmsReviewGetEntryFieldSelection.d.ts +8 -0
  333. package/presentation/CmsReviewGetEntryFieldSelection.js +16 -0
  334. package/presentation/CmsReviewGetEntryFieldSelection.js.map +1 -0
  335. package/presentation/CmsReviewListEntriesFieldSelection.d.ts +8 -0
  336. package/presentation/CmsReviewListEntriesFieldSelection.js +16 -0
  337. package/presentation/CmsReviewListEntriesFieldSelection.js.map +1 -0
  338. package/presentation/CmsReviewTableRowMapperDecorator.d.ts +11 -0
  339. package/presentation/CmsReviewTableRowMapperDecorator.js +24 -0
  340. package/presentation/CmsReviewTableRowMapperDecorator.js.map +1 -0
  341. package/presentation/CmsReviewTableRowMapperDecorator.test.d.ts +1 -0
  342. package/presentation/CmsReviewTableRowMapperDecorator.test.js +120 -0
  343. package/presentation/CmsReviewTableRowMapperDecorator.test.js.map +1 -0
  344. package/presentation/CmsRevisionsListPresenterDecorator.d.ts +24 -0
  345. package/presentation/CmsRevisionsListPresenterDecorator.js +66 -0
  346. package/presentation/CmsRevisionsListPresenterDecorator.js.map +1 -0
  347. package/presentation/CmsRevisionsListPresenterDecorator.test.d.ts +1 -0
  348. package/presentation/CmsRevisionsListPresenterDecorator.test.js +174 -0
  349. package/presentation/CmsRevisionsListPresenterDecorator.test.js.map +1 -0
  350. package/presentation/contentReviews/CmsContentReviewsPresenter.d.ts +28 -0
  351. package/presentation/contentReviews/CmsContentReviewsPresenter.js +103 -0
  352. package/presentation/contentReviews/CmsContentReviewsPresenter.js.map +1 -0
  353. package/presentation/contentReviews/CmsContentReviewsPresenter.test.d.ts +1 -0
  354. package/presentation/contentReviews/CmsContentReviewsPresenter.test.js +238 -0
  355. package/presentation/contentReviews/CmsContentReviewsPresenter.test.js.map +1 -0
  356. package/presentation/contentReviews/abstractions.d.ts +31 -0
  357. package/presentation/contentReviews/abstractions.js +5 -0
  358. package/presentation/contentReviews/abstractions.js.map +1 -0
  359. package/presentation/contentReviews/feature.d.ts +3 -0
  360. package/presentation/contentReviews/feature.js +17 -0
  361. package/presentation/contentReviews/feature.js.map +1 -0
  362. package/presentation/contentReviews/toContentTypes.d.ts +3 -0
  363. package/presentation/contentReviews/toContentTypes.js +14 -0
  364. package/presentation/contentReviews/toContentTypes.js.map +1 -0
  365. package/presentation/contentReviews/toContentTypes.test.d.ts +1 -0
  366. package/presentation/contentReviews/toContentTypes.test.js +20 -0
  367. package/presentation/contentReviews/toContentTypes.test.js.map +1 -0
  368. package/presentation/feature.d.ts +1 -0
  369. package/presentation/feature.js +19 -0
  370. package/presentation/feature.js.map +1 -0
  371. package/presentation/getCmsEntryReviewContext.d.ts +4 -0
  372. package/presentation/getCmsEntryReviewContext.js +12 -0
  373. package/presentation/getCmsEntryReviewContext.js.map +1 -0
  374. package/presentation/getCmsEntryReviewInitParams.d.ts +13 -0
  375. package/presentation/getCmsEntryReviewInitParams.js +18 -0
  376. package/presentation/getCmsEntryReviewInitParams.js.map +1 -0
  377. package/presentation/getCmsEntryReviewInitParams.test.d.ts +1 -0
  378. package/presentation/getCmsEntryReviewInitParams.test.js +69 -0
  379. package/presentation/getCmsEntryReviewInitParams.test.js.map +1 -0
  380. package/routes.d.ts +11 -0
  381. package/routes.js +21 -0
  382. package/routes.js.map +1 -0
  383. package/testing/createEntry.d.ts +3 -0
  384. package/testing/createEntry.js +22 -0
  385. package/testing/createEntry.js.map +1 -0
  386. package/testing/createEntrySession.d.ts +9 -0
  387. package/testing/createEntrySession.js +29 -0
  388. package/testing/createEntrySession.js.map +1 -0
  389. package/testing/createFolder.d.ts +2 -0
  390. package/testing/createFolder.js +13 -0
  391. package/testing/createFolder.js.map +1 -0
  392. package/testing/createFormVm.d.ts +2 -0
  393. package/testing/createFormVm.js +22 -0
  394. package/testing/createFormVm.js.map +1 -0
  395. package/testing/models.d.ts +4 -0
  396. package/testing/models.js +23 -0
  397. package/testing/models.js.map +1 -0
  398. package/testing/renderEditorTree.d.ts +17 -0
  399. package/testing/renderEditorTree.js +93 -0
  400. package/testing/renderEditorTree.js.map +1 -0
  401. package/testing/reviewStates.d.ts +17 -0
  402. package/testing/reviewStates.js +65 -0
  403. package/testing/reviewStates.js.map +1 -0
  404. package/types.d.ts +10 -0
  405. package/types.js +0 -0
  406. package/utils/appName.d.ts +4 -0
  407. package/utils/appName.js +13 -0
  408. package/utils/appName.js.map +1 -0
  409. package/utils/isReviewableModel.d.ts +2 -0
  410. package/utils/isReviewableModel.js +7 -0
  411. package/utils/isReviewableModel.js.map +1 -0
  412. package/utils/renderModelIcon.d.ts +3 -0
  413. package/utils/renderModelIcon.js +19 -0
  414. package/utils/renderModelIcon.js.map +1 -0
  415. package/utils/renderModelIconOrFallback.d.ts +3 -0
  416. package/utils/renderModelIconOrFallback.js +17 -0
  417. package/utils/renderModelIconOrFallback.js.map +1 -0
@@ -0,0 +1,186 @@
1
+ import react from "react";
2
+ import { beforeEach, describe, expect, it, vi } from "vitest";
3
+ import { fireEvent, screen, waitFor } from "@testing-library/react";
4
+ import { CmsEntryReviewNewRevision } from "./CmsEntryReviewNewRevision.js";
5
+ import { NO_PUBLISHING_MODEL, SINGLETON_MODEL } from "../../testing/models.js";
6
+ import { createEntry } from "../../testing/createEntry.js";
7
+ import { renderEditorTree } from "../../testing/renderEditorTree.js";
8
+ import { APPROVED, BOUND_NO_REVIEW, FAILED, IN_REVIEW, LOADING, NO_WORKFLOW, REJECTED } from "../../testing/reviewStates.js";
9
+ const mocks = vi.hoisted(()=>({
10
+ canEdit: true,
11
+ setRouteParams: vi.fn(),
12
+ showWarningToast: vi.fn()
13
+ }));
14
+ vi.mock("@webiny/admin-ui", async (importOriginal)=>{
15
+ const actual = await importOriginal();
16
+ return {
17
+ ...actual,
18
+ useToast: ()=>({
19
+ showWarningToast: mocks.showWarningToast
20
+ })
21
+ };
22
+ });
23
+ vi.mock("@webiny/app-admin", async (importOriginal)=>{
24
+ const actual = await importOriginal();
25
+ const React = await import("react");
26
+ return {
27
+ ...actual,
28
+ OptionsMenuItem: (props)=>React.createElement("button", {
29
+ "data-testid": "menu-item",
30
+ disabled: props.disabled ?? false,
31
+ onClick: props.onAction
32
+ }, props.label)
33
+ };
34
+ });
35
+ vi.mock("@webiny/app", async (importOriginal)=>{
36
+ const actual = await importOriginal();
37
+ return {
38
+ ...actual,
39
+ useRoute: ()=>({
40
+ setRouteParams: mocks.setRouteParams
41
+ })
42
+ };
43
+ });
44
+ vi.mock("@webiny/app-headless-cms/admin/hooks/usePermission.js", ()=>({
45
+ usePermission: ()=>({
46
+ canEdit: ()=>mocks.canEdit,
47
+ canPublish: ()=>true
48
+ })
49
+ }));
50
+ function renderMenu(params) {
51
+ return renderEditorTree({
52
+ ...params,
53
+ children: /*#__PURE__*/ react.createElement(CmsEntryReviewNewRevision, null)
54
+ });
55
+ }
56
+ describe("CmsEntryReviewNewRevision", ()=>{
57
+ beforeEach(()=>{
58
+ mocks.canEdit = true;
59
+ mocks.setRouteParams.mockReset();
60
+ mocks.showWarningToast.mockReset();
61
+ });
62
+ it("is registered as the createNewRevision menu item", async ()=>{
63
+ renderMenu({
64
+ reviewVm: NO_WORKFLOW
65
+ });
66
+ const item = await screen.findByTestId("menu-item");
67
+ expect(item.textContent).toBe("Create New Revision");
68
+ expect(item.closest("[data-action]")?.getAttribute("data-action")).toBe("createNewRevision");
69
+ });
70
+ it.each([
71
+ [
72
+ "no workflow",
73
+ NO_WORKFLOW
74
+ ],
75
+ [
76
+ "no active review",
77
+ BOUND_NO_REVIEW
78
+ ],
79
+ [
80
+ "a review in progress",
81
+ IN_REVIEW
82
+ ],
83
+ [
84
+ "a rejected review",
85
+ REJECTED
86
+ ],
87
+ [
88
+ "an approved review",
89
+ APPROVED
90
+ ]
91
+ ])("is enabled for %s", async (_name, reviewVm)=>{
92
+ renderMenu({
93
+ reviewVm
94
+ });
95
+ const item = await screen.findByTestId("menu-item");
96
+ expect(item.hasAttribute("disabled")).toBe(false);
97
+ });
98
+ it.each([
99
+ [
100
+ "loading",
101
+ LOADING
102
+ ],
103
+ [
104
+ "failed",
105
+ FAILED
106
+ ]
107
+ ])("is disabled while the status is %s", async (_name, reviewVm)=>{
108
+ renderMenu({
109
+ reviewVm
110
+ });
111
+ const item = await screen.findByTestId("menu-item");
112
+ expect(item.hasAttribute("disabled")).toBe(true);
113
+ });
114
+ it("stays enabled for a singleton model whatever the shared presenter holds", async ()=>{
115
+ renderMenu({
116
+ formVm: {
117
+ model: SINGLETON_MODEL
118
+ },
119
+ reviewVm: LOADING
120
+ });
121
+ const item = await screen.findByTestId("menu-item");
122
+ expect(item.hasAttribute("disabled")).toBe(false);
123
+ });
124
+ it("renders nothing without an entry", async ()=>{
125
+ renderMenu({
126
+ formVm: {
127
+ entry: null,
128
+ isNewEntry: true
129
+ },
130
+ reviewVm: NO_WORKFLOW
131
+ });
132
+ await screen.findByTestId("menu-actions");
133
+ await waitFor(()=>expect(screen.queryByTestId("menu-item")).toBeNull());
134
+ });
135
+ it("renders nothing without edit permission", async ()=>{
136
+ mocks.canEdit = false;
137
+ renderMenu({
138
+ reviewVm: NO_WORKFLOW
139
+ });
140
+ await screen.findByTestId("menu-actions");
141
+ await waitFor(()=>expect(screen.queryByTestId("menu-item")).toBeNull());
142
+ });
143
+ it("renders nothing for a model that cannot publish", async ()=>{
144
+ renderMenu({
145
+ formVm: {
146
+ model: NO_PUBLISHING_MODEL
147
+ },
148
+ reviewVm: NO_WORKFLOW
149
+ });
150
+ await screen.findByTestId("menu-actions");
151
+ await waitFor(()=>expect(screen.queryByTestId("menu-item")).toBeNull());
152
+ });
153
+ it("creates the revision and moves the route to it", async ()=>{
154
+ const view = renderMenu({
155
+ reviewVm: REJECTED
156
+ });
157
+ const created = createEntry();
158
+ created.id = "entry-1#0002";
159
+ vi.mocked(view.revisions.createRevision).mockResolvedValue(created);
160
+ fireEvent.click(await screen.findByTestId("menu-item"));
161
+ await waitFor(()=>expect(mocks.setRouteParams).toHaveBeenCalledTimes(1));
162
+ expect(view.revisions.createRevision).toHaveBeenCalledWith("entry-1#0001");
163
+ const update = mocks.setRouteParams.mock.calls[0][0];
164
+ expect(update({
165
+ modelId: "article",
166
+ id: "entry-1#0001"
167
+ })).toEqual({
168
+ modelId: "article",
169
+ id: "entry-1#0002"
170
+ });
171
+ });
172
+ it("warns and stays on the revision when the new revision could not be created", async ()=>{
173
+ const view = renderMenu({
174
+ reviewVm: REJECTED
175
+ });
176
+ vi.mocked(view.revisions.createRevision).mockResolvedValue(null);
177
+ fireEvent.click(await screen.findByTestId("menu-item"));
178
+ await waitFor(()=>expect(mocks.showWarningToast).toHaveBeenCalledTimes(1));
179
+ expect(mocks.showWarningToast).toHaveBeenCalledWith({
180
+ title: "Could not create a new revision."
181
+ });
182
+ expect(mocks.setRouteParams).not.toHaveBeenCalled();
183
+ });
184
+ });
185
+
186
+ //# sourceMappingURL=CmsEntryReviewNewRevision.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/ContentEntryForm/CmsEntryReviewNewRevision.test.js","sources":["../../../src/Components/ContentEntryForm/CmsEntryReviewNewRevision.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { beforeEach } from \"vitest\";\nimport { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { vi } from \"vitest\";\nimport { fireEvent } from \"@testing-library/react\";\nimport { screen } from \"@testing-library/react\";\nimport { waitFor } from \"@testing-library/react\";\nimport { CmsEntryReviewNewRevision } from \"./CmsEntryReviewNewRevision.js\";\nimport { NO_PUBLISHING_MODEL } from \"~/testing/models.js\";\nimport { SINGLETON_MODEL } from \"~/testing/models.js\";\nimport { createEntry } from \"~/testing/createEntry.js\";\nimport { renderEditorTree } from \"~/testing/renderEditorTree.js\";\nimport { APPROVED } from \"~/testing/reviewStates.js\";\nimport { BOUND_NO_REVIEW } from \"~/testing/reviewStates.js\";\nimport { FAILED } from \"~/testing/reviewStates.js\";\nimport { IN_REVIEW } from \"~/testing/reviewStates.js\";\nimport { LOADING } from \"~/testing/reviewStates.js\";\nimport { NO_WORKFLOW } from \"~/testing/reviewStates.js\";\nimport { REJECTED } from \"~/testing/reviewStates.js\";\n\ninterface FakeMenuItemProps {\n label: string;\n disabled?: boolean;\n onAction: () => void;\n}\n\nconst mocks = vi.hoisted(() => {\n return { canEdit: true, setRouteParams: vi.fn(), showWarningToast: vi.fn() };\n});\n\nvi.mock(\"@webiny/admin-ui\", async importOriginal => {\n const actual = await importOriginal<typeof import(\"@webiny/admin-ui\")>();\n\n return {\n ...actual,\n useToast: () => {\n return { showWarningToast: mocks.showWarningToast };\n }\n };\n});\n\nvi.mock(\"@webiny/app-admin\", async importOriginal => {\n const actual = await importOriginal<typeof import(\"@webiny/app-admin\")>();\n const React = await import(\"react\");\n\n return {\n ...actual,\n OptionsMenuItem: (props: FakeMenuItemProps) => {\n return React.createElement(\n \"button\",\n {\n \"data-testid\": \"menu-item\",\n disabled: props.disabled ?? false,\n onClick: props.onAction\n },\n props.label\n );\n }\n };\n});\n\nvi.mock(\"@webiny/app\", async importOriginal => {\n const actual = await importOriginal<typeof import(\"@webiny/app\")>();\n\n return {\n ...actual,\n useRoute: () => {\n return { setRouteParams: mocks.setRouteParams };\n }\n };\n});\n\nvi.mock(\"@webiny/app-headless-cms/admin/hooks/usePermission.js\", () => {\n return {\n usePermission: () => {\n return { canEdit: () => mocks.canEdit, canPublish: () => true };\n }\n };\n});\n\nfunction renderMenu(params: Parameters<typeof renderEditorTree>[0]) {\n return renderEditorTree({ ...params, children: <CmsEntryReviewNewRevision /> });\n}\n\ndescribe(\"CmsEntryReviewNewRevision\", () => {\n beforeEach(() => {\n mocks.canEdit = true;\n mocks.setRouteParams.mockReset();\n mocks.showWarningToast.mockReset();\n });\n\n it(\"is registered as the createNewRevision menu item\", async () => {\n renderMenu({ reviewVm: NO_WORKFLOW });\n\n const item = await screen.findByTestId(\"menu-item\");\n\n expect(item.textContent).toBe(\"Create New Revision\");\n expect(item.closest(\"[data-action]\")?.getAttribute(\"data-action\")).toBe(\n \"createNewRevision\"\n );\n });\n\n it.each([\n [\"no workflow\", NO_WORKFLOW],\n [\"no active review\", BOUND_NO_REVIEW],\n [\"a review in progress\", IN_REVIEW],\n [\"a rejected review\", REJECTED],\n [\"an approved review\", APPROVED]\n ])(\"is enabled for %s\", async (_name, reviewVm) => {\n renderMenu({ reviewVm });\n\n const item = await screen.findByTestId(\"menu-item\");\n\n expect(item.hasAttribute(\"disabled\")).toBe(false);\n });\n\n it.each([\n [\"loading\", LOADING],\n [\"failed\", FAILED]\n ])(\"is disabled while the status is %s\", async (_name, reviewVm) => {\n renderMenu({ reviewVm });\n\n const item = await screen.findByTestId(\"menu-item\");\n\n expect(item.hasAttribute(\"disabled\")).toBe(true);\n });\n\n it(\"stays enabled for a singleton model whatever the shared presenter holds\", async () => {\n renderMenu({ formVm: { model: SINGLETON_MODEL }, reviewVm: LOADING });\n\n const item = await screen.findByTestId(\"menu-item\");\n\n expect(item.hasAttribute(\"disabled\")).toBe(false);\n });\n\n it(\"renders nothing without an entry\", async () => {\n renderMenu({ formVm: { entry: null, isNewEntry: true }, reviewVm: NO_WORKFLOW });\n\n await screen.findByTestId(\"menu-actions\");\n await waitFor(() => expect(screen.queryByTestId(\"menu-item\")).toBeNull());\n });\n\n it(\"renders nothing without edit permission\", async () => {\n mocks.canEdit = false;\n renderMenu({ reviewVm: NO_WORKFLOW });\n\n await screen.findByTestId(\"menu-actions\");\n await waitFor(() => expect(screen.queryByTestId(\"menu-item\")).toBeNull());\n });\n\n it(\"renders nothing for a model that cannot publish\", async () => {\n renderMenu({ formVm: { model: NO_PUBLISHING_MODEL }, reviewVm: NO_WORKFLOW });\n\n await screen.findByTestId(\"menu-actions\");\n await waitFor(() => expect(screen.queryByTestId(\"menu-item\")).toBeNull());\n });\n\n it(\"creates the revision and moves the route to it\", async () => {\n const view = renderMenu({ reviewVm: REJECTED });\n const created = createEntry();\n created.id = \"entry-1#0002\";\n vi.mocked(view.revisions.createRevision).mockResolvedValue(created);\n\n fireEvent.click(await screen.findByTestId(\"menu-item\"));\n\n await waitFor(() => expect(mocks.setRouteParams).toHaveBeenCalledTimes(1));\n expect(view.revisions.createRevision).toHaveBeenCalledWith(\"entry-1#0001\");\n const update = mocks.setRouteParams.mock.calls[0][0];\n expect(update({ modelId: \"article\", id: \"entry-1#0001\" })).toEqual({\n modelId: \"article\",\n id: \"entry-1#0002\"\n });\n });\n\n it(\"warns and stays on the revision when the new revision could not be created\", async () => {\n const view = renderMenu({ reviewVm: REJECTED });\n vi.mocked(view.revisions.createRevision).mockResolvedValue(null);\n\n fireEvent.click(await screen.findByTestId(\"menu-item\"));\n\n await waitFor(() => expect(mocks.showWarningToast).toHaveBeenCalledTimes(1));\n expect(mocks.showWarningToast).toHaveBeenCalledWith({\n title: \"Could not create a new revision.\"\n });\n expect(mocks.setRouteParams).not.toHaveBeenCalled();\n });\n});\n"],"names":["mocks","vi","importOriginal","actual","React","props","renderMenu","params","renderEditorTree","CmsEntryReviewNewRevision","describe","beforeEach","it","NO_WORKFLOW","item","screen","expect","BOUND_NO_REVIEW","IN_REVIEW","REJECTED","APPROVED","_name","reviewVm","LOADING","FAILED","SINGLETON_MODEL","waitFor","NO_PUBLISHING_MODEL","view","created","createEntry","fireEvent","update"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare const CmsEntryReviewScheduleMenuItem: (props: unknown) => React.JSX.Element;
@@ -0,0 +1,26 @@
1
+ import react from "react";
2
+ import { createReactiveComponent } from "@webiny/app-admin";
3
+ import { ContentEntryEditorConfig } from "@webiny/app-headless-cms/admin/config/contentEntries/index.js";
4
+ import { useContentEntryFormPresenter } from "@webiny/app-headless-cms/presentation/contentEntries/form/useContentEntryFormPresenter.js";
5
+ import { useCmsEntryReview } from "../../features/editorReview/useCmsEntryReview.js";
6
+ import { isReviewableModel } from "../../utils/isReviewableModel.js";
7
+ const { Actions: Actions } = ContentEntryEditorConfig;
8
+ const { MenuItemAction: MenuItemAction } = Actions;
9
+ const ReviewGatedMenuItem = createReactiveComponent((props)=>{
10
+ const formPresenter = useContentEntryFormPresenter();
11
+ const session = useCmsEntryReview();
12
+ const { entry, model } = formPresenter.vm;
13
+ const isReviewed = null !== entry && isReviewableModel(model);
14
+ if (isReviewed && !session.presenter.vm.allowsPublishing) return null;
15
+ return props.children;
16
+ });
17
+ const CmsEntryReviewScheduleMenuItem = MenuItemAction.createDecorator((Original)=>function(props) {
18
+ if ("schedule" !== props.name) return /*#__PURE__*/ react.createElement(Original, props);
19
+ return /*#__PURE__*/ react.createElement(Original, {
20
+ ...props,
21
+ element: /*#__PURE__*/ react.createElement(ReviewGatedMenuItem, null, props.element)
22
+ });
23
+ });
24
+ export { CmsEntryReviewScheduleMenuItem };
25
+
26
+ //# sourceMappingURL=CmsEntryReviewScheduleMenuItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.js","sources":["../../../src/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.tsx"],"sourcesContent":["import React from \"react\";\nimport { createReactiveComponent } from \"@webiny/app-admin\";\nimport { ContentEntryEditorConfig } from \"@webiny/app-headless-cms/admin/config/contentEntries/index.js\";\nimport { useContentEntryFormPresenter } from \"@webiny/app-headless-cms/presentation/contentEntries/form/useContentEntryFormPresenter.js\";\nimport { useCmsEntryReview } from \"~/features/editorReview/useCmsEntryReview.js\";\nimport { isReviewableModel } from \"~/utils/isReviewableModel.js\";\n\nconst { Actions } = ContentEntryEditorConfig;\nconst { MenuItemAction } = Actions;\n\ninterface ReviewGatedMenuItemProps {\n children: React.ReactElement;\n}\n\nconst ReviewGatedMenuItem = createReactiveComponent((props: ReviewGatedMenuItemProps) => {\n const formPresenter = useContentEntryFormPresenter();\n const session = useCmsEntryReview();\n const { entry, model } = formPresenter.vm;\n const isReviewed = entry !== null && isReviewableModel(model);\n\n if (isReviewed && !session.presenter.vm.allowsPublishing) {\n return null;\n }\n\n return props.children;\n});\n\n/*\n * There is a possibility that this decorator will not do anything, because the scheduler is not\n * turned on.\n */\nexport const CmsEntryReviewScheduleMenuItem = MenuItemAction.createDecorator(Original => {\n return function CmsEntryReviewScheduleMenuItemDecorator(props) {\n if (props.name !== \"schedule\") {\n return <Original {...props} />;\n }\n\n return (\n <Original\n {...props}\n element={<ReviewGatedMenuItem>{props.element}</ReviewGatedMenuItem>}\n />\n );\n };\n});\n"],"names":["Actions","ContentEntryEditorConfig","MenuItemAction","ReviewGatedMenuItem","createReactiveComponent","props","formPresenter","useContentEntryFormPresenter","session","useCmsEntryReview","entry","model","isReviewed","isReviewableModel","CmsEntryReviewScheduleMenuItem","Original"],"mappings":";;;;;;AAOA,MAAM,EAAEA,SAAAA,OAAO,EAAE,GAAGC;AACpB,MAAM,EAAEC,gBAAAA,cAAc,EAAE,GAAGF;AAM3B,MAAMG,sBAAsBC,wBAAwB,CAACC;IACjD,MAAMC,gBAAgBC;IACtB,MAAMC,UAAUC;IAChB,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGL,cAAc,EAAE;IACzC,MAAMM,aAAaF,AAAU,SAAVA,SAAkBG,kBAAkBF;IAEvD,IAAIC,cAAc,CAACJ,QAAQ,SAAS,CAAC,EAAE,CAAC,gBAAgB,EACpD,OAAO;IAGX,OAAOH,MAAM,QAAQ;AACzB;AAMO,MAAMS,iCAAiCZ,eAAe,eAAe,CAACa,CAAAA,WAClE,SAAiDV,KAAK;QACzD,IAAIA,AAAe,eAAfA,MAAM,IAAI,EACV,OAAO,WAAP,GAAO,oBAACU,UAAaV;QAGzB,OAAO,WAAP,GACI,oBAACU,UAAAA;YACI,GAAGV,KAAK;YACT,uBAAS,oBAACF,qBAAmBA,MAAEE,MAAM,OAAO;;IAGxD"}
@@ -0,0 +1,78 @@
1
+ import react from "react";
2
+ import { describe, expect, it } from "vitest";
3
+ import { screen, waitFor } from "@testing-library/react";
4
+ import { ContentEntryEditorConfig } from "@webiny/app-headless-cms/admin/config/contentEntries/index.js";
5
+ import { CmsEntryReviewScheduleMenuItem } from "./CmsEntryReviewScheduleMenuItem.js";
6
+ import { renderEditorTree } from "../../testing/renderEditorTree.js";
7
+ import { APPROVED, BOUND_NO_REVIEW, BOUND_UNPUBLISHED, IN_REVIEW, LOADING, NO_WORKFLOW } from "../../testing/reviewStates.js";
8
+ const { Actions: Actions } = ContentEntryEditorConfig;
9
+ function renderMenu(params) {
10
+ return renderEditorTree({
11
+ ...params,
12
+ children: /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(CmsEntryReviewScheduleMenuItem, null), /*#__PURE__*/ react.createElement(ContentEntryEditorConfig, null, /*#__PURE__*/ react.createElement(Actions.MenuItemAction, {
13
+ name: "schedule",
14
+ element: /*#__PURE__*/ react.createElement("span", {
15
+ "data-testid": "schedule-item"
16
+ })
17
+ }), /*#__PURE__*/ react.createElement(Actions.MenuItemAction, {
18
+ name: "delete",
19
+ element: /*#__PURE__*/ react.createElement("span", {
20
+ "data-testid": "delete-item"
21
+ })
22
+ })))
23
+ });
24
+ }
25
+ describe("CmsEntryReviewScheduleMenuItem", ()=>{
26
+ it.each([
27
+ [
28
+ "no workflow",
29
+ NO_WORKFLOW
30
+ ],
31
+ [
32
+ "an approved review",
33
+ APPROVED
34
+ ],
35
+ [
36
+ "an unpublished revision with no review (Q19)",
37
+ BOUND_UNPUBLISHED
38
+ ]
39
+ ])("keeps schedule for %s", async (_name, reviewVm)=>{
40
+ renderMenu({
41
+ reviewVm
42
+ });
43
+ expect(await screen.findByTestId("schedule-item")).toBeTruthy();
44
+ expect(screen.getByTestId("delete-item")).toBeTruthy();
45
+ });
46
+ it.each([
47
+ [
48
+ "a bound workflow and no review",
49
+ BOUND_NO_REVIEW
50
+ ],
51
+ [
52
+ "a review in progress",
53
+ IN_REVIEW
54
+ ],
55
+ [
56
+ "an unknown status",
57
+ LOADING
58
+ ]
59
+ ])("hides schedule, and only schedule, for %s", async (_name, reviewVm)=>{
60
+ renderMenu({
61
+ reviewVm
62
+ });
63
+ expect(await screen.findByTestId("delete-item")).toBeTruthy();
64
+ await waitFor(()=>expect(screen.queryByTestId("schedule-item")).toBeNull());
65
+ });
66
+ it("keeps schedule for a new entry", async ()=>{
67
+ renderMenu({
68
+ formVm: {
69
+ entry: null,
70
+ isNewEntry: true
71
+ },
72
+ reviewVm: LOADING
73
+ });
74
+ expect(await screen.findByTestId("schedule-item")).toBeTruthy();
75
+ });
76
+ });
77
+
78
+ //# sourceMappingURL=CmsEntryReviewScheduleMenuItem.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.test.js","sources":["../../../src/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { screen } from \"@testing-library/react\";\nimport { waitFor } from \"@testing-library/react\";\nimport { ContentEntryEditorConfig } from \"@webiny/app-headless-cms/admin/config/contentEntries/index.js\";\nimport { CmsEntryReviewScheduleMenuItem } from \"./CmsEntryReviewScheduleMenuItem.js\";\nimport { renderEditorTree } from \"~/testing/renderEditorTree.js\";\nimport { APPROVED } from \"~/testing/reviewStates.js\";\nimport { BOUND_NO_REVIEW } from \"~/testing/reviewStates.js\";\nimport { BOUND_UNPUBLISHED } from \"~/testing/reviewStates.js\";\nimport { IN_REVIEW } from \"~/testing/reviewStates.js\";\nimport { LOADING } from \"~/testing/reviewStates.js\";\nimport { NO_WORKFLOW } from \"~/testing/reviewStates.js\";\n\nconst { Actions } = ContentEntryEditorConfig;\n\nfunction renderMenu(params: Parameters<typeof renderEditorTree>[0]) {\n return renderEditorTree({\n ...params,\n children: (\n <>\n <CmsEntryReviewScheduleMenuItem />\n <ContentEntryEditorConfig>\n <Actions.MenuItemAction\n name=\"schedule\"\n element={<span data-testid=\"schedule-item\" />}\n />\n <Actions.MenuItemAction\n name=\"delete\"\n element={<span data-testid=\"delete-item\" />}\n />\n </ContentEntryEditorConfig>\n </>\n )\n });\n}\n\ndescribe(\"CmsEntryReviewScheduleMenuItem\", () => {\n it.each([\n [\"no workflow\", NO_WORKFLOW],\n [\"an approved review\", APPROVED],\n [\"an unpublished revision with no review (Q19)\", BOUND_UNPUBLISHED]\n ])(\"keeps schedule for %s\", async (_name, reviewVm) => {\n renderMenu({ reviewVm });\n\n expect(await screen.findByTestId(\"schedule-item\")).toBeTruthy();\n expect(screen.getByTestId(\"delete-item\")).toBeTruthy();\n });\n\n it.each([\n [\"a bound workflow and no review\", BOUND_NO_REVIEW],\n [\"a review in progress\", IN_REVIEW],\n [\"an unknown status\", LOADING]\n ])(\"hides schedule, and only schedule, for %s\", async (_name, reviewVm) => {\n renderMenu({ reviewVm });\n\n expect(await screen.findByTestId(\"delete-item\")).toBeTruthy();\n await waitFor(() => expect(screen.queryByTestId(\"schedule-item\")).toBeNull());\n });\n\n it(\"keeps schedule for a new entry\", async () => {\n renderMenu({ formVm: { entry: null, isNewEntry: true }, reviewVm: LOADING });\n\n expect(await screen.findByTestId(\"schedule-item\")).toBeTruthy();\n });\n});\n"],"names":["Actions","ContentEntryEditorConfig","renderMenu","params","renderEditorTree","CmsEntryReviewScheduleMenuItem","describe","it","NO_WORKFLOW","APPROVED","BOUND_UNPUBLISHED","_name","reviewVm","expect","screen","BOUND_NO_REVIEW","IN_REVIEW","LOADING","waitFor"],"mappings":";;;;;;;AAgBA,MAAM,EAAEA,SAAAA,OAAO,EAAE,GAAGC;AAEpB,SAASC,WAAWC,MAA8C;IAC9D,OAAOC,iBAAiB;QACpB,GAAGD,MAAM;QACT,UAAU,WAAV,GACI,wDACI,oBAACE,gCAA8BA,OAAAA,WAAAA,GAC/B,oBAACJ,0BAAwBA,MAAAA,WAAAA,GACrB,oBAACD,QAAQ,cAAc;YACnB,MAAK;YACL,uBAAS,oBAAC;gBAAK,eAAY;;0BAE/B,oBAACA,QAAQ,cAAc;YACnB,MAAK;YACL,uBAAS,oBAAC;gBAAK,eAAY;;;IAK/C;AACJ;AAEAM,SAAS,kCAAkC;IACvCC,GAAG,IAAI,CAAC;QACJ;YAAC;YAAeC;SAAY;QAC5B;YAAC;YAAsBC;SAAS;QAChC;YAAC;YAAgDC;SAAkB;KACtE,EAAE,yBAAyB,OAAOC,OAAOC;QACtCV,WAAW;YAAEU;QAAS;QAEtBC,OAAO,MAAMC,OAAO,YAAY,CAAC,kBAAkB,UAAU;QAC7DD,OAAOC,OAAO,WAAW,CAAC,gBAAgB,UAAU;IACxD;IAEAP,GAAG,IAAI,CAAC;QACJ;YAAC;YAAkCQ;SAAgB;QACnD;YAAC;YAAwBC;SAAU;QACnC;YAAC;YAAqBC;SAAQ;KACjC,EAAE,6CAA6C,OAAON,OAAOC;QAC1DV,WAAW;YAAEU;QAAS;QAEtBC,OAAO,MAAMC,OAAO,YAAY,CAAC,gBAAgB,UAAU;QAC3D,MAAMI,QAAQ,IAAML,OAAOC,OAAO,aAAa,CAAC,kBAAkB,QAAQ;IAC9E;IAEAP,GAAG,kCAAkC;QACjCL,WAAW;YAAE,QAAQ;gBAAE,OAAO;gBAAM,YAAY;YAAK;YAAG,UAAUe;QAAQ;QAE1EJ,OAAO,MAAMC,OAAO,YAAY,CAAC,kBAAkB,UAAU;IACjE;AACJ"}
@@ -0,0 +1,3 @@
1
+ import type { CmsModel } from "@webiny/app-headless-cms-common/types/index.js";
2
+ import type { ReviewFieldLabels } from "@webiny/app-workflows/review/presentation/reviewDetails/abstractions.js";
3
+ export declare const getModelFieldLabels: (model: CmsModel) => ReviewFieldLabels;
@@ -0,0 +1,8 @@
1
+ const getModelFieldLabels = (model)=>{
2
+ const labels = {};
3
+ for (const field of model.fields ?? [])labels[field.fieldId] = field.label;
4
+ return labels;
5
+ };
6
+ export { getModelFieldLabels };
7
+
8
+ //# sourceMappingURL=getModelFieldLabels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/ContentEntryForm/getModelFieldLabels.js","sources":["../../../src/Components/ContentEntryForm/getModelFieldLabels.ts"],"sourcesContent":["import type { CmsModel } from \"@webiny/app-headless-cms-common/types/index.js\";\nimport type { ReviewFieldLabels } from \"@webiny/app-workflows/review/presentation/reviewDetails/abstractions.js\";\n\n// Field id → label of the model, so Review details names the fields of AI issues as the form does.\nexport const getModelFieldLabels = (model: CmsModel): ReviewFieldLabels => {\n const labels: ReviewFieldLabels = {};\n for (const field of model.fields ?? []) {\n labels[field.fieldId] = field.label;\n }\n return labels;\n};\n"],"names":["getModelFieldLabels","model","labels","field"],"mappings":"AAIO,MAAMA,sBAAsB,CAACC;IAChC,MAAMC,SAA4B,CAAC;IACnC,KAAK,MAAMC,SAASF,MAAM,MAAM,IAAI,EAAE,CAClCC,MAAM,CAACC,MAAM,OAAO,CAAC,GAAGA,MAAM,KAAK;IAEvC,OAAOD;AACX"}
@@ -0,0 +1,5 @@
1
+ export { CmsEntryReviewBar } from "./CmsEntryReviewBar.js";
2
+ export { CmsEntryReviewBlockedActions } from "./CmsEntryReviewBlockedActions.js";
3
+ export { CmsEntryReviewFormLock } from "./CmsEntryReviewFormLock.js";
4
+ export { CmsEntryReviewNewRevision } from "./CmsEntryReviewNewRevision.js";
5
+ export { CmsEntryReviewScheduleMenuItem } from "./CmsEntryReviewScheduleMenuItem.js";
@@ -0,0 +1,5 @@
1
+ export { CmsEntryReviewBar } from "./CmsEntryReviewBar.js";
2
+ export { CmsEntryReviewBlockedActions } from "./CmsEntryReviewBlockedActions.js";
3
+ export { CmsEntryReviewFormLock } from "./CmsEntryReviewFormLock.js";
4
+ export { CmsEntryReviewNewRevision } from "./CmsEntryReviewNewRevision.js";
5
+ export { CmsEntryReviewScheduleMenuItem } from "./CmsEntryReviewScheduleMenuItem.js";
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare const CmsContentReviews: () => React.JSX.Element | null;
@@ -0,0 +1,11 @@
1
+ import react from "react";
2
+ import { usePermission } from "@webiny/app-headless-cms/admin/hooks/usePermission.js";
3
+ import { CmsContentReviewsMount } from "./CmsContentReviewsMount.js";
4
+ const CmsContentReviews = ()=>{
5
+ const { canAccessManageEndpoint, canReadContentModels } = usePermission();
6
+ if (!canAccessManageEndpoint || !canReadContentModels) return null;
7
+ return /*#__PURE__*/ react.createElement(CmsContentReviewsMount, null);
8
+ };
9
+ export { CmsContentReviews };
10
+
11
+ //# sourceMappingURL=CmsContentReviews.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/ContentReviews/CmsContentReviews.js","sources":["../../../src/Components/ContentReviews/CmsContentReviews.tsx"],"sourcesContent":["import React from \"react\";\nimport { usePermission } from \"@webiny/app-headless-cms/admin/hooks/usePermission.js\";\nimport { CmsContentReviewsMount } from \"./CmsContentReviewsMount.js\";\n\n/*\n * Content Reviews need the content type list, which the API refuses to a user who cannot read\n * CMS models: such a user gets no route, menu or widgets, and no failed model list.\n */\nexport const CmsContentReviews = () => {\n const { canAccessManageEndpoint, canReadContentModels } = usePermission();\n\n if (!canAccessManageEndpoint || !canReadContentModels) {\n return null;\n }\n\n return <CmsContentReviewsMount />;\n};\n"],"names":["CmsContentReviews","canAccessManageEndpoint","canReadContentModels","usePermission","CmsContentReviewsMount"],"mappings":";;;AAQO,MAAMA,oBAAoB;IAC7B,MAAM,EAAEC,uBAAuB,EAAEC,oBAAoB,EAAE,GAAGC;IAE1D,IAAI,CAACF,2BAA2B,CAACC,sBAC7B,OAAO;IAGX,OAAO,WAAP,GAAO,oBAACE,wBAAsBA;AAClC"}
@@ -0,0 +1,214 @@
1
+ import react from "react";
2
+ import { beforeEach, describe, expect, it, vi } from "vitest";
3
+ import { act, render, screen, waitFor } from "@testing-library/react";
4
+ import { Container } from "@webiny/di";
5
+ import { DiContainerProvider } from "@webiny/app";
6
+ import { ListModelsUseCase } from "@webiny/app-headless-cms/features/model/listModels/abstractions.js";
7
+ import { Notifications } from "@webiny/app-admin/features/notifications/abstractions.js";
8
+ import { IdentityContext } from "@webiny/app-admin/features/security/IdentityContext/abstractions.js";
9
+ import { createWorkflowsIdentityContext } from "@webiny/app-workflows/review/testing/createWorkflowsIdentityContext.js";
10
+ import { CmsReviewContentAdapter } from "../../features/gateway/CmsReviewContentAdapter/abstractions.js";
11
+ import { CmsReviewRowProvider } from "../../features/gateway/CmsReviewRowProvider/abstractions.js";
12
+ import { CmsContentReviewsPresenterFeature } from "../../presentation/contentReviews/feature.js";
13
+ import { Routes } from "../../routes.js";
14
+ import { CmsContentReviews } from "./CmsContentReviews.js";
15
+ const permission = vi.hoisted(()=>({
16
+ canAccessManageEndpoint: true,
17
+ canReadContentModels: true
18
+ }));
19
+ vi.mock("@webiny/app-headless-cms/admin/hooks/usePermission.js", ()=>({
20
+ usePermission: ()=>({
21
+ canAccessManageEndpoint: permission.canAccessManageEndpoint,
22
+ canReadContentModels: permission.canReadContentModels
23
+ })
24
+ }));
25
+ vi.mock("@webiny/app-workflows/review/mounting/components/ReviewContentReviewsRoute.js", async ()=>{
26
+ const React = await import("react");
27
+ return {
28
+ ReviewContentReviewsRoute: (props)=>{
29
+ const vm = props.contentTypes.vm;
30
+ return React.createElement("div", {
31
+ "data-testid": "route",
32
+ "data-route": props.route.name,
33
+ "data-app": props.app,
34
+ "data-namespaces": vm.namespaces.join(","),
35
+ "data-show-content-type": String(props.showContentType),
36
+ "data-options": JSON.stringify(vm.options),
37
+ "data-breadcrumb": props.breadcrumbName,
38
+ "data-ready": String(!vm.loading)
39
+ });
40
+ }
41
+ };
42
+ });
43
+ vi.mock("@webiny/app-workflows/review/mounting/components/ReviewContentReviewsMenu.js", async ()=>{
44
+ const React = await import("react");
45
+ return {
46
+ ReviewContentReviewsMenu: (props)=>React.createElement("div", {
47
+ "data-testid": "menu",
48
+ "data-name": props.name,
49
+ "data-route": props.route.name,
50
+ "data-parent": props.parent ?? ""
51
+ })
52
+ };
53
+ });
54
+ vi.mock("@webiny/app-workflows/review/mounting/components/ReviewDashboardWidgets.js", async ()=>{
55
+ const React = await import("react");
56
+ return {
57
+ ReviewDashboardWidgets: (props)=>React.createElement("div", {
58
+ "data-testid": "widgets",
59
+ "data-prefix": props.prefix,
60
+ "data-namespaces": props.namespaces.join(","),
61
+ "data-route": props.viewAllRoute.name,
62
+ "data-ready": String(props.ready)
63
+ })
64
+ };
65
+ });
66
+ const createNotifications = ()=>({
67
+ notify: vi.fn(),
68
+ success: vi.fn(),
69
+ warning: vi.fn(),
70
+ error: vi.fn()
71
+ });
72
+ const createContainer = (execute, notifications = createNotifications())=>{
73
+ const container = new Container();
74
+ const rowProvider = {
75
+ getBinding: ()=>null
76
+ };
77
+ const adapter = {};
78
+ container.registerInstance(CmsReviewContentAdapter, adapter);
79
+ container.registerInstance(CmsReviewRowProvider, rowProvider);
80
+ container.registerInstance(ListModelsUseCase, {
81
+ execute
82
+ });
83
+ container.registerInstance(IdentityContext, createWorkflowsIdentityContext());
84
+ container.registerInstance(Notifications, notifications);
85
+ CmsContentReviewsPresenterFeature.register(container);
86
+ return container;
87
+ };
88
+ const mount = (container)=>{
89
+ render(/*#__PURE__*/ react.createElement(DiContainerProvider, {
90
+ container: container
91
+ }, /*#__PURE__*/ react.createElement(CmsContentReviews, null)));
92
+ };
93
+ describe("CmsContentReviews", ()=>{
94
+ beforeEach(()=>{
95
+ permission.canAccessManageEndpoint = true;
96
+ permission.canReadContentModels = true;
97
+ });
98
+ it.each([
99
+ [
100
+ "the manage endpoint",
101
+ {
102
+ canAccessManageEndpoint: false,
103
+ canReadContentModels: true
104
+ }
105
+ ],
106
+ [
107
+ "reading content models",
108
+ {
109
+ canAccessManageEndpoint: true,
110
+ canReadContentModels: false
111
+ }
112
+ ]
113
+ ])("mounts nothing and loads no models without %s", async (_name, flags)=>{
114
+ Object.assign(permission, flags);
115
+ const execute = vi.fn(async ()=>[]);
116
+ const notifications = createNotifications();
117
+ const container = createContainer(execute, notifications);
118
+ mount(container);
119
+ await act(async ()=>{});
120
+ expect(screen.queryByTestId("route")).toBeNull();
121
+ expect(screen.queryByTestId("menu")).toBeNull();
122
+ expect(screen.queryByTestId("widgets")).toBeNull();
123
+ expect(execute).not.toHaveBeenCalled();
124
+ expect(notifications.error).not.toHaveBeenCalled();
125
+ });
126
+ it("mounts the shared route, menu and widgets for the cms app with the model list, ready once the models are known", async ()=>{
127
+ const container = createContainer(async ()=>[
128
+ {
129
+ modelId: "press",
130
+ name: "Press release",
131
+ tags: []
132
+ },
133
+ {
134
+ modelId: "article",
135
+ name: "Article",
136
+ tags: []
137
+ },
138
+ {
139
+ modelId: "hidden",
140
+ name: "Hidden",
141
+ tags: [
142
+ "$publishing:false"
143
+ ]
144
+ }
145
+ ]);
146
+ mount(container);
147
+ await waitFor(()=>{
148
+ expect(screen.getByTestId("route").getAttribute("data-ready")).toBe("true");
149
+ });
150
+ const route = screen.getByTestId("route");
151
+ expect(route.getAttribute("data-namespaces")).toBe("cms.article,cms.press");
152
+ expect(route.getAttribute("data-route")).toBe(Routes.ContentEntries.ContentReviews.name);
153
+ expect(route.getAttribute("data-app")).toBe("cms");
154
+ expect(route.getAttribute("data-show-content-type")).toBe("true");
155
+ expect(route.getAttribute("data-breadcrumb")).toBe("cms.content-reviews");
156
+ expect(JSON.parse(route.getAttribute("data-options") ?? "null")).toEqual([
157
+ {
158
+ label: "Article",
159
+ value: "article",
160
+ app: "cms",
161
+ icon: "devices_other"
162
+ },
163
+ {
164
+ label: "Press release",
165
+ value: "press",
166
+ app: "cms",
167
+ icon: "devices_other"
168
+ }
169
+ ]);
170
+ const menu = screen.getByTestId("menu");
171
+ expect(menu.getAttribute("data-name")).toBe("workflows.cms.contentReviews");
172
+ expect(menu.getAttribute("data-parent")).toBe("headlessCMS");
173
+ expect(menu.getAttribute("data-route")).toBe(Routes.ContentEntries.ContentReviews.name);
174
+ const widgets = screen.getByTestId("widgets");
175
+ expect(widgets.getAttribute("data-ready")).toBe("true");
176
+ expect(widgets.getAttribute("data-prefix")).toBe("cms");
177
+ expect(widgets.getAttribute("data-namespaces")).toBe("cms.article,cms.press");
178
+ expect(widgets.getAttribute("data-route")).toBe(Routes.ContentEntries.ContentReviews.name);
179
+ });
180
+ it("keeps the list and the widgets from starting until the model list is known", async ()=>{
181
+ let release = ()=>void 0;
182
+ const pending = new Promise((resolve)=>{
183
+ release = resolve;
184
+ });
185
+ const container = createContainer(()=>pending);
186
+ mount(container);
187
+ expect(screen.getByTestId("route").getAttribute("data-ready")).toBe("false");
188
+ expect(screen.getByTestId("widgets").getAttribute("data-ready")).toBe("false");
189
+ release([
190
+ {
191
+ modelId: "article",
192
+ name: "Article",
193
+ tags: []
194
+ }
195
+ ]);
196
+ await waitFor(()=>{
197
+ expect(screen.getByTestId("route").getAttribute("data-ready")).toBe("true");
198
+ });
199
+ expect(screen.getByTestId("route").getAttribute("data-namespaces")).toBe("cms.article");
200
+ });
201
+ it("becomes ready with no namespaces when the model list fails", async ()=>{
202
+ const consoleError = vi.spyOn(console, "error").mockImplementation(()=>void 0);
203
+ const container = createContainer(()=>Promise.reject(new Error("network")));
204
+ mount(container);
205
+ await waitFor(()=>{
206
+ expect(screen.getByTestId("route").getAttribute("data-ready")).toBe("true");
207
+ });
208
+ expect(screen.getByTestId("route").getAttribute("data-namespaces")).toBe("");
209
+ expect(JSON.parse(screen.getByTestId("route").getAttribute("data-options") ?? "null")).toEqual([]);
210
+ consoleError.mockRestore();
211
+ });
212
+ });
213
+
214
+ //# sourceMappingURL=CmsContentReviews.test.js.map