@webiny/app-headless-cms-workflows 0.0.0-unstable.61c048f412
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.d.ts +2 -0
- package/Components/CmsEntriesWorkflowStateList/CmsEntriesWorkflowStateListFooterMenu.js +45 -0
- package/Components/CmsEntriesWorkflowStateList/CmsEntriesWorkflowStateListFooterMenu.js.map +1 -0
- package/Components/CmsEntriesWorkflowStateList/index.d.ts +1 -0
- package/Components/CmsEntriesWorkflowStateList/index.js +3 -0
- package/Components/CmsEntriesWorkflowStateList/index.js.map +1 -0
- package/Components/CmsWorkflows/CmsWorkflowsEditorView.d.ts +3 -0
- package/Components/CmsWorkflows/CmsWorkflowsEditorView.js +128 -0
- package/Components/CmsWorkflows/CmsWorkflowsEditorView.js.map +1 -0
- package/Components/ContentEntryForm/CmsEntryFormCreateNewRevisionButton.d.ts +2 -0
- package/Components/ContentEntryForm/CmsEntryFormCreateNewRevisionButton.js +69 -0
- package/Components/ContentEntryForm/CmsEntryFormCreateNewRevisionButton.js.map +1 -0
- package/Components/ContentEntryForm/CmsEntryFormPublishButton.d.ts +2 -0
- package/Components/ContentEntryForm/CmsEntryFormPublishButton.js +38 -0
- package/Components/ContentEntryForm/CmsEntryFormPublishButton.js.map +1 -0
- package/Components/ContentEntryForm/CmsEntryFormSaveAndPublishButton.d.ts +2 -0
- package/Components/ContentEntryForm/CmsEntryFormSaveAndPublishButton.js +39 -0
- package/Components/ContentEntryForm/CmsEntryFormSaveAndPublishButton.js.map +1 -0
- package/Components/ContentEntryForm/CmsEntryFormSaveButton.d.ts +2 -0
- package/Components/ContentEntryForm/CmsEntryFormSaveButton.js +37 -0
- package/Components/ContentEntryForm/CmsEntryFormSaveButton.js.map +1 -0
- package/Components/ContentEntryForm/CmsEntryFormScheduleMenuItemAction.d.ts +5 -0
- package/Components/ContentEntryForm/CmsEntryFormScheduleMenuItemAction.js +38 -0
- package/Components/ContentEntryForm/CmsEntryFormScheduleMenuItemAction.js.map +1 -0
- package/Components/ContentEntryForm/CmsEntryFormTooltipButton.d.ts +2 -0
- package/Components/ContentEntryForm/CmsEntryFormTooltipButton.js +20 -0
- package/Components/ContentEntryForm/CmsEntryFormTooltipButton.js.map +1 -0
- package/Components/ContentEntryForm/ContentEntryFormWorkflow.d.ts +2 -0
- package/Components/ContentEntryForm/ContentEntryFormWorkflow.js +73 -0
- package/Components/ContentEntryForm/ContentEntryFormWorkflow.js.map +1 -0
- package/Components/ContentEntryForm/ContentEntryWorkflow.d.ts +2 -0
- package/Components/ContentEntryForm/ContentEntryWorkflow.js +35 -0
- package/Components/ContentEntryForm/ContentEntryWorkflow.js.map +1 -0
- package/Components/ContentEntryForm/index.d.ts +7 -0
- package/Components/ContentEntryForm/index.js +9 -0
- package/Components/ContentEntryForm/index.js.map +1 -0
- package/Components/OptionItem/OpenInNewWindow.d.ts +2 -0
- package/Components/OptionItem/OpenInNewWindow.js +44 -0
- package/Components/OptionItem/OpenInNewWindow.js.map +1 -0
- package/LICENSE +21 -0
- package/README.md +11 -0
- package/Routes/CmsWorkflowsEditor.d.ts +2 -0
- package/Routes/CmsWorkflowsEditor.js +35 -0
- package/Routes/CmsWorkflowsEditor.js.map +1 -0
- package/Routes/index.d.ts +1 -0
- package/Routes/index.js +3 -0
- package/Routes/index.js.map +1 -0
- package/index.d.ts +2 -0
- package/index.js +12 -0
- package/index.js.map +1 -0
- package/package.json +43 -0
- package/routes.d.ts +11 -0
- package/routes.js +22 -0
- package/routes.js.map +1 -0
- package/utils/appName.d.ts +4 -0
- package/utils/appName.js +16 -0
- package/utils/appName.js.map +1 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Components } from "@webiny/app-headless-cms";
|
|
3
|
+
import { Sidebar } from "@webiny/admin-ui";
|
|
4
|
+
import { ReactComponent as WorkflowStateListIcon } from "@webiny/icons/flowchart.svg";
|
|
5
|
+
import { Components as WorkflowsComponents } from "@webiny/app-workflows";
|
|
6
|
+
import { useContentEntries } from "@webiny/app-headless-cms/admin/views/contentEntries/hooks/index.js";
|
|
7
|
+
import { IsModelPublishable } from "@webiny/app-headless-cms/exports/admin/cms.js";
|
|
8
|
+
import { createAppName } from "../../utils/appName.js";
|
|
9
|
+
import { useApolloClient } from "@apollo/react-hooks";
|
|
10
|
+
const {
|
|
11
|
+
Overlay: {
|
|
12
|
+
WorkflowStateListAppOverlay
|
|
13
|
+
}
|
|
14
|
+
} = WorkflowsComponents;
|
|
15
|
+
const {
|
|
16
|
+
Footer
|
|
17
|
+
} = Components.Sidebar;
|
|
18
|
+
export const CmsEntriesWorkflowStateListFooterMenu = Footer.createDecorator(Original => {
|
|
19
|
+
return function CmsEntriesWorkflowStateListFooterMenu(props) {
|
|
20
|
+
const {
|
|
21
|
+
contentModel: model
|
|
22
|
+
} = useContentEntries();
|
|
23
|
+
const client = useApolloClient();
|
|
24
|
+
const app = createAppName(model);
|
|
25
|
+
return /*#__PURE__*/React.createElement(Original, props, /*#__PURE__*/React.createElement(IsModelPublishable, null, /*#__PURE__*/React.createElement(WorkflowStateListAppOverlay, {
|
|
26
|
+
client: client,
|
|
27
|
+
app: app
|
|
28
|
+
}, ({
|
|
29
|
+
showOverlay
|
|
30
|
+
}) => {
|
|
31
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
32
|
+
className: "list-none"
|
|
33
|
+
}, /*#__PURE__*/React.createElement(Sidebar.Item, {
|
|
34
|
+
onClick: showOverlay,
|
|
35
|
+
text: "Workflow States",
|
|
36
|
+
icon: /*#__PURE__*/React.createElement(Sidebar.Item.Icon, {
|
|
37
|
+
element: /*#__PURE__*/React.createElement(WorkflowStateListIcon, null),
|
|
38
|
+
label: "Workflow States"
|
|
39
|
+
})
|
|
40
|
+
}));
|
|
41
|
+
})));
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
//# sourceMappingURL=CmsEntriesWorkflowStateListFooterMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","Components","Sidebar","ReactComponent","WorkflowStateListIcon","WorkflowsComponents","useContentEntries","IsModelPublishable","createAppName","useApolloClient","Overlay","WorkflowStateListAppOverlay","Footer","CmsEntriesWorkflowStateListFooterMenu","createDecorator","Original","props","contentModel","model","client","app","createElement","showOverlay","className","Item","onClick","text","icon","Icon","element","label"],"sources":["CmsEntriesWorkflowStateListFooterMenu.tsx"],"sourcesContent":["import React from \"react\";\nimport { Components } from \"@webiny/app-headless-cms\";\nimport { Sidebar } from \"@webiny/admin-ui\";\nimport { ReactComponent as WorkflowStateListIcon } from \"@webiny/icons/flowchart.svg\";\nimport { Components as WorkflowsComponents } from \"@webiny/app-workflows\";\nimport { useContentEntries } from \"@webiny/app-headless-cms/admin/views/contentEntries/hooks/index.js\";\nimport { IsModelPublishable } from \"@webiny/app-headless-cms/exports/admin/cms.js\";\nimport { createAppName } from \"~/utils/appName.js\";\nimport { useApolloClient } from \"@apollo/react-hooks\";\n\nconst {\n Overlay: { WorkflowStateListAppOverlay }\n} = WorkflowsComponents;\n\nconst { Footer } = Components.Sidebar;\n\nexport const CmsEntriesWorkflowStateListFooterMenu = Footer.createDecorator(Original => {\n return function CmsEntriesWorkflowStateListFooterMenu(props) {\n const { contentModel: model } = useContentEntries();\n const client = useApolloClient();\n\n const app = createAppName(model);\n\n return (\n <Original {...props}>\n <IsModelPublishable>\n <WorkflowStateListAppOverlay client={client} app={app}>\n {({ showOverlay }) => {\n return (\n <div className={\"list-none\"}>\n <Sidebar.Item\n onClick={showOverlay}\n text={\"Workflow States\"}\n icon={\n <Sidebar.Item.Icon\n element={<WorkflowStateListIcon />}\n label={\"Workflow States\"}\n />\n }\n />\n </div>\n );\n }}\n </WorkflowStateListAppOverlay>\n </IsModelPublishable>\n </Original>\n );\n };\n});\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,UAAU,QAAQ,0BAA0B;AACrD,SAASC,OAAO,QAAQ,kBAAkB;AAC1C,SAASC,cAAc,IAAIC,qBAAqB,QAAQ,6BAA6B;AACrF,SAASH,UAAU,IAAII,mBAAmB,QAAQ,uBAAuB;AACzE,SAASC,iBAAiB,QAAQ,oEAAoE;AACtG,SAASC,kBAAkB,QAAQ,+CAA+C;AAClF,SAASC,aAAa;AACtB,SAASC,eAAe,QAAQ,qBAAqB;AAErD,MAAM;EACFC,OAAO,EAAE;IAAEC;EAA4B;AAC3C,CAAC,GAAGN,mBAAmB;AAEvB,MAAM;EAAEO;AAAO,CAAC,GAAGX,UAAU,CAACC,OAAO;AAErC,OAAO,MAAMW,qCAAqC,GAAGD,MAAM,CAACE,eAAe,CAACC,QAAQ,IAAI;EACpF,OAAO,SAASF,qCAAqCA,CAACG,KAAK,EAAE;IACzD,MAAM;MAAEC,YAAY,EAAEC;IAAM,CAAC,GAAGZ,iBAAiB,CAAC,CAAC;IACnD,MAAMa,MAAM,GAAGV,eAAe,CAAC,CAAC;IAEhC,MAAMW,GAAG,GAAGZ,aAAa,CAACU,KAAK,CAAC;IAEhC,oBACIlB,KAAA,CAAAqB,aAAA,CAACN,QAAQ,EAAKC,KAAK,eACfhB,KAAA,CAAAqB,aAAA,CAACd,kBAAkB,qBACfP,KAAA,CAAAqB,aAAA,CAACV,2BAA2B;MAACQ,MAAM,EAAEA,MAAO;MAACC,GAAG,EAAEA;IAAI,GACjD,CAAC;MAAEE;IAAY,CAAC,KAAK;MAClB,oBACItB,KAAA,CAAAqB,aAAA;QAAKE,SAAS,EAAE;MAAY,gBACxBvB,KAAA,CAAAqB,aAAA,CAACnB,OAAO,CAACsB,IAAI;QACTC,OAAO,EAAEH,WAAY;QACrBI,IAAI,EAAE,iBAAkB;QACxBC,IAAI,eACA3B,KAAA,CAAAqB,aAAA,CAACnB,OAAO,CAACsB,IAAI,CAACI,IAAI;UACdC,OAAO,eAAE7B,KAAA,CAAAqB,aAAA,CAACjB,qBAAqB,MAAE,CAAE;UACnC0B,KAAK,EAAE;QAAkB,CAC5B;MACJ,CACJ,CACA,CAAC;IAEd,CACyB,CACb,CACd,CAAC;EAEnB,CAAC;AACL,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CmsEntriesWorkflowStateListFooterMenu } from "./CmsEntriesWorkflowStateListFooterMenu.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["CmsEntriesWorkflowStateListFooterMenu"],"sources":["index.ts"],"sourcesContent":["export { CmsEntriesWorkflowStateListFooterMenu } from \"./CmsEntriesWorkflowStateListFooterMenu.js\";\n"],"mappings":"AAAA,SAASA,qCAAqC","ignoreList":[]}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import React, { useCallback, useMemo } from "react";
|
|
2
|
+
import { AdminConfig, useRoute, useRouter } from "@webiny/app-admin";
|
|
3
|
+
import { Routes } from "../../routes.js";
|
|
4
|
+
import { Components } from "@webiny/app-workflows";
|
|
5
|
+
import { Icon, Loader } from "@webiny/admin-ui";
|
|
6
|
+
import { useModels, usePermission } from "@webiny/app-headless-cms/admin/hooks/index.js";
|
|
7
|
+
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
8
|
+
import { createAppName } from "../../utils/appName.js";
|
|
9
|
+
import { normalizeIcon } from "@webiny/app-headless-cms/utils/normalizeIcon.js";
|
|
10
|
+
const {
|
|
11
|
+
Admin: {
|
|
12
|
+
WorkflowsEditor
|
|
13
|
+
},
|
|
14
|
+
Permissions: {
|
|
15
|
+
HasWorkflowsEditorPermission
|
|
16
|
+
}
|
|
17
|
+
} = Components;
|
|
18
|
+
const {
|
|
19
|
+
Menu
|
|
20
|
+
} = AdminConfig;
|
|
21
|
+
export const CmsWorkflowsEditorMenu = () => {
|
|
22
|
+
const router = useRouter();
|
|
23
|
+
const {
|
|
24
|
+
canCreateContentModels
|
|
25
|
+
} = usePermission();
|
|
26
|
+
if (!canCreateContentModels) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
return /*#__PURE__*/React.createElement(HasWorkflowsEditorPermission, null, /*#__PURE__*/React.createElement(Menu, {
|
|
30
|
+
name: "headlessCMS.contentModels.workflows",
|
|
31
|
+
parent: "headlessCMS",
|
|
32
|
+
element: /*#__PURE__*/React.createElement(Menu.Link, {
|
|
33
|
+
pinnable: true,
|
|
34
|
+
text: "Workflows",
|
|
35
|
+
to: router.getLink(Routes.ContentModels.Workflows)
|
|
36
|
+
})
|
|
37
|
+
}));
|
|
38
|
+
};
|
|
39
|
+
const ModelIcon = ({
|
|
40
|
+
model
|
|
41
|
+
}) => {
|
|
42
|
+
if (!model.icon) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
const icon = normalizeIcon(model.icon);
|
|
46
|
+
if (!icon) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
return /*#__PURE__*/React.createElement(Icon, {
|
|
50
|
+
icon: /*#__PURE__*/React.createElement(FontAwesomeIcon, {
|
|
51
|
+
icon: icon
|
|
52
|
+
}),
|
|
53
|
+
label: model.name,
|
|
54
|
+
size: "sm",
|
|
55
|
+
className: "text-neutral-strong"
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
const isAllowed = model => {
|
|
59
|
+
// Exclude models that have the "$publishing:false" tag
|
|
60
|
+
if (model.tags.includes("$publishing:false")) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
// Exclude single entry models
|
|
64
|
+
else if (model.tags.includes("singleEntry")) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
return true;
|
|
68
|
+
};
|
|
69
|
+
export const CmsWorkflowsEditorView = () => {
|
|
70
|
+
const {
|
|
71
|
+
route
|
|
72
|
+
} = useRoute(Routes.ContentModels.Workflows);
|
|
73
|
+
const {
|
|
74
|
+
models,
|
|
75
|
+
loading
|
|
76
|
+
} = useModels();
|
|
77
|
+
const {
|
|
78
|
+
canEdit,
|
|
79
|
+
canCreateContentModels
|
|
80
|
+
} = usePermission();
|
|
81
|
+
const {
|
|
82
|
+
goToRoute
|
|
83
|
+
} = useRouter();
|
|
84
|
+
const apps = useMemo(() => {
|
|
85
|
+
return models.filter(model => {
|
|
86
|
+
if (isAllowed(model) === false) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
return canEdit(model, "cms.contentModel");
|
|
90
|
+
}).map(model => {
|
|
91
|
+
return {
|
|
92
|
+
id: createAppName(model),
|
|
93
|
+
name: model.name,
|
|
94
|
+
icon: /*#__PURE__*/React.createElement(ModelIcon, {
|
|
95
|
+
model: model
|
|
96
|
+
})
|
|
97
|
+
};
|
|
98
|
+
});
|
|
99
|
+
}, [models, canEdit]);
|
|
100
|
+
const app = useMemo(() => {
|
|
101
|
+
if (!route.params.app) {
|
|
102
|
+
return apps.find(() => true);
|
|
103
|
+
}
|
|
104
|
+
return apps.find(a => a.id === route.params.app) || null;
|
|
105
|
+
}, [route.params.app]);
|
|
106
|
+
const onAppClick = useCallback(id => {
|
|
107
|
+
goToRoute(Routes.ContentModels.Workflows, {
|
|
108
|
+
app: id
|
|
109
|
+
});
|
|
110
|
+
}, [apps]);
|
|
111
|
+
if (!canCreateContentModels) {
|
|
112
|
+
return null;
|
|
113
|
+
} else if (loading) {
|
|
114
|
+
return /*#__PURE__*/React.createElement(Loader, {
|
|
115
|
+
size: "lg",
|
|
116
|
+
variant: "accent",
|
|
117
|
+
indeterminate: true,
|
|
118
|
+
text: "Loading..."
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
return /*#__PURE__*/React.createElement(WorkflowsEditor, {
|
|
122
|
+
apps: apps,
|
|
123
|
+
onAppClick: onAppClick,
|
|
124
|
+
app: app?.id
|
|
125
|
+
});
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
//# sourceMappingURL=CmsWorkflowsEditorView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","useCallback","useMemo","AdminConfig","useRoute","useRouter","Routes","Components","Icon","Loader","useModels","usePermission","FontAwesomeIcon","createAppName","normalizeIcon","Admin","WorkflowsEditor","Permissions","HasWorkflowsEditorPermission","Menu","CmsWorkflowsEditorMenu","router","canCreateContentModels","createElement","name","parent","element","Link","pinnable","text","to","getLink","ContentModels","Workflows","ModelIcon","model","icon","label","size","className","isAllowed","tags","includes","CmsWorkflowsEditorView","route","models","loading","canEdit","goToRoute","apps","filter","map","id","app","params","find","a","onAppClick","variant","indeterminate"],"sources":["CmsWorkflowsEditorView.tsx"],"sourcesContent":["import React, { useCallback, useMemo } from \"react\";\nimport { AdminConfig, useRoute, useRouter } from \"@webiny/app-admin\";\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 { useModels, usePermission } from \"@webiny/app-headless-cms/admin/hooks/index.js\";\nimport type { CmsModel } from \"@webiny/app-headless-cms-common/types/index.js\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { createAppName } from \"~/utils/appName.js\";\nimport { normalizeIcon } from \"@webiny/app-headless-cms/utils/normalizeIcon.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\ninterface IModelIconProps {\n model: Pick<CmsModel, \"icon\" | \"name\">;\n}\n\nconst ModelIcon = ({ model }: IModelIconProps) => {\n if (!model.icon) {\n return null;\n }\n\n const icon = normalizeIcon(model.icon);\n if (!icon) {\n return null;\n }\n\n return (\n <Icon\n icon={<FontAwesomeIcon icon={icon} />}\n label={model.name}\n size={\"sm\"}\n className={\"text-neutral-strong\"}\n />\n );\n};\n\nconst isAllowed = (model: Pick<CmsModel, \"modelId\" | \"tags\">) => {\n // Exclude models that have the \"$publishing:false\" tag\n if (model.tags.includes(\"$publishing:false\")) {\n return false;\n }\n // Exclude single entry models\n else if (model.tags.includes(\"singleEntry\")) {\n return false;\n }\n\n return true;\n};\n\nexport const CmsWorkflowsEditorView = () => {\n const { route } = useRoute(Routes.ContentModels.Workflows);\n const { models, loading } = useModels();\n const { canEdit, canCreateContentModels } = usePermission();\n const { goToRoute } = useRouter();\n\n const apps = useMemo<IWorkflowApplication[]>(() => {\n return models\n .filter(model => {\n if (isAllowed(model) === false) {\n return false;\n }\n return canEdit(model, \"cms.contentModel\");\n })\n .map(model => {\n return {\n id: createAppName(model),\n name: model.name,\n icon: <ModelIcon model={model} />\n };\n });\n }, [models, canEdit]);\n\n const app = useMemo(() => {\n if (!route.params.app) {\n return apps.find(() => true);\n }\n return apps.find(a => a.id === route.params.app) || null;\n }, [route.params.app]);\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"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,OAAO,QAAQ,OAAO;AACnD,SAASC,WAAW,EAAEC,QAAQ,EAAEC,SAAS,QAAQ,mBAAmB;AACpE,SAASC,MAAM;AAEf,SAASC,UAAU,QAAQ,uBAAuB;AAClD,SAASC,IAAI,EAAEC,MAAM,QAAQ,kBAAkB;AAC/C,SAASC,SAAS,EAAEC,aAAa,QAAQ,+CAA+C;AAExF,SAASC,eAAe,QAAQ,gCAAgC;AAChE,SAASC,aAAa;AACtB,SAASC,aAAa,QAAQ,iDAAiD;AAE/E,MAAM;EACFC,KAAK,EAAE;IAAEC;EAAgB,CAAC;EAC1BC,WAAW,EAAE;IAAEC;EAA6B;AAChD,CAAC,GAAGX,UAAU;AAEd,MAAM;EAAEY;AAAK,CAAC,GAAGhB,WAAW;AAE5B,OAAO,MAAMiB,sBAAsB,GAAGA,CAAA,KAAM;EACxC,MAAMC,MAAM,GAAGhB,SAAS,CAAC,CAAC;EAC1B,MAAM;IAAEiB;EAAuB,CAAC,GAAGX,aAAa,CAAC,CAAC;EAElD,IAAI,CAACW,sBAAsB,EAAE;IACzB,OAAO,IAAI;EACf;EAEA,oBACItB,KAAA,CAAAuB,aAAA,CAACL,4BAA4B,qBACzBlB,KAAA,CAAAuB,aAAA,CAACJ,IAAI;IACDK,IAAI,EAAE,qCAAsC;IAC5CC,MAAM,EAAE,aAAc;IACtBC,OAAO,eACH1B,KAAA,CAAAuB,aAAA,CAACJ,IAAI,CAACQ,IAAI;MACNC,QAAQ,EAAE,IAAK;MACfC,IAAI,EAAE,WAAY;MAClBC,EAAE,EAAET,MAAM,CAACU,OAAO,CAACzB,MAAM,CAAC0B,aAAa,CAACC,SAAS;IAAE,CACtD;EACJ,CACJ,CACyB,CAAC;AAEvC,CAAC;AAMD,MAAMC,SAAS,GAAGA,CAAC;EAAEC;AAAuB,CAAC,KAAK;EAC9C,IAAI,CAACA,KAAK,CAACC,IAAI,EAAE;IACb,OAAO,IAAI;EACf;EAEA,MAAMA,IAAI,GAAGtB,aAAa,CAACqB,KAAK,CAACC,IAAI,CAAC;EACtC,IAAI,CAACA,IAAI,EAAE;IACP,OAAO,IAAI;EACf;EAEA,oBACIpC,KAAA,CAAAuB,aAAA,CAACf,IAAI;IACD4B,IAAI,eAAEpC,KAAA,CAAAuB,aAAA,CAACX,eAAe;MAACwB,IAAI,EAAEA;IAAK,CAAE,CAAE;IACtCC,KAAK,EAAEF,KAAK,CAACX,IAAK;IAClBc,IAAI,EAAE,IAAK;IACXC,SAAS,EAAE;EAAsB,CACpC,CAAC;AAEV,CAAC;AAED,MAAMC,SAAS,GAAIL,KAAyC,IAAK;EAC7D;EACA,IAAIA,KAAK,CAACM,IAAI,CAACC,QAAQ,CAAC,mBAAmB,CAAC,EAAE;IAC1C,OAAO,KAAK;EAChB;EACA;EAAA,KACK,IAAIP,KAAK,CAACM,IAAI,CAACC,QAAQ,CAAC,aAAa,CAAC,EAAE;IACzC,OAAO,KAAK;EAChB;EAEA,OAAO,IAAI;AACf,CAAC;AAED,OAAO,MAAMC,sBAAsB,GAAGA,CAAA,KAAM;EACxC,MAAM;IAAEC;EAAM,CAAC,GAAGxC,QAAQ,CAACE,MAAM,CAAC0B,aAAa,CAACC,SAAS,CAAC;EAC1D,MAAM;IAAEY,MAAM;IAAEC;EAAQ,CAAC,GAAGpC,SAAS,CAAC,CAAC;EACvC,MAAM;IAAEqC,OAAO;IAAEzB;EAAuB,CAAC,GAAGX,aAAa,CAAC,CAAC;EAC3D,MAAM;IAAEqC;EAAU,CAAC,GAAG3C,SAAS,CAAC,CAAC;EAEjC,MAAM4C,IAAI,GAAG/C,OAAO,CAAyB,MAAM;IAC/C,OAAO2C,MAAM,CACRK,MAAM,CAACf,KAAK,IAAI;MACb,IAAIK,SAAS,CAACL,KAAK,CAAC,KAAK,KAAK,EAAE;QAC5B,OAAO,KAAK;MAChB;MACA,OAAOY,OAAO,CAACZ,KAAK,EAAE,kBAAkB,CAAC;IAC7C,CAAC,CAAC,CACDgB,GAAG,CAAChB,KAAK,IAAI;MACV,OAAO;QACHiB,EAAE,EAAEvC,aAAa,CAACsB,KAAK,CAAC;QACxBX,IAAI,EAAEW,KAAK,CAACX,IAAI;QAChBY,IAAI,eAAEpC,KAAA,CAAAuB,aAAA,CAACW,SAAS;UAACC,KAAK,EAAEA;QAAM,CAAE;MACpC,CAAC;IACL,CAAC,CAAC;EACV,CAAC,EAAE,CAACU,MAAM,EAAEE,OAAO,CAAC,CAAC;EAErB,MAAMM,GAAG,GAAGnD,OAAO,CAAC,MAAM;IACtB,IAAI,CAAC0C,KAAK,CAACU,MAAM,CAACD,GAAG,EAAE;MACnB,OAAOJ,IAAI,CAACM,IAAI,CAAC,MAAM,IAAI,CAAC;IAChC;IACA,OAAON,IAAI,CAACM,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACJ,EAAE,KAAKR,KAAK,CAACU,MAAM,CAACD,GAAG,CAAC,IAAI,IAAI;EAC5D,CAAC,EAAE,CAACT,KAAK,CAACU,MAAM,CAACD,GAAG,CAAC,CAAC;EAEtB,MAAMI,UAAU,GAAGxD,WAAW,CACzBmD,EAAU,IAAK;IACZJ,SAAS,CAAC1C,MAAM,CAAC0B,aAAa,CAACC,SAAS,EAAE;MACtCoB,GAAG,EAAED;IACT,CAAC,CAAC;EACN,CAAC,EACD,CAACH,IAAI,CACT,CAAC;EAED,IAAI,CAAC3B,sBAAsB,EAAE;IACzB,OAAO,IAAI;EACf,CAAC,MAAM,IAAIwB,OAAO,EAAE;IAChB,oBAAO9C,KAAA,CAAAuB,aAAA,CAACd,MAAM;MAAC6B,IAAI,EAAC,IAAI;MAACoB,OAAO,EAAC,QAAQ;MAACC,aAAa,EAAE,IAAK;MAAC9B,IAAI,EAAC;IAAY,CAAE,CAAC;EACvF;EAEA,oBAAO7B,KAAA,CAAAuB,aAAA,CAACP,eAAe;IAACiC,IAAI,EAAEA,IAAK;IAACQ,UAAU,EAAEA,UAAW;IAACJ,GAAG,EAAEA,GAAG,EAAED;EAAG,CAAE,CAAC;AAChF,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import React, { useCallback } from "react";
|
|
2
|
+
import { useRoute } from "@webiny/app";
|
|
3
|
+
import { useToast } from "@webiny/admin-ui";
|
|
4
|
+
import { ContentEntryEditorConfig, usePermission } from "@webiny/app-headless-cms";
|
|
5
|
+
import { useContentEntryForm } from "@webiny/app-headless-cms/admin/components/ContentEntryForm/useContentEntryForm.js";
|
|
6
|
+
import { usePersistEntry } from "@webiny/app-headless-cms/admin/hooks/usePersistEntry.js";
|
|
7
|
+
import { ReactComponent as NewReleaseIcon } from "@webiny/icons/new_releases.svg";
|
|
8
|
+
import { IsModelPublishable } from "@webiny/app-headless-cms/exports/admin/cms.js";
|
|
9
|
+
const {
|
|
10
|
+
Actions
|
|
11
|
+
} = ContentEntryEditorConfig;
|
|
12
|
+
const CreateNewRevisionMenuItem = () => {
|
|
13
|
+
const toast = useToast();
|
|
14
|
+
const {
|
|
15
|
+
setRouteParams
|
|
16
|
+
} = useRoute();
|
|
17
|
+
const {
|
|
18
|
+
canEdit
|
|
19
|
+
} = usePermission();
|
|
20
|
+
const {
|
|
21
|
+
OptionsMenuItem
|
|
22
|
+
} = Actions.MenuItemAction.useOptionsMenuItem();
|
|
23
|
+
const {
|
|
24
|
+
entry
|
|
25
|
+
} = useContentEntryForm();
|
|
26
|
+
const {
|
|
27
|
+
persistEntry
|
|
28
|
+
} = usePersistEntry({
|
|
29
|
+
addItemToListCache: true
|
|
30
|
+
});
|
|
31
|
+
const onClick = useCallback(async () => {
|
|
32
|
+
const newRevision = await persistEntry({
|
|
33
|
+
id: entry.id
|
|
34
|
+
}, {
|
|
35
|
+
skipValidators: ["required"],
|
|
36
|
+
createNewRevision: true
|
|
37
|
+
});
|
|
38
|
+
if (newRevision.error) {
|
|
39
|
+
toast.showWarningToast({
|
|
40
|
+
title: "Could not create a new revision.",
|
|
41
|
+
description: newRevision.error.message
|
|
42
|
+
});
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
setRouteParams(params => {
|
|
46
|
+
return {
|
|
47
|
+
...params,
|
|
48
|
+
id: newRevision.entry.id
|
|
49
|
+
};
|
|
50
|
+
});
|
|
51
|
+
}, [entry, persistEntry]);
|
|
52
|
+
if (!canEdit(entry, "cms.contentEntry")) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
return /*#__PURE__*/React.createElement(OptionsMenuItem, {
|
|
56
|
+
icon: /*#__PURE__*/React.createElement(NewReleaseIcon, null),
|
|
57
|
+
label: `Create New Revision`,
|
|
58
|
+
onAction: onClick,
|
|
59
|
+
"data-testid": "cms.content-form.header.createNewRevision"
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
export const CmsEntryFormCreateNewRevisionButton = () => {
|
|
63
|
+
return /*#__PURE__*/React.createElement(ContentEntryEditorConfig, null, /*#__PURE__*/React.createElement(IsModelPublishable, null, /*#__PURE__*/React.createElement(Actions.MenuItemAction, {
|
|
64
|
+
name: "createNewRevision",
|
|
65
|
+
element: /*#__PURE__*/React.createElement(CreateNewRevisionMenuItem, null)
|
|
66
|
+
})));
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
//# sourceMappingURL=CmsEntryFormCreateNewRevisionButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","useCallback","useRoute","useToast","ContentEntryEditorConfig","usePermission","useContentEntryForm","usePersistEntry","ReactComponent","NewReleaseIcon","IsModelPublishable","Actions","CreateNewRevisionMenuItem","toast","setRouteParams","canEdit","OptionsMenuItem","MenuItemAction","useOptionsMenuItem","entry","persistEntry","addItemToListCache","onClick","newRevision","id","skipValidators","createNewRevision","error","showWarningToast","title","description","message","params","createElement","icon","label","onAction","CmsEntryFormCreateNewRevisionButton","name","element"],"sources":["CmsEntryFormCreateNewRevisionButton.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { useRoute } from \"@webiny/app\";\nimport { useToast } from \"@webiny/admin-ui\";\nimport { ContentEntryEditorConfig, usePermission } from \"@webiny/app-headless-cms\";\nimport { useContentEntryForm } from \"@webiny/app-headless-cms/admin/components/ContentEntryForm/useContentEntryForm.js\";\nimport { usePersistEntry } from \"@webiny/app-headless-cms/admin/hooks/usePersistEntry.js\";\nimport { ReactComponent as NewReleaseIcon } from \"@webiny/icons/new_releases.svg\";\nimport { IsModelPublishable } from \"@webiny/app-headless-cms/exports/admin/cms.js\";\n\nconst { Actions } = ContentEntryEditorConfig;\n\nconst CreateNewRevisionMenuItem = () => {\n const toast = useToast();\n const { setRouteParams } = useRoute();\n const { canEdit } = usePermission();\n const { OptionsMenuItem } = Actions.MenuItemAction.useOptionsMenuItem();\n const { entry } = useContentEntryForm();\n const { persistEntry } = usePersistEntry({\n addItemToListCache: true\n });\n\n const onClick = useCallback(async () => {\n const newRevision = await persistEntry(\n {\n id: entry.id\n },\n {\n skipValidators: [\"required\"],\n createNewRevision: true\n }\n );\n\n if (newRevision.error) {\n toast.showWarningToast({\n title: \"Could not create a new revision.\",\n description: newRevision.error.message\n });\n return;\n }\n\n setRouteParams(params => {\n return { ...params, id: newRevision.entry.id };\n });\n }, [entry, persistEntry]);\n\n if (!canEdit(entry, \"cms.contentEntry\")) {\n return null;\n }\n\n return (\n <OptionsMenuItem\n icon={<NewReleaseIcon />}\n label={`Create New Revision`}\n onAction={onClick}\n data-testid={\"cms.content-form.header.createNewRevision\"}\n />\n );\n};\n\nexport const CmsEntryFormCreateNewRevisionButton = () => {\n return (\n <ContentEntryEditorConfig>\n <IsModelPublishable>\n <Actions.MenuItemAction\n name={\"createNewRevision\"}\n element={<CreateNewRevisionMenuItem />}\n />\n </IsModelPublishable>\n </ContentEntryEditorConfig>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,WAAW,QAAQ,OAAO;AAC1C,SAASC,QAAQ,QAAQ,aAAa;AACtC,SAASC,QAAQ,QAAQ,kBAAkB;AAC3C,SAASC,wBAAwB,EAAEC,aAAa,QAAQ,0BAA0B;AAClF,SAASC,mBAAmB,QAAQ,mFAAmF;AACvH,SAASC,eAAe,QAAQ,yDAAyD;AACzF,SAASC,cAAc,IAAIC,cAAc,QAAQ,gCAAgC;AACjF,SAASC,kBAAkB,QAAQ,+CAA+C;AAElF,MAAM;EAAEC;AAAQ,CAAC,GAAGP,wBAAwB;AAE5C,MAAMQ,yBAAyB,GAAGA,CAAA,KAAM;EACpC,MAAMC,KAAK,GAAGV,QAAQ,CAAC,CAAC;EACxB,MAAM;IAAEW;EAAe,CAAC,GAAGZ,QAAQ,CAAC,CAAC;EACrC,MAAM;IAAEa;EAAQ,CAAC,GAAGV,aAAa,CAAC,CAAC;EACnC,MAAM;IAAEW;EAAgB,CAAC,GAAGL,OAAO,CAACM,cAAc,CAACC,kBAAkB,CAAC,CAAC;EACvE,MAAM;IAAEC;EAAM,CAAC,GAAGb,mBAAmB,CAAC,CAAC;EACvC,MAAM;IAAEc;EAAa,CAAC,GAAGb,eAAe,CAAC;IACrCc,kBAAkB,EAAE;EACxB,CAAC,CAAC;EAEF,MAAMC,OAAO,GAAGrB,WAAW,CAAC,YAAY;IACpC,MAAMsB,WAAW,GAAG,MAAMH,YAAY,CAClC;MACII,EAAE,EAAEL,KAAK,CAACK;IACd,CAAC,EACD;MACIC,cAAc,EAAE,CAAC,UAAU,CAAC;MAC5BC,iBAAiB,EAAE;IACvB,CACJ,CAAC;IAED,IAAIH,WAAW,CAACI,KAAK,EAAE;MACnBd,KAAK,CAACe,gBAAgB,CAAC;QACnBC,KAAK,EAAE,kCAAkC;QACzCC,WAAW,EAAEP,WAAW,CAACI,KAAK,CAACI;MACnC,CAAC,CAAC;MACF;IACJ;IAEAjB,cAAc,CAACkB,MAAM,IAAI;MACrB,OAAO;QAAE,GAAGA,MAAM;QAAER,EAAE,EAAED,WAAW,CAACJ,KAAK,CAACK;MAAG,CAAC;IAClD,CAAC,CAAC;EACN,CAAC,EAAE,CAACL,KAAK,EAAEC,YAAY,CAAC,CAAC;EAEzB,IAAI,CAACL,OAAO,CAACI,KAAK,EAAE,kBAAkB,CAAC,EAAE;IACrC,OAAO,IAAI;EACf;EAEA,oBACInB,KAAA,CAAAiC,aAAA,CAACjB,eAAe;IACZkB,IAAI,eAAElC,KAAA,CAAAiC,aAAA,CAACxB,cAAc,MAAE,CAAE;IACzB0B,KAAK,EAAE,qBAAsB;IAC7BC,QAAQ,EAAEd,OAAQ;IAClB,eAAa;EAA4C,CAC5D,CAAC;AAEV,CAAC;AAED,OAAO,MAAMe,mCAAmC,GAAGA,CAAA,KAAM;EACrD,oBACIrC,KAAA,CAAAiC,aAAA,CAAC7B,wBAAwB,qBACrBJ,KAAA,CAAAiC,aAAA,CAACvB,kBAAkB,qBACfV,KAAA,CAAAiC,aAAA,CAACtB,OAAO,CAACM,cAAc;IACnBqB,IAAI,EAAE,mBAAoB;IAC1BC,OAAO,eAAEvC,KAAA,CAAAiC,aAAA,CAACrB,yBAAyB,MAAE;EAAE,CAC1C,CACe,CACE,CAAC;AAEnC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { useContentEntry, usePermission } from "@webiny/app-headless-cms";
|
|
2
|
+
import { ContentEntryEditorConfig } from "@webiny/app-headless-cms/admin/config/contentEntries/index.js";
|
|
3
|
+
import React, { useCallback } from "react";
|
|
4
|
+
export const CmsEntryFormPublishButton = () => {
|
|
5
|
+
const {
|
|
6
|
+
loading,
|
|
7
|
+
entry,
|
|
8
|
+
publishEntryRevision
|
|
9
|
+
} = useContentEntry();
|
|
10
|
+
const {
|
|
11
|
+
ButtonPrimary
|
|
12
|
+
} = ContentEntryEditorConfig.Actions.ButtonAction.useButtons();
|
|
13
|
+
const publish = useCallback(() => {
|
|
14
|
+
if (!entry.id) {
|
|
15
|
+
console.warn(`You cannot publish an entry that hasn't been saved yet.`);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
publishEntryRevision({
|
|
19
|
+
id: entry.id
|
|
20
|
+
});
|
|
21
|
+
}, [entry.id]);
|
|
22
|
+
const {
|
|
23
|
+
canEdit,
|
|
24
|
+
canPublish
|
|
25
|
+
} = usePermission();
|
|
26
|
+
if (entry.meta.status === "published") {
|
|
27
|
+
return null;
|
|
28
|
+
} else if (!canEdit(entry, "cms.contentEntry") || !canPublish("cms.contentEntry")) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
return /*#__PURE__*/React.createElement(ButtonPrimary, {
|
|
32
|
+
onAction: publish,
|
|
33
|
+
disabled: loading,
|
|
34
|
+
"data-testid": "workflows-cms-content-publish-content-button"
|
|
35
|
+
}, "Publish");
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=CmsEntryFormPublishButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useContentEntry","usePermission","ContentEntryEditorConfig","React","useCallback","CmsEntryFormPublishButton","loading","entry","publishEntryRevision","ButtonPrimary","Actions","ButtonAction","useButtons","publish","id","console","warn","canEdit","canPublish","meta","status","createElement","onAction","disabled"],"sources":["CmsEntryFormPublishButton.tsx"],"sourcesContent":["import { useContentEntry, usePermission } from \"@webiny/app-headless-cms\";\nimport { ContentEntryEditorConfig } from \"@webiny/app-headless-cms/admin/config/contentEntries/index.js\";\nimport React, { useCallback } from \"react\";\n\nexport const CmsEntryFormPublishButton = () => {\n const { loading, entry, publishEntryRevision } = useContentEntry();\n const { ButtonPrimary } = ContentEntryEditorConfig.Actions.ButtonAction.useButtons();\n\n const publish = useCallback(() => {\n if (!entry.id) {\n console.warn(`You cannot publish an entry that hasn't been saved yet.`);\n return;\n }\n publishEntryRevision({ id: entry.id });\n }, [entry.id]);\n\n const { canEdit, canPublish } = usePermission();\n\n if (entry.meta.status === \"published\") {\n return null;\n } else if (!canEdit(entry, \"cms.contentEntry\") || !canPublish(\"cms.contentEntry\")) {\n return null;\n }\n\n return (\n <ButtonPrimary\n onAction={publish}\n disabled={loading}\n data-testid=\"workflows-cms-content-publish-content-button\"\n >\n {\"Publish\"}\n </ButtonPrimary>\n );\n};\n"],"mappings":"AAAA,SAASA,eAAe,EAAEC,aAAa,QAAQ,0BAA0B;AACzE,SAASC,wBAAwB,QAAQ,+DAA+D;AACxG,OAAOC,KAAK,IAAIC,WAAW,QAAQ,OAAO;AAE1C,OAAO,MAAMC,yBAAyB,GAAGA,CAAA,KAAM;EAC3C,MAAM;IAAEC,OAAO;IAAEC,KAAK;IAAEC;EAAqB,CAAC,GAAGR,eAAe,CAAC,CAAC;EAClE,MAAM;IAAES;EAAc,CAAC,GAAGP,wBAAwB,CAACQ,OAAO,CAACC,YAAY,CAACC,UAAU,CAAC,CAAC;EAEpF,MAAMC,OAAO,GAAGT,WAAW,CAAC,MAAM;IAC9B,IAAI,CAACG,KAAK,CAACO,EAAE,EAAE;MACXC,OAAO,CAACC,IAAI,CAAC,yDAAyD,CAAC;MACvE;IACJ;IACAR,oBAAoB,CAAC;MAAEM,EAAE,EAAEP,KAAK,CAACO;IAAG,CAAC,CAAC;EAC1C,CAAC,EAAE,CAACP,KAAK,CAACO,EAAE,CAAC,CAAC;EAEd,MAAM;IAAEG,OAAO;IAAEC;EAAW,CAAC,GAAGjB,aAAa,CAAC,CAAC;EAE/C,IAAIM,KAAK,CAACY,IAAI,CAACC,MAAM,KAAK,WAAW,EAAE;IACnC,OAAO,IAAI;EACf,CAAC,MAAM,IAAI,CAACH,OAAO,CAACV,KAAK,EAAE,kBAAkB,CAAC,IAAI,CAACW,UAAU,CAAC,kBAAkB,CAAC,EAAE;IAC/E,OAAO,IAAI;EACf;EAEA,oBACIf,KAAA,CAAAkB,aAAA,CAACZ,aAAa;IACVa,QAAQ,EAAET,OAAQ;IAClBU,QAAQ,EAAEjB,OAAQ;IAClB,eAAY;EAA8C,GAEzD,SACU,CAAC;AAExB,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { ContentEntryEditorConfig } from "@webiny/app-headless-cms";
|
|
3
|
+
import { useWorkflowState } from "@webiny/app-workflows";
|
|
4
|
+
import { observer } from "mobx-react-lite";
|
|
5
|
+
import { WorkflowStateValue } from "@webiny/app-workflows";
|
|
6
|
+
import { CmsEntryFormPublishButton } from "./CmsEntryFormPublishButton.js";
|
|
7
|
+
const {
|
|
8
|
+
Actions
|
|
9
|
+
} = ContentEntryEditorConfig;
|
|
10
|
+
const {
|
|
11
|
+
ButtonAction
|
|
12
|
+
} = Actions;
|
|
13
|
+
const OverrideSaveAndPublishButton = observer(props => {
|
|
14
|
+
const {
|
|
15
|
+
presenter
|
|
16
|
+
} = useWorkflowState();
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* If there is no workflow state or state is approved, we simply render the original element.
|
|
20
|
+
* This is to ensure that no button will be shown if workflow state is active.
|
|
21
|
+
*/
|
|
22
|
+
if (props.name !== "publish" || !presenter.vm.workflow) {
|
|
23
|
+
return props.children;
|
|
24
|
+
} else if (presenter.vm.state?.state === WorkflowStateValue.approved) {
|
|
25
|
+
return /*#__PURE__*/React.createElement(CmsEntryFormPublishButton, null);
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
});
|
|
29
|
+
export const CmsEntryFormSaveAndPublishButton = ButtonAction.createDecorator(Original => {
|
|
30
|
+
return function WorkflowCmsEntryFormSaveAndPublishButton(props) {
|
|
31
|
+
return /*#__PURE__*/React.createElement(Original, Object.assign({}, props, {
|
|
32
|
+
element: /*#__PURE__*/React.createElement(OverrideSaveAndPublishButton, {
|
|
33
|
+
name: props.name
|
|
34
|
+
}, props.element)
|
|
35
|
+
}));
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=CmsEntryFormSaveAndPublishButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","ContentEntryEditorConfig","useWorkflowState","observer","WorkflowStateValue","CmsEntryFormPublishButton","Actions","ButtonAction","OverrideSaveAndPublishButton","props","presenter","name","vm","workflow","children","state","approved","createElement","CmsEntryFormSaveAndPublishButton","createDecorator","Original","WorkflowCmsEntryFormSaveAndPublishButton","Object","assign","element"],"sources":["CmsEntryFormSaveAndPublishButton.tsx"],"sourcesContent":["import React from \"react\";\nimport { ContentEntryEditorConfig } from \"@webiny/app-headless-cms\";\nimport { useWorkflowState } from \"@webiny/app-workflows\";\nimport { observer } from \"mobx-react-lite\";\nimport { WorkflowStateValue } from \"@webiny/app-workflows\";\nimport { CmsEntryFormPublishButton } from \"./CmsEntryFormPublishButton.js\";\n\nconst { Actions } = ContentEntryEditorConfig;\nconst { ButtonAction } = Actions;\n\ninterface IOverrideSaveAndPublishButtonProps {\n name: string;\n children: React.ReactElement;\n}\n\nconst OverrideSaveAndPublishButton = observer((props: IOverrideSaveAndPublishButtonProps) => {\n const { presenter } = useWorkflowState();\n\n /**\n * If there is no workflow state or state is approved, we simply render the original element.\n * This is to ensure that no button will be shown if workflow state is active.\n */\n if (props.name !== \"publish\" || !presenter.vm.workflow) {\n return props.children;\n } else if (presenter.vm.state?.state === WorkflowStateValue.approved) {\n return <CmsEntryFormPublishButton />;\n }\n return null;\n});\n\nexport const CmsEntryFormSaveAndPublishButton = ButtonAction.createDecorator(Original => {\n return function WorkflowCmsEntryFormSaveAndPublishButton(props) {\n return (\n <Original\n {...props}\n element={\n <OverrideSaveAndPublishButton name={props.name}>\n {props.element}\n </OverrideSaveAndPublishButton>\n }\n />\n );\n };\n});\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,wBAAwB,QAAQ,0BAA0B;AACnE,SAASC,gBAAgB,QAAQ,uBAAuB;AACxD,SAASC,QAAQ,QAAQ,iBAAiB;AAC1C,SAASC,kBAAkB,QAAQ,uBAAuB;AAC1D,SAASC,yBAAyB;AAElC,MAAM;EAAEC;AAAQ,CAAC,GAAGL,wBAAwB;AAC5C,MAAM;EAAEM;AAAa,CAAC,GAAGD,OAAO;AAOhC,MAAME,4BAA4B,GAAGL,QAAQ,CAAEM,KAAyC,IAAK;EACzF,MAAM;IAAEC;EAAU,CAAC,GAAGR,gBAAgB,CAAC,CAAC;;EAExC;AACJ;AACA;AACA;EACI,IAAIO,KAAK,CAACE,IAAI,KAAK,SAAS,IAAI,CAACD,SAAS,CAACE,EAAE,CAACC,QAAQ,EAAE;IACpD,OAAOJ,KAAK,CAACK,QAAQ;EACzB,CAAC,MAAM,IAAIJ,SAAS,CAACE,EAAE,CAACG,KAAK,EAAEA,KAAK,KAAKX,kBAAkB,CAACY,QAAQ,EAAE;IAClE,oBAAOhB,KAAA,CAAAiB,aAAA,CAACZ,yBAAyB,MAAE,CAAC;EACxC;EACA,OAAO,IAAI;AACf,CAAC,CAAC;AAEF,OAAO,MAAMa,gCAAgC,GAAGX,YAAY,CAACY,eAAe,CAACC,QAAQ,IAAI;EACrF,OAAO,SAASC,wCAAwCA,CAACZ,KAAK,EAAE;IAC5D,oBACIT,KAAA,CAAAiB,aAAA,CAACG,QAAQ,EAAAE,MAAA,CAAAC,MAAA,KACDd,KAAK;MACTe,OAAO,eACHxB,KAAA,CAAAiB,aAAA,CAACT,4BAA4B;QAACG,IAAI,EAAEF,KAAK,CAACE;MAAK,GAC1CF,KAAK,CAACe,OACmB;IACjC,EACJ,CAAC;EAEV,CAAC;AACL,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { ContentEntryEditorConfig } from "@webiny/app-headless-cms";
|
|
3
|
+
import { useWorkflowState } from "@webiny/app-workflows";
|
|
4
|
+
import { observer } from "mobx-react-lite";
|
|
5
|
+
const {
|
|
6
|
+
Actions
|
|
7
|
+
} = ContentEntryEditorConfig;
|
|
8
|
+
const {
|
|
9
|
+
ButtonAction
|
|
10
|
+
} = Actions;
|
|
11
|
+
const OverrideSaveButton = observer(props => {
|
|
12
|
+
const {
|
|
13
|
+
presenter
|
|
14
|
+
} = useWorkflowState();
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* If there is no workflow state or state is approved, we simply render the original element.
|
|
18
|
+
* This is to ensure that no button will be shown if workflow state is active.
|
|
19
|
+
*/
|
|
20
|
+
if (props.name !== "save") {
|
|
21
|
+
return props.children;
|
|
22
|
+
} else if (!presenter.vm.state) {
|
|
23
|
+
return props.children;
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
});
|
|
27
|
+
export const CmsEntryFormSaveButton = ButtonAction.createDecorator(Original => {
|
|
28
|
+
return function WorkflowCmsEntryFormSaveButton(props) {
|
|
29
|
+
return /*#__PURE__*/React.createElement(Original, Object.assign({}, props, {
|
|
30
|
+
element: /*#__PURE__*/React.createElement(OverrideSaveButton, {
|
|
31
|
+
name: props.name
|
|
32
|
+
}, props.element)
|
|
33
|
+
}));
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=CmsEntryFormSaveButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","ContentEntryEditorConfig","useWorkflowState","observer","Actions","ButtonAction","OverrideSaveButton","props","presenter","name","children","vm","state","CmsEntryFormSaveButton","createDecorator","Original","WorkflowCmsEntryFormSaveButton","createElement","Object","assign","element"],"sources":["CmsEntryFormSaveButton.tsx"],"sourcesContent":["import React from \"react\";\nimport { ContentEntryEditorConfig } from \"@webiny/app-headless-cms\";\nimport { useWorkflowState } from \"@webiny/app-workflows\";\nimport { observer } from \"mobx-react-lite\";\n\nconst { Actions } = ContentEntryEditorConfig;\nconst { ButtonAction } = Actions;\n\ninterface IOverrideSaveButtonProps {\n name: string;\n children: React.ReactElement;\n}\n\nconst OverrideSaveButton = observer((props: IOverrideSaveButtonProps) => {\n const { presenter } = useWorkflowState();\n\n /**\n * If there is no workflow state or state is approved, we simply render the original element.\n * This is to ensure that no button will be shown if workflow state is active.\n */\n if (props.name !== \"save\") {\n return props.children;\n } else if (!presenter.vm.state) {\n return props.children;\n }\n return null;\n});\n\nexport const CmsEntryFormSaveButton = ButtonAction.createDecorator(Original => {\n return function WorkflowCmsEntryFormSaveButton(props) {\n return (\n <Original\n {...props}\n element={<OverrideSaveButton name={props.name}>{props.element}</OverrideSaveButton>}\n />\n );\n };\n});\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,wBAAwB,QAAQ,0BAA0B;AACnE,SAASC,gBAAgB,QAAQ,uBAAuB;AACxD,SAASC,QAAQ,QAAQ,iBAAiB;AAE1C,MAAM;EAAEC;AAAQ,CAAC,GAAGH,wBAAwB;AAC5C,MAAM;EAAEI;AAAa,CAAC,GAAGD,OAAO;AAOhC,MAAME,kBAAkB,GAAGH,QAAQ,CAAEI,KAA+B,IAAK;EACrE,MAAM;IAAEC;EAAU,CAAC,GAAGN,gBAAgB,CAAC,CAAC;;EAExC;AACJ;AACA;AACA;EACI,IAAIK,KAAK,CAACE,IAAI,KAAK,MAAM,EAAE;IACvB,OAAOF,KAAK,CAACG,QAAQ;EACzB,CAAC,MAAM,IAAI,CAACF,SAAS,CAACG,EAAE,CAACC,KAAK,EAAE;IAC5B,OAAOL,KAAK,CAACG,QAAQ;EACzB;EACA,OAAO,IAAI;AACf,CAAC,CAAC;AAEF,OAAO,MAAMG,sBAAsB,GAAGR,YAAY,CAACS,eAAe,CAACC,QAAQ,IAAI;EAC3E,OAAO,SAASC,8BAA8BA,CAACT,KAAK,EAAE;IAClD,oBACIP,KAAA,CAAAiB,aAAA,CAACF,QAAQ,EAAAG,MAAA,CAAAC,MAAA,KACDZ,KAAK;MACTa,OAAO,eAAEpB,KAAA,CAAAiB,aAAA,CAACX,kBAAkB;QAACG,IAAI,EAAEF,KAAK,CAACE;MAAK,GAAEF,KAAK,CAACa,OAA4B;IAAE,EACvF,CAAC;EAEV,CAAC;AACL,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { ContentEntryEditorConfig } from "@webiny/app-headless-cms";
|
|
3
|
+
import { useWorkflowState, WorkflowStateValue } from "@webiny/app-workflows";
|
|
4
|
+
const {
|
|
5
|
+
Actions
|
|
6
|
+
} = ContentEntryEditorConfig;
|
|
7
|
+
const {
|
|
8
|
+
MenuItemAction
|
|
9
|
+
} = Actions;
|
|
10
|
+
const OverrideScheduleMenuItemAction = props => {
|
|
11
|
+
const {
|
|
12
|
+
presenter
|
|
13
|
+
} = useWorkflowState();
|
|
14
|
+
/**
|
|
15
|
+
* If there is no workflow state or state is approved, we simply render the original element.
|
|
16
|
+
* This is to ensure that no button will be shown if workflow state is active.
|
|
17
|
+
*/
|
|
18
|
+
if (!presenter.vm.workflow || presenter.vm.state?.state === WorkflowStateValue.approved) {
|
|
19
|
+
return props.children;
|
|
20
|
+
} else if (props.name === "schedule") {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
return props.children;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* There is a possibility that this decorator will not do anything, because scheduler is not turned on.
|
|
27
|
+
*/
|
|
28
|
+
export const CmsEntryFormScheduleMenuItemAction = MenuItemAction.createDecorator(Original => {
|
|
29
|
+
return function WorkflowCmsEntryScheduleMenuItemAction(props) {
|
|
30
|
+
return /*#__PURE__*/React.createElement(Original, Object.assign({}, props, {
|
|
31
|
+
element: /*#__PURE__*/React.createElement(OverrideScheduleMenuItemAction, {
|
|
32
|
+
name: props.name
|
|
33
|
+
}, props.element)
|
|
34
|
+
}));
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=CmsEntryFormScheduleMenuItemAction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","ContentEntryEditorConfig","useWorkflowState","WorkflowStateValue","Actions","MenuItemAction","OverrideScheduleMenuItemAction","props","presenter","vm","workflow","state","approved","children","name","CmsEntryFormScheduleMenuItemAction","createDecorator","Original","WorkflowCmsEntryScheduleMenuItemAction","createElement","Object","assign","element"],"sources":["CmsEntryFormScheduleMenuItemAction.tsx"],"sourcesContent":["import React from \"react\";\nimport { ContentEntryEditorConfig } from \"@webiny/app-headless-cms\";\nimport { useWorkflowState, WorkflowStateValue } from \"@webiny/app-workflows\";\n\nconst { Actions } = ContentEntryEditorConfig;\nconst { MenuItemAction } = Actions;\n\ninterface IOverrideScheduleMenuItemActionProps {\n name: string;\n children: React.ReactElement;\n}\n\nconst OverrideScheduleMenuItemAction = (props: IOverrideScheduleMenuItemActionProps) => {\n const { presenter } = useWorkflowState();\n /**\n * If there is no workflow state or state is approved, we simply render the original element.\n * This is to ensure that no button will be shown if workflow state is active.\n */\n if (!presenter.vm.workflow || presenter.vm.state?.state === WorkflowStateValue.approved) {\n return props.children;\n } else if (props.name === \"schedule\") {\n return null;\n }\n return props.children;\n};\n/**\n * There is a possibility that this decorator will not do anything, because scheduler is not turned on.\n */\nexport const CmsEntryFormScheduleMenuItemAction = MenuItemAction.createDecorator(Original => {\n return function WorkflowCmsEntryScheduleMenuItemAction(props) {\n return (\n <Original\n {...props}\n element={\n <OverrideScheduleMenuItemAction name={props.name}>\n {props.element}\n </OverrideScheduleMenuItemAction>\n }\n />\n );\n };\n});\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,wBAAwB,QAAQ,0BAA0B;AACnE,SAASC,gBAAgB,EAAEC,kBAAkB,QAAQ,uBAAuB;AAE5E,MAAM;EAAEC;AAAQ,CAAC,GAAGH,wBAAwB;AAC5C,MAAM;EAAEI;AAAe,CAAC,GAAGD,OAAO;AAOlC,MAAME,8BAA8B,GAAIC,KAA2C,IAAK;EACpF,MAAM;IAAEC;EAAU,CAAC,GAAGN,gBAAgB,CAAC,CAAC;EACxC;AACJ;AACA;AACA;EACI,IAAI,CAACM,SAAS,CAACC,EAAE,CAACC,QAAQ,IAAIF,SAAS,CAACC,EAAE,CAACE,KAAK,EAAEA,KAAK,KAAKR,kBAAkB,CAACS,QAAQ,EAAE;IACrF,OAAOL,KAAK,CAACM,QAAQ;EACzB,CAAC,MAAM,IAAIN,KAAK,CAACO,IAAI,KAAK,UAAU,EAAE;IAClC,OAAO,IAAI;EACf;EACA,OAAOP,KAAK,CAACM,QAAQ;AACzB,CAAC;AACD;AACA;AACA;AACA,OAAO,MAAME,kCAAkC,GAAGV,cAAc,CAACW,eAAe,CAACC,QAAQ,IAAI;EACzF,OAAO,SAASC,sCAAsCA,CAACX,KAAK,EAAE;IAC1D,oBACIP,KAAA,CAAAmB,aAAA,CAACF,QAAQ,EAAAG,MAAA,CAAAC,MAAA,KACDd,KAAK;MACTe,OAAO,eACHtB,KAAA,CAAAmB,aAAA,CAACb,8BAA8B;QAACQ,IAAI,EAAEP,KAAK,CAACO;MAAK,GAC5CP,KAAK,CAACe,OACqB;IACnC,EACJ,CAAC;EAEV,CAAC;AACL,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Components } from "@webiny/app-workflows";
|
|
3
|
+
import { ContentEntryEditorConfig } from "@webiny/app-headless-cms";
|
|
4
|
+
const {
|
|
5
|
+
ContentReview: {
|
|
6
|
+
WorkflowStateTooltip
|
|
7
|
+
}
|
|
8
|
+
} = Components;
|
|
9
|
+
const {
|
|
10
|
+
Actions
|
|
11
|
+
} = ContentEntryEditorConfig;
|
|
12
|
+
export const CmsEntryFormTooltipButton = () => {
|
|
13
|
+
return /*#__PURE__*/React.createElement(ContentEntryEditorConfig, null, /*#__PURE__*/React.createElement(Actions.ButtonAction, {
|
|
14
|
+
before: "save",
|
|
15
|
+
name: "workflowStateTooltip",
|
|
16
|
+
element: /*#__PURE__*/React.createElement(WorkflowStateTooltip, null)
|
|
17
|
+
}));
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=CmsEntryFormTooltipButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","Components","ContentEntryEditorConfig","ContentReview","WorkflowStateTooltip","Actions","CmsEntryFormTooltipButton","createElement","ButtonAction","before","name","element"],"sources":["CmsEntryFormTooltipButton.tsx"],"sourcesContent":["import React from \"react\";\nimport { Components } from \"@webiny/app-workflows\";\nimport { ContentEntryEditorConfig } from \"@webiny/app-headless-cms\";\n\nconst {\n ContentReview: { WorkflowStateTooltip }\n} = Components;\n\nconst { Actions } = ContentEntryEditorConfig;\n\nexport const CmsEntryFormTooltipButton = () => {\n return (\n <ContentEntryEditorConfig>\n <Actions.ButtonAction\n before={\"save\"}\n name={\"workflowStateTooltip\"}\n element={<WorkflowStateTooltip />}\n />\n </ContentEntryEditorConfig>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,UAAU,QAAQ,uBAAuB;AAClD,SAASC,wBAAwB,QAAQ,0BAA0B;AAEnE,MAAM;EACFC,aAAa,EAAE;IAAEC;EAAqB;AAC1C,CAAC,GAAGH,UAAU;AAEd,MAAM;EAAEI;AAAQ,CAAC,GAAGH,wBAAwB;AAE5C,OAAO,MAAMI,yBAAyB,GAAGA,CAAA,KAAM;EAC3C,oBACIN,KAAA,CAAAO,aAAA,CAACL,wBAAwB,qBACrBF,KAAA,CAAAO,aAAA,CAACF,OAAO,CAACG,YAAY;IACjBC,MAAM,EAAE,MAAO;IACfC,IAAI,EAAE,sBAAuB;IAC7BC,OAAO,eAAEX,KAAA,CAAAO,aAAA,CAACH,oBAAoB,MAAE;EAAE,CACrC,CACqB,CAAC;AAEnC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { ContentEntryForm, useModel } from "@webiny/app-headless-cms";
|
|
3
|
+
import { Components } from "@webiny/app-workflows";
|
|
4
|
+
import { Alert, Grid } from "@webiny/admin-ui";
|
|
5
|
+
import { CMS_MODEL_SINGLETON_TAG } from "@webiny/app-headless-cms-common";
|
|
6
|
+
const {
|
|
7
|
+
ContentReview: {
|
|
8
|
+
WorkflowStateBar,
|
|
9
|
+
WorkflowStateOverlay
|
|
10
|
+
}
|
|
11
|
+
} = Components;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* To override storing of the entry when in workflow state.
|
|
15
|
+
*/
|
|
16
|
+
// @ts-expect-error
|
|
17
|
+
const emptyFunction = async () => {
|
|
18
|
+
return void 0;
|
|
19
|
+
};
|
|
20
|
+
const StoreAlert = ({
|
|
21
|
+
state
|
|
22
|
+
}) => {
|
|
23
|
+
if (!state) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
return /*#__PURE__*/React.createElement(Alert, {
|
|
27
|
+
className: "mb-md",
|
|
28
|
+
type: "danger"
|
|
29
|
+
}, "Any changes you do on the entry will not be stored!");
|
|
30
|
+
};
|
|
31
|
+
const shouldShowOriginal = params => {
|
|
32
|
+
const {
|
|
33
|
+
entry,
|
|
34
|
+
model
|
|
35
|
+
} = params;
|
|
36
|
+
/**
|
|
37
|
+
* In case of new entry or no model, show original.
|
|
38
|
+
* Also, for singleton models, show original.
|
|
39
|
+
*/
|
|
40
|
+
if (!entry?.id || !model?.tags) {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
return model.tags.includes(CMS_MODEL_SINGLETON_TAG);
|
|
44
|
+
};
|
|
45
|
+
export const ContentEntryFormWorkflow = ContentEntryForm.createDecorator(Original => {
|
|
46
|
+
return function ContentEntryFormWorkflow(props) {
|
|
47
|
+
const {
|
|
48
|
+
model
|
|
49
|
+
} = useModel();
|
|
50
|
+
const showOriginal = shouldShowOriginal({
|
|
51
|
+
entry: props.entry,
|
|
52
|
+
model
|
|
53
|
+
});
|
|
54
|
+
if (showOriginal) {
|
|
55
|
+
return /*#__PURE__*/React.createElement(Original, props);
|
|
56
|
+
}
|
|
57
|
+
return /*#__PURE__*/React.createElement(Grid, null, /*#__PURE__*/React.createElement(Grid.Column, {
|
|
58
|
+
span: 12
|
|
59
|
+
}, /*#__PURE__*/React.createElement(WorkflowStateBar, null)), /*#__PURE__*/React.createElement(Grid.Column, {
|
|
60
|
+
span: 12
|
|
61
|
+
}, /*#__PURE__*/React.createElement(WorkflowStateOverlay, null, ({
|
|
62
|
+
state
|
|
63
|
+
}) => {
|
|
64
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(StoreAlert, {
|
|
65
|
+
state: state
|
|
66
|
+
}), /*#__PURE__*/React.createElement(Original, Object.assign({}, props, {
|
|
67
|
+
persistEntry: state ? emptyFunction : props.persistEntry
|
|
68
|
+
})));
|
|
69
|
+
})));
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
//# sourceMappingURL=ContentEntryFormWorkflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","ContentEntryForm","useModel","Components","Alert","Grid","CMS_MODEL_SINGLETON_TAG","ContentReview","WorkflowStateBar","WorkflowStateOverlay","emptyFunction","StoreAlert","state","createElement","className","type","shouldShowOriginal","params","entry","model","id","tags","includes","ContentEntryFormWorkflow","createDecorator","Original","props","showOriginal","Column","span","Fragment","Object","assign","persistEntry"],"sources":["ContentEntryFormWorkflow.tsx"],"sourcesContent":["import React from \"react\";\nimport { ContentEntryForm, useModel } from \"@webiny/app-headless-cms\";\nimport type { IWorkflowState } from \"@webiny/app-workflows\";\nimport { Components } from \"@webiny/app-workflows\";\nimport { Alert, Grid } from \"@webiny/admin-ui\";\nimport type { PersistEntry } from \"@webiny/app-headless-cms/admin/components/ContentEntryForm/ContentEntryFormProvider.js\";\nimport { CMS_MODEL_SINGLETON_TAG } from \"@webiny/app-headless-cms-common\";\nimport type { CmsContentEntry, CmsModel } from \"@webiny/app-headless-cms-common/types/index.js\";\n\nconst {\n ContentReview: { WorkflowStateBar, WorkflowStateOverlay }\n} = Components;\n\n/**\n * To override storing of the entry when in workflow state.\n */\n// @ts-expect-error\nconst emptyFunction: PersistEntry = async () => {\n return void 0;\n};\n\ninterface IStoreAlertProps {\n state: IWorkflowState | undefined;\n}\n\nconst StoreAlert = ({ state }: IStoreAlertProps) => {\n if (!state) {\n return null;\n }\n return (\n <Alert className={\"mb-md\"} type=\"danger\">\n Any changes you do on the entry will not be stored!\n </Alert>\n );\n};\n\ninterface IShouldShowOriginalParams {\n entry: Partial<Pick<CmsContentEntry, \"id\">>;\n model: Partial<Pick<CmsModel, \"tags\">>;\n}\nconst shouldShowOriginal = (params: IShouldShowOriginalParams): boolean => {\n const { entry, model } = params;\n /**\n * In case of new entry or no model, show original.\n * Also, for singleton models, show original.\n */\n if (!entry?.id || !model?.tags) {\n return true;\n }\n return model.tags.includes(CMS_MODEL_SINGLETON_TAG);\n};\n\nexport const ContentEntryFormWorkflow = ContentEntryForm.createDecorator(Original => {\n return function ContentEntryFormWorkflow(props) {\n const { model } = useModel();\n\n const showOriginal = shouldShowOriginal({\n entry: props.entry,\n model\n });\n\n if (showOriginal) {\n return <Original {...props} />;\n }\n\n return (\n <Grid>\n <Grid.Column span={12}>\n <WorkflowStateBar />\n </Grid.Column>\n <Grid.Column span={12}>\n <WorkflowStateOverlay>\n {({ state }) => {\n return (\n <>\n <StoreAlert state={state} />\n <Original\n {...props}\n persistEntry={state ? emptyFunction : props.persistEntry}\n />\n </>\n );\n }}\n </WorkflowStateOverlay>\n </Grid.Column>\n </Grid>\n );\n };\n});\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,gBAAgB,EAAEC,QAAQ,QAAQ,0BAA0B;AAErE,SAASC,UAAU,QAAQ,uBAAuB;AAClD,SAASC,KAAK,EAAEC,IAAI,QAAQ,kBAAkB;AAE9C,SAASC,uBAAuB,QAAQ,iCAAiC;AAGzE,MAAM;EACFC,aAAa,EAAE;IAAEC,gBAAgB;IAAEC;EAAqB;AAC5D,CAAC,GAAGN,UAAU;;AAEd;AACA;AACA;AACA;AACA,MAAMO,aAA2B,GAAG,MAAAA,CAAA,KAAY;EAC5C,OAAO,KAAK,CAAC;AACjB,CAAC;AAMD,MAAMC,UAAU,GAAGA,CAAC;EAAEC;AAAwB,CAAC,KAAK;EAChD,IAAI,CAACA,KAAK,EAAE;IACR,OAAO,IAAI;EACf;EACA,oBACIZ,KAAA,CAAAa,aAAA,CAACT,KAAK;IAACU,SAAS,EAAE,OAAQ;IAACC,IAAI,EAAC;EAAQ,GAAC,qDAElC,CAAC;AAEhB,CAAC;AAMD,MAAMC,kBAAkB,GAAIC,MAAiC,IAAc;EACvE,MAAM;IAAEC,KAAK;IAAEC;EAAM,CAAC,GAAGF,MAAM;EAC/B;AACJ;AACA;AACA;EACI,IAAI,CAACC,KAAK,EAAEE,EAAE,IAAI,CAACD,KAAK,EAAEE,IAAI,EAAE;IAC5B,OAAO,IAAI;EACf;EACA,OAAOF,KAAK,CAACE,IAAI,CAACC,QAAQ,CAAChB,uBAAuB,CAAC;AACvD,CAAC;AAED,OAAO,MAAMiB,wBAAwB,GAAGtB,gBAAgB,CAACuB,eAAe,CAACC,QAAQ,IAAI;EACjF,OAAO,SAASF,wBAAwBA,CAACG,KAAK,EAAE;IAC5C,MAAM;MAAEP;IAAM,CAAC,GAAGjB,QAAQ,CAAC,CAAC;IAE5B,MAAMyB,YAAY,GAAGX,kBAAkB,CAAC;MACpCE,KAAK,EAAEQ,KAAK,CAACR,KAAK;MAClBC;IACJ,CAAC,CAAC;IAEF,IAAIQ,YAAY,EAAE;MACd,oBAAO3B,KAAA,CAAAa,aAAA,CAACY,QAAQ,EAAKC,KAAQ,CAAC;IAClC;IAEA,oBACI1B,KAAA,CAAAa,aAAA,CAACR,IAAI,qBACDL,KAAA,CAAAa,aAAA,CAACR,IAAI,CAACuB,MAAM;MAACC,IAAI,EAAE;IAAG,gBAClB7B,KAAA,CAAAa,aAAA,CAACL,gBAAgB,MAAE,CACV,CAAC,eACdR,KAAA,CAAAa,aAAA,CAACR,IAAI,CAACuB,MAAM;MAACC,IAAI,EAAE;IAAG,gBAClB7B,KAAA,CAAAa,aAAA,CAACJ,oBAAoB,QAChB,CAAC;MAAEG;IAAM,CAAC,KAAK;MACZ,oBACIZ,KAAA,CAAAa,aAAA,CAAAb,KAAA,CAAA8B,QAAA,qBACI9B,KAAA,CAAAa,aAAA,CAACF,UAAU;QAACC,KAAK,EAAEA;MAAM,CAAE,CAAC,eAC5BZ,KAAA,CAAAa,aAAA,CAACY,QAAQ,EAAAM,MAAA,CAAAC,MAAA,KACDN,KAAK;QACTO,YAAY,EAAErB,KAAK,GAAGF,aAAa,GAAGgB,KAAK,CAACO;MAAa,EAC5D,CACH,CAAC;IAEX,CACkB,CACb,CACX,CAAC;EAEf,CAAC;AACL,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { ContentEntryEditorConfig, useContentEntry } from "@webiny/app-headless-cms";
|
|
3
|
+
import { Components } from "@webiny/app-workflows";
|
|
4
|
+
import { useSecurity } from "@webiny/app-admin";
|
|
5
|
+
import { useApolloClient } from "@apollo/react-hooks";
|
|
6
|
+
import { createAppName } from "../../utils/appName.js";
|
|
7
|
+
const {
|
|
8
|
+
ContentReview: {
|
|
9
|
+
WorkflowStateProvider
|
|
10
|
+
}
|
|
11
|
+
} = Components;
|
|
12
|
+
const {
|
|
13
|
+
ContentEntry
|
|
14
|
+
} = ContentEntryEditorConfig;
|
|
15
|
+
export const ContentEntryWorkflow = ContentEntry.createDecorator(Original => {
|
|
16
|
+
return function ContentEntryWorkflowSetup() {
|
|
17
|
+
const {
|
|
18
|
+
entry,
|
|
19
|
+
contentModel: model
|
|
20
|
+
} = useContentEntry();
|
|
21
|
+
const client = useApolloClient();
|
|
22
|
+
const {
|
|
23
|
+
identity
|
|
24
|
+
} = useSecurity();
|
|
25
|
+
return /*#__PURE__*/React.createElement(WorkflowStateProvider, {
|
|
26
|
+
app: createAppName(model),
|
|
27
|
+
id: entry.id,
|
|
28
|
+
identity: identity,
|
|
29
|
+
client: client,
|
|
30
|
+
title: `${model.name}: ${entry.meta?.title || "unknown"}`
|
|
31
|
+
}, /*#__PURE__*/React.createElement(Original, null));
|
|
32
|
+
};
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
//# sourceMappingURL=ContentEntryWorkflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","ContentEntryEditorConfig","useContentEntry","Components","useSecurity","useApolloClient","createAppName","ContentReview","WorkflowStateProvider","ContentEntry","ContentEntryWorkflow","createDecorator","Original","ContentEntryWorkflowSetup","entry","contentModel","model","client","identity","createElement","app","id","title","name","meta"],"sources":["ContentEntryWorkflow.tsx"],"sourcesContent":["import React from \"react\";\nimport { ContentEntryEditorConfig, useContentEntry } from \"@webiny/app-headless-cms\";\nimport { Components } from \"@webiny/app-workflows\";\nimport { useSecurity } from \"@webiny/app-admin\";\nimport { useApolloClient } from \"@apollo/react-hooks\";\nimport { createAppName } from \"~/utils/appName.js\";\n\nconst {\n ContentReview: { WorkflowStateProvider }\n} = Components;\n\nconst { ContentEntry } = ContentEntryEditorConfig;\n\nexport const ContentEntryWorkflow = ContentEntry.createDecorator(Original => {\n return function ContentEntryWorkflowSetup() {\n const { entry, contentModel: model } = useContentEntry();\n const client = useApolloClient();\n\n const { identity } = useSecurity();\n\n return (\n <WorkflowStateProvider\n app={createAppName(model)}\n id={entry.id}\n identity={identity}\n client={client}\n title={`${model.name}: ${entry.meta?.title || \"unknown\"}`}\n >\n <Original />\n </WorkflowStateProvider>\n );\n };\n});\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,wBAAwB,EAAEC,eAAe,QAAQ,0BAA0B;AACpF,SAASC,UAAU,QAAQ,uBAAuB;AAClD,SAASC,WAAW,QAAQ,mBAAmB;AAC/C,SAASC,eAAe,QAAQ,qBAAqB;AACrD,SAASC,aAAa;AAEtB,MAAM;EACFC,aAAa,EAAE;IAAEC;EAAsB;AAC3C,CAAC,GAAGL,UAAU;AAEd,MAAM;EAAEM;AAAa,CAAC,GAAGR,wBAAwB;AAEjD,OAAO,MAAMS,oBAAoB,GAAGD,YAAY,CAACE,eAAe,CAACC,QAAQ,IAAI;EACzE,OAAO,SAASC,yBAAyBA,CAAA,EAAG;IACxC,MAAM;MAAEC,KAAK;MAAEC,YAAY,EAAEC;IAAM,CAAC,GAAGd,eAAe,CAAC,CAAC;IACxD,MAAMe,MAAM,GAAGZ,eAAe,CAAC,CAAC;IAEhC,MAAM;MAAEa;IAAS,CAAC,GAAGd,WAAW,CAAC,CAAC;IAElC,oBACIJ,KAAA,CAAAmB,aAAA,CAACX,qBAAqB;MAClBY,GAAG,EAAEd,aAAa,CAACU,KAAK,CAAE;MAC1BK,EAAE,EAAEP,KAAK,CAACO,EAAG;MACbH,QAAQ,EAAEA,QAAS;MACnBD,MAAM,EAAEA,MAAO;MACfK,KAAK,EAAE,GAAGN,KAAK,CAACO,IAAI,KAAKT,KAAK,CAACU,IAAI,EAAEF,KAAK,IAAI,SAAS;IAAG,gBAE1DtB,KAAA,CAAAmB,aAAA,CAACP,QAAQ,MAAE,CACQ,CAAC;EAEhC,CAAC;AACL,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { ContentEntryFormWorkflow } from "./ContentEntryFormWorkflow.js";
|
|
2
|
+
export { ContentEntryWorkflow } from "./ContentEntryWorkflow.js";
|
|
3
|
+
export { CmsEntryFormTooltipButton } from "./CmsEntryFormTooltipButton.js";
|
|
4
|
+
export { CmsEntryFormScheduleMenuItemAction } from "./CmsEntryFormScheduleMenuItemAction.js";
|
|
5
|
+
export { CmsEntryFormSaveAndPublishButton } from "./CmsEntryFormSaveAndPublishButton.js";
|
|
6
|
+
export { CmsEntryFormSaveButton } from "./CmsEntryFormSaveButton.js";
|
|
7
|
+
export { CmsEntryFormCreateNewRevisionButton } from "./CmsEntryFormCreateNewRevisionButton.js";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { ContentEntryFormWorkflow } from "./ContentEntryFormWorkflow.js";
|
|
2
|
+
export { ContentEntryWorkflow } from "./ContentEntryWorkflow.js";
|
|
3
|
+
export { CmsEntryFormTooltipButton } from "./CmsEntryFormTooltipButton.js";
|
|
4
|
+
export { CmsEntryFormScheduleMenuItemAction } from "./CmsEntryFormScheduleMenuItemAction.js";
|
|
5
|
+
export { CmsEntryFormSaveAndPublishButton } from "./CmsEntryFormSaveAndPublishButton.js";
|
|
6
|
+
export { CmsEntryFormSaveButton } from "./CmsEntryFormSaveButton.js";
|
|
7
|
+
export { CmsEntryFormCreateNewRevisionButton } from "./CmsEntryFormCreateNewRevisionButton.js";
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["ContentEntryFormWorkflow","ContentEntryWorkflow","CmsEntryFormTooltipButton","CmsEntryFormScheduleMenuItemAction","CmsEntryFormSaveAndPublishButton","CmsEntryFormSaveButton","CmsEntryFormCreateNewRevisionButton"],"sources":["index.ts"],"sourcesContent":["export { ContentEntryFormWorkflow } from \"./ContentEntryFormWorkflow.js\";\nexport { ContentEntryWorkflow } from \"./ContentEntryWorkflow.js\";\nexport { CmsEntryFormTooltipButton } from \"./CmsEntryFormTooltipButton.js\";\nexport { CmsEntryFormScheduleMenuItemAction } from \"./CmsEntryFormScheduleMenuItemAction.js\";\nexport { CmsEntryFormSaveAndPublishButton } from \"./CmsEntryFormSaveAndPublishButton.js\";\nexport { CmsEntryFormSaveButton } from \"./CmsEntryFormSaveButton.js\";\nexport { CmsEntryFormCreateNewRevisionButton } from \"./CmsEntryFormCreateNewRevisionButton.js\";\n"],"mappings":"AAAA,SAASA,wBAAwB;AACjC,SAASC,oBAAoB;AAC7B,SAASC,yBAAyB;AAClC,SAASC,kCAAkC;AAC3C,SAASC,gCAAgC;AACzC,SAASC,sBAAsB;AAC/B,SAASC,mCAAmC","ignoreList":[]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import React, { useCallback } from "react";
|
|
2
|
+
import { DropdownMenu, Icon } from "@webiny/admin-ui";
|
|
3
|
+
import { Components } from "@webiny/app-workflows";
|
|
4
|
+
import { ReactComponent as OpenInNewIcon } from "@webiny/icons/open_in_new.svg";
|
|
5
|
+
import { useRouter } from "@webiny/app";
|
|
6
|
+
import { Routes } from "@webiny/app-headless-cms/routes.js";
|
|
7
|
+
import { isCmsAppName, parseAppName } from "../../utils/appName.js";
|
|
8
|
+
const {
|
|
9
|
+
OpenInNewWindow
|
|
10
|
+
} = Components.List.Options;
|
|
11
|
+
export const ListOpenInNewWindow = OpenInNewWindow.createDecorator(Original => {
|
|
12
|
+
return function ListOpenInNewWindow(props) {
|
|
13
|
+
const {
|
|
14
|
+
state
|
|
15
|
+
} = props;
|
|
16
|
+
const {
|
|
17
|
+
getLink
|
|
18
|
+
} = useRouter();
|
|
19
|
+
const onClick = useCallback(() => {
|
|
20
|
+
const modelId = parseAppName(state.app);
|
|
21
|
+
const url = getLink(Routes.ContentEntries.List, {
|
|
22
|
+
modelId,
|
|
23
|
+
id: state.targetRevisionId,
|
|
24
|
+
// TODO figure out how to load folderId
|
|
25
|
+
folderId: "root"
|
|
26
|
+
});
|
|
27
|
+
const goTo = `${window.location.origin}${url}`;
|
|
28
|
+
window.open(goTo, "_blank");
|
|
29
|
+
}, [state.id]);
|
|
30
|
+
if (isCmsAppName(state.app) === false) {
|
|
31
|
+
return /*#__PURE__*/React.createElement(Original, props);
|
|
32
|
+
}
|
|
33
|
+
return /*#__PURE__*/React.createElement(DropdownMenu.Item, {
|
|
34
|
+
icon: /*#__PURE__*/React.createElement(Icon, {
|
|
35
|
+
icon: /*#__PURE__*/React.createElement(OpenInNewIcon, null),
|
|
36
|
+
label: "Open In New Window"
|
|
37
|
+
}),
|
|
38
|
+
text: "Open in New Window",
|
|
39
|
+
onClick: onClick
|
|
40
|
+
});
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
//# sourceMappingURL=OpenInNewWindow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","useCallback","DropdownMenu","Icon","Components","ReactComponent","OpenInNewIcon","useRouter","Routes","isCmsAppName","parseAppName","OpenInNewWindow","List","Options","ListOpenInNewWindow","createDecorator","Original","props","state","getLink","onClick","modelId","app","url","ContentEntries","id","targetRevisionId","folderId","goTo","window","location","origin","open","createElement","Item","icon","label","text"],"sources":["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"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,WAAW,QAAQ,OAAO;AAC1C,SAASC,YAAY,EAAEC,IAAI,QAAQ,kBAAkB;AACrD,SAASC,UAAU,QAAQ,uBAAuB;AAClD,SAASC,cAAc,IAAIC,aAAa,QAAQ,+BAA+B;AAC/E,SAASC,SAAS,QAAQ,aAAa;AACvC,SAASC,MAAM,QAAQ,oCAAoC;AAC3D,SAASC,YAAY,EAAEC,YAAY;AAEnC,MAAM;EAAEC;AAAgB,CAAC,GAAGP,UAAU,CAACQ,IAAI,CAACC,OAAO;AAEnD,OAAO,MAAMC,mBAAmB,GAAGH,eAAe,CAACI,eAAe,CAACC,QAAQ,IAAI;EAC3E,OAAO,SAASF,mBAAmBA,CAACG,KAAK,EAAE;IACvC,MAAM;MAAEC;IAAM,CAAC,GAAGD,KAAK;IAEvB,MAAM;MAAEE;IAAQ,CAAC,GAAGZ,SAAS,CAAC,CAAC;IAC/B,MAAMa,OAAO,GAAGnB,WAAW,CAAC,MAAM;MAC9B,MAAMoB,OAAO,GAAGX,YAAY,CAACQ,KAAK,CAACI,GAAG,CAAC;MACvC,MAAMC,GAAG,GAAGJ,OAAO,CAACX,MAAM,CAACgB,cAAc,CAACZ,IAAI,EAAE;QAC5CS,OAAO;QACPI,EAAE,EAAEP,KAAK,CAACQ,gBAAgB;QAC1B;QACAC,QAAQ,EAAE;MACd,CAAC,CAAC;MAEF,MAAMC,IAAI,GAAG,GAAGC,MAAM,CAACC,QAAQ,CAACC,MAAM,GAAGR,GAAG,EAAE;MAE9CM,MAAM,CAACG,IAAI,CAACJ,IAAI,EAAE,QAAQ,CAAC;IAC/B,CAAC,EAAE,CAACV,KAAK,CAACO,EAAE,CAAC,CAAC;IAEd,IAAIhB,YAAY,CAACS,KAAK,CAACI,GAAG,CAAC,KAAK,KAAK,EAAE;MACnC,oBAAOtB,KAAA,CAAAiC,aAAA,CAACjB,QAAQ,EAAKC,KAAQ,CAAC;IAClC;IAEA,oBACIjB,KAAA,CAAAiC,aAAA,CAAC/B,YAAY,CAACgC,IAAI;MACdC,IAAI,eAAEnC,KAAA,CAAAiC,aAAA,CAAC9B,IAAI;QAACgC,IAAI,eAAEnC,KAAA,CAAAiC,aAAA,CAAC3B,aAAa,MAAE,CAAE;QAAC8B,KAAK,EAAE;MAAqB,CAAE,CAAE;MACrEC,IAAI,EAAE,oBAAqB;MAC3BjB,OAAO,EAAEA;IAAQ,CACpB,CAAC;EAEV,CAAC;AACL,CAAC,CAAC","ignoreList":[]}
|
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,35 @@
|
|
|
1
|
+
import React, { Suspense } from "react";
|
|
2
|
+
import { Routes } from "../routes.js";
|
|
3
|
+
import Helmet from "react-helmet";
|
|
4
|
+
import { CmsWorkflowsEditorView, CmsWorkflowsEditorMenu } from "../Components/CmsWorkflows/CmsWorkflowsEditorView.js";
|
|
5
|
+
import { i18n } from "@webiny/app/i18n/index.js";
|
|
6
|
+
import { SecureRoute } from "@webiny/app-admin";
|
|
7
|
+
import { OverlayLoader } from "@webiny/admin-ui";
|
|
8
|
+
import { AdminConfig, AdminLayout } from "@webiny/app-admin";
|
|
9
|
+
import { useCanUseWorkflows } from "@webiny/app-workflows";
|
|
10
|
+
const t = i18n.namespace("HeadlessCms.Workflows.Editor");
|
|
11
|
+
const Loader = ({
|
|
12
|
+
children,
|
|
13
|
+
...props
|
|
14
|
+
}) => /*#__PURE__*/React.createElement(Suspense, {
|
|
15
|
+
fallback: /*#__PURE__*/React.createElement(OverlayLoader, null)
|
|
16
|
+
}, /*#__PURE__*/React.cloneElement(children, props));
|
|
17
|
+
const {
|
|
18
|
+
Route
|
|
19
|
+
} = AdminConfig;
|
|
20
|
+
export const CmsWorkflowsEditor = () => {
|
|
21
|
+
const {
|
|
22
|
+
canUseWorkflows
|
|
23
|
+
} = useCanUseWorkflows();
|
|
24
|
+
if (!canUseWorkflows) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
return /*#__PURE__*/React.createElement(AdminConfig, null, /*#__PURE__*/React.createElement(Route, {
|
|
28
|
+
route: Routes.ContentModels.Workflows,
|
|
29
|
+
element: /*#__PURE__*/React.createElement(SecureRoute, {
|
|
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));
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
//# sourceMappingURL=CmsWorkflowsEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","Suspense","Routes","Helmet","CmsWorkflowsEditorView","CmsWorkflowsEditorMenu","i18n","SecureRoute","OverlayLoader","AdminConfig","AdminLayout","useCanUseWorkflows","t","namespace","Loader","children","props","createElement","fallback","cloneElement","Route","CmsWorkflowsEditor","canUseWorkflows","route","ContentModels","Workflows","element","permission"],"sources":["CmsWorkflowsEditor.tsx"],"sourcesContent":["import React, { Suspense } from \"react\";\nimport { Routes } from \"~/routes.js\";\nimport Helmet from \"react-helmet\";\nimport {\n CmsWorkflowsEditorView,\n CmsWorkflowsEditorMenu\n} from \"~/Components/CmsWorkflows/CmsWorkflowsEditorView.js\";\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\";\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 <Loader>\n <CmsWorkflowsEditorView />\n </Loader>\n </AdminLayout>\n </SecureRoute>\n }\n />\n <CmsWorkflowsEditorMenu />\n </AdminConfig>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,QAAQ,QAAQ,OAAO;AACvC,SAASC,MAAM;AACf,OAAOC,MAAM,MAAM,cAAc;AACjC,SACIC,sBAAsB,EACtBC,sBAAsB;AAE1B,SAASC,IAAI,QAAQ,2BAA2B;AAChD,SAASC,WAAW,QAAQ,mBAAmB;AAC/C,SAASC,aAAa,QAAQ,kBAAkB;AAChD,SAASC,WAAW,EAAEC,WAAW,QAAQ,mBAAmB;AAC5D,SAASC,kBAAkB,QAAQ,uBAAuB;AAE1D,MAAMC,CAAC,GAAGN,IAAI,CAACO,SAAS,CAAC,8BAA8B,CAAC;AAMxD,MAAMC,MAAM,GAAGA,CAAC;EAAEC,QAAQ;EAAE,GAAGC;AAAmB,CAAC,kBAC/ChB,KAAA,CAAAiB,aAAA,CAAChB,QAAQ;EAACiB,QAAQ,eAAElB,KAAA,CAAAiB,aAAA,CAACT,aAAa,MAAE;AAAE,gBACjCR,KAAK,CAACmB,YAAY,CAACJ,QAAQ,EAAmCC,KAAK,CAC9D,CACb;AAED,MAAM;EAAEI;AAAM,CAAC,GAAGX,WAAW;AAE7B,OAAO,MAAMY,kBAAkB,GAAGA,CAAA,KAAM;EACpC,MAAM;IAAEC;EAAgB,CAAC,GAAGX,kBAAkB,CAAC,CAAC;EAChD,IAAI,CAACW,eAAe,EAAE;IAClB,OAAO,IAAI;EACf;EACA,oBACItB,KAAA,CAAAiB,aAAA,CAACR,WAAW,qBACRT,KAAA,CAAAiB,aAAA,CAACG,KAAK;IACFG,KAAK,EAAErB,MAAM,CAACsB,aAAa,CAACC,SAAU;IACtCC,OAAO,eACH1B,KAAA,CAAAiB,aAAA,CAACV,WAAW;MAACoB,UAAU,EAAE;IAAmB,gBACxC3B,KAAA,CAAAiB,aAAA,CAACP,WAAW,qBACRV,KAAA,CAAAiB,aAAA,CAACd,MAAM,qBACHH,KAAA,CAAAiB,aAAA,gBAAQL,CAAC,WAAmB,CACxB,CAAC,eACTZ,KAAA,CAAAiB,aAAA,CAACH,MAAM,qBACHd,KAAA,CAAAiB,aAAA,CAACb,sBAAsB,MAAE,CACrB,CACC,CACJ;EAChB,CACJ,CAAC,eACFJ,KAAA,CAAAiB,aAAA,CAACZ,sBAAsB,MAAE,CAChB,CAAC;AAEtB,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CmsWorkflowsEditor } from "./CmsWorkflowsEditor.js";
|
package/Routes/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["CmsWorkflowsEditor"],"sources":["index.ts"],"sourcesContent":["export { CmsWorkflowsEditor } from \"./CmsWorkflowsEditor.js\";\n"],"mappings":"AAAA,SAASA,kBAAkB","ignoreList":[]}
|
package/index.d.ts
ADDED
package/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Wcp } from "@webiny/app-admin";
|
|
3
|
+
import { CmsWorkflowsEditor } from "./Routes/index.js";
|
|
4
|
+
import { CmsEntryFormSaveAndPublishButton, CmsEntryFormSaveButton, CmsEntryFormScheduleMenuItemAction, CmsEntryFormTooltipButton, ContentEntryFormWorkflow, ContentEntryWorkflow } from "./Components/ContentEntryForm/index.js";
|
|
5
|
+
import { CmsEntriesWorkflowStateListFooterMenu } from "./Components/CmsEntriesWorkflowStateList/index.js";
|
|
6
|
+
import { ListOpenInNewWindow } from "./Components/OptionItem/OpenInNewWindow.js";
|
|
7
|
+
import { CmsEntryFormCreateNewRevisionButton } from "./Components/ContentEntryForm/CmsEntryFormCreateNewRevisionButton.js";
|
|
8
|
+
export const CmsWorkflows = () => {
|
|
9
|
+
return /*#__PURE__*/React.createElement(Wcp.CanUseWorkflows, null, /*#__PURE__*/React.createElement(ListOpenInNewWindow, null), /*#__PURE__*/React.createElement(CmsEntriesWorkflowStateListFooterMenu, null), /*#__PURE__*/React.createElement(CmsWorkflowsEditor, null), /*#__PURE__*/React.createElement(ContentEntryFormWorkflow, null), /*#__PURE__*/React.createElement(ContentEntryWorkflow, null), /*#__PURE__*/React.createElement(CmsEntryFormTooltipButton, null), /*#__PURE__*/React.createElement(CmsEntryFormScheduleMenuItemAction, null), /*#__PURE__*/React.createElement(CmsEntryFormSaveAndPublishButton, null), /*#__PURE__*/React.createElement(CmsEntryFormSaveButton, null), /*#__PURE__*/React.createElement(CmsEntryFormCreateNewRevisionButton, null));
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
package/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","Wcp","CmsWorkflowsEditor","CmsEntryFormSaveAndPublishButton","CmsEntryFormSaveButton","CmsEntryFormScheduleMenuItemAction","CmsEntryFormTooltipButton","ContentEntryFormWorkflow","ContentEntryWorkflow","CmsEntriesWorkflowStateListFooterMenu","ListOpenInNewWindow","CmsEntryFormCreateNewRevisionButton","CmsWorkflows","createElement","CanUseWorkflows"],"sources":["index.tsx"],"sourcesContent":["import React from \"react\";\nimport { Wcp } from \"@webiny/app-admin\";\nimport { CmsWorkflowsEditor } from \"~/Routes/index.js\";\nimport {\n CmsEntryFormSaveAndPublishButton,\n CmsEntryFormSaveButton,\n CmsEntryFormScheduleMenuItemAction,\n CmsEntryFormTooltipButton,\n ContentEntryFormWorkflow,\n ContentEntryWorkflow\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\";\n\nexport const CmsWorkflows = () => {\n return (\n <Wcp.CanUseWorkflows>\n <ListOpenInNewWindow />\n <CmsEntriesWorkflowStateListFooterMenu />\n <CmsWorkflowsEditor />\n <ContentEntryFormWorkflow />\n <ContentEntryWorkflow />\n <CmsEntryFormTooltipButton />\n <CmsEntryFormScheduleMenuItemAction />\n <CmsEntryFormSaveAndPublishButton />\n <CmsEntryFormSaveButton />\n <CmsEntryFormCreateNewRevisionButton />\n </Wcp.CanUseWorkflows>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,GAAG,QAAQ,mBAAmB;AACvC,SAASC,kBAAkB;AAC3B,SACIC,gCAAgC,EAChCC,sBAAsB,EACtBC,kCAAkC,EAClCC,yBAAyB,EACzBC,wBAAwB,EACxBC,oBAAoB;AAExB,SAASC,qCAAqC;AAC9C,SAASC,mBAAmB;AAC5B,SAASC,mCAAmC;AAE5C,OAAO,MAAMC,YAAY,GAAGA,CAAA,KAAM;EAC9B,oBACIZ,KAAA,CAAAa,aAAA,CAACZ,GAAG,CAACa,eAAe,qBAChBd,KAAA,CAAAa,aAAA,CAACH,mBAAmB,MAAE,CAAC,eACvBV,KAAA,CAAAa,aAAA,CAACJ,qCAAqC,MAAE,CAAC,eACzCT,KAAA,CAAAa,aAAA,CAACX,kBAAkB,MAAE,CAAC,eACtBF,KAAA,CAAAa,aAAA,CAACN,wBAAwB,MAAE,CAAC,eAC5BP,KAAA,CAAAa,aAAA,CAACL,oBAAoB,MAAE,CAAC,eACxBR,KAAA,CAAAa,aAAA,CAACP,yBAAyB,MAAE,CAAC,eAC7BN,KAAA,CAAAa,aAAA,CAACR,kCAAkC,MAAE,CAAC,eACtCL,KAAA,CAAAa,aAAA,CAACV,gCAAgC,MAAE,CAAC,eACpCH,KAAA,CAAAa,aAAA,CAACT,sBAAsB,MAAE,CAAC,eAC1BJ,KAAA,CAAAa,aAAA,CAACF,mCAAmC,MAAE,CACrB,CAAC;AAE9B,CAAC","ignoreList":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@webiny/app-headless-cms-workflows",
|
|
3
|
+
"version": "0.0.0-unstable.61c048f412",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/webiny/webiny-js.git"
|
|
9
|
+
},
|
|
10
|
+
"author": "Webiny Ltd",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"@apollo/react-hooks": "3.1.5",
|
|
14
|
+
"@fortawesome/react-fontawesome": "0.1.19",
|
|
15
|
+
"@webiny/admin-ui": "0.0.0-unstable.61c048f412",
|
|
16
|
+
"@webiny/app": "0.0.0-unstable.61c048f412",
|
|
17
|
+
"@webiny/app-admin": "0.0.0-unstable.61c048f412",
|
|
18
|
+
"@webiny/app-headless-cms": "0.0.0-unstable.61c048f412",
|
|
19
|
+
"@webiny/app-headless-cms-common": "0.0.0-unstable.61c048f412",
|
|
20
|
+
"@webiny/app-workflows": "0.0.0-unstable.61c048f412",
|
|
21
|
+
"@webiny/icons": "0.0.0-unstable.61c048f412",
|
|
22
|
+
"mobx-react-lite": "3.4.3",
|
|
23
|
+
"react": "18.2.0",
|
|
24
|
+
"react-dom": "18.2.0",
|
|
25
|
+
"react-helmet": "6.1.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/react": "18.2.79",
|
|
29
|
+
"@webiny/build-tools": "0.0.0-unstable.61c048f412",
|
|
30
|
+
"rimraf": "6.1.2",
|
|
31
|
+
"typescript": "5.9.3"
|
|
32
|
+
},
|
|
33
|
+
"publishConfig": {
|
|
34
|
+
"access": "public",
|
|
35
|
+
"directory": "dist"
|
|
36
|
+
},
|
|
37
|
+
"svgo": {
|
|
38
|
+
"plugins": {
|
|
39
|
+
"removeViewBox": false
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"gitHead": "61c048f412d6b4aa70c1d105aab21e3fa69730f3"
|
|
43
|
+
}
|
package/routes.d.ts
ADDED
package/routes.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Route } from "@webiny/app-admin";
|
|
2
|
+
export const Routes = {
|
|
3
|
+
ContentModels: {
|
|
4
|
+
Workflows: new Route({
|
|
5
|
+
name: "Cms/ContentModels/Workflows",
|
|
6
|
+
path: "/cms/content-models/workflows",
|
|
7
|
+
params: zod => {
|
|
8
|
+
return {
|
|
9
|
+
app: zod.string().optional()
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
})
|
|
13
|
+
},
|
|
14
|
+
ContentEntries: {
|
|
15
|
+
WorkflowStateList: new Route({
|
|
16
|
+
name: "Cms/ContentEntries/WorkflowStateList",
|
|
17
|
+
path: "/cms/workflow-states"
|
|
18
|
+
})
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=routes.js.map
|
package/routes.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Route","Routes","ContentModels","Workflows","name","path","params","zod","app","string","optional","ContentEntries","WorkflowStateList"],"sources":["routes.ts"],"sourcesContent":["import { Route } from \"@webiny/app-admin\";\n\nexport const Routes = {\n ContentModels: {\n Workflows: new Route({\n name: \"Cms/ContentModels/Workflows\",\n path: \"/cms/content-models/workflows\",\n params: zod => {\n return {\n app: zod.string().optional()\n };\n }\n })\n },\n ContentEntries: {\n WorkflowStateList: new Route({\n name: \"Cms/ContentEntries/WorkflowStateList\",\n path: \"/cms/workflow-states\"\n })\n }\n};\n"],"mappings":"AAAA,SAASA,KAAK,QAAQ,mBAAmB;AAEzC,OAAO,MAAMC,MAAM,GAAG;EAClBC,aAAa,EAAE;IACXC,SAAS,EAAE,IAAIH,KAAK,CAAC;MACjBI,IAAI,EAAE,6BAA6B;MACnCC,IAAI,EAAE,+BAA+B;MACrCC,MAAM,EAAEC,GAAG,IAAI;QACX,OAAO;UACHC,GAAG,EAAED,GAAG,CAACE,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC;QAC/B,CAAC;MACL;IACJ,CAAC;EACL,CAAC;EACDC,cAAc,EAAE;IACZC,iBAAiB,EAAE,IAAIZ,KAAK,CAAC;MACzBI,IAAI,EAAE,sCAAsC;MAC5CC,IAAI,EAAE;IACV,CAAC;EACL;AACJ,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CmsModel } from "@webiny/app-headless-cms-common/types/index.js";
|
|
2
|
+
export declare const createAppName: (model: Pick<CmsModel, "modelId">) => string;
|
|
3
|
+
export declare const parseAppName: (appName: string) => string;
|
|
4
|
+
export declare const isCmsAppName: (appName: string) => boolean;
|
package/utils/appName.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export const createAppName = model => {
|
|
2
|
+
return `cms.${model.modelId}`;
|
|
3
|
+
};
|
|
4
|
+
export const parseAppName = appName => {
|
|
5
|
+
const parts = appName.split(".");
|
|
6
|
+
if (parts.length !== 2 || parts[0] !== "cms") {
|
|
7
|
+
throw new Error(`Invalid app name: "${appName}".`);
|
|
8
|
+
}
|
|
9
|
+
return parts[1];
|
|
10
|
+
};
|
|
11
|
+
export const isCmsAppName = appName => {
|
|
12
|
+
const parts = appName.split(".");
|
|
13
|
+
return parts.length === 2 && parts[0] === "cms";
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=appName.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createAppName","model","modelId","parseAppName","appName","parts","split","length","Error","isCmsAppName"],"sources":["appName.ts"],"sourcesContent":["import type { CmsModel } from \"@webiny/app-headless-cms-common/types/index.js\";\n\nexport const createAppName = (model: Pick<CmsModel, \"modelId\">): string => {\n return `cms.${model.modelId}`;\n};\n\nexport const parseAppName = (appName: string): string => {\n const parts = appName.split(\".\");\n if (parts.length !== 2 || parts[0] !== \"cms\") {\n throw new Error(`Invalid app name: \"${appName}\".`);\n }\n return parts[1];\n};\n\nexport const isCmsAppName = (appName: string): boolean => {\n const parts = appName.split(\".\");\n return parts.length === 2 && parts[0] === \"cms\";\n};\n"],"mappings":"AAEA,OAAO,MAAMA,aAAa,GAAIC,KAAgC,IAAa;EACvE,OAAO,OAAOA,KAAK,CAACC,OAAO,EAAE;AACjC,CAAC;AAED,OAAO,MAAMC,YAAY,GAAIC,OAAe,IAAa;EACrD,MAAMC,KAAK,GAAGD,OAAO,CAACE,KAAK,CAAC,GAAG,CAAC;EAChC,IAAID,KAAK,CAACE,MAAM,KAAK,CAAC,IAAIF,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE;IAC1C,MAAM,IAAIG,KAAK,CAAC,sBAAsBJ,OAAO,IAAI,CAAC;EACtD;EACA,OAAOC,KAAK,CAAC,CAAC,CAAC;AACnB,CAAC;AAED,OAAO,MAAMI,YAAY,GAAIL,OAAe,IAAc;EACtD,MAAMC,KAAK,GAAGD,OAAO,CAACE,KAAK,CAAC,GAAG,CAAC;EAChC,OAAOD,KAAK,CAACE,MAAM,KAAK,CAAC,IAAIF,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK;AACnD,CAAC","ignoreList":[]}
|