@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":"Components/ContentReviews/CmsContentReviews.test.js","sources":["../../../src/Components/ContentReviews/CmsContentReviews.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { beforeEach } from \"vitest\";\nimport { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { vi } from \"vitest\";\nimport { act } from \"@testing-library/react\";\nimport { render } from \"@testing-library/react\";\nimport { screen } from \"@testing-library/react\";\nimport { waitFor } from \"@testing-library/react\";\nimport { Container } from \"@webiny/di\";\nimport { DiContainerProvider } from \"@webiny/app\";\nimport { ListModelsUseCase } from \"@webiny/app-headless-cms/features/model/listModels/abstractions.js\";\nimport { Notifications } from \"@webiny/app-admin/features/notifications/abstractions.js\";\nimport { IdentityContext } from \"@webiny/app-admin/features/security/IdentityContext/abstractions.js\";\nimport { createWorkflowsIdentityContext } from \"@webiny/app-workflows/review/testing/createWorkflowsIdentityContext.js\";\nimport type { IReviewContentAdapter } from \"@webiny/app-workflows/review/content/IReviewContentAdapter.js\";\nimport type { IReviewContentTypesSource } from \"@webiny/app-workflows/review/presentation/reviewList/IReviewContentTypesSource.js\";\nimport type { IReviewRowProvider } from \"@webiny/app-workflows/review/presentation/reviewList/abstractions.js\";\nimport { CmsReviewContentAdapter } from \"~/features/gateway/CmsReviewContentAdapter/abstractions.js\";\nimport { CmsReviewRowProvider } from \"~/features/gateway/CmsReviewRowProvider/abstractions.js\";\nimport { CmsContentReviewsPresenterFeature } from \"~/presentation/contentReviews/feature.js\";\nimport { Routes } from \"~/routes.js\";\nimport { CmsContentReviews } from \"./CmsContentReviews.js\";\n\ninterface RouteStubProps {\n route: { name: string };\n app: string;\n showContentType: boolean;\n contentTypes: IReviewContentTypesSource;\n breadcrumbName: string;\n}\n\ninterface MenuStubProps {\n name: string;\n route: { name: string };\n parent?: string;\n}\n\ninterface WidgetsStubProps {\n prefix: string;\n namespaces: string[];\n viewAllRoute: { name: string };\n ready: boolean;\n}\n\nconst permission = vi.hoisted(() => {\n return { canAccessManageEndpoint: true, canReadContentModels: true };\n});\n\nvi.mock(\"@webiny/app-headless-cms/admin/hooks/usePermission.js\", () => {\n return {\n usePermission: () => {\n return {\n canAccessManageEndpoint: permission.canAccessManageEndpoint,\n canReadContentModels: permission.canReadContentModels\n };\n }\n };\n});\n\nvi.mock(\n \"@webiny/app-workflows/review/mounting/components/ReviewContentReviewsRoute.js\",\n async () => {\n const React = await import(\"react\");\n return {\n ReviewContentReviewsRoute: (props: RouteStubProps) => {\n const vm = props.contentTypes.vm;\n return React.createElement(\"div\", {\n \"data-testid\": \"route\",\n \"data-route\": props.route.name,\n \"data-app\": props.app,\n \"data-namespaces\": vm.namespaces.join(\",\"),\n \"data-show-content-type\": String(props.showContentType),\n \"data-options\": JSON.stringify(vm.options),\n \"data-breadcrumb\": props.breadcrumbName,\n \"data-ready\": String(!vm.loading)\n });\n }\n };\n }\n);\n\nvi.mock(\n \"@webiny/app-workflows/review/mounting/components/ReviewContentReviewsMenu.js\",\n async () => {\n const React = await import(\"react\");\n return {\n ReviewContentReviewsMenu: (props: MenuStubProps) => {\n return React.createElement(\"div\", {\n \"data-testid\": \"menu\",\n \"data-name\": props.name,\n \"data-route\": props.route.name,\n \"data-parent\": props.parent ?? \"\"\n });\n }\n };\n }\n);\n\nvi.mock(\"@webiny/app-workflows/review/mounting/components/ReviewDashboardWidgets.js\", async () => {\n const React = await import(\"react\");\n return {\n ReviewDashboardWidgets: (props: WidgetsStubProps) => {\n return React.createElement(\"div\", {\n \"data-testid\": \"widgets\",\n \"data-prefix\": props.prefix,\n \"data-namespaces\": props.namespaces.join(\",\"),\n \"data-route\": props.viewAllRoute.name,\n \"data-ready\": String(props.ready)\n });\n }\n };\n});\n\nconst createNotifications = (): Notifications.Interface => {\n return {\n notify: vi.fn(),\n success: vi.fn(),\n warning: vi.fn(),\n error: vi.fn()\n } as unknown as Notifications.Interface;\n};\n\nconst createContainer = (\n execute: () => Promise<unknown>,\n notifications: Notifications.Interface = createNotifications()\n): Container => {\n const container = new Container();\n const rowProvider: IReviewRowProvider = { getBinding: () => null };\n const adapter = {} as unknown as IReviewContentAdapter;\n container.registerInstance(CmsReviewContentAdapter, adapter);\n container.registerInstance(CmsReviewRowProvider, rowProvider);\n container.registerInstance(ListModelsUseCase, {\n execute\n } as unknown as ListModelsUseCase.Interface);\n // The admin registers the signed-in identity; the model list waits for one.\n container.registerInstance(IdentityContext, createWorkflowsIdentityContext());\n container.registerInstance(Notifications, notifications);\n CmsContentReviewsPresenterFeature.register(container);\n return container;\n};\n\nconst mount = (container: Container) => {\n render(\n <DiContainerProvider container={container}>\n <CmsContentReviews />\n </DiContainerProvider>\n );\n};\n\ndescribe(\"CmsContentReviews\", () => {\n beforeEach(() => {\n permission.canAccessManageEndpoint = true;\n permission.canReadContentModels = true;\n });\n\n it.each([\n [\"the manage endpoint\", { canAccessManageEndpoint: false, canReadContentModels: true }],\n [\"reading content models\", { canAccessManageEndpoint: true, canReadContentModels: false }]\n ])(\"mounts nothing and loads no models without %s\", async (_name, flags) => {\n Object.assign(permission, flags);\n const execute = vi.fn(async () => []);\n const notifications = createNotifications();\n const container = createContainer(execute, notifications);\n\n mount(container);\n await act(async () => {});\n\n expect(screen.queryByTestId(\"route\")).toBeNull();\n expect(screen.queryByTestId(\"menu\")).toBeNull();\n expect(screen.queryByTestId(\"widgets\")).toBeNull();\n expect(execute).not.toHaveBeenCalled();\n expect(notifications.error).not.toHaveBeenCalled();\n });\n\n it(\"mounts the shared route, menu and widgets for the cms app with the model list, ready once the models are known\", async () => {\n const container = createContainer(async () => [\n { modelId: \"press\", name: \"Press release\", tags: [] },\n { modelId: \"article\", name: \"Article\", tags: [] },\n { modelId: \"hidden\", name: \"Hidden\", tags: [\"$publishing:false\"] }\n ]);\n\n mount(container);\n\n await waitFor(() => {\n expect(screen.getByTestId(\"route\").getAttribute(\"data-ready\")).toBe(\"true\");\n });\n const route = screen.getByTestId(\"route\");\n expect(route.getAttribute(\"data-namespaces\")).toBe(\"cms.article,cms.press\");\n expect(route.getAttribute(\"data-route\")).toBe(Routes.ContentEntries.ContentReviews.name);\n expect(route.getAttribute(\"data-app\")).toBe(\"cms\");\n expect(route.getAttribute(\"data-show-content-type\")).toBe(\"true\");\n expect(route.getAttribute(\"data-breadcrumb\")).toBe(\"cms.content-reviews\");\n expect(JSON.parse(route.getAttribute(\"data-options\") ?? \"null\")).toEqual([\n { label: \"Article\", value: \"article\", app: \"cms\", icon: \"devices_other\" },\n { label: \"Press release\", value: \"press\", app: \"cms\", icon: \"devices_other\" }\n ]);\n\n const menu = screen.getByTestId(\"menu\");\n expect(menu.getAttribute(\"data-name\")).toBe(\"workflows.cms.contentReviews\");\n expect(menu.getAttribute(\"data-parent\")).toBe(\"headlessCMS\");\n expect(menu.getAttribute(\"data-route\")).toBe(Routes.ContentEntries.ContentReviews.name);\n\n const widgets = screen.getByTestId(\"widgets\");\n expect(widgets.getAttribute(\"data-ready\")).toBe(\"true\");\n expect(widgets.getAttribute(\"data-prefix\")).toBe(\"cms\");\n expect(widgets.getAttribute(\"data-namespaces\")).toBe(\"cms.article,cms.press\");\n expect(widgets.getAttribute(\"data-route\")).toBe(Routes.ContentEntries.ContentReviews.name);\n });\n\n it(\"keeps the list and the widgets from starting until the model list is known\", async () => {\n let release: (models: unknown[]) => void = () => undefined;\n const pending = new Promise<unknown[]>(resolve => {\n release = resolve;\n });\n const container = createContainer(() => pending);\n\n mount(container);\n\n expect(screen.getByTestId(\"route\").getAttribute(\"data-ready\")).toBe(\"false\");\n expect(screen.getByTestId(\"widgets\").getAttribute(\"data-ready\")).toBe(\"false\");\n\n release([{ modelId: \"article\", name: \"Article\", tags: [] }]);\n\n await waitFor(() => {\n expect(screen.getByTestId(\"route\").getAttribute(\"data-ready\")).toBe(\"true\");\n });\n expect(screen.getByTestId(\"route\").getAttribute(\"data-namespaces\")).toBe(\"cms.article\");\n });\n\n it(\"becomes ready with no namespaces when the model list fails\", async () => {\n const consoleError = vi.spyOn(console, \"error\").mockImplementation(() => undefined);\n const container = createContainer(() => Promise.reject(new Error(\"network\")));\n\n mount(container);\n\n await waitFor(() => {\n expect(screen.getByTestId(\"route\").getAttribute(\"data-ready\")).toBe(\"true\");\n });\n expect(screen.getByTestId(\"route\").getAttribute(\"data-namespaces\")).toBe(\"\");\n expect(\n JSON.parse(screen.getByTestId(\"route\").getAttribute(\"data-options\") ?? \"null\")\n ).toEqual([]);\n consoleError.mockRestore();\n });\n});\n"],"names":["permission","vi","React","props","vm","String","JSON","createNotifications","createContainer","execute","notifications","container","Container","rowProvider","adapter","CmsReviewContentAdapter","CmsReviewRowProvider","ListModelsUseCase","IdentityContext","createWorkflowsIdentityContext","Notifications","CmsContentReviewsPresenterFeature","mount","render","DiContainerProvider","CmsContentReviews","describe","beforeEach","it","_name","flags","Object","act","expect","screen","waitFor","route","Routes","menu","widgets","release","undefined","pending","Promise","resolve","consoleError","console","Error"],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import react, { useEffect } from "react";
|
|
2
|
+
import { createReactiveComponent } from "@webiny/app-admin";
|
|
3
|
+
import { useFeature } from "@webiny/app";
|
|
4
|
+
import { ReviewContentReviewsMenu } from "@webiny/app-workflows/review/mounting/components/ReviewContentReviewsMenu.js";
|
|
5
|
+
import { ReviewContentReviewsRoute } from "@webiny/app-workflows/review/mounting/components/ReviewContentReviewsRoute.js";
|
|
6
|
+
import { ReviewDashboardWidgets } from "@webiny/app-workflows/review/mounting/components/ReviewDashboardWidgets.js";
|
|
7
|
+
import { CmsReviewFeature } from "../../features/gateway/feature.js";
|
|
8
|
+
import { CmsContentReviewsPresenterFeature } from "../../presentation/contentReviews/feature.js";
|
|
9
|
+
import { Routes } from "../../routes.js";
|
|
10
|
+
const CmsContentReviewsMount = createReactiveComponent(()=>{
|
|
11
|
+
const { presenter } = useFeature(CmsContentReviewsPresenterFeature);
|
|
12
|
+
const { rowProvider } = useFeature(CmsReviewFeature);
|
|
13
|
+
useEffect(()=>{
|
|
14
|
+
presenter.init();
|
|
15
|
+
return ()=>{
|
|
16
|
+
presenter.dispose();
|
|
17
|
+
};
|
|
18
|
+
}, [
|
|
19
|
+
presenter
|
|
20
|
+
]);
|
|
21
|
+
const vm = presenter.vm;
|
|
22
|
+
const ready = !vm.loading;
|
|
23
|
+
return /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(ReviewContentReviewsRoute, {
|
|
24
|
+
route: Routes.ContentEntries.ContentReviews,
|
|
25
|
+
app: "cms",
|
|
26
|
+
rowProvider: rowProvider,
|
|
27
|
+
showContentType: true,
|
|
28
|
+
contentTypes: presenter,
|
|
29
|
+
breadcrumbName: "cms.content-reviews"
|
|
30
|
+
}), /*#__PURE__*/ react.createElement(ReviewContentReviewsMenu, {
|
|
31
|
+
name: "workflows.cms.contentReviews",
|
|
32
|
+
route: Routes.ContentEntries.ContentReviews,
|
|
33
|
+
parent: "headlessCMS"
|
|
34
|
+
}), /*#__PURE__*/ react.createElement(ReviewDashboardWidgets, {
|
|
35
|
+
prefix: "cms",
|
|
36
|
+
namespaces: vm.namespaces,
|
|
37
|
+
rowProvider: rowProvider,
|
|
38
|
+
viewAllRoute: Routes.ContentEntries.ContentReviews,
|
|
39
|
+
ready: ready
|
|
40
|
+
}));
|
|
41
|
+
});
|
|
42
|
+
export { CmsContentReviewsMount };
|
|
43
|
+
|
|
44
|
+
//# sourceMappingURL=CmsContentReviewsMount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Components/ContentReviews/CmsContentReviewsMount.js","sources":["../../../src/Components/ContentReviews/CmsContentReviewsMount.tsx"],"sourcesContent":["import React, { useEffect } from \"react\";\nimport { createReactiveComponent } from \"@webiny/app-admin\";\nimport { useFeature } from \"@webiny/app\";\nimport { ReviewContentReviewsMenu } from \"@webiny/app-workflows/review/mounting/components/ReviewContentReviewsMenu.js\";\nimport { ReviewContentReviewsRoute } from \"@webiny/app-workflows/review/mounting/components/ReviewContentReviewsRoute.js\";\nimport { ReviewDashboardWidgets } from \"@webiny/app-workflows/review/mounting/components/ReviewDashboardWidgets.js\";\nimport { CmsReviewFeature } from \"~/features/gateway/feature.js\";\nimport { CmsContentReviewsPresenterFeature } from \"~/presentation/contentReviews/feature.js\";\nimport { Routes } from \"~/routes.js\";\n\n/*\n * Mounts the shared Content Reviews route, menu item and dashboard widgets for the `cms` app.\n * Only the content type list is CMS knowledge (D113, A80); the page reads it live from the\n * presenter and the widgets wait for it (`ready`), so the list starts once with the real namespaces.\n */\nexport const CmsContentReviewsMount = createReactiveComponent(() => {\n const { presenter } = useFeature(CmsContentReviewsPresenterFeature);\n const { rowProvider } = useFeature(CmsReviewFeature);\n\n useEffect(() => {\n void presenter.init();\n return () => {\n presenter.dispose();\n };\n }, [presenter]);\n\n const vm = presenter.vm;\n const ready = !vm.loading;\n\n return (\n <>\n <ReviewContentReviewsRoute\n route={Routes.ContentEntries.ContentReviews}\n app=\"cms\"\n rowProvider={rowProvider}\n showContentType={true}\n contentTypes={presenter}\n breadcrumbName=\"cms.content-reviews\"\n />\n <ReviewContentReviewsMenu\n name=\"workflows.cms.contentReviews\"\n route={Routes.ContentEntries.ContentReviews}\n parent=\"headlessCMS\"\n />\n <ReviewDashboardWidgets\n prefix=\"cms\"\n namespaces={vm.namespaces}\n rowProvider={rowProvider}\n viewAllRoute={Routes.ContentEntries.ContentReviews}\n ready={ready}\n />\n </>\n );\n});\n"],"names":["CmsContentReviewsMount","createReactiveComponent","presenter","useFeature","CmsContentReviewsPresenterFeature","rowProvider","CmsReviewFeature","useEffect","vm","ready","ReviewContentReviewsRoute","Routes","ReviewContentReviewsMenu","ReviewDashboardWidgets"],"mappings":";;;;;;;;;AAeO,MAAMA,yBAAyBC,wBAAwB;IAC1D,MAAM,EAAEC,SAAS,EAAE,GAAGC,WAAWC;IACjC,MAAM,EAAEC,WAAW,EAAE,GAAGF,WAAWG;IAEnCC,UAAU;QACDL,UAAU,IAAI;QACnB,OAAO;YACHA,UAAU,OAAO;QACrB;IACJ,GAAG;QAACA;KAAU;IAEd,MAAMM,KAAKN,UAAU,EAAE;IACvB,MAAMO,QAAQ,CAACD,GAAG,OAAO;IAEzB,OAAO,WAAP,GACI,wDACI,oBAACE,2BAAyBA;QACtB,OAAOC,OAAO,cAAc,CAAC,cAAc;QAC3C,KAAI;QACJ,aAAaN;QACb,iBAAiB;QACjB,cAAcH;QACd,gBAAe;sBAEnB,oBAACU,0BAAwBA;QACrB,MAAK;QACL,OAAOD,OAAO,cAAc,CAAC,cAAc;QAC3C,QAAO;sBAEX,oBAACE,wBAAsBA;QACnB,QAAO;QACP,YAAYL,GAAG,UAAU;QACzB,aAAaH;QACb,cAAcM,OAAO,cAAc,CAAC,cAAc;QAClD,OAAOF;;AAIvB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { ReactComponent } from "@webiny/icons/flowchart.svg";
|
|
3
|
+
import { ContentEntryListConfig } from "@webiny/app-headless-cms/admin/config/contentEntries/index.js";
|
|
4
|
+
import { IsModelPublishable } from "@webiny/app-headless-cms/exports/admin/cms.js";
|
|
5
|
+
import { ReviewContentReviewsSidebarItem } from "@webiny/app-workflows/review/mounting/components/ReviewContentReviewsSidebarItem.js";
|
|
6
|
+
import { Routes } from "../../routes.js";
|
|
7
|
+
const { Browser: Browser } = ContentEntryListConfig;
|
|
8
|
+
const ContentReviewsSidebarLink = ()=>/*#__PURE__*/ react.createElement(IsModelPublishable, null, /*#__PURE__*/ react.createElement("div", {
|
|
9
|
+
className: "list-none"
|
|
10
|
+
}, /*#__PURE__*/ react.createElement(ReviewContentReviewsSidebarItem, {
|
|
11
|
+
route: Routes.ContentEntries.ContentReviews,
|
|
12
|
+
icon: /*#__PURE__*/ react.createElement(ReactComponent, null)
|
|
13
|
+
})));
|
|
14
|
+
const CmsContentReviewsSidebarItem = ()=>/*#__PURE__*/ react.createElement(ContentEntryListConfig, null, /*#__PURE__*/ react.createElement(Browser.Sidebar.Footer, {
|
|
15
|
+
name: "content-reviews",
|
|
16
|
+
element: /*#__PURE__*/ react.createElement(ContentReviewsSidebarLink, null)
|
|
17
|
+
}));
|
|
18
|
+
export { CmsContentReviewsSidebarItem };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=CmsContentReviewsSidebarItem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Components/ContentReviews/CmsContentReviewsSidebarItem.js","sources":["../../../src/Components/ContentReviews/CmsContentReviewsSidebarItem.tsx"],"sourcesContent":["import React from \"react\";\nimport { ReactComponent as ContentReviewsIcon } from \"@webiny/icons/flowchart.svg\";\nimport { ContentEntryListConfig } from \"@webiny/app-headless-cms/admin/config/contentEntries/index.js\";\nimport { IsModelPublishable } from \"@webiny/app-headless-cms/exports/admin/cms.js\";\nimport { ReviewContentReviewsSidebarItem } from \"@webiny/app-workflows/review/mounting/components/ReviewContentReviewsSidebarItem.js\";\nimport { Routes } from \"~/routes.js\";\n\nconst { Browser } = ContentEntryListConfig;\n\nconst ContentReviewsSidebarLink = () => {\n return (\n <IsModelPublishable>\n <div className={\"list-none\"}>\n <ReviewContentReviewsSidebarItem\n route={Routes.ContentEntries.ContentReviews}\n icon={<ContentReviewsIcon />}\n />\n </div>\n </IsModelPublishable>\n );\n};\n\n// The \"Content Reviews\" item of the content entries sidebar; it opens the route.\nexport const CmsContentReviewsSidebarItem = () => {\n return (\n <ContentEntryListConfig>\n <Browser.Sidebar.Footer\n name={\"content-reviews\"}\n element={<ContentReviewsSidebarLink />}\n />\n </ContentEntryListConfig>\n );\n};\n"],"names":["Browser","ContentEntryListConfig","ContentReviewsSidebarLink","IsModelPublishable","ReviewContentReviewsSidebarItem","Routes","ContentReviewsIcon","CmsContentReviewsSidebarItem"],"mappings":";;;;;;AAOA,MAAM,EAAEA,SAAAA,OAAO,EAAE,GAAGC;AAEpB,MAAMC,4BAA4B,IACvB,WAAP,GACI,oBAACC,oBAAkBA,MAAAA,WAAAA,GACf,oBAAC;QAAI,WAAW;qBACZ,oBAACC,iCAA+BA;QAC5B,OAAOC,OAAO,cAAc,CAAC,cAAc;QAC3C,oBAAM,oBAACC,gBAAkBA;;AAQtC,MAAMC,+BAA+B,IACjC,WAAP,GACI,oBAACN,wBAAsBA,MAAAA,WAAAA,GACnB,oBAACD,QAAQ,OAAO,CAAC,MAAM;QACnB,MAAM;QACN,uBAAS,oBAACE,2BAAyBA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
3
|
+
import { fireEvent, render, screen } from "@testing-library/react";
|
|
4
|
+
import { Routes } from "../../routes.js";
|
|
5
|
+
import { CmsContentReviewsSidebarItem } from "./CmsContentReviewsSidebarItem.js";
|
|
6
|
+
const goToRoute = vi.hoisted(()=>vi.fn());
|
|
7
|
+
const model = vi.hoisted(()=>({
|
|
8
|
+
publishable: true
|
|
9
|
+
}));
|
|
10
|
+
vi.mock("@webiny/app-admin", async (importOriginal)=>{
|
|
11
|
+
const actual = await importOriginal();
|
|
12
|
+
return {
|
|
13
|
+
...actual,
|
|
14
|
+
useRouter: ()=>({
|
|
15
|
+
goToRoute: goToRoute
|
|
16
|
+
})
|
|
17
|
+
};
|
|
18
|
+
});
|
|
19
|
+
vi.mock("@webiny/app-headless-cms/admin/config/contentEntries/index.js", async ()=>{
|
|
20
|
+
const React = await import("react");
|
|
21
|
+
const Footer = (props)=>React.createElement("div", {
|
|
22
|
+
"data-testid": "footer",
|
|
23
|
+
"data-name": props.name
|
|
24
|
+
}, props.element);
|
|
25
|
+
const Config = ({ children })=>React.createElement(React.Fragment, null, children);
|
|
26
|
+
return {
|
|
27
|
+
ContentEntryListConfig: Object.assign(Config, {
|
|
28
|
+
Browser: {
|
|
29
|
+
Sidebar: {
|
|
30
|
+
Footer
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
})
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
vi.mock("@webiny/app-headless-cms/exports/admin/cms.js", async ()=>{
|
|
37
|
+
const React = await import("react");
|
|
38
|
+
return {
|
|
39
|
+
IsModelPublishable: ({ children })=>model.publishable ? React.createElement(React.Fragment, null, children) : null
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
vi.mock("@webiny/admin-ui", async (importOriginal)=>{
|
|
43
|
+
const actual = await importOriginal();
|
|
44
|
+
const React = await import("react");
|
|
45
|
+
const Item = (props)=>React.createElement("button", {
|
|
46
|
+
onClick: props.onClick
|
|
47
|
+
}, props.text);
|
|
48
|
+
const ItemIcon = ()=>React.createElement("span");
|
|
49
|
+
return {
|
|
50
|
+
...actual,
|
|
51
|
+
Sidebar: {
|
|
52
|
+
...actual.Sidebar,
|
|
53
|
+
Item: Object.assign(Item, {
|
|
54
|
+
Icon: ItemIcon
|
|
55
|
+
})
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
describe("CmsContentReviewsSidebarItem", ()=>{
|
|
60
|
+
beforeEach(()=>{
|
|
61
|
+
model.publishable = true;
|
|
62
|
+
goToRoute.mockReset();
|
|
63
|
+
});
|
|
64
|
+
it("adds a Content Reviews item to the sidebar footer that opens the route", ()=>{
|
|
65
|
+
render(/*#__PURE__*/ react.createElement(CmsContentReviewsSidebarItem, null));
|
|
66
|
+
expect(screen.getByTestId("footer").getAttribute("data-name")).toBe("content-reviews");
|
|
67
|
+
fireEvent.click(screen.getByRole("button", {
|
|
68
|
+
name: "Content Reviews"
|
|
69
|
+
}));
|
|
70
|
+
expect(goToRoute).toHaveBeenCalledTimes(1);
|
|
71
|
+
expect(goToRoute).toHaveBeenCalledWith(Routes.ContentEntries.ContentReviews);
|
|
72
|
+
});
|
|
73
|
+
it("adds no item for a model that cannot publish", ()=>{
|
|
74
|
+
model.publishable = false;
|
|
75
|
+
render(/*#__PURE__*/ react.createElement(CmsContentReviewsSidebarItem, null));
|
|
76
|
+
expect(screen.getByTestId("footer")).toBeTruthy();
|
|
77
|
+
expect(screen.queryByRole("button", {
|
|
78
|
+
name: "Content Reviews"
|
|
79
|
+
})).toBeNull();
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
//# sourceMappingURL=CmsContentReviewsSidebarItem.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Components/ContentReviews/CmsContentReviewsSidebarItem.test.js","sources":["../../../src/Components/ContentReviews/CmsContentReviewsSidebarItem.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { beforeEach } from \"vitest\";\nimport { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { vi } from \"vitest\";\nimport { fireEvent } from \"@testing-library/react\";\nimport { render } from \"@testing-library/react\";\nimport { screen } from \"@testing-library/react\";\nimport { Routes } from \"~/routes.js\";\nimport { CmsContentReviewsSidebarItem } from \"./CmsContentReviewsSidebarItem.js\";\n\ninterface FooterStubProps {\n name: string;\n element: React.ReactElement;\n}\n\ninterface ChildrenStubProps {\n children: React.ReactNode;\n}\n\ninterface SidebarItemStubProps {\n text: string;\n onClick: () => void;\n}\n\nconst goToRoute = vi.hoisted(() => vi.fn());\n\nconst model = vi.hoisted(() => {\n return { publishable: true };\n});\n\nvi.mock(\"@webiny/app-admin\", async importOriginal => {\n const actual = await importOriginal<typeof import(\"@webiny/app-admin\")>();\n return {\n ...actual,\n useRouter: () => {\n return { goToRoute };\n }\n };\n});\n\nvi.mock(\"@webiny/app-headless-cms/admin/config/contentEntries/index.js\", async () => {\n const React = await import(\"react\");\n const Footer = (props: FooterStubProps) => {\n return React.createElement(\n \"div\",\n { \"data-testid\": \"footer\", \"data-name\": props.name },\n props.element\n );\n };\n const Config = ({ children }: ChildrenStubProps) => {\n return React.createElement(React.Fragment, null, children);\n };\n return { ContentEntryListConfig: Object.assign(Config, { Browser: { Sidebar: { Footer } } }) };\n});\n\nvi.mock(\"@webiny/app-headless-cms/exports/admin/cms.js\", async () => {\n const React = await import(\"react\");\n return {\n IsModelPublishable: ({ children }: ChildrenStubProps) => {\n return model.publishable ? React.createElement(React.Fragment, null, children) : null;\n }\n };\n});\n\nvi.mock(\"@webiny/admin-ui\", async importOriginal => {\n const actual = await importOriginal<typeof import(\"@webiny/admin-ui\")>();\n const React = await import(\"react\");\n const Item = (props: SidebarItemStubProps) => {\n return React.createElement(\"button\", { onClick: props.onClick }, props.text);\n };\n const ItemIcon = () => React.createElement(\"span\");\n return {\n ...actual,\n Sidebar: { ...actual.Sidebar, Item: Object.assign(Item, { Icon: ItemIcon }) }\n };\n});\n\ndescribe(\"CmsContentReviewsSidebarItem\", () => {\n beforeEach(() => {\n model.publishable = true;\n goToRoute.mockReset();\n });\n\n it(\"adds a Content Reviews item to the sidebar footer that opens the route\", () => {\n render(<CmsContentReviewsSidebarItem />);\n\n expect(screen.getByTestId(\"footer\").getAttribute(\"data-name\")).toBe(\"content-reviews\");\n fireEvent.click(screen.getByRole(\"button\", { name: \"Content Reviews\" }));\n\n expect(goToRoute).toHaveBeenCalledTimes(1);\n expect(goToRoute).toHaveBeenCalledWith(Routes.ContentEntries.ContentReviews);\n });\n\n it(\"adds no item for a model that cannot publish\", () => {\n model.publishable = false;\n\n render(<CmsContentReviewsSidebarItem />);\n\n expect(screen.getByTestId(\"footer\")).toBeTruthy();\n expect(screen.queryByRole(\"button\", { name: \"Content Reviews\" })).toBeNull();\n });\n});\n"],"names":["goToRoute","vi","model","importOriginal","actual","React","Footer","props","Config","children","Object","Item","ItemIcon","describe","beforeEach","it","render","CmsContentReviewsSidebarItem","expect","screen","fireEvent","Routes"],"mappings":";;;;;AA0BA,MAAMA,YAAYC,GAAG,OAAO,CAAC,IAAMA,GAAG,EAAE;AAExC,MAAMC,QAAQD,GAAG,OAAO,CAAC,IACd;QAAE,aAAa;IAAK;AAG/BA,GAAG,IAAI,CAAC,qBAAqB,OAAME;IAC/B,MAAMC,SAAS,MAAMD;IACrB,OAAO;QACH,GAAGC,MAAM;QACT,WAAW,IACA;gBAAEJ,WAAAA;YAAU;IAE3B;AACJ;AAEAC,GAAG,IAAI,CAAC,iEAAiE;IACrE,MAAMI,QAAQ,MAAM,MAAM,CAAC;IAC3B,MAAMC,SAAS,CAACC,QACLF,MAAM,aAAa,CACtB,OACA;YAAE,eAAe;YAAU,aAAaE,MAAM,IAAI;QAAC,GACnDA,MAAM,OAAO;IAGrB,MAAMC,SAAS,CAAC,EAAEC,QAAQ,EAAqB,GACpCJ,MAAM,aAAa,CAACA,MAAM,QAAQ,EAAE,MAAMI;IAErD,OAAO;QAAE,wBAAwBC,OAAO,MAAM,CAACF,QAAQ;YAAE,SAAS;gBAAE,SAAS;oBAAEF;gBAAO;YAAE;QAAE;IAAG;AACjG;AAEAL,GAAG,IAAI,CAAC,iDAAiD;IACrD,MAAMI,QAAQ,MAAM,MAAM,CAAC;IAC3B,OAAO;QACH,oBAAoB,CAAC,EAAEI,QAAQ,EAAqB,GACzCP,MAAM,WAAW,GAAGG,MAAM,aAAa,CAACA,MAAM,QAAQ,EAAE,MAAMI,YAAY;IAEzF;AACJ;AAEAR,GAAG,IAAI,CAAC,oBAAoB,OAAME;IAC9B,MAAMC,SAAS,MAAMD;IACrB,MAAME,QAAQ,MAAM,MAAM,CAAC;IAC3B,MAAMM,OAAO,CAACJ,QACHF,MAAM,aAAa,CAAC,UAAU;YAAE,SAASE,MAAM,OAAO;QAAC,GAAGA,MAAM,IAAI;IAE/E,MAAMK,WAAW,IAAMP,MAAM,aAAa,CAAC;IAC3C,OAAO;QACH,GAAGD,MAAM;QACT,SAAS;YAAE,GAAGA,OAAO,OAAO;YAAE,MAAMM,OAAO,MAAM,CAACC,MAAM;gBAAE,MAAMC;YAAS;QAAG;IAChF;AACJ;AAEAC,SAAS,gCAAgC;IACrCC,WAAW;QACPZ,MAAM,WAAW,GAAG;QACpBF,UAAU,SAAS;IACvB;IAEAe,GAAG,0EAA0E;QACzEC,OAAO,WAADA,GAAC,oBAACC,8BAA4BA;QAEpCC,OAAOC,OAAO,WAAW,CAAC,UAAU,YAAY,CAAC,cAAc,IAAI,CAAC;QACpEC,UAAU,KAAK,CAACD,OAAO,SAAS,CAAC,UAAU;YAAE,MAAM;QAAkB;QAErED,OAAOlB,WAAW,qBAAqB,CAAC;QACxCkB,OAAOlB,WAAW,oBAAoB,CAACqB,OAAO,cAAc,CAAC,cAAc;IAC/E;IAEAN,GAAG,gDAAgD;QAC/Cb,MAAM,WAAW,GAAG;QAEpBc,OAAO,WAADA,GAAC,oBAACC,8BAA4BA;QAEpCC,OAAOC,OAAO,WAAW,CAAC,WAAW,UAAU;QAC/CD,OAAOC,OAAO,WAAW,CAAC,UAAU;YAAE,MAAM;QAAkB,IAAI,QAAQ;IAC9E;AACJ"}
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { Alert, Heading, Link, Text } from "@webiny/admin-ui";
|
|
3
|
+
import { useRouter } from "@webiny/app-admin";
|
|
4
|
+
import { FullyDeleteModelError } from "@webiny/app-headless-cms/presentation/contentModels/components/fullDelete/dialog/FullyDeleteModelError.js";
|
|
5
|
+
import { useWorkflowsPermission } from "@webiny/app-workflows/presentation/permissions/useWorkflowsPermission.js";
|
|
6
|
+
import { ReactComponent } from "@webiny/icons/account_tree.svg";
|
|
7
|
+
import { Routes } from "../../routes.js";
|
|
8
|
+
import { getModelDeleteWorkflowCopy } from "./getModelDeleteWorkflowCopy.js";
|
|
9
|
+
const BOUND_TO_WORKFLOW = "Workflows/Model/BoundToWorkflow";
|
|
10
|
+
const ModelDeleteWorkflowError = FullyDeleteModelError.createDecorator((Original)=>function(props) {
|
|
11
|
+
const router = useRouter();
|
|
12
|
+
const permission = useWorkflowsPermission();
|
|
13
|
+
const data = props.error.data;
|
|
14
|
+
const workflow = data && data.workflows ? data.workflows[0] : void 0;
|
|
15
|
+
if (props.error.code !== BOUND_TO_WORKFLOW || !workflow) return /*#__PURE__*/ react.createElement(Original, props);
|
|
16
|
+
const copy = getModelDeleteWorkflowCopy({
|
|
17
|
+
modelName: props.model.name,
|
|
18
|
+
workflowName: workflow.name,
|
|
19
|
+
canManage: permission.editor
|
|
20
|
+
});
|
|
21
|
+
return /*#__PURE__*/ react.createElement(Alert, {
|
|
22
|
+
type: "danger",
|
|
23
|
+
icon: /*#__PURE__*/ react.createElement(ReactComponent, null)
|
|
24
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
25
|
+
className: "flex flex-col gap-xs"
|
|
26
|
+
}, /*#__PURE__*/ react.createElement(Heading, {
|
|
27
|
+
level: 6
|
|
28
|
+
}, copy.title), /*#__PURE__*/ react.createElement(Text, null, copy.body), copy.showLink && /*#__PURE__*/ react.createElement(Link, {
|
|
29
|
+
to: router.getLink(Routes.ContentModels.Workflows)
|
|
30
|
+
}, "Open workflow →")));
|
|
31
|
+
});
|
|
32
|
+
export { ModelDeleteWorkflowError };
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=ModelDeleteWorkflowError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Components/ModelDelete/ModelDeleteWorkflowError.js","sources":["../../../src/Components/ModelDelete/ModelDeleteWorkflowError.tsx"],"sourcesContent":["import React from \"react\";\nimport { Alert } from \"@webiny/admin-ui\";\nimport { Link } from \"@webiny/admin-ui\";\nimport { Heading } from \"@webiny/admin-ui\";\nimport { Text } from \"@webiny/admin-ui\";\nimport { useRouter } from \"@webiny/app-admin\";\nimport { FullyDeleteModelError } from \"@webiny/app-headless-cms/presentation/contentModels/components/fullDelete/dialog/FullyDeleteModelError.js\";\nimport { useWorkflowsPermission } from \"@webiny/app-workflows/presentation/permissions/useWorkflowsPermission.js\";\nimport { ReactComponent as AccountTreeIcon } from \"@webiny/icons/account_tree.svg\";\nimport { Routes } from \"~/routes.js\";\nimport { getModelDeleteWorkflowCopy } from \"./getModelDeleteWorkflowCopy.js\";\nimport type { ModelBoundToWorkflowErrorData } from \"./ModelBoundToWorkflowErrorData.js\";\n\nconst BOUND_TO_WORKFLOW = \"Workflows/Model/BoundToWorkflow\";\n\n/*\n * A model delete the server refused because a workflow uses the model (UI-18, QBZ-38): names the\n * workflow and links to it for someone who may manage workflows. Any other error stays as it was.\n */\nexport const ModelDeleteWorkflowError = FullyDeleteModelError.createDecorator(Original => {\n return function ModelDeleteWorkflowErrorDecorator(props) {\n const router = useRouter();\n const permission = useWorkflowsPermission();\n const data = props.error.data as ModelBoundToWorkflowErrorData | null;\n const workflow = data && data.workflows ? data.workflows[0] : undefined;\n\n if (props.error.code !== BOUND_TO_WORKFLOW || !workflow) {\n return <Original {...props} />;\n }\n\n const copy = getModelDeleteWorkflowCopy({\n modelName: props.model.name,\n workflowName: workflow.name,\n canManage: permission.editor\n });\n\n return (\n <Alert type={\"danger\"} icon={<AccountTreeIcon />}>\n <div className={\"flex flex-col gap-xs\"}>\n <Heading level={6}>{copy.title}</Heading>\n <Text>{copy.body}</Text>\n {copy.showLink && (\n <Link to={router.getLink(Routes.ContentModels.Workflows)}>\n {\"Open workflow →\"}\n </Link>\n )}\n </div>\n </Alert>\n );\n };\n});\n"],"names":["BOUND_TO_WORKFLOW","ModelDeleteWorkflowError","FullyDeleteModelError","Original","props","router","useRouter","permission","useWorkflowsPermission","data","workflow","undefined","copy","getModelDeleteWorkflowCopy","Alert","AccountTreeIcon","Heading","Text","Link","Routes"],"mappings":";;;;;;;;AAaA,MAAMA,oBAAoB;AAMnB,MAAMC,2BAA2BC,sBAAsB,eAAe,CAACC,CAAAA,WACnE,SAA2CC,KAAK;QACnD,MAAMC,SAASC;QACf,MAAMC,aAAaC;QACnB,MAAMC,OAAOL,MAAM,KAAK,CAAC,IAAI;QAC7B,MAAMM,WAAWD,QAAQA,KAAK,SAAS,GAAGA,KAAK,SAAS,CAAC,EAAE,GAAGE;QAE9D,IAAIP,MAAM,KAAK,CAAC,IAAI,KAAKJ,qBAAqB,CAACU,UAC3C,OAAO,WAAP,GAAO,oBAACP,UAAaC;QAGzB,MAAMQ,OAAOC,2BAA2B;YACpC,WAAWT,MAAM,KAAK,CAAC,IAAI;YAC3B,cAAcM,SAAS,IAAI;YAC3B,WAAWH,WAAW,MAAM;QAChC;QAEA,OAAO,WAAP,GACI,oBAACO,OAAKA;YAAC,MAAM;YAAU,oBAAM,oBAACC,gBAAeA;yBACzC,oBAAC;YAAI,WAAW;yBACZ,oBAACC,SAAOA;YAAC,OAAO;WAAIJ,KAAK,KAAK,iBAC9B,oBAACK,MAAIA,MAAEL,KAAK,IAAI,GACfA,KAAK,QAAQ,IAAI,WAAJ,GACV,oBAACM,MAAIA;YAAC,IAAIb,OAAO,OAAO,CAACc,OAAO,aAAa,CAAC,SAAS;WAClD;IAMzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { describe, expect, it, vi } from "vitest";
|
|
3
|
+
import { render, screen } from "@testing-library/react";
|
|
4
|
+
import { AdminUiProvider } from "@webiny/admin-ui";
|
|
5
|
+
import { CompositionProvider } from "@webiny/react-composition";
|
|
6
|
+
import { FullyDeleteModelError } from "@webiny/app-headless-cms/presentation/contentModels/components/fullDelete/dialog/FullyDeleteModelError.js";
|
|
7
|
+
import { ModelDeleteWorkflowError } from "./ModelDeleteWorkflowError.js";
|
|
8
|
+
const hoisted = vi.hoisted(()=>({
|
|
9
|
+
editor: true
|
|
10
|
+
}));
|
|
11
|
+
vi.mock("@webiny/app-workflows/presentation/permissions/useWorkflowsPermission.js", ()=>({
|
|
12
|
+
useWorkflowsPermission: ()=>({
|
|
13
|
+
editor: hoisted.editor
|
|
14
|
+
})
|
|
15
|
+
}));
|
|
16
|
+
vi.mock("@webiny/app-admin", async (importOriginal)=>{
|
|
17
|
+
const actual = await importOriginal();
|
|
18
|
+
return {
|
|
19
|
+
...actual,
|
|
20
|
+
useRouter: ()=>({
|
|
21
|
+
getLink: ()=>"/cms/workflows"
|
|
22
|
+
})
|
|
23
|
+
};
|
|
24
|
+
});
|
|
25
|
+
const model = {
|
|
26
|
+
modelId: "article",
|
|
27
|
+
name: "Article"
|
|
28
|
+
};
|
|
29
|
+
const BOUND = {
|
|
30
|
+
message: 'The model "article" is used by the workflow "Article review".',
|
|
31
|
+
code: "Workflows/Model/BoundToWorkflow",
|
|
32
|
+
data: {
|
|
33
|
+
modelId: "article",
|
|
34
|
+
workflows: [
|
|
35
|
+
{
|
|
36
|
+
id: "wf1",
|
|
37
|
+
name: "Article review"
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
const renderError = (error)=>render(/*#__PURE__*/ react.createElement(AdminUiProvider, null, /*#__PURE__*/ react.createElement(CompositionProvider, null, /*#__PURE__*/ react.createElement(ModelDeleteWorkflowError, null), /*#__PURE__*/ react.createElement(FullyDeleteModelError, {
|
|
43
|
+
model: model,
|
|
44
|
+
error: error
|
|
45
|
+
}))));
|
|
46
|
+
describe("ModelDeleteWorkflowError (UI-18, QBZ-38)", ()=>{
|
|
47
|
+
it("explains a delete blocked by a workflow and links to it", async ()=>{
|
|
48
|
+
hoisted.editor = true;
|
|
49
|
+
renderError(BOUND);
|
|
50
|
+
expect(await screen.findByText("Article has a workflow")).toBeTruthy();
|
|
51
|
+
expect(screen.getByText("Delete the workflow “Article review” first, then delete the model.")).toBeTruthy();
|
|
52
|
+
expect(screen.getByText("Open workflow →").closest("a")?.getAttribute("href")).toBe("/cms/workflows");
|
|
53
|
+
expect(screen.queryByText(BOUND.message)).toBeNull();
|
|
54
|
+
});
|
|
55
|
+
it("hides the link without Manage workflows", async ()=>{
|
|
56
|
+
hoisted.editor = false;
|
|
57
|
+
renderError(BOUND);
|
|
58
|
+
expect(await screen.findByText("Ask someone with Manage workflows to delete the workflow “Article review” first, then delete the model.")).toBeTruthy();
|
|
59
|
+
expect(screen.queryByText("Open workflow →")).toBeNull();
|
|
60
|
+
});
|
|
61
|
+
it("leaves every other delete error as it was", async ()=>{
|
|
62
|
+
hoisted.editor = true;
|
|
63
|
+
renderError({
|
|
64
|
+
message: "Network error.",
|
|
65
|
+
code: "FULLY_DELETE_MODEL_ERROR",
|
|
66
|
+
data: {}
|
|
67
|
+
});
|
|
68
|
+
expect(await screen.findByText("Network error.")).toBeTruthy();
|
|
69
|
+
expect(screen.queryByText(/has a workflow/)).toBeNull();
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
//# sourceMappingURL=ModelDeleteWorkflowError.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Components/ModelDelete/ModelDeleteWorkflowError.test.js","sources":["../../../src/Components/ModelDelete/ModelDeleteWorkflowError.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 { AdminUiProvider } from \"@webiny/admin-ui\";\nimport { CompositionProvider } from \"@webiny/react-composition\";\nimport { FullyDeleteModelError } from \"@webiny/app-headless-cms/presentation/contentModels/components/fullDelete/dialog/FullyDeleteModelError.js\";\nimport type { CmsErrorResponse, CmsModel } from \"@webiny/app-headless-cms/types.js\";\nimport { ModelDeleteWorkflowError } from \"./ModelDeleteWorkflowError.js\";\n\nconst hoisted = vi.hoisted(() => {\n return { editor: true };\n});\n\nvi.mock(\"@webiny/app-workflows/presentation/permissions/useWorkflowsPermission.js\", () => {\n return { useWorkflowsPermission: () => ({ editor: hoisted.editor }) };\n});\n\nvi.mock(\"@webiny/app-admin\", async importOriginal => {\n const actual = await importOriginal<typeof import(\"@webiny/app-admin\")>();\n return { ...actual, useRouter: () => ({ getLink: () => \"/cms/workflows\" }) };\n});\n\nconst model = { modelId: \"article\", name: \"Article\" } as CmsModel;\n\nconst BOUND: CmsErrorResponse = {\n message: 'The model \"article\" is used by the workflow \"Article review\".',\n code: \"Workflows/Model/BoundToWorkflow\",\n data: { modelId: \"article\", workflows: [{ id: \"wf1\", name: \"Article review\" }] }\n};\n\nconst renderError = (error: CmsErrorResponse) => {\n return render(\n <AdminUiProvider>\n <CompositionProvider>\n <ModelDeleteWorkflowError />\n <FullyDeleteModelError model={model} error={error} />\n </CompositionProvider>\n </AdminUiProvider>\n );\n};\n\ndescribe(\"ModelDeleteWorkflowError (UI-18, QBZ-38)\", () => {\n it(\"explains a delete blocked by a workflow and links to it\", async () => {\n hoisted.editor = true;\n renderError(BOUND);\n\n expect(await screen.findByText(\"Article has a workflow\")).toBeTruthy();\n expect(\n screen.getByText(\"Delete the workflow “Article review” first, then delete the model.\")\n ).toBeTruthy();\n expect(screen.getByText(\"Open workflow →\").closest(\"a\")?.getAttribute(\"href\")).toBe(\n \"/cms/workflows\"\n );\n expect(screen.queryByText(BOUND.message)).toBeNull();\n });\n\n it(\"hides the link without Manage workflows\", async () => {\n hoisted.editor = false;\n renderError(BOUND);\n\n expect(\n await screen.findByText(\n \"Ask someone with Manage workflows to delete the workflow “Article review” first, then delete the model.\"\n )\n ).toBeTruthy();\n expect(screen.queryByText(\"Open workflow →\")).toBeNull();\n });\n\n it(\"leaves every other delete error as it was\", async () => {\n hoisted.editor = true;\n renderError({ message: \"Network error.\", code: \"FULLY_DELETE_MODEL_ERROR\", data: {} });\n\n expect(await screen.findByText(\"Network error.\")).toBeTruthy();\n expect(screen.queryByText(/has a workflow/)).toBeNull();\n });\n});\n"],"names":["hoisted","vi","importOriginal","actual","model","BOUND","renderError","error","render","AdminUiProvider","CompositionProvider","ModelDeleteWorkflowError","FullyDeleteModelError","describe","it","expect","screen"],"mappings":";;;;;;;AAaA,MAAMA,UAAUC,GAAG,OAAO,CAAC,IAChB;QAAE,QAAQ;IAAK;AAG1BA,GAAG,IAAI,CAAC,4EAA4E,IACzE;QAAE,wBAAwB,IAAO;gBAAE,QAAQD,QAAQ,MAAM;YAAC;IAAG;AAGxEC,GAAG,IAAI,CAAC,qBAAqB,OAAMC;IAC/B,MAAMC,SAAS,MAAMD;IACrB,OAAO;QAAE,GAAGC,MAAM;QAAE,WAAW,IAAO;gBAAE,SAAS,IAAM;YAAiB;IAAG;AAC/E;AAEA,MAAMC,QAAQ;IAAE,SAAS;IAAW,MAAM;AAAU;AAEpD,MAAMC,QAA0B;IAC5B,SAAS;IACT,MAAM;IACN,MAAM;QAAE,SAAS;QAAW,WAAW;YAAC;gBAAE,IAAI;gBAAO,MAAM;YAAiB;SAAE;IAAC;AACnF;AAEA,MAAMC,cAAc,CAACC,QACVC,OAAO,WAADA,GACT,oBAACC,iBAAeA,MAAAA,WAAAA,GACZ,oBAACC,qBAAmBA,MAAAA,WAAAA,GAChB,oBAACC,0BAAwBA,OAAAA,WAAAA,GACzB,oBAACC,uBAAqBA;QAAC,OAAOR;QAAO,OAAOG;;AAM5DM,SAAS,4CAA4C;IACjDC,GAAG,2DAA2D;QAC1Dd,QAAQ,MAAM,GAAG;QACjBM,YAAYD;QAEZU,OAAO,MAAMC,OAAO,UAAU,CAAC,2BAA2B,UAAU;QACpED,OACIC,OAAO,SAAS,CAAC,uEACnB,UAAU;QACZD,OAAOC,OAAO,SAAS,CAAC,mBAAmB,OAAO,CAAC,MAAM,aAAa,SAAS,IAAI,CAC/E;QAEJD,OAAOC,OAAO,WAAW,CAACX,MAAM,OAAO,GAAG,QAAQ;IACtD;IAEAS,GAAG,2CAA2C;QAC1Cd,QAAQ,MAAM,GAAG;QACjBM,YAAYD;QAEZU,OACI,MAAMC,OAAO,UAAU,CACnB,4GAEN,UAAU;QACZD,OAAOC,OAAO,WAAW,CAAC,oBAAoB,QAAQ;IAC1D;IAEAF,GAAG,6CAA6C;QAC5Cd,QAAQ,MAAM,GAAG;QACjBM,YAAY;YAAE,SAAS;YAAkB,MAAM;YAA4B,MAAM,CAAC;QAAE;QAEpFS,OAAO,MAAMC,OAAO,UAAU,CAAC,mBAAmB,UAAU;QAC5DD,OAAOC,OAAO,WAAW,CAAC,mBAAmB,QAAQ;IACzD;AACJ"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { ModelDeleteWorkflowCopy } from "./ModelDeleteWorkflowCopy.js";
|
|
2
|
+
import type { ModelDeleteWorkflowCopyParams } from "./ModelDeleteWorkflowCopy.js";
|
|
3
|
+
export declare const getModelDeleteWorkflowCopy: (params: ModelDeleteWorkflowCopyParams) => ModelDeleteWorkflowCopy;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
const getModelDeleteWorkflowCopy = (params)=>{
|
|
2
|
+
const { modelName, workflowName, canManage } = params;
|
|
3
|
+
const title = `${modelName} has a workflow`;
|
|
4
|
+
if (canManage) return {
|
|
5
|
+
title,
|
|
6
|
+
body: `Delete the workflow “${workflowName}” first, then delete the model.`,
|
|
7
|
+
showLink: true
|
|
8
|
+
};
|
|
9
|
+
return {
|
|
10
|
+
title,
|
|
11
|
+
body: `Ask someone with Manage workflows to delete the workflow “${workflowName}” first, then delete the model.`,
|
|
12
|
+
showLink: false
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
export { getModelDeleteWorkflowCopy };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=getModelDeleteWorkflowCopy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Components/ModelDelete/getModelDeleteWorkflowCopy.js","sources":["../../../src/Components/ModelDelete/getModelDeleteWorkflowCopy.ts"],"sourcesContent":["import type { ModelDeleteWorkflowCopy } from \"./ModelDeleteWorkflowCopy.js\";\nimport type { ModelDeleteWorkflowCopyParams } from \"./ModelDeleteWorkflowCopy.js\";\n\n// The copy of a model delete refused because a workflow uses the model (UI-18, QBZ-38). Pure.\nexport const getModelDeleteWorkflowCopy = (\n params: ModelDeleteWorkflowCopyParams\n): ModelDeleteWorkflowCopy => {\n const { modelName, workflowName, canManage } = params;\n const title = `${modelName} has a workflow`;\n if (canManage) {\n return {\n title,\n body: `Delete the workflow “${workflowName}” first, then delete the model.`,\n showLink: true\n };\n }\n return {\n title,\n body: `Ask someone with Manage workflows to delete the workflow “${workflowName}” first, then delete the model.`,\n showLink: false\n };\n};\n"],"names":["getModelDeleteWorkflowCopy","params","modelName","workflowName","canManage","title"],"mappings":"AAIO,MAAMA,6BAA6B,CACtCC;IAEA,MAAM,EAAEC,SAAS,EAAEC,YAAY,EAAEC,SAAS,EAAE,GAAGH;IAC/C,MAAMI,QAAQ,GAAGH,UAAU,eAAe,CAAC;IAC3C,IAAIE,WACA,OAAO;QACHC;QACA,MAAM,CAAC,qBAAqB,EAAEF,aAAa,+BAA+B,CAAC;QAC3E,UAAU;IACd;IAEJ,OAAO;QACHE;QACA,MAAM,CAAC,0DAA0D,EAAEF,aAAa,+BAA+B,CAAC;QAChH,UAAU;IACd;AACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { getModelDeleteWorkflowCopy } from "./getModelDeleteWorkflowCopy.js";
|
|
3
|
+
describe("getModelDeleteWorkflowCopy (UI-18, QBZ-38)", ()=>{
|
|
4
|
+
it("tells someone with Manage workflows to delete the workflow, with the link", ()=>{
|
|
5
|
+
expect(getModelDeleteWorkflowCopy({
|
|
6
|
+
modelName: "Article",
|
|
7
|
+
workflowName: "Article review",
|
|
8
|
+
canManage: true
|
|
9
|
+
})).toEqual({
|
|
10
|
+
title: "Article has a workflow",
|
|
11
|
+
body: "Delete the workflow “Article review” first, then delete the model.",
|
|
12
|
+
showLink: true
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
it("tells anyone else to ask someone with Manage workflows, without the link", ()=>{
|
|
16
|
+
expect(getModelDeleteWorkflowCopy({
|
|
17
|
+
modelName: "Article",
|
|
18
|
+
workflowName: "Article review",
|
|
19
|
+
canManage: false
|
|
20
|
+
})).toEqual({
|
|
21
|
+
title: "Article has a workflow",
|
|
22
|
+
body: "Ask someone with Manage workflows to delete the workflow “Article review” first, then delete the model.",
|
|
23
|
+
showLink: false
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=getModelDeleteWorkflowCopy.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Components/ModelDelete/getModelDeleteWorkflowCopy.test.js","sources":["../../../src/Components/ModelDelete/getModelDeleteWorkflowCopy.test.ts"],"sourcesContent":["import { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { getModelDeleteWorkflowCopy } from \"./getModelDeleteWorkflowCopy.js\";\n\ndescribe(\"getModelDeleteWorkflowCopy (UI-18, QBZ-38)\", () => {\n it(\"tells someone with Manage workflows to delete the workflow, with the link\", () => {\n expect(\n getModelDeleteWorkflowCopy({\n modelName: \"Article\",\n workflowName: \"Article review\",\n canManage: true\n })\n ).toEqual({\n title: \"Article has a workflow\",\n body: \"Delete the workflow “Article review” first, then delete the model.\",\n showLink: true\n });\n });\n\n it(\"tells anyone else to ask someone with Manage workflows, without the link\", () => {\n expect(\n getModelDeleteWorkflowCopy({\n modelName: \"Article\",\n workflowName: \"Article review\",\n canManage: false\n })\n ).toEqual({\n title: \"Article has a workflow\",\n body: \"Ask someone with Manage workflows to delete the workflow “Article review” first, then delete the model.\",\n showLink: false\n });\n });\n});\n"],"names":["describe","it","expect","getModelDeleteWorkflowCopy"],"mappings":";;AAKAA,SAAS,8CAA8C;IACnDC,GAAG,6EAA6E;QAC5EC,OACIC,2BAA2B;YACvB,WAAW;YACX,cAAc;YACd,WAAW;QACf,IACF,OAAO,CAAC;YACN,OAAO;YACP,MAAM;YACN,UAAU;QACd;IACJ;IAEAF,GAAG,4EAA4E;QAC3EC,OACIC,2BAA2B;YACvB,WAAW;YACX,cAAc;YACd,WAAW;QACf,IACF,OAAO,CAAC;YACN,OAAO;YACP,MAAM;YACN,UAAU;QACd;IACJ;AACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function ignoreAction(): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Components/ignoreAction.js","sources":["../../src/Components/ignoreAction.ts"],"sourcesContent":["// A disabled action still needs a handler; it does nothing.\nexport function ignoreAction(): void {}\n"],"names":["ignoreAction"],"mappings":"AACO,SAASA,gBAAsB"}
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) Webiny
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# @webiny/app-headless-cms-workflows
|
|
2
|
+
|
|
3
|
+
> [!NOTE]
|
|
4
|
+
> This package is part of the [Webiny](https://www.webiny.com) monorepo.
|
|
5
|
+
> It’s **included in every Webiny project by default** and is not meant to be used as a standalone package.
|
|
6
|
+
|
|
7
|
+
📘 **Documentation:** [https://www.webiny.com/docs](https://www.webiny.com/docs)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
_This README file is automatically generated during the publish process._
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { useFeature } from "@webiny/app";
|
|
3
|
+
import { WorkflowEditorMenu } from "@webiny/app-workflows/editor/mounting/components/WorkflowEditorMenu.js";
|
|
4
|
+
import { WorkflowEditorRoute } from "@webiny/app-workflows/editor/mounting/components/WorkflowEditorRoute.js";
|
|
5
|
+
import { CmsWorkflowEditorMountingFeature } from "../features/editorMounting/feature.js";
|
|
6
|
+
import { Routes } from "../routes.js";
|
|
7
|
+
const CmsWorkflowEditor = ()=>{
|
|
8
|
+
const { app } = useFeature(CmsWorkflowEditorMountingFeature);
|
|
9
|
+
return /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(WorkflowEditorRoute, {
|
|
10
|
+
route: Routes.ContentModels.Workflows,
|
|
11
|
+
appBreadcrumbName: "cms",
|
|
12
|
+
appBreadcrumbLabel: "Headless CMS",
|
|
13
|
+
breadcrumbName: "cms.workflows",
|
|
14
|
+
app: app
|
|
15
|
+
}), /*#__PURE__*/ react.createElement(WorkflowEditorMenu, {
|
|
16
|
+
name: "headlessCMS.contentModels.workflows",
|
|
17
|
+
parent: "headlessCMS",
|
|
18
|
+
route: Routes.ContentModels.Workflows
|
|
19
|
+
}));
|
|
20
|
+
};
|
|
21
|
+
export { CmsWorkflowEditor };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=CmsWorkflowEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Routes/CmsWorkflowEditor.js","sources":["../../src/Routes/CmsWorkflowEditor.tsx"],"sourcesContent":["import React from \"react\";\nimport { useFeature } from \"@webiny/app\";\nimport { WorkflowEditorMenu } from \"@webiny/app-workflows/editor/mounting/components/WorkflowEditorMenu.js\";\nimport { WorkflowEditorRoute } from \"@webiny/app-workflows/editor/mounting/components/WorkflowEditorRoute.js\";\nimport { CmsWorkflowEditorMountingFeature } from \"~/features/editorMounting/feature.js\";\nimport { Routes } from \"~/routes.js\";\n\n/*\n * Mounts the shared workflow editor route and menu item with the CMS adapter. Without the workflows\n * `editor` permission the menu item renders nothing and the route shows the no-access view (D162,\n * R331).\n */\nexport const CmsWorkflowEditor = () => {\n const { app } = useFeature(CmsWorkflowEditorMountingFeature);\n\n return (\n <>\n <WorkflowEditorRoute\n route={Routes.ContentModels.Workflows}\n appBreadcrumbName=\"cms\"\n appBreadcrumbLabel=\"Headless CMS\"\n breadcrumbName=\"cms.workflows\"\n app={app}\n />\n <WorkflowEditorMenu\n name=\"headlessCMS.contentModels.workflows\"\n parent=\"headlessCMS\"\n route={Routes.ContentModels.Workflows}\n />\n </>\n );\n};\n"],"names":["CmsWorkflowEditor","app","useFeature","CmsWorkflowEditorMountingFeature","WorkflowEditorRoute","Routes","WorkflowEditorMenu"],"mappings":";;;;;;AAYO,MAAMA,oBAAoB;IAC7B,MAAM,EAAEC,GAAG,EAAE,GAAGC,WAAWC;IAE3B,OAAO,WAAP,GACI,wDACI,oBAACC,qBAAmBA;QAChB,OAAOC,OAAO,aAAa,CAAC,SAAS;QACrC,mBAAkB;QAClB,oBAAmB;QACnB,gBAAe;QACf,KAAKJ;sBAET,oBAACK,oBAAkBA;QACf,MAAK;QACL,QAAO;QACP,OAAOD,OAAO,aAAa,CAAC,SAAS;;AAIrD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|