@webiny/app-headless-cms-scheduler 0.0.0-unstable.e6f0dc8ca7 → 0.0.0-unstable.eb81deee7e

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/components/Browser/BrowserConfig.js +18 -10
  2. package/components/Browser/BrowserConfig.js.map +1 -1
  3. package/components/Browser/CellLive.d.ts +11 -0
  4. package/components/Browser/CellLive.js +37 -0
  5. package/components/Browser/CellLive.js.map +1 -0
  6. package/components/Browser/LiveTag.d.ts +7 -0
  7. package/components/Browser/LiveTag.js +19 -0
  8. package/components/Browser/LiveTag.js.map +1 -0
  9. package/components/Browser/MenuItem.d.ts +3 -1
  10. package/components/Browser/MenuItem.js +40 -48
  11. package/components/Browser/MenuItem.js.map +1 -1
  12. package/components/Browser/ScheduledTag.d.ts +5 -0
  13. package/components/Browser/ScheduledTag.js +24 -0
  14. package/components/Browser/ScheduledTag.js.map +1 -0
  15. package/components/Browser/SchedulerButton.js +16 -0
  16. package/components/Browser/SchedulerButton.js.map +1 -0
  17. package/components/Browser/SchedulerMenuItem.d.ts +2 -0
  18. package/components/Browser/SchedulerMenuItem.js +26 -0
  19. package/components/Browser/SchedulerMenuItem.js.map +1 -0
  20. package/components/Browser/isScheduleRedundant.d.ts +12 -0
  21. package/components/Browser/isScheduleRedundant.js +8 -0
  22. package/components/Browser/isScheduleRedundant.js.map +1 -0
  23. package/components/Dialogs/PublishScheduleNotice.d.ts +6 -0
  24. package/components/Dialogs/PublishScheduleNotice.js +17 -0
  25. package/components/Dialogs/PublishScheduleNotice.js.map +1 -0
  26. package/components/Dialogs/ScheduleNoticeAlert.d.ts +14 -0
  27. package/components/Dialogs/ScheduleNoticeAlert.js +22 -0
  28. package/components/Dialogs/ScheduleNoticeAlert.js.map +1 -0
  29. package/components/Dialogs/UnpublishScheduleNotice.d.ts +6 -0
  30. package/components/Dialogs/UnpublishScheduleNotice.js +17 -0
  31. package/components/Dialogs/UnpublishScheduleNotice.js.map +1 -0
  32. package/components/Editor/EditorConfig.js +8 -11
  33. package/components/Editor/EditorConfig.js.map +1 -1
  34. package/components/Editor/MenuItem.d.ts +3 -1
  35. package/components/Editor/MenuItem.js +53 -69
  36. package/components/Editor/MenuItem.js.map +1 -1
  37. package/components/Editor/ScheduledActionAlert.d.ts +6 -0
  38. package/components/Editor/ScheduledActionAlert.js +43 -0
  39. package/components/Editor/ScheduledActionAlert.js.map +1 -0
  40. package/components/index.d.ts +3 -1
  41. package/components/index.js +3 -3
  42. package/hooks/usePermissions.js +13 -12
  43. package/hooks/usePermissions.js.map +1 -1
  44. package/hooks/useScheduledActionsPresenter.d.ts +6 -0
  45. package/hooks/useScheduledActionsPresenter.js +12 -0
  46. package/hooks/useScheduledActionsPresenter.js.map +1 -0
  47. package/index.js +8 -5
  48. package/index.js.map +1 -1
  49. package/package.json +19 -14
  50. package/presentation/scheduledActions/ContentEntriesPresenterSchedulingDecorator.d.ts +31 -0
  51. package/presentation/scheduledActions/ContentEntriesPresenterSchedulingDecorator.js +70 -0
  52. package/presentation/scheduledActions/ContentEntriesPresenterSchedulingDecorator.js.map +1 -0
  53. package/presentation/scheduledActions/ScheduledActionsPresenter.d.ts +28 -0
  54. package/presentation/scheduledActions/ScheduledActionsPresenter.js +90 -0
  55. package/presentation/scheduledActions/ScheduledActionsPresenter.js.map +1 -0
  56. package/presentation/scheduledActions/abstractions.d.ts +16 -0
  57. package/presentation/scheduledActions/abstractions.js +5 -0
  58. package/presentation/scheduledActions/abstractions.js.map +1 -0
  59. package/presentation/scheduledActions/feature.d.ts +3 -0
  60. package/presentation/scheduledActions/feature.js +19 -0
  61. package/presentation/scheduledActions/feature.js.map +1 -0
  62. package/utils/index.js +0 -2
  63. package/utils/namespace.js +3 -9
  64. package/utils/namespace.js.map +1 -1
  65. package/components/Sidebar/SchedulerButton.js +0 -17
  66. package/components/Sidebar/SchedulerButton.js.map +0 -1
  67. package/components/Sidebar/Sidebar.d.ts +0 -2
  68. package/components/Sidebar/Sidebar.js +0 -41
  69. package/components/Sidebar/Sidebar.js.map +0 -1
  70. package/components/index.js.map +0 -1
  71. package/utils/index.js.map +0 -1
  72. /package/components/{Sidebar → Browser}/SchedulerButton.d.ts +0 -0
@@ -1,15 +1,23 @@
1
- import React from "react";
1
+ import react from "react";
2
2
  import { IsModelPublishable } from "@webiny/app-headless-cms/exports/admin/cms.js";
3
3
  import { ContentEntryListConfig } from "@webiny/app-headless-cms/admin/config/contentEntries/index.js";
4
4
  import { MenuItem } from "./MenuItem.js";
5
- const {
6
- Browser
7
- } = ContentEntryListConfig;
8
- export const BrowserConfig = () => {
9
- return /*#__PURE__*/React.createElement(ContentEntryListConfig, null, /*#__PURE__*/React.createElement(IsModelPublishable, null, /*#__PURE__*/React.createElement(Browser.Entry.Action, {
10
- name: "schedule",
11
- element: /*#__PURE__*/React.createElement(MenuItem, null)
12
- })));
13
- };
5
+ import { SchedulerMenuItem } from "./SchedulerMenuItem.js";
6
+ import { CellLive } from "./CellLive.js";
7
+ const { Browser: Browser } = ContentEntryListConfig;
8
+ const BrowserConfig = ()=>/*#__PURE__*/ react.createElement(ContentEntryListConfig, null, /*#__PURE__*/ react.createElement(IsModelPublishable, null, /*#__PURE__*/ react.createElement(Browser.Sidebar.Footer, {
9
+ name: "scheduler",
10
+ element: /*#__PURE__*/ react.createElement(SchedulerMenuItem, null)
11
+ }), /*#__PURE__*/ react.createElement(Browser.Entry.Action, {
12
+ name: "schedule",
13
+ element: /*#__PURE__*/ react.createElement(MenuItem, null)
14
+ }), /*#__PURE__*/ react.createElement(Browser.Table.Column, {
15
+ name: "live",
16
+ header: "Live",
17
+ truncate: false,
18
+ sortable: true,
19
+ cell: /*#__PURE__*/ react.createElement(CellLive, null)
20
+ })));
21
+ export { BrowserConfig };
14
22
 
15
23
  //# sourceMappingURL=BrowserConfig.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","IsModelPublishable","ContentEntryListConfig","MenuItem","Browser","BrowserConfig","createElement","Entry","Action","name","element"],"sources":["BrowserConfig.tsx"],"sourcesContent":["import React from \"react\";\nimport { IsModelPublishable } from \"@webiny/app-headless-cms/exports/admin/cms.js\";\nimport { ContentEntryListConfig } from \"@webiny/app-headless-cms/admin/config/contentEntries/index.js\";\nimport { MenuItem } from \"./MenuItem.js\";\n\nconst { Browser } = ContentEntryListConfig;\n\nexport const BrowserConfig = () => {\n return (\n <ContentEntryListConfig>\n <IsModelPublishable>\n <Browser.Entry.Action name={\"schedule\"} element={<MenuItem />} />\n </IsModelPublishable>\n </ContentEntryListConfig>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,kBAAkB,QAAQ,+CAA+C;AAClF,SAASC,sBAAsB,QAAQ,+DAA+D;AACtG,SAASC,QAAQ;AAEjB,MAAM;EAAEC;AAAQ,CAAC,GAAGF,sBAAsB;AAE1C,OAAO,MAAMG,aAAa,GAAGA,CAAA,KAAM;EAC/B,oBACIL,KAAA,CAAAM,aAAA,CAACJ,sBAAsB,qBACnBF,KAAA,CAAAM,aAAA,CAACL,kBAAkB,qBACfD,KAAA,CAAAM,aAAA,CAACF,OAAO,CAACG,KAAK,CAACC,MAAM;IAACC,IAAI,EAAE,UAAW;IAACC,OAAO,eAAEV,KAAA,CAAAM,aAAA,CAACH,QAAQ,MAAE;EAAE,CAAE,CAChD,CACA,CAAC;AAEjC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"components/Browser/BrowserConfig.js","sources":["../../../src/components/Browser/BrowserConfig.tsx"],"sourcesContent":["import React from \"react\";\nimport { IsModelPublishable } from \"@webiny/app-headless-cms/exports/admin/cms.js\";\nimport { ContentEntryListConfig } from \"@webiny/app-headless-cms/admin/config/contentEntries/index.js\";\nimport { MenuItem } from \"./MenuItem.js\";\nimport { SchedulerMenuItem } from \"./SchedulerMenuItem.js\";\nimport { CellLive } from \"./CellLive.js\";\n\nconst { Browser } = ContentEntryListConfig;\n\nexport const BrowserConfig = () => {\n return (\n <ContentEntryListConfig>\n <IsModelPublishable>\n <Browser.Sidebar.Footer name={\"scheduler\"} element={<SchedulerMenuItem />} />\n <Browser.Entry.Action name={\"schedule\"} element={<MenuItem />} />\n {/* Override the core \"Live\" column cell to surface scheduled actions. Same column\n name merges over the core (primary) definition from the public (secondary)\n config, replacing only the cell. */}\n <Browser.Table.Column\n name={\"live\"}\n header={\"Live\"}\n truncate={false}\n sortable={true}\n cell={<CellLive />}\n />\n </IsModelPublishable>\n </ContentEntryListConfig>\n );\n};\n"],"names":["Browser","ContentEntryListConfig","BrowserConfig","IsModelPublishable","SchedulerMenuItem","MenuItem","CellLive"],"mappings":";;;;;;AAOA,MAAM,EAAEA,SAAAA,OAAO,EAAE,GAAGC;AAEb,MAAMC,gBAAgB,IAClB,WAAP,GACI,oBAACD,wBAAsBA,MAAAA,WAAAA,GACnB,oBAACE,oBAAkBA,MAAAA,WAAAA,GACf,oBAACH,QAAQ,OAAO,CAAC,MAAM;QAAC,MAAM;QAAa,uBAAS,oBAACI,mBAAiBA;sBACtE,oBAACJ,QAAQ,KAAK,CAAC,MAAM;QAAC,MAAM;QAAY,uBAAS,oBAACK,UAAQA;sBAI1D,oBAACL,QAAQ,KAAK,CAAC,MAAM;QACjB,MAAM;QACN,QAAQ;QACR,UAAU;QACV,UAAU;QACV,oBAAM,oBAACM,UAAQA"}
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ /**
3
+ * Overrides the CMS "Live" column cell to surface scheduled publish/unpublish actions.
4
+ *
5
+ * The data comes from ScheduledActionsPresenter, which the content-entries list presenter decorator
6
+ * keeps loaded for the current model. An entry can be live AND have a scheduled action (e.g. a new
7
+ * revision scheduled to publish), so both are shown when both apply.
8
+ */
9
+ export declare const CellLive: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
10
+ readonly type: () => React.JSX.Element;
11
+ };
@@ -0,0 +1,37 @@
1
+ import react from "react";
2
+ import { observer } from "mobx-react-lite";
3
+ import { ContentEntryListConfig } from "@webiny/app-headless-cms/admin/config/contentEntries/index.js";
4
+ import { useScheduledActionsPresenter } from "../../hooks/useScheduledActionsPresenter.js";
5
+ import { LiveTag } from "./LiveTag.js";
6
+ import { ScheduledTag } from "./ScheduledTag.js";
7
+ import { isScheduleRedundant } from "./isScheduleRedundant.js";
8
+ const CellLive = observer(()=>{
9
+ const { useTableRow, isFolderRow } = ContentEntryListConfig.Browser.Table.Column;
10
+ const { row } = useTableRow();
11
+ const presenter = useScheduledActionsPresenter();
12
+ if (isFolderRow(row)) return /*#__PURE__*/ react.createElement(react.Fragment, null, "-");
13
+ const entry = row.data;
14
+ const liveVersion = entry.live?.version;
15
+ const rawScheduled = presenter.getScheduledAction(entry.id);
16
+ const scheduled = rawScheduled && !isScheduleRedundant(rawScheduled, liveVersion, entry.meta?.version) ? rawScheduled : void 0;
17
+ const lastPublishedOn = entry.lastPublishedOn;
18
+ if (liveVersion && scheduled) return /*#__PURE__*/ react.createElement("div", {
19
+ className: "flex flex-wrap items-center gap-xs"
20
+ }, /*#__PURE__*/ react.createElement(LiveTag, {
21
+ version: liveVersion,
22
+ lastPublishedOn: lastPublishedOn
23
+ }), /*#__PURE__*/ react.createElement(ScheduledTag, {
24
+ scheduled: scheduled
25
+ }));
26
+ if (scheduled) return /*#__PURE__*/ react.createElement(ScheduledTag, {
27
+ scheduled: scheduled
28
+ });
29
+ if (!liveVersion) return /*#__PURE__*/ react.createElement(react.Fragment, null, "No");
30
+ return /*#__PURE__*/ react.createElement(LiveTag, {
31
+ version: liveVersion,
32
+ lastPublishedOn: lastPublishedOn
33
+ });
34
+ });
35
+ export { CellLive };
36
+
37
+ //# sourceMappingURL=CellLive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components/Browser/CellLive.js","sources":["../../../src/components/Browser/CellLive.tsx"],"sourcesContent":["import React from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { ContentEntryListConfig } from \"@webiny/app-headless-cms/admin/config/contentEntries/index.js\";\nimport { useScheduledActionsPresenter } from \"~/hooks/useScheduledActionsPresenter.js\";\nimport { LiveTag } from \"./LiveTag.js\";\nimport { ScheduledTag } from \"./ScheduledTag.js\";\nimport { isScheduleRedundant } from \"./isScheduleRedundant.js\";\n\n/**\n * Overrides the CMS \"Live\" column cell to surface scheduled publish/unpublish actions.\n *\n * The data comes from ScheduledActionsPresenter, which the content-entries list presenter decorator\n * keeps loaded for the current model. An entry can be live AND have a scheduled action (e.g. a new\n * revision scheduled to publish), so both are shown when both apply.\n */\nexport const CellLive = observer(() => {\n const { useTableRow, isFolderRow } = ContentEntryListConfig.Browser.Table.Column;\n const { row } = useTableRow();\n const presenter = useScheduledActionsPresenter();\n\n if (isFolderRow(row)) {\n return <>{\"-\"}</>;\n }\n\n const entry = row.data;\n const liveVersion = entry.live?.version;\n\n const rawScheduled = presenter.getScheduledAction(entry.id);\n // Ignore a scheduled action the entry's current state has already made redundant (see helper).\n const scheduled =\n rawScheduled && !isScheduleRedundant(rawScheduled, liveVersion, entry.meta?.version)\n ? rawScheduled\n : undefined;\n\n const lastPublishedOn = entry.lastPublishedOn;\n\n // Live now AND a change scheduled — show both, wrapping to a second line if the column is narrow.\n if (liveVersion && scheduled) {\n return (\n <div className={\"flex flex-wrap items-center gap-xs\"}>\n <LiveTag version={liveVersion} lastPublishedOn={lastPublishedOn} />\n <ScheduledTag scheduled={scheduled} />\n </div>\n );\n }\n\n if (scheduled) {\n return <ScheduledTag scheduled={scheduled} />;\n }\n\n if (!liveVersion) {\n return <>No</>;\n }\n\n return <LiveTag version={liveVersion} lastPublishedOn={lastPublishedOn} />;\n});\n"],"names":["CellLive","observer","useTableRow","isFolderRow","ContentEntryListConfig","row","presenter","useScheduledActionsPresenter","entry","liveVersion","rawScheduled","scheduled","isScheduleRedundant","undefined","lastPublishedOn","LiveTag","ScheduledTag"],"mappings":";;;;;;;AAeO,MAAMA,WAAWC,SAAS;IAC7B,MAAM,EAAEC,WAAW,EAAEC,WAAW,EAAE,GAAGC,uBAAuB,OAAO,CAAC,KAAK,CAAC,MAAM;IAChF,MAAM,EAAEC,GAAG,EAAE,GAAGH;IAChB,MAAMI,YAAYC;IAElB,IAAIJ,YAAYE,MACZ,OAAO,WAAP,GAAO,0CAAG;IAGd,MAAMG,QAAQH,IAAI,IAAI;IACtB,MAAMI,cAAcD,MAAM,IAAI,EAAE;IAEhC,MAAME,eAAeJ,UAAU,kBAAkB,CAACE,MAAM,EAAE;IAE1D,MAAMG,YACFD,gBAAgB,CAACE,oBAAoBF,cAAcD,aAAaD,MAAM,IAAI,EAAE,WACtEE,eACAG;IAEV,MAAMC,kBAAkBN,MAAM,eAAe;IAG7C,IAAIC,eAAeE,WACf,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;qBACZ,oBAACI,SAAOA;QAAC,SAASN;QAAa,iBAAiBK;sBAChD,oBAACE,cAAYA;QAAC,WAAWL;;IAKrC,IAAIA,WACA,OAAO,WAAP,GAAO,oBAACK,cAAYA;QAAC,WAAWL;;IAGpC,IAAI,CAACF,aACD,OAAO,WAAP,GAAO,0CAAE;IAGb,OAAO,WAAP,GAAO,oBAACM,SAAOA;QAAC,SAASN;QAAa,iBAAiBK;;AAC3D"}
@@ -0,0 +1,7 @@
1
+ import React from "react";
2
+ interface LiveTagProps {
3
+ version: number;
4
+ lastPublishedOn?: string | null;
5
+ }
6
+ export declare const LiveTag: ({ version, lastPublishedOn }: LiveTagProps) => React.JSX.Element;
7
+ export {};
@@ -0,0 +1,19 @@
1
+ import react from "react";
2
+ import { Tag, Tooltip } from "@webiny/admin-ui";
3
+ import { formatUtcOffset, useDateFormatter } from "@webiny/app-admin";
4
+ const LiveTag = ({ version, lastPublishedOn })=>{
5
+ const dateFormatter = useDateFormatter();
6
+ const tag = /*#__PURE__*/ react.createElement(Tag, {
7
+ swatchColor: "#5AC84C",
8
+ variant: "success-light",
9
+ content: `Live (v${version})`
10
+ });
11
+ if (lastPublishedOn) return /*#__PURE__*/ react.createElement(Tooltip, {
12
+ content: `Published ${dateFormatter.format(lastPublishedOn)} (${formatUtcOffset()})`,
13
+ trigger: tag
14
+ });
15
+ return tag;
16
+ };
17
+ export { LiveTag };
18
+
19
+ //# sourceMappingURL=LiveTag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components/Browser/LiveTag.js","sources":["../../../src/components/Browser/LiveTag.tsx"],"sourcesContent":["import React from \"react\";\nimport { Tag, Tooltip } from \"@webiny/admin-ui\";\nimport { formatUtcOffset, useDateFormatter } from \"@webiny/app-admin\";\n\ninterface LiveTagProps {\n version: number;\n lastPublishedOn?: string | null;\n}\n\nexport const LiveTag = ({ version, lastPublishedOn }: LiveTagProps) => {\n const dateFormatter = useDateFormatter();\n\n const tag = (\n <Tag swatchColor={\"#5AC84C\"} variant={\"success-light\"} content={`Live (v${version})`} />\n );\n\n if (lastPublishedOn) {\n return (\n <Tooltip\n content={`Published ${dateFormatter.format(lastPublishedOn)} (${formatUtcOffset()})`}\n trigger={tag}\n />\n );\n }\n\n return tag;\n};\n"],"names":["LiveTag","version","lastPublishedOn","dateFormatter","useDateFormatter","tag","Tag","Tooltip","formatUtcOffset"],"mappings":";;;AASO,MAAMA,UAAU,CAAC,EAAEC,OAAO,EAAEC,eAAe,EAAgB;IAC9D,MAAMC,gBAAgBC;IAEtB,MAAMC,MAAM,WAANA,GACF,oBAACC,KAAGA;QAAC,aAAa;QAAW,SAAS;QAAiB,SAAS,CAAC,OAAO,EAAEL,QAAQ,CAAC,CAAC;;IAGxF,IAAIC,iBACA,OAAO,WAAP,GACI,oBAACK,SAAOA;QACJ,SAAS,CAAC,UAAU,EAAEJ,cAAc,MAAM,CAACD,iBAAiB,EAAE,EAAEM,kBAAkB,CAAC,CAAC;QACpF,SAASH;;IAKrB,OAAOA;AACX"}
@@ -1,2 +1,4 @@
1
1
  import React from "react";
2
- export declare const MenuItem: () => React.JSX.Element | null;
2
+ export declare const MenuItem: (() => React.JSX.Element | null) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element | null;
4
+ };
@@ -1,53 +1,45 @@
1
- import React, { useCallback } from "react";
2
- import { ReactComponent as ScheduleIcon } from "@webiny/icons/cell_tower.svg";
3
- import { useApolloClient } from "@apollo/react-hooks";
1
+ import react, { useCallback } from "react";
2
+ import { observer } from "mobx-react-lite";
3
+ import { ReactComponent } from "@webiny/icons/cell_tower.svg";
4
4
  import { useScheduleDialog } from "@webiny/app-scheduler";
5
+ import { ContentEntryListConfig } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
6
+ import { useEntry } from "@webiny/app-headless-cms";
7
+ import { useModel } from "@webiny/app-headless-cms/exports/admin/cms.js";
5
8
  import { usePermissions } from "../../hooks/usePermissions.js";
6
9
  import { createNamespace } from "../../utils/index.js";
7
- import { ContentEntryListConfig, useContentEntriesList } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
8
- import { useEntry } from "@webiny/app-headless-cms";
9
- export const MenuItem = () => {
10
- const {
11
- modelId
12
- } = useContentEntriesList();
13
- const {
14
- entry
15
- } = useEntry();
16
- const {
17
- canPublish,
18
- canUnpublish
19
- } = usePermissions();
20
- const client = useApolloClient();
21
- const {
22
- showDialog: showSchedulerDialog
23
- } = useScheduleDialog({
24
- client,
25
- namespace: createNamespace({
26
- modelId
27
- }),
28
- target: {
29
- id: entry.id,
30
- title: entry.meta.title,
31
- status: entry.meta.status
32
- }
33
- });
34
- const {
35
- OptionsMenuItem
36
- } = ContentEntryListConfig.Browser.Entry.Action;
37
- const showDialog = useCallback(() => {
38
- showSchedulerDialog();
39
- }, [showSchedulerDialog]);
40
- if (!canPublish && !canUnpublish) {
41
- return null;
42
- }
43
- const action = entry.meta?.status === "published" ? "unpublish" : "publish";
44
- return /*#__PURE__*/React.createElement(OptionsMenuItem, {
45
- icon: /*#__PURE__*/React.createElement(ScheduleIcon, null),
46
- label: `Schedule ${action}`,
47
- onAction: showDialog,
48
- disabled: !entry?.meta?.status,
49
- "data-testid": "cms.content-form.header.schedule"
50
- });
51
- };
10
+ import { useScheduledActionsPresenter } from "../../hooks/useScheduledActionsPresenter.js";
11
+ const MenuItem = observer(()=>{
12
+ const { model } = useModel();
13
+ const { entry } = useEntry();
14
+ const scheduledActions = useScheduledActionsPresenter();
15
+ const { canPublish, canUnpublish } = usePermissions();
16
+ const { showDialog: showSchedulerDialog } = useScheduleDialog({
17
+ namespace: createNamespace({
18
+ modelId: model.modelId
19
+ }),
20
+ target: {
21
+ id: entry.id,
22
+ title: entry.meta.title,
23
+ status: entry.meta.status
24
+ },
25
+ onCompleted: ()=>scheduledActions.reload()
26
+ });
27
+ const { OptionsMenuItem } = ContentEntryListConfig.Browser.Entry.Action;
28
+ const showDialog = useCallback(()=>{
29
+ showSchedulerDialog();
30
+ }, [
31
+ showSchedulerDialog
32
+ ]);
33
+ if (!canPublish && !canUnpublish) return null;
34
+ const action = entry.meta?.status === "published" ? "unpublish" : "publish";
35
+ return /*#__PURE__*/ react.createElement(OptionsMenuItem, {
36
+ icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
37
+ label: `Schedule ${action}`,
38
+ onAction: showDialog,
39
+ disabled: !entry?.meta?.status,
40
+ "data-testid": "cms.content-form.header.schedule"
41
+ });
42
+ });
43
+ export { MenuItem };
52
44
 
53
45
  //# sourceMappingURL=MenuItem.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","useCallback","ReactComponent","ScheduleIcon","useApolloClient","useScheduleDialog","usePermissions","createNamespace","ContentEntryListConfig","useContentEntriesList","useEntry","MenuItem","modelId","entry","canPublish","canUnpublish","client","showDialog","showSchedulerDialog","namespace","target","id","title","meta","status","OptionsMenuItem","Browser","Entry","Action","action","createElement","icon","label","onAction","disabled"],"sources":["MenuItem.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { ReactComponent as ScheduleIcon } from \"@webiny/icons/cell_tower.svg\";\nimport { useApolloClient } from \"@apollo/react-hooks\";\nimport { useScheduleDialog } from \"@webiny/app-scheduler\";\nimport { usePermissions } from \"~/hooks/usePermissions.js\";\nimport { createNamespace } from \"~/utils/index.js\";\nimport {\n ContentEntryListConfig,\n useContentEntriesList\n} from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport { useEntry } from \"@webiny/app-headless-cms\";\n\nexport const MenuItem = () => {\n const { modelId } = useContentEntriesList();\n const { entry } = useEntry();\n\n const { canPublish, canUnpublish } = usePermissions();\n const client = useApolloClient();\n\n const { showDialog: showSchedulerDialog } = useScheduleDialog({\n client,\n namespace: createNamespace({\n modelId\n }),\n target: {\n id: entry.id,\n title: entry.meta.title,\n status: entry.meta.status\n }\n });\n\n const { OptionsMenuItem } = ContentEntryListConfig.Browser.Entry.Action;\n\n const showDialog = useCallback(() => {\n showSchedulerDialog();\n }, [showSchedulerDialog]);\n\n if (!canPublish && !canUnpublish) {\n return null;\n }\n\n const action = entry.meta?.status === \"published\" ? \"unpublish\" : \"publish\";\n\n return (\n <OptionsMenuItem\n icon={<ScheduleIcon />}\n label={`Schedule ${action}`}\n onAction={showDialog}\n disabled={!entry?.meta?.status}\n data-testid={\"cms.content-form.header.schedule\"}\n />\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,WAAW,QAAQ,OAAO;AAC1C,SAASC,cAAc,IAAIC,YAAY,QAAQ,8BAA8B;AAC7E,SAASC,eAAe,QAAQ,qBAAqB;AACrD,SAASC,iBAAiB,QAAQ,uBAAuB;AACzD,SAASC,cAAc;AACvB,SAASC,eAAe;AACxB,SACIC,sBAAsB,EACtBC,qBAAqB,QAClB,0DAA0D;AACjE,SAASC,QAAQ,QAAQ,0BAA0B;AAEnD,OAAO,MAAMC,QAAQ,GAAGA,CAAA,KAAM;EAC1B,MAAM;IAAEC;EAAQ,CAAC,GAAGH,qBAAqB,CAAC,CAAC;EAC3C,MAAM;IAAEI;EAAM,CAAC,GAAGH,QAAQ,CAAC,CAAC;EAE5B,MAAM;IAAEI,UAAU;IAAEC;EAAa,CAAC,GAAGT,cAAc,CAAC,CAAC;EACrD,MAAMU,MAAM,GAAGZ,eAAe,CAAC,CAAC;EAEhC,MAAM;IAAEa,UAAU,EAAEC;EAAoB,CAAC,GAAGb,iBAAiB,CAAC;IAC1DW,MAAM;IACNG,SAAS,EAAEZ,eAAe,CAAC;MACvBK;IACJ,CAAC,CAAC;IACFQ,MAAM,EAAE;MACJC,EAAE,EAAER,KAAK,CAACQ,EAAE;MACZC,KAAK,EAAET,KAAK,CAACU,IAAI,CAACD,KAAK;MACvBE,MAAM,EAAEX,KAAK,CAACU,IAAI,CAACC;IACvB;EACJ,CAAC,CAAC;EAEF,MAAM;IAAEC;EAAgB,CAAC,GAAGjB,sBAAsB,CAACkB,OAAO,CAACC,KAAK,CAACC,MAAM;EAEvE,MAAMX,UAAU,GAAGhB,WAAW,CAAC,MAAM;IACjCiB,mBAAmB,CAAC,CAAC;EACzB,CAAC,EAAE,CAACA,mBAAmB,CAAC,CAAC;EAEzB,IAAI,CAACJ,UAAU,IAAI,CAACC,YAAY,EAAE;IAC9B,OAAO,IAAI;EACf;EAEA,MAAMc,MAAM,GAAGhB,KAAK,CAACU,IAAI,EAAEC,MAAM,KAAK,WAAW,GAAG,WAAW,GAAG,SAAS;EAE3E,oBACIxB,KAAA,CAAA8B,aAAA,CAACL,eAAe;IACZM,IAAI,eAAE/B,KAAA,CAAA8B,aAAA,CAAC3B,YAAY,MAAE,CAAE;IACvB6B,KAAK,EAAE,YAAYH,MAAM,EAAG;IAC5BI,QAAQ,EAAEhB,UAAW;IACrBiB,QAAQ,EAAE,CAACrB,KAAK,EAAEU,IAAI,EAAEC,MAAO;IAC/B,eAAa;EAAmC,CACnD,CAAC;AAEV,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"components/Browser/MenuItem.js","sources":["../../../src/components/Browser/MenuItem.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { ReactComponent as ScheduleIcon } from \"@webiny/icons/cell_tower.svg\";\nimport { useScheduleDialog } from \"@webiny/app-scheduler\";\nimport { ContentEntryListConfig } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport { useEntry } from \"@webiny/app-headless-cms\";\nimport { useModel } from \"@webiny/app-headless-cms/exports/admin/cms.js\";\nimport { usePermissions } from \"~/hooks/usePermissions.js\";\nimport { createNamespace } from \"~/utils/index.js\";\nimport { useScheduledActionsPresenter } from \"~/hooks/useScheduledActionsPresenter.js\";\n\nexport const MenuItem = observer(() => {\n const { model } = useModel();\n const { entry } = useEntry();\n const scheduledActions = useScheduledActionsPresenter();\n\n const { canPublish, canUnpublish } = usePermissions();\n\n const { showDialog: showSchedulerDialog } = useScheduleDialog({\n namespace: createNamespace({ modelId: model.modelId }),\n target: {\n id: entry.id,\n title: entry.meta.title,\n status: entry.meta.status\n },\n onCompleted: () => scheduledActions.reload()\n });\n\n const { OptionsMenuItem } = ContentEntryListConfig.Browser.Entry.Action;\n\n const showDialog = useCallback(() => {\n showSchedulerDialog();\n }, [showSchedulerDialog]);\n\n if (!canPublish && !canUnpublish) {\n return null;\n }\n\n const action = entry.meta?.status === \"published\" ? \"unpublish\" : \"publish\";\n\n return (\n <OptionsMenuItem\n icon={<ScheduleIcon />}\n label={`Schedule ${action}`}\n onAction={showDialog}\n disabled={!entry?.meta?.status}\n data-testid={\"cms.content-form.header.schedule\"}\n />\n );\n});\n"],"names":["MenuItem","observer","model","useModel","entry","useEntry","scheduledActions","useScheduledActionsPresenter","canPublish","canUnpublish","usePermissions","showSchedulerDialog","useScheduleDialog","createNamespace","OptionsMenuItem","ContentEntryListConfig","showDialog","useCallback","action","ScheduleIcon"],"mappings":";;;;;;;;;;AAWO,MAAMA,WAAWC,SAAS;IAC7B,MAAM,EAAEC,KAAK,EAAE,GAAGC;IAClB,MAAM,EAAEC,KAAK,EAAE,GAAGC;IAClB,MAAMC,mBAAmBC;IAEzB,MAAM,EAAEC,UAAU,EAAEC,YAAY,EAAE,GAAGC;IAErC,MAAM,EAAE,YAAYC,mBAAmB,EAAE,GAAGC,kBAAkB;QAC1D,WAAWC,gBAAgB;YAAE,SAASX,MAAM,OAAO;QAAC;QACpD,QAAQ;YACJ,IAAIE,MAAM,EAAE;YACZ,OAAOA,MAAM,IAAI,CAAC,KAAK;YACvB,QAAQA,MAAM,IAAI,CAAC,MAAM;QAC7B;QACA,aAAa,IAAME,iBAAiB,MAAM;IAC9C;IAEA,MAAM,EAAEQ,eAAe,EAAE,GAAGC,uBAAuB,OAAO,CAAC,KAAK,CAAC,MAAM;IAEvE,MAAMC,aAAaC,YAAY;QAC3BN;IACJ,GAAG;QAACA;KAAoB;IAExB,IAAI,CAACH,cAAc,CAACC,cAChB,OAAO;IAGX,MAAMS,SAASd,MAAM,IAAI,EAAE,WAAW,cAAc,cAAc;IAElE,OAAO,WAAP,GACI,oBAACU,iBAAAA;QACG,oBAAM,oBAACK,gBAAYA;QACnB,OAAO,CAAC,SAAS,EAAED,QAAQ;QAC3B,UAAUF;QACV,UAAU,CAACZ,OAAO,MAAM;QACxB,eAAa;;AAGzB"}
@@ -0,0 +1,5 @@
1
+ import React from "react";
2
+ import type { SchedulerEntry } from "@webiny/app-scheduler/types.js";
3
+ export declare const ScheduledTag: ({ scheduled }: {
4
+ scheduled: SchedulerEntry;
5
+ }) => React.JSX.Element;
@@ -0,0 +1,24 @@
1
+ import react from "react";
2
+ import { ReactComponent } from "@webiny/icons/access_time.svg";
3
+ import { Tag, Tooltip } from "@webiny/admin-ui";
4
+ import { ScheduleActionType } from "@webiny/app-scheduler/types.js";
5
+ import { formatUtcOffset, useDateFormatter } from "@webiny/app-admin";
6
+ const scheduledTooltip = (scheduled, dateFormatter)=>{
7
+ const goLiveOn = scheduled.publishOn || scheduled.unpublishOn;
8
+ const actionLabel = scheduled.actionType === ScheduleActionType.unpublish ? "unpublish" : "publish";
9
+ return goLiveOn ? `Scheduled to ${actionLabel} on ${dateFormatter.format(goLiveOn)} (${formatUtcOffset()})` : `Scheduled to ${actionLabel}`;
10
+ };
11
+ const ScheduledTag = ({ scheduled })=>{
12
+ const dateFormatter = useDateFormatter();
13
+ return /*#__PURE__*/ react.createElement(Tooltip, {
14
+ content: scheduledTooltip(scheduled, dateFormatter),
15
+ trigger: /*#__PURE__*/ react.createElement(Tag, {
16
+ variant: "warning",
17
+ icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
18
+ content: "Scheduled"
19
+ })
20
+ });
21
+ };
22
+ export { ScheduledTag };
23
+
24
+ //# sourceMappingURL=ScheduledTag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components/Browser/ScheduledTag.js","sources":["../../../src/components/Browser/ScheduledTag.tsx"],"sourcesContent":["import React from \"react\";\nimport { ReactComponent as ScheduledIcon } from \"@webiny/icons/access_time.svg\";\nimport { Tag, Tooltip } from \"@webiny/admin-ui\";\nimport { ScheduleActionType } from \"@webiny/app-scheduler/types.js\";\nimport type { SchedulerEntry } from \"@webiny/app-scheduler/types.js\";\nimport { useDateFormatter } from \"@webiny/app-admin\";\nimport type { DateFormatter } from \"@webiny/app-admin\";\nimport { formatUtcOffset } from \"@webiny/app-admin\";\n\nconst scheduledTooltip = (\n scheduled: SchedulerEntry,\n dateFormatter: DateFormatter.Interface\n): string => {\n const goLiveOn = scheduled.publishOn || scheduled.unpublishOn;\n const actionLabel =\n scheduled.actionType === ScheduleActionType.unpublish ? \"unpublish\" : \"publish\";\n return goLiveOn\n ? `Scheduled to ${actionLabel} on ${dateFormatter.format(goLiveOn)} (${formatUtcOffset()})`\n : `Scheduled to ${actionLabel}`;\n};\n\nexport const ScheduledTag = ({ scheduled }: { scheduled: SchedulerEntry }) => {\n const dateFormatter = useDateFormatter();\n return (\n <Tooltip\n content={scheduledTooltip(scheduled, dateFormatter)}\n trigger={<Tag variant={\"warning\"} icon={<ScheduledIcon />} content={\"Scheduled\"} />}\n />\n );\n};\n"],"names":["scheduledTooltip","scheduled","dateFormatter","goLiveOn","actionLabel","ScheduleActionType","formatUtcOffset","ScheduledTag","useDateFormatter","Tooltip","Tag","ScheduledIcon"],"mappings":";;;;;AASA,MAAMA,mBAAmB,CACrBC,WACAC;IAEA,MAAMC,WAAWF,UAAU,SAAS,IAAIA,UAAU,WAAW;IAC7D,MAAMG,cACFH,UAAU,UAAU,KAAKI,mBAAmB,SAAS,GAAG,cAAc;IAC1E,OAAOF,WACD,CAAC,aAAa,EAAEC,YAAY,IAAI,EAAEF,cAAc,MAAM,CAACC,UAAU,EAAE,EAAEG,kBAAkB,CAAC,CAAC,GACzF,CAAC,aAAa,EAAEF,aAAa;AACvC;AAEO,MAAMG,eAAe,CAAC,EAAEN,SAAS,EAAiC;IACrE,MAAMC,gBAAgBM;IACtB,OAAO,WAAP,GACI,oBAACC,SAAOA;QACJ,SAAST,iBAAiBC,WAAWC;QACrC,uBAAS,oBAACQ,KAAGA;YAAC,SAAS;YAAW,oBAAM,oBAACC,gBAAaA;YAAK,SAAS;;;AAGhF"}
@@ -0,0 +1,16 @@
1
+ import react from "react";
2
+ import { Sidebar } from "@webiny/admin-ui";
3
+ import { ReactComponent } from "@webiny/icons/cell_tower.svg";
4
+ const SchedulerButton = (props)=>/*#__PURE__*/ react.createElement("div", {
5
+ className: "list-none"
6
+ }, /*#__PURE__*/ react.createElement(Sidebar.Item, {
7
+ onClick: props.onClick,
8
+ text: "Schedule",
9
+ icon: /*#__PURE__*/ react.createElement(Sidebar.Item.Icon, {
10
+ element: /*#__PURE__*/ react.createElement(ReactComponent, null),
11
+ label: "Schedule"
12
+ })
13
+ }));
14
+ export { SchedulerButton };
15
+
16
+ //# sourceMappingURL=SchedulerButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components/Browser/SchedulerButton.js","sources":["../../../src/components/Browser/SchedulerButton.tsx"],"sourcesContent":["import React from \"react\";\nimport { Sidebar } from \"@webiny/admin-ui\";\nimport { ReactComponent as ScheduleIcon } from \"@webiny/icons/cell_tower.svg\";\n\nexport interface ScheduleButtonProps {\n onClick: () => void;\n}\n\nexport const SchedulerButton = (props: ScheduleButtonProps) => {\n return (\n <div className={\"list-none\"}>\n <Sidebar.Item\n onClick={props.onClick}\n text={\"Schedule\"}\n icon={<Sidebar.Item.Icon element={<ScheduleIcon />} label={\"Schedule\"} />}\n />\n </div>\n );\n};\n"],"names":["SchedulerButton","props","Sidebar","ScheduleIcon"],"mappings":";;;AAQO,MAAMA,kBAAkB,CAACC,QACrB,WAAP,GACI,oBAAC;QAAI,WAAW;qBACZ,oBAACC,QAAQ,IAAI;QACT,SAASD,MAAM,OAAO;QACtB,MAAM;QACN,oBAAM,oBAACC,QAAQ,IAAI,CAAC,IAAI;YAAC,uBAAS,oBAACC,gBAAYA;YAAK,OAAO"}
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare const SchedulerMenuItem: () => React.JSX.Element | null;
@@ -0,0 +1,26 @@
1
+ import react from "react";
2
+ import { useModel } from "@webiny/app-headless-cms/exports/admin/cms.js";
3
+ import { usePermissions } from "../../hooks/usePermissions.js";
4
+ import { Scheduler } from "@webiny/app-scheduler";
5
+ import { SchedulerButton } from "./SchedulerButton.js";
6
+ import { useScheduledActionsPresenter } from "../../hooks/useScheduledActionsPresenter.js";
7
+ import { createNamespace } from "../../utils/index.js";
8
+ const SchedulerMenuItem = ()=>{
9
+ const { model } = useModel();
10
+ const { canPublish, canUnpublish } = usePermissions();
11
+ const scheduledActions = useScheduledActionsPresenter();
12
+ const namespace = createNamespace(model);
13
+ if (!canPublish && !canUnpublish) return null;
14
+ return /*#__PURE__*/ react.createElement(Scheduler, {
15
+ namespace: namespace,
16
+ canPublish: canPublish,
17
+ canUnpublish: canUnpublish,
18
+ onClose: ()=>scheduledActions.loadForModel(model.modelId),
19
+ render: ({ showScheduler })=>/*#__PURE__*/ react.createElement(SchedulerButton, {
20
+ onClick: showScheduler
21
+ })
22
+ });
23
+ };
24
+ export { SchedulerMenuItem };
25
+
26
+ //# sourceMappingURL=SchedulerMenuItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components/Browser/SchedulerMenuItem.js","sources":["../../../src/components/Browser/SchedulerMenuItem.tsx"],"sourcesContent":["import React from \"react\";\nimport { useModel } from \"@webiny/app-headless-cms/exports/admin/cms.js\";\nimport { usePermissions } from \"~/hooks/usePermissions.js\";\nimport { Scheduler as BaseScheduler } from \"@webiny/app-scheduler\";\nimport { SchedulerButton } from \"./SchedulerButton.js\";\nimport { useScheduledActionsPresenter } from \"~/hooks/useScheduledActionsPresenter.js\";\nimport { createNamespace } from \"~/utils/index.js\";\n\nexport const SchedulerMenuItem = () => {\n const { model } = useModel();\n const { canPublish, canUnpublish } = usePermissions();\n const scheduledActions = useScheduledActionsPresenter();\n\n const namespace = createNamespace(model);\n\n if (!canPublish && !canUnpublish) {\n return null;\n }\n\n return (\n <BaseScheduler\n namespace={namespace}\n canPublish={canPublish}\n canUnpublish={canUnpublish}\n // The scheduler overlay opens on top of the entries list, so the list stays mounted and\n // its cached scheduled actions go stale when one is cancelled here. Reload on close so the\n // \"Live\" column reflects any cancellations before the user sees the list again.\n onClose={() => scheduledActions.loadForModel(model.modelId)}\n render={({ showScheduler }) => {\n return <SchedulerButton onClick={showScheduler} />;\n }}\n />\n );\n};\n"],"names":["SchedulerMenuItem","model","useModel","canPublish","canUnpublish","usePermissions","scheduledActions","useScheduledActionsPresenter","namespace","createNamespace","BaseScheduler","showScheduler","SchedulerButton"],"mappings":";;;;;;;AAQO,MAAMA,oBAAoB;IAC7B,MAAM,EAAEC,KAAK,EAAE,GAAGC;IAClB,MAAM,EAAEC,UAAU,EAAEC,YAAY,EAAE,GAAGC;IACrC,MAAMC,mBAAmBC;IAEzB,MAAMC,YAAYC,gBAAgBR;IAElC,IAAI,CAACE,cAAc,CAACC,cAChB,OAAO;IAGX,OAAO,WAAP,GACI,oBAACM,WAAaA;QACV,WAAWF;QACX,YAAYL;QACZ,cAAcC;QAId,SAAS,IAAME,iBAAiB,YAAY,CAACL,MAAM,OAAO;QAC1D,QAAQ,CAAC,EAAEU,aAAa,EAAE,GACf,WAAP,GAAO,oBAACC,iBAAeA;gBAAC,SAASD;;;AAIjD"}
@@ -0,0 +1,12 @@
1
+ import type { SchedulerEntry } from "@webiny/app-scheduler/types.js";
2
+ /**
3
+ * A scheduled action is made redundant by a direct publish/unpublish. The API cancels it, but that
4
+ * happens asynchronously, so reconcile against the entry's current state to clear the badge
5
+ * immediately instead of waiting for the backend cancellation to propagate:
6
+ *
7
+ * - Scheduled PUBLISH is redundant once the latest revision is already live
8
+ * (`live.version === version`). It is NOT redundant when an older revision is live and a newer one
9
+ * is queued (live.version < version) — that is the legitimate "live and scheduled" case.
10
+ * - Scheduled UNPUBLISH is redundant once nothing is live.
11
+ */
12
+ export declare const isScheduleRedundant: (scheduled: SchedulerEntry, liveVersion: number | undefined, currentVersion: number | undefined) => boolean;
@@ -0,0 +1,8 @@
1
+ import { ScheduleActionType } from "@webiny/app-scheduler/types.js";
2
+ const isScheduleRedundant = (scheduled, liveVersion, currentVersion)=>{
3
+ if (scheduled.actionType === ScheduleActionType.unpublish) return void 0 === liveVersion;
4
+ return void 0 !== liveVersion && liveVersion === currentVersion;
5
+ };
6
+ export { isScheduleRedundant };
7
+
8
+ //# sourceMappingURL=isScheduleRedundant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components/Browser/isScheduleRedundant.js","sources":["../../../src/components/Browser/isScheduleRedundant.ts"],"sourcesContent":["import { ScheduleActionType } from \"@webiny/app-scheduler/types.js\";\nimport type { SchedulerEntry } from \"@webiny/app-scheduler/types.js\";\n\n/**\n * A scheduled action is made redundant by a direct publish/unpublish. The API cancels it, but that\n * happens asynchronously, so reconcile against the entry's current state to clear the badge\n * immediately instead of waiting for the backend cancellation to propagate:\n *\n * - Scheduled PUBLISH is redundant once the latest revision is already live\n * (`live.version === version`). It is NOT redundant when an older revision is live and a newer one\n * is queued (live.version < version) — that is the legitimate \"live and scheduled\" case.\n * - Scheduled UNPUBLISH is redundant once nothing is live.\n */\nexport const isScheduleRedundant = (\n scheduled: SchedulerEntry,\n liveVersion: number | undefined,\n currentVersion: number | undefined\n): boolean => {\n if (scheduled.actionType === ScheduleActionType.unpublish) {\n return liveVersion === undefined;\n }\n return liveVersion !== undefined && liveVersion === currentVersion;\n};\n"],"names":["isScheduleRedundant","scheduled","liveVersion","currentVersion","ScheduleActionType","undefined"],"mappings":";AAaO,MAAMA,sBAAsB,CAC/BC,WACAC,aACAC;IAEA,IAAIF,UAAU,UAAU,KAAKG,mBAAmB,SAAS,EACrD,OAAOF,AAAgBG,WAAhBH;IAEX,OAAOA,AAAgBG,WAAhBH,eAA6BA,gBAAgBC;AACxD"}
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ /**
3
+ * Decorates the "Publish entry" dialog to warn (via its `intro` prop) that publishing now will
4
+ * cancel an existing scheduled action for the entry.
5
+ */
6
+ export declare const PublishScheduleNoticeDecorator: (props: unknown) => React.JSX.Element;
@@ -0,0 +1,17 @@
1
+ import react from "react";
2
+ import { useNamedConfirmationDialog } from "@webiny/app-admin";
3
+ import { PublishEntryConfirmDialog } from "@webiny/app-headless-cms/exports/admin/cms.js";
4
+ import { ScheduleNoticeAlert } from "./ScheduleNoticeAlert.js";
5
+ const PublishScheduleNoticeDecorator = PublishEntryConfirmDialog.createDecorator((Original)=>function(props) {
6
+ const { params } = useNamedConfirmationDialog();
7
+ return /*#__PURE__*/ react.createElement(Original, {
8
+ ...props,
9
+ intro: /*#__PURE__*/ react.createElement(react.Fragment, null, props.intro, /*#__PURE__*/ react.createElement(ScheduleNoticeAlert, {
10
+ targetId: params.entry?.id,
11
+ verb: "Publishing"
12
+ }))
13
+ });
14
+ });
15
+ export { PublishScheduleNoticeDecorator };
16
+
17
+ //# sourceMappingURL=PublishScheduleNotice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components/Dialogs/PublishScheduleNotice.js","sources":["../../../src/components/Dialogs/PublishScheduleNotice.tsx"],"sourcesContent":["import React from \"react\";\nimport { useNamedConfirmationDialog } from \"@webiny/app-admin\";\nimport { PublishEntryConfirmDialog } from \"@webiny/app-headless-cms/exports/admin/cms.js\";\nimport type { CmsContentEntry } from \"@webiny/app-headless-cms-common/types/index.js\";\nimport { ScheduleNoticeAlert } from \"./ScheduleNoticeAlert.js\";\n\n/**\n * Decorates the \"Publish entry\" dialog to warn (via its `intro` prop) that publishing now will\n * cancel an existing scheduled action for the entry.\n */\nexport const PublishScheduleNoticeDecorator = PublishEntryConfirmDialog.createDecorator(\n Original => {\n return function PublishEntryConfirmDialogWithNotice(props) {\n const { params } = useNamedConfirmationDialog<{ entry: CmsContentEntry }>();\n return (\n <Original\n {...props}\n intro={\n <>\n {props.intro}\n <ScheduleNoticeAlert targetId={params.entry?.id} verb={\"Publishing\"} />\n </>\n }\n />\n );\n };\n }\n);\n"],"names":["PublishScheduleNoticeDecorator","PublishEntryConfirmDialog","Original","props","params","useNamedConfirmationDialog","ScheduleNoticeAlert"],"mappings":";;;;AAUO,MAAMA,iCAAiCC,0BAA0B,eAAe,CACnFC,CAAAA,WACW,SAA6CC,KAAK;QACrD,MAAM,EAAEC,MAAM,EAAE,GAAGC;QACnB,OAAO,WAAP,GACI,oBAACH,UAAAA;YACI,GAAGC,KAAK;YACT,qBACI,0CACKA,MAAM,KAAK,gBACZ,oBAACG,qBAAmBA;gBAAC,UAAUF,OAAO,KAAK,EAAE;gBAAI,MAAM;;;IAK3E"}
@@ -0,0 +1,14 @@
1
+ import React from "react";
2
+ interface ScheduleNoticeAlertProps {
3
+ targetId: string | undefined;
4
+ verb: "Publishing" | "Unpublishing";
5
+ }
6
+ /**
7
+ * Warns that an about-to-happen publish/unpublish will cancel an existing scheduled action for the
8
+ * entry (the API cancels it). Reads from ScheduledActionsPresenter, already populated by the list
9
+ * (or the entry form). Renders nothing when there is no scheduled action.
10
+ */
11
+ export declare const ScheduleNoticeAlert: (({ targetId, verb }: ScheduleNoticeAlertProps) => React.JSX.Element | null) & React.NamedExoticComponent<ScheduleNoticeAlertProps> & {
12
+ readonly type: ({ targetId, verb }: ScheduleNoticeAlertProps) => React.JSX.Element | null;
13
+ };
14
+ export {};
@@ -0,0 +1,22 @@
1
+ import react from "react";
2
+ import { observer } from "mobx-react-lite";
3
+ import { Alert } from "@webiny/admin-ui";
4
+ import { ScheduleActionType } from "@webiny/app-scheduler/types.js";
5
+ import { useDateFormatter } from "@webiny/app-admin";
6
+ import { useScheduledActionsPresenter } from "../../hooks/useScheduledActionsPresenter.js";
7
+ const ScheduleNoticeAlert = observer(({ targetId, verb })=>{
8
+ const presenter = useScheduledActionsPresenter();
9
+ const dateFormatter = useDateFormatter();
10
+ const scheduled = targetId ? presenter.getScheduledAction(targetId) : void 0;
11
+ if (!scheduled) return null;
12
+ const goLiveOn = scheduled.publishOn || scheduled.unpublishOn;
13
+ const actionLabel = scheduled.actionType === ScheduleActionType.unpublish ? "unpublish" : "publish";
14
+ return /*#__PURE__*/ react.createElement(Alert, {
15
+ type: "warning",
16
+ variant: "subtle",
17
+ className: "mb-md"
18
+ }, "This entry has a ", actionLabel, " scheduled", goLiveOn ? ` for ${dateFormatter.format(goLiveOn)}` : "", ". ", verb, " now will cancel it.");
19
+ });
20
+ export { ScheduleNoticeAlert };
21
+
22
+ //# sourceMappingURL=ScheduleNoticeAlert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components/Dialogs/ScheduleNoticeAlert.js","sources":["../../../src/components/Dialogs/ScheduleNoticeAlert.tsx"],"sourcesContent":["import React from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { Alert } from \"@webiny/admin-ui\";\nimport { ScheduleActionType } from \"@webiny/app-scheduler/types.js\";\nimport { useDateFormatter } from \"@webiny/app-admin\";\nimport { useScheduledActionsPresenter } from \"~/hooks/useScheduledActionsPresenter.js\";\n\ninterface ScheduleNoticeAlertProps {\n targetId: string | undefined;\n // The action the user is about to take, used in the warning (\"Publishing now will cancel it.\").\n verb: \"Publishing\" | \"Unpublishing\";\n}\n\n/**\n * Warns that an about-to-happen publish/unpublish will cancel an existing scheduled action for the\n * entry (the API cancels it). Reads from ScheduledActionsPresenter, already populated by the list\n * (or the entry form). Renders nothing when there is no scheduled action.\n */\nexport const ScheduleNoticeAlert = observer(({ targetId, verb }: ScheduleNoticeAlertProps) => {\n const presenter = useScheduledActionsPresenter();\n const dateFormatter = useDateFormatter();\n\n const scheduled = targetId ? presenter.getScheduledAction(targetId) : undefined;\n\n if (!scheduled) {\n return null;\n }\n\n const goLiveOn = scheduled.publishOn || scheduled.unpublishOn;\n const actionLabel =\n scheduled.actionType === ScheduleActionType.unpublish ? \"unpublish\" : \"publish\";\n\n return (\n <Alert type={\"warning\"} variant={\"subtle\"} className={\"mb-md\"}>\n This entry has a {actionLabel} scheduled\n {goLiveOn ? ` for ${dateFormatter.format(goLiveOn)}` : \"\"}. {verb} now will cancel it.\n </Alert>\n );\n});\n"],"names":["ScheduleNoticeAlert","observer","targetId","verb","presenter","useScheduledActionsPresenter","dateFormatter","useDateFormatter","scheduled","undefined","goLiveOn","actionLabel","ScheduleActionType","Alert"],"mappings":";;;;;;AAkBO,MAAMA,sBAAsBC,SAAS,CAAC,EAAEC,QAAQ,EAAEC,IAAI,EAA4B;IACrF,MAAMC,YAAYC;IAClB,MAAMC,gBAAgBC;IAEtB,MAAMC,YAAYN,WAAWE,UAAU,kBAAkB,CAACF,YAAYO;IAEtE,IAAI,CAACD,WACD,OAAO;IAGX,MAAME,WAAWF,UAAU,SAAS,IAAIA,UAAU,WAAW;IAC7D,MAAMG,cACFH,UAAU,UAAU,KAAKI,mBAAmB,SAAS,GAAG,cAAc;IAE1E,OAAO,WAAP,GACI,oBAACC,OAAKA;QAAC,MAAM;QAAW,SAAS;QAAU,WAAW;OAAS,qBACzCF,aAAY,cAC7BD,WAAW,CAAC,KAAK,EAAEJ,cAAc,MAAM,CAACI,WAAW,GAAG,IAAG,MAAGP,MAAK;AAG9E"}
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ /**
3
+ * Decorates the "Unpublish entry" dialog to warn (via its `intro` prop) that unpublishing now will
4
+ * cancel an existing scheduled action for the entry.
5
+ */
6
+ export declare const UnpublishScheduleNoticeDecorator: (props: unknown) => React.JSX.Element;
@@ -0,0 +1,17 @@
1
+ import react from "react";
2
+ import { useNamedConfirmationDialog } from "@webiny/app-admin";
3
+ import { UnpublishEntryConfirmDialog } from "@webiny/app-headless-cms/exports/admin/cms.js";
4
+ import { ScheduleNoticeAlert } from "./ScheduleNoticeAlert.js";
5
+ const UnpublishScheduleNoticeDecorator = UnpublishEntryConfirmDialog.createDecorator((Original)=>function(props) {
6
+ const { params } = useNamedConfirmationDialog();
7
+ return /*#__PURE__*/ react.createElement(Original, {
8
+ ...props,
9
+ intro: /*#__PURE__*/ react.createElement(react.Fragment, null, props.intro, /*#__PURE__*/ react.createElement(ScheduleNoticeAlert, {
10
+ targetId: params.entryId,
11
+ verb: "Unpublishing"
12
+ }))
13
+ });
14
+ });
15
+ export { UnpublishScheduleNoticeDecorator };
16
+
17
+ //# sourceMappingURL=UnpublishScheduleNotice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components/Dialogs/UnpublishScheduleNotice.js","sources":["../../../src/components/Dialogs/UnpublishScheduleNotice.tsx"],"sourcesContent":["import React from \"react\";\nimport { useNamedConfirmationDialog } from \"@webiny/app-admin\";\nimport { UnpublishEntryConfirmDialog } from \"@webiny/app-headless-cms/exports/admin/cms.js\";\nimport { ScheduleNoticeAlert } from \"./ScheduleNoticeAlert.js\";\n\n/**\n * Decorates the \"Unpublish entry\" dialog to warn (via its `intro` prop) that unpublishing now will\n * cancel an existing scheduled action for the entry.\n */\nexport const UnpublishScheduleNoticeDecorator = UnpublishEntryConfirmDialog.createDecorator(\n Original => {\n return function UnpublishEntryConfirmDialogWithNotice(props) {\n const { params } = useNamedConfirmationDialog<{ entryId: string }>();\n return (\n <Original\n {...props}\n intro={\n <>\n {props.intro}\n <ScheduleNoticeAlert targetId={params.entryId} verb={\"Unpublishing\"} />\n </>\n }\n />\n );\n };\n }\n);\n"],"names":["UnpublishScheduleNoticeDecorator","UnpublishEntryConfirmDialog","Original","props","params","useNamedConfirmationDialog","ScheduleNoticeAlert"],"mappings":";;;;AASO,MAAMA,mCAAmCC,4BAA4B,eAAe,CACvFC,CAAAA,WACW,SAA+CC,KAAK;QACvD,MAAM,EAAEC,MAAM,EAAE,GAAGC;QACnB,OAAO,WAAP,GACI,oBAACH,UAAAA;YACI,GAAGC,KAAK;YACT,qBACI,0CACKA,MAAM,KAAK,gBACZ,oBAACG,qBAAmBA;gBAAC,UAAUF,OAAO,OAAO;gBAAE,MAAM;;;IAKzE"}
@@ -1,15 +1,12 @@
1
+ import react from "react";
2
+ import { InternalContentEntryEditorConfig } from "@webiny/app-headless-cms";
1
3
  import { IsModelPublishable } from "@webiny/app-headless-cms/exports/admin/cms.js";
2
- import { ContentEntryEditorConfig } from "@webiny/app-headless-cms/exports/admin/cms/entry/editor.js";
3
- import React from "react";
4
4
  import { MenuItem } from "./MenuItem.js";
5
- const {
6
- Actions
7
- } = ContentEntryEditorConfig;
8
- export const EditorConfig = () => {
9
- return /*#__PURE__*/React.createElement(ContentEntryEditorConfig, null, /*#__PURE__*/React.createElement(IsModelPublishable, null, /*#__PURE__*/React.createElement(Actions.MenuItemAction, {
10
- name: "schedule",
11
- element: /*#__PURE__*/React.createElement(MenuItem, null)
12
- })));
13
- };
5
+ const { Actions: Actions } = InternalContentEntryEditorConfig;
6
+ const EditorConfig = ()=>/*#__PURE__*/ react.createElement(InternalContentEntryEditorConfig, null, /*#__PURE__*/ react.createElement(IsModelPublishable, null, /*#__PURE__*/ react.createElement(Actions.MenuItemAction, {
7
+ name: "schedule",
8
+ element: /*#__PURE__*/ react.createElement(MenuItem, null)
9
+ })));
10
+ export { EditorConfig };
14
11
 
15
12
  //# sourceMappingURL=EditorConfig.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["IsModelPublishable","ContentEntryEditorConfig","React","MenuItem","Actions","EditorConfig","createElement","MenuItemAction","name","element"],"sources":["EditorConfig.tsx"],"sourcesContent":["import { IsModelPublishable } from \"@webiny/app-headless-cms/exports/admin/cms.js\";\nimport { ContentEntryEditorConfig } from \"@webiny/app-headless-cms/exports/admin/cms/entry/editor.js\";\nimport React from \"react\";\nimport { MenuItem } from \"./MenuItem.js\";\n\nconst { Actions } = ContentEntryEditorConfig;\n\nexport const EditorConfig = () => {\n return (\n <ContentEntryEditorConfig>\n <IsModelPublishable>\n <Actions.MenuItemAction name={\"schedule\"} element={<MenuItem />} />\n </IsModelPublishable>\n </ContentEntryEditorConfig>\n );\n};\n"],"mappings":"AAAA,SAASA,kBAAkB,QAAQ,+CAA+C;AAClF,SAASC,wBAAwB,QAAQ,4DAA4D;AACrG,OAAOC,KAAK,MAAM,OAAO;AACzB,SAASC,QAAQ;AAEjB,MAAM;EAAEC;AAAQ,CAAC,GAAGH,wBAAwB;AAE5C,OAAO,MAAMI,YAAY,GAAGA,CAAA,KAAM;EAC9B,oBACIH,KAAA,CAAAI,aAAA,CAACL,wBAAwB,qBACrBC,KAAA,CAAAI,aAAA,CAACN,kBAAkB,qBACfE,KAAA,CAAAI,aAAA,CAACF,OAAO,CAACG,cAAc;IAACC,IAAI,EAAE,UAAW;IAACC,OAAO,eAAEP,KAAA,CAAAI,aAAA,CAACH,QAAQ,MAAE;EAAE,CAAE,CAClD,CACE,CAAC;AAEnC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"components/Editor/EditorConfig.js","sources":["../../../src/components/Editor/EditorConfig.tsx"],"sourcesContent":["import React from \"react\";\nimport { InternalContentEntryEditorConfig } from \"@webiny/app-headless-cms\";\nimport { IsModelPublishable } from \"@webiny/app-headless-cms/exports/admin/cms.js\";\nimport { MenuItem } from \"./MenuItem.js\";\n\nconst { Actions } = InternalContentEntryEditorConfig;\n\nexport const EditorConfig = () => {\n return (\n <InternalContentEntryEditorConfig>\n <IsModelPublishable>\n <Actions.MenuItemAction name={\"schedule\"} element={<MenuItem />} />\n </IsModelPublishable>\n </InternalContentEntryEditorConfig>\n );\n};\n"],"names":["Actions","InternalContentEntryEditorConfig","EditorConfig","IsModelPublishable","MenuItem"],"mappings":";;;;AAKA,MAAM,EAAEA,SAAAA,OAAO,EAAE,GAAGC;AAEb,MAAMC,eAAe,IACjB,WAAP,GACI,oBAACD,kCAAgCA,MAAAA,WAAAA,GAC7B,oBAACE,oBAAkBA,MAAAA,WAAAA,GACf,oBAACH,QAAQ,cAAc;QAAC,MAAM;QAAY,uBAAS,oBAACI,UAAQA"}
@@ -1,2 +1,4 @@
1
1
  import React from "react";
2
- export declare const MenuItem: () => React.JSX.Element | null;
2
+ export declare const MenuItem: (() => React.JSX.Element | null) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element | null;
4
+ };