@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,174 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { Container } from "@webiny/di";
3
+ import { CmsModelContext } from "@webiny/app-headless-cms/features/contentEntry/abstractions.js";
4
+ import { RevisionsListPresenter } from "@webiny/app-headless-cms/presentation/contentEntries/revisionsList/abstractions.js";
5
+ import { CmsEntryReview } from "../features/editorReview/abstractions.js";
6
+ import { createEntrySession } from "../testing/createEntrySession.js";
7
+ import { MODEL, SINGLETON_MODEL } from "../testing/models.js";
8
+ import { BOUND_NO_REVIEW, FAILED, IN_REVIEW, LOADING, NO_WORKFLOW } from "../testing/reviewStates.js";
9
+ import { CmsWorkflowsFeature } from "./feature.js";
10
+ import { CmsRevisionsListPresenterDecorator } from "./CmsRevisionsListPresenterDecorator.js";
11
+ const DRAFT = {
12
+ id: "entry-1#0002",
13
+ meta: {
14
+ status: "draft"
15
+ }
16
+ };
17
+ const PUBLISHED = {
18
+ id: "entry-1#0001",
19
+ meta: {
20
+ status: "published"
21
+ }
22
+ };
23
+ const init = vi.fn(async ()=>void 0);
24
+ class BaseRevisionsListPresenter {
25
+ get vm() {
26
+ return {
27
+ loading: false,
28
+ revisions: [
29
+ DRAFT,
30
+ PUBLISHED
31
+ ],
32
+ items: [
33
+ {
34
+ revision: DRAFT,
35
+ canPublish: true,
36
+ canUnpublish: false
37
+ },
38
+ {
39
+ revision: PUBLISHED,
40
+ canPublish: false,
41
+ canUnpublish: true
42
+ }
43
+ ],
44
+ visible: true
45
+ };
46
+ }
47
+ constructor(){
48
+ this.init = init;
49
+ this.show = vi.fn();
50
+ this.hide = vi.fn();
51
+ this.createRevision = vi.fn(async ()=>null);
52
+ this.publishRevision = vi.fn(async ()=>true);
53
+ this.unpublishRevision = vi.fn(async ()=>true);
54
+ this.updateRevisionNote = vi.fn(async ()=>true);
55
+ this.deleteRevision = vi.fn(async ()=>true);
56
+ this.dispose = vi.fn();
57
+ }
58
+ }
59
+ const BasePresenter = RevisionsListPresenter.createImplementation({
60
+ implementation: BaseRevisionsListPresenter,
61
+ dependencies: []
62
+ });
63
+ const registerDecorator = (container)=>{
64
+ container.registerDecorator(CmsRevisionsListPresenterDecorator);
65
+ };
66
+ const resolvePresenter = (model, review, register = registerDecorator)=>{
67
+ const fake = createEntrySession(review);
68
+ const container = new Container();
69
+ container.registerInstance(CmsEntryReview, fake.session);
70
+ container.registerInstance(CmsModelContext, {
71
+ getModel: ()=>model,
72
+ setModel: vi.fn()
73
+ });
74
+ container.register(BasePresenter).inSingletonScope();
75
+ register(container);
76
+ return {
77
+ ...fake,
78
+ presenter: container.resolve(RevisionsListPresenter)
79
+ };
80
+ };
81
+ const flags = (presenter)=>presenter.vm.items.map((item)=>[
82
+ item.canPublish,
83
+ item.canUnpublish
84
+ ]);
85
+ describe("CmsRevisionsListPresenterDecorator", ()=>{
86
+ it("keeps Publish and Unpublish on a model without a workflow", ()=>{
87
+ const { presenter } = resolvePresenter(MODEL, NO_WORKFLOW);
88
+ expect(flags(presenter)).toEqual([
89
+ [
90
+ true,
91
+ false
92
+ ],
93
+ [
94
+ false,
95
+ true
96
+ ]
97
+ ]);
98
+ });
99
+ it.each([
100
+ [
101
+ "bound without a review",
102
+ BOUND_NO_REVIEW
103
+ ],
104
+ [
105
+ "in review",
106
+ IN_REVIEW
107
+ ],
108
+ [
109
+ "loading",
110
+ LOADING
111
+ ],
112
+ [
113
+ "failed",
114
+ FAILED
115
+ ]
116
+ ])("hides Publish but keeps Unpublish on a workflow model (%s)", (_name, review)=>{
117
+ const { presenter } = resolvePresenter(MODEL, review);
118
+ expect(flags(presenter)).toEqual([
119
+ [
120
+ false,
121
+ false
122
+ ],
123
+ [
124
+ false,
125
+ true
126
+ ]
127
+ ]);
128
+ expect(presenter.vm.revisions).toEqual([
129
+ DRAFT,
130
+ PUBLISHED
131
+ ]);
132
+ });
133
+ it("leaves a singleton model alone, it is never bound to a workflow", ()=>{
134
+ const { presenter } = resolvePresenter(SINGLETON_MODEL, LOADING);
135
+ expect(flags(presenter)).toEqual([
136
+ [
137
+ true,
138
+ false
139
+ ],
140
+ [
141
+ false,
142
+ true
143
+ ]
144
+ ]);
145
+ });
146
+ it("is registered by the CMS workflows feature", ()=>{
147
+ const { presenter } = resolvePresenter(MODEL, BOUND_NO_REVIEW, (container)=>{
148
+ CmsWorkflowsFeature.register(container);
149
+ });
150
+ expect(flags(presenter)).toEqual([
151
+ [
152
+ false,
153
+ false
154
+ ],
155
+ [
156
+ false,
157
+ true
158
+ ]
159
+ ]);
160
+ });
161
+ it("follows the review state as it loads", ()=>{
162
+ const { presenter, setVm } = resolvePresenter(MODEL, LOADING);
163
+ expect(presenter.vm.items[0].canPublish).toBe(false);
164
+ setVm(NO_WORKFLOW);
165
+ expect(presenter.vm.items[0].canPublish).toBe(true);
166
+ });
167
+ it("passes the actions to the base presenter", async ()=>{
168
+ const { presenter } = resolvePresenter(MODEL, NO_WORKFLOW);
169
+ await presenter.init("entry-1");
170
+ expect(init).toHaveBeenCalledWith("entry-1");
171
+ });
172
+ });
173
+
174
+ //# sourceMappingURL=CmsRevisionsListPresenterDecorator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/CmsRevisionsListPresenterDecorator.test.js","sources":["../../src/presentation/CmsRevisionsListPresenterDecorator.test.ts"],"sourcesContent":["import { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { vi } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport type { CmsContentEntryRevision } from \"@webiny/app-headless-cms/types.js\";\nimport type { CmsModel } from \"@webiny/app-headless-cms-common/types/index.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 { createEntrySession } from \"~/testing/createEntrySession.js\";\nimport { MODEL } from \"~/testing/models.js\";\nimport { SINGLETON_MODEL } from \"~/testing/models.js\";\nimport { BOUND_NO_REVIEW } from \"~/testing/reviewStates.js\";\nimport { FAILED } from \"~/testing/reviewStates.js\";\nimport { IN_REVIEW } from \"~/testing/reviewStates.js\";\nimport { LOADING } from \"~/testing/reviewStates.js\";\nimport { NO_WORKFLOW } from \"~/testing/reviewStates.js\";\nimport { CmsWorkflowsFeature } from \"~/presentation/feature.js\";\nimport { CmsRevisionsListPresenterDecorator } from \"./CmsRevisionsListPresenterDecorator.js\";\n\nconst DRAFT = { id: \"entry-1#0002\", meta: { status: \"draft\" } } as CmsContentEntryRevision;\nconst PUBLISHED = { id: \"entry-1#0001\", meta: { status: \"published\" } } as CmsContentEntryRevision;\n\nconst init = vi.fn(async () => undefined);\n\nclass BaseRevisionsListPresenter implements RevisionsListPresenter.Interface {\n public get vm(): RevisionsListPresenter.ViewModel {\n return {\n loading: false,\n revisions: [DRAFT, PUBLISHED],\n items: [\n { revision: DRAFT, canPublish: true, canUnpublish: false },\n { revision: PUBLISHED, canPublish: false, canUnpublish: true }\n ],\n visible: true\n };\n }\n\n public init = init;\n public show = vi.fn();\n public hide = vi.fn();\n public createRevision = vi.fn(async () => null);\n public publishRevision = vi.fn(async () => true);\n public unpublishRevision = vi.fn(async () => true);\n public updateRevisionNote = vi.fn(async () => true);\n public deleteRevision = vi.fn(async () => true);\n public dispose = vi.fn();\n}\n\nconst BasePresenter = RevisionsListPresenter.createImplementation({\n implementation: BaseRevisionsListPresenter,\n dependencies: []\n});\n\nconst registerDecorator = (container: Container): void => {\n container.registerDecorator(CmsRevisionsListPresenterDecorator);\n};\n\nconst resolvePresenter = (\n model: CmsModel,\n review: Parameters<typeof createEntrySession>[0],\n register: (container: Container) => void = registerDecorator\n) => {\n const fake = createEntrySession(review);\n const container = new Container();\n container.registerInstance(CmsEntryReview, fake.session);\n container.registerInstance(CmsModelContext, { getModel: () => model, setModel: vi.fn() });\n container.register(BasePresenter).inSingletonScope();\n register(container);\n return { ...fake, presenter: container.resolve(RevisionsListPresenter) };\n};\n\nconst flags = (presenter: RevisionsListPresenter.Interface) => {\n return presenter.vm.items.map(item => [item.canPublish, item.canUnpublish]);\n};\n\ndescribe(\"CmsRevisionsListPresenterDecorator\", () => {\n it(\"keeps Publish and Unpublish on a model without a workflow\", () => {\n const { presenter } = resolvePresenter(MODEL, NO_WORKFLOW);\n\n expect(flags(presenter)).toEqual([\n [true, false],\n [false, true]\n ]);\n });\n\n it.each([\n [\"bound without a review\", BOUND_NO_REVIEW],\n [\"in review\", IN_REVIEW],\n [\"loading\", LOADING],\n [\"failed\", FAILED]\n ])(\"hides Publish but keeps Unpublish on a workflow model (%s)\", (_name, review) => {\n const { presenter } = resolvePresenter(MODEL, review);\n\n expect(flags(presenter)).toEqual([\n [false, false],\n [false, true]\n ]);\n expect(presenter.vm.revisions).toEqual([DRAFT, PUBLISHED]);\n });\n\n it(\"leaves a singleton model alone, it is never bound to a workflow\", () => {\n const { presenter } = resolvePresenter(SINGLETON_MODEL, LOADING);\n\n expect(flags(presenter)).toEqual([\n [true, false],\n [false, true]\n ]);\n });\n\n it(\"is registered by the CMS workflows feature\", () => {\n const { presenter } = resolvePresenter(MODEL, BOUND_NO_REVIEW, container => {\n CmsWorkflowsFeature.register(container);\n });\n\n expect(flags(presenter)).toEqual([\n [false, false],\n [false, true]\n ]);\n });\n\n it(\"follows the review state as it loads\", () => {\n const { presenter, setVm } = resolvePresenter(MODEL, LOADING);\n expect(presenter.vm.items[0].canPublish).toBe(false);\n\n setVm(NO_WORKFLOW);\n\n expect(presenter.vm.items[0].canPublish).toBe(true);\n });\n\n it(\"passes the actions to the base presenter\", async () => {\n const { presenter } = resolvePresenter(MODEL, NO_WORKFLOW);\n\n await presenter.init(\"entry-1\");\n\n expect(init).toHaveBeenCalledWith(\"entry-1\");\n });\n});\n"],"names":["DRAFT","PUBLISHED","init","vi","undefined","BaseRevisionsListPresenter","BasePresenter","RevisionsListPresenter","registerDecorator","container","CmsRevisionsListPresenterDecorator","resolvePresenter","model","review","register","fake","createEntrySession","Container","CmsEntryReview","CmsModelContext","flags","presenter","item","describe","it","MODEL","NO_WORKFLOW","expect","BOUND_NO_REVIEW","IN_REVIEW","LOADING","FAILED","_name","SINGLETON_MODEL","CmsWorkflowsFeature","setVm"],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { ListModelsUseCase } from "@webiny/app-headless-cms/features/model/listModels/abstractions.js";
2
+ import { Notifications } from "@webiny/app-admin/features/notifications/abstractions.js";
3
+ import { IdentityContext } from "@webiny/app-admin/features/security/IdentityContext/abstractions.js";
4
+ import { CmsContentReviewsPresenter as Abstraction } from "./abstractions.js";
5
+ declare class CmsContentReviewsPresenterImpl implements Abstraction.Interface {
6
+ private listModels;
7
+ private notifications;
8
+ private identityContext;
9
+ private _loading;
10
+ private _contentTypes;
11
+ private loadedFor;
12
+ private pendingFor;
13
+ private pending;
14
+ private stopWatching;
15
+ constructor(listModels: ListModelsUseCase.Interface, notifications: Notifications.Interface, identityContext: IdentityContext.Interface);
16
+ get vm(): Abstraction.ViewModel;
17
+ init(): Promise<void>;
18
+ dispose(): void;
19
+ private signedInUserId;
20
+ private loadFor;
21
+ private load;
22
+ private applyModels;
23
+ private applyFailure;
24
+ }
25
+ export declare const CmsContentReviewsPresenter: typeof CmsContentReviewsPresenterImpl & {
26
+ __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").ICmsContentReviewsPresenter>;
27
+ };
28
+ export {};
@@ -0,0 +1,103 @@
1
+ import { makeAutoObservable, reaction } from "mobx";
2
+ import { ListModelsUseCase } from "@webiny/app-headless-cms/features/model/listModels/abstractions.js";
3
+ import { Notifications } from "@webiny/app-admin/features/notifications/abstractions.js";
4
+ import { IdentityContext } from "@webiny/app-admin/features/security/IdentityContext/abstractions.js";
5
+ import { createAppName } from "../../utils/appName.js";
6
+ import { CmsContentReviewsPresenter } from "./abstractions.js";
7
+ import { toContentTypes } from "./toContentTypes.js";
8
+ class CmsContentReviewsPresenterImpl {
9
+ constructor(listModels, notifications, identityContext){
10
+ this.listModels = listModels;
11
+ this.notifications = notifications;
12
+ this.identityContext = identityContext;
13
+ this._loading = true;
14
+ this._contentTypes = [];
15
+ this.loadedFor = null;
16
+ this.pendingFor = null;
17
+ this.pending = null;
18
+ this.stopWatching = null;
19
+ makeAutoObservable(this, {
20
+ listModels: false,
21
+ notifications: false,
22
+ identityContext: false,
23
+ pending: false,
24
+ stopWatching: false
25
+ });
26
+ }
27
+ get vm() {
28
+ const namespaces = this._contentTypes.map((contentType)=>createAppName(contentType));
29
+ const options = this._contentTypes.map((contentType)=>({
30
+ label: contentType.name,
31
+ value: contentType.modelId,
32
+ app: "cms",
33
+ icon: "devices_other"
34
+ }));
35
+ return {
36
+ loading: this._loading,
37
+ namespaces,
38
+ options
39
+ };
40
+ }
41
+ init() {
42
+ if (!this.stopWatching) this.stopWatching = reaction(()=>this.signedInUserId(), (userId)=>{
43
+ this.loadFor(userId);
44
+ });
45
+ return this.loadFor(this.signedInUserId());
46
+ }
47
+ dispose() {
48
+ if (this.stopWatching) this.stopWatching();
49
+ this.stopWatching = null;
50
+ }
51
+ signedInUserId() {
52
+ const identity = this.identityContext.getIdentity();
53
+ if (!identity.isAuthenticated) return null;
54
+ return identity.id;
55
+ }
56
+ loadFor(userId) {
57
+ if (null === userId) return Promise.resolve();
58
+ if (this.loadedFor === userId) return Promise.resolve();
59
+ if (this.pending && this.pendingFor === userId) return this.pending;
60
+ this.pendingFor = userId;
61
+ this.pending = this.load(userId);
62
+ return this.pending;
63
+ }
64
+ async load(userId) {
65
+ try {
66
+ const models = await this.listModels.execute();
67
+ this.applyModels(userId, models);
68
+ } catch (error) {
69
+ this.applyFailure(userId, error);
70
+ }
71
+ }
72
+ applyModels(userId, models) {
73
+ if (this.pendingFor !== userId) return;
74
+ this.pending = null;
75
+ this.pendingFor = null;
76
+ this.loadedFor = userId;
77
+ this._contentTypes = toContentTypes(models);
78
+ this._loading = false;
79
+ }
80
+ applyFailure(userId, error) {
81
+ if (this.pendingFor !== userId) return;
82
+ this.pending = null;
83
+ this.pendingFor = null;
84
+ this._contentTypes = [];
85
+ this._loading = false;
86
+ console.error("[CmsContentReviewsPresenter] Could not load the content types.", error);
87
+ this.notifications.error({
88
+ title: "Could not load the content types",
89
+ description: "Content Reviews will not update live. Reload the page to try again."
90
+ });
91
+ }
92
+ }
93
+ const CmsContentReviewsPresenter_CmsContentReviewsPresenter = CmsContentReviewsPresenter.createImplementation({
94
+ implementation: CmsContentReviewsPresenterImpl,
95
+ dependencies: [
96
+ ListModelsUseCase,
97
+ Notifications,
98
+ IdentityContext
99
+ ]
100
+ });
101
+ export { CmsContentReviewsPresenter_CmsContentReviewsPresenter as CmsContentReviewsPresenter };
102
+
103
+ //# sourceMappingURL=CmsContentReviewsPresenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/contentReviews/CmsContentReviewsPresenter.js","sources":["../../../src/presentation/contentReviews/CmsContentReviewsPresenter.ts"],"sourcesContent":["import { makeAutoObservable } from \"mobx\";\nimport { reaction } from \"mobx\";\nimport { ListModelsUseCase } from \"@webiny/app-headless-cms/features/model/listModels/abstractions.js\";\nimport { Notifications } from \"@webiny/app-admin/features/notifications/abstractions.js\";\nimport { IdentityContext } from \"@webiny/app-admin/features/security/IdentityContext/abstractions.js\";\nimport { createAppName } from \"~/utils/appName.js\";\nimport { CmsContentReviewsPresenter as Abstraction } from \"./abstractions.js\";\nimport type { CmsContentTypeOption } from \"./abstractions.js\";\nimport type { ContentType } from \"./abstractions.js\";\nimport type { ListedModel } from \"./abstractions.js\";\nimport { toContentTypes } from \"./toContentTypes.js\";\n\ntype PrivateMembers =\n | \"listModels\"\n | \"notifications\"\n | \"identityContext\"\n | \"pending\"\n | \"stopWatching\";\n\nclass CmsContentReviewsPresenterImpl implements Abstraction.Interface {\n private _loading = true;\n private _contentTypes: ContentType[] = [];\n // The signed-in user the model list was loaded for; a failed list leaves it empty to retry.\n private loadedFor: string | null = null;\n private pendingFor: string | null = null;\n private pending: Promise<void> | null = null;\n private stopWatching: (() => void) | null = null;\n\n constructor(\n private listModels: ListModelsUseCase.Interface,\n private notifications: Notifications.Interface,\n private identityContext: IdentityContext.Interface\n ) {\n makeAutoObservable<CmsContentReviewsPresenterImpl, PrivateMembers>(this, {\n listModels: false,\n notifications: false,\n identityContext: false,\n pending: false,\n stopWatching: false\n });\n }\n\n get vm(): Abstraction.ViewModel {\n const namespaces = this._contentTypes.map(contentType => {\n return createAppName(contentType);\n });\n const options: CmsContentTypeOption[] = this._contentTypes.map(contentType => {\n return {\n label: contentType.name,\n value: contentType.modelId,\n app: \"cms\",\n icon: \"devices_other\"\n };\n });\n\n return { loading: this._loading, namespaces, options };\n }\n\n /*\n * The model list needs a signed-in user: the presenter is mounted at the app root, before\n * sign-in completes. It loads once there is one and again when a user signs in after a failure.\n */\n init(): Promise<void> {\n if (!this.stopWatching) {\n this.stopWatching = reaction(\n () => this.signedInUserId(),\n userId => {\n void this.loadFor(userId);\n }\n );\n }\n return this.loadFor(this.signedInUserId());\n }\n\n dispose(): void {\n if (this.stopWatching) {\n this.stopWatching();\n }\n this.stopWatching = null;\n }\n\n private signedInUserId(): string | null {\n const identity = this.identityContext.getIdentity();\n if (!identity.isAuthenticated) {\n return null;\n }\n return identity.id;\n }\n\n private loadFor(userId: string | null): Promise<void> {\n // No one is signed in yet: the API would refuse the list.\n if (userId === null) {\n return Promise.resolve();\n }\n if (this.loadedFor === userId) {\n return Promise.resolve();\n }\n // StrictMode runs effects twice; one list is in flight per user.\n if (this.pending && this.pendingFor === userId) {\n return this.pending;\n }\n this.pendingFor = userId;\n this.pending = this.load(userId);\n return this.pending;\n }\n\n private async load(userId: string): Promise<void> {\n try {\n const models = await this.listModels.execute();\n this.applyModels(userId, models);\n } catch (error) {\n this.applyFailure(userId, error);\n }\n }\n\n private applyModels(userId: string, models: ListedModel[]): void {\n // A newer user's list owns the state now.\n if (this.pendingFor !== userId) {\n return;\n }\n this.pending = null;\n this.pendingFor = null;\n this.loadedFor = userId;\n this._contentTypes = toContentTypes(models);\n this._loading = false;\n }\n\n private applyFailure(userId: string, error: unknown): void {\n if (this.pendingFor !== userId) {\n return;\n }\n this.pending = null;\n this.pendingFor = null;\n this._contentTypes = [];\n this._loading = false;\n console.error(\"[CmsContentReviewsPresenter] Could not load the content types.\", error);\n // Without the model list the list has no namespaces to follow: say so once per attempt.\n this.notifications.error({\n title: \"Could not load the content types\",\n description: \"Content Reviews will not update live. Reload the page to try again.\"\n });\n }\n}\n\nexport const CmsContentReviewsPresenter = Abstraction.createImplementation({\n implementation: CmsContentReviewsPresenterImpl,\n dependencies: [ListModelsUseCase, Notifications, IdentityContext]\n});\n"],"names":["CmsContentReviewsPresenterImpl","listModels","notifications","identityContext","makeAutoObservable","namespaces","contentType","createAppName","options","reaction","userId","identity","Promise","models","error","toContentTypes","console","CmsContentReviewsPresenter","Abstraction","ListModelsUseCase","Notifications","IdentityContext"],"mappings":"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"}
@@ -0,0 +1,238 @@
1
+ import { afterEach, describe, expect, it, vi } from "vitest";
2
+ import { Container } from "@webiny/di";
3
+ import { ListModelsUseCase } from "@webiny/app-headless-cms/features/model/listModels/abstractions.js";
4
+ import { Notifications } from "@webiny/app-admin/features/notifications/abstractions.js";
5
+ import { IdentityContextFeature } from "@webiny/app-admin/features/security/IdentityContext/feature.js";
6
+ import { IdentityContext } from "@webiny/app-admin/features/security/IdentityContext/abstractions.js";
7
+ import { Identity } from "@webiny/app-admin/domain/Identity.js";
8
+ import { CmsContentReviewsPresenter } from "./abstractions.js";
9
+ import { CmsContentReviewsPresenterFeature } from "./feature.js";
10
+ const FAILURE = {
11
+ title: "Could not load the content types",
12
+ description: "Content Reviews will not update live. Reload the page to try again."
13
+ };
14
+ const model = (modelId, name, overrides = {})=>({
15
+ modelId,
16
+ name,
17
+ tags: [],
18
+ ...overrides
19
+ });
20
+ const user = (id)=>Identity.createAuthenticated({
21
+ id,
22
+ type: "admin",
23
+ displayName: "Maja Kos",
24
+ roles: [],
25
+ teams: [],
26
+ permissions: [],
27
+ profile: {
28
+ external: false
29
+ },
30
+ currentTenant: {
31
+ id: "root",
32
+ name: "Root"
33
+ },
34
+ defaultTenant: {
35
+ id: "root",
36
+ name: "Root"
37
+ }
38
+ });
39
+ const flush = async ()=>{
40
+ await new Promise((resolve)=>{
41
+ setTimeout(resolve, 0);
42
+ });
43
+ };
44
+ const setup = (execute, params = {})=>{
45
+ const notifications = {
46
+ notify: vi.fn(),
47
+ success: vi.fn(),
48
+ warning: vi.fn(),
49
+ error: vi.fn()
50
+ };
51
+ const container = new Container();
52
+ container.registerInstance(ListModelsUseCase, {
53
+ execute
54
+ });
55
+ container.registerInstance(Notifications, notifications);
56
+ IdentityContextFeature.register(container);
57
+ const identityContext = container.resolve(IdentityContext);
58
+ if (false !== params.signedIn) identityContext.setIdentity(user("user-1"));
59
+ CmsContentReviewsPresenterFeature.register(container);
60
+ return {
61
+ presenter: container.resolve(CmsContentReviewsPresenter),
62
+ notifications,
63
+ identityContext
64
+ };
65
+ };
66
+ describe("CmsContentReviewsPresenter", ()=>{
67
+ afterEach(()=>{
68
+ vi.restoreAllMocks();
69
+ });
70
+ it("starts loading with nothing", ()=>{
71
+ const { presenter } = setup(()=>new Promise(()=>void 0));
72
+ expect(presenter.vm).toEqual({
73
+ loading: true,
74
+ namespaces: [],
75
+ options: []
76
+ });
77
+ });
78
+ it("exposes the namespaces and filter options of the models a workflow can bind, sorted by name", async ()=>{
79
+ const { presenter, notifications } = setup(async ()=>[
80
+ model("press", "Press release"),
81
+ model("article", "Article"),
82
+ model("hidden", "Hidden", {
83
+ tags: [
84
+ "$publishing:false"
85
+ ]
86
+ }),
87
+ model("gone", "Gone", {
88
+ isBeingDeleted: true
89
+ })
90
+ ]);
91
+ await presenter.init();
92
+ expect(presenter.vm).toEqual({
93
+ loading: false,
94
+ namespaces: [
95
+ "cms.article",
96
+ "cms.press"
97
+ ],
98
+ options: [
99
+ {
100
+ label: "Article",
101
+ value: "article",
102
+ app: "cms",
103
+ icon: "devices_other"
104
+ },
105
+ {
106
+ label: "Press release",
107
+ value: "press",
108
+ app: "cms",
109
+ icon: "devices_other"
110
+ }
111
+ ]
112
+ });
113
+ expect(notifications.error).not.toHaveBeenCalled();
114
+ });
115
+ it("ends loading with nothing, logs the error and tells the viewer once when the list fails", async ()=>{
116
+ const consoleError = vi.spyOn(console, "error").mockImplementation(()=>void 0);
117
+ const error = new Error("network");
118
+ const { presenter, notifications } = setup(()=>Promise.reject(error));
119
+ await presenter.init();
120
+ expect(presenter.vm).toEqual({
121
+ loading: false,
122
+ namespaces: [],
123
+ options: []
124
+ });
125
+ expect(notifications.error).toHaveBeenCalledTimes(1);
126
+ expect(notifications.error).toHaveBeenCalledWith(FAILURE);
127
+ expect(consoleError).toHaveBeenCalledWith("[CmsContentReviewsPresenter] Could not load the content types.", error);
128
+ });
129
+ it("lists the models once when init is called twice", async ()=>{
130
+ const execute = vi.fn(async ()=>[
131
+ model("article", "Article")
132
+ ]);
133
+ const { presenter } = setup(execute);
134
+ await Promise.all([
135
+ presenter.init(),
136
+ presenter.init()
137
+ ]);
138
+ expect(execute).toHaveBeenCalledTimes(1);
139
+ });
140
+ it("lists the models once across a StrictMode init, dispose and init", async ()=>{
141
+ const execute = vi.fn(async ()=>[
142
+ model("article", "Article")
143
+ ]);
144
+ const { presenter } = setup(execute);
145
+ await presenter.init();
146
+ presenter.dispose();
147
+ await presenter.init();
148
+ expect(execute).toHaveBeenCalledTimes(1);
149
+ });
150
+ it("tells the viewer once when init is called twice and the list fails", async ()=>{
151
+ vi.spyOn(console, "error").mockImplementation(()=>void 0);
152
+ const execute = vi.fn(()=>Promise.reject(new Error("network")));
153
+ const { presenter, notifications } = setup(execute);
154
+ await Promise.all([
155
+ presenter.init(),
156
+ presenter.init()
157
+ ]);
158
+ expect(execute).toHaveBeenCalledTimes(1);
159
+ expect(notifications.error).toHaveBeenCalledTimes(1);
160
+ });
161
+ it("lists nothing and says nothing while no one is signed in", async ()=>{
162
+ const execute = vi.fn(async ()=>[
163
+ model("article", "Article")
164
+ ]);
165
+ const { presenter, notifications } = setup(execute, {
166
+ signedIn: false
167
+ });
168
+ await presenter.init();
169
+ await flush();
170
+ expect(execute).not.toHaveBeenCalled();
171
+ expect(notifications.error).not.toHaveBeenCalled();
172
+ expect(presenter.vm).toEqual({
173
+ loading: true,
174
+ namespaces: [],
175
+ options: []
176
+ });
177
+ });
178
+ it("lists the models once when someone signs in", async ()=>{
179
+ const execute = vi.fn(async ()=>[
180
+ model("article", "Article")
181
+ ]);
182
+ const { presenter, identityContext } = setup(execute, {
183
+ signedIn: false
184
+ });
185
+ await presenter.init();
186
+ identityContext.setIdentity(user("user-1"));
187
+ await flush();
188
+ identityContext.setIdentity(user("user-1"));
189
+ await flush();
190
+ expect(execute).toHaveBeenCalledTimes(1);
191
+ expect(presenter.vm).toEqual({
192
+ loading: false,
193
+ namespaces: [
194
+ "cms.article"
195
+ ],
196
+ options: [
197
+ {
198
+ label: "Article",
199
+ value: "article",
200
+ app: "cms",
201
+ icon: "devices_other"
202
+ }
203
+ ]
204
+ });
205
+ });
206
+ it("retries a failed list when the identity changes", async ()=>{
207
+ vi.spyOn(console, "error").mockImplementation(()=>void 0);
208
+ const execute = vi.fn().mockRejectedValueOnce(new Error("network")).mockResolvedValueOnce([
209
+ model("article", "Article")
210
+ ]);
211
+ const { presenter, notifications, identityContext } = setup(execute);
212
+ await presenter.init();
213
+ identityContext.clear();
214
+ identityContext.setIdentity(user("user-1"));
215
+ await flush();
216
+ expect(execute).toHaveBeenCalledTimes(2);
217
+ expect(notifications.error).toHaveBeenCalledTimes(1);
218
+ expect(presenter.vm.namespaces).toEqual([
219
+ "cms.article"
220
+ ]);
221
+ });
222
+ it("retries a failed list on a later init", async ()=>{
223
+ vi.spyOn(console, "error").mockImplementation(()=>void 0);
224
+ const execute = vi.fn().mockRejectedValueOnce(new Error("network")).mockResolvedValueOnce([
225
+ model("article", "Article")
226
+ ]);
227
+ const { presenter } = setup(execute);
228
+ await presenter.init();
229
+ presenter.dispose();
230
+ await presenter.init();
231
+ expect(execute).toHaveBeenCalledTimes(2);
232
+ expect(presenter.vm.namespaces).toEqual([
233
+ "cms.article"
234
+ ]);
235
+ });
236
+ });
237
+
238
+ //# sourceMappingURL=CmsContentReviewsPresenter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/contentReviews/CmsContentReviewsPresenter.test.js","sources":["../../../src/presentation/contentReviews/CmsContentReviewsPresenter.test.ts"],"sourcesContent":["import { afterEach } from \"vitest\";\nimport { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { vi } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { ListModelsUseCase } from \"@webiny/app-headless-cms/features/model/listModels/abstractions.js\";\nimport { Notifications } from \"@webiny/app-admin/features/notifications/abstractions.js\";\nimport { IdentityContextFeature } from \"@webiny/app-admin/features/security/IdentityContext/feature.js\";\nimport { IdentityContext } from \"@webiny/app-admin/features/security/IdentityContext/abstractions.js\";\nimport { Identity } from \"@webiny/app-admin/domain/Identity.js\";\nimport { CmsContentReviewsPresenter } from \"./abstractions.js\";\nimport type { ListedModel } from \"./abstractions.js\";\nimport { CmsContentReviewsPresenterFeature } from \"./feature.js\";\n\nconst FAILURE = {\n title: \"Could not load the content types\",\n description: \"Content Reviews will not update live. Reload the page to try again.\"\n};\n\nconst model = (\n modelId: string,\n name: string,\n overrides: Partial<ListedModel> = {}\n): ListedModel => {\n return { modelId, name, tags: [], ...overrides };\n};\n\nconst user = (id: string): Identity => {\n return Identity.createAuthenticated({\n id,\n type: \"admin\",\n displayName: \"Maja Kos\",\n roles: [],\n teams: [],\n permissions: [],\n profile: { external: false },\n currentTenant: { id: \"root\", name: \"Root\" },\n defaultTenant: { id: \"root\", name: \"Root\" }\n });\n};\n\nconst flush = async (): Promise<void> => {\n await new Promise(resolve => {\n setTimeout(resolve, 0);\n });\n};\n\ninterface SetupParams {\n signedIn?: boolean;\n}\n\nconst setup = (execute: () => Promise<ListedModel[]>, params: SetupParams = {}) => {\n const notifications = { notify: vi.fn(), success: vi.fn(), warning: vi.fn(), error: vi.fn() };\n const container = new Container();\n container.registerInstance(ListModelsUseCase, {\n execute\n } as unknown as ListModelsUseCase.Interface);\n container.registerInstance(Notifications, notifications as unknown as Notifications.Interface);\n IdentityContextFeature.register(container);\n const identityContext = container.resolve(IdentityContext);\n if (params.signedIn !== false) {\n identityContext.setIdentity(user(\"user-1\"));\n }\n CmsContentReviewsPresenterFeature.register(container);\n return {\n presenter: container.resolve(CmsContentReviewsPresenter),\n notifications,\n identityContext\n };\n};\n\ndescribe(\"CmsContentReviewsPresenter\", () => {\n afterEach(() => {\n vi.restoreAllMocks();\n });\n\n it(\"starts loading with nothing\", () => {\n const { presenter } = setup(() => new Promise(() => undefined));\n\n expect(presenter.vm).toEqual({ loading: true, namespaces: [], options: [] });\n });\n\n it(\"exposes the namespaces and filter options of the models a workflow can bind, sorted by name\", async () => {\n const { presenter, notifications } = setup(async () => [\n model(\"press\", \"Press release\"),\n model(\"article\", \"Article\"),\n model(\"hidden\", \"Hidden\", { tags: [\"$publishing:false\"] }),\n model(\"gone\", \"Gone\", { isBeingDeleted: true })\n ]);\n\n await presenter.init();\n\n expect(presenter.vm).toEqual({\n loading: false,\n namespaces: [\"cms.article\", \"cms.press\"],\n options: [\n { label: \"Article\", value: \"article\", app: \"cms\", icon: \"devices_other\" },\n { label: \"Press release\", value: \"press\", app: \"cms\", icon: \"devices_other\" }\n ]\n });\n expect(notifications.error).not.toHaveBeenCalled();\n });\n\n it(\"ends loading with nothing, logs the error and tells the viewer once when the list fails\", async () => {\n const consoleError = vi.spyOn(console, \"error\").mockImplementation(() => undefined);\n const error = new Error(\"network\");\n const { presenter, notifications } = setup(() => Promise.reject(error));\n\n await presenter.init();\n\n expect(presenter.vm).toEqual({ loading: false, namespaces: [], options: [] });\n expect(notifications.error).toHaveBeenCalledTimes(1);\n expect(notifications.error).toHaveBeenCalledWith(FAILURE);\n expect(consoleError).toHaveBeenCalledWith(\n \"[CmsContentReviewsPresenter] Could not load the content types.\",\n error\n );\n });\n\n it(\"lists the models once when init is called twice\", async () => {\n const execute = vi.fn(async () => [model(\"article\", \"Article\")]);\n const { presenter } = setup(execute);\n\n await Promise.all([presenter.init(), presenter.init()]);\n\n expect(execute).toHaveBeenCalledTimes(1);\n });\n\n it(\"lists the models once across a StrictMode init, dispose and init\", async () => {\n const execute = vi.fn(async () => [model(\"article\", \"Article\")]);\n const { presenter } = setup(execute);\n\n await presenter.init();\n presenter.dispose();\n await presenter.init();\n\n expect(execute).toHaveBeenCalledTimes(1);\n });\n\n it(\"tells the viewer once when init is called twice and the list fails\", async () => {\n vi.spyOn(console, \"error\").mockImplementation(() => undefined);\n const execute = vi.fn(() => Promise.reject(new Error(\"network\")));\n const { presenter, notifications } = setup(execute);\n\n await Promise.all([presenter.init(), presenter.init()]);\n\n expect(execute).toHaveBeenCalledTimes(1);\n expect(notifications.error).toHaveBeenCalledTimes(1);\n });\n\n it(\"lists nothing and says nothing while no one is signed in\", async () => {\n const execute = vi.fn(async () => [model(\"article\", \"Article\")]);\n const { presenter, notifications } = setup(execute, { signedIn: false });\n\n await presenter.init();\n await flush();\n\n expect(execute).not.toHaveBeenCalled();\n expect(notifications.error).not.toHaveBeenCalled();\n expect(presenter.vm).toEqual({ loading: true, namespaces: [], options: [] });\n });\n\n it(\"lists the models once when someone signs in\", async () => {\n const execute = vi.fn(async () => [model(\"article\", \"Article\")]);\n const { presenter, identityContext } = setup(execute, { signedIn: false });\n\n await presenter.init();\n identityContext.setIdentity(user(\"user-1\"));\n await flush();\n identityContext.setIdentity(user(\"user-1\"));\n await flush();\n\n expect(execute).toHaveBeenCalledTimes(1);\n expect(presenter.vm).toEqual({\n loading: false,\n namespaces: [\"cms.article\"],\n options: [{ label: \"Article\", value: \"article\", app: \"cms\", icon: \"devices_other\" }]\n });\n });\n\n it(\"retries a failed list when the identity changes\", async () => {\n vi.spyOn(console, \"error\").mockImplementation(() => undefined);\n const execute = vi\n .fn<() => Promise<ListedModel[]>>()\n .mockRejectedValueOnce(new Error(\"network\"))\n .mockResolvedValueOnce([model(\"article\", \"Article\")]);\n const { presenter, notifications, identityContext } = setup(execute);\n\n await presenter.init();\n identityContext.clear();\n identityContext.setIdentity(user(\"user-1\"));\n await flush();\n\n expect(execute).toHaveBeenCalledTimes(2);\n expect(notifications.error).toHaveBeenCalledTimes(1);\n expect(presenter.vm.namespaces).toEqual([\"cms.article\"]);\n });\n\n it(\"retries a failed list on a later init\", async () => {\n vi.spyOn(console, \"error\").mockImplementation(() => undefined);\n const execute = vi\n .fn<() => Promise<ListedModel[]>>()\n .mockRejectedValueOnce(new Error(\"network\"))\n .mockResolvedValueOnce([model(\"article\", \"Article\")]);\n const { presenter } = setup(execute);\n\n await presenter.init();\n presenter.dispose();\n await presenter.init();\n\n expect(execute).toHaveBeenCalledTimes(2);\n expect(presenter.vm.namespaces).toEqual([\"cms.article\"]);\n });\n});\n"],"names":["FAILURE","model","modelId","name","overrides","user","id","Identity","flush","Promise","resolve","setTimeout","setup","execute","params","notifications","vi","container","Container","ListModelsUseCase","Notifications","IdentityContextFeature","identityContext","IdentityContext","CmsContentReviewsPresenterFeature","CmsContentReviewsPresenter","describe","afterEach","it","presenter","undefined","expect","consoleError","console","error","Error"],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export interface ListedModel {
2
+ modelId: string;
3
+ name: string;
4
+ tags?: string[];
5
+ isBeingDeleted?: boolean;
6
+ }
7
+ export interface ContentType {
8
+ modelId: string;
9
+ name: string;
10
+ }
11
+ export interface CmsContentTypeOption {
12
+ label: string;
13
+ value: string;
14
+ app: "cms";
15
+ icon: "devices_other";
16
+ }
17
+ export interface ICmsContentReviewsViewModel {
18
+ loading: boolean;
19
+ namespaces: string[];
20
+ options: CmsContentTypeOption[];
21
+ }
22
+ export interface ICmsContentReviewsPresenter {
23
+ readonly vm: ICmsContentReviewsViewModel;
24
+ init(): Promise<void>;
25
+ dispose(): void;
26
+ }
27
+ export declare const CmsContentReviewsPresenter: import("@webiny/di").Abstraction<ICmsContentReviewsPresenter>;
28
+ export declare namespace CmsContentReviewsPresenter {
29
+ type Interface = ICmsContentReviewsPresenter;
30
+ type ViewModel = ICmsContentReviewsViewModel;
31
+ }
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/admin";
2
+ const CmsContentReviewsPresenter = createAbstraction("Cms/Workflows/ContentReviewsPresenter");
3
+ export { CmsContentReviewsPresenter };
4
+
5
+ //# sourceMappingURL=abstractions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/contentReviews/abstractions.js","sources":["../../../src/presentation/contentReviews/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\n\n// The part of an admin model the content type list needs.\nexport interface ListedModel {\n modelId: string;\n name: string;\n tags?: string[];\n isBeingDeleted?: boolean;\n}\n\nexport interface ContentType {\n modelId: string;\n name: string;\n}\n\nexport interface CmsContentTypeOption {\n label: string;\n value: string;\n app: \"cms\";\n icon: \"devices_other\";\n}\n\nexport interface ICmsContentReviewsViewModel {\n loading: boolean;\n namespaces: string[];\n options: CmsContentTypeOption[];\n}\n\nexport interface ICmsContentReviewsPresenter {\n readonly vm: ICmsContentReviewsViewModel;\n init(): Promise<void>;\n dispose(): void;\n}\n\nexport const CmsContentReviewsPresenter = createAbstraction<ICmsContentReviewsPresenter>(\n \"Cms/Workflows/ContentReviewsPresenter\"\n);\n\nexport namespace CmsContentReviewsPresenter {\n export type Interface = ICmsContentReviewsPresenter;\n export type ViewModel = ICmsContentReviewsViewModel;\n}\n"],"names":["CmsContentReviewsPresenter","createAbstraction"],"mappings":";AAkCO,MAAMA,6BAA6BC,kBACtC"}