@webiny/app-headless-cms-workflows 0.0.0-unstable.e6f0dc8ca7 → 0.0.0-unstable.eb81deee7e
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/CmsEntriesWorkflowStateList/CmsEntriesWorkflowStateListFooterMenu.js +28 -39
- package/Components/CmsEntriesWorkflowStateList/CmsEntriesWorkflowStateListFooterMenu.js.map +1 -1
- package/Components/CmsEntriesWorkflowStateList/index.js +0 -2
- package/Components/ContentEntryForm/CmsEntryFormCreateNewRevisionButton.js +41 -64
- package/Components/ContentEntryForm/CmsEntryFormCreateNewRevisionButton.js.map +1 -1
- package/Components/ContentEntryForm/CmsEntryFormScheduleMenuItemAction.js +17 -33
- package/Components/ContentEntryForm/CmsEntryFormScheduleMenuItemAction.js.map +1 -1
- package/Components/ContentEntryForm/CmsEntryFormTooltipButton.js +10 -17
- package/Components/ContentEntryForm/CmsEntryFormTooltipButton.js.map +1 -1
- package/Components/ContentEntryForm/ContentEntryFormWorkflow.js +21 -70
- package/Components/ContentEntryForm/ContentEntryFormWorkflow.js.map +1 -1
- package/Components/ContentEntryForm/index.d.ts +0 -3
- package/Components/ContentEntryForm/index.js +0 -5
- package/Components/OptionItem/OpenInNewWindow.js +28 -36
- package/Components/OptionItem/OpenInNewWindow.js.map +1 -1
- package/Routes/CmsWorkflowsEditor.js +24 -27
- package/Routes/CmsWorkflowsEditor.js.map +1 -1
- package/Routes/index.js +0 -2
- package/features/WorkflowStateCacheHandler.d.ts +11 -0
- package/features/WorkflowStateCacheHandler.js +50 -0
- package/features/WorkflowStateCacheHandler.js.map +1 -0
- package/features/feature.d.ts +1 -0
- package/features/feature.js +11 -0
- package/features/feature.js.map +1 -0
- package/index.d.ts +1 -1
- package/index.js +17 -5
- package/index.js.map +1 -1
- package/package.json +21 -17
- package/presentation/CmsWorkflowsEditorView.d.ts +5 -0
- package/presentation/CmsWorkflowsEditorView.js +90 -0
- package/presentation/CmsWorkflowsEditorView.js.map +1 -0
- package/presentation/ContentEntryFormPresenterWorkflowDecorator.d.ts +25 -0
- package/presentation/ContentEntryFormPresenterWorkflowDecorator.js +70 -0
- package/presentation/ContentEntryFormPresenterWorkflowDecorator.js.map +1 -0
- package/presentation/TableRowMapperWorkflowDecorator.d.ts +11 -0
- package/presentation/TableRowMapperWorkflowDecorator.js +25 -0
- package/presentation/TableRowMapperWorkflowDecorator.js.map +1 -0
- package/presentation/WorkflowStateGetEntryFieldSelection.d.ts +8 -0
- package/presentation/WorkflowStateGetEntryFieldSelection.js +24 -0
- package/presentation/WorkflowStateGetEntryFieldSelection.js.map +1 -0
- package/presentation/WorkflowStateListEntriesFieldSelection.d.ts +8 -0
- package/presentation/WorkflowStateListEntriesFieldSelection.js +24 -0
- package/presentation/WorkflowStateListEntriesFieldSelection.js.map +1 -0
- package/presentation/cmsWorkflowsEditor/CmsWorkflowsEditorPresenter.d.ts +15 -0
- package/presentation/cmsWorkflowsEditor/CmsWorkflowsEditorPresenter.js +50 -0
- package/presentation/cmsWorkflowsEditor/CmsWorkflowsEditorPresenter.js.map +1 -0
- package/presentation/cmsWorkflowsEditor/abstractions.d.ts +19 -0
- package/presentation/cmsWorkflowsEditor/abstractions.js +5 -0
- package/presentation/cmsWorkflowsEditor/abstractions.js.map +1 -0
- package/presentation/cmsWorkflowsEditor/feature.d.ts +3 -0
- package/presentation/cmsWorkflowsEditor/feature.js +17 -0
- package/presentation/cmsWorkflowsEditor/feature.js.map +1 -0
- package/presentation/feature.d.ts +1 -0
- package/presentation/feature.js +21 -0
- package/presentation/feature.js.map +1 -0
- package/routes.js +17 -18
- package/routes.js.map +1 -1
- 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/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/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/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/Routes/index.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"Components/OptionItem/OpenInNewWindow.js","sources":["../../../src/Components/OptionItem/OpenInNewWindow.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { DropdownMenu, Icon } from \"@webiny/admin-ui\";\nimport { Components } from \"@webiny/app-workflows\";\nimport { ReactComponent as OpenInNewIcon } from \"@webiny/icons/open_in_new.svg\";\nimport { useRouter } from \"@webiny/app\";\nimport { Routes } from \"@webiny/app-headless-cms/routes.js\";\nimport { isCmsAppName, parseAppName } from \"~/utils/appName.js\";\n\nconst { OpenInNewWindow } = Components.List.Options;\n\nexport const ListOpenInNewWindow = OpenInNewWindow.createDecorator(Original => {\n return function ListOpenInNewWindow(props) {\n const { state } = props;\n\n const { getLink } = useRouter();\n const onClick = useCallback(() => {\n const modelId = parseAppName(state.app);\n const url = getLink(Routes.ContentEntries.List, {\n modelId,\n id: state.targetRevisionId,\n // TODO figure out how to load folderId\n folderId: \"root\"\n });\n\n const goTo = `${window.location.origin}${url}`;\n\n window.open(goTo, \"_blank\");\n }, [state.id]);\n\n if (isCmsAppName(state.app) === false) {\n return <Original {...props} />;\n }\n\n return (\n <DropdownMenu.Item\n icon={<Icon icon={<OpenInNewIcon />} label={\"Open In New Window\"} />}\n text={\"Open in New Window\"}\n onClick={onClick}\n />\n );\n };\n});\n"],"names":["OpenInNewWindow","Components","ListOpenInNewWindow","Original","props","state","getLink","useRouter","onClick","useCallback","modelId","parseAppName","url","Routes","goTo","window","isCmsAppName","DropdownMenu","Icon","OpenInNewIcon"],"mappings":";;;;;;;AAQA,MAAM,EAAEA,iBAAAA,eAAe,EAAE,GAAGC,WAAW,IAAI,CAAC,OAAO;AAE5C,MAAMC,sCAAsBF,gBAAgB,eAAe,CAACG,CAAAA,WACxD,SAA6BC,KAAK;QACrC,MAAM,EAAEC,KAAK,EAAE,GAAGD;QAElB,MAAM,EAAEE,OAAO,EAAE,GAAGC;QACpB,MAAMC,UAAUC,YAAY;YACxB,MAAMC,UAAUC,aAAaN,MAAM,GAAG;YACtC,MAAMO,MAAMN,QAAQO,OAAO,cAAc,CAAC,IAAI,EAAE;gBAC5CH;gBACA,IAAIL,MAAM,gBAAgB;gBAE1B,UAAU;YACd;YAEA,MAAMS,OAAO,GAAGC,OAAO,QAAQ,CAAC,MAAM,GAAGH,KAAK;YAE9CG,OAAO,IAAI,CAACD,MAAM;QACtB,GAAG;YAACT,MAAM,EAAE;SAAC;QAEb,IAAIW,AAA4B,UAA5BA,aAAaX,MAAM,GAAG,GACtB,OAAO,WAAP,GAAO,oBAACF,UAAaC;QAGzB,OAAO,WAAP,GACI,oBAACa,aAAa,IAAI;YACd,oBAAM,oBAACC,MAAIA;gBAAC,oBAAM,oBAACC,gBAAaA;gBAAK,OAAO;;YAC5C,MAAM;YACN,SAASX;;IAGrB"}
|
|
@@ -1,35 +1,32 @@
|
|
|
1
|
-
import
|
|
1
|
+
import react, { Suspense } from "react";
|
|
2
2
|
import { Routes } from "../routes.js";
|
|
3
|
-
import
|
|
4
|
-
import { CmsWorkflowsEditorView, CmsWorkflowsEditorMenu } from "../Components/CmsWorkflows/CmsWorkflowsEditorView.js";
|
|
3
|
+
import react_helmet from "react-helmet";
|
|
5
4
|
import { i18n } from "@webiny/app/i18n/index.js";
|
|
6
|
-
import { SecureRoute } from "@webiny/app-admin";
|
|
5
|
+
import { AdminConfig, AdminLayout, SecureRoute } from "@webiny/app-admin";
|
|
7
6
|
import { OverlayLoader } from "@webiny/admin-ui";
|
|
8
|
-
import { AdminConfig, AdminLayout } from "@webiny/app-admin";
|
|
9
7
|
import { useCanUseWorkflows } from "@webiny/app-workflows";
|
|
8
|
+
import { CmsWorkflowsEditorMenu, CmsWorkflowsEditorView } from "../presentation/CmsWorkflowsEditorView.js";
|
|
10
9
|
const t = i18n.namespace("HeadlessCms.Workflows.Editor");
|
|
11
|
-
const Loader = ({
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
permission: "cms.contentModel"
|
|
31
|
-
}, /*#__PURE__*/React.createElement(AdminLayout, null, /*#__PURE__*/React.createElement(Helmet, null, /*#__PURE__*/React.createElement("title", null, t`Workflows`)), /*#__PURE__*/React.createElement(Loader, null, /*#__PURE__*/React.createElement(CmsWorkflowsEditorView, null))))
|
|
32
|
-
}), /*#__PURE__*/React.createElement(CmsWorkflowsEditorMenu, null));
|
|
10
|
+
const Loader = ({ children, ...props })=>/*#__PURE__*/ react.createElement(Suspense, {
|
|
11
|
+
fallback: /*#__PURE__*/ react.createElement(OverlayLoader, null)
|
|
12
|
+
}, /*#__PURE__*/ react.cloneElement(children, props));
|
|
13
|
+
const { Route: Route } = AdminConfig;
|
|
14
|
+
const CmsWorkflowsEditor = ()=>{
|
|
15
|
+
const { canUseWorkflows } = useCanUseWorkflows();
|
|
16
|
+
if (!canUseWorkflows) return null;
|
|
17
|
+
return /*#__PURE__*/ react.createElement(AdminConfig, null, /*#__PURE__*/ react.createElement(Route, {
|
|
18
|
+
route: Routes.ContentModels.Workflows,
|
|
19
|
+
element: /*#__PURE__*/ react.createElement(SecureRoute, {
|
|
20
|
+
permission: "cms.contentModel"
|
|
21
|
+
}, /*#__PURE__*/ react.createElement(AdminLayout, null, /*#__PURE__*/ react.createElement(react_helmet, null, /*#__PURE__*/ react.createElement("title", null, t`Workflows`)), /*#__PURE__*/ react.createElement(AdminConfig.Breadcrumb, {
|
|
22
|
+
name: "cms",
|
|
23
|
+
label: "Headless CMS"
|
|
24
|
+
}), /*#__PURE__*/ react.createElement(AdminConfig.Breadcrumb, {
|
|
25
|
+
name: "cms.workflows",
|
|
26
|
+
label: "Workflows"
|
|
27
|
+
}), /*#__PURE__*/ react.createElement(Loader, null, /*#__PURE__*/ react.createElement(CmsWorkflowsEditorView, null))))
|
|
28
|
+
}), /*#__PURE__*/ react.createElement(CmsWorkflowsEditorMenu, null));
|
|
33
29
|
};
|
|
30
|
+
export { CmsWorkflowsEditor };
|
|
34
31
|
|
|
35
32
|
//# sourceMappingURL=CmsWorkflowsEditor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"Routes/CmsWorkflowsEditor.js","sources":["../../src/Routes/CmsWorkflowsEditor.tsx"],"sourcesContent":["import React, { Suspense } from \"react\";\nimport { Routes } from \"~/routes.js\";\nimport Helmet from \"react-helmet\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { SecureRoute } from \"@webiny/app-admin\";\nimport { OverlayLoader } from \"@webiny/admin-ui\";\nimport { AdminConfig, AdminLayout } from \"@webiny/app-admin\";\nimport { useCanUseWorkflows } from \"@webiny/app-workflows\";\nimport { CmsWorkflowsEditorView } from \"~/presentation/CmsWorkflowsEditorView.js\";\nimport { CmsWorkflowsEditorMenu } from \"~/presentation/CmsWorkflowsEditorView.js\";\n\nconst t = i18n.namespace(\"HeadlessCms.Workflows.Editor\");\n\ninterface LoaderProps {\n children: React.ReactNode;\n}\n\nconst Loader = ({ children, ...props }: LoaderProps) => (\n <Suspense fallback={<OverlayLoader />}>\n {React.cloneElement(children as unknown as React.ReactElement, props)}\n </Suspense>\n);\n\nconst { Route } = AdminConfig;\n\nexport const CmsWorkflowsEditor = () => {\n const { canUseWorkflows } = useCanUseWorkflows();\n if (!canUseWorkflows) {\n return null;\n }\n return (\n <AdminConfig>\n <Route\n route={Routes.ContentModels.Workflows}\n element={\n <SecureRoute permission={\"cms.contentModel\"}>\n <AdminLayout>\n <Helmet>\n <title>{t`Workflows`}</title>\n </Helmet>\n <AdminConfig.Breadcrumb name={\"cms\"} label={\"Headless CMS\"} />\n <AdminConfig.Breadcrumb name={\"cms.workflows\"} label={\"Workflows\"} />\n <Loader>\n <CmsWorkflowsEditorView />\n </Loader>\n </AdminLayout>\n </SecureRoute>\n }\n />\n <CmsWorkflowsEditorMenu />\n </AdminConfig>\n );\n};\n"],"names":["t","i18n","Loader","children","props","Suspense","OverlayLoader","React","Route","AdminConfig","CmsWorkflowsEditor","canUseWorkflows","useCanUseWorkflows","Routes","SecureRoute","AdminLayout","Helmet","CmsWorkflowsEditorView","CmsWorkflowsEditorMenu"],"mappings":";;;;;;;;AAWA,MAAMA,IAAIC,KAAK,SAAS,CAAC;AAMzB,MAAMC,SAAS,CAAC,EAAEC,QAAQ,EAAE,GAAGC,OAAoB,iBAC/C,oBAACC,UAAQA;QAAC,wBAAU,oBAACC,eAAaA;qBAC7BC,MAAAA,YAAkB,CAACJ,UAA2CC;AAIvE,MAAM,EAAEI,OAAAA,KAAK,EAAE,GAAGC;AAEX,MAAMC,qBAAqB;IAC9B,MAAM,EAAEC,eAAe,EAAE,GAAGC;IAC5B,IAAI,CAACD,iBACD,OAAO;IAEX,OAAO,WAAP,GACI,oBAACF,aAAWA,MAAAA,WAAAA,GACR,oBAACD,OAAKA;QACF,OAAOK,OAAO,aAAa,CAAC,SAAS;QACrC,uBACI,oBAACC,aAAWA;YAAC,YAAY;yBACrB,oBAACC,aAAWA,MAAAA,WAAAA,GACR,oBAACC,cAAMA,MAAAA,WAAAA,GACH,oBAAC,eAAOhB,CAAC,CAAC,SAAS,CAAC,kBAExB,oBAACS,YAAY,UAAU;YAAC,MAAM;YAAO,OAAO;0BAC5C,oBAACA,YAAY,UAAU;YAAC,MAAM;YAAiB,OAAO;0BACtD,oBAACP,QAAMA,MAAAA,WAAAA,GACH,oBAACe,wBAAsBA;sBAM3C,oBAACC,wBAAsBA;AAGnC"}
|
package/Routes/index.js
CHANGED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ContentEntriesCacheProvider } from "@webiny/app-headless-cms/features/contentEntry/abstractions.js";
|
|
2
|
+
import { WorkflowStateChangedHandler, type WorkflowStateChangedEvent } from "@webiny/app-workflows/domain/events.js";
|
|
3
|
+
declare class WorkflowStateCacheHandlerImpl implements WorkflowStateChangedHandler.Interface {
|
|
4
|
+
private cacheProvider;
|
|
5
|
+
constructor(cacheProvider: ContentEntriesCacheProvider.Interface);
|
|
6
|
+
handle(event: WorkflowStateChangedEvent): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export declare const WorkflowStateCacheHandler: typeof WorkflowStateCacheHandlerImpl & {
|
|
9
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/app/features/eventPublisher").IEventHandler<WorkflowStateChangedEvent>>;
|
|
10
|
+
};
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { parseIdentifier } from "@webiny/utils/parseIdentifier.js";
|
|
2
|
+
import { ContentEntriesCacheProvider } from "@webiny/app-headless-cms/features/contentEntry/abstractions.js";
|
|
3
|
+
import { WorkflowStateChangedHandler } from "@webiny/app-workflows/domain/events.js";
|
|
4
|
+
function getModelIdFromAppName(app) {
|
|
5
|
+
const matched = app.match(/^cms\.([a-zA-Z0-9_-]+)$/);
|
|
6
|
+
return matched ? matched[1] : null;
|
|
7
|
+
}
|
|
8
|
+
function toWorkflowStateValues(state) {
|
|
9
|
+
if (!state) return null;
|
|
10
|
+
return {
|
|
11
|
+
workflowId: state.id,
|
|
12
|
+
stepId: state.currentStep.id,
|
|
13
|
+
stepName: state.currentStep.title,
|
|
14
|
+
state: state.state
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
class WorkflowStateCacheHandlerImpl {
|
|
18
|
+
constructor(cacheProvider){
|
|
19
|
+
this.cacheProvider = cacheProvider;
|
|
20
|
+
}
|
|
21
|
+
async handle(event) {
|
|
22
|
+
const { app, targetRevisionId, state } = event.payload;
|
|
23
|
+
const modelId = getModelIdFromAppName(app);
|
|
24
|
+
if (!modelId) return;
|
|
25
|
+
const { id: entryId } = parseIdentifier(targetRevisionId);
|
|
26
|
+
const cache = this.cacheProvider.get(modelId);
|
|
27
|
+
const workflowValues = toWorkflowStateValues(state);
|
|
28
|
+
cache.updateItems((entry)=>{
|
|
29
|
+
if (entry.entryId !== entryId) return entry;
|
|
30
|
+
return {
|
|
31
|
+
...entry,
|
|
32
|
+
meta: {
|
|
33
|
+
...entry.meta,
|
|
34
|
+
system: {
|
|
35
|
+
workflow: workflowValues
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const WorkflowStateCacheHandler = WorkflowStateChangedHandler.createImplementation({
|
|
43
|
+
implementation: WorkflowStateCacheHandlerImpl,
|
|
44
|
+
dependencies: [
|
|
45
|
+
ContentEntriesCacheProvider
|
|
46
|
+
]
|
|
47
|
+
});
|
|
48
|
+
export { WorkflowStateCacheHandler };
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=WorkflowStateCacheHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/WorkflowStateCacheHandler.js","sources":["../../src/features/WorkflowStateCacheHandler.ts"],"sourcesContent":["import { parseIdentifier } from \"@webiny/utils/parseIdentifier.js\";\nimport { ContentEntriesCacheProvider } from \"@webiny/app-headless-cms/features/contentEntry/abstractions.js\";\nimport {\n WorkflowStateChangedHandler,\n type WorkflowStateChangedEvent\n} from \"@webiny/app-workflows/domain/events.js\";\nimport type { CmsContentEntry } from \"@webiny/app-headless-cms-common/types/index.js\";\nimport type { ICmsEntryWorkflowState } from \"~/types.js\";\n\nfunction getModelIdFromAppName(app: string): string | null {\n const matched = app.match(/^cms\\.([a-zA-Z0-9_-]+)$/);\n return matched ? matched[1] : null;\n}\n\nfunction toWorkflowStateValues(\n state: WorkflowStateChangedEvent[\"payload\"][\"state\"]\n): ICmsEntryWorkflowState | null {\n if (!state) {\n return null;\n }\n\n return {\n workflowId: state.id,\n stepId: state.currentStep.id,\n stepName: state.currentStep.title,\n state: state.state\n };\n}\n\nclass WorkflowStateCacheHandlerImpl implements WorkflowStateChangedHandler.Interface {\n constructor(private cacheProvider: ContentEntriesCacheProvider.Interface) {}\n\n async handle(event: WorkflowStateChangedEvent): Promise<void> {\n const { app, targetRevisionId, state } = event.payload;\n\n const modelId = getModelIdFromAppName(app);\n if (!modelId) {\n return;\n }\n\n const { id: entryId } = parseIdentifier(targetRevisionId);\n const cache = this.cacheProvider.get(modelId);\n const workflowValues = toWorkflowStateValues(state);\n\n cache.updateItems((entry: CmsContentEntry) => {\n if (entry.entryId !== entryId) {\n return entry;\n }\n\n return {\n ...entry,\n meta: {\n ...entry.meta,\n system: {\n workflow: workflowValues\n }\n }\n };\n });\n }\n}\n\nexport const WorkflowStateCacheHandler = WorkflowStateChangedHandler.createImplementation({\n implementation: WorkflowStateCacheHandlerImpl,\n dependencies: [ContentEntriesCacheProvider]\n});\n"],"names":["getModelIdFromAppName","app","matched","toWorkflowStateValues","state","WorkflowStateCacheHandlerImpl","cacheProvider","event","targetRevisionId","modelId","entryId","parseIdentifier","cache","workflowValues","entry","WorkflowStateCacheHandler","WorkflowStateChangedHandler","ContentEntriesCacheProvider"],"mappings":";;;AASA,SAASA,sBAAsBC,GAAW;IACtC,MAAMC,UAAUD,IAAI,KAAK,CAAC;IAC1B,OAAOC,UAAUA,OAAO,CAAC,EAAE,GAAG;AAClC;AAEA,SAASC,sBACLC,KAAoD;IAEpD,IAAI,CAACA,OACD,OAAO;IAGX,OAAO;QACH,YAAYA,MAAM,EAAE;QACpB,QAAQA,MAAM,WAAW,CAAC,EAAE;QAC5B,UAAUA,MAAM,WAAW,CAAC,KAAK;QACjC,OAAOA,MAAM,KAAK;IACtB;AACJ;AAEA,MAAMC;IACF,YAAoBC,aAAoD,CAAE;aAAtDA,aAAa,GAAbA;IAAuD;IAE3E,MAAM,OAAOC,KAAgC,EAAiB;QAC1D,MAAM,EAAEN,GAAG,EAAEO,gBAAgB,EAAEJ,KAAK,EAAE,GAAGG,MAAM,OAAO;QAEtD,MAAME,UAAUT,sBAAsBC;QACtC,IAAI,CAACQ,SACD;QAGJ,MAAM,EAAE,IAAIC,OAAO,EAAE,GAAGC,gBAAgBH;QACxC,MAAMI,QAAQ,IAAI,CAAC,aAAa,CAAC,GAAG,CAACH;QACrC,MAAMI,iBAAiBV,sBAAsBC;QAE7CQ,MAAM,WAAW,CAAC,CAACE;YACf,IAAIA,MAAM,OAAO,KAAKJ,SAClB,OAAOI;YAGX,OAAO;gBACH,GAAGA,KAAK;gBACR,MAAM;oBACF,GAAGA,MAAM,IAAI;oBACb,QAAQ;wBACJ,UAAUD;oBACd;gBACJ;YACJ;QACJ;IACJ;AACJ;AAEO,MAAME,4BAA4BC,4BAA4B,oBAAoB,CAAC;IACtF,gBAAgBX;IAChB,cAAc;QAACY;KAA4B;AAC/C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const CmsWorkflowsCacheFeature: import("@webiny/feature/admin").FeatureDefinition<any, []>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/admin";
|
|
2
|
+
import { WorkflowStateCacheHandler } from "./WorkflowStateCacheHandler.js";
|
|
3
|
+
const CmsWorkflowsCacheFeature = createFeature({
|
|
4
|
+
name: "CmsWorkflows/Cache",
|
|
5
|
+
register (container) {
|
|
6
|
+
container.register(WorkflowStateCacheHandler);
|
|
7
|
+
}
|
|
8
|
+
});
|
|
9
|
+
export { CmsWorkflowsCacheFeature };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/feature.js","sources":["../../src/features/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport { WorkflowStateCacheHandler } from \"./WorkflowStateCacheHandler.js\";\n\nexport const CmsWorkflowsCacheFeature = createFeature({\n name: \"CmsWorkflows/Cache\",\n register(container) {\n container.register(WorkflowStateCacheHandler);\n }\n});\n"],"names":["CmsWorkflowsCacheFeature","createFeature","container","WorkflowStateCacheHandler"],"mappings":";;AAGO,MAAMA,2BAA2BC,cAAc;IAClD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;IACvB;AACJ"}
|
package/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
export declare const CmsWorkflows: () => React.JSX.Element;
|
|
2
|
+
export declare const CmsWorkflows: () => React.JSX.Element | null;
|
package/index.js
CHANGED
|
@@ -1,12 +1,24 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { RegisterFeature, useFeatureFlags } from "@webiny/app-admin";
|
|
3
3
|
import { CmsWorkflowsEditor } from "./Routes/index.js";
|
|
4
|
-
import {
|
|
4
|
+
import { CmsEntryFormScheduleMenuItemAction, CmsEntryFormTooltipButton, ContentEntryFormWorkflow } from "./Components/ContentEntryForm/index.js";
|
|
5
5
|
import { CmsEntriesWorkflowStateListFooterMenu } from "./Components/CmsEntriesWorkflowStateList/index.js";
|
|
6
6
|
import { ListOpenInNewWindow } from "./Components/OptionItem/OpenInNewWindow.js";
|
|
7
7
|
import { CmsEntryFormCreateNewRevisionButton } from "./Components/ContentEntryForm/CmsEntryFormCreateNewRevisionButton.js";
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
import { CmsWorkflowsFeature } from "./presentation/feature.js";
|
|
9
|
+
import { CmsWorkflowsCacheFeature } from "./features/feature.js";
|
|
10
|
+
import { CmsWorkflowsEditorPresenterFeature } from "./presentation/cmsWorkflowsEditor/feature.js";
|
|
11
|
+
const CmsWorkflows = ()=>{
|
|
12
|
+
const featureFlags = useFeatureFlags();
|
|
13
|
+
if (!featureFlags.isEnabled("advancedPublishingWorkflow")) return null;
|
|
14
|
+
return /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(RegisterFeature, {
|
|
15
|
+
feature: CmsWorkflowsFeature
|
|
16
|
+
}), /*#__PURE__*/ react.createElement(RegisterFeature, {
|
|
17
|
+
feature: CmsWorkflowsCacheFeature
|
|
18
|
+
}), /*#__PURE__*/ react.createElement(RegisterFeature, {
|
|
19
|
+
feature: CmsWorkflowsEditorPresenterFeature
|
|
20
|
+
}), /*#__PURE__*/ react.createElement(ListOpenInNewWindow, null), /*#__PURE__*/ react.createElement(CmsEntriesWorkflowStateListFooterMenu, null), /*#__PURE__*/ react.createElement(CmsWorkflowsEditor, null), /*#__PURE__*/ react.createElement(ContentEntryFormWorkflow, null), /*#__PURE__*/ react.createElement(CmsEntryFormTooltipButton, null), /*#__PURE__*/ react.createElement(CmsEntryFormScheduleMenuItemAction, null), /*#__PURE__*/ react.createElement(CmsEntryFormCreateNewRevisionButton, null));
|
|
10
21
|
};
|
|
22
|
+
export { CmsWorkflows };
|
|
11
23
|
|
|
12
24
|
//# sourceMappingURL=index.js.map
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.tsx"],"sourcesContent":["import React from \"react\";\nimport { RegisterFeature, useFeatureFlags } from \"@webiny/app-admin\";\nimport { CmsWorkflowsEditor } from \"~/Routes/index.js\";\nimport {\n CmsEntryFormScheduleMenuItemAction,\n CmsEntryFormTooltipButton,\n ContentEntryFormWorkflow\n} from \"~/Components/ContentEntryForm/index.js\";\nimport { CmsEntriesWorkflowStateListFooterMenu } from \"~/Components/CmsEntriesWorkflowStateList/index.js\";\nimport { ListOpenInNewWindow } from \"~/Components/OptionItem/OpenInNewWindow.js\";\nimport { CmsEntryFormCreateNewRevisionButton } from \"~/Components/ContentEntryForm/CmsEntryFormCreateNewRevisionButton.js\";\nimport { CmsWorkflowsFeature } from \"~/presentation/feature.js\";\nimport { CmsWorkflowsCacheFeature } from \"~/features/feature.js\";\nimport { CmsWorkflowsEditorPresenterFeature } from \"~/presentation/cmsWorkflowsEditor/feature.js\";\n\nexport const CmsWorkflows = () => {\n const featureFlags = useFeatureFlags();\n\n if (!featureFlags.isEnabled(\"advancedPublishingWorkflow\")) {\n return null;\n }\n\n return (\n <>\n <RegisterFeature feature={CmsWorkflowsFeature} />\n <RegisterFeature feature={CmsWorkflowsCacheFeature} />\n <RegisterFeature feature={CmsWorkflowsEditorPresenterFeature} />\n <ListOpenInNewWindow />\n <CmsEntriesWorkflowStateListFooterMenu />\n <CmsWorkflowsEditor />\n <ContentEntryFormWorkflow />\n <CmsEntryFormTooltipButton />\n <CmsEntryFormScheduleMenuItemAction />\n <CmsEntryFormCreateNewRevisionButton />\n </>\n );\n};\n"],"names":["CmsWorkflows","featureFlags","useFeatureFlags","RegisterFeature","CmsWorkflowsFeature","CmsWorkflowsCacheFeature","CmsWorkflowsEditorPresenterFeature","ListOpenInNewWindow","CmsEntriesWorkflowStateListFooterMenu","CmsWorkflowsEditor","ContentEntryFormWorkflow","CmsEntryFormTooltipButton","CmsEntryFormScheduleMenuItemAction","CmsEntryFormCreateNewRevisionButton"],"mappings":";;;;;;;;;;AAeO,MAAMA,eAAe;IACxB,MAAMC,eAAeC;IAErB,IAAI,CAACD,aAAa,SAAS,CAAC,+BACxB,OAAO;IAGX,OAAO,WAAP,GACI,wDACI,oBAACE,iBAAeA;QAAC,SAASC;sBAC1B,oBAACD,iBAAeA;QAAC,SAASE;sBAC1B,oBAACF,iBAAeA;QAAC,SAASG;sBAC1B,oBAACC,qBAAmBA,OAAAA,WAAAA,GACpB,oBAACC,uCAAqCA,OAAAA,WAAAA,GACtC,oBAACC,oBAAkBA,OAAAA,WAAAA,GACnB,oBAACC,0BAAwBA,OAAAA,WAAAA,GACzB,oBAACC,2BAAyBA,OAAAA,WAAAA,GAC1B,oBAACC,oCAAkCA,OAAAA,WAAAA,GACnC,oBAACC,qCAAmCA;AAGhD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webiny/app-headless-cms-workflows",
|
|
3
|
-
"version": "0.0.0-unstable.
|
|
3
|
+
"version": "0.0.0-unstable.eb81deee7e",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./index.js",
|
|
@@ -13,34 +13,38 @@
|
|
|
13
13
|
"author": "Webiny Ltd",
|
|
14
14
|
"license": "MIT",
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@
|
|
17
|
-
"@
|
|
18
|
-
"@webiny/
|
|
19
|
-
"@webiny/app": "0.0.0-unstable.
|
|
20
|
-
"@webiny/app-
|
|
21
|
-
"@webiny/app-headless-cms": "0.0.0-unstable.
|
|
22
|
-
"@webiny/app-
|
|
23
|
-
"@webiny/
|
|
24
|
-
"@webiny/icons": "0.0.0-unstable.
|
|
25
|
-
"
|
|
16
|
+
"@fortawesome/react-fontawesome": "3.5.0",
|
|
17
|
+
"@webiny/admin-ui": "0.0.0-unstable.eb81deee7e",
|
|
18
|
+
"@webiny/app": "0.0.0-unstable.eb81deee7e",
|
|
19
|
+
"@webiny/app-admin": "0.0.0-unstable.eb81deee7e",
|
|
20
|
+
"@webiny/app-headless-cms": "0.0.0-unstable.eb81deee7e",
|
|
21
|
+
"@webiny/app-headless-cms-common": "0.0.0-unstable.eb81deee7e",
|
|
22
|
+
"@webiny/app-workflows": "0.0.0-unstable.eb81deee7e",
|
|
23
|
+
"@webiny/feature": "0.0.0-unstable.eb81deee7e",
|
|
24
|
+
"@webiny/icons": "0.0.0-unstable.eb81deee7e",
|
|
25
|
+
"@webiny/utils": "0.0.0-unstable.eb81deee7e",
|
|
26
|
+
"mobx": "7.0.3",
|
|
27
|
+
"mobx-react-lite": "5.0.3",
|
|
26
28
|
"react": "18.3.1",
|
|
27
29
|
"react-dom": "18.3.1",
|
|
28
30
|
"react-helmet": "6.1.0"
|
|
29
31
|
},
|
|
30
32
|
"devDependencies": {
|
|
31
|
-
"@types/react": "18.3.
|
|
32
|
-
"@webiny/build-tools": "0.0.0-unstable.
|
|
33
|
+
"@types/react": "18.3.31",
|
|
34
|
+
"@webiny/build-tools": "0.0.0-unstable.eb81deee7e",
|
|
33
35
|
"rimraf": "6.1.3",
|
|
34
|
-
"typescript": "
|
|
36
|
+
"typescript": "7.0.2"
|
|
35
37
|
},
|
|
36
38
|
"publishConfig": {
|
|
37
|
-
"access": "public"
|
|
38
|
-
"directory": "dist"
|
|
39
|
+
"access": "public"
|
|
39
40
|
},
|
|
40
41
|
"svgo": {
|
|
41
42
|
"plugins": {
|
|
42
43
|
"removeViewBox": false
|
|
43
44
|
}
|
|
44
45
|
},
|
|
45
|
-
"gitHead": "
|
|
46
|
+
"gitHead": "b8aec8a1be3f25c3b428b357fe1e352c7cbff9ae",
|
|
47
|
+
"webiny": {
|
|
48
|
+
"publishFrom": "dist"
|
|
49
|
+
}
|
|
46
50
|
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export declare const CmsWorkflowsEditorMenu: () => React.JSX.Element | null;
|
|
3
|
+
export declare const CmsWorkflowsEditorView: (() => React.JSX.Element | null) & React.NamedExoticComponent<unknown> & {
|
|
4
|
+
readonly type: () => React.JSX.Element | null;
|
|
5
|
+
};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import react, { useCallback, useEffect, useMemo } from "react";
|
|
2
|
+
import { observer } from "mobx-react-lite";
|
|
3
|
+
import { AdminConfig, useRoute, useRouter } from "@webiny/app-admin";
|
|
4
|
+
import { useFeature } from "@webiny/app";
|
|
5
|
+
import { Routes } from "../routes.js";
|
|
6
|
+
import { Components } from "@webiny/app-workflows";
|
|
7
|
+
import { Icon, Loader } from "@webiny/admin-ui";
|
|
8
|
+
import { usePermission } from "@webiny/app-headless-cms/admin/hooks/index.js";
|
|
9
|
+
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
10
|
+
import { normalizeIcon } from "@webiny/app-headless-cms/utils/normalizeIcon.js";
|
|
11
|
+
import { CmsWorkflowsEditorPresenterFeature } from "./cmsWorkflowsEditor/feature.js";
|
|
12
|
+
const { Admin: { WorkflowsEditor: WorkflowsEditor }, Permissions: { HasWorkflowsEditorPermission: HasWorkflowsEditorPermission } } = Components;
|
|
13
|
+
const { Menu: Menu } = AdminConfig;
|
|
14
|
+
const CmsWorkflowsEditorMenu = ()=>{
|
|
15
|
+
const router = useRouter();
|
|
16
|
+
const { canCreateContentModels } = usePermission();
|
|
17
|
+
if (!canCreateContentModels) return null;
|
|
18
|
+
return /*#__PURE__*/ react.createElement(HasWorkflowsEditorPermission, null, /*#__PURE__*/ react.createElement(Menu, {
|
|
19
|
+
name: "headlessCMS.contentModels.workflows",
|
|
20
|
+
parent: "headlessCMS",
|
|
21
|
+
element: /*#__PURE__*/ react.createElement(Menu.Link, {
|
|
22
|
+
pinnable: true,
|
|
23
|
+
text: "Workflows",
|
|
24
|
+
to: router.getLink(Routes.ContentModels.Workflows)
|
|
25
|
+
})
|
|
26
|
+
}));
|
|
27
|
+
};
|
|
28
|
+
const ModelIcon = ({ app })=>{
|
|
29
|
+
if (!app.icon) return null;
|
|
30
|
+
const icon = normalizeIcon(app.icon);
|
|
31
|
+
if (!icon) return null;
|
|
32
|
+
return /*#__PURE__*/ react.createElement(Icon, {
|
|
33
|
+
icon: /*#__PURE__*/ react.createElement(FontAwesomeIcon, {
|
|
34
|
+
icon: icon
|
|
35
|
+
}),
|
|
36
|
+
label: app.name,
|
|
37
|
+
size: "sm",
|
|
38
|
+
className: "text-neutral-strong"
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
const CmsWorkflowsEditorView = observer(()=>{
|
|
42
|
+
const { route } = useRoute(Routes.ContentModels.Workflows);
|
|
43
|
+
const { presenter } = useFeature(CmsWorkflowsEditorPresenterFeature);
|
|
44
|
+
const { canCreateContentModels } = usePermission();
|
|
45
|
+
const { goToRoute } = useRouter();
|
|
46
|
+
useEffect(()=>{
|
|
47
|
+
presenter.init();
|
|
48
|
+
}, [
|
|
49
|
+
presenter
|
|
50
|
+
]);
|
|
51
|
+
const { loading, apps: workflowApps } = presenter.vm;
|
|
52
|
+
const apps = useMemo(()=>workflowApps.map((app)=>({
|
|
53
|
+
id: app.id,
|
|
54
|
+
name: app.name,
|
|
55
|
+
icon: /*#__PURE__*/ react.createElement(ModelIcon, {
|
|
56
|
+
app: app
|
|
57
|
+
})
|
|
58
|
+
})), [
|
|
59
|
+
workflowApps
|
|
60
|
+
]);
|
|
61
|
+
const app = useMemo(()=>{
|
|
62
|
+
if (!route.params.app) return apps.find(()=>true);
|
|
63
|
+
return apps.find((a)=>a.id === route.params.app) || null;
|
|
64
|
+
}, [
|
|
65
|
+
route.params.app,
|
|
66
|
+
apps
|
|
67
|
+
]);
|
|
68
|
+
const onAppClick = useCallback((id)=>{
|
|
69
|
+
goToRoute(Routes.ContentModels.Workflows, {
|
|
70
|
+
app: id
|
|
71
|
+
});
|
|
72
|
+
}, [
|
|
73
|
+
apps
|
|
74
|
+
]);
|
|
75
|
+
if (!canCreateContentModels) return null;
|
|
76
|
+
if (loading) return /*#__PURE__*/ react.createElement(Loader, {
|
|
77
|
+
size: "lg",
|
|
78
|
+
variant: "accent",
|
|
79
|
+
indeterminate: true,
|
|
80
|
+
text: "Loading..."
|
|
81
|
+
});
|
|
82
|
+
return /*#__PURE__*/ react.createElement(WorkflowsEditor, {
|
|
83
|
+
apps: apps,
|
|
84
|
+
onAppClick: onAppClick,
|
|
85
|
+
app: app?.id
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
export { CmsWorkflowsEditorMenu, CmsWorkflowsEditorView };
|
|
89
|
+
|
|
90
|
+
//# sourceMappingURL=CmsWorkflowsEditorView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation/CmsWorkflowsEditorView.js","sources":["../../src/presentation/CmsWorkflowsEditorView.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { AdminConfig, useRoute, useRouter } from \"@webiny/app-admin\";\nimport { useFeature } from \"@webiny/app\";\nimport { Routes } from \"~/routes.js\";\nimport type { IWorkflowApplication } from \"@webiny/app-workflows\";\nimport { Components } from \"@webiny/app-workflows\";\nimport { Icon, Loader } from \"@webiny/admin-ui\";\nimport { usePermission } from \"@webiny/app-headless-cms/admin/hooks/index.js\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { normalizeIcon } from \"@webiny/app-headless-cms/utils/normalizeIcon.js\";\nimport { CmsWorkflowsEditorPresenterFeature } from \"~/presentation/cmsWorkflowsEditor/feature.js\";\nimport type { WorkflowApp } from \"~/presentation/cmsWorkflowsEditor/abstractions.js\";\n\nconst {\n Admin: { WorkflowsEditor },\n Permissions: { HasWorkflowsEditorPermission }\n} = Components;\n\nconst { Menu } = AdminConfig;\n\nexport const CmsWorkflowsEditorMenu = () => {\n const router = useRouter();\n const { canCreateContentModels } = usePermission();\n\n if (!canCreateContentModels) {\n return null;\n }\n\n return (\n <HasWorkflowsEditorPermission>\n <Menu\n name={\"headlessCMS.contentModels.workflows\"}\n parent={\"headlessCMS\"}\n element={\n <Menu.Link\n pinnable={true}\n text={\"Workflows\"}\n to={router.getLink(Routes.ContentModels.Workflows)}\n />\n }\n />\n </HasWorkflowsEditorPermission>\n );\n};\n\nconst ModelIcon = ({ app }: { app: WorkflowApp }) => {\n if (!app.icon) {\n return null;\n }\n\n const icon = normalizeIcon(app.icon);\n if (!icon) {\n return null;\n }\n\n return (\n <Icon\n icon={<FontAwesomeIcon icon={icon} />}\n label={app.name}\n size={\"sm\"}\n className={\"text-neutral-strong\"}\n />\n );\n};\n\nexport const CmsWorkflowsEditorView = observer(() => {\n const { route } = useRoute(Routes.ContentModels.Workflows);\n const { presenter } = useFeature(CmsWorkflowsEditorPresenterFeature);\n const { canCreateContentModels } = usePermission();\n const { goToRoute } = useRouter();\n\n useEffect(() => {\n presenter.init();\n }, [presenter]);\n\n const { loading, apps: workflowApps } = presenter.vm;\n\n const apps = useMemo<IWorkflowApplication[]>(() => {\n return workflowApps.map(app => ({\n id: app.id,\n name: app.name,\n icon: <ModelIcon app={app} />\n }));\n }, [workflowApps]);\n\n const app = useMemo(() => {\n if (!route.params.app) {\n // Find first app\n return apps.find(() => true);\n }\n return apps.find(a => a.id === route.params.app) || null;\n }, [route.params.app, apps]);\n\n const onAppClick = useCallback(\n (id: string) => {\n goToRoute(Routes.ContentModels.Workflows, {\n app: id\n });\n },\n [apps]\n );\n\n if (!canCreateContentModels) {\n return null;\n } else if (loading) {\n return <Loader size=\"lg\" variant=\"accent\" indeterminate={true} text=\"Loading...\" />;\n }\n\n return <WorkflowsEditor apps={apps} onAppClick={onAppClick} app={app?.id} />;\n});\n"],"names":["WorkflowsEditor","HasWorkflowsEditorPermission","Components","Menu","AdminConfig","CmsWorkflowsEditorMenu","router","useRouter","canCreateContentModels","usePermission","Routes","ModelIcon","app","icon","normalizeIcon","Icon","FontAwesomeIcon","CmsWorkflowsEditorView","observer","route","useRoute","presenter","useFeature","CmsWorkflowsEditorPresenterFeature","goToRoute","useEffect","loading","workflowApps","apps","useMemo","a","onAppClick","useCallback","id","Loader"],"mappings":";;;;;;;;;;;AAcA,MAAM,EACF,OAAO,EAAEA,iBAAAA,eAAe,EAAE,EAC1B,aAAa,EAAEC,8BAAAA,4BAA4B,EAAE,EAChD,GAAGC;AAEJ,MAAM,EAAEC,MAAAA,IAAI,EAAE,GAAGC;AAEV,MAAMC,yBAAyB;IAClC,MAAMC,SAASC;IACf,MAAM,EAAEC,sBAAsB,EAAE,GAAGC;IAEnC,IAAI,CAACD,wBACD,OAAO;IAGX,OAAO,WAAP,GACI,oBAACP,8BAA4BA,MAAAA,WAAAA,GACzB,oBAACE,MAAIA;QACD,MAAM;QACN,QAAQ;QACR,uBACI,oBAACA,KAAK,IAAI;YACN,UAAU;YACV,MAAM;YACN,IAAIG,OAAO,OAAO,CAACI,OAAO,aAAa,CAAC,SAAS;;;AAMzE;AAEA,MAAMC,YAAY,CAAC,EAAEC,GAAG,EAAwB;IAC5C,IAAI,CAACA,IAAI,IAAI,EACT,OAAO;IAGX,MAAMC,OAAOC,cAAcF,IAAI,IAAI;IACnC,IAAI,CAACC,MACD,OAAO;IAGX,OAAO,WAAP,GACI,oBAACE,MAAIA;QACD,oBAAM,oBAACC,iBAAeA;YAAC,MAAMH;;QAC7B,OAAOD,IAAI,IAAI;QACf,MAAM;QACN,WAAW;;AAGvB;AAEO,MAAMK,yBAAyBC,SAAS;IAC3C,MAAM,EAAEC,KAAK,EAAE,GAAGC,SAASV,OAAO,aAAa,CAAC,SAAS;IACzD,MAAM,EAAEW,SAAS,EAAE,GAAGC,WAAWC;IACjC,MAAM,EAAEf,sBAAsB,EAAE,GAAGC;IACnC,MAAM,EAAEe,SAAS,EAAE,GAAGjB;IAEtBkB,UAAU;QACNJ,UAAU,IAAI;IAClB,GAAG;QAACA;KAAU;IAEd,MAAM,EAAEK,OAAO,EAAE,MAAMC,YAAY,EAAE,GAAGN,UAAU,EAAE;IAEpD,MAAMO,OAAOC,QAAgC,IAClCF,aAAa,GAAG,CAACf,CAAAA,MAAQ;gBAC5B,IAAIA,IAAI,EAAE;gBACV,MAAMA,IAAI,IAAI;gBACd,MAAM,WAAN,GAAM,oBAACD,WAASA;oBAAC,KAAKC;;YAC1B,KACD;QAACe;KAAa;IAEjB,MAAMf,MAAMiB,QAAQ;QAChB,IAAI,CAACV,MAAM,MAAM,CAAC,GAAG,EAEjB,OAAOS,KAAK,IAAI,CAAC,IAAM;QAE3B,OAAOA,KAAK,IAAI,CAACE,CAAAA,IAAKA,EAAE,EAAE,KAAKX,MAAM,MAAM,CAAC,GAAG,KAAK;IACxD,GAAG;QAACA,MAAM,MAAM,CAAC,GAAG;QAAES;KAAK;IAE3B,MAAMG,aAAaC,YACf,CAACC;QACGT,UAAUd,OAAO,aAAa,CAAC,SAAS,EAAE;YACtC,KAAKuB;QACT;IACJ,GACA;QAACL;KAAK;IAGV,IAAI,CAACpB,wBACD,OAAO;IACJ,IAAIkB,SACP,OAAO,WAAP,GAAO,oBAACQ,QAAMA;QAAC,MAAK;QAAK,SAAQ;QAAS,eAAe;QAAM,MAAK;;IAGxE,OAAO,WAAP,GAAO,oBAAClC,iBAAeA;QAAC,MAAM4B;QAAM,YAAYG;QAAY,KAAKnB,KAAK;;AAC1E"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type IContentEntryFormPresenter, type IContentEntryFormViewModel } from "@webiny/app-headless-cms/presentation/contentEntries/form/abstractions.js";
|
|
2
|
+
import { CmsModelContext } from "@webiny/app-headless-cms/features/contentEntry/abstractions.js";
|
|
3
|
+
import { WorkflowStatePresenter } from "@webiny/app-workflows/presentation/workflowState/abstractions.js";
|
|
4
|
+
declare class ContentEntryFormPresenterWithWorkflow implements IContentEntryFormPresenter {
|
|
5
|
+
private workflowPresenter;
|
|
6
|
+
private modelAccessor;
|
|
7
|
+
private original;
|
|
8
|
+
constructor(workflowPresenter: WorkflowStatePresenter.Interface, modelAccessor: CmsModelContext.Interface, original: IContentEntryFormPresenter);
|
|
9
|
+
get vm(): IContentEntryFormViewModel;
|
|
10
|
+
loadRevision(id: string): Promise<void>;
|
|
11
|
+
saveRevision(options?: {
|
|
12
|
+
skipValidation?: boolean;
|
|
13
|
+
}): Promise<boolean>;
|
|
14
|
+
publishRevision(): Promise<boolean>;
|
|
15
|
+
unpublishRevision(): Promise<boolean>;
|
|
16
|
+
deleteEntry(): Promise<boolean>;
|
|
17
|
+
setFolderId(folderId: string | null): void;
|
|
18
|
+
newEntry(initialValues?: Record<string, unknown>): void;
|
|
19
|
+
patchEntryMeta(...args: Parameters<IContentEntryFormPresenter["patchEntryMeta"]>): void;
|
|
20
|
+
reset(): void;
|
|
21
|
+
}
|
|
22
|
+
export declare const ContentEntryFormPresenterWorkflowDecorator: typeof ContentEntryFormPresenterWithWorkflow & {
|
|
23
|
+
__abstraction: import("@webiny/di").Abstraction<IContentEntryFormPresenter>;
|
|
24
|
+
};
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { computed, makeAutoObservable } from "mobx";
|
|
2
|
+
import { ContentEntryFormPresenter } from "@webiny/app-headless-cms/presentation/contentEntries/form/abstractions.js";
|
|
3
|
+
import { CmsModelContext } from "@webiny/app-headless-cms/features/contentEntry/abstractions.js";
|
|
4
|
+
import { WorkflowStatePresenter } from "@webiny/app-workflows/presentation/workflowState/abstractions.js";
|
|
5
|
+
import { CMS_MODEL_SINGLETON_TAG } from "@webiny/app-headless-cms-common";
|
|
6
|
+
class ContentEntryFormPresenterWithWorkflow {
|
|
7
|
+
constructor(workflowPresenter, modelAccessor, original){
|
|
8
|
+
this.workflowPresenter = workflowPresenter;
|
|
9
|
+
this.modelAccessor = modelAccessor;
|
|
10
|
+
this.original = original;
|
|
11
|
+
makeAutoObservable(this, {
|
|
12
|
+
workflowPresenter: false,
|
|
13
|
+
modelAccessor: false,
|
|
14
|
+
original: false,
|
|
15
|
+
vm: computed
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
get vm() {
|
|
19
|
+
const base = this.original.vm;
|
|
20
|
+
const wfVm = this.workflowPresenter.vm;
|
|
21
|
+
return {
|
|
22
|
+
...base,
|
|
23
|
+
canSave: base.canSave && !wfVm.hasState,
|
|
24
|
+
canPublish: base.canPublish && (!wfVm.hasWorkflow || wfVm.isApproved)
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
async loadRevision(id) {
|
|
28
|
+
await this.original.loadRevision(id);
|
|
29
|
+
const model = this.modelAccessor.getModel();
|
|
30
|
+
if (model.tags.includes(CMS_MODEL_SINGLETON_TAG)) return;
|
|
31
|
+
const title = `${model.name}: ${this.original.vm.entry?.meta?.title || "unknown"}`;
|
|
32
|
+
await this.workflowPresenter.init(`cms.${model.modelId}`, id, title);
|
|
33
|
+
}
|
|
34
|
+
async saveRevision(options) {
|
|
35
|
+
if (this.workflowPresenter.vm.hasState) return false;
|
|
36
|
+
return this.original.saveRevision(options);
|
|
37
|
+
}
|
|
38
|
+
publishRevision() {
|
|
39
|
+
return this.original.publishRevision();
|
|
40
|
+
}
|
|
41
|
+
unpublishRevision() {
|
|
42
|
+
return this.original.unpublishRevision();
|
|
43
|
+
}
|
|
44
|
+
deleteEntry() {
|
|
45
|
+
return this.original.deleteEntry();
|
|
46
|
+
}
|
|
47
|
+
setFolderId(folderId) {
|
|
48
|
+
this.original.setFolderId(folderId);
|
|
49
|
+
}
|
|
50
|
+
newEntry(initialValues) {
|
|
51
|
+
return this.original.newEntry(initialValues);
|
|
52
|
+
}
|
|
53
|
+
patchEntryMeta(...args) {
|
|
54
|
+
this.original.patchEntryMeta(...args);
|
|
55
|
+
}
|
|
56
|
+
reset() {
|
|
57
|
+
this.original.reset();
|
|
58
|
+
this.workflowPresenter.dispose();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const ContentEntryFormPresenterWorkflowDecorator = ContentEntryFormPresenter.createDecorator({
|
|
62
|
+
decorator: ContentEntryFormPresenterWithWorkflow,
|
|
63
|
+
dependencies: [
|
|
64
|
+
WorkflowStatePresenter,
|
|
65
|
+
CmsModelContext
|
|
66
|
+
]
|
|
67
|
+
});
|
|
68
|
+
export { ContentEntryFormPresenterWorkflowDecorator };
|
|
69
|
+
|
|
70
|
+
//# sourceMappingURL=ContentEntryFormPresenterWorkflowDecorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation/ContentEntryFormPresenterWorkflowDecorator.js","sources":["../../src/presentation/ContentEntryFormPresenterWorkflowDecorator.ts"],"sourcesContent":["import { computed, makeAutoObservable } from \"mobx\";\nimport {\n ContentEntryFormPresenter,\n type IContentEntryFormPresenter,\n type IContentEntryFormViewModel\n} from \"@webiny/app-headless-cms/presentation/contentEntries/form/abstractions.js\";\nimport { CmsModelContext } from \"@webiny/app-headless-cms/features/contentEntry/abstractions.js\";\nimport { WorkflowStatePresenter } from \"@webiny/app-workflows/presentation/workflowState/abstractions.js\";\nimport { CMS_MODEL_SINGLETON_TAG } from \"@webiny/app-headless-cms-common\";\n\nclass ContentEntryFormPresenterWithWorkflow implements IContentEntryFormPresenter {\n constructor(\n private workflowPresenter: WorkflowStatePresenter.Interface,\n private modelAccessor: CmsModelContext.Interface,\n private original: IContentEntryFormPresenter\n ) {\n makeAutoObservable<\n ContentEntryFormPresenterWithWorkflow,\n \"workflowPresenter\" | \"modelAccessor\" | \"original\"\n >(this, {\n workflowPresenter: false,\n modelAccessor: false,\n original: false,\n vm: computed\n });\n }\n\n get vm(): IContentEntryFormViewModel {\n const base = this.original.vm;\n const wfVm = this.workflowPresenter.vm;\n\n return {\n ...base,\n canSave: base.canSave && !wfVm.hasState,\n canPublish: base.canPublish && (!wfVm.hasWorkflow || wfVm.isApproved)\n };\n }\n\n async loadRevision(id: string): Promise<void> {\n await this.original.loadRevision(id);\n\n const model = this.modelAccessor.getModel();\n if (model.tags.includes(CMS_MODEL_SINGLETON_TAG)) {\n return;\n }\n\n const title = `${model.name}: ${this.original.vm.entry?.meta?.title || \"unknown\"}`;\n await this.workflowPresenter.init(`cms.${model.modelId}`, id, title);\n }\n\n async saveRevision(options?: { skipValidation?: boolean }): Promise<boolean> {\n if (this.workflowPresenter.vm.hasState) {\n return false;\n }\n return this.original.saveRevision(options);\n }\n\n publishRevision(): Promise<boolean> {\n return this.original.publishRevision();\n }\n\n unpublishRevision(): Promise<boolean> {\n return this.original.unpublishRevision();\n }\n\n deleteEntry(): Promise<boolean> {\n return this.original.deleteEntry();\n }\n\n setFolderId(folderId: string | null): void {\n this.original.setFolderId(folderId);\n }\n\n newEntry(initialValues?: Record<string, unknown>): void {\n return this.original.newEntry(initialValues);\n }\n\n patchEntryMeta(...args: Parameters<IContentEntryFormPresenter[\"patchEntryMeta\"]>): void {\n this.original.patchEntryMeta(...args);\n }\n\n reset(): void {\n this.original.reset();\n this.workflowPresenter.dispose();\n }\n}\n\nexport const ContentEntryFormPresenterWorkflowDecorator = ContentEntryFormPresenter.createDecorator(\n {\n decorator: ContentEntryFormPresenterWithWorkflow,\n dependencies: [WorkflowStatePresenter, CmsModelContext]\n }\n);\n"],"names":["ContentEntryFormPresenterWithWorkflow","workflowPresenter","modelAccessor","original","makeAutoObservable","computed","base","wfVm","id","model","CMS_MODEL_SINGLETON_TAG","title","options","folderId","initialValues","args","ContentEntryFormPresenterWorkflowDecorator","ContentEntryFormPresenter","WorkflowStatePresenter","CmsModelContext"],"mappings":";;;;;AAUA,MAAMA;IACF,YACYC,iBAAmD,EACnDC,aAAwC,EACxCC,QAAoC,CAC9C;aAHUF,iBAAiB,GAAjBA;aACAC,aAAa,GAAbA;aACAC,QAAQ,GAARA;QAERC,mBAGE,IAAI,EAAE;YACJ,mBAAmB;YACnB,eAAe;YACf,UAAU;YACV,IAAIC;QACR;IACJ;IAEA,IAAI,KAAiC;QACjC,MAAMC,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE;QAC7B,MAAMC,OAAO,IAAI,CAAC,iBAAiB,CAAC,EAAE;QAEtC,OAAO;YACH,GAAGD,IAAI;YACP,SAASA,KAAK,OAAO,IAAI,CAACC,KAAK,QAAQ;YACvC,YAAYD,KAAK,UAAU,IAAK,EAACC,KAAK,WAAW,IAAIA,KAAK,UAAS;QACvE;IACJ;IAEA,MAAM,aAAaC,EAAU,EAAiB;QAC1C,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAACA;QAEjC,MAAMC,QAAQ,IAAI,CAAC,aAAa,CAAC,QAAQ;QACzC,IAAIA,MAAM,IAAI,CAAC,QAAQ,CAACC,0BACpB;QAGJ,MAAMC,QAAQ,GAAGF,MAAM,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,SAAS,WAAW;QAClF,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAEA,MAAM,OAAO,EAAE,EAAED,IAAIG;IAClE;IAEA,MAAM,aAAaC,OAAsC,EAAoB;QACzE,IAAI,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAClC,OAAO;QAEX,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,CAACA;IACtC;IAEA,kBAAoC;QAChC,OAAO,IAAI,CAAC,QAAQ,CAAC,eAAe;IACxC;IAEA,oBAAsC;QAClC,OAAO,IAAI,CAAC,QAAQ,CAAC,iBAAiB;IAC1C;IAEA,cAAgC;QAC5B,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW;IACpC;IAEA,YAAYC,QAAuB,EAAQ;QACvC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAACA;IAC9B;IAEA,SAASC,aAAuC,EAAQ;QACpD,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAACA;IAClC;IAEA,eAAe,GAAGC,IAA8D,EAAQ;QACpF,IAAI,CAAC,QAAQ,CAAC,cAAc,IAAIA;IACpC;IAEA,QAAc;QACV,IAAI,CAAC,QAAQ,CAAC,KAAK;QACnB,IAAI,CAAC,iBAAiB,CAAC,OAAO;IAClC;AACJ;AAEO,MAAMC,6CAA6CC,0BAA0B,eAAe,CAC/F;IACI,WAAWjB;IACX,cAAc;QAACkB;QAAwBC;KAAgB;AAC3D"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { TableRowMapper } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
|
|
2
|
+
import type { CmsContentEntry } from "@webiny/app-headless-cms-common/types/index.js";
|
|
3
|
+
declare class TableRowMapperWithWorkflows implements TableRowMapper.Interface {
|
|
4
|
+
private decoratee;
|
|
5
|
+
constructor(decoratee: TableRowMapper.Interface);
|
|
6
|
+
fromEntry(entry: CmsContentEntry): TableRowMapper.EntryTableRow;
|
|
7
|
+
}
|
|
8
|
+
export declare const TableRowMapperWorkflowDecorator: typeof TableRowMapperWithWorkflows & {
|
|
9
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/app-headless-cms/presentation/contentEntries/views/Table/abstractions").ITableRowMapper>;
|
|
10
|
+
};
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { TableRowMapper } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
|
|
2
|
+
import { WorkflowStateValue } from "@webiny/app-workflows/types.js";
|
|
3
|
+
class TableRowMapperWithWorkflows {
|
|
4
|
+
constructor(decoratee){
|
|
5
|
+
this.decoratee = decoratee;
|
|
6
|
+
}
|
|
7
|
+
fromEntry(entry) {
|
|
8
|
+
const row = this.decoratee.fromEntry(entry);
|
|
9
|
+
const meta = entry.meta;
|
|
10
|
+
const system = meta.system;
|
|
11
|
+
const workflowState = system?.workflow?.state;
|
|
12
|
+
if (workflowState && workflowState !== WorkflowStateValue.approved) return {
|
|
13
|
+
...row,
|
|
14
|
+
$selectable: false
|
|
15
|
+
};
|
|
16
|
+
return row;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const TableRowMapperWorkflowDecorator = TableRowMapper.createDecorator({
|
|
20
|
+
decorator: TableRowMapperWithWorkflows,
|
|
21
|
+
dependencies: []
|
|
22
|
+
});
|
|
23
|
+
export { TableRowMapperWorkflowDecorator };
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=TableRowMapperWorkflowDecorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation/TableRowMapperWorkflowDecorator.js","sources":["../../src/presentation/TableRowMapperWorkflowDecorator.ts"],"sourcesContent":["import { TableRowMapper } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport type { CmsContentEntry } from \"@webiny/app-headless-cms-common/types/index.js\";\nimport { WorkflowStateValue } from \"@webiny/app-workflows/types.js\";\nimport type { ICmsEntrySystemWithWorkflow } from \"~/types.js\";\n\nclass TableRowMapperWithWorkflows implements TableRowMapper.Interface {\n constructor(private decoratee: TableRowMapper.Interface) {}\n\n fromEntry(entry: CmsContentEntry): TableRowMapper.EntryTableRow {\n const row = this.decoratee.fromEntry(entry);\n\n const meta = entry.meta as Record<string, unknown>;\n const system = meta.system as ICmsEntrySystemWithWorkflow | undefined;\n const workflowState = system?.workflow?.state;\n if (workflowState && workflowState !== WorkflowStateValue.approved) {\n return { ...row, $selectable: false };\n }\n\n return row;\n }\n}\n\nexport const TableRowMapperWorkflowDecorator = TableRowMapper.createDecorator({\n decorator: TableRowMapperWithWorkflows,\n dependencies: []\n});\n"],"names":["TableRowMapperWithWorkflows","decoratee","entry","row","meta","system","workflowState","WorkflowStateValue","TableRowMapperWorkflowDecorator","TableRowMapper"],"mappings":";;AAKA,MAAMA;IACF,YAAoBC,SAAmC,CAAE;aAArCA,SAAS,GAATA;IAAsC;IAE1D,UAAUC,KAAsB,EAAgC;QAC5D,MAAMC,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAACD;QAErC,MAAME,OAAOF,MAAM,IAAI;QACvB,MAAMG,SAASD,KAAK,MAAM;QAC1B,MAAME,gBAAgBD,QAAQ,UAAU;QACxC,IAAIC,iBAAiBA,kBAAkBC,mBAAmB,QAAQ,EAC9D,OAAO;YAAE,GAAGJ,GAAG;YAAE,aAAa;QAAM;QAGxC,OAAOA;IACX;AACJ;AAEO,MAAMK,kCAAkCC,eAAe,eAAe,CAAC;IAC1E,WAAWT;IACX,cAAc,EAAE;AACpB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { GetEntryGraphQLFieldSelection } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
|
|
2
|
+
declare class WorkflowStateGetEntryFieldSelectionImpl implements GetEntryGraphQLFieldSelection.Interface {
|
|
3
|
+
getSelection(): string[];
|
|
4
|
+
}
|
|
5
|
+
export declare const WorkflowStateGetEntryFieldSelection: typeof WorkflowStateGetEntryFieldSelectionImpl & {
|
|
6
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/app-headless-cms/features/contentEntry/getEntry/abstractions").IGetEntryGraphQLFieldSelection>;
|
|
7
|
+
};
|
|
8
|
+
export {};
|