@nascentdigital/funnel-editor-contentful 5.0.1 → 5.0.3

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 (164) hide show
  1. package/dist/EditorApp.js +11 -9
  2. package/dist/EditorPageRouter.d.ts +1 -0
  3. package/dist/EditorPageRouter.js +34 -0
  4. package/dist/EditorPageRoutes.d.ts +1 -0
  5. package/dist/EditorPageRoutes.js +16 -0
  6. package/dist/EntryEditor.js +30 -29
  7. package/dist/EntrySidebar.js +26 -5
  8. package/dist/NotFound.d.ts +1 -0
  9. package/dist/NotFound.js +18 -0
  10. package/dist/asset/index.d.ts +1 -0
  11. package/dist/{core/api → asset}/index.js +1 -3
  12. package/dist/{core → asset}/repository/AssetRepository.d.ts +11 -3
  13. package/dist/{core → asset}/repository/AssetRepository.js +6 -5
  14. package/dist/asset/repository/index.d.ts +1 -0
  15. package/dist/{core → asset}/repository/index.js +0 -4
  16. package/dist/collection/controller/{LocalCollectionController.d.ts → ContentfulCollectionController.d.ts} +17 -11
  17. package/dist/collection/controller/ContentfulCollectionController.js +278 -0
  18. package/dist/collection/controller/ContentfulCollectionControllerContainer.d.ts +5 -0
  19. package/dist/collection/controller/ContentfulCollectionControllerContainer.js +28 -0
  20. package/dist/collection/controller/index.d.ts +3 -4
  21. package/dist/collection/controller/index.js +3 -4
  22. package/dist/collection/controller/useContentfulCollectionController.d.ts +2 -0
  23. package/dist/collection/controller/useContentfulCollectionController.js +8 -0
  24. package/dist/{core → collection}/domain/Collection.d.ts +11 -2
  25. package/dist/{core → collection}/domain/Collection.js +76 -0
  26. package/dist/{core → collection}/domain/index.d.ts +0 -1
  27. package/dist/{core → collection}/domain/index.js +0 -1
  28. package/dist/collection/index.d.ts +1 -0
  29. package/dist/collection/index.js +1 -0
  30. package/dist/collection/repository/CollectionRepository.d.ts +49 -0
  31. package/dist/collection/repository/CollectionRepository.js +223 -0
  32. package/dist/collection/repository/index.d.ts +1 -0
  33. package/dist/{core/contentful → collection/repository}/index.js +1 -5
  34. package/dist/collection/screens/CollectionEditor.js +23 -6
  35. package/dist/core/bridge/AppBridge.d.ts +31 -0
  36. package/dist/core/bridge/AppBridge.js +160 -0
  37. package/dist/core/bridge/AppBridgeContainer.d.ts +3 -3
  38. package/dist/core/bridge/AppBridgeContainer.js +8 -44
  39. package/dist/core/bridge/AppBridgeContext.d.ts +7 -8
  40. package/dist/core/bridge/AppBridgeContext.js +1 -6
  41. package/dist/core/bridge/BridgeLifecycleMessage.d.ts +7 -0
  42. package/dist/core/bridge/BridgeLifecycleMessage.js +12 -0
  43. package/dist/core/bridge/IAppBridgeMessage.d.ts +16 -0
  44. package/dist/core/bridge/IAppBridgeMessage.js +12 -0
  45. package/dist/core/bridge/index.d.ts +2 -1
  46. package/dist/core/bridge/index.js +2 -1
  47. package/dist/core/bridge/useAppBridge.d.ts +2 -8
  48. package/dist/core/bridge/useAppBridge.js +24 -15
  49. package/dist/core/client/ContentfulClientContainer.d.ts +8 -0
  50. package/dist/core/client/ContentfulClientContainer.js +43 -0
  51. package/dist/core/client/ContentfulClientContext.d.ts +8 -0
  52. package/dist/core/client/ContentfulClientContext.js +8 -0
  53. package/dist/core/client/index.d.ts +3 -0
  54. package/dist/core/client/index.js +19 -0
  55. package/dist/core/client/useContentfulClient.d.ts +4 -0
  56. package/dist/core/client/useContentfulClient.js +24 -0
  57. package/dist/core/index.d.ts +1 -4
  58. package/dist/core/index.js +1 -4
  59. package/dist/explore/components/header/Header.d.ts +14 -0
  60. package/dist/explore/components/header/Header.js +33 -0
  61. package/dist/explore/components/header/HeaderActions.d.ts +8 -0
  62. package/dist/explore/components/header/HeaderActions.js +37 -0
  63. package/dist/explore/components/header/HeaderContainer.d.ts +2 -0
  64. package/dist/explore/components/header/HeaderContainer.js +15 -0
  65. package/dist/explore/components/header/HeaderContext.d.ts +7 -0
  66. package/dist/{core/api/EditorApiContext.js → explore/components/header/HeaderContext.js} +2 -2
  67. package/dist/explore/components/header/HeaderController.d.ts +39 -0
  68. package/dist/explore/components/header/HeaderController.js +100 -0
  69. package/dist/explore/components/header/HeaderOptions.d.ts +10 -0
  70. package/dist/explore/components/header/HeaderOptions.js +26 -0
  71. package/dist/explore/components/header/index.d.ts +5 -0
  72. package/dist/explore/components/header/index.js +21 -0
  73. package/dist/explore/components/header/useHeader.d.ts +2 -0
  74. package/dist/explore/components/header/useHeader.js +30 -0
  75. package/dist/explore/components/index.d.ts +2 -0
  76. package/dist/explore/components/index.js +18 -0
  77. package/dist/explore/components/pages/PagesExplorerLayout.d.ts +4 -0
  78. package/dist/explore/components/pages/PagesExplorerLayout.js +28 -0
  79. package/dist/explore/components/pages/index.d.ts +1 -0
  80. package/dist/explore/components/pages/index.js +17 -0
  81. package/dist/explore/index.d.ts +2 -0
  82. package/dist/explore/index.js +18 -0
  83. package/dist/explore/screens/Dashboard.d.ts +4 -0
  84. package/dist/explore/screens/Dashboard.js +55 -0
  85. package/dist/explore/screens/PageExplorer.d.ts +11 -0
  86. package/dist/explore/screens/PageExplorer.js +129 -0
  87. package/dist/explore/screens/PagesExplorer.d.ts +7 -0
  88. package/dist/explore/screens/PagesExplorer.js +98 -0
  89. package/dist/explore/screens/index.d.ts +3 -0
  90. package/dist/explore/screens/index.js +19 -0
  91. package/dist/page/bridge/BlockChangedMessage.d.ts +25 -0
  92. package/dist/page/bridge/BlockChangedMessage.js +18 -0
  93. package/dist/page/bridge/PageBridgeHub.d.ts +8 -0
  94. package/dist/page/bridge/PageBridgeHub.js +51 -0
  95. package/dist/page/bridge/index.d.ts +2 -0
  96. package/dist/page/bridge/index.js +18 -0
  97. package/dist/page/controller/{LocalPageController.d.ts → ContentfulPageController.d.ts} +15 -9
  98. package/dist/page/controller/ContentfulPageController.js +277 -0
  99. package/dist/page/controller/ContentfulPageControllerContainer.d.ts +5 -0
  100. package/dist/page/controller/ContentfulPageControllerContainer.js +28 -0
  101. package/dist/page/controller/index.d.ts +3 -3
  102. package/dist/page/controller/index.js +3 -3
  103. package/dist/page/controller/useContentfulPageController.d.ts +2 -0
  104. package/dist/page/controller/useContentfulPageController.js +8 -0
  105. package/dist/{core → page}/domain/Page.d.ts +23 -12
  106. package/dist/{core → page}/domain/Page.js +139 -0
  107. package/dist/page/domain/index.d.ts +1 -0
  108. package/dist/page/domain/index.js +17 -0
  109. package/dist/page/index.d.ts +3 -0
  110. package/dist/page/index.js +3 -0
  111. package/dist/page/repository/PageRepository.d.ts +45 -0
  112. package/dist/page/repository/PageRepository.js +241 -0
  113. package/dist/page/repository/index.d.ts +1 -0
  114. package/dist/page/repository/index.js +17 -0
  115. package/dist/page/screens/PageEditor.js +36 -12
  116. package/package.json +9 -5
  117. package/dist/collection/controller/LocalCollectionController.js +0 -200
  118. package/dist/collection/controller/LocalCollectionControllerContainer.d.ts +0 -8
  119. package/dist/collection/controller/LocalCollectionControllerContainer.js +0 -36
  120. package/dist/collection/controller/LocalCollectionControllerContext.d.ts +0 -7
  121. package/dist/collection/controller/LocalCollectionControllerContext.js +0 -6
  122. package/dist/collection/controller/useLocalCollectionController.d.ts +0 -2
  123. package/dist/collection/controller/useLocalCollectionController.js +0 -10
  124. package/dist/core/api/EditorApiClient.d.ts +0 -7
  125. package/dist/core/api/EditorApiClient.js +0 -29
  126. package/dist/core/api/EditorApiContainer.d.ts +0 -5
  127. package/dist/core/api/EditorApiContainer.js +0 -16
  128. package/dist/core/api/EditorApiContext.d.ts +0 -7
  129. package/dist/core/api/index.d.ts +0 -3
  130. package/dist/core/api/useEditorApi.d.ts +0 -2
  131. package/dist/core/api/useEditorApi.js +0 -12
  132. package/dist/core/bridge/AppMessage.d.ts +0 -19
  133. package/dist/core/bridge/AppMessage.js +0 -19
  134. package/dist/core/contentful/Contentful.d.ts +0 -33
  135. package/dist/core/contentful/Contentful.js +0 -67
  136. package/dist/core/contentful/ContentfulAsset.d.ts +0 -23
  137. package/dist/core/contentful/ContentfulAsset.js +0 -88
  138. package/dist/core/contentful/ContentfulCollection.d.ts +0 -29
  139. package/dist/core/contentful/ContentfulCollection.js +0 -97
  140. package/dist/core/contentful/ContentfulPage.d.ts +0 -31
  141. package/dist/core/contentful/ContentfulPage.js +0 -84
  142. package/dist/core/contentful/ContentfulRefs.d.ts +0 -16
  143. package/dist/core/contentful/ContentfulRefs.js +0 -152
  144. package/dist/core/contentful/index.d.ts +0 -5
  145. package/dist/core/repository/CollectionSerializer.d.ts +0 -9
  146. package/dist/core/repository/CollectionSerializer.js +0 -41
  147. package/dist/core/repository/LocalCollectionRepository.d.ts +0 -27
  148. package/dist/core/repository/LocalCollectionRepository.js +0 -143
  149. package/dist/core/repository/LocalPageRepository.d.ts +0 -16
  150. package/dist/core/repository/LocalPageRepository.js +0 -153
  151. package/dist/core/repository/PageSerializer.d.ts +0 -9
  152. package/dist/core/repository/PageSerializer.js +0 -47
  153. package/dist/core/repository/RemoteCollectionRepository.d.ts +0 -19
  154. package/dist/core/repository/RemoteCollectionRepository.js +0 -236
  155. package/dist/core/repository/RemotePageRepository.d.ts +0 -14
  156. package/dist/core/repository/RemotePageRepository.js +0 -113
  157. package/dist/core/repository/index.d.ts +0 -5
  158. package/dist/page/controller/LocalPageController.js +0 -190
  159. package/dist/page/controller/LocalPageControllerContainer.d.ts +0 -8
  160. package/dist/page/controller/LocalPageControllerContainer.js +0 -36
  161. package/dist/page/controller/LocalPageControllerContext.d.ts +0 -7
  162. package/dist/page/controller/LocalPageControllerContext.js +0 -6
  163. package/dist/page/controller/useLocalPageController.d.ts +0 -2
  164. package/dist/page/controller/useLocalPageController.js +0 -10
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PagesExplorerLayout = PagesExplorerLayout;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const funnel_core_1 = require("@nascentdigital/funnel-core");
6
+ const components_1 = require("@nascentdigital/funnel-editor/components");
7
+ const react_1 = require("react");
8
+ const react_router_1 = require("react-router");
9
+ const screens_1 = require("../../screens");
10
+ const index_1 = require("../header/index");
11
+ // layout
12
+ function PagesExplorerLayout() {
13
+ // bind hooks + context
14
+ const navigate = (0, react_router_1.useNavigate)();
15
+ const { region: possibleRegion } = (0, react_router_1.useParams)();
16
+ const { regionalization } = funnel_core_1.AppConfig.brandConfig();
17
+ const regions = (0, react_1.useMemo)(() => Object.entries(regionalization.regions)
18
+ .map(([region, config]) => ({ id: region, label: config.name })), [regionalization]);
19
+ const region = possibleRegion !== null && possibleRegion !== void 0 ? possibleRegion : funnel_core_1.RegionsConfig.getDefaultRegion(regionalization);
20
+ const appState = (0, components_1.useAppState)();
21
+ const pageRepository = (0, components_1.usePageRepository)();
22
+ const siteContext = (0, react_1.useMemo)(() => {
23
+ const site = new components_1.Site({ appState, repository: pageRepository, region });
24
+ return { site };
25
+ }, [appState, pageRepository, region]);
26
+ // render
27
+ return ((0, jsx_runtime_1.jsxs)(components_1.SiteContext.Provider, { value: siteContext, children: [(0, jsx_runtime_1.jsx)(index_1.HeaderActions, { priority: 10, children: (0, jsx_runtime_1.jsx)(components_1.Combobox, { options: regions, selectedOption: region, onSelect: region => navigate(screens_1.PagesExplorer.getUrl({ region })), size: "sm" }) }), (0, jsx_runtime_1.jsx)(react_router_1.Outlet, {})] }));
28
+ }
@@ -0,0 +1 @@
1
+ export * from './PagesExplorerLayout';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./PagesExplorerLayout"), exports);
@@ -0,0 +1,2 @@
1
+ export * from './components';
2
+ export * from './screens';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./components"), exports);
18
+ __exportStar(require("./screens"), exports);
@@ -0,0 +1,4 @@
1
+ export declare function Dashboard(): import("react/jsx-runtime").JSX.Element;
2
+ export declare namespace Dashboard {
3
+ function getUrl(): string;
4
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Dashboard = Dashboard;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const funnel_core_1 = require("@nascentdigital/funnel-core");
9
+ const components_1 = require("@nascentdigital/funnel-editor/components");
10
+ const classnames_1 = __importDefault(require("classnames"));
11
+ const react_1 = require("react");
12
+ const react_router_1 = require("react-router");
13
+ const components_2 = require("../components");
14
+ // screen
15
+ function Dashboard() {
16
+ // bind hooks
17
+ const brand = funnel_core_1.AppConfig.brandConfig();
18
+ const splash = (0, components_1.useSplash)();
19
+ const { collections } = funnel_core_1.Schema.Site.current();
20
+ const navigate = (0, react_router_1.useNavigate)();
21
+ // dismiss splash
22
+ (0, react_1.useEffect)(() => {
23
+ splash.dismiss();
24
+ }, [splash]);
25
+ // render
26
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "w-dvw h-dvh flex flex-col", children: [(0, jsx_runtime_1.jsx)(components_2.HeaderOptions, { breadcrumbs: ['CMS Dashboard'], backButton: "none", highlightBreadcrumb: true }), (0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)('w-full sm:w-4/5 md:w-3/5 max-h-full overflow-y-scroll p-l6', 'grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 grid-auto-rows auto-cols-fr auto-rows-fr gap-l6'), tabIndex: -1, children: [renderNavCard({
27
+ title: 'My Site\'s Pages',
28
+ caption: 'Your main website.',
29
+ action: 'Explore pages',
30
+ onClick: () => navigate('/pages')
31
+ }), collections.length > 0 && renderNavCard({
32
+ title: 'Collections',
33
+ caption: 'Shared data used by site pages.',
34
+ action: 'Manage collections',
35
+ onClick: () => navigate('/collections')
36
+ }), renderNavCard({
37
+ title: 'Media',
38
+ caption: 'Images, videos and other files.',
39
+ action: 'Manage media',
40
+ onClick: () => navigate('/pages'),
41
+ disabled: true
42
+ })] })] }));
43
+ }
44
+ // extension
45
+ (function (Dashboard) {
46
+ // helper
47
+ function getUrl() {
48
+ return '/';
49
+ }
50
+ Dashboard.getUrl = getUrl;
51
+ })(Dashboard || (exports.Dashboard = Dashboard = {}));
52
+ function renderNavCard({ title, caption, action, disabled = false, onClick = funnel_core_1.Fn.NoOp }) {
53
+ // render
54
+ return ((0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)('flex flex-col items-center gap-l6 bg-background p-l8', 'border border-solid border-border-l1 rounded-sm'), children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex-1 w-full", children: [(0, jsx_runtime_1.jsx)("h2", { className: "heading-md text-content-primary", children: title }), (0, jsx_runtime_1.jsx)("p", { className: "body-sm texts-content-secondary", children: caption })] }), (0, jsx_runtime_1.jsx)(components_1.Button, { variant: "primary", disabled: disabled, onClick: onClick, children: action })] }));
55
+ }
@@ -0,0 +1,11 @@
1
+ import { Schema } from '@nascentdigital/funnel-core';
2
+ import { PagesExplorerLayout } from '../components';
3
+ import { PagesExplorer } from './PagesExplorer';
4
+ export declare function PageExplorer(): import("react/jsx-runtime").JSX.Element;
5
+ export declare namespace PageExplorer {
6
+ type Params = PagesExplorerLayout.Params | 'pageType';
7
+ type GetUrlArgs = PagesExplorer.GetUrlArgs & {
8
+ pageType: Schema.Page.Type;
9
+ };
10
+ function getUrl({ pageType, ...pagesArgs }: GetUrlArgs): string;
11
+ }
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.PageExplorer = PageExplorer;
15
+ const jsx_runtime_1 = require("react/jsx-runtime");
16
+ const components_1 = require("@nascentdigital/funnel-editor/components");
17
+ const react_1 = require("react");
18
+ const react_router_1 = require("react-router");
19
+ const components_2 = require("../components");
20
+ const PagesExplorer_1 = require("./PagesExplorer");
21
+ // screen
22
+ function PageExplorer() {
23
+ // bind hooks
24
+ const params = (0, react_router_1.useParams)();
25
+ const pageType = params.pageType;
26
+ const navigate = (0, react_router_1.useNavigate)();
27
+ const splash = (0, components_1.useSplash)();
28
+ const site = (0, components_1.useSite)();
29
+ const template = site.getPageSchema(pageType);
30
+ const collection = (0, components_1.usePageCollection)(pageType);
31
+ const { ready = false, items } = collection !== null && collection !== void 0 ? collection : {};
32
+ const groupedPages = (0, react_1.useMemo)(() => (!ready || !items)
33
+ ? undefined
34
+ : groupPages(site, items), [site, items, ready]);
35
+ // dismiss splash
36
+ (0, react_1.useEffect)(() => {
37
+ if (ready) {
38
+ splash.dismiss();
39
+ }
40
+ }, [splash, ready]);
41
+ // helpers
42
+ const onCreatePage = async (e, anchorId) => {
43
+ };
44
+ const onOpenPage = async ({ template, language, slug }) => {
45
+ };
46
+ // render
47
+ return ((0, jsx_runtime_1.jsxs)(components_1.FadeIn, { className: "w-full flex-1", variant: "blur", children: [(0, jsx_runtime_1.jsx)(components_2.HeaderOptions, { breadcrumbs: [{ label: 'Site Map', url: PagesExplorer_1.PagesExplorer.getUrl({ region: site.region.id }) }, template.name], highlightBreadcrumb: true, backButton: "back", onBack: () => navigate('/pages') }), (0, jsx_runtime_1.jsx)("div", { className: "relative flex-1 overflow-y-scroll shrink-0", tabIndex: -1, children: (0, jsx_runtime_1.jsx)("div", { className: "container-sm container-p", children: (0, jsx_runtime_1.jsx)(components_1.LoadingUntilReady, { className: "flex flex-col gap-l10 py-l14", ready: ready, children: renderPages({ template, groupedPages, onCreatePage, onOpenPage }) }) }) })] }, `page.${pageType}`));
48
+ }
49
+ // extension
50
+ (function (PageExplorer) {
51
+ function getUrl(_a) {
52
+ var { pageType } = _a, pagesArgs = __rest(_a, ["pageType"]);
53
+ return `${PagesExplorer_1.PagesExplorer.getUrl(pagesArgs)}/page/${pageType}`;
54
+ }
55
+ PageExplorer.getUrl = getUrl;
56
+ })(PageExplorer || (exports.PageExplorer = PageExplorer = {}));
57
+ function renderPages({ template, groupedPages, onCreatePage, onOpenPage }) {
58
+ // show loader if not ready
59
+ if (!groupedPages) {
60
+ return null;
61
+ }
62
+ // or show empty state if there are no pages
63
+ const { inProgress, live, unpublished } = groupedPages;
64
+ if (inProgress.length === 0 && live.length === 0 && unpublished.length === 0) {
65
+ return ((0, jsx_runtime_1.jsxs)(components_1.EmptyState, { variant: "missing", children: [(0, jsx_runtime_1.jsxs)("h3", { className: "heading-md text-content-primary", children: ["There are no ", template.name, " pages created yet!"] }), (0, jsx_runtime_1.jsxs)(components_1.Button, { anchorId: "page-create", variant: "primary", iconLeft: "Plus", onClick: e => onCreatePage(e, 'page-create'), children: ["Create a ", template.name] })] }, "empty"));
66
+ }
67
+ // render pages
68
+ return ((0, jsx_runtime_1.jsxs)(react_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex flex-wrap gap-l8 justify-between items-center", children: [(0, jsx_runtime_1.jsxs)("h2", { className: "heading-lg text-content-primary", children: [template.name, " pages"] }), (0, jsx_runtime_1.jsxs)(components_1.Button, { anchorId: "page-create", variant: "primary", iconLeft: "Plus", onClick: e => onCreatePage(e, 'page-create'), children: ["Create a new ", template.name] })] }), inProgress.length > 0 &&
69
+ (0, jsx_runtime_1.jsx)(components_1.Table, { className: "flex-1", title: "Work in progress", children: inProgress.map(({ summary: { status }, link }) => (0, jsx_runtime_1.jsx)(components_1.TableItem, { details: status === 'ready'
70
+ ? (0, jsx_runtime_1.jsx)(components_1.StatusBadge, { variant: "success", label: "Ready to publish" })
71
+ : status === 'changed'
72
+ ? (0, jsx_runtime_1.jsx)(components_1.StatusBadge, { variant: "warn", label: "Changed" })
73
+ : undefined, iconRight: "ChevronRight", onClick: () => onOpenPage(link), children: link.name }, link.id)) }), unpublished.length > 0 &&
74
+ (0, jsx_runtime_1.jsx)(components_1.Table, { className: "flex-1", title: "Pending Unpublish", children: unpublished.map(({ summary: { status }, link }) => (0, jsx_runtime_1.jsx)(components_1.TableItem, { children: link.name }, link.id)) }), live.length > 0 &&
75
+ (0, jsx_runtime_1.jsx)(components_1.Table, { className: "flex-1", title: "Live", children: live.map(({ summary, link }) => (0, jsx_runtime_1.jsx)(components_1.TableItem, { iconRight: "ChevronRight", onClick: () => onOpenPage(link), children: link.name }, link.id)) })] }, "pages"));
76
+ }
77
+ function groupPages(site, summaries) {
78
+ // group pages
79
+ const { region: { id: region }, defaultLanguage: language } = site;
80
+ const groupedPages = summaries
81
+ // enrich summaries with links
82
+ .map(summary => ({ summary, link: summary.getClosestPageRef({ region, language }) }))
83
+ // group summaries based on status
84
+ .reduce((groupedPages, linkedSummary) => {
85
+ // bind page to group (drop empty pages groups, which shouldn't occur)
86
+ switch (linkedSummary.summary.status) {
87
+ case 'draft':
88
+ case 'changed':
89
+ case 'ready':
90
+ groupedPages.inProgress.push(linkedSummary);
91
+ break;
92
+ case 'unpublished':
93
+ groupedPages.unpublished.push(linkedSummary);
94
+ break;
95
+ case 'live':
96
+ groupedPages.live.push(linkedSummary);
97
+ break;
98
+ }
99
+ // keep reducing
100
+ return groupedPages;
101
+ }, { inProgress: [], live: [], unpublished: [] });
102
+ // sort pages
103
+ groupedPages.inProgress.sort((lhs, rhs) => {
104
+ // sort by status first
105
+ const lhsStatus = lhs.summary.status;
106
+ const rhsStatus = rhs.summary.status;
107
+ if (lhsStatus !== rhsStatus) {
108
+ if (lhsStatus === 'ready') {
109
+ return -1;
110
+ }
111
+ else if (rhsStatus === 'ready') {
112
+ return 1;
113
+ }
114
+ else if (lhsStatus === 'changed') {
115
+ return -1;
116
+ }
117
+ else if (rhsStatus === 'changed') {
118
+ return 1;
119
+ }
120
+ }
121
+ // otherwise sort by name
122
+ return lhs.link.name.localeCompare(rhs.link.name);
123
+ });
124
+ groupedPages.unpublished.sort((lhs, rhs) => lhs.link.name.localeCompare(rhs.link.name));
125
+ groupedPages.live.sort((lhs, rhs) => lhs.link.name.localeCompare(rhs.link.name));
126
+ console.debug('[PageExplorer] grouped pages', groupedPages);
127
+ // return groups
128
+ return groupedPages;
129
+ }
@@ -0,0 +1,7 @@
1
+ export declare function PagesExplorer(): import("react/jsx-runtime").JSX.Element;
2
+ export declare namespace PagesExplorer {
3
+ type GetUrlArgs = {
4
+ region: string;
5
+ };
6
+ function getUrl({ region }: GetUrlArgs): string;
7
+ }
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PagesExplorer = PagesExplorer;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_apps_toolkit_1 = require("@contentful/react-apps-toolkit");
6
+ const funnel_core_1 = require("@nascentdigital/funnel-core");
7
+ const components_1 = require("@nascentdigital/funnel-editor/components");
8
+ const react_1 = require("react");
9
+ const react_router_1 = require("react-router");
10
+ const core_1 = require("../../core");
11
+ const components_2 = require("../components");
12
+ const PageExplorer_1 = require("./PageExplorer");
13
+ // screen
14
+ function PagesExplorer() {
15
+ // bind hooks
16
+ const sdk = (0, react_apps_toolkit_1.useSDK)();
17
+ const navigate = (0, react_router_1.useNavigate)();
18
+ const site = (0, components_1.useSite)();
19
+ const contentClient = (0, core_1.useContentfulClient)();
20
+ const splash = (0, components_1.useSplash)();
21
+ const dialog = (0, components_1.useDialog)();
22
+ const { ready, region: { id: region } } = site;
23
+ // dismiss splash
24
+ (0, react_1.useEffect)(() => {
25
+ if (ready) {
26
+ splash.dismiss();
27
+ }
28
+ }, [splash, ready]);
29
+ // helpers
30
+ const onPageClick = async (overview) => {
31
+ var _a;
32
+ // open static page
33
+ if (overview instanceof components_1.StaticPageOverview) {
34
+ // get closest page that matches our current region (or create it if there are no pages at all - new group)
35
+ let page = (_a = overview.findPage({ region })) !== null && _a !== void 0 ? _a : overview.pages[0];
36
+ if (!page) {
37
+ try {
38
+ // pick the best language
39
+ const language = site.getClosestLanguage(overview.languages);
40
+ console.debug('[PagesExplorer] page is not here - creating for language:', language);
41
+ // create new page for region
42
+ const { template } = overview;
43
+ const result = await contentClient.pages.create({
44
+ type: template.type,
45
+ brand: funnel_core_1.AppConfig.brand(),
46
+ region,
47
+ language,
48
+ name: template.name,
49
+ tags: []
50
+ });
51
+ // fail if page wasn't created
52
+ if (!result.page) {
53
+ await dialog.notify({
54
+ title: 'Failed to create page',
55
+ message: 'Something went wrong and while trying to create the page.'
56
+ });
57
+ }
58
+ // or capture ir
59
+ else {
60
+ page = result.page.data;
61
+ console.debug('[PagesExplorer] created page:', page);
62
+ }
63
+ }
64
+ // or show error dialog
65
+ catch (e) {
66
+ console.warn('[PagesExplorer] failed to create page', e);
67
+ await dialog.notify(Object.assign({ title: 'Failed to create page' }, components_1.ErrorMessage.coerce(funnel_core_1.IsometricErrorUtils.coerceError(e))));
68
+ }
69
+ }
70
+ else {
71
+ console.debug('[PagesExplorer] opening page for:', page.language);
72
+ }
73
+ // navigate to page using sdk
74
+ await sdk.navigator.openEntry(page.id, {
75
+ slideIn: false
76
+ });
77
+ }
78
+ // or browse page group
79
+ else {
80
+ navigate(PageExplorer_1.PageExplorer.getUrl({ region, pageType: overview.type }));
81
+ }
82
+ };
83
+ // render
84
+ return ((0, jsx_runtime_1.jsxs)(components_1.FadeIn, { className: "w-full flex-1", variant: "blur", children: [(0, jsx_runtime_1.jsx)(components_2.HeaderOptions, { breadcrumbs: ['Site Map'], highlightBreadcrumb: true, backButton: "back", onBack: () => navigate('/') }), (0, jsx_runtime_1.jsx)("div", { className: "container-sm container-p", children: (0, jsx_runtime_1.jsxs)(components_1.LoadingUntilReady, { className: "flex flex-col gap-l10 py-l14", ready: ready, children: [(0, jsx_runtime_1.jsx)("h2", { className: "heading-lg text-content-primary", children: "Site explorer" }), (0, jsx_runtime_1.jsx)(components_1.Table, { className: "flex-1", children: site.overviews.map(overview => overview instanceof components_1.DynamicPageOverview
85
+ // nested item for dynamic pages
86
+ ?
87
+ (0, jsx_runtime_1.jsx)(components_1.Table, { nested: true, children: (0, jsx_runtime_1.jsx)(components_1.TableItem, { nested: true, iconLeft: "CornerDownRight", iconRight: "ChevronRight", details: (0, jsx_runtime_1.jsx)(components_1.CountBadge, { count: overview.count }), onClick: () => onPageClick(overview), children: overview.template.name }) }, overview.type)
88
+ // or direct entry for static pages
89
+ :
90
+ (0, jsx_runtime_1.jsx)(components_1.TableItem, { iconRight: "ChevronRight", onClick: () => onPageClick(overview), children: overview.template.name }, overview.type)) })] }) })] }, "pages"));
91
+ }
92
+ // extension
93
+ (function (PagesExplorer) {
94
+ function getUrl({ region }) {
95
+ return `/pages/${region}`;
96
+ }
97
+ PagesExplorer.getUrl = getUrl;
98
+ })(PagesExplorer || (exports.PagesExplorer = PagesExplorer = {}));
@@ -0,0 +1,3 @@
1
+ export * from './Dashboard';
2
+ export * from './PageExplorer';
3
+ export * from './PagesExplorer';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./Dashboard"), exports);
18
+ __exportStar(require("./PageExplorer"), exports);
19
+ __exportStar(require("./PagesExplorer"), exports);
@@ -0,0 +1,25 @@
1
+ import { BlockLayout } from '@nascentdigital/funnel-core';
2
+ import { BlockConfiguration } from '@nascentdigital/funnel-editor/components';
3
+ import type { IAppBridgeMessage } from '../../core';
4
+ export interface BlockChangedMessage extends IAppBridgeMessage<BlockChangedMessage.Domain, BlockChangedMessage.Type> {
5
+ block?: BlockChangedMessage.BlockInfo;
6
+ }
7
+ export declare namespace BlockChangedMessage {
8
+ const domain: "nav.block";
9
+ type Domain = typeof domain;
10
+ type Type = 'changed';
11
+ type BlockInfo = {
12
+ schema: string;
13
+ identifier: string;
14
+ name: string;
15
+ errors: BlockErrors;
16
+ scope?: BlockConfiguration.Scope;
17
+ layout?: BlockLayout;
18
+ };
19
+ type BlockErrors = {
20
+ config: string[];
21
+ fields: string[];
22
+ };
23
+ function create(args: Omit<IAppBridgeMessage.Create.Args<BlockChangedMessage>, 'type'>): IAppBridgeMessage.Create.Result<BlockChangedMessage>;
24
+ function filter(message: IAppBridgeMessage): message is BlockChangedMessage;
25
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BlockChangedMessage = void 0;
4
+ // extensions
5
+ var BlockChangedMessage;
6
+ (function (BlockChangedMessage) {
7
+ // types
8
+ BlockChangedMessage.domain = 'nav.block';
9
+ // helpers
10
+ function create(args) {
11
+ return Object.assign(Object.assign({}, args), { domain: BlockChangedMessage.domain, type: 'changed' });
12
+ }
13
+ BlockChangedMessage.create = create;
14
+ function filter(message) {
15
+ return message.domain === BlockChangedMessage.domain;
16
+ }
17
+ BlockChangedMessage.filter = filter;
18
+ })(BlockChangedMessage || (exports.BlockChangedMessage = BlockChangedMessage = {}));
@@ -0,0 +1,8 @@
1
+ import { Block, PageSettings, Section, SectionBlock } from '@nascentdigital/funnel-editor/components';
2
+ import { PropsWithChildren } from 'react';
3
+ export declare function PageBridgeHub({ selectedItem, children }: PageBridgeHub.Props): import("react").ReactNode;
4
+ export declare namespace PageBridgeHub {
5
+ type Props = PropsWithChildren & {
6
+ selectedItem?: Block | SectionBlock | Section | PageSettings;
7
+ };
8
+ }
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PageBridgeHub = PageBridgeHub;
4
+ const components_1 = require("@nascentdigital/funnel-editor/components");
5
+ const react_1 = require("react");
6
+ const core_1 = require("../../core");
7
+ const BlockChangedMessage_1 = require("./BlockChangedMessage");
8
+ function PageBridgeHub({ selectedItem, children }) {
9
+ // bind bridge
10
+ const configuration = (0, components_1.useBlockConfiguration)();
11
+ const { block, scope, layout } = configuration !== null && configuration !== void 0 ? configuration : {};
12
+ const bridge = (0, core_1.useAppBridge)();
13
+ const ready = bridge.state === 'ready';
14
+ const bridges = bridge.bridges;
15
+ // sync selected item
16
+ (0, react_1.useEffect)(() => {
17
+ // skip if bridge isn't ready
18
+ if (!ready || bridges.size === 1) {
19
+ console.debug('[PageBridgeHub] not ready');
20
+ return;
21
+ }
22
+ console.debug('[PageBridgeHub] processing block change', { block, scope, layout });
23
+ // update
24
+ sendBlockChange({ bridge, block, scope, layout });
25
+ }, [bridge, ready, block, scope, layout, bridges]);
26
+ // render
27
+ return children;
28
+ }
29
+ function sendBlockChange({ bridge, block, scope, layout }) {
30
+ // send update
31
+ if (block) {
32
+ const { schema, identifier, name, errors } = block;
33
+ bridge.send(BlockChangedMessage_1.BlockChangedMessage.create({
34
+ block: {
35
+ schema: schema.id,
36
+ identifier,
37
+ name,
38
+ errors: {
39
+ config: errors.config.map(field => field.id),
40
+ fields: errors.fields.map(field => field.id)
41
+ },
42
+ scope,
43
+ layout
44
+ }
45
+ }));
46
+ }
47
+ // or clear block
48
+ else {
49
+ bridge.send(BlockChangedMessage_1.BlockChangedMessage.create({}));
50
+ }
51
+ }
@@ -0,0 +1,2 @@
1
+ export * from './BlockChangedMessage';
2
+ export * from './PageBridgeHub';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./BlockChangedMessage"), exports);
18
+ __exportStar(require("./PageBridgeHub"), exports);
@@ -1,15 +1,19 @@
1
+ import { EntrySys } from '@contentful/app-sdk';
1
2
  import { Language } from '@nascentdigital/funnel-core';
2
3
  import { IPage, IPageController, PageSummary } from '@nascentdigital/funnel-editor/components';
3
- import { Page, LocalPageRepository, RemotePageRepository } from '../../core';
4
- export declare class LocalPageController implements IPageController {
5
- readonly localRepository: LocalPageRepository;
6
- readonly remoteRepository: RemotePageRepository;
4
+ import { Page } from '../domain';
5
+ import { PageRepository } from '../repository';
6
+ export declare class ContentfulPageController implements IPageController {
7
+ readonly pageRepository: PageRepository;
7
8
  private readonly _eventBus;
8
9
  private _state;
9
10
  private _pageSummary?;
10
11
  private _page?;
12
+ private _pageSys?;
13
+ private _queuedSave?;
14
+ private _queuedSync?;
11
15
  private _pageSubscription?;
12
- constructor({ localRepository, remoteRepository }: LocalPageController.ConstructorArgs);
16
+ constructor(args: ContentfulPageController.ConstructorArgs);
13
17
  get events$(): import("rxjs").Observable<IPage.Event | IPageController.Event>;
14
18
  get saved$(): import("rxjs").Observable<[IPageController.StateChangedEvent, IPageController.StateChangedEvent]>;
15
19
  get state(): IPageController.State;
@@ -20,17 +24,19 @@ export declare class LocalPageController implements IPageController {
20
24
  private set pageSummary(value);
21
25
  get page(): Page | undefined;
22
26
  private set page(value);
23
- sync(updatedOn: number): Promise<void>;
27
+ get pageSys(): EntrySys | undefined;
28
+ private set pageSys(value);
29
+ sync(updatedSys: EntrySys): Promise<void>;
24
30
  load(): Promise<void>;
25
31
  create(target: IPageController.Target): Promise<void>;
26
32
  save(page: Page): Promise<void>;
27
33
  reload(): Promise<void>;
28
34
  unpublish(): Promise<void>;
35
+ private processQueues;
29
36
  private raiseEvent;
30
37
  }
31
- export declare namespace LocalPageController {
38
+ export declare namespace ContentfulPageController {
32
39
  type ConstructorArgs = {
33
- localRepository: LocalPageRepository;
34
- remoteRepository: RemotePageRepository;
40
+ pageRepository: PageRepository;
35
41
  };
36
42
  }