@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,186 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
3
|
+
import { fireEvent, screen, waitFor } from "@testing-library/react";
|
|
4
|
+
import { CmsEntryReviewNewRevision } from "./CmsEntryReviewNewRevision.js";
|
|
5
|
+
import { NO_PUBLISHING_MODEL, SINGLETON_MODEL } from "../../testing/models.js";
|
|
6
|
+
import { createEntry } from "../../testing/createEntry.js";
|
|
7
|
+
import { renderEditorTree } from "../../testing/renderEditorTree.js";
|
|
8
|
+
import { APPROVED, BOUND_NO_REVIEW, FAILED, IN_REVIEW, LOADING, NO_WORKFLOW, REJECTED } from "../../testing/reviewStates.js";
|
|
9
|
+
const mocks = vi.hoisted(()=>({
|
|
10
|
+
canEdit: true,
|
|
11
|
+
setRouteParams: vi.fn(),
|
|
12
|
+
showWarningToast: vi.fn()
|
|
13
|
+
}));
|
|
14
|
+
vi.mock("@webiny/admin-ui", async (importOriginal)=>{
|
|
15
|
+
const actual = await importOriginal();
|
|
16
|
+
return {
|
|
17
|
+
...actual,
|
|
18
|
+
useToast: ()=>({
|
|
19
|
+
showWarningToast: mocks.showWarningToast
|
|
20
|
+
})
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
vi.mock("@webiny/app-admin", async (importOriginal)=>{
|
|
24
|
+
const actual = await importOriginal();
|
|
25
|
+
const React = await import("react");
|
|
26
|
+
return {
|
|
27
|
+
...actual,
|
|
28
|
+
OptionsMenuItem: (props)=>React.createElement("button", {
|
|
29
|
+
"data-testid": "menu-item",
|
|
30
|
+
disabled: props.disabled ?? false,
|
|
31
|
+
onClick: props.onAction
|
|
32
|
+
}, props.label)
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
vi.mock("@webiny/app", async (importOriginal)=>{
|
|
36
|
+
const actual = await importOriginal();
|
|
37
|
+
return {
|
|
38
|
+
...actual,
|
|
39
|
+
useRoute: ()=>({
|
|
40
|
+
setRouteParams: mocks.setRouteParams
|
|
41
|
+
})
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
vi.mock("@webiny/app-headless-cms/admin/hooks/usePermission.js", ()=>({
|
|
45
|
+
usePermission: ()=>({
|
|
46
|
+
canEdit: ()=>mocks.canEdit,
|
|
47
|
+
canPublish: ()=>true
|
|
48
|
+
})
|
|
49
|
+
}));
|
|
50
|
+
function renderMenu(params) {
|
|
51
|
+
return renderEditorTree({
|
|
52
|
+
...params,
|
|
53
|
+
children: /*#__PURE__*/ react.createElement(CmsEntryReviewNewRevision, null)
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
describe("CmsEntryReviewNewRevision", ()=>{
|
|
57
|
+
beforeEach(()=>{
|
|
58
|
+
mocks.canEdit = true;
|
|
59
|
+
mocks.setRouteParams.mockReset();
|
|
60
|
+
mocks.showWarningToast.mockReset();
|
|
61
|
+
});
|
|
62
|
+
it("is registered as the createNewRevision menu item", async ()=>{
|
|
63
|
+
renderMenu({
|
|
64
|
+
reviewVm: NO_WORKFLOW
|
|
65
|
+
});
|
|
66
|
+
const item = await screen.findByTestId("menu-item");
|
|
67
|
+
expect(item.textContent).toBe("Create New Revision");
|
|
68
|
+
expect(item.closest("[data-action]")?.getAttribute("data-action")).toBe("createNewRevision");
|
|
69
|
+
});
|
|
70
|
+
it.each([
|
|
71
|
+
[
|
|
72
|
+
"no workflow",
|
|
73
|
+
NO_WORKFLOW
|
|
74
|
+
],
|
|
75
|
+
[
|
|
76
|
+
"no active review",
|
|
77
|
+
BOUND_NO_REVIEW
|
|
78
|
+
],
|
|
79
|
+
[
|
|
80
|
+
"a review in progress",
|
|
81
|
+
IN_REVIEW
|
|
82
|
+
],
|
|
83
|
+
[
|
|
84
|
+
"a rejected review",
|
|
85
|
+
REJECTED
|
|
86
|
+
],
|
|
87
|
+
[
|
|
88
|
+
"an approved review",
|
|
89
|
+
APPROVED
|
|
90
|
+
]
|
|
91
|
+
])("is enabled for %s", async (_name, reviewVm)=>{
|
|
92
|
+
renderMenu({
|
|
93
|
+
reviewVm
|
|
94
|
+
});
|
|
95
|
+
const item = await screen.findByTestId("menu-item");
|
|
96
|
+
expect(item.hasAttribute("disabled")).toBe(false);
|
|
97
|
+
});
|
|
98
|
+
it.each([
|
|
99
|
+
[
|
|
100
|
+
"loading",
|
|
101
|
+
LOADING
|
|
102
|
+
],
|
|
103
|
+
[
|
|
104
|
+
"failed",
|
|
105
|
+
FAILED
|
|
106
|
+
]
|
|
107
|
+
])("is disabled while the status is %s", async (_name, reviewVm)=>{
|
|
108
|
+
renderMenu({
|
|
109
|
+
reviewVm
|
|
110
|
+
});
|
|
111
|
+
const item = await screen.findByTestId("menu-item");
|
|
112
|
+
expect(item.hasAttribute("disabled")).toBe(true);
|
|
113
|
+
});
|
|
114
|
+
it("stays enabled for a singleton model whatever the shared presenter holds", async ()=>{
|
|
115
|
+
renderMenu({
|
|
116
|
+
formVm: {
|
|
117
|
+
model: SINGLETON_MODEL
|
|
118
|
+
},
|
|
119
|
+
reviewVm: LOADING
|
|
120
|
+
});
|
|
121
|
+
const item = await screen.findByTestId("menu-item");
|
|
122
|
+
expect(item.hasAttribute("disabled")).toBe(false);
|
|
123
|
+
});
|
|
124
|
+
it("renders nothing without an entry", async ()=>{
|
|
125
|
+
renderMenu({
|
|
126
|
+
formVm: {
|
|
127
|
+
entry: null,
|
|
128
|
+
isNewEntry: true
|
|
129
|
+
},
|
|
130
|
+
reviewVm: NO_WORKFLOW
|
|
131
|
+
});
|
|
132
|
+
await screen.findByTestId("menu-actions");
|
|
133
|
+
await waitFor(()=>expect(screen.queryByTestId("menu-item")).toBeNull());
|
|
134
|
+
});
|
|
135
|
+
it("renders nothing without edit permission", async ()=>{
|
|
136
|
+
mocks.canEdit = false;
|
|
137
|
+
renderMenu({
|
|
138
|
+
reviewVm: NO_WORKFLOW
|
|
139
|
+
});
|
|
140
|
+
await screen.findByTestId("menu-actions");
|
|
141
|
+
await waitFor(()=>expect(screen.queryByTestId("menu-item")).toBeNull());
|
|
142
|
+
});
|
|
143
|
+
it("renders nothing for a model that cannot publish", async ()=>{
|
|
144
|
+
renderMenu({
|
|
145
|
+
formVm: {
|
|
146
|
+
model: NO_PUBLISHING_MODEL
|
|
147
|
+
},
|
|
148
|
+
reviewVm: NO_WORKFLOW
|
|
149
|
+
});
|
|
150
|
+
await screen.findByTestId("menu-actions");
|
|
151
|
+
await waitFor(()=>expect(screen.queryByTestId("menu-item")).toBeNull());
|
|
152
|
+
});
|
|
153
|
+
it("creates the revision and moves the route to it", async ()=>{
|
|
154
|
+
const view = renderMenu({
|
|
155
|
+
reviewVm: REJECTED
|
|
156
|
+
});
|
|
157
|
+
const created = createEntry();
|
|
158
|
+
created.id = "entry-1#0002";
|
|
159
|
+
vi.mocked(view.revisions.createRevision).mockResolvedValue(created);
|
|
160
|
+
fireEvent.click(await screen.findByTestId("menu-item"));
|
|
161
|
+
await waitFor(()=>expect(mocks.setRouteParams).toHaveBeenCalledTimes(1));
|
|
162
|
+
expect(view.revisions.createRevision).toHaveBeenCalledWith("entry-1#0001");
|
|
163
|
+
const update = mocks.setRouteParams.mock.calls[0][0];
|
|
164
|
+
expect(update({
|
|
165
|
+
modelId: "article",
|
|
166
|
+
id: "entry-1#0001"
|
|
167
|
+
})).toEqual({
|
|
168
|
+
modelId: "article",
|
|
169
|
+
id: "entry-1#0002"
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
it("warns and stays on the revision when the new revision could not be created", async ()=>{
|
|
173
|
+
const view = renderMenu({
|
|
174
|
+
reviewVm: REJECTED
|
|
175
|
+
});
|
|
176
|
+
vi.mocked(view.revisions.createRevision).mockResolvedValue(null);
|
|
177
|
+
fireEvent.click(await screen.findByTestId("menu-item"));
|
|
178
|
+
await waitFor(()=>expect(mocks.showWarningToast).toHaveBeenCalledTimes(1));
|
|
179
|
+
expect(mocks.showWarningToast).toHaveBeenCalledWith({
|
|
180
|
+
title: "Could not create a new revision."
|
|
181
|
+
});
|
|
182
|
+
expect(mocks.setRouteParams).not.toHaveBeenCalled();
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
//# sourceMappingURL=CmsEntryReviewNewRevision.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Components/ContentEntryForm/CmsEntryReviewNewRevision.test.js","sources":["../../../src/Components/ContentEntryForm/CmsEntryReviewNewRevision.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { beforeEach } from \"vitest\";\nimport { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { vi } from \"vitest\";\nimport { fireEvent } from \"@testing-library/react\";\nimport { screen } from \"@testing-library/react\";\nimport { waitFor } from \"@testing-library/react\";\nimport { CmsEntryReviewNewRevision } from \"./CmsEntryReviewNewRevision.js\";\nimport { NO_PUBLISHING_MODEL } from \"~/testing/models.js\";\nimport { SINGLETON_MODEL } from \"~/testing/models.js\";\nimport { createEntry } from \"~/testing/createEntry.js\";\nimport { renderEditorTree } from \"~/testing/renderEditorTree.js\";\nimport { APPROVED } from \"~/testing/reviewStates.js\";\nimport { BOUND_NO_REVIEW } from \"~/testing/reviewStates.js\";\nimport { FAILED } from \"~/testing/reviewStates.js\";\nimport { IN_REVIEW } from \"~/testing/reviewStates.js\";\nimport { LOADING } from \"~/testing/reviewStates.js\";\nimport { NO_WORKFLOW } from \"~/testing/reviewStates.js\";\nimport { REJECTED } from \"~/testing/reviewStates.js\";\n\ninterface FakeMenuItemProps {\n label: string;\n disabled?: boolean;\n onAction: () => void;\n}\n\nconst mocks = vi.hoisted(() => {\n return { canEdit: true, setRouteParams: vi.fn(), showWarningToast: vi.fn() };\n});\n\nvi.mock(\"@webiny/admin-ui\", async importOriginal => {\n const actual = await importOriginal<typeof import(\"@webiny/admin-ui\")>();\n\n return {\n ...actual,\n useToast: () => {\n return { showWarningToast: mocks.showWarningToast };\n }\n };\n});\n\nvi.mock(\"@webiny/app-admin\", async importOriginal => {\n const actual = await importOriginal<typeof import(\"@webiny/app-admin\")>();\n const React = await import(\"react\");\n\n return {\n ...actual,\n OptionsMenuItem: (props: FakeMenuItemProps) => {\n return React.createElement(\n \"button\",\n {\n \"data-testid\": \"menu-item\",\n disabled: props.disabled ?? false,\n onClick: props.onAction\n },\n props.label\n );\n }\n };\n});\n\nvi.mock(\"@webiny/app\", async importOriginal => {\n const actual = await importOriginal<typeof import(\"@webiny/app\")>();\n\n return {\n ...actual,\n useRoute: () => {\n return { setRouteParams: mocks.setRouteParams };\n }\n };\n});\n\nvi.mock(\"@webiny/app-headless-cms/admin/hooks/usePermission.js\", () => {\n return {\n usePermission: () => {\n return { canEdit: () => mocks.canEdit, canPublish: () => true };\n }\n };\n});\n\nfunction renderMenu(params: Parameters<typeof renderEditorTree>[0]) {\n return renderEditorTree({ ...params, children: <CmsEntryReviewNewRevision /> });\n}\n\ndescribe(\"CmsEntryReviewNewRevision\", () => {\n beforeEach(() => {\n mocks.canEdit = true;\n mocks.setRouteParams.mockReset();\n mocks.showWarningToast.mockReset();\n });\n\n it(\"is registered as the createNewRevision menu item\", async () => {\n renderMenu({ reviewVm: NO_WORKFLOW });\n\n const item = await screen.findByTestId(\"menu-item\");\n\n expect(item.textContent).toBe(\"Create New Revision\");\n expect(item.closest(\"[data-action]\")?.getAttribute(\"data-action\")).toBe(\n \"createNewRevision\"\n );\n });\n\n it.each([\n [\"no workflow\", NO_WORKFLOW],\n [\"no active review\", BOUND_NO_REVIEW],\n [\"a review in progress\", IN_REVIEW],\n [\"a rejected review\", REJECTED],\n [\"an approved review\", APPROVED]\n ])(\"is enabled for %s\", async (_name, reviewVm) => {\n renderMenu({ reviewVm });\n\n const item = await screen.findByTestId(\"menu-item\");\n\n expect(item.hasAttribute(\"disabled\")).toBe(false);\n });\n\n it.each([\n [\"loading\", LOADING],\n [\"failed\", FAILED]\n ])(\"is disabled while the status is %s\", async (_name, reviewVm) => {\n renderMenu({ reviewVm });\n\n const item = await screen.findByTestId(\"menu-item\");\n\n expect(item.hasAttribute(\"disabled\")).toBe(true);\n });\n\n it(\"stays enabled for a singleton model whatever the shared presenter holds\", async () => {\n renderMenu({ formVm: { model: SINGLETON_MODEL }, reviewVm: LOADING });\n\n const item = await screen.findByTestId(\"menu-item\");\n\n expect(item.hasAttribute(\"disabled\")).toBe(false);\n });\n\n it(\"renders nothing without an entry\", async () => {\n renderMenu({ formVm: { entry: null, isNewEntry: true }, reviewVm: NO_WORKFLOW });\n\n await screen.findByTestId(\"menu-actions\");\n await waitFor(() => expect(screen.queryByTestId(\"menu-item\")).toBeNull());\n });\n\n it(\"renders nothing without edit permission\", async () => {\n mocks.canEdit = false;\n renderMenu({ reviewVm: NO_WORKFLOW });\n\n await screen.findByTestId(\"menu-actions\");\n await waitFor(() => expect(screen.queryByTestId(\"menu-item\")).toBeNull());\n });\n\n it(\"renders nothing for a model that cannot publish\", async () => {\n renderMenu({ formVm: { model: NO_PUBLISHING_MODEL }, reviewVm: NO_WORKFLOW });\n\n await screen.findByTestId(\"menu-actions\");\n await waitFor(() => expect(screen.queryByTestId(\"menu-item\")).toBeNull());\n });\n\n it(\"creates the revision and moves the route to it\", async () => {\n const view = renderMenu({ reviewVm: REJECTED });\n const created = createEntry();\n created.id = \"entry-1#0002\";\n vi.mocked(view.revisions.createRevision).mockResolvedValue(created);\n\n fireEvent.click(await screen.findByTestId(\"menu-item\"));\n\n await waitFor(() => expect(mocks.setRouteParams).toHaveBeenCalledTimes(1));\n expect(view.revisions.createRevision).toHaveBeenCalledWith(\"entry-1#0001\");\n const update = mocks.setRouteParams.mock.calls[0][0];\n expect(update({ modelId: \"article\", id: \"entry-1#0001\" })).toEqual({\n modelId: \"article\",\n id: \"entry-1#0002\"\n });\n });\n\n it(\"warns and stays on the revision when the new revision could not be created\", async () => {\n const view = renderMenu({ reviewVm: REJECTED });\n vi.mocked(view.revisions.createRevision).mockResolvedValue(null);\n\n fireEvent.click(await screen.findByTestId(\"menu-item\"));\n\n await waitFor(() => expect(mocks.showWarningToast).toHaveBeenCalledTimes(1));\n expect(mocks.showWarningToast).toHaveBeenCalledWith({\n title: \"Could not create a new revision.\"\n });\n expect(mocks.setRouteParams).not.toHaveBeenCalled();\n });\n});\n"],"names":["mocks","vi","importOriginal","actual","React","props","renderMenu","params","renderEditorTree","CmsEntryReviewNewRevision","describe","beforeEach","it","NO_WORKFLOW","item","screen","expect","BOUND_NO_REVIEW","IN_REVIEW","REJECTED","APPROVED","_name","reviewVm","LOADING","FAILED","SINGLETON_MODEL","waitFor","NO_PUBLISHING_MODEL","view","created","createEntry","fireEvent","update"],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { createReactiveComponent } from "@webiny/app-admin";
|
|
3
|
+
import { ContentEntryEditorConfig } from "@webiny/app-headless-cms/admin/config/contentEntries/index.js";
|
|
4
|
+
import { useContentEntryFormPresenter } from "@webiny/app-headless-cms/presentation/contentEntries/form/useContentEntryFormPresenter.js";
|
|
5
|
+
import { useCmsEntryReview } from "../../features/editorReview/useCmsEntryReview.js";
|
|
6
|
+
import { isReviewableModel } from "../../utils/isReviewableModel.js";
|
|
7
|
+
const { Actions: Actions } = ContentEntryEditorConfig;
|
|
8
|
+
const { MenuItemAction: MenuItemAction } = Actions;
|
|
9
|
+
const ReviewGatedMenuItem = createReactiveComponent((props)=>{
|
|
10
|
+
const formPresenter = useContentEntryFormPresenter();
|
|
11
|
+
const session = useCmsEntryReview();
|
|
12
|
+
const { entry, model } = formPresenter.vm;
|
|
13
|
+
const isReviewed = null !== entry && isReviewableModel(model);
|
|
14
|
+
if (isReviewed && !session.presenter.vm.allowsPublishing) return null;
|
|
15
|
+
return props.children;
|
|
16
|
+
});
|
|
17
|
+
const CmsEntryReviewScheduleMenuItem = MenuItemAction.createDecorator((Original)=>function(props) {
|
|
18
|
+
if ("schedule" !== props.name) return /*#__PURE__*/ react.createElement(Original, props);
|
|
19
|
+
return /*#__PURE__*/ react.createElement(Original, {
|
|
20
|
+
...props,
|
|
21
|
+
element: /*#__PURE__*/ react.createElement(ReviewGatedMenuItem, null, props.element)
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
export { CmsEntryReviewScheduleMenuItem };
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=CmsEntryReviewScheduleMenuItem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.js","sources":["../../../src/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.tsx"],"sourcesContent":["import React from \"react\";\nimport { createReactiveComponent } from \"@webiny/app-admin\";\nimport { ContentEntryEditorConfig } from \"@webiny/app-headless-cms/admin/config/contentEntries/index.js\";\nimport { useContentEntryFormPresenter } from \"@webiny/app-headless-cms/presentation/contentEntries/form/useContentEntryFormPresenter.js\";\nimport { useCmsEntryReview } from \"~/features/editorReview/useCmsEntryReview.js\";\nimport { isReviewableModel } from \"~/utils/isReviewableModel.js\";\n\nconst { Actions } = ContentEntryEditorConfig;\nconst { MenuItemAction } = Actions;\n\ninterface ReviewGatedMenuItemProps {\n children: React.ReactElement;\n}\n\nconst ReviewGatedMenuItem = createReactiveComponent((props: ReviewGatedMenuItemProps) => {\n const formPresenter = useContentEntryFormPresenter();\n const session = useCmsEntryReview();\n const { entry, model } = formPresenter.vm;\n const isReviewed = entry !== null && isReviewableModel(model);\n\n if (isReviewed && !session.presenter.vm.allowsPublishing) {\n return null;\n }\n\n return props.children;\n});\n\n/*\n * There is a possibility that this decorator will not do anything, because the scheduler is not\n * turned on.\n */\nexport const CmsEntryReviewScheduleMenuItem = MenuItemAction.createDecorator(Original => {\n return function CmsEntryReviewScheduleMenuItemDecorator(props) {\n if (props.name !== \"schedule\") {\n return <Original {...props} />;\n }\n\n return (\n <Original\n {...props}\n element={<ReviewGatedMenuItem>{props.element}</ReviewGatedMenuItem>}\n />\n );\n };\n});\n"],"names":["Actions","ContentEntryEditorConfig","MenuItemAction","ReviewGatedMenuItem","createReactiveComponent","props","formPresenter","useContentEntryFormPresenter","session","useCmsEntryReview","entry","model","isReviewed","isReviewableModel","CmsEntryReviewScheduleMenuItem","Original"],"mappings":";;;;;;AAOA,MAAM,EAAEA,SAAAA,OAAO,EAAE,GAAGC;AACpB,MAAM,EAAEC,gBAAAA,cAAc,EAAE,GAAGF;AAM3B,MAAMG,sBAAsBC,wBAAwB,CAACC;IACjD,MAAMC,gBAAgBC;IACtB,MAAMC,UAAUC;IAChB,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGL,cAAc,EAAE;IACzC,MAAMM,aAAaF,AAAU,SAAVA,SAAkBG,kBAAkBF;IAEvD,IAAIC,cAAc,CAACJ,QAAQ,SAAS,CAAC,EAAE,CAAC,gBAAgB,EACpD,OAAO;IAGX,OAAOH,MAAM,QAAQ;AACzB;AAMO,MAAMS,iCAAiCZ,eAAe,eAAe,CAACa,CAAAA,WAClE,SAAiDV,KAAK;QACzD,IAAIA,AAAe,eAAfA,MAAM,IAAI,EACV,OAAO,WAAP,GAAO,oBAACU,UAAaV;QAGzB,OAAO,WAAP,GACI,oBAACU,UAAAA;YACI,GAAGV,KAAK;YACT,uBAAS,oBAACF,qBAAmBA,MAAEE,MAAM,OAAO;;IAGxD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { screen, waitFor } from "@testing-library/react";
|
|
4
|
+
import { ContentEntryEditorConfig } from "@webiny/app-headless-cms/admin/config/contentEntries/index.js";
|
|
5
|
+
import { CmsEntryReviewScheduleMenuItem } from "./CmsEntryReviewScheduleMenuItem.js";
|
|
6
|
+
import { renderEditorTree } from "../../testing/renderEditorTree.js";
|
|
7
|
+
import { APPROVED, BOUND_NO_REVIEW, BOUND_UNPUBLISHED, IN_REVIEW, LOADING, NO_WORKFLOW } from "../../testing/reviewStates.js";
|
|
8
|
+
const { Actions: Actions } = ContentEntryEditorConfig;
|
|
9
|
+
function renderMenu(params) {
|
|
10
|
+
return renderEditorTree({
|
|
11
|
+
...params,
|
|
12
|
+
children: /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(CmsEntryReviewScheduleMenuItem, null), /*#__PURE__*/ react.createElement(ContentEntryEditorConfig, null, /*#__PURE__*/ react.createElement(Actions.MenuItemAction, {
|
|
13
|
+
name: "schedule",
|
|
14
|
+
element: /*#__PURE__*/ react.createElement("span", {
|
|
15
|
+
"data-testid": "schedule-item"
|
|
16
|
+
})
|
|
17
|
+
}), /*#__PURE__*/ react.createElement(Actions.MenuItemAction, {
|
|
18
|
+
name: "delete",
|
|
19
|
+
element: /*#__PURE__*/ react.createElement("span", {
|
|
20
|
+
"data-testid": "delete-item"
|
|
21
|
+
})
|
|
22
|
+
})))
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
describe("CmsEntryReviewScheduleMenuItem", ()=>{
|
|
26
|
+
it.each([
|
|
27
|
+
[
|
|
28
|
+
"no workflow",
|
|
29
|
+
NO_WORKFLOW
|
|
30
|
+
],
|
|
31
|
+
[
|
|
32
|
+
"an approved review",
|
|
33
|
+
APPROVED
|
|
34
|
+
],
|
|
35
|
+
[
|
|
36
|
+
"an unpublished revision with no review (Q19)",
|
|
37
|
+
BOUND_UNPUBLISHED
|
|
38
|
+
]
|
|
39
|
+
])("keeps schedule for %s", async (_name, reviewVm)=>{
|
|
40
|
+
renderMenu({
|
|
41
|
+
reviewVm
|
|
42
|
+
});
|
|
43
|
+
expect(await screen.findByTestId("schedule-item")).toBeTruthy();
|
|
44
|
+
expect(screen.getByTestId("delete-item")).toBeTruthy();
|
|
45
|
+
});
|
|
46
|
+
it.each([
|
|
47
|
+
[
|
|
48
|
+
"a bound workflow and no review",
|
|
49
|
+
BOUND_NO_REVIEW
|
|
50
|
+
],
|
|
51
|
+
[
|
|
52
|
+
"a review in progress",
|
|
53
|
+
IN_REVIEW
|
|
54
|
+
],
|
|
55
|
+
[
|
|
56
|
+
"an unknown status",
|
|
57
|
+
LOADING
|
|
58
|
+
]
|
|
59
|
+
])("hides schedule, and only schedule, for %s", async (_name, reviewVm)=>{
|
|
60
|
+
renderMenu({
|
|
61
|
+
reviewVm
|
|
62
|
+
});
|
|
63
|
+
expect(await screen.findByTestId("delete-item")).toBeTruthy();
|
|
64
|
+
await waitFor(()=>expect(screen.queryByTestId("schedule-item")).toBeNull());
|
|
65
|
+
});
|
|
66
|
+
it("keeps schedule for a new entry", async ()=>{
|
|
67
|
+
renderMenu({
|
|
68
|
+
formVm: {
|
|
69
|
+
entry: null,
|
|
70
|
+
isNewEntry: true
|
|
71
|
+
},
|
|
72
|
+
reviewVm: LOADING
|
|
73
|
+
});
|
|
74
|
+
expect(await screen.findByTestId("schedule-item")).toBeTruthy();
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
//# sourceMappingURL=CmsEntryReviewScheduleMenuItem.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.test.js","sources":["../../../src/Components/ContentEntryForm/CmsEntryReviewScheduleMenuItem.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { screen } from \"@testing-library/react\";\nimport { waitFor } from \"@testing-library/react\";\nimport { ContentEntryEditorConfig } from \"@webiny/app-headless-cms/admin/config/contentEntries/index.js\";\nimport { CmsEntryReviewScheduleMenuItem } from \"./CmsEntryReviewScheduleMenuItem.js\";\nimport { renderEditorTree } from \"~/testing/renderEditorTree.js\";\nimport { APPROVED } from \"~/testing/reviewStates.js\";\nimport { BOUND_NO_REVIEW } from \"~/testing/reviewStates.js\";\nimport { BOUND_UNPUBLISHED } from \"~/testing/reviewStates.js\";\nimport { IN_REVIEW } from \"~/testing/reviewStates.js\";\nimport { LOADING } from \"~/testing/reviewStates.js\";\nimport { NO_WORKFLOW } from \"~/testing/reviewStates.js\";\n\nconst { Actions } = ContentEntryEditorConfig;\n\nfunction renderMenu(params: Parameters<typeof renderEditorTree>[0]) {\n return renderEditorTree({\n ...params,\n children: (\n <>\n <CmsEntryReviewScheduleMenuItem />\n <ContentEntryEditorConfig>\n <Actions.MenuItemAction\n name=\"schedule\"\n element={<span data-testid=\"schedule-item\" />}\n />\n <Actions.MenuItemAction\n name=\"delete\"\n element={<span data-testid=\"delete-item\" />}\n />\n </ContentEntryEditorConfig>\n </>\n )\n });\n}\n\ndescribe(\"CmsEntryReviewScheduleMenuItem\", () => {\n it.each([\n [\"no workflow\", NO_WORKFLOW],\n [\"an approved review\", APPROVED],\n [\"an unpublished revision with no review (Q19)\", BOUND_UNPUBLISHED]\n ])(\"keeps schedule for %s\", async (_name, reviewVm) => {\n renderMenu({ reviewVm });\n\n expect(await screen.findByTestId(\"schedule-item\")).toBeTruthy();\n expect(screen.getByTestId(\"delete-item\")).toBeTruthy();\n });\n\n it.each([\n [\"a bound workflow and no review\", BOUND_NO_REVIEW],\n [\"a review in progress\", IN_REVIEW],\n [\"an unknown status\", LOADING]\n ])(\"hides schedule, and only schedule, for %s\", async (_name, reviewVm) => {\n renderMenu({ reviewVm });\n\n expect(await screen.findByTestId(\"delete-item\")).toBeTruthy();\n await waitFor(() => expect(screen.queryByTestId(\"schedule-item\")).toBeNull());\n });\n\n it(\"keeps schedule for a new entry\", async () => {\n renderMenu({ formVm: { entry: null, isNewEntry: true }, reviewVm: LOADING });\n\n expect(await screen.findByTestId(\"schedule-item\")).toBeTruthy();\n });\n});\n"],"names":["Actions","ContentEntryEditorConfig","renderMenu","params","renderEditorTree","CmsEntryReviewScheduleMenuItem","describe","it","NO_WORKFLOW","APPROVED","BOUND_UNPUBLISHED","_name","reviewVm","expect","screen","BOUND_NO_REVIEW","IN_REVIEW","LOADING","waitFor"],"mappings":";;;;;;;AAgBA,MAAM,EAAEA,SAAAA,OAAO,EAAE,GAAGC;AAEpB,SAASC,WAAWC,MAA8C;IAC9D,OAAOC,iBAAiB;QACpB,GAAGD,MAAM;QACT,UAAU,WAAV,GACI,wDACI,oBAACE,gCAA8BA,OAAAA,WAAAA,GAC/B,oBAACJ,0BAAwBA,MAAAA,WAAAA,GACrB,oBAACD,QAAQ,cAAc;YACnB,MAAK;YACL,uBAAS,oBAAC;gBAAK,eAAY;;0BAE/B,oBAACA,QAAQ,cAAc;YACnB,MAAK;YACL,uBAAS,oBAAC;gBAAK,eAAY;;;IAK/C;AACJ;AAEAM,SAAS,kCAAkC;IACvCC,GAAG,IAAI,CAAC;QACJ;YAAC;YAAeC;SAAY;QAC5B;YAAC;YAAsBC;SAAS;QAChC;YAAC;YAAgDC;SAAkB;KACtE,EAAE,yBAAyB,OAAOC,OAAOC;QACtCV,WAAW;YAAEU;QAAS;QAEtBC,OAAO,MAAMC,OAAO,YAAY,CAAC,kBAAkB,UAAU;QAC7DD,OAAOC,OAAO,WAAW,CAAC,gBAAgB,UAAU;IACxD;IAEAP,GAAG,IAAI,CAAC;QACJ;YAAC;YAAkCQ;SAAgB;QACnD;YAAC;YAAwBC;SAAU;QACnC;YAAC;YAAqBC;SAAQ;KACjC,EAAE,6CAA6C,OAAON,OAAOC;QAC1DV,WAAW;YAAEU;QAAS;QAEtBC,OAAO,MAAMC,OAAO,YAAY,CAAC,gBAAgB,UAAU;QAC3D,MAAMI,QAAQ,IAAML,OAAOC,OAAO,aAAa,CAAC,kBAAkB,QAAQ;IAC9E;IAEAP,GAAG,kCAAkC;QACjCL,WAAW;YAAE,QAAQ;gBAAE,OAAO;gBAAM,YAAY;YAAK;YAAG,UAAUe;QAAQ;QAE1EJ,OAAO,MAAMC,OAAO,YAAY,CAAC,kBAAkB,UAAU;IACjE;AACJ"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { CmsModel } from "@webiny/app-headless-cms-common/types/index.js";
|
|
2
|
+
import type { ReviewFieldLabels } from "@webiny/app-workflows/review/presentation/reviewDetails/abstractions.js";
|
|
3
|
+
export declare const getModelFieldLabels: (model: CmsModel) => ReviewFieldLabels;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Components/ContentEntryForm/getModelFieldLabels.js","sources":["../../../src/Components/ContentEntryForm/getModelFieldLabels.ts"],"sourcesContent":["import type { CmsModel } from \"@webiny/app-headless-cms-common/types/index.js\";\nimport type { ReviewFieldLabels } from \"@webiny/app-workflows/review/presentation/reviewDetails/abstractions.js\";\n\n// Field id → label of the model, so Review details names the fields of AI issues as the form does.\nexport const getModelFieldLabels = (model: CmsModel): ReviewFieldLabels => {\n const labels: ReviewFieldLabels = {};\n for (const field of model.fields ?? []) {\n labels[field.fieldId] = field.label;\n }\n return labels;\n};\n"],"names":["getModelFieldLabels","model","labels","field"],"mappings":"AAIO,MAAMA,sBAAsB,CAACC;IAChC,MAAMC,SAA4B,CAAC;IACnC,KAAK,MAAMC,SAASF,MAAM,MAAM,IAAI,EAAE,CAClCC,MAAM,CAACC,MAAM,OAAO,CAAC,GAAGA,MAAM,KAAK;IAEvC,OAAOD;AACX"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { CmsEntryReviewBar } from "./CmsEntryReviewBar.js";
|
|
2
|
+
export { CmsEntryReviewBlockedActions } from "./CmsEntryReviewBlockedActions.js";
|
|
3
|
+
export { CmsEntryReviewFormLock } from "./CmsEntryReviewFormLock.js";
|
|
4
|
+
export { CmsEntryReviewNewRevision } from "./CmsEntryReviewNewRevision.js";
|
|
5
|
+
export { CmsEntryReviewScheduleMenuItem } from "./CmsEntryReviewScheduleMenuItem.js";
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { CmsEntryReviewBar } from "./CmsEntryReviewBar.js";
|
|
2
|
+
export { CmsEntryReviewBlockedActions } from "./CmsEntryReviewBlockedActions.js";
|
|
3
|
+
export { CmsEntryReviewFormLock } from "./CmsEntryReviewFormLock.js";
|
|
4
|
+
export { CmsEntryReviewNewRevision } from "./CmsEntryReviewNewRevision.js";
|
|
5
|
+
export { CmsEntryReviewScheduleMenuItem } from "./CmsEntryReviewScheduleMenuItem.js";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { usePermission } from "@webiny/app-headless-cms/admin/hooks/usePermission.js";
|
|
3
|
+
import { CmsContentReviewsMount } from "./CmsContentReviewsMount.js";
|
|
4
|
+
const CmsContentReviews = ()=>{
|
|
5
|
+
const { canAccessManageEndpoint, canReadContentModels } = usePermission();
|
|
6
|
+
if (!canAccessManageEndpoint || !canReadContentModels) return null;
|
|
7
|
+
return /*#__PURE__*/ react.createElement(CmsContentReviewsMount, null);
|
|
8
|
+
};
|
|
9
|
+
export { CmsContentReviews };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=CmsContentReviews.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Components/ContentReviews/CmsContentReviews.js","sources":["../../../src/Components/ContentReviews/CmsContentReviews.tsx"],"sourcesContent":["import React from \"react\";\nimport { usePermission } from \"@webiny/app-headless-cms/admin/hooks/usePermission.js\";\nimport { CmsContentReviewsMount } from \"./CmsContentReviewsMount.js\";\n\n/*\n * Content Reviews need the content type list, which the API refuses to a user who cannot read\n * CMS models: such a user gets no route, menu or widgets, and no failed model list.\n */\nexport const CmsContentReviews = () => {\n const { canAccessManageEndpoint, canReadContentModels } = usePermission();\n\n if (!canAccessManageEndpoint || !canReadContentModels) {\n return null;\n }\n\n return <CmsContentReviewsMount />;\n};\n"],"names":["CmsContentReviews","canAccessManageEndpoint","canReadContentModels","usePermission","CmsContentReviewsMount"],"mappings":";;;AAQO,MAAMA,oBAAoB;IAC7B,MAAM,EAAEC,uBAAuB,EAAEC,oBAAoB,EAAE,GAAGC;IAE1D,IAAI,CAACF,2BAA2B,CAACC,sBAC7B,OAAO;IAGX,OAAO,WAAP,GAAO,oBAACE,wBAAsBA;AAClC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
3
|
+
import { act, render, screen, waitFor } from "@testing-library/react";
|
|
4
|
+
import { Container } from "@webiny/di";
|
|
5
|
+
import { DiContainerProvider } from "@webiny/app";
|
|
6
|
+
import { ListModelsUseCase } from "@webiny/app-headless-cms/features/model/listModels/abstractions.js";
|
|
7
|
+
import { Notifications } from "@webiny/app-admin/features/notifications/abstractions.js";
|
|
8
|
+
import { IdentityContext } from "@webiny/app-admin/features/security/IdentityContext/abstractions.js";
|
|
9
|
+
import { createWorkflowsIdentityContext } from "@webiny/app-workflows/review/testing/createWorkflowsIdentityContext.js";
|
|
10
|
+
import { CmsReviewContentAdapter } from "../../features/gateway/CmsReviewContentAdapter/abstractions.js";
|
|
11
|
+
import { CmsReviewRowProvider } from "../../features/gateway/CmsReviewRowProvider/abstractions.js";
|
|
12
|
+
import { CmsContentReviewsPresenterFeature } from "../../presentation/contentReviews/feature.js";
|
|
13
|
+
import { Routes } from "../../routes.js";
|
|
14
|
+
import { CmsContentReviews } from "./CmsContentReviews.js";
|
|
15
|
+
const permission = vi.hoisted(()=>({
|
|
16
|
+
canAccessManageEndpoint: true,
|
|
17
|
+
canReadContentModels: true
|
|
18
|
+
}));
|
|
19
|
+
vi.mock("@webiny/app-headless-cms/admin/hooks/usePermission.js", ()=>({
|
|
20
|
+
usePermission: ()=>({
|
|
21
|
+
canAccessManageEndpoint: permission.canAccessManageEndpoint,
|
|
22
|
+
canReadContentModels: permission.canReadContentModels
|
|
23
|
+
})
|
|
24
|
+
}));
|
|
25
|
+
vi.mock("@webiny/app-workflows/review/mounting/components/ReviewContentReviewsRoute.js", async ()=>{
|
|
26
|
+
const React = await import("react");
|
|
27
|
+
return {
|
|
28
|
+
ReviewContentReviewsRoute: (props)=>{
|
|
29
|
+
const vm = props.contentTypes.vm;
|
|
30
|
+
return React.createElement("div", {
|
|
31
|
+
"data-testid": "route",
|
|
32
|
+
"data-route": props.route.name,
|
|
33
|
+
"data-app": props.app,
|
|
34
|
+
"data-namespaces": vm.namespaces.join(","),
|
|
35
|
+
"data-show-content-type": String(props.showContentType),
|
|
36
|
+
"data-options": JSON.stringify(vm.options),
|
|
37
|
+
"data-breadcrumb": props.breadcrumbName,
|
|
38
|
+
"data-ready": String(!vm.loading)
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
vi.mock("@webiny/app-workflows/review/mounting/components/ReviewContentReviewsMenu.js", async ()=>{
|
|
44
|
+
const React = await import("react");
|
|
45
|
+
return {
|
|
46
|
+
ReviewContentReviewsMenu: (props)=>React.createElement("div", {
|
|
47
|
+
"data-testid": "menu",
|
|
48
|
+
"data-name": props.name,
|
|
49
|
+
"data-route": props.route.name,
|
|
50
|
+
"data-parent": props.parent ?? ""
|
|
51
|
+
})
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
vi.mock("@webiny/app-workflows/review/mounting/components/ReviewDashboardWidgets.js", async ()=>{
|
|
55
|
+
const React = await import("react");
|
|
56
|
+
return {
|
|
57
|
+
ReviewDashboardWidgets: (props)=>React.createElement("div", {
|
|
58
|
+
"data-testid": "widgets",
|
|
59
|
+
"data-prefix": props.prefix,
|
|
60
|
+
"data-namespaces": props.namespaces.join(","),
|
|
61
|
+
"data-route": props.viewAllRoute.name,
|
|
62
|
+
"data-ready": String(props.ready)
|
|
63
|
+
})
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
const createNotifications = ()=>({
|
|
67
|
+
notify: vi.fn(),
|
|
68
|
+
success: vi.fn(),
|
|
69
|
+
warning: vi.fn(),
|
|
70
|
+
error: vi.fn()
|
|
71
|
+
});
|
|
72
|
+
const createContainer = (execute, notifications = createNotifications())=>{
|
|
73
|
+
const container = new Container();
|
|
74
|
+
const rowProvider = {
|
|
75
|
+
getBinding: ()=>null
|
|
76
|
+
};
|
|
77
|
+
const adapter = {};
|
|
78
|
+
container.registerInstance(CmsReviewContentAdapter, adapter);
|
|
79
|
+
container.registerInstance(CmsReviewRowProvider, rowProvider);
|
|
80
|
+
container.registerInstance(ListModelsUseCase, {
|
|
81
|
+
execute
|
|
82
|
+
});
|
|
83
|
+
container.registerInstance(IdentityContext, createWorkflowsIdentityContext());
|
|
84
|
+
container.registerInstance(Notifications, notifications);
|
|
85
|
+
CmsContentReviewsPresenterFeature.register(container);
|
|
86
|
+
return container;
|
|
87
|
+
};
|
|
88
|
+
const mount = (container)=>{
|
|
89
|
+
render(/*#__PURE__*/ react.createElement(DiContainerProvider, {
|
|
90
|
+
container: container
|
|
91
|
+
}, /*#__PURE__*/ react.createElement(CmsContentReviews, null)));
|
|
92
|
+
};
|
|
93
|
+
describe("CmsContentReviews", ()=>{
|
|
94
|
+
beforeEach(()=>{
|
|
95
|
+
permission.canAccessManageEndpoint = true;
|
|
96
|
+
permission.canReadContentModels = true;
|
|
97
|
+
});
|
|
98
|
+
it.each([
|
|
99
|
+
[
|
|
100
|
+
"the manage endpoint",
|
|
101
|
+
{
|
|
102
|
+
canAccessManageEndpoint: false,
|
|
103
|
+
canReadContentModels: true
|
|
104
|
+
}
|
|
105
|
+
],
|
|
106
|
+
[
|
|
107
|
+
"reading content models",
|
|
108
|
+
{
|
|
109
|
+
canAccessManageEndpoint: true,
|
|
110
|
+
canReadContentModels: false
|
|
111
|
+
}
|
|
112
|
+
]
|
|
113
|
+
])("mounts nothing and loads no models without %s", async (_name, flags)=>{
|
|
114
|
+
Object.assign(permission, flags);
|
|
115
|
+
const execute = vi.fn(async ()=>[]);
|
|
116
|
+
const notifications = createNotifications();
|
|
117
|
+
const container = createContainer(execute, notifications);
|
|
118
|
+
mount(container);
|
|
119
|
+
await act(async ()=>{});
|
|
120
|
+
expect(screen.queryByTestId("route")).toBeNull();
|
|
121
|
+
expect(screen.queryByTestId("menu")).toBeNull();
|
|
122
|
+
expect(screen.queryByTestId("widgets")).toBeNull();
|
|
123
|
+
expect(execute).not.toHaveBeenCalled();
|
|
124
|
+
expect(notifications.error).not.toHaveBeenCalled();
|
|
125
|
+
});
|
|
126
|
+
it("mounts the shared route, menu and widgets for the cms app with the model list, ready once the models are known", async ()=>{
|
|
127
|
+
const container = createContainer(async ()=>[
|
|
128
|
+
{
|
|
129
|
+
modelId: "press",
|
|
130
|
+
name: "Press release",
|
|
131
|
+
tags: []
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
modelId: "article",
|
|
135
|
+
name: "Article",
|
|
136
|
+
tags: []
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
modelId: "hidden",
|
|
140
|
+
name: "Hidden",
|
|
141
|
+
tags: [
|
|
142
|
+
"$publishing:false"
|
|
143
|
+
]
|
|
144
|
+
}
|
|
145
|
+
]);
|
|
146
|
+
mount(container);
|
|
147
|
+
await waitFor(()=>{
|
|
148
|
+
expect(screen.getByTestId("route").getAttribute("data-ready")).toBe("true");
|
|
149
|
+
});
|
|
150
|
+
const route = screen.getByTestId("route");
|
|
151
|
+
expect(route.getAttribute("data-namespaces")).toBe("cms.article,cms.press");
|
|
152
|
+
expect(route.getAttribute("data-route")).toBe(Routes.ContentEntries.ContentReviews.name);
|
|
153
|
+
expect(route.getAttribute("data-app")).toBe("cms");
|
|
154
|
+
expect(route.getAttribute("data-show-content-type")).toBe("true");
|
|
155
|
+
expect(route.getAttribute("data-breadcrumb")).toBe("cms.content-reviews");
|
|
156
|
+
expect(JSON.parse(route.getAttribute("data-options") ?? "null")).toEqual([
|
|
157
|
+
{
|
|
158
|
+
label: "Article",
|
|
159
|
+
value: "article",
|
|
160
|
+
app: "cms",
|
|
161
|
+
icon: "devices_other"
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
label: "Press release",
|
|
165
|
+
value: "press",
|
|
166
|
+
app: "cms",
|
|
167
|
+
icon: "devices_other"
|
|
168
|
+
}
|
|
169
|
+
]);
|
|
170
|
+
const menu = screen.getByTestId("menu");
|
|
171
|
+
expect(menu.getAttribute("data-name")).toBe("workflows.cms.contentReviews");
|
|
172
|
+
expect(menu.getAttribute("data-parent")).toBe("headlessCMS");
|
|
173
|
+
expect(menu.getAttribute("data-route")).toBe(Routes.ContentEntries.ContentReviews.name);
|
|
174
|
+
const widgets = screen.getByTestId("widgets");
|
|
175
|
+
expect(widgets.getAttribute("data-ready")).toBe("true");
|
|
176
|
+
expect(widgets.getAttribute("data-prefix")).toBe("cms");
|
|
177
|
+
expect(widgets.getAttribute("data-namespaces")).toBe("cms.article,cms.press");
|
|
178
|
+
expect(widgets.getAttribute("data-route")).toBe(Routes.ContentEntries.ContentReviews.name);
|
|
179
|
+
});
|
|
180
|
+
it("keeps the list and the widgets from starting until the model list is known", async ()=>{
|
|
181
|
+
let release = ()=>void 0;
|
|
182
|
+
const pending = new Promise((resolve)=>{
|
|
183
|
+
release = resolve;
|
|
184
|
+
});
|
|
185
|
+
const container = createContainer(()=>pending);
|
|
186
|
+
mount(container);
|
|
187
|
+
expect(screen.getByTestId("route").getAttribute("data-ready")).toBe("false");
|
|
188
|
+
expect(screen.getByTestId("widgets").getAttribute("data-ready")).toBe("false");
|
|
189
|
+
release([
|
|
190
|
+
{
|
|
191
|
+
modelId: "article",
|
|
192
|
+
name: "Article",
|
|
193
|
+
tags: []
|
|
194
|
+
}
|
|
195
|
+
]);
|
|
196
|
+
await waitFor(()=>{
|
|
197
|
+
expect(screen.getByTestId("route").getAttribute("data-ready")).toBe("true");
|
|
198
|
+
});
|
|
199
|
+
expect(screen.getByTestId("route").getAttribute("data-namespaces")).toBe("cms.article");
|
|
200
|
+
});
|
|
201
|
+
it("becomes ready with no namespaces when the model list fails", async ()=>{
|
|
202
|
+
const consoleError = vi.spyOn(console, "error").mockImplementation(()=>void 0);
|
|
203
|
+
const container = createContainer(()=>Promise.reject(new Error("network")));
|
|
204
|
+
mount(container);
|
|
205
|
+
await waitFor(()=>{
|
|
206
|
+
expect(screen.getByTestId("route").getAttribute("data-ready")).toBe("true");
|
|
207
|
+
});
|
|
208
|
+
expect(screen.getByTestId("route").getAttribute("data-namespaces")).toBe("");
|
|
209
|
+
expect(JSON.parse(screen.getByTestId("route").getAttribute("data-options") ?? "null")).toEqual([]);
|
|
210
|
+
consoleError.mockRestore();
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
//# sourceMappingURL=CmsContentReviews.test.js.map
|