@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,122 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { Container } from "@webiny/di";
3
+ import { GraphQLOperationError } from "@webiny/app/errors/index.js";
4
+ import { Confirmation } from "@webiny/app-admin/features/confirmation/abstractions.js";
5
+ import { Notifications } from "@webiny/app-admin/features/notifications/abstractions.js";
6
+ import { PermanentlyDeleteEntryUseCase } from "@webiny/app-headless-cms/features/contentEntry/permanentlyDeleteEntry/abstractions.js";
7
+ import { ReviewErrorCode } from "@webiny/app-workflows/review/domain/ReviewErrorCode.js";
8
+ import { ActiveReviewBlockCollector } from "@webiny/app-workflows/review/trash/ActiveReviewBlockCollector/ActiveReviewBlockCollector.js";
9
+ import { ActiveReviewGuard } from "@webiny/app-workflows/review/trash/ActiveReviewGuard/ActiveReviewGuard.js";
10
+ import { createTrashUseCaseFakes } from "@webiny/app-workflows/review/testing/createTrashUseCaseFakes.js";
11
+ import { registerTrashUseCaseFakes } from "@webiny/app-workflows/review/testing/registerTrashUseCaseFakes.js";
12
+ import { PermanentlyDeleteEntryUseCaseReviewDecorator } from "./PermanentlyDeleteEntryUseCaseReviewDecorator.js";
13
+ const MODEL = {
14
+ modelId: "article",
15
+ singularApiName: "Article"
16
+ };
17
+ function createRefusal() {
18
+ return new GraphQLOperationError({
19
+ message: "This content has a review in progress.",
20
+ code: ReviewErrorCode.ActiveReviewOnTrash,
21
+ data: {
22
+ model: "cms.article",
23
+ action: "delete",
24
+ reviews: [
25
+ {
26
+ reviewId: "review-1",
27
+ model: "cms.article",
28
+ targetId: "entry-1",
29
+ targetRevisionId: "entry-1#0001",
30
+ title: "Launch article",
31
+ stepPosition: 1,
32
+ stepCount: 1,
33
+ stepName: "Editor"
34
+ }
35
+ ]
36
+ }
37
+ });
38
+ }
39
+ function setup(decision = "confirm") {
40
+ const confirm = vi.fn(async (_name, _params, execute)=>{
41
+ if ("dismiss" === decision) return false;
42
+ return execute ? execute(void 0) : void 0;
43
+ });
44
+ const decoratee = {
45
+ execute: vi.fn()
46
+ };
47
+ const useCases = createTrashUseCaseFakes();
48
+ const container = new Container();
49
+ container.registerInstance(Confirmation, {
50
+ confirm
51
+ });
52
+ container.registerInstance(Notifications, {
53
+ notify: vi.fn(),
54
+ success: vi.fn(),
55
+ warning: vi.fn()
56
+ });
57
+ container.register(ActiveReviewBlockCollector).inSingletonScope();
58
+ container.register(ActiveReviewGuard).inSingletonScope();
59
+ registerTrashUseCaseFakes(container, useCases);
60
+ container.registerInstance(PermanentlyDeleteEntryUseCase, decoratee);
61
+ container.registerDecorator(PermanentlyDeleteEntryUseCaseReviewDecorator);
62
+ return {
63
+ confirm,
64
+ decoratee,
65
+ useCases,
66
+ useCase: container.resolve(PermanentlyDeleteEntryUseCase)
67
+ };
68
+ }
69
+ describe("PermanentlyDeleteEntryUseCaseReviewDecorator", ()=>{
70
+ it("passes through to the decoratee when the delete succeeds", async ()=>{
71
+ const { confirm, decoratee, useCase } = setup();
72
+ decoratee.execute.mockResolvedValue(true);
73
+ const result = await useCase.execute({
74
+ model: MODEL,
75
+ id: "entry-1"
76
+ });
77
+ expect(result).toBe(true);
78
+ expect(decoratee.execute).toHaveBeenCalledWith({
79
+ model: MODEL,
80
+ id: "entry-1"
81
+ });
82
+ expect(confirm).not.toHaveBeenCalled();
83
+ });
84
+ it("on the server refusal cancels the whole entry (no revision id), then repeats the delete", async ()=>{
85
+ const { decoratee, useCases, useCase } = setup();
86
+ decoratee.execute.mockRejectedValueOnce(createRefusal()).mockResolvedValueOnce(true);
87
+ const result = await useCase.execute({
88
+ model: MODEL,
89
+ id: "entry-1"
90
+ });
91
+ expect(result).toBe(true);
92
+ expect(useCases.cancelReviewsForDelete.execute).toHaveBeenCalledWith({
93
+ namespace: "cms.article",
94
+ targetId: "entry-1",
95
+ targetRevisionId: null,
96
+ action: "delete"
97
+ });
98
+ expect(decoratee.execute).toHaveBeenCalledTimes(2);
99
+ });
100
+ it("resolves false when the warning is dismissed", async ()=>{
101
+ const { decoratee, useCases, useCase } = setup("dismiss");
102
+ decoratee.execute.mockRejectedValue(createRefusal());
103
+ const result = await useCase.execute({
104
+ model: MODEL,
105
+ id: "entry-1"
106
+ });
107
+ expect(result).toBe(false);
108
+ expect(useCases.cancelReviewsForDelete.execute).not.toHaveBeenCalled();
109
+ });
110
+ it("rethrows any other error unchanged", async ()=>{
111
+ const { decoratee, useCase } = setup();
112
+ const failure = new Error("Network down");
113
+ decoratee.execute.mockRejectedValue(failure);
114
+ const error = await useCase.execute({
115
+ model: MODEL,
116
+ id: "entry-1"
117
+ }).catch((e)=>e);
118
+ expect(error).toBe(failure);
119
+ });
120
+ });
121
+
122
+ //# sourceMappingURL=PermanentlyDeleteEntryUseCaseReviewDecorator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.test.js","sources":["../../../src/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.test.ts"],"sourcesContent":["import { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { vi } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { GraphQLOperationError } from \"@webiny/app/errors/index.js\";\nimport { Confirmation } from \"@webiny/app-admin/features/confirmation/abstractions.js\";\nimport { Notifications } from \"@webiny/app-admin/features/notifications/abstractions.js\";\nimport { PermanentlyDeleteEntryUseCase } from \"@webiny/app-headless-cms/features/contentEntry/permanentlyDeleteEntry/abstractions.js\";\nimport type { CmsModel } from \"@webiny/app-headless-cms/types.js\";\nimport { ReviewErrorCode } from \"@webiny/app-workflows/review/domain/ReviewErrorCode.js\";\nimport { ActiveReviewBlockCollector } from \"@webiny/app-workflows/review/trash/ActiveReviewBlockCollector/ActiveReviewBlockCollector.js\";\nimport { ActiveReviewGuard } from \"@webiny/app-workflows/review/trash/ActiveReviewGuard/ActiveReviewGuard.js\";\nimport { createTrashUseCaseFakes } from \"@webiny/app-workflows/review/testing/createTrashUseCaseFakes.js\";\nimport { registerTrashUseCaseFakes } from \"@webiny/app-workflows/review/testing/registerTrashUseCaseFakes.js\";\nimport { PermanentlyDeleteEntryUseCaseReviewDecorator } from \"./PermanentlyDeleteEntryUseCaseReviewDecorator.js\";\n\nconst MODEL = { modelId: \"article\", singularApiName: \"Article\" } as CmsModel;\n\nfunction createRefusal() {\n return new GraphQLOperationError({\n message: \"This content has a review in progress.\",\n code: ReviewErrorCode.ActiveReviewOnTrash,\n data: {\n model: \"cms.article\",\n action: \"delete\",\n reviews: [\n {\n reviewId: \"review-1\",\n model: \"cms.article\",\n targetId: \"entry-1\",\n targetRevisionId: \"entry-1#0001\",\n title: \"Launch article\",\n stepPosition: 1,\n stepCount: 1,\n stepName: \"Editor\"\n }\n ]\n }\n });\n}\n\nfunction setup(decision: \"confirm\" | \"dismiss\" = \"confirm\") {\n const confirm = vi.fn(\n async (_name: string, _params: unknown, execute?: (data: unknown) => Promise<unknown>) => {\n if (decision === \"dismiss\") {\n return false;\n }\n return execute ? execute(undefined) : undefined;\n }\n );\n const decoratee = { execute: vi.fn() };\n const useCases = createTrashUseCaseFakes();\n\n const container = new Container();\n container.registerInstance(Confirmation, { confirm } as unknown as Confirmation.Interface);\n container.registerInstance(Notifications, {\n notify: vi.fn(),\n success: vi.fn(),\n warning: vi.fn()\n } as unknown as Notifications.Interface);\n container.register(ActiveReviewBlockCollector).inSingletonScope();\n container.register(ActiveReviewGuard).inSingletonScope();\n registerTrashUseCaseFakes(container, useCases);\n container.registerInstance(PermanentlyDeleteEntryUseCase, decoratee);\n container.registerDecorator(PermanentlyDeleteEntryUseCaseReviewDecorator);\n\n return {\n confirm,\n decoratee,\n useCases,\n useCase: container.resolve(PermanentlyDeleteEntryUseCase)\n };\n}\n\ndescribe(\"PermanentlyDeleteEntryUseCaseReviewDecorator\", () => {\n it(\"passes through to the decoratee when the delete succeeds\", async () => {\n const { confirm, decoratee, useCase } = setup();\n decoratee.execute.mockResolvedValue(true);\n\n const result = await useCase.execute({ model: MODEL, id: \"entry-1\" });\n\n expect(result).toBe(true);\n expect(decoratee.execute).toHaveBeenCalledWith({ model: MODEL, id: \"entry-1\" });\n expect(confirm).not.toHaveBeenCalled();\n });\n\n it(\"on the server refusal cancels the whole entry (no revision id), then repeats the delete\", async () => {\n const { decoratee, useCases, useCase } = setup();\n decoratee.execute.mockRejectedValueOnce(createRefusal()).mockResolvedValueOnce(true);\n\n const result = await useCase.execute({ model: MODEL, id: \"entry-1\" });\n\n expect(result).toBe(true);\n expect(useCases.cancelReviewsForDelete.execute).toHaveBeenCalledWith({\n namespace: \"cms.article\",\n targetId: \"entry-1\",\n targetRevisionId: null,\n action: \"delete\"\n });\n expect(decoratee.execute).toHaveBeenCalledTimes(2);\n });\n\n it(\"resolves false when the warning is dismissed\", async () => {\n const { decoratee, useCases, useCase } = setup(\"dismiss\");\n decoratee.execute.mockRejectedValue(createRefusal());\n\n const result = await useCase.execute({ model: MODEL, id: \"entry-1\" });\n\n expect(result).toBe(false);\n expect(useCases.cancelReviewsForDelete.execute).not.toHaveBeenCalled();\n });\n\n it(\"rethrows any other error unchanged\", async () => {\n const { decoratee, useCase } = setup();\n const failure = new Error(\"Network down\");\n decoratee.execute.mockRejectedValue(failure);\n\n const error = await useCase.execute({ model: MODEL, id: \"entry-1\" }).catch(e => e);\n\n expect(error).toBe(failure);\n });\n});\n"],"names":["MODEL","createRefusal","GraphQLOperationError","ReviewErrorCode","setup","decision","confirm","vi","_name","_params","execute","undefined","decoratee","useCases","createTrashUseCaseFakes","container","Container","Confirmation","Notifications","ActiveReviewBlockCollector","ActiveReviewGuard","registerTrashUseCaseFakes","PermanentlyDeleteEntryUseCase","PermanentlyDeleteEntryUseCaseReviewDecorator","describe","it","useCase","result","expect","failure","Error","error","e"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const CmsReviewTrashFeature: import("@webiny/feature/admin").FeatureDefinition<any, []>;
@@ -0,0 +1,17 @@
1
+ import { createFeature } from "@webiny/feature/admin";
2
+ import { DeleteEntryUseCaseReviewDecorator } from "./DeleteEntryUseCaseReviewDecorator.js";
3
+ import { DeleteEntryRevisionUseCaseReviewDecorator } from "./DeleteEntryRevisionUseCaseReviewDecorator.js";
4
+ import { PermanentlyDeleteEntryUseCaseReviewDecorator } from "./PermanentlyDeleteEntryUseCaseReviewDecorator.js";
5
+ import { BulkDeletePresenterReviewDecorator } from "./BulkDeletePresenterReviewDecorator.js";
6
+ const CmsReviewTrashFeature = createFeature({
7
+ name: "CmsWorkflows/Trash",
8
+ register (container) {
9
+ container.registerDecorator(DeleteEntryUseCaseReviewDecorator);
10
+ container.registerDecorator(DeleteEntryRevisionUseCaseReviewDecorator);
11
+ container.registerDecorator(PermanentlyDeleteEntryUseCaseReviewDecorator);
12
+ container.registerDecorator(BulkDeletePresenterReviewDecorator);
13
+ }
14
+ });
15
+ export { CmsReviewTrashFeature };
16
+
17
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/trash/feature.js","sources":["../../../src/features/trash/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport { DeleteEntryUseCaseReviewDecorator } from \"./DeleteEntryUseCaseReviewDecorator.js\";\nimport { DeleteEntryRevisionUseCaseReviewDecorator } from \"./DeleteEntryRevisionUseCaseReviewDecorator.js\";\nimport { PermanentlyDeleteEntryUseCaseReviewDecorator } from \"./PermanentlyDeleteEntryUseCaseReviewDecorator.js\";\nimport { BulkDeletePresenterReviewDecorator } from \"./BulkDeletePresenterReviewDecorator.js\";\n\nexport const CmsReviewTrashFeature = createFeature({\n name: \"CmsWorkflows/Trash\",\n register(container) {\n container.registerDecorator(DeleteEntryUseCaseReviewDecorator);\n container.registerDecorator(DeleteEntryRevisionUseCaseReviewDecorator);\n container.registerDecorator(PermanentlyDeleteEntryUseCaseReviewDecorator);\n container.registerDecorator(BulkDeletePresenterReviewDecorator);\n }\n});\n"],"names":["CmsReviewTrashFeature","createFeature","container","DeleteEntryUseCaseReviewDecorator","DeleteEntryRevisionUseCaseReviewDecorator","PermanentlyDeleteEntryUseCaseReviewDecorator","BulkDeletePresenterReviewDecorator"],"mappings":";;;;;AAMO,MAAMA,wBAAwBC,cAAc;IAC/C,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,iBAAiB,CAACC;QAC5BD,UAAU,iBAAiB,CAACE;QAC5BF,UAAU,iBAAiB,CAACG;QAC5BH,UAAU,iBAAiB,CAACI;IAChC;AACJ"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,213 @@
1
+ import react from "react";
2
+ import { describe, expect, it, vi } from "vitest";
3
+ import { render } from "@testing-library/react";
4
+ import { Container } from "@webiny/di";
5
+ import { DiContainerProvider } from "@webiny/app/shared/di/DiContainerProvider.js";
6
+ import { MainGraphQLClient } from "@webiny/app/features/mainGraphQLClient/abstractions.js";
7
+ import { FeatureFlagsService } from "@webiny/app-admin/features/featureFlags/abstractions.js";
8
+ import { FeatureFlags } from "@webiny/feature-flags";
9
+ import { DeleteEntryUseCase } from "@webiny/app-headless-cms/features/contentEntry/deleteEntry/abstractions.js";
10
+ import { DeleteEntryRevisionUseCase } from "@webiny/app-headless-cms/features/contentEntry/deleteEntryRevision/abstractions.js";
11
+ import { PermanentlyDeleteEntryUseCase } from "@webiny/app-headless-cms/features/contentEntry/permanentlyDeleteEntry/abstractions.js";
12
+ import { BulkDeletePresenter } from "@webiny/app-headless-cms/presentation/contentEntries/bulkActions/abstractions.js";
13
+ import { ActiveReviewGuard } from "@webiny/app-workflows/review/trash/ActiveReviewGuard/abstractions.js";
14
+ import { createTrashUseCaseFakes } from "@webiny/app-workflows/review/testing/createTrashUseCaseFakes.js";
15
+ import { registerTrashUseCaseFakes } from "@webiny/app-workflows/review/testing/registerTrashUseCaseFakes.js";
16
+ import { CmsModelContext } from "@webiny/app-headless-cms/features/contentEntry/abstractions.js";
17
+ import { Notifications } from "@webiny/app-admin/features/notifications/abstractions.js";
18
+ import { CmsWorkflows } from "../../index.js";
19
+ import { CmsReviewTrashFeature } from "./feature.js";
20
+ vi.mock("~/Components/CmsEntriesList/CmsReviewMoveEntryAction.js", ()=>({
21
+ CmsReviewMoveEntryAction: ()=>null
22
+ }));
23
+ vi.mock("~/Components/CmsEntriesList/CmsReviewScheduleEntryAction.js", ()=>({
24
+ CmsReviewScheduleEntryAction: ()=>null
25
+ }));
26
+ vi.mock("~/Components/ModelDelete/ModelDeleteWorkflowError.js", ()=>({
27
+ ModelDeleteWorkflowError: ()=>null
28
+ }));
29
+ vi.mock("~/Routes/index.js", ()=>({
30
+ CmsWorkflowEditor: ()=>null
31
+ }));
32
+ vi.mock("~/Components/ContentEntryForm/index.js", ()=>({
33
+ CmsEntryReviewBar: ()=>null,
34
+ CmsEntryReviewBlockedActions: ()=>null,
35
+ CmsEntryReviewFormLock: ()=>null,
36
+ CmsEntryReviewNewRevision: ()=>null,
37
+ CmsEntryReviewScheduleMenuItem: ()=>null
38
+ }));
39
+ vi.mock("~/Components/ContentReviews/CmsContentReviews.js", ()=>({
40
+ CmsContentReviews: ()=>/*#__PURE__*/ react.createElement("div", {
41
+ "data-testid": "cms-content-reviews"
42
+ })
43
+ }));
44
+ vi.mock("~/Components/ContentReviews/CmsContentReviewsSidebarItem.js", ()=>({
45
+ CmsContentReviewsSidebarItem: ()=>/*#__PURE__*/ react.createElement("div", {
46
+ "data-testid": "cms-content-reviews-sidebar"
47
+ })
48
+ }));
49
+ vi.mock("~/presentation/feature.js", ()=>({
50
+ CmsWorkflowsFeature: {
51
+ name: "Mock",
52
+ register: ()=>void 0,
53
+ resolve: ()=>void 0
54
+ }
55
+ }));
56
+ vi.mock("~/features/feature.js", ()=>({
57
+ CmsWorkflowsCacheFeature: {
58
+ name: "Mock",
59
+ register: ()=>void 0,
60
+ resolve: ()=>void 0
61
+ }
62
+ }));
63
+ const MODEL = {
64
+ modelId: "article",
65
+ singularApiName: "Article"
66
+ };
67
+ describe("CmsWorkflows (composition root)", ()=>{
68
+ const createContainer = (isEnabled)=>{
69
+ const flagsService = {
70
+ getFlags: ()=>new FeatureFlags({
71
+ advancedPublishingWorkflow: isEnabled
72
+ }),
73
+ isLoaded: ()=>true,
74
+ loadFlags: async ()=>void 0
75
+ };
76
+ const guard = {
77
+ run: vi.fn(async (params)=>params.action()),
78
+ runBulk: vi.fn()
79
+ };
80
+ const decoratee = {
81
+ execute: vi.fn(async ()=>true)
82
+ };
83
+ const container = new Container();
84
+ container.registerInstance(FeatureFlagsService, flagsService);
85
+ container.registerInstance(MainGraphQLClient, {
86
+ execute: vi.fn()
87
+ });
88
+ container.registerInstance(ActiveReviewGuard, guard);
89
+ container.registerInstance(DeleteEntryUseCase, decoratee);
90
+ return {
91
+ container,
92
+ guard,
93
+ decoratee
94
+ };
95
+ };
96
+ it("wraps the delete use case with the review guard when the flag is on", async ()=>{
97
+ const { container, guard, decoratee } = createContainer(true);
98
+ render(/*#__PURE__*/ react.createElement(DiContainerProvider, {
99
+ container: container
100
+ }, /*#__PURE__*/ react.createElement(CmsWorkflows, null)));
101
+ await container.resolve(DeleteEntryUseCase).execute({
102
+ model: MODEL,
103
+ id: "entry-1"
104
+ });
105
+ expect(guard.run).toHaveBeenCalledTimes(1);
106
+ expect(decoratee.execute).toHaveBeenCalledTimes(1);
107
+ });
108
+ it("leaves the delete use case unwrapped when the flag is off", async ()=>{
109
+ const { container, guard, decoratee } = createContainer(false);
110
+ render(/*#__PURE__*/ react.createElement(DiContainerProvider, {
111
+ container: container
112
+ }, /*#__PURE__*/ react.createElement(CmsWorkflows, null)));
113
+ await container.resolve(DeleteEntryUseCase).execute({
114
+ model: MODEL,
115
+ id: "entry-1"
116
+ });
117
+ expect(guard.run).not.toHaveBeenCalled();
118
+ expect(decoratee.execute).toHaveBeenCalledTimes(1);
119
+ });
120
+ });
121
+ describe("CmsReviewTrashFeature", ()=>{
122
+ function setup() {
123
+ const guard = {
124
+ run: vi.fn(async (params)=>params.action()),
125
+ runBulk: vi.fn(async (params)=>params.run(params.items, false)),
126
+ confirmBlocking: vi.fn()
127
+ };
128
+ const useCases = createTrashUseCaseFakes();
129
+ const container = new Container();
130
+ container.registerInstance(Notifications, {
131
+ error: vi.fn()
132
+ });
133
+ container.registerInstance(CmsModelContext, {
134
+ getModel: ()=>MODEL,
135
+ setModel: vi.fn()
136
+ });
137
+ container.registerInstance(ActiveReviewGuard, guard);
138
+ registerTrashUseCaseFakes(container, useCases);
139
+ container.registerInstance(DeleteEntryUseCase, {
140
+ execute: vi.fn(async ()=>true)
141
+ });
142
+ container.registerInstance(DeleteEntryRevisionUseCase, {
143
+ execute: vi.fn(async ()=>true)
144
+ });
145
+ container.registerInstance(PermanentlyDeleteEntryUseCase, {
146
+ execute: vi.fn(async ()=>true)
147
+ });
148
+ const bulkDecoratee = {
149
+ vm: {
150
+ processing: false,
151
+ results: []
152
+ },
153
+ execute: vi.fn(async (_items, _allSelected)=>true)
154
+ };
155
+ container.registerInstance(BulkDeletePresenter, bulkDecoratee);
156
+ CmsReviewTrashFeature.register(container);
157
+ return {
158
+ container,
159
+ guard,
160
+ useCases,
161
+ bulkDecoratee
162
+ };
163
+ }
164
+ it("decorates the three delete use cases and the bulk presenter", async ()=>{
165
+ const { container, guard } = setup();
166
+ await container.resolve(DeleteEntryUseCase).execute({
167
+ model: MODEL,
168
+ id: "entry-1"
169
+ });
170
+ await container.resolve(DeleteEntryRevisionUseCase).execute({
171
+ model: MODEL,
172
+ revisionId: "entry-1#0002"
173
+ });
174
+ await container.resolve(PermanentlyDeleteEntryUseCase).execute({
175
+ model: MODEL,
176
+ id: "entry-1"
177
+ });
178
+ await container.resolve(BulkDeletePresenter).execute([
179
+ {
180
+ id: "e1#0001",
181
+ entryId: "e1"
182
+ }
183
+ ], false);
184
+ expect(guard.run).toHaveBeenCalledTimes(3);
185
+ expect(guard.run.mock.calls.map((call)=>call[0].revisionId)).toEqual([
186
+ null,
187
+ "entry-1#0002",
188
+ null
189
+ ]);
190
+ expect(guard.run.mock.calls.every((call)=>!("useCases" in call[0]))).toBe(true);
191
+ expect(guard.runBulk).toHaveBeenCalledTimes(1);
192
+ });
193
+ it("checks the loaded rows for reviews in progress before the bulk task, through the decorated presenter", async ()=>{
194
+ const { container, guard, useCases, bulkDecoratee } = setup();
195
+ const rows = [
196
+ {
197
+ id: "e1#0001",
198
+ entryId: "e1"
199
+ }
200
+ ];
201
+ await container.resolve(BulkDeletePresenter).execute(rows, true);
202
+ expect(useCases.listBlockingReviews.execute).toHaveBeenCalledWith({
203
+ namespace: "cms.article",
204
+ targetIds: [
205
+ "e1"
206
+ ]
207
+ });
208
+ expect(guard.runBulk).not.toHaveBeenCalled();
209
+ expect(bulkDecoratee.execute).toHaveBeenCalledWith(rows, true);
210
+ });
211
+ });
212
+
213
+ //# sourceMappingURL=feature.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/trash/feature.test.js","sources":["../../../src/features/trash/feature.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { vi } from \"vitest\";\nimport { render } from \"@testing-library/react\";\nimport { Container } from \"@webiny/di\";\nimport { DiContainerProvider } from \"@webiny/app/shared/di/DiContainerProvider.js\";\nimport { MainGraphQLClient } from \"@webiny/app/features/mainGraphQLClient/abstractions.js\";\nimport { FeatureFlagsService } from \"@webiny/app-admin/features/featureFlags/abstractions.js\";\nimport { FeatureFlags } from \"@webiny/feature-flags\";\nimport { DeleteEntryUseCase } from \"@webiny/app-headless-cms/features/contentEntry/deleteEntry/abstractions.js\";\nimport { DeleteEntryRevisionUseCase } from \"@webiny/app-headless-cms/features/contentEntry/deleteEntryRevision/abstractions.js\";\nimport { PermanentlyDeleteEntryUseCase } from \"@webiny/app-headless-cms/features/contentEntry/permanentlyDeleteEntry/abstractions.js\";\nimport { BulkDeletePresenter } from \"@webiny/app-headless-cms/presentation/contentEntries/bulkActions/abstractions.js\";\nimport type { CmsContentEntry } from \"@webiny/app-headless-cms/types.js\";\nimport type { CmsModel } from \"@webiny/app-headless-cms/types.js\";\nimport { ActiveReviewGuard } from \"@webiny/app-workflows/review/trash/ActiveReviewGuard/abstractions.js\";\nimport { createTrashUseCaseFakes } from \"@webiny/app-workflows/review/testing/createTrashUseCaseFakes.js\";\nimport { registerTrashUseCaseFakes } from \"@webiny/app-workflows/review/testing/registerTrashUseCaseFakes.js\";\nimport { CmsModelContext } from \"@webiny/app-headless-cms/features/contentEntry/abstractions.js\";\nimport { Notifications } from \"@webiny/app-admin/features/notifications/abstractions.js\";\nimport { CmsWorkflows } from \"~/index.js\";\nimport { CmsReviewTrashFeature } from \"./feature.js\";\n\n// The composition root also mounts the other CMS workflow features; they are stubbed as in `src/index.test.tsx`.\nvi.mock(\"~/Components/CmsEntriesList/CmsReviewMoveEntryAction.js\", () => {\n return { CmsReviewMoveEntryAction: () => null };\n});\n\nvi.mock(\"~/Components/CmsEntriesList/CmsReviewScheduleEntryAction.js\", () => {\n return { CmsReviewScheduleEntryAction: () => null };\n});\n\nvi.mock(\"~/Components/ModelDelete/ModelDeleteWorkflowError.js\", () => {\n return { ModelDeleteWorkflowError: () => null };\n});\n\nvi.mock(\"~/Routes/index.js\", () => {\n return { CmsWorkflowEditor: () => null };\n});\n\nvi.mock(\"~/Components/ContentEntryForm/index.js\", () => {\n return {\n CmsEntryReviewBar: () => null,\n CmsEntryReviewBlockedActions: () => null,\n CmsEntryReviewFormLock: () => null,\n CmsEntryReviewNewRevision: () => null,\n CmsEntryReviewScheduleMenuItem: () => null\n };\n});\n\nvi.mock(\"~/Components/ContentReviews/CmsContentReviews.js\", () => {\n return { CmsContentReviews: () => <div data-testid=\"cms-content-reviews\" /> };\n});\n\nvi.mock(\"~/Components/ContentReviews/CmsContentReviewsSidebarItem.js\", () => {\n return {\n CmsContentReviewsSidebarItem: () => <div data-testid=\"cms-content-reviews-sidebar\" />\n };\n});\n\nvi.mock(\"~/presentation/feature.js\", () => {\n return {\n CmsWorkflowsFeature: { name: \"Mock\", register: () => undefined, resolve: () => undefined }\n };\n});\n\nvi.mock(\"~/features/feature.js\", () => {\n return {\n CmsWorkflowsCacheFeature: {\n name: \"Mock\",\n register: () => undefined,\n resolve: () => undefined\n }\n };\n});\n\nconst MODEL = { modelId: \"article\", singularApiName: \"Article\" } as CmsModel;\n\ndescribe(\"CmsWorkflows (composition root)\", () => {\n const createContainer = (isEnabled: boolean) => {\n const flagsService: FeatureFlagsService.Interface = {\n getFlags: () => new FeatureFlags({ advancedPublishingWorkflow: isEnabled }),\n isLoaded: () => true,\n loadFlags: async () => undefined\n };\n const guard = {\n run: vi.fn(async <TResult,>(params: ActiveReviewGuard.Params<TResult>) =>\n params.action()\n ),\n runBulk: vi.fn()\n };\n const decoratee = { execute: vi.fn(async () => true) };\n const container = new Container();\n container.registerInstance(FeatureFlagsService, flagsService);\n container.registerInstance(MainGraphQLClient, { execute: vi.fn() });\n container.registerInstance(\n ActiveReviewGuard,\n guard as unknown as ActiveReviewGuard.Interface\n );\n container.registerInstance(DeleteEntryUseCase, decoratee);\n return { container, guard, decoratee };\n };\n\n it(\"wraps the delete use case with the review guard when the flag is on\", async () => {\n const { container, guard, decoratee } = createContainer(true);\n\n render(\n <DiContainerProvider container={container}>\n <CmsWorkflows />\n </DiContainerProvider>\n );\n\n await container.resolve(DeleteEntryUseCase).execute({ model: MODEL, id: \"entry-1\" });\n\n expect(guard.run).toHaveBeenCalledTimes(1);\n expect(decoratee.execute).toHaveBeenCalledTimes(1);\n });\n\n it(\"leaves the delete use case unwrapped when the flag is off\", async () => {\n const { container, guard, decoratee } = createContainer(false);\n\n render(\n <DiContainerProvider container={container}>\n <CmsWorkflows />\n </DiContainerProvider>\n );\n\n await container.resolve(DeleteEntryUseCase).execute({ model: MODEL, id: \"entry-1\" });\n\n expect(guard.run).not.toHaveBeenCalled();\n expect(decoratee.execute).toHaveBeenCalledTimes(1);\n });\n});\n\ndescribe(\"CmsReviewTrashFeature\", () => {\n function setup() {\n const guard = {\n run: vi.fn(async <TResult,>(params: ActiveReviewGuard.Params<TResult>) =>\n params.action()\n ),\n runBulk: vi.fn(async <TItem,>(params: ActiveReviewGuard.BulkParams<TItem>) =>\n params.run(params.items, false)\n ),\n confirmBlocking: vi.fn()\n };\n const useCases = createTrashUseCaseFakes();\n const container = new Container();\n container.registerInstance(Notifications, {\n error: vi.fn()\n } as unknown as Notifications.Interface);\n container.registerInstance(CmsModelContext, { getModel: () => MODEL, setModel: vi.fn() });\n container.registerInstance(\n ActiveReviewGuard,\n guard as unknown as ActiveReviewGuard.Interface\n );\n registerTrashUseCaseFakes(container, useCases);\n container.registerInstance(DeleteEntryUseCase, { execute: vi.fn(async () => true) });\n container.registerInstance(DeleteEntryRevisionUseCase, {\n execute: vi.fn(async () => true)\n });\n container.registerInstance(PermanentlyDeleteEntryUseCase, {\n execute: vi.fn(async () => true)\n });\n const bulkDecoratee = {\n vm: { processing: false, results: [] },\n execute: vi.fn(async (_items: CmsContentEntry[], _allSelected: boolean) => true)\n };\n container.registerInstance(BulkDeletePresenter, bulkDecoratee);\n CmsReviewTrashFeature.register(container);\n return { container, guard, useCases, bulkDecoratee };\n }\n\n it(\"decorates the three delete use cases and the bulk presenter\", async () => {\n const { container, guard } = setup();\n\n await container.resolve(DeleteEntryUseCase).execute({ model: MODEL, id: \"entry-1\" });\n await container\n .resolve(DeleteEntryRevisionUseCase)\n .execute({ model: MODEL, revisionId: \"entry-1#0002\" });\n await container\n .resolve(PermanentlyDeleteEntryUseCase)\n .execute({ model: MODEL, id: \"entry-1\" });\n await container\n .resolve(BulkDeletePresenter)\n .execute([{ id: \"e1#0001\", entryId: \"e1\" } as CmsContentEntry], false);\n\n expect(guard.run).toHaveBeenCalledTimes(3);\n expect(guard.run.mock.calls.map(call => call[0].revisionId)).toEqual([\n null,\n \"entry-1#0002\",\n null\n ]);\n expect(guard.run.mock.calls.every(call => !(\"useCases\" in call[0]))).toBe(true);\n expect(guard.runBulk).toHaveBeenCalledTimes(1);\n });\n\n it(\"checks the loaded rows for reviews in progress before the bulk task, through the decorated presenter\", async () => {\n const { container, guard, useCases, bulkDecoratee } = setup();\n const rows = [{ id: \"e1#0001\", entryId: \"e1\" } as CmsContentEntry];\n\n await container.resolve(BulkDeletePresenter).execute(rows, true);\n\n expect(useCases.listBlockingReviews.execute).toHaveBeenCalledWith({\n namespace: \"cms.article\",\n targetIds: [\"e1\"]\n });\n expect(guard.runBulk).not.toHaveBeenCalled();\n expect(bulkDecoratee.execute).toHaveBeenCalledWith(rows, true);\n });\n});\n"],"names":["vi","undefined","MODEL","describe","createContainer","isEnabled","flagsService","FeatureFlags","guard","params","decoratee","container","Container","FeatureFlagsService","MainGraphQLClient","ActiveReviewGuard","DeleteEntryUseCase","it","render","DiContainerProvider","CmsWorkflows","expect","setup","useCases","createTrashUseCaseFakes","Notifications","CmsModelContext","registerTrashUseCaseFakes","DeleteEntryRevisionUseCase","PermanentlyDeleteEntryUseCase","bulkDecoratee","_items","_allSelected","BulkDeletePresenter","CmsReviewTrashFeature","call","rows"],"mappings":";;;;;;;;;;;;;;;;;;;AA0BAA,GAAG,IAAI,CAAC,2DAA2D,IACxD;QAAE,0BAA0B,IAAM;IAAK;AAGlDA,GAAG,IAAI,CAAC,+DAA+D,IAC5D;QAAE,8BAA8B,IAAM;IAAK;AAGtDA,GAAG,IAAI,CAAC,wDAAwD,IACrD;QAAE,0BAA0B,IAAM;IAAK;AAGlDA,GAAG,IAAI,CAAC,qBAAqB,IAClB;QAAE,mBAAmB,IAAM;IAAK;AAG3CA,GAAG,IAAI,CAAC,0CAA0C,IACvC;QACH,mBAAmB,IAAM;QACzB,8BAA8B,IAAM;QACpC,wBAAwB,IAAM;QAC9B,2BAA2B,IAAM;QACjC,gCAAgC,IAAM;IAC1C;AAGJA,GAAG,IAAI,CAAC,oDAAoD,IACjD;QAAE,mBAAmB,kBAAM,oBAAC;gBAAI,eAAY;;IAAyB;AAGhFA,GAAG,IAAI,CAAC,+DAA+D,IAC5D;QACH,8BAA8B,kBAAM,oBAAC;gBAAI,eAAY;;IACzD;AAGJA,GAAG,IAAI,CAAC,6BAA6B,IAC1B;QACH,qBAAqB;YAAE,MAAM;YAAQ,UAAU,IAAMC;YAAW,SAAS,IAAMA;QAAU;IAC7F;AAGJD,GAAG,IAAI,CAAC,yBAAyB,IACtB;QACH,0BAA0B;YACtB,MAAM;YACN,UAAU,IAAMC;YAChB,SAAS,IAAMA;QACnB;IACJ;AAGJ,MAAMC,QAAQ;IAAE,SAAS;IAAW,iBAAiB;AAAU;AAE/DC,SAAS,mCAAmC;IACxC,MAAMC,kBAAkB,CAACC;QACrB,MAAMC,eAA8C;YAChD,UAAU,IAAM,IAAIC,aAAa;oBAAE,4BAA4BF;gBAAU;YACzE,UAAU,IAAM;YAChB,WAAW,UAAYJ;QAC3B;QACA,MAAMO,QAAQ;YACV,KAAKR,GAAG,EAAE,CAAC,OAAiBS,SACxBA,OAAO,MAAM;YAEjB,SAAST,GAAG,EAAE;QAClB;QACA,MAAMU,YAAY;YAAE,SAASV,GAAG,EAAE,CAAC,UAAY;QAAM;QACrD,MAAMW,YAAY,IAAIC;QACtBD,UAAU,gBAAgB,CAACE,qBAAqBP;QAChDK,UAAU,gBAAgB,CAACG,mBAAmB;YAAE,SAASd,GAAG,EAAE;QAAG;QACjEW,UAAU,gBAAgB,CACtBI,mBACAP;QAEJG,UAAU,gBAAgB,CAACK,oBAAoBN;QAC/C,OAAO;YAAEC;YAAWH;YAAOE;QAAU;IACzC;IAEAO,GAAG,uEAAuE;QACtE,MAAM,EAAEN,SAAS,EAAEH,KAAK,EAAEE,SAAS,EAAE,GAAGN,gBAAgB;QAExDc,OAAO,WAADA,GACF,oBAACC,qBAAmBA;YAAC,WAAWR;yBAC5B,oBAACS,cAAYA;QAIrB,MAAMT,UAAU,OAAO,CAACK,oBAAoB,OAAO,CAAC;YAAE,OAAOd;YAAO,IAAI;QAAU;QAElFmB,OAAOb,MAAM,GAAG,EAAE,qBAAqB,CAAC;QACxCa,OAAOX,UAAU,OAAO,EAAE,qBAAqB,CAAC;IACpD;IAEAO,GAAG,6DAA6D;QAC5D,MAAM,EAAEN,SAAS,EAAEH,KAAK,EAAEE,SAAS,EAAE,GAAGN,gBAAgB;QAExDc,OAAO,WAADA,GACF,oBAACC,qBAAmBA;YAAC,WAAWR;yBAC5B,oBAACS,cAAYA;QAIrB,MAAMT,UAAU,OAAO,CAACK,oBAAoB,OAAO,CAAC;YAAE,OAAOd;YAAO,IAAI;QAAU;QAElFmB,OAAOb,MAAM,GAAG,EAAE,GAAG,CAAC,gBAAgB;QACtCa,OAAOX,UAAU,OAAO,EAAE,qBAAqB,CAAC;IACpD;AACJ;AAEAP,SAAS,yBAAyB;IAC9B,SAASmB;QACL,MAAMd,QAAQ;YACV,KAAKR,GAAG,EAAE,CAAC,OAAiBS,SACxBA,OAAO,MAAM;YAEjB,SAAST,GAAG,EAAE,CAAC,OAAeS,SAC1BA,OAAO,GAAG,CAACA,OAAO,KAAK,EAAE;YAE7B,iBAAiBT,GAAG,EAAE;QAC1B;QACA,MAAMuB,WAAWC;QACjB,MAAMb,YAAY,IAAIC;QACtBD,UAAU,gBAAgB,CAACc,eAAe;YACtC,OAAOzB,GAAG,EAAE;QAChB;QACAW,UAAU,gBAAgB,CAACe,iBAAiB;YAAE,UAAU,IAAMxB;YAAO,UAAUF,GAAG,EAAE;QAAG;QACvFW,UAAU,gBAAgB,CACtBI,mBACAP;QAEJmB,0BAA0BhB,WAAWY;QACrCZ,UAAU,gBAAgB,CAACK,oBAAoB;YAAE,SAAShB,GAAG,EAAE,CAAC,UAAY;QAAM;QAClFW,UAAU,gBAAgB,CAACiB,4BAA4B;YACnD,SAAS5B,GAAG,EAAE,CAAC,UAAY;QAC/B;QACAW,UAAU,gBAAgB,CAACkB,+BAA+B;YACtD,SAAS7B,GAAG,EAAE,CAAC,UAAY;QAC/B;QACA,MAAM8B,gBAAgB;YAClB,IAAI;gBAAE,YAAY;gBAAO,SAAS,EAAE;YAAC;YACrC,SAAS9B,GAAG,EAAE,CAAC,OAAO+B,QAA2BC,eAA0B;QAC/E;QACArB,UAAU,gBAAgB,CAACsB,qBAAqBH;QAChDI,sBAAsB,QAAQ,CAACvB;QAC/B,OAAO;YAAEA;YAAWH;YAAOe;YAAUO;QAAc;IACvD;IAEAb,GAAG,+DAA+D;QAC9D,MAAM,EAAEN,SAAS,EAAEH,KAAK,EAAE,GAAGc;QAE7B,MAAMX,UAAU,OAAO,CAACK,oBAAoB,OAAO,CAAC;YAAE,OAAOd;YAAO,IAAI;QAAU;QAClF,MAAMS,UACD,OAAO,CAACiB,4BACR,OAAO,CAAC;YAAE,OAAO1B;YAAO,YAAY;QAAe;QACxD,MAAMS,UACD,OAAO,CAACkB,+BACR,OAAO,CAAC;YAAE,OAAO3B;YAAO,IAAI;QAAU;QAC3C,MAAMS,UACD,OAAO,CAACsB,qBACR,OAAO,CAAC;YAAC;gBAAE,IAAI;gBAAW,SAAS;YAAK;SAAqB,EAAE;QAEpEZ,OAAOb,MAAM,GAAG,EAAE,qBAAqB,CAAC;QACxCa,OAAOb,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC2B,CAAAA,OAAQA,IAAI,CAAC,EAAE,CAAC,UAAU,GAAG,OAAO,CAAC;YACjE;YACA;YACA;SACH;QACDd,OAAOb,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC2B,CAAAA,OAAQ,CAAE,eAAcA,IAAI,CAAC,EAAC,IAAK,IAAI,CAAC;QAC1Ed,OAAOb,MAAM,OAAO,EAAE,qBAAqB,CAAC;IAChD;IAEAS,GAAG,wGAAwG;QACvG,MAAM,EAAEN,SAAS,EAAEH,KAAK,EAAEe,QAAQ,EAAEO,aAAa,EAAE,GAAGR;QACtD,MAAMc,OAAO;YAAC;gBAAE,IAAI;gBAAW,SAAS;YAAK;SAAqB;QAElE,MAAMzB,UAAU,OAAO,CAACsB,qBAAqB,OAAO,CAACG,MAAM;QAE3Df,OAAOE,SAAS,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,CAAC;YAC9D,WAAW;YACX,WAAW;gBAAC;aAAK;QACrB;QACAF,OAAOb,MAAM,OAAO,EAAE,GAAG,CAAC,gBAAgB;QAC1Ca,OAAOS,cAAc,OAAO,EAAE,oBAAoB,CAACM,MAAM;IAC7D;AACJ"}
package/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare const CmsWorkflows: () => React.JSX.Element | null;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,149 @@
1
+ import react from "react";
2
+ import { beforeEach, describe, expect, it, vi } from "vitest";
3
+ import { render, screen, waitFor } from "@testing-library/react";
4
+ import { Container } from "@webiny/di";
5
+ import { CompositionProvider } from "@webiny/react-composition";
6
+ import { DiContainerProvider } from "@webiny/app/shared/di/DiContainerProvider.js";
7
+ import { FeatureFlagsService } from "@webiny/app-admin/features/featureFlags/abstractions.js";
8
+ import { FeatureFlags } from "@webiny/feature-flags";
9
+ import { AdminUiProvider } from "@webiny/admin-ui";
10
+ import { ModelContext } from "@webiny/app-headless-cms/admin/components/ModelProvider/index.js";
11
+ import { ContentEntryEditorConfig, ContentEntryEditorWithConfig, useContentEntryEditorConfig } from "@webiny/app-headless-cms/admin/config/contentEntries/index.js";
12
+ import { ContentEntryFormPresenter } from "@webiny/app-headless-cms/presentation/contentEntries/form/abstractions.js";
13
+ import { ContentEntryForm, ContentEntryFormContent } from "@webiny/app-headless-cms/presentation/contentEntries/views/layout/index.js";
14
+ import { TargetReviewPresenter } from "@webiny/app-workflows/review/presentation/targetReview/abstractions.js";
15
+ import { createFakePresenter } from "@webiny/app-workflows/review/testing/fakeTargetReviewPresenter.js";
16
+ import { createTargetReviewViewModel } from "@webiny/app-workflows/review/testing/createTargetReviewViewModel.js";
17
+ import { CmsEntryReview } from "./features/editorReview/abstractions.js";
18
+ import { CmsWorkflows } from "./index.js";
19
+ import { createEntry } from "./testing/createEntry.js";
20
+ import { createFormVm } from "./testing/createFormVm.js";
21
+ import { MODEL } from "./testing/models.js";
22
+ import { LOADING } from "./testing/reviewStates.js";
23
+ vi.mock("@webiny/app-workflows/review/editor/components/EditorReviewBar.js", async ()=>{
24
+ const React = await import("react");
25
+ return {
26
+ EditorReviewBar: ()=>React.createElement("div", {
27
+ "data-testid": "editor-review-bar"
28
+ })
29
+ };
30
+ });
31
+ vi.mock("~/Routes/index.js", ()=>({
32
+ CmsWorkflowEditor: ()=>null
33
+ }));
34
+ vi.mock("~/Components/ContentReviews/CmsContentReviews.js", ()=>({
35
+ CmsContentReviews: ()=>null
36
+ }));
37
+ vi.mock("~/Components/ContentReviews/CmsContentReviewsSidebarItem.js", ()=>({
38
+ CmsContentReviewsSidebarItem: ()=>null
39
+ }));
40
+ class FakeBasePresenter {
41
+ get vm() {
42
+ return createFormVm({
43
+ entry: createEntry(),
44
+ model: MODEL
45
+ });
46
+ }
47
+ async loadRevision() {}
48
+ async saveRevision() {
49
+ return true;
50
+ }
51
+ async publishRevision() {
52
+ return true;
53
+ }
54
+ async unpublishRevision() {
55
+ return true;
56
+ }
57
+ async deleteEntry() {
58
+ return true;
59
+ }
60
+ setFolderId() {}
61
+ newEntry() {}
62
+ patchEntryMeta() {}
63
+ reset() {}
64
+ }
65
+ const BasePresenter = ContentEntryFormPresenter.createImplementation({
66
+ implementation: FakeBasePresenter,
67
+ dependencies: []
68
+ });
69
+ const ActionsProbe = ()=>{
70
+ const { buttonActions, menuItemActions } = useContentEntryEditorConfig();
71
+ const names = [
72
+ ...buttonActions,
73
+ ...menuItemActions
74
+ ].map((action)=>action.name);
75
+ const scheduleActions = menuItemActions.filter((action)=>"schedule" === action.name);
76
+ return /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement("div", {
77
+ "data-testid": "action-names"
78
+ }, names.join(",")), scheduleActions.map((action)=>/*#__PURE__*/ react.createElement("span", {
79
+ key: action.name
80
+ }, action.element)));
81
+ };
82
+ function mountRoot(isEnabled) {
83
+ const flagsService = {
84
+ getFlags: ()=>new FeatureFlags({
85
+ advancedPublishingWorkflow: isEnabled
86
+ }),
87
+ isLoaded: ()=>true,
88
+ loadFlags: async ()=>void 0
89
+ };
90
+ const container = new Container();
91
+ const presenter = createFakePresenter(createTargetReviewViewModel(LOADING));
92
+ container.registerInstance(FeatureFlagsService, flagsService);
93
+ container.registerInstance(TargetReviewPresenter, presenter);
94
+ container.register(BasePresenter).inSingletonScope();
95
+ render(/*#__PURE__*/ react.createElement(AdminUiProvider, null, /*#__PURE__*/ react.createElement(CompositionProvider, null, /*#__PURE__*/ react.createElement(DiContainerProvider, {
96
+ container: container
97
+ }, /*#__PURE__*/ react.createElement(ModelContext.Provider, {
98
+ value: MODEL
99
+ }, /*#__PURE__*/ react.createElement(CmsWorkflows, null), /*#__PURE__*/ react.createElement(ContentEntryEditorConfig, null, /*#__PURE__*/ react.createElement(ContentEntryEditorConfig.Width, {
100
+ value: "1020px"
101
+ }), /*#__PURE__*/ react.createElement(ContentEntryEditorConfig.Actions.MenuItemAction, {
102
+ name: "schedule",
103
+ element: /*#__PURE__*/ react.createElement("span", {
104
+ "data-testid": "schedule-item"
105
+ })
106
+ })), /*#__PURE__*/ react.createElement(ContentEntryEditorWithConfig, null, /*#__PURE__*/ react.createElement(ActionsProbe, null), /*#__PURE__*/ react.createElement(ContentEntryForm, null), /*#__PURE__*/ react.createElement(ContentEntryFormContent, null, /*#__PURE__*/ react.createElement("div", {
107
+ "data-testid": "original"
108
+ }))))))));
109
+ return {
110
+ container,
111
+ presenter
112
+ };
113
+ }
114
+ describe("CmsWorkflows editor wiring", ()=>{
115
+ beforeEach(()=>{
116
+ vi.clearAllMocks();
117
+ });
118
+ it("registers the session, the bar, the actions and the presenter decorator with the flag on", async ()=>{
119
+ const { container, presenter } = mountRoot(true);
120
+ const session = container.resolve(CmsEntryReview);
121
+ expect(session.presenter).toBe(presenter);
122
+ expect(await screen.findAllByTestId("editor-review-bar")).toHaveLength(1);
123
+ const names = (await screen.findByTestId("action-names")).textContent ?? "";
124
+ expect(names).toContain("workflowBlockedActions");
125
+ expect(names).toContain("createNewRevision");
126
+ expect(names).not.toContain("workflowStateTooltip");
127
+ await waitFor(()=>expect(document.querySelector("fieldset[disabled]")).not.toBeNull());
128
+ await waitFor(()=>expect(screen.queryByTestId("schedule-item")).toBeNull());
129
+ const form = container.resolve(ContentEntryFormPresenter);
130
+ await form.loadRevision("entry-1#0001");
131
+ expect(presenter.init).toHaveBeenCalledTimes(1);
132
+ });
133
+ it("registers nothing with the flag off", async ()=>{
134
+ const { container, presenter } = mountRoot(false);
135
+ expect(()=>container.resolve(CmsEntryReview)).toThrow("No registration found");
136
+ expect(await screen.findByTestId("original")).toBeTruthy();
137
+ await waitFor(()=>expect(screen.queryByTestId("editor-review-bar")).toBeNull());
138
+ const names = (await screen.findByTestId("action-names")).textContent ?? "";
139
+ expect(names).not.toContain("workflowBlockedActions");
140
+ expect(names).not.toContain("createNewRevision");
141
+ expect(await screen.findByTestId("schedule-item")).toBeTruthy();
142
+ expect(document.querySelector("fieldset")).toBeNull();
143
+ const form = container.resolve(ContentEntryFormPresenter);
144
+ await form.loadRevision("entry-1#0001");
145
+ expect(presenter.init).not.toHaveBeenCalled();
146
+ });
147
+ });
148
+
149
+ //# sourceMappingURL=index.editor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.editor.test.js","sources":["../src/index.editor.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 { render } from \"@testing-library/react\";\nimport { screen } from \"@testing-library/react\";\nimport { waitFor } from \"@testing-library/react\";\nimport { Container } from \"@webiny/di\";\nimport { CompositionProvider } from \"@webiny/react-composition\";\nimport { DiContainerProvider } from \"@webiny/app/shared/di/DiContainerProvider.js\";\nimport { FeatureFlagsService } from \"@webiny/app-admin/features/featureFlags/abstractions.js\";\nimport { FeatureFlags } from \"@webiny/feature-flags\";\nimport { AdminUiProvider } from \"@webiny/admin-ui\";\nimport { ModelContext } from \"@webiny/app-headless-cms/admin/components/ModelProvider/index.js\";\nimport { ContentEntryEditorConfig } from \"@webiny/app-headless-cms/admin/config/contentEntries/index.js\";\nimport { ContentEntryEditorWithConfig } from \"@webiny/app-headless-cms/admin/config/contentEntries/index.js\";\nimport { useContentEntryEditorConfig } from \"@webiny/app-headless-cms/admin/config/contentEntries/index.js\";\nimport { ContentEntryFormPresenter } from \"@webiny/app-headless-cms/presentation/contentEntries/form/abstractions.js\";\nimport { ContentEntryForm } from \"@webiny/app-headless-cms/presentation/contentEntries/views/layout/index.js\";\nimport { ContentEntryFormContent } from \"@webiny/app-headless-cms/presentation/contentEntries/views/layout/index.js\";\nimport { TargetReviewPresenter } from \"@webiny/app-workflows/review/presentation/targetReview/abstractions.js\";\nimport { createFakePresenter } from \"@webiny/app-workflows/review/testing/fakeTargetReviewPresenter.js\";\nimport { createTargetReviewViewModel } from \"@webiny/app-workflows/review/testing/createTargetReviewViewModel.js\";\nimport { CmsEntryReview } from \"~/features/editorReview/abstractions.js\";\nimport { CmsWorkflows } from \"./index.js\";\nimport { createEntry } from \"~/testing/createEntry.js\";\nimport { createFormVm } from \"~/testing/createFormVm.js\";\nimport { MODEL } from \"~/testing/models.js\";\nimport { LOADING } from \"~/testing/reviewStates.js\";\n\nvi.mock(\"@webiny/app-workflows/review/editor/components/EditorReviewBar.js\", async () => {\n const React = await import(\"react\");\n\n return {\n EditorReviewBar: () => React.createElement(\"div\", { \"data-testid\": \"editor-review-bar\" })\n };\n});\n\n/*\n * The workflow editor route, the Content Reviews route, menu and sidebar item and the \"open in new window\"\n * option need routing and menu providers and are not what this test asserts (Task 11's composition test\n * stubs the same modules).\n */\nvi.mock(\"~/Routes/index.js\", () => {\n return { CmsWorkflowEditor: () => null };\n});\n\nvi.mock(\"~/Components/ContentReviews/CmsContentReviews.js\", () => {\n return { CmsContentReviews: () => null };\n});\n\nvi.mock(\"~/Components/ContentReviews/CmsContentReviewsSidebarItem.js\", () => {\n return { CmsContentReviewsSidebarItem: () => null };\n});\n\nclass FakeBasePresenter implements ContentEntryFormPresenter.Interface {\n get vm(): ContentEntryFormPresenter.ViewModel {\n return createFormVm({ entry: createEntry(), model: MODEL });\n }\n\n async loadRevision(): Promise<void> {}\n\n async saveRevision(): Promise<boolean> {\n return true;\n }\n\n async publishRevision(): Promise<boolean> {\n return true;\n }\n\n async unpublishRevision(): Promise<boolean> {\n return true;\n }\n\n async deleteEntry(): Promise<boolean> {\n return true;\n }\n\n setFolderId(): void {}\n\n newEntry(): void {}\n\n patchEntryMeta(): void {}\n\n reset(): void {}\n}\n\nconst BasePresenter = ContentEntryFormPresenter.createImplementation({\n implementation: FakeBasePresenter,\n dependencies: []\n});\n\nconst ActionsProbe = () => {\n const { buttonActions, menuItemActions } = useContentEntryEditorConfig();\n const names = [...buttonActions, ...menuItemActions].map(action => action.name);\n\n // Only the schedule item is rendered, the other menu items need the router.\n const scheduleActions = menuItemActions.filter(action => action.name === \"schedule\");\n\n return (\n <>\n <div data-testid=\"action-names\">{names.join(\",\")}</div>\n {scheduleActions.map(action => (\n <span key={action.name}>{action.element}</span>\n ))}\n </>\n );\n};\n\nfunction mountRoot(isEnabled: boolean) {\n const flagsService: FeatureFlagsService.Interface = {\n getFlags: () => new FeatureFlags({ advancedPublishingWorkflow: isEnabled }),\n isLoaded: () => true,\n loadFlags: async () => undefined\n };\n const container = new Container();\n const presenter = createFakePresenter(createTargetReviewViewModel(LOADING));\n container.registerInstance(FeatureFlagsService, flagsService);\n container.registerInstance(TargetReviewPresenter, presenter);\n container.register(BasePresenter).inSingletonScope();\n\n render(\n <AdminUiProvider>\n <CompositionProvider>\n <DiContainerProvider container={container}>\n <ModelContext.Provider value={MODEL}>\n <CmsWorkflows />\n <ContentEntryEditorConfig>\n <ContentEntryEditorConfig.Width value={\"1020px\"} />\n <ContentEntryEditorConfig.Actions.MenuItemAction\n name={\"schedule\"}\n element={<span data-testid=\"schedule-item\" />}\n />\n </ContentEntryEditorConfig>\n <ContentEntryEditorWithConfig>\n <ActionsProbe />\n <ContentEntryForm />\n <ContentEntryFormContent>\n <div data-testid=\"original\" />\n </ContentEntryFormContent>\n </ContentEntryEditorWithConfig>\n </ModelContext.Provider>\n </DiContainerProvider>\n </CompositionProvider>\n </AdminUiProvider>\n );\n\n return { container, presenter };\n}\n\ndescribe(\"CmsWorkflows editor wiring\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"registers the session, the bar, the actions and the presenter decorator with the flag on\", async () => {\n const { container, presenter } = mountRoot(true);\n\n const session = container.resolve(CmsEntryReview);\n expect(session.presenter).toBe(presenter);\n expect(await screen.findAllByTestId(\"editor-review-bar\")).toHaveLength(1);\n\n const names = (await screen.findByTestId(\"action-names\")).textContent ?? \"\";\n expect(names).toContain(\"workflowBlockedActions\");\n expect(names).toContain(\"createNewRevision\");\n expect(names).not.toContain(\"workflowStateTooltip\");\n\n await waitFor(() => expect(document.querySelector(\"fieldset[disabled]\")).not.toBeNull());\n await waitFor(() => expect(screen.queryByTestId(\"schedule-item\")).toBeNull());\n\n const form = container.resolve(ContentEntryFormPresenter);\n await form.loadRevision(\"entry-1#0001\");\n expect(presenter.init).toHaveBeenCalledTimes(1);\n });\n\n it(\"registers nothing with the flag off\", async () => {\n const { container, presenter } = mountRoot(false);\n\n expect(() => container.resolve(CmsEntryReview)).toThrow(\"No registration found\");\n expect(await screen.findByTestId(\"original\")).toBeTruthy();\n await waitFor(() => expect(screen.queryByTestId(\"editor-review-bar\")).toBeNull());\n\n const names = (await screen.findByTestId(\"action-names\")).textContent ?? \"\";\n expect(names).not.toContain(\"workflowBlockedActions\");\n expect(names).not.toContain(\"createNewRevision\");\n\n expect(await screen.findByTestId(\"schedule-item\")).toBeTruthy();\n expect(document.querySelector(\"fieldset\")).toBeNull();\n\n const form = container.resolve(ContentEntryFormPresenter);\n await form.loadRevision(\"entry-1#0001\");\n expect(presenter.init).not.toHaveBeenCalled();\n });\n});\n"],"names":["vi","React","FakeBasePresenter","createFormVm","createEntry","MODEL","BasePresenter","ContentEntryFormPresenter","ActionsProbe","buttonActions","menuItemActions","useContentEntryEditorConfig","names","action","scheduleActions","mountRoot","isEnabled","flagsService","FeatureFlags","undefined","container","Container","presenter","createFakePresenter","createTargetReviewViewModel","LOADING","FeatureFlagsService","TargetReviewPresenter","render","AdminUiProvider","CompositionProvider","DiContainerProvider","ModelContext","CmsWorkflows","ContentEntryEditorConfig","ContentEntryEditorWithConfig","ContentEntryForm","ContentEntryFormContent","describe","beforeEach","it","session","CmsEntryReview","expect","screen","waitFor","document","form"],"mappings":"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"}