@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 @@
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"}
@@ -0,0 +1,8 @@
1
+ import { GetEntryGraphQLFieldSelection } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
2
+ declare class CmsReviewGetEntryFieldSelectionImpl implements GetEntryGraphQLFieldSelection.Interface {
3
+ getSelection(): string[];
4
+ }
5
+ export declare const CmsReviewGetEntryFieldSelection: typeof CmsReviewGetEntryFieldSelectionImpl & {
6
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/app-headless-cms/features/contentEntry/getEntry/abstractions").IGetEntryGraphQLFieldSelection>;
7
+ };
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"}
@@ -0,0 +1,8 @@
1
+ import { ListEntriesGraphQLFieldSelection } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
2
+ declare class CmsReviewListEntriesFieldSelectionImpl implements ListEntriesGraphQLFieldSelection.Interface {
3
+ getSelection(): string[];
4
+ }
5
+ export declare const CmsReviewListEntriesFieldSelection: typeof CmsReviewListEntriesFieldSelectionImpl & {
6
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/app-headless-cms/features/contentEntry/listEntries/abstractions").IListEntriesGraphQLFieldSelection>;
7
+ };
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"}
@@ -0,0 +1,11 @@
1
+ import { TableRowMapper } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
2
+ import type { CmsContentEntry } from "@webiny/app-headless-cms-common/types/index.js";
3
+ declare class CmsReviewTableRowMapper implements TableRowMapper.Interface {
4
+ private readonly decoratee;
5
+ constructor(decoratee: TableRowMapper.Interface);
6
+ fromEntry(entry: CmsContentEntry): TableRowMapper.EntryTableRow;
7
+ }
8
+ export declare const CmsReviewTableRowMapperDecorator: typeof CmsReviewTableRowMapper & {
9
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/app-headless-cms/presentation/contentEntries/views/Table/abstractions").ITableRowMapper>;
10
+ };
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"}