@webiny/app-headless-cms-workflows 0.0.0-unstable.c27f4d8a31 → 0.0.0-unstable.d0f34a8194
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 -7
- package/Components/ContentEntryForm/index.js +5 -9
- 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/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 -1
- package/Routes/index.js +1 -3
- 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 +1 -1
- 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 +38 -9
- package/index.js.map +1 -1
- 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 +31 -20
- 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 +4 -4
- package/routes.js +17 -18
- package/routes.js.map +1 -1
- 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.js +9 -12
- package/utils/appName.js.map +1 -1
- 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
- package/Components/CmsEntriesWorkflowStateList/CmsEntriesWorkflowStateListFooterMenu.d.ts +0 -2
- package/Components/CmsEntriesWorkflowStateList/CmsEntriesWorkflowStateListFooterMenu.js +0 -45
- package/Components/CmsEntriesWorkflowStateList/CmsEntriesWorkflowStateListFooterMenu.js.map +0 -1
- package/Components/CmsEntriesWorkflowStateList/index.d.ts +0 -1
- package/Components/CmsEntriesWorkflowStateList/index.js +0 -3
- package/Components/CmsEntriesWorkflowStateList/index.js.map +0 -1
- package/Components/CmsWorkflows/CmsWorkflowsEditorView.d.ts +0 -3
- package/Components/CmsWorkflows/CmsWorkflowsEditorView.js +0 -128
- package/Components/CmsWorkflows/CmsWorkflowsEditorView.js.map +0 -1
- package/Components/ContentEntryForm/CmsEntryFormCreateNewRevisionButton.d.ts +0 -2
- package/Components/ContentEntryForm/CmsEntryFormCreateNewRevisionButton.js +0 -69
- package/Components/ContentEntryForm/CmsEntryFormCreateNewRevisionButton.js.map +0 -1
- package/Components/ContentEntryForm/CmsEntryFormPublishButton.d.ts +0 -2
- package/Components/ContentEntryForm/CmsEntryFormPublishButton.js +0 -38
- package/Components/ContentEntryForm/CmsEntryFormPublishButton.js.map +0 -1
- package/Components/ContentEntryForm/CmsEntryFormSaveAndPublishButton.d.ts +0 -2
- package/Components/ContentEntryForm/CmsEntryFormSaveAndPublishButton.js +0 -39
- package/Components/ContentEntryForm/CmsEntryFormSaveAndPublishButton.js.map +0 -1
- package/Components/ContentEntryForm/CmsEntryFormSaveButton.d.ts +0 -2
- package/Components/ContentEntryForm/CmsEntryFormSaveButton.js +0 -37
- package/Components/ContentEntryForm/CmsEntryFormSaveButton.js.map +0 -1
- package/Components/ContentEntryForm/CmsEntryFormScheduleMenuItemAction.d.ts +0 -5
- package/Components/ContentEntryForm/CmsEntryFormScheduleMenuItemAction.js +0 -38
- package/Components/ContentEntryForm/CmsEntryFormScheduleMenuItemAction.js.map +0 -1
- package/Components/ContentEntryForm/CmsEntryFormTooltipButton.d.ts +0 -2
- package/Components/ContentEntryForm/CmsEntryFormTooltipButton.js +0 -20
- package/Components/ContentEntryForm/CmsEntryFormTooltipButton.js.map +0 -1
- package/Components/ContentEntryForm/ContentEntryFormWorkflow.d.ts +0 -2
- package/Components/ContentEntryForm/ContentEntryFormWorkflow.js +0 -73
- package/Components/ContentEntryForm/ContentEntryFormWorkflow.js.map +0 -1
- package/Components/ContentEntryForm/ContentEntryWorkflow.d.ts +0 -2
- package/Components/ContentEntryForm/ContentEntryWorkflow.js +0 -35
- package/Components/ContentEntryForm/ContentEntryWorkflow.js.map +0 -1
- package/Components/ContentEntryForm/index.js.map +0 -1
- package/Components/OptionItem/OpenInNewWindow.d.ts +0 -2
- package/Components/OptionItem/OpenInNewWindow.js +0 -44
- package/Components/OptionItem/OpenInNewWindow.js.map +0 -1
- package/Routes/CmsWorkflowsEditor.d.ts +0 -2
- package/Routes/CmsWorkflowsEditor.js +0 -35
- package/Routes/CmsWorkflowsEditor.js.map +0 -1
- package/Routes/index.js.map +0 -1
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import react, { useId } from "react";
|
|
2
|
+
import { Tooltip } from "@webiny/admin-ui";
|
|
3
|
+
import { OptionsMenuItem, createReactiveComponent } from "@webiny/app-admin";
|
|
4
|
+
import { ContentEntryListConfig } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
|
|
5
|
+
import { useEntry } from "@webiny/app-headless-cms/admin/hooks/useEntry.js";
|
|
6
|
+
import { ReactComponent } from "@webiny/icons/exit_to_app.svg";
|
|
7
|
+
import { ReviewState } from "@webiny/app-workflows/review/domain/ReviewState.js";
|
|
8
|
+
import { MOVE_BLOCKED_IN_REVIEW } from "@webiny/app-workflows/review/presentation/targetReview/moveBlockedInReview.js";
|
|
9
|
+
import { ignoreAction } from "../ignoreAction.js";
|
|
10
|
+
const EntryAction = ContentEntryListConfig.Browser.Entry.Action;
|
|
11
|
+
const MoveBlocked = ()=>{
|
|
12
|
+
const descriptionId = useId();
|
|
13
|
+
return /*#__PURE__*/ react.createElement("span", {
|
|
14
|
+
"aria-describedby": descriptionId
|
|
15
|
+
}, /*#__PURE__*/ react.createElement(Tooltip, {
|
|
16
|
+
content: MOVE_BLOCKED_IN_REVIEW,
|
|
17
|
+
trigger: /*#__PURE__*/ react.createElement(OptionsMenuItem, {
|
|
18
|
+
icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
|
|
19
|
+
label: "Move",
|
|
20
|
+
disabled: true,
|
|
21
|
+
onAction: ignoreAction
|
|
22
|
+
})
|
|
23
|
+
}), /*#__PURE__*/ react.createElement("span", {
|
|
24
|
+
id: descriptionId,
|
|
25
|
+
className: "sr-only"
|
|
26
|
+
}, MOVE_BLOCKED_IN_REVIEW));
|
|
27
|
+
};
|
|
28
|
+
const MoveGate = createReactiveComponent((props)=>{
|
|
29
|
+
const { entry } = useEntry();
|
|
30
|
+
const meta = entry.meta;
|
|
31
|
+
if (meta.system?.workflow?.reviewState === ReviewState.InProgress) return /*#__PURE__*/ react.createElement(MoveBlocked, null);
|
|
32
|
+
return /*#__PURE__*/ react.createElement(react.Fragment, null, props.children);
|
|
33
|
+
});
|
|
34
|
+
const CmsReviewMoveEntryAction = EntryAction.createDecorator((Original)=>function(props) {
|
|
35
|
+
if ("move" !== props.name) return /*#__PURE__*/ react.createElement(Original, props);
|
|
36
|
+
return /*#__PURE__*/ react.createElement(Original, {
|
|
37
|
+
...props,
|
|
38
|
+
element: /*#__PURE__*/ react.createElement(MoveGate, null, props.element)
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
export { CmsReviewMoveEntryAction };
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=CmsReviewMoveEntryAction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Components/CmsEntriesList/CmsReviewMoveEntryAction.js","sources":["../../../src/Components/CmsEntriesList/CmsReviewMoveEntryAction.tsx"],"sourcesContent":["import React, { useId } from \"react\";\nimport { Tooltip } from \"@webiny/admin-ui\";\nimport { createReactiveComponent } from \"@webiny/app-admin\";\nimport { OptionsMenuItem } from \"@webiny/app-admin\";\nimport { ContentEntryListConfig } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport { useEntry } from \"@webiny/app-headless-cms/admin/hooks/useEntry.js\";\nimport { ReactComponent as MoveIcon } from \"@webiny/icons/exit_to_app.svg\";\nimport { ReviewState } from \"@webiny/app-workflows/review/domain/ReviewState.js\";\nimport { MOVE_BLOCKED_IN_REVIEW } from \"@webiny/app-workflows/review/presentation/targetReview/moveBlockedInReview.js\";\nimport type { ICmsEntryMetaWithReview } from \"~/types.js\";\nimport { ignoreAction } from \"../ignoreAction.js\";\n\nconst EntryAction = ContentEntryListConfig.Browser.Entry.Action;\n\n/*\n * A disabled menu item cannot take focus, so the reason is given on hover by the tooltip and to\n * assistive technology by `aria-describedby` on a visually hidden element that is always present\n * (the same pattern as the shared `ReviewTooltip`, which needs a review presenter the list does not\n * have).\n */\nconst MoveBlocked = () => {\n const descriptionId = useId();\n\n return (\n <span aria-describedby={descriptionId}>\n <Tooltip\n content={MOVE_BLOCKED_IN_REVIEW}\n trigger={\n <OptionsMenuItem\n icon={<MoveIcon />}\n label={\"Move\"}\n disabled={true}\n onAction={ignoreAction}\n />\n }\n />\n <span id={descriptionId} className={\"sr-only\"}>\n {MOVE_BLOCKED_IN_REVIEW}\n </span>\n </span>\n );\n};\n\ninterface MoveGateProps {\n children?: React.ReactNode;\n}\n\nconst MoveGate = createReactiveComponent((props: MoveGateProps) => {\n const { entry } = useEntry();\n const meta: ICmsEntryMetaWithReview = entry.meta;\n\n if (meta.system?.workflow?.reviewState === ReviewState.InProgress) {\n return <MoveBlocked />;\n }\n\n return <>{props.children}</>;\n});\n\n/*\n * Only the per-row \"Move\" action is gated. Moving by drag and drop and `MoveEntryUseCase` are not\n * gated in 8a (R250, Contract note 2).\n */\nexport const CmsReviewMoveEntryAction = EntryAction.createDecorator(Original => {\n return function CmsReviewMoveEntryActionDecorator(props) {\n if (props.name !== \"move\") {\n return <Original {...props} />;\n }\n\n return <Original {...props} element={<MoveGate>{props.element}</MoveGate>} />;\n };\n});\n"],"names":["EntryAction","ContentEntryListConfig","MoveBlocked","descriptionId","useId","Tooltip","MOVE_BLOCKED_IN_REVIEW","OptionsMenuItem","MoveIcon","ignoreAction","MoveGate","createReactiveComponent","props","entry","useEntry","meta","ReviewState","CmsReviewMoveEntryAction","Original"],"mappings":";;;;;;;;;AAYA,MAAMA,cAAcC,uBAAuB,OAAO,CAAC,KAAK,CAAC,MAAM;AAQ/D,MAAMC,cAAc;IAChB,MAAMC,gBAAgBC;IAEtB,OAAO,WAAP,GACI,oBAAC;QAAK,oBAAkBD;qBACpB,oBAACE,SAAOA;QACJ,SAASC;QACT,uBACI,oBAACC,iBAAeA;YACZ,oBAAM,oBAACC,gBAAQA;YACf,OAAO;YACP,UAAU;YACV,UAAUC;;sBAItB,oBAAC;QAAK,IAAIN;QAAe,WAAW;OAC/BG;AAIjB;AAMA,MAAMI,WAAWC,wBAAwB,CAACC;IACtC,MAAM,EAAEC,KAAK,EAAE,GAAGC;IAClB,MAAMC,OAAgCF,MAAM,IAAI;IAEhD,IAAIE,KAAK,MAAM,EAAE,UAAU,gBAAgBC,YAAY,UAAU,EAC7D,OAAO,WAAP,GAAO,oBAACd,aAAWA;IAGvB,OAAO,WAAP,GAAO,0CAAGU,MAAM,QAAQ;AAC5B;AAMO,MAAMK,2BAA2BjB,YAAY,eAAe,CAACkB,CAAAA,WACzD,SAA2CN,KAAK;QACnD,IAAIA,AAAe,WAAfA,MAAM,IAAI,EACV,OAAO,WAAP,GAAO,oBAACM,UAAaN;QAGzB,OAAO,WAAP,GAAO,oBAACM,UAAAA;YAAU,GAAGN,KAAK;YAAE,uBAAS,oBAACF,UAAQA,MAAEE,MAAM,OAAO;;IACjE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { describe, expect, it, vi } from "vitest";
|
|
3
|
+
import { render, screen } from "@testing-library/react";
|
|
4
|
+
import { CompositionProvider } from "@webiny/react-composition";
|
|
5
|
+
import { AdminUiProvider } from "@webiny/admin-ui";
|
|
6
|
+
import { ContentEntryListConfig } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
|
|
7
|
+
import { ModelContext } from "@webiny/app-headless-cms/admin/components/ModelProvider/index.js";
|
|
8
|
+
import { EntryProvider } from "@webiny/app-headless-cms/admin/hooks/useEntry.js";
|
|
9
|
+
import { ReviewState } from "@webiny/app-workflows/review/domain/ReviewState.js";
|
|
10
|
+
import { MOVE_BLOCKED_IN_REVIEW } from "@webiny/app-workflows/review/presentation/targetReview/moveBlockedInReview.js";
|
|
11
|
+
import { CmsReviewMoveEntryAction } from "./CmsReviewMoveEntryAction.js";
|
|
12
|
+
import { MODEL } from "../../testing/models.js";
|
|
13
|
+
vi.mock("@webiny/app-aco", async (importOriginal)=>{
|
|
14
|
+
const actual = await importOriginal();
|
|
15
|
+
const React = await import("react");
|
|
16
|
+
const Action = Object.assign((props)=>React.createElement("div", {
|
|
17
|
+
"data-action": props.name
|
|
18
|
+
}, props.element), {
|
|
19
|
+
OptionsMenuItem: ()=>null,
|
|
20
|
+
OptionsMenuLink: ()=>null
|
|
21
|
+
});
|
|
22
|
+
return {
|
|
23
|
+
...actual,
|
|
24
|
+
AcoConfig: {
|
|
25
|
+
...actual.AcoConfig,
|
|
26
|
+
Record: {
|
|
27
|
+
...actual.AcoConfig.Record,
|
|
28
|
+
Action
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
});
|
|
33
|
+
vi.mock("@webiny/app-admin", async (importOriginal)=>{
|
|
34
|
+
const actual = await importOriginal();
|
|
35
|
+
const React = await import("react");
|
|
36
|
+
return {
|
|
37
|
+
...actual,
|
|
38
|
+
OptionsMenuItem: (props)=>React.createElement("button", {
|
|
39
|
+
"data-testid": "blocked-move",
|
|
40
|
+
disabled: props.disabled ?? false
|
|
41
|
+
}, props.label)
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
const EntryAction = ContentEntryListConfig.Browser.Entry.Action;
|
|
45
|
+
function createEntry(reviewState) {
|
|
46
|
+
const workflow = null === reviewState ? null : {
|
|
47
|
+
reviewState
|
|
48
|
+
};
|
|
49
|
+
return {
|
|
50
|
+
id: "entry-1#0001",
|
|
51
|
+
entryId: "entry-1",
|
|
52
|
+
meta: {
|
|
53
|
+
title: "Hello",
|
|
54
|
+
status: "draft",
|
|
55
|
+
version: 1,
|
|
56
|
+
locked: false,
|
|
57
|
+
system: {
|
|
58
|
+
workflow
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function renderActions(entry) {
|
|
64
|
+
return render(/*#__PURE__*/ react.createElement(AdminUiProvider, null, /*#__PURE__*/ react.createElement(CompositionProvider, null, /*#__PURE__*/ react.createElement(ModelContext.Provider, {
|
|
65
|
+
value: MODEL
|
|
66
|
+
}, /*#__PURE__*/ react.createElement(EntryProvider, {
|
|
67
|
+
entry: entry
|
|
68
|
+
}, /*#__PURE__*/ react.createElement(CmsReviewMoveEntryAction, null), /*#__PURE__*/ react.createElement(EntryAction, {
|
|
69
|
+
name: "move",
|
|
70
|
+
element: /*#__PURE__*/ react.createElement("span", {
|
|
71
|
+
"data-testid": "move-item"
|
|
72
|
+
})
|
|
73
|
+
}), /*#__PURE__*/ react.createElement(EntryAction, {
|
|
74
|
+
name: "delete",
|
|
75
|
+
element: /*#__PURE__*/ react.createElement("span", {
|
|
76
|
+
"data-testid": "delete-item"
|
|
77
|
+
})
|
|
78
|
+
}))))));
|
|
79
|
+
}
|
|
80
|
+
describe("CmsReviewMoveEntryAction", ()=>{
|
|
81
|
+
it("replaces Move with a disabled item and its reason while the review is in progress", async ()=>{
|
|
82
|
+
renderActions(createEntry(ReviewState.InProgress));
|
|
83
|
+
const blocked = await screen.findByTestId("blocked-move");
|
|
84
|
+
expect(blocked.textContent).toBe("Move");
|
|
85
|
+
expect(blocked.hasAttribute("disabled")).toBe(true);
|
|
86
|
+
expect(screen.queryByTestId("move-item")).toBeNull();
|
|
87
|
+
const describedBy = blocked.closest("[aria-describedby]")?.getAttribute("aria-describedby");
|
|
88
|
+
expect(document.getElementById(describedBy ?? "")?.textContent).toBe(MOVE_BLOCKED_IN_REVIEW);
|
|
89
|
+
});
|
|
90
|
+
it("leaves the other actions of the same row alone while the review is in progress", async ()=>{
|
|
91
|
+
renderActions(createEntry(ReviewState.InProgress));
|
|
92
|
+
expect(await screen.findByTestId("delete-item")).toBeTruthy();
|
|
93
|
+
});
|
|
94
|
+
it.each([
|
|
95
|
+
[
|
|
96
|
+
"approved",
|
|
97
|
+
ReviewState.Approved
|
|
98
|
+
],
|
|
99
|
+
[
|
|
100
|
+
"rejected",
|
|
101
|
+
ReviewState.Rejected
|
|
102
|
+
],
|
|
103
|
+
[
|
|
104
|
+
"cancelled",
|
|
105
|
+
ReviewState.Cancelled
|
|
106
|
+
],
|
|
107
|
+
[
|
|
108
|
+
"missing",
|
|
109
|
+
null
|
|
110
|
+
]
|
|
111
|
+
])("keeps the original Move for a %s review", async (_name, reviewState)=>{
|
|
112
|
+
renderActions(createEntry(reviewState));
|
|
113
|
+
expect(await screen.findByTestId("move-item")).toBeTruthy();
|
|
114
|
+
expect(screen.queryByTestId("blocked-move")).toBeNull();
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
//# sourceMappingURL=CmsReviewMoveEntryAction.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Components/CmsEntriesList/CmsReviewMoveEntryAction.test.js","sources":["../../../src/Components/CmsEntriesList/CmsReviewMoveEntryAction.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { vi } from \"vitest\";\nimport { render } from \"@testing-library/react\";\nimport { screen } from \"@testing-library/react\";\nimport { CompositionProvider } from \"@webiny/react-composition\";\nimport { AdminUiProvider } from \"@webiny/admin-ui\";\nimport { ContentEntryListConfig } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport { ModelContext } from \"@webiny/app-headless-cms/admin/components/ModelProvider/index.js\";\nimport { EntryProvider } from \"@webiny/app-headless-cms/admin/hooks/useEntry.js\";\nimport type { CmsContentEntry } from \"@webiny/app-headless-cms-common/types/index.js\";\nimport { ReviewState } from \"@webiny/app-workflows/review/domain/ReviewState.js\";\nimport { MOVE_BLOCKED_IN_REVIEW } from \"@webiny/app-workflows/review/presentation/targetReview/moveBlockedInReview.js\";\nimport { CmsReviewMoveEntryAction } from \"./CmsReviewMoveEntryAction.js\";\nimport { MODEL } from \"~/testing/models.js\";\n\ninterface FakeActionProps {\n name: string;\n element: React.ReactElement;\n}\n\ninterface FakeMenuItemProps {\n label: string;\n disabled?: boolean;\n}\n\nvi.mock(\"@webiny/app-aco\", async importOriginal => {\n const actual = await importOriginal<typeof import(\"@webiny/app-aco\")>();\n const React = await import(\"react\");\n const Action = Object.assign(\n (props: FakeActionProps) => {\n return React.createElement(\"div\", { \"data-action\": props.name }, props.element);\n },\n { OptionsMenuItem: () => null, OptionsMenuLink: () => null }\n );\n\n return {\n ...actual,\n AcoConfig: {\n ...actual.AcoConfig,\n Record: { ...actual.AcoConfig.Record, Action }\n }\n };\n});\n\nvi.mock(\"@webiny/app-admin\", async importOriginal => {\n const actual = await importOriginal<typeof import(\"@webiny/app-admin\")>();\n const React = await import(\"react\");\n\n return {\n ...actual,\n OptionsMenuItem: (props: FakeMenuItemProps) => {\n return React.createElement(\n \"button\",\n { \"data-testid\": \"blocked-move\", disabled: props.disabled ?? false },\n props.label\n );\n }\n };\n});\n\nconst EntryAction = ContentEntryListConfig.Browser.Entry.Action;\n\nfunction createEntry(reviewState: string | null): CmsContentEntry {\n const workflow = reviewState === null ? null : { reviewState };\n\n return {\n id: \"entry-1#0001\",\n entryId: \"entry-1\",\n meta: { title: \"Hello\", status: \"draft\", version: 1, locked: false, system: { workflow } }\n } as unknown as CmsContentEntry;\n}\n\nfunction renderActions(entry: CmsContentEntry) {\n return render(\n <AdminUiProvider>\n <CompositionProvider>\n <ModelContext.Provider value={MODEL}>\n <EntryProvider entry={entry}>\n <CmsReviewMoveEntryAction />\n <EntryAction name=\"move\" element={<span data-testid=\"move-item\" />} />\n <EntryAction name=\"delete\" element={<span data-testid=\"delete-item\" />} />\n </EntryProvider>\n </ModelContext.Provider>\n </CompositionProvider>\n </AdminUiProvider>\n );\n}\n\ndescribe(\"CmsReviewMoveEntryAction\", () => {\n it(\"replaces Move with a disabled item and its reason while the review is in progress\", async () => {\n renderActions(createEntry(ReviewState.InProgress));\n\n const blocked = await screen.findByTestId(\"blocked-move\");\n\n expect(blocked.textContent).toBe(\"Move\");\n expect(blocked.hasAttribute(\"disabled\")).toBe(true);\n expect(screen.queryByTestId(\"move-item\")).toBeNull();\n const describedBy = blocked.closest(\"[aria-describedby]\")?.getAttribute(\"aria-describedby\");\n expect(document.getElementById(describedBy ?? \"\")?.textContent).toBe(\n MOVE_BLOCKED_IN_REVIEW\n );\n });\n\n it(\"leaves the other actions of the same row alone while the review is in progress\", async () => {\n renderActions(createEntry(ReviewState.InProgress));\n\n expect(await screen.findByTestId(\"delete-item\")).toBeTruthy();\n });\n\n it.each([\n [\"approved\", ReviewState.Approved],\n [\"rejected\", ReviewState.Rejected],\n [\"cancelled\", ReviewState.Cancelled],\n [\"missing\", null]\n ])(\"keeps the original Move for a %s review\", async (_name, reviewState) => {\n renderActions(createEntry(reviewState));\n\n expect(await screen.findByTestId(\"move-item\")).toBeTruthy();\n expect(screen.queryByTestId(\"blocked-move\")).toBeNull();\n });\n});\n"],"names":["vi","importOriginal","actual","React","Action","Object","props","EntryAction","ContentEntryListConfig","createEntry","reviewState","workflow","renderActions","entry","render","AdminUiProvider","CompositionProvider","ModelContext","MODEL","EntryProvider","CmsReviewMoveEntryAction","describe","it","ReviewState","blocked","screen","expect","describedBy","document","MOVE_BLOCKED_IN_REVIEW","_name"],"mappings":";;;;;;;;;;;;AA4BAA,GAAG,IAAI,CAAC,mBAAmB,OAAMC;IAC7B,MAAMC,SAAS,MAAMD;IACrB,MAAME,QAAQ,MAAM,MAAM,CAAC;IAC3B,MAAMC,SAASC,OAAO,MAAM,CACxB,CAACC,QACUH,MAAM,aAAa,CAAC,OAAO;YAAE,eAAeG,MAAM,IAAI;QAAC,GAAGA,MAAM,OAAO,GAElF;QAAE,iBAAiB,IAAM;QAAM,iBAAiB,IAAM;IAAK;IAG/D,OAAO;QACH,GAAGJ,MAAM;QACT,WAAW;YACP,GAAGA,OAAO,SAAS;YACnB,QAAQ;gBAAE,GAAGA,OAAO,SAAS,CAAC,MAAM;gBAAEE;YAAO;QACjD;IACJ;AACJ;AAEAJ,GAAG,IAAI,CAAC,qBAAqB,OAAMC;IAC/B,MAAMC,SAAS,MAAMD;IACrB,MAAME,QAAQ,MAAM,MAAM,CAAC;IAE3B,OAAO;QACH,GAAGD,MAAM;QACT,iBAAiB,CAACI,QACPH,MAAM,aAAa,CACtB,UACA;gBAAE,eAAe;gBAAgB,UAAUG,MAAM,QAAQ,IAAI;YAAM,GACnEA,MAAM,KAAK;IAGvB;AACJ;AAEA,MAAMC,cAAcC,uBAAuB,OAAO,CAAC,KAAK,CAAC,MAAM;AAE/D,SAASC,YAAYC,WAA0B;IAC3C,MAAMC,WAAWD,AAAgB,SAAhBA,cAAuB,OAAO;QAAEA;IAAY;IAE7D,OAAO;QACH,IAAI;QACJ,SAAS;QACT,MAAM;YAAE,OAAO;YAAS,QAAQ;YAAS,SAAS;YAAG,QAAQ;YAAO,QAAQ;gBAAEC;YAAS;QAAE;IAC7F;AACJ;AAEA,SAASC,cAAcC,KAAsB;IACzC,OAAOC,OAAO,WAADA,GACT,oBAACC,iBAAeA,MAAAA,WAAAA,GACZ,oBAACC,qBAAmBA,MAAAA,WAAAA,GAChB,oBAACC,aAAa,QAAQ;QAAC,OAAOC;qBAC1B,oBAACC,eAAaA;QAAC,OAAON;qBAClB,oBAACO,0BAAwBA,OAAAA,WAAAA,GACzB,oBAACb,aAAWA;QAAC,MAAK;QAAO,uBAAS,oBAAC;YAAK,eAAY;;sBACpD,oBAACA,aAAWA;QAAC,MAAK;QAAS,uBAAS,oBAAC;YAAK,eAAY;;;AAM9E;AAEAc,SAAS,4BAA4B;IACjCC,GAAG,qFAAqF;QACpFV,cAAcH,YAAYc,YAAY,UAAU;QAEhD,MAAMC,UAAU,MAAMC,OAAO,YAAY,CAAC;QAE1CC,OAAOF,QAAQ,WAAW,EAAE,IAAI,CAAC;QACjCE,OAAOF,QAAQ,YAAY,CAAC,aAAa,IAAI,CAAC;QAC9CE,OAAOD,OAAO,aAAa,CAAC,cAAc,QAAQ;QAClD,MAAME,cAAcH,QAAQ,OAAO,CAAC,uBAAuB,aAAa;QACxEE,OAAOE,SAAS,cAAc,CAACD,eAAe,KAAK,aAAa,IAAI,CAChEE;IAER;IAEAP,GAAG,kFAAkF;QACjFV,cAAcH,YAAYc,YAAY,UAAU;QAEhDG,OAAO,MAAMD,OAAO,YAAY,CAAC,gBAAgB,UAAU;IAC/D;IAEAH,GAAG,IAAI,CAAC;QACJ;YAAC;YAAYC,YAAY,QAAQ;SAAC;QAClC;YAAC;YAAYA,YAAY,QAAQ;SAAC;QAClC;YAAC;YAAaA,YAAY,SAAS;SAAC;QACpC;YAAC;YAAW;SAAK;KACpB,EAAE,2CAA2C,OAAOO,OAAOpB;QACxDE,cAAcH,YAAYC;QAE1BgB,OAAO,MAAMD,OAAO,YAAY,CAAC,cAAc,UAAU;QACzDC,OAAOD,OAAO,aAAa,CAAC,iBAAiB,QAAQ;IACzD;AACJ"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { createReactiveComponent } from "@webiny/app-admin";
|
|
3
|
+
import { ContentEntryListConfig } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
|
|
4
|
+
import { useEntry } from "@webiny/app-headless-cms/admin/hooks/useEntry.js";
|
|
5
|
+
import { isReviewSelectable } from "@webiny/app-workflows/review/domain/isReviewSelectable.js";
|
|
6
|
+
const EntryAction = ContentEntryListConfig.Browser.Entry.Action;
|
|
7
|
+
const ScheduleGate = createReactiveComponent((props)=>{
|
|
8
|
+
const { entry } = useEntry();
|
|
9
|
+
const meta = entry.meta;
|
|
10
|
+
if (!isReviewSelectable(meta.system?.workflow?.reviewState ?? null)) return null;
|
|
11
|
+
return /*#__PURE__*/ react.createElement(react.Fragment, null, props.children);
|
|
12
|
+
});
|
|
13
|
+
const CmsReviewScheduleEntryAction = EntryAction.createDecorator((Original)=>function(props) {
|
|
14
|
+
if ("schedule" !== props.name) return /*#__PURE__*/ react.createElement(Original, props);
|
|
15
|
+
return /*#__PURE__*/ react.createElement(Original, {
|
|
16
|
+
...props,
|
|
17
|
+
element: /*#__PURE__*/ react.createElement(ScheduleGate, null, props.element)
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
export { CmsReviewScheduleEntryAction };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=CmsReviewScheduleEntryAction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Components/CmsEntriesList/CmsReviewScheduleEntryAction.js","sources":["../../../src/Components/CmsEntriesList/CmsReviewScheduleEntryAction.tsx"],"sourcesContent":["import React from \"react\";\nimport { createReactiveComponent } from \"@webiny/app-admin\";\nimport { ContentEntryListConfig } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport { useEntry } from \"@webiny/app-headless-cms/admin/hooks/useEntry.js\";\nimport { isReviewSelectable } from \"@webiny/app-workflows/review/domain/isReviewSelectable.js\";\nimport type { ICmsEntryMetaWithReview } from \"~/types.js\";\n\nconst EntryAction = ContentEntryListConfig.Browser.Entry.Action;\n\ninterface ScheduleGateProps {\n children?: React.ReactNode;\n}\n\nconst ScheduleGate = createReactiveComponent((props: ScheduleGateProps) => {\n const { entry } = useEntry();\n const meta: ICmsEntryMetaWithReview = entry.meta;\n\n if (!isReviewSelectable(meta.system?.workflow?.reviewState ?? null)) {\n return null;\n }\n\n return <>{props.children}</>;\n});\n\n/*\n * The scheduler's per-row \"Schedule\" action (only present when the scheduler is installed) is\n * hidden for a row whose review blocks publishing, the same rule as the row selection (D121).\n */\nexport const CmsReviewScheduleEntryAction = EntryAction.createDecorator(Original => {\n return function CmsReviewScheduleEntryActionDecorator(props) {\n if (props.name !== \"schedule\") {\n return <Original {...props} />;\n }\n\n return <Original {...props} element={<ScheduleGate>{props.element}</ScheduleGate>} />;\n };\n});\n"],"names":["EntryAction","ContentEntryListConfig","ScheduleGate","createReactiveComponent","props","entry","useEntry","meta","isReviewSelectable","CmsReviewScheduleEntryAction","Original"],"mappings":";;;;;AAOA,MAAMA,cAAcC,uBAAuB,OAAO,CAAC,KAAK,CAAC,MAAM;AAM/D,MAAMC,eAAeC,wBAAwB,CAACC;IAC1C,MAAM,EAAEC,KAAK,EAAE,GAAGC;IAClB,MAAMC,OAAgCF,MAAM,IAAI;IAEhD,IAAI,CAACG,mBAAmBD,KAAK,MAAM,EAAE,UAAU,eAAe,OAC1D,OAAO;IAGX,OAAO,WAAP,GAAO,0CAAGH,MAAM,QAAQ;AAC5B;AAMO,MAAMK,+BAA+BT,YAAY,eAAe,CAACU,CAAAA,WAC7D,SAA+CN,KAAK;QACvD,IAAIA,AAAe,eAAfA,MAAM,IAAI,EACV,OAAO,WAAP,GAAO,oBAACM,UAAaN;QAGzB,OAAO,WAAP,GAAO,oBAACM,UAAAA;YAAU,GAAGN,KAAK;YAAE,uBAAS,oBAACF,cAAYA,MAAEE,MAAM,OAAO;;IACrE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { describe, expect, it, vi } from "vitest";
|
|
3
|
+
import { render, screen } from "@testing-library/react";
|
|
4
|
+
import { CompositionProvider } from "@webiny/react-composition";
|
|
5
|
+
import { AdminUiProvider } from "@webiny/admin-ui";
|
|
6
|
+
import { ContentEntryListConfig } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
|
|
7
|
+
import { ModelContext } from "@webiny/app-headless-cms/admin/components/ModelProvider/index.js";
|
|
8
|
+
import { EntryProvider } from "@webiny/app-headless-cms/admin/hooks/useEntry.js";
|
|
9
|
+
import { ReviewState } from "@webiny/app-workflows/review/domain/ReviewState.js";
|
|
10
|
+
import { CmsReviewScheduleEntryAction } from "./CmsReviewScheduleEntryAction.js";
|
|
11
|
+
import { MODEL } from "../../testing/models.js";
|
|
12
|
+
vi.mock("@webiny/app-aco", async (importOriginal)=>{
|
|
13
|
+
const actual = await importOriginal();
|
|
14
|
+
const React = await import("react");
|
|
15
|
+
const Action = Object.assign((props)=>React.createElement("div", {
|
|
16
|
+
"data-action": props.name
|
|
17
|
+
}, props.element), {
|
|
18
|
+
OptionsMenuItem: ()=>null,
|
|
19
|
+
OptionsMenuLink: ()=>null
|
|
20
|
+
});
|
|
21
|
+
return {
|
|
22
|
+
...actual,
|
|
23
|
+
AcoConfig: {
|
|
24
|
+
...actual.AcoConfig,
|
|
25
|
+
Record: {
|
|
26
|
+
...actual.AcoConfig.Record,
|
|
27
|
+
Action
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
const EntryAction = ContentEntryListConfig.Browser.Entry.Action;
|
|
33
|
+
function createEntry(reviewState) {
|
|
34
|
+
const workflow = null === reviewState ? null : {
|
|
35
|
+
reviewState
|
|
36
|
+
};
|
|
37
|
+
return {
|
|
38
|
+
id: "entry-1#0001",
|
|
39
|
+
entryId: "entry-1",
|
|
40
|
+
meta: {
|
|
41
|
+
title: "Hello",
|
|
42
|
+
status: "draft",
|
|
43
|
+
version: 1,
|
|
44
|
+
locked: false,
|
|
45
|
+
system: {
|
|
46
|
+
workflow
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function renderActions(entry) {
|
|
52
|
+
return render(/*#__PURE__*/ react.createElement(AdminUiProvider, null, /*#__PURE__*/ react.createElement(CompositionProvider, null, /*#__PURE__*/ react.createElement(ModelContext.Provider, {
|
|
53
|
+
value: MODEL
|
|
54
|
+
}, /*#__PURE__*/ react.createElement(EntryProvider, {
|
|
55
|
+
entry: entry
|
|
56
|
+
}, /*#__PURE__*/ react.createElement(CmsReviewScheduleEntryAction, null), /*#__PURE__*/ react.createElement(EntryAction, {
|
|
57
|
+
name: "schedule",
|
|
58
|
+
element: /*#__PURE__*/ react.createElement("span", {
|
|
59
|
+
"data-testid": "schedule-item"
|
|
60
|
+
})
|
|
61
|
+
}), /*#__PURE__*/ react.createElement(EntryAction, {
|
|
62
|
+
name: "delete",
|
|
63
|
+
element: /*#__PURE__*/ react.createElement("span", {
|
|
64
|
+
"data-testid": "delete-item"
|
|
65
|
+
})
|
|
66
|
+
}))))));
|
|
67
|
+
}
|
|
68
|
+
const CASES = [
|
|
69
|
+
{
|
|
70
|
+
reviewState: null,
|
|
71
|
+
shown: true
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
reviewState: ReviewState.Approved,
|
|
75
|
+
shown: true
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
reviewState: ReviewState.InProgress,
|
|
79
|
+
shown: false
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
reviewState: ReviewState.Rejected,
|
|
83
|
+
shown: false
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
reviewState: ReviewState.Cancelled,
|
|
87
|
+
shown: false
|
|
88
|
+
}
|
|
89
|
+
];
|
|
90
|
+
describe("CmsReviewScheduleEntryAction", ()=>{
|
|
91
|
+
it.each(CASES)("review state $reviewState: Schedule shown is $shown", ({ reviewState, shown })=>{
|
|
92
|
+
renderActions(createEntry(reviewState));
|
|
93
|
+
expect(screen.queryAllByTestId("schedule-item")).toHaveLength(shown ? 1 : 0);
|
|
94
|
+
expect(screen.getByTestId("delete-item")).toBeTruthy();
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
//# sourceMappingURL=CmsReviewScheduleEntryAction.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Components/CmsEntriesList/CmsReviewScheduleEntryAction.test.js","sources":["../../../src/Components/CmsEntriesList/CmsReviewScheduleEntryAction.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { vi } from \"vitest\";\nimport { render } from \"@testing-library/react\";\nimport { screen } from \"@testing-library/react\";\nimport { CompositionProvider } from \"@webiny/react-composition\";\nimport { AdminUiProvider } from \"@webiny/admin-ui\";\nimport { ContentEntryListConfig } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport { ModelContext } from \"@webiny/app-headless-cms/admin/components/ModelProvider/index.js\";\nimport { EntryProvider } from \"@webiny/app-headless-cms/admin/hooks/useEntry.js\";\nimport type { CmsContentEntry } from \"@webiny/app-headless-cms-common/types/index.js\";\nimport { ReviewState } from \"@webiny/app-workflows/review/domain/ReviewState.js\";\nimport type { ReviewStateValue } from \"@webiny/app-workflows/review/domain/ReviewState.js\";\nimport { CmsReviewScheduleEntryAction } from \"./CmsReviewScheduleEntryAction.js\";\nimport { MODEL } from \"~/testing/models.js\";\n\ninterface FakeActionProps {\n name: string;\n element: React.ReactElement;\n}\n\nvi.mock(\"@webiny/app-aco\", async importOriginal => {\n const actual = await importOriginal<typeof import(\"@webiny/app-aco\")>();\n const React = await import(\"react\");\n const Action = Object.assign(\n (props: FakeActionProps) => {\n return React.createElement(\"div\", { \"data-action\": props.name }, props.element);\n },\n { OptionsMenuItem: () => null, OptionsMenuLink: () => null }\n );\n\n return {\n ...actual,\n AcoConfig: {\n ...actual.AcoConfig,\n Record: { ...actual.AcoConfig.Record, Action }\n }\n };\n});\n\nconst EntryAction = ContentEntryListConfig.Browser.Entry.Action;\n\nfunction createEntry(reviewState: ReviewStateValue | null): CmsContentEntry {\n const workflow = reviewState === null ? null : { reviewState };\n\n return {\n id: \"entry-1#0001\",\n entryId: \"entry-1\",\n meta: { title: \"Hello\", status: \"draft\", version: 1, locked: false, system: { workflow } }\n } as unknown as CmsContentEntry;\n}\n\nfunction renderActions(entry: CmsContentEntry) {\n return render(\n <AdminUiProvider>\n <CompositionProvider>\n <ModelContext.Provider value={MODEL}>\n <EntryProvider entry={entry}>\n <CmsReviewScheduleEntryAction />\n <EntryAction\n name=\"schedule\"\n element={<span data-testid=\"schedule-item\" />}\n />\n <EntryAction name=\"delete\" element={<span data-testid=\"delete-item\" />} />\n </EntryProvider>\n </ModelContext.Provider>\n </CompositionProvider>\n </AdminUiProvider>\n );\n}\n\ninterface ScheduleCase {\n reviewState: ReviewStateValue | null;\n shown: boolean;\n}\n\nconst CASES: ScheduleCase[] = [\n { reviewState: null, shown: true },\n { reviewState: ReviewState.Approved, shown: true },\n { reviewState: ReviewState.InProgress, shown: false },\n { reviewState: ReviewState.Rejected, shown: false },\n { reviewState: ReviewState.Cancelled, shown: false }\n];\n\ndescribe(\"CmsReviewScheduleEntryAction\", () => {\n it.each(CASES)(\n \"review state $reviewState: Schedule shown is $shown\",\n ({ reviewState, shown }) => {\n renderActions(createEntry(reviewState));\n\n expect(screen.queryAllByTestId(\"schedule-item\")).toHaveLength(shown ? 1 : 0);\n expect(screen.getByTestId(\"delete-item\")).toBeTruthy();\n }\n );\n});\n"],"names":["vi","importOriginal","actual","React","Action","Object","props","EntryAction","ContentEntryListConfig","createEntry","reviewState","workflow","renderActions","entry","render","AdminUiProvider","CompositionProvider","ModelContext","MODEL","EntryProvider","CmsReviewScheduleEntryAction","CASES","ReviewState","describe","it","shown","expect","screen"],"mappings":";;;;;;;;;;;AAuBAA,GAAG,IAAI,CAAC,mBAAmB,OAAMC;IAC7B,MAAMC,SAAS,MAAMD;IACrB,MAAME,QAAQ,MAAM,MAAM,CAAC;IAC3B,MAAMC,SAASC,OAAO,MAAM,CACxB,CAACC,QACUH,MAAM,aAAa,CAAC,OAAO;YAAE,eAAeG,MAAM,IAAI;QAAC,GAAGA,MAAM,OAAO,GAElF;QAAE,iBAAiB,IAAM;QAAM,iBAAiB,IAAM;IAAK;IAG/D,OAAO;QACH,GAAGJ,MAAM;QACT,WAAW;YACP,GAAGA,OAAO,SAAS;YACnB,QAAQ;gBAAE,GAAGA,OAAO,SAAS,CAAC,MAAM;gBAAEE;YAAO;QACjD;IACJ;AACJ;AAEA,MAAMG,cAAcC,uBAAuB,OAAO,CAAC,KAAK,CAAC,MAAM;AAE/D,SAASC,YAAYC,WAAoC;IACrD,MAAMC,WAAWD,AAAgB,SAAhBA,cAAuB,OAAO;QAAEA;IAAY;IAE7D,OAAO;QACH,IAAI;QACJ,SAAS;QACT,MAAM;YAAE,OAAO;YAAS,QAAQ;YAAS,SAAS;YAAG,QAAQ;YAAO,QAAQ;gBAAEC;YAAS;QAAE;IAC7F;AACJ;AAEA,SAASC,cAAcC,KAAsB;IACzC,OAAOC,OAAO,WAADA,GACT,oBAACC,iBAAeA,MAAAA,WAAAA,GACZ,oBAACC,qBAAmBA,MAAAA,WAAAA,GAChB,oBAACC,aAAa,QAAQ;QAAC,OAAOC;qBAC1B,oBAACC,eAAaA;QAAC,OAAON;qBAClB,oBAACO,8BAA4BA,OAAAA,WAAAA,GAC7B,oBAACb,aAAWA;QACR,MAAK;QACL,uBAAS,oBAAC;YAAK,eAAY;;sBAE/B,oBAACA,aAAWA;QAAC,MAAK;QAAS,uBAAS,oBAAC;YAAK,eAAY;;;AAM9E;AAOA,MAAMc,QAAwB;IAC1B;QAAE,aAAa;QAAM,OAAO;IAAK;IACjC;QAAE,aAAaC,YAAY,QAAQ;QAAE,OAAO;IAAK;IACjD;QAAE,aAAaA,YAAY,UAAU;QAAE,OAAO;IAAM;IACpD;QAAE,aAAaA,YAAY,QAAQ;QAAE,OAAO;IAAM;IAClD;QAAE,aAAaA,YAAY,SAAS;QAAE,OAAO;IAAM;CACtD;AAEDC,SAAS,gCAAgC;IACrCC,GAAG,IAAI,CAACH,OACJ,uDACA,CAAC,EAAEX,WAAW,EAAEe,KAAK,EAAE;QACnBb,cAAcH,YAAYC;QAE1BgB,OAAOC,OAAO,gBAAgB,CAAC,kBAAkB,YAAY,CAACF,QAAQ,IAAI;QAC1EC,OAAOC,OAAO,WAAW,CAAC,gBAAgB,UAAU;IACxD;AAER"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import react, { useMemo } from "react";
|
|
2
|
+
import { createReactiveComponent } from "@webiny/app-admin";
|
|
3
|
+
import { Separator } from "@webiny/admin-ui";
|
|
4
|
+
import { EditorReviewBar } from "@webiny/app-workflows/review/editor/components/EditorReviewBar.js";
|
|
5
|
+
import { ContentEntryFormContent } from "@webiny/app-headless-cms/presentation/contentEntries/views/layout/index.js";
|
|
6
|
+
import { useContentEntryFormPresenter } from "@webiny/app-headless-cms/presentation/contentEntries/form/useContentEntryFormPresenter.js";
|
|
7
|
+
import { useCmsEntryReview } from "../../features/editorReview/useCmsEntryReview.js";
|
|
8
|
+
import { Routes } from "../../routes.js";
|
|
9
|
+
import { isReviewableModel } from "../../utils/isReviewableModel.js";
|
|
10
|
+
import { getModelFieldLabels } from "./getModelFieldLabels.js";
|
|
11
|
+
const CmsEntryReviewBar = ContentEntryFormContent.createDecorator((Original)=>createReactiveComponent(function(props) {
|
|
12
|
+
const formPresenter = useContentEntryFormPresenter();
|
|
13
|
+
const session = useCmsEntryReview();
|
|
14
|
+
const { entry, model } = formPresenter.vm;
|
|
15
|
+
const hasEntry = null !== entry && isReviewableModel(model);
|
|
16
|
+
const showsBar = hasEntry && "noWorkflow" !== session.presenter.vm.status;
|
|
17
|
+
const fieldLabels = useMemo(()=>getModelFieldLabels(model), [
|
|
18
|
+
model
|
|
19
|
+
]);
|
|
20
|
+
if (!showsBar) return /*#__PURE__*/ react.createElement(Original, props);
|
|
21
|
+
return /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement("div", {
|
|
22
|
+
className: "max-w-screen p-sm"
|
|
23
|
+
}, /*#__PURE__*/ react.createElement(EditorReviewBar, {
|
|
24
|
+
session: session,
|
|
25
|
+
reviewsRoute: Routes.ContentEntries.ContentReviews,
|
|
26
|
+
fieldLabels: fieldLabels,
|
|
27
|
+
contentTypeLabel: model.name
|
|
28
|
+
})), /*#__PURE__*/ react.createElement(Separator, null), /*#__PURE__*/ react.createElement(Original, props));
|
|
29
|
+
}));
|
|
30
|
+
export { CmsEntryReviewBar };
|
|
31
|
+
|
|
32
|
+
//# sourceMappingURL=CmsEntryReviewBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Components/ContentEntryForm/CmsEntryReviewBar.js","sources":["../../../src/Components/ContentEntryForm/CmsEntryReviewBar.tsx"],"sourcesContent":["import React from \"react\";\nimport { useMemo } from \"react\";\nimport { createReactiveComponent } from \"@webiny/app-admin\";\nimport { Separator } from \"@webiny/admin-ui\";\nimport { EditorReviewBar } from \"@webiny/app-workflows/review/editor/components/EditorReviewBar.js\";\nimport { ContentEntryFormContent } from \"@webiny/app-headless-cms/presentation/contentEntries/views/layout/index.js\";\nimport { useContentEntryFormPresenter } from \"@webiny/app-headless-cms/presentation/contentEntries/form/useContentEntryFormPresenter.js\";\nimport { useCmsEntryReview } from \"~/features/editorReview/useCmsEntryReview.js\";\nimport { Routes } from \"~/routes.js\";\nimport { isReviewableModel } from \"~/utils/isReviewableModel.js\";\nimport { getModelFieldLabels } from \"./getModelFieldLabels.js\";\n\nexport const CmsEntryReviewBar = ContentEntryFormContent.createDecorator(Original => {\n return createReactiveComponent(function CmsEntryReviewBarDecorator(props) {\n const formPresenter = useContentEntryFormPresenter();\n const session = useCmsEntryReview();\n const { entry, model } = formPresenter.vm;\n const hasEntry = entry !== null && isReviewableModel(model);\n const showsBar = hasEntry && session.presenter.vm.status !== \"noWorkflow\";\n const fieldLabels = useMemo(() => getModelFieldLabels(model), [model]);\n\n if (!showsBar) {\n return <Original {...props} />;\n }\n\n return (\n <>\n <div className={\"max-w-screen p-sm\"}>\n <EditorReviewBar\n session={session}\n reviewsRoute={Routes.ContentEntries.ContentReviews}\n fieldLabels={fieldLabels}\n contentTypeLabel={model.name}\n />\n </div>\n <Separator />\n <Original {...props} />\n </>\n );\n });\n});\n"],"names":["CmsEntryReviewBar","ContentEntryFormContent","Original","createReactiveComponent","props","formPresenter","useContentEntryFormPresenter","session","useCmsEntryReview","entry","model","hasEntry","isReviewableModel","showsBar","fieldLabels","useMemo","getModelFieldLabels","EditorReviewBar","Routes","Separator"],"mappings":";;;;;;;;;;AAYO,MAAMA,oBAAoBC,wBAAwB,eAAe,CAACC,CAAAA,WAC9DC,wBAAwB,SAAoCC,KAAK;QACpE,MAAMC,gBAAgBC;QACtB,MAAMC,UAAUC;QAChB,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGL,cAAc,EAAE;QACzC,MAAMM,WAAWF,AAAU,SAAVA,SAAkBG,kBAAkBF;QACrD,MAAMG,WAAWF,YAAYJ,AAAgC,iBAAhCA,QAAQ,SAAS,CAAC,EAAE,CAAC,MAAM;QACxD,MAAMO,cAAcC,QAAQ,IAAMC,oBAAoBN,QAAQ;YAACA;SAAM;QAErE,IAAI,CAACG,UACD,OAAO,WAAP,GAAO,oBAACX,UAAaE;QAGzB,OAAO,WAAP,GACI,wDACI,oBAAC;YAAI,WAAW;yBACZ,oBAACa,iBAAeA;YACZ,SAASV;YACT,cAAcW,OAAO,cAAc,CAAC,cAAc;YAClD,aAAaJ;YACb,kBAAkBJ,MAAM,IAAI;2BAGpC,oBAACS,WAASA,OAAAA,WAAAA,GACV,oBAACjB,UAAaE;IAG1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { describe, expect, it, vi } from "vitest";
|
|
3
|
+
import { act, screen, waitFor } from "@testing-library/react";
|
|
4
|
+
import { ContentEntryFormContent } from "@webiny/app-headless-cms/presentation/contentEntries/views/layout/index.js";
|
|
5
|
+
import { CmsEntryReviewBar } from "./CmsEntryReviewBar.js";
|
|
6
|
+
import { MODEL, SINGLETON_MODEL } from "../../testing/models.js";
|
|
7
|
+
import { renderEditorTree } from "../../testing/renderEditorTree.js";
|
|
8
|
+
import { BOUND_NO_REVIEW, IN_REVIEW, LOADING, NO_WORKFLOW } from "../../testing/reviewStates.js";
|
|
9
|
+
vi.mock("@webiny/app-workflows/review/editor/components/EditorReviewBar.js", async ()=>{
|
|
10
|
+
const React = await import("react");
|
|
11
|
+
return {
|
|
12
|
+
EditorReviewBar: (props)=>React.createElement("div", {
|
|
13
|
+
"data-testid": "editor-review-bar",
|
|
14
|
+
"data-reviews-path": props.reviewsRoute.path,
|
|
15
|
+
"data-field-labels": JSON.stringify(props.fieldLabels ?? null),
|
|
16
|
+
"data-content-type-label": props.contentTypeLabel
|
|
17
|
+
})
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
function renderContent(params) {
|
|
21
|
+
return renderEditorTree({
|
|
22
|
+
...params,
|
|
23
|
+
children: /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(CmsEntryReviewBar, null), /*#__PURE__*/ react.createElement(ContentEntryFormContent, null, /*#__PURE__*/ react.createElement("div", {
|
|
24
|
+
"data-testid": "original"
|
|
25
|
+
})))
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
describe("CmsEntryReviewBar", ()=>{
|
|
29
|
+
it("renders one bar above the original content of a loaded entry", async ()=>{
|
|
30
|
+
renderContent({
|
|
31
|
+
reviewVm: BOUND_NO_REVIEW
|
|
32
|
+
});
|
|
33
|
+
const bars = await screen.findAllByTestId("editor-review-bar");
|
|
34
|
+
const original = screen.getByTestId("original");
|
|
35
|
+
expect(bars).toHaveLength(1);
|
|
36
|
+
expect(bars[0].getAttribute("data-reviews-path")).toBe("/cms/content-reviews");
|
|
37
|
+
const position = bars[0].compareDocumentPosition(original);
|
|
38
|
+
expect(position & Node.DOCUMENT_POSITION_FOLLOWING).toBeTruthy();
|
|
39
|
+
});
|
|
40
|
+
it("passes the model name to the bar as the content type label", async ()=>{
|
|
41
|
+
renderContent({
|
|
42
|
+
reviewVm: BOUND_NO_REVIEW
|
|
43
|
+
});
|
|
44
|
+
const [bar] = await screen.findAllByTestId("editor-review-bar");
|
|
45
|
+
expect(bar.getAttribute("data-content-type-label")).toBe("Article");
|
|
46
|
+
});
|
|
47
|
+
it("passes the model's field labels to the bar for Review details (RD5)", async ()=>{
|
|
48
|
+
const model = {
|
|
49
|
+
...MODEL,
|
|
50
|
+
fields: [
|
|
51
|
+
{
|
|
52
|
+
fieldId: "title",
|
|
53
|
+
label: "Title"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
fieldId: "description",
|
|
57
|
+
label: "Body"
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
};
|
|
61
|
+
renderContent({
|
|
62
|
+
formVm: {
|
|
63
|
+
model
|
|
64
|
+
},
|
|
65
|
+
reviewVm: BOUND_NO_REVIEW
|
|
66
|
+
});
|
|
67
|
+
const [bar] = await screen.findAllByTestId("editor-review-bar");
|
|
68
|
+
expect(JSON.parse(bar.getAttribute("data-field-labels") ?? "null")).toEqual({
|
|
69
|
+
title: "Title",
|
|
70
|
+
description: "Body"
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
it.each([
|
|
74
|
+
[
|
|
75
|
+
"loading",
|
|
76
|
+
LOADING
|
|
77
|
+
],
|
|
78
|
+
[
|
|
79
|
+
"in review",
|
|
80
|
+
IN_REVIEW
|
|
81
|
+
]
|
|
82
|
+
])("shows the bar while the status is %s", async (_name, reviewVm)=>{
|
|
83
|
+
renderContent({
|
|
84
|
+
reviewVm
|
|
85
|
+
});
|
|
86
|
+
expect(await screen.findAllByTestId("editor-review-bar")).toHaveLength(1);
|
|
87
|
+
});
|
|
88
|
+
it("shows nothing when no workflow is bound", async ()=>{
|
|
89
|
+
renderContent({
|
|
90
|
+
reviewVm: NO_WORKFLOW
|
|
91
|
+
});
|
|
92
|
+
await waitFor(()=>expect(screen.queryByTestId("editor-review-bar")).toBeNull());
|
|
93
|
+
expect(screen.getByTestId("original")).toBeTruthy();
|
|
94
|
+
});
|
|
95
|
+
it("shows nothing for a new entry", async ()=>{
|
|
96
|
+
renderContent({
|
|
97
|
+
formVm: {
|
|
98
|
+
entry: null,
|
|
99
|
+
isNewEntry: true
|
|
100
|
+
},
|
|
101
|
+
reviewVm: BOUND_NO_REVIEW
|
|
102
|
+
});
|
|
103
|
+
await waitFor(()=>expect(screen.queryByTestId("editor-review-bar")).toBeNull());
|
|
104
|
+
expect(screen.getByTestId("original")).toBeTruthy();
|
|
105
|
+
});
|
|
106
|
+
it("shows nothing for a singleton model", async ()=>{
|
|
107
|
+
renderContent({
|
|
108
|
+
formVm: {
|
|
109
|
+
model: SINGLETON_MODEL
|
|
110
|
+
},
|
|
111
|
+
reviewVm: BOUND_NO_REVIEW
|
|
112
|
+
});
|
|
113
|
+
await waitFor(()=>expect(screen.queryByTestId("editor-review-bar")).toBeNull());
|
|
114
|
+
expect(screen.getByTestId("original")).toBeTruthy();
|
|
115
|
+
});
|
|
116
|
+
it("appears when the status becomes known", async ()=>{
|
|
117
|
+
const view = renderContent({
|
|
118
|
+
reviewVm: NO_WORKFLOW
|
|
119
|
+
});
|
|
120
|
+
await waitFor(()=>expect(screen.queryByTestId("editor-review-bar")).toBeNull());
|
|
121
|
+
act(()=>{
|
|
122
|
+
view.setVm(BOUND_NO_REVIEW);
|
|
123
|
+
});
|
|
124
|
+
expect(await screen.findAllByTestId("editor-review-bar")).toHaveLength(1);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
//# sourceMappingURL=CmsEntryReviewBar.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Components/ContentEntryForm/CmsEntryReviewBar.test.js","sources":["../../../src/Components/ContentEntryForm/CmsEntryReviewBar.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { vi } from \"vitest\";\nimport { act } from \"@testing-library/react\";\nimport { screen } from \"@testing-library/react\";\nimport { waitFor } from \"@testing-library/react\";\nimport type { Route } from \"@webiny/app-admin\";\nimport { ContentEntryFormContent } from \"@webiny/app-headless-cms/presentation/contentEntries/views/layout/index.js\";\nimport { CmsEntryReviewBar } from \"./CmsEntryReviewBar.js\";\nimport { MODEL } from \"~/testing/models.js\";\nimport { SINGLETON_MODEL } from \"~/testing/models.js\";\nimport { renderEditorTree } from \"~/testing/renderEditorTree.js\";\nimport { BOUND_NO_REVIEW } from \"~/testing/reviewStates.js\";\nimport { IN_REVIEW } from \"~/testing/reviewStates.js\";\nimport { LOADING } from \"~/testing/reviewStates.js\";\nimport { NO_WORKFLOW } from \"~/testing/reviewStates.js\";\n\ninterface FakeBarProps {\n reviewsRoute: Route<any>;\n fieldLabels?: Record<string, string>;\n contentTypeLabel?: string;\n}\n\nvi.mock(\"@webiny/app-workflows/review/editor/components/EditorReviewBar.js\", async () => {\n const React = await import(\"react\");\n\n return {\n EditorReviewBar: (props: FakeBarProps) => {\n return React.createElement(\"div\", {\n \"data-testid\": \"editor-review-bar\",\n \"data-reviews-path\": props.reviewsRoute.path,\n \"data-field-labels\": JSON.stringify(props.fieldLabels ?? null),\n \"data-content-type-label\": props.contentTypeLabel\n });\n }\n };\n});\n\nfunction renderContent(params: Parameters<typeof renderEditorTree>[0]) {\n return renderEditorTree({\n ...params,\n children: (\n <>\n <CmsEntryReviewBar />\n <ContentEntryFormContent>\n <div data-testid=\"original\" />\n </ContentEntryFormContent>\n </>\n )\n });\n}\n\ndescribe(\"CmsEntryReviewBar\", () => {\n it(\"renders one bar above the original content of a loaded entry\", async () => {\n renderContent({ reviewVm: BOUND_NO_REVIEW });\n\n const bars = await screen.findAllByTestId(\"editor-review-bar\");\n const original = screen.getByTestId(\"original\");\n\n expect(bars).toHaveLength(1);\n expect(bars[0].getAttribute(\"data-reviews-path\")).toBe(\"/cms/content-reviews\");\n const position = bars[0].compareDocumentPosition(original);\n expect(position & Node.DOCUMENT_POSITION_FOLLOWING).toBeTruthy();\n });\n\n it(\"passes the model name to the bar as the content type label\", async () => {\n renderContent({ reviewVm: BOUND_NO_REVIEW });\n\n const [bar] = await screen.findAllByTestId(\"editor-review-bar\");\n expect(bar.getAttribute(\"data-content-type-label\")).toBe(\"Article\");\n });\n\n it(\"passes the model's field labels to the bar for Review details (RD5)\", async () => {\n const model = {\n ...MODEL,\n fields: [\n { fieldId: \"title\", label: \"Title\" },\n { fieldId: \"description\", label: \"Body\" }\n ]\n } as unknown as typeof MODEL;\n renderContent({ formVm: { model }, reviewVm: BOUND_NO_REVIEW });\n\n const [bar] = await screen.findAllByTestId(\"editor-review-bar\");\n expect(JSON.parse(bar.getAttribute(\"data-field-labels\") ?? \"null\")).toEqual({\n title: \"Title\",\n description: \"Body\"\n });\n });\n\n it.each([\n [\"loading\", LOADING],\n [\"in review\", IN_REVIEW]\n ])(\"shows the bar while the status is %s\", async (_name, reviewVm) => {\n renderContent({ reviewVm });\n\n expect(await screen.findAllByTestId(\"editor-review-bar\")).toHaveLength(1);\n });\n\n it(\"shows nothing when no workflow is bound\", async () => {\n renderContent({ reviewVm: NO_WORKFLOW });\n\n await waitFor(() => expect(screen.queryByTestId(\"editor-review-bar\")).toBeNull());\n expect(screen.getByTestId(\"original\")).toBeTruthy();\n });\n\n it(\"shows nothing for a new entry\", async () => {\n renderContent({ formVm: { entry: null, isNewEntry: true }, reviewVm: BOUND_NO_REVIEW });\n\n await waitFor(() => expect(screen.queryByTestId(\"editor-review-bar\")).toBeNull());\n expect(screen.getByTestId(\"original\")).toBeTruthy();\n });\n\n it(\"shows nothing for a singleton model\", async () => {\n renderContent({ formVm: { model: SINGLETON_MODEL }, reviewVm: BOUND_NO_REVIEW });\n\n await waitFor(() => expect(screen.queryByTestId(\"editor-review-bar\")).toBeNull());\n expect(screen.getByTestId(\"original\")).toBeTruthy();\n });\n\n it(\"appears when the status becomes known\", async () => {\n const view = renderContent({ reviewVm: NO_WORKFLOW });\n await waitFor(() => expect(screen.queryByTestId(\"editor-review-bar\")).toBeNull());\n\n act(() => {\n view.setVm(BOUND_NO_REVIEW);\n });\n\n expect(await screen.findAllByTestId(\"editor-review-bar\")).toHaveLength(1);\n });\n});\n"],"names":["vi","React","props","JSON","renderContent","params","renderEditorTree","CmsEntryReviewBar","ContentEntryFormContent","describe","it","BOUND_NO_REVIEW","bars","screen","original","expect","position","Node","bar","model","MODEL","LOADING","IN_REVIEW","_name","reviewVm","NO_WORKFLOW","waitFor","SINGLETON_MODEL","view","act"],"mappings":";;;;;;;;AAyBAA,GAAG,IAAI,CAAC,qEAAqE;IACzE,MAAMC,QAAQ,MAAM,MAAM,CAAC;IAE3B,OAAO;QACH,iBAAiB,CAACC,QACPD,MAAM,aAAa,CAAC,OAAO;gBAC9B,eAAe;gBACf,qBAAqBC,MAAM,YAAY,CAAC,IAAI;gBAC5C,qBAAqBC,KAAK,SAAS,CAACD,MAAM,WAAW,IAAI;gBACzD,2BAA2BA,MAAM,gBAAgB;YACrD;IAER;AACJ;AAEA,SAASE,cAAcC,MAA8C;IACjE,OAAOC,iBAAiB;QACpB,GAAGD,MAAM;QACT,UAAU,WAAV,GACI,wDACI,oBAACE,mBAAiBA,OAAAA,WAAAA,GAClB,oBAACC,yBAAuBA,MAAAA,WAAAA,GACpB,oBAAC;YAAI,eAAY;;IAIjC;AACJ;AAEAC,SAAS,qBAAqB;IAC1BC,GAAG,gEAAgE;QAC/DN,cAAc;YAAE,UAAUO;QAAgB;QAE1C,MAAMC,OAAO,MAAMC,OAAO,eAAe,CAAC;QAC1C,MAAMC,WAAWD,OAAO,WAAW,CAAC;QAEpCE,OAAOH,MAAM,YAAY,CAAC;QAC1BG,OAAOH,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,sBAAsB,IAAI,CAAC;QACvD,MAAMI,WAAWJ,IAAI,CAAC,EAAE,CAAC,uBAAuB,CAACE;QACjDC,OAAOC,WAAWC,KAAK,2BAA2B,EAAE,UAAU;IAClE;IAEAP,GAAG,8DAA8D;QAC7DN,cAAc;YAAE,UAAUO;QAAgB;QAE1C,MAAM,CAACO,IAAI,GAAG,MAAML,OAAO,eAAe,CAAC;QAC3CE,OAAOG,IAAI,YAAY,CAAC,4BAA4B,IAAI,CAAC;IAC7D;IAEAR,GAAG,uEAAuE;QACtE,MAAMS,QAAQ;YACV,GAAGC,KAAK;YACR,QAAQ;gBACJ;oBAAE,SAAS;oBAAS,OAAO;gBAAQ;gBACnC;oBAAE,SAAS;oBAAe,OAAO;gBAAO;aAC3C;QACL;QACAhB,cAAc;YAAE,QAAQ;gBAAEe;YAAM;YAAG,UAAUR;QAAgB;QAE7D,MAAM,CAACO,IAAI,GAAG,MAAML,OAAO,eAAe,CAAC;QAC3CE,OAAOZ,KAAK,KAAK,CAACe,IAAI,YAAY,CAAC,wBAAwB,SAAS,OAAO,CAAC;YACxE,OAAO;YACP,aAAa;QACjB;IACJ;IAEAR,GAAG,IAAI,CAAC;QACJ;YAAC;YAAWW;SAAQ;QACpB;YAAC;YAAaC;SAAU;KAC3B,EAAE,wCAAwC,OAAOC,OAAOC;QACrDpB,cAAc;YAAEoB;QAAS;QAEzBT,OAAO,MAAMF,OAAO,eAAe,CAAC,sBAAsB,YAAY,CAAC;IAC3E;IAEAH,GAAG,2CAA2C;QAC1CN,cAAc;YAAE,UAAUqB;QAAY;QAEtC,MAAMC,QAAQ,IAAMX,OAAOF,OAAO,aAAa,CAAC,sBAAsB,QAAQ;QAC9EE,OAAOF,OAAO,WAAW,CAAC,aAAa,UAAU;IACrD;IAEAH,GAAG,iCAAiC;QAChCN,cAAc;YAAE,QAAQ;gBAAE,OAAO;gBAAM,YAAY;YAAK;YAAG,UAAUO;QAAgB;QAErF,MAAMe,QAAQ,IAAMX,OAAOF,OAAO,aAAa,CAAC,sBAAsB,QAAQ;QAC9EE,OAAOF,OAAO,WAAW,CAAC,aAAa,UAAU;IACrD;IAEAH,GAAG,uCAAuC;QACtCN,cAAc;YAAE,QAAQ;gBAAE,OAAOuB;YAAgB;YAAG,UAAUhB;QAAgB;QAE9E,MAAMe,QAAQ,IAAMX,OAAOF,OAAO,aAAa,CAAC,sBAAsB,QAAQ;QAC9EE,OAAOF,OAAO,WAAW,CAAC,aAAa,UAAU;IACrD;IAEAH,GAAG,yCAAyC;QACxC,MAAMkB,OAAOxB,cAAc;YAAE,UAAUqB;QAAY;QACnD,MAAMC,QAAQ,IAAMX,OAAOF,OAAO,aAAa,CAAC,sBAAsB,QAAQ;QAE9EgB,IAAI;YACAD,KAAK,KAAK,CAACjB;QACf;QAEAI,OAAO,MAAMF,OAAO,eAAe,CAAC,sBAAsB,YAAY,CAAC;IAC3E;AACJ"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { createReactiveComponent } from "@webiny/app-admin";
|
|
3
|
+
import { InternalContentEntryEditorConfig } from "@webiny/app-headless-cms/admin/config/contentEntries/index.js";
|
|
4
|
+
import { IsModelPublishable } from "@webiny/app-headless-cms/admin/components/IsModelPublishable.js";
|
|
5
|
+
import { usePermission } from "@webiny/app-headless-cms/admin/hooks/usePermission.js";
|
|
6
|
+
import { useContentEntryFormPresenter } from "@webiny/app-headless-cms/presentation/contentEntries/form/useContentEntryFormPresenter.js";
|
|
7
|
+
import { ReviewTooltip } from "@webiny/app-workflows/review/presentation/targetReview/components/ReviewTooltip.js";
|
|
8
|
+
import { useCmsEntryReview } from "../../features/editorReview/useCmsEntryReview.js";
|
|
9
|
+
import { isReviewableModel } from "../../utils/isReviewableModel.js";
|
|
10
|
+
import { ignoreAction } from "../ignoreAction.js";
|
|
11
|
+
const { Actions: Actions } = InternalContentEntryEditorConfig;
|
|
12
|
+
const BlockedActions = createReactiveComponent(()=>{
|
|
13
|
+
const { ButtonPrimary, ButtonSecondary } = Actions.ButtonAction.useButtons();
|
|
14
|
+
const formPresenter = useContentEntryFormPresenter();
|
|
15
|
+
const session = useCmsEntryReview();
|
|
16
|
+
const { canPublish } = usePermission();
|
|
17
|
+
const { entry, model, canSave, canPublish: canPublishNow } = formPresenter.vm;
|
|
18
|
+
const review = session.presenter.vm;
|
|
19
|
+
if (null === entry || !isReviewableModel(model) || null === review.publishDisabledReason) return null;
|
|
20
|
+
const isStatusUnknown = "loading" === review.status || "failed" === review.status;
|
|
21
|
+
const showSave = isStatusUnknown && !canSave;
|
|
22
|
+
const isPublishable = "published" !== entry.meta.status && canPublish("cms.contentEntry");
|
|
23
|
+
const showPublish = isPublishable && !canPublishNow;
|
|
24
|
+
if (!showSave && !showPublish) return null;
|
|
25
|
+
return /*#__PURE__*/ react.createElement(ReviewTooltip, {
|
|
26
|
+
presenter: session.presenter
|
|
27
|
+
}, (describedBy)=>/*#__PURE__*/ react.createElement("span", {
|
|
28
|
+
className: "flex items-center gap-sm"
|
|
29
|
+
}, showSave && /*#__PURE__*/ react.createElement(ButtonSecondary, {
|
|
30
|
+
"aria-disabled": true,
|
|
31
|
+
"aria-describedby": describedBy,
|
|
32
|
+
onAction: ignoreAction
|
|
33
|
+
}, "Save"), showPublish && /*#__PURE__*/ react.createElement(ButtonPrimary, {
|
|
34
|
+
"aria-disabled": true,
|
|
35
|
+
"aria-describedby": describedBy,
|
|
36
|
+
onAction: ignoreAction
|
|
37
|
+
}, "Publish")));
|
|
38
|
+
});
|
|
39
|
+
const CmsEntryReviewBlockedActions = ()=>/*#__PURE__*/ react.createElement(InternalContentEntryEditorConfig, null, /*#__PURE__*/ react.createElement(IsModelPublishable, null, /*#__PURE__*/ react.createElement(Actions.ButtonAction, {
|
|
40
|
+
after: "publishOnly",
|
|
41
|
+
name: "workflowBlockedActions",
|
|
42
|
+
element: /*#__PURE__*/ react.createElement(BlockedActions, null)
|
|
43
|
+
})));
|
|
44
|
+
export { CmsEntryReviewBlockedActions };
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=CmsEntryReviewBlockedActions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Components/ContentEntryForm/CmsEntryReviewBlockedActions.js","sources":["../../../src/Components/ContentEntryForm/CmsEntryReviewBlockedActions.tsx"],"sourcesContent":["import React from \"react\";\nimport { createReactiveComponent } from \"@webiny/app-admin\";\nimport { InternalContentEntryEditorConfig } from \"@webiny/app-headless-cms/admin/config/contentEntries/index.js\";\nimport { IsModelPublishable } from \"@webiny/app-headless-cms/admin/components/IsModelPublishable.js\";\nimport { usePermission } from \"@webiny/app-headless-cms/admin/hooks/usePermission.js\";\nimport { useContentEntryFormPresenter } from \"@webiny/app-headless-cms/presentation/contentEntries/form/useContentEntryFormPresenter.js\";\nimport { ReviewTooltip } from \"@webiny/app-workflows/review/presentation/targetReview/components/ReviewTooltip.js\";\nimport { useCmsEntryReview } from \"~/features/editorReview/useCmsEntryReview.js\";\nimport { isReviewableModel } from \"~/utils/isReviewableModel.js\";\nimport { ignoreAction } from \"../ignoreAction.js\";\n\nconst { Actions } = InternalContentEntryEditorConfig;\n\nconst BlockedActions = createReactiveComponent(() => {\n const { ButtonPrimary, ButtonSecondary } = Actions.ButtonAction.useButtons();\n const formPresenter = useContentEntryFormPresenter();\n const session = useCmsEntryReview();\n const { canPublish } = usePermission();\n const { entry, model, canSave, canPublish: canPublishNow } = formPresenter.vm;\n const review = session.presenter.vm;\n\n if (entry === null || !isReviewableModel(model) || review.publishDisabledReason === null) {\n return null;\n }\n\n const isStatusUnknown = review.status === \"loading\" || review.status === \"failed\";\n const showSave = isStatusUnknown && !canSave;\n const isPublishable = entry.meta.status !== \"published\" && canPublish(\"cms.contentEntry\");\n const showPublish = isPublishable && !canPublishNow;\n\n if (!showSave && !showPublish) {\n return null;\n }\n\n return (\n <ReviewTooltip presenter={session.presenter}>\n {describedBy => (\n <span className={\"flex items-center gap-sm\"}>\n {showSave && (\n <ButtonSecondary\n aria-disabled={true}\n aria-describedby={describedBy}\n onAction={ignoreAction}\n >\n {\"Save\"}\n </ButtonSecondary>\n )}\n {showPublish && (\n <ButtonPrimary\n aria-disabled={true}\n aria-describedby={describedBy}\n onAction={ignoreAction}\n >\n {\"Publish\"}\n </ButtonPrimary>\n )}\n </span>\n )}\n </ReviewTooltip>\n );\n});\n\n/*\n * The base Save and Publish buttons render nothing when `canSave` or `canPublish` is false. While\n * the review status is unknown, or a review does not allow publishing yet, this shows them\n * `aria-disabled` and focusable (never removed, R226), with the reason from the shared review rules\n * given by `ReviewTooltip` (its render function hands each button the `aria-describedby`, R241).\n * At most two buttons show (Save only while the status is unknown); the base Save & Publish stays\n * hidden because `canPublish` is false.\n */\nexport const CmsEntryReviewBlockedActions = () => {\n return (\n <InternalContentEntryEditorConfig>\n <IsModelPublishable>\n <Actions.ButtonAction\n after={\"publishOnly\"}\n name={\"workflowBlockedActions\"}\n element={<BlockedActions />}\n />\n </IsModelPublishable>\n </InternalContentEntryEditorConfig>\n );\n};\n"],"names":["Actions","InternalContentEntryEditorConfig","BlockedActions","createReactiveComponent","ButtonPrimary","ButtonSecondary","formPresenter","useContentEntryFormPresenter","session","useCmsEntryReview","canPublish","usePermission","entry","model","canSave","canPublishNow","review","isReviewableModel","isStatusUnknown","showSave","isPublishable","showPublish","ReviewTooltip","describedBy","ignoreAction","CmsEntryReviewBlockedActions","IsModelPublishable"],"mappings":";;;;;;;;;;AAWA,MAAM,EAAEA,SAAAA,OAAO,EAAE,GAAGC;AAEpB,MAAMC,iBAAiBC,wBAAwB;IAC3C,MAAM,EAAEC,aAAa,EAAEC,eAAe,EAAE,GAAGL,QAAQ,YAAY,CAAC,UAAU;IAC1E,MAAMM,gBAAgBC;IACtB,MAAMC,UAAUC;IAChB,MAAM,EAAEC,UAAU,EAAE,GAAGC;IACvB,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAEC,OAAO,EAAE,YAAYC,aAAa,EAAE,GAAGT,cAAc,EAAE;IAC7E,MAAMU,SAASR,QAAQ,SAAS,CAAC,EAAE;IAEnC,IAAII,AAAU,SAAVA,SAAkB,CAACK,kBAAkBJ,UAAUG,AAAiC,SAAjCA,OAAO,qBAAqB,EAC3E,OAAO;IAGX,MAAME,kBAAkBF,AAAkB,cAAlBA,OAAO,MAAM,IAAkBA,AAAkB,aAAlBA,OAAO,MAAM;IACpE,MAAMG,WAAWD,mBAAmB,CAACJ;IACrC,MAAMM,gBAAgBR,AAAsB,gBAAtBA,MAAM,IAAI,CAAC,MAAM,IAAoBF,WAAW;IACtE,MAAMW,cAAcD,iBAAiB,CAACL;IAEtC,IAAI,CAACI,YAAY,CAACE,aACd,OAAO;IAGX,OAAO,WAAP,GACI,oBAACC,eAAaA;QAAC,WAAWd,QAAQ,SAAS;OACtCe,CAAAA,cAAAA,WAAAA,GACG,oBAAC;YAAK,WAAW;WACZJ,YAAY,WAAZA,GACG,oBAACd,iBAAAA;YACG,iBAAe;YACf,oBAAkBkB;YAClB,UAAUC;WAET,SAGRH,eAAe,WAAfA,GACG,oBAACjB,eAAAA;YACG,iBAAe;YACf,oBAAkBmB;YAClB,UAAUC;WAET;AAO7B;AAUO,MAAMC,+BAA+B,IACjC,WAAP,GACI,oBAACxB,kCAAgCA,MAAAA,WAAAA,GAC7B,oBAACyB,oBAAkBA,MAAAA,WAAAA,GACf,oBAAC1B,QAAQ,YAAY;QACjB,OAAO;QACP,MAAM;QACN,uBAAS,oBAACE,gBAAcA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|