@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.
- package/Components/ContentReviews/WbContentReviews.d.ts +2 -0
- package/Components/ContentReviews/WbContentReviews.js +41 -0
- package/Components/ContentReviews/WbContentReviews.js.map +1 -0
- package/Components/ContentReviews/WbContentReviews.smoke.test.d.ts +1 -0
- package/Components/ContentReviews/WbContentReviews.smoke.test.js +59 -0
- package/Components/ContentReviews/WbContentReviews.smoke.test.js.map +1 -0
- package/Components/ContentReviews/WbContentReviews.test.d.ts +1 -0
- package/Components/ContentReviews/WbContentReviews.test.js +80 -0
- package/Components/ContentReviews/WbContentReviews.test.js.map +1 -0
- package/Components/ContentReviews/WbContentReviewsSidebarItem.d.ts +2 -0
- package/Components/ContentReviews/WbContentReviewsSidebarItem.js +18 -0
- package/Components/ContentReviews/WbContentReviewsSidebarItem.js.map +1 -0
- package/Components/ContentReviews/WbContentReviewsSidebarItem.test.d.ts +1 -0
- package/Components/ContentReviews/WbContentReviewsSidebarItem.test.js +67 -0
- package/Components/ContentReviews/WbContentReviewsSidebarItem.test.js.map +1 -0
- package/Components/PageEditor/DisabledPublishButton.d.ts +6 -0
- package/Components/PageEditor/DisabledPublishButton.js +17 -0
- package/Components/PageEditor/DisabledPublishButton.js.map +1 -0
- package/Components/PageEditor/DisabledPublishButton.test.d.ts +1 -0
- package/Components/PageEditor/DisabledPublishButton.test.js +67 -0
- package/Components/PageEditor/DisabledPublishButton.test.js.map +1 -0
- package/Components/PageEditor/PageBasePublishDecorator.d.ts +2 -0
- package/Components/PageEditor/PageBasePublishDecorator.js +23 -0
- package/Components/PageEditor/PageBasePublishDecorator.js.map +1 -0
- package/Components/PageEditor/PageEditorAutoSave.d.ts +2 -0
- package/Components/PageEditor/PageEditorAutoSave.js +23 -0
- package/Components/PageEditor/PageEditorAutoSave.js.map +1 -0
- package/Components/PageEditor/PageEditorAutoSave.test.d.ts +1 -0
- package/Components/PageEditor/PageEditorAutoSave.test.js +111 -0
- package/Components/PageEditor/PageEditorAutoSave.test.js.map +1 -0
- package/Components/PageEditor/PageEditorConfig.d.ts +2 -0
- package/Components/PageEditor/PageEditorConfig.js +13 -0
- package/Components/PageEditor/PageEditorConfig.js.map +1 -0
- package/Components/PageEditor/PageEditorLayout.d.ts +2 -0
- package/Components/PageEditor/PageEditorLayout.js +10 -0
- package/Components/PageEditor/PageEditorLayout.js.map +1 -0
- package/Components/PageEditor/PageEditorLayout.test.d.ts +1 -0
- package/Components/PageEditor/PageEditorLayout.test.js +121 -0
- package/Components/PageEditor/PageEditorLayout.test.js.map +1 -0
- package/Components/PageEditor/PageEditorTopBar.d.ts +2 -0
- package/Components/PageEditor/PageEditorTopBar.js +10 -0
- package/Components/PageEditor/PageEditorTopBar.js.map +1 -0
- package/Components/PageEditor/PageEditorTopBar.test.d.ts +1 -0
- package/Components/PageEditor/PageEditorTopBar.test.js +175 -0
- package/Components/PageEditor/PageEditorTopBar.test.js.map +1 -0
- package/Components/PageEditor/PageNewRevisionDecorator.d.ts +2 -0
- package/Components/PageEditor/PageNewRevisionDecorator.js +24 -0
- package/Components/PageEditor/PageNewRevisionDecorator.js.map +1 -0
- package/Components/PageEditor/PageNewRevisionDecorator.test.d.ts +1 -0
- package/Components/PageEditor/PageNewRevisionDecorator.test.js +107 -0
- package/Components/PageEditor/PageNewRevisionDecorator.test.js.map +1 -0
- package/Components/PageEditor/PageReadOnlySync.d.ts +3 -0
- package/Components/PageEditor/PageReadOnlySync.js +23 -0
- package/Components/PageEditor/PageReadOnlySync.js.map +1 -0
- package/Components/PageEditor/PageReviewBar.d.ts +4 -0
- package/Components/PageEditor/PageReviewBar.js +93 -0
- package/Components/PageEditor/PageReviewBar.js.map +1 -0
- package/Components/PageEditor/PageReviewBar.test.d.ts +1 -0
- package/Components/PageEditor/PageReviewBar.test.js +135 -0
- package/Components/PageEditor/PageReviewBar.test.js.map +1 -0
- package/Components/PageEditor/PageReviewPublishAction.d.ts +2 -0
- package/Components/PageEditor/PageReviewPublishAction.js +15 -0
- package/Components/PageEditor/PageReviewPublishAction.js.map +1 -0
- package/Components/PageEditor/PageReviewPublishButton.d.ts +4 -0
- package/Components/PageEditor/PageReviewPublishButton.js +23 -0
- package/Components/PageEditor/PageReviewPublishButton.js.map +1 -0
- package/Components/PageEditor/PageScheduleDecorator.d.ts +2 -0
- package/Components/PageEditor/PageScheduleDecorator.js +23 -0
- package/Components/PageEditor/PageScheduleDecorator.js.map +1 -0
- package/Components/PageEditor/PageScheduleDecorator.test.d.ts +1 -0
- package/Components/PageEditor/PageScheduleDecorator.test.js +75 -0
- package/Components/PageEditor/PageScheduleDecorator.test.js.map +1 -0
- package/Components/PageEditor/getPageReadOnlyReason.d.ts +4 -0
- package/Components/PageEditor/getPageReadOnlyReason.js +20 -0
- package/Components/PageEditor/getPageReadOnlyReason.js.map +1 -0
- package/Components/PageEditor/getPageReadOnlyReason.test.d.ts +1 -0
- package/Components/PageEditor/getPageReadOnlyReason.test.js +122 -0
- package/Components/PageEditor/getPageReadOnlyReason.test.js.map +1 -0
- package/Components/PageEditor/getPageReviewContext.d.ts +9 -0
- package/Components/PageEditor/getPageReviewContext.js +13 -0
- package/Components/PageEditor/getPageReviewContext.js.map +1 -0
- package/Components/PageEditor/getPageReviewContext.test.d.ts +1 -0
- package/Components/PageEditor/getPageReviewContext.test.js +42 -0
- package/Components/PageEditor/getPageReviewContext.test.js.map +1 -0
- package/Components/PageEditor/pageEditorDocument.d.ts +17 -0
- package/Components/PageEditor/pageEditorDocument.js +0 -0
- package/Components/PageEditor/pageReviewMatrix.test.d.ts +1 -0
- package/Components/PageEditor/pageReviewMatrix.test.js +223 -0
- package/Components/PageEditor/pageReviewMatrix.test.js.map +1 -0
- package/Components/PageEditor/publishMatrix.test.d.ts +1 -0
- package/Components/PageEditor/publishMatrix.test.js +313 -0
- package/Components/PageEditor/publishMatrix.test.js.map +1 -0
- package/Components/PagesList/PageListReviewGatedActions.d.ts +2 -0
- package/Components/PagesList/PageListReviewGatedActions.js +27 -0
- package/Components/PagesList/PageListReviewGatedActions.js.map +1 -0
- package/Components/PagesList/PageListReviewGatedActions.test.d.ts +1 -0
- package/Components/PagesList/PageListReviewGatedActions.test.js +94 -0
- package/Components/PagesList/PageListReviewGatedActions.test.js.map +1 -0
- package/Components/PagesList/PagesList.d.ts +2 -0
- package/Components/PagesList/PagesList.js +8 -0
- package/Components/PagesList/PagesList.js.map +1 -0
- package/Components/PagesList/PagesList.test.d.ts +1 -0
- package/Components/PagesList/PagesList.test.js +47 -0
- package/Components/PagesList/PagesList.test.js.map +1 -0
- package/Components/PagesList/index.d.ts +1 -0
- package/Components/PagesList/index.js +1 -0
- package/Components/index.d.ts +2 -0
- package/Components/index.js +2 -0
- package/LICENSE +21 -0
- package/README.md +11 -0
- package/Routes/WebsiteBuilderWorkflowsMenu.d.ts +2 -0
- package/Routes/WebsiteBuilderWorkflowsMenu.js +23 -0
- package/Routes/WebsiteBuilderWorkflowsMenu.js.map +1 -0
- package/Routes/WebsiteBuilderWorkflowsMenu.test.d.ts +1 -0
- package/Routes/WebsiteBuilderWorkflowsMenu.test.js +141 -0
- package/Routes/WebsiteBuilderWorkflowsMenu.test.js.map +1 -0
- package/Routes/index.d.ts +1 -0
- package/Routes/index.js +1 -0
- package/constants.d.ts +1 -0
- package/constants.js +4 -0
- package/constants.js.map +1 -0
- package/editorGlue.wiring.test.d.ts +1 -0
- package/editorGlue.wiring.test.js +128 -0
- package/editorGlue.wiring.test.js.map +1 -0
- package/features/cache/WbReviewCacheSyncHandler.d.ts +8 -0
- package/features/cache/WbReviewCacheSyncHandler.js +14 -0
- package/features/cache/WbReviewCacheSyncHandler.js.map +1 -0
- package/features/cache/WbReviewPageCacheWriter.d.ts +17 -0
- package/features/cache/WbReviewPageCacheWriter.js +39 -0
- package/features/cache/WbReviewPageCacheWriter.js.map +1 -0
- package/features/cache/WbReviewPageCacheWriter.test.d.ts +1 -0
- package/features/cache/WbReviewPageCacheWriter.test.js +115 -0
- package/features/cache/WbReviewPageCacheWriter.test.js.map +1 -0
- package/features/cache/abstractions.d.ts +5 -0
- package/features/cache/abstractions.js +5 -0
- package/features/cache/abstractions.js.map +1 -0
- package/features/cache/feature.d.ts +1 -0
- package/features/cache/feature.js +13 -0
- package/features/cache/feature.js.map +1 -0
- package/features/editorGateway/WbWorkflowEditorGateway/WbWorkflowEditorGateway.d.ts +25 -0
- package/features/editorGateway/WbWorkflowEditorGateway/WbWorkflowEditorGateway.js +112 -0
- package/features/editorGateway/WbWorkflowEditorGateway/WbWorkflowEditorGateway.js.map +1 -0
- package/features/editorGateway/WbWorkflowEditorGateway/WbWorkflowEditorGateway.test.d.ts +1 -0
- package/features/editorGateway/WbWorkflowEditorGateway/WbWorkflowEditorGateway.test.js +632 -0
- package/features/editorGateway/WbWorkflowEditorGateway/WbWorkflowEditorGateway.test.js.map +1 -0
- package/features/editorGateway/feature.d.ts +1 -0
- package/features/editorGateway/feature.js +11 -0
- package/features/editorGateway/feature.js.map +1 -0
- package/features/editorGateway/feature.test.d.ts +1 -0
- package/features/editorGateway/feature.test.js +244 -0
- package/features/editorGateway/feature.test.js.map +1 -0
- package/features/editorGateway/graphql/deleteWebsiteBuilderPageWorkflow.d.ts +1 -0
- package/features/editorGateway/graphql/deleteWebsiteBuilderPageWorkflow.js +19 -0
- package/features/editorGateway/graphql/deleteWebsiteBuilderPageWorkflow.js.map +1 -0
- package/features/editorGateway/graphql/getWebsiteBuilderPageWorkflow.d.ts +1 -0
- package/features/editorGateway/graphql/getWebsiteBuilderPageWorkflow.js +19 -0
- package/features/editorGateway/graphql/getWebsiteBuilderPageWorkflow.js.map +1 -0
- package/features/editorGateway/graphql/inspectWebsiteBuilderPageRouting.d.ts +1 -0
- package/features/editorGateway/graphql/inspectWebsiteBuilderPageRouting.js +19 -0
- package/features/editorGateway/graphql/inspectWebsiteBuilderPageRouting.js.map +1 -0
- package/features/editorGateway/graphql/listWebsiteBuilderPageWorkflowNames.d.ts +1 -0
- package/features/editorGateway/graphql/listWebsiteBuilderPageWorkflowNames.js +23 -0
- package/features/editorGateway/graphql/listWebsiteBuilderPageWorkflowNames.js.map +1 -0
- package/features/editorGateway/graphql/storeWebsiteBuilderPageWorkflow.d.ts +1 -0
- package/features/editorGateway/graphql/storeWebsiteBuilderPageWorkflow.js +19 -0
- package/features/editorGateway/graphql/storeWebsiteBuilderPageWorkflow.js.map +1 -0
- package/features/editorGateway/graphql/websiteBuilderPageFolderExists.d.ts +1 -0
- package/features/editorGateway/graphql/websiteBuilderPageFolderExists.js +16 -0
- package/features/editorGateway/graphql/websiteBuilderPageFolderExists.js.map +1 -0
- package/features/editorMounting/WbWorkflowEditorAppAdapter.d.ts +21 -0
- package/features/editorMounting/WbWorkflowEditorAppAdapter.js +45 -0
- package/features/editorMounting/WbWorkflowEditorAppAdapter.js.map +1 -0
- package/features/editorMounting/WbWorkflowEditorAppAdapter.test.d.ts +1 -0
- package/features/editorMounting/WbWorkflowEditorAppAdapter.test.js +115 -0
- package/features/editorMounting/WbWorkflowEditorAppAdapter.test.js.map +1 -0
- package/features/editorMounting/abstractions.d.ts +5 -0
- package/features/editorMounting/abstractions.js +5 -0
- package/features/editorMounting/abstractions.js.map +1 -0
- package/features/editorMounting/feature.d.ts +3 -0
- package/features/editorMounting/feature.js +19 -0
- package/features/editorMounting/feature.js.map +1 -0
- package/features/editorMounting/feature.test.d.ts +1 -0
- package/features/editorMounting/feature.test.js +93 -0
- package/features/editorMounting/feature.test.js.map +1 -0
- package/features/editorReview/WbPageContentReloader.d.ts +12 -0
- package/features/editorReview/WbPageContentReloader.js +40 -0
- package/features/editorReview/WbPageContentReloader.js.map +1 -0
- package/features/editorReview/WbPageContentReloader.test.d.ts +1 -0
- package/features/editorReview/WbPageContentReloader.test.js +222 -0
- package/features/editorReview/WbPageContentReloader.test.js.map +1 -0
- package/features/editorReview/WbPageReview.d.ts +8 -0
- package/features/editorReview/WbPageReview.js +14 -0
- package/features/editorReview/WbPageReview.js.map +1 -0
- package/features/editorReview/WbPageUnsavedChanges.d.ts +8 -0
- package/features/editorReview/WbPageUnsavedChanges.js +12 -0
- package/features/editorReview/WbPageUnsavedChanges.js.map +1 -0
- package/features/editorReview/WbPageUnsavedChanges.test.d.ts +1 -0
- package/features/editorReview/WbPageUnsavedChanges.test.js +33 -0
- package/features/editorReview/WbPageUnsavedChanges.test.js.map +1 -0
- package/features/editorReview/abstractions.d.ts +5 -0
- package/features/editorReview/abstractions.js +5 -0
- package/features/editorReview/abstractions.js.map +1 -0
- package/features/editorReview/feature.d.ts +3 -0
- package/features/editorReview/feature.js +17 -0
- package/features/editorReview/feature.js.map +1 -0
- package/features/gateway/WbReviewChangeMessageHandler.d.ts +8 -0
- package/features/gateway/WbReviewChangeMessageHandler.js +16 -0
- package/features/gateway/WbReviewChangeMessageHandler.js.map +1 -0
- package/features/gateway/WbReviewContentAdapter/WbReviewContentAdapter.d.ts +13 -0
- package/features/gateway/WbReviewContentAdapter/WbReviewContentAdapter.js +35 -0
- package/features/gateway/WbReviewContentAdapter/WbReviewContentAdapter.js.map +1 -0
- package/features/gateway/WbReviewContentAdapter/WbReviewContentAdapter.test.d.ts +1 -0
- package/features/gateway/WbReviewContentAdapter/WbReviewContentAdapter.test.js +47 -0
- package/features/gateway/WbReviewContentAdapter/WbReviewContentAdapter.test.js.map +1 -0
- package/features/gateway/WbReviewContentAdapter/abstractions.d.ts +5 -0
- package/features/gateway/WbReviewContentAdapter/abstractions.js +5 -0
- package/features/gateway/WbReviewContentAdapter/abstractions.js.map +1 -0
- package/features/gateway/WbReviewGateway/WbReviewGateway.d.ts +51 -0
- package/features/gateway/WbReviewGateway/WbReviewGateway.js +216 -0
- package/features/gateway/WbReviewGateway/WbReviewGateway.js.map +1 -0
- package/features/gateway/WbReviewGateway/WbReviewGateway.test.d.ts +1 -0
- package/features/gateway/WbReviewGateway/WbReviewGateway.test.js +647 -0
- package/features/gateway/WbReviewGateway/WbReviewGateway.test.js.map +1 -0
- package/features/gateway/WbReviewNotificationHandler.d.ts +8 -0
- package/features/gateway/WbReviewNotificationHandler.js +16 -0
- package/features/gateway/WbReviewNotificationHandler.js.map +1 -0
- package/features/gateway/WbReviewRowProvider/WbReviewRowProvider.d.ts +8 -0
- package/features/gateway/WbReviewRowProvider/WbReviewRowProvider.js +14 -0
- package/features/gateway/WbReviewRowProvider/WbReviewRowProvider.js.map +1 -0
- package/features/gateway/WbReviewRowProvider/abstractions.d.ts +5 -0
- package/features/gateway/WbReviewRowProvider/abstractions.js +5 -0
- package/features/gateway/WbReviewRowProvider/abstractions.js.map +1 -0
- package/features/gateway/assertWbPageNamespace.d.ts +1 -0
- package/features/gateway/assertWbPageNamespace.js +7 -0
- package/features/gateway/assertWbPageNamespace.js.map +1 -0
- package/features/gateway/contentReviewsBindings.test.d.ts +1 -0
- package/features/gateway/contentReviewsBindings.test.js +159 -0
- package/features/gateway/contentReviewsBindings.test.js.map +1 -0
- package/features/gateway/feature.d.ts +4 -0
- package/features/gateway/feature.js +27 -0
- package/features/gateway/feature.js.map +1 -0
- package/features/gateway/feature.test.d.ts +1 -0
- package/features/gateway/feature.test.js +85 -0
- package/features/gateway/feature.test.js.map +1 -0
- package/features/gateway/graphql/WbOperationResponse.d.ts +3 -0
- package/features/gateway/graphql/WbOperationResponse.js +0 -0
- package/features/gateway/graphql/approveWebsiteBuilderPageReviewStep.d.ts +1 -0
- package/features/gateway/graphql/approveWebsiteBuilderPageReviewStep.js +22 -0
- package/features/gateway/graphql/approveWebsiteBuilderPageReviewStep.js.map +1 -0
- package/features/gateway/graphql/cancelWebsiteBuilderPageReview.d.ts +1 -0
- package/features/gateway/graphql/cancelWebsiteBuilderPageReview.js +18 -0
- package/features/gateway/graphql/cancelWebsiteBuilderPageReview.js.map +1 -0
- package/features/gateway/graphql/cancelWebsiteBuilderPageReviewsForDelete.d.ts +1 -0
- package/features/gateway/graphql/cancelWebsiteBuilderPageReviewsForDelete.js +26 -0
- package/features/gateway/graphql/cancelWebsiteBuilderPageReviewsForDelete.js.map +1 -0
- package/features/gateway/graphql/getWebsiteBuilderPageReview.d.ts +1 -0
- package/features/gateway/graphql/getWebsiteBuilderPageReview.js +18 -0
- package/features/gateway/graphql/getWebsiteBuilderPageReview.js.map +1 -0
- package/features/gateway/graphql/getWebsiteBuilderPageReviewStepRun.d.ts +1 -0
- package/features/gateway/graphql/getWebsiteBuilderPageReviewStepRun.js +18 -0
- package/features/gateway/graphql/getWebsiteBuilderPageReviewStepRun.js.map +1 -0
- package/features/gateway/graphql/getWebsiteBuilderPageTargetReview.d.ts +1 -0
- package/features/gateway/graphql/getWebsiteBuilderPageTargetReview.js +18 -0
- package/features/gateway/graphql/getWebsiteBuilderPageTargetReview.js.map +1 -0
- package/features/gateway/graphql/listWebsiteBuilderPageReviewStepCandidates.d.ts +1 -0
- package/features/gateway/graphql/listWebsiteBuilderPageReviewStepCandidates.js +18 -0
- package/features/gateway/graphql/listWebsiteBuilderPageReviewStepCandidates.js.map +1 -0
- package/features/gateway/graphql/listWebsiteBuilderPageReviews.d.ts +1 -0
- package/features/gateway/graphql/listWebsiteBuilderPageReviews.js +34 -0
- package/features/gateway/graphql/listWebsiteBuilderPageReviews.js.map +1 -0
- package/features/gateway/graphql/listWebsiteBuilderPageStepCandidates.d.ts +1 -0
- package/features/gateway/graphql/listWebsiteBuilderPageStepCandidates.js +22 -0
- package/features/gateway/graphql/listWebsiteBuilderPageStepCandidates.js.map +1 -0
- package/features/gateway/graphql/listWebsiteBuilderPageWorkflows.d.ts +1 -0
- package/features/gateway/graphql/listWebsiteBuilderPageWorkflows.js +18 -0
- package/features/gateway/graphql/listWebsiteBuilderPageWorkflows.js.map +1 -0
- package/features/gateway/graphql/reassignWebsiteBuilderPageReviewStep.d.ts +1 -0
- package/features/gateway/graphql/reassignWebsiteBuilderPageReviewStep.js +22 -0
- package/features/gateway/graphql/reassignWebsiteBuilderPageReviewStep.js.map +1 -0
- package/features/gateway/graphql/rejectWebsiteBuilderPageReviewStep.d.ts +1 -0
- package/features/gateway/graphql/rejectWebsiteBuilderPageReviewStep.js +22 -0
- package/features/gateway/graphql/rejectWebsiteBuilderPageReviewStep.js.map +1 -0
- package/features/gateway/graphql/requestWebsiteBuilderPageReview.d.ts +1 -0
- package/features/gateway/graphql/requestWebsiteBuilderPageReview.js +26 -0
- package/features/gateway/graphql/requestWebsiteBuilderPageReview.js.map +1 -0
- package/features/gateway/graphql/restartWebsiteBuilderPageReviewStep.d.ts +1 -0
- package/features/gateway/graphql/restartWebsiteBuilderPageReviewStep.js +18 -0
- package/features/gateway/graphql/restartWebsiteBuilderPageReviewStep.js.map +1 -0
- package/features/gateway/graphql/startWebsiteBuilderPageReviewStep.d.ts +1 -0
- package/features/gateway/graphql/startWebsiteBuilderPageReviewStep.js +18 -0
- package/features/gateway/graphql/startWebsiteBuilderPageReviewStep.js.map +1 -0
- package/features/gateway/graphql/takeOverWebsiteBuilderPageReviewStep.d.ts +1 -0
- package/features/gateway/graphql/takeOverWebsiteBuilderPageReviewStep.js +26 -0
- package/features/gateway/graphql/takeOverWebsiteBuilderPageReviewStep.js.map +1 -0
- package/features/trash/BulkDeletePresenterReviewDecorator.d.ts +14 -0
- package/features/trash/BulkDeletePresenterReviewDecorator.js +27 -0
- package/features/trash/BulkDeletePresenterReviewDecorator.js.map +1 -0
- package/features/trash/BulkDeletePresenterReviewDecorator.test.d.ts +1 -0
- package/features/trash/BulkDeletePresenterReviewDecorator.test.js +234 -0
- package/features/trash/BulkDeletePresenterReviewDecorator.test.js.map +1 -0
- package/features/trash/DeletePageRevisionUseCaseReviewDecorator.d.ts +13 -0
- package/features/trash/DeletePageRevisionUseCaseReviewDecorator.js +23 -0
- package/features/trash/DeletePageRevisionUseCaseReviewDecorator.js.map +1 -0
- package/features/trash/DeletePageRevisionUseCaseReviewDecorator.test.d.ts +1 -0
- package/features/trash/DeletePageRevisionUseCaseReviewDecorator.test.js +114 -0
- package/features/trash/DeletePageRevisionUseCaseReviewDecorator.test.js.map +1 -0
- package/features/trash/DeletePageUseCaseReviewDecorator.d.ts +13 -0
- package/features/trash/DeletePageUseCaseReviewDecorator.js +23 -0
- package/features/trash/DeletePageUseCaseReviewDecorator.js.map +1 -0
- package/features/trash/DeletePageUseCaseReviewDecorator.test.d.ts +1 -0
- package/features/trash/DeletePageUseCaseReviewDecorator.test.js +134 -0
- package/features/trash/DeletePageUseCaseReviewDecorator.test.js.map +1 -0
- package/features/trash/feature.d.ts +1 -0
- package/features/trash/feature.js +15 -0
- package/features/trash/feature.js.map +1 -0
- package/features/trash/feature.test.d.ts +1 -0
- package/features/trash/feature.test.js +183 -0
- package/features/trash/feature.test.js.map +1 -0
- package/hooks/usePage.d.ts +5 -0
- package/hooks/usePage.js +15 -0
- package/hooks/usePage.js.map +1 -0
- package/hooks/usePage.test.d.ts +1 -0
- package/hooks/usePage.test.js +49 -0
- package/hooks/usePage.test.js.map +1 -0
- package/index.d.ts +2 -0
- package/index.js +40 -0
- package/index.js.map +1 -0
- package/index.mount.test.d.ts +1 -0
- package/index.mount.test.js +50 -0
- package/index.mount.test.js.map +1 -0
- package/index.test.d.ts +1 -0
- package/index.test.js +523 -0
- package/index.test.js.map +1 -0
- package/package.json +54 -0
- package/pageListChangeStatus.wiring.test.d.ts +1 -0
- package/pageListChangeStatus.wiring.test.js +175 -0
- package/pageListChangeStatus.wiring.test.js.map +1 -0
- package/pageListGlue.wiring.test.d.ts +1 -0
- package/pageListGlue.wiring.test.js +220 -0
- package/pageListGlue.wiring.test.js.map +1 -0
- package/presentation/page/PageGet/WbReviewGetPageFieldSelection.d.ts +8 -0
- package/presentation/page/PageGet/WbReviewGetPageFieldSelection.js +16 -0
- package/presentation/page/PageGet/WbReviewGetPageFieldSelection.js.map +1 -0
- package/presentation/page/PageGet/WbReviewGetPageFieldSelection.test.d.ts +1 -0
- package/presentation/page/PageGet/WbReviewGetPageFieldSelection.test.js +19 -0
- package/presentation/page/PageGet/WbReviewGetPageFieldSelection.test.js.map +1 -0
- package/presentation/page/PageGet/feature.d.ts +1 -0
- package/presentation/page/PageGet/feature.js +11 -0
- package/presentation/page/PageGet/feature.js.map +1 -0
- package/presentation/page/PageList/WbReviewListPagesFieldSelection.d.ts +8 -0
- package/presentation/page/PageList/WbReviewListPagesFieldSelection.js +16 -0
- package/presentation/page/PageList/WbReviewListPagesFieldSelection.js.map +1 -0
- package/presentation/page/PageList/WbReviewListPagesFieldSelection.test.d.ts +1 -0
- package/presentation/page/PageList/WbReviewListPagesFieldSelection.test.js +19 -0
- package/presentation/page/PageList/WbReviewListPagesFieldSelection.test.js.map +1 -0
- package/presentation/page/PageList/WbReviewTableRowMapperDecorator.d.ts +12 -0
- package/presentation/page/PageList/WbReviewTableRowMapperDecorator.js +24 -0
- package/presentation/page/PageList/WbReviewTableRowMapperDecorator.js.map +1 -0
- package/presentation/page/PageList/WbReviewTableRowMapperDecorator.test.d.ts +1 -0
- package/presentation/page/PageList/WbReviewTableRowMapperDecorator.test.js +70 -0
- package/presentation/page/PageList/WbReviewTableRowMapperDecorator.test.js.map +1 -0
- package/presentation/page/PageList/feature.d.ts +1 -0
- package/presentation/page/PageList/feature.js +13 -0
- package/presentation/page/PageList/feature.js.map +1 -0
- package/presentation/page/RevisionList/RevisionListPresenterDecorator.d.ts +15 -0
- package/presentation/page/RevisionList/RevisionListPresenterDecorator.js +36 -0
- package/presentation/page/RevisionList/RevisionListPresenterDecorator.js.map +1 -0
- package/presentation/page/RevisionList/RevisionListPresenterDecorator.test.d.ts +1 -0
- package/presentation/page/RevisionList/RevisionListPresenterDecorator.test.js +119 -0
- package/presentation/page/RevisionList/RevisionListPresenterDecorator.test.js.map +1 -0
- package/presentation/page/RevisionList/feature.d.ts +1 -0
- package/presentation/page/RevisionList/feature.js +11 -0
- package/presentation/page/RevisionList/feature.js.map +1 -0
- package/presentation/page/wbReviewPageSelection.d.ts +1 -0
- package/presentation/page/wbReviewPageSelection.js +9 -0
- package/presentation/page/wbReviewPageSelection.js.map +1 -0
- package/publishAutosave.wiring.test.d.ts +1 -0
- package/publishAutosave.wiring.test.js +162 -0
- package/publishAutosave.wiring.test.js.map +1 -0
- package/routes.d.ts +9 -0
- package/routes.js +19 -0
- package/routes.js.map +1 -0
- package/testing/WbEditorHarness.d.ts +11 -0
- package/testing/WbEditorHarness.js +22 -0
- package/testing/WbEditorHarness.js.map +1 -0
- package/testing/createFakeSession.d.ts +9 -0
- package/testing/createFakeSession.js +29 -0
- package/testing/createFakeSession.js.map +1 -0
- package/testing/createFakeVm.d.ts +3 -0
- package/testing/createFakeVm.js +51 -0
- package/testing/createFakeVm.js.map +1 -0
- package/testing/createFolder.d.ts +2 -0
- package/testing/createFolder.js +13 -0
- package/testing/createFolder.js.map +1 -0
- package/testing/createPageEditor.d.ts +4 -0
- package/testing/createPageEditor.js +26 -0
- package/testing/createPageEditor.js.map +1 -0
- package/testing/registerPageContent.d.ts +20 -0
- package/testing/registerPageContent.js +28 -0
- package/testing/registerPageContent.js.map +1 -0
- package/types.d.ts +9 -0
- package/types.js +0 -0
|
@@ -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 { WbWorkflowEditorMountingFeature } from "../features/editorMounting/feature.js";
|
|
6
|
+
import { Routes } from "../routes.js";
|
|
7
|
+
const WebsiteBuilderWorkflowsMenu = ()=>{
|
|
8
|
+
const { app } = useFeature(WbWorkflowEditorMountingFeature);
|
|
9
|
+
return /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(WorkflowEditorRoute, {
|
|
10
|
+
route: Routes.Pages.Workflows,
|
|
11
|
+
appBreadcrumbName: "wb",
|
|
12
|
+
appBreadcrumbLabel: "Website Builder",
|
|
13
|
+
breadcrumbName: "wb.workflows",
|
|
14
|
+
app: app
|
|
15
|
+
}), /*#__PURE__*/ react.createElement(WorkflowEditorMenu, {
|
|
16
|
+
name: "websiteBuilder.pages.workflows",
|
|
17
|
+
parent: "wb",
|
|
18
|
+
route: Routes.Pages.Workflows
|
|
19
|
+
}));
|
|
20
|
+
};
|
|
21
|
+
export { WebsiteBuilderWorkflowsMenu };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=WebsiteBuilderWorkflowsMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Routes/WebsiteBuilderWorkflowsMenu.js","sources":["../../src/Routes/WebsiteBuilderWorkflowsMenu.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 { WbWorkflowEditorMountingFeature } from \"~/features/editorMounting/feature.js\";\nimport { Routes } from \"~/routes.js\";\n\n/*\n * Mounts the shared workflow editor route and menu item with the Website Builder adapter. Without\n * the workflows `editor` permission the menu item renders nothing and the route shows the\n * no-access view (D162, R331).\n */\nexport const WebsiteBuilderWorkflowsMenu = () => {\n const { app } = useFeature(WbWorkflowEditorMountingFeature);\n\n return (\n <>\n <WorkflowEditorRoute\n route={Routes.Pages.Workflows}\n appBreadcrumbName=\"wb\"\n appBreadcrumbLabel=\"Website Builder\"\n breadcrumbName=\"wb.workflows\"\n app={app}\n />\n <WorkflowEditorMenu\n name=\"websiteBuilder.pages.workflows\"\n parent=\"wb\"\n route={Routes.Pages.Workflows}\n />\n </>\n );\n};\n"],"names":["WebsiteBuilderWorkflowsMenu","app","useFeature","WbWorkflowEditorMountingFeature","WorkflowEditorRoute","Routes","WorkflowEditorMenu"],"mappings":";;;;;;AAYO,MAAMA,8BAA8B;IACvC,MAAM,EAAEC,GAAG,EAAE,GAAGC,WAAWC;IAE3B,OAAO,WAAP,GACI,wDACI,oBAACC,qBAAmBA;QAChB,OAAOC,OAAO,KAAK,CAAC,SAAS;QAC7B,mBAAkB;QAClB,oBAAmB;QACnB,gBAAe;QACf,KAAKJ;sBAET,oBAACK,oBAAkBA;QACf,MAAK;QACL,QAAO;QACP,OAAOD,OAAO,KAAK,CAAC,SAAS;;AAI7C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
3
|
+
import { cleanup, render, screen } from "@testing-library/react";
|
|
4
|
+
import { Container } from "@webiny/di";
|
|
5
|
+
import { DiContainerProvider } from "@webiny/app";
|
|
6
|
+
import { Route } from "@webiny/app/features/router/Route.js";
|
|
7
|
+
import { RouterWithConfig, useRouterConfig } from "@webiny/app/config/RouterConfig.js";
|
|
8
|
+
import { AdminConfig } from "@webiny/app-admin";
|
|
9
|
+
import { AdminConfigPlugin, AdminWithConfig, useAdminConfig } from "@webiny/app-admin/config/AdminConfig.js";
|
|
10
|
+
import { CompositionProvider } from "@webiny/react-composition";
|
|
11
|
+
import { createFakeAppAdapter } from "@webiny/app-workflows/editor/testing/fakeEditorAppAdapter.js";
|
|
12
|
+
import { findElements } from "@webiny/app-workflows/editor/testing/findElements.js";
|
|
13
|
+
import { WorkflowEditorView } from "@webiny/app-workflows/editor/presentation/editor/components/WorkflowEditorView.js";
|
|
14
|
+
import { WbWorkflowEditorAppAdapter } from "../features/editorMounting/abstractions.js";
|
|
15
|
+
import { WebsiteBuilderWorkflowsMenu } from "./WebsiteBuilderWorkflowsMenu.js";
|
|
16
|
+
const permission = vi.hoisted(()=>({
|
|
17
|
+
editor: true
|
|
18
|
+
}));
|
|
19
|
+
vi.mock("@webiny/app-workflows/presentation/permissions/useWorkflowsPermission.js", ()=>({
|
|
20
|
+
useWorkflowsPermission: ()=>({
|
|
21
|
+
editor: permission.editor,
|
|
22
|
+
reassign: false
|
|
23
|
+
})
|
|
24
|
+
}));
|
|
25
|
+
vi.mock("@webiny/app-workflows/editor/presentation/editor/components/WorkflowEditorView.js", ()=>({
|
|
26
|
+
WorkflowEditorView: ()=>null
|
|
27
|
+
}));
|
|
28
|
+
vi.mock("@webiny/app-admin", async (importOriginal)=>{
|
|
29
|
+
const actual = await importOriginal();
|
|
30
|
+
return {
|
|
31
|
+
...actual,
|
|
32
|
+
useRouter: ()=>({
|
|
33
|
+
getLink: (route)=>route.path
|
|
34
|
+
})
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
const captured = {
|
|
38
|
+
routes: [],
|
|
39
|
+
menus: []
|
|
40
|
+
};
|
|
41
|
+
const Probe = ()=>{
|
|
42
|
+
const routerConfig = useRouterConfig();
|
|
43
|
+
const adminConfig = useAdminConfig();
|
|
44
|
+
captured.routes = routerConfig.routes.map((item)=>({
|
|
45
|
+
name: item.route.name,
|
|
46
|
+
element: item.element
|
|
47
|
+
}));
|
|
48
|
+
captured.menus = adminConfig.menus.map((menu)=>({
|
|
49
|
+
name: menu.name,
|
|
50
|
+
parent: menu.parent ?? null,
|
|
51
|
+
element: /*#__PURE__*/ react.isValidElement(menu.element) ? menu.element : void 0
|
|
52
|
+
}));
|
|
53
|
+
const routeNames = captured.routes.map((item)=>item.name);
|
|
54
|
+
const menuNames = captured.menus.map((item)=>`${item.name}:${item.parent ?? ""}`);
|
|
55
|
+
return /*#__PURE__*/ react.createElement("div", {
|
|
56
|
+
"data-testid": "probe",
|
|
57
|
+
"data-routes": routeNames.join(","),
|
|
58
|
+
"data-menus": menuNames.join(",")
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
const app = createFakeAppAdapter("wb");
|
|
62
|
+
const { Menu: Menu } = AdminConfig;
|
|
63
|
+
const sentinelRoute = new Route({
|
|
64
|
+
name: "Test/Sentinel",
|
|
65
|
+
path: "/test/sentinel"
|
|
66
|
+
});
|
|
67
|
+
const mount = async ()=>{
|
|
68
|
+
const container = new Container();
|
|
69
|
+
container.registerInstance(WbWorkflowEditorAppAdapter, app);
|
|
70
|
+
render(/*#__PURE__*/ react.createElement(DiContainerProvider, {
|
|
71
|
+
container: container
|
|
72
|
+
}, /*#__PURE__*/ react.createElement(CompositionProvider, null, /*#__PURE__*/ react.createElement(WebsiteBuilderWorkflowsMenu, null), /*#__PURE__*/ react.createElement(AdminConfig, null, /*#__PURE__*/ react.createElement(Menu, {
|
|
73
|
+
name: "test.sentinel",
|
|
74
|
+
element: /*#__PURE__*/ react.createElement("div", null)
|
|
75
|
+
}), /*#__PURE__*/ react.createElement(AdminConfig.Route, {
|
|
76
|
+
route: sentinelRoute,
|
|
77
|
+
element: /*#__PURE__*/ react.createElement("div", null)
|
|
78
|
+
})), /*#__PURE__*/ react.createElement(AdminWithConfig, null, AdminConfigPlugin, /*#__PURE__*/ react.createElement(RouterWithConfig, null, /*#__PURE__*/ react.createElement(Probe, null))))));
|
|
79
|
+
const probe = await screen.findByTestId("probe");
|
|
80
|
+
await vi.waitFor(()=>{
|
|
81
|
+
expect(probe.getAttribute("data-menus")).toContain("test.sentinel");
|
|
82
|
+
});
|
|
83
|
+
return captured;
|
|
84
|
+
};
|
|
85
|
+
describe("WebsiteBuilderWorkflowsMenu", ()=>{
|
|
86
|
+
beforeEach(()=>{
|
|
87
|
+
permission.editor = true;
|
|
88
|
+
captured.routes = [];
|
|
89
|
+
captured.menus = [];
|
|
90
|
+
});
|
|
91
|
+
afterEach(()=>{
|
|
92
|
+
cleanup();
|
|
93
|
+
});
|
|
94
|
+
it("registers the /website-builder/workflows route and the Website Builder menu item for an editor", async ()=>{
|
|
95
|
+
const result = await mount();
|
|
96
|
+
const routeNames = result.routes.map((item)=>item.name);
|
|
97
|
+
const menuNames = result.menus.map((item)=>`${item.name}:${item.parent ?? ""}`);
|
|
98
|
+
expect(routeNames).toContain("WebsiteBuilder/PageWorkflow");
|
|
99
|
+
expect(menuNames).toContain("websiteBuilder.pages.workflows:wb");
|
|
100
|
+
});
|
|
101
|
+
it("links the menu item to /website-builder/workflows", async ()=>{
|
|
102
|
+
const result = await mount();
|
|
103
|
+
const menu = result.menus.find((item)=>"websiteBuilder.pages.workflows" === item.name);
|
|
104
|
+
expect(menu?.element?.props.text).toBe("Workflows");
|
|
105
|
+
expect(menu?.element?.props.to).toBe("/website-builder/workflows");
|
|
106
|
+
});
|
|
107
|
+
it("gives the view the WB review use cases and the WB adapter, no editor use cases (R353)", async ()=>{
|
|
108
|
+
const result = await mount();
|
|
109
|
+
const route = result.routes.find((item)=>"WebsiteBuilder/PageWorkflow" === item.name);
|
|
110
|
+
if (!route) throw new Error("The editor route is not registered.");
|
|
111
|
+
const views = findElements(route.element, WorkflowEditorView);
|
|
112
|
+
expect(views).toHaveLength(1);
|
|
113
|
+
expect(views[0].props).not.toHaveProperty("useCases");
|
|
114
|
+
expect(Object.keys(views[0].props)).toEqual([
|
|
115
|
+
"app",
|
|
116
|
+
"breadcrumbName"
|
|
117
|
+
]);
|
|
118
|
+
expect(views[0].props.app).toBe(app);
|
|
119
|
+
});
|
|
120
|
+
it("names the breadcrumbs Website Builder and Workflows", async ()=>{
|
|
121
|
+
const result = await mount();
|
|
122
|
+
const route = result.routes.find((item)=>"WebsiteBuilder/PageWorkflow" === item.name);
|
|
123
|
+
if (!route) throw new Error("The editor route is not registered.");
|
|
124
|
+
const breadcrumbs = findElements(route.element, AdminConfig.Breadcrumb);
|
|
125
|
+
const texts = breadcrumbs.map((item)=>`${item.props.name}:${item.props.label}`);
|
|
126
|
+
expect(texts).toEqual([
|
|
127
|
+
"wb:Website Builder",
|
|
128
|
+
"wb.workflows:Workflows"
|
|
129
|
+
]);
|
|
130
|
+
});
|
|
131
|
+
it("registers the route but not the menu item without the editor permission", async ()=>{
|
|
132
|
+
permission.editor = false;
|
|
133
|
+
const result = await mount();
|
|
134
|
+
const routeNames = result.routes.map((item)=>item.name);
|
|
135
|
+
const menuNames = result.menus.map((item)=>item.name);
|
|
136
|
+
expect(routeNames).toContain("WebsiteBuilder/PageWorkflow");
|
|
137
|
+
expect(menuNames).not.toContain("websiteBuilder.pages.workflows");
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
//# sourceMappingURL=WebsiteBuilderWorkflowsMenu.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Routes/WebsiteBuilderWorkflowsMenu.test.js","sources":["../../src/Routes/WebsiteBuilderWorkflowsMenu.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { afterEach } from \"vitest\";\nimport { beforeEach } 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 { Container } from \"@webiny/di\";\nimport { DiContainerProvider } from \"@webiny/app\";\nimport { Route } from \"@webiny/app/features/router/Route.js\";\nimport { RouterWithConfig } from \"@webiny/app/config/RouterConfig.js\";\nimport { useRouterConfig } from \"@webiny/app/config/RouterConfig.js\";\nimport { AdminConfig } from \"@webiny/app-admin\";\nimport { AdminConfigPlugin } from \"@webiny/app-admin/config/AdminConfig.js\";\nimport { AdminWithConfig } from \"@webiny/app-admin/config/AdminConfig.js\";\nimport { useAdminConfig } from \"@webiny/app-admin/config/AdminConfig.js\";\nimport { CompositionProvider } from \"@webiny/react-composition\";\nimport { createFakeAppAdapter } from \"@webiny/app-workflows/editor/testing/fakeEditorAppAdapter.js\";\nimport { findElements } from \"@webiny/app-workflows/editor/testing/findElements.js\";\nimport { WorkflowEditorView } from \"@webiny/app-workflows/editor/presentation/editor/components/WorkflowEditorView.js\";\nimport { WbWorkflowEditorAppAdapter } from \"~/features/editorMounting/abstractions.js\";\nimport { WebsiteBuilderWorkflowsMenu } from \"./WebsiteBuilderWorkflowsMenu.js\";\n\ninterface RouteStub {\n path: string;\n}\n\nconst permission = vi.hoisted(() => {\n return { editor: true };\n});\n\nvi.mock(\"@webiny/app-workflows/presentation/permissions/useWorkflowsPermission.js\", () => {\n return {\n useWorkflowsPermission: () => {\n return { editor: permission.editor, reassign: false };\n }\n };\n});\n\nvi.mock(\"@webiny/app-workflows/editor/presentation/editor/components/WorkflowEditorView.js\", () => {\n return { WorkflowEditorView: () => null };\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 { getLink: (route: RouteStub) => route.path };\n }\n };\n});\n\ninterface CapturedRoute {\n name: string;\n element: React.ReactElement;\n}\n\ninterface CapturedMenu {\n name: string;\n parent: string | null;\n element: React.ReactElement<Record<string, unknown>> | undefined;\n}\n\ninterface Captured {\n routes: CapturedRoute[];\n menus: CapturedMenu[];\n}\n\nconst captured: Captured = { routes: [], menus: [] };\n\nconst Probe = () => {\n const routerConfig = useRouterConfig();\n const adminConfig = useAdminConfig();\n captured.routes = routerConfig.routes.map(item => {\n return { name: item.route.name, element: item.element };\n });\n captured.menus = adminConfig.menus.map(menu => {\n return {\n name: menu.name,\n parent: menu.parent ?? null,\n // A guard, not a cast: only an element whose props can be read is kept.\n element: React.isValidElement<Record<string, unknown>>(menu.element)\n ? menu.element\n : undefined\n };\n });\n const routeNames = captured.routes.map(item => item.name);\n const menuNames = captured.menus.map(item => `${item.name}:${item.parent ?? \"\"}`);\n\n return (\n <div\n data-testid=\"probe\"\n data-routes={routeNames.join(\",\")}\n data-menus={menuNames.join(\",\")}\n />\n );\n};\n\nconst app = createFakeAppAdapter(\"wb\");\n\nconst { Menu } = AdminConfig;\n\n// The router renders nothing without a route, so a sentinel keeps the probe mounted.\nconst sentinelRoute = new Route({ name: \"Test/Sentinel\", path: \"/test/sentinel\" });\n\n// The real mounting feature resolves the two tokens, which the test registers as instances.\nconst mount = async (): Promise<Captured> => {\n const container = new Container();\n container.registerInstance(WbWorkflowEditorAppAdapter, app);\n\n render(\n <DiContainerProvider container={container}>\n <CompositionProvider>\n <WebsiteBuilderWorkflowsMenu />\n <AdminConfig>\n <Menu name=\"test.sentinel\" element={<div />} />\n <AdminConfig.Route route={sentinelRoute} element={<div />} />\n </AdminConfig>\n <AdminWithConfig>\n {AdminConfigPlugin}\n <RouterWithConfig>\n <Probe />\n </RouterWithConfig>\n </AdminWithConfig>\n </CompositionProvider>\n </DiContainerProvider>\n );\n\n const probe = await screen.findByTestId(\"probe\");\n // The sentinel menu proves the configs flushed, so a missing editor route or menu is real.\n await vi.waitFor(() => {\n expect(probe.getAttribute(\"data-menus\")).toContain(\"test.sentinel\");\n });\n\n return captured;\n};\n\ndescribe(\"WebsiteBuilderWorkflowsMenu\", () => {\n beforeEach(() => {\n permission.editor = true;\n captured.routes = [];\n captured.menus = [];\n });\n\n afterEach(() => {\n cleanup();\n });\n\n it(\"registers the /website-builder/workflows route and the Website Builder menu item for an editor\", async () => {\n const result = await mount();\n const routeNames = result.routes.map(item => item.name);\n const menuNames = result.menus.map(item => `${item.name}:${item.parent ?? \"\"}`);\n\n expect(routeNames).toContain(\"WebsiteBuilder/PageWorkflow\");\n expect(menuNames).toContain(\"websiteBuilder.pages.workflows:wb\");\n });\n\n it(\"links the menu item to /website-builder/workflows\", async () => {\n const result = await mount();\n\n const menu = result.menus.find(item => item.name === \"websiteBuilder.pages.workflows\");\n\n expect(menu?.element?.props.text).toBe(\"Workflows\");\n expect(menu?.element?.props.to).toBe(\"/website-builder/workflows\");\n });\n\n it(\"gives the view the WB review use cases and the WB adapter, no editor use cases (R353)\", async () => {\n const result = await mount();\n const route = result.routes.find(item => item.name === \"WebsiteBuilder/PageWorkflow\");\n if (!route) {\n throw new Error(\"The editor route is not registered.\");\n }\n\n const views = findElements(route.element, WorkflowEditorView);\n\n expect(views).toHaveLength(1);\n expect(views[0].props).not.toHaveProperty(\"useCases\");\n expect(Object.keys(views[0].props)).toEqual([\"app\", \"breadcrumbName\"]);\n expect(views[0].props.app).toBe(app);\n });\n\n it(\"names the breadcrumbs Website Builder and Workflows\", async () => {\n const result = await mount();\n const route = result.routes.find(item => item.name === \"WebsiteBuilder/PageWorkflow\");\n if (!route) {\n throw new Error(\"The editor route is not registered.\");\n }\n\n const breadcrumbs = findElements(route.element, AdminConfig.Breadcrumb);\n const texts = breadcrumbs.map(item => `${item.props.name}:${item.props.label}`);\n\n expect(texts).toEqual([\"wb:Website Builder\", \"wb.workflows:Workflows\"]);\n });\n\n it(\"registers the route but not the menu item without the editor permission\", async () => {\n permission.editor = false;\n\n const result = await mount();\n const routeNames = result.routes.map(item => item.name);\n const menuNames = result.menus.map(item => item.name);\n\n expect(routeNames).toContain(\"WebsiteBuilder/PageWorkflow\");\n expect(menuNames).not.toContain(\"websiteBuilder.pages.workflows\");\n });\n});\n"],"names":["permission","vi","importOriginal","actual","route","captured","Probe","routerConfig","useRouterConfig","adminConfig","useAdminConfig","item","menu","React","undefined","routeNames","menuNames","app","createFakeAppAdapter","Menu","AdminConfig","sentinelRoute","Route","mount","container","Container","WbWorkflowEditorAppAdapter","render","DiContainerProvider","CompositionProvider","WebsiteBuilderWorkflowsMenu","AdminWithConfig","AdminConfigPlugin","RouterWithConfig","probe","screen","expect","describe","beforeEach","afterEach","cleanup","it","result","Error","views","findElements","WorkflowEditorView","Object","breadcrumbs","texts"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { WebsiteBuilderWorkflowsMenu } from "./WebsiteBuilderWorkflowsMenu.js";
|
package/Routes/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { WebsiteBuilderWorkflowsMenu } from "./WebsiteBuilderWorkflowsMenu.js";
|
package/constants.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const WB_PAGE_APP = "wb.page";
|
package/constants.js
ADDED
package/constants.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../src/constants.ts"],"sourcesContent":["export const WB_PAGE_APP = \"wb.page\";\n"],"names":["WB_PAGE_APP"],"mappings":"AAAO,MAAMA,cAAc"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,128 @@
|
|
|
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 { Container } from "@webiny/di";
|
|
5
|
+
import { MainGraphQLClient } from "@webiny/app/features/mainGraphQLClient/abstractions.js";
|
|
6
|
+
import { PageEditorConfig } from "@webiny/app-website-builder/presentation/pages/PageEditor/PageEditorConfig.js";
|
|
7
|
+
import { TargetReviewPresenter } from "@webiny/app-workflows/review/presentation/targetReview/abstractions.js";
|
|
8
|
+
import { CmsEntryReview } from "@webiny/app-headless-cms-workflows/features/editorReview/abstractions.js";
|
|
9
|
+
import { CmsEntryReviewFeature } from "@webiny/app-headless-cms-workflows/features/editorReview/feature.js";
|
|
10
|
+
import { CmsReviewFeature } from "@webiny/app-headless-cms-workflows/features/gateway/feature.js";
|
|
11
|
+
import { WbPageReview } from "./features/editorReview/abstractions.js";
|
|
12
|
+
import { WbEditorHarness } from "./testing/WbEditorHarness.js";
|
|
13
|
+
import { createFakeSession } from "./testing/createFakeSession.js";
|
|
14
|
+
import { createPageEditor } from "./testing/createPageEditor.js";
|
|
15
|
+
import { registerPageContent } from "./testing/registerPageContent.js";
|
|
16
|
+
import { WebsiteBuilderWorkflows } from "./index.js";
|
|
17
|
+
const flags = vi.hoisted(()=>({
|
|
18
|
+
enabled: true
|
|
19
|
+
}));
|
|
20
|
+
vi.mock("@webiny/icons/info.svg", ()=>({
|
|
21
|
+
ReactComponent: ()=>null
|
|
22
|
+
}));
|
|
23
|
+
vi.mock("@webiny/app-admin", async (importOriginal)=>{
|
|
24
|
+
const actual = await importOriginal();
|
|
25
|
+
return {
|
|
26
|
+
...actual,
|
|
27
|
+
useFeatureFlags: ()=>({
|
|
28
|
+
isEnabled: ()=>flags.enabled
|
|
29
|
+
})
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
vi.mock("~/Routes/index.js", ()=>({
|
|
33
|
+
WebsiteBuilderWorkflowsMenu: ()=>null
|
|
34
|
+
}));
|
|
35
|
+
vi.mock("~/Components/PagesList/index.js", ()=>({
|
|
36
|
+
PagesList: ()=>null
|
|
37
|
+
}));
|
|
38
|
+
vi.mock("~/Components/ContentReviews/WbContentReviews.js", ()=>({
|
|
39
|
+
WbContentReviews: ()=>null
|
|
40
|
+
}));
|
|
41
|
+
vi.mock("@webiny/app-website-builder/BaseEditor/config/Layout.js", async ()=>{
|
|
42
|
+
const React = await import("react");
|
|
43
|
+
const { makeDecoratable } = await import("@webiny/react-composition");
|
|
44
|
+
const Layout = makeDecoratable("EditorLayout", ()=>React.createElement("div", {
|
|
45
|
+
"data-testid": "base-layout"
|
|
46
|
+
}));
|
|
47
|
+
return {
|
|
48
|
+
Layout
|
|
49
|
+
};
|
|
50
|
+
});
|
|
51
|
+
vi.mock("@webiny/app-website-builder/BaseEditor/config/TopBar/Layout.js", async ()=>{
|
|
52
|
+
const React = await import("react");
|
|
53
|
+
const { makeDecoratable } = await import("@webiny/react-composition");
|
|
54
|
+
const Layout = makeDecoratable("TopBarLayout", ()=>React.createElement("div", {
|
|
55
|
+
"data-testid": "base-top-bar"
|
|
56
|
+
}));
|
|
57
|
+
return {
|
|
58
|
+
Layout,
|
|
59
|
+
TopBarOptionsMenu: ()=>null
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
vi.mock("@webiny/app-workflows/review/editor/components/EditorReviewBar.js", async ()=>{
|
|
63
|
+
const React = await import("react");
|
|
64
|
+
const EditorReviewBar = ()=>React.createElement("div", {
|
|
65
|
+
"data-testid": "review-bar"
|
|
66
|
+
});
|
|
67
|
+
return {
|
|
68
|
+
EditorReviewBar
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
const { Ui: Ui } = PageEditorConfig;
|
|
72
|
+
const mountRoot = (enabled)=>{
|
|
73
|
+
flags.enabled = enabled;
|
|
74
|
+
const handle = createFakeSession("inProgress");
|
|
75
|
+
const container = new Container();
|
|
76
|
+
container.registerInstance(TargetReviewPresenter, handle.presenter);
|
|
77
|
+
container.registerInstance(MainGraphQLClient, {
|
|
78
|
+
execute: vi.fn()
|
|
79
|
+
});
|
|
80
|
+
registerPageContent(container);
|
|
81
|
+
const editor = createPageEditor("draft");
|
|
82
|
+
render(/*#__PURE__*/ react.createElement(WbEditorHarness, {
|
|
83
|
+
container: container,
|
|
84
|
+
editor: editor
|
|
85
|
+
}, /*#__PURE__*/ react.createElement(WebsiteBuilderWorkflows, null), /*#__PURE__*/ react.createElement(Ui.Layout, null), /*#__PURE__*/ react.createElement(Ui.TopBar.Layout, null)));
|
|
86
|
+
return {
|
|
87
|
+
...handle,
|
|
88
|
+
container,
|
|
89
|
+
editor
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
describe("Website Builder editor glue from the composition root", ()=>{
|
|
93
|
+
afterEach(()=>{
|
|
94
|
+
cleanup();
|
|
95
|
+
});
|
|
96
|
+
it("flag on: the session is registered over the shared presenter, without use cases (R352)", ()=>{
|
|
97
|
+
const { container, presenter } = mountRoot(true);
|
|
98
|
+
const session = container.resolve(WbPageReview);
|
|
99
|
+
expect(session.presenter).toBe(presenter);
|
|
100
|
+
expect(session).not.toHaveProperty("useCases");
|
|
101
|
+
});
|
|
102
|
+
it("flag on: this app's session and the CMS editor session coexist in one container (R237)", ()=>{
|
|
103
|
+
const { container, presenter } = mountRoot(true);
|
|
104
|
+
CmsReviewFeature.register(container);
|
|
105
|
+
CmsEntryReviewFeature.register(container);
|
|
106
|
+
const wbSession = container.resolve(WbPageReview);
|
|
107
|
+
const cmsSession = container.resolve(CmsEntryReview);
|
|
108
|
+
expect(cmsSession).not.toBe(wbSession);
|
|
109
|
+
expect(wbSession.presenter).toBe(presenter);
|
|
110
|
+
expect(cmsSession.presenter).toBe(presenter);
|
|
111
|
+
expect(wbSession.constructor).not.toBe(cmsSession.constructor);
|
|
112
|
+
});
|
|
113
|
+
it("flag on: the bar is mounted under the top bar and the canvas follows the review", ()=>{
|
|
114
|
+
const { presenter, editor } = mountRoot(true);
|
|
115
|
+
expect(screen.getAllByTestId("review-bar")).toHaveLength(1);
|
|
116
|
+
expect(presenter.init).toHaveBeenCalledTimes(1);
|
|
117
|
+
expect(editor.getEditorState().read().isReadOnly).toBe(true);
|
|
118
|
+
});
|
|
119
|
+
it("flag off: nothing is registered or mounted", ()=>{
|
|
120
|
+
const { container, presenter, editor } = mountRoot(false);
|
|
121
|
+
expect(()=>container.resolve(WbPageReview)).toThrow();
|
|
122
|
+
expect(screen.queryByTestId("review-bar")).toBeNull();
|
|
123
|
+
expect(presenter.init).not.toHaveBeenCalled();
|
|
124
|
+
expect(editor.getEditorState().read().isReadOnly).toBe(false);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
//# sourceMappingURL=editorGlue.wiring.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editorGlue.wiring.test.js","sources":["../src/editorGlue.wiring.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 { Container } from \"@webiny/di\";\nimport { MainGraphQLClient } from \"@webiny/app/features/mainGraphQLClient/abstractions.js\";\nimport { PageEditorConfig } from \"@webiny/app-website-builder/presentation/pages/PageEditor/PageEditorConfig.js\";\nimport { TargetReviewPresenter } from \"@webiny/app-workflows/review/presentation/targetReview/abstractions.js\";\nimport { CmsEntryReview } from \"@webiny/app-headless-cms-workflows/features/editorReview/abstractions.js\";\nimport { CmsEntryReviewFeature } from \"@webiny/app-headless-cms-workflows/features/editorReview/feature.js\";\nimport { CmsReviewFeature } from \"@webiny/app-headless-cms-workflows/features/gateway/feature.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 { registerPageContent } from \"~/testing/registerPageContent.js\";\nimport { WebsiteBuilderWorkflows } from \"~/index.js\";\n\nconst flags = vi.hoisted(() => {\n return { enabled: true };\n});\n\nvi.mock(\"@webiny/icons/info.svg\", () => {\n return { ReactComponent: () => null };\n});\n\nvi.mock(\"@webiny/app-admin\", async importOriginal => {\n const actual = await importOriginal<typeof import(\"@webiny/app-admin\")>();\n return { ...actual, useFeatureFlags: () => ({ isEnabled: () => flags.enabled }) };\n});\n\nvi.mock(\"~/Routes/index.js\", () => {\n return { WebsiteBuilderWorkflowsMenu: () => null };\n});\n\nvi.mock(\"~/Components/PagesList/index.js\", () => {\n return { PagesList: () => null };\n});\n\nvi.mock(\"~/Components/ContentReviews/WbContentReviews.js\", () => {\n return { WbContentReviews: () => null };\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\nvi.mock(\"@webiny/app-website-builder/BaseEditor/config/TopBar/Layout.js\", async () => {\n const React = await import(\"react\");\n const { makeDecoratable } = await import(\"@webiny/react-composition\");\n const Layout = makeDecoratable(\"TopBarLayout\", () => {\n return React.createElement(\"div\", { \"data-testid\": \"base-top-bar\" });\n });\n return { Layout, TopBarOptionsMenu: () => null };\n});\n\nvi.mock(\"@webiny/app-workflows/review/editor/components/EditorReviewBar.js\", async () => {\n const React = await import(\"react\");\n const EditorReviewBar = () => {\n return React.createElement(\"div\", { \"data-testid\": \"review-bar\" });\n };\n return { EditorReviewBar };\n});\n\nconst { Ui } = PageEditorConfig;\n\nconst mountRoot = (enabled: boolean) => {\n flags.enabled = enabled;\n const handle = createFakeSession(\"inProgress\");\n const container = new Container();\n container.registerInstance(TargetReviewPresenter, handle.presenter);\n container.registerInstance(MainGraphQLClient, { execute: vi.fn() });\n registerPageContent(container);\n const editor = createPageEditor(\"draft\");\n\n render(\n <WbEditorHarness container={container} editor={editor}>\n <WebsiteBuilderWorkflows />\n <Ui.Layout />\n <Ui.TopBar.Layout />\n </WbEditorHarness>\n );\n\n return { ...handle, container, editor };\n};\n\ndescribe(\"Website Builder editor glue from the composition root\", () => {\n afterEach(() => {\n cleanup();\n });\n\n it(\"flag on: the session is registered over the shared presenter, without use cases (R352)\", () => {\n const { container, presenter } = mountRoot(true);\n\n const session = container.resolve(WbPageReview);\n expect(session.presenter).toBe(presenter);\n expect(session).not.toHaveProperty(\"useCases\");\n });\n\n it(\"flag on: this app's session and the CMS editor session coexist in one container (R237)\", () => {\n const { container, presenter } = mountRoot(true);\n CmsReviewFeature.register(container);\n CmsEntryReviewFeature.register(container);\n\n const wbSession = container.resolve(WbPageReview);\n const cmsSession = container.resolve(CmsEntryReview);\n\n expect(cmsSession).not.toBe(wbSession);\n expect(wbSession.presenter).toBe(presenter);\n expect(cmsSession.presenter).toBe(presenter);\n expect(wbSession.constructor).not.toBe(cmsSession.constructor);\n });\n\n it(\"flag on: the bar is mounted under the top bar and the canvas follows the review\", () => {\n const { presenter, editor } = mountRoot(true);\n\n expect(screen.getAllByTestId(\"review-bar\")).toHaveLength(1);\n expect(presenter.init).toHaveBeenCalledTimes(1);\n expect(editor.getEditorState().read().isReadOnly).toBe(true);\n });\n\n it(\"flag off: nothing is registered or mounted\", () => {\n const { container, presenter, editor } = mountRoot(false);\n\n expect(() => container.resolve(WbPageReview)).toThrow();\n expect(screen.queryByTestId(\"review-bar\")).toBeNull();\n expect(presenter.init).not.toHaveBeenCalled();\n expect(editor.getEditorState().read().isReadOnly).toBe(false);\n });\n});\n"],"names":["flags","vi","importOriginal","actual","React","makeDecoratable","Layout","EditorReviewBar","Ui","PageEditorConfig","mountRoot","enabled","handle","createFakeSession","container","Container","TargetReviewPresenter","MainGraphQLClient","registerPageContent","editor","createPageEditor","render","WbEditorHarness","WebsiteBuilderWorkflows","describe","afterEach","cleanup","it","presenter","session","WbPageReview","expect","CmsReviewFeature","CmsEntryReviewFeature","wbSession","cmsSession","CmsEntryReview","screen"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ReviewCacheSyncHandler } from "@webiny/app-workflows/review/cache/ReviewCacheSyncHandler.js";
|
|
2
|
+
import { ReviewChangedHandler } from "@webiny/app-workflows/review/events/ReviewChangedHandler.js";
|
|
3
|
+
declare class WbReviewCacheSyncHandlerImpl extends ReviewCacheSyncHandler implements ReviewChangedHandler.Interface {
|
|
4
|
+
}
|
|
5
|
+
export declare const WbReviewCacheSyncHandler: typeof WbReviewCacheSyncHandlerImpl & {
|
|
6
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/app/features/eventPublisher/abstractions.js").IEventHandler<import("@webiny/app-workflows/review/events/ReviewChangedEvent.js").ReviewChangedEvent>>;
|
|
7
|
+
};
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ReviewCacheSyncHandler } from "@webiny/app-workflows/review/cache/ReviewCacheSyncHandler.js";
|
|
2
|
+
import { ReviewChangedHandler } from "@webiny/app-workflows/review/events/ReviewChangedHandler.js";
|
|
3
|
+
import { WbReviewPageCacheWriter } from "./abstractions.js";
|
|
4
|
+
class WbReviewCacheSyncHandlerImpl extends ReviewCacheSyncHandler {
|
|
5
|
+
}
|
|
6
|
+
const WbReviewCacheSyncHandler = ReviewChangedHandler.createImplementation({
|
|
7
|
+
implementation: WbReviewCacheSyncHandlerImpl,
|
|
8
|
+
dependencies: [
|
|
9
|
+
WbReviewPageCacheWriter
|
|
10
|
+
]
|
|
11
|
+
});
|
|
12
|
+
export { WbReviewCacheSyncHandler };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=WbReviewCacheSyncHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/cache/WbReviewCacheSyncHandler.js","sources":["../../../src/features/cache/WbReviewCacheSyncHandler.ts"],"sourcesContent":["import { ReviewCacheSyncHandler } from \"@webiny/app-workflows/review/cache/ReviewCacheSyncHandler.js\";\nimport { ReviewChangedHandler } from \"@webiny/app-workflows/review/events/ReviewChangedHandler.js\";\nimport { WbReviewPageCacheWriter } from \"./abstractions.js\";\n\n/*\n * The shared handler is never registered itself: `createImplementation` stores the abstraction and\n * dependencies on the class, so each app subclasses it once (R237).\n */\nclass WbReviewCacheSyncHandlerImpl\n extends ReviewCacheSyncHandler\n implements ReviewChangedHandler.Interface {}\n\nexport const WbReviewCacheSyncHandler = ReviewChangedHandler.createImplementation({\n implementation: WbReviewCacheSyncHandlerImpl,\n dependencies: [WbReviewPageCacheWriter]\n});\n"],"names":["WbReviewCacheSyncHandlerImpl","ReviewCacheSyncHandler","WbReviewCacheSyncHandler","ReviewChangedHandler","WbReviewPageCacheWriter"],"mappings":";;;AAQA,MAAMA,qCACMC;AACmC;AAExC,MAAMC,2BAA2BC,qBAAqB,oBAAoB,CAAC;IAC9E,gBAAgBH;IAChB,cAAc;QAACI;KAAwB;AAC3C"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ReviewCacheRef } from "@webiny/app-workflows/review/cache/IReviewCacheWriter.js";
|
|
2
|
+
import type { SystemWorkflowValue } from "@webiny/app-workflows/review/domain/types.js";
|
|
3
|
+
import { FullPageCache } from "@webiny/app-website-builder/features/pages/shared/abstractions.js";
|
|
4
|
+
import { PageListCache } from "@webiny/app-website-builder/features/pages/shared/abstractions.js";
|
|
5
|
+
import "~/types.js";
|
|
6
|
+
import { WbReviewPageCacheWriter as Abstraction } from "./abstractions.js";
|
|
7
|
+
declare class WbReviewPageCacheWriterImpl implements Abstraction.Interface {
|
|
8
|
+
private pageListCache;
|
|
9
|
+
private fullPageCache;
|
|
10
|
+
constructor(pageListCache: PageListCache.Interface, fullPageCache: FullPageCache.Interface);
|
|
11
|
+
canHandle(namespace: string): boolean;
|
|
12
|
+
write(ref: ReviewCacheRef, workflow: SystemWorkflowValue | null): void;
|
|
13
|
+
}
|
|
14
|
+
export declare const WbReviewPageCacheWriter: typeof WbReviewPageCacheWriterImpl & {
|
|
15
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/app-workflows/review/cache/IReviewCacheWriter.js").IReviewCacheWriter>;
|
|
16
|
+
};
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Page } from "@webiny/app-website-builder/domain/Page/index.js";
|
|
2
|
+
import { FullPageCache, PageListCache } from "@webiny/app-website-builder/features/pages/shared/abstractions.js";
|
|
3
|
+
import { WB_PAGE_APP } from "../../constants.js";
|
|
4
|
+
import "../../types.js";
|
|
5
|
+
import { WbReviewPageCacheWriter } from "./abstractions.js";
|
|
6
|
+
class WbReviewPageCacheWriterImpl {
|
|
7
|
+
constructor(pageListCache, fullPageCache){
|
|
8
|
+
this.pageListCache = pageListCache;
|
|
9
|
+
this.fullPageCache = fullPageCache;
|
|
10
|
+
}
|
|
11
|
+
canHandle(namespace) {
|
|
12
|
+
return namespace === WB_PAGE_APP;
|
|
13
|
+
}
|
|
14
|
+
write(ref, workflow) {
|
|
15
|
+
const updatePage = (page)=>{
|
|
16
|
+
if (page.id !== ref.targetRevisionId) return page;
|
|
17
|
+
const system = {
|
|
18
|
+
...page.system,
|
|
19
|
+
workflow
|
|
20
|
+
};
|
|
21
|
+
return Page.create({
|
|
22
|
+
...page,
|
|
23
|
+
system
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
this.pageListCache.updateItems(updatePage);
|
|
27
|
+
this.fullPageCache.updateItems(updatePage);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const WbReviewPageCacheWriter_WbReviewPageCacheWriter = WbReviewPageCacheWriter.createImplementation({
|
|
31
|
+
implementation: WbReviewPageCacheWriterImpl,
|
|
32
|
+
dependencies: [
|
|
33
|
+
PageListCache,
|
|
34
|
+
FullPageCache
|
|
35
|
+
]
|
|
36
|
+
});
|
|
37
|
+
export { WbReviewPageCacheWriter_WbReviewPageCacheWriter as WbReviewPageCacheWriter };
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=WbReviewPageCacheWriter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/cache/WbReviewPageCacheWriter.js","sources":["../../../src/features/cache/WbReviewPageCacheWriter.ts"],"sourcesContent":["import type { ReviewCacheRef } from \"@webiny/app-workflows/review/cache/IReviewCacheWriter.js\";\nimport type { SystemWorkflowValue } from \"@webiny/app-workflows/review/domain/types.js\";\nimport { Page } from \"@webiny/app-website-builder/domain/Page/index.js\";\nimport { FullPageCache } from \"@webiny/app-website-builder/features/pages/shared/abstractions.js\";\nimport { PageListCache } from \"@webiny/app-website-builder/features/pages/shared/abstractions.js\";\nimport type { WbPageSystem } from \"@webiny/app-website-builder/types.js\";\nimport { WB_PAGE_APP } from \"~/constants.js\";\nimport \"~/types.js\";\nimport { WbReviewPageCacheWriter as Abstraction } from \"./abstractions.js\";\n\nclass WbReviewPageCacheWriterImpl implements Abstraction.Interface {\n constructor(\n private pageListCache: PageListCache.Interface,\n private fullPageCache: FullPageCache.Interface\n ) {}\n\n canHandle(namespace: string): boolean {\n return namespace === WB_PAGE_APP;\n }\n\n write(ref: ReviewCacheRef, workflow: SystemWorkflowValue | null): void {\n /*\n * Only the revision the review belongs to is updated: a review of an older revision must\n * not mark the latest revision held by the list cache.\n */\n const updatePage = (page: Page): Page => {\n if (page.id !== ref.targetRevisionId) {\n return page;\n }\n\n const system: WbPageSystem = { ...page.system, workflow };\n return Page.create({ ...page, system });\n };\n\n this.pageListCache.updateItems(updatePage);\n this.fullPageCache.updateItems(updatePage);\n }\n}\n\nexport const WbReviewPageCacheWriter = Abstraction.createImplementation({\n implementation: WbReviewPageCacheWriterImpl,\n dependencies: [PageListCache, FullPageCache]\n});\n"],"names":["WbReviewPageCacheWriterImpl","pageListCache","fullPageCache","namespace","WB_PAGE_APP","ref","workflow","updatePage","page","system","Page","WbReviewPageCacheWriter","Abstraction","PageListCache","FullPageCache"],"mappings":";;;;;AAUA,MAAMA;IACF,YACYC,aAAsC,EACtCC,aAAsC,CAChD;aAFUD,aAAa,GAAbA;aACAC,aAAa,GAAbA;IACT;IAEH,UAAUC,SAAiB,EAAW;QAClC,OAAOA,cAAcC;IACzB;IAEA,MAAMC,GAAmB,EAAEC,QAAoC,EAAQ;QAKnE,MAAMC,aAAa,CAACC;YAChB,IAAIA,KAAK,EAAE,KAAKH,IAAI,gBAAgB,EAChC,OAAOG;YAGX,MAAMC,SAAuB;gBAAE,GAAGD,KAAK,MAAM;gBAAEF;YAAS;YACxD,OAAOI,KAAK,MAAM,CAAC;gBAAE,GAAGF,IAAI;gBAAEC;YAAO;QACzC;QAEA,IAAI,CAAC,aAAa,CAAC,WAAW,CAACF;QAC/B,IAAI,CAAC,aAAa,CAAC,WAAW,CAACA;IACnC;AACJ;AAEO,MAAMI,kDAA0BC,wBAAAA,oBAAgC,CAAC;IACpE,gBAAgBZ;IAChB,cAAc;QAACa;QAAeC;KAAc;AAChD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "~/types.js";
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it } from "vitest";
|
|
2
|
+
import { Container } from "@webiny/di";
|
|
3
|
+
import { ListCache } from "@webiny/app-admin/features/listCache/index.js";
|
|
4
|
+
import { Page } from "@webiny/app-website-builder/domain/Page/index.js";
|
|
5
|
+
import { WbPageStatus } from "@webiny/app-website-builder/constants.js";
|
|
6
|
+
import { FullPageCache, PageListCache } from "@webiny/app-website-builder/features/pages/shared/abstractions.js";
|
|
7
|
+
import { ReviewState } from "@webiny/app-workflows/review/domain/ReviewState.js";
|
|
8
|
+
import { StepState } from "@webiny/app-workflows/review/domain/StepState.js";
|
|
9
|
+
import "../../types.js";
|
|
10
|
+
import { WbReviewPageCacheWriter } from "./abstractions.js";
|
|
11
|
+
import { WbReviewPageCacheWriter as external_WbReviewPageCacheWriter_js_WbReviewPageCacheWriter } from "./WbReviewPageCacheWriter.js";
|
|
12
|
+
const WORKFLOW = {
|
|
13
|
+
workflowId: "workflow-1",
|
|
14
|
+
reviewState: ReviewState.InProgress,
|
|
15
|
+
stepId: "step-1",
|
|
16
|
+
stepName: "Legal",
|
|
17
|
+
stepState: StepState.InReview
|
|
18
|
+
};
|
|
19
|
+
const createPage = (id, entryId, title)=>Page.create({
|
|
20
|
+
id,
|
|
21
|
+
entryId,
|
|
22
|
+
status: WbPageStatus.Draft,
|
|
23
|
+
properties: {
|
|
24
|
+
title
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
const snapshot = (cache)=>JSON.parse(JSON.stringify(cache.getItems()));
|
|
28
|
+
describe("WbReviewPageCacheWriter", ()=>{
|
|
29
|
+
let listCache;
|
|
30
|
+
let fullCache;
|
|
31
|
+
let writer;
|
|
32
|
+
beforeEach(()=>{
|
|
33
|
+
listCache = new ListCache("entryId");
|
|
34
|
+
fullCache = new ListCache("id");
|
|
35
|
+
listCache.addItems([
|
|
36
|
+
createPage("page-1#0002", "page-1", "Home"),
|
|
37
|
+
createPage("page-2#0001", "page-2", "About")
|
|
38
|
+
]);
|
|
39
|
+
fullCache.addItems([
|
|
40
|
+
createPage("page-1#0002", "page-1", "Home"),
|
|
41
|
+
createPage("page-1#0001", "page-1", "Home old")
|
|
42
|
+
]);
|
|
43
|
+
const container = new Container();
|
|
44
|
+
container.registerInstance(PageListCache, listCache);
|
|
45
|
+
container.registerInstance(FullPageCache, fullCache);
|
|
46
|
+
container.register(external_WbReviewPageCacheWriter_js_WbReviewPageCacheWriter);
|
|
47
|
+
writer = container.resolve(WbReviewPageCacheWriter);
|
|
48
|
+
});
|
|
49
|
+
it("handles only the Website Builder page namespace", ()=>{
|
|
50
|
+
expect(writer.canHandle("wb.page")).toBe(true);
|
|
51
|
+
expect(writer.canHandle("cms.article")).toBe(false);
|
|
52
|
+
});
|
|
53
|
+
it("puts the workflow on the matching revision in both caches and nothing else", ()=>{
|
|
54
|
+
writer.write({
|
|
55
|
+
namespace: "wb.page",
|
|
56
|
+
targetId: "page-1",
|
|
57
|
+
targetRevisionId: "page-1#0002"
|
|
58
|
+
}, WORKFLOW);
|
|
59
|
+
const listItems = listCache.getItems();
|
|
60
|
+
const home = listItems.find((page)=>"page-1" === page.entryId);
|
|
61
|
+
const about = listItems.find((page)=>"page-2" === page.entryId);
|
|
62
|
+
expect(home?.system?.workflow).toEqual(WORKFLOW);
|
|
63
|
+
expect(about?.system).toBeNull();
|
|
64
|
+
const fullItems = fullCache.getItems();
|
|
65
|
+
const latest = fullItems.find((page)=>"page-1#0002" === page.id);
|
|
66
|
+
const older = fullItems.find((page)=>"page-1#0001" === page.id);
|
|
67
|
+
expect(latest?.system?.workflow).toEqual(WORKFLOW);
|
|
68
|
+
expect(older?.system).toBeNull();
|
|
69
|
+
});
|
|
70
|
+
it("a review of an older revision does not mark the latest row", ()=>{
|
|
71
|
+
writer.write({
|
|
72
|
+
namespace: "wb.page",
|
|
73
|
+
targetId: "page-1",
|
|
74
|
+
targetRevisionId: "page-1#0001"
|
|
75
|
+
}, WORKFLOW);
|
|
76
|
+
const home = listCache.getItems().find((page)=>"page-1" === page.entryId);
|
|
77
|
+
expect(home?.system).toBeNull();
|
|
78
|
+
const older = fullCache.getItems().find((page)=>"page-1#0001" === page.id);
|
|
79
|
+
expect(older?.system?.workflow).toEqual(WORKFLOW);
|
|
80
|
+
});
|
|
81
|
+
it("clears the workflow with null", ()=>{
|
|
82
|
+
const ref = {
|
|
83
|
+
namespace: "wb.page",
|
|
84
|
+
targetId: "page-1",
|
|
85
|
+
targetRevisionId: "page-1#0002"
|
|
86
|
+
};
|
|
87
|
+
writer.write(ref, WORKFLOW);
|
|
88
|
+
writer.write(ref, null);
|
|
89
|
+
const home = listCache.getItems().find((page)=>"page-1" === page.entryId);
|
|
90
|
+
expect(home?.system?.workflow).toBeNull();
|
|
91
|
+
const latest = fullCache.getItems().find((page)=>"page-1#0002" === page.id);
|
|
92
|
+
expect(latest?.system?.workflow).toBeNull();
|
|
93
|
+
});
|
|
94
|
+
it("keeps the other fields of the page and is a no-op for a page that is not cached", ()=>{
|
|
95
|
+
const listBefore = snapshot(listCache);
|
|
96
|
+
const fullBefore = snapshot(fullCache);
|
|
97
|
+
writer.write({
|
|
98
|
+
namespace: "wb.page",
|
|
99
|
+
targetId: "page-9",
|
|
100
|
+
targetRevisionId: "page-9#0001"
|
|
101
|
+
}, WORKFLOW);
|
|
102
|
+
expect(snapshot(listCache)).toEqual(listBefore);
|
|
103
|
+
expect(snapshot(fullCache)).toEqual(fullBefore);
|
|
104
|
+
writer.write({
|
|
105
|
+
namespace: "wb.page",
|
|
106
|
+
targetId: "page-1",
|
|
107
|
+
targetRevisionId: "page-1#0002"
|
|
108
|
+
}, WORKFLOW);
|
|
109
|
+
const home = listCache.getItems().find((page)=>"page-1" === page.entryId);
|
|
110
|
+
expect(home?.properties.title).toBe("Home");
|
|
111
|
+
expect(home?.id).toBe("page-1#0002");
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
//# sourceMappingURL=WbReviewPageCacheWriter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/cache/WbReviewPageCacheWriter.test.js","sources":["../../../src/features/cache/WbReviewPageCacheWriter.test.ts"],"sourcesContent":["import { beforeEach } from \"vitest\";\nimport { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { ListCache } from \"@webiny/app-admin/features/listCache/index.js\";\nimport { Page } from \"@webiny/app-website-builder/domain/Page/index.js\";\nimport { WbPageStatus } from \"@webiny/app-website-builder/constants.js\";\nimport { FullPageCache } from \"@webiny/app-website-builder/features/pages/shared/abstractions.js\";\nimport { PageListCache } from \"@webiny/app-website-builder/features/pages/shared/abstractions.js\";\nimport { ReviewState } from \"@webiny/app-workflows/review/domain/ReviewState.js\";\nimport { StepState } from \"@webiny/app-workflows/review/domain/StepState.js\";\nimport type { SystemWorkflowValue } from \"@webiny/app-workflows/review/domain/types.js\";\nimport \"~/types.js\";\nimport { WbReviewPageCacheWriter as WriterAbstraction } from \"./abstractions.js\";\nimport { WbReviewPageCacheWriter } from \"./WbReviewPageCacheWriter.js\";\n\nconst WORKFLOW: SystemWorkflowValue = {\n workflowId: \"workflow-1\",\n reviewState: ReviewState.InProgress,\n stepId: \"step-1\",\n stepName: \"Legal\",\n stepState: StepState.InReview\n};\n\nconst createPage = (id: string, entryId: string, title: string): Page => {\n return Page.create({\n id,\n entryId,\n status: WbPageStatus.Draft,\n properties: { title }\n });\n};\n\n// A deep copy, so that a write that changes the cached objects in place is still seen.\nconst snapshot = (cache: ListCache<Page>): unknown => {\n return JSON.parse(JSON.stringify(cache.getItems()));\n};\n\ndescribe(\"WbReviewPageCacheWriter\", () => {\n let listCache: ListCache<Page>;\n let fullCache: ListCache<Page>;\n let writer: WriterAbstraction.Interface;\n\n beforeEach(() => {\n listCache = new ListCache<Page>(\"entryId\");\n fullCache = new ListCache<Page>(\"id\");\n listCache.addItems([\n createPage(\"page-1#0002\", \"page-1\", \"Home\"),\n createPage(\"page-2#0001\", \"page-2\", \"About\")\n ]);\n fullCache.addItems([\n createPage(\"page-1#0002\", \"page-1\", \"Home\"),\n createPage(\"page-1#0001\", \"page-1\", \"Home old\")\n ]);\n\n const container = new Container();\n container.registerInstance(PageListCache, listCache);\n container.registerInstance(FullPageCache, fullCache);\n container.register(WbReviewPageCacheWriter);\n writer = container.resolve(WriterAbstraction);\n });\n\n it(\"handles only the Website Builder page namespace\", () => {\n expect(writer.canHandle(\"wb.page\")).toBe(true);\n expect(writer.canHandle(\"cms.article\")).toBe(false);\n });\n\n it(\"puts the workflow on the matching revision in both caches and nothing else\", () => {\n writer.write(\n { namespace: \"wb.page\", targetId: \"page-1\", targetRevisionId: \"page-1#0002\" },\n WORKFLOW\n );\n\n const listItems = listCache.getItems();\n const home = listItems.find(page => page.entryId === \"page-1\");\n const about = listItems.find(page => page.entryId === \"page-2\");\n expect(home?.system?.workflow).toEqual(WORKFLOW);\n expect(about?.system).toBeNull();\n\n const fullItems = fullCache.getItems();\n const latest = fullItems.find(page => page.id === \"page-1#0002\");\n const older = fullItems.find(page => page.id === \"page-1#0001\");\n expect(latest?.system?.workflow).toEqual(WORKFLOW);\n expect(older?.system).toBeNull();\n });\n\n it(\"a review of an older revision does not mark the latest row\", () => {\n writer.write(\n { namespace: \"wb.page\", targetId: \"page-1\", targetRevisionId: \"page-1#0001\" },\n WORKFLOW\n );\n\n const home = listCache.getItems().find(page => page.entryId === \"page-1\");\n expect(home?.system).toBeNull();\n const older = fullCache.getItems().find(page => page.id === \"page-1#0001\");\n expect(older?.system?.workflow).toEqual(WORKFLOW);\n });\n\n it(\"clears the workflow with null\", () => {\n const ref = { namespace: \"wb.page\", targetId: \"page-1\", targetRevisionId: \"page-1#0002\" };\n writer.write(ref, WORKFLOW);\n\n writer.write(ref, null);\n\n const home = listCache.getItems().find(page => page.entryId === \"page-1\");\n expect(home?.system?.workflow).toBeNull();\n const latest = fullCache.getItems().find(page => page.id === \"page-1#0002\");\n expect(latest?.system?.workflow).toBeNull();\n });\n\n it(\"keeps the other fields of the page and is a no-op for a page that is not cached\", () => {\n const listBefore = snapshot(listCache);\n const fullBefore = snapshot(fullCache);\n\n writer.write(\n { namespace: \"wb.page\", targetId: \"page-9\", targetRevisionId: \"page-9#0001\" },\n WORKFLOW\n );\n\n expect(snapshot(listCache)).toEqual(listBefore);\n expect(snapshot(fullCache)).toEqual(fullBefore);\n\n writer.write(\n { namespace: \"wb.page\", targetId: \"page-1\", targetRevisionId: \"page-1#0002\" },\n WORKFLOW\n );\n\n const home = listCache.getItems().find(page => page.entryId === \"page-1\");\n expect(home?.properties.title).toBe(\"Home\");\n expect(home?.id).toBe(\"page-1#0002\");\n });\n});\n"],"names":["WORKFLOW","ReviewState","StepState","createPage","id","entryId","title","Page","WbPageStatus","snapshot","cache","JSON","describe","listCache","fullCache","writer","beforeEach","ListCache","container","Container","PageListCache","FullPageCache","WbReviewPageCacheWriter","WriterAbstraction","it","expect","listItems","home","page","about","fullItems","latest","older","ref","listBefore","fullBefore"],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { IReviewCacheWriter } from "@webiny/app-workflows/review/cache/IReviewCacheWriter.js";
|
|
2
|
+
export declare const WbReviewPageCacheWriter: import("@webiny/di").Abstraction<IReviewCacheWriter>;
|
|
3
|
+
export declare namespace WbReviewPageCacheWriter {
|
|
4
|
+
type Interface = IReviewCacheWriter;
|
|
5
|
+
}
|