@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,693 @@
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 { DeleteEntryUseCase } from "@webiny/app-headless-cms/features/contentEntry/deleteEntry/abstractions.js";
7
+ import { BulkDeletePresenter } from "@webiny/app-headless-cms/presentation/contentEntries/bulkActions/abstractions.js";
8
+ import { CmsModelContext } from "@webiny/app-headless-cms/features/contentEntry/abstractions.js";
9
+ import { ReviewErrorCode } from "@webiny/app-workflows/review/domain/ReviewErrorCode.js";
10
+ import { createBlockingReview } from "@webiny/app-workflows/review/testing/reviewFixtures.js";
11
+ import { NO_ACCESS_MESSAGE } from "@webiny/app-workflows/review/presentation/noAccessMessage.js";
12
+ import { GENERIC_ERROR } from "@webiny/app-workflows/review/presentation/actionDialog/reviewErrorMessages.js";
13
+ import { REVIEW_TOAST_DURATION, REVIEW_TOAST_POSITION } from "@webiny/app-workflows/review/toasts/constants.js";
14
+ import { ActiveReviewGuard } from "@webiny/app-workflows/review/trash/ActiveReviewGuard/abstractions.js";
15
+ import { ActiveReviewBlockCollector } from "@webiny/app-workflows/review/trash/ActiveReviewBlockCollector/ActiveReviewBlockCollector.js";
16
+ import { ActiveReviewGuard as ActiveReviewGuard_js_ActiveReviewGuard } from "@webiny/app-workflows/review/trash/ActiveReviewGuard/ActiveReviewGuard.js";
17
+ import { createTrashUseCaseFakes } from "@webiny/app-workflows/review/testing/createTrashUseCaseFakes.js";
18
+ import { registerTrashUseCaseFakes } from "@webiny/app-workflows/review/testing/registerTrashUseCaseFakes.js";
19
+ import { DeleteEntryUseCaseReviewDecorator } from "./DeleteEntryUseCaseReviewDecorator.js";
20
+ import { BulkDeletePresenterReviewDecorator } from "./BulkDeletePresenterReviewDecorator.js";
21
+ const MODEL = {
22
+ modelId: "article",
23
+ singularApiName: "Article"
24
+ };
25
+ function entry(entryId) {
26
+ return {
27
+ id: `${entryId}#0001`,
28
+ entryId,
29
+ meta: {
30
+ title: entryId
31
+ }
32
+ };
33
+ }
34
+ function createRefusal(entryId) {
35
+ return new GraphQLOperationError({
36
+ message: "This content has a review in progress.",
37
+ code: ReviewErrorCode.ActiveReviewOnTrash,
38
+ data: {
39
+ model: "cms.article",
40
+ action: "trash",
41
+ reviews: [
42
+ {
43
+ reviewId: `review-${entryId}`,
44
+ model: "cms.article",
45
+ targetId: entryId,
46
+ targetRevisionId: `${entryId}#0001`,
47
+ title: `Title ${entryId}`,
48
+ stepPosition: 1,
49
+ stepCount: 2,
50
+ stepName: "Editor"
51
+ }
52
+ ]
53
+ }
54
+ });
55
+ }
56
+ function createNotifications() {
57
+ return {
58
+ notify: vi.fn(),
59
+ success: vi.fn(),
60
+ warning: vi.fn(),
61
+ error: vi.fn()
62
+ };
63
+ }
64
+ function createModelContext(model = MODEL) {
65
+ return {
66
+ getModel: vi.fn(()=>model),
67
+ setModel: vi.fn()
68
+ };
69
+ }
70
+ describe("BulkDeletePresenterReviewDecorator (forwarding)", ()=>{
71
+ function setupForwarding() {
72
+ const decoratee = {
73
+ vm: {
74
+ processing: false,
75
+ results: []
76
+ },
77
+ execute: vi.fn(async (_items, _allSelected)=>true)
78
+ };
79
+ const useCases = createTrashUseCaseFakes();
80
+ const guard = {
81
+ run: vi.fn(),
82
+ runBulk: vi.fn(async (params)=>{
83
+ await params.run(params.items, false);
84
+ await params.run(params.items, true);
85
+ }),
86
+ confirmBlocking: vi.fn()
87
+ };
88
+ const container = new Container();
89
+ container.registerInstance(Notifications, createNotifications());
90
+ container.registerInstance(CmsModelContext, createModelContext());
91
+ container.registerInstance(ActiveReviewGuard, guard);
92
+ registerTrashUseCaseFakes(container, useCases);
93
+ container.registerInstance(BulkDeletePresenter, decoratee);
94
+ container.registerDecorator(BulkDeletePresenterReviewDecorator);
95
+ return {
96
+ decoratee,
97
+ guard,
98
+ useCases,
99
+ presenter: container.resolve(BulkDeletePresenter)
100
+ };
101
+ }
102
+ it("hands the items, the entry id and a run callback to the guard, and no use cases (R353)", async ()=>{
103
+ const { guard, presenter } = setupForwarding();
104
+ const items = [
105
+ entry("e1"),
106
+ entry("e2")
107
+ ];
108
+ await presenter.execute(items, false);
109
+ expect(guard.runBulk).toHaveBeenCalledTimes(1);
110
+ const params = guard.runBulk.mock.calls[0][0];
111
+ expect(params.items).toBe(items);
112
+ expect(params).not.toHaveProperty("useCases");
113
+ expect(params.getTargetId(items[0])).toBe("e1");
114
+ });
115
+ it("runs the series per item on the first run and on the retry when not all rows are selected", async ()=>{
116
+ const { decoratee, guard, useCases, presenter } = setupForwarding();
117
+ const items = [
118
+ entry("e1")
119
+ ];
120
+ await presenter.execute(items, false);
121
+ expect(decoratee.execute).toHaveBeenNthCalledWith(1, items, false);
122
+ expect(decoratee.execute).toHaveBeenNthCalledWith(2, items, false);
123
+ expect(guard.runBulk).toHaveBeenCalledTimes(1);
124
+ expect(useCases.listBlockingReviews.execute).not.toHaveBeenCalled();
125
+ expect(guard.confirmBlocking).not.toHaveBeenCalled();
126
+ });
127
+ it("delegates the view model to the decoratee", ()=>{
128
+ const { decoratee, presenter } = setupForwarding();
129
+ expect(presenter.vm).toBe(decoratee.vm);
130
+ });
131
+ });
132
+ describe("BulkDeletePresenterReviewDecorator (with the real guard and the per-item decorator)", ()=>{
133
+ function setupIntegrated(decision) {
134
+ let release = ()=>void 0;
135
+ const gate = new Promise((resolve)=>{
136
+ release = resolve;
137
+ });
138
+ const confirm = vi.fn(async (_name, _params, execute)=>{
139
+ if ("deferred" === decision) await gate;
140
+ return execute ? execute(void 0) : void 0;
141
+ });
142
+ const blocked = new Set([
143
+ "e1",
144
+ "e3"
145
+ ]);
146
+ const deleted = [];
147
+ const failed = [];
148
+ const deleteEntry = {
149
+ execute: vi.fn(async (params)=>{
150
+ if (blocked.has(params.id)) throw createRefusal(params.id);
151
+ deleted.push(params.id);
152
+ return true;
153
+ })
154
+ };
155
+ const useCases = createTrashUseCaseFakes();
156
+ useCases.cancelReviewsForDelete.execute.mockImplementation(async (params)=>{
157
+ blocked.delete(params.targetId);
158
+ return [];
159
+ });
160
+ const container = new Container();
161
+ container.registerInstance(Confirmation, {
162
+ confirm
163
+ });
164
+ container.register(ActiveReviewBlockCollector).inSingletonScope();
165
+ container.register(ActiveReviewGuard_js_ActiveReviewGuard).inSingletonScope();
166
+ registerTrashUseCaseFakes(container, useCases);
167
+ container.registerInstance(DeleteEntryUseCase, deleteEntry);
168
+ container.registerDecorator(DeleteEntryUseCaseReviewDecorator);
169
+ const decoratee = {
170
+ vm: {
171
+ processing: false,
172
+ results: []
173
+ },
174
+ execute: vi.fn(async (items, _allSelected)=>{
175
+ const useCase = container.resolve(DeleteEntryUseCase);
176
+ decoratee.vm.results = [];
177
+ for (const item of items){
178
+ const result = await useCase.execute({
179
+ model: MODEL,
180
+ id: item.entryId
181
+ });
182
+ if (false === result) {
183
+ failed.push(item.entryId);
184
+ decoratee.vm.results.push({
185
+ title: item.entryId,
186
+ status: "failure"
187
+ });
188
+ } else decoratee.vm.results.push({
189
+ title: item.entryId,
190
+ status: "success"
191
+ });
192
+ }
193
+ return true;
194
+ })
195
+ };
196
+ const notifications = createNotifications();
197
+ container.registerInstance(Notifications, notifications);
198
+ container.registerInstance(CmsModelContext, createModelContext());
199
+ container.registerInstance(BulkDeletePresenter, decoratee);
200
+ container.registerDecorator(BulkDeletePresenterReviewDecorator);
201
+ return {
202
+ confirm,
203
+ release,
204
+ deleted,
205
+ failed,
206
+ decoratee,
207
+ useCases,
208
+ presenter: container.resolve(BulkDeletePresenter)
209
+ };
210
+ }
211
+ const items = [
212
+ entry("e1"),
213
+ entry("e2"),
214
+ entry("e3")
215
+ ];
216
+ it("collects every refused item, warns once and retries only the blocked items", async ()=>{
217
+ const { confirm, deleted, failed, decoratee, useCases, presenter } = setupIntegrated("confirm");
218
+ await presenter.execute(items, false);
219
+ expect(confirm).toHaveBeenCalledTimes(1);
220
+ const dialogParams = confirm.mock.calls[0][1];
221
+ expect(dialogParams.reviews.map((review)=>review.reviewId)).toEqual([
222
+ "review-e1",
223
+ "review-e3"
224
+ ]);
225
+ expect(useCases.cancelReviewsForDelete.execute).toHaveBeenCalledTimes(2);
226
+ expect(decoratee.execute).toHaveBeenCalledTimes(2);
227
+ expect(decoratee.execute.mock.calls[1][0].map((item)=>item.entryId)).toEqual([
228
+ "e1",
229
+ "e3"
230
+ ]);
231
+ expect(decoratee.execute.mock.calls[1][1]).toBe(false);
232
+ expect(failed).toEqual([
233
+ "e1",
234
+ "e3"
235
+ ]);
236
+ expect(deleted).toEqual([
237
+ "e2",
238
+ "e1",
239
+ "e3"
240
+ ]);
241
+ });
242
+ it("resolves execute only after the warning flow has ended (R228)", async ()=>{
243
+ const { confirm, release, presenter } = setupIntegrated("deferred");
244
+ const settled = vi.fn();
245
+ const promise = presenter.execute(items, false).then(settled);
246
+ await vi.waitFor(()=>expect(confirm).toHaveBeenCalled());
247
+ expect(settled).not.toHaveBeenCalled();
248
+ release();
249
+ await promise;
250
+ expect(settled).toHaveBeenCalledTimes(1);
251
+ });
252
+ });
253
+ describe("BulkDeletePresenterReviewDecorator (all selected: pre-check by ids)", ()=>{
254
+ function setupPrecheck(model = MODEL) {
255
+ const decoratee = {
256
+ vm: {
257
+ processing: false,
258
+ results: []
259
+ },
260
+ execute: vi.fn(async (_items, _allSelected)=>true)
261
+ };
262
+ const useCases = createTrashUseCaseFakes();
263
+ const notifications = createNotifications();
264
+ const guard = {
265
+ run: vi.fn(),
266
+ runBulk: vi.fn(),
267
+ confirmBlocking: vi.fn(async (params)=>{
268
+ await params.afterCancel();
269
+ return true;
270
+ })
271
+ };
272
+ const container = new Container();
273
+ container.registerInstance(Notifications, notifications);
274
+ container.registerInstance(CmsModelContext, createModelContext(model));
275
+ container.registerInstance(ActiveReviewGuard, guard);
276
+ registerTrashUseCaseFakes(container, useCases);
277
+ container.registerInstance(BulkDeletePresenter, decoratee);
278
+ container.registerDecorator(BulkDeletePresenterReviewDecorator);
279
+ return {
280
+ decoratee,
281
+ useCases,
282
+ notifications,
283
+ guard,
284
+ presenter: container.resolve(BulkDeletePresenter)
285
+ };
286
+ }
287
+ const items = [
288
+ entry("e1"),
289
+ entry("e2"),
290
+ entry("e3")
291
+ ];
292
+ it("asks for the blocking reviews of the entry ids and runs the bulk task when none block", async ()=>{
293
+ const { decoratee, useCases, guard, presenter } = setupPrecheck();
294
+ await presenter.execute(items, true);
295
+ expect(useCases.listBlockingReviews.execute).toHaveBeenCalledTimes(1);
296
+ expect(useCases.listBlockingReviews.execute).toHaveBeenCalledWith({
297
+ namespace: "cms.article",
298
+ targetIds: [
299
+ "e1",
300
+ "e2",
301
+ "e3"
302
+ ]
303
+ });
304
+ expect(decoratee.execute).toHaveBeenCalledTimes(1);
305
+ expect(decoratee.execute).toHaveBeenCalledWith(items, true);
306
+ expect(guard.confirmBlocking).not.toHaveBeenCalled();
307
+ expect(guard.runBulk).not.toHaveBeenCalled();
308
+ });
309
+ it("takes the namespace from the model context, not from the rows", async ()=>{
310
+ const pageModel = {
311
+ modelId: "page",
312
+ singularApiName: "Page"
313
+ };
314
+ const { useCases, presenter } = setupPrecheck(pageModel);
315
+ await presenter.execute(items, true);
316
+ expect(useCases.listBlockingReviews.execute.mock.calls[0][0].namespace).toBe("cms.page");
317
+ });
318
+ it("opens the warning with the blocking reviews and runs the bulk task after the cancel", async ()=>{
319
+ const { decoratee, useCases, guard, presenter } = setupPrecheck();
320
+ const reviews = [
321
+ createBlockingReview({
322
+ reviewId: "review-e1",
323
+ targetId: "e1"
324
+ }),
325
+ createBlockingReview({
326
+ reviewId: "review-e3",
327
+ targetId: "e3"
328
+ })
329
+ ];
330
+ useCases.listBlockingReviews.execute.mockResolvedValue(reviews);
331
+ await presenter.execute(items, true);
332
+ expect(guard.confirmBlocking).toHaveBeenCalledTimes(1);
333
+ const params = guard.confirmBlocking.mock.calls[0][0];
334
+ expect(params.reviews).toEqual(reviews);
335
+ expect(params.action).toBe("trash");
336
+ expect(params).not.toHaveProperty("useCases");
337
+ expect(decoratee.execute).toHaveBeenCalledTimes(1);
338
+ expect(decoratee.execute).toHaveBeenCalledWith(items, true);
339
+ });
340
+ it("does not start the bulk task before the warning is confirmed", async ()=>{
341
+ const { decoratee, useCases, guard, presenter } = setupPrecheck();
342
+ useCases.listBlockingReviews.execute.mockResolvedValue([
343
+ createBlockingReview({
344
+ reviewId: "review-e1",
345
+ targetId: "e1"
346
+ })
347
+ ]);
348
+ guard.confirmBlocking.mockImplementation(async ()=>{
349
+ expect(decoratee.execute).not.toHaveBeenCalled();
350
+ return false;
351
+ });
352
+ await presenter.execute(items, true);
353
+ expect(guard.confirmBlocking).toHaveBeenCalledTimes(1);
354
+ expect(decoratee.execute).not.toHaveBeenCalled();
355
+ });
356
+ it("runs nothing when the warning is dismissed", async ()=>{
357
+ const { decoratee, useCases, notifications, guard, presenter } = setupPrecheck();
358
+ useCases.listBlockingReviews.execute.mockResolvedValue([
359
+ createBlockingReview({
360
+ reviewId: "review-e1",
361
+ targetId: "e1"
362
+ })
363
+ ]);
364
+ guard.confirmBlocking.mockResolvedValue(false);
365
+ await presenter.execute(items, true);
366
+ expect(decoratee.execute).not.toHaveBeenCalled();
367
+ expect(notifications.error).not.toHaveBeenCalled();
368
+ });
369
+ it("lets a failing cancel propagate and does not start the bulk task", async ()=>{
370
+ const { decoratee, useCases, guard, presenter } = setupPrecheck();
371
+ useCases.listBlockingReviews.execute.mockResolvedValue([
372
+ createBlockingReview({
373
+ reviewId: "review-e1",
374
+ targetId: "e1"
375
+ })
376
+ ]);
377
+ const failure = new Error("Could not cancel");
378
+ guard.confirmBlocking.mockRejectedValue(failure);
379
+ const error = await presenter.execute(items, true).catch((e)=>e);
380
+ expect(error).toBe(failure);
381
+ expect(decoratee.execute).not.toHaveBeenCalled();
382
+ });
383
+ it("checks 450 ids in three sequential calls of 200, 200 and 50", async ()=>{
384
+ const { useCases, presenter } = setupPrecheck();
385
+ const many = [];
386
+ for(let index = 1; index <= 450; index++)many.push(entry(`e${index}`));
387
+ let inFlight = 0;
388
+ let maxInFlight = 0;
389
+ useCases.listBlockingReviews.execute.mockImplementation(async ()=>{
390
+ inFlight++;
391
+ maxInFlight = Math.max(maxInFlight, inFlight);
392
+ await Promise.resolve();
393
+ inFlight--;
394
+ return [];
395
+ });
396
+ await presenter.execute(many, true);
397
+ expect(useCases.listBlockingReviews.execute).toHaveBeenCalledTimes(3);
398
+ const sizes = useCases.listBlockingReviews.execute.mock.calls.map((call)=>call[0].targetIds.length);
399
+ expect(sizes).toEqual([
400
+ 200,
401
+ 200,
402
+ 50
403
+ ]);
404
+ expect(useCases.listBlockingReviews.execute.mock.calls[0][0].targetIds[0]).toBe("e1");
405
+ expect(useCases.listBlockingReviews.execute.mock.calls[1][0].targetIds[0]).toBe("e201");
406
+ expect(useCases.listBlockingReviews.execute.mock.calls[2][0].targetIds[0]).toBe("e401");
407
+ expect(maxInFlight).toBe(1);
408
+ });
409
+ it("sends exactly 200 ids in one call", async ()=>{
410
+ const { useCases, presenter } = setupPrecheck();
411
+ const exact = [];
412
+ for(let index = 1; index <= 200; index++)exact.push(entry(`e${index}`));
413
+ await presenter.execute(exact, true);
414
+ expect(useCases.listBlockingReviews.execute).toHaveBeenCalledTimes(1);
415
+ expect(useCases.listBlockingReviews.execute.mock.calls[0][0].targetIds).toHaveLength(200);
416
+ });
417
+ it("sends each entry id once when several revisions of an entry are loaded", async ()=>{
418
+ const { useCases, presenter } = setupPrecheck();
419
+ const rows = [
420
+ entry("e1"),
421
+ {
422
+ ...entry("e1"),
423
+ id: "e1#0002"
424
+ },
425
+ entry("e2")
426
+ ];
427
+ await presenter.execute(rows, true);
428
+ expect(useCases.listBlockingReviews.execute.mock.calls[0][0].targetIds).toEqual([
429
+ "e1",
430
+ "e2"
431
+ ]);
432
+ });
433
+ it("collects the reviews of every chunk into one warning", async ()=>{
434
+ const { useCases, guard, presenter } = setupPrecheck();
435
+ const many = [];
436
+ for(let index = 1; index <= 250; index++)many.push(entry(`e${index}`));
437
+ useCases.listBlockingReviews.execute.mockResolvedValueOnce([
438
+ createBlockingReview({
439
+ reviewId: "review-e5",
440
+ targetId: "e5"
441
+ })
442
+ ]).mockResolvedValueOnce([
443
+ createBlockingReview({
444
+ reviewId: "review-e230",
445
+ targetId: "e230"
446
+ })
447
+ ]);
448
+ await presenter.execute(many, true);
449
+ expect(guard.confirmBlocking).toHaveBeenCalledTimes(1);
450
+ const params = guard.confirmBlocking.mock.calls[0][0];
451
+ expect(params.reviews.map((review)=>review.targetId)).toEqual([
452
+ "e5",
453
+ "e230"
454
+ ]);
455
+ });
456
+ it("shows the generic error toast and runs nothing when the pre-check fails", async ()=>{
457
+ const { decoratee, useCases, notifications, guard, presenter } = setupPrecheck();
458
+ useCases.listBlockingReviews.execute.mockRejectedValue(new Error("Network down"));
459
+ await presenter.execute(items, true);
460
+ expect(notifications.error).toHaveBeenCalledTimes(1);
461
+ expect(notifications.error).toHaveBeenCalledWith({
462
+ title: GENERIC_ERROR,
463
+ position: REVIEW_TOAST_POSITION,
464
+ duration: REVIEW_TOAST_DURATION,
465
+ dismissible: true
466
+ });
467
+ expect(guard.confirmBlocking).not.toHaveBeenCalled();
468
+ expect(decoratee.execute).not.toHaveBeenCalled();
469
+ });
470
+ it("shows the no-access text for a not authorized error", async ()=>{
471
+ const { decoratee, useCases, notifications, presenter } = setupPrecheck();
472
+ useCases.listBlockingReviews.execute.mockRejectedValue(new GraphQLOperationError({
473
+ message: "Not authorized.",
474
+ code: ReviewErrorCode.NotAuthorized,
475
+ data: null
476
+ }));
477
+ await presenter.execute(items, true);
478
+ expect(notifications.error.mock.calls[0][0].title).toBe(NO_ACCESS_MESSAGE);
479
+ expect(decoratee.execute).not.toHaveBeenCalled();
480
+ });
481
+ it("stops at the first failing chunk and runs nothing", async ()=>{
482
+ const { decoratee, useCases, notifications, guard, presenter } = setupPrecheck();
483
+ const many = [];
484
+ for(let index = 1; index <= 450; index++)many.push(entry(`e${index}`));
485
+ useCases.listBlockingReviews.execute.mockResolvedValueOnce([
486
+ createBlockingReview({
487
+ reviewId: "review-e5",
488
+ targetId: "e5"
489
+ })
490
+ ]).mockRejectedValueOnce(new Error("Network down"));
491
+ await presenter.execute(many, true);
492
+ expect(useCases.listBlockingReviews.execute).toHaveBeenCalledTimes(2);
493
+ expect(notifications.error).toHaveBeenCalledTimes(1);
494
+ expect(guard.confirmBlocking).not.toHaveBeenCalled();
495
+ expect(decoratee.execute).not.toHaveBeenCalled();
496
+ });
497
+ it("does not check anything when no row is selected", async ()=>{
498
+ const { decoratee, useCases, guard, presenter } = setupPrecheck();
499
+ await presenter.execute([], true);
500
+ expect(useCases.listBlockingReviews.execute).not.toHaveBeenCalled();
501
+ expect(guard.confirmBlocking).not.toHaveBeenCalled();
502
+ expect(decoratee.execute).toHaveBeenCalledWith([], true);
503
+ });
504
+ });
505
+ describe("BulkDeletePresenterReviewDecorator (result: did the bulk trash start)", ()=>{
506
+ function setupResult() {
507
+ const decoratee = {
508
+ vm: {
509
+ processing: false,
510
+ results: []
511
+ },
512
+ execute: vi.fn(async (_items, _allSelected)=>true)
513
+ };
514
+ const useCases = createTrashUseCaseFakes();
515
+ const guard = {
516
+ run: vi.fn(),
517
+ runBulk: vi.fn(async (params)=>{
518
+ await params.run(params.items, false);
519
+ }),
520
+ confirmBlocking: vi.fn(async (params)=>{
521
+ await params.afterCancel();
522
+ return true;
523
+ })
524
+ };
525
+ const container = new Container();
526
+ container.registerInstance(Notifications, createNotifications());
527
+ container.registerInstance(CmsModelContext, createModelContext());
528
+ container.registerInstance(ActiveReviewGuard, guard);
529
+ registerTrashUseCaseFakes(container, useCases);
530
+ container.registerInstance(BulkDeletePresenter, decoratee);
531
+ container.registerDecorator(BulkDeletePresenterReviewDecorator);
532
+ return {
533
+ decoratee,
534
+ useCases,
535
+ guard,
536
+ presenter: container.resolve(BulkDeletePresenter)
537
+ };
538
+ }
539
+ const items = [
540
+ entry("e1"),
541
+ entry("e2")
542
+ ];
543
+ it("is true after a per-item run", async ()=>{
544
+ const { presenter } = setupResult();
545
+ const started = await presenter.execute(items, false);
546
+ expect(started).toBe(true);
547
+ });
548
+ it("is true when nothing blocks and the bulk task started", async ()=>{
549
+ const { presenter } = setupResult();
550
+ const started = await presenter.execute(items, true);
551
+ expect(started).toBe(true);
552
+ });
553
+ it("is the result of the bulk task when nothing blocks", async ()=>{
554
+ const { decoratee, presenter } = setupResult();
555
+ decoratee.execute.mockResolvedValue(false);
556
+ const started = await presenter.execute(items, true);
557
+ expect(started).toBe(false);
558
+ });
559
+ it("is true when the warning was confirmed and the bulk task started", async ()=>{
560
+ const { useCases, presenter } = setupResult();
561
+ useCases.listBlockingReviews.execute.mockResolvedValue([
562
+ createBlockingReview({
563
+ reviewId: "review-e1",
564
+ targetId: "e1"
565
+ })
566
+ ]);
567
+ const started = await presenter.execute(items, true);
568
+ expect(started).toBe(true);
569
+ });
570
+ it("is false when the warning was dismissed", async ()=>{
571
+ const { useCases, guard, presenter } = setupResult();
572
+ useCases.listBlockingReviews.execute.mockResolvedValue([
573
+ createBlockingReview({
574
+ reviewId: "review-e1",
575
+ targetId: "e1"
576
+ })
577
+ ]);
578
+ guard.confirmBlocking.mockResolvedValue(false);
579
+ const started = await presenter.execute(items, true);
580
+ expect(started).toBe(false);
581
+ });
582
+ it("is false when the pre-check failed", async ()=>{
583
+ const { useCases, presenter } = setupResult();
584
+ useCases.listBlockingReviews.execute.mockRejectedValue(new Error("Network down"));
585
+ const started = await presenter.execute(items, true);
586
+ expect(started).toBe(false);
587
+ });
588
+ });
589
+ describe("BulkDeletePresenterReviewDecorator (all selected, with the real guard)", ()=>{
590
+ function setupReal(decision) {
591
+ const confirm = vi.fn(async (_name, _params, execute)=>{
592
+ if ("dismiss" === decision) return false;
593
+ return execute ? execute(void 0) : void 0;
594
+ });
595
+ const order = [];
596
+ const useCases = createTrashUseCaseFakes();
597
+ useCases.listBlockingReviews.execute.mockResolvedValue([
598
+ createBlockingReview({
599
+ reviewId: "review-e1",
600
+ targetId: "e1"
601
+ }),
602
+ createBlockingReview({
603
+ reviewId: "review-e3",
604
+ targetId: "e3"
605
+ })
606
+ ]);
607
+ useCases.cancelReviewsForDelete.execute.mockImplementation(async (params)=>{
608
+ order.push(`cancel:${params.targetId}`);
609
+ return [];
610
+ });
611
+ const decoratee = {
612
+ vm: {
613
+ processing: false,
614
+ results: []
615
+ },
616
+ execute: vi.fn(async (_items, _allSelected)=>{
617
+ order.push("bulk");
618
+ return true;
619
+ })
620
+ };
621
+ const container = new Container();
622
+ container.registerInstance(Confirmation, {
623
+ confirm
624
+ });
625
+ container.registerInstance(Notifications, createNotifications());
626
+ container.registerInstance(CmsModelContext, createModelContext());
627
+ container.register(ActiveReviewBlockCollector).inSingletonScope();
628
+ container.register(ActiveReviewGuard_js_ActiveReviewGuard).inSingletonScope();
629
+ registerTrashUseCaseFakes(container, useCases);
630
+ container.registerInstance(BulkDeletePresenter, decoratee);
631
+ container.registerDecorator(BulkDeletePresenterReviewDecorator);
632
+ return {
633
+ confirm,
634
+ order,
635
+ useCases,
636
+ decoratee,
637
+ presenter: container.resolve(BulkDeletePresenter)
638
+ };
639
+ }
640
+ const items = [
641
+ entry("e1"),
642
+ entry("e2"),
643
+ entry("e3")
644
+ ];
645
+ it("warns, cancels each blocked entry without a revision, then starts the bulk task for every row", async ()=>{
646
+ const { confirm, order, useCases, decoratee, presenter } = setupReal("confirm");
647
+ await presenter.execute(items, true);
648
+ expect(confirm).toHaveBeenCalledTimes(1);
649
+ const dialogParams = confirm.mock.calls[0][1];
650
+ expect(dialogParams.action).toBe("trash");
651
+ expect(dialogParams.reviews.map((review)=>review.reviewId)).toEqual([
652
+ "review-e1",
653
+ "review-e3"
654
+ ]);
655
+ expect(useCases.cancelReviewsForDelete.execute.mock.calls.map((call)=>call[0])).toEqual([
656
+ {
657
+ namespace: "cms.article",
658
+ targetId: "e1",
659
+ targetRevisionId: null,
660
+ action: "trash"
661
+ },
662
+ {
663
+ namespace: "cms.article",
664
+ targetId: "e3",
665
+ targetRevisionId: null,
666
+ action: "trash"
667
+ }
668
+ ]);
669
+ expect(decoratee.execute).toHaveBeenCalledTimes(1);
670
+ expect(decoratee.execute).toHaveBeenCalledWith(items, true);
671
+ expect(order).toEqual([
672
+ "cancel:e1",
673
+ "cancel:e3",
674
+ "bulk"
675
+ ]);
676
+ });
677
+ it("cancels nothing and starts nothing when the warning is dismissed", async ()=>{
678
+ const { useCases, decoratee, presenter } = setupReal("dismiss");
679
+ await presenter.execute(items, true);
680
+ expect(useCases.cancelReviewsForDelete.execute).not.toHaveBeenCalled();
681
+ expect(decoratee.execute).not.toHaveBeenCalled();
682
+ });
683
+ it("rejects and starts no bulk task when a cancel fails", async ()=>{
684
+ const { useCases, decoratee, presenter } = setupReal("confirm");
685
+ const failure = new Error("Could not cancel");
686
+ useCases.cancelReviewsForDelete.execute.mockRejectedValue(failure);
687
+ const error = await presenter.execute(items, true).catch((e)=>e);
688
+ expect(error).toBe(failure);
689
+ expect(decoratee.execute).not.toHaveBeenCalled();
690
+ });
691
+ });
692
+
693
+ //# sourceMappingURL=BulkDeletePresenterReviewDecorator.test.js.map