@webiny/app-headless-cms-workflows 6.4.5-beta.0 → 6.6.0-alpha.0

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.
Files changed (64) hide show
  1. package/Components/CmsEntriesWorkflowStateList/CmsEntriesWorkflowStateListFooterMenu.js +27 -25
  2. package/Components/CmsEntriesWorkflowStateList/CmsEntriesWorkflowStateListFooterMenu.js.map +1 -1
  3. package/Components/ContentEntryForm/CmsEntryFormCreateNewRevisionButton.js +14 -22
  4. package/Components/ContentEntryForm/CmsEntryFormCreateNewRevisionButton.js.map +1 -1
  5. package/Components/ContentEntryForm/CmsEntryFormScheduleMenuItemAction.js +3 -4
  6. package/Components/ContentEntryForm/CmsEntryFormScheduleMenuItemAction.js.map +1 -1
  7. package/Components/ContentEntryForm/ContentEntryFormWorkflow.js +20 -36
  8. package/Components/ContentEntryForm/ContentEntryFormWorkflow.js.map +1 -1
  9. package/Components/ContentEntryForm/index.d.ts +0 -3
  10. package/Components/ContentEntryForm/index.js +0 -3
  11. package/Routes/CmsWorkflowsEditor.js +1 -1
  12. package/Routes/CmsWorkflowsEditor.js.map +1 -1
  13. package/features/WorkflowStateCacheHandler.d.ts +11 -0
  14. package/features/WorkflowStateCacheHandler.js +50 -0
  15. package/features/WorkflowStateCacheHandler.js.map +1 -0
  16. package/features/feature.d.ts +1 -0
  17. package/features/feature.js +11 -0
  18. package/features/feature.js.map +1 -0
  19. package/index.js +12 -3
  20. package/index.js.map +1 -1
  21. package/package.json +14 -12
  22. package/presentation/CmsWorkflowsEditorView.d.ts +5 -0
  23. package/{Components/CmsWorkflows → presentation}/CmsWorkflowsEditorView.js +27 -27
  24. package/presentation/CmsWorkflowsEditorView.js.map +1 -0
  25. package/presentation/ContentEntryFormPresenterWorkflowDecorator.d.ts +24 -0
  26. package/presentation/ContentEntryFormPresenterWorkflowDecorator.js +67 -0
  27. package/presentation/ContentEntryFormPresenterWorkflowDecorator.js.map +1 -0
  28. package/presentation/TableRowMapperWorkflowDecorator.d.ts +11 -0
  29. package/presentation/TableRowMapperWorkflowDecorator.js +25 -0
  30. package/presentation/TableRowMapperWorkflowDecorator.js.map +1 -0
  31. package/presentation/WorkflowStateGetEntryFieldSelection.d.ts +8 -0
  32. package/presentation/WorkflowStateGetEntryFieldSelection.js +24 -0
  33. package/presentation/WorkflowStateGetEntryFieldSelection.js.map +1 -0
  34. package/presentation/WorkflowStateListEntriesFieldSelection.d.ts +8 -0
  35. package/presentation/WorkflowStateListEntriesFieldSelection.js +24 -0
  36. package/presentation/WorkflowStateListEntriesFieldSelection.js.map +1 -0
  37. package/presentation/cmsWorkflowsEditor/CmsWorkflowsEditorPresenter.d.ts +15 -0
  38. package/presentation/cmsWorkflowsEditor/CmsWorkflowsEditorPresenter.js +50 -0
  39. package/presentation/cmsWorkflowsEditor/CmsWorkflowsEditorPresenter.js.map +1 -0
  40. package/presentation/cmsWorkflowsEditor/abstractions.d.ts +19 -0
  41. package/presentation/cmsWorkflowsEditor/abstractions.js +5 -0
  42. package/presentation/cmsWorkflowsEditor/abstractions.js.map +1 -0
  43. package/presentation/cmsWorkflowsEditor/feature.d.ts +3 -0
  44. package/presentation/cmsWorkflowsEditor/feature.js +17 -0
  45. package/presentation/cmsWorkflowsEditor/feature.js.map +1 -0
  46. package/presentation/feature.d.ts +1 -0
  47. package/presentation/feature.js +21 -0
  48. package/presentation/feature.js.map +1 -0
  49. package/types.d.ts +10 -0
  50. package/types.js +0 -0
  51. package/Components/CmsWorkflows/CmsWorkflowsEditorView.d.ts +0 -3
  52. package/Components/CmsWorkflows/CmsWorkflowsEditorView.js.map +0 -1
  53. package/Components/ContentEntryForm/CmsEntryFormPublishButton.d.ts +0 -2
  54. package/Components/ContentEntryForm/CmsEntryFormPublishButton.js +0 -26
  55. package/Components/ContentEntryForm/CmsEntryFormPublishButton.js.map +0 -1
  56. package/Components/ContentEntryForm/CmsEntryFormSaveAndPublishButton.d.ts +0 -2
  57. package/Components/ContentEntryForm/CmsEntryFormSaveAndPublishButton.js +0 -24
  58. package/Components/ContentEntryForm/CmsEntryFormSaveAndPublishButton.js.map +0 -1
  59. package/Components/ContentEntryForm/CmsEntryFormSaveButton.d.ts +0 -2
  60. package/Components/ContentEntryForm/CmsEntryFormSaveButton.js +0 -23
  61. package/Components/ContentEntryForm/CmsEntryFormSaveButton.js.map +0 -1
  62. package/Components/ContentEntryForm/ContentEntryWorkflow.d.ts +0 -2
  63. package/Components/ContentEntryForm/ContentEntryWorkflow.js +0 -23
  64. package/Components/ContentEntryForm/ContentEntryWorkflow.js.map +0 -1
@@ -1,12 +1,14 @@
1
- import react, { useCallback, useMemo } from "react";
1
+ import react, { useCallback, useEffect, useMemo } from "react";
2
+ import { observer } from "mobx-react-lite";
2
3
  import { AdminConfig, useRoute, useRouter } from "@webiny/app-admin";
3
- import { Routes } from "../../routes.js";
4
+ import { useFeature } from "@webiny/app";
5
+ import { Routes } from "../routes.js";
4
6
  import { Components } from "@webiny/app-workflows";
5
7
  import { Icon, Loader } from "@webiny/admin-ui";
6
- import { useModels, usePermission } from "@webiny/app-headless-cms/admin/hooks/index.js";
8
+ import { usePermission } from "@webiny/app-headless-cms/admin/hooks/index.js";
7
9
  import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
8
- import { createAppName } from "../../utils/appName.js";
9
10
  import { normalizeIcon } from "@webiny/app-headless-cms/utils/normalizeIcon.js";
11
+ import { CmsWorkflowsEditorPresenterFeature } from "./cmsWorkflowsEditor/feature.js";
10
12
  const { Admin: { WorkflowsEditor: WorkflowsEditor }, Permissions: { HasWorkflowsEditorPermission: HasWorkflowsEditorPermission } } = Components;
11
13
  const { Menu: Menu } = AdminConfig;
12
14
  const CmsWorkflowsEditorMenu = ()=>{
@@ -23,47 +25,45 @@ const CmsWorkflowsEditorMenu = ()=>{
23
25
  })
24
26
  }));
25
27
  };
26
- const ModelIcon = ({ model })=>{
27
- if (!model.icon) return null;
28
- const icon = normalizeIcon(model.icon);
28
+ const ModelIcon = ({ app })=>{
29
+ if (!app.icon) return null;
30
+ const icon = normalizeIcon(app.icon);
29
31
  if (!icon) return null;
30
32
  return /*#__PURE__*/ react.createElement(Icon, {
31
33
  icon: /*#__PURE__*/ react.createElement(FontAwesomeIcon, {
32
34
  icon: icon
33
35
  }),
34
- label: model.name,
36
+ label: app.name,
35
37
  size: "sm",
36
38
  className: "text-neutral-strong"
37
39
  });
38
40
  };
39
- const isAllowed = (model)=>{
40
- if (model.tags.includes("$publishing:false")) return false;
41
- if (model.tags.includes("singleEntry")) return false;
42
- return true;
43
- };
44
- const CmsWorkflowsEditorView = ()=>{
41
+ const CmsWorkflowsEditorView = observer(()=>{
45
42
  const { route } = useRoute(Routes.ContentModels.Workflows);
46
- const { models, loading } = useModels();
47
- const { canEdit, canCreateContentModels } = usePermission();
43
+ const { presenter } = useFeature(CmsWorkflowsEditorPresenterFeature);
44
+ const { canCreateContentModels } = usePermission();
48
45
  const { goToRoute } = useRouter();
49
- const apps = useMemo(()=>models.filter((model)=>{
50
- if (false === isAllowed(model)) return false;
51
- return canEdit(model, "cms.contentModel");
52
- }).map((model)=>({
53
- id: createAppName(model),
54
- name: model.name,
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
55
  icon: /*#__PURE__*/ react.createElement(ModelIcon, {
56
- model: model
56
+ app: app
57
57
  })
58
58
  })), [
59
- models,
60
- canEdit
59
+ workflowApps
61
60
  ]);
62
61
  const app = useMemo(()=>{
63
62
  if (!route.params.app) return apps.find(()=>true);
64
63
  return apps.find((a)=>a.id === route.params.app) || null;
65
64
  }, [
66
- route.params.app
65
+ route.params.app,
66
+ apps
67
67
  ]);
68
68
  const onAppClick = useCallback((id)=>{
69
69
  goToRoute(Routes.ContentModels.Workflows, {
@@ -84,7 +84,7 @@ const CmsWorkflowsEditorView = ()=>{
84
84
  onAppClick: onAppClick,
85
85
  app: app?.id
86
86
  });
87
- };
87
+ });
88
88
  export { CmsWorkflowsEditorMenu, CmsWorkflowsEditorView };
89
89
 
90
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,24 @@
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
+ reset(): void;
20
+ }
21
+ export declare const ContentEntryFormPresenterWorkflowDecorator: typeof ContentEntryFormPresenterWithWorkflow & {
22
+ __abstraction: import("@webiny/di").Abstraction<IContentEntryFormPresenter>;
23
+ };
24
+ export {};
@@ -0,0 +1,67 @@
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
+ reset() {
54
+ this.original.reset();
55
+ this.workflowPresenter.dispose();
56
+ }
57
+ }
58
+ const ContentEntryFormPresenterWorkflowDecorator = ContentEntryFormPresenter.createDecorator({
59
+ decorator: ContentEntryFormPresenterWithWorkflow,
60
+ dependencies: [
61
+ WorkflowStatePresenter,
62
+ CmsModelContext
63
+ ]
64
+ });
65
+ export { ContentEntryFormPresenterWorkflowDecorator };
66
+
67
+ //# 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 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","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,QAAc;QACV,IAAI,CAAC,QAAQ,CAAC,KAAK;QACnB,IAAI,CAAC,iBAAiB,CAAC,OAAO;IAClC;AACJ;AAEO,MAAMC,6CAA6CC,0BAA0B,eAAe,CAC/F;IACI,WAAWhB;IACX,cAAc;QAACiB;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 {};
@@ -0,0 +1,24 @@
1
+ import { GetEntryGraphQLFieldSelection } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
2
+ class WorkflowStateGetEntryFieldSelectionImpl {
3
+ getSelection() {
4
+ return [
5
+ `meta {
6
+ system {
7
+ workflow {
8
+ workflowId
9
+ stepId
10
+ stepName
11
+ state
12
+ }
13
+ }
14
+ }`
15
+ ];
16
+ }
17
+ }
18
+ const WorkflowStateGetEntryFieldSelection = GetEntryGraphQLFieldSelection.createImplementation({
19
+ dependencies: [],
20
+ implementation: WorkflowStateGetEntryFieldSelectionImpl
21
+ });
22
+ export { WorkflowStateGetEntryFieldSelection };
23
+
24
+ //# sourceMappingURL=WorkflowStateGetEntryFieldSelection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/WorkflowStateGetEntryFieldSelection.js","sources":["../../src/presentation/WorkflowStateGetEntryFieldSelection.ts"],"sourcesContent":["import { GetEntryGraphQLFieldSelection } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\n\nclass WorkflowStateGetEntryFieldSelectionImpl implements GetEntryGraphQLFieldSelection.Interface {\n getSelection(): string[] {\n return [\n `meta {\n system {\n workflow {\n workflowId\n stepId\n stepName\n state\n }\n }\n }`\n ];\n }\n}\n\nexport const WorkflowStateGetEntryFieldSelection =\n GetEntryGraphQLFieldSelection.createImplementation({\n dependencies: [],\n implementation: WorkflowStateGetEntryFieldSelectionImpl\n });\n"],"names":["WorkflowStateGetEntryFieldSelectionImpl","WorkflowStateGetEntryFieldSelection","GetEntryGraphQLFieldSelection"],"mappings":";AAEA,MAAMA;IACF,eAAyB;QACrB,OAAO;YACH,CAAC;;;;;;;;;aASA,CAAC;SACL;IACL;AACJ;AAEO,MAAMC,sCACTC,8BAA8B,oBAAoB,CAAC;IAC/C,cAAc,EAAE;IAChB,gBAAgBF;AACpB"}
@@ -0,0 +1,8 @@
1
+ import { ListEntriesGraphQLFieldSelection } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
2
+ declare class WorkflowStateListEntriesFieldSelectionImpl implements ListEntriesGraphQLFieldSelection.Interface {
3
+ getSelection(): string[];
4
+ }
5
+ export declare const WorkflowStateListEntriesFieldSelection: typeof WorkflowStateListEntriesFieldSelectionImpl & {
6
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/app-headless-cms/features/contentEntry/listEntries/abstractions").IListEntriesGraphQLFieldSelection>;
7
+ };
8
+ export {};
@@ -0,0 +1,24 @@
1
+ import { ListEntriesGraphQLFieldSelection } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
2
+ class WorkflowStateListEntriesFieldSelectionImpl {
3
+ getSelection() {
4
+ return [
5
+ `meta {
6
+ system {
7
+ workflow {
8
+ workflowId
9
+ stepId
10
+ stepName
11
+ state
12
+ }
13
+ }
14
+ }`
15
+ ];
16
+ }
17
+ }
18
+ const WorkflowStateListEntriesFieldSelection = ListEntriesGraphQLFieldSelection.createImplementation({
19
+ dependencies: [],
20
+ implementation: WorkflowStateListEntriesFieldSelectionImpl
21
+ });
22
+ export { WorkflowStateListEntriesFieldSelection };
23
+
24
+ //# sourceMappingURL=WorkflowStateListEntriesFieldSelection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/WorkflowStateListEntriesFieldSelection.js","sources":["../../src/presentation/WorkflowStateListEntriesFieldSelection.ts"],"sourcesContent":["import { ListEntriesGraphQLFieldSelection } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\n\nclass WorkflowStateListEntriesFieldSelectionImpl\n implements ListEntriesGraphQLFieldSelection.Interface\n{\n getSelection(): string[] {\n return [\n `meta {\n system {\n workflow {\n workflowId\n stepId\n stepName\n state\n }\n }\n }`\n ];\n }\n}\n\nexport const WorkflowStateListEntriesFieldSelection =\n ListEntriesGraphQLFieldSelection.createImplementation({\n dependencies: [],\n implementation: WorkflowStateListEntriesFieldSelectionImpl\n });\n"],"names":["WorkflowStateListEntriesFieldSelectionImpl","WorkflowStateListEntriesFieldSelection","ListEntriesGraphQLFieldSelection"],"mappings":";AAEA,MAAMA;IAGF,eAAyB;QACrB,OAAO;YACH,CAAC;;;;;;;;;aASA,CAAC;SACL;IACL;AACJ;AAEO,MAAMC,yCACTC,iCAAiC,oBAAoB,CAAC;IAClD,cAAc,EAAE;IAChB,gBAAgBF;AACpB"}
@@ -0,0 +1,15 @@
1
+ import { ListModelsUseCase } from "@webiny/app-headless-cms/features/model/listModels/abstractions.js";
2
+ import { ModelsCache } from "@webiny/app-headless-cms/features/model/abstractions.js";
3
+ import { CmsWorkflowsEditorPresenter as Abstraction } from "./abstractions.js";
4
+ declare class CmsWorkflowsEditorPresenterImpl implements Abstraction.Interface {
5
+ private listModelsUseCase;
6
+ private cache;
7
+ private _loading;
8
+ constructor(listModelsUseCase: ListModelsUseCase.Interface, cache: ModelsCache.Interface);
9
+ get vm(): Abstraction.ViewModel;
10
+ init(): void;
11
+ }
12
+ export declare const CmsWorkflowsEditorPresenter: typeof CmsWorkflowsEditorPresenterImpl & {
13
+ __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").ICmsWorkflowsEditorPresenter>;
14
+ };
15
+ export {};
@@ -0,0 +1,50 @@
1
+ import { computed, makeAutoObservable, runInAction } from "mobx";
2
+ import { ListModelsUseCase } from "@webiny/app-headless-cms/features/model/listModels/abstractions.js";
3
+ import { ModelsCache } from "@webiny/app-headless-cms/features/model/abstractions.js";
4
+ import { createAppName } from "../../utils/appName.js";
5
+ import { CmsWorkflowsEditorPresenter } from "./abstractions.js";
6
+ class CmsWorkflowsEditorPresenterImpl {
7
+ constructor(listModelsUseCase, cache){
8
+ this.listModelsUseCase = listModelsUseCase;
9
+ this.cache = cache;
10
+ this._loading = true;
11
+ makeAutoObservable(this, {
12
+ listModelsUseCase: false,
13
+ cache: false,
14
+ vm: computed
15
+ });
16
+ }
17
+ get vm() {
18
+ const apps = this.cache.getItems().filter((model)=>{
19
+ if (model.tags.includes("$publishing:false")) return false;
20
+ if (model.tags.includes("singleEntry")) return false;
21
+ return true;
22
+ }).map((model)=>({
23
+ id: createAppName(model),
24
+ name: model.name,
25
+ modelId: model.modelId,
26
+ icon: model.icon
27
+ }));
28
+ return {
29
+ loading: this._loading,
30
+ apps
31
+ };
32
+ }
33
+ init() {
34
+ this.listModelsUseCase.execute().then(()=>{
35
+ runInAction(()=>{
36
+ this._loading = false;
37
+ });
38
+ }).catch(console.error);
39
+ }
40
+ }
41
+ const CmsWorkflowsEditorPresenter_CmsWorkflowsEditorPresenter = CmsWorkflowsEditorPresenter.createImplementation({
42
+ implementation: CmsWorkflowsEditorPresenterImpl,
43
+ dependencies: [
44
+ ListModelsUseCase,
45
+ ModelsCache
46
+ ]
47
+ });
48
+ export { CmsWorkflowsEditorPresenter_CmsWorkflowsEditorPresenter as CmsWorkflowsEditorPresenter };
49
+
50
+ //# sourceMappingURL=CmsWorkflowsEditorPresenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/cmsWorkflowsEditor/CmsWorkflowsEditorPresenter.js","sources":["../../../src/presentation/cmsWorkflowsEditor/CmsWorkflowsEditorPresenter.ts"],"sourcesContent":["import { makeAutoObservable, runInAction, computed } from \"mobx\";\nimport { ListModelsUseCase } from \"@webiny/app-headless-cms/features/model/listModels/abstractions.js\";\nimport { ModelsCache } from \"@webiny/app-headless-cms/features/model/abstractions.js\";\nimport { createAppName } from \"~/utils/appName.js\";\nimport { CmsWorkflowsEditorPresenter as Abstraction, type WorkflowApp } from \"./abstractions.js\";\n\nclass CmsWorkflowsEditorPresenterImpl implements Abstraction.Interface {\n private _loading = true;\n\n constructor(\n private listModelsUseCase: ListModelsUseCase.Interface,\n private cache: ModelsCache.Interface\n ) {\n makeAutoObservable<CmsWorkflowsEditorPresenterImpl, \"listModelsUseCase\" | \"cache\">(this, {\n listModelsUseCase: false,\n cache: false,\n vm: computed\n });\n }\n\n get vm(): Abstraction.ViewModel {\n const apps: WorkflowApp[] = this.cache\n .getItems()\n .filter(model => {\n if (model.tags.includes(\"$publishing:false\")) {\n return false;\n }\n if (model.tags.includes(\"singleEntry\")) {\n return false;\n }\n return true;\n })\n .map(model => ({\n id: createAppName(model),\n name: model.name,\n modelId: model.modelId,\n icon: model.icon\n }));\n\n return {\n loading: this._loading,\n apps\n };\n }\n\n init(): void {\n this.listModelsUseCase\n .execute()\n .then(() => {\n runInAction(() => {\n this._loading = false;\n });\n })\n .catch(console.error);\n }\n}\n\nexport const CmsWorkflowsEditorPresenter = Abstraction.createImplementation({\n implementation: CmsWorkflowsEditorPresenterImpl,\n dependencies: [ListModelsUseCase, ModelsCache]\n});\n"],"names":["CmsWorkflowsEditorPresenterImpl","listModelsUseCase","cache","makeAutoObservable","computed","apps","model","createAppName","runInAction","console","CmsWorkflowsEditorPresenter","Abstraction","ListModelsUseCase","ModelsCache"],"mappings":";;;;;AAMA,MAAMA;IAGF,YACYC,iBAA8C,EAC9CC,KAA4B,CACtC;aAFUD,iBAAiB,GAAjBA;aACAC,KAAK,GAALA;aAJJ,QAAQ,GAAG;QAMfC,mBAAmF,IAAI,EAAE;YACrF,mBAAmB;YACnB,OAAO;YACP,IAAIC;QACR;IACJ;IAEA,IAAI,KAA4B;QAC5B,MAAMC,OAAsB,IAAI,CAAC,KAAK,CACjC,QAAQ,GACR,MAAM,CAACC,CAAAA;YACJ,IAAIA,MAAM,IAAI,CAAC,QAAQ,CAAC,sBACpB,OAAO;YAEX,IAAIA,MAAM,IAAI,CAAC,QAAQ,CAAC,gBACpB,OAAO;YAEX,OAAO;QACX,GACC,GAAG,CAACA,CAAAA,QAAU;gBACX,IAAIC,cAAcD;gBAClB,MAAMA,MAAM,IAAI;gBAChB,SAASA,MAAM,OAAO;gBACtB,MAAMA,MAAM,IAAI;YACpB;QAEJ,OAAO;YACH,SAAS,IAAI,CAAC,QAAQ;YACtBD;QACJ;IACJ;IAEA,OAAa;QACT,IAAI,CAAC,iBAAiB,CACjB,OAAO,GACP,IAAI,CAAC;YACFG,YAAY;gBACR,IAAI,CAAC,QAAQ,GAAG;YACpB;QACJ,GACC,KAAK,CAACC,QAAQ,KAAK;IAC5B;AACJ;AAEO,MAAMC,0DAA8BC,4BAAAA,oBAAgC,CAAC;IACxE,gBAAgBX;IAChB,cAAc;QAACY;QAAmBC;KAAY;AAClD"}
@@ -0,0 +1,19 @@
1
+ export interface WorkflowApp {
2
+ id: string;
3
+ name: string;
4
+ modelId: string;
5
+ icon: string;
6
+ }
7
+ export interface ICmsWorkflowsEditorPresenterViewModel {
8
+ loading: boolean;
9
+ apps: WorkflowApp[];
10
+ }
11
+ export interface ICmsWorkflowsEditorPresenter {
12
+ readonly vm: ICmsWorkflowsEditorPresenterViewModel;
13
+ init(): void;
14
+ }
15
+ export declare const CmsWorkflowsEditorPresenter: import("@webiny/di").Abstraction<ICmsWorkflowsEditorPresenter>;
16
+ export declare namespace CmsWorkflowsEditorPresenter {
17
+ type Interface = ICmsWorkflowsEditorPresenter;
18
+ type ViewModel = ICmsWorkflowsEditorPresenterViewModel;
19
+ }
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/admin";
2
+ const CmsWorkflowsEditorPresenter = createAbstraction("CmsWorkflowsEditor/Presenter");
3
+ export { CmsWorkflowsEditorPresenter };
4
+
5
+ //# sourceMappingURL=abstractions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/cmsWorkflowsEditor/abstractions.js","sources":["../../../src/presentation/cmsWorkflowsEditor/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\n\nexport interface WorkflowApp {\n id: string;\n name: string;\n modelId: string;\n icon: string;\n}\n\nexport interface ICmsWorkflowsEditorPresenterViewModel {\n loading: boolean;\n apps: WorkflowApp[];\n}\n\nexport interface ICmsWorkflowsEditorPresenter {\n readonly vm: ICmsWorkflowsEditorPresenterViewModel;\n init(): void;\n}\n\nexport const CmsWorkflowsEditorPresenter = createAbstraction<ICmsWorkflowsEditorPresenter>(\n \"CmsWorkflowsEditor/Presenter\"\n);\n\nexport namespace CmsWorkflowsEditorPresenter {\n export type Interface = ICmsWorkflowsEditorPresenter;\n export type ViewModel = ICmsWorkflowsEditorPresenterViewModel;\n}\n"],"names":["CmsWorkflowsEditorPresenter","createAbstraction"],"mappings":";AAmBO,MAAMA,8BAA8BC,kBACvC"}
@@ -0,0 +1,3 @@
1
+ export declare const CmsWorkflowsEditorPresenterFeature: import("@webiny/feature/admin").FeatureDefinition<{
2
+ presenter: import("./abstractions.js").ICmsWorkflowsEditorPresenter;
3
+ }, []>;
@@ -0,0 +1,17 @@
1
+ import { createFeature } from "@webiny/feature/admin";
2
+ import { CmsWorkflowsEditorPresenter } from "./abstractions.js";
3
+ import { CmsWorkflowsEditorPresenter as external_CmsWorkflowsEditorPresenter_js_CmsWorkflowsEditorPresenter } from "./CmsWorkflowsEditorPresenter.js";
4
+ const CmsWorkflowsEditorPresenterFeature = createFeature({
5
+ name: "CmsWorkflowsEditor/Presenter",
6
+ register (container) {
7
+ container.register(external_CmsWorkflowsEditorPresenter_js_CmsWorkflowsEditorPresenter).inSingletonScope();
8
+ },
9
+ resolve (container) {
10
+ return {
11
+ presenter: container.resolve(CmsWorkflowsEditorPresenter)
12
+ };
13
+ }
14
+ });
15
+ export { CmsWorkflowsEditorPresenterFeature };
16
+
17
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/cmsWorkflowsEditor/feature.js","sources":["../../../src/presentation/cmsWorkflowsEditor/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport { CmsWorkflowsEditorPresenter as Abstraction } from \"./abstractions.js\";\nimport { CmsWorkflowsEditorPresenter } from \"./CmsWorkflowsEditorPresenter.js\";\n\nexport const CmsWorkflowsEditorPresenterFeature = createFeature({\n name: \"CmsWorkflowsEditor/Presenter\",\n register(container) {\n container.register(CmsWorkflowsEditorPresenter).inSingletonScope();\n },\n resolve(container) {\n return {\n presenter: container.resolve(Abstraction)\n };\n }\n});\n"],"names":["CmsWorkflowsEditorPresenterFeature","createFeature","container","CmsWorkflowsEditorPresenter","Abstraction"],"mappings":";;;AAIO,MAAMA,qCAAqCC,cAAc;IAC5D,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC,qEAA6B,gBAAgB;IACpE;IACA,SAAQD,SAAS;QACb,OAAO;YACH,WAAWA,UAAU,OAAO,CAACE;QACjC;IACJ;AACJ"}
@@ -0,0 +1 @@
1
+ export declare const CmsWorkflowsFeature: import("@webiny/feature/admin").FeatureDefinition<any, []>;
@@ -0,0 +1,21 @@
1
+ import { createFeature } from "@webiny/feature/admin";
2
+ import { WorkflowsFeature } from "@webiny/app-workflows";
3
+ import { WorkflowStatePresenterFeature } from "@webiny/app-workflows/presentation/workflowState/feature.js";
4
+ import { ContentEntryFormPresenterWorkflowDecorator } from "./ContentEntryFormPresenterWorkflowDecorator.js";
5
+ import { TableRowMapperWorkflowDecorator } from "./TableRowMapperWorkflowDecorator.js";
6
+ import { WorkflowStateListEntriesFieldSelection } from "./WorkflowStateListEntriesFieldSelection.js";
7
+ import { WorkflowStateGetEntryFieldSelection } from "./WorkflowStateGetEntryFieldSelection.js";
8
+ const CmsWorkflowsFeature = createFeature({
9
+ name: "CmsWorkflows",
10
+ register (container) {
11
+ WorkflowsFeature.register(container);
12
+ WorkflowStatePresenterFeature.register(container);
13
+ container.registerDecorator(ContentEntryFormPresenterWorkflowDecorator);
14
+ container.registerDecorator(TableRowMapperWorkflowDecorator);
15
+ container.register(WorkflowStateListEntriesFieldSelection);
16
+ container.register(WorkflowStateGetEntryFieldSelection);
17
+ }
18
+ });
19
+ export { CmsWorkflowsFeature };
20
+
21
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/feature.js","sources":["../../src/presentation/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport { WorkflowsFeature } from \"@webiny/app-workflows\";\nimport { WorkflowStatePresenterFeature } from \"@webiny/app-workflows/presentation/workflowState/feature.js\";\nimport { ContentEntryFormPresenterWorkflowDecorator } from \"./ContentEntryFormPresenterWorkflowDecorator.js\";\nimport { TableRowMapperWorkflowDecorator } from \"./TableRowMapperWorkflowDecorator.js\";\nimport { WorkflowStateListEntriesFieldSelection } from \"./WorkflowStateListEntriesFieldSelection.js\";\nimport { WorkflowStateGetEntryFieldSelection } from \"./WorkflowStateGetEntryFieldSelection.js\";\n\nexport const CmsWorkflowsFeature = createFeature({\n name: \"CmsWorkflows\",\n register(container) {\n WorkflowsFeature.register(container);\n WorkflowStatePresenterFeature.register(container);\n container.registerDecorator(ContentEntryFormPresenterWorkflowDecorator);\n container.registerDecorator(TableRowMapperWorkflowDecorator);\n container.register(WorkflowStateListEntriesFieldSelection);\n container.register(WorkflowStateGetEntryFieldSelection);\n }\n});\n"],"names":["CmsWorkflowsFeature","createFeature","container","WorkflowsFeature","WorkflowStatePresenterFeature","ContentEntryFormPresenterWorkflowDecorator","TableRowMapperWorkflowDecorator","WorkflowStateListEntriesFieldSelection","WorkflowStateGetEntryFieldSelection"],"mappings":";;;;;;;AAQO,MAAMA,sBAAsBC,cAAc;IAC7C,MAAM;IACN,UAASC,SAAS;QACdC,iBAAiB,QAAQ,CAACD;QAC1BE,8BAA8B,QAAQ,CAACF;QACvCA,UAAU,iBAAiB,CAACG;QAC5BH,UAAU,iBAAiB,CAACI;QAC5BJ,UAAU,QAAQ,CAACK;QACnBL,UAAU,QAAQ,CAACM;IACvB;AACJ"}
package/types.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ import type { WorkflowStateValue } from "@webiny/app-workflows/types.js";
2
+ export interface ICmsEntryWorkflowState {
3
+ workflowId: string;
4
+ stepId: string;
5
+ stepName: string;
6
+ state: WorkflowStateValue;
7
+ }
8
+ export interface ICmsEntrySystemWithWorkflow {
9
+ workflow?: ICmsEntryWorkflowState | null;
10
+ }
package/types.js ADDED
File without changes
@@ -1,3 +0,0 @@
1
- import React from "react";
2
- export declare const CmsWorkflowsEditorMenu: () => React.JSX.Element | null;
3
- export declare const CmsWorkflowsEditorView: () => React.JSX.Element | null;
@@ -1 +0,0 @@
1
- {"version":3,"file":"Components/CmsWorkflows/CmsWorkflowsEditorView.js","sources":["../../../src/Components/CmsWorkflows/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"],"names":["WorkflowsEditor","HasWorkflowsEditorPermission","Components","Menu","AdminConfig","CmsWorkflowsEditorMenu","router","useRouter","canCreateContentModels","usePermission","Routes","ModelIcon","model","icon","normalizeIcon","Icon","FontAwesomeIcon","isAllowed","CmsWorkflowsEditorView","route","useRoute","models","loading","useModels","canEdit","goToRoute","apps","useMemo","createAppName","app","a","onAppClick","useCallback","id","Loader"],"mappings":";;;;;;;;;AAYA,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;AAMA,MAAMC,YAAY,CAAC,EAAEC,KAAK,EAAmB;IACzC,IAAI,CAACA,MAAM,IAAI,EACX,OAAO;IAGX,MAAMC,OAAOC,cAAcF,MAAM,IAAI;IACrC,IAAI,CAACC,MACD,OAAO;IAGX,OAAO,WAAP,GACI,oBAACE,MAAIA;QACD,oBAAM,oBAACC,iBAAeA;YAAC,MAAMH;;QAC7B,OAAOD,MAAM,IAAI;QACjB,MAAM;QACN,WAAW;;AAGvB;AAEA,MAAMK,YAAY,CAACL;IAEf,IAAIA,MAAM,IAAI,CAAC,QAAQ,CAAC,sBACpB,OAAO;IAGN,IAAIA,MAAM,IAAI,CAAC,QAAQ,CAAC,gBACzB,OAAO;IAGX,OAAO;AACX;AAEO,MAAMM,yBAAyB;IAClC,MAAM,EAAEC,KAAK,EAAE,GAAGC,SAASV,OAAO,aAAa,CAAC,SAAS;IACzD,MAAM,EAAEW,MAAM,EAAEC,OAAO,EAAE,GAAGC;IAC5B,MAAM,EAAEC,OAAO,EAAEhB,sBAAsB,EAAE,GAAGC;IAC5C,MAAM,EAAEgB,SAAS,EAAE,GAAGlB;IAEtB,MAAMmB,OAAOC,QAAgC,IAClCN,OACF,MAAM,CAACT,CAAAA;YACJ,IAAIK,AAAqB,UAArBA,UAAUL,QACV,OAAO;YAEX,OAAOY,QAAQZ,OAAO;QAC1B,GACC,GAAG,CAACA,CAAAA,QACM;gBACH,IAAIgB,cAAchB;gBAClB,MAAMA,MAAM,IAAI;gBAChB,MAAM,WAAN,GAAM,oBAACD,WAASA;oBAAC,OAAOC;;YAC5B,KAET;QAACS;QAAQG;KAAQ;IAEpB,MAAMK,MAAMF,QAAQ;QAChB,IAAI,CAACR,MAAM,MAAM,CAAC,GAAG,EACjB,OAAOO,KAAK,IAAI,CAAC,IAAM;QAE3B,OAAOA,KAAK,IAAI,CAACI,CAAAA,IAAKA,EAAE,EAAE,KAAKX,MAAM,MAAM,CAAC,GAAG,KAAK;IACxD,GAAG;QAACA,MAAM,MAAM,CAAC,GAAG;KAAC;IAErB,MAAMY,aAAaC,YACf,CAACC;QACGR,UAAUf,OAAO,aAAa,CAAC,SAAS,EAAE;YACtC,KAAKuB;QACT;IACJ,GACA;QAACP;KAAK;IAGV,IAAI,CAAClB,wBACD,OAAO;IACJ,IAAIc,SACP,OAAO,WAAP,GAAO,oBAACY,QAAMA;QAAC,MAAK;QAAK,SAAQ;QAAS,eAAe;QAAM,MAAK;;IAGxE,OAAO,WAAP,GAAO,oBAAClC,iBAAeA;QAAC,MAAM0B;QAAM,YAAYK;QAAY,KAAKF,KAAK;;AAC1E"}
@@ -1,2 +0,0 @@
1
- import React from "react";
2
- export declare const CmsEntryFormPublishButton: () => React.JSX.Element | null;
@@ -1,26 +0,0 @@
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
- const CmsEntryFormPublishButton = ()=>{
5
- const { loading, entry, publishEntryRevision } = useContentEntry();
6
- const { ButtonPrimary } = ContentEntryEditorConfig.Actions.ButtonAction.useButtons();
7
- const publish = useCallback(()=>{
8
- if (!entry.id) return void console.warn("You cannot publish an entry that hasn't been saved yet.");
9
- publishEntryRevision({
10
- id: entry.id
11
- });
12
- }, [
13
- entry.id
14
- ]);
15
- const { canEdit, canPublish } = usePermission();
16
- if ("published" === entry.meta.status) return null;
17
- if (!canEdit(entry, "cms.contentEntry") || !canPublish("cms.contentEntry")) return null;
18
- return /*#__PURE__*/ react.createElement(ButtonPrimary, {
19
- onAction: publish,
20
- disabled: loading,
21
- "data-testid": "workflows-cms-content-publish-content-button"
22
- }, "Publish");
23
- };
24
- export { CmsEntryFormPublishButton };
25
-
26
- //# sourceMappingURL=CmsEntryFormPublishButton.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Components/ContentEntryForm/CmsEntryFormPublishButton.js","sources":["../../../src/Components/ContentEntryForm/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"],"names":["CmsEntryFormPublishButton","loading","entry","publishEntryRevision","useContentEntry","ButtonPrimary","ContentEntryEditorConfig","publish","useCallback","console","canEdit","canPublish","usePermission"],"mappings":";;;AAIO,MAAMA,4BAA4B;IACrC,MAAM,EAAEC,OAAO,EAAEC,KAAK,EAAEC,oBAAoB,EAAE,GAAGC;IACjD,MAAM,EAAEC,aAAa,EAAE,GAAGC,yBAAyB,OAAO,CAAC,YAAY,CAAC,UAAU;IAElF,MAAMC,UAAUC,YAAY;QACxB,IAAI,CAACN,MAAM,EAAE,EAAE,YACXO,QAAQ,IAAI,CAAC;QAGjBN,qBAAqB;YAAE,IAAID,MAAM,EAAE;QAAC;IACxC,GAAG;QAACA,MAAM,EAAE;KAAC;IAEb,MAAM,EAAEQ,OAAO,EAAEC,UAAU,EAAE,GAAGC;IAEhC,IAAIV,AAAsB,gBAAtBA,MAAM,IAAI,CAAC,MAAM,EACjB,OAAO;IACJ,IAAI,CAACQ,QAAQR,OAAO,uBAAuB,CAACS,WAAW,qBAC1D,OAAO;IAGX,OAAO,WAAP,GACI,oBAACN,eAAAA;QACG,UAAUE;QACV,UAAUN;QACV,eAAY;OAEX;AAGb"}
@@ -1,2 +0,0 @@
1
- import React from "react";
2
- export declare const CmsEntryFormSaveAndPublishButton: (props: unknown) => React.JSX.Element;