@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.
- package/Components/CmsEntriesList/CmsReviewMoveEntryAction.d.ts +2 -0
- package/Components/CmsEntriesList/CmsReviewMoveEntryAction.js +43 -0
- package/Components/CmsEntriesList/CmsReviewMoveEntryAction.js.map +1 -0
- package/Components/CmsEntriesList/CmsReviewMoveEntryAction.test.d.ts +1 -0
- package/Components/CmsEntriesList/CmsReviewMoveEntryAction.test.js +118 -0
- package/Components/CmsEntriesList/CmsReviewMoveEntryAction.test.js.map +1 -0
- package/Components/CmsEntriesList/CmsReviewScheduleEntryAction.d.ts +2 -0
- package/Components/CmsEntriesList/CmsReviewScheduleEntryAction.js +22 -0
- package/Components/CmsEntriesList/CmsReviewScheduleEntryAction.js.map +1 -0
- package/Components/CmsEntriesList/CmsReviewScheduleEntryAction.test.d.ts +1 -0
- package/Components/CmsEntriesList/CmsReviewScheduleEntryAction.test.js +98 -0
- package/Components/CmsEntriesList/CmsReviewScheduleEntryAction.test.js.map +1 -0
- package/Components/ContentEntryForm/CmsEntryReviewBar.d.ts +2 -0
- package/Components/ContentEntryForm/CmsEntryReviewBar.js +32 -0
- package/Components/ContentEntryForm/CmsEntryReviewBar.js.map +1 -0
- package/Components/ContentEntryForm/CmsEntryReviewBar.test.d.ts +1 -0
- package/Components/ContentEntryForm/CmsEntryReviewBar.test.js +128 -0
- package/Components/ContentEntryForm/CmsEntryReviewBar.test.js.map +1 -0
- package/Components/ContentEntryForm/CmsEntryReviewBlockedActions.d.ts +2 -0
- package/Components/ContentEntryForm/CmsEntryReviewBlockedActions.js +46 -0
- package/Components/ContentEntryForm/CmsEntryReviewBlockedActions.js.map +1 -0
- package/Components/ContentEntryForm/CmsEntryReviewBlockedActions.test.d.ts +1 -0
- package/Components/ContentEntryForm/CmsEntryReviewBlockedActions.test.js +222 -0
- package/Components/ContentEntryForm/CmsEntryReviewBlockedActions.test.js.map +1 -0
- package/Components/ContentEntryForm/CmsEntryReviewFormLock.d.ts +2 -0
- package/Components/ContentEntryForm/CmsEntryReviewFormLock.js +32 -0
- package/Components/ContentEntryForm/CmsEntryReviewFormLock.js.map +1 -0
- package/Components/ContentEntryForm/CmsEntryReviewFormLock.test.d.ts +1 -0
- package/Components/ContentEntryForm/CmsEntryReviewFormLock.test.js +94 -0
- package/Components/ContentEntryForm/CmsEntryReviewFormLock.test.js.map +1 -0
- package/Components/ContentEntryForm/CmsEntryReviewNewRevision.d.ts +2 -0
- package/Components/ContentEntryForm/CmsEntryReviewNewRevision.js +56 -0
- package/Components/ContentEntryForm/CmsEntryReviewNewRevision.js.map +1 -0
- package/Components/ContentEntryForm/CmsEntryReviewNewRevision.test.d.ts +1 -0
- package/Components/ContentEntryForm/CmsEntryReviewNewRevision.test.js +186 -0
- package/Components/ContentEntryForm/CmsEntryReviewNewRevision.test.js.map +1 -0
- package/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.d.ts +2 -0
- package/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.js +26 -0
- package/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.js.map +1 -0
- package/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.test.d.ts +1 -0
- package/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.test.js +78 -0
- package/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.test.js.map +1 -0
- package/Components/ContentEntryForm/getModelFieldLabels.d.ts +3 -0
- package/Components/ContentEntryForm/getModelFieldLabels.js +8 -0
- package/Components/ContentEntryForm/getModelFieldLabels.js.map +1 -0
- package/Components/ContentEntryForm/index.d.ts +5 -0
- package/Components/ContentEntryForm/index.js +5 -0
- package/Components/ContentReviews/CmsContentReviews.d.ts +2 -0
- package/Components/ContentReviews/CmsContentReviews.js +11 -0
- package/Components/ContentReviews/CmsContentReviews.js.map +1 -0
- package/Components/ContentReviews/CmsContentReviews.test.d.ts +1 -0
- package/Components/ContentReviews/CmsContentReviews.test.js +214 -0
- package/Components/ContentReviews/CmsContentReviews.test.js.map +1 -0
- package/Components/ContentReviews/CmsContentReviewsMount.d.ts +4 -0
- package/Components/ContentReviews/CmsContentReviewsMount.js +44 -0
- package/Components/ContentReviews/CmsContentReviewsMount.js.map +1 -0
- package/Components/ContentReviews/CmsContentReviewsSidebarItem.d.ts +2 -0
- package/Components/ContentReviews/CmsContentReviewsSidebarItem.js +20 -0
- package/Components/ContentReviews/CmsContentReviewsSidebarItem.js.map +1 -0
- package/Components/ContentReviews/CmsContentReviewsSidebarItem.test.d.ts +1 -0
- package/Components/ContentReviews/CmsContentReviewsSidebarItem.test.js +83 -0
- package/Components/ContentReviews/CmsContentReviewsSidebarItem.test.js.map +1 -0
- package/Components/ModelDelete/ModelBoundToWorkflowErrorData.d.ts +8 -0
- package/Components/ModelDelete/ModelBoundToWorkflowErrorData.js +0 -0
- package/Components/ModelDelete/ModelDeleteWorkflowCopy.d.ts +10 -0
- package/Components/ModelDelete/ModelDeleteWorkflowCopy.js +0 -0
- package/Components/ModelDelete/ModelDeleteWorkflowError.d.ts +2 -0
- package/Components/ModelDelete/ModelDeleteWorkflowError.js +34 -0
- package/Components/ModelDelete/ModelDeleteWorkflowError.js.map +1 -0
- package/Components/ModelDelete/ModelDeleteWorkflowError.test.d.ts +1 -0
- package/Components/ModelDelete/ModelDeleteWorkflowError.test.js +73 -0
- package/Components/ModelDelete/ModelDeleteWorkflowError.test.js.map +1 -0
- package/Components/ModelDelete/getModelDeleteWorkflowCopy.d.ts +3 -0
- package/Components/ModelDelete/getModelDeleteWorkflowCopy.js +17 -0
- package/Components/ModelDelete/getModelDeleteWorkflowCopy.js.map +1 -0
- package/Components/ModelDelete/getModelDeleteWorkflowCopy.test.d.ts +1 -0
- package/Components/ModelDelete/getModelDeleteWorkflowCopy.test.js +28 -0
- package/Components/ModelDelete/getModelDeleteWorkflowCopy.test.js.map +1 -0
- package/Components/ignoreAction.d.ts +1 -0
- package/Components/ignoreAction.js +4 -0
- package/Components/ignoreAction.js.map +1 -0
- package/LICENSE +21 -0
- package/README.md +11 -0
- package/Routes/CmsWorkflowEditor.d.ts +2 -0
- package/Routes/CmsWorkflowEditor.js +23 -0
- package/Routes/CmsWorkflowEditor.js.map +1 -0
- package/Routes/CmsWorkflowEditor.test.d.ts +1 -0
- package/Routes/CmsWorkflowEditor.test.js +141 -0
- package/Routes/CmsWorkflowEditor.test.js.map +1 -0
- package/Routes/index.d.ts +1 -0
- package/Routes/index.js +1 -0
- package/features/cache/CmsReviewCacheSyncHandler.d.ts +8 -0
- package/features/cache/CmsReviewCacheSyncHandler.js +14 -0
- package/features/cache/CmsReviewCacheSyncHandler.js.map +1 -0
- package/features/cache/CmsReviewCacheWriter.d.ts +14 -0
- package/features/cache/CmsReviewCacheWriter.js +39 -0
- package/features/cache/CmsReviewCacheWriter.js.map +1 -0
- package/features/cache/CmsReviewCacheWriter.test.d.ts +1 -0
- package/features/cache/CmsReviewCacheWriter.test.js +207 -0
- package/features/cache/CmsReviewCacheWriter.test.js.map +1 -0
- package/features/cache/CmsReviewEntriesCacheProviderDecorator.d.ts +12 -0
- package/features/cache/CmsReviewEntriesCacheProviderDecorator.js +17 -0
- package/features/cache/CmsReviewEntriesCacheProviderDecorator.js.map +1 -0
- package/features/cache/CmsReviewEntriesCacheProviderDecorator.test.d.ts +1 -0
- package/features/cache/CmsReviewEntriesCacheProviderDecorator.test.js +129 -0
- package/features/cache/CmsReviewEntriesCacheProviderDecorator.test.js.map +1 -0
- package/features/cache/ReviewPreservingEntriesCache.d.ts +18 -0
- package/features/cache/ReviewPreservingEntriesCache.js +54 -0
- package/features/cache/ReviewPreservingEntriesCache.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/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.d.ts +26 -0
- package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.js +104 -0
- package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.js.map +1 -0
- package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.test.d.ts +1 -0
- package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.test.js +589 -0
- package/features/editorGateway/CmsWorkflowEditorGateway/CmsWorkflowEditorGateway.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 +272 -0
- package/features/editorGateway/feature.test.js.map +1 -0
- package/features/editorGateway/graphql/cmsEntryFolderExists.d.ts +1 -0
- package/features/editorGateway/graphql/cmsEntryFolderExists.js +16 -0
- package/features/editorGateway/graphql/cmsEntryFolderExists.js.map +1 -0
- package/features/editorGateway/graphql/deleteCmsEntryWorkflow.d.ts +1 -0
- package/features/editorGateway/graphql/deleteCmsEntryWorkflow.js +19 -0
- package/features/editorGateway/graphql/deleteCmsEntryWorkflow.js.map +1 -0
- package/features/editorGateway/graphql/getCmsEntryWorkflow.d.ts +1 -0
- package/features/editorGateway/graphql/getCmsEntryWorkflow.js +19 -0
- package/features/editorGateway/graphql/getCmsEntryWorkflow.js.map +1 -0
- package/features/editorGateway/graphql/inspectCmsEntryRouting.d.ts +1 -0
- package/features/editorGateway/graphql/inspectCmsEntryRouting.js +19 -0
- package/features/editorGateway/graphql/inspectCmsEntryRouting.js.map +1 -0
- package/features/editorGateway/graphql/listCmsEntryWorkflowModels.d.ts +1 -0
- package/features/editorGateway/graphql/listCmsEntryWorkflowModels.js +29 -0
- package/features/editorGateway/graphql/listCmsEntryWorkflowModels.js.map +1 -0
- package/features/editorGateway/graphql/storeCmsEntryWorkflow.d.ts +1 -0
- package/features/editorGateway/graphql/storeCmsEntryWorkflow.js +19 -0
- package/features/editorGateway/graphql/storeCmsEntryWorkflow.js.map +1 -0
- package/features/editorMounting/CmsWorkflowEditorAppAdapter.d.ts +25 -0
- package/features/editorMounting/CmsWorkflowEditorAppAdapter.js +51 -0
- package/features/editorMounting/CmsWorkflowEditorAppAdapter.js.map +1 -0
- package/features/editorMounting/CmsWorkflowEditorAppAdapter.test.d.ts +1 -0
- package/features/editorMounting/CmsWorkflowEditorAppAdapter.test.js +185 -0
- package/features/editorMounting/CmsWorkflowEditorAppAdapter.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 +100 -0
- package/features/editorMounting/feature.test.js.map +1 -0
- package/features/editorReview/CmsEntryReview.d.ts +8 -0
- package/features/editorReview/CmsEntryReview.js +14 -0
- package/features/editorReview/CmsEntryReview.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/editorReview/feature.test.d.ts +1 -0
- package/features/editorReview/feature.test.js +46 -0
- package/features/editorReview/feature.test.js.map +1 -0
- package/features/editorReview/useCmsEntryReview.d.ts +2 -0
- package/features/editorReview/useCmsEntryReview.js +8 -0
- package/features/editorReview/useCmsEntryReview.js.map +1 -0
- package/features/feature.d.ts +1 -0
- package/features/feature.js +15 -0
- package/features/feature.js.map +1 -0
- package/features/gateway/CmsReviewChangeMessageHandler.d.ts +8 -0
- package/features/gateway/CmsReviewChangeMessageHandler.js +16 -0
- package/features/gateway/CmsReviewChangeMessageHandler.js.map +1 -0
- package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.d.ts +16 -0
- package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.js +39 -0
- package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.js.map +1 -0
- package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.test.d.ts +1 -0
- package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.test.js +83 -0
- package/features/gateway/CmsReviewContentAdapter/CmsReviewContentAdapter.test.js.map +1 -0
- package/features/gateway/CmsReviewContentAdapter/abstractions.d.ts +5 -0
- package/features/gateway/CmsReviewContentAdapter/abstractions.js +5 -0
- package/features/gateway/CmsReviewContentAdapter/abstractions.js.map +1 -0
- package/features/gateway/CmsReviewGateway/CmsReviewGateway.d.ts +52 -0
- package/features/gateway/CmsReviewGateway/CmsReviewGateway.js +221 -0
- package/features/gateway/CmsReviewGateway/CmsReviewGateway.js.map +1 -0
- package/features/gateway/CmsReviewGateway/CmsReviewGateway.test.d.ts +1 -0
- package/features/gateway/CmsReviewGateway/CmsReviewGateway.test.js +689 -0
- package/features/gateway/CmsReviewGateway/CmsReviewGateway.test.js.map +1 -0
- package/features/gateway/CmsReviewNotificationHandler.d.ts +8 -0
- package/features/gateway/CmsReviewNotificationHandler.js +16 -0
- package/features/gateway/CmsReviewNotificationHandler.js.map +1 -0
- package/features/gateway/CmsReviewRowProvider/CmsReviewRowProvider.d.ts +8 -0
- package/features/gateway/CmsReviewRowProvider/CmsReviewRowProvider.js +14 -0
- package/features/gateway/CmsReviewRowProvider/CmsReviewRowProvider.js.map +1 -0
- package/features/gateway/CmsReviewRowProvider/abstractions.d.ts +5 -0
- package/features/gateway/CmsReviewRowProvider/abstractions.js +5 -0
- package/features/gateway/CmsReviewRowProvider/abstractions.js.map +1 -0
- package/features/gateway/contentReviewsBindings.test.d.ts +1 -0
- package/features/gateway/contentReviewsBindings.test.js +125 -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 +79 -0
- package/features/gateway/feature.test.js.map +1 -0
- package/features/gateway/graphql/CmsOperationResponse.d.ts +3 -0
- package/features/gateway/graphql/CmsOperationResponse.js +0 -0
- package/features/gateway/graphql/approveCmsEntryReviewStep.d.ts +1 -0
- package/features/gateway/graphql/approveCmsEntryReviewStep.js +18 -0
- package/features/gateway/graphql/approveCmsEntryReviewStep.js.map +1 -0
- package/features/gateway/graphql/cancelCmsEntryReview.d.ts +1 -0
- package/features/gateway/graphql/cancelCmsEntryReview.js +18 -0
- package/features/gateway/graphql/cancelCmsEntryReview.js.map +1 -0
- package/features/gateway/graphql/cancelCmsEntryReviewsForDelete.d.ts +1 -0
- package/features/gateway/graphql/cancelCmsEntryReviewsForDelete.js +28 -0
- package/features/gateway/graphql/cancelCmsEntryReviewsForDelete.js.map +1 -0
- package/features/gateway/graphql/getCmsEntryReview.d.ts +1 -0
- package/features/gateway/graphql/getCmsEntryReview.js +18 -0
- package/features/gateway/graphql/getCmsEntryReview.js.map +1 -0
- package/features/gateway/graphql/getCmsEntryReviewStepRun.d.ts +1 -0
- package/features/gateway/graphql/getCmsEntryReviewStepRun.js +18 -0
- package/features/gateway/graphql/getCmsEntryReviewStepRun.js.map +1 -0
- package/features/gateway/graphql/getCmsEntryTargetReview.d.ts +1 -0
- package/features/gateway/graphql/getCmsEntryTargetReview.js +18 -0
- package/features/gateway/graphql/getCmsEntryTargetReview.js.map +1 -0
- package/features/gateway/graphql/listCmsEntryBlockingReviews.d.ts +1 -0
- package/features/gateway/graphql/listCmsEntryBlockingReviews.js +18 -0
- package/features/gateway/graphql/listCmsEntryBlockingReviews.js.map +1 -0
- package/features/gateway/graphql/listCmsEntryReviewStepCandidates.d.ts +1 -0
- package/features/gateway/graphql/listCmsEntryReviewStepCandidates.js +18 -0
- package/features/gateway/graphql/listCmsEntryReviewStepCandidates.js.map +1 -0
- package/features/gateway/graphql/listCmsEntryReviews.d.ts +1 -0
- package/features/gateway/graphql/listCmsEntryReviews.js +34 -0
- package/features/gateway/graphql/listCmsEntryReviews.js.map +1 -0
- package/features/gateway/graphql/listCmsEntryStepCandidates.d.ts +1 -0
- package/features/gateway/graphql/listCmsEntryStepCandidates.js +28 -0
- package/features/gateway/graphql/listCmsEntryStepCandidates.js.map +1 -0
- package/features/gateway/graphql/listCmsEntryWorkflows.d.ts +1 -0
- package/features/gateway/graphql/listCmsEntryWorkflows.js +18 -0
- package/features/gateway/graphql/listCmsEntryWorkflows.js.map +1 -0
- package/features/gateway/graphql/reassignCmsEntryReviewStep.d.ts +1 -0
- package/features/gateway/graphql/reassignCmsEntryReviewStep.js +18 -0
- package/features/gateway/graphql/reassignCmsEntryReviewStep.js.map +1 -0
- package/features/gateway/graphql/rejectCmsEntryReviewStep.d.ts +1 -0
- package/features/gateway/graphql/rejectCmsEntryReviewStep.js +18 -0
- package/features/gateway/graphql/rejectCmsEntryReviewStep.js.map +1 -0
- package/features/gateway/graphql/requestCmsEntryReview.d.ts +1 -0
- package/features/gateway/graphql/requestCmsEntryReview.js +28 -0
- package/features/gateway/graphql/requestCmsEntryReview.js.map +1 -0
- package/features/gateway/graphql/restartCmsEntryReviewStep.d.ts +1 -0
- package/features/gateway/graphql/restartCmsEntryReviewStep.js +18 -0
- package/features/gateway/graphql/restartCmsEntryReviewStep.js.map +1 -0
- package/features/gateway/graphql/startCmsEntryReviewStep.d.ts +1 -0
- package/features/gateway/graphql/startCmsEntryReviewStep.js +18 -0
- package/features/gateway/graphql/startCmsEntryReviewStep.js.map +1 -0
- package/features/gateway/graphql/takeOverCmsEntryReviewStep.d.ts +1 -0
- package/features/gateway/graphql/takeOverCmsEntryReviewStep.js +22 -0
- package/features/gateway/graphql/takeOverCmsEntryReviewStep.js.map +1 -0
- package/features/trash/BulkDeletePresenterReviewDecorator.d.ts +20 -0
- package/features/trash/BulkDeletePresenterReviewDecorator.js +81 -0
- package/features/trash/BulkDeletePresenterReviewDecorator.js.map +1 -0
- package/features/trash/BulkDeletePresenterReviewDecorator.test.d.ts +1 -0
- package/features/trash/BulkDeletePresenterReviewDecorator.test.js +693 -0
- package/features/trash/BulkDeletePresenterReviewDecorator.test.js.map +1 -0
- package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.d.ts +13 -0
- package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.js +23 -0
- package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.js.map +1 -0
- package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.test.d.ts +1 -0
- package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.test.js +123 -0
- package/features/trash/DeleteEntryRevisionUseCaseReviewDecorator.test.js.map +1 -0
- package/features/trash/DeleteEntryUseCaseReviewDecorator.d.ts +13 -0
- package/features/trash/DeleteEntryUseCaseReviewDecorator.js +23 -0
- package/features/trash/DeleteEntryUseCaseReviewDecorator.js.map +1 -0
- package/features/trash/DeleteEntryUseCaseReviewDecorator.test.d.ts +1 -0
- package/features/trash/DeleteEntryUseCaseReviewDecorator.test.js +139 -0
- package/features/trash/DeleteEntryUseCaseReviewDecorator.test.js.map +1 -0
- package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.d.ts +13 -0
- package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.js +23 -0
- package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.js.map +1 -0
- package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.test.d.ts +1 -0
- package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.test.js +122 -0
- package/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.test.js.map +1 -0
- package/features/trash/feature.d.ts +1 -0
- package/features/trash/feature.js +17 -0
- package/features/trash/feature.js.map +1 -0
- package/features/trash/feature.test.d.ts +1 -0
- package/features/trash/feature.test.js +213 -0
- package/features/trash/feature.test.js.map +1 -0
- package/index.d.ts +2 -0
- package/index.editor.test.d.ts +1 -0
- package/index.editor.test.js +149 -0
- package/index.editor.test.js.map +1 -0
- package/index.js +41 -0
- package/index.js.map +1 -0
- package/index.lists.test.d.ts +1 -0
- package/index.lists.test.js +172 -0
- package/index.lists.test.js.map +1 -0
- package/index.mount.test.d.ts +1 -0
- package/index.mount.test.js +49 -0
- package/index.mount.test.js.map +1 -0
- package/index.test.d.ts +1 -0
- package/index.test.js +414 -0
- package/index.test.js.map +1 -0
- package/package.json +54 -0
- package/presentation/CmsEntryContentReloader.d.ts +8 -0
- package/presentation/CmsEntryContentReloader.js +20 -0
- package/presentation/CmsEntryContentReloader.js.map +1 -0
- package/presentation/CmsEntryContentReloader.test.d.ts +1 -0
- package/presentation/CmsEntryContentReloader.test.js +118 -0
- package/presentation/CmsEntryContentReloader.test.js.map +1 -0
- package/presentation/CmsEntryFormPresenterReviewDecorator.d.ts +27 -0
- package/presentation/CmsEntryFormPresenterReviewDecorator.js +167 -0
- package/presentation/CmsEntryFormPresenterReviewDecorator.js.map +1 -0
- package/presentation/CmsEntryFormPresenterReviewDecorator.test.d.ts +1 -0
- package/presentation/CmsEntryFormPresenterReviewDecorator.test.js +601 -0
- package/presentation/CmsEntryFormPresenterReviewDecorator.test.js.map +1 -0
- package/presentation/CmsEntryUnsavedChanges.d.ts +7 -0
- package/presentation/CmsEntryUnsavedChanges.js +12 -0
- package/presentation/CmsEntryUnsavedChanges.js.map +1 -0
- package/presentation/CmsEntryUnsavedChanges.test.d.ts +1 -0
- package/presentation/CmsEntryUnsavedChanges.test.js +23 -0
- package/presentation/CmsEntryUnsavedChanges.test.js.map +1 -0
- package/presentation/CmsReviewFieldSelections.test.d.ts +1 -0
- package/presentation/CmsReviewFieldSelections.test.js +27 -0
- package/presentation/CmsReviewFieldSelections.test.js.map +1 -0
- package/presentation/CmsReviewGetEntryFieldSelection.d.ts +8 -0
- package/presentation/CmsReviewGetEntryFieldSelection.js +16 -0
- package/presentation/CmsReviewGetEntryFieldSelection.js.map +1 -0
- package/presentation/CmsReviewListEntriesFieldSelection.d.ts +8 -0
- package/presentation/CmsReviewListEntriesFieldSelection.js +16 -0
- package/presentation/CmsReviewListEntriesFieldSelection.js.map +1 -0
- package/presentation/CmsReviewTableRowMapperDecorator.d.ts +11 -0
- package/presentation/CmsReviewTableRowMapperDecorator.js +24 -0
- package/presentation/CmsReviewTableRowMapperDecorator.js.map +1 -0
- package/presentation/CmsReviewTableRowMapperDecorator.test.d.ts +1 -0
- package/presentation/CmsReviewTableRowMapperDecorator.test.js +120 -0
- package/presentation/CmsReviewTableRowMapperDecorator.test.js.map +1 -0
- package/presentation/CmsRevisionsListPresenterDecorator.d.ts +24 -0
- package/presentation/CmsRevisionsListPresenterDecorator.js +66 -0
- package/presentation/CmsRevisionsListPresenterDecorator.js.map +1 -0
- package/presentation/CmsRevisionsListPresenterDecorator.test.d.ts +1 -0
- package/presentation/CmsRevisionsListPresenterDecorator.test.js +174 -0
- package/presentation/CmsRevisionsListPresenterDecorator.test.js.map +1 -0
- package/presentation/contentReviews/CmsContentReviewsPresenter.d.ts +28 -0
- package/presentation/contentReviews/CmsContentReviewsPresenter.js +103 -0
- package/presentation/contentReviews/CmsContentReviewsPresenter.js.map +1 -0
- package/presentation/contentReviews/CmsContentReviewsPresenter.test.d.ts +1 -0
- package/presentation/contentReviews/CmsContentReviewsPresenter.test.js +238 -0
- package/presentation/contentReviews/CmsContentReviewsPresenter.test.js.map +1 -0
- package/presentation/contentReviews/abstractions.d.ts +31 -0
- package/presentation/contentReviews/abstractions.js +5 -0
- package/presentation/contentReviews/abstractions.js.map +1 -0
- package/presentation/contentReviews/feature.d.ts +3 -0
- package/presentation/contentReviews/feature.js +17 -0
- package/presentation/contentReviews/feature.js.map +1 -0
- package/presentation/contentReviews/toContentTypes.d.ts +3 -0
- package/presentation/contentReviews/toContentTypes.js +14 -0
- package/presentation/contentReviews/toContentTypes.js.map +1 -0
- package/presentation/contentReviews/toContentTypes.test.d.ts +1 -0
- package/presentation/contentReviews/toContentTypes.test.js +20 -0
- package/presentation/contentReviews/toContentTypes.test.js.map +1 -0
- package/presentation/feature.d.ts +1 -0
- package/presentation/feature.js +19 -0
- package/presentation/feature.js.map +1 -0
- package/presentation/getCmsEntryReviewContext.d.ts +4 -0
- package/presentation/getCmsEntryReviewContext.js +12 -0
- package/presentation/getCmsEntryReviewContext.js.map +1 -0
- package/presentation/getCmsEntryReviewInitParams.d.ts +13 -0
- package/presentation/getCmsEntryReviewInitParams.js +18 -0
- package/presentation/getCmsEntryReviewInitParams.js.map +1 -0
- package/presentation/getCmsEntryReviewInitParams.test.d.ts +1 -0
- package/presentation/getCmsEntryReviewInitParams.test.js +69 -0
- package/presentation/getCmsEntryReviewInitParams.test.js.map +1 -0
- package/routes.d.ts +11 -0
- package/routes.js +21 -0
- package/routes.js.map +1 -0
- package/testing/createEntry.d.ts +3 -0
- package/testing/createEntry.js +22 -0
- package/testing/createEntry.js.map +1 -0
- package/testing/createEntrySession.d.ts +9 -0
- package/testing/createEntrySession.js +29 -0
- package/testing/createEntrySession.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/createFormVm.d.ts +2 -0
- package/testing/createFormVm.js +22 -0
- package/testing/createFormVm.js.map +1 -0
- package/testing/models.d.ts +4 -0
- package/testing/models.js +23 -0
- package/testing/models.js.map +1 -0
- package/testing/renderEditorTree.d.ts +17 -0
- package/testing/renderEditorTree.js +93 -0
- package/testing/renderEditorTree.js.map +1 -0
- package/testing/reviewStates.d.ts +17 -0
- package/testing/reviewStates.js +65 -0
- package/testing/reviewStates.js.map +1 -0
- package/types.d.ts +10 -0
- package/types.js +0 -0
- package/utils/appName.d.ts +4 -0
- package/utils/appName.js +13 -0
- package/utils/appName.js.map +1 -0
- package/utils/isReviewableModel.d.ts +2 -0
- package/utils/isReviewableModel.js +7 -0
- package/utils/isReviewableModel.js.map +1 -0
- package/utils/renderModelIcon.d.ts +3 -0
- package/utils/renderModelIcon.js +19 -0
- package/utils/renderModelIcon.js.map +1 -0
- package/utils/renderModelIconOrFallback.d.ts +3 -0
- package/utils/renderModelIconOrFallback.js +17 -0
- package/utils/renderModelIconOrFallback.js.map +1 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { Container } from "@webiny/di";
|
|
3
|
+
import { GraphQLOperationError } from "@webiny/app/errors/index.js";
|
|
4
|
+
import { Confirmation } from "@webiny/app-admin/features/confirmation/abstractions.js";
|
|
5
|
+
import { Notifications } from "@webiny/app-admin/features/notifications/abstractions.js";
|
|
6
|
+
import { PermanentlyDeleteEntryUseCase } from "@webiny/app-headless-cms/features/contentEntry/permanentlyDeleteEntry/abstractions.js";
|
|
7
|
+
import { ReviewErrorCode } from "@webiny/app-workflows/review/domain/ReviewErrorCode.js";
|
|
8
|
+
import { ActiveReviewBlockCollector } from "@webiny/app-workflows/review/trash/ActiveReviewBlockCollector/ActiveReviewBlockCollector.js";
|
|
9
|
+
import { ActiveReviewGuard } from "@webiny/app-workflows/review/trash/ActiveReviewGuard/ActiveReviewGuard.js";
|
|
10
|
+
import { createTrashUseCaseFakes } from "@webiny/app-workflows/review/testing/createTrashUseCaseFakes.js";
|
|
11
|
+
import { registerTrashUseCaseFakes } from "@webiny/app-workflows/review/testing/registerTrashUseCaseFakes.js";
|
|
12
|
+
import { PermanentlyDeleteEntryUseCaseReviewDecorator } from "./PermanentlyDeleteEntryUseCaseReviewDecorator.js";
|
|
13
|
+
const MODEL = {
|
|
14
|
+
modelId: "article",
|
|
15
|
+
singularApiName: "Article"
|
|
16
|
+
};
|
|
17
|
+
function createRefusal() {
|
|
18
|
+
return new GraphQLOperationError({
|
|
19
|
+
message: "This content has a review in progress.",
|
|
20
|
+
code: ReviewErrorCode.ActiveReviewOnTrash,
|
|
21
|
+
data: {
|
|
22
|
+
model: "cms.article",
|
|
23
|
+
action: "delete",
|
|
24
|
+
reviews: [
|
|
25
|
+
{
|
|
26
|
+
reviewId: "review-1",
|
|
27
|
+
model: "cms.article",
|
|
28
|
+
targetId: "entry-1",
|
|
29
|
+
targetRevisionId: "entry-1#0001",
|
|
30
|
+
title: "Launch article",
|
|
31
|
+
stepPosition: 1,
|
|
32
|
+
stepCount: 1,
|
|
33
|
+
stepName: "Editor"
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function setup(decision = "confirm") {
|
|
40
|
+
const confirm = vi.fn(async (_name, _params, execute)=>{
|
|
41
|
+
if ("dismiss" === decision) return false;
|
|
42
|
+
return execute ? execute(void 0) : void 0;
|
|
43
|
+
});
|
|
44
|
+
const decoratee = {
|
|
45
|
+
execute: vi.fn()
|
|
46
|
+
};
|
|
47
|
+
const useCases = createTrashUseCaseFakes();
|
|
48
|
+
const container = new Container();
|
|
49
|
+
container.registerInstance(Confirmation, {
|
|
50
|
+
confirm
|
|
51
|
+
});
|
|
52
|
+
container.registerInstance(Notifications, {
|
|
53
|
+
notify: vi.fn(),
|
|
54
|
+
success: vi.fn(),
|
|
55
|
+
warning: vi.fn()
|
|
56
|
+
});
|
|
57
|
+
container.register(ActiveReviewBlockCollector).inSingletonScope();
|
|
58
|
+
container.register(ActiveReviewGuard).inSingletonScope();
|
|
59
|
+
registerTrashUseCaseFakes(container, useCases);
|
|
60
|
+
container.registerInstance(PermanentlyDeleteEntryUseCase, decoratee);
|
|
61
|
+
container.registerDecorator(PermanentlyDeleteEntryUseCaseReviewDecorator);
|
|
62
|
+
return {
|
|
63
|
+
confirm,
|
|
64
|
+
decoratee,
|
|
65
|
+
useCases,
|
|
66
|
+
useCase: container.resolve(PermanentlyDeleteEntryUseCase)
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
describe("PermanentlyDeleteEntryUseCaseReviewDecorator", ()=>{
|
|
70
|
+
it("passes through to the decoratee when the delete succeeds", async ()=>{
|
|
71
|
+
const { confirm, decoratee, useCase } = setup();
|
|
72
|
+
decoratee.execute.mockResolvedValue(true);
|
|
73
|
+
const result = await useCase.execute({
|
|
74
|
+
model: MODEL,
|
|
75
|
+
id: "entry-1"
|
|
76
|
+
});
|
|
77
|
+
expect(result).toBe(true);
|
|
78
|
+
expect(decoratee.execute).toHaveBeenCalledWith({
|
|
79
|
+
model: MODEL,
|
|
80
|
+
id: "entry-1"
|
|
81
|
+
});
|
|
82
|
+
expect(confirm).not.toHaveBeenCalled();
|
|
83
|
+
});
|
|
84
|
+
it("on the server refusal cancels the whole entry (no revision id), then repeats the delete", async ()=>{
|
|
85
|
+
const { decoratee, useCases, useCase } = setup();
|
|
86
|
+
decoratee.execute.mockRejectedValueOnce(createRefusal()).mockResolvedValueOnce(true);
|
|
87
|
+
const result = await useCase.execute({
|
|
88
|
+
model: MODEL,
|
|
89
|
+
id: "entry-1"
|
|
90
|
+
});
|
|
91
|
+
expect(result).toBe(true);
|
|
92
|
+
expect(useCases.cancelReviewsForDelete.execute).toHaveBeenCalledWith({
|
|
93
|
+
namespace: "cms.article",
|
|
94
|
+
targetId: "entry-1",
|
|
95
|
+
targetRevisionId: null,
|
|
96
|
+
action: "delete"
|
|
97
|
+
});
|
|
98
|
+
expect(decoratee.execute).toHaveBeenCalledTimes(2);
|
|
99
|
+
});
|
|
100
|
+
it("resolves false when the warning is dismissed", async ()=>{
|
|
101
|
+
const { decoratee, useCases, useCase } = setup("dismiss");
|
|
102
|
+
decoratee.execute.mockRejectedValue(createRefusal());
|
|
103
|
+
const result = await useCase.execute({
|
|
104
|
+
model: MODEL,
|
|
105
|
+
id: "entry-1"
|
|
106
|
+
});
|
|
107
|
+
expect(result).toBe(false);
|
|
108
|
+
expect(useCases.cancelReviewsForDelete.execute).not.toHaveBeenCalled();
|
|
109
|
+
});
|
|
110
|
+
it("rethrows any other error unchanged", async ()=>{
|
|
111
|
+
const { decoratee, useCase } = setup();
|
|
112
|
+
const failure = new Error("Network down");
|
|
113
|
+
decoratee.execute.mockRejectedValue(failure);
|
|
114
|
+
const error = await useCase.execute({
|
|
115
|
+
model: MODEL,
|
|
116
|
+
id: "entry-1"
|
|
117
|
+
}).catch((e)=>e);
|
|
118
|
+
expect(error).toBe(failure);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
//# sourceMappingURL=PermanentlyDeleteEntryUseCaseReviewDecorator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.test.js","sources":["../../../src/features/trash/PermanentlyDeleteEntryUseCaseReviewDecorator.test.ts"],"sourcesContent":["import { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { vi } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { GraphQLOperationError } from \"@webiny/app/errors/index.js\";\nimport { Confirmation } from \"@webiny/app-admin/features/confirmation/abstractions.js\";\nimport { Notifications } from \"@webiny/app-admin/features/notifications/abstractions.js\";\nimport { PermanentlyDeleteEntryUseCase } from \"@webiny/app-headless-cms/features/contentEntry/permanentlyDeleteEntry/abstractions.js\";\nimport type { CmsModel } from \"@webiny/app-headless-cms/types.js\";\nimport { ReviewErrorCode } from \"@webiny/app-workflows/review/domain/ReviewErrorCode.js\";\nimport { ActiveReviewBlockCollector } from \"@webiny/app-workflows/review/trash/ActiveReviewBlockCollector/ActiveReviewBlockCollector.js\";\nimport { ActiveReviewGuard } from \"@webiny/app-workflows/review/trash/ActiveReviewGuard/ActiveReviewGuard.js\";\nimport { createTrashUseCaseFakes } from \"@webiny/app-workflows/review/testing/createTrashUseCaseFakes.js\";\nimport { registerTrashUseCaseFakes } from \"@webiny/app-workflows/review/testing/registerTrashUseCaseFakes.js\";\nimport { PermanentlyDeleteEntryUseCaseReviewDecorator } from \"./PermanentlyDeleteEntryUseCaseReviewDecorator.js\";\n\nconst MODEL = { modelId: \"article\", singularApiName: \"Article\" } as CmsModel;\n\nfunction createRefusal() {\n return new GraphQLOperationError({\n message: \"This content has a review in progress.\",\n code: ReviewErrorCode.ActiveReviewOnTrash,\n data: {\n model: \"cms.article\",\n action: \"delete\",\n reviews: [\n {\n reviewId: \"review-1\",\n model: \"cms.article\",\n targetId: \"entry-1\",\n targetRevisionId: \"entry-1#0001\",\n title: \"Launch article\",\n stepPosition: 1,\n stepCount: 1,\n stepName: \"Editor\"\n }\n ]\n }\n });\n}\n\nfunction setup(decision: \"confirm\" | \"dismiss\" = \"confirm\") {\n const confirm = vi.fn(\n async (_name: string, _params: unknown, execute?: (data: unknown) => Promise<unknown>) => {\n if (decision === \"dismiss\") {\n return false;\n }\n return execute ? execute(undefined) : undefined;\n }\n );\n const decoratee = { execute: vi.fn() };\n const useCases = createTrashUseCaseFakes();\n\n const container = new Container();\n container.registerInstance(Confirmation, { confirm } as unknown as Confirmation.Interface);\n container.registerInstance(Notifications, {\n notify: vi.fn(),\n success: vi.fn(),\n warning: vi.fn()\n } as unknown as Notifications.Interface);\n container.register(ActiveReviewBlockCollector).inSingletonScope();\n container.register(ActiveReviewGuard).inSingletonScope();\n registerTrashUseCaseFakes(container, useCases);\n container.registerInstance(PermanentlyDeleteEntryUseCase, decoratee);\n container.registerDecorator(PermanentlyDeleteEntryUseCaseReviewDecorator);\n\n return {\n confirm,\n decoratee,\n useCases,\n useCase: container.resolve(PermanentlyDeleteEntryUseCase)\n };\n}\n\ndescribe(\"PermanentlyDeleteEntryUseCaseReviewDecorator\", () => {\n it(\"passes through to the decoratee when the delete succeeds\", async () => {\n const { confirm, decoratee, useCase } = setup();\n decoratee.execute.mockResolvedValue(true);\n\n const result = await useCase.execute({ model: MODEL, id: \"entry-1\" });\n\n expect(result).toBe(true);\n expect(decoratee.execute).toHaveBeenCalledWith({ model: MODEL, id: \"entry-1\" });\n expect(confirm).not.toHaveBeenCalled();\n });\n\n it(\"on the server refusal cancels the whole entry (no revision id), then repeats the delete\", async () => {\n const { decoratee, useCases, useCase } = setup();\n decoratee.execute.mockRejectedValueOnce(createRefusal()).mockResolvedValueOnce(true);\n\n const result = await useCase.execute({ model: MODEL, id: \"entry-1\" });\n\n expect(result).toBe(true);\n expect(useCases.cancelReviewsForDelete.execute).toHaveBeenCalledWith({\n namespace: \"cms.article\",\n targetId: \"entry-1\",\n targetRevisionId: null,\n action: \"delete\"\n });\n expect(decoratee.execute).toHaveBeenCalledTimes(2);\n });\n\n it(\"resolves false when the warning is dismissed\", async () => {\n const { decoratee, useCases, useCase } = setup(\"dismiss\");\n decoratee.execute.mockRejectedValue(createRefusal());\n\n const result = await useCase.execute({ model: MODEL, id: \"entry-1\" });\n\n expect(result).toBe(false);\n expect(useCases.cancelReviewsForDelete.execute).not.toHaveBeenCalled();\n });\n\n it(\"rethrows any other error unchanged\", async () => {\n const { decoratee, useCase } = setup();\n const failure = new Error(\"Network down\");\n decoratee.execute.mockRejectedValue(failure);\n\n const error = await useCase.execute({ model: MODEL, id: \"entry-1\" }).catch(e => e);\n\n expect(error).toBe(failure);\n });\n});\n"],"names":["MODEL","createRefusal","GraphQLOperationError","ReviewErrorCode","setup","decision","confirm","vi","_name","_params","execute","undefined","decoratee","useCases","createTrashUseCaseFakes","container","Container","Confirmation","Notifications","ActiveReviewBlockCollector","ActiveReviewGuard","registerTrashUseCaseFakes","PermanentlyDeleteEntryUseCase","PermanentlyDeleteEntryUseCaseReviewDecorator","describe","it","useCase","result","expect","failure","Error","error","e"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const CmsReviewTrashFeature: import("@webiny/feature/admin").FeatureDefinition<any, []>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/admin";
|
|
2
|
+
import { DeleteEntryUseCaseReviewDecorator } from "./DeleteEntryUseCaseReviewDecorator.js";
|
|
3
|
+
import { DeleteEntryRevisionUseCaseReviewDecorator } from "./DeleteEntryRevisionUseCaseReviewDecorator.js";
|
|
4
|
+
import { PermanentlyDeleteEntryUseCaseReviewDecorator } from "./PermanentlyDeleteEntryUseCaseReviewDecorator.js";
|
|
5
|
+
import { BulkDeletePresenterReviewDecorator } from "./BulkDeletePresenterReviewDecorator.js";
|
|
6
|
+
const CmsReviewTrashFeature = createFeature({
|
|
7
|
+
name: "CmsWorkflows/Trash",
|
|
8
|
+
register (container) {
|
|
9
|
+
container.registerDecorator(DeleteEntryUseCaseReviewDecorator);
|
|
10
|
+
container.registerDecorator(DeleteEntryRevisionUseCaseReviewDecorator);
|
|
11
|
+
container.registerDecorator(PermanentlyDeleteEntryUseCaseReviewDecorator);
|
|
12
|
+
container.registerDecorator(BulkDeletePresenterReviewDecorator);
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
export { CmsReviewTrashFeature };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/trash/feature.js","sources":["../../../src/features/trash/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport { DeleteEntryUseCaseReviewDecorator } from \"./DeleteEntryUseCaseReviewDecorator.js\";\nimport { DeleteEntryRevisionUseCaseReviewDecorator } from \"./DeleteEntryRevisionUseCaseReviewDecorator.js\";\nimport { PermanentlyDeleteEntryUseCaseReviewDecorator } from \"./PermanentlyDeleteEntryUseCaseReviewDecorator.js\";\nimport { BulkDeletePresenterReviewDecorator } from \"./BulkDeletePresenterReviewDecorator.js\";\n\nexport const CmsReviewTrashFeature = createFeature({\n name: \"CmsWorkflows/Trash\",\n register(container) {\n container.registerDecorator(DeleteEntryUseCaseReviewDecorator);\n container.registerDecorator(DeleteEntryRevisionUseCaseReviewDecorator);\n container.registerDecorator(PermanentlyDeleteEntryUseCaseReviewDecorator);\n container.registerDecorator(BulkDeletePresenterReviewDecorator);\n }\n});\n"],"names":["CmsReviewTrashFeature","createFeature","container","DeleteEntryUseCaseReviewDecorator","DeleteEntryRevisionUseCaseReviewDecorator","PermanentlyDeleteEntryUseCaseReviewDecorator","BulkDeletePresenterReviewDecorator"],"mappings":";;;;;AAMO,MAAMA,wBAAwBC,cAAc;IAC/C,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,iBAAiB,CAACC;QAC5BD,UAAU,iBAAiB,CAACE;QAC5BF,UAAU,iBAAiB,CAACG;QAC5BH,UAAU,iBAAiB,CAACI;IAChC;AACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { describe, expect, it, vi } from "vitest";
|
|
3
|
+
import { render } from "@testing-library/react";
|
|
4
|
+
import { Container } from "@webiny/di";
|
|
5
|
+
import { DiContainerProvider } from "@webiny/app/shared/di/DiContainerProvider.js";
|
|
6
|
+
import { MainGraphQLClient } from "@webiny/app/features/mainGraphQLClient/abstractions.js";
|
|
7
|
+
import { FeatureFlagsService } from "@webiny/app-admin/features/featureFlags/abstractions.js";
|
|
8
|
+
import { FeatureFlags } from "@webiny/feature-flags";
|
|
9
|
+
import { DeleteEntryUseCase } from "@webiny/app-headless-cms/features/contentEntry/deleteEntry/abstractions.js";
|
|
10
|
+
import { DeleteEntryRevisionUseCase } from "@webiny/app-headless-cms/features/contentEntry/deleteEntryRevision/abstractions.js";
|
|
11
|
+
import { PermanentlyDeleteEntryUseCase } from "@webiny/app-headless-cms/features/contentEntry/permanentlyDeleteEntry/abstractions.js";
|
|
12
|
+
import { BulkDeletePresenter } from "@webiny/app-headless-cms/presentation/contentEntries/bulkActions/abstractions.js";
|
|
13
|
+
import { ActiveReviewGuard } from "@webiny/app-workflows/review/trash/ActiveReviewGuard/abstractions.js";
|
|
14
|
+
import { createTrashUseCaseFakes } from "@webiny/app-workflows/review/testing/createTrashUseCaseFakes.js";
|
|
15
|
+
import { registerTrashUseCaseFakes } from "@webiny/app-workflows/review/testing/registerTrashUseCaseFakes.js";
|
|
16
|
+
import { CmsModelContext } from "@webiny/app-headless-cms/features/contentEntry/abstractions.js";
|
|
17
|
+
import { Notifications } from "@webiny/app-admin/features/notifications/abstractions.js";
|
|
18
|
+
import { CmsWorkflows } from "../../index.js";
|
|
19
|
+
import { CmsReviewTrashFeature } from "./feature.js";
|
|
20
|
+
vi.mock("~/Components/CmsEntriesList/CmsReviewMoveEntryAction.js", ()=>({
|
|
21
|
+
CmsReviewMoveEntryAction: ()=>null
|
|
22
|
+
}));
|
|
23
|
+
vi.mock("~/Components/CmsEntriesList/CmsReviewScheduleEntryAction.js", ()=>({
|
|
24
|
+
CmsReviewScheduleEntryAction: ()=>null
|
|
25
|
+
}));
|
|
26
|
+
vi.mock("~/Components/ModelDelete/ModelDeleteWorkflowError.js", ()=>({
|
|
27
|
+
ModelDeleteWorkflowError: ()=>null
|
|
28
|
+
}));
|
|
29
|
+
vi.mock("~/Routes/index.js", ()=>({
|
|
30
|
+
CmsWorkflowEditor: ()=>null
|
|
31
|
+
}));
|
|
32
|
+
vi.mock("~/Components/ContentEntryForm/index.js", ()=>({
|
|
33
|
+
CmsEntryReviewBar: ()=>null,
|
|
34
|
+
CmsEntryReviewBlockedActions: ()=>null,
|
|
35
|
+
CmsEntryReviewFormLock: ()=>null,
|
|
36
|
+
CmsEntryReviewNewRevision: ()=>null,
|
|
37
|
+
CmsEntryReviewScheduleMenuItem: ()=>null
|
|
38
|
+
}));
|
|
39
|
+
vi.mock("~/Components/ContentReviews/CmsContentReviews.js", ()=>({
|
|
40
|
+
CmsContentReviews: ()=>/*#__PURE__*/ react.createElement("div", {
|
|
41
|
+
"data-testid": "cms-content-reviews"
|
|
42
|
+
})
|
|
43
|
+
}));
|
|
44
|
+
vi.mock("~/Components/ContentReviews/CmsContentReviewsSidebarItem.js", ()=>({
|
|
45
|
+
CmsContentReviewsSidebarItem: ()=>/*#__PURE__*/ react.createElement("div", {
|
|
46
|
+
"data-testid": "cms-content-reviews-sidebar"
|
|
47
|
+
})
|
|
48
|
+
}));
|
|
49
|
+
vi.mock("~/presentation/feature.js", ()=>({
|
|
50
|
+
CmsWorkflowsFeature: {
|
|
51
|
+
name: "Mock",
|
|
52
|
+
register: ()=>void 0,
|
|
53
|
+
resolve: ()=>void 0
|
|
54
|
+
}
|
|
55
|
+
}));
|
|
56
|
+
vi.mock("~/features/feature.js", ()=>({
|
|
57
|
+
CmsWorkflowsCacheFeature: {
|
|
58
|
+
name: "Mock",
|
|
59
|
+
register: ()=>void 0,
|
|
60
|
+
resolve: ()=>void 0
|
|
61
|
+
}
|
|
62
|
+
}));
|
|
63
|
+
const MODEL = {
|
|
64
|
+
modelId: "article",
|
|
65
|
+
singularApiName: "Article"
|
|
66
|
+
};
|
|
67
|
+
describe("CmsWorkflows (composition root)", ()=>{
|
|
68
|
+
const createContainer = (isEnabled)=>{
|
|
69
|
+
const flagsService = {
|
|
70
|
+
getFlags: ()=>new FeatureFlags({
|
|
71
|
+
advancedPublishingWorkflow: isEnabled
|
|
72
|
+
}),
|
|
73
|
+
isLoaded: ()=>true,
|
|
74
|
+
loadFlags: async ()=>void 0
|
|
75
|
+
};
|
|
76
|
+
const guard = {
|
|
77
|
+
run: vi.fn(async (params)=>params.action()),
|
|
78
|
+
runBulk: vi.fn()
|
|
79
|
+
};
|
|
80
|
+
const decoratee = {
|
|
81
|
+
execute: vi.fn(async ()=>true)
|
|
82
|
+
};
|
|
83
|
+
const container = new Container();
|
|
84
|
+
container.registerInstance(FeatureFlagsService, flagsService);
|
|
85
|
+
container.registerInstance(MainGraphQLClient, {
|
|
86
|
+
execute: vi.fn()
|
|
87
|
+
});
|
|
88
|
+
container.registerInstance(ActiveReviewGuard, guard);
|
|
89
|
+
container.registerInstance(DeleteEntryUseCase, decoratee);
|
|
90
|
+
return {
|
|
91
|
+
container,
|
|
92
|
+
guard,
|
|
93
|
+
decoratee
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
it("wraps the delete use case with the review guard when the flag is on", async ()=>{
|
|
97
|
+
const { container, guard, decoratee } = createContainer(true);
|
|
98
|
+
render(/*#__PURE__*/ react.createElement(DiContainerProvider, {
|
|
99
|
+
container: container
|
|
100
|
+
}, /*#__PURE__*/ react.createElement(CmsWorkflows, null)));
|
|
101
|
+
await container.resolve(DeleteEntryUseCase).execute({
|
|
102
|
+
model: MODEL,
|
|
103
|
+
id: "entry-1"
|
|
104
|
+
});
|
|
105
|
+
expect(guard.run).toHaveBeenCalledTimes(1);
|
|
106
|
+
expect(decoratee.execute).toHaveBeenCalledTimes(1);
|
|
107
|
+
});
|
|
108
|
+
it("leaves the delete use case unwrapped when the flag is off", async ()=>{
|
|
109
|
+
const { container, guard, decoratee } = createContainer(false);
|
|
110
|
+
render(/*#__PURE__*/ react.createElement(DiContainerProvider, {
|
|
111
|
+
container: container
|
|
112
|
+
}, /*#__PURE__*/ react.createElement(CmsWorkflows, null)));
|
|
113
|
+
await container.resolve(DeleteEntryUseCase).execute({
|
|
114
|
+
model: MODEL,
|
|
115
|
+
id: "entry-1"
|
|
116
|
+
});
|
|
117
|
+
expect(guard.run).not.toHaveBeenCalled();
|
|
118
|
+
expect(decoratee.execute).toHaveBeenCalledTimes(1);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
describe("CmsReviewTrashFeature", ()=>{
|
|
122
|
+
function setup() {
|
|
123
|
+
const guard = {
|
|
124
|
+
run: vi.fn(async (params)=>params.action()),
|
|
125
|
+
runBulk: vi.fn(async (params)=>params.run(params.items, false)),
|
|
126
|
+
confirmBlocking: vi.fn()
|
|
127
|
+
};
|
|
128
|
+
const useCases = createTrashUseCaseFakes();
|
|
129
|
+
const container = new Container();
|
|
130
|
+
container.registerInstance(Notifications, {
|
|
131
|
+
error: vi.fn()
|
|
132
|
+
});
|
|
133
|
+
container.registerInstance(CmsModelContext, {
|
|
134
|
+
getModel: ()=>MODEL,
|
|
135
|
+
setModel: vi.fn()
|
|
136
|
+
});
|
|
137
|
+
container.registerInstance(ActiveReviewGuard, guard);
|
|
138
|
+
registerTrashUseCaseFakes(container, useCases);
|
|
139
|
+
container.registerInstance(DeleteEntryUseCase, {
|
|
140
|
+
execute: vi.fn(async ()=>true)
|
|
141
|
+
});
|
|
142
|
+
container.registerInstance(DeleteEntryRevisionUseCase, {
|
|
143
|
+
execute: vi.fn(async ()=>true)
|
|
144
|
+
});
|
|
145
|
+
container.registerInstance(PermanentlyDeleteEntryUseCase, {
|
|
146
|
+
execute: vi.fn(async ()=>true)
|
|
147
|
+
});
|
|
148
|
+
const bulkDecoratee = {
|
|
149
|
+
vm: {
|
|
150
|
+
processing: false,
|
|
151
|
+
results: []
|
|
152
|
+
},
|
|
153
|
+
execute: vi.fn(async (_items, _allSelected)=>true)
|
|
154
|
+
};
|
|
155
|
+
container.registerInstance(BulkDeletePresenter, bulkDecoratee);
|
|
156
|
+
CmsReviewTrashFeature.register(container);
|
|
157
|
+
return {
|
|
158
|
+
container,
|
|
159
|
+
guard,
|
|
160
|
+
useCases,
|
|
161
|
+
bulkDecoratee
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
it("decorates the three delete use cases and the bulk presenter", async ()=>{
|
|
165
|
+
const { container, guard } = setup();
|
|
166
|
+
await container.resolve(DeleteEntryUseCase).execute({
|
|
167
|
+
model: MODEL,
|
|
168
|
+
id: "entry-1"
|
|
169
|
+
});
|
|
170
|
+
await container.resolve(DeleteEntryRevisionUseCase).execute({
|
|
171
|
+
model: MODEL,
|
|
172
|
+
revisionId: "entry-1#0002"
|
|
173
|
+
});
|
|
174
|
+
await container.resolve(PermanentlyDeleteEntryUseCase).execute({
|
|
175
|
+
model: MODEL,
|
|
176
|
+
id: "entry-1"
|
|
177
|
+
});
|
|
178
|
+
await container.resolve(BulkDeletePresenter).execute([
|
|
179
|
+
{
|
|
180
|
+
id: "e1#0001",
|
|
181
|
+
entryId: "e1"
|
|
182
|
+
}
|
|
183
|
+
], false);
|
|
184
|
+
expect(guard.run).toHaveBeenCalledTimes(3);
|
|
185
|
+
expect(guard.run.mock.calls.map((call)=>call[0].revisionId)).toEqual([
|
|
186
|
+
null,
|
|
187
|
+
"entry-1#0002",
|
|
188
|
+
null
|
|
189
|
+
]);
|
|
190
|
+
expect(guard.run.mock.calls.every((call)=>!("useCases" in call[0]))).toBe(true);
|
|
191
|
+
expect(guard.runBulk).toHaveBeenCalledTimes(1);
|
|
192
|
+
});
|
|
193
|
+
it("checks the loaded rows for reviews in progress before the bulk task, through the decorated presenter", async ()=>{
|
|
194
|
+
const { container, guard, useCases, bulkDecoratee } = setup();
|
|
195
|
+
const rows = [
|
|
196
|
+
{
|
|
197
|
+
id: "e1#0001",
|
|
198
|
+
entryId: "e1"
|
|
199
|
+
}
|
|
200
|
+
];
|
|
201
|
+
await container.resolve(BulkDeletePresenter).execute(rows, true);
|
|
202
|
+
expect(useCases.listBlockingReviews.execute).toHaveBeenCalledWith({
|
|
203
|
+
namespace: "cms.article",
|
|
204
|
+
targetIds: [
|
|
205
|
+
"e1"
|
|
206
|
+
]
|
|
207
|
+
});
|
|
208
|
+
expect(guard.runBulk).not.toHaveBeenCalled();
|
|
209
|
+
expect(bulkDecoratee.execute).toHaveBeenCalledWith(rows, true);
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
//# sourceMappingURL=feature.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/trash/feature.test.js","sources":["../../../src/features/trash/feature.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 { Container } from \"@webiny/di\";\nimport { DiContainerProvider } from \"@webiny/app/shared/di/DiContainerProvider.js\";\nimport { MainGraphQLClient } from \"@webiny/app/features/mainGraphQLClient/abstractions.js\";\nimport { FeatureFlagsService } from \"@webiny/app-admin/features/featureFlags/abstractions.js\";\nimport { FeatureFlags } from \"@webiny/feature-flags\";\nimport { DeleteEntryUseCase } from \"@webiny/app-headless-cms/features/contentEntry/deleteEntry/abstractions.js\";\nimport { DeleteEntryRevisionUseCase } from \"@webiny/app-headless-cms/features/contentEntry/deleteEntryRevision/abstractions.js\";\nimport { PermanentlyDeleteEntryUseCase } from \"@webiny/app-headless-cms/features/contentEntry/permanentlyDeleteEntry/abstractions.js\";\nimport { BulkDeletePresenter } from \"@webiny/app-headless-cms/presentation/contentEntries/bulkActions/abstractions.js\";\nimport type { CmsContentEntry } from \"@webiny/app-headless-cms/types.js\";\nimport type { CmsModel } from \"@webiny/app-headless-cms/types.js\";\nimport { ActiveReviewGuard } from \"@webiny/app-workflows/review/trash/ActiveReviewGuard/abstractions.js\";\nimport { createTrashUseCaseFakes } from \"@webiny/app-workflows/review/testing/createTrashUseCaseFakes.js\";\nimport { registerTrashUseCaseFakes } from \"@webiny/app-workflows/review/testing/registerTrashUseCaseFakes.js\";\nimport { CmsModelContext } from \"@webiny/app-headless-cms/features/contentEntry/abstractions.js\";\nimport { Notifications } from \"@webiny/app-admin/features/notifications/abstractions.js\";\nimport { CmsWorkflows } from \"~/index.js\";\nimport { CmsReviewTrashFeature } from \"./feature.js\";\n\n// The composition root also mounts the other CMS workflow features; they are stubbed as in `src/index.test.tsx`.\nvi.mock(\"~/Components/CmsEntriesList/CmsReviewMoveEntryAction.js\", () => {\n return { CmsReviewMoveEntryAction: () => null };\n});\n\nvi.mock(\"~/Components/CmsEntriesList/CmsReviewScheduleEntryAction.js\", () => {\n return { CmsReviewScheduleEntryAction: () => null };\n});\n\nvi.mock(\"~/Components/ModelDelete/ModelDeleteWorkflowError.js\", () => {\n return { ModelDeleteWorkflowError: () => null };\n});\n\nvi.mock(\"~/Routes/index.js\", () => {\n return { CmsWorkflowEditor: () => null };\n});\n\nvi.mock(\"~/Components/ContentEntryForm/index.js\", () => {\n return {\n CmsEntryReviewBar: () => null,\n CmsEntryReviewBlockedActions: () => null,\n CmsEntryReviewFormLock: () => null,\n CmsEntryReviewNewRevision: () => null,\n CmsEntryReviewScheduleMenuItem: () => null\n };\n});\n\nvi.mock(\"~/Components/ContentReviews/CmsContentReviews.js\", () => {\n return { CmsContentReviews: () => <div data-testid=\"cms-content-reviews\" /> };\n});\n\nvi.mock(\"~/Components/ContentReviews/CmsContentReviewsSidebarItem.js\", () => {\n return {\n CmsContentReviewsSidebarItem: () => <div data-testid=\"cms-content-reviews-sidebar\" />\n };\n});\n\nvi.mock(\"~/presentation/feature.js\", () => {\n return {\n CmsWorkflowsFeature: { name: \"Mock\", register: () => undefined, resolve: () => undefined }\n };\n});\n\nvi.mock(\"~/features/feature.js\", () => {\n return {\n CmsWorkflowsCacheFeature: {\n name: \"Mock\",\n register: () => undefined,\n resolve: () => undefined\n }\n };\n});\n\nconst MODEL = { modelId: \"article\", singularApiName: \"Article\" } as CmsModel;\n\ndescribe(\"CmsWorkflows (composition root)\", () => {\n const createContainer = (isEnabled: boolean) => {\n const flagsService: FeatureFlagsService.Interface = {\n getFlags: () => new FeatureFlags({ advancedPublishingWorkflow: isEnabled }),\n isLoaded: () => true,\n loadFlags: async () => undefined\n };\n const guard = {\n run: vi.fn(async <TResult,>(params: ActiveReviewGuard.Params<TResult>) =>\n params.action()\n ),\n runBulk: vi.fn()\n };\n const decoratee = { execute: vi.fn(async () => true) };\n const container = new Container();\n container.registerInstance(FeatureFlagsService, flagsService);\n container.registerInstance(MainGraphQLClient, { execute: vi.fn() });\n container.registerInstance(\n ActiveReviewGuard,\n guard as unknown as ActiveReviewGuard.Interface\n );\n container.registerInstance(DeleteEntryUseCase, decoratee);\n return { container, guard, decoratee };\n };\n\n it(\"wraps the delete use case with the review guard when the flag is on\", async () => {\n const { container, guard, decoratee } = createContainer(true);\n\n render(\n <DiContainerProvider container={container}>\n <CmsWorkflows />\n </DiContainerProvider>\n );\n\n await container.resolve(DeleteEntryUseCase).execute({ model: MODEL, id: \"entry-1\" });\n\n expect(guard.run).toHaveBeenCalledTimes(1);\n expect(decoratee.execute).toHaveBeenCalledTimes(1);\n });\n\n it(\"leaves the delete use case unwrapped when the flag is off\", async () => {\n const { container, guard, decoratee } = createContainer(false);\n\n render(\n <DiContainerProvider container={container}>\n <CmsWorkflows />\n </DiContainerProvider>\n );\n\n await container.resolve(DeleteEntryUseCase).execute({ model: MODEL, id: \"entry-1\" });\n\n expect(guard.run).not.toHaveBeenCalled();\n expect(decoratee.execute).toHaveBeenCalledTimes(1);\n });\n});\n\ndescribe(\"CmsReviewTrashFeature\", () => {\n function setup() {\n const guard = {\n run: vi.fn(async <TResult,>(params: ActiveReviewGuard.Params<TResult>) =>\n params.action()\n ),\n runBulk: vi.fn(async <TItem,>(params: ActiveReviewGuard.BulkParams<TItem>) =>\n params.run(params.items, false)\n ),\n confirmBlocking: vi.fn()\n };\n const useCases = createTrashUseCaseFakes();\n const container = new Container();\n container.registerInstance(Notifications, {\n error: vi.fn()\n } as unknown as Notifications.Interface);\n container.registerInstance(CmsModelContext, { getModel: () => MODEL, setModel: vi.fn() });\n container.registerInstance(\n ActiveReviewGuard,\n guard as unknown as ActiveReviewGuard.Interface\n );\n registerTrashUseCaseFakes(container, useCases);\n container.registerInstance(DeleteEntryUseCase, { execute: vi.fn(async () => true) });\n container.registerInstance(DeleteEntryRevisionUseCase, {\n execute: vi.fn(async () => true)\n });\n container.registerInstance(PermanentlyDeleteEntryUseCase, {\n execute: vi.fn(async () => true)\n });\n const bulkDecoratee = {\n vm: { processing: false, results: [] },\n execute: vi.fn(async (_items: CmsContentEntry[], _allSelected: boolean) => true)\n };\n container.registerInstance(BulkDeletePresenter, bulkDecoratee);\n CmsReviewTrashFeature.register(container);\n return { container, guard, useCases, bulkDecoratee };\n }\n\n it(\"decorates the three delete use cases and the bulk presenter\", async () => {\n const { container, guard } = setup();\n\n await container.resolve(DeleteEntryUseCase).execute({ model: MODEL, id: \"entry-1\" });\n await container\n .resolve(DeleteEntryRevisionUseCase)\n .execute({ model: MODEL, revisionId: \"entry-1#0002\" });\n await container\n .resolve(PermanentlyDeleteEntryUseCase)\n .execute({ model: MODEL, id: \"entry-1\" });\n await container\n .resolve(BulkDeletePresenter)\n .execute([{ id: \"e1#0001\", entryId: \"e1\" } as CmsContentEntry], false);\n\n expect(guard.run).toHaveBeenCalledTimes(3);\n expect(guard.run.mock.calls.map(call => call[0].revisionId)).toEqual([\n null,\n \"entry-1#0002\",\n null\n ]);\n expect(guard.run.mock.calls.every(call => !(\"useCases\" in call[0]))).toBe(true);\n expect(guard.runBulk).toHaveBeenCalledTimes(1);\n });\n\n it(\"checks the loaded rows for reviews in progress before the bulk task, through the decorated presenter\", async () => {\n const { container, guard, useCases, bulkDecoratee } = setup();\n const rows = [{ id: \"e1#0001\", entryId: \"e1\" } as CmsContentEntry];\n\n await container.resolve(BulkDeletePresenter).execute(rows, true);\n\n expect(useCases.listBlockingReviews.execute).toHaveBeenCalledWith({\n namespace: \"cms.article\",\n targetIds: [\"e1\"]\n });\n expect(guard.runBulk).not.toHaveBeenCalled();\n expect(bulkDecoratee.execute).toHaveBeenCalledWith(rows, true);\n });\n});\n"],"names":["vi","undefined","MODEL","describe","createContainer","isEnabled","flagsService","FeatureFlags","guard","params","decoratee","container","Container","FeatureFlagsService","MainGraphQLClient","ActiveReviewGuard","DeleteEntryUseCase","it","render","DiContainerProvider","CmsWorkflows","expect","setup","useCases","createTrashUseCaseFakes","Notifications","CmsModelContext","registerTrashUseCaseFakes","DeleteEntryRevisionUseCase","PermanentlyDeleteEntryUseCase","bulkDecoratee","_items","_allSelected","BulkDeletePresenter","CmsReviewTrashFeature","call","rows"],"mappings":"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"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
3
|
+
import { render, screen, waitFor } from "@testing-library/react";
|
|
4
|
+
import { Container } from "@webiny/di";
|
|
5
|
+
import { CompositionProvider } from "@webiny/react-composition";
|
|
6
|
+
import { DiContainerProvider } from "@webiny/app/shared/di/DiContainerProvider.js";
|
|
7
|
+
import { FeatureFlagsService } from "@webiny/app-admin/features/featureFlags/abstractions.js";
|
|
8
|
+
import { FeatureFlags } from "@webiny/feature-flags";
|
|
9
|
+
import { AdminUiProvider } from "@webiny/admin-ui";
|
|
10
|
+
import { ModelContext } from "@webiny/app-headless-cms/admin/components/ModelProvider/index.js";
|
|
11
|
+
import { ContentEntryEditorConfig, ContentEntryEditorWithConfig, useContentEntryEditorConfig } from "@webiny/app-headless-cms/admin/config/contentEntries/index.js";
|
|
12
|
+
import { ContentEntryFormPresenter } from "@webiny/app-headless-cms/presentation/contentEntries/form/abstractions.js";
|
|
13
|
+
import { ContentEntryForm, ContentEntryFormContent } from "@webiny/app-headless-cms/presentation/contentEntries/views/layout/index.js";
|
|
14
|
+
import { TargetReviewPresenter } from "@webiny/app-workflows/review/presentation/targetReview/abstractions.js";
|
|
15
|
+
import { createFakePresenter } from "@webiny/app-workflows/review/testing/fakeTargetReviewPresenter.js";
|
|
16
|
+
import { createTargetReviewViewModel } from "@webiny/app-workflows/review/testing/createTargetReviewViewModel.js";
|
|
17
|
+
import { CmsEntryReview } from "./features/editorReview/abstractions.js";
|
|
18
|
+
import { CmsWorkflows } from "./index.js";
|
|
19
|
+
import { createEntry } from "./testing/createEntry.js";
|
|
20
|
+
import { createFormVm } from "./testing/createFormVm.js";
|
|
21
|
+
import { MODEL } from "./testing/models.js";
|
|
22
|
+
import { LOADING } from "./testing/reviewStates.js";
|
|
23
|
+
vi.mock("@webiny/app-workflows/review/editor/components/EditorReviewBar.js", async ()=>{
|
|
24
|
+
const React = await import("react");
|
|
25
|
+
return {
|
|
26
|
+
EditorReviewBar: ()=>React.createElement("div", {
|
|
27
|
+
"data-testid": "editor-review-bar"
|
|
28
|
+
})
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
vi.mock("~/Routes/index.js", ()=>({
|
|
32
|
+
CmsWorkflowEditor: ()=>null
|
|
33
|
+
}));
|
|
34
|
+
vi.mock("~/Components/ContentReviews/CmsContentReviews.js", ()=>({
|
|
35
|
+
CmsContentReviews: ()=>null
|
|
36
|
+
}));
|
|
37
|
+
vi.mock("~/Components/ContentReviews/CmsContentReviewsSidebarItem.js", ()=>({
|
|
38
|
+
CmsContentReviewsSidebarItem: ()=>null
|
|
39
|
+
}));
|
|
40
|
+
class FakeBasePresenter {
|
|
41
|
+
get vm() {
|
|
42
|
+
return createFormVm({
|
|
43
|
+
entry: createEntry(),
|
|
44
|
+
model: MODEL
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
async loadRevision() {}
|
|
48
|
+
async saveRevision() {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
async publishRevision() {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
async unpublishRevision() {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
async deleteEntry() {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
setFolderId() {}
|
|
61
|
+
newEntry() {}
|
|
62
|
+
patchEntryMeta() {}
|
|
63
|
+
reset() {}
|
|
64
|
+
}
|
|
65
|
+
const BasePresenter = ContentEntryFormPresenter.createImplementation({
|
|
66
|
+
implementation: FakeBasePresenter,
|
|
67
|
+
dependencies: []
|
|
68
|
+
});
|
|
69
|
+
const ActionsProbe = ()=>{
|
|
70
|
+
const { buttonActions, menuItemActions } = useContentEntryEditorConfig();
|
|
71
|
+
const names = [
|
|
72
|
+
...buttonActions,
|
|
73
|
+
...menuItemActions
|
|
74
|
+
].map((action)=>action.name);
|
|
75
|
+
const scheduleActions = menuItemActions.filter((action)=>"schedule" === action.name);
|
|
76
|
+
return /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement("div", {
|
|
77
|
+
"data-testid": "action-names"
|
|
78
|
+
}, names.join(",")), scheduleActions.map((action)=>/*#__PURE__*/ react.createElement("span", {
|
|
79
|
+
key: action.name
|
|
80
|
+
}, action.element)));
|
|
81
|
+
};
|
|
82
|
+
function mountRoot(isEnabled) {
|
|
83
|
+
const flagsService = {
|
|
84
|
+
getFlags: ()=>new FeatureFlags({
|
|
85
|
+
advancedPublishingWorkflow: isEnabled
|
|
86
|
+
}),
|
|
87
|
+
isLoaded: ()=>true,
|
|
88
|
+
loadFlags: async ()=>void 0
|
|
89
|
+
};
|
|
90
|
+
const container = new Container();
|
|
91
|
+
const presenter = createFakePresenter(createTargetReviewViewModel(LOADING));
|
|
92
|
+
container.registerInstance(FeatureFlagsService, flagsService);
|
|
93
|
+
container.registerInstance(TargetReviewPresenter, presenter);
|
|
94
|
+
container.register(BasePresenter).inSingletonScope();
|
|
95
|
+
render(/*#__PURE__*/ react.createElement(AdminUiProvider, null, /*#__PURE__*/ react.createElement(CompositionProvider, null, /*#__PURE__*/ react.createElement(DiContainerProvider, {
|
|
96
|
+
container: container
|
|
97
|
+
}, /*#__PURE__*/ react.createElement(ModelContext.Provider, {
|
|
98
|
+
value: MODEL
|
|
99
|
+
}, /*#__PURE__*/ react.createElement(CmsWorkflows, null), /*#__PURE__*/ react.createElement(ContentEntryEditorConfig, null, /*#__PURE__*/ react.createElement(ContentEntryEditorConfig.Width, {
|
|
100
|
+
value: "1020px"
|
|
101
|
+
}), /*#__PURE__*/ react.createElement(ContentEntryEditorConfig.Actions.MenuItemAction, {
|
|
102
|
+
name: "schedule",
|
|
103
|
+
element: /*#__PURE__*/ react.createElement("span", {
|
|
104
|
+
"data-testid": "schedule-item"
|
|
105
|
+
})
|
|
106
|
+
})), /*#__PURE__*/ react.createElement(ContentEntryEditorWithConfig, null, /*#__PURE__*/ react.createElement(ActionsProbe, null), /*#__PURE__*/ react.createElement(ContentEntryForm, null), /*#__PURE__*/ react.createElement(ContentEntryFormContent, null, /*#__PURE__*/ react.createElement("div", {
|
|
107
|
+
"data-testid": "original"
|
|
108
|
+
}))))))));
|
|
109
|
+
return {
|
|
110
|
+
container,
|
|
111
|
+
presenter
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
describe("CmsWorkflows editor wiring", ()=>{
|
|
115
|
+
beforeEach(()=>{
|
|
116
|
+
vi.clearAllMocks();
|
|
117
|
+
});
|
|
118
|
+
it("registers the session, the bar, the actions and the presenter decorator with the flag on", async ()=>{
|
|
119
|
+
const { container, presenter } = mountRoot(true);
|
|
120
|
+
const session = container.resolve(CmsEntryReview);
|
|
121
|
+
expect(session.presenter).toBe(presenter);
|
|
122
|
+
expect(await screen.findAllByTestId("editor-review-bar")).toHaveLength(1);
|
|
123
|
+
const names = (await screen.findByTestId("action-names")).textContent ?? "";
|
|
124
|
+
expect(names).toContain("workflowBlockedActions");
|
|
125
|
+
expect(names).toContain("createNewRevision");
|
|
126
|
+
expect(names).not.toContain("workflowStateTooltip");
|
|
127
|
+
await waitFor(()=>expect(document.querySelector("fieldset[disabled]")).not.toBeNull());
|
|
128
|
+
await waitFor(()=>expect(screen.queryByTestId("schedule-item")).toBeNull());
|
|
129
|
+
const form = container.resolve(ContentEntryFormPresenter);
|
|
130
|
+
await form.loadRevision("entry-1#0001");
|
|
131
|
+
expect(presenter.init).toHaveBeenCalledTimes(1);
|
|
132
|
+
});
|
|
133
|
+
it("registers nothing with the flag off", async ()=>{
|
|
134
|
+
const { container, presenter } = mountRoot(false);
|
|
135
|
+
expect(()=>container.resolve(CmsEntryReview)).toThrow("No registration found");
|
|
136
|
+
expect(await screen.findByTestId("original")).toBeTruthy();
|
|
137
|
+
await waitFor(()=>expect(screen.queryByTestId("editor-review-bar")).toBeNull());
|
|
138
|
+
const names = (await screen.findByTestId("action-names")).textContent ?? "";
|
|
139
|
+
expect(names).not.toContain("workflowBlockedActions");
|
|
140
|
+
expect(names).not.toContain("createNewRevision");
|
|
141
|
+
expect(await screen.findByTestId("schedule-item")).toBeTruthy();
|
|
142
|
+
expect(document.querySelector("fieldset")).toBeNull();
|
|
143
|
+
const form = container.resolve(ContentEntryFormPresenter);
|
|
144
|
+
await form.loadRevision("entry-1#0001");
|
|
145
|
+
expect(presenter.init).not.toHaveBeenCalled();
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
//# sourceMappingURL=index.editor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.editor.test.js","sources":["../src/index.editor.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 { render } from \"@testing-library/react\";\nimport { screen } from \"@testing-library/react\";\nimport { waitFor } from \"@testing-library/react\";\nimport { Container } from \"@webiny/di\";\nimport { CompositionProvider } from \"@webiny/react-composition\";\nimport { DiContainerProvider } from \"@webiny/app/shared/di/DiContainerProvider.js\";\nimport { FeatureFlagsService } from \"@webiny/app-admin/features/featureFlags/abstractions.js\";\nimport { FeatureFlags } from \"@webiny/feature-flags\";\nimport { AdminUiProvider } from \"@webiny/admin-ui\";\nimport { ModelContext } from \"@webiny/app-headless-cms/admin/components/ModelProvider/index.js\";\nimport { ContentEntryEditorConfig } from \"@webiny/app-headless-cms/admin/config/contentEntries/index.js\";\nimport { ContentEntryEditorWithConfig } from \"@webiny/app-headless-cms/admin/config/contentEntries/index.js\";\nimport { useContentEntryEditorConfig } from \"@webiny/app-headless-cms/admin/config/contentEntries/index.js\";\nimport { ContentEntryFormPresenter } from \"@webiny/app-headless-cms/presentation/contentEntries/form/abstractions.js\";\nimport { ContentEntryForm } from \"@webiny/app-headless-cms/presentation/contentEntries/views/layout/index.js\";\nimport { ContentEntryFormContent } from \"@webiny/app-headless-cms/presentation/contentEntries/views/layout/index.js\";\nimport { TargetReviewPresenter } from \"@webiny/app-workflows/review/presentation/targetReview/abstractions.js\";\nimport { createFakePresenter } from \"@webiny/app-workflows/review/testing/fakeTargetReviewPresenter.js\";\nimport { createTargetReviewViewModel } from \"@webiny/app-workflows/review/testing/createTargetReviewViewModel.js\";\nimport { CmsEntryReview } from \"~/features/editorReview/abstractions.js\";\nimport { CmsWorkflows } from \"./index.js\";\nimport { createEntry } from \"~/testing/createEntry.js\";\nimport { createFormVm } from \"~/testing/createFormVm.js\";\nimport { MODEL } from \"~/testing/models.js\";\nimport { LOADING } from \"~/testing/reviewStates.js\";\n\nvi.mock(\"@webiny/app-workflows/review/editor/components/EditorReviewBar.js\", async () => {\n const React = await import(\"react\");\n\n return {\n EditorReviewBar: () => React.createElement(\"div\", { \"data-testid\": \"editor-review-bar\" })\n };\n});\n\n/*\n * The workflow editor route, the Content Reviews route, menu and sidebar item and the \"open in new window\"\n * option need routing and menu providers and are not what this test asserts (Task 11's composition test\n * stubs the same modules).\n */\nvi.mock(\"~/Routes/index.js\", () => {\n return { CmsWorkflowEditor: () => null };\n});\n\nvi.mock(\"~/Components/ContentReviews/CmsContentReviews.js\", () => {\n return { CmsContentReviews: () => null };\n});\n\nvi.mock(\"~/Components/ContentReviews/CmsContentReviewsSidebarItem.js\", () => {\n return { CmsContentReviewsSidebarItem: () => null };\n});\n\nclass FakeBasePresenter implements ContentEntryFormPresenter.Interface {\n get vm(): ContentEntryFormPresenter.ViewModel {\n return createFormVm({ entry: createEntry(), model: MODEL });\n }\n\n async loadRevision(): Promise<void> {}\n\n async saveRevision(): Promise<boolean> {\n return true;\n }\n\n async publishRevision(): Promise<boolean> {\n return true;\n }\n\n async unpublishRevision(): Promise<boolean> {\n return true;\n }\n\n async deleteEntry(): Promise<boolean> {\n return true;\n }\n\n setFolderId(): void {}\n\n newEntry(): void {}\n\n patchEntryMeta(): void {}\n\n reset(): void {}\n}\n\nconst BasePresenter = ContentEntryFormPresenter.createImplementation({\n implementation: FakeBasePresenter,\n dependencies: []\n});\n\nconst ActionsProbe = () => {\n const { buttonActions, menuItemActions } = useContentEntryEditorConfig();\n const names = [...buttonActions, ...menuItemActions].map(action => action.name);\n\n // Only the schedule item is rendered, the other menu items need the router.\n const scheduleActions = menuItemActions.filter(action => action.name === \"schedule\");\n\n return (\n <>\n <div data-testid=\"action-names\">{names.join(\",\")}</div>\n {scheduleActions.map(action => (\n <span key={action.name}>{action.element}</span>\n ))}\n </>\n );\n};\n\nfunction mountRoot(isEnabled: boolean) {\n const flagsService: FeatureFlagsService.Interface = {\n getFlags: () => new FeatureFlags({ advancedPublishingWorkflow: isEnabled }),\n isLoaded: () => true,\n loadFlags: async () => undefined\n };\n const container = new Container();\n const presenter = createFakePresenter(createTargetReviewViewModel(LOADING));\n container.registerInstance(FeatureFlagsService, flagsService);\n container.registerInstance(TargetReviewPresenter, presenter);\n container.register(BasePresenter).inSingletonScope();\n\n render(\n <AdminUiProvider>\n <CompositionProvider>\n <DiContainerProvider container={container}>\n <ModelContext.Provider value={MODEL}>\n <CmsWorkflows />\n <ContentEntryEditorConfig>\n <ContentEntryEditorConfig.Width value={\"1020px\"} />\n <ContentEntryEditorConfig.Actions.MenuItemAction\n name={\"schedule\"}\n element={<span data-testid=\"schedule-item\" />}\n />\n </ContentEntryEditorConfig>\n <ContentEntryEditorWithConfig>\n <ActionsProbe />\n <ContentEntryForm />\n <ContentEntryFormContent>\n <div data-testid=\"original\" />\n </ContentEntryFormContent>\n </ContentEntryEditorWithConfig>\n </ModelContext.Provider>\n </DiContainerProvider>\n </CompositionProvider>\n </AdminUiProvider>\n );\n\n return { container, presenter };\n}\n\ndescribe(\"CmsWorkflows editor wiring\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"registers the session, the bar, the actions and the presenter decorator with the flag on\", async () => {\n const { container, presenter } = mountRoot(true);\n\n const session = container.resolve(CmsEntryReview);\n expect(session.presenter).toBe(presenter);\n expect(await screen.findAllByTestId(\"editor-review-bar\")).toHaveLength(1);\n\n const names = (await screen.findByTestId(\"action-names\")).textContent ?? \"\";\n expect(names).toContain(\"workflowBlockedActions\");\n expect(names).toContain(\"createNewRevision\");\n expect(names).not.toContain(\"workflowStateTooltip\");\n\n await waitFor(() => expect(document.querySelector(\"fieldset[disabled]\")).not.toBeNull());\n await waitFor(() => expect(screen.queryByTestId(\"schedule-item\")).toBeNull());\n\n const form = container.resolve(ContentEntryFormPresenter);\n await form.loadRevision(\"entry-1#0001\");\n expect(presenter.init).toHaveBeenCalledTimes(1);\n });\n\n it(\"registers nothing with the flag off\", async () => {\n const { container, presenter } = mountRoot(false);\n\n expect(() => container.resolve(CmsEntryReview)).toThrow(\"No registration found\");\n expect(await screen.findByTestId(\"original\")).toBeTruthy();\n await waitFor(() => expect(screen.queryByTestId(\"editor-review-bar\")).toBeNull());\n\n const names = (await screen.findByTestId(\"action-names\")).textContent ?? \"\";\n expect(names).not.toContain(\"workflowBlockedActions\");\n expect(names).not.toContain(\"createNewRevision\");\n\n expect(await screen.findByTestId(\"schedule-item\")).toBeTruthy();\n expect(document.querySelector(\"fieldset\")).toBeNull();\n\n const form = container.resolve(ContentEntryFormPresenter);\n await form.loadRevision(\"entry-1#0001\");\n expect(presenter.init).not.toHaveBeenCalled();\n });\n});\n"],"names":["vi","React","FakeBasePresenter","createFormVm","createEntry","MODEL","BasePresenter","ContentEntryFormPresenter","ActionsProbe","buttonActions","menuItemActions","useContentEntryEditorConfig","names","action","scheduleActions","mountRoot","isEnabled","flagsService","FeatureFlags","undefined","container","Container","presenter","createFakePresenter","createTargetReviewViewModel","LOADING","FeatureFlagsService","TargetReviewPresenter","render","AdminUiProvider","CompositionProvider","DiContainerProvider","ModelContext","CmsWorkflows","ContentEntryEditorConfig","ContentEntryEditorWithConfig","ContentEntryForm","ContentEntryFormContent","describe","beforeEach","it","session","CmsEntryReview","expect","screen","waitFor","document","form"],"mappings":"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"}
|