@webiny/app-website-builder-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 (402) hide show
  1. package/Components/ContentReviews/WbContentReviews.d.ts +2 -0
  2. package/Components/ContentReviews/WbContentReviews.js +41 -0
  3. package/Components/ContentReviews/WbContentReviews.js.map +1 -0
  4. package/Components/ContentReviews/WbContentReviews.smoke.test.d.ts +1 -0
  5. package/Components/ContentReviews/WbContentReviews.smoke.test.js +59 -0
  6. package/Components/ContentReviews/WbContentReviews.smoke.test.js.map +1 -0
  7. package/Components/ContentReviews/WbContentReviews.test.d.ts +1 -0
  8. package/Components/ContentReviews/WbContentReviews.test.js +80 -0
  9. package/Components/ContentReviews/WbContentReviews.test.js.map +1 -0
  10. package/Components/ContentReviews/WbContentReviewsSidebarItem.d.ts +2 -0
  11. package/Components/ContentReviews/WbContentReviewsSidebarItem.js +18 -0
  12. package/Components/ContentReviews/WbContentReviewsSidebarItem.js.map +1 -0
  13. package/Components/ContentReviews/WbContentReviewsSidebarItem.test.d.ts +1 -0
  14. package/Components/ContentReviews/WbContentReviewsSidebarItem.test.js +67 -0
  15. package/Components/ContentReviews/WbContentReviewsSidebarItem.test.js.map +1 -0
  16. package/Components/PageEditor/DisabledPublishButton.d.ts +6 -0
  17. package/Components/PageEditor/DisabledPublishButton.js +17 -0
  18. package/Components/PageEditor/DisabledPublishButton.js.map +1 -0
  19. package/Components/PageEditor/DisabledPublishButton.test.d.ts +1 -0
  20. package/Components/PageEditor/DisabledPublishButton.test.js +67 -0
  21. package/Components/PageEditor/DisabledPublishButton.test.js.map +1 -0
  22. package/Components/PageEditor/PageBasePublishDecorator.d.ts +2 -0
  23. package/Components/PageEditor/PageBasePublishDecorator.js +23 -0
  24. package/Components/PageEditor/PageBasePublishDecorator.js.map +1 -0
  25. package/Components/PageEditor/PageEditorAutoSave.d.ts +2 -0
  26. package/Components/PageEditor/PageEditorAutoSave.js +23 -0
  27. package/Components/PageEditor/PageEditorAutoSave.js.map +1 -0
  28. package/Components/PageEditor/PageEditorAutoSave.test.d.ts +1 -0
  29. package/Components/PageEditor/PageEditorAutoSave.test.js +111 -0
  30. package/Components/PageEditor/PageEditorAutoSave.test.js.map +1 -0
  31. package/Components/PageEditor/PageEditorConfig.d.ts +2 -0
  32. package/Components/PageEditor/PageEditorConfig.js +13 -0
  33. package/Components/PageEditor/PageEditorConfig.js.map +1 -0
  34. package/Components/PageEditor/PageEditorLayout.d.ts +2 -0
  35. package/Components/PageEditor/PageEditorLayout.js +10 -0
  36. package/Components/PageEditor/PageEditorLayout.js.map +1 -0
  37. package/Components/PageEditor/PageEditorLayout.test.d.ts +1 -0
  38. package/Components/PageEditor/PageEditorLayout.test.js +121 -0
  39. package/Components/PageEditor/PageEditorLayout.test.js.map +1 -0
  40. package/Components/PageEditor/PageEditorTopBar.d.ts +2 -0
  41. package/Components/PageEditor/PageEditorTopBar.js +10 -0
  42. package/Components/PageEditor/PageEditorTopBar.js.map +1 -0
  43. package/Components/PageEditor/PageEditorTopBar.test.d.ts +1 -0
  44. package/Components/PageEditor/PageEditorTopBar.test.js +175 -0
  45. package/Components/PageEditor/PageEditorTopBar.test.js.map +1 -0
  46. package/Components/PageEditor/PageNewRevisionDecorator.d.ts +2 -0
  47. package/Components/PageEditor/PageNewRevisionDecorator.js +24 -0
  48. package/Components/PageEditor/PageNewRevisionDecorator.js.map +1 -0
  49. package/Components/PageEditor/PageNewRevisionDecorator.test.d.ts +1 -0
  50. package/Components/PageEditor/PageNewRevisionDecorator.test.js +107 -0
  51. package/Components/PageEditor/PageNewRevisionDecorator.test.js.map +1 -0
  52. package/Components/PageEditor/PageReadOnlySync.d.ts +3 -0
  53. package/Components/PageEditor/PageReadOnlySync.js +23 -0
  54. package/Components/PageEditor/PageReadOnlySync.js.map +1 -0
  55. package/Components/PageEditor/PageReviewBar.d.ts +4 -0
  56. package/Components/PageEditor/PageReviewBar.js +93 -0
  57. package/Components/PageEditor/PageReviewBar.js.map +1 -0
  58. package/Components/PageEditor/PageReviewBar.test.d.ts +1 -0
  59. package/Components/PageEditor/PageReviewBar.test.js +135 -0
  60. package/Components/PageEditor/PageReviewBar.test.js.map +1 -0
  61. package/Components/PageEditor/PageReviewPublishAction.d.ts +2 -0
  62. package/Components/PageEditor/PageReviewPublishAction.js +15 -0
  63. package/Components/PageEditor/PageReviewPublishAction.js.map +1 -0
  64. package/Components/PageEditor/PageReviewPublishButton.d.ts +4 -0
  65. package/Components/PageEditor/PageReviewPublishButton.js +23 -0
  66. package/Components/PageEditor/PageReviewPublishButton.js.map +1 -0
  67. package/Components/PageEditor/PageScheduleDecorator.d.ts +2 -0
  68. package/Components/PageEditor/PageScheduleDecorator.js +23 -0
  69. package/Components/PageEditor/PageScheduleDecorator.js.map +1 -0
  70. package/Components/PageEditor/PageScheduleDecorator.test.d.ts +1 -0
  71. package/Components/PageEditor/PageScheduleDecorator.test.js +75 -0
  72. package/Components/PageEditor/PageScheduleDecorator.test.js.map +1 -0
  73. package/Components/PageEditor/getPageReadOnlyReason.d.ts +4 -0
  74. package/Components/PageEditor/getPageReadOnlyReason.js +20 -0
  75. package/Components/PageEditor/getPageReadOnlyReason.js.map +1 -0
  76. package/Components/PageEditor/getPageReadOnlyReason.test.d.ts +1 -0
  77. package/Components/PageEditor/getPageReadOnlyReason.test.js +122 -0
  78. package/Components/PageEditor/getPageReadOnlyReason.test.js.map +1 -0
  79. package/Components/PageEditor/getPageReviewContext.d.ts +9 -0
  80. package/Components/PageEditor/getPageReviewContext.js +13 -0
  81. package/Components/PageEditor/getPageReviewContext.js.map +1 -0
  82. package/Components/PageEditor/getPageReviewContext.test.d.ts +1 -0
  83. package/Components/PageEditor/getPageReviewContext.test.js +42 -0
  84. package/Components/PageEditor/getPageReviewContext.test.js.map +1 -0
  85. package/Components/PageEditor/pageEditorDocument.d.ts +17 -0
  86. package/Components/PageEditor/pageEditorDocument.js +0 -0
  87. package/Components/PageEditor/pageReviewMatrix.test.d.ts +1 -0
  88. package/Components/PageEditor/pageReviewMatrix.test.js +223 -0
  89. package/Components/PageEditor/pageReviewMatrix.test.js.map +1 -0
  90. package/Components/PageEditor/publishMatrix.test.d.ts +1 -0
  91. package/Components/PageEditor/publishMatrix.test.js +313 -0
  92. package/Components/PageEditor/publishMatrix.test.js.map +1 -0
  93. package/Components/PagesList/PageListReviewGatedActions.d.ts +2 -0
  94. package/Components/PagesList/PageListReviewGatedActions.js +27 -0
  95. package/Components/PagesList/PageListReviewGatedActions.js.map +1 -0
  96. package/Components/PagesList/PageListReviewGatedActions.test.d.ts +1 -0
  97. package/Components/PagesList/PageListReviewGatedActions.test.js +94 -0
  98. package/Components/PagesList/PageListReviewGatedActions.test.js.map +1 -0
  99. package/Components/PagesList/PagesList.d.ts +2 -0
  100. package/Components/PagesList/PagesList.js +8 -0
  101. package/Components/PagesList/PagesList.js.map +1 -0
  102. package/Components/PagesList/PagesList.test.d.ts +1 -0
  103. package/Components/PagesList/PagesList.test.js +47 -0
  104. package/Components/PagesList/PagesList.test.js.map +1 -0
  105. package/Components/PagesList/index.d.ts +1 -0
  106. package/Components/PagesList/index.js +1 -0
  107. package/Components/index.d.ts +2 -0
  108. package/Components/index.js +2 -0
  109. package/LICENSE +21 -0
  110. package/README.md +11 -0
  111. package/Routes/WebsiteBuilderWorkflowsMenu.d.ts +2 -0
  112. package/Routes/WebsiteBuilderWorkflowsMenu.js +23 -0
  113. package/Routes/WebsiteBuilderWorkflowsMenu.js.map +1 -0
  114. package/Routes/WebsiteBuilderWorkflowsMenu.test.d.ts +1 -0
  115. package/Routes/WebsiteBuilderWorkflowsMenu.test.js +141 -0
  116. package/Routes/WebsiteBuilderWorkflowsMenu.test.js.map +1 -0
  117. package/Routes/index.d.ts +1 -0
  118. package/Routes/index.js +1 -0
  119. package/constants.d.ts +1 -0
  120. package/constants.js +4 -0
  121. package/constants.js.map +1 -0
  122. package/editorGlue.wiring.test.d.ts +1 -0
  123. package/editorGlue.wiring.test.js +128 -0
  124. package/editorGlue.wiring.test.js.map +1 -0
  125. package/features/cache/WbReviewCacheSyncHandler.d.ts +8 -0
  126. package/features/cache/WbReviewCacheSyncHandler.js +14 -0
  127. package/features/cache/WbReviewCacheSyncHandler.js.map +1 -0
  128. package/features/cache/WbReviewPageCacheWriter.d.ts +17 -0
  129. package/features/cache/WbReviewPageCacheWriter.js +39 -0
  130. package/features/cache/WbReviewPageCacheWriter.js.map +1 -0
  131. package/features/cache/WbReviewPageCacheWriter.test.d.ts +1 -0
  132. package/features/cache/WbReviewPageCacheWriter.test.js +115 -0
  133. package/features/cache/WbReviewPageCacheWriter.test.js.map +1 -0
  134. package/features/cache/abstractions.d.ts +5 -0
  135. package/features/cache/abstractions.js +5 -0
  136. package/features/cache/abstractions.js.map +1 -0
  137. package/features/cache/feature.d.ts +1 -0
  138. package/features/cache/feature.js +13 -0
  139. package/features/cache/feature.js.map +1 -0
  140. package/features/editorGateway/WbWorkflowEditorGateway/WbWorkflowEditorGateway.d.ts +25 -0
  141. package/features/editorGateway/WbWorkflowEditorGateway/WbWorkflowEditorGateway.js +112 -0
  142. package/features/editorGateway/WbWorkflowEditorGateway/WbWorkflowEditorGateway.js.map +1 -0
  143. package/features/editorGateway/WbWorkflowEditorGateway/WbWorkflowEditorGateway.test.d.ts +1 -0
  144. package/features/editorGateway/WbWorkflowEditorGateway/WbWorkflowEditorGateway.test.js +632 -0
  145. package/features/editorGateway/WbWorkflowEditorGateway/WbWorkflowEditorGateway.test.js.map +1 -0
  146. package/features/editorGateway/feature.d.ts +1 -0
  147. package/features/editorGateway/feature.js +11 -0
  148. package/features/editorGateway/feature.js.map +1 -0
  149. package/features/editorGateway/feature.test.d.ts +1 -0
  150. package/features/editorGateway/feature.test.js +244 -0
  151. package/features/editorGateway/feature.test.js.map +1 -0
  152. package/features/editorGateway/graphql/deleteWebsiteBuilderPageWorkflow.d.ts +1 -0
  153. package/features/editorGateway/graphql/deleteWebsiteBuilderPageWorkflow.js +19 -0
  154. package/features/editorGateway/graphql/deleteWebsiteBuilderPageWorkflow.js.map +1 -0
  155. package/features/editorGateway/graphql/getWebsiteBuilderPageWorkflow.d.ts +1 -0
  156. package/features/editorGateway/graphql/getWebsiteBuilderPageWorkflow.js +19 -0
  157. package/features/editorGateway/graphql/getWebsiteBuilderPageWorkflow.js.map +1 -0
  158. package/features/editorGateway/graphql/inspectWebsiteBuilderPageRouting.d.ts +1 -0
  159. package/features/editorGateway/graphql/inspectWebsiteBuilderPageRouting.js +19 -0
  160. package/features/editorGateway/graphql/inspectWebsiteBuilderPageRouting.js.map +1 -0
  161. package/features/editorGateway/graphql/listWebsiteBuilderPageWorkflowNames.d.ts +1 -0
  162. package/features/editorGateway/graphql/listWebsiteBuilderPageWorkflowNames.js +23 -0
  163. package/features/editorGateway/graphql/listWebsiteBuilderPageWorkflowNames.js.map +1 -0
  164. package/features/editorGateway/graphql/storeWebsiteBuilderPageWorkflow.d.ts +1 -0
  165. package/features/editorGateway/graphql/storeWebsiteBuilderPageWorkflow.js +19 -0
  166. package/features/editorGateway/graphql/storeWebsiteBuilderPageWorkflow.js.map +1 -0
  167. package/features/editorGateway/graphql/websiteBuilderPageFolderExists.d.ts +1 -0
  168. package/features/editorGateway/graphql/websiteBuilderPageFolderExists.js +16 -0
  169. package/features/editorGateway/graphql/websiteBuilderPageFolderExists.js.map +1 -0
  170. package/features/editorMounting/WbWorkflowEditorAppAdapter.d.ts +21 -0
  171. package/features/editorMounting/WbWorkflowEditorAppAdapter.js +45 -0
  172. package/features/editorMounting/WbWorkflowEditorAppAdapter.js.map +1 -0
  173. package/features/editorMounting/WbWorkflowEditorAppAdapter.test.d.ts +1 -0
  174. package/features/editorMounting/WbWorkflowEditorAppAdapter.test.js +115 -0
  175. package/features/editorMounting/WbWorkflowEditorAppAdapter.test.js.map +1 -0
  176. package/features/editorMounting/abstractions.d.ts +5 -0
  177. package/features/editorMounting/abstractions.js +5 -0
  178. package/features/editorMounting/abstractions.js.map +1 -0
  179. package/features/editorMounting/feature.d.ts +3 -0
  180. package/features/editorMounting/feature.js +19 -0
  181. package/features/editorMounting/feature.js.map +1 -0
  182. package/features/editorMounting/feature.test.d.ts +1 -0
  183. package/features/editorMounting/feature.test.js +93 -0
  184. package/features/editorMounting/feature.test.js.map +1 -0
  185. package/features/editorReview/WbPageContentReloader.d.ts +12 -0
  186. package/features/editorReview/WbPageContentReloader.js +40 -0
  187. package/features/editorReview/WbPageContentReloader.js.map +1 -0
  188. package/features/editorReview/WbPageContentReloader.test.d.ts +1 -0
  189. package/features/editorReview/WbPageContentReloader.test.js +222 -0
  190. package/features/editorReview/WbPageContentReloader.test.js.map +1 -0
  191. package/features/editorReview/WbPageReview.d.ts +8 -0
  192. package/features/editorReview/WbPageReview.js +14 -0
  193. package/features/editorReview/WbPageReview.js.map +1 -0
  194. package/features/editorReview/WbPageUnsavedChanges.d.ts +8 -0
  195. package/features/editorReview/WbPageUnsavedChanges.js +12 -0
  196. package/features/editorReview/WbPageUnsavedChanges.js.map +1 -0
  197. package/features/editorReview/WbPageUnsavedChanges.test.d.ts +1 -0
  198. package/features/editorReview/WbPageUnsavedChanges.test.js +33 -0
  199. package/features/editorReview/WbPageUnsavedChanges.test.js.map +1 -0
  200. package/features/editorReview/abstractions.d.ts +5 -0
  201. package/features/editorReview/abstractions.js +5 -0
  202. package/features/editorReview/abstractions.js.map +1 -0
  203. package/features/editorReview/feature.d.ts +3 -0
  204. package/features/editorReview/feature.js +17 -0
  205. package/features/editorReview/feature.js.map +1 -0
  206. package/features/gateway/WbReviewChangeMessageHandler.d.ts +8 -0
  207. package/features/gateway/WbReviewChangeMessageHandler.js +16 -0
  208. package/features/gateway/WbReviewChangeMessageHandler.js.map +1 -0
  209. package/features/gateway/WbReviewContentAdapter/WbReviewContentAdapter.d.ts +13 -0
  210. package/features/gateway/WbReviewContentAdapter/WbReviewContentAdapter.js +35 -0
  211. package/features/gateway/WbReviewContentAdapter/WbReviewContentAdapter.js.map +1 -0
  212. package/features/gateway/WbReviewContentAdapter/WbReviewContentAdapter.test.d.ts +1 -0
  213. package/features/gateway/WbReviewContentAdapter/WbReviewContentAdapter.test.js +47 -0
  214. package/features/gateway/WbReviewContentAdapter/WbReviewContentAdapter.test.js.map +1 -0
  215. package/features/gateway/WbReviewContentAdapter/abstractions.d.ts +5 -0
  216. package/features/gateway/WbReviewContentAdapter/abstractions.js +5 -0
  217. package/features/gateway/WbReviewContentAdapter/abstractions.js.map +1 -0
  218. package/features/gateway/WbReviewGateway/WbReviewGateway.d.ts +51 -0
  219. package/features/gateway/WbReviewGateway/WbReviewGateway.js +216 -0
  220. package/features/gateway/WbReviewGateway/WbReviewGateway.js.map +1 -0
  221. package/features/gateway/WbReviewGateway/WbReviewGateway.test.d.ts +1 -0
  222. package/features/gateway/WbReviewGateway/WbReviewGateway.test.js +647 -0
  223. package/features/gateway/WbReviewGateway/WbReviewGateway.test.js.map +1 -0
  224. package/features/gateway/WbReviewNotificationHandler.d.ts +8 -0
  225. package/features/gateway/WbReviewNotificationHandler.js +16 -0
  226. package/features/gateway/WbReviewNotificationHandler.js.map +1 -0
  227. package/features/gateway/WbReviewRowProvider/WbReviewRowProvider.d.ts +8 -0
  228. package/features/gateway/WbReviewRowProvider/WbReviewRowProvider.js +14 -0
  229. package/features/gateway/WbReviewRowProvider/WbReviewRowProvider.js.map +1 -0
  230. package/features/gateway/WbReviewRowProvider/abstractions.d.ts +5 -0
  231. package/features/gateway/WbReviewRowProvider/abstractions.js +5 -0
  232. package/features/gateway/WbReviewRowProvider/abstractions.js.map +1 -0
  233. package/features/gateway/assertWbPageNamespace.d.ts +1 -0
  234. package/features/gateway/assertWbPageNamespace.js +7 -0
  235. package/features/gateway/assertWbPageNamespace.js.map +1 -0
  236. package/features/gateway/contentReviewsBindings.test.d.ts +1 -0
  237. package/features/gateway/contentReviewsBindings.test.js +159 -0
  238. package/features/gateway/contentReviewsBindings.test.js.map +1 -0
  239. package/features/gateway/feature.d.ts +4 -0
  240. package/features/gateway/feature.js +27 -0
  241. package/features/gateway/feature.js.map +1 -0
  242. package/features/gateway/feature.test.d.ts +1 -0
  243. package/features/gateway/feature.test.js +85 -0
  244. package/features/gateway/feature.test.js.map +1 -0
  245. package/features/gateway/graphql/WbOperationResponse.d.ts +3 -0
  246. package/features/gateway/graphql/WbOperationResponse.js +0 -0
  247. package/features/gateway/graphql/approveWebsiteBuilderPageReviewStep.d.ts +1 -0
  248. package/features/gateway/graphql/approveWebsiteBuilderPageReviewStep.js +22 -0
  249. package/features/gateway/graphql/approveWebsiteBuilderPageReviewStep.js.map +1 -0
  250. package/features/gateway/graphql/cancelWebsiteBuilderPageReview.d.ts +1 -0
  251. package/features/gateway/graphql/cancelWebsiteBuilderPageReview.js +18 -0
  252. package/features/gateway/graphql/cancelWebsiteBuilderPageReview.js.map +1 -0
  253. package/features/gateway/graphql/cancelWebsiteBuilderPageReviewsForDelete.d.ts +1 -0
  254. package/features/gateway/graphql/cancelWebsiteBuilderPageReviewsForDelete.js +26 -0
  255. package/features/gateway/graphql/cancelWebsiteBuilderPageReviewsForDelete.js.map +1 -0
  256. package/features/gateway/graphql/getWebsiteBuilderPageReview.d.ts +1 -0
  257. package/features/gateway/graphql/getWebsiteBuilderPageReview.js +18 -0
  258. package/features/gateway/graphql/getWebsiteBuilderPageReview.js.map +1 -0
  259. package/features/gateway/graphql/getWebsiteBuilderPageReviewStepRun.d.ts +1 -0
  260. package/features/gateway/graphql/getWebsiteBuilderPageReviewStepRun.js +18 -0
  261. package/features/gateway/graphql/getWebsiteBuilderPageReviewStepRun.js.map +1 -0
  262. package/features/gateway/graphql/getWebsiteBuilderPageTargetReview.d.ts +1 -0
  263. package/features/gateway/graphql/getWebsiteBuilderPageTargetReview.js +18 -0
  264. package/features/gateway/graphql/getWebsiteBuilderPageTargetReview.js.map +1 -0
  265. package/features/gateway/graphql/listWebsiteBuilderPageReviewStepCandidates.d.ts +1 -0
  266. package/features/gateway/graphql/listWebsiteBuilderPageReviewStepCandidates.js +18 -0
  267. package/features/gateway/graphql/listWebsiteBuilderPageReviewStepCandidates.js.map +1 -0
  268. package/features/gateway/graphql/listWebsiteBuilderPageReviews.d.ts +1 -0
  269. package/features/gateway/graphql/listWebsiteBuilderPageReviews.js +34 -0
  270. package/features/gateway/graphql/listWebsiteBuilderPageReviews.js.map +1 -0
  271. package/features/gateway/graphql/listWebsiteBuilderPageStepCandidates.d.ts +1 -0
  272. package/features/gateway/graphql/listWebsiteBuilderPageStepCandidates.js +22 -0
  273. package/features/gateway/graphql/listWebsiteBuilderPageStepCandidates.js.map +1 -0
  274. package/features/gateway/graphql/listWebsiteBuilderPageWorkflows.d.ts +1 -0
  275. package/features/gateway/graphql/listWebsiteBuilderPageWorkflows.js +18 -0
  276. package/features/gateway/graphql/listWebsiteBuilderPageWorkflows.js.map +1 -0
  277. package/features/gateway/graphql/reassignWebsiteBuilderPageReviewStep.d.ts +1 -0
  278. package/features/gateway/graphql/reassignWebsiteBuilderPageReviewStep.js +22 -0
  279. package/features/gateway/graphql/reassignWebsiteBuilderPageReviewStep.js.map +1 -0
  280. package/features/gateway/graphql/rejectWebsiteBuilderPageReviewStep.d.ts +1 -0
  281. package/features/gateway/graphql/rejectWebsiteBuilderPageReviewStep.js +22 -0
  282. package/features/gateway/graphql/rejectWebsiteBuilderPageReviewStep.js.map +1 -0
  283. package/features/gateway/graphql/requestWebsiteBuilderPageReview.d.ts +1 -0
  284. package/features/gateway/graphql/requestWebsiteBuilderPageReview.js +26 -0
  285. package/features/gateway/graphql/requestWebsiteBuilderPageReview.js.map +1 -0
  286. package/features/gateway/graphql/restartWebsiteBuilderPageReviewStep.d.ts +1 -0
  287. package/features/gateway/graphql/restartWebsiteBuilderPageReviewStep.js +18 -0
  288. package/features/gateway/graphql/restartWebsiteBuilderPageReviewStep.js.map +1 -0
  289. package/features/gateway/graphql/startWebsiteBuilderPageReviewStep.d.ts +1 -0
  290. package/features/gateway/graphql/startWebsiteBuilderPageReviewStep.js +18 -0
  291. package/features/gateway/graphql/startWebsiteBuilderPageReviewStep.js.map +1 -0
  292. package/features/gateway/graphql/takeOverWebsiteBuilderPageReviewStep.d.ts +1 -0
  293. package/features/gateway/graphql/takeOverWebsiteBuilderPageReviewStep.js +26 -0
  294. package/features/gateway/graphql/takeOverWebsiteBuilderPageReviewStep.js.map +1 -0
  295. package/features/trash/BulkDeletePresenterReviewDecorator.d.ts +14 -0
  296. package/features/trash/BulkDeletePresenterReviewDecorator.js +27 -0
  297. package/features/trash/BulkDeletePresenterReviewDecorator.js.map +1 -0
  298. package/features/trash/BulkDeletePresenterReviewDecorator.test.d.ts +1 -0
  299. package/features/trash/BulkDeletePresenterReviewDecorator.test.js +234 -0
  300. package/features/trash/BulkDeletePresenterReviewDecorator.test.js.map +1 -0
  301. package/features/trash/DeletePageRevisionUseCaseReviewDecorator.d.ts +13 -0
  302. package/features/trash/DeletePageRevisionUseCaseReviewDecorator.js +23 -0
  303. package/features/trash/DeletePageRevisionUseCaseReviewDecorator.js.map +1 -0
  304. package/features/trash/DeletePageRevisionUseCaseReviewDecorator.test.d.ts +1 -0
  305. package/features/trash/DeletePageRevisionUseCaseReviewDecorator.test.js +114 -0
  306. package/features/trash/DeletePageRevisionUseCaseReviewDecorator.test.js.map +1 -0
  307. package/features/trash/DeletePageUseCaseReviewDecorator.d.ts +13 -0
  308. package/features/trash/DeletePageUseCaseReviewDecorator.js +23 -0
  309. package/features/trash/DeletePageUseCaseReviewDecorator.js.map +1 -0
  310. package/features/trash/DeletePageUseCaseReviewDecorator.test.d.ts +1 -0
  311. package/features/trash/DeletePageUseCaseReviewDecorator.test.js +134 -0
  312. package/features/trash/DeletePageUseCaseReviewDecorator.test.js.map +1 -0
  313. package/features/trash/feature.d.ts +1 -0
  314. package/features/trash/feature.js +15 -0
  315. package/features/trash/feature.js.map +1 -0
  316. package/features/trash/feature.test.d.ts +1 -0
  317. package/features/trash/feature.test.js +183 -0
  318. package/features/trash/feature.test.js.map +1 -0
  319. package/hooks/usePage.d.ts +5 -0
  320. package/hooks/usePage.js +15 -0
  321. package/hooks/usePage.js.map +1 -0
  322. package/hooks/usePage.test.d.ts +1 -0
  323. package/hooks/usePage.test.js +49 -0
  324. package/hooks/usePage.test.js.map +1 -0
  325. package/index.d.ts +2 -0
  326. package/index.js +40 -0
  327. package/index.js.map +1 -0
  328. package/index.mount.test.d.ts +1 -0
  329. package/index.mount.test.js +50 -0
  330. package/index.mount.test.js.map +1 -0
  331. package/index.test.d.ts +1 -0
  332. package/index.test.js +523 -0
  333. package/index.test.js.map +1 -0
  334. package/package.json +54 -0
  335. package/pageListChangeStatus.wiring.test.d.ts +1 -0
  336. package/pageListChangeStatus.wiring.test.js +175 -0
  337. package/pageListChangeStatus.wiring.test.js.map +1 -0
  338. package/pageListGlue.wiring.test.d.ts +1 -0
  339. package/pageListGlue.wiring.test.js +220 -0
  340. package/pageListGlue.wiring.test.js.map +1 -0
  341. package/presentation/page/PageGet/WbReviewGetPageFieldSelection.d.ts +8 -0
  342. package/presentation/page/PageGet/WbReviewGetPageFieldSelection.js +16 -0
  343. package/presentation/page/PageGet/WbReviewGetPageFieldSelection.js.map +1 -0
  344. package/presentation/page/PageGet/WbReviewGetPageFieldSelection.test.d.ts +1 -0
  345. package/presentation/page/PageGet/WbReviewGetPageFieldSelection.test.js +19 -0
  346. package/presentation/page/PageGet/WbReviewGetPageFieldSelection.test.js.map +1 -0
  347. package/presentation/page/PageGet/feature.d.ts +1 -0
  348. package/presentation/page/PageGet/feature.js +11 -0
  349. package/presentation/page/PageGet/feature.js.map +1 -0
  350. package/presentation/page/PageList/WbReviewListPagesFieldSelection.d.ts +8 -0
  351. package/presentation/page/PageList/WbReviewListPagesFieldSelection.js +16 -0
  352. package/presentation/page/PageList/WbReviewListPagesFieldSelection.js.map +1 -0
  353. package/presentation/page/PageList/WbReviewListPagesFieldSelection.test.d.ts +1 -0
  354. package/presentation/page/PageList/WbReviewListPagesFieldSelection.test.js +19 -0
  355. package/presentation/page/PageList/WbReviewListPagesFieldSelection.test.js.map +1 -0
  356. package/presentation/page/PageList/WbReviewTableRowMapperDecorator.d.ts +12 -0
  357. package/presentation/page/PageList/WbReviewTableRowMapperDecorator.js +24 -0
  358. package/presentation/page/PageList/WbReviewTableRowMapperDecorator.js.map +1 -0
  359. package/presentation/page/PageList/WbReviewTableRowMapperDecorator.test.d.ts +1 -0
  360. package/presentation/page/PageList/WbReviewTableRowMapperDecorator.test.js +70 -0
  361. package/presentation/page/PageList/WbReviewTableRowMapperDecorator.test.js.map +1 -0
  362. package/presentation/page/PageList/feature.d.ts +1 -0
  363. package/presentation/page/PageList/feature.js +13 -0
  364. package/presentation/page/PageList/feature.js.map +1 -0
  365. package/presentation/page/RevisionList/RevisionListPresenterDecorator.d.ts +15 -0
  366. package/presentation/page/RevisionList/RevisionListPresenterDecorator.js +36 -0
  367. package/presentation/page/RevisionList/RevisionListPresenterDecorator.js.map +1 -0
  368. package/presentation/page/RevisionList/RevisionListPresenterDecorator.test.d.ts +1 -0
  369. package/presentation/page/RevisionList/RevisionListPresenterDecorator.test.js +119 -0
  370. package/presentation/page/RevisionList/RevisionListPresenterDecorator.test.js.map +1 -0
  371. package/presentation/page/RevisionList/feature.d.ts +1 -0
  372. package/presentation/page/RevisionList/feature.js +11 -0
  373. package/presentation/page/RevisionList/feature.js.map +1 -0
  374. package/presentation/page/wbReviewPageSelection.d.ts +1 -0
  375. package/presentation/page/wbReviewPageSelection.js +9 -0
  376. package/presentation/page/wbReviewPageSelection.js.map +1 -0
  377. package/publishAutosave.wiring.test.d.ts +1 -0
  378. package/publishAutosave.wiring.test.js +162 -0
  379. package/publishAutosave.wiring.test.js.map +1 -0
  380. package/routes.d.ts +9 -0
  381. package/routes.js +19 -0
  382. package/routes.js.map +1 -0
  383. package/testing/WbEditorHarness.d.ts +11 -0
  384. package/testing/WbEditorHarness.js +22 -0
  385. package/testing/WbEditorHarness.js.map +1 -0
  386. package/testing/createFakeSession.d.ts +9 -0
  387. package/testing/createFakeSession.js +29 -0
  388. package/testing/createFakeSession.js.map +1 -0
  389. package/testing/createFakeVm.d.ts +3 -0
  390. package/testing/createFakeVm.js +51 -0
  391. package/testing/createFakeVm.js.map +1 -0
  392. package/testing/createFolder.d.ts +2 -0
  393. package/testing/createFolder.js +13 -0
  394. package/testing/createFolder.js.map +1 -0
  395. package/testing/createPageEditor.d.ts +4 -0
  396. package/testing/createPageEditor.js +26 -0
  397. package/testing/createPageEditor.js.map +1 -0
  398. package/testing/registerPageContent.d.ts +20 -0
  399. package/testing/registerPageContent.js +28 -0
  400. package/testing/registerPageContent.js.map +1 -0
  401. package/types.d.ts +9 -0
  402. package/types.js +0 -0
@@ -0,0 +1,313 @@
1
+ import react from "react";
2
+ import { act, cleanup, render, screen, waitFor } from "@testing-library/react";
3
+ import { afterEach, describe, expect, it, vi } from "vitest";
4
+ import { Container } from "@webiny/di";
5
+ import { InternalPageEditorConfig, PageEditorConfig } from "@webiny/app-website-builder/presentation/pages/PageEditor/PageEditorConfig.js";
6
+ import { WbPageReview } from "../../features/editorReview/abstractions.js";
7
+ import { WbEditorHarness } from "../../testing/WbEditorHarness.js";
8
+ import { createFakeSession } from "../../testing/createFakeSession.js";
9
+ import { createPageEditor } from "../../testing/createPageEditor.js";
10
+ import { PageBasePublishDecorator } from "./PageBasePublishDecorator.js";
11
+ import { PageEditorLayout } from "./PageEditorLayout.js";
12
+ import { PageReviewPublishAction } from "./PageReviewPublishAction.js";
13
+ vi.mock("@webiny/icons/publish.svg", ()=>({
14
+ ReactComponent: ()=>null
15
+ }));
16
+ vi.mock("@webiny/app-website-builder/presentation/pages/PageEditor/TopBar/PublishButton.js", async ()=>{
17
+ const React = await import("react");
18
+ const PublishButton = ()=>React.createElement("button", {
19
+ "data-testid": "enabled-publish"
20
+ }, "Publish");
21
+ return {
22
+ PublishButton
23
+ };
24
+ });
25
+ vi.mock("@webiny/app-workflows/review/presentation/targetReview/components/ReviewTooltip.js", async ()=>{
26
+ const React = await import("react");
27
+ const ReviewTooltip = (props)=>{
28
+ const reason = props.presenter.vm.publishDisabledReason ?? "";
29
+ return React.createElement("span", {
30
+ "data-testid": "review-tooltip",
31
+ "data-reason": reason
32
+ }, props.children("tooltip-description"));
33
+ };
34
+ return {
35
+ ReviewTooltip
36
+ };
37
+ });
38
+ const permission = vi.hoisted(()=>({
39
+ allowed: true,
40
+ requests: []
41
+ }));
42
+ vi.mock("@webiny/app-website-builder/presentation/security/HasPermission.js", async ()=>{
43
+ const React = await import("react");
44
+ const HasPermission = (props)=>{
45
+ permission.requests.push({
46
+ entity: props.entity,
47
+ action: props.action
48
+ });
49
+ if (!permission.allowed) return null;
50
+ return React.createElement(React.Fragment, null, props.children);
51
+ };
52
+ return {
53
+ HasPermission
54
+ };
55
+ });
56
+ vi.mock("@webiny/app-website-builder/BaseEditor/config/Layout.js", async ()=>{
57
+ const React = await import("react");
58
+ const { makeDecoratable } = await import("@webiny/react-composition");
59
+ const Layout = makeDecoratable("EditorLayout", ()=>React.createElement("div", {
60
+ "data-testid": "base-layout"
61
+ }));
62
+ return {
63
+ Layout
64
+ };
65
+ });
66
+ const { Ui: Ui } = PageEditorConfig;
67
+ const MATRIX = [
68
+ {
69
+ kind: "loading",
70
+ page: "draft",
71
+ base: false,
72
+ enabled: false,
73
+ disabled: true
74
+ },
75
+ {
76
+ kind: "loading",
77
+ page: "published",
78
+ base: false,
79
+ enabled: false,
80
+ disabled: false
81
+ },
82
+ {
83
+ kind: "loading",
84
+ page: "unpublished",
85
+ base: false,
86
+ enabled: false,
87
+ disabled: true
88
+ },
89
+ {
90
+ kind: "failed",
91
+ page: "draft",
92
+ base: false,
93
+ enabled: false,
94
+ disabled: true
95
+ },
96
+ {
97
+ kind: "failed",
98
+ page: "published",
99
+ base: false,
100
+ enabled: false,
101
+ disabled: false
102
+ },
103
+ {
104
+ kind: "failed",
105
+ page: "unpublished",
106
+ base: false,
107
+ enabled: false,
108
+ disabled: true
109
+ },
110
+ {
111
+ kind: "noWorkflow",
112
+ page: "draft",
113
+ base: true,
114
+ enabled: false,
115
+ disabled: false
116
+ },
117
+ {
118
+ kind: "noWorkflow",
119
+ page: "published",
120
+ base: false,
121
+ enabled: false,
122
+ disabled: false
123
+ },
124
+ {
125
+ kind: "noWorkflow",
126
+ page: "unpublished",
127
+ base: false,
128
+ enabled: false,
129
+ disabled: false
130
+ },
131
+ {
132
+ kind: "none",
133
+ page: "draft",
134
+ base: false,
135
+ enabled: false,
136
+ disabled: true
137
+ },
138
+ {
139
+ kind: "none",
140
+ page: "published",
141
+ base: false,
142
+ enabled: false,
143
+ disabled: false
144
+ },
145
+ {
146
+ kind: "none",
147
+ page: "unpublished",
148
+ base: false,
149
+ enabled: true,
150
+ disabled: false
151
+ },
152
+ {
153
+ kind: "inProgress",
154
+ page: "draft",
155
+ base: false,
156
+ enabled: false,
157
+ disabled: true
158
+ },
159
+ {
160
+ kind: "inProgress",
161
+ page: "published",
162
+ base: false,
163
+ enabled: false,
164
+ disabled: false
165
+ },
166
+ {
167
+ kind: "inProgress",
168
+ page: "unpublished",
169
+ base: false,
170
+ enabled: false,
171
+ disabled: true
172
+ },
173
+ {
174
+ kind: "approved",
175
+ page: "draft",
176
+ base: false,
177
+ enabled: true,
178
+ disabled: false
179
+ },
180
+ {
181
+ kind: "approved",
182
+ page: "published",
183
+ base: false,
184
+ enabled: false,
185
+ disabled: false
186
+ },
187
+ {
188
+ kind: "approved",
189
+ page: "unpublished",
190
+ base: false,
191
+ enabled: true,
192
+ disabled: false
193
+ },
194
+ {
195
+ kind: "rejected",
196
+ page: "draft",
197
+ base: false,
198
+ enabled: false,
199
+ disabled: true
200
+ },
201
+ {
202
+ kind: "rejected",
203
+ page: "published",
204
+ base: false,
205
+ enabled: false,
206
+ disabled: false
207
+ },
208
+ {
209
+ kind: "rejected",
210
+ page: "unpublished",
211
+ base: false,
212
+ enabled: false,
213
+ disabled: true
214
+ }
215
+ ];
216
+ const mountPublish = (pageStatus, kind)=>{
217
+ const handle = createFakeSession(kind, "unpublished" === pageStatus);
218
+ const container = new Container();
219
+ container.registerInstance(WbPageReview, handle.session);
220
+ const editor = createPageEditor(pageStatus);
221
+ render(/*#__PURE__*/ react.createElement(WbEditorHarness, {
222
+ container: container,
223
+ editor: editor,
224
+ groups: [
225
+ "actions"
226
+ ]
227
+ }, /*#__PURE__*/ react.createElement(PageEditorLayout, null), /*#__PURE__*/ react.createElement(Ui.Layout, null), /*#__PURE__*/ react.createElement(PageBasePublishDecorator, null), /*#__PURE__*/ react.createElement(InternalPageEditorConfig, null, /*#__PURE__*/ react.createElement(Ui.TopBar.Action, {
228
+ name: "sentinel",
229
+ element: /*#__PURE__*/ react.createElement("span", {
230
+ "data-testid": "sentinel"
231
+ })
232
+ }), /*#__PURE__*/ react.createElement(Ui.IsNotReadOnly, null, /*#__PURE__*/ react.createElement(Ui.TopBar.Action, {
233
+ name: "buttonPublish",
234
+ element: /*#__PURE__*/ react.createElement("span", {
235
+ "data-testid": "base-publish"
236
+ })
237
+ }))), /*#__PURE__*/ react.createElement(PageEditorConfig, null, /*#__PURE__*/ react.createElement(PageReviewPublishAction, null))));
238
+ return {
239
+ ...handle,
240
+ editor
241
+ };
242
+ };
243
+ const getDisabledButtons = ()=>Array.from(document.querySelectorAll("button[aria-disabled='true']"));
244
+ describe("Publish by review status and page status", ()=>{
245
+ afterEach(()=>{
246
+ cleanup();
247
+ permission.allowed = true;
248
+ permission.requests = [];
249
+ });
250
+ it.each(MATRIX)("$kind review on a $page page", async ({ kind, page, base, enabled, disabled })=>{
251
+ const { presenter } = mountPublish(page, kind);
252
+ await screen.findByTestId("sentinel");
253
+ await waitFor(()=>{
254
+ expect(screen.queryAllByTestId("base-publish")).toHaveLength(base ? 1 : 0);
255
+ expect(screen.queryAllByTestId("enabled-publish")).toHaveLength(enabled ? 1 : 0);
256
+ expect(getDisabledButtons()).toHaveLength(disabled ? 1 : 0);
257
+ });
258
+ if (disabled) {
259
+ const button = getDisabledButtons()[0];
260
+ const tooltip = button.closest("[data-testid='review-tooltip']");
261
+ const reason = presenter.vm.publishDisabledReason;
262
+ expect(reason).not.toBeNull();
263
+ expect(tooltip?.getAttribute("data-reason")).toBe(reason);
264
+ }
265
+ });
266
+ it("an approved, unpublished page shows an enabled Publish although the canvas is read-only", async ()=>{
267
+ const { editor } = mountPublish("unpublished", "approved");
268
+ await screen.findByTestId("sentinel");
269
+ await waitFor(()=>{
270
+ expect(screen.queryAllByTestId("enabled-publish")).toHaveLength(1);
271
+ });
272
+ expect(editor.getEditorState().read().isReadOnly).toBe(true);
273
+ expect(screen.queryAllByTestId("base-publish")).toHaveLength(0);
274
+ });
275
+ it("an unpublished page with no review shows an enabled Publish: it was reviewed before it was published (Q19)", async ()=>{
276
+ const { editor } = mountPublish("unpublished", "none");
277
+ await screen.findByTestId("sentinel");
278
+ await waitFor(()=>{
279
+ expect(screen.queryAllByTestId("enabled-publish")).toHaveLength(1);
280
+ });
281
+ expect(editor.getEditorState().read().isReadOnly).toBe(true);
282
+ expect(getDisabledButtons()).toHaveLength(0);
283
+ expect(screen.queryAllByTestId("base-publish")).toHaveLength(0);
284
+ });
285
+ it("follows the review while the editor is open: approval turns the disabled Publish on", async ()=>{
286
+ const { setKind } = mountPublish("draft", "inProgress");
287
+ await screen.findByTestId("sentinel");
288
+ await waitFor(()=>{
289
+ expect(getDisabledButtons()).toHaveLength(1);
290
+ });
291
+ act(()=>{
292
+ setKind("approved");
293
+ });
294
+ await waitFor(()=>{
295
+ expect(screen.queryAllByTestId("enabled-publish")).toHaveLength(1);
296
+ });
297
+ expect(getDisabledButtons()).toHaveLength(0);
298
+ });
299
+ it("shows no workflows Publish to a user without the page publish permission", async ()=>{
300
+ permission.allowed = false;
301
+ mountPublish("draft", "approved");
302
+ await screen.findByTestId("sentinel");
303
+ await act(async ()=>{});
304
+ expect(permission.requests).toContainEqual({
305
+ entity: "page",
306
+ action: "publish"
307
+ });
308
+ expect(screen.queryAllByTestId("enabled-publish")).toHaveLength(0);
309
+ expect(getDisabledButtons()).toHaveLength(0);
310
+ });
311
+ });
312
+
313
+ //# sourceMappingURL=publishMatrix.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/PageEditor/publishMatrix.test.js","sources":["../../../src/Components/PageEditor/publishMatrix.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { act } from \"@testing-library/react\";\nimport { cleanup } from \"@testing-library/react\";\nimport { render } from \"@testing-library/react\";\nimport { screen } from \"@testing-library/react\";\nimport { waitFor } from \"@testing-library/react\";\nimport { 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 { InternalPageEditorConfig } from \"@webiny/app-website-builder/presentation/pages/PageEditor/PageEditorConfig.js\";\nimport { PageEditorConfig } from \"@webiny/app-website-builder/presentation/pages/PageEditor/PageEditorConfig.js\";\nimport type { WbStatus } from \"@webiny/app-website-builder/constants.js\";\nimport { WbPageReview } from \"~/features/editorReview/abstractions.js\";\nimport { WbEditorHarness } from \"~/testing/WbEditorHarness.js\";\nimport { createFakeSession } from \"~/testing/createFakeSession.js\";\nimport { createPageEditor } from \"~/testing/createPageEditor.js\";\nimport type { FakeReviewKind } from \"~/testing/createFakeVm.js\";\nimport { PageBasePublishDecorator } from \"./PageBasePublishDecorator.js\";\nimport { PageEditorLayout } from \"./PageEditorLayout.js\";\nimport { PageReviewPublishAction } from \"./PageReviewPublishAction.js\";\n\nvi.mock(\"@webiny/icons/publish.svg\", () => {\n return { ReactComponent: () => null };\n});\n\nvi.mock(\n \"@webiny/app-website-builder/presentation/pages/PageEditor/TopBar/PublishButton.js\",\n async () => {\n const React = await import(\"react\");\n const PublishButton = () => {\n return React.createElement(\"button\", { \"data-testid\": \"enabled-publish\" }, \"Publish\");\n };\n return { PublishButton };\n }\n);\n\nvi.mock(\n \"@webiny/app-workflows/review/presentation/targetReview/components/ReviewTooltip.js\",\n async () => {\n const React = await import(\"react\");\n interface StubProps {\n presenter: { vm: { publishDisabledReason: string | null } };\n children: (describedBy: string) => React.ReactNode;\n }\n const ReviewTooltip = (props: StubProps) => {\n const reason = props.presenter.vm.publishDisabledReason ?? \"\";\n return React.createElement(\n \"span\",\n { \"data-testid\": \"review-tooltip\", \"data-reason\": reason },\n props.children(\"tooltip-description\")\n );\n };\n return { ReviewTooltip };\n }\n);\n\ninterface PermissionRequest {\n entity: string;\n action: string;\n}\n\nconst permission = vi.hoisted(() => {\n return { allowed: true, requests: [] as PermissionRequest[] };\n});\n\nvi.mock(\"@webiny/app-website-builder/presentation/security/HasPermission.js\", async () => {\n const React = await import(\"react\");\n interface PermissionGateProps {\n entity: string;\n action: string;\n children: React.ReactNode;\n }\n const HasPermission = (props: PermissionGateProps) => {\n permission.requests.push({ entity: props.entity, action: props.action });\n if (!permission.allowed) {\n return null;\n }\n return React.createElement(React.Fragment, null, props.children);\n };\n return { HasPermission };\n});\n\nvi.mock(\"@webiny/app-website-builder/BaseEditor/config/Layout.js\", async () => {\n const React = await import(\"react\");\n const { makeDecoratable } = await import(\"@webiny/react-composition\");\n const Layout = makeDecoratable(\"EditorLayout\", () => {\n return React.createElement(\"div\", { \"data-testid\": \"base-layout\" });\n });\n return { Layout };\n});\n\nconst { Ui } = PageEditorConfig;\n\ninterface PublishCase {\n kind: FakeReviewKind;\n page: WbStatus;\n base: boolean;\n enabled: boolean;\n disabled: boolean;\n}\n\n/**\n * `base` is the base Publish (only for a workflow-less namespace on an editable canvas), `enabled` the\n * workflows Publish that publishes, `disabled` the focusable disabled one. The reasons are not\n * repeated here: they come from the real `getEditorRules` through the fixture and are pinned by Task 13.\n */\nconst MATRIX: PublishCase[] = [\n { kind: \"loading\", page: \"draft\", base: false, enabled: false, disabled: true },\n { kind: \"loading\", page: \"published\", base: false, enabled: false, disabled: false },\n { kind: \"loading\", page: \"unpublished\", base: false, enabled: false, disabled: true },\n { kind: \"failed\", page: \"draft\", base: false, enabled: false, disabled: true },\n { kind: \"failed\", page: \"published\", base: false, enabled: false, disabled: false },\n { kind: \"failed\", page: \"unpublished\", base: false, enabled: false, disabled: true },\n { kind: \"noWorkflow\", page: \"draft\", base: true, enabled: false, disabled: false },\n { kind: \"noWorkflow\", page: \"published\", base: false, enabled: false, disabled: false },\n { kind: \"noWorkflow\", page: \"unpublished\", base: false, enabled: false, disabled: false },\n { kind: \"none\", page: \"draft\", base: false, enabled: false, disabled: true },\n { kind: \"none\", page: \"published\", base: false, enabled: false, disabled: false },\n { kind: \"none\", page: \"unpublished\", base: false, enabled: true, disabled: false },\n { kind: \"inProgress\", page: \"draft\", base: false, enabled: false, disabled: true },\n { kind: \"inProgress\", page: \"published\", base: false, enabled: false, disabled: false },\n { kind: \"inProgress\", page: \"unpublished\", base: false, enabled: false, disabled: true },\n { kind: \"approved\", page: \"draft\", base: false, enabled: true, disabled: false },\n { kind: \"approved\", page: \"published\", base: false, enabled: false, disabled: false },\n { kind: \"approved\", page: \"unpublished\", base: false, enabled: true, disabled: false },\n { kind: \"rejected\", page: \"draft\", base: false, enabled: false, disabled: true },\n { kind: \"rejected\", page: \"published\", base: false, enabled: false, disabled: false },\n { kind: \"rejected\", page: \"unpublished\", base: false, enabled: false, disabled: true }\n];\n\nconst mountPublish = (pageStatus: WbStatus, kind: FakeReviewKind) => {\n const handle = createFakeSession(kind, pageStatus === \"unpublished\");\n const container = new Container();\n container.registerInstance(WbPageReview, handle.session);\n const editor = createPageEditor(pageStatus);\n\n render(\n <WbEditorHarness container={container} editor={editor} groups={[\"actions\"]}>\n <PageEditorLayout />\n <Ui.Layout />\n <PageBasePublishDecorator />\n <InternalPageEditorConfig>\n <Ui.TopBar.Action name={\"sentinel\"} element={<span data-testid={\"sentinel\"} />} />\n <Ui.IsNotReadOnly>\n <Ui.TopBar.Action\n name={\"buttonPublish\"}\n element={<span data-testid={\"base-publish\"} />}\n />\n </Ui.IsNotReadOnly>\n </InternalPageEditorConfig>\n <PageEditorConfig>\n <PageReviewPublishAction />\n </PageEditorConfig>\n </WbEditorHarness>\n );\n\n return { ...handle, editor };\n};\n\nconst getDisabledButtons = (): HTMLElement[] => {\n return Array.from(document.querySelectorAll<HTMLElement>(\"button[aria-disabled='true']\"));\n};\n\ndescribe(\"Publish by review status and page status\", () => {\n afterEach(() => {\n cleanup();\n permission.allowed = true;\n permission.requests = [];\n });\n\n it.each(MATRIX)(\n \"$kind review on a $page page\",\n async ({ kind, page, base, enabled, disabled }) => {\n const { presenter } = mountPublish(page, kind);\n await screen.findByTestId(\"sentinel\");\n\n await waitFor(() => {\n expect(screen.queryAllByTestId(\"base-publish\")).toHaveLength(base ? 1 : 0);\n expect(screen.queryAllByTestId(\"enabled-publish\")).toHaveLength(enabled ? 1 : 0);\n expect(getDisabledButtons()).toHaveLength(disabled ? 1 : 0);\n });\n\n if (disabled) {\n const button = getDisabledButtons()[0];\n const tooltip = button.closest(\"[data-testid='review-tooltip']\");\n const reason = presenter.vm.publishDisabledReason;\n expect(reason).not.toBeNull();\n expect(tooltip?.getAttribute(\"data-reason\")).toBe(reason);\n }\n }\n );\n\n it(\"an approved, unpublished page shows an enabled Publish although the canvas is read-only\", async () => {\n const { editor } = mountPublish(\"unpublished\", \"approved\");\n await screen.findByTestId(\"sentinel\");\n\n await waitFor(() => {\n expect(screen.queryAllByTestId(\"enabled-publish\")).toHaveLength(1);\n });\n expect(editor.getEditorState().read().isReadOnly).toBe(true);\n expect(screen.queryAllByTestId(\"base-publish\")).toHaveLength(0);\n });\n\n it(\"an unpublished page with no review shows an enabled Publish: it was reviewed before it was published (Q19)\", async () => {\n const { editor } = mountPublish(\"unpublished\", \"none\");\n await screen.findByTestId(\"sentinel\");\n\n await waitFor(() => {\n expect(screen.queryAllByTestId(\"enabled-publish\")).toHaveLength(1);\n });\n expect(editor.getEditorState().read().isReadOnly).toBe(true);\n expect(getDisabledButtons()).toHaveLength(0);\n expect(screen.queryAllByTestId(\"base-publish\")).toHaveLength(0);\n });\n\n it(\"follows the review while the editor is open: approval turns the disabled Publish on\", async () => {\n const { setKind } = mountPublish(\"draft\", \"inProgress\");\n await screen.findByTestId(\"sentinel\");\n await waitFor(() => {\n expect(getDisabledButtons()).toHaveLength(1);\n });\n\n act(() => {\n setKind(\"approved\");\n });\n\n await waitFor(() => {\n expect(screen.queryAllByTestId(\"enabled-publish\")).toHaveLength(1);\n });\n expect(getDisabledButtons()).toHaveLength(0);\n });\n\n it(\"shows no workflows Publish to a user without the page publish permission\", async () => {\n permission.allowed = false;\n mountPublish(\"draft\", \"approved\");\n await screen.findByTestId(\"sentinel\");\n await act(async () => {});\n\n expect(permission.requests).toContainEqual({ entity: \"page\", action: \"publish\" });\n expect(screen.queryAllByTestId(\"enabled-publish\")).toHaveLength(0);\n expect(getDisabledButtons()).toHaveLength(0);\n });\n});\n"],"names":["vi","React","PublishButton","ReviewTooltip","props","reason","permission","HasPermission","makeDecoratable","Layout","Ui","PageEditorConfig","MATRIX","mountPublish","pageStatus","kind","handle","createFakeSession","container","Container","WbPageReview","editor","createPageEditor","render","WbEditorHarness","PageEditorLayout","PageBasePublishDecorator","InternalPageEditorConfig","PageReviewPublishAction","getDisabledButtons","Array","document","describe","afterEach","cleanup","it","page","base","enabled","disabled","presenter","screen","waitFor","expect","button","tooltip","setKind","act"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare const PageListReviewGatedActions: (props: unknown) => React.JSX.Element;
@@ -0,0 +1,27 @@
1
+ import react from "react";
2
+ import { PageListConfig } from "@webiny/app-website-builder/presentation/pages/PageList/configs/index.js";
3
+ import { isReviewSelectable } from "@webiny/app-workflows/review/domain/isReviewSelectable.js";
4
+ import { usePage } from "../../hooks/usePage.js";
5
+ const { Browser: Browser } = PageListConfig;
6
+ const WrappedElement = (props)=>{
7
+ const { page } = usePage();
8
+ const reviewState = page.workflow?.reviewState ?? null;
9
+ if (isReviewSelectable(reviewState)) return props.element ?? null;
10
+ return null;
11
+ };
12
+ const REVIEW_GATED_ACTIONS = [
13
+ "changeStatus",
14
+ "page-schedule"
15
+ ];
16
+ const PageListReviewGatedActions = Browser.Page.Action.createDecorator((Original)=>function(props) {
17
+ if (REVIEW_GATED_ACTIONS.includes(props.name)) return /*#__PURE__*/ react.createElement(Original, {
18
+ ...props,
19
+ element: /*#__PURE__*/ react.createElement(WrappedElement, {
20
+ element: props.element
21
+ })
22
+ });
23
+ return /*#__PURE__*/ react.createElement(Original, props);
24
+ });
25
+ export { PageListReviewGatedActions };
26
+
27
+ //# sourceMappingURL=PageListReviewGatedActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/PagesList/PageListReviewGatedActions.js","sources":["../../../src/Components/PagesList/PageListReviewGatedActions.tsx"],"sourcesContent":["import React from \"react\";\nimport { PageListConfig } from \"@webiny/app-website-builder/presentation/pages/PageList/configs/index.js\";\nimport { isReviewSelectable } from \"@webiny/app-workflows/review/domain/isReviewSelectable.js\";\nimport { usePage } from \"~/hooks/usePage.js\";\n\nconst { Browser } = PageListConfig;\n\ninterface IWrappedElementProps {\n element: React.ReactElement | undefined;\n}\n\nconst WrappedElement = (props: IWrappedElementProps) => {\n const { page } = usePage();\n const reviewState = page.workflow?.reviewState ?? null;\n\n if (isReviewSelectable(reviewState)) {\n return props.element ?? null;\n }\n\n return null;\n};\n\n/*\n * Row actions that publish or unpublish a page, which a review blocks: \"Change status\" and the\n * scheduler's \"Schedule\" (only present when the scheduler is installed).\n */\nconst REVIEW_GATED_ACTIONS = [\"changeStatus\", \"page-schedule\"];\n\nexport const PageListReviewGatedActions = Browser.Page.Action.createDecorator(Original => {\n return function PageListReviewGatedAction(props) {\n if (REVIEW_GATED_ACTIONS.includes(props.name)) {\n return <Original {...props} element={<WrappedElement element={props.element} />} />;\n }\n return <Original {...props} />;\n };\n});\n"],"names":["Browser","PageListConfig","WrappedElement","props","page","usePage","reviewState","isReviewSelectable","REVIEW_GATED_ACTIONS","PageListReviewGatedActions","Original"],"mappings":";;;;AAKA,MAAM,EAAEA,SAAAA,OAAO,EAAE,GAAGC;AAMpB,MAAMC,iBAAiB,CAACC;IACpB,MAAM,EAAEC,IAAI,EAAE,GAAGC;IACjB,MAAMC,cAAcF,KAAK,QAAQ,EAAE,eAAe;IAElD,IAAIG,mBAAmBD,cACnB,OAAOH,MAAM,OAAO,IAAI;IAG5B,OAAO;AACX;AAMA,MAAMK,uBAAuB;IAAC;IAAgB;CAAgB;AAEvD,MAAMC,6BAA6BT,QAAQ,IAAI,CAAC,MAAM,CAAC,eAAe,CAACU,CAAAA,WACnE,SAAmCP,KAAK;QAC3C,IAAIK,qBAAqB,QAAQ,CAACL,MAAM,IAAI,GACxC,OAAO,WAAP,GAAO,oBAACO,UAAAA;YAAU,GAAGP,KAAK;YAAE,uBAAS,oBAACD,gBAAcA;gBAAC,SAASC,MAAM,OAAO;;;QAE/E,OAAO,WAAP,GAAO,oBAACO,UAAaP;IACzB"}
@@ -0,0 +1 @@
1
+ import "~/types.js";
@@ -0,0 +1,94 @@
1
+ import react from "react";
2
+ import { cleanup, render, screen } from "@testing-library/react";
3
+ import { afterEach, describe, expect, it, vi } from "vitest";
4
+ import { CompositionProvider } from "@webiny/react-composition";
5
+ import { Page, PageDtoMapper } from "@webiny/app-website-builder/domain/Page/index.js";
6
+ import { PageListConfig } from "@webiny/app-website-builder/presentation/pages/PageList/configs/index.js";
7
+ import { PageProvider } from "@webiny/app-website-builder/presentation/pages/PageList/hooks/usePage.js";
8
+ import { ReviewState } from "@webiny/app-workflows/review/domain/ReviewState.js";
9
+ import { StepState } from "@webiny/app-workflows/review/domain/StepState.js";
10
+ import "../../types.js";
11
+ import { PageListReviewGatedActions } from "./PageListReviewGatedActions.js";
12
+ vi.mock("@webiny/app-website-builder/presentation/pages/PageList/configs/Browser/PageAction.js", async ()=>{
13
+ const { makeDecoratable } = await import("@webiny/react-composition");
14
+ const PageAction = makeDecoratable("PageAction", (props)=>props.element ?? null);
15
+ return {
16
+ PageAction
17
+ };
18
+ });
19
+ const { Browser: Browser } = PageListConfig;
20
+ const createDto = (reviewState)=>{
21
+ const system = null === reviewState ? null : {
22
+ workflow: {
23
+ workflowId: "workflow-1",
24
+ reviewState,
25
+ stepId: "step-1",
26
+ stepName: "Legal",
27
+ stepState: StepState.InReview
28
+ }
29
+ };
30
+ const page = Page.create({
31
+ id: "page-1#0001",
32
+ entryId: "page-1",
33
+ system
34
+ });
35
+ return PageDtoMapper.toDTO(page);
36
+ };
37
+ const mountActions = (reviewState)=>{
38
+ render(/*#__PURE__*/ react.createElement(CompositionProvider, null, /*#__PURE__*/ react.createElement(PageProvider, {
39
+ page: createDto(reviewState)
40
+ }, /*#__PURE__*/ react.createElement(PageListReviewGatedActions, null), /*#__PURE__*/ react.createElement(Browser.Page.Action, {
41
+ name: "changeStatus",
42
+ element: /*#__PURE__*/ react.createElement("span", {
43
+ "data-testid": "change-status"
44
+ })
45
+ }), /*#__PURE__*/ react.createElement(Browser.Page.Action, {
46
+ name: "page-schedule",
47
+ element: /*#__PURE__*/ react.createElement("span", {
48
+ "data-testid": "schedule"
49
+ })
50
+ }), /*#__PURE__*/ react.createElement(Browser.Page.Action, {
51
+ name: "edit",
52
+ element: /*#__PURE__*/ react.createElement("span", {
53
+ "data-testid": "edit"
54
+ })
55
+ }))));
56
+ };
57
+ const CASES = [
58
+ {
59
+ reviewState: null,
60
+ visible: true
61
+ },
62
+ {
63
+ reviewState: ReviewState.Approved,
64
+ visible: true
65
+ },
66
+ {
67
+ reviewState: ReviewState.InProgress,
68
+ visible: false
69
+ },
70
+ {
71
+ reviewState: ReviewState.Rejected,
72
+ visible: false
73
+ },
74
+ {
75
+ reviewState: ReviewState.Cancelled,
76
+ visible: false
77
+ }
78
+ ];
79
+ describe("PageListReviewGatedActions", ()=>{
80
+ afterEach(()=>{
81
+ cleanup();
82
+ });
83
+ it.each(CASES)("review state $reviewState: Change status and Schedule visible is $visible", ({ reviewState, visible })=>{
84
+ mountActions(reviewState);
85
+ expect(screen.queryAllByTestId("change-status")).toHaveLength(visible ? 1 : 0);
86
+ expect(screen.queryAllByTestId("schedule")).toHaveLength(visible ? 1 : 0);
87
+ });
88
+ it("leaves every other row action alone", ()=>{
89
+ mountActions(ReviewState.InProgress);
90
+ expect(screen.queryAllByTestId("edit")).toHaveLength(1);
91
+ });
92
+ });
93
+
94
+ //# sourceMappingURL=PageListReviewGatedActions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/PagesList/PageListReviewGatedActions.test.js","sources":["../../../src/Components/PagesList/PageListReviewGatedActions.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { cleanup } from \"@testing-library/react\";\nimport { render } from \"@testing-library/react\";\nimport { screen } from \"@testing-library/react\";\nimport { afterEach } from \"vitest\";\nimport { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { vi } from \"vitest\";\nimport { CompositionProvider } from \"@webiny/react-composition\";\nimport { Page } from \"@webiny/app-website-builder/domain/Page/index.js\";\nimport { PageDtoMapper } from \"@webiny/app-website-builder/domain/Page/index.js\";\nimport { PageListConfig } from \"@webiny/app-website-builder/presentation/pages/PageList/configs/index.js\";\nimport { PageProvider } from \"@webiny/app-website-builder/presentation/pages/PageList/hooks/usePage.js\";\nimport { ReviewState } from \"@webiny/app-workflows/review/domain/ReviewState.js\";\nimport type { ReviewStateValue } from \"@webiny/app-workflows/review/domain/ReviewState.js\";\nimport { StepState } from \"@webiny/app-workflows/review/domain/StepState.js\";\nimport \"~/types.js\";\nimport { PageListReviewGatedActions } from \"./PageListReviewGatedActions.js\";\n\nvi.mock(\n \"@webiny/app-website-builder/presentation/pages/PageList/configs/Browser/PageAction.js\",\n async () => {\n const { makeDecoratable } = await import(\"@webiny/react-composition\");\n interface StubProps {\n name: string;\n element?: React.ReactElement;\n }\n const PageAction = makeDecoratable(\"PageAction\", (props: StubProps) => {\n return props.element ?? null;\n });\n return { PageAction };\n }\n);\n\nconst { Browser } = PageListConfig;\n\nconst createDto = (reviewState: ReviewStateValue | null) => {\n const system =\n reviewState === null\n ? null\n : {\n workflow: {\n workflowId: \"workflow-1\",\n reviewState,\n stepId: \"step-1\",\n stepName: \"Legal\",\n stepState: StepState.InReview\n }\n };\n const page = Page.create({ id: \"page-1#0001\", entryId: \"page-1\", system });\n return PageDtoMapper.toDTO(page);\n};\n\nconst mountActions = (reviewState: ReviewStateValue | null) => {\n render(\n <CompositionProvider>\n <PageProvider page={createDto(reviewState)}>\n <PageListReviewGatedActions />\n <Browser.Page.Action\n name={\"changeStatus\"}\n element={<span data-testid={\"change-status\"} />}\n />\n <Browser.Page.Action\n name={\"page-schedule\"}\n element={<span data-testid={\"schedule\"} />}\n />\n <Browser.Page.Action name={\"edit\"} element={<span data-testid={\"edit\"} />} />\n </PageProvider>\n </CompositionProvider>\n );\n};\n\ninterface GateCase {\n reviewState: ReviewStateValue | null;\n visible: boolean;\n}\n\nconst CASES: GateCase[] = [\n { reviewState: null, visible: true },\n { reviewState: ReviewState.Approved, visible: true },\n { reviewState: ReviewState.InProgress, visible: false },\n { reviewState: ReviewState.Rejected, visible: false },\n { reviewState: ReviewState.Cancelled, visible: false }\n];\n\ndescribe(\"PageListReviewGatedActions\", () => {\n afterEach(() => {\n cleanup();\n });\n\n it.each(CASES)(\n \"review state $reviewState: Change status and Schedule visible is $visible\",\n ({ reviewState, visible }) => {\n mountActions(reviewState);\n\n expect(screen.queryAllByTestId(\"change-status\")).toHaveLength(visible ? 1 : 0);\n expect(screen.queryAllByTestId(\"schedule\")).toHaveLength(visible ? 1 : 0);\n }\n );\n\n it(\"leaves every other row action alone\", () => {\n mountActions(ReviewState.InProgress);\n\n expect(screen.queryAllByTestId(\"edit\")).toHaveLength(1);\n });\n});\n"],"names":["vi","makeDecoratable","PageAction","props","Browser","PageListConfig","createDto","reviewState","system","StepState","page","Page","PageDtoMapper","mountActions","render","CompositionProvider","PageProvider","PageListReviewGatedActions","CASES","ReviewState","describe","afterEach","cleanup","it","visible","expect","screen"],"mappings":";;;;;;;;;;;AAoBAA,GAAG,IAAI,CACH,yFACA;IACI,MAAM,EAAEC,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC;IAKzC,MAAMC,aAAaD,gBAAgB,cAAc,CAACE,QACvCA,MAAM,OAAO,IAAI;IAE5B,OAAO;QAAED;IAAW;AACxB;AAGJ,MAAM,EAAEE,SAAAA,OAAO,EAAE,GAAGC;AAEpB,MAAMC,YAAY,CAACC;IACf,MAAMC,SACFD,AAAgB,SAAhBA,cACM,OACA;QACI,UAAU;YACN,YAAY;YACZA;YACA,QAAQ;YACR,UAAU;YACV,WAAWE,UAAU,QAAQ;QACjC;IACJ;IACV,MAAMC,OAAOC,KAAK,MAAM,CAAC;QAAE,IAAI;QAAe,SAAS;QAAUH;IAAO;IACxE,OAAOI,cAAc,KAAK,CAACF;AAC/B;AAEA,MAAMG,eAAe,CAACN;IAClBO,OAAO,WAADA,GACF,oBAACC,qBAAmBA,MAAAA,WAAAA,GAChB,oBAACC,cAAYA;QAAC,MAAMV,UAAUC;qBAC1B,oBAACU,4BAA0BA,OAAAA,WAAAA,GAC3B,oBAACb,QAAQ,IAAI,CAAC,MAAM;QAChB,MAAM;QACN,uBAAS,oBAAC;YAAK,eAAa;;sBAEhC,oBAACA,QAAQ,IAAI,CAAC,MAAM;QAChB,MAAM;QACN,uBAAS,oBAAC;YAAK,eAAa;;sBAEhC,oBAACA,QAAQ,IAAI,CAAC,MAAM;QAAC,MAAM;QAAQ,uBAAS,oBAAC;YAAK,eAAa;;;AAI/E;AAOA,MAAMc,QAAoB;IACtB;QAAE,aAAa;QAAM,SAAS;IAAK;IACnC;QAAE,aAAaC,YAAY,QAAQ;QAAE,SAAS;IAAK;IACnD;QAAE,aAAaA,YAAY,UAAU;QAAE,SAAS;IAAM;IACtD;QAAE,aAAaA,YAAY,QAAQ;QAAE,SAAS;IAAM;IACpD;QAAE,aAAaA,YAAY,SAAS;QAAE,SAAS;IAAM;CACxD;AAEDC,SAAS,8BAA8B;IACnCC,UAAU;QACNC;IACJ;IAEAC,GAAG,IAAI,CAACL,OACJ,6EACA,CAAC,EAAEX,WAAW,EAAEiB,OAAO,EAAE;QACrBX,aAAaN;QAEbkB,OAAOC,OAAO,gBAAgB,CAAC,kBAAkB,YAAY,CAACF,UAAU,IAAI;QAC5EC,OAAOC,OAAO,gBAAgB,CAAC,aAAa,YAAY,CAACF,UAAU,IAAI;IAC3E;IAGJD,GAAG,uCAAuC;QACtCV,aAAaM,YAAY,UAAU;QAEnCM,OAAOC,OAAO,gBAAgB,CAAC,SAAS,YAAY,CAAC;IACzD;AACJ"}
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare const PagesList: () => React.JSX.Element;
@@ -0,0 +1,8 @@
1
+ import react from "react";
2
+ import { PageListConfig } from "@webiny/app-website-builder";
3
+ import { WbContentReviewsSidebarItem } from "../ContentReviews/WbContentReviewsSidebarItem.js";
4
+ import { PageListReviewGatedActions } from "./PageListReviewGatedActions.js";
5
+ const PagesList = ()=>/*#__PURE__*/ react.createElement(PageListConfig, null, /*#__PURE__*/ react.createElement(WbContentReviewsSidebarItem, null), /*#__PURE__*/ react.createElement(PageListReviewGatedActions, null));
6
+ export { PagesList };
7
+
8
+ //# sourceMappingURL=PagesList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/PagesList/PagesList.js","sources":["../../../src/Components/PagesList/PagesList.tsx"],"sourcesContent":["import React from \"react\";\nimport { PageListConfig } from \"@webiny/app-website-builder\";\nimport { WbContentReviewsSidebarItem } from \"~/Components/ContentReviews/WbContentReviewsSidebarItem.js\";\nimport { PageListReviewGatedActions } from \"./PageListReviewGatedActions.js\";\n\nexport const PagesList = () => {\n return (\n <PageListConfig>\n {/* Add a Content Reviews item to the footer of the sidebar. */}\n <WbContentReviewsSidebarItem />\n {/* Hide the Change status and Schedule row actions for pages a review blocks. */}\n <PageListReviewGatedActions />\n </PageListConfig>\n );\n};\n"],"names":["PagesList","PageListConfig","WbContentReviewsSidebarItem","PageListReviewGatedActions"],"mappings":";;;;AAKO,MAAMA,YAAY,IACd,WAAP,GACI,oBAACC,gBAAcA,MAAAA,WAAAA,GAEX,oBAACC,6BAA2BA,OAAAA,WAAAA,GAE5B,oBAACC,4BAA0BA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,47 @@
1
+ import react from "react";
2
+ import { afterEach, describe, expect, it, vi } from "vitest";
3
+ import { cleanup, render, screen } from "@testing-library/react";
4
+ import { PagesList } from "./PagesList.js";
5
+ vi.mock("@webiny/app-website-builder", async ()=>{
6
+ const React = await import("react");
7
+ const Config = ({ children })=>React.createElement("div", {
8
+ "data-testid": "page-list-config"
9
+ }, children);
10
+ return {
11
+ PageListConfig: Object.assign(Config, {
12
+ Browser: {
13
+ Sidebar: {
14
+ Footer: ()=>null
15
+ }
16
+ }
17
+ })
18
+ };
19
+ });
20
+ vi.mock("./PageListReviewGatedActions.js", async ()=>{
21
+ const React = await import("react");
22
+ return {
23
+ PageListReviewGatedActions: ()=>React.createElement("div", {
24
+ "data-testid": "review-gated-actions"
25
+ })
26
+ };
27
+ });
28
+ vi.mock("~/Components/ContentReviews/WbContentReviewsSidebarItem.js", async ()=>{
29
+ const React = await import("react");
30
+ return {
31
+ WbContentReviewsSidebarItem: ()=>React.createElement("div", {
32
+ "data-testid": "wb-content-reviews-sidebar"
33
+ })
34
+ };
35
+ });
36
+ describe("PagesList", ()=>{
37
+ afterEach(()=>{
38
+ cleanup();
39
+ });
40
+ it("mounts the Content Reviews sidebar item next to the review-gated row actions", ()=>{
41
+ render(/*#__PURE__*/ react.createElement(PagesList, null));
42
+ expect(screen.getByTestId("wb-content-reviews-sidebar")).toBeTruthy();
43
+ expect(screen.getByTestId("review-gated-actions")).toBeTruthy();
44
+ });
45
+ });
46
+
47
+ //# sourceMappingURL=PagesList.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/PagesList/PagesList.test.js","sources":["../../../src/Components/PagesList/PagesList.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { afterEach } from \"vitest\";\nimport { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { vi } from \"vitest\";\nimport { cleanup } from \"@testing-library/react\";\nimport { render } from \"@testing-library/react\";\nimport { screen } from \"@testing-library/react\";\nimport { PagesList } from \"./PagesList.js\";\n\ninterface ChildrenProps {\n children: React.ReactNode;\n}\n\nvi.mock(\"@webiny/app-website-builder\", async () => {\n const React = await import(\"react\");\n const Config = ({ children }: ChildrenProps) => {\n return React.createElement(\"div\", { \"data-testid\": \"page-list-config\" }, children);\n };\n return {\n PageListConfig: Object.assign(Config, { Browser: { Sidebar: { Footer: () => null } } })\n };\n});\n\nvi.mock(\"./PageListReviewGatedActions.js\", async () => {\n const React = await import(\"react\");\n return {\n PageListReviewGatedActions: () =>\n React.createElement(\"div\", { \"data-testid\": \"review-gated-actions\" })\n };\n});\n\nvi.mock(\"~/Components/ContentReviews/WbContentReviewsSidebarItem.js\", async () => {\n const React = await import(\"react\");\n return {\n WbContentReviewsSidebarItem: () =>\n React.createElement(\"div\", { \"data-testid\": \"wb-content-reviews-sidebar\" })\n };\n});\n\ndescribe(\"PagesList\", () => {\n afterEach(() => {\n cleanup();\n });\n\n it(\"mounts the Content Reviews sidebar item next to the review-gated row actions\", () => {\n render(<PagesList />);\n\n expect(screen.getByTestId(\"wb-content-reviews-sidebar\")).toBeTruthy();\n expect(screen.getByTestId(\"review-gated-actions\")).toBeTruthy();\n });\n});\n"],"names":["vi","React","Config","children","Object","describe","afterEach","cleanup","it","render","PagesList","expect","screen"],"mappings":";;;;AAeAA,GAAG,IAAI,CAAC,+BAA+B;IACnC,MAAMC,QAAQ,MAAM,MAAM,CAAC;IAC3B,MAAMC,SAAS,CAAC,EAAEC,QAAQ,EAAiB,GAChCF,MAAM,aAAa,CAAC,OAAO;YAAE,eAAe;QAAmB,GAAGE;IAE7E,OAAO;QACH,gBAAgBC,OAAO,MAAM,CAACF,QAAQ;YAAE,SAAS;gBAAE,SAAS;oBAAE,QAAQ,IAAM;gBAAK;YAAE;QAAE;IACzF;AACJ;AAEAF,GAAG,IAAI,CAAC,mCAAmC;IACvC,MAAMC,QAAQ,MAAM,MAAM,CAAC;IAC3B,OAAO;QACH,4BAA4B,IACxBA,MAAM,aAAa,CAAC,OAAO;gBAAE,eAAe;YAAuB;IAC3E;AACJ;AAEAD,GAAG,IAAI,CAAC,8DAA8D;IAClE,MAAMC,QAAQ,MAAM,MAAM,CAAC;IAC3B,OAAO;QACH,6BAA6B,IACzBA,MAAM,aAAa,CAAC,OAAO;gBAAE,eAAe;YAA6B;IACjF;AACJ;AAEAI,SAAS,aAAa;IAClBC,UAAU;QACNC;IACJ;IAEAC,GAAG,gFAAgF;QAC/EC,OAAO,WAADA,GAAC,oBAACC,WAASA;QAEjBC,OAAOC,OAAO,WAAW,CAAC,+BAA+B,UAAU;QACnED,OAAOC,OAAO,WAAW,CAAC,yBAAyB,UAAU;IACjE;AACJ"}
@@ -0,0 +1 @@
1
+ export { PagesList } from "./PagesList.js";
@@ -0,0 +1 @@
1
+ export { PagesList } from "./PagesList.js";
@@ -0,0 +1,2 @@
1
+ export * from "./PageEditor/PageEditorConfig.js";
2
+ export * from "./PagesList/index.js";
@@ -0,0 +1,2 @@
1
+ export * from "./PageEditor/PageEditorConfig.js";
2
+ export * from "./PagesList/index.js";
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) Webiny
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,11 @@
1
+ # @webiny/app-website-builder-workflows
2
+
3
+ > [!NOTE]
4
+ > This package is part of the [Webiny](https://www.webiny.com) monorepo.
5
+ > It’s **included in every Webiny project by default** and is not meant to be used as a standalone package.
6
+
7
+ 📘 **Documentation:** [https://www.webiny.com/docs](https://www.webiny.com/docs)
8
+
9
+ ---
10
+
11
+ _This README file is automatically generated during the publish process._
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare const WebsiteBuilderWorkflowsMenu: () => React.JSX.Element;