@webiny/app-headless-cms-workflows 0.0.0-unstable.0156a4c312

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (417) hide show
  1. package/Components/CmsEntriesList/CmsReviewMoveEntryAction.d.ts +2 -0
  2. package/Components/CmsEntriesList/CmsReviewMoveEntryAction.js +43 -0
  3. package/Components/CmsEntriesList/CmsReviewMoveEntryAction.js.map +1 -0
  4. package/Components/CmsEntriesList/CmsReviewMoveEntryAction.test.d.ts +1 -0
  5. package/Components/CmsEntriesList/CmsReviewMoveEntryAction.test.js +118 -0
  6. package/Components/CmsEntriesList/CmsReviewMoveEntryAction.test.js.map +1 -0
  7. package/Components/CmsEntriesList/CmsReviewScheduleEntryAction.d.ts +2 -0
  8. package/Components/CmsEntriesList/CmsReviewScheduleEntryAction.js +22 -0
  9. package/Components/CmsEntriesList/CmsReviewScheduleEntryAction.js.map +1 -0
  10. package/Components/CmsEntriesList/CmsReviewScheduleEntryAction.test.d.ts +1 -0
  11. package/Components/CmsEntriesList/CmsReviewScheduleEntryAction.test.js +98 -0
  12. package/Components/CmsEntriesList/CmsReviewScheduleEntryAction.test.js.map +1 -0
  13. package/Components/ContentEntryForm/CmsEntryReviewBar.d.ts +2 -0
  14. package/Components/ContentEntryForm/CmsEntryReviewBar.js +32 -0
  15. package/Components/ContentEntryForm/CmsEntryReviewBar.js.map +1 -0
  16. package/Components/ContentEntryForm/CmsEntryReviewBar.test.d.ts +1 -0
  17. package/Components/ContentEntryForm/CmsEntryReviewBar.test.js +128 -0
  18. package/Components/ContentEntryForm/CmsEntryReviewBar.test.js.map +1 -0
  19. package/Components/ContentEntryForm/CmsEntryReviewBlockedActions.d.ts +2 -0
  20. package/Components/ContentEntryForm/CmsEntryReviewBlockedActions.js +46 -0
  21. package/Components/ContentEntryForm/CmsEntryReviewBlockedActions.js.map +1 -0
  22. package/Components/ContentEntryForm/CmsEntryReviewBlockedActions.test.d.ts +1 -0
  23. package/Components/ContentEntryForm/CmsEntryReviewBlockedActions.test.js +222 -0
  24. package/Components/ContentEntryForm/CmsEntryReviewBlockedActions.test.js.map +1 -0
  25. package/Components/ContentEntryForm/CmsEntryReviewFormLock.d.ts +2 -0
  26. package/Components/ContentEntryForm/CmsEntryReviewFormLock.js +32 -0
  27. package/Components/ContentEntryForm/CmsEntryReviewFormLock.js.map +1 -0
  28. package/Components/ContentEntryForm/CmsEntryReviewFormLock.test.d.ts +1 -0
  29. package/Components/ContentEntryForm/CmsEntryReviewFormLock.test.js +94 -0
  30. package/Components/ContentEntryForm/CmsEntryReviewFormLock.test.js.map +1 -0
  31. package/Components/ContentEntryForm/CmsEntryReviewNewRevision.d.ts +2 -0
  32. package/Components/ContentEntryForm/CmsEntryReviewNewRevision.js +56 -0
  33. package/Components/ContentEntryForm/CmsEntryReviewNewRevision.js.map +1 -0
  34. package/Components/ContentEntryForm/CmsEntryReviewNewRevision.test.d.ts +1 -0
  35. package/Components/ContentEntryForm/CmsEntryReviewNewRevision.test.js +186 -0
  36. package/Components/ContentEntryForm/CmsEntryReviewNewRevision.test.js.map +1 -0
  37. package/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.d.ts +2 -0
  38. package/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.js +26 -0
  39. package/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.js.map +1 -0
  40. package/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.test.d.ts +1 -0
  41. package/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.test.js +78 -0
  42. package/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.test.js.map +1 -0
  43. package/Components/ContentEntryForm/getModelFieldLabels.d.ts +3 -0
  44. package/Components/ContentEntryForm/getModelFieldLabels.js +8 -0
  45. package/Components/ContentEntryForm/getModelFieldLabels.js.map +1 -0
  46. package/Components/ContentEntryForm/index.d.ts +5 -0
  47. package/Components/ContentEntryForm/index.js +5 -0
  48. package/Components/ContentReviews/CmsContentReviews.d.ts +2 -0
  49. package/Components/ContentReviews/CmsContentReviews.js +11 -0
  50. package/Components/ContentReviews/CmsContentReviews.js.map +1 -0
  51. package/Components/ContentReviews/CmsContentReviews.test.d.ts +1 -0
  52. package/Components/ContentReviews/CmsContentReviews.test.js +214 -0
  53. package/Components/ContentReviews/CmsContentReviews.test.js.map +1 -0
  54. package/Components/ContentReviews/CmsContentReviewsMount.d.ts +4 -0
  55. package/Components/ContentReviews/CmsContentReviewsMount.js +44 -0
  56. package/Components/ContentReviews/CmsContentReviewsMount.js.map +1 -0
  57. package/Components/ContentReviews/CmsContentReviewsSidebarItem.d.ts +2 -0
  58. package/Components/ContentReviews/CmsContentReviewsSidebarItem.js +20 -0
  59. package/Components/ContentReviews/CmsContentReviewsSidebarItem.js.map +1 -0
  60. package/Components/ContentReviews/CmsContentReviewsSidebarItem.test.d.ts +1 -0
  61. package/Components/ContentReviews/CmsContentReviewsSidebarItem.test.js +83 -0
  62. package/Components/ContentReviews/CmsContentReviewsSidebarItem.test.js.map +1 -0
  63. package/Components/ModelDelete/ModelBoundToWorkflowErrorData.d.ts +8 -0
  64. package/Components/ModelDelete/ModelBoundToWorkflowErrorData.js +0 -0
  65. package/Components/ModelDelete/ModelDeleteWorkflowCopy.d.ts +10 -0
  66. package/Components/ModelDelete/ModelDeleteWorkflowCopy.js +0 -0
  67. package/Components/ModelDelete/ModelDeleteWorkflowError.d.ts +2 -0
  68. package/Components/ModelDelete/ModelDeleteWorkflowError.js +34 -0
  69. package/Components/ModelDelete/ModelDeleteWorkflowError.js.map +1 -0
  70. package/Components/ModelDelete/ModelDeleteWorkflowError.test.d.ts +1 -0
  71. package/Components/ModelDelete/ModelDeleteWorkflowError.test.js +73 -0
  72. package/Components/ModelDelete/ModelDeleteWorkflowError.test.js.map +1 -0
  73. package/Components/ModelDelete/getModelDeleteWorkflowCopy.d.ts +3 -0
  74. package/Components/ModelDelete/getModelDeleteWorkflowCopy.js +17 -0
  75. package/Components/ModelDelete/getModelDeleteWorkflowCopy.js.map +1 -0
  76. package/Components/ModelDelete/getModelDeleteWorkflowCopy.test.d.ts +1 -0
  77. package/Components/ModelDelete/getModelDeleteWorkflowCopy.test.js +28 -0
  78. package/Components/ModelDelete/getModelDeleteWorkflowCopy.test.js.map +1 -0
  79. package/Components/ignoreAction.d.ts +1 -0
  80. package/Components/ignoreAction.js +4 -0
  81. package/Components/ignoreAction.js.map +1 -0
  82. package/LICENSE +21 -0
  83. package/README.md +11 -0
  84. package/Routes/CmsWorkflowEditor.d.ts +2 -0
  85. package/Routes/CmsWorkflowEditor.js +23 -0
  86. package/Routes/CmsWorkflowEditor.js.map +1 -0
  87. package/Routes/CmsWorkflowEditor.test.d.ts +1 -0
  88. package/Routes/CmsWorkflowEditor.test.js +141 -0
  89. package/Routes/CmsWorkflowEditor.test.js.map +1 -0
  90. package/Routes/index.d.ts +1 -0
  91. package/Routes/index.js +1 -0
  92. package/features/cache/CmsReviewCacheSyncHandler.d.ts +8 -0
  93. package/features/cache/CmsReviewCacheSyncHandler.js +14 -0
  94. package/features/cache/CmsReviewCacheSyncHandler.js.map +1 -0
  95. package/features/cache/CmsReviewCacheWriter.d.ts +14 -0
  96. package/features/cache/CmsReviewCacheWriter.js +39 -0
  97. package/features/cache/CmsReviewCacheWriter.js.map +1 -0
  98. package/features/cache/CmsReviewCacheWriter.test.d.ts +1 -0
  99. package/features/cache/CmsReviewCacheWriter.test.js +207 -0
  100. package/features/cache/CmsReviewCacheWriter.test.js.map +1 -0
  101. package/features/cache/CmsReviewEntriesCacheProviderDecorator.d.ts +12 -0
  102. package/features/cache/CmsReviewEntriesCacheProviderDecorator.js +17 -0
  103. package/features/cache/CmsReviewEntriesCacheProviderDecorator.js.map +1 -0
  104. package/features/cache/CmsReviewEntriesCacheProviderDecorator.test.d.ts +1 -0
  105. package/features/cache/CmsReviewEntriesCacheProviderDecorator.test.js +129 -0
  106. package/features/cache/CmsReviewEntriesCacheProviderDecorator.test.js.map +1 -0
  107. package/features/cache/ReviewPreservingEntriesCache.d.ts +18 -0
  108. package/features/cache/ReviewPreservingEntriesCache.js +54 -0
  109. package/features/cache/ReviewPreservingEntriesCache.js.map +1 -0
  110. package/features/cache/abstractions.d.ts +5 -0
  111. package/features/cache/abstractions.js +5 -0
  112. package/features/cache/abstractions.js.map +1 -0
  113. package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.d.ts +26 -0
  114. package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.js +104 -0
  115. package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.js.map +1 -0
  116. package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.test.d.ts +1 -0
  117. package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.test.js +589 -0
  118. package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.test.js.map +1 -0
  119. package/features/editorGateway/feature.d.ts +1 -0
  120. package/features/editorGateway/feature.js +11 -0
  121. package/features/editorGateway/feature.js.map +1 -0
  122. package/features/editorGateway/feature.test.d.ts +1 -0
  123. package/features/editorGateway/feature.test.js +272 -0
  124. package/features/editorGateway/feature.test.js.map +1 -0
  125. package/features/editorGateway/graphql/cmsEntryFolderExists.d.ts +1 -0
  126. package/features/editorGateway/graphql/cmsEntryFolderExists.js +16 -0
  127. package/features/editorGateway/graphql/cmsEntryFolderExists.js.map +1 -0
  128. package/features/editorGateway/graphql/deleteCmsEntryWorkflow.d.ts +1 -0
  129. package/features/editorGateway/graphql/deleteCmsEntryWorkflow.js +19 -0
  130. package/features/editorGateway/graphql/deleteCmsEntryWorkflow.js.map +1 -0
  131. package/features/editorGateway/graphql/getCmsEntryWorkflow.d.ts +1 -0
  132. package/features/editorGateway/graphql/getCmsEntryWorkflow.js +19 -0
  133. package/features/editorGateway/graphql/getCmsEntryWorkflow.js.map +1 -0
  134. package/features/editorGateway/graphql/inspectCmsEntryRouting.d.ts +1 -0
  135. package/features/editorGateway/graphql/inspectCmsEntryRouting.js +19 -0
  136. package/features/editorGateway/graphql/inspectCmsEntryRouting.js.map +1 -0
  137. package/features/editorGateway/graphql/listCmsEntryWorkflowModels.d.ts +1 -0
  138. package/features/editorGateway/graphql/listCmsEntryWorkflowModels.js +29 -0
  139. package/features/editorGateway/graphql/listCmsEntryWorkflowModels.js.map +1 -0
  140. package/features/editorGateway/graphql/storeCmsEntryWorkflow.d.ts +1 -0
  141. package/features/editorGateway/graphql/storeCmsEntryWorkflow.js +19 -0
  142. package/features/editorGateway/graphql/storeCmsEntryWorkflow.js.map +1 -0
  143. package/features/editorMounting/CmsWorkflowEditorAppAdapter.d.ts +25 -0
  144. package/features/editorMounting/CmsWorkflowEditorAppAdapter.js +51 -0
  145. package/features/editorMounting/CmsWorkflowEditorAppAdapter.js.map +1 -0
  146. package/features/editorMounting/CmsWorkflowEditorAppAdapter.test.d.ts +1 -0
  147. package/features/editorMounting/CmsWorkflowEditorAppAdapter.test.js +185 -0
  148. package/features/editorMounting/CmsWorkflowEditorAppAdapter.test.js.map +1 -0
  149. package/features/editorMounting/abstractions.d.ts +5 -0
  150. package/features/editorMounting/abstractions.js +5 -0
  151. package/features/editorMounting/abstractions.js.map +1 -0
  152. package/features/editorMounting/feature.d.ts +3 -0
  153. package/features/editorMounting/feature.js +19 -0
  154. package/features/editorMounting/feature.js.map +1 -0
  155. package/features/editorMounting/feature.test.d.ts +1 -0
  156. package/features/editorMounting/feature.test.js +100 -0
  157. package/features/editorMounting/feature.test.js.map +1 -0
  158. package/features/editorReview/CmsEntryReview.d.ts +8 -0
  159. package/features/editorReview/CmsEntryReview.js +14 -0
  160. package/features/editorReview/CmsEntryReview.js.map +1 -0
  161. package/features/editorReview/abstractions.d.ts +5 -0
  162. package/features/editorReview/abstractions.js +5 -0
  163. package/features/editorReview/abstractions.js.map +1 -0
  164. package/features/editorReview/feature.d.ts +3 -0
  165. package/features/editorReview/feature.js +17 -0
  166. package/features/editorReview/feature.js.map +1 -0
  167. package/features/editorReview/feature.test.d.ts +1 -0
  168. package/features/editorReview/feature.test.js +46 -0
  169. package/features/editorReview/feature.test.js.map +1 -0
  170. package/features/editorReview/useCmsEntryReview.d.ts +2 -0
  171. package/features/editorReview/useCmsEntryReview.js +8 -0
  172. package/features/editorReview/useCmsEntryReview.js.map +1 -0
  173. package/features/feature.d.ts +1 -0
  174. package/features/feature.js +15 -0
  175. package/features/feature.js.map +1 -0
  176. package/features/gateway/CmsReviewChangeMessageHandler.d.ts +8 -0
  177. package/features/gateway/CmsReviewChangeMessageHandler.js +16 -0
  178. package/features/gateway/CmsReviewChangeMessageHandler.js.map +1 -0
  179. package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.d.ts +16 -0
  180. package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.js +39 -0
  181. package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.js.map +1 -0
  182. package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.test.d.ts +1 -0
  183. package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.test.js +83 -0
  184. package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.test.js.map +1 -0
  185. package/features/gateway/CmsReviewContentAdapter/abstractions.d.ts +5 -0
  186. package/features/gateway/CmsReviewContentAdapter/abstractions.js +5 -0
  187. package/features/gateway/CmsReviewContentAdapter/abstractions.js.map +1 -0
  188. package/features/gateway/CmsReviewGateway/CmsReviewGateway.d.ts +52 -0
  189. package/features/gateway/CmsReviewGateway/CmsReviewGateway.js +221 -0
  190. package/features/gateway/CmsReviewGateway/CmsReviewGateway.js.map +1 -0
  191. package/features/gateway/CmsReviewGateway/CmsReviewGateway.test.d.ts +1 -0
  192. package/features/gateway/CmsReviewGateway/CmsReviewGateway.test.js +689 -0
  193. package/features/gateway/CmsReviewGateway/CmsReviewGateway.test.js.map +1 -0
  194. package/features/gateway/CmsReviewNotificationHandler.d.ts +8 -0
  195. package/features/gateway/CmsReviewNotificationHandler.js +16 -0
  196. package/features/gateway/CmsReviewNotificationHandler.js.map +1 -0
  197. package/features/gateway/CmsReviewRowProvider/CmsReviewRowProvider.d.ts +8 -0
  198. package/features/gateway/CmsReviewRowProvider/CmsReviewRowProvider.js +14 -0
  199. package/features/gateway/CmsReviewRowProvider/CmsReviewRowProvider.js.map +1 -0
  200. package/features/gateway/CmsReviewRowProvider/abstractions.d.ts +5 -0
  201. package/features/gateway/CmsReviewRowProvider/abstractions.js +5 -0
  202. package/features/gateway/CmsReviewRowProvider/abstractions.js.map +1 -0
  203. package/features/gateway/contentReviewsBindings.test.d.ts +1 -0
  204. package/features/gateway/contentReviewsBindings.test.js +125 -0
  205. package/features/gateway/contentReviewsBindings.test.js.map +1 -0
  206. package/features/gateway/feature.d.ts +4 -0
  207. package/features/gateway/feature.js +27 -0
  208. package/features/gateway/feature.js.map +1 -0
  209. package/features/gateway/feature.test.d.ts +1 -0
  210. package/features/gateway/feature.test.js +79 -0
  211. package/features/gateway/feature.test.js.map +1 -0
  212. package/features/gateway/graphql/CmsOperationResponse.d.ts +3 -0
  213. package/features/gateway/graphql/CmsOperationResponse.js +0 -0
  214. package/features/gateway/graphql/approveCmsEntryReviewStep.d.ts +1 -0
  215. package/features/gateway/graphql/approveCmsEntryReviewStep.js +18 -0
  216. package/features/gateway/graphql/approveCmsEntryReviewStep.js.map +1 -0
  217. package/features/gateway/graphql/cancelCmsEntryReview.d.ts +1 -0
  218. package/features/gateway/graphql/cancelCmsEntryReview.js +18 -0
  219. package/features/gateway/graphql/cancelCmsEntryReview.js.map +1 -0
  220. package/features/gateway/graphql/cancelCmsEntryReviewsForDelete.d.ts +1 -0
  221. package/features/gateway/graphql/cancelCmsEntryReviewsForDelete.js +28 -0
  222. package/features/gateway/graphql/cancelCmsEntryReviewsForDelete.js.map +1 -0
  223. package/features/gateway/graphql/getCmsEntryReview.d.ts +1 -0
  224. package/features/gateway/graphql/getCmsEntryReview.js +18 -0
  225. package/features/gateway/graphql/getCmsEntryReview.js.map +1 -0
  226. package/features/gateway/graphql/getCmsEntryReviewStepRun.d.ts +1 -0
  227. package/features/gateway/graphql/getCmsEntryReviewStepRun.js +18 -0
  228. package/features/gateway/graphql/getCmsEntryReviewStepRun.js.map +1 -0
  229. package/features/gateway/graphql/getCmsEntryTargetReview.d.ts +1 -0
  230. package/features/gateway/graphql/getCmsEntryTargetReview.js +18 -0
  231. package/features/gateway/graphql/getCmsEntryTargetReview.js.map +1 -0
  232. package/features/gateway/graphql/listCmsEntryBlockingReviews.d.ts +1 -0
  233. package/features/gateway/graphql/listCmsEntryBlockingReviews.js +18 -0
  234. package/features/gateway/graphql/listCmsEntryBlockingReviews.js.map +1 -0
  235. package/features/gateway/graphql/listCmsEntryReviewStepCandidates.d.ts +1 -0
  236. package/features/gateway/graphql/listCmsEntryReviewStepCandidates.js +18 -0
  237. package/features/gateway/graphql/listCmsEntryReviewStepCandidates.js.map +1 -0
  238. package/features/gateway/graphql/listCmsEntryReviews.d.ts +1 -0
  239. package/features/gateway/graphql/listCmsEntryReviews.js +34 -0
  240. package/features/gateway/graphql/listCmsEntryReviews.js.map +1 -0
  241. package/features/gateway/graphql/listCmsEntryStepCandidates.d.ts +1 -0
  242. package/features/gateway/graphql/listCmsEntryStepCandidates.js +28 -0
  243. package/features/gateway/graphql/listCmsEntryStepCandidates.js.map +1 -0
  244. package/features/gateway/graphql/listCmsEntryWorkflows.d.ts +1 -0
  245. package/features/gateway/graphql/listCmsEntryWorkflows.js +18 -0
  246. package/features/gateway/graphql/listCmsEntryWorkflows.js.map +1 -0
  247. package/features/gateway/graphql/reassignCmsEntryReviewStep.d.ts +1 -0
  248. package/features/gateway/graphql/reassignCmsEntryReviewStep.js +18 -0
  249. package/features/gateway/graphql/reassignCmsEntryReviewStep.js.map +1 -0
  250. package/features/gateway/graphql/rejectCmsEntryReviewStep.d.ts +1 -0
  251. package/features/gateway/graphql/rejectCmsEntryReviewStep.js +18 -0
  252. package/features/gateway/graphql/rejectCmsEntryReviewStep.js.map +1 -0
  253. package/features/gateway/graphql/requestCmsEntryReview.d.ts +1 -0
  254. package/features/gateway/graphql/requestCmsEntryReview.js +28 -0
  255. package/features/gateway/graphql/requestCmsEntryReview.js.map +1 -0
  256. package/features/gateway/graphql/restartCmsEntryReviewStep.d.ts +1 -0
  257. package/features/gateway/graphql/restartCmsEntryReviewStep.js +18 -0
  258. package/features/gateway/graphql/restartCmsEntryReviewStep.js.map +1 -0
  259. package/features/gateway/graphql/startCmsEntryReviewStep.d.ts +1 -0
  260. package/features/gateway/graphql/startCmsEntryReviewStep.js +18 -0
  261. package/features/gateway/graphql/startCmsEntryReviewStep.js.map +1 -0
  262. package/features/gateway/graphql/takeOverCmsEntryReviewStep.d.ts +1 -0
  263. package/features/gateway/graphql/takeOverCmsEntryReviewStep.js +22 -0
  264. package/features/gateway/graphql/takeOverCmsEntryReviewStep.js.map +1 -0
  265. package/features/trash/BulkDeletePresenterReviewDecorator.d.ts +20 -0
  266. package/features/trash/BulkDeletePresenterReviewDecorator.js +81 -0
  267. package/features/trash/BulkDeletePresenterReviewDecorator.js.map +1 -0
  268. package/features/trash/BulkDeletePresenterReviewDecorator.test.d.ts +1 -0
  269. package/features/trash/BulkDeletePresenterReviewDecorator.test.js +693 -0
  270. package/features/trash/BulkDeletePresenterReviewDecorator.test.js.map +1 -0
  271. package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.d.ts +13 -0
  272. package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.js +23 -0
  273. package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.js.map +1 -0
  274. package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.test.d.ts +1 -0
  275. package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.test.js +123 -0
  276. package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.test.js.map +1 -0
  277. package/features/trash/DeleteEntryUseCaseReviewDecorator.d.ts +13 -0
  278. package/features/trash/DeleteEntryUseCaseReviewDecorator.js +23 -0
  279. package/features/trash/DeleteEntryUseCaseReviewDecorator.js.map +1 -0
  280. package/features/trash/DeleteEntryUseCaseReviewDecorator.test.d.ts +1 -0
  281. package/features/trash/DeleteEntryUseCaseReviewDecorator.test.js +139 -0
  282. package/features/trash/DeleteEntryUseCaseReviewDecorator.test.js.map +1 -0
  283. package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.d.ts +13 -0
  284. package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.js +23 -0
  285. package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.js.map +1 -0
  286. package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.test.d.ts +1 -0
  287. package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.test.js +122 -0
  288. package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.test.js.map +1 -0
  289. package/features/trash/feature.d.ts +1 -0
  290. package/features/trash/feature.js +17 -0
  291. package/features/trash/feature.js.map +1 -0
  292. package/features/trash/feature.test.d.ts +1 -0
  293. package/features/trash/feature.test.js +213 -0
  294. package/features/trash/feature.test.js.map +1 -0
  295. package/index.d.ts +2 -0
  296. package/index.editor.test.d.ts +1 -0
  297. package/index.editor.test.js +149 -0
  298. package/index.editor.test.js.map +1 -0
  299. package/index.js +41 -0
  300. package/index.js.map +1 -0
  301. package/index.lists.test.d.ts +1 -0
  302. package/index.lists.test.js +172 -0
  303. package/index.lists.test.js.map +1 -0
  304. package/index.mount.test.d.ts +1 -0
  305. package/index.mount.test.js +49 -0
  306. package/index.mount.test.js.map +1 -0
  307. package/index.test.d.ts +1 -0
  308. package/index.test.js +414 -0
  309. package/index.test.js.map +1 -0
  310. package/package.json +54 -0
  311. package/presentation/CmsEntryContentReloader.d.ts +8 -0
  312. package/presentation/CmsEntryContentReloader.js +20 -0
  313. package/presentation/CmsEntryContentReloader.js.map +1 -0
  314. package/presentation/CmsEntryContentReloader.test.d.ts +1 -0
  315. package/presentation/CmsEntryContentReloader.test.js +118 -0
  316. package/presentation/CmsEntryContentReloader.test.js.map +1 -0
  317. package/presentation/CmsEntryFormPresenterReviewDecorator.d.ts +27 -0
  318. package/presentation/CmsEntryFormPresenterReviewDecorator.js +167 -0
  319. package/presentation/CmsEntryFormPresenterReviewDecorator.js.map +1 -0
  320. package/presentation/CmsEntryFormPresenterReviewDecorator.test.d.ts +1 -0
  321. package/presentation/CmsEntryFormPresenterReviewDecorator.test.js +601 -0
  322. package/presentation/CmsEntryFormPresenterReviewDecorator.test.js.map +1 -0
  323. package/presentation/CmsEntryUnsavedChanges.d.ts +7 -0
  324. package/presentation/CmsEntryUnsavedChanges.js +12 -0
  325. package/presentation/CmsEntryUnsavedChanges.js.map +1 -0
  326. package/presentation/CmsEntryUnsavedChanges.test.d.ts +1 -0
  327. package/presentation/CmsEntryUnsavedChanges.test.js +23 -0
  328. package/presentation/CmsEntryUnsavedChanges.test.js.map +1 -0
  329. package/presentation/CmsReviewFieldSelections.test.d.ts +1 -0
  330. package/presentation/CmsReviewFieldSelections.test.js +27 -0
  331. package/presentation/CmsReviewFieldSelections.test.js.map +1 -0
  332. package/presentation/CmsReviewGetEntryFieldSelection.d.ts +8 -0
  333. package/presentation/CmsReviewGetEntryFieldSelection.js +16 -0
  334. package/presentation/CmsReviewGetEntryFieldSelection.js.map +1 -0
  335. package/presentation/CmsReviewListEntriesFieldSelection.d.ts +8 -0
  336. package/presentation/CmsReviewListEntriesFieldSelection.js +16 -0
  337. package/presentation/CmsReviewListEntriesFieldSelection.js.map +1 -0
  338. package/presentation/CmsReviewTableRowMapperDecorator.d.ts +11 -0
  339. package/presentation/CmsReviewTableRowMapperDecorator.js +24 -0
  340. package/presentation/CmsReviewTableRowMapperDecorator.js.map +1 -0
  341. package/presentation/CmsReviewTableRowMapperDecorator.test.d.ts +1 -0
  342. package/presentation/CmsReviewTableRowMapperDecorator.test.js +120 -0
  343. package/presentation/CmsReviewTableRowMapperDecorator.test.js.map +1 -0
  344. package/presentation/CmsRevisionsListPresenterDecorator.d.ts +24 -0
  345. package/presentation/CmsRevisionsListPresenterDecorator.js +66 -0
  346. package/presentation/CmsRevisionsListPresenterDecorator.js.map +1 -0
  347. package/presentation/CmsRevisionsListPresenterDecorator.test.d.ts +1 -0
  348. package/presentation/CmsRevisionsListPresenterDecorator.test.js +174 -0
  349. package/presentation/CmsRevisionsListPresenterDecorator.test.js.map +1 -0
  350. package/presentation/contentReviews/CmsContentReviewsPresenter.d.ts +28 -0
  351. package/presentation/contentReviews/CmsContentReviewsPresenter.js +103 -0
  352. package/presentation/contentReviews/CmsContentReviewsPresenter.js.map +1 -0
  353. package/presentation/contentReviews/CmsContentReviewsPresenter.test.d.ts +1 -0
  354. package/presentation/contentReviews/CmsContentReviewsPresenter.test.js +238 -0
  355. package/presentation/contentReviews/CmsContentReviewsPresenter.test.js.map +1 -0
  356. package/presentation/contentReviews/abstractions.d.ts +31 -0
  357. package/presentation/contentReviews/abstractions.js +5 -0
  358. package/presentation/contentReviews/abstractions.js.map +1 -0
  359. package/presentation/contentReviews/feature.d.ts +3 -0
  360. package/presentation/contentReviews/feature.js +17 -0
  361. package/presentation/contentReviews/feature.js.map +1 -0
  362. package/presentation/contentReviews/toContentTypes.d.ts +3 -0
  363. package/presentation/contentReviews/toContentTypes.js +14 -0
  364. package/presentation/contentReviews/toContentTypes.js.map +1 -0
  365. package/presentation/contentReviews/toContentTypes.test.d.ts +1 -0
  366. package/presentation/contentReviews/toContentTypes.test.js +20 -0
  367. package/presentation/contentReviews/toContentTypes.test.js.map +1 -0
  368. package/presentation/feature.d.ts +1 -0
  369. package/presentation/feature.js +19 -0
  370. package/presentation/feature.js.map +1 -0
  371. package/presentation/getCmsEntryReviewContext.d.ts +4 -0
  372. package/presentation/getCmsEntryReviewContext.js +12 -0
  373. package/presentation/getCmsEntryReviewContext.js.map +1 -0
  374. package/presentation/getCmsEntryReviewInitParams.d.ts +13 -0
  375. package/presentation/getCmsEntryReviewInitParams.js +18 -0
  376. package/presentation/getCmsEntryReviewInitParams.js.map +1 -0
  377. package/presentation/getCmsEntryReviewInitParams.test.d.ts +1 -0
  378. package/presentation/getCmsEntryReviewInitParams.test.js +69 -0
  379. package/presentation/getCmsEntryReviewInitParams.test.js.map +1 -0
  380. package/routes.d.ts +11 -0
  381. package/routes.js +21 -0
  382. package/routes.js.map +1 -0
  383. package/testing/createEntry.d.ts +3 -0
  384. package/testing/createEntry.js +22 -0
  385. package/testing/createEntry.js.map +1 -0
  386. package/testing/createEntrySession.d.ts +9 -0
  387. package/testing/createEntrySession.js +29 -0
  388. package/testing/createEntrySession.js.map +1 -0
  389. package/testing/createFolder.d.ts +2 -0
  390. package/testing/createFolder.js +13 -0
  391. package/testing/createFolder.js.map +1 -0
  392. package/testing/createFormVm.d.ts +2 -0
  393. package/testing/createFormVm.js +22 -0
  394. package/testing/createFormVm.js.map +1 -0
  395. package/testing/models.d.ts +4 -0
  396. package/testing/models.js +23 -0
  397. package/testing/models.js.map +1 -0
  398. package/testing/renderEditorTree.d.ts +17 -0
  399. package/testing/renderEditorTree.js +93 -0
  400. package/testing/renderEditorTree.js.map +1 -0
  401. package/testing/reviewStates.d.ts +17 -0
  402. package/testing/reviewStates.js +65 -0
  403. package/testing/reviewStates.js.map +1 -0
  404. package/types.d.ts +10 -0
  405. package/types.js +0 -0
  406. package/utils/appName.d.ts +4 -0
  407. package/utils/appName.js +13 -0
  408. package/utils/appName.js.map +1 -0
  409. package/utils/isReviewableModel.d.ts +2 -0
  410. package/utils/isReviewableModel.js +7 -0
  411. package/utils/isReviewableModel.js.map +1 -0
  412. package/utils/renderModelIcon.d.ts +3 -0
  413. package/utils/renderModelIcon.js +19 -0
  414. package/utils/renderModelIcon.js.map +1 -0
  415. package/utils/renderModelIconOrFallback.d.ts +3 -0
  416. package/utils/renderModelIconOrFallback.js +17 -0
  417. package/utils/renderModelIconOrFallback.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/ContentReviews/CmsContentReviews.test.js","sources":["../../../src/Components/ContentReviews/CmsContentReviews.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { beforeEach } from \"vitest\";\nimport { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { vi } from \"vitest\";\nimport { act } from \"@testing-library/react\";\nimport { render } from \"@testing-library/react\";\nimport { screen } from \"@testing-library/react\";\nimport { waitFor } from \"@testing-library/react\";\nimport { Container } from \"@webiny/di\";\nimport { DiContainerProvider } from \"@webiny/app\";\nimport { ListModelsUseCase } from \"@webiny/app-headless-cms/features/model/listModels/abstractions.js\";\nimport { Notifications } from \"@webiny/app-admin/features/notifications/abstractions.js\";\nimport { IdentityContext } from \"@webiny/app-admin/features/security/IdentityContext/abstractions.js\";\nimport { createWorkflowsIdentityContext } from \"@webiny/app-workflows/review/testing/createWorkflowsIdentityContext.js\";\nimport type { IReviewContentAdapter } from \"@webiny/app-workflows/review/content/IReviewContentAdapter.js\";\nimport type { IReviewContentTypesSource } from \"@webiny/app-workflows/review/presentation/reviewList/IReviewContentTypesSource.js\";\nimport type { IReviewRowProvider } from \"@webiny/app-workflows/review/presentation/reviewList/abstractions.js\";\nimport { CmsReviewContentAdapter } from \"~/features/gateway/CmsReviewContentAdapter/abstractions.js\";\nimport { CmsReviewRowProvider } from \"~/features/gateway/CmsReviewRowProvider/abstractions.js\";\nimport { CmsContentReviewsPresenterFeature } from \"~/presentation/contentReviews/feature.js\";\nimport { Routes } from \"~/routes.js\";\nimport { CmsContentReviews } from \"./CmsContentReviews.js\";\n\ninterface RouteStubProps {\n route: { name: string };\n app: string;\n showContentType: boolean;\n contentTypes: IReviewContentTypesSource;\n breadcrumbName: string;\n}\n\ninterface MenuStubProps {\n name: string;\n route: { name: string };\n parent?: string;\n}\n\ninterface WidgetsStubProps {\n prefix: string;\n namespaces: string[];\n viewAllRoute: { name: string };\n ready: boolean;\n}\n\nconst permission = vi.hoisted(() => {\n return { canAccessManageEndpoint: true, canReadContentModels: true };\n});\n\nvi.mock(\"@webiny/app-headless-cms/admin/hooks/usePermission.js\", () => {\n return {\n usePermission: () => {\n return {\n canAccessManageEndpoint: permission.canAccessManageEndpoint,\n canReadContentModels: permission.canReadContentModels\n };\n }\n };\n});\n\nvi.mock(\n \"@webiny/app-workflows/review/mounting/components/ReviewContentReviewsRoute.js\",\n async () => {\n const React = await import(\"react\");\n return {\n ReviewContentReviewsRoute: (props: RouteStubProps) => {\n const vm = props.contentTypes.vm;\n return React.createElement(\"div\", {\n \"data-testid\": \"route\",\n \"data-route\": props.route.name,\n \"data-app\": props.app,\n \"data-namespaces\": vm.namespaces.join(\",\"),\n \"data-show-content-type\": String(props.showContentType),\n \"data-options\": JSON.stringify(vm.options),\n \"data-breadcrumb\": props.breadcrumbName,\n \"data-ready\": String(!vm.loading)\n });\n }\n };\n }\n);\n\nvi.mock(\n \"@webiny/app-workflows/review/mounting/components/ReviewContentReviewsMenu.js\",\n async () => {\n const React = await import(\"react\");\n return {\n ReviewContentReviewsMenu: (props: MenuStubProps) => {\n return React.createElement(\"div\", {\n \"data-testid\": \"menu\",\n \"data-name\": props.name,\n \"data-route\": props.route.name,\n \"data-parent\": props.parent ?? \"\"\n });\n }\n };\n }\n);\n\nvi.mock(\"@webiny/app-workflows/review/mounting/components/ReviewDashboardWidgets.js\", async () => {\n const React = await import(\"react\");\n return {\n ReviewDashboardWidgets: (props: WidgetsStubProps) => {\n return React.createElement(\"div\", {\n \"data-testid\": \"widgets\",\n \"data-prefix\": props.prefix,\n \"data-namespaces\": props.namespaces.join(\",\"),\n \"data-route\": props.viewAllRoute.name,\n \"data-ready\": String(props.ready)\n });\n }\n };\n});\n\nconst createNotifications = (): Notifications.Interface => {\n return {\n notify: vi.fn(),\n success: vi.fn(),\n warning: vi.fn(),\n error: vi.fn()\n } as unknown as Notifications.Interface;\n};\n\nconst createContainer = (\n execute: () => Promise<unknown>,\n notifications: Notifications.Interface = createNotifications()\n): Container => {\n const container = new Container();\n const rowProvider: IReviewRowProvider = { getBinding: () => null };\n const adapter = {} as unknown as IReviewContentAdapter;\n container.registerInstance(CmsReviewContentAdapter, adapter);\n container.registerInstance(CmsReviewRowProvider, rowProvider);\n container.registerInstance(ListModelsUseCase, {\n execute\n } as unknown as ListModelsUseCase.Interface);\n // The admin registers the signed-in identity; the model list waits for one.\n container.registerInstance(IdentityContext, createWorkflowsIdentityContext());\n container.registerInstance(Notifications, notifications);\n CmsContentReviewsPresenterFeature.register(container);\n return container;\n};\n\nconst mount = (container: Container) => {\n render(\n <DiContainerProvider container={container}>\n <CmsContentReviews />\n </DiContainerProvider>\n );\n};\n\ndescribe(\"CmsContentReviews\", () => {\n beforeEach(() => {\n permission.canAccessManageEndpoint = true;\n permission.canReadContentModels = true;\n });\n\n it.each([\n [\"the manage endpoint\", { canAccessManageEndpoint: false, canReadContentModels: true }],\n [\"reading content models\", { canAccessManageEndpoint: true, canReadContentModels: false }]\n ])(\"mounts nothing and loads no models without %s\", async (_name, flags) => {\n Object.assign(permission, flags);\n const execute = vi.fn(async () => []);\n const notifications = createNotifications();\n const container = createContainer(execute, notifications);\n\n mount(container);\n await act(async () => {});\n\n expect(screen.queryByTestId(\"route\")).toBeNull();\n expect(screen.queryByTestId(\"menu\")).toBeNull();\n expect(screen.queryByTestId(\"widgets\")).toBeNull();\n expect(execute).not.toHaveBeenCalled();\n expect(notifications.error).not.toHaveBeenCalled();\n });\n\n it(\"mounts the shared route, menu and widgets for the cms app with the model list, ready once the models are known\", async () => {\n const container = createContainer(async () => [\n { modelId: \"press\", name: \"Press release\", tags: [] },\n { modelId: \"article\", name: \"Article\", tags: [] },\n { modelId: \"hidden\", name: \"Hidden\", tags: [\"$publishing:false\"] }\n ]);\n\n mount(container);\n\n await waitFor(() => {\n expect(screen.getByTestId(\"route\").getAttribute(\"data-ready\")).toBe(\"true\");\n });\n const route = screen.getByTestId(\"route\");\n expect(route.getAttribute(\"data-namespaces\")).toBe(\"cms.article,cms.press\");\n expect(route.getAttribute(\"data-route\")).toBe(Routes.ContentEntries.ContentReviews.name);\n expect(route.getAttribute(\"data-app\")).toBe(\"cms\");\n expect(route.getAttribute(\"data-show-content-type\")).toBe(\"true\");\n expect(route.getAttribute(\"data-breadcrumb\")).toBe(\"cms.content-reviews\");\n expect(JSON.parse(route.getAttribute(\"data-options\") ?? \"null\")).toEqual([\n { label: \"Article\", value: \"article\", app: \"cms\", icon: \"devices_other\" },\n { label: \"Press release\", value: \"press\", app: \"cms\", icon: \"devices_other\" }\n ]);\n\n const menu = screen.getByTestId(\"menu\");\n expect(menu.getAttribute(\"data-name\")).toBe(\"workflows.cms.contentReviews\");\n expect(menu.getAttribute(\"data-parent\")).toBe(\"headlessCMS\");\n expect(menu.getAttribute(\"data-route\")).toBe(Routes.ContentEntries.ContentReviews.name);\n\n const widgets = screen.getByTestId(\"widgets\");\n expect(widgets.getAttribute(\"data-ready\")).toBe(\"true\");\n expect(widgets.getAttribute(\"data-prefix\")).toBe(\"cms\");\n expect(widgets.getAttribute(\"data-namespaces\")).toBe(\"cms.article,cms.press\");\n expect(widgets.getAttribute(\"data-route\")).toBe(Routes.ContentEntries.ContentReviews.name);\n });\n\n it(\"keeps the list and the widgets from starting until the model list is known\", async () => {\n let release: (models: unknown[]) => void = () => undefined;\n const pending = new Promise<unknown[]>(resolve => {\n release = resolve;\n });\n const container = createContainer(() => pending);\n\n mount(container);\n\n expect(screen.getByTestId(\"route\").getAttribute(\"data-ready\")).toBe(\"false\");\n expect(screen.getByTestId(\"widgets\").getAttribute(\"data-ready\")).toBe(\"false\");\n\n release([{ modelId: \"article\", name: \"Article\", tags: [] }]);\n\n await waitFor(() => {\n expect(screen.getByTestId(\"route\").getAttribute(\"data-ready\")).toBe(\"true\");\n });\n expect(screen.getByTestId(\"route\").getAttribute(\"data-namespaces\")).toBe(\"cms.article\");\n });\n\n it(\"becomes ready with no namespaces when the model list fails\", async () => {\n const consoleError = vi.spyOn(console, \"error\").mockImplementation(() => undefined);\n const container = createContainer(() => Promise.reject(new Error(\"network\")));\n\n mount(container);\n\n await waitFor(() => {\n expect(screen.getByTestId(\"route\").getAttribute(\"data-ready\")).toBe(\"true\");\n });\n expect(screen.getByTestId(\"route\").getAttribute(\"data-namespaces\")).toBe(\"\");\n expect(\n JSON.parse(screen.getByTestId(\"route\").getAttribute(\"data-options\") ?? \"null\")\n ).toEqual([]);\n consoleError.mockRestore();\n });\n});\n"],"names":["permission","vi","React","props","vm","String","JSON","createNotifications","createContainer","execute","notifications","container","Container","rowProvider","adapter","CmsReviewContentAdapter","CmsReviewRowProvider","ListModelsUseCase","IdentityContext","createWorkflowsIdentityContext","Notifications","CmsContentReviewsPresenterFeature","mount","render","DiContainerProvider","CmsContentReviews","describe","beforeEach","it","_name","flags","Object","act","expect","screen","waitFor","route","Routes","menu","widgets","release","undefined","pending","Promise","resolve","consoleError","console","Error"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ export declare const CmsContentReviewsMount: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element;
4
+ };
@@ -0,0 +1,44 @@
1
+ import react, { useEffect } from "react";
2
+ import { createReactiveComponent } from "@webiny/app-admin";
3
+ import { useFeature } from "@webiny/app";
4
+ import { ReviewContentReviewsMenu } from "@webiny/app-workflows/review/mounting/components/ReviewContentReviewsMenu.js";
5
+ import { ReviewContentReviewsRoute } from "@webiny/app-workflows/review/mounting/components/ReviewContentReviewsRoute.js";
6
+ import { ReviewDashboardWidgets } from "@webiny/app-workflows/review/mounting/components/ReviewDashboardWidgets.js";
7
+ import { CmsReviewFeature } from "../../features/gateway/feature.js";
8
+ import { CmsContentReviewsPresenterFeature } from "../../presentation/contentReviews/feature.js";
9
+ import { Routes } from "../../routes.js";
10
+ const CmsContentReviewsMount = createReactiveComponent(()=>{
11
+ const { presenter } = useFeature(CmsContentReviewsPresenterFeature);
12
+ const { rowProvider } = useFeature(CmsReviewFeature);
13
+ useEffect(()=>{
14
+ presenter.init();
15
+ return ()=>{
16
+ presenter.dispose();
17
+ };
18
+ }, [
19
+ presenter
20
+ ]);
21
+ const vm = presenter.vm;
22
+ const ready = !vm.loading;
23
+ return /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(ReviewContentReviewsRoute, {
24
+ route: Routes.ContentEntries.ContentReviews,
25
+ app: "cms",
26
+ rowProvider: rowProvider,
27
+ showContentType: true,
28
+ contentTypes: presenter,
29
+ breadcrumbName: "cms.content-reviews"
30
+ }), /*#__PURE__*/ react.createElement(ReviewContentReviewsMenu, {
31
+ name: "workflows.cms.contentReviews",
32
+ route: Routes.ContentEntries.ContentReviews,
33
+ parent: "headlessCMS"
34
+ }), /*#__PURE__*/ react.createElement(ReviewDashboardWidgets, {
35
+ prefix: "cms",
36
+ namespaces: vm.namespaces,
37
+ rowProvider: rowProvider,
38
+ viewAllRoute: Routes.ContentEntries.ContentReviews,
39
+ ready: ready
40
+ }));
41
+ });
42
+ export { CmsContentReviewsMount };
43
+
44
+ //# sourceMappingURL=CmsContentReviewsMount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/ContentReviews/CmsContentReviewsMount.js","sources":["../../../src/Components/ContentReviews/CmsContentReviewsMount.tsx"],"sourcesContent":["import React, { useEffect } from \"react\";\nimport { createReactiveComponent } from \"@webiny/app-admin\";\nimport { useFeature } from \"@webiny/app\";\nimport { ReviewContentReviewsMenu } from \"@webiny/app-workflows/review/mounting/components/ReviewContentReviewsMenu.js\";\nimport { ReviewContentReviewsRoute } from \"@webiny/app-workflows/review/mounting/components/ReviewContentReviewsRoute.js\";\nimport { ReviewDashboardWidgets } from \"@webiny/app-workflows/review/mounting/components/ReviewDashboardWidgets.js\";\nimport { CmsReviewFeature } from \"~/features/gateway/feature.js\";\nimport { CmsContentReviewsPresenterFeature } from \"~/presentation/contentReviews/feature.js\";\nimport { Routes } from \"~/routes.js\";\n\n/*\n * Mounts the shared Content Reviews route, menu item and dashboard widgets for the `cms` app.\n * Only the content type list is CMS knowledge (D113, A80); the page reads it live from the\n * presenter and the widgets wait for it (`ready`), so the list starts once with the real namespaces.\n */\nexport const CmsContentReviewsMount = createReactiveComponent(() => {\n const { presenter } = useFeature(CmsContentReviewsPresenterFeature);\n const { rowProvider } = useFeature(CmsReviewFeature);\n\n useEffect(() => {\n void presenter.init();\n return () => {\n presenter.dispose();\n };\n }, [presenter]);\n\n const vm = presenter.vm;\n const ready = !vm.loading;\n\n return (\n <>\n <ReviewContentReviewsRoute\n route={Routes.ContentEntries.ContentReviews}\n app=\"cms\"\n rowProvider={rowProvider}\n showContentType={true}\n contentTypes={presenter}\n breadcrumbName=\"cms.content-reviews\"\n />\n <ReviewContentReviewsMenu\n name=\"workflows.cms.contentReviews\"\n route={Routes.ContentEntries.ContentReviews}\n parent=\"headlessCMS\"\n />\n <ReviewDashboardWidgets\n prefix=\"cms\"\n namespaces={vm.namespaces}\n rowProvider={rowProvider}\n viewAllRoute={Routes.ContentEntries.ContentReviews}\n ready={ready}\n />\n </>\n );\n});\n"],"names":["CmsContentReviewsMount","createReactiveComponent","presenter","useFeature","CmsContentReviewsPresenterFeature","rowProvider","CmsReviewFeature","useEffect","vm","ready","ReviewContentReviewsRoute","Routes","ReviewContentReviewsMenu","ReviewDashboardWidgets"],"mappings":";;;;;;;;;AAeO,MAAMA,yBAAyBC,wBAAwB;IAC1D,MAAM,EAAEC,SAAS,EAAE,GAAGC,WAAWC;IACjC,MAAM,EAAEC,WAAW,EAAE,GAAGF,WAAWG;IAEnCC,UAAU;QACDL,UAAU,IAAI;QACnB,OAAO;YACHA,UAAU,OAAO;QACrB;IACJ,GAAG;QAACA;KAAU;IAEd,MAAMM,KAAKN,UAAU,EAAE;IACvB,MAAMO,QAAQ,CAACD,GAAG,OAAO;IAEzB,OAAO,WAAP,GACI,wDACI,oBAACE,2BAAyBA;QACtB,OAAOC,OAAO,cAAc,CAAC,cAAc;QAC3C,KAAI;QACJ,aAAaN;QACb,iBAAiB;QACjB,cAAcH;QACd,gBAAe;sBAEnB,oBAACU,0BAAwBA;QACrB,MAAK;QACL,OAAOD,OAAO,cAAc,CAAC,cAAc;QAC3C,QAAO;sBAEX,oBAACE,wBAAsBA;QACnB,QAAO;QACP,YAAYL,GAAG,UAAU;QACzB,aAAaH;QACb,cAAcM,OAAO,cAAc,CAAC,cAAc;QAClD,OAAOF;;AAIvB"}
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare const CmsContentReviewsSidebarItem: () => React.JSX.Element;
@@ -0,0 +1,20 @@
1
+ import react from "react";
2
+ import { ReactComponent } from "@webiny/icons/flowchart.svg";
3
+ import { ContentEntryListConfig } from "@webiny/app-headless-cms/admin/config/contentEntries/index.js";
4
+ import { IsModelPublishable } from "@webiny/app-headless-cms/exports/admin/cms.js";
5
+ import { ReviewContentReviewsSidebarItem } from "@webiny/app-workflows/review/mounting/components/ReviewContentReviewsSidebarItem.js";
6
+ import { Routes } from "../../routes.js";
7
+ const { Browser: Browser } = ContentEntryListConfig;
8
+ const ContentReviewsSidebarLink = ()=>/*#__PURE__*/ react.createElement(IsModelPublishable, null, /*#__PURE__*/ react.createElement("div", {
9
+ className: "list-none"
10
+ }, /*#__PURE__*/ react.createElement(ReviewContentReviewsSidebarItem, {
11
+ route: Routes.ContentEntries.ContentReviews,
12
+ icon: /*#__PURE__*/ react.createElement(ReactComponent, null)
13
+ })));
14
+ const CmsContentReviewsSidebarItem = ()=>/*#__PURE__*/ react.createElement(ContentEntryListConfig, null, /*#__PURE__*/ react.createElement(Browser.Sidebar.Footer, {
15
+ name: "content-reviews",
16
+ element: /*#__PURE__*/ react.createElement(ContentReviewsSidebarLink, null)
17
+ }));
18
+ export { CmsContentReviewsSidebarItem };
19
+
20
+ //# sourceMappingURL=CmsContentReviewsSidebarItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/ContentReviews/CmsContentReviewsSidebarItem.js","sources":["../../../src/Components/ContentReviews/CmsContentReviewsSidebarItem.tsx"],"sourcesContent":["import React from \"react\";\nimport { ReactComponent as ContentReviewsIcon } from \"@webiny/icons/flowchart.svg\";\nimport { ContentEntryListConfig } from \"@webiny/app-headless-cms/admin/config/contentEntries/index.js\";\nimport { IsModelPublishable } from \"@webiny/app-headless-cms/exports/admin/cms.js\";\nimport { ReviewContentReviewsSidebarItem } from \"@webiny/app-workflows/review/mounting/components/ReviewContentReviewsSidebarItem.js\";\nimport { Routes } from \"~/routes.js\";\n\nconst { Browser } = ContentEntryListConfig;\n\nconst ContentReviewsSidebarLink = () => {\n return (\n <IsModelPublishable>\n <div className={\"list-none\"}>\n <ReviewContentReviewsSidebarItem\n route={Routes.ContentEntries.ContentReviews}\n icon={<ContentReviewsIcon />}\n />\n </div>\n </IsModelPublishable>\n );\n};\n\n// The \"Content Reviews\" item of the content entries sidebar; it opens the route.\nexport const CmsContentReviewsSidebarItem = () => {\n return (\n <ContentEntryListConfig>\n <Browser.Sidebar.Footer\n name={\"content-reviews\"}\n element={<ContentReviewsSidebarLink />}\n />\n </ContentEntryListConfig>\n );\n};\n"],"names":["Browser","ContentEntryListConfig","ContentReviewsSidebarLink","IsModelPublishable","ReviewContentReviewsSidebarItem","Routes","ContentReviewsIcon","CmsContentReviewsSidebarItem"],"mappings":";;;;;;AAOA,MAAM,EAAEA,SAAAA,OAAO,EAAE,GAAGC;AAEpB,MAAMC,4BAA4B,IACvB,WAAP,GACI,oBAACC,oBAAkBA,MAAAA,WAAAA,GACf,oBAAC;QAAI,WAAW;qBACZ,oBAACC,iCAA+BA;QAC5B,OAAOC,OAAO,cAAc,CAAC,cAAc;QAC3C,oBAAM,oBAACC,gBAAkBA;;AAQtC,MAAMC,+BAA+B,IACjC,WAAP,GACI,oBAACN,wBAAsBA,MAAAA,WAAAA,GACnB,oBAACD,QAAQ,OAAO,CAAC,MAAM;QACnB,MAAM;QACN,uBAAS,oBAACE,2BAAyBA"}
@@ -0,0 +1,83 @@
1
+ import react from "react";
2
+ import { beforeEach, describe, expect, it, vi } from "vitest";
3
+ import { fireEvent, render, screen } from "@testing-library/react";
4
+ import { Routes } from "../../routes.js";
5
+ import { CmsContentReviewsSidebarItem } from "./CmsContentReviewsSidebarItem.js";
6
+ const goToRoute = vi.hoisted(()=>vi.fn());
7
+ const model = vi.hoisted(()=>({
8
+ publishable: true
9
+ }));
10
+ vi.mock("@webiny/app-admin", async (importOriginal)=>{
11
+ const actual = await importOriginal();
12
+ return {
13
+ ...actual,
14
+ useRouter: ()=>({
15
+ goToRoute: goToRoute
16
+ })
17
+ };
18
+ });
19
+ vi.mock("@webiny/app-headless-cms/admin/config/contentEntries/index.js", async ()=>{
20
+ const React = await import("react");
21
+ const Footer = (props)=>React.createElement("div", {
22
+ "data-testid": "footer",
23
+ "data-name": props.name
24
+ }, props.element);
25
+ const Config = ({ children })=>React.createElement(React.Fragment, null, children);
26
+ return {
27
+ ContentEntryListConfig: Object.assign(Config, {
28
+ Browser: {
29
+ Sidebar: {
30
+ Footer
31
+ }
32
+ }
33
+ })
34
+ };
35
+ });
36
+ vi.mock("@webiny/app-headless-cms/exports/admin/cms.js", async ()=>{
37
+ const React = await import("react");
38
+ return {
39
+ IsModelPublishable: ({ children })=>model.publishable ? React.createElement(React.Fragment, null, children) : null
40
+ };
41
+ });
42
+ vi.mock("@webiny/admin-ui", async (importOriginal)=>{
43
+ const actual = await importOriginal();
44
+ const React = await import("react");
45
+ const Item = (props)=>React.createElement("button", {
46
+ onClick: props.onClick
47
+ }, props.text);
48
+ const ItemIcon = ()=>React.createElement("span");
49
+ return {
50
+ ...actual,
51
+ Sidebar: {
52
+ ...actual.Sidebar,
53
+ Item: Object.assign(Item, {
54
+ Icon: ItemIcon
55
+ })
56
+ }
57
+ };
58
+ });
59
+ describe("CmsContentReviewsSidebarItem", ()=>{
60
+ beforeEach(()=>{
61
+ model.publishable = true;
62
+ goToRoute.mockReset();
63
+ });
64
+ it("adds a Content Reviews item to the sidebar footer that opens the route", ()=>{
65
+ render(/*#__PURE__*/ react.createElement(CmsContentReviewsSidebarItem, null));
66
+ expect(screen.getByTestId("footer").getAttribute("data-name")).toBe("content-reviews");
67
+ fireEvent.click(screen.getByRole("button", {
68
+ name: "Content Reviews"
69
+ }));
70
+ expect(goToRoute).toHaveBeenCalledTimes(1);
71
+ expect(goToRoute).toHaveBeenCalledWith(Routes.ContentEntries.ContentReviews);
72
+ });
73
+ it("adds no item for a model that cannot publish", ()=>{
74
+ model.publishable = false;
75
+ render(/*#__PURE__*/ react.createElement(CmsContentReviewsSidebarItem, null));
76
+ expect(screen.getByTestId("footer")).toBeTruthy();
77
+ expect(screen.queryByRole("button", {
78
+ name: "Content Reviews"
79
+ })).toBeNull();
80
+ });
81
+ });
82
+
83
+ //# sourceMappingURL=CmsContentReviewsSidebarItem.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/ContentReviews/CmsContentReviewsSidebarItem.test.js","sources":["../../../src/Components/ContentReviews/CmsContentReviewsSidebarItem.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { beforeEach } from \"vitest\";\nimport { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { vi } from \"vitest\";\nimport { fireEvent } from \"@testing-library/react\";\nimport { render } from \"@testing-library/react\";\nimport { screen } from \"@testing-library/react\";\nimport { Routes } from \"~/routes.js\";\nimport { CmsContentReviewsSidebarItem } from \"./CmsContentReviewsSidebarItem.js\";\n\ninterface FooterStubProps {\n name: string;\n element: React.ReactElement;\n}\n\ninterface ChildrenStubProps {\n children: React.ReactNode;\n}\n\ninterface SidebarItemStubProps {\n text: string;\n onClick: () => void;\n}\n\nconst goToRoute = vi.hoisted(() => vi.fn());\n\nconst model = vi.hoisted(() => {\n return { publishable: true };\n});\n\nvi.mock(\"@webiny/app-admin\", async importOriginal => {\n const actual = await importOriginal<typeof import(\"@webiny/app-admin\")>();\n return {\n ...actual,\n useRouter: () => {\n return { goToRoute };\n }\n };\n});\n\nvi.mock(\"@webiny/app-headless-cms/admin/config/contentEntries/index.js\", async () => {\n const React = await import(\"react\");\n const Footer = (props: FooterStubProps) => {\n return React.createElement(\n \"div\",\n { \"data-testid\": \"footer\", \"data-name\": props.name },\n props.element\n );\n };\n const Config = ({ children }: ChildrenStubProps) => {\n return React.createElement(React.Fragment, null, children);\n };\n return { ContentEntryListConfig: Object.assign(Config, { Browser: { Sidebar: { Footer } } }) };\n});\n\nvi.mock(\"@webiny/app-headless-cms/exports/admin/cms.js\", async () => {\n const React = await import(\"react\");\n return {\n IsModelPublishable: ({ children }: ChildrenStubProps) => {\n return model.publishable ? React.createElement(React.Fragment, null, children) : null;\n }\n };\n});\n\nvi.mock(\"@webiny/admin-ui\", async importOriginal => {\n const actual = await importOriginal<typeof import(\"@webiny/admin-ui\")>();\n const React = await import(\"react\");\n const Item = (props: SidebarItemStubProps) => {\n return React.createElement(\"button\", { onClick: props.onClick }, props.text);\n };\n const ItemIcon = () => React.createElement(\"span\");\n return {\n ...actual,\n Sidebar: { ...actual.Sidebar, Item: Object.assign(Item, { Icon: ItemIcon }) }\n };\n});\n\ndescribe(\"CmsContentReviewsSidebarItem\", () => {\n beforeEach(() => {\n model.publishable = true;\n goToRoute.mockReset();\n });\n\n it(\"adds a Content Reviews item to the sidebar footer that opens the route\", () => {\n render(<CmsContentReviewsSidebarItem />);\n\n expect(screen.getByTestId(\"footer\").getAttribute(\"data-name\")).toBe(\"content-reviews\");\n fireEvent.click(screen.getByRole(\"button\", { name: \"Content Reviews\" }));\n\n expect(goToRoute).toHaveBeenCalledTimes(1);\n expect(goToRoute).toHaveBeenCalledWith(Routes.ContentEntries.ContentReviews);\n });\n\n it(\"adds no item for a model that cannot publish\", () => {\n model.publishable = false;\n\n render(<CmsContentReviewsSidebarItem />);\n\n expect(screen.getByTestId(\"footer\")).toBeTruthy();\n expect(screen.queryByRole(\"button\", { name: \"Content Reviews\" })).toBeNull();\n });\n});\n"],"names":["goToRoute","vi","model","importOriginal","actual","React","Footer","props","Config","children","Object","Item","ItemIcon","describe","beforeEach","it","render","CmsContentReviewsSidebarItem","expect","screen","fireEvent","Routes"],"mappings":";;;;;AA0BA,MAAMA,YAAYC,GAAG,OAAO,CAAC,IAAMA,GAAG,EAAE;AAExC,MAAMC,QAAQD,GAAG,OAAO,CAAC,IACd;QAAE,aAAa;IAAK;AAG/BA,GAAG,IAAI,CAAC,qBAAqB,OAAME;IAC/B,MAAMC,SAAS,MAAMD;IACrB,OAAO;QACH,GAAGC,MAAM;QACT,WAAW,IACA;gBAAEJ,WAAAA;YAAU;IAE3B;AACJ;AAEAC,GAAG,IAAI,CAAC,iEAAiE;IACrE,MAAMI,QAAQ,MAAM,MAAM,CAAC;IAC3B,MAAMC,SAAS,CAACC,QACLF,MAAM,aAAa,CACtB,OACA;YAAE,eAAe;YAAU,aAAaE,MAAM,IAAI;QAAC,GACnDA,MAAM,OAAO;IAGrB,MAAMC,SAAS,CAAC,EAAEC,QAAQ,EAAqB,GACpCJ,MAAM,aAAa,CAACA,MAAM,QAAQ,EAAE,MAAMI;IAErD,OAAO;QAAE,wBAAwBC,OAAO,MAAM,CAACF,QAAQ;YAAE,SAAS;gBAAE,SAAS;oBAAEF;gBAAO;YAAE;QAAE;IAAG;AACjG;AAEAL,GAAG,IAAI,CAAC,iDAAiD;IACrD,MAAMI,QAAQ,MAAM,MAAM,CAAC;IAC3B,OAAO;QACH,oBAAoB,CAAC,EAAEI,QAAQ,EAAqB,GACzCP,MAAM,WAAW,GAAGG,MAAM,aAAa,CAACA,MAAM,QAAQ,EAAE,MAAMI,YAAY;IAEzF;AACJ;AAEAR,GAAG,IAAI,CAAC,oBAAoB,OAAME;IAC9B,MAAMC,SAAS,MAAMD;IACrB,MAAME,QAAQ,MAAM,MAAM,CAAC;IAC3B,MAAMM,OAAO,CAACJ,QACHF,MAAM,aAAa,CAAC,UAAU;YAAE,SAASE,MAAM,OAAO;QAAC,GAAGA,MAAM,IAAI;IAE/E,MAAMK,WAAW,IAAMP,MAAM,aAAa,CAAC;IAC3C,OAAO;QACH,GAAGD,MAAM;QACT,SAAS;YAAE,GAAGA,OAAO,OAAO;YAAE,MAAMM,OAAO,MAAM,CAACC,MAAM;gBAAE,MAAMC;YAAS;QAAG;IAChF;AACJ;AAEAC,SAAS,gCAAgC;IACrCC,WAAW;QACPZ,MAAM,WAAW,GAAG;QACpBF,UAAU,SAAS;IACvB;IAEAe,GAAG,0EAA0E;QACzEC,OAAO,WAADA,GAAC,oBAACC,8BAA4BA;QAEpCC,OAAOC,OAAO,WAAW,CAAC,UAAU,YAAY,CAAC,cAAc,IAAI,CAAC;QACpEC,UAAU,KAAK,CAACD,OAAO,SAAS,CAAC,UAAU;YAAE,MAAM;QAAkB;QAErED,OAAOlB,WAAW,qBAAqB,CAAC;QACxCkB,OAAOlB,WAAW,oBAAoB,CAACqB,OAAO,cAAc,CAAC,cAAc;IAC/E;IAEAN,GAAG,gDAAgD;QAC/Cb,MAAM,WAAW,GAAG;QAEpBc,OAAO,WAADA,GAAC,oBAACC,8BAA4BA;QAEpCC,OAAOC,OAAO,WAAW,CAAC,WAAW,UAAU;QAC/CD,OAAOC,OAAO,WAAW,CAAC,UAAU;YAAE,MAAM;QAAkB,IAAI,QAAQ;IAC9E;AACJ"}
@@ -0,0 +1,8 @@
1
+ export interface ModelBoundWorkflow {
2
+ id: string;
3
+ name: string;
4
+ }
5
+ export interface ModelBoundToWorkflowErrorData {
6
+ modelId: string;
7
+ workflows: ModelBoundWorkflow[];
8
+ }
@@ -0,0 +1,10 @@
1
+ export interface ModelDeleteWorkflowCopyParams {
2
+ modelName: string;
3
+ workflowName: string;
4
+ canManage: boolean;
5
+ }
6
+ export interface ModelDeleteWorkflowCopy {
7
+ title: string;
8
+ body: string;
9
+ showLink: boolean;
10
+ }
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare const ModelDeleteWorkflowError: (props: unknown) => React.JSX.Element;
@@ -0,0 +1,34 @@
1
+ import react from "react";
2
+ import { Alert, Heading, Link, Text } from "@webiny/admin-ui";
3
+ import { useRouter } from "@webiny/app-admin";
4
+ import { FullyDeleteModelError } from "@webiny/app-headless-cms/presentation/contentModels/components/fullDelete/dialog/FullyDeleteModelError.js";
5
+ import { useWorkflowsPermission } from "@webiny/app-workflows/presentation/permissions/useWorkflowsPermission.js";
6
+ import { ReactComponent } from "@webiny/icons/account_tree.svg";
7
+ import { Routes } from "../../routes.js";
8
+ import { getModelDeleteWorkflowCopy } from "./getModelDeleteWorkflowCopy.js";
9
+ const BOUND_TO_WORKFLOW = "Workflows/Model/BoundToWorkflow";
10
+ const ModelDeleteWorkflowError = FullyDeleteModelError.createDecorator((Original)=>function(props) {
11
+ const router = useRouter();
12
+ const permission = useWorkflowsPermission();
13
+ const data = props.error.data;
14
+ const workflow = data && data.workflows ? data.workflows[0] : void 0;
15
+ if (props.error.code !== BOUND_TO_WORKFLOW || !workflow) return /*#__PURE__*/ react.createElement(Original, props);
16
+ const copy = getModelDeleteWorkflowCopy({
17
+ modelName: props.model.name,
18
+ workflowName: workflow.name,
19
+ canManage: permission.editor
20
+ });
21
+ return /*#__PURE__*/ react.createElement(Alert, {
22
+ type: "danger",
23
+ icon: /*#__PURE__*/ react.createElement(ReactComponent, null)
24
+ }, /*#__PURE__*/ react.createElement("div", {
25
+ className: "flex flex-col gap-xs"
26
+ }, /*#__PURE__*/ react.createElement(Heading, {
27
+ level: 6
28
+ }, copy.title), /*#__PURE__*/ react.createElement(Text, null, copy.body), copy.showLink && /*#__PURE__*/ react.createElement(Link, {
29
+ to: router.getLink(Routes.ContentModels.Workflows)
30
+ }, "Open workflow →")));
31
+ });
32
+ export { ModelDeleteWorkflowError };
33
+
34
+ //# sourceMappingURL=ModelDeleteWorkflowError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/ModelDelete/ModelDeleteWorkflowError.js","sources":["../../../src/Components/ModelDelete/ModelDeleteWorkflowError.tsx"],"sourcesContent":["import React from \"react\";\nimport { Alert } from \"@webiny/admin-ui\";\nimport { Link } from \"@webiny/admin-ui\";\nimport { Heading } from \"@webiny/admin-ui\";\nimport { Text } from \"@webiny/admin-ui\";\nimport { useRouter } from \"@webiny/app-admin\";\nimport { FullyDeleteModelError } from \"@webiny/app-headless-cms/presentation/contentModels/components/fullDelete/dialog/FullyDeleteModelError.js\";\nimport { useWorkflowsPermission } from \"@webiny/app-workflows/presentation/permissions/useWorkflowsPermission.js\";\nimport { ReactComponent as AccountTreeIcon } from \"@webiny/icons/account_tree.svg\";\nimport { Routes } from \"~/routes.js\";\nimport { getModelDeleteWorkflowCopy } from \"./getModelDeleteWorkflowCopy.js\";\nimport type { ModelBoundToWorkflowErrorData } from \"./ModelBoundToWorkflowErrorData.js\";\n\nconst BOUND_TO_WORKFLOW = \"Workflows/Model/BoundToWorkflow\";\n\n/*\n * A model delete the server refused because a workflow uses the model (UI-18, QBZ-38): names the\n * workflow and links to it for someone who may manage workflows. Any other error stays as it was.\n */\nexport const ModelDeleteWorkflowError = FullyDeleteModelError.createDecorator(Original => {\n return function ModelDeleteWorkflowErrorDecorator(props) {\n const router = useRouter();\n const permission = useWorkflowsPermission();\n const data = props.error.data as ModelBoundToWorkflowErrorData | null;\n const workflow = data && data.workflows ? data.workflows[0] : undefined;\n\n if (props.error.code !== BOUND_TO_WORKFLOW || !workflow) {\n return <Original {...props} />;\n }\n\n const copy = getModelDeleteWorkflowCopy({\n modelName: props.model.name,\n workflowName: workflow.name,\n canManage: permission.editor\n });\n\n return (\n <Alert type={\"danger\"} icon={<AccountTreeIcon />}>\n <div className={\"flex flex-col gap-xs\"}>\n <Heading level={6}>{copy.title}</Heading>\n <Text>{copy.body}</Text>\n {copy.showLink && (\n <Link to={router.getLink(Routes.ContentModels.Workflows)}>\n {\"Open workflow →\"}\n </Link>\n )}\n </div>\n </Alert>\n );\n };\n});\n"],"names":["BOUND_TO_WORKFLOW","ModelDeleteWorkflowError","FullyDeleteModelError","Original","props","router","useRouter","permission","useWorkflowsPermission","data","workflow","undefined","copy","getModelDeleteWorkflowCopy","Alert","AccountTreeIcon","Heading","Text","Link","Routes"],"mappings":";;;;;;;;AAaA,MAAMA,oBAAoB;AAMnB,MAAMC,2BAA2BC,sBAAsB,eAAe,CAACC,CAAAA,WACnE,SAA2CC,KAAK;QACnD,MAAMC,SAASC;QACf,MAAMC,aAAaC;QACnB,MAAMC,OAAOL,MAAM,KAAK,CAAC,IAAI;QAC7B,MAAMM,WAAWD,QAAQA,KAAK,SAAS,GAAGA,KAAK,SAAS,CAAC,EAAE,GAAGE;QAE9D,IAAIP,MAAM,KAAK,CAAC,IAAI,KAAKJ,qBAAqB,CAACU,UAC3C,OAAO,WAAP,GAAO,oBAACP,UAAaC;QAGzB,MAAMQ,OAAOC,2BAA2B;YACpC,WAAWT,MAAM,KAAK,CAAC,IAAI;YAC3B,cAAcM,SAAS,IAAI;YAC3B,WAAWH,WAAW,MAAM;QAChC;QAEA,OAAO,WAAP,GACI,oBAACO,OAAKA;YAAC,MAAM;YAAU,oBAAM,oBAACC,gBAAeA;yBACzC,oBAAC;YAAI,WAAW;yBACZ,oBAACC,SAAOA;YAAC,OAAO;WAAIJ,KAAK,KAAK,iBAC9B,oBAACK,MAAIA,MAAEL,KAAK,IAAI,GACfA,KAAK,QAAQ,IAAI,WAAJ,GACV,oBAACM,MAAIA;YAAC,IAAIb,OAAO,OAAO,CAACc,OAAO,aAAa,CAAC,SAAS;WAClD;IAMzB"}
@@ -0,0 +1,73 @@
1
+ import react from "react";
2
+ import { describe, expect, it, vi } from "vitest";
3
+ import { render, screen } from "@testing-library/react";
4
+ import { AdminUiProvider } from "@webiny/admin-ui";
5
+ import { CompositionProvider } from "@webiny/react-composition";
6
+ import { FullyDeleteModelError } from "@webiny/app-headless-cms/presentation/contentModels/components/fullDelete/dialog/FullyDeleteModelError.js";
7
+ import { ModelDeleteWorkflowError } from "./ModelDeleteWorkflowError.js";
8
+ const hoisted = vi.hoisted(()=>({
9
+ editor: true
10
+ }));
11
+ vi.mock("@webiny/app-workflows/presentation/permissions/useWorkflowsPermission.js", ()=>({
12
+ useWorkflowsPermission: ()=>({
13
+ editor: hoisted.editor
14
+ })
15
+ }));
16
+ vi.mock("@webiny/app-admin", async (importOriginal)=>{
17
+ const actual = await importOriginal();
18
+ return {
19
+ ...actual,
20
+ useRouter: ()=>({
21
+ getLink: ()=>"/cms/workflows"
22
+ })
23
+ };
24
+ });
25
+ const model = {
26
+ modelId: "article",
27
+ name: "Article"
28
+ };
29
+ const BOUND = {
30
+ message: 'The model "article" is used by the workflow "Article review".',
31
+ code: "Workflows/Model/BoundToWorkflow",
32
+ data: {
33
+ modelId: "article",
34
+ workflows: [
35
+ {
36
+ id: "wf1",
37
+ name: "Article review"
38
+ }
39
+ ]
40
+ }
41
+ };
42
+ const renderError = (error)=>render(/*#__PURE__*/ react.createElement(AdminUiProvider, null, /*#__PURE__*/ react.createElement(CompositionProvider, null, /*#__PURE__*/ react.createElement(ModelDeleteWorkflowError, null), /*#__PURE__*/ react.createElement(FullyDeleteModelError, {
43
+ model: model,
44
+ error: error
45
+ }))));
46
+ describe("ModelDeleteWorkflowError (UI-18, QBZ-38)", ()=>{
47
+ it("explains a delete blocked by a workflow and links to it", async ()=>{
48
+ hoisted.editor = true;
49
+ renderError(BOUND);
50
+ expect(await screen.findByText("Article has a workflow")).toBeTruthy();
51
+ expect(screen.getByText("Delete the workflow “Article review” first, then delete the model.")).toBeTruthy();
52
+ expect(screen.getByText("Open workflow →").closest("a")?.getAttribute("href")).toBe("/cms/workflows");
53
+ expect(screen.queryByText(BOUND.message)).toBeNull();
54
+ });
55
+ it("hides the link without Manage workflows", async ()=>{
56
+ hoisted.editor = false;
57
+ renderError(BOUND);
58
+ expect(await screen.findByText("Ask someone with Manage workflows to delete the workflow “Article review” first, then delete the model.")).toBeTruthy();
59
+ expect(screen.queryByText("Open workflow →")).toBeNull();
60
+ });
61
+ it("leaves every other delete error as it was", async ()=>{
62
+ hoisted.editor = true;
63
+ renderError({
64
+ message: "Network error.",
65
+ code: "FULLY_DELETE_MODEL_ERROR",
66
+ data: {}
67
+ });
68
+ expect(await screen.findByText("Network error.")).toBeTruthy();
69
+ expect(screen.queryByText(/has a workflow/)).toBeNull();
70
+ });
71
+ });
72
+
73
+ //# sourceMappingURL=ModelDeleteWorkflowError.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/ModelDelete/ModelDeleteWorkflowError.test.js","sources":["../../../src/Components/ModelDelete/ModelDeleteWorkflowError.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 { AdminUiProvider } from \"@webiny/admin-ui\";\nimport { CompositionProvider } from \"@webiny/react-composition\";\nimport { FullyDeleteModelError } from \"@webiny/app-headless-cms/presentation/contentModels/components/fullDelete/dialog/FullyDeleteModelError.js\";\nimport type { CmsErrorResponse, CmsModel } from \"@webiny/app-headless-cms/types.js\";\nimport { ModelDeleteWorkflowError } from \"./ModelDeleteWorkflowError.js\";\n\nconst hoisted = vi.hoisted(() => {\n return { editor: true };\n});\n\nvi.mock(\"@webiny/app-workflows/presentation/permissions/useWorkflowsPermission.js\", () => {\n return { useWorkflowsPermission: () => ({ editor: hoisted.editor }) };\n});\n\nvi.mock(\"@webiny/app-admin\", async importOriginal => {\n const actual = await importOriginal<typeof import(\"@webiny/app-admin\")>();\n return { ...actual, useRouter: () => ({ getLink: () => \"/cms/workflows\" }) };\n});\n\nconst model = { modelId: \"article\", name: \"Article\" } as CmsModel;\n\nconst BOUND: CmsErrorResponse = {\n message: 'The model \"article\" is used by the workflow \"Article review\".',\n code: \"Workflows/Model/BoundToWorkflow\",\n data: { modelId: \"article\", workflows: [{ id: \"wf1\", name: \"Article review\" }] }\n};\n\nconst renderError = (error: CmsErrorResponse) => {\n return render(\n <AdminUiProvider>\n <CompositionProvider>\n <ModelDeleteWorkflowError />\n <FullyDeleteModelError model={model} error={error} />\n </CompositionProvider>\n </AdminUiProvider>\n );\n};\n\ndescribe(\"ModelDeleteWorkflowError (UI-18, QBZ-38)\", () => {\n it(\"explains a delete blocked by a workflow and links to it\", async () => {\n hoisted.editor = true;\n renderError(BOUND);\n\n expect(await screen.findByText(\"Article has a workflow\")).toBeTruthy();\n expect(\n screen.getByText(\"Delete the workflow “Article review” first, then delete the model.\")\n ).toBeTruthy();\n expect(screen.getByText(\"Open workflow →\").closest(\"a\")?.getAttribute(\"href\")).toBe(\n \"/cms/workflows\"\n );\n expect(screen.queryByText(BOUND.message)).toBeNull();\n });\n\n it(\"hides the link without Manage workflows\", async () => {\n hoisted.editor = false;\n renderError(BOUND);\n\n expect(\n await screen.findByText(\n \"Ask someone with Manage workflows to delete the workflow “Article review” first, then delete the model.\"\n )\n ).toBeTruthy();\n expect(screen.queryByText(\"Open workflow →\")).toBeNull();\n });\n\n it(\"leaves every other delete error as it was\", async () => {\n hoisted.editor = true;\n renderError({ message: \"Network error.\", code: \"FULLY_DELETE_MODEL_ERROR\", data: {} });\n\n expect(await screen.findByText(\"Network error.\")).toBeTruthy();\n expect(screen.queryByText(/has a workflow/)).toBeNull();\n });\n});\n"],"names":["hoisted","vi","importOriginal","actual","model","BOUND","renderError","error","render","AdminUiProvider","CompositionProvider","ModelDeleteWorkflowError","FullyDeleteModelError","describe","it","expect","screen"],"mappings":";;;;;;;AAaA,MAAMA,UAAUC,GAAG,OAAO,CAAC,IAChB;QAAE,QAAQ;IAAK;AAG1BA,GAAG,IAAI,CAAC,4EAA4E,IACzE;QAAE,wBAAwB,IAAO;gBAAE,QAAQD,QAAQ,MAAM;YAAC;IAAG;AAGxEC,GAAG,IAAI,CAAC,qBAAqB,OAAMC;IAC/B,MAAMC,SAAS,MAAMD;IACrB,OAAO;QAAE,GAAGC,MAAM;QAAE,WAAW,IAAO;gBAAE,SAAS,IAAM;YAAiB;IAAG;AAC/E;AAEA,MAAMC,QAAQ;IAAE,SAAS;IAAW,MAAM;AAAU;AAEpD,MAAMC,QAA0B;IAC5B,SAAS;IACT,MAAM;IACN,MAAM;QAAE,SAAS;QAAW,WAAW;YAAC;gBAAE,IAAI;gBAAO,MAAM;YAAiB;SAAE;IAAC;AACnF;AAEA,MAAMC,cAAc,CAACC,QACVC,OAAO,WAADA,GACT,oBAACC,iBAAeA,MAAAA,WAAAA,GACZ,oBAACC,qBAAmBA,MAAAA,WAAAA,GAChB,oBAACC,0BAAwBA,OAAAA,WAAAA,GACzB,oBAACC,uBAAqBA;QAAC,OAAOR;QAAO,OAAOG;;AAM5DM,SAAS,4CAA4C;IACjDC,GAAG,2DAA2D;QAC1Dd,QAAQ,MAAM,GAAG;QACjBM,YAAYD;QAEZU,OAAO,MAAMC,OAAO,UAAU,CAAC,2BAA2B,UAAU;QACpED,OACIC,OAAO,SAAS,CAAC,uEACnB,UAAU;QACZD,OAAOC,OAAO,SAAS,CAAC,mBAAmB,OAAO,CAAC,MAAM,aAAa,SAAS,IAAI,CAC/E;QAEJD,OAAOC,OAAO,WAAW,CAACX,MAAM,OAAO,GAAG,QAAQ;IACtD;IAEAS,GAAG,2CAA2C;QAC1Cd,QAAQ,MAAM,GAAG;QACjBM,YAAYD;QAEZU,OACI,MAAMC,OAAO,UAAU,CACnB,4GAEN,UAAU;QACZD,OAAOC,OAAO,WAAW,CAAC,oBAAoB,QAAQ;IAC1D;IAEAF,GAAG,6CAA6C;QAC5Cd,QAAQ,MAAM,GAAG;QACjBM,YAAY;YAAE,SAAS;YAAkB,MAAM;YAA4B,MAAM,CAAC;QAAE;QAEpFS,OAAO,MAAMC,OAAO,UAAU,CAAC,mBAAmB,UAAU;QAC5DD,OAAOC,OAAO,WAAW,CAAC,mBAAmB,QAAQ;IACzD;AACJ"}
@@ -0,0 +1,3 @@
1
+ import type { ModelDeleteWorkflowCopy } from "./ModelDeleteWorkflowCopy.js";
2
+ import type { ModelDeleteWorkflowCopyParams } from "./ModelDeleteWorkflowCopy.js";
3
+ export declare const getModelDeleteWorkflowCopy: (params: ModelDeleteWorkflowCopyParams) => ModelDeleteWorkflowCopy;
@@ -0,0 +1,17 @@
1
+ const getModelDeleteWorkflowCopy = (params)=>{
2
+ const { modelName, workflowName, canManage } = params;
3
+ const title = `${modelName} has a workflow`;
4
+ if (canManage) return {
5
+ title,
6
+ body: `Delete the workflow “${workflowName}” first, then delete the model.`,
7
+ showLink: true
8
+ };
9
+ return {
10
+ title,
11
+ body: `Ask someone with Manage workflows to delete the workflow “${workflowName}” first, then delete the model.`,
12
+ showLink: false
13
+ };
14
+ };
15
+ export { getModelDeleteWorkflowCopy };
16
+
17
+ //# sourceMappingURL=getModelDeleteWorkflowCopy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/ModelDelete/getModelDeleteWorkflowCopy.js","sources":["../../../src/Components/ModelDelete/getModelDeleteWorkflowCopy.ts"],"sourcesContent":["import type { ModelDeleteWorkflowCopy } from \"./ModelDeleteWorkflowCopy.js\";\nimport type { ModelDeleteWorkflowCopyParams } from \"./ModelDeleteWorkflowCopy.js\";\n\n// The copy of a model delete refused because a workflow uses the model (UI-18, QBZ-38). Pure.\nexport const getModelDeleteWorkflowCopy = (\n params: ModelDeleteWorkflowCopyParams\n): ModelDeleteWorkflowCopy => {\n const { modelName, workflowName, canManage } = params;\n const title = `${modelName} has a workflow`;\n if (canManage) {\n return {\n title,\n body: `Delete the workflow “${workflowName}” first, then delete the model.`,\n showLink: true\n };\n }\n return {\n title,\n body: `Ask someone with Manage workflows to delete the workflow “${workflowName}” first, then delete the model.`,\n showLink: false\n };\n};\n"],"names":["getModelDeleteWorkflowCopy","params","modelName","workflowName","canManage","title"],"mappings":"AAIO,MAAMA,6BAA6B,CACtCC;IAEA,MAAM,EAAEC,SAAS,EAAEC,YAAY,EAAEC,SAAS,EAAE,GAAGH;IAC/C,MAAMI,QAAQ,GAAGH,UAAU,eAAe,CAAC;IAC3C,IAAIE,WACA,OAAO;QACHC;QACA,MAAM,CAAC,qBAAqB,EAAEF,aAAa,+BAA+B,CAAC;QAC3E,UAAU;IACd;IAEJ,OAAO;QACHE;QACA,MAAM,CAAC,0DAA0D,EAAEF,aAAa,+BAA+B,CAAC;QAChH,UAAU;IACd;AACJ"}
@@ -0,0 +1,28 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { getModelDeleteWorkflowCopy } from "./getModelDeleteWorkflowCopy.js";
3
+ describe("getModelDeleteWorkflowCopy (UI-18, QBZ-38)", ()=>{
4
+ it("tells someone with Manage workflows to delete the workflow, with the link", ()=>{
5
+ expect(getModelDeleteWorkflowCopy({
6
+ modelName: "Article",
7
+ workflowName: "Article review",
8
+ canManage: true
9
+ })).toEqual({
10
+ title: "Article has a workflow",
11
+ body: "Delete the workflow “Article review” first, then delete the model.",
12
+ showLink: true
13
+ });
14
+ });
15
+ it("tells anyone else to ask someone with Manage workflows, without the link", ()=>{
16
+ expect(getModelDeleteWorkflowCopy({
17
+ modelName: "Article",
18
+ workflowName: "Article review",
19
+ canManage: false
20
+ })).toEqual({
21
+ title: "Article has a workflow",
22
+ body: "Ask someone with Manage workflows to delete the workflow “Article review” first, then delete the model.",
23
+ showLink: false
24
+ });
25
+ });
26
+ });
27
+
28
+ //# sourceMappingURL=getModelDeleteWorkflowCopy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/ModelDelete/getModelDeleteWorkflowCopy.test.js","sources":["../../../src/Components/ModelDelete/getModelDeleteWorkflowCopy.test.ts"],"sourcesContent":["import { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { getModelDeleteWorkflowCopy } from \"./getModelDeleteWorkflowCopy.js\";\n\ndescribe(\"getModelDeleteWorkflowCopy (UI-18, QBZ-38)\", () => {\n it(\"tells someone with Manage workflows to delete the workflow, with the link\", () => {\n expect(\n getModelDeleteWorkflowCopy({\n modelName: \"Article\",\n workflowName: \"Article review\",\n canManage: true\n })\n ).toEqual({\n title: \"Article has a workflow\",\n body: \"Delete the workflow “Article review” first, then delete the model.\",\n showLink: true\n });\n });\n\n it(\"tells anyone else to ask someone with Manage workflows, without the link\", () => {\n expect(\n getModelDeleteWorkflowCopy({\n modelName: \"Article\",\n workflowName: \"Article review\",\n canManage: false\n })\n ).toEqual({\n title: \"Article has a workflow\",\n body: \"Ask someone with Manage workflows to delete the workflow “Article review” first, then delete the model.\",\n showLink: false\n });\n });\n});\n"],"names":["describe","it","expect","getModelDeleteWorkflowCopy"],"mappings":";;AAKAA,SAAS,8CAA8C;IACnDC,GAAG,6EAA6E;QAC5EC,OACIC,2BAA2B;YACvB,WAAW;YACX,cAAc;YACd,WAAW;QACf,IACF,OAAO,CAAC;YACN,OAAO;YACP,MAAM;YACN,UAAU;QACd;IACJ;IAEAF,GAAG,4EAA4E;QAC3EC,OACIC,2BAA2B;YACvB,WAAW;YACX,cAAc;YACd,WAAW;QACf,IACF,OAAO,CAAC;YACN,OAAO;YACP,MAAM;YACN,UAAU;QACd;IACJ;AACJ"}
@@ -0,0 +1 @@
1
+ export declare function ignoreAction(): void;
@@ -0,0 +1,4 @@
1
+ function ignoreAction() {}
2
+ export { ignoreAction };
3
+
4
+ //# sourceMappingURL=ignoreAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components/ignoreAction.js","sources":["../../src/Components/ignoreAction.ts"],"sourcesContent":["// A disabled action still needs a handler; it does nothing.\nexport function ignoreAction(): void {}\n"],"names":["ignoreAction"],"mappings":"AACO,SAASA,gBAAsB"}
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-headless-cms-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 CmsWorkflowEditor: () => React.JSX.Element;
@@ -0,0 +1,23 @@
1
+ import react from "react";
2
+ import { useFeature } from "@webiny/app";
3
+ import { WorkflowEditorMenu } from "@webiny/app-workflows/editor/mounting/components/WorkflowEditorMenu.js";
4
+ import { WorkflowEditorRoute } from "@webiny/app-workflows/editor/mounting/components/WorkflowEditorRoute.js";
5
+ import { CmsWorkflowEditorMountingFeature } from "../features/editorMounting/feature.js";
6
+ import { Routes } from "../routes.js";
7
+ const CmsWorkflowEditor = ()=>{
8
+ const { app } = useFeature(CmsWorkflowEditorMountingFeature);
9
+ return /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(WorkflowEditorRoute, {
10
+ route: Routes.ContentModels.Workflows,
11
+ appBreadcrumbName: "cms",
12
+ appBreadcrumbLabel: "Headless CMS",
13
+ breadcrumbName: "cms.workflows",
14
+ app: app
15
+ }), /*#__PURE__*/ react.createElement(WorkflowEditorMenu, {
16
+ name: "headlessCMS.contentModels.workflows",
17
+ parent: "headlessCMS",
18
+ route: Routes.ContentModels.Workflows
19
+ }));
20
+ };
21
+ export { CmsWorkflowEditor };
22
+
23
+ //# sourceMappingURL=CmsWorkflowEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Routes/CmsWorkflowEditor.js","sources":["../../src/Routes/CmsWorkflowEditor.tsx"],"sourcesContent":["import React from \"react\";\nimport { useFeature } from \"@webiny/app\";\nimport { WorkflowEditorMenu } from \"@webiny/app-workflows/editor/mounting/components/WorkflowEditorMenu.js\";\nimport { WorkflowEditorRoute } from \"@webiny/app-workflows/editor/mounting/components/WorkflowEditorRoute.js\";\nimport { CmsWorkflowEditorMountingFeature } from \"~/features/editorMounting/feature.js\";\nimport { Routes } from \"~/routes.js\";\n\n/*\n * Mounts the shared workflow editor route and menu item with the CMS adapter. Without the workflows\n * `editor` permission the menu item renders nothing and the route shows the no-access view (D162,\n * R331).\n */\nexport const CmsWorkflowEditor = () => {\n const { app } = useFeature(CmsWorkflowEditorMountingFeature);\n\n return (\n <>\n <WorkflowEditorRoute\n route={Routes.ContentModels.Workflows}\n appBreadcrumbName=\"cms\"\n appBreadcrumbLabel=\"Headless CMS\"\n breadcrumbName=\"cms.workflows\"\n app={app}\n />\n <WorkflowEditorMenu\n name=\"headlessCMS.contentModels.workflows\"\n parent=\"headlessCMS\"\n route={Routes.ContentModels.Workflows}\n />\n </>\n );\n};\n"],"names":["CmsWorkflowEditor","app","useFeature","CmsWorkflowEditorMountingFeature","WorkflowEditorRoute","Routes","WorkflowEditorMenu"],"mappings":";;;;;;AAYO,MAAMA,oBAAoB;IAC7B,MAAM,EAAEC,GAAG,EAAE,GAAGC,WAAWC;IAE3B,OAAO,WAAP,GACI,wDACI,oBAACC,qBAAmBA;QAChB,OAAOC,OAAO,aAAa,CAAC,SAAS;QACrC,mBAAkB;QAClB,oBAAmB;QACnB,gBAAe;QACf,KAAKJ;sBAET,oBAACK,oBAAkBA;QACf,MAAK;QACL,QAAO;QACP,OAAOD,OAAO,aAAa,CAAC,SAAS;;AAIrD"}
@@ -0,0 +1 @@
1
+ export {};