@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.
- package/dist/EditorApp.js +11 -9
- package/dist/EditorPageRouter.d.ts +1 -0
- package/dist/EditorPageRouter.js +34 -0
- package/dist/EditorPageRoutes.d.ts +1 -0
- package/dist/EditorPageRoutes.js +16 -0
- package/dist/EntryEditor.js +30 -29
- package/dist/EntrySidebar.js +26 -5
- package/dist/NotFound.d.ts +1 -0
- package/dist/NotFound.js +18 -0
- package/dist/asset/index.d.ts +1 -0
- package/dist/{core/api → asset}/index.js +1 -3
- package/dist/{core → asset}/repository/AssetRepository.d.ts +11 -3
- package/dist/{core → asset}/repository/AssetRepository.js +6 -5
- package/dist/asset/repository/index.d.ts +1 -0
- package/dist/{core → asset}/repository/index.js +0 -4
- package/dist/collection/controller/{LocalCollectionController.d.ts → ContentfulCollectionController.d.ts} +17 -11
- package/dist/collection/controller/ContentfulCollectionController.js +278 -0
- package/dist/collection/controller/ContentfulCollectionControllerContainer.d.ts +5 -0
- package/dist/collection/controller/ContentfulCollectionControllerContainer.js +28 -0
- package/dist/collection/controller/index.d.ts +3 -4
- package/dist/collection/controller/index.js +3 -4
- package/dist/collection/controller/useContentfulCollectionController.d.ts +2 -0
- package/dist/collection/controller/useContentfulCollectionController.js +8 -0
- package/dist/{core → collection}/domain/Collection.d.ts +11 -2
- package/dist/{core → collection}/domain/Collection.js +76 -0
- package/dist/{core → collection}/domain/index.d.ts +0 -1
- package/dist/{core → collection}/domain/index.js +0 -1
- package/dist/collection/index.d.ts +1 -0
- package/dist/collection/index.js +1 -0
- package/dist/collection/repository/CollectionRepository.d.ts +49 -0
- package/dist/collection/repository/CollectionRepository.js +223 -0
- package/dist/collection/repository/index.d.ts +1 -0
- package/dist/{core/contentful → collection/repository}/index.js +1 -5
- package/dist/collection/screens/CollectionEditor.js +23 -6
- package/dist/core/bridge/AppBridge.d.ts +31 -0
- package/dist/core/bridge/AppBridge.js +160 -0
- package/dist/core/bridge/AppBridgeContainer.d.ts +3 -3
- package/dist/core/bridge/AppBridgeContainer.js +8 -44
- package/dist/core/bridge/AppBridgeContext.d.ts +7 -8
- package/dist/core/bridge/AppBridgeContext.js +1 -6
- package/dist/core/bridge/BridgeLifecycleMessage.d.ts +7 -0
- package/dist/core/bridge/BridgeLifecycleMessage.js +12 -0
- package/dist/core/bridge/IAppBridgeMessage.d.ts +16 -0
- package/dist/core/bridge/IAppBridgeMessage.js +12 -0
- package/dist/core/bridge/index.d.ts +2 -1
- package/dist/core/bridge/index.js +2 -1
- package/dist/core/bridge/useAppBridge.d.ts +2 -8
- package/dist/core/bridge/useAppBridge.js +24 -15
- package/dist/core/client/ContentfulClientContainer.d.ts +8 -0
- package/dist/core/client/ContentfulClientContainer.js +43 -0
- package/dist/core/client/ContentfulClientContext.d.ts +8 -0
- package/dist/core/client/ContentfulClientContext.js +8 -0
- package/dist/core/client/index.d.ts +3 -0
- package/dist/core/client/index.js +19 -0
- package/dist/core/client/useContentfulClient.d.ts +4 -0
- package/dist/core/client/useContentfulClient.js +24 -0
- package/dist/core/index.d.ts +1 -4
- package/dist/core/index.js +1 -4
- package/dist/explore/components/header/Header.d.ts +14 -0
- package/dist/explore/components/header/Header.js +33 -0
- package/dist/explore/components/header/HeaderActions.d.ts +8 -0
- package/dist/explore/components/header/HeaderActions.js +37 -0
- package/dist/explore/components/header/HeaderContainer.d.ts +2 -0
- package/dist/explore/components/header/HeaderContainer.js +15 -0
- package/dist/explore/components/header/HeaderContext.d.ts +7 -0
- package/dist/{core/api/EditorApiContext.js → explore/components/header/HeaderContext.js} +2 -2
- package/dist/explore/components/header/HeaderController.d.ts +39 -0
- package/dist/explore/components/header/HeaderController.js +100 -0
- package/dist/explore/components/header/HeaderOptions.d.ts +10 -0
- package/dist/explore/components/header/HeaderOptions.js +26 -0
- package/dist/explore/components/header/index.d.ts +5 -0
- package/dist/explore/components/header/index.js +21 -0
- package/dist/explore/components/header/useHeader.d.ts +2 -0
- package/dist/explore/components/header/useHeader.js +30 -0
- package/dist/explore/components/index.d.ts +2 -0
- package/dist/explore/components/index.js +18 -0
- package/dist/explore/components/pages/PagesExplorerLayout.d.ts +4 -0
- package/dist/explore/components/pages/PagesExplorerLayout.js +28 -0
- package/dist/explore/components/pages/index.d.ts +1 -0
- package/dist/explore/components/pages/index.js +17 -0
- package/dist/explore/index.d.ts +2 -0
- package/dist/explore/index.js +18 -0
- package/dist/explore/screens/Dashboard.d.ts +4 -0
- package/dist/explore/screens/Dashboard.js +55 -0
- package/dist/explore/screens/PageExplorer.d.ts +11 -0
- package/dist/explore/screens/PageExplorer.js +129 -0
- package/dist/explore/screens/PagesExplorer.d.ts +7 -0
- package/dist/explore/screens/PagesExplorer.js +98 -0
- package/dist/explore/screens/index.d.ts +3 -0
- package/dist/explore/screens/index.js +19 -0
- package/dist/page/bridge/BlockChangedMessage.d.ts +25 -0
- package/dist/page/bridge/BlockChangedMessage.js +18 -0
- package/dist/page/bridge/PageBridgeHub.d.ts +8 -0
- package/dist/page/bridge/PageBridgeHub.js +51 -0
- package/dist/page/bridge/index.d.ts +2 -0
- package/dist/page/bridge/index.js +18 -0
- package/dist/page/controller/{LocalPageController.d.ts → ContentfulPageController.d.ts} +15 -9
- package/dist/page/controller/ContentfulPageController.js +277 -0
- package/dist/page/controller/ContentfulPageControllerContainer.d.ts +5 -0
- package/dist/page/controller/ContentfulPageControllerContainer.js +28 -0
- package/dist/page/controller/index.d.ts +3 -3
- package/dist/page/controller/index.js +3 -3
- package/dist/page/controller/useContentfulPageController.d.ts +2 -0
- package/dist/page/controller/useContentfulPageController.js +8 -0
- package/dist/{core → page}/domain/Page.d.ts +23 -12
- package/dist/{core → page}/domain/Page.js +139 -0
- package/dist/page/domain/index.d.ts +1 -0
- package/dist/page/domain/index.js +17 -0
- package/dist/page/index.d.ts +3 -0
- package/dist/page/index.js +3 -0
- package/dist/page/repository/PageRepository.d.ts +45 -0
- package/dist/page/repository/PageRepository.js +241 -0
- package/dist/page/repository/index.d.ts +1 -0
- package/dist/page/repository/index.js +17 -0
- package/dist/page/screens/PageEditor.js +36 -12
- package/package.json +9 -5
- package/dist/collection/controller/LocalCollectionController.js +0 -200
- package/dist/collection/controller/LocalCollectionControllerContainer.d.ts +0 -8
- package/dist/collection/controller/LocalCollectionControllerContainer.js +0 -36
- package/dist/collection/controller/LocalCollectionControllerContext.d.ts +0 -7
- package/dist/collection/controller/LocalCollectionControllerContext.js +0 -6
- package/dist/collection/controller/useLocalCollectionController.d.ts +0 -2
- package/dist/collection/controller/useLocalCollectionController.js +0 -10
- package/dist/core/api/EditorApiClient.d.ts +0 -7
- package/dist/core/api/EditorApiClient.js +0 -29
- package/dist/core/api/EditorApiContainer.d.ts +0 -5
- package/dist/core/api/EditorApiContainer.js +0 -16
- package/dist/core/api/EditorApiContext.d.ts +0 -7
- package/dist/core/api/index.d.ts +0 -3
- package/dist/core/api/useEditorApi.d.ts +0 -2
- package/dist/core/api/useEditorApi.js +0 -12
- package/dist/core/bridge/AppMessage.d.ts +0 -19
- package/dist/core/bridge/AppMessage.js +0 -19
- package/dist/core/contentful/Contentful.d.ts +0 -33
- package/dist/core/contentful/Contentful.js +0 -67
- package/dist/core/contentful/ContentfulAsset.d.ts +0 -23
- package/dist/core/contentful/ContentfulAsset.js +0 -88
- package/dist/core/contentful/ContentfulCollection.d.ts +0 -29
- package/dist/core/contentful/ContentfulCollection.js +0 -97
- package/dist/core/contentful/ContentfulPage.d.ts +0 -31
- package/dist/core/contentful/ContentfulPage.js +0 -84
- package/dist/core/contentful/ContentfulRefs.d.ts +0 -16
- package/dist/core/contentful/ContentfulRefs.js +0 -152
- package/dist/core/contentful/index.d.ts +0 -5
- package/dist/core/repository/CollectionSerializer.d.ts +0 -9
- package/dist/core/repository/CollectionSerializer.js +0 -41
- package/dist/core/repository/LocalCollectionRepository.d.ts +0 -27
- package/dist/core/repository/LocalCollectionRepository.js +0 -143
- package/dist/core/repository/LocalPageRepository.d.ts +0 -16
- package/dist/core/repository/LocalPageRepository.js +0 -153
- package/dist/core/repository/PageSerializer.d.ts +0 -9
- package/dist/core/repository/PageSerializer.js +0 -47
- package/dist/core/repository/RemoteCollectionRepository.d.ts +0 -19
- package/dist/core/repository/RemoteCollectionRepository.js +0 -236
- package/dist/core/repository/RemotePageRepository.d.ts +0 -14
- package/dist/core/repository/RemotePageRepository.js +0 -113
- package/dist/core/repository/index.d.ts +0 -5
- package/dist/page/controller/LocalPageController.js +0 -190
- package/dist/page/controller/LocalPageControllerContainer.d.ts +0 -8
- package/dist/page/controller/LocalPageControllerContainer.js +0 -36
- package/dist/page/controller/LocalPageControllerContext.d.ts +0 -7
- package/dist/page/controller/LocalPageControllerContext.js +0 -6
- package/dist/page/controller/useLocalPageController.d.ts +0 -2
- package/dist/page/controller/useLocalPageController.js +0 -10
|
@@ -1,8 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
export type AppMessageSubmission = Omit<AppMessage, 'source'>;
|
|
4
|
-
export type UseAppBridgetHook = {
|
|
5
|
-
sendMessage(message: AppMessageSubmission): void;
|
|
6
|
-
messages$: Observable<AppMessage>;
|
|
7
|
-
};
|
|
8
|
-
export declare function useAppBridge(): UseAppBridgetHook;
|
|
1
|
+
import { AppBridge } from './AppBridge';
|
|
2
|
+
export declare function useAppBridge(): AppBridge;
|
|
@@ -1,24 +1,33 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.useAppBridge = useAppBridge;
|
|
4
|
+
const funnel_core_1 = require("@nascentdigital/funnel-core");
|
|
5
|
+
const hooks_1 = require("@nascentdigital/funnel-ui/hooks");
|
|
4
6
|
const react_1 = require("react");
|
|
5
7
|
const AppBridgeContext_1 = require("./AppBridgeContext");
|
|
6
8
|
// hook
|
|
7
9
|
function useAppBridge() {
|
|
8
10
|
// bind context
|
|
9
|
-
const {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
11
|
+
const { appBridge } = (0, react_1.useContext)(AppBridgeContext_1.AppBridgeContext);
|
|
12
|
+
const touch = (0, hooks_1.useTouch)();
|
|
13
|
+
// sync with state
|
|
14
|
+
(0, react_1.useEffect)(() => {
|
|
15
|
+
// skip if not available (shouldn't happen)
|
|
16
|
+
if (!appBridge) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
// subscribe to state
|
|
20
|
+
const subscriptions = [
|
|
21
|
+
appBridge.state$.subscribe(touch),
|
|
22
|
+
appBridge.bridges$.subscribe(touch)
|
|
23
|
+
];
|
|
24
|
+
// unsubscribe on unmount
|
|
25
|
+
return () => subscriptions.forEach(subscription => subscription.unsubscribe());
|
|
26
|
+
}, [appBridge, touch]);
|
|
27
|
+
// throw if not available (shouldn't happen)
|
|
28
|
+
if (!appBridge) {
|
|
29
|
+
throw new funnel_core_1.InvalidOperationError('Cannot use AppBridge outside of AppBridgeContainer');
|
|
30
|
+
}
|
|
31
|
+
// return bridge
|
|
32
|
+
return appBridge;
|
|
24
33
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { KnownAppSDK } from '@contentful/app-sdk';
|
|
2
|
+
import { PropsWithChildren } from 'react';
|
|
3
|
+
export declare function ContentfulClientContainer({ sdk, children }: ContentfulClientContainer.Props): import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
export declare namespace ContentfulClientContainer {
|
|
5
|
+
type Props = PropsWithChildren & {
|
|
6
|
+
sdk: KnownAppSDK;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ContentfulClientContainer = ContentfulClientContainer;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const contentful_1 = require("@nascentdigital/funnel-cms/contentful");
|
|
6
|
+
const funnel_core_1 = require("@nascentdigital/funnel-core");
|
|
7
|
+
const react_1 = require("react");
|
|
8
|
+
const ContentfulClientContext_1 = require("./ContentfulClientContext");
|
|
9
|
+
// container
|
|
10
|
+
function ContentfulClientContainer({ sdk, children }) {
|
|
11
|
+
// bind state
|
|
12
|
+
const [client, setClient] = (0, react_1.useState)(() => ({ __type: 'pending' }));
|
|
13
|
+
const context = (0, react_1.useMemo)(() => ({ client }), [client]);
|
|
14
|
+
// create client on mount
|
|
15
|
+
(0, react_1.useEffect)(() => {
|
|
16
|
+
// fetch client
|
|
17
|
+
let cancelled = false;
|
|
18
|
+
const mount = async () => {
|
|
19
|
+
// try to create
|
|
20
|
+
try {
|
|
21
|
+
// create editor
|
|
22
|
+
const client = await contentful_1.ContentfulContentClient.forEditor(sdk);
|
|
23
|
+
// bind if not cancelled
|
|
24
|
+
if (!cancelled) {
|
|
25
|
+
setClient({ __type: 'success', result: client });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// or handle error (if not cancelled)
|
|
29
|
+
catch (e) {
|
|
30
|
+
if (!cancelled) {
|
|
31
|
+
setClient({ __type: 'failure', error: funnel_core_1.IsometricErrorUtils.coerceError(e) });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
mount().catch(console.error);
|
|
36
|
+
// cancel on unmount
|
|
37
|
+
return () => {
|
|
38
|
+
cancelled = true;
|
|
39
|
+
};
|
|
40
|
+
}, [sdk]);
|
|
41
|
+
// render
|
|
42
|
+
return ((0, jsx_runtime_1.jsx)(ContentfulClientContext_1.ContentfulClientContext.Provider, { value: context, children: client.__type === 'success' && children }));
|
|
43
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ContentfulContentClient } from '@nascentdigital/funnel-cms/contentful';
|
|
2
|
+
import { Result } from '@nascentdigital/funnel-core';
|
|
3
|
+
export declare const ContentfulClientContext: import("react").Context<ContentfulClientContext.Data>;
|
|
4
|
+
export declare namespace ContentfulClientContext {
|
|
5
|
+
type Data = {
|
|
6
|
+
client: Result<ContentfulContentClient>;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ContentfulClientContext = void 0;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
// context
|
|
6
|
+
exports.ContentfulClientContext = (0, react_1.createContext)({
|
|
7
|
+
client: { __type: 'pending' }
|
|
8
|
+
});
|
|
@@ -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("./ContentfulClientContainer"), exports);
|
|
18
|
+
__exportStar(require("./ContentfulClientContext"), exports);
|
|
19
|
+
__exportStar(require("./useContentfulClient"), exports);
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ContentfulContentClient } from '@nascentdigital/funnel-cms/contentful';
|
|
2
|
+
import { Result } from '@nascentdigital/funnel-core';
|
|
3
|
+
export declare function usePossibleContentfulClient(): Result<ContentfulContentClient>;
|
|
4
|
+
export declare function useContentfulClient(): ContentfulContentClient;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.usePossibleContentfulClient = usePossibleContentfulClient;
|
|
4
|
+
exports.useContentfulClient = useContentfulClient;
|
|
5
|
+
const funnel_core_1 = require("@nascentdigital/funnel-core");
|
|
6
|
+
const react_1 = require("react");
|
|
7
|
+
const ContentfulClientContext_1 = require("./ContentfulClientContext");
|
|
8
|
+
// hooks
|
|
9
|
+
function usePossibleContentfulClient() {
|
|
10
|
+
// bind context
|
|
11
|
+
const { client } = (0, react_1.useContext)(ContentfulClientContext_1.ContentfulClientContext);
|
|
12
|
+
// return result
|
|
13
|
+
return client;
|
|
14
|
+
}
|
|
15
|
+
function useContentfulClient() {
|
|
16
|
+
// bind context
|
|
17
|
+
const { client } = (0, react_1.useContext)(ContentfulClientContext_1.ContentfulClientContext);
|
|
18
|
+
// throw if unavailable (shouldn't happen - see ContentfulClientContainer)
|
|
19
|
+
if (client.__type !== 'success') {
|
|
20
|
+
throw new funnel_core_1.IllegalStateError('ContentfulContentClient isn\'t available');
|
|
21
|
+
}
|
|
22
|
+
// return result
|
|
23
|
+
return client.result;
|
|
24
|
+
}
|
package/dist/core/index.d.ts
CHANGED
package/dist/core/index.js
CHANGED
|
@@ -14,8 +14,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./api"), exports);
|
|
18
17
|
__exportStar(require("./bridge"), exports);
|
|
19
|
-
__exportStar(require("./
|
|
20
|
-
__exportStar(require("./domain"), exports);
|
|
21
|
-
__exportStar(require("./repository"), exports);
|
|
18
|
+
__exportStar(require("./client"), exports);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare function Header({ className }: Header.Props): import("react/jsx-runtime").JSX.Element;
|
|
2
|
+
export declare namespace Header {
|
|
3
|
+
type Breadcrumb = Breadcrumb.Label | Breadcrumb.Link;
|
|
4
|
+
namespace Breadcrumb {
|
|
5
|
+
type Label = string;
|
|
6
|
+
type Link = {
|
|
7
|
+
label: string;
|
|
8
|
+
url: string;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
type Props = {
|
|
12
|
+
className?: string;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
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.Header = Header;
|
|
7
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
+
const components_1 = require("@nascentdigital/funnel-editor/components");
|
|
9
|
+
const classnames_1 = __importDefault(require("classnames"));
|
|
10
|
+
const react_1 = require("motion/react");
|
|
11
|
+
const react_2 = require("react");
|
|
12
|
+
const react_router_1 = require("react-router");
|
|
13
|
+
const useHeader_1 = require("./useHeader");
|
|
14
|
+
// component
|
|
15
|
+
function Header({ className }) {
|
|
16
|
+
// bind props + hooks
|
|
17
|
+
const controller = (0, useHeader_1.useHeader)();
|
|
18
|
+
const { breadcrumbs, highlightBreadcrumb, backButton, disableBack, actions } = controller;
|
|
19
|
+
const breadcrumbsEndIndex = breadcrumbs.length - 1;
|
|
20
|
+
// render
|
|
21
|
+
return ((0, jsx_runtime_1.jsxs)("nav", { className: (0, classnames_1.default)(className, 'h-48 flex items-center gap-l4 px-l8', 'label-sm text-content-primary bg-background border-b border-solid border-border-l1'), children: [backButton === 'none'
|
|
22
|
+
// logo
|
|
23
|
+
?
|
|
24
|
+
(0, jsx_runtime_1.jsx)("span", { className: "w-40 h-40 flex justify-center items-center", children: (0, jsx_runtime_1.jsx)(components_1.Logo, { size: 28 }) })
|
|
25
|
+
// back/close
|
|
26
|
+
:
|
|
27
|
+
(0, jsx_runtime_1.jsx)(components_1.IconButton, { icon: backButton === 'back' ? 'ArrowLeft' : 'X', onClick: () => controller.onBack(), disabled: disableBack }), (0, jsx_runtime_1.jsx)("ul", { className: "flex-1 flex items-center gap-l5", children: (0, jsx_runtime_1.jsx)(react_1.AnimatePresence, { mode: "popLayout", children: breadcrumbs.map((breadcrumb, index) => (0, jsx_runtime_1.jsxs)(react_1.motion.li, { className: "flex items-center gap-l5", variants: components_1.Animate.Variants.fade, initial: "initial", animate: "animate", exit: "exit", layout: "position", children: [index > 0 &&
|
|
28
|
+
(0, jsx_runtime_1.jsx)("span", { children: "/" }), (0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)({ 'label-sm label-strong': highlightBreadcrumb && index === breadcrumbsEndIndex }), children: typeof breadcrumb === 'string'
|
|
29
|
+
?
|
|
30
|
+
(0, jsx_runtime_1.jsx)("span", { children: breadcrumb })
|
|
31
|
+
:
|
|
32
|
+
(0, jsx_runtime_1.jsx)(react_router_1.Link, { to: breadcrumb.url, children: breadcrumb.label }) })] }, typeof breadcrumb === 'string' ? `${breadcrumb}` : `${breadcrumb.label}`)) }) }), (0, jsx_runtime_1.jsx)("div", { className: "h-full flex items-center gap-l6", children: actions.map(action => (0, jsx_runtime_1.jsx)(react_2.Fragment, { children: action.components }, action.id)) })] }));
|
|
33
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { PropsWithChildren } from 'react';
|
|
2
|
+
import { HeaderController } from './HeaderController';
|
|
3
|
+
export declare function HeaderActions({ children: components, dependencies: dependenciesRaw, ...actionOptionsRaw }: HeaderActions.Props): null;
|
|
4
|
+
export declare namespace HeaderActions {
|
|
5
|
+
type Props = PropsWithChildren & Omit<HeaderController.ActionsOptions, 'id' | 'components'> & {
|
|
6
|
+
dependencies?: ReadonlyArray<any>;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
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.HeaderActions = HeaderActions;
|
|
15
|
+
const hooks_1 = require("@nascentdigital/funnel-ui/hooks");
|
|
16
|
+
const react_1 = require("react");
|
|
17
|
+
const useHeader_1 = require("./useHeader");
|
|
18
|
+
// component
|
|
19
|
+
function HeaderActions(_a) {
|
|
20
|
+
var { children: components, dependencies: dependenciesRaw = [] } = _a, actionOptionsRaw = __rest(_a, ["children", "dependencies"]);
|
|
21
|
+
// bind hooks
|
|
22
|
+
const id = (0, react_1.useId)();
|
|
23
|
+
const controller = (0, useHeader_1.useHeader)();
|
|
24
|
+
const componentsRef = (0, react_1.useRef)(components);
|
|
25
|
+
const dependencies = (0, hooks_1.useLatestValue)(dependenciesRaw);
|
|
26
|
+
const actionOptions = (0, hooks_1.useLatestValue)(actionOptionsRaw);
|
|
27
|
+
// sync controller on mount
|
|
28
|
+
(0, react_1.useEffect)(() => {
|
|
29
|
+
// register
|
|
30
|
+
controller.registerActions(Object.assign({ id, components: componentsRef.current }, actionOptions));
|
|
31
|
+
// unregister on unmount
|
|
32
|
+
return () => controller.unregisterActions(id);
|
|
33
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
34
|
+
}, [controller, id, actionOptions, ...dependencies]);
|
|
35
|
+
// render nothing
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HeaderContainer = HeaderContainer;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const HeaderContext_1 = require("./HeaderContext");
|
|
7
|
+
const HeaderController_1 = require("./HeaderController");
|
|
8
|
+
// component
|
|
9
|
+
function HeaderContainer({ children }) {
|
|
10
|
+
// create controller
|
|
11
|
+
const controller = (0, react_1.useMemo)(() => new HeaderController_1.HeaderController(), []);
|
|
12
|
+
const context = (0, react_1.useMemo)(() => ({ controller }), [controller]);
|
|
13
|
+
// render
|
|
14
|
+
return ((0, jsx_runtime_1.jsx)(HeaderContext_1.HeaderContext.Provider, { value: context, children: children }));
|
|
15
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.HeaderContext = void 0;
|
|
4
4
|
const react_1 = require("react");
|
|
5
5
|
// context
|
|
6
|
-
exports.
|
|
6
|
+
exports.HeaderContext = (0, react_1.createContext)({});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Callback } from '@nascentdigital/funnel-core';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
import type { Header } from './Header';
|
|
4
|
+
export declare class HeaderController {
|
|
5
|
+
private readonly _changed$;
|
|
6
|
+
private _breadcrumbs;
|
|
7
|
+
private _highlightBreadcrumb;
|
|
8
|
+
private _backButton;
|
|
9
|
+
private _disableBack;
|
|
10
|
+
private readonly _onBackHandlers;
|
|
11
|
+
private readonly _actions;
|
|
12
|
+
constructor();
|
|
13
|
+
get changed$(): import("rxjs").Observable<HeaderController.Change>;
|
|
14
|
+
get breadcrumbs(): ReadonlyArray<Header.Breadcrumb>;
|
|
15
|
+
set breadcrumbs(breadcrumbs: ReadonlyArray<Header.Breadcrumb>);
|
|
16
|
+
get highlightBreadcrumb(): boolean;
|
|
17
|
+
set highlightBreadcrumb(on: boolean);
|
|
18
|
+
get backButton(): HeaderController.BackButton;
|
|
19
|
+
set backButton(button: HeaderController.BackButton);
|
|
20
|
+
get disableBack(): boolean;
|
|
21
|
+
set disableBack(disabled: boolean);
|
|
22
|
+
registerOnBack(handler: HeaderController.OnBackHandler): HeaderController.Unsubscribe;
|
|
23
|
+
get actions(): HeaderController.ActionsOptions[];
|
|
24
|
+
registerActions(options: HeaderController.ActionsOptions): void;
|
|
25
|
+
unregisterActions(clientId: string): void;
|
|
26
|
+
onBack(): void;
|
|
27
|
+
private raiseChanged;
|
|
28
|
+
}
|
|
29
|
+
export declare namespace HeaderController {
|
|
30
|
+
type Change = 'breadcrumbs' | 'highlightBreadcrumb' | 'backButton' | 'disableBack' | 'onBack' | 'actions';
|
|
31
|
+
type BackButton = 'none' | 'back' | 'close';
|
|
32
|
+
type OnBackHandler = (stopPropagation: Callback.Void) => void;
|
|
33
|
+
type Unsubscribe = Callback.Void;
|
|
34
|
+
type ActionsOptions = {
|
|
35
|
+
id: string;
|
|
36
|
+
priority?: number;
|
|
37
|
+
components: ReactNode;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HeaderController = void 0;
|
|
4
|
+
const rxjs_1 = require("rxjs");
|
|
5
|
+
// class
|
|
6
|
+
class HeaderController {
|
|
7
|
+
constructor() {
|
|
8
|
+
// initialize instance variables
|
|
9
|
+
this._changed$ = new rxjs_1.Subject();
|
|
10
|
+
this._breadcrumbs = [];
|
|
11
|
+
this._highlightBreadcrumb = false;
|
|
12
|
+
this._backButton = 'none';
|
|
13
|
+
this._disableBack = false;
|
|
14
|
+
this._onBackHandlers = [];
|
|
15
|
+
this._actions = new Map();
|
|
16
|
+
}
|
|
17
|
+
get changed$() {
|
|
18
|
+
return this._changed$.asObservable();
|
|
19
|
+
}
|
|
20
|
+
get breadcrumbs() {
|
|
21
|
+
return this._breadcrumbs;
|
|
22
|
+
}
|
|
23
|
+
set breadcrumbs(breadcrumbs) {
|
|
24
|
+
this._breadcrumbs = breadcrumbs;
|
|
25
|
+
this.raiseChanged('breadcrumbs');
|
|
26
|
+
}
|
|
27
|
+
get highlightBreadcrumb() {
|
|
28
|
+
return this._highlightBreadcrumb;
|
|
29
|
+
}
|
|
30
|
+
set highlightBreadcrumb(on) {
|
|
31
|
+
this._highlightBreadcrumb = on;
|
|
32
|
+
this.raiseChanged('highlightBreadcrumb');
|
|
33
|
+
}
|
|
34
|
+
get backButton() {
|
|
35
|
+
return this._backButton;
|
|
36
|
+
}
|
|
37
|
+
set backButton(button) {
|
|
38
|
+
this._backButton = button;
|
|
39
|
+
this.raiseChanged('backButton');
|
|
40
|
+
}
|
|
41
|
+
get disableBack() {
|
|
42
|
+
return this._disableBack;
|
|
43
|
+
}
|
|
44
|
+
set disableBack(disabled) {
|
|
45
|
+
this._disableBack = disabled;
|
|
46
|
+
this.raiseChanged('disableBack');
|
|
47
|
+
}
|
|
48
|
+
registerOnBack(handler) {
|
|
49
|
+
// register handler
|
|
50
|
+
this._onBackHandlers.push(handler);
|
|
51
|
+
this.raiseChanged('onBack');
|
|
52
|
+
// return unsubscribe
|
|
53
|
+
return () => {
|
|
54
|
+
const handlerIndex = this._onBackHandlers.indexOf(handler);
|
|
55
|
+
if (handlerIndex >= 0) {
|
|
56
|
+
this._onBackHandlers.splice(handlerIndex, 1);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
get actions() {
|
|
61
|
+
return this._actions.values().toArray().sort((lhs, rhs) => {
|
|
62
|
+
var _a, _b;
|
|
63
|
+
const lhsPriority = (_a = lhs.priority) !== null && _a !== void 0 ? _a : 0;
|
|
64
|
+
const rhsPriority = (_b = rhs.priority) !== null && _b !== void 0 ? _b : 0;
|
|
65
|
+
return lhsPriority === rhsPriority
|
|
66
|
+
? 0
|
|
67
|
+
: lhsPriority < rhsPriority
|
|
68
|
+
? -1
|
|
69
|
+
: 1;
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
registerActions(options) {
|
|
73
|
+
this._actions.set(options.id, options);
|
|
74
|
+
this.raiseChanged('actions');
|
|
75
|
+
}
|
|
76
|
+
unregisterActions(clientId) {
|
|
77
|
+
this._actions.delete(clientId);
|
|
78
|
+
this.raiseChanged('actions');
|
|
79
|
+
}
|
|
80
|
+
onBack() {
|
|
81
|
+
// create handbrake
|
|
82
|
+
let stopped = false;
|
|
83
|
+
const onStop = () => {
|
|
84
|
+
stopped = true;
|
|
85
|
+
};
|
|
86
|
+
// invoke handlers until complete
|
|
87
|
+
for (const handler of this._onBackHandlers) {
|
|
88
|
+
// invoke handler
|
|
89
|
+
handler(onStop);
|
|
90
|
+
// exit if stopped
|
|
91
|
+
if (stopped) {
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
raiseChanged(change) {
|
|
97
|
+
this._changed$.next(change);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
exports.HeaderController = HeaderController;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { HeaderController } from './HeaderController';
|
|
3
|
+
export declare function HeaderOptions({ breadcrumbs: breadCrumbsRaw, highlightBreadcrumb, backButton, disableBack, onBack }: HeaderOptions.Props): null;
|
|
4
|
+
export declare namespace HeaderOptions {
|
|
5
|
+
type Props = Pick<Partial<HeaderController>, 'breadcrumbs' | 'highlightBreadcrumb' | 'backButton' | 'disableBack'> & {
|
|
6
|
+
onBack?: HeaderController.OnBackHandler;
|
|
7
|
+
actionsPriority?: number;
|
|
8
|
+
actions?: ReactNode;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HeaderOptions = HeaderOptions;
|
|
4
|
+
const funnel_core_1 = require("@nascentdigital/funnel-core");
|
|
5
|
+
const hooks_1 = require("@nascentdigital/funnel-ui/hooks");
|
|
6
|
+
const react_1 = require("react");
|
|
7
|
+
const useHeader_1 = require("./useHeader");
|
|
8
|
+
// component
|
|
9
|
+
function HeaderOptions({ breadcrumbs: breadCrumbsRaw = [], highlightBreadcrumb = false, backButton = 'none', disableBack = false, onBack = funnel_core_1.Fn.NoOp }) {
|
|
10
|
+
// bind hooks
|
|
11
|
+
const controller = (0, useHeader_1.useHeader)();
|
|
12
|
+
const breadcrumbs = (0, hooks_1.useLatestValue)(breadCrumbsRaw);
|
|
13
|
+
const onBackRef = (0, react_1.useRef)(onBack);
|
|
14
|
+
// sync controller on mount
|
|
15
|
+
(0, react_1.useEffect)(() => {
|
|
16
|
+
// update breadcrumbs
|
|
17
|
+
controller.breadcrumbs = breadcrumbs;
|
|
18
|
+
controller.highlightBreadcrumb = highlightBreadcrumb;
|
|
19
|
+
controller.backButton = backButton;
|
|
20
|
+
controller.disableBack = disableBack;
|
|
21
|
+
// register back handler (unsubscribe on unmount)
|
|
22
|
+
return controller.registerOnBack(onStop => onBackRef.current(onStop));
|
|
23
|
+
}, [controller, breadcrumbs, highlightBreadcrumb, backButton, disableBack]);
|
|
24
|
+
// render nothing
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
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("./Header"), exports);
|
|
18
|
+
__exportStar(require("./HeaderActions"), exports);
|
|
19
|
+
__exportStar(require("./HeaderContainer"), exports);
|
|
20
|
+
__exportStar(require("./HeaderOptions"), exports);
|
|
21
|
+
__exportStar(require("./useHeader"), exports);
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useHeader = useHeader;
|
|
4
|
+
const funnel_core_1 = require("@nascentdigital/funnel-core");
|
|
5
|
+
const hooks_1 = require("@nascentdigital/funnel-ui/hooks");
|
|
6
|
+
const react_1 = require("react");
|
|
7
|
+
const HeaderContext_1 = require("./HeaderContext");
|
|
8
|
+
// hook
|
|
9
|
+
function useHeader() {
|
|
10
|
+
// bind hooks
|
|
11
|
+
const { controller } = (0, react_1.useContext)(HeaderContext_1.HeaderContext);
|
|
12
|
+
const touch = (0, hooks_1.useTouch)();
|
|
13
|
+
// sync on controller update
|
|
14
|
+
(0, react_1.useEffect)(() => {
|
|
15
|
+
// skip if not bound
|
|
16
|
+
if (!controller) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
// listen to changes
|
|
20
|
+
const subscription = controller.changed$.subscribe(touch);
|
|
21
|
+
// unsubscribe on unmount
|
|
22
|
+
return () => subscription.unsubscribe();
|
|
23
|
+
}, [controller, touch]);
|
|
24
|
+
// throw if there's no controller
|
|
25
|
+
if (!controller) {
|
|
26
|
+
throw new funnel_core_1.InvalidOperationError('Cannot access HeaderController outside of HeaderContainer');
|
|
27
|
+
}
|
|
28
|
+
// return controller
|
|
29
|
+
return controller;
|
|
30
|
+
}
|
|
@@ -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("./header/index"), exports);
|
|
18
|
+
__exportStar(require("./pages"), exports);
|