@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 @@
|
|
|
1
|
+
{"version":3,"file":"presentation/CmsEntryFormPresenterReviewDecorator.test.js","sources":["../../src/presentation/CmsEntryFormPresenterReviewDecorator.test.ts"],"sourcesContent":["import { beforeEach } from \"vitest\";\nimport { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { vi } from \"vitest\";\nimport type { Mock } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { ContentEntryFormPresenter } from \"@webiny/app-headless-cms/presentation/contentEntries/form/abstractions.js\";\nimport { CmsEntryReview } from \"~/features/editorReview/abstractions.js\";\nimport { CmsEntryFormPresenterReviewDecorator } from \"~/presentation/CmsEntryFormPresenterReviewDecorator.js\";\nimport type { EntrySession } from \"~/testing/createEntrySession.js\";\nimport { createEntrySession } from \"~/testing/createEntrySession.js\";\nimport { CmsEntryUnsavedChanges } from \"./CmsEntryUnsavedChanges.js\";\nimport { CmsEntryContentReloader } from \"~/presentation/CmsEntryContentReloader.js\";\nimport { createEntry } from \"~/testing/createEntry.js\";\nimport { createFormVm } from \"~/testing/createFormVm.js\";\nimport { SINGLETON_MODEL } from \"~/testing/models.js\";\nimport { APPROVED } from \"~/testing/reviewStates.js\";\nimport { BOUND_NO_REVIEW } from \"~/testing/reviewStates.js\";\nimport { BOUND_UNPUBLISHED } 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 SaveRevisionOptions {\n skipValidation?: boolean;\n}\n\ninterface BaseState {\n vm: ContentEntryFormPresenter.ViewModel;\n loadRevision: Mock<(id: string) => Promise<void>>;\n saveRevision: Mock<(options?: SaveRevisionOptions) => Promise<boolean>>;\n publishRevision: Mock<() => Promise<boolean>>;\n unpublishRevision: Mock<() => Promise<boolean>>;\n reset: Mock<() => void>;\n}\n\nlet base: BaseState;\n\nclass FakeBasePresenter implements ContentEntryFormPresenter.Interface {\n get vm(): ContentEntryFormPresenter.ViewModel {\n return base.vm;\n }\n\n loadRevision(id: string): Promise<void> {\n return base.loadRevision(id);\n }\n\n saveRevision(options?: SaveRevisionOptions): Promise<boolean> {\n return base.saveRevision(options);\n }\n\n publishRevision(): Promise<boolean> {\n return base.publishRevision();\n }\n\n unpublishRevision(): Promise<boolean> {\n return base.unpublishRevision();\n }\n\n deleteEntry(): Promise<boolean> {\n return Promise.resolve(true);\n }\n\n setFolderId(): void {}\n\n newEntry(): void {}\n\n patchEntryMeta(): void {}\n\n reset(): void {\n base.reset();\n }\n}\n\nconst BasePresenter = ContentEntryFormPresenter.createImplementation({\n implementation: FakeBasePresenter,\n dependencies: []\n});\n\nlet fake: EntrySession;\nlet presenter: ContentEntryFormPresenter.Interface;\n\nfunction loadedVm(\n overrides: Partial<ContentEntryFormPresenter.ViewModel> = {}\n): ContentEntryFormPresenter.ViewModel {\n return createFormVm({ entry: createEntry(), canSave: true, canPublish: true, ...overrides });\n}\n\nfunction createBase(vm: ContentEntryFormPresenter.ViewModel): BaseState {\n return {\n vm,\n loadRevision: vi.fn<(id: string) => Promise<void>>(),\n saveRevision: vi.fn<(options?: SaveRevisionOptions) => Promise<boolean>>(),\n publishRevision: vi.fn<() => Promise<boolean>>(),\n unpublishRevision: vi.fn<() => Promise<boolean>>(),\n reset: vi.fn<() => void>()\n };\n}\n\nfunction resolvePresenter(): ContentEntryFormPresenter.Interface {\n fake = createEntrySession();\n const container = new Container();\n container.registerInstance(CmsEntryReview, fake.session);\n container.register(BasePresenter);\n container.registerDecorator(CmsEntryFormPresenterReviewDecorator);\n return container.resolve(ContentEntryFormPresenter);\n}\n\ndescribe(\"CmsEntryFormPresenterReviewDecorator\", () => {\n beforeEach(() => {\n base = createBase(createFormVm({ entry: null, canSave: false, canPublish: false }));\n base.loadRevision.mockImplementation(async () => {\n base.vm = loadedVm();\n });\n base.saveRevision.mockResolvedValue(true);\n base.publishRevision.mockResolvedValue(true);\n base.unpublishRevision.mockResolvedValue(true);\n presenter = resolvePresenter();\n });\n\n it(\"initialises the shared presenter with the revision that was loaded\", async () => {\n await presenter.loadRevision(\"entry-1#0001\");\n\n expect(base.loadRevision).toHaveBeenCalledWith(\"entry-1#0001\");\n expect(fake.presenter.init).toHaveBeenCalledTimes(1);\n expect(fake.presenter.init).toHaveBeenCalledWith({\n target: { namespace: \"cms.article\", targetRevisionId: \"entry-1#0001\" },\n contentReloader: expect.any(CmsEntryContentReloader),\n unsavedChanges: expect.any(CmsEntryUnsavedChanges),\n targetTitle: \"Hello\",\n canRequest: true,\n isPublished: false,\n isUnpublished: false\n });\n });\n\n it(\"passes the original canSave as canRequest and the published flag\", async () => {\n base.loadRevision.mockImplementation(async () => {\n base.vm = loadedVm({ canSave: false, entry: createEntry({ status: \"published\" }) });\n });\n\n await presenter.loadRevision(\"entry-1#0001\");\n\n const params = fake.presenter.init.mock.calls[0][0];\n expect(params.canRequest).toBe(false);\n expect(params.isPublished).toBe(true);\n expect(params.isUnpublished).toBe(false);\n });\n\n it(\"passes isUnpublished for a revision that was published before and is unpublished now (R226, Q19)\", async () => {\n base.loadRevision.mockImplementation(async () => {\n base.vm = loadedVm({ entry: createEntry({ status: \"unpublished\" }) });\n });\n\n await presenter.loadRevision(\"entry-1#0001\");\n\n const params = fake.presenter.init.mock.calls[0][0];\n expect(params.isPublished).toBe(false);\n expect(params.isUnpublished).toBe(true);\n });\n\n it(\"leaves a singleton model alone\", async () => {\n base.vm = createFormVm({ entry: null, canSave: false, model: SINGLETON_MODEL });\n base.loadRevision.mockImplementation(async () => {\n base.vm = loadedVm({ model: SINGLETON_MODEL });\n });\n fake.setVm(LOADING);\n\n await presenter.loadRevision(\"settings#0001\");\n\n expect(fake.presenter.init).not.toHaveBeenCalled();\n expect(presenter.vm.canSave).toBe(true);\n expect(presenter.vm.canPublish).toBe(true);\n });\n\n it(\"blocks saving, new revisions and publishing while the revision is loading\", async () => {\n let finishLoading = (): void => {};\n base.vm = loadedVm({ canCreateNewRevision: true });\n base.loadRevision.mockImplementation(() => {\n return new Promise<void>(resolve => {\n finishLoading = resolve;\n });\n });\n\n const loading = presenter.loadRevision(\"entry-1#0001\");\n\n expect(presenter.vm.canSave).toBe(false);\n expect(presenter.vm.canCreateNewRevision).toBe(false);\n expect(presenter.vm.canPublish).toBe(false);\n\n finishLoading();\n await loading;\n });\n\n it.each([\n [\"no workflow\", NO_WORKFLOW, true, true],\n [\"a bound workflow and no review\", BOUND_NO_REVIEW, true, false],\n [\"an unpublished revision with no review (Q19)\", BOUND_UNPUBLISHED, true, true],\n [\"loading\", LOADING, false, false],\n [\"failed\", FAILED, false, false],\n [\"in review\", IN_REVIEW, false, false],\n [\"rejected\", REJECTED, false, false],\n [\"approved\", APPROVED, false, true]\n ])(\"applies the rule for %s\", async (_name, review, canSave, canPublish) => {\n base.vm = loadedVm({ canCreateNewRevision: true });\n base.loadRevision.mockResolvedValue(undefined);\n await presenter.loadRevision(\"entry-1#0001\");\n\n fake.setVm(review);\n\n expect(presenter.vm.canSave).toBe(canSave);\n expect(presenter.vm.canCreateNewRevision).toBe(canSave);\n expect(presenter.vm.canPublish).toBe(canPublish);\n });\n\n it(\"never grants what the original presenter denies\", async () => {\n base.loadRevision.mockImplementation(async () => {\n base.vm = loadedVm({ canSave: false, canPublish: false });\n });\n\n await presenter.loadRevision(\"entry-1#0001\");\n fake.setVm(NO_WORKFLOW);\n\n expect(presenter.vm.canSave).toBe(false);\n expect(presenter.vm.canPublish).toBe(false);\n });\n\n it(\"disposes the shared presenter on reset and stops gating\", async () => {\n await presenter.loadRevision(\"entry-1#0001\");\n fake.setVm(LOADING);\n\n presenter.reset();\n\n expect(base.reset).toHaveBeenCalledTimes(1);\n expect(fake.presenter.dispose).toHaveBeenCalledTimes(1);\n expect(presenter.vm.canSave).toBe(true);\n });\n\n it(\"ignores a load that finished after the editor was reset\", async () => {\n let finishLoading = (): void => {};\n base.loadRevision.mockImplementation(() => {\n return new Promise<void>(resolve => {\n finishLoading = resolve;\n });\n });\n\n const loading = presenter.loadRevision(\"entry-1#0001\");\n presenter.reset();\n base.vm = loadedVm();\n finishLoading();\n await loading;\n\n expect(fake.presenter.init).not.toHaveBeenCalled();\n });\n\n it(\"stops gating and rethrows when the revision load fails\", async () => {\n base.vm = loadedVm();\n base.loadRevision.mockRejectedValue(new Error(\"Load failed.\"));\n\n await expect(presenter.loadRevision(\"entry-1#0001\")).rejects.toThrow(\"Load failed.\");\n\n expect(presenter.vm.canSave).toBe(true);\n expect(presenter.vm.canPublish).toBe(true);\n expect(fake.presenter.init).not.toHaveBeenCalled();\n });\n\n it(\"stops gating when the load finishes without an entry\", async () => {\n base.loadRevision.mockImplementation(async () => {\n base.vm = createFormVm({ entry: null, canSave: true, canPublish: true });\n });\n\n await presenter.loadRevision(\"entry-1#0001\");\n\n expect(presenter.vm.canSave).toBe(true);\n expect(presenter.vm.canPublish).toBe(true);\n expect(fake.presenter.init).not.toHaveBeenCalled();\n });\n\n it(\"ignores a load that finished while another revision was loading\", async () => {\n let finishFirstLoad = (): void => {};\n let finishSecondLoad = (): void => {};\n base.loadRevision.mockImplementationOnce(() => {\n return new Promise<void>(resolve => {\n finishFirstLoad = resolve;\n });\n });\n base.loadRevision.mockImplementationOnce(() => {\n return new Promise<void>(resolve => {\n finishSecondLoad = () => {\n base.vm = loadedVm({\n entry: createEntry({ version: 2 }, { id: \"entry-1#0002\" })\n });\n resolve();\n };\n });\n });\n\n const firstLoad = presenter.loadRevision(\"entry-1#0001\");\n const secondLoad = presenter.loadRevision(\"entry-1#0002\");\n base.vm = loadedVm();\n finishFirstLoad();\n await firstLoad;\n finishSecondLoad();\n await secondLoad;\n\n expect(fake.presenter.init).toHaveBeenCalledTimes(1);\n expect(fake.presenter.init).toHaveBeenCalledWith(\n expect.objectContaining({\n target: { namespace: \"cms.article\", targetRevisionId: \"entry-1#0002\" }\n })\n );\n });\n\n it(\"does not save or publish while the revision is loading\", async () => {\n let finishLoading = (): void => {};\n base.vm = loadedVm();\n base.loadRevision.mockImplementation(() => {\n return new Promise<void>(resolve => {\n finishLoading = resolve;\n });\n });\n\n fake.setVm(NO_WORKFLOW);\n\n const loading = presenter.loadRevision(\"entry-1#0001\");\n const saved = await presenter.saveRevision();\n const published = await presenter.publishRevision();\n finishLoading();\n await loading;\n\n expect(saved).toBe(false);\n expect(published).toBe(false);\n expect(base.saveRevision).not.toHaveBeenCalled();\n expect(base.publishRevision).not.toHaveBeenCalled();\n });\n\n it(\"does not track a new entry whose first save failed\", async () => {\n presenter.newEntry();\n base.saveRevision.mockImplementation(async () => {\n base.vm = loadedVm();\n return false;\n });\n\n const saved = await presenter.saveRevision();\n\n expect(saved).toBe(false);\n expect(fake.presenter.init).not.toHaveBeenCalled();\n });\n\n it(\"tracks a new entry's review after its first save\", async () => {\n presenter.newEntry();\n base.saveRevision.mockImplementation(async () => {\n base.vm = loadedVm();\n return true;\n });\n\n const saved = await presenter.saveRevision();\n\n expect(saved).toBe(true);\n expect(fake.presenter.init).toHaveBeenCalledTimes(1);\n expect(fake.presenter.init).toHaveBeenCalledWith(\n expect.objectContaining({\n target: { namespace: \"cms.article\", targetRevisionId: \"entry-1#0001\" }\n })\n );\n });\n\n it(\"stops Save & Publish of a new entry on a bound model before publishing without a review\", async () => {\n presenter.newEntry();\n base.saveRevision.mockImplementation(async () => {\n base.vm = loadedVm();\n return true;\n });\n fake.setVm(BOUND_NO_REVIEW);\n\n await presenter.saveRevision();\n const published = await presenter.publishRevision();\n\n expect(published).toBe(false);\n expect(base.publishRevision).not.toHaveBeenCalled();\n });\n\n it(\"publishes a new entry of a model without a workflow after its first save\", async () => {\n presenter.newEntry();\n base.saveRevision.mockImplementation(async () => {\n base.vm = loadedVm();\n return true;\n });\n fake.setVm(NO_WORKFLOW);\n\n await presenter.saveRevision();\n const published = await presenter.publishRevision();\n\n expect(published).toBe(true);\n expect(base.publishRevision).toHaveBeenCalledTimes(1);\n });\n\n it(\"does not track a new entry of a singleton model after its first save\", async () => {\n base.vm = createFormVm({ entry: null, canSave: true, model: SINGLETON_MODEL });\n presenter.newEntry();\n base.saveRevision.mockImplementation(async () => {\n base.vm = loadedVm({ model: SINGLETON_MODEL });\n return true;\n });\n\n await presenter.saveRevision();\n\n expect(fake.presenter.init).not.toHaveBeenCalled();\n });\n\n it(\"passes a new entry through untouched\", () => {\n base.vm = createFormVm({ entry: null, isNewEntry: true, canSave: true, canPublish: false });\n fake.setVm(LOADING);\n\n presenter.newEntry();\n\n expect(presenter.vm.canSave).toBe(true);\n });\n\n it(\"does not save while the review forbids editing\", async () => {\n await presenter.loadRevision(\"entry-1#0001\");\n fake.setVm(IN_REVIEW);\n\n const saved = await presenter.saveRevision();\n\n expect(saved).toBe(false);\n expect(base.saveRevision).not.toHaveBeenCalled();\n });\n\n it(\"lets Save & Publish go on for a clean, unlocked approved draft\", async () => {\n await presenter.loadRevision(\"entry-1#0001\");\n fake.setVm(APPROVED);\n\n const saved = await presenter.saveRevision();\n\n expect(saved).toBe(true);\n expect(base.saveRevision).not.toHaveBeenCalled();\n });\n\n it(\"does not report a save for a dirty approved draft\", async () => {\n base.loadRevision.mockImplementation(async () => {\n base.vm = loadedVm({ isDirty: true });\n });\n await presenter.loadRevision(\"entry-1#0001\");\n fake.setVm(APPROVED);\n\n const saved = await presenter.saveRevision();\n\n expect(saved).toBe(false);\n expect(base.saveRevision).not.toHaveBeenCalled();\n });\n\n it(\"does not save, and does not offer a new revision, for an approved locked entry\", async () => {\n base.loadRevision.mockImplementation(async () => {\n base.vm = loadedVm({\n entry: createEntry({ status: \"published\", locked: true }),\n canCreateNewRevision: true\n });\n });\n await presenter.loadRevision(\"entry-1#0001\");\n fake.setVm(APPROVED);\n\n const saved = await presenter.saveRevision();\n\n expect(saved).toBe(false);\n expect(base.saveRevision).not.toHaveBeenCalled();\n expect(presenter.vm.canCreateNewRevision).toBe(false);\n });\n\n it(\"saves normally when editing is allowed and updates the context\", async () => {\n await presenter.loadRevision(\"entry-1#0001\");\n fake.setVm(NO_WORKFLOW);\n\n const saved = await presenter.saveRevision({ skipValidation: false });\n\n expect(saved).toBe(true);\n expect(base.saveRevision).toHaveBeenCalledWith({ skipValidation: false });\n expect(fake.presenter.init).toHaveBeenCalledTimes(1);\n expect(fake.presenter.setContext).toHaveBeenCalledWith({\n targetTitle: \"Hello\",\n canRequest: true,\n isPublished: false,\n isUnpublished: false\n });\n });\n\n it(\"re-initialises for the new revision a save created\", async () => {\n await presenter.loadRevision(\"entry-1#0001\");\n fake.setVm(NO_WORKFLOW);\n base.saveRevision.mockImplementation(async () => {\n base.vm = loadedVm({ entry: { ...createEntry(), id: \"entry-1#0002\" } });\n return true;\n });\n\n await presenter.saveRevision();\n\n expect(fake.presenter.init).toHaveBeenCalledTimes(2);\n const params = fake.presenter.init.mock.calls[1][0];\n expect(params.target).toEqual({\n namespace: \"cms.article\",\n targetRevisionId: \"entry-1#0002\"\n });\n expect(fake.presenter.setContext).not.toHaveBeenCalled();\n });\n\n it(\"gives the new revision a reloader after a save created it\", async () => {\n await presenter.loadRevision(\"entry-1#0001\");\n fake.setVm(NO_WORKFLOW);\n base.saveRevision.mockImplementation(async () => {\n base.vm = loadedVm({ entry: createEntry({}, { id: \"entry-1#0002\" }) });\n return true;\n });\n\n await presenter.saveRevision();\n\n const first = fake.presenter.init.mock.calls[0][0].contentReloader;\n const second = fake.presenter.init.mock.calls[1][0].contentReloader;\n expect(second).toBeInstanceOf(CmsEntryContentReloader);\n expect(second).not.toBe(first);\n });\n\n describe(\"content reloader\", () => {\n const SAVED_LATER = \"2026-10-17T11:00:00.000Z\";\n\n async function loadAndGetReloader() {\n await presenter.loadRevision(\"entry-1#0001\");\n const params = fake.presenter.init.mock.calls[0][0];\n const reloader = params.contentReloader;\n if (!reloader) {\n throw new Error(\"The init params carry no reloader.\");\n }\n return reloader;\n }\n\n it(\"reads the revision again through the original presenter and never re-initialises the review\", async () => {\n const reloader = await loadAndGetReloader();\n base.loadRevision.mockImplementation(async () => {\n base.vm = loadedVm({\n entry: createEntry({}, { revisionSavedOn: SAVED_LATER })\n });\n });\n\n const changed = await reloader.reload();\n\n expect(changed).toBe(true);\n expect(base.loadRevision).toHaveBeenCalledTimes(2);\n expect(base.loadRevision).toHaveBeenLastCalledWith(\"entry-1#0001\");\n expect(fake.presenter.init).toHaveBeenCalledTimes(1);\n expect(fake.presenter.setContext).not.toHaveBeenCalled();\n expect(fake.presenter.dispose).not.toHaveBeenCalled();\n });\n });\n\n it(\"does not publish while the review forbids it\", async () => {\n await presenter.loadRevision(\"entry-1#0001\");\n fake.setVm(IN_REVIEW);\n\n const published = await presenter.publishRevision();\n\n expect(published).toBe(false);\n expect(base.publishRevision).not.toHaveBeenCalled();\n });\n\n it(\"sets the published flag without reloading after a publish\", async () => {\n await presenter.loadRevision(\"entry-1#0001\");\n fake.setVm(APPROVED);\n base.publishRevision.mockImplementation(async () => {\n base.vm = loadedVm({ entry: createEntry({ status: \"published\" }) });\n return true;\n });\n\n const published = await presenter.publishRevision();\n\n expect(published).toBe(true);\n expect(fake.presenter.init).toHaveBeenCalledTimes(1);\n expect(fake.presenter.setContext).toHaveBeenCalledWith({\n targetTitle: \"Hello\",\n canRequest: true,\n isPublished: true,\n isUnpublished: false\n });\n });\n\n it(\"clears the published flag without reloading after an unpublish\", async () => {\n base.loadRevision.mockImplementation(async () => {\n base.vm = loadedVm({ entry: createEntry({ status: \"published\" }) });\n });\n await presenter.loadRevision(\"entry-1#0001\");\n base.unpublishRevision.mockImplementation(async () => {\n base.vm = loadedVm({ entry: createEntry({ status: \"unpublished\" }) });\n return true;\n });\n\n await presenter.unpublishRevision();\n\n expect(fake.presenter.init).toHaveBeenCalledTimes(1);\n const context = fake.presenter.setContext.mock.calls[0][0];\n expect(context.isPublished).toBe(false);\n expect(context.isUnpublished).toBe(true);\n });\n\n it(\"does not update the review context after an unpublish of an untracked entry\", async () => {\n base.vm = loadedVm({ entry: createEntry({ status: \"published\" }) });\n base.unpublishRevision.mockImplementation(async () => {\n base.vm = loadedVm({ entry: createEntry({ status: \"unpublished\" }) });\n return true;\n });\n\n const unpublished = await presenter.unpublishRevision();\n\n expect(unpublished).toBe(true);\n expect(fake.presenter.setContext).not.toHaveBeenCalled();\n });\n});\n"],"names":["base","FakeBasePresenter","id","options","Promise","BasePresenter","ContentEntryFormPresenter","fake","presenter","loadedVm","overrides","createFormVm","createEntry","createBase","vm","vi","resolvePresenter","createEntrySession","container","Container","CmsEntryReview","CmsEntryFormPresenterReviewDecorator","describe","beforeEach","it","expect","CmsEntryContentReloader","CmsEntryUnsavedChanges","params","SINGLETON_MODEL","LOADING","finishLoading","resolve","loading","NO_WORKFLOW","BOUND_NO_REVIEW","BOUND_UNPUBLISHED","FAILED","IN_REVIEW","REJECTED","APPROVED","_name","review","canSave","canPublish","undefined","Error","finishFirstLoad","finishSecondLoad","firstLoad","secondLoad","saved","published","first","second","SAVED_LATER","loadAndGetReloader","reloader","changed","context","unpublished"],"mappings":";;;;;;;;;;;;AAuCA,IAAIA;AAEJ,MAAMC;IACF,IAAI,KAA0C;QAC1C,OAAOD,KAAK,EAAE;IAClB;IAEA,aAAaE,EAAU,EAAiB;QACpC,OAAOF,KAAK,YAAY,CAACE;IAC7B;IAEA,aAAaC,OAA6B,EAAoB;QAC1D,OAAOH,KAAK,YAAY,CAACG;IAC7B;IAEA,kBAAoC;QAChC,OAAOH,KAAK,eAAe;IAC/B;IAEA,oBAAsC;QAClC,OAAOA,KAAK,iBAAiB;IACjC;IAEA,cAAgC;QAC5B,OAAOI,QAAQ,OAAO,CAAC;IAC3B;IAEA,cAAoB,CAAC;IAErB,WAAiB,CAAC;IAElB,iBAAuB,CAAC;IAExB,QAAc;QACVJ,KAAK,KAAK;IACd;AACJ;AAEA,MAAMK,gBAAgBC,0BAA0B,oBAAoB,CAAC;IACjE,gBAAgBL;IAChB,cAAc,EAAE;AACpB;AAEA,IAAIM;AACJ,IAAIC;AAEJ,SAASC,SACLC,YAA0D,CAAC,CAAC;IAE5D,OAAOC,aAAa;QAAE,OAAOC;QAAe,SAAS;QAAM,YAAY;QAAM,GAAGF,SAAS;IAAC;AAC9F;AAEA,SAASG,WAAWC,EAAuC;IACvD,OAAO;QACHA;QACA,cAAcC,GAAG,EAAE;QACnB,cAAcA,GAAG,EAAE;QACnB,iBAAiBA,GAAG,EAAE;QACtB,mBAAmBA,GAAG,EAAE;QACxB,OAAOA,GAAG,EAAE;IAChB;AACJ;AAEA,SAASC;IACLT,OAAOU;IACP,MAAMC,YAAY,IAAIC;IACtBD,UAAU,gBAAgB,CAACE,gBAAgBb,KAAK,OAAO;IACvDW,UAAU,QAAQ,CAACb;IACnBa,UAAU,iBAAiB,CAACG;IAC5B,OAAOH,UAAU,OAAO,CAACZ;AAC7B;AAEAgB,SAAS,wCAAwC;IAC7CC,WAAW;QACPvB,OAAOa,WAAWF,aAAa;YAAE,OAAO;YAAM,SAAS;YAAO,YAAY;QAAM;QAChFX,KAAK,YAAY,CAAC,kBAAkB,CAAC;YACjCA,KAAK,EAAE,GAAGS;QACd;QACAT,KAAK,YAAY,CAAC,iBAAiB,CAAC;QACpCA,KAAK,eAAe,CAAC,iBAAiB,CAAC;QACvCA,KAAK,iBAAiB,CAAC,iBAAiB,CAAC;QACzCQ,YAAYQ;IAChB;IAEAQ,GAAG,sEAAsE;QACrE,MAAMhB,UAAU,YAAY,CAAC;QAE7BiB,OAAOzB,KAAK,YAAY,EAAE,oBAAoB,CAAC;QAC/CyB,OAAOlB,KAAK,SAAS,CAAC,IAAI,EAAE,qBAAqB,CAAC;QAClDkB,OAAOlB,KAAK,SAAS,CAAC,IAAI,EAAE,oBAAoB,CAAC;YAC7C,QAAQ;gBAAE,WAAW;gBAAe,kBAAkB;YAAe;YACrE,iBAAiBkB,OAAO,GAAG,CAACC;YAC5B,gBAAgBD,OAAO,GAAG,CAACE;YAC3B,aAAa;YACb,YAAY;YACZ,aAAa;YACb,eAAe;QACnB;IACJ;IAEAH,GAAG,oEAAoE;QACnExB,KAAK,YAAY,CAAC,kBAAkB,CAAC;YACjCA,KAAK,EAAE,GAAGS,SAAS;gBAAE,SAAS;gBAAO,OAAOG,YAAY;oBAAE,QAAQ;gBAAY;YAAG;QACrF;QAEA,MAAMJ,UAAU,YAAY,CAAC;QAE7B,MAAMoB,SAASrB,KAAK,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;QACnDkB,OAAOG,OAAO,UAAU,EAAE,IAAI,CAAC;QAC/BH,OAAOG,OAAO,WAAW,EAAE,IAAI,CAAC;QAChCH,OAAOG,OAAO,aAAa,EAAE,IAAI,CAAC;IACtC;IAEAJ,GAAG,oGAAoG;QACnGxB,KAAK,YAAY,CAAC,kBAAkB,CAAC;YACjCA,KAAK,EAAE,GAAGS,SAAS;gBAAE,OAAOG,YAAY;oBAAE,QAAQ;gBAAc;YAAG;QACvE;QAEA,MAAMJ,UAAU,YAAY,CAAC;QAE7B,MAAMoB,SAASrB,KAAK,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;QACnDkB,OAAOG,OAAO,WAAW,EAAE,IAAI,CAAC;QAChCH,OAAOG,OAAO,aAAa,EAAE,IAAI,CAAC;IACtC;IAEAJ,GAAG,kCAAkC;QACjCxB,KAAK,EAAE,GAAGW,aAAa;YAAE,OAAO;YAAM,SAAS;YAAO,OAAOkB;QAAgB;QAC7E7B,KAAK,YAAY,CAAC,kBAAkB,CAAC;YACjCA,KAAK,EAAE,GAAGS,SAAS;gBAAE,OAAOoB;YAAgB;QAChD;QACAtB,KAAK,KAAK,CAACuB;QAEX,MAAMtB,UAAU,YAAY,CAAC;QAE7BiB,OAAOlB,KAAK,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,gBAAgB;QAChDkB,OAAOjB,UAAU,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC;QAClCiB,OAAOjB,UAAU,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC;IACzC;IAEAgB,GAAG,6EAA6E;QAC5E,IAAIO,gBAAgB,KAAa;QACjC/B,KAAK,EAAE,GAAGS,SAAS;YAAE,sBAAsB;QAAK;QAChDT,KAAK,YAAY,CAAC,kBAAkB,CAAC,IAC1B,IAAII,QAAc4B,CAAAA;gBACrBD,gBAAgBC;YACpB;QAGJ,MAAMC,UAAUzB,UAAU,YAAY,CAAC;QAEvCiB,OAAOjB,UAAU,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC;QAClCiB,OAAOjB,UAAU,EAAE,CAAC,oBAAoB,EAAE,IAAI,CAAC;QAC/CiB,OAAOjB,UAAU,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC;QAErCuB;QACA,MAAME;IACV;IAEAT,GAAG,IAAI,CAAC;QACJ;YAAC;YAAeU;YAAa;YAAM;SAAK;QACxC;YAAC;YAAkCC;YAAiB;YAAM;SAAM;QAChE;YAAC;YAAgDC;YAAmB;YAAM;SAAK;QAC/E;YAAC;YAAWN;YAAS;YAAO;SAAM;QAClC;YAAC;YAAUO;YAAQ;YAAO;SAAM;QAChC;YAAC;YAAaC;YAAW;YAAO;SAAM;QACtC;YAAC;YAAYC;YAAU;YAAO;SAAM;QACpC;YAAC;YAAYC;YAAU;YAAO;SAAK;KACtC,EAAE,2BAA2B,OAAOC,OAAOC,QAAQC,SAASC;QACzD5C,KAAK,EAAE,GAAGS,SAAS;YAAE,sBAAsB;QAAK;QAChDT,KAAK,YAAY,CAAC,iBAAiB,CAAC6C;QACpC,MAAMrC,UAAU,YAAY,CAAC;QAE7BD,KAAK,KAAK,CAACmC;QAEXjB,OAAOjB,UAAU,EAAE,CAAC,OAAO,EAAE,IAAI,CAACmC;QAClClB,OAAOjB,UAAU,EAAE,CAAC,oBAAoB,EAAE,IAAI,CAACmC;QAC/ClB,OAAOjB,UAAU,EAAE,CAAC,UAAU,EAAE,IAAI,CAACoC;IACzC;IAEApB,GAAG,mDAAmD;QAClDxB,KAAK,YAAY,CAAC,kBAAkB,CAAC;YACjCA,KAAK,EAAE,GAAGS,SAAS;gBAAE,SAAS;gBAAO,YAAY;YAAM;QAC3D;QAEA,MAAMD,UAAU,YAAY,CAAC;QAC7BD,KAAK,KAAK,CAAC2B;QAEXT,OAAOjB,UAAU,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC;QAClCiB,OAAOjB,UAAU,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC;IACzC;IAEAgB,GAAG,2DAA2D;QAC1D,MAAMhB,UAAU,YAAY,CAAC;QAC7BD,KAAK,KAAK,CAACuB;QAEXtB,UAAU,KAAK;QAEfiB,OAAOzB,KAAK,KAAK,EAAE,qBAAqB,CAAC;QACzCyB,OAAOlB,KAAK,SAAS,CAAC,OAAO,EAAE,qBAAqB,CAAC;QACrDkB,OAAOjB,UAAU,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC;IACtC;IAEAgB,GAAG,2DAA2D;QAC1D,IAAIO,gBAAgB,KAAa;QACjC/B,KAAK,YAAY,CAAC,kBAAkB,CAAC,IAC1B,IAAII,QAAc4B,CAAAA;gBACrBD,gBAAgBC;YACpB;QAGJ,MAAMC,UAAUzB,UAAU,YAAY,CAAC;QACvCA,UAAU,KAAK;QACfR,KAAK,EAAE,GAAGS;QACVsB;QACA,MAAME;QAENR,OAAOlB,KAAK,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,gBAAgB;IACpD;IAEAiB,GAAG,0DAA0D;QACzDxB,KAAK,EAAE,GAAGS;QACVT,KAAK,YAAY,CAAC,iBAAiB,CAAC,IAAI8C,MAAM;QAE9C,MAAMrB,OAAOjB,UAAU,YAAY,CAAC,iBAAiB,OAAO,CAAC,OAAO,CAAC;QAErEiB,OAAOjB,UAAU,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC;QAClCiB,OAAOjB,UAAU,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC;QACrCiB,OAAOlB,KAAK,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,gBAAgB;IACpD;IAEAiB,GAAG,wDAAwD;QACvDxB,KAAK,YAAY,CAAC,kBAAkB,CAAC;YACjCA,KAAK,EAAE,GAAGW,aAAa;gBAAE,OAAO;gBAAM,SAAS;gBAAM,YAAY;YAAK;QAC1E;QAEA,MAAMH,UAAU,YAAY,CAAC;QAE7BiB,OAAOjB,UAAU,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC;QAClCiB,OAAOjB,UAAU,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC;QACrCiB,OAAOlB,KAAK,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,gBAAgB;IACpD;IAEAiB,GAAG,mEAAmE;QAClE,IAAIuB,kBAAkB,KAAa;QACnC,IAAIC,mBAAmB,KAAa;QACpChD,KAAK,YAAY,CAAC,sBAAsB,CAAC,IAC9B,IAAII,QAAc4B,CAAAA;gBACrBe,kBAAkBf;YACtB;QAEJhC,KAAK,YAAY,CAAC,sBAAsB,CAAC,IAC9B,IAAII,QAAc4B,CAAAA;gBACrBgB,mBAAmB;oBACfhD,KAAK,EAAE,GAAGS,SAAS;wBACf,OAAOG,YAAY;4BAAE,SAAS;wBAAE,GAAG;4BAAE,IAAI;wBAAe;oBAC5D;oBACAoB;gBACJ;YACJ;QAGJ,MAAMiB,YAAYzC,UAAU,YAAY,CAAC;QACzC,MAAM0C,aAAa1C,UAAU,YAAY,CAAC;QAC1CR,KAAK,EAAE,GAAGS;QACVsC;QACA,MAAME;QACND;QACA,MAAME;QAENzB,OAAOlB,KAAK,SAAS,CAAC,IAAI,EAAE,qBAAqB,CAAC;QAClDkB,OAAOlB,KAAK,SAAS,CAAC,IAAI,EAAE,oBAAoB,CAC5CkB,OAAO,gBAAgB,CAAC;YACpB,QAAQ;gBAAE,WAAW;gBAAe,kBAAkB;YAAe;QACzE;IAER;IAEAD,GAAG,0DAA0D;QACzD,IAAIO,gBAAgB,KAAa;QACjC/B,KAAK,EAAE,GAAGS;QACVT,KAAK,YAAY,CAAC,kBAAkB,CAAC,IAC1B,IAAII,QAAc4B,CAAAA;gBACrBD,gBAAgBC;YACpB;QAGJzB,KAAK,KAAK,CAAC2B;QAEX,MAAMD,UAAUzB,UAAU,YAAY,CAAC;QACvC,MAAM2C,QAAQ,MAAM3C,UAAU,YAAY;QAC1C,MAAM4C,YAAY,MAAM5C,UAAU,eAAe;QACjDuB;QACA,MAAME;QAENR,OAAO0B,OAAO,IAAI,CAAC;QACnB1B,OAAO2B,WAAW,IAAI,CAAC;QACvB3B,OAAOzB,KAAK,YAAY,EAAE,GAAG,CAAC,gBAAgB;QAC9CyB,OAAOzB,KAAK,eAAe,EAAE,GAAG,CAAC,gBAAgB;IACrD;IAEAwB,GAAG,sDAAsD;QACrDhB,UAAU,QAAQ;QAClBR,KAAK,YAAY,CAAC,kBAAkB,CAAC;YACjCA,KAAK,EAAE,GAAGS;YACV,OAAO;QACX;QAEA,MAAM0C,QAAQ,MAAM3C,UAAU,YAAY;QAE1CiB,OAAO0B,OAAO,IAAI,CAAC;QACnB1B,OAAOlB,KAAK,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,gBAAgB;IACpD;IAEAiB,GAAG,oDAAoD;QACnDhB,UAAU,QAAQ;QAClBR,KAAK,YAAY,CAAC,kBAAkB,CAAC;YACjCA,KAAK,EAAE,GAAGS;YACV,OAAO;QACX;QAEA,MAAM0C,QAAQ,MAAM3C,UAAU,YAAY;QAE1CiB,OAAO0B,OAAO,IAAI,CAAC;QACnB1B,OAAOlB,KAAK,SAAS,CAAC,IAAI,EAAE,qBAAqB,CAAC;QAClDkB,OAAOlB,KAAK,SAAS,CAAC,IAAI,EAAE,oBAAoB,CAC5CkB,OAAO,gBAAgB,CAAC;YACpB,QAAQ;gBAAE,WAAW;gBAAe,kBAAkB;YAAe;QACzE;IAER;IAEAD,GAAG,2FAA2F;QAC1FhB,UAAU,QAAQ;QAClBR,KAAK,YAAY,CAAC,kBAAkB,CAAC;YACjCA,KAAK,EAAE,GAAGS;YACV,OAAO;QACX;QACAF,KAAK,KAAK,CAAC4B;QAEX,MAAM3B,UAAU,YAAY;QAC5B,MAAM4C,YAAY,MAAM5C,UAAU,eAAe;QAEjDiB,OAAO2B,WAAW,IAAI,CAAC;QACvB3B,OAAOzB,KAAK,eAAe,EAAE,GAAG,CAAC,gBAAgB;IACrD;IAEAwB,GAAG,4EAA4E;QAC3EhB,UAAU,QAAQ;QAClBR,KAAK,YAAY,CAAC,kBAAkB,CAAC;YACjCA,KAAK,EAAE,GAAGS;YACV,OAAO;QACX;QACAF,KAAK,KAAK,CAAC2B;QAEX,MAAM1B,UAAU,YAAY;QAC5B,MAAM4C,YAAY,MAAM5C,UAAU,eAAe;QAEjDiB,OAAO2B,WAAW,IAAI,CAAC;QACvB3B,OAAOzB,KAAK,eAAe,EAAE,qBAAqB,CAAC;IACvD;IAEAwB,GAAG,wEAAwE;QACvExB,KAAK,EAAE,GAAGW,aAAa;YAAE,OAAO;YAAM,SAAS;YAAM,OAAOkB;QAAgB;QAC5ErB,UAAU,QAAQ;QAClBR,KAAK,YAAY,CAAC,kBAAkB,CAAC;YACjCA,KAAK,EAAE,GAAGS,SAAS;gBAAE,OAAOoB;YAAgB;YAC5C,OAAO;QACX;QAEA,MAAMrB,UAAU,YAAY;QAE5BiB,OAAOlB,KAAK,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,gBAAgB;IACpD;IAEAiB,GAAG,wCAAwC;QACvCxB,KAAK,EAAE,GAAGW,aAAa;YAAE,OAAO;YAAM,YAAY;YAAM,SAAS;YAAM,YAAY;QAAM;QACzFJ,KAAK,KAAK,CAACuB;QAEXtB,UAAU,QAAQ;QAElBiB,OAAOjB,UAAU,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC;IACtC;IAEAgB,GAAG,kDAAkD;QACjD,MAAMhB,UAAU,YAAY,CAAC;QAC7BD,KAAK,KAAK,CAAC+B;QAEX,MAAMa,QAAQ,MAAM3C,UAAU,YAAY;QAE1CiB,OAAO0B,OAAO,IAAI,CAAC;QACnB1B,OAAOzB,KAAK,YAAY,EAAE,GAAG,CAAC,gBAAgB;IAClD;IAEAwB,GAAG,kEAAkE;QACjE,MAAMhB,UAAU,YAAY,CAAC;QAC7BD,KAAK,KAAK,CAACiC;QAEX,MAAMW,QAAQ,MAAM3C,UAAU,YAAY;QAE1CiB,OAAO0B,OAAO,IAAI,CAAC;QACnB1B,OAAOzB,KAAK,YAAY,EAAE,GAAG,CAAC,gBAAgB;IAClD;IAEAwB,GAAG,qDAAqD;QACpDxB,KAAK,YAAY,CAAC,kBAAkB,CAAC;YACjCA,KAAK,EAAE,GAAGS,SAAS;gBAAE,SAAS;YAAK;QACvC;QACA,MAAMD,UAAU,YAAY,CAAC;QAC7BD,KAAK,KAAK,CAACiC;QAEX,MAAMW,QAAQ,MAAM3C,UAAU,YAAY;QAE1CiB,OAAO0B,OAAO,IAAI,CAAC;QACnB1B,OAAOzB,KAAK,YAAY,EAAE,GAAG,CAAC,gBAAgB;IAClD;IAEAwB,GAAG,kFAAkF;QACjFxB,KAAK,YAAY,CAAC,kBAAkB,CAAC;YACjCA,KAAK,EAAE,GAAGS,SAAS;gBACf,OAAOG,YAAY;oBAAE,QAAQ;oBAAa,QAAQ;gBAAK;gBACvD,sBAAsB;YAC1B;QACJ;QACA,MAAMJ,UAAU,YAAY,CAAC;QAC7BD,KAAK,KAAK,CAACiC;QAEX,MAAMW,QAAQ,MAAM3C,UAAU,YAAY;QAE1CiB,OAAO0B,OAAO,IAAI,CAAC;QACnB1B,OAAOzB,KAAK,YAAY,EAAE,GAAG,CAAC,gBAAgB;QAC9CyB,OAAOjB,UAAU,EAAE,CAAC,oBAAoB,EAAE,IAAI,CAAC;IACnD;IAEAgB,GAAG,kEAAkE;QACjE,MAAMhB,UAAU,YAAY,CAAC;QAC7BD,KAAK,KAAK,CAAC2B;QAEX,MAAMiB,QAAQ,MAAM3C,UAAU,YAAY,CAAC;YAAE,gBAAgB;QAAM;QAEnEiB,OAAO0B,OAAO,IAAI,CAAC;QACnB1B,OAAOzB,KAAK,YAAY,EAAE,oBAAoB,CAAC;YAAE,gBAAgB;QAAM;QACvEyB,OAAOlB,KAAK,SAAS,CAAC,IAAI,EAAE,qBAAqB,CAAC;QAClDkB,OAAOlB,KAAK,SAAS,CAAC,UAAU,EAAE,oBAAoB,CAAC;YACnD,aAAa;YACb,YAAY;YACZ,aAAa;YACb,eAAe;QACnB;IACJ;IAEAiB,GAAG,sDAAsD;QACrD,MAAMhB,UAAU,YAAY,CAAC;QAC7BD,KAAK,KAAK,CAAC2B;QACXlC,KAAK,YAAY,CAAC,kBAAkB,CAAC;YACjCA,KAAK,EAAE,GAAGS,SAAS;gBAAE,OAAO;oBAAE,GAAGG,aAAa;oBAAE,IAAI;gBAAe;YAAE;YACrE,OAAO;QACX;QAEA,MAAMJ,UAAU,YAAY;QAE5BiB,OAAOlB,KAAK,SAAS,CAAC,IAAI,EAAE,qBAAqB,CAAC;QAClD,MAAMqB,SAASrB,KAAK,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;QACnDkB,OAAOG,OAAO,MAAM,EAAE,OAAO,CAAC;YAC1B,WAAW;YACX,kBAAkB;QACtB;QACAH,OAAOlB,KAAK,SAAS,CAAC,UAAU,EAAE,GAAG,CAAC,gBAAgB;IAC1D;IAEAiB,GAAG,6DAA6D;QAC5D,MAAMhB,UAAU,YAAY,CAAC;QAC7BD,KAAK,KAAK,CAAC2B;QACXlC,KAAK,YAAY,CAAC,kBAAkB,CAAC;YACjCA,KAAK,EAAE,GAAGS,SAAS;gBAAE,OAAOG,YAAY,CAAC,GAAG;oBAAE,IAAI;gBAAe;YAAG;YACpE,OAAO;QACX;QAEA,MAAMJ,UAAU,YAAY;QAE5B,MAAM6C,QAAQ9C,KAAK,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,eAAe;QAClE,MAAM+C,SAAS/C,KAAK,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,eAAe;QACnEkB,OAAO6B,QAAQ,cAAc,CAAC5B;QAC9BD,OAAO6B,QAAQ,GAAG,CAAC,IAAI,CAACD;IAC5B;IAEA/B,SAAS,oBAAoB;QACzB,MAAMiC,cAAc;QAEpB,eAAeC;YACX,MAAMhD,UAAU,YAAY,CAAC;YAC7B,MAAMoB,SAASrB,KAAK,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;YACnD,MAAMkD,WAAW7B,OAAO,eAAe;YACvC,IAAI,CAAC6B,UACD,MAAM,IAAIX,MAAM;YAEpB,OAAOW;QACX;QAEAjC,GAAG,+FAA+F;YAC9F,MAAMiC,WAAW,MAAMD;YACvBxD,KAAK,YAAY,CAAC,kBAAkB,CAAC;gBACjCA,KAAK,EAAE,GAAGS,SAAS;oBACf,OAAOG,YAAY,CAAC,GAAG;wBAAE,iBAAiB2C;oBAAY;gBAC1D;YACJ;YAEA,MAAMG,UAAU,MAAMD,SAAS,MAAM;YAErChC,OAAOiC,SAAS,IAAI,CAAC;YACrBjC,OAAOzB,KAAK,YAAY,EAAE,qBAAqB,CAAC;YAChDyB,OAAOzB,KAAK,YAAY,EAAE,wBAAwB,CAAC;YACnDyB,OAAOlB,KAAK,SAAS,CAAC,IAAI,EAAE,qBAAqB,CAAC;YAClDkB,OAAOlB,KAAK,SAAS,CAAC,UAAU,EAAE,GAAG,CAAC,gBAAgB;YACtDkB,OAAOlB,KAAK,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,gBAAgB;QACvD;IACJ;IAEAiB,GAAG,gDAAgD;QAC/C,MAAMhB,UAAU,YAAY,CAAC;QAC7BD,KAAK,KAAK,CAAC+B;QAEX,MAAMc,YAAY,MAAM5C,UAAU,eAAe;QAEjDiB,OAAO2B,WAAW,IAAI,CAAC;QACvB3B,OAAOzB,KAAK,eAAe,EAAE,GAAG,CAAC,gBAAgB;IACrD;IAEAwB,GAAG,6DAA6D;QAC5D,MAAMhB,UAAU,YAAY,CAAC;QAC7BD,KAAK,KAAK,CAACiC;QACXxC,KAAK,eAAe,CAAC,kBAAkB,CAAC;YACpCA,KAAK,EAAE,GAAGS,SAAS;gBAAE,OAAOG,YAAY;oBAAE,QAAQ;gBAAY;YAAG;YACjE,OAAO;QACX;QAEA,MAAMwC,YAAY,MAAM5C,UAAU,eAAe;QAEjDiB,OAAO2B,WAAW,IAAI,CAAC;QACvB3B,OAAOlB,KAAK,SAAS,CAAC,IAAI,EAAE,qBAAqB,CAAC;QAClDkB,OAAOlB,KAAK,SAAS,CAAC,UAAU,EAAE,oBAAoB,CAAC;YACnD,aAAa;YACb,YAAY;YACZ,aAAa;YACb,eAAe;QACnB;IACJ;IAEAiB,GAAG,kEAAkE;QACjExB,KAAK,YAAY,CAAC,kBAAkB,CAAC;YACjCA,KAAK,EAAE,GAAGS,SAAS;gBAAE,OAAOG,YAAY;oBAAE,QAAQ;gBAAY;YAAG;QACrE;QACA,MAAMJ,UAAU,YAAY,CAAC;QAC7BR,KAAK,iBAAiB,CAAC,kBAAkB,CAAC;YACtCA,KAAK,EAAE,GAAGS,SAAS;gBAAE,OAAOG,YAAY;oBAAE,QAAQ;gBAAc;YAAG;YACnE,OAAO;QACX;QAEA,MAAMJ,UAAU,iBAAiB;QAEjCiB,OAAOlB,KAAK,SAAS,CAAC,IAAI,EAAE,qBAAqB,CAAC;QAClD,MAAMoD,UAAUpD,KAAK,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;QAC1DkB,OAAOkC,QAAQ,WAAW,EAAE,IAAI,CAAC;QACjClC,OAAOkC,QAAQ,aAAa,EAAE,IAAI,CAAC;IACvC;IAEAnC,GAAG,+EAA+E;QAC9ExB,KAAK,EAAE,GAAGS,SAAS;YAAE,OAAOG,YAAY;gBAAE,QAAQ;YAAY;QAAG;QACjEZ,KAAK,iBAAiB,CAAC,kBAAkB,CAAC;YACtCA,KAAK,EAAE,GAAGS,SAAS;gBAAE,OAAOG,YAAY;oBAAE,QAAQ;gBAAc;YAAG;YACnE,OAAO;QACX;QAEA,MAAMgD,cAAc,MAAMpD,UAAU,iBAAiB;QAErDiB,OAAOmC,aAAa,IAAI,CAAC;QACzBnC,OAAOlB,KAAK,SAAS,CAAC,UAAU,EAAE,GAAG,CAAC,gBAAgB;IAC1D;AACJ"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ContentEntryFormPresenter } from "@webiny/app-headless-cms/presentation/contentEntries/form/abstractions.js";
|
|
2
|
+
import type { IReviewUnsavedChanges } from "@webiny/app-workflows/review/content/IReviewUnsavedChanges.js";
|
|
3
|
+
export declare class CmsEntryUnsavedChanges implements IReviewUnsavedChanges {
|
|
4
|
+
private readonly form;
|
|
5
|
+
constructor(form: ContentEntryFormPresenter.Interface);
|
|
6
|
+
getRequestBlockReason(): string | null;
|
|
7
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
class CmsEntryUnsavedChanges {
|
|
2
|
+
constructor(form){
|
|
3
|
+
this.form = form;
|
|
4
|
+
}
|
|
5
|
+
getRequestBlockReason() {
|
|
6
|
+
if (this.form.vm.isDirty) return "Save your changes before requesting a review.";
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export { CmsEntryUnsavedChanges };
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=CmsEntryUnsavedChanges.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation/CmsEntryUnsavedChanges.js","sources":["../../src/presentation/CmsEntryUnsavedChanges.ts"],"sourcesContent":["import type { ContentEntryFormPresenter } from \"@webiny/app-headless-cms/presentation/contentEntries/form/abstractions.js\";\nimport type { IReviewUnsavedChanges } from \"@webiny/app-workflows/review/content/IReviewUnsavedChanges.js\";\n\n/*\n * Blocks Request review while the entry form has edits that are not saved: the review would read\n * the stored revision, not what the editor shows. It reads the undecorated form presenter's view\n * model, so the bar follows the form live.\n */\nexport class CmsEntryUnsavedChanges implements IReviewUnsavedChanges {\n constructor(private readonly form: ContentEntryFormPresenter.Interface) {}\n\n getRequestBlockReason(): string | null {\n if (this.form.vm.isDirty) {\n return \"Save your changes before requesting a review.\";\n }\n return null;\n }\n}\n"],"names":["CmsEntryUnsavedChanges","form"],"mappings":"AAQO,MAAMA;IACT,YAA6BC,IAAyC,CAAE;aAA3CA,IAAI,GAAJA;IAA4C;IAEzE,wBAAuC;QACnC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EACpB,OAAO;QAEX,OAAO;IACX;AACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { createEntry } from "../testing/createEntry.js";
|
|
3
|
+
import { createFormVm } from "../testing/createFormVm.js";
|
|
4
|
+
import { CmsEntryUnsavedChanges } from "./CmsEntryUnsavedChanges.js";
|
|
5
|
+
const createUnsavedChanges = (isDirty)=>{
|
|
6
|
+
const form = {
|
|
7
|
+
vm: createFormVm({
|
|
8
|
+
entry: createEntry(),
|
|
9
|
+
isDirty
|
|
10
|
+
})
|
|
11
|
+
};
|
|
12
|
+
return new CmsEntryUnsavedChanges(form);
|
|
13
|
+
};
|
|
14
|
+
describe("CmsEntryUnsavedChanges", ()=>{
|
|
15
|
+
it("blocks Request review while the form has unsaved edits", ()=>{
|
|
16
|
+
expect(createUnsavedChanges(true).getRequestBlockReason()).toBe("Save your changes before requesting a review.");
|
|
17
|
+
});
|
|
18
|
+
it("does not block a clean form", ()=>{
|
|
19
|
+
expect(createUnsavedChanges(false).getRequestBlockReason()).toBeNull();
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=CmsEntryUnsavedChanges.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation/CmsEntryUnsavedChanges.test.js","sources":["../../src/presentation/CmsEntryUnsavedChanges.test.ts"],"sourcesContent":["import { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport type { ContentEntryFormPresenter } from \"@webiny/app-headless-cms/presentation/contentEntries/form/abstractions.js\";\nimport { createEntry } from \"~/testing/createEntry.js\";\nimport { createFormVm } from \"~/testing/createFormVm.js\";\nimport { CmsEntryUnsavedChanges } from \"./CmsEntryUnsavedChanges.js\";\n\nconst createUnsavedChanges = (isDirty: boolean) => {\n const form = {\n vm: createFormVm({ entry: createEntry(), isDirty })\n } as unknown as ContentEntryFormPresenter.Interface;\n return new CmsEntryUnsavedChanges(form);\n};\n\ndescribe(\"CmsEntryUnsavedChanges\", () => {\n it(\"blocks Request review while the form has unsaved edits\", () => {\n expect(createUnsavedChanges(true).getRequestBlockReason()).toBe(\n \"Save your changes before requesting a review.\"\n );\n });\n\n it(\"does not block a clean form\", () => {\n expect(createUnsavedChanges(false).getRequestBlockReason()).toBeNull();\n });\n});\n"],"names":["createUnsavedChanges","isDirty","form","createFormVm","createEntry","CmsEntryUnsavedChanges","describe","it","expect"],"mappings":";;;;AAQA,MAAMA,uBAAuB,CAACC;IAC1B,MAAMC,OAAO;QACT,IAAIC,aAAa;YAAE,OAAOC;YAAeH;QAAQ;IACrD;IACA,OAAO,IAAII,uBAAuBH;AACtC;AAEAI,SAAS,0BAA0B;IAC/BC,GAAG,0DAA0D;QACzDC,OAAOR,qBAAqB,MAAM,qBAAqB,IAAI,IAAI,CAC3D;IAER;IAEAO,GAAG,+BAA+B;QAC9BC,OAAOR,qBAAqB,OAAO,qBAAqB,IAAI,QAAQ;IACxE;AACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { Container } from "@webiny/di";
|
|
3
|
+
import { GetEntryGraphQLFieldSelection, ListEntriesGraphQLFieldSelection } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
|
|
4
|
+
import { REVIEW_SYSTEM_WORKFLOW_SELECTION } from "@webiny/app-workflows/review/gateway/reviewFields.js";
|
|
5
|
+
import { CmsReviewGetEntryFieldSelection } from "./CmsReviewGetEntryFieldSelection.js";
|
|
6
|
+
import { CmsReviewListEntriesFieldSelection } from "./CmsReviewListEntriesFieldSelection.js";
|
|
7
|
+
const EXPECTED = `meta { system { workflow { ${REVIEW_SYSTEM_WORKFLOW_SELECTION} } } }`;
|
|
8
|
+
describe("CMS review field selections", ()=>{
|
|
9
|
+
it("selects the review shape of system.workflow on the entry list", ()=>{
|
|
10
|
+
const container = new Container();
|
|
11
|
+
container.register(CmsReviewListEntriesFieldSelection);
|
|
12
|
+
const selection = container.resolve(ListEntriesGraphQLFieldSelection).getSelection();
|
|
13
|
+
expect(selection).toEqual([
|
|
14
|
+
EXPECTED
|
|
15
|
+
]);
|
|
16
|
+
});
|
|
17
|
+
it("selects the review shape of system.workflow on an entry read", ()=>{
|
|
18
|
+
const container = new Container();
|
|
19
|
+
container.register(CmsReviewGetEntryFieldSelection);
|
|
20
|
+
const selection = container.resolve(GetEntryGraphQLFieldSelection).getSelection();
|
|
21
|
+
expect(selection).toEqual([
|
|
22
|
+
EXPECTED
|
|
23
|
+
]);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=CmsReviewFieldSelections.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation/CmsReviewFieldSelections.test.js","sources":["../../src/presentation/CmsReviewFieldSelections.test.ts"],"sourcesContent":["import { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { GetEntryGraphQLFieldSelection } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport { ListEntriesGraphQLFieldSelection } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport { REVIEW_SYSTEM_WORKFLOW_SELECTION } from \"@webiny/app-workflows/review/gateway/reviewFields.js\";\nimport { CmsReviewGetEntryFieldSelection } from \"~/presentation/CmsReviewGetEntryFieldSelection.js\";\nimport { CmsReviewListEntriesFieldSelection } from \"~/presentation/CmsReviewListEntriesFieldSelection.js\";\n\nconst EXPECTED = `meta { system { workflow { ${REVIEW_SYSTEM_WORKFLOW_SELECTION} } } }`;\n\ndescribe(\"CMS review field selections\", () => {\n it(\"selects the review shape of system.workflow on the entry list\", () => {\n const container = new Container();\n container.register(CmsReviewListEntriesFieldSelection);\n\n const selection = container.resolve(ListEntriesGraphQLFieldSelection).getSelection();\n\n expect(selection).toEqual([EXPECTED]);\n });\n\n it(\"selects the review shape of system.workflow on an entry read\", () => {\n const container = new Container();\n container.register(CmsReviewGetEntryFieldSelection);\n\n const selection = container.resolve(GetEntryGraphQLFieldSelection).getSelection();\n\n expect(selection).toEqual([EXPECTED]);\n });\n});\n"],"names":["EXPECTED","REVIEW_SYSTEM_WORKFLOW_SELECTION","describe","it","container","Container","CmsReviewListEntriesFieldSelection","selection","ListEntriesGraphQLFieldSelection","expect","CmsReviewGetEntryFieldSelection","GetEntryGraphQLFieldSelection"],"mappings":";;;;;;AAUA,MAAMA,WAAW,CAAC,2BAA2B,EAAEC,iCAAiC,MAAM,CAAC;AAEvFC,SAAS,+BAA+B;IACpCC,GAAG,iEAAiE;QAChE,MAAMC,YAAY,IAAIC;QACtBD,UAAU,QAAQ,CAACE;QAEnB,MAAMC,YAAYH,UAAU,OAAO,CAACI,kCAAkC,YAAY;QAElFC,OAAOF,WAAW,OAAO,CAAC;YAACP;SAAS;IACxC;IAEAG,GAAG,gEAAgE;QAC/D,MAAMC,YAAY,IAAIC;QACtBD,UAAU,QAAQ,CAACM;QAEnB,MAAMH,YAAYH,UAAU,OAAO,CAACO,+BAA+B,YAAY;QAE/EF,OAAOF,WAAW,OAAO,CAAC;YAACP;SAAS;IACxC;AACJ"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { GetEntryGraphQLFieldSelection } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
|
|
2
|
+
declare class CmsReviewGetEntryFieldSelectionImpl implements GetEntryGraphQLFieldSelection.Interface {
|
|
3
|
+
getSelection(): string[];
|
|
4
|
+
}
|
|
5
|
+
export declare const CmsReviewGetEntryFieldSelection: typeof CmsReviewGetEntryFieldSelectionImpl & {
|
|
6
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/app-headless-cms/features/contentEntry/getEntry/abstractions").IGetEntryGraphQLFieldSelection>;
|
|
7
|
+
};
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { GetEntryGraphQLFieldSelection } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
|
|
2
|
+
import { REVIEW_SYSTEM_WORKFLOW_SELECTION } from "@webiny/app-workflows/review/gateway/reviewFields.js";
|
|
3
|
+
class CmsReviewGetEntryFieldSelectionImpl {
|
|
4
|
+
getSelection() {
|
|
5
|
+
return [
|
|
6
|
+
`meta { system { workflow { ${REVIEW_SYSTEM_WORKFLOW_SELECTION} } } }`
|
|
7
|
+
];
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
const CmsReviewGetEntryFieldSelection = GetEntryGraphQLFieldSelection.createImplementation({
|
|
11
|
+
dependencies: [],
|
|
12
|
+
implementation: CmsReviewGetEntryFieldSelectionImpl
|
|
13
|
+
});
|
|
14
|
+
export { CmsReviewGetEntryFieldSelection };
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=CmsReviewGetEntryFieldSelection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation/CmsReviewGetEntryFieldSelection.js","sources":["../../src/presentation/CmsReviewGetEntryFieldSelection.ts"],"sourcesContent":["import { GetEntryGraphQLFieldSelection } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport { REVIEW_SYSTEM_WORKFLOW_SELECTION } from \"@webiny/app-workflows/review/gateway/reviewFields.js\";\n\nclass CmsReviewGetEntryFieldSelectionImpl implements GetEntryGraphQLFieldSelection.Interface {\n getSelection(): string[] {\n return [`meta { system { workflow { ${REVIEW_SYSTEM_WORKFLOW_SELECTION} } } }`];\n }\n}\n\nexport const CmsReviewGetEntryFieldSelection = GetEntryGraphQLFieldSelection.createImplementation({\n dependencies: [],\n implementation: CmsReviewGetEntryFieldSelectionImpl\n});\n"],"names":["CmsReviewGetEntryFieldSelectionImpl","REVIEW_SYSTEM_WORKFLOW_SELECTION","CmsReviewGetEntryFieldSelection","GetEntryGraphQLFieldSelection"],"mappings":";;AAGA,MAAMA;IACF,eAAyB;QACrB,OAAO;YAAC,CAAC,2BAA2B,EAAEC,iCAAiC,MAAM,CAAC;SAAC;IACnF;AACJ;AAEO,MAAMC,kCAAkCC,8BAA8B,oBAAoB,CAAC;IAC9F,cAAc,EAAE;IAChB,gBAAgBH;AACpB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ListEntriesGraphQLFieldSelection } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
|
|
2
|
+
declare class CmsReviewListEntriesFieldSelectionImpl implements ListEntriesGraphQLFieldSelection.Interface {
|
|
3
|
+
getSelection(): string[];
|
|
4
|
+
}
|
|
5
|
+
export declare const CmsReviewListEntriesFieldSelection: typeof CmsReviewListEntriesFieldSelectionImpl & {
|
|
6
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/app-headless-cms/features/contentEntry/listEntries/abstractions").IListEntriesGraphQLFieldSelection>;
|
|
7
|
+
};
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ListEntriesGraphQLFieldSelection } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
|
|
2
|
+
import { REVIEW_SYSTEM_WORKFLOW_SELECTION } from "@webiny/app-workflows/review/gateway/reviewFields.js";
|
|
3
|
+
class CmsReviewListEntriesFieldSelectionImpl {
|
|
4
|
+
getSelection() {
|
|
5
|
+
return [
|
|
6
|
+
`meta { system { workflow { ${REVIEW_SYSTEM_WORKFLOW_SELECTION} } } }`
|
|
7
|
+
];
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
const CmsReviewListEntriesFieldSelection = ListEntriesGraphQLFieldSelection.createImplementation({
|
|
11
|
+
dependencies: [],
|
|
12
|
+
implementation: CmsReviewListEntriesFieldSelectionImpl
|
|
13
|
+
});
|
|
14
|
+
export { CmsReviewListEntriesFieldSelection };
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=CmsReviewListEntriesFieldSelection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation/CmsReviewListEntriesFieldSelection.js","sources":["../../src/presentation/CmsReviewListEntriesFieldSelection.ts"],"sourcesContent":["import { ListEntriesGraphQLFieldSelection } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport { REVIEW_SYSTEM_WORKFLOW_SELECTION } from \"@webiny/app-workflows/review/gateway/reviewFields.js\";\n\nclass CmsReviewListEntriesFieldSelectionImpl implements ListEntriesGraphQLFieldSelection.Interface {\n getSelection(): string[] {\n return [`meta { system { workflow { ${REVIEW_SYSTEM_WORKFLOW_SELECTION} } } }`];\n }\n}\n\nexport const CmsReviewListEntriesFieldSelection =\n ListEntriesGraphQLFieldSelection.createImplementation({\n dependencies: [],\n implementation: CmsReviewListEntriesFieldSelectionImpl\n });\n"],"names":["CmsReviewListEntriesFieldSelectionImpl","REVIEW_SYSTEM_WORKFLOW_SELECTION","CmsReviewListEntriesFieldSelection","ListEntriesGraphQLFieldSelection"],"mappings":";;AAGA,MAAMA;IACF,eAAyB;QACrB,OAAO;YAAC,CAAC,2BAA2B,EAAEC,iCAAiC,MAAM,CAAC;SAAC;IACnF;AACJ;AAEO,MAAMC,qCACTC,iCAAiC,oBAAoB,CAAC;IAClD,cAAc,EAAE;IAChB,gBAAgBH;AACpB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { TableRowMapper } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
|
|
2
|
+
import type { CmsContentEntry } from "@webiny/app-headless-cms-common/types/index.js";
|
|
3
|
+
declare class CmsReviewTableRowMapper implements TableRowMapper.Interface {
|
|
4
|
+
private readonly decoratee;
|
|
5
|
+
constructor(decoratee: TableRowMapper.Interface);
|
|
6
|
+
fromEntry(entry: CmsContentEntry): TableRowMapper.EntryTableRow;
|
|
7
|
+
}
|
|
8
|
+
export declare const CmsReviewTableRowMapperDecorator: typeof CmsReviewTableRowMapper & {
|
|
9
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/app-headless-cms/presentation/contentEntries/views/Table/abstractions").ITableRowMapper>;
|
|
10
|
+
};
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { TableRowMapper } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
|
|
2
|
+
import { isReviewSelectable } from "@webiny/app-workflows/review/domain/isReviewSelectable.js";
|
|
3
|
+
class CmsReviewTableRowMapper {
|
|
4
|
+
constructor(decoratee){
|
|
5
|
+
this.decoratee = decoratee;
|
|
6
|
+
}
|
|
7
|
+
fromEntry(entry) {
|
|
8
|
+
const row = this.decoratee.fromEntry(entry);
|
|
9
|
+
const meta = entry.meta;
|
|
10
|
+
const reviewState = meta.system?.workflow?.reviewState ?? null;
|
|
11
|
+
if (isReviewSelectable(reviewState)) return row;
|
|
12
|
+
return {
|
|
13
|
+
...row,
|
|
14
|
+
$selectable: false
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const CmsReviewTableRowMapperDecorator = TableRowMapper.createDecorator({
|
|
19
|
+
decorator: CmsReviewTableRowMapper,
|
|
20
|
+
dependencies: []
|
|
21
|
+
});
|
|
22
|
+
export { CmsReviewTableRowMapperDecorator };
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=CmsReviewTableRowMapperDecorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation/CmsReviewTableRowMapperDecorator.js","sources":["../../src/presentation/CmsReviewTableRowMapperDecorator.ts"],"sourcesContent":["import { TableRowMapper } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport type { CmsContentEntry } from \"@webiny/app-headless-cms-common/types/index.js\";\nimport { isReviewSelectable } from \"@webiny/app-workflows/review/domain/isReviewSelectable.js\";\nimport type { ICmsEntryMetaWithReview } from \"~/types.js\";\n\nclass CmsReviewTableRowMapper implements TableRowMapper.Interface {\n constructor(private readonly decoratee: TableRowMapper.Interface) {}\n\n fromEntry(entry: CmsContentEntry): TableRowMapper.EntryTableRow {\n const row = this.decoratee.fromEntry(entry);\n const meta: ICmsEntryMetaWithReview = entry.meta;\n const reviewState = meta.system?.workflow?.reviewState ?? null;\n\n if (isReviewSelectable(reviewState)) {\n return row;\n }\n\n return { ...row, $selectable: false };\n }\n}\n\nexport const CmsReviewTableRowMapperDecorator = TableRowMapper.createDecorator({\n decorator: CmsReviewTableRowMapper,\n dependencies: []\n});\n"],"names":["CmsReviewTableRowMapper","decoratee","entry","row","meta","reviewState","isReviewSelectable","CmsReviewTableRowMapperDecorator","TableRowMapper"],"mappings":";;AAKA,MAAMA;IACF,YAA6BC,SAAmC,CAAE;aAArCA,SAAS,GAATA;IAAsC;IAEnE,UAAUC,KAAsB,EAAgC;QAC5D,MAAMC,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAACD;QACrC,MAAME,OAAgCF,MAAM,IAAI;QAChD,MAAMG,cAAcD,KAAK,MAAM,EAAE,UAAU,eAAe;QAE1D,IAAIE,mBAAmBD,cACnB,OAAOF;QAGX,OAAO;YAAE,GAAGA,GAAG;YAAE,aAAa;QAAM;IACxC;AACJ;AAEO,MAAMI,mCAAmCC,eAAe,eAAe,CAAC;IAC3E,WAAWR;IACX,cAAc,EAAE;AACpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it } from "vitest";
|
|
2
|
+
import { Container } from "@webiny/di";
|
|
3
|
+
import { TableRowMapper } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
|
|
4
|
+
import { ReviewState } from "@webiny/app-workflows/review/domain/ReviewState.js";
|
|
5
|
+
import { CmsReviewTableRowMapperDecorator } from "./CmsReviewTableRowMapperDecorator.js";
|
|
6
|
+
let base;
|
|
7
|
+
class FakeRowMapper {
|
|
8
|
+
fromEntry(entry) {
|
|
9
|
+
return {
|
|
10
|
+
id: entry.id,
|
|
11
|
+
$selectable: base.selectable,
|
|
12
|
+
$type: "RECORD",
|
|
13
|
+
data: entry
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const BaseRowMapper = TableRowMapper.createImplementation({
|
|
18
|
+
implementation: FakeRowMapper,
|
|
19
|
+
dependencies: []
|
|
20
|
+
});
|
|
21
|
+
function createEntry(system) {
|
|
22
|
+
return {
|
|
23
|
+
id: "entry-1#0001",
|
|
24
|
+
entryId: "entry-1",
|
|
25
|
+
meta: {
|
|
26
|
+
title: "Hello",
|
|
27
|
+
status: "draft",
|
|
28
|
+
version: 1,
|
|
29
|
+
locked: false,
|
|
30
|
+
system
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function createWorkflow(reviewState) {
|
|
35
|
+
return {
|
|
36
|
+
workflowId: "wf-1",
|
|
37
|
+
reviewState,
|
|
38
|
+
stepId: "step-1",
|
|
39
|
+
stepName: "Legal review",
|
|
40
|
+
stepState: "inReview"
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
let mapper;
|
|
44
|
+
describe("CmsReviewTableRowMapperDecorator", ()=>{
|
|
45
|
+
beforeEach(()=>{
|
|
46
|
+
base = {
|
|
47
|
+
selectable: true
|
|
48
|
+
};
|
|
49
|
+
const container = new Container();
|
|
50
|
+
container.register(BaseRowMapper);
|
|
51
|
+
container.registerDecorator(CmsReviewTableRowMapperDecorator);
|
|
52
|
+
mapper = container.resolve(TableRowMapper);
|
|
53
|
+
});
|
|
54
|
+
it("keeps an approved review selectable", ()=>{
|
|
55
|
+
const row = mapper.fromEntry(createEntry({
|
|
56
|
+
workflow: createWorkflow(ReviewState.Approved)
|
|
57
|
+
}));
|
|
58
|
+
expect(row.$selectable).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
it.each([
|
|
61
|
+
[
|
|
62
|
+
"in progress",
|
|
63
|
+
ReviewState.InProgress
|
|
64
|
+
],
|
|
65
|
+
[
|
|
66
|
+
"rejected",
|
|
67
|
+
ReviewState.Rejected
|
|
68
|
+
],
|
|
69
|
+
[
|
|
70
|
+
"cancelled",
|
|
71
|
+
ReviewState.Cancelled
|
|
72
|
+
]
|
|
73
|
+
])("makes a row with a %s review unselectable", (_name, reviewState)=>{
|
|
74
|
+
const row = mapper.fromEntry(createEntry({
|
|
75
|
+
workflow: createWorkflow(reviewState)
|
|
76
|
+
}));
|
|
77
|
+
expect(row.$selectable).toBe(false);
|
|
78
|
+
});
|
|
79
|
+
it.each([
|
|
80
|
+
[
|
|
81
|
+
"no system",
|
|
82
|
+
void 0
|
|
83
|
+
],
|
|
84
|
+
[
|
|
85
|
+
"a null system",
|
|
86
|
+
null
|
|
87
|
+
],
|
|
88
|
+
[
|
|
89
|
+
"a system without a workflow",
|
|
90
|
+
{}
|
|
91
|
+
],
|
|
92
|
+
[
|
|
93
|
+
"a null workflow",
|
|
94
|
+
{
|
|
95
|
+
workflow: null
|
|
96
|
+
}
|
|
97
|
+
]
|
|
98
|
+
])("keeps a row with %s selectable", (_name, system)=>{
|
|
99
|
+
const row = mapper.fromEntry(createEntry(system));
|
|
100
|
+
expect(row.$selectable).toBe(true);
|
|
101
|
+
});
|
|
102
|
+
it("never makes selectable what the base mapper made unselectable", ()=>{
|
|
103
|
+
base.selectable = false;
|
|
104
|
+
const row = mapper.fromEntry(createEntry({
|
|
105
|
+
workflow: createWorkflow(ReviewState.Approved)
|
|
106
|
+
}));
|
|
107
|
+
expect(row.$selectable).toBe(false);
|
|
108
|
+
});
|
|
109
|
+
it("keeps the rest of the row", ()=>{
|
|
110
|
+
const entry = createEntry({
|
|
111
|
+
workflow: createWorkflow(ReviewState.InProgress)
|
|
112
|
+
});
|
|
113
|
+
const row = mapper.fromEntry(entry);
|
|
114
|
+
expect(row.id).toBe("entry-1#0001");
|
|
115
|
+
expect(row.$type).toBe("RECORD");
|
|
116
|
+
expect(row.data).toBe(entry);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
//# sourceMappingURL=CmsReviewTableRowMapperDecorator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation/CmsReviewTableRowMapperDecorator.test.js","sources":["../../src/presentation/CmsReviewTableRowMapperDecorator.test.ts"],"sourcesContent":["import { beforeEach } from \"vitest\";\nimport { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { TableRowMapper } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport type { CmsContentEntry } from \"@webiny/app-headless-cms-common/types/index.js\";\nimport { ReviewState } from \"@webiny/app-workflows/review/domain/ReviewState.js\";\nimport { CmsReviewTableRowMapperDecorator } from \"~/presentation/CmsReviewTableRowMapperDecorator.js\";\n\ninterface BaseState {\n selectable: boolean;\n}\n\nlet base: BaseState;\n\nclass FakeRowMapper implements TableRowMapper.Interface {\n fromEntry(entry: CmsContentEntry): TableRowMapper.EntryTableRow {\n return { id: entry.id, $selectable: base.selectable, $type: \"RECORD\", data: entry };\n }\n}\n\nconst BaseRowMapper = TableRowMapper.createImplementation({\n implementation: FakeRowMapper,\n dependencies: []\n});\n\nfunction createEntry(system: unknown): CmsContentEntry {\n return {\n id: \"entry-1#0001\",\n entryId: \"entry-1\",\n meta: { title: \"Hello\", status: \"draft\", version: 1, locked: false, system }\n } as unknown as CmsContentEntry;\n}\n\nfunction createWorkflow(reviewState: string) {\n return {\n workflowId: \"wf-1\",\n reviewState,\n stepId: \"step-1\",\n stepName: \"Legal review\",\n stepState: \"inReview\"\n };\n}\n\nlet mapper: TableRowMapper.Interface;\n\ndescribe(\"CmsReviewTableRowMapperDecorator\", () => {\n beforeEach(() => {\n base = { selectable: true };\n const container = new Container();\n container.register(BaseRowMapper);\n container.registerDecorator(CmsReviewTableRowMapperDecorator);\n mapper = container.resolve(TableRowMapper);\n });\n\n it(\"keeps an approved review selectable\", () => {\n const row = mapper.fromEntry(\n createEntry({ workflow: createWorkflow(ReviewState.Approved) })\n );\n\n expect(row.$selectable).toBe(true);\n });\n\n it.each([\n [\"in progress\", ReviewState.InProgress],\n [\"rejected\", ReviewState.Rejected],\n [\"cancelled\", ReviewState.Cancelled]\n ])(\"makes a row with a %s review unselectable\", (_name, reviewState) => {\n const row = mapper.fromEntry(createEntry({ workflow: createWorkflow(reviewState) }));\n\n expect(row.$selectable).toBe(false);\n });\n\n it.each([\n [\"no system\", undefined],\n [\"a null system\", null],\n [\"a system without a workflow\", {}],\n [\"a null workflow\", { workflow: null }]\n ])(\"keeps a row with %s selectable\", (_name, system) => {\n const row = mapper.fromEntry(createEntry(system));\n\n expect(row.$selectable).toBe(true);\n });\n\n it(\"never makes selectable what the base mapper made unselectable\", () => {\n base.selectable = false;\n\n const row = mapper.fromEntry(\n createEntry({ workflow: createWorkflow(ReviewState.Approved) })\n );\n\n expect(row.$selectable).toBe(false);\n });\n\n it(\"keeps the rest of the row\", () => {\n const entry = createEntry({ workflow: createWorkflow(ReviewState.InProgress) });\n\n const row = mapper.fromEntry(entry);\n\n expect(row.id).toBe(\"entry-1#0001\");\n expect(row.$type).toBe(\"RECORD\");\n expect(row.data).toBe(entry);\n });\n});\n"],"names":["base","FakeRowMapper","entry","BaseRowMapper","TableRowMapper","createEntry","system","createWorkflow","reviewState","mapper","describe","beforeEach","container","Container","CmsReviewTableRowMapperDecorator","it","row","ReviewState","expect","_name","undefined"],"mappings":";;;;;AAcA,IAAIA;AAEJ,MAAMC;IACF,UAAUC,KAAsB,EAAgC;QAC5D,OAAO;YAAE,IAAIA,MAAM,EAAE;YAAE,aAAaF,KAAK,UAAU;YAAE,OAAO;YAAU,MAAME;QAAM;IACtF;AACJ;AAEA,MAAMC,gBAAgBC,eAAe,oBAAoB,CAAC;IACtD,gBAAgBH;IAChB,cAAc,EAAE;AACpB;AAEA,SAASI,YAAYC,MAAe;IAChC,OAAO;QACH,IAAI;QACJ,SAAS;QACT,MAAM;YAAE,OAAO;YAAS,QAAQ;YAAS,SAAS;YAAG,QAAQ;YAAOA;QAAO;IAC/E;AACJ;AAEA,SAASC,eAAeC,WAAmB;IACvC,OAAO;QACH,YAAY;QACZA;QACA,QAAQ;QACR,UAAU;QACV,WAAW;IACf;AACJ;AAEA,IAAIC;AAEJC,SAAS,oCAAoC;IACzCC,WAAW;QACPX,OAAO;YAAE,YAAY;QAAK;QAC1B,MAAMY,YAAY,IAAIC;QACtBD,UAAU,QAAQ,CAACT;QACnBS,UAAU,iBAAiB,CAACE;QAC5BL,SAASG,UAAU,OAAO,CAACR;IAC/B;IAEAW,GAAG,uCAAuC;QACtC,MAAMC,MAAMP,OAAO,SAAS,CACxBJ,YAAY;YAAE,UAAUE,eAAeU,YAAY,QAAQ;QAAE;QAGjEC,OAAOF,IAAI,WAAW,EAAE,IAAI,CAAC;IACjC;IAEAD,GAAG,IAAI,CAAC;QACJ;YAAC;YAAeE,YAAY,UAAU;SAAC;QACvC;YAAC;YAAYA,YAAY,QAAQ;SAAC;QAClC;YAAC;YAAaA,YAAY,SAAS;SAAC;KACvC,EAAE,6CAA6C,CAACE,OAAOX;QACpD,MAAMQ,MAAMP,OAAO,SAAS,CAACJ,YAAY;YAAE,UAAUE,eAAeC;QAAa;QAEjFU,OAAOF,IAAI,WAAW,EAAE,IAAI,CAAC;IACjC;IAEAD,GAAG,IAAI,CAAC;QACJ;YAAC;YAAaK;SAAU;QACxB;YAAC;YAAiB;SAAK;QACvB;YAAC;YAA+B,CAAC;SAAE;QACnC;YAAC;YAAmB;gBAAE,UAAU;YAAK;SAAE;KAC1C,EAAE,kCAAkC,CAACD,OAAOb;QACzC,MAAMU,MAAMP,OAAO,SAAS,CAACJ,YAAYC;QAEzCY,OAAOF,IAAI,WAAW,EAAE,IAAI,CAAC;IACjC;IAEAD,GAAG,iEAAiE;QAChEf,KAAK,UAAU,GAAG;QAElB,MAAMgB,MAAMP,OAAO,SAAS,CACxBJ,YAAY;YAAE,UAAUE,eAAeU,YAAY,QAAQ;QAAE;QAGjEC,OAAOF,IAAI,WAAW,EAAE,IAAI,CAAC;IACjC;IAEAD,GAAG,6BAA6B;QAC5B,MAAMb,QAAQG,YAAY;YAAE,UAAUE,eAAeU,YAAY,UAAU;QAAE;QAE7E,MAAMD,MAAMP,OAAO,SAAS,CAACP;QAE7BgB,OAAOF,IAAI,EAAE,EAAE,IAAI,CAAC;QACpBE,OAAOF,IAAI,KAAK,EAAE,IAAI,CAAC;QACvBE,OAAOF,IAAI,IAAI,EAAE,IAAI,CAACd;IAC1B;AACJ"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { CmsContentEntry } from "@webiny/app-headless-cms/types.js";
|
|
2
|
+
import { CmsModelContext } from "@webiny/app-headless-cms/features/contentEntry/abstractions.js";
|
|
3
|
+
import { RevisionsListPresenter } from "@webiny/app-headless-cms/presentation/contentEntries/revisionsList/abstractions.js";
|
|
4
|
+
import { CmsEntryReview } from "../features/editorReview/abstractions.js";
|
|
5
|
+
declare class CmsRevisionsListPresenterWithReview implements RevisionsListPresenter.Interface {
|
|
6
|
+
private modelContext;
|
|
7
|
+
private session;
|
|
8
|
+
private decoratee;
|
|
9
|
+
constructor(modelContext: CmsModelContext.Interface, session: CmsEntryReview.Interface, decoratee: RevisionsListPresenter.Interface);
|
|
10
|
+
get vm(): RevisionsListPresenter.ViewModel;
|
|
11
|
+
init(entryId: string): Promise<void>;
|
|
12
|
+
show(): void;
|
|
13
|
+
hide(): void;
|
|
14
|
+
createRevision(revisionId: string): Promise<CmsContentEntry | null>;
|
|
15
|
+
publishRevision(revisionId: string): Promise<boolean>;
|
|
16
|
+
unpublishRevision(revisionId: string): Promise<boolean>;
|
|
17
|
+
updateRevisionNote(revisionId: string, currentDescription: string): Promise<boolean>;
|
|
18
|
+
deleteRevision(revisionId: string): Promise<boolean>;
|
|
19
|
+
dispose(): void;
|
|
20
|
+
}
|
|
21
|
+
export declare const CmsRevisionsListPresenterDecorator: typeof CmsRevisionsListPresenterWithReview & {
|
|
22
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/app-headless-cms/presentation/contentEntries/revisionsList/abstractions.js").IRevisionsListPresenter>;
|
|
23
|
+
};
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { makeAutoObservable } from "mobx";
|
|
2
|
+
import { CmsModelContext } from "@webiny/app-headless-cms/features/contentEntry/abstractions.js";
|
|
3
|
+
import { RevisionsListPresenter } from "@webiny/app-headless-cms/presentation/contentEntries/revisionsList/abstractions.js";
|
|
4
|
+
import { CmsEntryReview } from "../features/editorReview/abstractions.js";
|
|
5
|
+
import { isReviewableModel } from "../utils/isReviewableModel.js";
|
|
6
|
+
class CmsRevisionsListPresenterWithReview {
|
|
7
|
+
constructor(modelContext, session, decoratee){
|
|
8
|
+
this.modelContext = modelContext;
|
|
9
|
+
this.session = session;
|
|
10
|
+
this.decoratee = decoratee;
|
|
11
|
+
makeAutoObservable(this, {
|
|
12
|
+
modelContext: false,
|
|
13
|
+
session: false,
|
|
14
|
+
decoratee: false
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
get vm() {
|
|
18
|
+
const vm = this.decoratee.vm;
|
|
19
|
+
if (!isReviewableModel(this.modelContext.getModel())) return vm;
|
|
20
|
+
const noWorkflow = "noWorkflow" === this.session.presenter.vm.status;
|
|
21
|
+
return {
|
|
22
|
+
...vm,
|
|
23
|
+
items: vm.items.map((item)=>({
|
|
24
|
+
...item,
|
|
25
|
+
canPublish: item.canPublish && noWorkflow
|
|
26
|
+
}))
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
init(entryId) {
|
|
30
|
+
return this.decoratee.init(entryId);
|
|
31
|
+
}
|
|
32
|
+
show() {
|
|
33
|
+
this.decoratee.show();
|
|
34
|
+
}
|
|
35
|
+
hide() {
|
|
36
|
+
this.decoratee.hide();
|
|
37
|
+
}
|
|
38
|
+
createRevision(revisionId) {
|
|
39
|
+
return this.decoratee.createRevision(revisionId);
|
|
40
|
+
}
|
|
41
|
+
publishRevision(revisionId) {
|
|
42
|
+
return this.decoratee.publishRevision(revisionId);
|
|
43
|
+
}
|
|
44
|
+
unpublishRevision(revisionId) {
|
|
45
|
+
return this.decoratee.unpublishRevision(revisionId);
|
|
46
|
+
}
|
|
47
|
+
updateRevisionNote(revisionId, currentDescription) {
|
|
48
|
+
return this.decoratee.updateRevisionNote(revisionId, currentDescription);
|
|
49
|
+
}
|
|
50
|
+
deleteRevision(revisionId) {
|
|
51
|
+
return this.decoratee.deleteRevision(revisionId);
|
|
52
|
+
}
|
|
53
|
+
dispose() {
|
|
54
|
+
this.decoratee.dispose();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const CmsRevisionsListPresenterDecorator = RevisionsListPresenter.createDecorator({
|
|
58
|
+
decorator: CmsRevisionsListPresenterWithReview,
|
|
59
|
+
dependencies: [
|
|
60
|
+
CmsModelContext,
|
|
61
|
+
CmsEntryReview
|
|
62
|
+
]
|
|
63
|
+
});
|
|
64
|
+
export { CmsRevisionsListPresenterDecorator };
|
|
65
|
+
|
|
66
|
+
//# sourceMappingURL=CmsRevisionsListPresenterDecorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation/CmsRevisionsListPresenterDecorator.js","sources":["../../src/presentation/CmsRevisionsListPresenterDecorator.ts"],"sourcesContent":["import { makeAutoObservable } from \"mobx\";\nimport type { CmsContentEntry } from \"@webiny/app-headless-cms/types.js\";\nimport { CmsModelContext } from \"@webiny/app-headless-cms/features/contentEntry/abstractions.js\";\nimport { RevisionsListPresenter } from \"@webiny/app-headless-cms/presentation/contentEntries/revisionsList/abstractions.js\";\nimport { CmsEntryReview } from \"~/features/editorReview/abstractions.js\";\nimport { isReviewableModel } from \"~/utils/isReviewableModel.js\";\n\n/*\n * Publishing a revision straight from the revisions drawer would bypass the review: on a\n * reviewable model the drawer only offers Publish when the model has no workflow. While the review\n * state loads, fails or a workflow exists, the review bar's Publish is the only one, as in the\n * Website Builder drawer. Unpublish is not review-gated (D121), so it stays as the base computes it.\n */\nclass CmsRevisionsListPresenterWithReview implements RevisionsListPresenter.Interface {\n public constructor(\n private modelContext: CmsModelContext.Interface,\n private session: CmsEntryReview.Interface,\n private decoratee: RevisionsListPresenter.Interface\n ) {\n makeAutoObservable<this, \"modelContext\" | \"session\" | \"decoratee\">(this, {\n modelContext: false,\n session: false,\n decoratee: false\n });\n }\n\n public get vm(): RevisionsListPresenter.ViewModel {\n const vm = this.decoratee.vm;\n if (!isReviewableModel(this.modelContext.getModel())) {\n return vm;\n }\n const noWorkflow = this.session.presenter.vm.status === \"noWorkflow\";\n\n return {\n ...vm,\n items: vm.items.map(item => {\n return {\n ...item,\n canPublish: item.canPublish && noWorkflow\n };\n })\n };\n }\n\n public init(entryId: string): Promise<void> {\n return this.decoratee.init(entryId);\n }\n\n public show(): void {\n this.decoratee.show();\n }\n\n public hide(): void {\n this.decoratee.hide();\n }\n\n public createRevision(revisionId: string): Promise<CmsContentEntry | null> {\n return this.decoratee.createRevision(revisionId);\n }\n\n public publishRevision(revisionId: string): Promise<boolean> {\n return this.decoratee.publishRevision(revisionId);\n }\n\n public unpublishRevision(revisionId: string): Promise<boolean> {\n return this.decoratee.unpublishRevision(revisionId);\n }\n\n public updateRevisionNote(revisionId: string, currentDescription: string): Promise<boolean> {\n return this.decoratee.updateRevisionNote(revisionId, currentDescription);\n }\n\n public deleteRevision(revisionId: string): Promise<boolean> {\n return this.decoratee.deleteRevision(revisionId);\n }\n\n public dispose(): void {\n this.decoratee.dispose();\n }\n}\n\nexport const CmsRevisionsListPresenterDecorator = RevisionsListPresenter.createDecorator({\n decorator: CmsRevisionsListPresenterWithReview,\n dependencies: [CmsModelContext, CmsEntryReview]\n});\n"],"names":["CmsRevisionsListPresenterWithReview","modelContext","session","decoratee","makeAutoObservable","vm","isReviewableModel","noWorkflow","item","entryId","revisionId","currentDescription","CmsRevisionsListPresenterDecorator","RevisionsListPresenter","CmsModelContext","CmsEntryReview"],"mappings":";;;;;AAaA,MAAMA;IACF,YACYC,YAAuC,EACvCC,OAAiC,EACjCC,SAA2C,CACrD;aAHUF,YAAY,GAAZA;aACAC,OAAO,GAAPA;aACAC,SAAS,GAATA;QAERC,mBAAmE,IAAI,EAAE;YACrE,cAAc;YACd,SAAS;YACT,WAAW;QACf;IACJ;IAEA,IAAW,KAAuC;QAC9C,MAAMC,KAAK,IAAI,CAAC,SAAS,CAAC,EAAE;QAC5B,IAAI,CAACC,kBAAkB,IAAI,CAAC,YAAY,CAAC,QAAQ,KAC7C,OAAOD;QAEX,MAAME,aAAa,AAAqC,iBAArC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM;QAEnD,OAAO;YACH,GAAGF,EAAE;YACL,OAAOA,GAAG,KAAK,CAAC,GAAG,CAACG,CAAAA,OACT;oBACH,GAAGA,IAAI;oBACP,YAAYA,KAAK,UAAU,IAAID;gBACnC;QAER;IACJ;IAEO,KAAKE,OAAe,EAAiB;QACxC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAACA;IAC/B;IAEO,OAAa;QAChB,IAAI,CAAC,SAAS,CAAC,IAAI;IACvB;IAEO,OAAa;QAChB,IAAI,CAAC,SAAS,CAAC,IAAI;IACvB;IAEO,eAAeC,UAAkB,EAAmC;QACvE,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAACA;IACzC;IAEO,gBAAgBA,UAAkB,EAAoB;QACzD,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAACA;IAC1C;IAEO,kBAAkBA,UAAkB,EAAoB;QAC3D,OAAO,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAACA;IAC5C;IAEO,mBAAmBA,UAAkB,EAAEC,kBAA0B,EAAoB;QACxF,OAAO,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAACD,YAAYC;IACzD;IAEO,eAAeD,UAAkB,EAAoB;QACxD,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAACA;IACzC;IAEO,UAAgB;QACnB,IAAI,CAAC,SAAS,CAAC,OAAO;IAC1B;AACJ;AAEO,MAAME,qCAAqCC,uBAAuB,eAAe,CAAC;IACrF,WAAWb;IACX,cAAc;QAACc;QAAiBC;KAAe;AACnD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|