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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (455) hide show
  1. package/Components/CmsEntriesList/CmsReviewMoveEntryAction.d.ts +2 -0
  2. package/Components/CmsEntriesList/CmsReviewMoveEntryAction.js +43 -0
  3. package/Components/CmsEntriesList/CmsReviewMoveEntryAction.js.map +1 -0
  4. package/Components/CmsEntriesList/CmsReviewMoveEntryAction.test.d.ts +1 -0
  5. package/Components/CmsEntriesList/CmsReviewMoveEntryAction.test.js +118 -0
  6. package/Components/CmsEntriesList/CmsReviewMoveEntryAction.test.js.map +1 -0
  7. package/Components/CmsEntriesList/CmsReviewScheduleEntryAction.d.ts +2 -0
  8. package/Components/CmsEntriesList/CmsReviewScheduleEntryAction.js +22 -0
  9. package/Components/CmsEntriesList/CmsReviewScheduleEntryAction.js.map +1 -0
  10. package/Components/CmsEntriesList/CmsReviewScheduleEntryAction.test.d.ts +1 -0
  11. package/Components/CmsEntriesList/CmsReviewScheduleEntryAction.test.js +98 -0
  12. package/Components/CmsEntriesList/CmsReviewScheduleEntryAction.test.js.map +1 -0
  13. package/Components/ContentEntryForm/CmsEntryReviewBar.d.ts +2 -0
  14. package/Components/ContentEntryForm/CmsEntryReviewBar.js +32 -0
  15. package/Components/ContentEntryForm/CmsEntryReviewBar.js.map +1 -0
  16. package/Components/ContentEntryForm/CmsEntryReviewBar.test.d.ts +1 -0
  17. package/Components/ContentEntryForm/CmsEntryReviewBar.test.js +128 -0
  18. package/Components/ContentEntryForm/CmsEntryReviewBar.test.js.map +1 -0
  19. package/Components/ContentEntryForm/CmsEntryReviewBlockedActions.d.ts +2 -0
  20. package/Components/ContentEntryForm/CmsEntryReviewBlockedActions.js +46 -0
  21. package/Components/ContentEntryForm/CmsEntryReviewBlockedActions.js.map +1 -0
  22. package/Components/ContentEntryForm/CmsEntryReviewBlockedActions.test.d.ts +1 -0
  23. package/Components/ContentEntryForm/CmsEntryReviewBlockedActions.test.js +222 -0
  24. package/Components/ContentEntryForm/CmsEntryReviewBlockedActions.test.js.map +1 -0
  25. package/Components/ContentEntryForm/CmsEntryReviewFormLock.d.ts +2 -0
  26. package/Components/ContentEntryForm/CmsEntryReviewFormLock.js +32 -0
  27. package/Components/ContentEntryForm/CmsEntryReviewFormLock.js.map +1 -0
  28. package/Components/ContentEntryForm/CmsEntryReviewFormLock.test.d.ts +1 -0
  29. package/Components/ContentEntryForm/CmsEntryReviewFormLock.test.js +94 -0
  30. package/Components/ContentEntryForm/CmsEntryReviewFormLock.test.js.map +1 -0
  31. package/Components/ContentEntryForm/CmsEntryReviewNewRevision.d.ts +2 -0
  32. package/Components/ContentEntryForm/{CmsEntryFormCreateNewRevisionButton.js → CmsEntryReviewNewRevision.js} +20 -11
  33. package/Components/ContentEntryForm/CmsEntryReviewNewRevision.js.map +1 -0
  34. package/Components/ContentEntryForm/CmsEntryReviewNewRevision.test.d.ts +1 -0
  35. package/Components/ContentEntryForm/CmsEntryReviewNewRevision.test.js +186 -0
  36. package/Components/ContentEntryForm/CmsEntryReviewNewRevision.test.js.map +1 -0
  37. package/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.d.ts +2 -0
  38. package/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.js +26 -0
  39. package/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.js.map +1 -0
  40. package/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.test.d.ts +1 -0
  41. package/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.test.js +78 -0
  42. package/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.test.js.map +1 -0
  43. package/Components/ContentEntryForm/getModelFieldLabels.d.ts +3 -0
  44. package/Components/ContentEntryForm/getModelFieldLabels.js +8 -0
  45. package/Components/ContentEntryForm/getModelFieldLabels.js.map +1 -0
  46. package/Components/ContentEntryForm/index.d.ts +5 -4
  47. package/Components/ContentEntryForm/index.js +5 -4
  48. package/Components/ContentReviews/CmsContentReviews.d.ts +2 -0
  49. package/Components/ContentReviews/CmsContentReviews.js +11 -0
  50. package/Components/ContentReviews/CmsContentReviews.js.map +1 -0
  51. package/Components/ContentReviews/CmsContentReviews.test.d.ts +1 -0
  52. package/Components/ContentReviews/CmsContentReviews.test.js +214 -0
  53. package/Components/ContentReviews/CmsContentReviews.test.js.map +1 -0
  54. package/Components/ContentReviews/CmsContentReviewsMount.d.ts +4 -0
  55. package/Components/ContentReviews/CmsContentReviewsMount.js +44 -0
  56. package/Components/ContentReviews/CmsContentReviewsMount.js.map +1 -0
  57. package/Components/ContentReviews/CmsContentReviewsSidebarItem.d.ts +2 -0
  58. package/Components/ContentReviews/CmsContentReviewsSidebarItem.js +20 -0
  59. package/Components/ContentReviews/CmsContentReviewsSidebarItem.js.map +1 -0
  60. package/Components/ContentReviews/CmsContentReviewsSidebarItem.test.d.ts +1 -0
  61. package/Components/ContentReviews/CmsContentReviewsSidebarItem.test.js +83 -0
  62. package/Components/ContentReviews/CmsContentReviewsSidebarItem.test.js.map +1 -0
  63. package/Components/ModelDelete/ModelBoundToWorkflowErrorData.d.ts +8 -0
  64. package/Components/ModelDelete/ModelBoundToWorkflowErrorData.js +0 -0
  65. package/Components/ModelDelete/ModelDeleteWorkflowCopy.d.ts +10 -0
  66. package/Components/ModelDelete/ModelDeleteWorkflowCopy.js +0 -0
  67. package/Components/ModelDelete/ModelDeleteWorkflowError.d.ts +2 -0
  68. package/Components/ModelDelete/ModelDeleteWorkflowError.js +34 -0
  69. package/Components/ModelDelete/ModelDeleteWorkflowError.js.map +1 -0
  70. package/Components/ModelDelete/ModelDeleteWorkflowError.test.d.ts +1 -0
  71. package/Components/ModelDelete/ModelDeleteWorkflowError.test.js +73 -0
  72. package/Components/ModelDelete/ModelDeleteWorkflowError.test.js.map +1 -0
  73. package/Components/ModelDelete/getModelDeleteWorkflowCopy.d.ts +3 -0
  74. package/Components/ModelDelete/getModelDeleteWorkflowCopy.js +17 -0
  75. package/Components/ModelDelete/getModelDeleteWorkflowCopy.js.map +1 -0
  76. package/Components/ModelDelete/getModelDeleteWorkflowCopy.test.d.ts +1 -0
  77. package/Components/ModelDelete/getModelDeleteWorkflowCopy.test.js +28 -0
  78. package/Components/ModelDelete/getModelDeleteWorkflowCopy.test.js.map +1 -0
  79. package/Components/ignoreAction.d.ts +1 -0
  80. package/Components/ignoreAction.js +4 -0
  81. package/Components/ignoreAction.js.map +1 -0
  82. package/Routes/CmsWorkflowEditor.d.ts +2 -0
  83. package/Routes/CmsWorkflowEditor.js +23 -0
  84. package/Routes/CmsWorkflowEditor.js.map +1 -0
  85. package/Routes/CmsWorkflowEditor.test.d.ts +1 -0
  86. package/Routes/CmsWorkflowEditor.test.js +141 -0
  87. package/Routes/CmsWorkflowEditor.test.js.map +1 -0
  88. package/Routes/index.d.ts +1 -1
  89. package/Routes/index.js +1 -1
  90. package/features/cache/CmsReviewCacheSyncHandler.d.ts +8 -0
  91. package/features/cache/CmsReviewCacheSyncHandler.js +14 -0
  92. package/features/cache/CmsReviewCacheSyncHandler.js.map +1 -0
  93. package/features/cache/CmsReviewCacheWriter.d.ts +14 -0
  94. package/features/cache/CmsReviewCacheWriter.js +39 -0
  95. package/features/cache/CmsReviewCacheWriter.js.map +1 -0
  96. package/features/cache/CmsReviewCacheWriter.test.d.ts +1 -0
  97. package/features/cache/CmsReviewCacheWriter.test.js +207 -0
  98. package/features/cache/CmsReviewCacheWriter.test.js.map +1 -0
  99. package/features/cache/CmsReviewEntriesCacheProviderDecorator.d.ts +12 -0
  100. package/features/cache/CmsReviewEntriesCacheProviderDecorator.js +17 -0
  101. package/features/cache/CmsReviewEntriesCacheProviderDecorator.js.map +1 -0
  102. package/features/cache/CmsReviewEntriesCacheProviderDecorator.test.d.ts +1 -0
  103. package/features/cache/CmsReviewEntriesCacheProviderDecorator.test.js +129 -0
  104. package/features/cache/CmsReviewEntriesCacheProviderDecorator.test.js.map +1 -0
  105. package/features/cache/ReviewPreservingEntriesCache.d.ts +18 -0
  106. package/features/cache/ReviewPreservingEntriesCache.js +54 -0
  107. package/features/cache/ReviewPreservingEntriesCache.js.map +1 -0
  108. package/features/cache/abstractions.d.ts +5 -0
  109. package/features/cache/abstractions.js +5 -0
  110. package/features/cache/abstractions.js.map +1 -0
  111. package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.d.ts +26 -0
  112. package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.js +104 -0
  113. package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.js.map +1 -0
  114. package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.test.d.ts +1 -0
  115. package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.test.js +589 -0
  116. package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.test.js.map +1 -0
  117. package/features/editorGateway/feature.d.ts +1 -0
  118. package/features/editorGateway/feature.js +11 -0
  119. package/features/editorGateway/feature.js.map +1 -0
  120. package/features/editorGateway/feature.test.d.ts +1 -0
  121. package/features/editorGateway/feature.test.js +272 -0
  122. package/features/editorGateway/feature.test.js.map +1 -0
  123. package/features/editorGateway/graphql/cmsEntryFolderExists.d.ts +1 -0
  124. package/features/editorGateway/graphql/cmsEntryFolderExists.js +16 -0
  125. package/features/editorGateway/graphql/cmsEntryFolderExists.js.map +1 -0
  126. package/features/editorGateway/graphql/deleteCmsEntryWorkflow.d.ts +1 -0
  127. package/features/editorGateway/graphql/deleteCmsEntryWorkflow.js +19 -0
  128. package/features/editorGateway/graphql/deleteCmsEntryWorkflow.js.map +1 -0
  129. package/features/editorGateway/graphql/getCmsEntryWorkflow.d.ts +1 -0
  130. package/features/editorGateway/graphql/getCmsEntryWorkflow.js +19 -0
  131. package/features/editorGateway/graphql/getCmsEntryWorkflow.js.map +1 -0
  132. package/features/editorGateway/graphql/inspectCmsEntryRouting.d.ts +1 -0
  133. package/features/editorGateway/graphql/inspectCmsEntryRouting.js +19 -0
  134. package/features/editorGateway/graphql/inspectCmsEntryRouting.js.map +1 -0
  135. package/features/editorGateway/graphql/listCmsEntryWorkflowModels.d.ts +1 -0
  136. package/features/editorGateway/graphql/listCmsEntryWorkflowModels.js +29 -0
  137. package/features/editorGateway/graphql/listCmsEntryWorkflowModels.js.map +1 -0
  138. package/features/editorGateway/graphql/storeCmsEntryWorkflow.d.ts +1 -0
  139. package/features/editorGateway/graphql/storeCmsEntryWorkflow.js +19 -0
  140. package/features/editorGateway/graphql/storeCmsEntryWorkflow.js.map +1 -0
  141. package/features/editorMounting/CmsWorkflowEditorAppAdapter.d.ts +25 -0
  142. package/features/editorMounting/CmsWorkflowEditorAppAdapter.js +51 -0
  143. package/features/editorMounting/CmsWorkflowEditorAppAdapter.js.map +1 -0
  144. package/features/editorMounting/CmsWorkflowEditorAppAdapter.test.d.ts +1 -0
  145. package/features/editorMounting/CmsWorkflowEditorAppAdapter.test.js +185 -0
  146. package/features/editorMounting/CmsWorkflowEditorAppAdapter.test.js.map +1 -0
  147. package/features/editorMounting/abstractions.d.ts +5 -0
  148. package/features/editorMounting/abstractions.js +5 -0
  149. package/features/editorMounting/abstractions.js.map +1 -0
  150. package/features/editorMounting/feature.d.ts +3 -0
  151. package/features/editorMounting/feature.js +19 -0
  152. package/features/editorMounting/feature.js.map +1 -0
  153. package/features/editorMounting/feature.test.d.ts +1 -0
  154. package/features/editorMounting/feature.test.js +100 -0
  155. package/features/editorMounting/feature.test.js.map +1 -0
  156. package/features/editorReview/CmsEntryReview.d.ts +8 -0
  157. package/features/editorReview/CmsEntryReview.js +14 -0
  158. package/features/editorReview/CmsEntryReview.js.map +1 -0
  159. package/features/editorReview/abstractions.d.ts +5 -0
  160. package/features/editorReview/abstractions.js +5 -0
  161. package/features/editorReview/abstractions.js.map +1 -0
  162. package/features/editorReview/feature.d.ts +3 -0
  163. package/features/editorReview/feature.js +17 -0
  164. package/features/editorReview/feature.js.map +1 -0
  165. package/features/editorReview/feature.test.d.ts +1 -0
  166. package/features/editorReview/feature.test.js +46 -0
  167. package/features/editorReview/feature.test.js.map +1 -0
  168. package/features/editorReview/useCmsEntryReview.d.ts +2 -0
  169. package/features/editorReview/useCmsEntryReview.js +8 -0
  170. package/features/editorReview/useCmsEntryReview.js.map +1 -0
  171. package/features/feature.js +6 -2
  172. package/features/feature.js.map +1 -1
  173. package/features/gateway/CmsReviewChangeMessageHandler.d.ts +8 -0
  174. package/features/gateway/CmsReviewChangeMessageHandler.js +16 -0
  175. package/features/gateway/CmsReviewChangeMessageHandler.js.map +1 -0
  176. package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.d.ts +16 -0
  177. package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.js +39 -0
  178. package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.js.map +1 -0
  179. package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.test.d.ts +1 -0
  180. package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.test.js +83 -0
  181. package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.test.js.map +1 -0
  182. package/features/gateway/CmsReviewContentAdapter/abstractions.d.ts +5 -0
  183. package/features/gateway/CmsReviewContentAdapter/abstractions.js +5 -0
  184. package/features/gateway/CmsReviewContentAdapter/abstractions.js.map +1 -0
  185. package/features/gateway/CmsReviewGateway/CmsReviewGateway.d.ts +52 -0
  186. package/features/gateway/CmsReviewGateway/CmsReviewGateway.js +221 -0
  187. package/features/gateway/CmsReviewGateway/CmsReviewGateway.js.map +1 -0
  188. package/features/gateway/CmsReviewGateway/CmsReviewGateway.test.d.ts +1 -0
  189. package/features/gateway/CmsReviewGateway/CmsReviewGateway.test.js +689 -0
  190. package/features/gateway/CmsReviewGateway/CmsReviewGateway.test.js.map +1 -0
  191. package/features/gateway/CmsReviewNotificationHandler.d.ts +8 -0
  192. package/features/gateway/CmsReviewNotificationHandler.js +16 -0
  193. package/features/gateway/CmsReviewNotificationHandler.js.map +1 -0
  194. package/features/gateway/CmsReviewRowProvider/CmsReviewRowProvider.d.ts +8 -0
  195. package/features/gateway/CmsReviewRowProvider/CmsReviewRowProvider.js +14 -0
  196. package/features/gateway/CmsReviewRowProvider/CmsReviewRowProvider.js.map +1 -0
  197. package/features/gateway/CmsReviewRowProvider/abstractions.d.ts +5 -0
  198. package/features/gateway/CmsReviewRowProvider/abstractions.js +5 -0
  199. package/features/gateway/CmsReviewRowProvider/abstractions.js.map +1 -0
  200. package/features/gateway/contentReviewsBindings.test.d.ts +1 -0
  201. package/features/gateway/contentReviewsBindings.test.js +125 -0
  202. package/features/gateway/contentReviewsBindings.test.js.map +1 -0
  203. package/features/gateway/feature.d.ts +4 -0
  204. package/features/gateway/feature.js +27 -0
  205. package/features/gateway/feature.js.map +1 -0
  206. package/features/gateway/feature.test.d.ts +1 -0
  207. package/features/gateway/feature.test.js +79 -0
  208. package/features/gateway/feature.test.js.map +1 -0
  209. package/features/gateway/graphql/CmsOperationResponse.d.ts +3 -0
  210. package/features/gateway/graphql/CmsOperationResponse.js +0 -0
  211. package/features/gateway/graphql/approveCmsEntryReviewStep.d.ts +1 -0
  212. package/features/gateway/graphql/approveCmsEntryReviewStep.js +18 -0
  213. package/features/gateway/graphql/approveCmsEntryReviewStep.js.map +1 -0
  214. package/features/gateway/graphql/cancelCmsEntryReview.d.ts +1 -0
  215. package/features/gateway/graphql/cancelCmsEntryReview.js +18 -0
  216. package/features/gateway/graphql/cancelCmsEntryReview.js.map +1 -0
  217. package/features/gateway/graphql/cancelCmsEntryReviewsForDelete.d.ts +1 -0
  218. package/features/gateway/graphql/cancelCmsEntryReviewsForDelete.js +28 -0
  219. package/features/gateway/graphql/cancelCmsEntryReviewsForDelete.js.map +1 -0
  220. package/features/gateway/graphql/getCmsEntryReview.d.ts +1 -0
  221. package/features/gateway/graphql/getCmsEntryReview.js +18 -0
  222. package/features/gateway/graphql/getCmsEntryReview.js.map +1 -0
  223. package/features/gateway/graphql/getCmsEntryReviewStepRun.d.ts +1 -0
  224. package/features/gateway/graphql/getCmsEntryReviewStepRun.js +18 -0
  225. package/features/gateway/graphql/getCmsEntryReviewStepRun.js.map +1 -0
  226. package/features/gateway/graphql/getCmsEntryTargetReview.d.ts +1 -0
  227. package/features/gateway/graphql/getCmsEntryTargetReview.js +18 -0
  228. package/features/gateway/graphql/getCmsEntryTargetReview.js.map +1 -0
  229. package/features/gateway/graphql/listCmsEntryBlockingReviews.d.ts +1 -0
  230. package/features/gateway/graphql/listCmsEntryBlockingReviews.js +18 -0
  231. package/features/gateway/graphql/listCmsEntryBlockingReviews.js.map +1 -0
  232. package/features/gateway/graphql/listCmsEntryReviewStepCandidates.d.ts +1 -0
  233. package/features/gateway/graphql/listCmsEntryReviewStepCandidates.js +18 -0
  234. package/features/gateway/graphql/listCmsEntryReviewStepCandidates.js.map +1 -0
  235. package/features/gateway/graphql/listCmsEntryReviews.d.ts +1 -0
  236. package/features/gateway/graphql/listCmsEntryReviews.js +34 -0
  237. package/features/gateway/graphql/listCmsEntryReviews.js.map +1 -0
  238. package/features/gateway/graphql/listCmsEntryStepCandidates.d.ts +1 -0
  239. package/features/gateway/graphql/listCmsEntryStepCandidates.js +28 -0
  240. package/features/gateway/graphql/listCmsEntryStepCandidates.js.map +1 -0
  241. package/features/gateway/graphql/listCmsEntryWorkflows.d.ts +1 -0
  242. package/features/gateway/graphql/listCmsEntryWorkflows.js +18 -0
  243. package/features/gateway/graphql/listCmsEntryWorkflows.js.map +1 -0
  244. package/features/gateway/graphql/reassignCmsEntryReviewStep.d.ts +1 -0
  245. package/features/gateway/graphql/reassignCmsEntryReviewStep.js +18 -0
  246. package/features/gateway/graphql/reassignCmsEntryReviewStep.js.map +1 -0
  247. package/features/gateway/graphql/rejectCmsEntryReviewStep.d.ts +1 -0
  248. package/features/gateway/graphql/rejectCmsEntryReviewStep.js +18 -0
  249. package/features/gateway/graphql/rejectCmsEntryReviewStep.js.map +1 -0
  250. package/features/gateway/graphql/requestCmsEntryReview.d.ts +1 -0
  251. package/features/gateway/graphql/requestCmsEntryReview.js +28 -0
  252. package/features/gateway/graphql/requestCmsEntryReview.js.map +1 -0
  253. package/features/gateway/graphql/restartCmsEntryReviewStep.d.ts +1 -0
  254. package/features/gateway/graphql/restartCmsEntryReviewStep.js +18 -0
  255. package/features/gateway/graphql/restartCmsEntryReviewStep.js.map +1 -0
  256. package/features/gateway/graphql/startCmsEntryReviewStep.d.ts +1 -0
  257. package/features/gateway/graphql/startCmsEntryReviewStep.js +18 -0
  258. package/features/gateway/graphql/startCmsEntryReviewStep.js.map +1 -0
  259. package/features/gateway/graphql/takeOverCmsEntryReviewStep.d.ts +1 -0
  260. package/features/gateway/graphql/takeOverCmsEntryReviewStep.js +22 -0
  261. package/features/gateway/graphql/takeOverCmsEntryReviewStep.js.map +1 -0
  262. package/features/trash/BulkDeletePresenterReviewDecorator.d.ts +20 -0
  263. package/features/trash/BulkDeletePresenterReviewDecorator.js +81 -0
  264. package/features/trash/BulkDeletePresenterReviewDecorator.js.map +1 -0
  265. package/features/trash/BulkDeletePresenterReviewDecorator.test.d.ts +1 -0
  266. package/features/trash/BulkDeletePresenterReviewDecorator.test.js +693 -0
  267. package/features/trash/BulkDeletePresenterReviewDecorator.test.js.map +1 -0
  268. package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.d.ts +13 -0
  269. package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.js +23 -0
  270. package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.js.map +1 -0
  271. package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.test.d.ts +1 -0
  272. package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.test.js +123 -0
  273. package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.test.js.map +1 -0
  274. package/features/trash/DeleteEntryUseCaseReviewDecorator.d.ts +13 -0
  275. package/features/trash/DeleteEntryUseCaseReviewDecorator.js +23 -0
  276. package/features/trash/DeleteEntryUseCaseReviewDecorator.js.map +1 -0
  277. package/features/trash/DeleteEntryUseCaseReviewDecorator.test.d.ts +1 -0
  278. package/features/trash/DeleteEntryUseCaseReviewDecorator.test.js +139 -0
  279. package/features/trash/DeleteEntryUseCaseReviewDecorator.test.js.map +1 -0
  280. package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.d.ts +13 -0
  281. package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.js +23 -0
  282. package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.js.map +1 -0
  283. package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.test.d.ts +1 -0
  284. package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.test.js +122 -0
  285. package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.test.js.map +1 -0
  286. package/features/trash/feature.d.ts +1 -0
  287. package/features/trash/feature.js +17 -0
  288. package/features/trash/feature.js.map +1 -0
  289. package/features/trash/feature.test.d.ts +1 -0
  290. package/features/trash/feature.test.js +213 -0
  291. package/features/trash/feature.test.js.map +1 -0
  292. package/index.d.ts +1 -1
  293. package/index.editor.test.d.ts +1 -0
  294. package/index.editor.test.js +149 -0
  295. package/index.editor.test.js.map +1 -0
  296. package/index.js +31 -10
  297. package/index.js.map +1 -1
  298. package/index.lists.test.d.ts +1 -0
  299. package/index.lists.test.js +172 -0
  300. package/index.lists.test.js.map +1 -0
  301. package/index.mount.test.d.ts +1 -0
  302. package/index.mount.test.js +49 -0
  303. package/index.mount.test.js.map +1 -0
  304. package/index.test.d.ts +1 -0
  305. package/index.test.js +414 -0
  306. package/index.test.js.map +1 -0
  307. package/package.json +20 -16
  308. package/presentation/CmsEntryContentReloader.d.ts +8 -0
  309. package/presentation/CmsEntryContentReloader.js +20 -0
  310. package/presentation/CmsEntryContentReloader.js.map +1 -0
  311. package/presentation/CmsEntryContentReloader.test.d.ts +1 -0
  312. package/presentation/CmsEntryContentReloader.test.js +118 -0
  313. package/presentation/CmsEntryContentReloader.test.js.map +1 -0
  314. package/presentation/CmsEntryFormPresenterReviewDecorator.d.ts +27 -0
  315. package/presentation/CmsEntryFormPresenterReviewDecorator.js +167 -0
  316. package/presentation/CmsEntryFormPresenterReviewDecorator.js.map +1 -0
  317. package/presentation/CmsEntryFormPresenterReviewDecorator.test.d.ts +1 -0
  318. package/presentation/CmsEntryFormPresenterReviewDecorator.test.js +601 -0
  319. package/presentation/CmsEntryFormPresenterReviewDecorator.test.js.map +1 -0
  320. package/presentation/CmsEntryUnsavedChanges.d.ts +7 -0
  321. package/presentation/CmsEntryUnsavedChanges.js +12 -0
  322. package/presentation/CmsEntryUnsavedChanges.js.map +1 -0
  323. package/presentation/CmsEntryUnsavedChanges.test.d.ts +1 -0
  324. package/presentation/CmsEntryUnsavedChanges.test.js +23 -0
  325. package/presentation/CmsEntryUnsavedChanges.test.js.map +1 -0
  326. package/presentation/CmsReviewFieldSelections.test.d.ts +1 -0
  327. package/presentation/CmsReviewFieldSelections.test.js +27 -0
  328. package/presentation/CmsReviewFieldSelections.test.js.map +1 -0
  329. package/presentation/{WorkflowStateGetEntryFieldSelection.d.ts → CmsReviewGetEntryFieldSelection.d.ts} +2 -2
  330. package/presentation/CmsReviewGetEntryFieldSelection.js +16 -0
  331. package/presentation/CmsReviewGetEntryFieldSelection.js.map +1 -0
  332. package/presentation/{WorkflowStateListEntriesFieldSelection.d.ts → CmsReviewListEntriesFieldSelection.d.ts} +2 -2
  333. package/presentation/CmsReviewListEntriesFieldSelection.js +16 -0
  334. package/presentation/CmsReviewListEntriesFieldSelection.js.map +1 -0
  335. package/presentation/{TableRowMapperWorkflowDecorator.d.ts → CmsReviewTableRowMapperDecorator.d.ts} +3 -3
  336. package/presentation/CmsReviewTableRowMapperDecorator.js +24 -0
  337. package/presentation/CmsReviewTableRowMapperDecorator.js.map +1 -0
  338. package/presentation/CmsReviewTableRowMapperDecorator.test.d.ts +1 -0
  339. package/presentation/CmsReviewTableRowMapperDecorator.test.js +120 -0
  340. package/presentation/CmsReviewTableRowMapperDecorator.test.js.map +1 -0
  341. package/presentation/CmsRevisionsListPresenterDecorator.d.ts +24 -0
  342. package/presentation/CmsRevisionsListPresenterDecorator.js +66 -0
  343. package/presentation/CmsRevisionsListPresenterDecorator.js.map +1 -0
  344. package/presentation/CmsRevisionsListPresenterDecorator.test.d.ts +1 -0
  345. package/presentation/CmsRevisionsListPresenterDecorator.test.js +174 -0
  346. package/presentation/CmsRevisionsListPresenterDecorator.test.js.map +1 -0
  347. package/presentation/contentReviews/CmsContentReviewsPresenter.d.ts +28 -0
  348. package/presentation/contentReviews/CmsContentReviewsPresenter.js +103 -0
  349. package/presentation/contentReviews/CmsContentReviewsPresenter.js.map +1 -0
  350. package/presentation/contentReviews/CmsContentReviewsPresenter.test.d.ts +1 -0
  351. package/presentation/contentReviews/CmsContentReviewsPresenter.test.js +238 -0
  352. package/presentation/contentReviews/CmsContentReviewsPresenter.test.js.map +1 -0
  353. package/presentation/contentReviews/abstractions.d.ts +31 -0
  354. package/presentation/contentReviews/abstractions.js +5 -0
  355. package/presentation/contentReviews/abstractions.js.map +1 -0
  356. package/presentation/contentReviews/feature.d.ts +3 -0
  357. package/presentation/contentReviews/feature.js +17 -0
  358. package/presentation/contentReviews/feature.js.map +1 -0
  359. package/presentation/contentReviews/toContentTypes.d.ts +3 -0
  360. package/presentation/contentReviews/toContentTypes.js +14 -0
  361. package/presentation/contentReviews/toContentTypes.js.map +1 -0
  362. package/presentation/contentReviews/toContentTypes.test.d.ts +1 -0
  363. package/presentation/contentReviews/toContentTypes.test.js +20 -0
  364. package/presentation/contentReviews/toContentTypes.test.js.map +1 -0
  365. package/presentation/feature.js +10 -12
  366. package/presentation/feature.js.map +1 -1
  367. package/presentation/getCmsEntryReviewContext.d.ts +4 -0
  368. package/presentation/getCmsEntryReviewContext.js +12 -0
  369. package/presentation/getCmsEntryReviewContext.js.map +1 -0
  370. package/presentation/getCmsEntryReviewInitParams.d.ts +13 -0
  371. package/presentation/getCmsEntryReviewInitParams.js +18 -0
  372. package/presentation/getCmsEntryReviewInitParams.js.map +1 -0
  373. package/presentation/getCmsEntryReviewInitParams.test.d.ts +1 -0
  374. package/presentation/getCmsEntryReviewInitParams.test.js +69 -0
  375. package/presentation/getCmsEntryReviewInitParams.test.js.map +1 -0
  376. package/routes.d.ts +4 -4
  377. package/routes.js +5 -5
  378. package/routes.js.map +1 -1
  379. package/testing/createEntry.d.ts +3 -0
  380. package/testing/createEntry.js +22 -0
  381. package/testing/createEntry.js.map +1 -0
  382. package/testing/createEntrySession.d.ts +9 -0
  383. package/testing/createEntrySession.js +29 -0
  384. package/testing/createEntrySession.js.map +1 -0
  385. package/testing/createFolder.d.ts +2 -0
  386. package/testing/createFolder.js +13 -0
  387. package/testing/createFolder.js.map +1 -0
  388. package/testing/createFormVm.d.ts +2 -0
  389. package/testing/createFormVm.js +22 -0
  390. package/testing/createFormVm.js.map +1 -0
  391. package/testing/models.d.ts +4 -0
  392. package/testing/models.js +23 -0
  393. package/testing/models.js.map +1 -0
  394. package/testing/renderEditorTree.d.ts +17 -0
  395. package/testing/renderEditorTree.js +93 -0
  396. package/testing/renderEditorTree.js.map +1 -0
  397. package/testing/reviewStates.d.ts +17 -0
  398. package/testing/reviewStates.js +65 -0
  399. package/testing/reviewStates.js.map +1 -0
  400. package/types.d.ts +8 -8
  401. package/utils/isReviewableModel.d.ts +2 -0
  402. package/utils/isReviewableModel.js +7 -0
  403. package/utils/isReviewableModel.js.map +1 -0
  404. package/utils/renderModelIcon.d.ts +3 -0
  405. package/utils/renderModelIcon.js +19 -0
  406. package/utils/renderModelIcon.js.map +1 -0
  407. package/utils/renderModelIconOrFallback.d.ts +3 -0
  408. package/utils/renderModelIconOrFallback.js +17 -0
  409. package/utils/renderModelIconOrFallback.js.map +1 -0
  410. package/Components/CmsEntriesWorkflowStateList/CmsEntriesWorkflowStateListFooterMenu.d.ts +0 -2
  411. package/Components/CmsEntriesWorkflowStateList/CmsEntriesWorkflowStateListFooterMenu.js +0 -34
  412. package/Components/CmsEntriesWorkflowStateList/CmsEntriesWorkflowStateListFooterMenu.js.map +0 -1
  413. package/Components/CmsEntriesWorkflowStateList/index.d.ts +0 -1
  414. package/Components/CmsEntriesWorkflowStateList/index.js +0 -1
  415. package/Components/ContentEntryForm/CmsEntryFormCreateNewRevisionButton.d.ts +0 -2
  416. package/Components/ContentEntryForm/CmsEntryFormCreateNewRevisionButton.js.map +0 -1
  417. package/Components/ContentEntryForm/CmsEntryFormScheduleMenuItemAction.d.ts +0 -5
  418. package/Components/ContentEntryForm/CmsEntryFormScheduleMenuItemAction.js +0 -22
  419. package/Components/ContentEntryForm/CmsEntryFormScheduleMenuItemAction.js.map +0 -1
  420. package/Components/ContentEntryForm/CmsEntryFormTooltipButton.d.ts +0 -2
  421. package/Components/ContentEntryForm/CmsEntryFormTooltipButton.js +0 -13
  422. package/Components/ContentEntryForm/CmsEntryFormTooltipButton.js.map +0 -1
  423. package/Components/ContentEntryForm/ContentEntryFormWorkflow.d.ts +0 -2
  424. package/Components/ContentEntryForm/ContentEntryFormWorkflow.js +0 -24
  425. package/Components/ContentEntryForm/ContentEntryFormWorkflow.js.map +0 -1
  426. package/Components/OptionItem/OpenInNewWindow.d.ts +0 -2
  427. package/Components/OptionItem/OpenInNewWindow.js +0 -36
  428. package/Components/OptionItem/OpenInNewWindow.js.map +0 -1
  429. package/Routes/CmsWorkflowsEditor.d.ts +0 -2
  430. package/Routes/CmsWorkflowsEditor.js +0 -26
  431. package/Routes/CmsWorkflowsEditor.js.map +0 -1
  432. package/features/WorkflowStateCacheHandler.d.ts +0 -11
  433. package/features/WorkflowStateCacheHandler.js +0 -50
  434. package/features/WorkflowStateCacheHandler.js.map +0 -1
  435. package/presentation/CmsWorkflowsEditorView.d.ts +0 -5
  436. package/presentation/CmsWorkflowsEditorView.js +0 -90
  437. package/presentation/CmsWorkflowsEditorView.js.map +0 -1
  438. package/presentation/ContentEntryFormPresenterWorkflowDecorator.d.ts +0 -25
  439. package/presentation/ContentEntryFormPresenterWorkflowDecorator.js +0 -70
  440. package/presentation/ContentEntryFormPresenterWorkflowDecorator.js.map +0 -1
  441. package/presentation/TableRowMapperWorkflowDecorator.js +0 -25
  442. package/presentation/TableRowMapperWorkflowDecorator.js.map +0 -1
  443. package/presentation/WorkflowStateGetEntryFieldSelection.js +0 -24
  444. package/presentation/WorkflowStateGetEntryFieldSelection.js.map +0 -1
  445. package/presentation/WorkflowStateListEntriesFieldSelection.js +0 -24
  446. package/presentation/WorkflowStateListEntriesFieldSelection.js.map +0 -1
  447. package/presentation/cmsWorkflowsEditor/CmsWorkflowsEditorPresenter.d.ts +0 -15
  448. package/presentation/cmsWorkflowsEditor/CmsWorkflowsEditorPresenter.js +0 -50
  449. package/presentation/cmsWorkflowsEditor/CmsWorkflowsEditorPresenter.js.map +0 -1
  450. package/presentation/cmsWorkflowsEditor/abstractions.d.ts +0 -19
  451. package/presentation/cmsWorkflowsEditor/abstractions.js +0 -5
  452. package/presentation/cmsWorkflowsEditor/abstractions.js.map +0 -1
  453. package/presentation/cmsWorkflowsEditor/feature.d.ts +0 -3
  454. package/presentation/cmsWorkflowsEditor/feature.js +0 -17
  455. package/presentation/cmsWorkflowsEditor/feature.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare const CmsReviewMoveEntryAction: (props: unknown) => React.JSX.Element;
@@ -0,0 +1,43 @@
1
+ import react, { useId } from "react";
2
+ import { Tooltip } from "@webiny/admin-ui";
3
+ import { OptionsMenuItem, createReactiveComponent } from "@webiny/app-admin";
4
+ import { ContentEntryListConfig } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
5
+ import { useEntry } from "@webiny/app-headless-cms/admin/hooks/useEntry.js";
6
+ import { ReactComponent } from "@webiny/icons/exit_to_app.svg";
7
+ import { ReviewState } from "@webiny/app-workflows/review/domain/ReviewState.js";
8
+ import { MOVE_BLOCKED_IN_REVIEW } from "@webiny/app-workflows/review/presentation/targetReview/moveBlockedInReview.js";
9
+ import { ignoreAction } from "../ignoreAction.js";
10
+ const EntryAction = ContentEntryListConfig.Browser.Entry.Action;
11
+ const MoveBlocked = ()=>{
12
+ const descriptionId = useId();
13
+ return /*#__PURE__*/ react.createElement("span", {
14
+ "aria-describedby": descriptionId
15
+ }, /*#__PURE__*/ react.createElement(Tooltip, {
16
+ content: MOVE_BLOCKED_IN_REVIEW,
17
+ trigger: /*#__PURE__*/ react.createElement(OptionsMenuItem, {
18
+ icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
19
+ label: "Move",
20
+ disabled: true,
21
+ onAction: ignoreAction
22
+ })
23
+ }), /*#__PURE__*/ react.createElement("span", {
24
+ id: descriptionId,
25
+ className: "sr-only"
26
+ }, MOVE_BLOCKED_IN_REVIEW));
27
+ };
28
+ const MoveGate = createReactiveComponent((props)=>{
29
+ const { entry } = useEntry();
30
+ const meta = entry.meta;
31
+ if (meta.system?.workflow?.reviewState === ReviewState.InProgress) return /*#__PURE__*/ react.createElement(MoveBlocked, null);
32
+ return /*#__PURE__*/ react.createElement(react.Fragment, null, props.children);
33
+ });
34
+ const CmsReviewMoveEntryAction = EntryAction.createDecorator((Original)=>function(props) {
35
+ if ("move" !== props.name) return /*#__PURE__*/ react.createElement(Original, props);
36
+ return /*#__PURE__*/ react.createElement(Original, {
37
+ ...props,
38
+ element: /*#__PURE__*/ react.createElement(MoveGate, null, props.element)
39
+ });
40
+ });
41
+ export { CmsReviewMoveEntryAction };
42
+
43
+ //# sourceMappingURL=CmsReviewMoveEntryAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/CmsEntriesList/CmsReviewMoveEntryAction.js","sources":["../../../src/Components/CmsEntriesList/CmsReviewMoveEntryAction.tsx"],"sourcesContent":["import React, { useId } from \"react\";\nimport { Tooltip } from \"@webiny/admin-ui\";\nimport { createReactiveComponent } from \"@webiny/app-admin\";\nimport { OptionsMenuItem } from \"@webiny/app-admin\";\nimport { ContentEntryListConfig } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport { useEntry } from \"@webiny/app-headless-cms/admin/hooks/useEntry.js\";\nimport { ReactComponent as MoveIcon } from \"@webiny/icons/exit_to_app.svg\";\nimport { ReviewState } from \"@webiny/app-workflows/review/domain/ReviewState.js\";\nimport { MOVE_BLOCKED_IN_REVIEW } from \"@webiny/app-workflows/review/presentation/targetReview/moveBlockedInReview.js\";\nimport type { ICmsEntryMetaWithReview } from \"~/types.js\";\nimport { ignoreAction } from \"../ignoreAction.js\";\n\nconst EntryAction = ContentEntryListConfig.Browser.Entry.Action;\n\n/*\n * A disabled menu item cannot take focus, so the reason is given on hover by the tooltip and to\n * assistive technology by `aria-describedby` on a visually hidden element that is always present\n * (the same pattern as the shared `ReviewTooltip`, which needs a review presenter the list does not\n * have).\n */\nconst MoveBlocked = () => {\n const descriptionId = useId();\n\n return (\n <span aria-describedby={descriptionId}>\n <Tooltip\n content={MOVE_BLOCKED_IN_REVIEW}\n trigger={\n <OptionsMenuItem\n icon={<MoveIcon />}\n label={\"Move\"}\n disabled={true}\n onAction={ignoreAction}\n />\n }\n />\n <span id={descriptionId} className={\"sr-only\"}>\n {MOVE_BLOCKED_IN_REVIEW}\n </span>\n </span>\n );\n};\n\ninterface MoveGateProps {\n children?: React.ReactNode;\n}\n\nconst MoveGate = createReactiveComponent((props: MoveGateProps) => {\n const { entry } = useEntry();\n const meta: ICmsEntryMetaWithReview = entry.meta;\n\n if (meta.system?.workflow?.reviewState === ReviewState.InProgress) {\n return <MoveBlocked />;\n }\n\n return <>{props.children}</>;\n});\n\n/*\n * Only the per-row \"Move\" action is gated. Moving by drag and drop and `MoveEntryUseCase` are not\n * gated in 8a (R250, Contract note 2).\n */\nexport const CmsReviewMoveEntryAction = EntryAction.createDecorator(Original => {\n return function CmsReviewMoveEntryActionDecorator(props) {\n if (props.name !== \"move\") {\n return <Original {...props} />;\n }\n\n return <Original {...props} element={<MoveGate>{props.element}</MoveGate>} />;\n };\n});\n"],"names":["EntryAction","ContentEntryListConfig","MoveBlocked","descriptionId","useId","Tooltip","MOVE_BLOCKED_IN_REVIEW","OptionsMenuItem","MoveIcon","ignoreAction","MoveGate","createReactiveComponent","props","entry","useEntry","meta","ReviewState","CmsReviewMoveEntryAction","Original"],"mappings":";;;;;;;;;AAYA,MAAMA,cAAcC,uBAAuB,OAAO,CAAC,KAAK,CAAC,MAAM;AAQ/D,MAAMC,cAAc;IAChB,MAAMC,gBAAgBC;IAEtB,OAAO,WAAP,GACI,oBAAC;QAAK,oBAAkBD;qBACpB,oBAACE,SAAOA;QACJ,SAASC;QACT,uBACI,oBAACC,iBAAeA;YACZ,oBAAM,oBAACC,gBAAQA;YACf,OAAO;YACP,UAAU;YACV,UAAUC;;sBAItB,oBAAC;QAAK,IAAIN;QAAe,WAAW;OAC/BG;AAIjB;AAMA,MAAMI,WAAWC,wBAAwB,CAACC;IACtC,MAAM,EAAEC,KAAK,EAAE,GAAGC;IAClB,MAAMC,OAAgCF,MAAM,IAAI;IAEhD,IAAIE,KAAK,MAAM,EAAE,UAAU,gBAAgBC,YAAY,UAAU,EAC7D,OAAO,WAAP,GAAO,oBAACd,aAAWA;IAGvB,OAAO,WAAP,GAAO,0CAAGU,MAAM,QAAQ;AAC5B;AAMO,MAAMK,2BAA2BjB,YAAY,eAAe,CAACkB,CAAAA,WACzD,SAA2CN,KAAK;QACnD,IAAIA,AAAe,WAAfA,MAAM,IAAI,EACV,OAAO,WAAP,GAAO,oBAACM,UAAaN;QAGzB,OAAO,WAAP,GAAO,oBAACM,UAAAA;YAAU,GAAGN,KAAK;YAAE,uBAAS,oBAACF,UAAQA,MAAEE,MAAM,OAAO;;IACjE"}
@@ -0,0 +1,118 @@
1
+ import react from "react";
2
+ import { describe, expect, it, vi } from "vitest";
3
+ import { render, screen } from "@testing-library/react";
4
+ import { CompositionProvider } from "@webiny/react-composition";
5
+ import { AdminUiProvider } from "@webiny/admin-ui";
6
+ import { ContentEntryListConfig } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
7
+ import { ModelContext } from "@webiny/app-headless-cms/admin/components/ModelProvider/index.js";
8
+ import { EntryProvider } from "@webiny/app-headless-cms/admin/hooks/useEntry.js";
9
+ import { ReviewState } from "@webiny/app-workflows/review/domain/ReviewState.js";
10
+ import { MOVE_BLOCKED_IN_REVIEW } from "@webiny/app-workflows/review/presentation/targetReview/moveBlockedInReview.js";
11
+ import { CmsReviewMoveEntryAction } from "./CmsReviewMoveEntryAction.js";
12
+ import { MODEL } from "../../testing/models.js";
13
+ vi.mock("@webiny/app-aco", async (importOriginal)=>{
14
+ const actual = await importOriginal();
15
+ const React = await import("react");
16
+ const Action = Object.assign((props)=>React.createElement("div", {
17
+ "data-action": props.name
18
+ }, props.element), {
19
+ OptionsMenuItem: ()=>null,
20
+ OptionsMenuLink: ()=>null
21
+ });
22
+ return {
23
+ ...actual,
24
+ AcoConfig: {
25
+ ...actual.AcoConfig,
26
+ Record: {
27
+ ...actual.AcoConfig.Record,
28
+ Action
29
+ }
30
+ }
31
+ };
32
+ });
33
+ vi.mock("@webiny/app-admin", async (importOriginal)=>{
34
+ const actual = await importOriginal();
35
+ const React = await import("react");
36
+ return {
37
+ ...actual,
38
+ OptionsMenuItem: (props)=>React.createElement("button", {
39
+ "data-testid": "blocked-move",
40
+ disabled: props.disabled ?? false
41
+ }, props.label)
42
+ };
43
+ });
44
+ const EntryAction = ContentEntryListConfig.Browser.Entry.Action;
45
+ function createEntry(reviewState) {
46
+ const workflow = null === reviewState ? null : {
47
+ reviewState
48
+ };
49
+ return {
50
+ id: "entry-1#0001",
51
+ entryId: "entry-1",
52
+ meta: {
53
+ title: "Hello",
54
+ status: "draft",
55
+ version: 1,
56
+ locked: false,
57
+ system: {
58
+ workflow
59
+ }
60
+ }
61
+ };
62
+ }
63
+ function renderActions(entry) {
64
+ return render(/*#__PURE__*/ react.createElement(AdminUiProvider, null, /*#__PURE__*/ react.createElement(CompositionProvider, null, /*#__PURE__*/ react.createElement(ModelContext.Provider, {
65
+ value: MODEL
66
+ }, /*#__PURE__*/ react.createElement(EntryProvider, {
67
+ entry: entry
68
+ }, /*#__PURE__*/ react.createElement(CmsReviewMoveEntryAction, null), /*#__PURE__*/ react.createElement(EntryAction, {
69
+ name: "move",
70
+ element: /*#__PURE__*/ react.createElement("span", {
71
+ "data-testid": "move-item"
72
+ })
73
+ }), /*#__PURE__*/ react.createElement(EntryAction, {
74
+ name: "delete",
75
+ element: /*#__PURE__*/ react.createElement("span", {
76
+ "data-testid": "delete-item"
77
+ })
78
+ }))))));
79
+ }
80
+ describe("CmsReviewMoveEntryAction", ()=>{
81
+ it("replaces Move with a disabled item and its reason while the review is in progress", async ()=>{
82
+ renderActions(createEntry(ReviewState.InProgress));
83
+ const blocked = await screen.findByTestId("blocked-move");
84
+ expect(blocked.textContent).toBe("Move");
85
+ expect(blocked.hasAttribute("disabled")).toBe(true);
86
+ expect(screen.queryByTestId("move-item")).toBeNull();
87
+ const describedBy = blocked.closest("[aria-describedby]")?.getAttribute("aria-describedby");
88
+ expect(document.getElementById(describedBy ?? "")?.textContent).toBe(MOVE_BLOCKED_IN_REVIEW);
89
+ });
90
+ it("leaves the other actions of the same row alone while the review is in progress", async ()=>{
91
+ renderActions(createEntry(ReviewState.InProgress));
92
+ expect(await screen.findByTestId("delete-item")).toBeTruthy();
93
+ });
94
+ it.each([
95
+ [
96
+ "approved",
97
+ ReviewState.Approved
98
+ ],
99
+ [
100
+ "rejected",
101
+ ReviewState.Rejected
102
+ ],
103
+ [
104
+ "cancelled",
105
+ ReviewState.Cancelled
106
+ ],
107
+ [
108
+ "missing",
109
+ null
110
+ ]
111
+ ])("keeps the original Move for a %s review", async (_name, reviewState)=>{
112
+ renderActions(createEntry(reviewState));
113
+ expect(await screen.findByTestId("move-item")).toBeTruthy();
114
+ expect(screen.queryByTestId("blocked-move")).toBeNull();
115
+ });
116
+ });
117
+
118
+ //# sourceMappingURL=CmsReviewMoveEntryAction.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/CmsEntriesList/CmsReviewMoveEntryAction.test.js","sources":["../../../src/Components/CmsEntriesList/CmsReviewMoveEntryAction.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { vi } from \"vitest\";\nimport { render } from \"@testing-library/react\";\nimport { screen } from \"@testing-library/react\";\nimport { CompositionProvider } from \"@webiny/react-composition\";\nimport { AdminUiProvider } from \"@webiny/admin-ui\";\nimport { ContentEntryListConfig } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport { ModelContext } from \"@webiny/app-headless-cms/admin/components/ModelProvider/index.js\";\nimport { EntryProvider } from \"@webiny/app-headless-cms/admin/hooks/useEntry.js\";\nimport type { CmsContentEntry } from \"@webiny/app-headless-cms-common/types/index.js\";\nimport { ReviewState } from \"@webiny/app-workflows/review/domain/ReviewState.js\";\nimport { MOVE_BLOCKED_IN_REVIEW } from \"@webiny/app-workflows/review/presentation/targetReview/moveBlockedInReview.js\";\nimport { CmsReviewMoveEntryAction } from \"./CmsReviewMoveEntryAction.js\";\nimport { MODEL } from \"~/testing/models.js\";\n\ninterface FakeActionProps {\n name: string;\n element: React.ReactElement;\n}\n\ninterface FakeMenuItemProps {\n label: string;\n disabled?: boolean;\n}\n\nvi.mock(\"@webiny/app-aco\", async importOriginal => {\n const actual = await importOriginal<typeof import(\"@webiny/app-aco\")>();\n const React = await import(\"react\");\n const Action = Object.assign(\n (props: FakeActionProps) => {\n return React.createElement(\"div\", { \"data-action\": props.name }, props.element);\n },\n { OptionsMenuItem: () => null, OptionsMenuLink: () => null }\n );\n\n return {\n ...actual,\n AcoConfig: {\n ...actual.AcoConfig,\n Record: { ...actual.AcoConfig.Record, Action }\n }\n };\n});\n\nvi.mock(\"@webiny/app-admin\", async importOriginal => {\n const actual = await importOriginal<typeof import(\"@webiny/app-admin\")>();\n const React = await import(\"react\");\n\n return {\n ...actual,\n OptionsMenuItem: (props: FakeMenuItemProps) => {\n return React.createElement(\n \"button\",\n { \"data-testid\": \"blocked-move\", disabled: props.disabled ?? false },\n props.label\n );\n }\n };\n});\n\nconst EntryAction = ContentEntryListConfig.Browser.Entry.Action;\n\nfunction createEntry(reviewState: string | null): CmsContentEntry {\n const workflow = reviewState === null ? null : { reviewState };\n\n return {\n id: \"entry-1#0001\",\n entryId: \"entry-1\",\n meta: { title: \"Hello\", status: \"draft\", version: 1, locked: false, system: { workflow } }\n } as unknown as CmsContentEntry;\n}\n\nfunction renderActions(entry: CmsContentEntry) {\n return render(\n <AdminUiProvider>\n <CompositionProvider>\n <ModelContext.Provider value={MODEL}>\n <EntryProvider entry={entry}>\n <CmsReviewMoveEntryAction />\n <EntryAction name=\"move\" element={<span data-testid=\"move-item\" />} />\n <EntryAction name=\"delete\" element={<span data-testid=\"delete-item\" />} />\n </EntryProvider>\n </ModelContext.Provider>\n </CompositionProvider>\n </AdminUiProvider>\n );\n}\n\ndescribe(\"CmsReviewMoveEntryAction\", () => {\n it(\"replaces Move with a disabled item and its reason while the review is in progress\", async () => {\n renderActions(createEntry(ReviewState.InProgress));\n\n const blocked = await screen.findByTestId(\"blocked-move\");\n\n expect(blocked.textContent).toBe(\"Move\");\n expect(blocked.hasAttribute(\"disabled\")).toBe(true);\n expect(screen.queryByTestId(\"move-item\")).toBeNull();\n const describedBy = blocked.closest(\"[aria-describedby]\")?.getAttribute(\"aria-describedby\");\n expect(document.getElementById(describedBy ?? \"\")?.textContent).toBe(\n MOVE_BLOCKED_IN_REVIEW\n );\n });\n\n it(\"leaves the other actions of the same row alone while the review is in progress\", async () => {\n renderActions(createEntry(ReviewState.InProgress));\n\n expect(await screen.findByTestId(\"delete-item\")).toBeTruthy();\n });\n\n it.each([\n [\"approved\", ReviewState.Approved],\n [\"rejected\", ReviewState.Rejected],\n [\"cancelled\", ReviewState.Cancelled],\n [\"missing\", null]\n ])(\"keeps the original Move for a %s review\", async (_name, reviewState) => {\n renderActions(createEntry(reviewState));\n\n expect(await screen.findByTestId(\"move-item\")).toBeTruthy();\n expect(screen.queryByTestId(\"blocked-move\")).toBeNull();\n });\n});\n"],"names":["vi","importOriginal","actual","React","Action","Object","props","EntryAction","ContentEntryListConfig","createEntry","reviewState","workflow","renderActions","entry","render","AdminUiProvider","CompositionProvider","ModelContext","MODEL","EntryProvider","CmsReviewMoveEntryAction","describe","it","ReviewState","blocked","screen","expect","describedBy","document","MOVE_BLOCKED_IN_REVIEW","_name"],"mappings":";;;;;;;;;;;;AA4BAA,GAAG,IAAI,CAAC,mBAAmB,OAAMC;IAC7B,MAAMC,SAAS,MAAMD;IACrB,MAAME,QAAQ,MAAM,MAAM,CAAC;IAC3B,MAAMC,SAASC,OAAO,MAAM,CACxB,CAACC,QACUH,MAAM,aAAa,CAAC,OAAO;YAAE,eAAeG,MAAM,IAAI;QAAC,GAAGA,MAAM,OAAO,GAElF;QAAE,iBAAiB,IAAM;QAAM,iBAAiB,IAAM;IAAK;IAG/D,OAAO;QACH,GAAGJ,MAAM;QACT,WAAW;YACP,GAAGA,OAAO,SAAS;YACnB,QAAQ;gBAAE,GAAGA,OAAO,SAAS,CAAC,MAAM;gBAAEE;YAAO;QACjD;IACJ;AACJ;AAEAJ,GAAG,IAAI,CAAC,qBAAqB,OAAMC;IAC/B,MAAMC,SAAS,MAAMD;IACrB,MAAME,QAAQ,MAAM,MAAM,CAAC;IAE3B,OAAO;QACH,GAAGD,MAAM;QACT,iBAAiB,CAACI,QACPH,MAAM,aAAa,CACtB,UACA;gBAAE,eAAe;gBAAgB,UAAUG,MAAM,QAAQ,IAAI;YAAM,GACnEA,MAAM,KAAK;IAGvB;AACJ;AAEA,MAAMC,cAAcC,uBAAuB,OAAO,CAAC,KAAK,CAAC,MAAM;AAE/D,SAASC,YAAYC,WAA0B;IAC3C,MAAMC,WAAWD,AAAgB,SAAhBA,cAAuB,OAAO;QAAEA;IAAY;IAE7D,OAAO;QACH,IAAI;QACJ,SAAS;QACT,MAAM;YAAE,OAAO;YAAS,QAAQ;YAAS,SAAS;YAAG,QAAQ;YAAO,QAAQ;gBAAEC;YAAS;QAAE;IAC7F;AACJ;AAEA,SAASC,cAAcC,KAAsB;IACzC,OAAOC,OAAO,WAADA,GACT,oBAACC,iBAAeA,MAAAA,WAAAA,GACZ,oBAACC,qBAAmBA,MAAAA,WAAAA,GAChB,oBAACC,aAAa,QAAQ;QAAC,OAAOC;qBAC1B,oBAACC,eAAaA;QAAC,OAAON;qBAClB,oBAACO,0BAAwBA,OAAAA,WAAAA,GACzB,oBAACb,aAAWA;QAAC,MAAK;QAAO,uBAAS,oBAAC;YAAK,eAAY;;sBACpD,oBAACA,aAAWA;QAAC,MAAK;QAAS,uBAAS,oBAAC;YAAK,eAAY;;;AAM9E;AAEAc,SAAS,4BAA4B;IACjCC,GAAG,qFAAqF;QACpFV,cAAcH,YAAYc,YAAY,UAAU;QAEhD,MAAMC,UAAU,MAAMC,OAAO,YAAY,CAAC;QAE1CC,OAAOF,QAAQ,WAAW,EAAE,IAAI,CAAC;QACjCE,OAAOF,QAAQ,YAAY,CAAC,aAAa,IAAI,CAAC;QAC9CE,OAAOD,OAAO,aAAa,CAAC,cAAc,QAAQ;QAClD,MAAME,cAAcH,QAAQ,OAAO,CAAC,uBAAuB,aAAa;QACxEE,OAAOE,SAAS,cAAc,CAACD,eAAe,KAAK,aAAa,IAAI,CAChEE;IAER;IAEAP,GAAG,kFAAkF;QACjFV,cAAcH,YAAYc,YAAY,UAAU;QAEhDG,OAAO,MAAMD,OAAO,YAAY,CAAC,gBAAgB,UAAU;IAC/D;IAEAH,GAAG,IAAI,CAAC;QACJ;YAAC;YAAYC,YAAY,QAAQ;SAAC;QAClC;YAAC;YAAYA,YAAY,QAAQ;SAAC;QAClC;YAAC;YAAaA,YAAY,SAAS;SAAC;QACpC;YAAC;YAAW;SAAK;KACpB,EAAE,2CAA2C,OAAOO,OAAOpB;QACxDE,cAAcH,YAAYC;QAE1BgB,OAAO,MAAMD,OAAO,YAAY,CAAC,cAAc,UAAU;QACzDC,OAAOD,OAAO,aAAa,CAAC,iBAAiB,QAAQ;IACzD;AACJ"}
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare const CmsReviewScheduleEntryAction: (props: unknown) => React.JSX.Element;
@@ -0,0 +1,22 @@
1
+ import react from "react";
2
+ import { createReactiveComponent } from "@webiny/app-admin";
3
+ import { ContentEntryListConfig } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
4
+ import { useEntry } from "@webiny/app-headless-cms/admin/hooks/useEntry.js";
5
+ import { isReviewSelectable } from "@webiny/app-workflows/review/domain/isReviewSelectable.js";
6
+ const EntryAction = ContentEntryListConfig.Browser.Entry.Action;
7
+ const ScheduleGate = createReactiveComponent((props)=>{
8
+ const { entry } = useEntry();
9
+ const meta = entry.meta;
10
+ if (!isReviewSelectable(meta.system?.workflow?.reviewState ?? null)) return null;
11
+ return /*#__PURE__*/ react.createElement(react.Fragment, null, props.children);
12
+ });
13
+ const CmsReviewScheduleEntryAction = EntryAction.createDecorator((Original)=>function(props) {
14
+ if ("schedule" !== props.name) return /*#__PURE__*/ react.createElement(Original, props);
15
+ return /*#__PURE__*/ react.createElement(Original, {
16
+ ...props,
17
+ element: /*#__PURE__*/ react.createElement(ScheduleGate, null, props.element)
18
+ });
19
+ });
20
+ export { CmsReviewScheduleEntryAction };
21
+
22
+ //# sourceMappingURL=CmsReviewScheduleEntryAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/CmsEntriesList/CmsReviewScheduleEntryAction.js","sources":["../../../src/Components/CmsEntriesList/CmsReviewScheduleEntryAction.tsx"],"sourcesContent":["import React from \"react\";\nimport { createReactiveComponent } from \"@webiny/app-admin\";\nimport { ContentEntryListConfig } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport { useEntry } from \"@webiny/app-headless-cms/admin/hooks/useEntry.js\";\nimport { isReviewSelectable } from \"@webiny/app-workflows/review/domain/isReviewSelectable.js\";\nimport type { ICmsEntryMetaWithReview } from \"~/types.js\";\n\nconst EntryAction = ContentEntryListConfig.Browser.Entry.Action;\n\ninterface ScheduleGateProps {\n children?: React.ReactNode;\n}\n\nconst ScheduleGate = createReactiveComponent((props: ScheduleGateProps) => {\n const { entry } = useEntry();\n const meta: ICmsEntryMetaWithReview = entry.meta;\n\n if (!isReviewSelectable(meta.system?.workflow?.reviewState ?? null)) {\n return null;\n }\n\n return <>{props.children}</>;\n});\n\n/*\n * The scheduler's per-row \"Schedule\" action (only present when the scheduler is installed) is\n * hidden for a row whose review blocks publishing, the same rule as the row selection (D121).\n */\nexport const CmsReviewScheduleEntryAction = EntryAction.createDecorator(Original => {\n return function CmsReviewScheduleEntryActionDecorator(props) {\n if (props.name !== \"schedule\") {\n return <Original {...props} />;\n }\n\n return <Original {...props} element={<ScheduleGate>{props.element}</ScheduleGate>} />;\n };\n});\n"],"names":["EntryAction","ContentEntryListConfig","ScheduleGate","createReactiveComponent","props","entry","useEntry","meta","isReviewSelectable","CmsReviewScheduleEntryAction","Original"],"mappings":";;;;;AAOA,MAAMA,cAAcC,uBAAuB,OAAO,CAAC,KAAK,CAAC,MAAM;AAM/D,MAAMC,eAAeC,wBAAwB,CAACC;IAC1C,MAAM,EAAEC,KAAK,EAAE,GAAGC;IAClB,MAAMC,OAAgCF,MAAM,IAAI;IAEhD,IAAI,CAACG,mBAAmBD,KAAK,MAAM,EAAE,UAAU,eAAe,OAC1D,OAAO;IAGX,OAAO,WAAP,GAAO,0CAAGH,MAAM,QAAQ;AAC5B;AAMO,MAAMK,+BAA+BT,YAAY,eAAe,CAACU,CAAAA,WAC7D,SAA+CN,KAAK;QACvD,IAAIA,AAAe,eAAfA,MAAM,IAAI,EACV,OAAO,WAAP,GAAO,oBAACM,UAAaN;QAGzB,OAAO,WAAP,GAAO,oBAACM,UAAAA;YAAU,GAAGN,KAAK;YAAE,uBAAS,oBAACF,cAAYA,MAAEE,MAAM,OAAO;;IACrE"}
@@ -0,0 +1,98 @@
1
+ import react from "react";
2
+ import { describe, expect, it, vi } from "vitest";
3
+ import { render, screen } from "@testing-library/react";
4
+ import { CompositionProvider } from "@webiny/react-composition";
5
+ import { AdminUiProvider } from "@webiny/admin-ui";
6
+ import { ContentEntryListConfig } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
7
+ import { ModelContext } from "@webiny/app-headless-cms/admin/components/ModelProvider/index.js";
8
+ import { EntryProvider } from "@webiny/app-headless-cms/admin/hooks/useEntry.js";
9
+ import { ReviewState } from "@webiny/app-workflows/review/domain/ReviewState.js";
10
+ import { CmsReviewScheduleEntryAction } from "./CmsReviewScheduleEntryAction.js";
11
+ import { MODEL } from "../../testing/models.js";
12
+ vi.mock("@webiny/app-aco", async (importOriginal)=>{
13
+ const actual = await importOriginal();
14
+ const React = await import("react");
15
+ const Action = Object.assign((props)=>React.createElement("div", {
16
+ "data-action": props.name
17
+ }, props.element), {
18
+ OptionsMenuItem: ()=>null,
19
+ OptionsMenuLink: ()=>null
20
+ });
21
+ return {
22
+ ...actual,
23
+ AcoConfig: {
24
+ ...actual.AcoConfig,
25
+ Record: {
26
+ ...actual.AcoConfig.Record,
27
+ Action
28
+ }
29
+ }
30
+ };
31
+ });
32
+ const EntryAction = ContentEntryListConfig.Browser.Entry.Action;
33
+ function createEntry(reviewState) {
34
+ const workflow = null === reviewState ? null : {
35
+ reviewState
36
+ };
37
+ return {
38
+ id: "entry-1#0001",
39
+ entryId: "entry-1",
40
+ meta: {
41
+ title: "Hello",
42
+ status: "draft",
43
+ version: 1,
44
+ locked: false,
45
+ system: {
46
+ workflow
47
+ }
48
+ }
49
+ };
50
+ }
51
+ function renderActions(entry) {
52
+ return render(/*#__PURE__*/ react.createElement(AdminUiProvider, null, /*#__PURE__*/ react.createElement(CompositionProvider, null, /*#__PURE__*/ react.createElement(ModelContext.Provider, {
53
+ value: MODEL
54
+ }, /*#__PURE__*/ react.createElement(EntryProvider, {
55
+ entry: entry
56
+ }, /*#__PURE__*/ react.createElement(CmsReviewScheduleEntryAction, null), /*#__PURE__*/ react.createElement(EntryAction, {
57
+ name: "schedule",
58
+ element: /*#__PURE__*/ react.createElement("span", {
59
+ "data-testid": "schedule-item"
60
+ })
61
+ }), /*#__PURE__*/ react.createElement(EntryAction, {
62
+ name: "delete",
63
+ element: /*#__PURE__*/ react.createElement("span", {
64
+ "data-testid": "delete-item"
65
+ })
66
+ }))))));
67
+ }
68
+ const CASES = [
69
+ {
70
+ reviewState: null,
71
+ shown: true
72
+ },
73
+ {
74
+ reviewState: ReviewState.Approved,
75
+ shown: true
76
+ },
77
+ {
78
+ reviewState: ReviewState.InProgress,
79
+ shown: false
80
+ },
81
+ {
82
+ reviewState: ReviewState.Rejected,
83
+ shown: false
84
+ },
85
+ {
86
+ reviewState: ReviewState.Cancelled,
87
+ shown: false
88
+ }
89
+ ];
90
+ describe("CmsReviewScheduleEntryAction", ()=>{
91
+ it.each(CASES)("review state $reviewState: Schedule shown is $shown", ({ reviewState, shown })=>{
92
+ renderActions(createEntry(reviewState));
93
+ expect(screen.queryAllByTestId("schedule-item")).toHaveLength(shown ? 1 : 0);
94
+ expect(screen.getByTestId("delete-item")).toBeTruthy();
95
+ });
96
+ });
97
+
98
+ //# sourceMappingURL=CmsReviewScheduleEntryAction.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/CmsEntriesList/CmsReviewScheduleEntryAction.test.js","sources":["../../../src/Components/CmsEntriesList/CmsReviewScheduleEntryAction.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { vi } from \"vitest\";\nimport { render } from \"@testing-library/react\";\nimport { screen } from \"@testing-library/react\";\nimport { CompositionProvider } from \"@webiny/react-composition\";\nimport { AdminUiProvider } from \"@webiny/admin-ui\";\nimport { ContentEntryListConfig } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport { ModelContext } from \"@webiny/app-headless-cms/admin/components/ModelProvider/index.js\";\nimport { EntryProvider } from \"@webiny/app-headless-cms/admin/hooks/useEntry.js\";\nimport type { CmsContentEntry } from \"@webiny/app-headless-cms-common/types/index.js\";\nimport { ReviewState } from \"@webiny/app-workflows/review/domain/ReviewState.js\";\nimport type { ReviewStateValue } from \"@webiny/app-workflows/review/domain/ReviewState.js\";\nimport { CmsReviewScheduleEntryAction } from \"./CmsReviewScheduleEntryAction.js\";\nimport { MODEL } from \"~/testing/models.js\";\n\ninterface FakeActionProps {\n name: string;\n element: React.ReactElement;\n}\n\nvi.mock(\"@webiny/app-aco\", async importOriginal => {\n const actual = await importOriginal<typeof import(\"@webiny/app-aco\")>();\n const React = await import(\"react\");\n const Action = Object.assign(\n (props: FakeActionProps) => {\n return React.createElement(\"div\", { \"data-action\": props.name }, props.element);\n },\n { OptionsMenuItem: () => null, OptionsMenuLink: () => null }\n );\n\n return {\n ...actual,\n AcoConfig: {\n ...actual.AcoConfig,\n Record: { ...actual.AcoConfig.Record, Action }\n }\n };\n});\n\nconst EntryAction = ContentEntryListConfig.Browser.Entry.Action;\n\nfunction createEntry(reviewState: ReviewStateValue | null): CmsContentEntry {\n const workflow = reviewState === null ? null : { reviewState };\n\n return {\n id: \"entry-1#0001\",\n entryId: \"entry-1\",\n meta: { title: \"Hello\", status: \"draft\", version: 1, locked: false, system: { workflow } }\n } as unknown as CmsContentEntry;\n}\n\nfunction renderActions(entry: CmsContentEntry) {\n return render(\n <AdminUiProvider>\n <CompositionProvider>\n <ModelContext.Provider value={MODEL}>\n <EntryProvider entry={entry}>\n <CmsReviewScheduleEntryAction />\n <EntryAction\n name=\"schedule\"\n element={<span data-testid=\"schedule-item\" />}\n />\n <EntryAction name=\"delete\" element={<span data-testid=\"delete-item\" />} />\n </EntryProvider>\n </ModelContext.Provider>\n </CompositionProvider>\n </AdminUiProvider>\n );\n}\n\ninterface ScheduleCase {\n reviewState: ReviewStateValue | null;\n shown: boolean;\n}\n\nconst CASES: ScheduleCase[] = [\n { reviewState: null, shown: true },\n { reviewState: ReviewState.Approved, shown: true },\n { reviewState: ReviewState.InProgress, shown: false },\n { reviewState: ReviewState.Rejected, shown: false },\n { reviewState: ReviewState.Cancelled, shown: false }\n];\n\ndescribe(\"CmsReviewScheduleEntryAction\", () => {\n it.each(CASES)(\n \"review state $reviewState: Schedule shown is $shown\",\n ({ reviewState, shown }) => {\n renderActions(createEntry(reviewState));\n\n expect(screen.queryAllByTestId(\"schedule-item\")).toHaveLength(shown ? 1 : 0);\n expect(screen.getByTestId(\"delete-item\")).toBeTruthy();\n }\n );\n});\n"],"names":["vi","importOriginal","actual","React","Action","Object","props","EntryAction","ContentEntryListConfig","createEntry","reviewState","workflow","renderActions","entry","render","AdminUiProvider","CompositionProvider","ModelContext","MODEL","EntryProvider","CmsReviewScheduleEntryAction","CASES","ReviewState","describe","it","shown","expect","screen"],"mappings":";;;;;;;;;;;AAuBAA,GAAG,IAAI,CAAC,mBAAmB,OAAMC;IAC7B,MAAMC,SAAS,MAAMD;IACrB,MAAME,QAAQ,MAAM,MAAM,CAAC;IAC3B,MAAMC,SAASC,OAAO,MAAM,CACxB,CAACC,QACUH,MAAM,aAAa,CAAC,OAAO;YAAE,eAAeG,MAAM,IAAI;QAAC,GAAGA,MAAM,OAAO,GAElF;QAAE,iBAAiB,IAAM;QAAM,iBAAiB,IAAM;IAAK;IAG/D,OAAO;QACH,GAAGJ,MAAM;QACT,WAAW;YACP,GAAGA,OAAO,SAAS;YACnB,QAAQ;gBAAE,GAAGA,OAAO,SAAS,CAAC,MAAM;gBAAEE;YAAO;QACjD;IACJ;AACJ;AAEA,MAAMG,cAAcC,uBAAuB,OAAO,CAAC,KAAK,CAAC,MAAM;AAE/D,SAASC,YAAYC,WAAoC;IACrD,MAAMC,WAAWD,AAAgB,SAAhBA,cAAuB,OAAO;QAAEA;IAAY;IAE7D,OAAO;QACH,IAAI;QACJ,SAAS;QACT,MAAM;YAAE,OAAO;YAAS,QAAQ;YAAS,SAAS;YAAG,QAAQ;YAAO,QAAQ;gBAAEC;YAAS;QAAE;IAC7F;AACJ;AAEA,SAASC,cAAcC,KAAsB;IACzC,OAAOC,OAAO,WAADA,GACT,oBAACC,iBAAeA,MAAAA,WAAAA,GACZ,oBAACC,qBAAmBA,MAAAA,WAAAA,GAChB,oBAACC,aAAa,QAAQ;QAAC,OAAOC;qBAC1B,oBAACC,eAAaA;QAAC,OAAON;qBAClB,oBAACO,8BAA4BA,OAAAA,WAAAA,GAC7B,oBAACb,aAAWA;QACR,MAAK;QACL,uBAAS,oBAAC;YAAK,eAAY;;sBAE/B,oBAACA,aAAWA;QAAC,MAAK;QAAS,uBAAS,oBAAC;YAAK,eAAY;;;AAM9E;AAOA,MAAMc,QAAwB;IAC1B;QAAE,aAAa;QAAM,OAAO;IAAK;IACjC;QAAE,aAAaC,YAAY,QAAQ;QAAE,OAAO;IAAK;IACjD;QAAE,aAAaA,YAAY,UAAU;QAAE,OAAO;IAAM;IACpD;QAAE,aAAaA,YAAY,QAAQ;QAAE,OAAO;IAAM;IAClD;QAAE,aAAaA,YAAY,SAAS;QAAE,OAAO;IAAM;CACtD;AAEDC,SAAS,gCAAgC;IACrCC,GAAG,IAAI,CAACH,OACJ,uDACA,CAAC,EAAEX,WAAW,EAAEe,KAAK,EAAE;QACnBb,cAAcH,YAAYC;QAE1BgB,OAAOC,OAAO,gBAAgB,CAAC,kBAAkB,YAAY,CAACF,QAAQ,IAAI;QAC1EC,OAAOC,OAAO,WAAW,CAAC,gBAAgB,UAAU;IACxD;AAER"}
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare const CmsEntryReviewBar: (props: unknown) => React.JSX.Element;
@@ -0,0 +1,32 @@
1
+ import react, { useMemo } from "react";
2
+ import { createReactiveComponent } from "@webiny/app-admin";
3
+ import { Separator } from "@webiny/admin-ui";
4
+ import { EditorReviewBar } from "@webiny/app-workflows/review/editor/components/EditorReviewBar.js";
5
+ import { ContentEntryFormContent } from "@webiny/app-headless-cms/presentation/contentEntries/views/layout/index.js";
6
+ import { useContentEntryFormPresenter } from "@webiny/app-headless-cms/presentation/contentEntries/form/useContentEntryFormPresenter.js";
7
+ import { useCmsEntryReview } from "../../features/editorReview/useCmsEntryReview.js";
8
+ import { Routes } from "../../routes.js";
9
+ import { isReviewableModel } from "../../utils/isReviewableModel.js";
10
+ import { getModelFieldLabels } from "./getModelFieldLabels.js";
11
+ const CmsEntryReviewBar = ContentEntryFormContent.createDecorator((Original)=>createReactiveComponent(function(props) {
12
+ const formPresenter = useContentEntryFormPresenter();
13
+ const session = useCmsEntryReview();
14
+ const { entry, model } = formPresenter.vm;
15
+ const hasEntry = null !== entry && isReviewableModel(model);
16
+ const showsBar = hasEntry && "noWorkflow" !== session.presenter.vm.status;
17
+ const fieldLabels = useMemo(()=>getModelFieldLabels(model), [
18
+ model
19
+ ]);
20
+ if (!showsBar) return /*#__PURE__*/ react.createElement(Original, props);
21
+ return /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement("div", {
22
+ className: "max-w-screen p-sm"
23
+ }, /*#__PURE__*/ react.createElement(EditorReviewBar, {
24
+ session: session,
25
+ reviewsRoute: Routes.ContentEntries.ContentReviews,
26
+ fieldLabels: fieldLabels,
27
+ contentTypeLabel: model.name
28
+ })), /*#__PURE__*/ react.createElement(Separator, null), /*#__PURE__*/ react.createElement(Original, props));
29
+ }));
30
+ export { CmsEntryReviewBar };
31
+
32
+ //# sourceMappingURL=CmsEntryReviewBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/ContentEntryForm/CmsEntryReviewBar.js","sources":["../../../src/Components/ContentEntryForm/CmsEntryReviewBar.tsx"],"sourcesContent":["import React from \"react\";\nimport { useMemo } from \"react\";\nimport { createReactiveComponent } from \"@webiny/app-admin\";\nimport { Separator } from \"@webiny/admin-ui\";\nimport { EditorReviewBar } from \"@webiny/app-workflows/review/editor/components/EditorReviewBar.js\";\nimport { ContentEntryFormContent } from \"@webiny/app-headless-cms/presentation/contentEntries/views/layout/index.js\";\nimport { useContentEntryFormPresenter } from \"@webiny/app-headless-cms/presentation/contentEntries/form/useContentEntryFormPresenter.js\";\nimport { useCmsEntryReview } from \"~/features/editorReview/useCmsEntryReview.js\";\nimport { Routes } from \"~/routes.js\";\nimport { isReviewableModel } from \"~/utils/isReviewableModel.js\";\nimport { getModelFieldLabels } from \"./getModelFieldLabels.js\";\n\nexport const CmsEntryReviewBar = ContentEntryFormContent.createDecorator(Original => {\n return createReactiveComponent(function CmsEntryReviewBarDecorator(props) {\n const formPresenter = useContentEntryFormPresenter();\n const session = useCmsEntryReview();\n const { entry, model } = formPresenter.vm;\n const hasEntry = entry !== null && isReviewableModel(model);\n const showsBar = hasEntry && session.presenter.vm.status !== \"noWorkflow\";\n const fieldLabels = useMemo(() => getModelFieldLabels(model), [model]);\n\n if (!showsBar) {\n return <Original {...props} />;\n }\n\n return (\n <>\n <div className={\"max-w-screen p-sm\"}>\n <EditorReviewBar\n session={session}\n reviewsRoute={Routes.ContentEntries.ContentReviews}\n fieldLabels={fieldLabels}\n contentTypeLabel={model.name}\n />\n </div>\n <Separator />\n <Original {...props} />\n </>\n );\n });\n});\n"],"names":["CmsEntryReviewBar","ContentEntryFormContent","Original","createReactiveComponent","props","formPresenter","useContentEntryFormPresenter","session","useCmsEntryReview","entry","model","hasEntry","isReviewableModel","showsBar","fieldLabels","useMemo","getModelFieldLabels","EditorReviewBar","Routes","Separator"],"mappings":";;;;;;;;;;AAYO,MAAMA,oBAAoBC,wBAAwB,eAAe,CAACC,CAAAA,WAC9DC,wBAAwB,SAAoCC,KAAK;QACpE,MAAMC,gBAAgBC;QACtB,MAAMC,UAAUC;QAChB,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGL,cAAc,EAAE;QACzC,MAAMM,WAAWF,AAAU,SAAVA,SAAkBG,kBAAkBF;QACrD,MAAMG,WAAWF,YAAYJ,AAAgC,iBAAhCA,QAAQ,SAAS,CAAC,EAAE,CAAC,MAAM;QACxD,MAAMO,cAAcC,QAAQ,IAAMC,oBAAoBN,QAAQ;YAACA;SAAM;QAErE,IAAI,CAACG,UACD,OAAO,WAAP,GAAO,oBAACX,UAAaE;QAGzB,OAAO,WAAP,GACI,wDACI,oBAAC;YAAI,WAAW;yBACZ,oBAACa,iBAAeA;YACZ,SAASV;YACT,cAAcW,OAAO,cAAc,CAAC,cAAc;YAClD,aAAaJ;YACb,kBAAkBJ,MAAM,IAAI;2BAGpC,oBAACS,WAASA,OAAAA,WAAAA,GACV,oBAACjB,UAAaE;IAG1B"}
@@ -0,0 +1,128 @@
1
+ import react from "react";
2
+ import { describe, expect, it, vi } from "vitest";
3
+ import { act, screen, waitFor } from "@testing-library/react";
4
+ import { ContentEntryFormContent } from "@webiny/app-headless-cms/presentation/contentEntries/views/layout/index.js";
5
+ import { CmsEntryReviewBar } from "./CmsEntryReviewBar.js";
6
+ import { MODEL, SINGLETON_MODEL } from "../../testing/models.js";
7
+ import { renderEditorTree } from "../../testing/renderEditorTree.js";
8
+ import { BOUND_NO_REVIEW, IN_REVIEW, LOADING, NO_WORKFLOW } from "../../testing/reviewStates.js";
9
+ vi.mock("@webiny/app-workflows/review/editor/components/EditorReviewBar.js", async ()=>{
10
+ const React = await import("react");
11
+ return {
12
+ EditorReviewBar: (props)=>React.createElement("div", {
13
+ "data-testid": "editor-review-bar",
14
+ "data-reviews-path": props.reviewsRoute.path,
15
+ "data-field-labels": JSON.stringify(props.fieldLabels ?? null),
16
+ "data-content-type-label": props.contentTypeLabel
17
+ })
18
+ };
19
+ });
20
+ function renderContent(params) {
21
+ return renderEditorTree({
22
+ ...params,
23
+ children: /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(CmsEntryReviewBar, null), /*#__PURE__*/ react.createElement(ContentEntryFormContent, null, /*#__PURE__*/ react.createElement("div", {
24
+ "data-testid": "original"
25
+ })))
26
+ });
27
+ }
28
+ describe("CmsEntryReviewBar", ()=>{
29
+ it("renders one bar above the original content of a loaded entry", async ()=>{
30
+ renderContent({
31
+ reviewVm: BOUND_NO_REVIEW
32
+ });
33
+ const bars = await screen.findAllByTestId("editor-review-bar");
34
+ const original = screen.getByTestId("original");
35
+ expect(bars).toHaveLength(1);
36
+ expect(bars[0].getAttribute("data-reviews-path")).toBe("/cms/content-reviews");
37
+ const position = bars[0].compareDocumentPosition(original);
38
+ expect(position & Node.DOCUMENT_POSITION_FOLLOWING).toBeTruthy();
39
+ });
40
+ it("passes the model name to the bar as the content type label", async ()=>{
41
+ renderContent({
42
+ reviewVm: BOUND_NO_REVIEW
43
+ });
44
+ const [bar] = await screen.findAllByTestId("editor-review-bar");
45
+ expect(bar.getAttribute("data-content-type-label")).toBe("Article");
46
+ });
47
+ it("passes the model's field labels to the bar for Review details (RD5)", async ()=>{
48
+ const model = {
49
+ ...MODEL,
50
+ fields: [
51
+ {
52
+ fieldId: "title",
53
+ label: "Title"
54
+ },
55
+ {
56
+ fieldId: "description",
57
+ label: "Body"
58
+ }
59
+ ]
60
+ };
61
+ renderContent({
62
+ formVm: {
63
+ model
64
+ },
65
+ reviewVm: BOUND_NO_REVIEW
66
+ });
67
+ const [bar] = await screen.findAllByTestId("editor-review-bar");
68
+ expect(JSON.parse(bar.getAttribute("data-field-labels") ?? "null")).toEqual({
69
+ title: "Title",
70
+ description: "Body"
71
+ });
72
+ });
73
+ it.each([
74
+ [
75
+ "loading",
76
+ LOADING
77
+ ],
78
+ [
79
+ "in review",
80
+ IN_REVIEW
81
+ ]
82
+ ])("shows the bar while the status is %s", async (_name, reviewVm)=>{
83
+ renderContent({
84
+ reviewVm
85
+ });
86
+ expect(await screen.findAllByTestId("editor-review-bar")).toHaveLength(1);
87
+ });
88
+ it("shows nothing when no workflow is bound", async ()=>{
89
+ renderContent({
90
+ reviewVm: NO_WORKFLOW
91
+ });
92
+ await waitFor(()=>expect(screen.queryByTestId("editor-review-bar")).toBeNull());
93
+ expect(screen.getByTestId("original")).toBeTruthy();
94
+ });
95
+ it("shows nothing for a new entry", async ()=>{
96
+ renderContent({
97
+ formVm: {
98
+ entry: null,
99
+ isNewEntry: true
100
+ },
101
+ reviewVm: BOUND_NO_REVIEW
102
+ });
103
+ await waitFor(()=>expect(screen.queryByTestId("editor-review-bar")).toBeNull());
104
+ expect(screen.getByTestId("original")).toBeTruthy();
105
+ });
106
+ it("shows nothing for a singleton model", async ()=>{
107
+ renderContent({
108
+ formVm: {
109
+ model: SINGLETON_MODEL
110
+ },
111
+ reviewVm: BOUND_NO_REVIEW
112
+ });
113
+ await waitFor(()=>expect(screen.queryByTestId("editor-review-bar")).toBeNull());
114
+ expect(screen.getByTestId("original")).toBeTruthy();
115
+ });
116
+ it("appears when the status becomes known", async ()=>{
117
+ const view = renderContent({
118
+ reviewVm: NO_WORKFLOW
119
+ });
120
+ await waitFor(()=>expect(screen.queryByTestId("editor-review-bar")).toBeNull());
121
+ act(()=>{
122
+ view.setVm(BOUND_NO_REVIEW);
123
+ });
124
+ expect(await screen.findAllByTestId("editor-review-bar")).toHaveLength(1);
125
+ });
126
+ });
127
+
128
+ //# sourceMappingURL=CmsEntryReviewBar.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/ContentEntryForm/CmsEntryReviewBar.test.js","sources":["../../../src/Components/ContentEntryForm/CmsEntryReviewBar.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { vi } from \"vitest\";\nimport { act } from \"@testing-library/react\";\nimport { screen } from \"@testing-library/react\";\nimport { waitFor } from \"@testing-library/react\";\nimport type { Route } from \"@webiny/app-admin\";\nimport { ContentEntryFormContent } from \"@webiny/app-headless-cms/presentation/contentEntries/views/layout/index.js\";\nimport { CmsEntryReviewBar } from \"./CmsEntryReviewBar.js\";\nimport { MODEL } from \"~/testing/models.js\";\nimport { SINGLETON_MODEL } from \"~/testing/models.js\";\nimport { renderEditorTree } from \"~/testing/renderEditorTree.js\";\nimport { BOUND_NO_REVIEW } from \"~/testing/reviewStates.js\";\nimport { IN_REVIEW } from \"~/testing/reviewStates.js\";\nimport { LOADING } from \"~/testing/reviewStates.js\";\nimport { NO_WORKFLOW } from \"~/testing/reviewStates.js\";\n\ninterface FakeBarProps {\n reviewsRoute: Route<any>;\n fieldLabels?: Record<string, string>;\n contentTypeLabel?: string;\n}\n\nvi.mock(\"@webiny/app-workflows/review/editor/components/EditorReviewBar.js\", async () => {\n const React = await import(\"react\");\n\n return {\n EditorReviewBar: (props: FakeBarProps) => {\n return React.createElement(\"div\", {\n \"data-testid\": \"editor-review-bar\",\n \"data-reviews-path\": props.reviewsRoute.path,\n \"data-field-labels\": JSON.stringify(props.fieldLabels ?? null),\n \"data-content-type-label\": props.contentTypeLabel\n });\n }\n };\n});\n\nfunction renderContent(params: Parameters<typeof renderEditorTree>[0]) {\n return renderEditorTree({\n ...params,\n children: (\n <>\n <CmsEntryReviewBar />\n <ContentEntryFormContent>\n <div data-testid=\"original\" />\n </ContentEntryFormContent>\n </>\n )\n });\n}\n\ndescribe(\"CmsEntryReviewBar\", () => {\n it(\"renders one bar above the original content of a loaded entry\", async () => {\n renderContent({ reviewVm: BOUND_NO_REVIEW });\n\n const bars = await screen.findAllByTestId(\"editor-review-bar\");\n const original = screen.getByTestId(\"original\");\n\n expect(bars).toHaveLength(1);\n expect(bars[0].getAttribute(\"data-reviews-path\")).toBe(\"/cms/content-reviews\");\n const position = bars[0].compareDocumentPosition(original);\n expect(position & Node.DOCUMENT_POSITION_FOLLOWING).toBeTruthy();\n });\n\n it(\"passes the model name to the bar as the content type label\", async () => {\n renderContent({ reviewVm: BOUND_NO_REVIEW });\n\n const [bar] = await screen.findAllByTestId(\"editor-review-bar\");\n expect(bar.getAttribute(\"data-content-type-label\")).toBe(\"Article\");\n });\n\n it(\"passes the model's field labels to the bar for Review details (RD5)\", async () => {\n const model = {\n ...MODEL,\n fields: [\n { fieldId: \"title\", label: \"Title\" },\n { fieldId: \"description\", label: \"Body\" }\n ]\n } as unknown as typeof MODEL;\n renderContent({ formVm: { model }, reviewVm: BOUND_NO_REVIEW });\n\n const [bar] = await screen.findAllByTestId(\"editor-review-bar\");\n expect(JSON.parse(bar.getAttribute(\"data-field-labels\") ?? \"null\")).toEqual({\n title: \"Title\",\n description: \"Body\"\n });\n });\n\n it.each([\n [\"loading\", LOADING],\n [\"in review\", IN_REVIEW]\n ])(\"shows the bar while the status is %s\", async (_name, reviewVm) => {\n renderContent({ reviewVm });\n\n expect(await screen.findAllByTestId(\"editor-review-bar\")).toHaveLength(1);\n });\n\n it(\"shows nothing when no workflow is bound\", async () => {\n renderContent({ reviewVm: NO_WORKFLOW });\n\n await waitFor(() => expect(screen.queryByTestId(\"editor-review-bar\")).toBeNull());\n expect(screen.getByTestId(\"original\")).toBeTruthy();\n });\n\n it(\"shows nothing for a new entry\", async () => {\n renderContent({ formVm: { entry: null, isNewEntry: true }, reviewVm: BOUND_NO_REVIEW });\n\n await waitFor(() => expect(screen.queryByTestId(\"editor-review-bar\")).toBeNull());\n expect(screen.getByTestId(\"original\")).toBeTruthy();\n });\n\n it(\"shows nothing for a singleton model\", async () => {\n renderContent({ formVm: { model: SINGLETON_MODEL }, reviewVm: BOUND_NO_REVIEW });\n\n await waitFor(() => expect(screen.queryByTestId(\"editor-review-bar\")).toBeNull());\n expect(screen.getByTestId(\"original\")).toBeTruthy();\n });\n\n it(\"appears when the status becomes known\", async () => {\n const view = renderContent({ reviewVm: NO_WORKFLOW });\n await waitFor(() => expect(screen.queryByTestId(\"editor-review-bar\")).toBeNull());\n\n act(() => {\n view.setVm(BOUND_NO_REVIEW);\n });\n\n expect(await screen.findAllByTestId(\"editor-review-bar\")).toHaveLength(1);\n });\n});\n"],"names":["vi","React","props","JSON","renderContent","params","renderEditorTree","CmsEntryReviewBar","ContentEntryFormContent","describe","it","BOUND_NO_REVIEW","bars","screen","original","expect","position","Node","bar","model","MODEL","LOADING","IN_REVIEW","_name","reviewVm","NO_WORKFLOW","waitFor","SINGLETON_MODEL","view","act"],"mappings":";;;;;;;;AAyBAA,GAAG,IAAI,CAAC,qEAAqE;IACzE,MAAMC,QAAQ,MAAM,MAAM,CAAC;IAE3B,OAAO;QACH,iBAAiB,CAACC,QACPD,MAAM,aAAa,CAAC,OAAO;gBAC9B,eAAe;gBACf,qBAAqBC,MAAM,YAAY,CAAC,IAAI;gBAC5C,qBAAqBC,KAAK,SAAS,CAACD,MAAM,WAAW,IAAI;gBACzD,2BAA2BA,MAAM,gBAAgB;YACrD;IAER;AACJ;AAEA,SAASE,cAAcC,MAA8C;IACjE,OAAOC,iBAAiB;QACpB,GAAGD,MAAM;QACT,UAAU,WAAV,GACI,wDACI,oBAACE,mBAAiBA,OAAAA,WAAAA,GAClB,oBAACC,yBAAuBA,MAAAA,WAAAA,GACpB,oBAAC;YAAI,eAAY;;IAIjC;AACJ;AAEAC,SAAS,qBAAqB;IAC1BC,GAAG,gEAAgE;QAC/DN,cAAc;YAAE,UAAUO;QAAgB;QAE1C,MAAMC,OAAO,MAAMC,OAAO,eAAe,CAAC;QAC1C,MAAMC,WAAWD,OAAO,WAAW,CAAC;QAEpCE,OAAOH,MAAM,YAAY,CAAC;QAC1BG,OAAOH,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,sBAAsB,IAAI,CAAC;QACvD,MAAMI,WAAWJ,IAAI,CAAC,EAAE,CAAC,uBAAuB,CAACE;QACjDC,OAAOC,WAAWC,KAAK,2BAA2B,EAAE,UAAU;IAClE;IAEAP,GAAG,8DAA8D;QAC7DN,cAAc;YAAE,UAAUO;QAAgB;QAE1C,MAAM,CAACO,IAAI,GAAG,MAAML,OAAO,eAAe,CAAC;QAC3CE,OAAOG,IAAI,YAAY,CAAC,4BAA4B,IAAI,CAAC;IAC7D;IAEAR,GAAG,uEAAuE;QACtE,MAAMS,QAAQ;YACV,GAAGC,KAAK;YACR,QAAQ;gBACJ;oBAAE,SAAS;oBAAS,OAAO;gBAAQ;gBACnC;oBAAE,SAAS;oBAAe,OAAO;gBAAO;aAC3C;QACL;QACAhB,cAAc;YAAE,QAAQ;gBAAEe;YAAM;YAAG,UAAUR;QAAgB;QAE7D,MAAM,CAACO,IAAI,GAAG,MAAML,OAAO,eAAe,CAAC;QAC3CE,OAAOZ,KAAK,KAAK,CAACe,IAAI,YAAY,CAAC,wBAAwB,SAAS,OAAO,CAAC;YACxE,OAAO;YACP,aAAa;QACjB;IACJ;IAEAR,GAAG,IAAI,CAAC;QACJ;YAAC;YAAWW;SAAQ;QACpB;YAAC;YAAaC;SAAU;KAC3B,EAAE,wCAAwC,OAAOC,OAAOC;QACrDpB,cAAc;YAAEoB;QAAS;QAEzBT,OAAO,MAAMF,OAAO,eAAe,CAAC,sBAAsB,YAAY,CAAC;IAC3E;IAEAH,GAAG,2CAA2C;QAC1CN,cAAc;YAAE,UAAUqB;QAAY;QAEtC,MAAMC,QAAQ,IAAMX,OAAOF,OAAO,aAAa,CAAC,sBAAsB,QAAQ;QAC9EE,OAAOF,OAAO,WAAW,CAAC,aAAa,UAAU;IACrD;IAEAH,GAAG,iCAAiC;QAChCN,cAAc;YAAE,QAAQ;gBAAE,OAAO;gBAAM,YAAY;YAAK;YAAG,UAAUO;QAAgB;QAErF,MAAMe,QAAQ,IAAMX,OAAOF,OAAO,aAAa,CAAC,sBAAsB,QAAQ;QAC9EE,OAAOF,OAAO,WAAW,CAAC,aAAa,UAAU;IACrD;IAEAH,GAAG,uCAAuC;QACtCN,cAAc;YAAE,QAAQ;gBAAE,OAAOuB;YAAgB;YAAG,UAAUhB;QAAgB;QAE9E,MAAMe,QAAQ,IAAMX,OAAOF,OAAO,aAAa,CAAC,sBAAsB,QAAQ;QAC9EE,OAAOF,OAAO,WAAW,CAAC,aAAa,UAAU;IACrD;IAEAH,GAAG,yCAAyC;QACxC,MAAMkB,OAAOxB,cAAc;YAAE,UAAUqB;QAAY;QACnD,MAAMC,QAAQ,IAAMX,OAAOF,OAAO,aAAa,CAAC,sBAAsB,QAAQ;QAE9EgB,IAAI;YACAD,KAAK,KAAK,CAACjB;QACf;QAEAI,OAAO,MAAMF,OAAO,eAAe,CAAC,sBAAsB,YAAY,CAAC;IAC3E;AACJ"}
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare const CmsEntryReviewBlockedActions: () => React.JSX.Element;
@@ -0,0 +1,46 @@
1
+ import react from "react";
2
+ import { createReactiveComponent } from "@webiny/app-admin";
3
+ import { InternalContentEntryEditorConfig } from "@webiny/app-headless-cms/admin/config/contentEntries/index.js";
4
+ import { IsModelPublishable } from "@webiny/app-headless-cms/admin/components/IsModelPublishable.js";
5
+ import { usePermission } from "@webiny/app-headless-cms/admin/hooks/usePermission.js";
6
+ import { useContentEntryFormPresenter } from "@webiny/app-headless-cms/presentation/contentEntries/form/useContentEntryFormPresenter.js";
7
+ import { ReviewTooltip } from "@webiny/app-workflows/review/presentation/targetReview/components/ReviewTooltip.js";
8
+ import { useCmsEntryReview } from "../../features/editorReview/useCmsEntryReview.js";
9
+ import { isReviewableModel } from "../../utils/isReviewableModel.js";
10
+ import { ignoreAction } from "../ignoreAction.js";
11
+ const { Actions: Actions } = InternalContentEntryEditorConfig;
12
+ const BlockedActions = createReactiveComponent(()=>{
13
+ const { ButtonPrimary, ButtonSecondary } = Actions.ButtonAction.useButtons();
14
+ const formPresenter = useContentEntryFormPresenter();
15
+ const session = useCmsEntryReview();
16
+ const { canPublish } = usePermission();
17
+ const { entry, model, canSave, canPublish: canPublishNow } = formPresenter.vm;
18
+ const review = session.presenter.vm;
19
+ if (null === entry || !isReviewableModel(model) || null === review.publishDisabledReason) return null;
20
+ const isStatusUnknown = "loading" === review.status || "failed" === review.status;
21
+ const showSave = isStatusUnknown && !canSave;
22
+ const isPublishable = "published" !== entry.meta.status && canPublish("cms.contentEntry");
23
+ const showPublish = isPublishable && !canPublishNow;
24
+ if (!showSave && !showPublish) return null;
25
+ return /*#__PURE__*/ react.createElement(ReviewTooltip, {
26
+ presenter: session.presenter
27
+ }, (describedBy)=>/*#__PURE__*/ react.createElement("span", {
28
+ className: "flex items-center gap-sm"
29
+ }, showSave && /*#__PURE__*/ react.createElement(ButtonSecondary, {
30
+ "aria-disabled": true,
31
+ "aria-describedby": describedBy,
32
+ onAction: ignoreAction
33
+ }, "Save"), showPublish && /*#__PURE__*/ react.createElement(ButtonPrimary, {
34
+ "aria-disabled": true,
35
+ "aria-describedby": describedBy,
36
+ onAction: ignoreAction
37
+ }, "Publish")));
38
+ });
39
+ const CmsEntryReviewBlockedActions = ()=>/*#__PURE__*/ react.createElement(InternalContentEntryEditorConfig, null, /*#__PURE__*/ react.createElement(IsModelPublishable, null, /*#__PURE__*/ react.createElement(Actions.ButtonAction, {
40
+ after: "publishOnly",
41
+ name: "workflowBlockedActions",
42
+ element: /*#__PURE__*/ react.createElement(BlockedActions, null)
43
+ })));
44
+ export { CmsEntryReviewBlockedActions };
45
+
46
+ //# sourceMappingURL=CmsEntryReviewBlockedActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/ContentEntryForm/CmsEntryReviewBlockedActions.js","sources":["../../../src/Components/ContentEntryForm/CmsEntryReviewBlockedActions.tsx"],"sourcesContent":["import React from \"react\";\nimport { createReactiveComponent } from \"@webiny/app-admin\";\nimport { InternalContentEntryEditorConfig } from \"@webiny/app-headless-cms/admin/config/contentEntries/index.js\";\nimport { IsModelPublishable } from \"@webiny/app-headless-cms/admin/components/IsModelPublishable.js\";\nimport { usePermission } from \"@webiny/app-headless-cms/admin/hooks/usePermission.js\";\nimport { useContentEntryFormPresenter } from \"@webiny/app-headless-cms/presentation/contentEntries/form/useContentEntryFormPresenter.js\";\nimport { ReviewTooltip } from \"@webiny/app-workflows/review/presentation/targetReview/components/ReviewTooltip.js\";\nimport { useCmsEntryReview } from \"~/features/editorReview/useCmsEntryReview.js\";\nimport { isReviewableModel } from \"~/utils/isReviewableModel.js\";\nimport { ignoreAction } from \"../ignoreAction.js\";\n\nconst { Actions } = InternalContentEntryEditorConfig;\n\nconst BlockedActions = createReactiveComponent(() => {\n const { ButtonPrimary, ButtonSecondary } = Actions.ButtonAction.useButtons();\n const formPresenter = useContentEntryFormPresenter();\n const session = useCmsEntryReview();\n const { canPublish } = usePermission();\n const { entry, model, canSave, canPublish: canPublishNow } = formPresenter.vm;\n const review = session.presenter.vm;\n\n if (entry === null || !isReviewableModel(model) || review.publishDisabledReason === null) {\n return null;\n }\n\n const isStatusUnknown = review.status === \"loading\" || review.status === \"failed\";\n const showSave = isStatusUnknown && !canSave;\n const isPublishable = entry.meta.status !== \"published\" && canPublish(\"cms.contentEntry\");\n const showPublish = isPublishable && !canPublishNow;\n\n if (!showSave && !showPublish) {\n return null;\n }\n\n return (\n <ReviewTooltip presenter={session.presenter}>\n {describedBy => (\n <span className={\"flex items-center gap-sm\"}>\n {showSave && (\n <ButtonSecondary\n aria-disabled={true}\n aria-describedby={describedBy}\n onAction={ignoreAction}\n >\n {\"Save\"}\n </ButtonSecondary>\n )}\n {showPublish && (\n <ButtonPrimary\n aria-disabled={true}\n aria-describedby={describedBy}\n onAction={ignoreAction}\n >\n {\"Publish\"}\n </ButtonPrimary>\n )}\n </span>\n )}\n </ReviewTooltip>\n );\n});\n\n/*\n * The base Save and Publish buttons render nothing when `canSave` or `canPublish` is false. While\n * the review status is unknown, or a review does not allow publishing yet, this shows them\n * `aria-disabled` and focusable (never removed, R226), with the reason from the shared review rules\n * given by `ReviewTooltip` (its render function hands each button the `aria-describedby`, R241).\n * At most two buttons show (Save only while the status is unknown); the base Save & Publish stays\n * hidden because `canPublish` is false.\n */\nexport const CmsEntryReviewBlockedActions = () => {\n return (\n <InternalContentEntryEditorConfig>\n <IsModelPublishable>\n <Actions.ButtonAction\n after={\"publishOnly\"}\n name={\"workflowBlockedActions\"}\n element={<BlockedActions />}\n />\n </IsModelPublishable>\n </InternalContentEntryEditorConfig>\n );\n};\n"],"names":["Actions","InternalContentEntryEditorConfig","BlockedActions","createReactiveComponent","ButtonPrimary","ButtonSecondary","formPresenter","useContentEntryFormPresenter","session","useCmsEntryReview","canPublish","usePermission","entry","model","canSave","canPublishNow","review","isReviewableModel","isStatusUnknown","showSave","isPublishable","showPublish","ReviewTooltip","describedBy","ignoreAction","CmsEntryReviewBlockedActions","IsModelPublishable"],"mappings":";;;;;;;;;;AAWA,MAAM,EAAEA,SAAAA,OAAO,EAAE,GAAGC;AAEpB,MAAMC,iBAAiBC,wBAAwB;IAC3C,MAAM,EAAEC,aAAa,EAAEC,eAAe,EAAE,GAAGL,QAAQ,YAAY,CAAC,UAAU;IAC1E,MAAMM,gBAAgBC;IACtB,MAAMC,UAAUC;IAChB,MAAM,EAAEC,UAAU,EAAE,GAAGC;IACvB,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAEC,OAAO,EAAE,YAAYC,aAAa,EAAE,GAAGT,cAAc,EAAE;IAC7E,MAAMU,SAASR,QAAQ,SAAS,CAAC,EAAE;IAEnC,IAAII,AAAU,SAAVA,SAAkB,CAACK,kBAAkBJ,UAAUG,AAAiC,SAAjCA,OAAO,qBAAqB,EAC3E,OAAO;IAGX,MAAME,kBAAkBF,AAAkB,cAAlBA,OAAO,MAAM,IAAkBA,AAAkB,aAAlBA,OAAO,MAAM;IACpE,MAAMG,WAAWD,mBAAmB,CAACJ;IACrC,MAAMM,gBAAgBR,AAAsB,gBAAtBA,MAAM,IAAI,CAAC,MAAM,IAAoBF,WAAW;IACtE,MAAMW,cAAcD,iBAAiB,CAACL;IAEtC,IAAI,CAACI,YAAY,CAACE,aACd,OAAO;IAGX,OAAO,WAAP,GACI,oBAACC,eAAaA;QAAC,WAAWd,QAAQ,SAAS;OACtCe,CAAAA,cAAAA,WAAAA,GACG,oBAAC;YAAK,WAAW;WACZJ,YAAY,WAAZA,GACG,oBAACd,iBAAAA;YACG,iBAAe;YACf,oBAAkBkB;YAClB,UAAUC;WAET,SAGRH,eAAe,WAAfA,GACG,oBAACjB,eAAAA;YACG,iBAAe;YACf,oBAAkBmB;YAClB,UAAUC;WAET;AAO7B;AAUO,MAAMC,+BAA+B,IACjC,WAAP,GACI,oBAACxB,kCAAgCA,MAAAA,WAAAA,GAC7B,oBAACyB,oBAAkBA,MAAAA,WAAAA,GACf,oBAAC1B,QAAQ,YAAY;QACjB,OAAO;QACP,MAAM;QACN,uBAAS,oBAACE,gBAAcA"}