@webiny/app-headless-cms-workflows 0.0.0-unstable.a4f3e4ea8b → 0.0.0-unstable.a85ef555b2

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 (455) 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/{CmsEntryFormCreateNewRevisionButton.js → CmsEntryReviewNewRevision.js} +20 -11
  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 -4
  47. package/Components/ContentEntryForm/index.js +5 -4
  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/Routes/CmsWorkflowEditor.d.ts +2 -0
  83. package/Routes/CmsWorkflowEditor.js +23 -0
  84. package/Routes/CmsWorkflowEditor.js.map +1 -0
  85. package/Routes/CmsWorkflowEditor.test.d.ts +1 -0
  86. package/Routes/CmsWorkflowEditor.test.js +141 -0
  87. package/Routes/CmsWorkflowEditor.test.js.map +1 -0
  88. package/Routes/index.d.ts +1 -1
  89. package/Routes/index.js +1 -1
  90. package/features/cache/CmsReviewCacheSyncHandler.d.ts +8 -0
  91. package/features/cache/CmsReviewCacheSyncHandler.js +14 -0
  92. package/features/cache/CmsReviewCacheSyncHandler.js.map +1 -0
  93. package/features/cache/CmsReviewCacheWriter.d.ts +14 -0
  94. package/features/cache/CmsReviewCacheWriter.js +39 -0
  95. package/features/cache/CmsReviewCacheWriter.js.map +1 -0
  96. package/features/cache/CmsReviewCacheWriter.test.d.ts +1 -0
  97. package/features/cache/CmsReviewCacheWriter.test.js +207 -0
  98. package/features/cache/CmsReviewCacheWriter.test.js.map +1 -0
  99. package/features/cache/CmsReviewEntriesCacheProviderDecorator.d.ts +12 -0
  100. package/features/cache/CmsReviewEntriesCacheProviderDecorator.js +17 -0
  101. package/features/cache/CmsReviewEntriesCacheProviderDecorator.js.map +1 -0
  102. package/features/cache/CmsReviewEntriesCacheProviderDecorator.test.d.ts +1 -0
  103. package/features/cache/CmsReviewEntriesCacheProviderDecorator.test.js +129 -0
  104. package/features/cache/CmsReviewEntriesCacheProviderDecorator.test.js.map +1 -0
  105. package/features/cache/ReviewPreservingEntriesCache.d.ts +18 -0
  106. package/features/cache/ReviewPreservingEntriesCache.js +54 -0
  107. package/features/cache/ReviewPreservingEntriesCache.js.map +1 -0
  108. package/features/cache/abstractions.d.ts +5 -0
  109. package/features/cache/abstractions.js +5 -0
  110. package/features/cache/abstractions.js.map +1 -0
  111. package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.d.ts +26 -0
  112. package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.js +104 -0
  113. package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.js.map +1 -0
  114. package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.test.d.ts +1 -0
  115. package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.test.js +589 -0
  116. package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.test.js.map +1 -0
  117. package/features/editorGateway/feature.d.ts +1 -0
  118. package/features/editorGateway/feature.js +11 -0
  119. package/features/editorGateway/feature.js.map +1 -0
  120. package/features/editorGateway/feature.test.d.ts +1 -0
  121. package/features/editorGateway/feature.test.js +272 -0
  122. package/features/editorGateway/feature.test.js.map +1 -0
  123. package/features/editorGateway/graphql/cmsEntryFolderExists.d.ts +1 -0
  124. package/features/editorGateway/graphql/cmsEntryFolderExists.js +16 -0
  125. package/features/editorGateway/graphql/cmsEntryFolderExists.js.map +1 -0
  126. package/features/editorGateway/graphql/deleteCmsEntryWorkflow.d.ts +1 -0
  127. package/features/editorGateway/graphql/deleteCmsEntryWorkflow.js +19 -0
  128. package/features/editorGateway/graphql/deleteCmsEntryWorkflow.js.map +1 -0
  129. package/features/editorGateway/graphql/getCmsEntryWorkflow.d.ts +1 -0
  130. package/features/editorGateway/graphql/getCmsEntryWorkflow.js +19 -0
  131. package/features/editorGateway/graphql/getCmsEntryWorkflow.js.map +1 -0
  132. package/features/editorGateway/graphql/inspectCmsEntryRouting.d.ts +1 -0
  133. package/features/editorGateway/graphql/inspectCmsEntryRouting.js +19 -0
  134. package/features/editorGateway/graphql/inspectCmsEntryRouting.js.map +1 -0
  135. package/features/editorGateway/graphql/listCmsEntryWorkflowModels.d.ts +1 -0
  136. package/features/editorGateway/graphql/listCmsEntryWorkflowModels.js +29 -0
  137. package/features/editorGateway/graphql/listCmsEntryWorkflowModels.js.map +1 -0
  138. package/features/editorGateway/graphql/storeCmsEntryWorkflow.d.ts +1 -0
  139. package/features/editorGateway/graphql/storeCmsEntryWorkflow.js +19 -0
  140. package/features/editorGateway/graphql/storeCmsEntryWorkflow.js.map +1 -0
  141. package/features/editorMounting/CmsWorkflowEditorAppAdapter.d.ts +25 -0
  142. package/features/editorMounting/CmsWorkflowEditorAppAdapter.js +51 -0
  143. package/features/editorMounting/CmsWorkflowEditorAppAdapter.js.map +1 -0
  144. package/features/editorMounting/CmsWorkflowEditorAppAdapter.test.d.ts +1 -0
  145. package/features/editorMounting/CmsWorkflowEditorAppAdapter.test.js +185 -0
  146. package/features/editorMounting/CmsWorkflowEditorAppAdapter.test.js.map +1 -0
  147. package/features/editorMounting/abstractions.d.ts +5 -0
  148. package/features/editorMounting/abstractions.js +5 -0
  149. package/features/editorMounting/abstractions.js.map +1 -0
  150. package/features/editorMounting/feature.d.ts +3 -0
  151. package/features/editorMounting/feature.js +19 -0
  152. package/features/editorMounting/feature.js.map +1 -0
  153. package/features/editorMounting/feature.test.d.ts +1 -0
  154. package/features/editorMounting/feature.test.js +100 -0
  155. package/features/editorMounting/feature.test.js.map +1 -0
  156. package/features/editorReview/CmsEntryReview.d.ts +8 -0
  157. package/features/editorReview/CmsEntryReview.js +14 -0
  158. package/features/editorReview/CmsEntryReview.js.map +1 -0
  159. package/features/editorReview/abstractions.d.ts +5 -0
  160. package/features/editorReview/abstractions.js +5 -0
  161. package/features/editorReview/abstractions.js.map +1 -0
  162. package/features/editorReview/feature.d.ts +3 -0
  163. package/features/editorReview/feature.js +17 -0
  164. package/features/editorReview/feature.js.map +1 -0
  165. package/features/editorReview/feature.test.d.ts +1 -0
  166. package/features/editorReview/feature.test.js +46 -0
  167. package/features/editorReview/feature.test.js.map +1 -0
  168. package/features/editorReview/useCmsEntryReview.d.ts +2 -0
  169. package/features/editorReview/useCmsEntryReview.js +8 -0
  170. package/features/editorReview/useCmsEntryReview.js.map +1 -0
  171. package/features/feature.js +6 -2
  172. package/features/feature.js.map +1 -1
  173. package/features/gateway/CmsReviewChangeMessageHandler.d.ts +8 -0
  174. package/features/gateway/CmsReviewChangeMessageHandler.js +16 -0
  175. package/features/gateway/CmsReviewChangeMessageHandler.js.map +1 -0
  176. package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.d.ts +16 -0
  177. package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.js +39 -0
  178. package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.js.map +1 -0
  179. package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.test.d.ts +1 -0
  180. package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.test.js +83 -0
  181. package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.test.js.map +1 -0
  182. package/features/gateway/CmsReviewContentAdapter/abstractions.d.ts +5 -0
  183. package/features/gateway/CmsReviewContentAdapter/abstractions.js +5 -0
  184. package/features/gateway/CmsReviewContentAdapter/abstractions.js.map +1 -0
  185. package/features/gateway/CmsReviewGateway/CmsReviewGateway.d.ts +52 -0
  186. package/features/gateway/CmsReviewGateway/CmsReviewGateway.js +221 -0
  187. package/features/gateway/CmsReviewGateway/CmsReviewGateway.js.map +1 -0
  188. package/features/gateway/CmsReviewGateway/CmsReviewGateway.test.d.ts +1 -0
  189. package/features/gateway/CmsReviewGateway/CmsReviewGateway.test.js +689 -0
  190. package/features/gateway/CmsReviewGateway/CmsReviewGateway.test.js.map +1 -0
  191. package/features/gateway/CmsReviewNotificationHandler.d.ts +8 -0
  192. package/features/gateway/CmsReviewNotificationHandler.js +16 -0
  193. package/features/gateway/CmsReviewNotificationHandler.js.map +1 -0
  194. package/features/gateway/CmsReviewRowProvider/CmsReviewRowProvider.d.ts +8 -0
  195. package/features/gateway/CmsReviewRowProvider/CmsReviewRowProvider.js +14 -0
  196. package/features/gateway/CmsReviewRowProvider/CmsReviewRowProvider.js.map +1 -0
  197. package/features/gateway/CmsReviewRowProvider/abstractions.d.ts +5 -0
  198. package/features/gateway/CmsReviewRowProvider/abstractions.js +5 -0
  199. package/features/gateway/CmsReviewRowProvider/abstractions.js.map +1 -0
  200. package/features/gateway/contentReviewsBindings.test.d.ts +1 -0
  201. package/features/gateway/contentReviewsBindings.test.js +125 -0
  202. package/features/gateway/contentReviewsBindings.test.js.map +1 -0
  203. package/features/gateway/feature.d.ts +4 -0
  204. package/features/gateway/feature.js +27 -0
  205. package/features/gateway/feature.js.map +1 -0
  206. package/features/gateway/feature.test.d.ts +1 -0
  207. package/features/gateway/feature.test.js +79 -0
  208. package/features/gateway/feature.test.js.map +1 -0
  209. package/features/gateway/graphql/CmsOperationResponse.d.ts +3 -0
  210. package/features/gateway/graphql/CmsOperationResponse.js +0 -0
  211. package/features/gateway/graphql/approveCmsEntryReviewStep.d.ts +1 -0
  212. package/features/gateway/graphql/approveCmsEntryReviewStep.js +18 -0
  213. package/features/gateway/graphql/approveCmsEntryReviewStep.js.map +1 -0
  214. package/features/gateway/graphql/cancelCmsEntryReview.d.ts +1 -0
  215. package/features/gateway/graphql/cancelCmsEntryReview.js +18 -0
  216. package/features/gateway/graphql/cancelCmsEntryReview.js.map +1 -0
  217. package/features/gateway/graphql/cancelCmsEntryReviewsForDelete.d.ts +1 -0
  218. package/features/gateway/graphql/cancelCmsEntryReviewsForDelete.js +28 -0
  219. package/features/gateway/graphql/cancelCmsEntryReviewsForDelete.js.map +1 -0
  220. package/features/gateway/graphql/getCmsEntryReview.d.ts +1 -0
  221. package/features/gateway/graphql/getCmsEntryReview.js +18 -0
  222. package/features/gateway/graphql/getCmsEntryReview.js.map +1 -0
  223. package/features/gateway/graphql/getCmsEntryReviewStepRun.d.ts +1 -0
  224. package/features/gateway/graphql/getCmsEntryReviewStepRun.js +18 -0
  225. package/features/gateway/graphql/getCmsEntryReviewStepRun.js.map +1 -0
  226. package/features/gateway/graphql/getCmsEntryTargetReview.d.ts +1 -0
  227. package/features/gateway/graphql/getCmsEntryTargetReview.js +18 -0
  228. package/features/gateway/graphql/getCmsEntryTargetReview.js.map +1 -0
  229. package/features/gateway/graphql/listCmsEntryBlockingReviews.d.ts +1 -0
  230. package/features/gateway/graphql/listCmsEntryBlockingReviews.js +18 -0
  231. package/features/gateway/graphql/listCmsEntryBlockingReviews.js.map +1 -0
  232. package/features/gateway/graphql/listCmsEntryReviewStepCandidates.d.ts +1 -0
  233. package/features/gateway/graphql/listCmsEntryReviewStepCandidates.js +18 -0
  234. package/features/gateway/graphql/listCmsEntryReviewStepCandidates.js.map +1 -0
  235. package/features/gateway/graphql/listCmsEntryReviews.d.ts +1 -0
  236. package/features/gateway/graphql/listCmsEntryReviews.js +34 -0
  237. package/features/gateway/graphql/listCmsEntryReviews.js.map +1 -0
  238. package/features/gateway/graphql/listCmsEntryStepCandidates.d.ts +1 -0
  239. package/features/gateway/graphql/listCmsEntryStepCandidates.js +28 -0
  240. package/features/gateway/graphql/listCmsEntryStepCandidates.js.map +1 -0
  241. package/features/gateway/graphql/listCmsEntryWorkflows.d.ts +1 -0
  242. package/features/gateway/graphql/listCmsEntryWorkflows.js +18 -0
  243. package/features/gateway/graphql/listCmsEntryWorkflows.js.map +1 -0
  244. package/features/gateway/graphql/reassignCmsEntryReviewStep.d.ts +1 -0
  245. package/features/gateway/graphql/reassignCmsEntryReviewStep.js +18 -0
  246. package/features/gateway/graphql/reassignCmsEntryReviewStep.js.map +1 -0
  247. package/features/gateway/graphql/rejectCmsEntryReviewStep.d.ts +1 -0
  248. package/features/gateway/graphql/rejectCmsEntryReviewStep.js +18 -0
  249. package/features/gateway/graphql/rejectCmsEntryReviewStep.js.map +1 -0
  250. package/features/gateway/graphql/requestCmsEntryReview.d.ts +1 -0
  251. package/features/gateway/graphql/requestCmsEntryReview.js +28 -0
  252. package/features/gateway/graphql/requestCmsEntryReview.js.map +1 -0
  253. package/features/gateway/graphql/restartCmsEntryReviewStep.d.ts +1 -0
  254. package/features/gateway/graphql/restartCmsEntryReviewStep.js +18 -0
  255. package/features/gateway/graphql/restartCmsEntryReviewStep.js.map +1 -0
  256. package/features/gateway/graphql/startCmsEntryReviewStep.d.ts +1 -0
  257. package/features/gateway/graphql/startCmsEntryReviewStep.js +18 -0
  258. package/features/gateway/graphql/startCmsEntryReviewStep.js.map +1 -0
  259. package/features/gateway/graphql/takeOverCmsEntryReviewStep.d.ts +1 -0
  260. package/features/gateway/graphql/takeOverCmsEntryReviewStep.js +22 -0
  261. package/features/gateway/graphql/takeOverCmsEntryReviewStep.js.map +1 -0
  262. package/features/trash/BulkDeletePresenterReviewDecorator.d.ts +20 -0
  263. package/features/trash/BulkDeletePresenterReviewDecorator.js +81 -0
  264. package/features/trash/BulkDeletePresenterReviewDecorator.js.map +1 -0
  265. package/features/trash/BulkDeletePresenterReviewDecorator.test.d.ts +1 -0
  266. package/features/trash/BulkDeletePresenterReviewDecorator.test.js +693 -0
  267. package/features/trash/BulkDeletePresenterReviewDecorator.test.js.map +1 -0
  268. package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.d.ts +13 -0
  269. package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.js +23 -0
  270. package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.js.map +1 -0
  271. package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.test.d.ts +1 -0
  272. package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.test.js +123 -0
  273. package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.test.js.map +1 -0
  274. package/features/trash/DeleteEntryUseCaseReviewDecorator.d.ts +13 -0
  275. package/features/trash/DeleteEntryUseCaseReviewDecorator.js +23 -0
  276. package/features/trash/DeleteEntryUseCaseReviewDecorator.js.map +1 -0
  277. package/features/trash/DeleteEntryUseCaseReviewDecorator.test.d.ts +1 -0
  278. package/features/trash/DeleteEntryUseCaseReviewDecorator.test.js +139 -0
  279. package/features/trash/DeleteEntryUseCaseReviewDecorator.test.js.map +1 -0
  280. package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.d.ts +13 -0
  281. package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.js +23 -0
  282. package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.js.map +1 -0
  283. package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.test.d.ts +1 -0
  284. package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.test.js +122 -0
  285. package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.test.js.map +1 -0
  286. package/features/trash/feature.d.ts +1 -0
  287. package/features/trash/feature.js +17 -0
  288. package/features/trash/feature.js.map +1 -0
  289. package/features/trash/feature.test.d.ts +1 -0
  290. package/features/trash/feature.test.js +213 -0
  291. package/features/trash/feature.test.js.map +1 -0
  292. package/index.d.ts +1 -1
  293. package/index.editor.test.d.ts +1 -0
  294. package/index.editor.test.js +149 -0
  295. package/index.editor.test.js.map +1 -0
  296. package/index.js +31 -10
  297. package/index.js.map +1 -1
  298. package/index.lists.test.d.ts +1 -0
  299. package/index.lists.test.js +172 -0
  300. package/index.lists.test.js.map +1 -0
  301. package/index.mount.test.d.ts +1 -0
  302. package/index.mount.test.js +49 -0
  303. package/index.mount.test.js.map +1 -0
  304. package/index.test.d.ts +1 -0
  305. package/index.test.js +414 -0
  306. package/index.test.js.map +1 -0
  307. package/package.json +20 -16
  308. package/presentation/CmsEntryContentReloader.d.ts +8 -0
  309. package/presentation/CmsEntryContentReloader.js +20 -0
  310. package/presentation/CmsEntryContentReloader.js.map +1 -0
  311. package/presentation/CmsEntryContentReloader.test.d.ts +1 -0
  312. package/presentation/CmsEntryContentReloader.test.js +118 -0
  313. package/presentation/CmsEntryContentReloader.test.js.map +1 -0
  314. package/presentation/CmsEntryFormPresenterReviewDecorator.d.ts +27 -0
  315. package/presentation/CmsEntryFormPresenterReviewDecorator.js +167 -0
  316. package/presentation/CmsEntryFormPresenterReviewDecorator.js.map +1 -0
  317. package/presentation/CmsEntryFormPresenterReviewDecorator.test.d.ts +1 -0
  318. package/presentation/CmsEntryFormPresenterReviewDecorator.test.js +601 -0
  319. package/presentation/CmsEntryFormPresenterReviewDecorator.test.js.map +1 -0
  320. package/presentation/CmsEntryUnsavedChanges.d.ts +7 -0
  321. package/presentation/CmsEntryUnsavedChanges.js +12 -0
  322. package/presentation/CmsEntryUnsavedChanges.js.map +1 -0
  323. package/presentation/CmsEntryUnsavedChanges.test.d.ts +1 -0
  324. package/presentation/CmsEntryUnsavedChanges.test.js +23 -0
  325. package/presentation/CmsEntryUnsavedChanges.test.js.map +1 -0
  326. package/presentation/CmsReviewFieldSelections.test.d.ts +1 -0
  327. package/presentation/CmsReviewFieldSelections.test.js +27 -0
  328. package/presentation/CmsReviewFieldSelections.test.js.map +1 -0
  329. package/presentation/{WorkflowStateGetEntryFieldSelection.d.ts → CmsReviewGetEntryFieldSelection.d.ts} +2 -2
  330. package/presentation/CmsReviewGetEntryFieldSelection.js +16 -0
  331. package/presentation/CmsReviewGetEntryFieldSelection.js.map +1 -0
  332. package/presentation/{WorkflowStateListEntriesFieldSelection.d.ts → CmsReviewListEntriesFieldSelection.d.ts} +2 -2
  333. package/presentation/CmsReviewListEntriesFieldSelection.js +16 -0
  334. package/presentation/CmsReviewListEntriesFieldSelection.js.map +1 -0
  335. package/presentation/{TableRowMapperWorkflowDecorator.d.ts → CmsReviewTableRowMapperDecorator.d.ts} +3 -3
  336. package/presentation/CmsReviewTableRowMapperDecorator.js +24 -0
  337. package/presentation/CmsReviewTableRowMapperDecorator.js.map +1 -0
  338. package/presentation/CmsReviewTableRowMapperDecorator.test.d.ts +1 -0
  339. package/presentation/CmsReviewTableRowMapperDecorator.test.js +120 -0
  340. package/presentation/CmsReviewTableRowMapperDecorator.test.js.map +1 -0
  341. package/presentation/CmsRevisionsListPresenterDecorator.d.ts +24 -0
  342. package/presentation/CmsRevisionsListPresenterDecorator.js +66 -0
  343. package/presentation/CmsRevisionsListPresenterDecorator.js.map +1 -0
  344. package/presentation/CmsRevisionsListPresenterDecorator.test.d.ts +1 -0
  345. package/presentation/CmsRevisionsListPresenterDecorator.test.js +174 -0
  346. package/presentation/CmsRevisionsListPresenterDecorator.test.js.map +1 -0
  347. package/presentation/contentReviews/CmsContentReviewsPresenter.d.ts +28 -0
  348. package/presentation/contentReviews/CmsContentReviewsPresenter.js +103 -0
  349. package/presentation/contentReviews/CmsContentReviewsPresenter.js.map +1 -0
  350. package/presentation/contentReviews/CmsContentReviewsPresenter.test.d.ts +1 -0
  351. package/presentation/contentReviews/CmsContentReviewsPresenter.test.js +238 -0
  352. package/presentation/contentReviews/CmsContentReviewsPresenter.test.js.map +1 -0
  353. package/presentation/contentReviews/abstractions.d.ts +31 -0
  354. package/presentation/contentReviews/abstractions.js +5 -0
  355. package/presentation/contentReviews/abstractions.js.map +1 -0
  356. package/presentation/contentReviews/feature.d.ts +3 -0
  357. package/presentation/contentReviews/feature.js +17 -0
  358. package/presentation/contentReviews/feature.js.map +1 -0
  359. package/presentation/contentReviews/toContentTypes.d.ts +3 -0
  360. package/presentation/contentReviews/toContentTypes.js +14 -0
  361. package/presentation/contentReviews/toContentTypes.js.map +1 -0
  362. package/presentation/contentReviews/toContentTypes.test.d.ts +1 -0
  363. package/presentation/contentReviews/toContentTypes.test.js +20 -0
  364. package/presentation/contentReviews/toContentTypes.test.js.map +1 -0
  365. package/presentation/feature.js +10 -12
  366. package/presentation/feature.js.map +1 -1
  367. package/presentation/getCmsEntryReviewContext.d.ts +4 -0
  368. package/presentation/getCmsEntryReviewContext.js +12 -0
  369. package/presentation/getCmsEntryReviewContext.js.map +1 -0
  370. package/presentation/getCmsEntryReviewInitParams.d.ts +13 -0
  371. package/presentation/getCmsEntryReviewInitParams.js +18 -0
  372. package/presentation/getCmsEntryReviewInitParams.js.map +1 -0
  373. package/presentation/getCmsEntryReviewInitParams.test.d.ts +1 -0
  374. package/presentation/getCmsEntryReviewInitParams.test.js +69 -0
  375. package/presentation/getCmsEntryReviewInitParams.test.js.map +1 -0
  376. package/routes.d.ts +4 -4
  377. package/routes.js +5 -5
  378. package/routes.js.map +1 -1
  379. package/testing/createEntry.d.ts +3 -0
  380. package/testing/createEntry.js +22 -0
  381. package/testing/createEntry.js.map +1 -0
  382. package/testing/createEntrySession.d.ts +9 -0
  383. package/testing/createEntrySession.js +29 -0
  384. package/testing/createEntrySession.js.map +1 -0
  385. package/testing/createFolder.d.ts +2 -0
  386. package/testing/createFolder.js +13 -0
  387. package/testing/createFolder.js.map +1 -0
  388. package/testing/createFormVm.d.ts +2 -0
  389. package/testing/createFormVm.js +22 -0
  390. package/testing/createFormVm.js.map +1 -0
  391. package/testing/models.d.ts +4 -0
  392. package/testing/models.js +23 -0
  393. package/testing/models.js.map +1 -0
  394. package/testing/renderEditorTree.d.ts +17 -0
  395. package/testing/renderEditorTree.js +93 -0
  396. package/testing/renderEditorTree.js.map +1 -0
  397. package/testing/reviewStates.d.ts +17 -0
  398. package/testing/reviewStates.js +65 -0
  399. package/testing/reviewStates.js.map +1 -0
  400. package/types.d.ts +8 -8
  401. package/utils/isReviewableModel.d.ts +2 -0
  402. package/utils/isReviewableModel.js +7 -0
  403. package/utils/isReviewableModel.js.map +1 -0
  404. package/utils/renderModelIcon.d.ts +3 -0
  405. package/utils/renderModelIcon.js +19 -0
  406. package/utils/renderModelIcon.js.map +1 -0
  407. package/utils/renderModelIconOrFallback.d.ts +3 -0
  408. package/utils/renderModelIconOrFallback.js +17 -0
  409. package/utils/renderModelIconOrFallback.js.map +1 -0
  410. package/Components/CmsEntriesWorkflowStateList/CmsEntriesWorkflowStateListFooterMenu.d.ts +0 -2
  411. package/Components/CmsEntriesWorkflowStateList/CmsEntriesWorkflowStateListFooterMenu.js +0 -34
  412. package/Components/CmsEntriesWorkflowStateList/CmsEntriesWorkflowStateListFooterMenu.js.map +0 -1
  413. package/Components/CmsEntriesWorkflowStateList/index.d.ts +0 -1
  414. package/Components/CmsEntriesWorkflowStateList/index.js +0 -1
  415. package/Components/ContentEntryForm/CmsEntryFormCreateNewRevisionButton.d.ts +0 -2
  416. package/Components/ContentEntryForm/CmsEntryFormCreateNewRevisionButton.js.map +0 -1
  417. package/Components/ContentEntryForm/CmsEntryFormScheduleMenuItemAction.d.ts +0 -5
  418. package/Components/ContentEntryForm/CmsEntryFormScheduleMenuItemAction.js +0 -22
  419. package/Components/ContentEntryForm/CmsEntryFormScheduleMenuItemAction.js.map +0 -1
  420. package/Components/ContentEntryForm/CmsEntryFormTooltipButton.d.ts +0 -2
  421. package/Components/ContentEntryForm/CmsEntryFormTooltipButton.js +0 -13
  422. package/Components/ContentEntryForm/CmsEntryFormTooltipButton.js.map +0 -1
  423. package/Components/ContentEntryForm/ContentEntryFormWorkflow.d.ts +0 -2
  424. package/Components/ContentEntryForm/ContentEntryFormWorkflow.js +0 -24
  425. package/Components/ContentEntryForm/ContentEntryFormWorkflow.js.map +0 -1
  426. package/Components/OptionItem/OpenInNewWindow.d.ts +0 -2
  427. package/Components/OptionItem/OpenInNewWindow.js +0 -36
  428. package/Components/OptionItem/OpenInNewWindow.js.map +0 -1
  429. package/Routes/CmsWorkflowsEditor.d.ts +0 -2
  430. package/Routes/CmsWorkflowsEditor.js +0 -26
  431. package/Routes/CmsWorkflowsEditor.js.map +0 -1
  432. package/features/WorkflowStateCacheHandler.d.ts +0 -11
  433. package/features/WorkflowStateCacheHandler.js +0 -50
  434. package/features/WorkflowStateCacheHandler.js.map +0 -1
  435. package/presentation/CmsWorkflowsEditorView.d.ts +0 -5
  436. package/presentation/CmsWorkflowsEditorView.js +0 -90
  437. package/presentation/CmsWorkflowsEditorView.js.map +0 -1
  438. package/presentation/ContentEntryFormPresenterWorkflowDecorator.d.ts +0 -25
  439. package/presentation/ContentEntryFormPresenterWorkflowDecorator.js +0 -70
  440. package/presentation/ContentEntryFormPresenterWorkflowDecorator.js.map +0 -1
  441. package/presentation/TableRowMapperWorkflowDecorator.js +0 -25
  442. package/presentation/TableRowMapperWorkflowDecorator.js.map +0 -1
  443. package/presentation/WorkflowStateGetEntryFieldSelection.js +0 -24
  444. package/presentation/WorkflowStateGetEntryFieldSelection.js.map +0 -1
  445. package/presentation/WorkflowStateListEntriesFieldSelection.js +0 -24
  446. package/presentation/WorkflowStateListEntriesFieldSelection.js.map +0 -1
  447. package/presentation/cmsWorkflowsEditor/CmsWorkflowsEditorPresenter.d.ts +0 -15
  448. package/presentation/cmsWorkflowsEditor/CmsWorkflowsEditorPresenter.js +0 -50
  449. package/presentation/cmsWorkflowsEditor/CmsWorkflowsEditorPresenter.js.map +0 -1
  450. package/presentation/cmsWorkflowsEditor/abstractions.d.ts +0 -19
  451. package/presentation/cmsWorkflowsEditor/abstractions.js +0 -5
  452. package/presentation/cmsWorkflowsEditor/abstractions.js.map +0 -1
  453. package/presentation/cmsWorkflowsEditor/feature.d.ts +0 -3
  454. package/presentation/cmsWorkflowsEditor/feature.js +0 -17
  455. package/presentation/cmsWorkflowsEditor/feature.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/CmsEntryFormPresenterReviewDecorator.test.js","sources":["../../src/presentation/CmsEntryFormPresenterReviewDecorator.test.ts"],"sourcesContent":["import { beforeEach } from \"vitest\";\nimport { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { vi } from \"vitest\";\nimport type { Mock } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { ContentEntryFormPresenter } from \"@webiny/app-headless-cms/presentation/contentEntries/form/abstractions.js\";\nimport { CmsEntryReview } from \"~/features/editorReview/abstractions.js\";\nimport { CmsEntryFormPresenterReviewDecorator } from \"~/presentation/CmsEntryFormPresenterReviewDecorator.js\";\nimport type { EntrySession } from \"~/testing/createEntrySession.js\";\nimport { createEntrySession } from \"~/testing/createEntrySession.js\";\nimport { CmsEntryUnsavedChanges } from \"./CmsEntryUnsavedChanges.js\";\nimport { CmsEntryContentReloader } from \"~/presentation/CmsEntryContentReloader.js\";\nimport { createEntry } from \"~/testing/createEntry.js\";\nimport { createFormVm } from \"~/testing/createFormVm.js\";\nimport { SINGLETON_MODEL } from \"~/testing/models.js\";\nimport { APPROVED } from \"~/testing/reviewStates.js\";\nimport { BOUND_NO_REVIEW } from \"~/testing/reviewStates.js\";\nimport { BOUND_UNPUBLISHED } from \"~/testing/reviewStates.js\";\nimport { FAILED } from \"~/testing/reviewStates.js\";\nimport { IN_REVIEW } from \"~/testing/reviewStates.js\";\nimport { LOADING } from \"~/testing/reviewStates.js\";\nimport { NO_WORKFLOW } from \"~/testing/reviewStates.js\";\nimport { REJECTED } from \"~/testing/reviewStates.js\";\n\ninterface SaveRevisionOptions {\n skipValidation?: boolean;\n}\n\ninterface BaseState {\n vm: ContentEntryFormPresenter.ViewModel;\n loadRevision: Mock<(id: string) => Promise<void>>;\n saveRevision: Mock<(options?: SaveRevisionOptions) => Promise<boolean>>;\n publishRevision: Mock<() => Promise<boolean>>;\n unpublishRevision: Mock<() => Promise<boolean>>;\n reset: Mock<() => void>;\n}\n\nlet base: BaseState;\n\nclass FakeBasePresenter implements ContentEntryFormPresenter.Interface {\n get vm(): ContentEntryFormPresenter.ViewModel {\n return base.vm;\n }\n\n loadRevision(id: string): Promise<void> {\n return base.loadRevision(id);\n }\n\n saveRevision(options?: SaveRevisionOptions): Promise<boolean> {\n return base.saveRevision(options);\n }\n\n publishRevision(): Promise<boolean> {\n return base.publishRevision();\n }\n\n unpublishRevision(): Promise<boolean> {\n return base.unpublishRevision();\n }\n\n deleteEntry(): Promise<boolean> {\n return Promise.resolve(true);\n }\n\n setFolderId(): void {}\n\n newEntry(): void {}\n\n patchEntryMeta(): void {}\n\n reset(): void {\n base.reset();\n }\n}\n\nconst BasePresenter = ContentEntryFormPresenter.createImplementation({\n implementation: FakeBasePresenter,\n dependencies: []\n});\n\nlet fake: EntrySession;\nlet presenter: ContentEntryFormPresenter.Interface;\n\nfunction loadedVm(\n overrides: Partial<ContentEntryFormPresenter.ViewModel> = {}\n): ContentEntryFormPresenter.ViewModel {\n return createFormVm({ entry: createEntry(), canSave: true, canPublish: true, ...overrides });\n}\n\nfunction createBase(vm: ContentEntryFormPresenter.ViewModel): BaseState {\n return {\n vm,\n loadRevision: vi.fn<(id: string) => Promise<void>>(),\n saveRevision: vi.fn<(options?: SaveRevisionOptions) => Promise<boolean>>(),\n publishRevision: vi.fn<() => Promise<boolean>>(),\n unpublishRevision: vi.fn<() => Promise<boolean>>(),\n reset: vi.fn<() => void>()\n };\n}\n\nfunction resolvePresenter(): ContentEntryFormPresenter.Interface {\n fake = createEntrySession();\n const container = new Container();\n container.registerInstance(CmsEntryReview, fake.session);\n container.register(BasePresenter);\n container.registerDecorator(CmsEntryFormPresenterReviewDecorator);\n return container.resolve(ContentEntryFormPresenter);\n}\n\ndescribe(\"CmsEntryFormPresenterReviewDecorator\", () => {\n beforeEach(() => {\n base = createBase(createFormVm({ entry: null, canSave: false, canPublish: false }));\n base.loadRevision.mockImplementation(async () => {\n base.vm = loadedVm();\n });\n base.saveRevision.mockResolvedValue(true);\n base.publishRevision.mockResolvedValue(true);\n base.unpublishRevision.mockResolvedValue(true);\n presenter = resolvePresenter();\n });\n\n it(\"initialises the shared presenter with the revision that was loaded\", async () => {\n await presenter.loadRevision(\"entry-1#0001\");\n\n expect(base.loadRevision).toHaveBeenCalledWith(\"entry-1#0001\");\n expect(fake.presenter.init).toHaveBeenCalledTimes(1);\n expect(fake.presenter.init).toHaveBeenCalledWith({\n target: { namespace: \"cms.article\", targetRevisionId: \"entry-1#0001\" },\n contentReloader: expect.any(CmsEntryContentReloader),\n unsavedChanges: expect.any(CmsEntryUnsavedChanges),\n targetTitle: \"Hello\",\n canRequest: true,\n isPublished: false,\n isUnpublished: false\n });\n });\n\n it(\"passes the original canSave as canRequest and the published flag\", async () => {\n base.loadRevision.mockImplementation(async () => {\n base.vm = loadedVm({ canSave: false, entry: createEntry({ status: \"published\" }) });\n });\n\n await presenter.loadRevision(\"entry-1#0001\");\n\n const params = fake.presenter.init.mock.calls[0][0];\n expect(params.canRequest).toBe(false);\n expect(params.isPublished).toBe(true);\n expect(params.isUnpublished).toBe(false);\n });\n\n it(\"passes isUnpublished for a revision that was published before and is unpublished now (R226, Q19)\", async () => {\n base.loadRevision.mockImplementation(async () => {\n base.vm = loadedVm({ entry: createEntry({ status: \"unpublished\" }) });\n });\n\n await presenter.loadRevision(\"entry-1#0001\");\n\n const params = fake.presenter.init.mock.calls[0][0];\n expect(params.isPublished).toBe(false);\n expect(params.isUnpublished).toBe(true);\n });\n\n it(\"leaves a singleton model alone\", async () => {\n base.vm = createFormVm({ entry: null, canSave: false, model: SINGLETON_MODEL });\n base.loadRevision.mockImplementation(async () => {\n base.vm = loadedVm({ model: SINGLETON_MODEL });\n });\n fake.setVm(LOADING);\n\n await presenter.loadRevision(\"settings#0001\");\n\n expect(fake.presenter.init).not.toHaveBeenCalled();\n expect(presenter.vm.canSave).toBe(true);\n expect(presenter.vm.canPublish).toBe(true);\n });\n\n it(\"blocks saving, new revisions and publishing while the revision is loading\", async () => {\n let finishLoading = (): void => {};\n base.vm = loadedVm({ canCreateNewRevision: true });\n base.loadRevision.mockImplementation(() => {\n return new Promise<void>(resolve => {\n finishLoading = resolve;\n });\n });\n\n const loading = presenter.loadRevision(\"entry-1#0001\");\n\n expect(presenter.vm.canSave).toBe(false);\n expect(presenter.vm.canCreateNewRevision).toBe(false);\n expect(presenter.vm.canPublish).toBe(false);\n\n finishLoading();\n await loading;\n });\n\n it.each([\n [\"no workflow\", NO_WORKFLOW, true, true],\n [\"a bound workflow and no review\", BOUND_NO_REVIEW, true, false],\n [\"an unpublished revision with no review (Q19)\", BOUND_UNPUBLISHED, true, true],\n [\"loading\", LOADING, false, false],\n [\"failed\", FAILED, false, false],\n [\"in review\", IN_REVIEW, false, false],\n [\"rejected\", REJECTED, false, false],\n [\"approved\", APPROVED, false, true]\n ])(\"applies the rule for %s\", async (_name, review, canSave, canPublish) => {\n base.vm = loadedVm({ canCreateNewRevision: true });\n base.loadRevision.mockResolvedValue(undefined);\n await presenter.loadRevision(\"entry-1#0001\");\n\n fake.setVm(review);\n\n expect(presenter.vm.canSave).toBe(canSave);\n expect(presenter.vm.canCreateNewRevision).toBe(canSave);\n expect(presenter.vm.canPublish).toBe(canPublish);\n });\n\n it(\"never grants what the original presenter denies\", async () => {\n base.loadRevision.mockImplementation(async () => {\n base.vm = loadedVm({ canSave: false, canPublish: false });\n });\n\n await presenter.loadRevision(\"entry-1#0001\");\n fake.setVm(NO_WORKFLOW);\n\n expect(presenter.vm.canSave).toBe(false);\n expect(presenter.vm.canPublish).toBe(false);\n });\n\n it(\"disposes the shared presenter on reset and stops gating\", async () => {\n await presenter.loadRevision(\"entry-1#0001\");\n fake.setVm(LOADING);\n\n presenter.reset();\n\n expect(base.reset).toHaveBeenCalledTimes(1);\n expect(fake.presenter.dispose).toHaveBeenCalledTimes(1);\n expect(presenter.vm.canSave).toBe(true);\n });\n\n it(\"ignores a load that finished after the editor was reset\", async () => {\n let finishLoading = (): void => {};\n base.loadRevision.mockImplementation(() => {\n return new Promise<void>(resolve => {\n finishLoading = resolve;\n });\n });\n\n const loading = presenter.loadRevision(\"entry-1#0001\");\n presenter.reset();\n base.vm = loadedVm();\n finishLoading();\n await loading;\n\n expect(fake.presenter.init).not.toHaveBeenCalled();\n });\n\n it(\"stops gating and rethrows when the revision load fails\", async () => {\n base.vm = loadedVm();\n base.loadRevision.mockRejectedValue(new Error(\"Load failed.\"));\n\n await expect(presenter.loadRevision(\"entry-1#0001\")).rejects.toThrow(\"Load failed.\");\n\n expect(presenter.vm.canSave).toBe(true);\n expect(presenter.vm.canPublish).toBe(true);\n expect(fake.presenter.init).not.toHaveBeenCalled();\n });\n\n it(\"stops gating when the load finishes without an entry\", async () => {\n base.loadRevision.mockImplementation(async () => {\n base.vm = createFormVm({ entry: null, canSave: true, canPublish: true });\n });\n\n await presenter.loadRevision(\"entry-1#0001\");\n\n expect(presenter.vm.canSave).toBe(true);\n expect(presenter.vm.canPublish).toBe(true);\n expect(fake.presenter.init).not.toHaveBeenCalled();\n });\n\n it(\"ignores a load that finished while another revision was loading\", async () => {\n let finishFirstLoad = (): void => {};\n let finishSecondLoad = (): void => {};\n base.loadRevision.mockImplementationOnce(() => {\n return new Promise<void>(resolve => {\n finishFirstLoad = resolve;\n });\n });\n base.loadRevision.mockImplementationOnce(() => {\n return new Promise<void>(resolve => {\n finishSecondLoad = () => {\n base.vm = loadedVm({\n entry: createEntry({ version: 2 }, { id: \"entry-1#0002\" })\n });\n resolve();\n };\n });\n });\n\n const firstLoad = presenter.loadRevision(\"entry-1#0001\");\n const secondLoad = presenter.loadRevision(\"entry-1#0002\");\n base.vm = loadedVm();\n finishFirstLoad();\n await firstLoad;\n finishSecondLoad();\n await secondLoad;\n\n expect(fake.presenter.init).toHaveBeenCalledTimes(1);\n expect(fake.presenter.init).toHaveBeenCalledWith(\n expect.objectContaining({\n target: { namespace: \"cms.article\", targetRevisionId: \"entry-1#0002\" }\n })\n );\n });\n\n it(\"does not save or publish while the revision is loading\", async () => {\n let finishLoading = (): void => {};\n base.vm = loadedVm();\n base.loadRevision.mockImplementation(() => {\n return new Promise<void>(resolve => {\n finishLoading = resolve;\n });\n });\n\n fake.setVm(NO_WORKFLOW);\n\n const loading = presenter.loadRevision(\"entry-1#0001\");\n const saved = await presenter.saveRevision();\n const published = await presenter.publishRevision();\n finishLoading();\n await loading;\n\n expect(saved).toBe(false);\n expect(published).toBe(false);\n expect(base.saveRevision).not.toHaveBeenCalled();\n expect(base.publishRevision).not.toHaveBeenCalled();\n });\n\n it(\"does not track a new entry whose first save failed\", async () => {\n presenter.newEntry();\n base.saveRevision.mockImplementation(async () => {\n base.vm = loadedVm();\n return false;\n });\n\n const saved = await presenter.saveRevision();\n\n expect(saved).toBe(false);\n expect(fake.presenter.init).not.toHaveBeenCalled();\n });\n\n it(\"tracks a new entry's review after its first save\", async () => {\n presenter.newEntry();\n base.saveRevision.mockImplementation(async () => {\n base.vm = loadedVm();\n return true;\n });\n\n const saved = await presenter.saveRevision();\n\n expect(saved).toBe(true);\n expect(fake.presenter.init).toHaveBeenCalledTimes(1);\n expect(fake.presenter.init).toHaveBeenCalledWith(\n expect.objectContaining({\n target: { namespace: \"cms.article\", targetRevisionId: \"entry-1#0001\" }\n })\n );\n });\n\n it(\"stops Save & Publish of a new entry on a bound model before publishing without a review\", async () => {\n presenter.newEntry();\n base.saveRevision.mockImplementation(async () => {\n base.vm = loadedVm();\n return true;\n });\n fake.setVm(BOUND_NO_REVIEW);\n\n await presenter.saveRevision();\n const published = await presenter.publishRevision();\n\n expect(published).toBe(false);\n expect(base.publishRevision).not.toHaveBeenCalled();\n });\n\n it(\"publishes a new entry of a model without a workflow after its first save\", async () => {\n presenter.newEntry();\n base.saveRevision.mockImplementation(async () => {\n base.vm = loadedVm();\n return true;\n });\n fake.setVm(NO_WORKFLOW);\n\n await presenter.saveRevision();\n const published = await presenter.publishRevision();\n\n expect(published).toBe(true);\n expect(base.publishRevision).toHaveBeenCalledTimes(1);\n });\n\n it(\"does not track a new entry of a singleton model after its first save\", async () => {\n base.vm = createFormVm({ entry: null, canSave: true, model: SINGLETON_MODEL });\n presenter.newEntry();\n base.saveRevision.mockImplementation(async () => {\n base.vm = loadedVm({ model: SINGLETON_MODEL });\n return true;\n });\n\n await presenter.saveRevision();\n\n expect(fake.presenter.init).not.toHaveBeenCalled();\n });\n\n it(\"passes a new entry through untouched\", () => {\n base.vm = createFormVm({ entry: null, isNewEntry: true, canSave: true, canPublish: false });\n fake.setVm(LOADING);\n\n presenter.newEntry();\n\n expect(presenter.vm.canSave).toBe(true);\n });\n\n it(\"does not save while the review forbids editing\", async () => {\n await presenter.loadRevision(\"entry-1#0001\");\n fake.setVm(IN_REVIEW);\n\n const saved = await presenter.saveRevision();\n\n expect(saved).toBe(false);\n expect(base.saveRevision).not.toHaveBeenCalled();\n });\n\n it(\"lets Save & Publish go on for a clean, unlocked approved draft\", async () => {\n await presenter.loadRevision(\"entry-1#0001\");\n fake.setVm(APPROVED);\n\n const saved = await presenter.saveRevision();\n\n expect(saved).toBe(true);\n expect(base.saveRevision).not.toHaveBeenCalled();\n });\n\n it(\"does not report a save for a dirty approved draft\", async () => {\n base.loadRevision.mockImplementation(async () => {\n base.vm = loadedVm({ isDirty: true });\n });\n await presenter.loadRevision(\"entry-1#0001\");\n fake.setVm(APPROVED);\n\n const saved = await presenter.saveRevision();\n\n expect(saved).toBe(false);\n expect(base.saveRevision).not.toHaveBeenCalled();\n });\n\n it(\"does not save, and does not offer a new revision, for an approved locked entry\", async () => {\n base.loadRevision.mockImplementation(async () => {\n base.vm = loadedVm({\n entry: createEntry({ status: \"published\", locked: true }),\n canCreateNewRevision: true\n });\n });\n await presenter.loadRevision(\"entry-1#0001\");\n fake.setVm(APPROVED);\n\n const saved = await presenter.saveRevision();\n\n expect(saved).toBe(false);\n expect(base.saveRevision).not.toHaveBeenCalled();\n expect(presenter.vm.canCreateNewRevision).toBe(false);\n });\n\n it(\"saves normally when editing is allowed and updates the context\", async () => {\n await presenter.loadRevision(\"entry-1#0001\");\n fake.setVm(NO_WORKFLOW);\n\n const saved = await presenter.saveRevision({ skipValidation: false });\n\n expect(saved).toBe(true);\n expect(base.saveRevision).toHaveBeenCalledWith({ skipValidation: false });\n expect(fake.presenter.init).toHaveBeenCalledTimes(1);\n expect(fake.presenter.setContext).toHaveBeenCalledWith({\n targetTitle: \"Hello\",\n canRequest: true,\n isPublished: false,\n isUnpublished: false\n });\n });\n\n it(\"re-initialises for the new revision a save created\", async () => {\n await presenter.loadRevision(\"entry-1#0001\");\n fake.setVm(NO_WORKFLOW);\n base.saveRevision.mockImplementation(async () => {\n base.vm = loadedVm({ entry: { ...createEntry(), id: \"entry-1#0002\" } });\n return true;\n });\n\n await presenter.saveRevision();\n\n expect(fake.presenter.init).toHaveBeenCalledTimes(2);\n const params = fake.presenter.init.mock.calls[1][0];\n expect(params.target).toEqual({\n namespace: \"cms.article\",\n targetRevisionId: \"entry-1#0002\"\n });\n expect(fake.presenter.setContext).not.toHaveBeenCalled();\n });\n\n it(\"gives the new revision a reloader after a save created it\", async () => {\n await presenter.loadRevision(\"entry-1#0001\");\n fake.setVm(NO_WORKFLOW);\n base.saveRevision.mockImplementation(async () => {\n base.vm = loadedVm({ entry: createEntry({}, { id: \"entry-1#0002\" }) });\n return true;\n });\n\n await presenter.saveRevision();\n\n const first = fake.presenter.init.mock.calls[0][0].contentReloader;\n const second = fake.presenter.init.mock.calls[1][0].contentReloader;\n expect(second).toBeInstanceOf(CmsEntryContentReloader);\n expect(second).not.toBe(first);\n });\n\n describe(\"content reloader\", () => {\n const SAVED_LATER = \"2026-10-17T11:00:00.000Z\";\n\n async function loadAndGetReloader() {\n await presenter.loadRevision(\"entry-1#0001\");\n const params = fake.presenter.init.mock.calls[0][0];\n const reloader = params.contentReloader;\n if (!reloader) {\n throw new Error(\"The init params carry no reloader.\");\n }\n return reloader;\n }\n\n it(\"reads the revision again through the original presenter and never re-initialises the review\", async () => {\n const reloader = await loadAndGetReloader();\n base.loadRevision.mockImplementation(async () => {\n base.vm = loadedVm({\n entry: createEntry({}, { revisionSavedOn: SAVED_LATER })\n });\n });\n\n const changed = await reloader.reload();\n\n expect(changed).toBe(true);\n expect(base.loadRevision).toHaveBeenCalledTimes(2);\n expect(base.loadRevision).toHaveBeenLastCalledWith(\"entry-1#0001\");\n expect(fake.presenter.init).toHaveBeenCalledTimes(1);\n expect(fake.presenter.setContext).not.toHaveBeenCalled();\n expect(fake.presenter.dispose).not.toHaveBeenCalled();\n });\n });\n\n it(\"does not publish while the review forbids it\", async () => {\n await presenter.loadRevision(\"entry-1#0001\");\n fake.setVm(IN_REVIEW);\n\n const published = await presenter.publishRevision();\n\n expect(published).toBe(false);\n expect(base.publishRevision).not.toHaveBeenCalled();\n });\n\n it(\"sets the published flag without reloading after a publish\", async () => {\n await presenter.loadRevision(\"entry-1#0001\");\n fake.setVm(APPROVED);\n base.publishRevision.mockImplementation(async () => {\n base.vm = loadedVm({ entry: createEntry({ status: \"published\" }) });\n return true;\n });\n\n const published = await presenter.publishRevision();\n\n expect(published).toBe(true);\n expect(fake.presenter.init).toHaveBeenCalledTimes(1);\n expect(fake.presenter.setContext).toHaveBeenCalledWith({\n targetTitle: \"Hello\",\n canRequest: true,\n isPublished: true,\n isUnpublished: false\n });\n });\n\n it(\"clears the published flag without reloading after an unpublish\", async () => {\n base.loadRevision.mockImplementation(async () => {\n base.vm = loadedVm({ entry: createEntry({ status: \"published\" }) });\n });\n await presenter.loadRevision(\"entry-1#0001\");\n base.unpublishRevision.mockImplementation(async () => {\n base.vm = loadedVm({ entry: createEntry({ status: \"unpublished\" }) });\n return true;\n });\n\n await presenter.unpublishRevision();\n\n expect(fake.presenter.init).toHaveBeenCalledTimes(1);\n const context = fake.presenter.setContext.mock.calls[0][0];\n expect(context.isPublished).toBe(false);\n expect(context.isUnpublished).toBe(true);\n });\n\n it(\"does not update the review context after an unpublish of an untracked entry\", async () => {\n base.vm = loadedVm({ entry: createEntry({ status: \"published\" }) });\n base.unpublishRevision.mockImplementation(async () => {\n base.vm = loadedVm({ entry: createEntry({ status: \"unpublished\" }) });\n return true;\n });\n\n const unpublished = await presenter.unpublishRevision();\n\n expect(unpublished).toBe(true);\n expect(fake.presenter.setContext).not.toHaveBeenCalled();\n });\n});\n"],"names":["base","FakeBasePresenter","id","options","Promise","BasePresenter","ContentEntryFormPresenter","fake","presenter","loadedVm","overrides","createFormVm","createEntry","createBase","vm","vi","resolvePresenter","createEntrySession","container","Container","CmsEntryReview","CmsEntryFormPresenterReviewDecorator","describe","beforeEach","it","expect","CmsEntryContentReloader","CmsEntryUnsavedChanges","params","SINGLETON_MODEL","LOADING","finishLoading","resolve","loading","NO_WORKFLOW","BOUND_NO_REVIEW","BOUND_UNPUBLISHED","FAILED","IN_REVIEW","REJECTED","APPROVED","_name","review","canSave","canPublish","undefined","Error","finishFirstLoad","finishSecondLoad","firstLoad","secondLoad","saved","published","first","second","SAVED_LATER","loadAndGetReloader","reloader","changed","context","unpublished"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ContentEntryFormPresenter } from "@webiny/app-headless-cms/presentation/contentEntries/form/abstractions.js";
2
+ import type { IReviewUnsavedChanges } from "@webiny/app-workflows/review/content/IReviewUnsavedChanges.js";
3
+ export declare class CmsEntryUnsavedChanges implements IReviewUnsavedChanges {
4
+ private readonly form;
5
+ constructor(form: ContentEntryFormPresenter.Interface);
6
+ getRequestBlockReason(): string | null;
7
+ }
@@ -0,0 +1,12 @@
1
+ class CmsEntryUnsavedChanges {
2
+ constructor(form){
3
+ this.form = form;
4
+ }
5
+ getRequestBlockReason() {
6
+ if (this.form.vm.isDirty) return "Save your changes before requesting a review.";
7
+ return null;
8
+ }
9
+ }
10
+ export { CmsEntryUnsavedChanges };
11
+
12
+ //# sourceMappingURL=CmsEntryUnsavedChanges.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/CmsEntryUnsavedChanges.js","sources":["../../src/presentation/CmsEntryUnsavedChanges.ts"],"sourcesContent":["import type { ContentEntryFormPresenter } from \"@webiny/app-headless-cms/presentation/contentEntries/form/abstractions.js\";\nimport type { IReviewUnsavedChanges } from \"@webiny/app-workflows/review/content/IReviewUnsavedChanges.js\";\n\n/*\n * Blocks Request review while the entry form has edits that are not saved: the review would read\n * the stored revision, not what the editor shows. It reads the undecorated form presenter's view\n * model, so the bar follows the form live.\n */\nexport class CmsEntryUnsavedChanges implements IReviewUnsavedChanges {\n constructor(private readonly form: ContentEntryFormPresenter.Interface) {}\n\n getRequestBlockReason(): string | null {\n if (this.form.vm.isDirty) {\n return \"Save your changes before requesting a review.\";\n }\n return null;\n }\n}\n"],"names":["CmsEntryUnsavedChanges","form"],"mappings":"AAQO,MAAMA;IACT,YAA6BC,IAAyC,CAAE;aAA3CA,IAAI,GAAJA;IAA4C;IAEzE,wBAAuC;QACnC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EACpB,OAAO;QAEX,OAAO;IACX;AACJ"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,23 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { createEntry } from "../testing/createEntry.js";
3
+ import { createFormVm } from "../testing/createFormVm.js";
4
+ import { CmsEntryUnsavedChanges } from "./CmsEntryUnsavedChanges.js";
5
+ const createUnsavedChanges = (isDirty)=>{
6
+ const form = {
7
+ vm: createFormVm({
8
+ entry: createEntry(),
9
+ isDirty
10
+ })
11
+ };
12
+ return new CmsEntryUnsavedChanges(form);
13
+ };
14
+ describe("CmsEntryUnsavedChanges", ()=>{
15
+ it("blocks Request review while the form has unsaved edits", ()=>{
16
+ expect(createUnsavedChanges(true).getRequestBlockReason()).toBe("Save your changes before requesting a review.");
17
+ });
18
+ it("does not block a clean form", ()=>{
19
+ expect(createUnsavedChanges(false).getRequestBlockReason()).toBeNull();
20
+ });
21
+ });
22
+
23
+ //# sourceMappingURL=CmsEntryUnsavedChanges.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/CmsEntryUnsavedChanges.test.js","sources":["../../src/presentation/CmsEntryUnsavedChanges.test.ts"],"sourcesContent":["import { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport type { ContentEntryFormPresenter } from \"@webiny/app-headless-cms/presentation/contentEntries/form/abstractions.js\";\nimport { createEntry } from \"~/testing/createEntry.js\";\nimport { createFormVm } from \"~/testing/createFormVm.js\";\nimport { CmsEntryUnsavedChanges } from \"./CmsEntryUnsavedChanges.js\";\n\nconst createUnsavedChanges = (isDirty: boolean) => {\n const form = {\n vm: createFormVm({ entry: createEntry(), isDirty })\n } as unknown as ContentEntryFormPresenter.Interface;\n return new CmsEntryUnsavedChanges(form);\n};\n\ndescribe(\"CmsEntryUnsavedChanges\", () => {\n it(\"blocks Request review while the form has unsaved edits\", () => {\n expect(createUnsavedChanges(true).getRequestBlockReason()).toBe(\n \"Save your changes before requesting a review.\"\n );\n });\n\n it(\"does not block a clean form\", () => {\n expect(createUnsavedChanges(false).getRequestBlockReason()).toBeNull();\n });\n});\n"],"names":["createUnsavedChanges","isDirty","form","createFormVm","createEntry","CmsEntryUnsavedChanges","describe","it","expect"],"mappings":";;;;AAQA,MAAMA,uBAAuB,CAACC;IAC1B,MAAMC,OAAO;QACT,IAAIC,aAAa;YAAE,OAAOC;YAAeH;QAAQ;IACrD;IACA,OAAO,IAAII,uBAAuBH;AACtC;AAEAI,SAAS,0BAA0B;IAC/BC,GAAG,0DAA0D;QACzDC,OAAOR,qBAAqB,MAAM,qBAAqB,IAAI,IAAI,CAC3D;IAER;IAEAO,GAAG,+BAA+B;QAC9BC,OAAOR,qBAAqB,OAAO,qBAAqB,IAAI,QAAQ;IACxE;AACJ"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,27 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { Container } from "@webiny/di";
3
+ import { GetEntryGraphQLFieldSelection, ListEntriesGraphQLFieldSelection } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
4
+ import { REVIEW_SYSTEM_WORKFLOW_SELECTION } from "@webiny/app-workflows/review/gateway/reviewFields.js";
5
+ import { CmsReviewGetEntryFieldSelection } from "./CmsReviewGetEntryFieldSelection.js";
6
+ import { CmsReviewListEntriesFieldSelection } from "./CmsReviewListEntriesFieldSelection.js";
7
+ const EXPECTED = `meta { system { workflow { ${REVIEW_SYSTEM_WORKFLOW_SELECTION} } } }`;
8
+ describe("CMS review field selections", ()=>{
9
+ it("selects the review shape of system.workflow on the entry list", ()=>{
10
+ const container = new Container();
11
+ container.register(CmsReviewListEntriesFieldSelection);
12
+ const selection = container.resolve(ListEntriesGraphQLFieldSelection).getSelection();
13
+ expect(selection).toEqual([
14
+ EXPECTED
15
+ ]);
16
+ });
17
+ it("selects the review shape of system.workflow on an entry read", ()=>{
18
+ const container = new Container();
19
+ container.register(CmsReviewGetEntryFieldSelection);
20
+ const selection = container.resolve(GetEntryGraphQLFieldSelection).getSelection();
21
+ expect(selection).toEqual([
22
+ EXPECTED
23
+ ]);
24
+ });
25
+ });
26
+
27
+ //# sourceMappingURL=CmsReviewFieldSelections.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/CmsReviewFieldSelections.test.js","sources":["../../src/presentation/CmsReviewFieldSelections.test.ts"],"sourcesContent":["import { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { GetEntryGraphQLFieldSelection } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport { ListEntriesGraphQLFieldSelection } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport { REVIEW_SYSTEM_WORKFLOW_SELECTION } from \"@webiny/app-workflows/review/gateway/reviewFields.js\";\nimport { CmsReviewGetEntryFieldSelection } from \"~/presentation/CmsReviewGetEntryFieldSelection.js\";\nimport { CmsReviewListEntriesFieldSelection } from \"~/presentation/CmsReviewListEntriesFieldSelection.js\";\n\nconst EXPECTED = `meta { system { workflow { ${REVIEW_SYSTEM_WORKFLOW_SELECTION} } } }`;\n\ndescribe(\"CMS review field selections\", () => {\n it(\"selects the review shape of system.workflow on the entry list\", () => {\n const container = new Container();\n container.register(CmsReviewListEntriesFieldSelection);\n\n const selection = container.resolve(ListEntriesGraphQLFieldSelection).getSelection();\n\n expect(selection).toEqual([EXPECTED]);\n });\n\n it(\"selects the review shape of system.workflow on an entry read\", () => {\n const container = new Container();\n container.register(CmsReviewGetEntryFieldSelection);\n\n const selection = container.resolve(GetEntryGraphQLFieldSelection).getSelection();\n\n expect(selection).toEqual([EXPECTED]);\n });\n});\n"],"names":["EXPECTED","REVIEW_SYSTEM_WORKFLOW_SELECTION","describe","it","container","Container","CmsReviewListEntriesFieldSelection","selection","ListEntriesGraphQLFieldSelection","expect","CmsReviewGetEntryFieldSelection","GetEntryGraphQLFieldSelection"],"mappings":";;;;;;AAUA,MAAMA,WAAW,CAAC,2BAA2B,EAAEC,iCAAiC,MAAM,CAAC;AAEvFC,SAAS,+BAA+B;IACpCC,GAAG,iEAAiE;QAChE,MAAMC,YAAY,IAAIC;QACtBD,UAAU,QAAQ,CAACE;QAEnB,MAAMC,YAAYH,UAAU,OAAO,CAACI,kCAAkC,YAAY;QAElFC,OAAOF,WAAW,OAAO,CAAC;YAACP;SAAS;IACxC;IAEAG,GAAG,gEAAgE;QAC/D,MAAMC,YAAY,IAAIC;QACtBD,UAAU,QAAQ,CAACM;QAEnB,MAAMH,YAAYH,UAAU,OAAO,CAACO,+BAA+B,YAAY;QAE/EF,OAAOF,WAAW,OAAO,CAAC;YAACP;SAAS;IACxC;AACJ"}
@@ -1,8 +1,8 @@
1
1
  import { GetEntryGraphQLFieldSelection } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
2
- declare class WorkflowStateGetEntryFieldSelectionImpl implements GetEntryGraphQLFieldSelection.Interface {
2
+ declare class CmsReviewGetEntryFieldSelectionImpl implements GetEntryGraphQLFieldSelection.Interface {
3
3
  getSelection(): string[];
4
4
  }
5
- export declare const WorkflowStateGetEntryFieldSelection: typeof WorkflowStateGetEntryFieldSelectionImpl & {
5
+ export declare const CmsReviewGetEntryFieldSelection: typeof CmsReviewGetEntryFieldSelectionImpl & {
6
6
  __abstraction: import("@webiny/di").Abstraction<import("@webiny/app-headless-cms/features/contentEntry/getEntry/abstractions").IGetEntryGraphQLFieldSelection>;
7
7
  };
8
8
  export {};
@@ -0,0 +1,16 @@
1
+ import { GetEntryGraphQLFieldSelection } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
2
+ import { REVIEW_SYSTEM_WORKFLOW_SELECTION } from "@webiny/app-workflows/review/gateway/reviewFields.js";
3
+ class CmsReviewGetEntryFieldSelectionImpl {
4
+ getSelection() {
5
+ return [
6
+ `meta { system { workflow { ${REVIEW_SYSTEM_WORKFLOW_SELECTION} } } }`
7
+ ];
8
+ }
9
+ }
10
+ const CmsReviewGetEntryFieldSelection = GetEntryGraphQLFieldSelection.createImplementation({
11
+ dependencies: [],
12
+ implementation: CmsReviewGetEntryFieldSelectionImpl
13
+ });
14
+ export { CmsReviewGetEntryFieldSelection };
15
+
16
+ //# sourceMappingURL=CmsReviewGetEntryFieldSelection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/CmsReviewGetEntryFieldSelection.js","sources":["../../src/presentation/CmsReviewGetEntryFieldSelection.ts"],"sourcesContent":["import { GetEntryGraphQLFieldSelection } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport { REVIEW_SYSTEM_WORKFLOW_SELECTION } from \"@webiny/app-workflows/review/gateway/reviewFields.js\";\n\nclass CmsReviewGetEntryFieldSelectionImpl implements GetEntryGraphQLFieldSelection.Interface {\n getSelection(): string[] {\n return [`meta { system { workflow { ${REVIEW_SYSTEM_WORKFLOW_SELECTION} } } }`];\n }\n}\n\nexport const CmsReviewGetEntryFieldSelection = GetEntryGraphQLFieldSelection.createImplementation({\n dependencies: [],\n implementation: CmsReviewGetEntryFieldSelectionImpl\n});\n"],"names":["CmsReviewGetEntryFieldSelectionImpl","REVIEW_SYSTEM_WORKFLOW_SELECTION","CmsReviewGetEntryFieldSelection","GetEntryGraphQLFieldSelection"],"mappings":";;AAGA,MAAMA;IACF,eAAyB;QACrB,OAAO;YAAC,CAAC,2BAA2B,EAAEC,iCAAiC,MAAM,CAAC;SAAC;IACnF;AACJ;AAEO,MAAMC,kCAAkCC,8BAA8B,oBAAoB,CAAC;IAC9F,cAAc,EAAE;IAChB,gBAAgBH;AACpB"}
@@ -1,8 +1,8 @@
1
1
  import { ListEntriesGraphQLFieldSelection } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
2
- declare class WorkflowStateListEntriesFieldSelectionImpl implements ListEntriesGraphQLFieldSelection.Interface {
2
+ declare class CmsReviewListEntriesFieldSelectionImpl implements ListEntriesGraphQLFieldSelection.Interface {
3
3
  getSelection(): string[];
4
4
  }
5
- export declare const WorkflowStateListEntriesFieldSelection: typeof WorkflowStateListEntriesFieldSelectionImpl & {
5
+ export declare const CmsReviewListEntriesFieldSelection: typeof CmsReviewListEntriesFieldSelectionImpl & {
6
6
  __abstraction: import("@webiny/di").Abstraction<import("@webiny/app-headless-cms/features/contentEntry/listEntries/abstractions").IListEntriesGraphQLFieldSelection>;
7
7
  };
8
8
  export {};
@@ -0,0 +1,16 @@
1
+ import { ListEntriesGraphQLFieldSelection } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
2
+ import { REVIEW_SYSTEM_WORKFLOW_SELECTION } from "@webiny/app-workflows/review/gateway/reviewFields.js";
3
+ class CmsReviewListEntriesFieldSelectionImpl {
4
+ getSelection() {
5
+ return [
6
+ `meta { system { workflow { ${REVIEW_SYSTEM_WORKFLOW_SELECTION} } } }`
7
+ ];
8
+ }
9
+ }
10
+ const CmsReviewListEntriesFieldSelection = ListEntriesGraphQLFieldSelection.createImplementation({
11
+ dependencies: [],
12
+ implementation: CmsReviewListEntriesFieldSelectionImpl
13
+ });
14
+ export { CmsReviewListEntriesFieldSelection };
15
+
16
+ //# sourceMappingURL=CmsReviewListEntriesFieldSelection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/CmsReviewListEntriesFieldSelection.js","sources":["../../src/presentation/CmsReviewListEntriesFieldSelection.ts"],"sourcesContent":["import { ListEntriesGraphQLFieldSelection } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport { REVIEW_SYSTEM_WORKFLOW_SELECTION } from \"@webiny/app-workflows/review/gateway/reviewFields.js\";\n\nclass CmsReviewListEntriesFieldSelectionImpl implements ListEntriesGraphQLFieldSelection.Interface {\n getSelection(): string[] {\n return [`meta { system { workflow { ${REVIEW_SYSTEM_WORKFLOW_SELECTION} } } }`];\n }\n}\n\nexport const CmsReviewListEntriesFieldSelection =\n ListEntriesGraphQLFieldSelection.createImplementation({\n dependencies: [],\n implementation: CmsReviewListEntriesFieldSelectionImpl\n });\n"],"names":["CmsReviewListEntriesFieldSelectionImpl","REVIEW_SYSTEM_WORKFLOW_SELECTION","CmsReviewListEntriesFieldSelection","ListEntriesGraphQLFieldSelection"],"mappings":";;AAGA,MAAMA;IACF,eAAyB;QACrB,OAAO;YAAC,CAAC,2BAA2B,EAAEC,iCAAiC,MAAM,CAAC;SAAC;IACnF;AACJ;AAEO,MAAMC,qCACTC,iCAAiC,oBAAoB,CAAC;IAClD,cAAc,EAAE;IAChB,gBAAgBH;AACpB"}
@@ -1,11 +1,11 @@
1
1
  import { TableRowMapper } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
2
2
  import type { CmsContentEntry } from "@webiny/app-headless-cms-common/types/index.js";
3
- declare class TableRowMapperWithWorkflows implements TableRowMapper.Interface {
4
- private decoratee;
3
+ declare class CmsReviewTableRowMapper implements TableRowMapper.Interface {
4
+ private readonly decoratee;
5
5
  constructor(decoratee: TableRowMapper.Interface);
6
6
  fromEntry(entry: CmsContentEntry): TableRowMapper.EntryTableRow;
7
7
  }
8
- export declare const TableRowMapperWorkflowDecorator: typeof TableRowMapperWithWorkflows & {
8
+ export declare const CmsReviewTableRowMapperDecorator: typeof CmsReviewTableRowMapper & {
9
9
  __abstraction: import("@webiny/di").Abstraction<import("@webiny/app-headless-cms/presentation/contentEntries/views/Table/abstractions").ITableRowMapper>;
10
10
  };
11
11
  export {};
@@ -0,0 +1,24 @@
1
+ import { TableRowMapper } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
2
+ import { isReviewSelectable } from "@webiny/app-workflows/review/domain/isReviewSelectable.js";
3
+ class CmsReviewTableRowMapper {
4
+ constructor(decoratee){
5
+ this.decoratee = decoratee;
6
+ }
7
+ fromEntry(entry) {
8
+ const row = this.decoratee.fromEntry(entry);
9
+ const meta = entry.meta;
10
+ const reviewState = meta.system?.workflow?.reviewState ?? null;
11
+ if (isReviewSelectable(reviewState)) return row;
12
+ return {
13
+ ...row,
14
+ $selectable: false
15
+ };
16
+ }
17
+ }
18
+ const CmsReviewTableRowMapperDecorator = TableRowMapper.createDecorator({
19
+ decorator: CmsReviewTableRowMapper,
20
+ dependencies: []
21
+ });
22
+ export { CmsReviewTableRowMapperDecorator };
23
+
24
+ //# sourceMappingURL=CmsReviewTableRowMapperDecorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/CmsReviewTableRowMapperDecorator.js","sources":["../../src/presentation/CmsReviewTableRowMapperDecorator.ts"],"sourcesContent":["import { TableRowMapper } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport type { CmsContentEntry } from \"@webiny/app-headless-cms-common/types/index.js\";\nimport { isReviewSelectable } from \"@webiny/app-workflows/review/domain/isReviewSelectable.js\";\nimport type { ICmsEntryMetaWithReview } from \"~/types.js\";\n\nclass CmsReviewTableRowMapper implements TableRowMapper.Interface {\n constructor(private readonly decoratee: TableRowMapper.Interface) {}\n\n fromEntry(entry: CmsContentEntry): TableRowMapper.EntryTableRow {\n const row = this.decoratee.fromEntry(entry);\n const meta: ICmsEntryMetaWithReview = entry.meta;\n const reviewState = meta.system?.workflow?.reviewState ?? null;\n\n if (isReviewSelectable(reviewState)) {\n return row;\n }\n\n return { ...row, $selectable: false };\n }\n}\n\nexport const CmsReviewTableRowMapperDecorator = TableRowMapper.createDecorator({\n decorator: CmsReviewTableRowMapper,\n dependencies: []\n});\n"],"names":["CmsReviewTableRowMapper","decoratee","entry","row","meta","reviewState","isReviewSelectable","CmsReviewTableRowMapperDecorator","TableRowMapper"],"mappings":";;AAKA,MAAMA;IACF,YAA6BC,SAAmC,CAAE;aAArCA,SAAS,GAATA;IAAsC;IAEnE,UAAUC,KAAsB,EAAgC;QAC5D,MAAMC,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAACD;QACrC,MAAME,OAAgCF,MAAM,IAAI;QAChD,MAAMG,cAAcD,KAAK,MAAM,EAAE,UAAU,eAAe;QAE1D,IAAIE,mBAAmBD,cACnB,OAAOF;QAGX,OAAO;YAAE,GAAGA,GAAG;YAAE,aAAa;QAAM;IACxC;AACJ;AAEO,MAAMI,mCAAmCC,eAAe,eAAe,CAAC;IAC3E,WAAWR;IACX,cAAc,EAAE;AACpB"}
@@ -0,0 +1,120 @@
1
+ import { beforeEach, describe, expect, it } from "vitest";
2
+ import { Container } from "@webiny/di";
3
+ import { TableRowMapper } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
4
+ import { ReviewState } from "@webiny/app-workflows/review/domain/ReviewState.js";
5
+ import { CmsReviewTableRowMapperDecorator } from "./CmsReviewTableRowMapperDecorator.js";
6
+ let base;
7
+ class FakeRowMapper {
8
+ fromEntry(entry) {
9
+ return {
10
+ id: entry.id,
11
+ $selectable: base.selectable,
12
+ $type: "RECORD",
13
+ data: entry
14
+ };
15
+ }
16
+ }
17
+ const BaseRowMapper = TableRowMapper.createImplementation({
18
+ implementation: FakeRowMapper,
19
+ dependencies: []
20
+ });
21
+ function createEntry(system) {
22
+ return {
23
+ id: "entry-1#0001",
24
+ entryId: "entry-1",
25
+ meta: {
26
+ title: "Hello",
27
+ status: "draft",
28
+ version: 1,
29
+ locked: false,
30
+ system
31
+ }
32
+ };
33
+ }
34
+ function createWorkflow(reviewState) {
35
+ return {
36
+ workflowId: "wf-1",
37
+ reviewState,
38
+ stepId: "step-1",
39
+ stepName: "Legal review",
40
+ stepState: "inReview"
41
+ };
42
+ }
43
+ let mapper;
44
+ describe("CmsReviewTableRowMapperDecorator", ()=>{
45
+ beforeEach(()=>{
46
+ base = {
47
+ selectable: true
48
+ };
49
+ const container = new Container();
50
+ container.register(BaseRowMapper);
51
+ container.registerDecorator(CmsReviewTableRowMapperDecorator);
52
+ mapper = container.resolve(TableRowMapper);
53
+ });
54
+ it("keeps an approved review selectable", ()=>{
55
+ const row = mapper.fromEntry(createEntry({
56
+ workflow: createWorkflow(ReviewState.Approved)
57
+ }));
58
+ expect(row.$selectable).toBe(true);
59
+ });
60
+ it.each([
61
+ [
62
+ "in progress",
63
+ ReviewState.InProgress
64
+ ],
65
+ [
66
+ "rejected",
67
+ ReviewState.Rejected
68
+ ],
69
+ [
70
+ "cancelled",
71
+ ReviewState.Cancelled
72
+ ]
73
+ ])("makes a row with a %s review unselectable", (_name, reviewState)=>{
74
+ const row = mapper.fromEntry(createEntry({
75
+ workflow: createWorkflow(reviewState)
76
+ }));
77
+ expect(row.$selectable).toBe(false);
78
+ });
79
+ it.each([
80
+ [
81
+ "no system",
82
+ void 0
83
+ ],
84
+ [
85
+ "a null system",
86
+ null
87
+ ],
88
+ [
89
+ "a system without a workflow",
90
+ {}
91
+ ],
92
+ [
93
+ "a null workflow",
94
+ {
95
+ workflow: null
96
+ }
97
+ ]
98
+ ])("keeps a row with %s selectable", (_name, system)=>{
99
+ const row = mapper.fromEntry(createEntry(system));
100
+ expect(row.$selectable).toBe(true);
101
+ });
102
+ it("never makes selectable what the base mapper made unselectable", ()=>{
103
+ base.selectable = false;
104
+ const row = mapper.fromEntry(createEntry({
105
+ workflow: createWorkflow(ReviewState.Approved)
106
+ }));
107
+ expect(row.$selectable).toBe(false);
108
+ });
109
+ it("keeps the rest of the row", ()=>{
110
+ const entry = createEntry({
111
+ workflow: createWorkflow(ReviewState.InProgress)
112
+ });
113
+ const row = mapper.fromEntry(entry);
114
+ expect(row.id).toBe("entry-1#0001");
115
+ expect(row.$type).toBe("RECORD");
116
+ expect(row.data).toBe(entry);
117
+ });
118
+ });
119
+
120
+ //# sourceMappingURL=CmsReviewTableRowMapperDecorator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/CmsReviewTableRowMapperDecorator.test.js","sources":["../../src/presentation/CmsReviewTableRowMapperDecorator.test.ts"],"sourcesContent":["import { beforeEach } from \"vitest\";\nimport { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { TableRowMapper } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport type { CmsContentEntry } from \"@webiny/app-headless-cms-common/types/index.js\";\nimport { ReviewState } from \"@webiny/app-workflows/review/domain/ReviewState.js\";\nimport { CmsReviewTableRowMapperDecorator } from \"~/presentation/CmsReviewTableRowMapperDecorator.js\";\n\ninterface BaseState {\n selectable: boolean;\n}\n\nlet base: BaseState;\n\nclass FakeRowMapper implements TableRowMapper.Interface {\n fromEntry(entry: CmsContentEntry): TableRowMapper.EntryTableRow {\n return { id: entry.id, $selectable: base.selectable, $type: \"RECORD\", data: entry };\n }\n}\n\nconst BaseRowMapper = TableRowMapper.createImplementation({\n implementation: FakeRowMapper,\n dependencies: []\n});\n\nfunction createEntry(system: unknown): CmsContentEntry {\n return {\n id: \"entry-1#0001\",\n entryId: \"entry-1\",\n meta: { title: \"Hello\", status: \"draft\", version: 1, locked: false, system }\n } as unknown as CmsContentEntry;\n}\n\nfunction createWorkflow(reviewState: string) {\n return {\n workflowId: \"wf-1\",\n reviewState,\n stepId: \"step-1\",\n stepName: \"Legal review\",\n stepState: \"inReview\"\n };\n}\n\nlet mapper: TableRowMapper.Interface;\n\ndescribe(\"CmsReviewTableRowMapperDecorator\", () => {\n beforeEach(() => {\n base = { selectable: true };\n const container = new Container();\n container.register(BaseRowMapper);\n container.registerDecorator(CmsReviewTableRowMapperDecorator);\n mapper = container.resolve(TableRowMapper);\n });\n\n it(\"keeps an approved review selectable\", () => {\n const row = mapper.fromEntry(\n createEntry({ workflow: createWorkflow(ReviewState.Approved) })\n );\n\n expect(row.$selectable).toBe(true);\n });\n\n it.each([\n [\"in progress\", ReviewState.InProgress],\n [\"rejected\", ReviewState.Rejected],\n [\"cancelled\", ReviewState.Cancelled]\n ])(\"makes a row with a %s review unselectable\", (_name, reviewState) => {\n const row = mapper.fromEntry(createEntry({ workflow: createWorkflow(reviewState) }));\n\n expect(row.$selectable).toBe(false);\n });\n\n it.each([\n [\"no system\", undefined],\n [\"a null system\", null],\n [\"a system without a workflow\", {}],\n [\"a null workflow\", { workflow: null }]\n ])(\"keeps a row with %s selectable\", (_name, system) => {\n const row = mapper.fromEntry(createEntry(system));\n\n expect(row.$selectable).toBe(true);\n });\n\n it(\"never makes selectable what the base mapper made unselectable\", () => {\n base.selectable = false;\n\n const row = mapper.fromEntry(\n createEntry({ workflow: createWorkflow(ReviewState.Approved) })\n );\n\n expect(row.$selectable).toBe(false);\n });\n\n it(\"keeps the rest of the row\", () => {\n const entry = createEntry({ workflow: createWorkflow(ReviewState.InProgress) });\n\n const row = mapper.fromEntry(entry);\n\n expect(row.id).toBe(\"entry-1#0001\");\n expect(row.$type).toBe(\"RECORD\");\n expect(row.data).toBe(entry);\n });\n});\n"],"names":["base","FakeRowMapper","entry","BaseRowMapper","TableRowMapper","createEntry","system","createWorkflow","reviewState","mapper","describe","beforeEach","container","Container","CmsReviewTableRowMapperDecorator","it","row","ReviewState","expect","_name","undefined"],"mappings":";;;;;AAcA,IAAIA;AAEJ,MAAMC;IACF,UAAUC,KAAsB,EAAgC;QAC5D,OAAO;YAAE,IAAIA,MAAM,EAAE;YAAE,aAAaF,KAAK,UAAU;YAAE,OAAO;YAAU,MAAME;QAAM;IACtF;AACJ;AAEA,MAAMC,gBAAgBC,eAAe,oBAAoB,CAAC;IACtD,gBAAgBH;IAChB,cAAc,EAAE;AACpB;AAEA,SAASI,YAAYC,MAAe;IAChC,OAAO;QACH,IAAI;QACJ,SAAS;QACT,MAAM;YAAE,OAAO;YAAS,QAAQ;YAAS,SAAS;YAAG,QAAQ;YAAOA;QAAO;IAC/E;AACJ;AAEA,SAASC,eAAeC,WAAmB;IACvC,OAAO;QACH,YAAY;QACZA;QACA,QAAQ;QACR,UAAU;QACV,WAAW;IACf;AACJ;AAEA,IAAIC;AAEJC,SAAS,oCAAoC;IACzCC,WAAW;QACPX,OAAO;YAAE,YAAY;QAAK;QAC1B,MAAMY,YAAY,IAAIC;QACtBD,UAAU,QAAQ,CAACT;QACnBS,UAAU,iBAAiB,CAACE;QAC5BL,SAASG,UAAU,OAAO,CAACR;IAC/B;IAEAW,GAAG,uCAAuC;QACtC,MAAMC,MAAMP,OAAO,SAAS,CACxBJ,YAAY;YAAE,UAAUE,eAAeU,YAAY,QAAQ;QAAE;QAGjEC,OAAOF,IAAI,WAAW,EAAE,IAAI,CAAC;IACjC;IAEAD,GAAG,IAAI,CAAC;QACJ;YAAC;YAAeE,YAAY,UAAU;SAAC;QACvC;YAAC;YAAYA,YAAY,QAAQ;SAAC;QAClC;YAAC;YAAaA,YAAY,SAAS;SAAC;KACvC,EAAE,6CAA6C,CAACE,OAAOX;QACpD,MAAMQ,MAAMP,OAAO,SAAS,CAACJ,YAAY;YAAE,UAAUE,eAAeC;QAAa;QAEjFU,OAAOF,IAAI,WAAW,EAAE,IAAI,CAAC;IACjC;IAEAD,GAAG,IAAI,CAAC;QACJ;YAAC;YAAaK;SAAU;QACxB;YAAC;YAAiB;SAAK;QACvB;YAAC;YAA+B,CAAC;SAAE;QACnC;YAAC;YAAmB;gBAAE,UAAU;YAAK;SAAE;KAC1C,EAAE,kCAAkC,CAACD,OAAOb;QACzC,MAAMU,MAAMP,OAAO,SAAS,CAACJ,YAAYC;QAEzCY,OAAOF,IAAI,WAAW,EAAE,IAAI,CAAC;IACjC;IAEAD,GAAG,iEAAiE;QAChEf,KAAK,UAAU,GAAG;QAElB,MAAMgB,MAAMP,OAAO,SAAS,CACxBJ,YAAY;YAAE,UAAUE,eAAeU,YAAY,QAAQ;QAAE;QAGjEC,OAAOF,IAAI,WAAW,EAAE,IAAI,CAAC;IACjC;IAEAD,GAAG,6BAA6B;QAC5B,MAAMb,QAAQG,YAAY;YAAE,UAAUE,eAAeU,YAAY,UAAU;QAAE;QAE7E,MAAMD,MAAMP,OAAO,SAAS,CAACP;QAE7BgB,OAAOF,IAAI,EAAE,EAAE,IAAI,CAAC;QACpBE,OAAOF,IAAI,KAAK,EAAE,IAAI,CAAC;QACvBE,OAAOF,IAAI,IAAI,EAAE,IAAI,CAACd;IAC1B;AACJ"}
@@ -0,0 +1,24 @@
1
+ import type { CmsContentEntry } from "@webiny/app-headless-cms/types.js";
2
+ import { CmsModelContext } from "@webiny/app-headless-cms/features/contentEntry/abstractions.js";
3
+ import { RevisionsListPresenter } from "@webiny/app-headless-cms/presentation/contentEntries/revisionsList/abstractions.js";
4
+ import { CmsEntryReview } from "../features/editorReview/abstractions.js";
5
+ declare class CmsRevisionsListPresenterWithReview implements RevisionsListPresenter.Interface {
6
+ private modelContext;
7
+ private session;
8
+ private decoratee;
9
+ constructor(modelContext: CmsModelContext.Interface, session: CmsEntryReview.Interface, decoratee: RevisionsListPresenter.Interface);
10
+ get vm(): RevisionsListPresenter.ViewModel;
11
+ init(entryId: string): Promise<void>;
12
+ show(): void;
13
+ hide(): void;
14
+ createRevision(revisionId: string): Promise<CmsContentEntry | null>;
15
+ publishRevision(revisionId: string): Promise<boolean>;
16
+ unpublishRevision(revisionId: string): Promise<boolean>;
17
+ updateRevisionNote(revisionId: string, currentDescription: string): Promise<boolean>;
18
+ deleteRevision(revisionId: string): Promise<boolean>;
19
+ dispose(): void;
20
+ }
21
+ export declare const CmsRevisionsListPresenterDecorator: typeof CmsRevisionsListPresenterWithReview & {
22
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/app-headless-cms/presentation/contentEntries/revisionsList/abstractions.js").IRevisionsListPresenter>;
23
+ };
24
+ export {};
@@ -0,0 +1,66 @@
1
+ import { makeAutoObservable } from "mobx";
2
+ import { CmsModelContext } from "@webiny/app-headless-cms/features/contentEntry/abstractions.js";
3
+ import { RevisionsListPresenter } from "@webiny/app-headless-cms/presentation/contentEntries/revisionsList/abstractions.js";
4
+ import { CmsEntryReview } from "../features/editorReview/abstractions.js";
5
+ import { isReviewableModel } from "../utils/isReviewableModel.js";
6
+ class CmsRevisionsListPresenterWithReview {
7
+ constructor(modelContext, session, decoratee){
8
+ this.modelContext = modelContext;
9
+ this.session = session;
10
+ this.decoratee = decoratee;
11
+ makeAutoObservable(this, {
12
+ modelContext: false,
13
+ session: false,
14
+ decoratee: false
15
+ });
16
+ }
17
+ get vm() {
18
+ const vm = this.decoratee.vm;
19
+ if (!isReviewableModel(this.modelContext.getModel())) return vm;
20
+ const noWorkflow = "noWorkflow" === this.session.presenter.vm.status;
21
+ return {
22
+ ...vm,
23
+ items: vm.items.map((item)=>({
24
+ ...item,
25
+ canPublish: item.canPublish && noWorkflow
26
+ }))
27
+ };
28
+ }
29
+ init(entryId) {
30
+ return this.decoratee.init(entryId);
31
+ }
32
+ show() {
33
+ this.decoratee.show();
34
+ }
35
+ hide() {
36
+ this.decoratee.hide();
37
+ }
38
+ createRevision(revisionId) {
39
+ return this.decoratee.createRevision(revisionId);
40
+ }
41
+ publishRevision(revisionId) {
42
+ return this.decoratee.publishRevision(revisionId);
43
+ }
44
+ unpublishRevision(revisionId) {
45
+ return this.decoratee.unpublishRevision(revisionId);
46
+ }
47
+ updateRevisionNote(revisionId, currentDescription) {
48
+ return this.decoratee.updateRevisionNote(revisionId, currentDescription);
49
+ }
50
+ deleteRevision(revisionId) {
51
+ return this.decoratee.deleteRevision(revisionId);
52
+ }
53
+ dispose() {
54
+ this.decoratee.dispose();
55
+ }
56
+ }
57
+ const CmsRevisionsListPresenterDecorator = RevisionsListPresenter.createDecorator({
58
+ decorator: CmsRevisionsListPresenterWithReview,
59
+ dependencies: [
60
+ CmsModelContext,
61
+ CmsEntryReview
62
+ ]
63
+ });
64
+ export { CmsRevisionsListPresenterDecorator };
65
+
66
+ //# sourceMappingURL=CmsRevisionsListPresenterDecorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/CmsRevisionsListPresenterDecorator.js","sources":["../../src/presentation/CmsRevisionsListPresenterDecorator.ts"],"sourcesContent":["import { makeAutoObservable } from \"mobx\";\nimport type { CmsContentEntry } from \"@webiny/app-headless-cms/types.js\";\nimport { CmsModelContext } from \"@webiny/app-headless-cms/features/contentEntry/abstractions.js\";\nimport { RevisionsListPresenter } from \"@webiny/app-headless-cms/presentation/contentEntries/revisionsList/abstractions.js\";\nimport { CmsEntryReview } from \"~/features/editorReview/abstractions.js\";\nimport { isReviewableModel } from \"~/utils/isReviewableModel.js\";\n\n/*\n * Publishing a revision straight from the revisions drawer would bypass the review: on a\n * reviewable model the drawer only offers Publish when the model has no workflow. While the review\n * state loads, fails or a workflow exists, the review bar's Publish is the only one, as in the\n * Website Builder drawer. Unpublish is not review-gated (D121), so it stays as the base computes it.\n */\nclass CmsRevisionsListPresenterWithReview implements RevisionsListPresenter.Interface {\n public constructor(\n private modelContext: CmsModelContext.Interface,\n private session: CmsEntryReview.Interface,\n private decoratee: RevisionsListPresenter.Interface\n ) {\n makeAutoObservable<this, \"modelContext\" | \"session\" | \"decoratee\">(this, {\n modelContext: false,\n session: false,\n decoratee: false\n });\n }\n\n public get vm(): RevisionsListPresenter.ViewModel {\n const vm = this.decoratee.vm;\n if (!isReviewableModel(this.modelContext.getModel())) {\n return vm;\n }\n const noWorkflow = this.session.presenter.vm.status === \"noWorkflow\";\n\n return {\n ...vm,\n items: vm.items.map(item => {\n return {\n ...item,\n canPublish: item.canPublish && noWorkflow\n };\n })\n };\n }\n\n public init(entryId: string): Promise<void> {\n return this.decoratee.init(entryId);\n }\n\n public show(): void {\n this.decoratee.show();\n }\n\n public hide(): void {\n this.decoratee.hide();\n }\n\n public createRevision(revisionId: string): Promise<CmsContentEntry | null> {\n return this.decoratee.createRevision(revisionId);\n }\n\n public publishRevision(revisionId: string): Promise<boolean> {\n return this.decoratee.publishRevision(revisionId);\n }\n\n public unpublishRevision(revisionId: string): Promise<boolean> {\n return this.decoratee.unpublishRevision(revisionId);\n }\n\n public updateRevisionNote(revisionId: string, currentDescription: string): Promise<boolean> {\n return this.decoratee.updateRevisionNote(revisionId, currentDescription);\n }\n\n public deleteRevision(revisionId: string): Promise<boolean> {\n return this.decoratee.deleteRevision(revisionId);\n }\n\n public dispose(): void {\n this.decoratee.dispose();\n }\n}\n\nexport const CmsRevisionsListPresenterDecorator = RevisionsListPresenter.createDecorator({\n decorator: CmsRevisionsListPresenterWithReview,\n dependencies: [CmsModelContext, CmsEntryReview]\n});\n"],"names":["CmsRevisionsListPresenterWithReview","modelContext","session","decoratee","makeAutoObservable","vm","isReviewableModel","noWorkflow","item","entryId","revisionId","currentDescription","CmsRevisionsListPresenterDecorator","RevisionsListPresenter","CmsModelContext","CmsEntryReview"],"mappings":";;;;;AAaA,MAAMA;IACF,YACYC,YAAuC,EACvCC,OAAiC,EACjCC,SAA2C,CACrD;aAHUF,YAAY,GAAZA;aACAC,OAAO,GAAPA;aACAC,SAAS,GAATA;QAERC,mBAAmE,IAAI,EAAE;YACrE,cAAc;YACd,SAAS;YACT,WAAW;QACf;IACJ;IAEA,IAAW,KAAuC;QAC9C,MAAMC,KAAK,IAAI,CAAC,SAAS,CAAC,EAAE;QAC5B,IAAI,CAACC,kBAAkB,IAAI,CAAC,YAAY,CAAC,QAAQ,KAC7C,OAAOD;QAEX,MAAME,aAAa,AAAqC,iBAArC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM;QAEnD,OAAO;YACH,GAAGF,EAAE;YACL,OAAOA,GAAG,KAAK,CAAC,GAAG,CAACG,CAAAA,OACT;oBACH,GAAGA,IAAI;oBACP,YAAYA,KAAK,UAAU,IAAID;gBACnC;QAER;IACJ;IAEO,KAAKE,OAAe,EAAiB;QACxC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAACA;IAC/B;IAEO,OAAa;QAChB,IAAI,CAAC,SAAS,CAAC,IAAI;IACvB;IAEO,OAAa;QAChB,IAAI,CAAC,SAAS,CAAC,IAAI;IACvB;IAEO,eAAeC,UAAkB,EAAmC;QACvE,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAACA;IACzC;IAEO,gBAAgBA,UAAkB,EAAoB;QACzD,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAACA;IAC1C;IAEO,kBAAkBA,UAAkB,EAAoB;QAC3D,OAAO,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAACA;IAC5C;IAEO,mBAAmBA,UAAkB,EAAEC,kBAA0B,EAAoB;QACxF,OAAO,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAACD,YAAYC;IACzD;IAEO,eAAeD,UAAkB,EAAoB;QACxD,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAACA;IACzC;IAEO,UAAgB;QACnB,IAAI,CAAC,SAAS,CAAC,OAAO;IAC1B;AACJ;AAEO,MAAME,qCAAqCC,uBAAuB,eAAe,CAAC;IACrF,WAAWb;IACX,cAAc;QAACc;QAAiBC;KAAe;AACnD"}