@sitecore-content-sdk/react 1.2.0-canary.3 → 1.2.0-canary.30
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/cjs/components/ClientEditingChromesUpdate.js +52 -0
- package/dist/cjs/components/DefaultEmptyFieldEditingComponents.js +4 -4
- package/dist/cjs/components/DesignLibrary.js +85 -103
- package/dist/cjs/components/EditingScripts.js +1 -0
- package/dist/cjs/components/ErrorBoundary.js +1 -0
- package/dist/cjs/components/Link.js +1 -1
- package/dist/cjs/components/Placeholder/Placeholder.js +110 -0
- package/dist/cjs/components/Placeholder/ServerPlaceholder.js +77 -0
- package/dist/cjs/components/Placeholder/index.js +25 -0
- package/dist/cjs/components/Placeholder/models.js +19 -0
- package/dist/cjs/components/Placeholder/placeholder-utils.js +187 -0
- package/dist/cjs/components/RichText.js +1 -0
- package/dist/cjs/components/Text.js +1 -0
- package/dist/cjs/enhancers/withEmptyFieldEditingComponent.js +12 -5
- package/dist/cjs/enhancers/withPlaceholder.js +7 -7
- package/dist/cjs/enhancers/withServerPlaceholder.js +21 -0
- package/dist/cjs/index.js +4 -1
- package/dist/esm/components/ClientEditingChromesUpdate.js +15 -0
- package/dist/esm/components/DefaultEmptyFieldEditingComponents.js +4 -4
- package/dist/esm/components/DesignLibrary.js +85 -102
- package/dist/esm/components/EditingScripts.js +1 -0
- package/dist/esm/components/ErrorBoundary.js +1 -0
- package/dist/esm/components/Link.js +1 -1
- package/dist/esm/components/Placeholder/Placeholder.js +103 -0
- package/dist/esm/components/Placeholder/ServerPlaceholder.js +70 -0
- package/dist/esm/components/Placeholder/index.js +4 -0
- package/dist/esm/components/Placeholder/models.js +16 -0
- package/dist/esm/components/Placeholder/placeholder-utils.js +176 -0
- package/dist/esm/components/RichText.js +1 -0
- package/dist/esm/components/Text.js +1 -0
- package/dist/esm/enhancers/withEmptyFieldEditingComponent.js +12 -5
- package/dist/esm/enhancers/withPlaceholder.js +7 -7
- package/dist/esm/enhancers/withServerPlaceholder.js +14 -0
- package/dist/esm/index.js +2 -1
- package/package.json +3 -3
- package/types/components/ClientEditingChromesUpdate.d.ts +6 -0
- package/types/components/Date.d.ts +1 -1
- package/types/components/DefaultEmptyFieldEditingComponents.d.ts +8 -2
- package/types/components/DesignLibrary.d.ts +13 -13
- package/types/components/ErrorBoundary.d.ts +0 -1
- package/types/components/Image.d.ts +1 -1
- package/types/components/Link.d.ts +1 -1
- package/types/components/Placeholder/Placeholder.d.ts +28 -0
- package/types/components/Placeholder/ServerPlaceholder.d.ts +10 -0
- package/types/components/Placeholder/index.d.ts +5 -0
- package/types/components/{PlaceholderCommon.d.ts → Placeholder/models.d.ts} +32 -18
- package/types/components/Placeholder/placeholder-utils.d.ts +77 -0
- package/types/components/RichText.d.ts +1 -1
- package/types/components/Text.d.ts +1 -1
- package/types/components/sharedTypes/components.d.ts +6 -0
- package/types/components/sharedTypes/props.d.ts +2 -2
- package/types/enhancers/withEmptyFieldEditingComponent.d.ts +3 -3
- package/types/enhancers/withPlaceholder.d.ts +2 -1
- package/types/enhancers/withServerPlaceholder.d.ts +15 -0
- package/types/index.d.ts +2 -1
- package/dist/cjs/components/Placeholder.js +0 -68
- package/dist/cjs/components/PlaceholderCommon.js +0 -176
- package/dist/esm/components/Placeholder.js +0 -62
- package/dist/esm/components/PlaceholderCommon.js +0 -169
- package/types/components/Placeholder.d.ts +0 -20
- /package/dist/cjs/components/{PlaceholderMetadata.js → Placeholder/PlaceholderMetadata.js} +0 -0
- /package/dist/esm/components/{PlaceholderMetadata.js → Placeholder/PlaceholderMetadata.js} +0 -0
- /package/types/components/{PlaceholderMetadata.d.ts → Placeholder/PlaceholderMetadata.d.ts} +0 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.ClientEditingChromesUpdate = void 0;
|
|
38
|
+
const editing_1 = require("@sitecore-content-sdk/core/editing");
|
|
39
|
+
const react_1 = __importStar(require("react"));
|
|
40
|
+
/**
|
|
41
|
+
* Updates editing chromes in app router / RSC context.
|
|
42
|
+
* This ensures all the relevant Pages editing markup is applied once all client components are loaded.
|
|
43
|
+
*/
|
|
44
|
+
const ClientEditingChromesUpdate = () => {
|
|
45
|
+
(0, react_1.useEffect)(() => {
|
|
46
|
+
if ((0, editing_1.isEditorActive)()) {
|
|
47
|
+
(0, editing_1.resetEditorChromes)();
|
|
48
|
+
}
|
|
49
|
+
}, []);
|
|
50
|
+
return react_1.default.createElement(react_1.default.Fragment, null);
|
|
51
|
+
};
|
|
52
|
+
exports.ClientEditingChromesUpdate = ClientEditingChromesUpdate;
|
|
@@ -5,11 +5,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.DefaultEmptyFieldEditingComponentImage = exports.DefaultEmptyFieldEditingComponentText = void 0;
|
|
7
7
|
const react_1 = __importDefault(require("react"));
|
|
8
|
-
const DefaultEmptyFieldEditingComponentText = () => {
|
|
9
|
-
return react_1.default.createElement(
|
|
8
|
+
const DefaultEmptyFieldEditingComponentText = (props) => {
|
|
9
|
+
return react_1.default.createElement(props.tag || 'span', props, '[No text in field]');
|
|
10
10
|
};
|
|
11
11
|
exports.DefaultEmptyFieldEditingComponentText = DefaultEmptyFieldEditingComponentText;
|
|
12
|
-
const DefaultEmptyFieldEditingComponentImage = () => {
|
|
12
|
+
const DefaultEmptyFieldEditingComponentImage = (props) => {
|
|
13
13
|
const inlineStyles = {
|
|
14
14
|
minWidth: '48px',
|
|
15
15
|
minHeight: '48px',
|
|
@@ -17,6 +17,6 @@ const DefaultEmptyFieldEditingComponentImage = () => {
|
|
|
17
17
|
maxHeight: '400px',
|
|
18
18
|
cursor: 'pointer',
|
|
19
19
|
};
|
|
20
|
-
return (react_1.default.createElement("img", { alt: "", src: 'data:image/svg+xml,%3Csvg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 240 240" style="enable-background:new 0 0 240 240;" xml:space="preserve"%3E%3Cstyle type="text/css"%3E .st0%7Bfill:none;%7D .st1%7Bfill:%23969696;%7D .st2%7Bfill:%23FFFFFF;%7D .st3%7Bfill:%23FFFFFF;stroke:%23FFFFFF;stroke-width:0.75;stroke-miterlimit:10;%7D%0A%3C/style%3E%3Cg%3E%3Crect class="st0" width="240" height="240"/%3E%3Cg%3E%3Cg%3E%3Crect x="20" y="20" class="st1" width="200" height="200"/%3E%3C/g%3E%3Cg%3E%3Ccircle class="st2" cx="174" cy="67" r="14"/%3E%3Cpath class="st2" d="M174,54c7.17,0,13,5.83,13,13s-5.83,13-13,13s-13-5.83-13-13S166.83,54,174,54 M174,52 c-8.28,0-15,6.72-15,15s6.72,15,15,15s15-6.72,15-15S182.28,52,174,52L174,52z"/%3E%3C/g%3E%3Cpolyline class="st3" points="29.5,179.25 81.32,122.25 95.41,137.75 137.23,91.75 209.5,179.75 "/%3E%3C/g%3E%3C/g%3E%3C/svg%3E', className:
|
|
20
|
+
return (react_1.default.createElement("img", Object.assign({}, props, { alt: "", src: 'data:image/svg+xml,%3Csvg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 240 240" style="enable-background:new 0 0 240 240;" xml:space="preserve"%3E%3Cstyle type="text/css"%3E .st0%7Bfill:none;%7D .st1%7Bfill:%23969696;%7D .st2%7Bfill:%23FFFFFF;%7D .st3%7Bfill:%23FFFFFF;stroke:%23FFFFFF;stroke-width:0.75;stroke-miterlimit:10;%7D%0A%3C/style%3E%3Cg%3E%3Crect class="st0" width="240" height="240"/%3E%3Cg%3E%3Cg%3E%3Crect x="20" y="20" class="st1" width="200" height="200"/%3E%3C/g%3E%3Cg%3E%3Ccircle class="st2" cx="174" cy="67" r="14"/%3E%3Cpath class="st2" d="M174,54c7.17,0,13,5.83,13,13s-5.83,13-13,13s-13-5.83-13-13S166.83,54,174,54 M174,52 c-8.28,0-15,6.72-15,15s6.72,15,15,15s15-6.72,15-15S182.28,52,174,52L174,52z"/%3E%3C/g%3E%3Cpolyline class="st3" points="29.5,179.25 81.32,122.25 95.41,137.75 137.23,91.75 209.5,179.75 "/%3E%3C/g%3E%3C/g%3E%3C/svg%3E', className: `scEmptyImage ${props.className || ''}`, style: inlineStyles })));
|
|
21
21
|
};
|
|
22
22
|
exports.DefaultEmptyFieldEditingComponentImage = DefaultEmptyFieldEditingComponentImage;
|
|
@@ -43,7 +43,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
43
43
|
});
|
|
44
44
|
};
|
|
45
45
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
-
exports.DesignLibrary = exports.
|
|
46
|
+
exports.DesignLibrary = exports.__mockDependencies = void 0;
|
|
47
47
|
/* eslint-disable jsdoc/require-param */
|
|
48
48
|
/* eslint-disable prefer-const */
|
|
49
49
|
const react_1 = __importStar(require("react"));
|
|
@@ -52,55 +52,31 @@ const layout_1 = require("@sitecore-content-sdk/core/layout");
|
|
|
52
52
|
const editing_1 = require("@sitecore-content-sdk/core/editing");
|
|
53
53
|
const codegen = __importStar(require("@sitecore-content-sdk/core/codegen"));
|
|
54
54
|
const withSitecore_1 = require("../enhancers/withSitecore");
|
|
55
|
+
const Placeholder_2 = require("./Placeholder");
|
|
55
56
|
let { getDesignLibraryImportMapEvent, getDesignLibraryComponentPropsEvent, addComponentPreviewHandler, } = codegen;
|
|
56
57
|
const __mockDependencies = (mocks) => {
|
|
57
58
|
addComponentPreviewHandler = mocks.addComponentPreviewHandler;
|
|
58
59
|
};
|
|
59
60
|
exports.__mockDependencies = __mockDependencies;
|
|
60
|
-
/**
|
|
61
|
-
* This component is used to render the component in preview mode.
|
|
62
|
-
* It is used to send the rendered event to the parent window and render the component.
|
|
63
|
-
* Reacts on the update event from the parent window and re-renders the component.
|
|
64
|
-
*/
|
|
65
|
-
const Preview = () => {
|
|
66
|
-
const { page } = (0, withSitecore_1.useSitecore)();
|
|
67
|
-
const { layout: { sitecore: { route }, }, } = page;
|
|
68
|
-
const [renderKey, setRenderKey] = (0, react_1.useState)(0);
|
|
69
|
-
const [rootUpdate, setRootUpdate] = (0, react_1.useState)(null);
|
|
70
|
-
const rootComponent = route === null || route === void 0 ? void 0 : route.placeholders[layout_1.EDITING_COMPONENT_PLACEHOLDER][0];
|
|
71
|
-
// useEffect may execute multiple times on single render (i.e. in dev) - but we only want to fire ready event once
|
|
72
|
-
let componentReady = false;
|
|
73
|
-
// have an up-to-date layout state between re-renders (SSR re-render excluded)
|
|
74
|
-
const persistedRoot = (0, react_1.useMemo)(() => (Object.assign(Object.assign({}, (rootComponent || {})), rootUpdate)), [rootComponent, rootUpdate]);
|
|
75
|
-
route.placeholders[layout_1.EDITING_COMPONENT_PLACEHOLDER][0] = persistedRoot;
|
|
76
|
-
(0, react_1.useEffect)(() => {
|
|
77
|
-
// useEffect will fire when components are ready - and we inform the whole wide world of it too
|
|
78
|
-
if (!componentReady) {
|
|
79
|
-
componentReady = true;
|
|
80
|
-
window.top.postMessage((0, editing_1.getDesignLibraryStatusEvent)(editing_1.DesignLibraryStatus.READY, rootComponent.uid), '*');
|
|
81
|
-
}
|
|
82
|
-
const unsubscribe = (0, editing_1.addComponentUpdateHandler)(persistedRoot, (updatedRoot) => {
|
|
83
|
-
setRootUpdate(Object.assign({}, updatedRoot));
|
|
84
|
-
setRenderKey((key) => key + 1);
|
|
85
|
-
});
|
|
86
|
-
// useEffect will cleanup event handler on re-render
|
|
87
|
-
return unsubscribe;
|
|
88
|
-
}, []);
|
|
89
|
-
(0, react_1.useEffect)(() => {
|
|
90
|
-
// Send a rendered event only as effect of a component update command
|
|
91
|
-
if (renderKey === 0) {
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
window.top.postMessage((0, editing_1.getDesignLibraryStatusEvent)(editing_1.DesignLibraryStatus.RENDERED, rootComponent.uid), '*');
|
|
95
|
-
}, [renderKey, rootComponent.uid]);
|
|
96
|
-
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
97
|
-
react_1.default.createElement("main", null,
|
|
98
|
-
react_1.default.createElement("div", { id: layout_1.EDITING_COMPONENT_ID }, route && (react_1.default.createElement(Placeholder_1.Placeholder, { name: layout_1.EDITING_COMPONENT_PLACEHOLDER, rendering: route, key: renderKey }))))));
|
|
99
|
-
};
|
|
100
61
|
const sendErrorEvent = (uid, error, type) => {
|
|
101
62
|
const errorEvent = codegen.getDesignLibraryComponentPreviewErrorEvent(uid, error, type);
|
|
102
63
|
console.error('Component Library: sending error event', errorEvent);
|
|
103
|
-
|
|
64
|
+
if (typeof window !== 'undefined') {
|
|
65
|
+
const target = window.parent && window.parent !== window ? window.parent : window;
|
|
66
|
+
target.postMessage(errorEvent, '*');
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
const postToDL = (evt) => {
|
|
70
|
+
if (typeof window === 'undefined')
|
|
71
|
+
return;
|
|
72
|
+
const target = window.parent && window.parent !== window ? window.parent : window;
|
|
73
|
+
try {
|
|
74
|
+
console.log('Component Library: sending event', evt === null || evt === void 0 ? void 0 : evt.name, evt);
|
|
75
|
+
target.postMessage(evt, '*');
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
console.error('Component Library: postMessage failed', err, evt);
|
|
79
|
+
}
|
|
104
80
|
};
|
|
105
81
|
class ErrorBoundary extends react_1.default.Component {
|
|
106
82
|
constructor() {
|
|
@@ -128,36 +104,74 @@ class ErrorBoundary extends react_1.default.Component {
|
|
|
128
104
|
}
|
|
129
105
|
}
|
|
130
106
|
/**
|
|
131
|
-
*
|
|
132
|
-
*
|
|
107
|
+
* Design Library component.
|
|
108
|
+
*
|
|
109
|
+
* Renders the **real** Sitecore component for `library` / `library-metadata` modes and,
|
|
110
|
+
* when generation is enabled (`page.mode.designLibrary.isVariantGeneration === true`),
|
|
111
|
+
* wires the **variant generation** handshake so the parent (DL Studio) can send
|
|
112
|
+
* generated code to preview and iterate on.
|
|
113
|
+
* @param {DesignLibraryProps} props
|
|
114
|
+
* @param {() => Promise<{ default: import('../codegen').ImportEntry[] }>} [props.loadImportMap] Optional async loader that resolves to the import-map used to resolve the generated component’s imports. Required when `isVariantGeneration` is true.
|
|
115
|
+
* @returns {JSX.Element} The preview surface, or `null` when not in Design Library mode.
|
|
133
116
|
*/
|
|
134
|
-
const
|
|
117
|
+
const DesignLibrary = ({ loadImportMap }) => {
|
|
118
|
+
var _a, _b;
|
|
135
119
|
const { page } = (0, withSitecore_1.useSitecore)();
|
|
136
|
-
const
|
|
137
|
-
const rendering = route === null || route === void 0 ? void 0 : route.placeholders[layout_1.EDITING_COMPONENT_PLACEHOLDER][0];
|
|
120
|
+
const route = page.layout.sitecore.route;
|
|
121
|
+
const rendering = (_a = route === null || route === void 0 ? void 0 : route.placeholders[layout_1.EDITING_COMPONENT_PLACEHOLDER]) === null || _a === void 0 ? void 0 : _a[0];
|
|
122
|
+
const { isDesignLibrary } = page.mode;
|
|
123
|
+
const isVariantGeneration = (_b = page.mode.designLibrary) === null || _b === void 0 ? void 0 : _b.isVariantGeneration;
|
|
124
|
+
const [propsState, setPropsState] = (0, react_1.useState)({
|
|
125
|
+
fields: rendering === null || rendering === void 0 ? void 0 : rendering.fields,
|
|
126
|
+
params: rendering === null || rendering === void 0 ? void 0 : rendering.params,
|
|
127
|
+
});
|
|
138
128
|
const [renderKey, setRenderKey] = (0, react_1.useState)(0);
|
|
139
129
|
const [Component, setComponent] = (0, react_1.useState)(null);
|
|
130
|
+
const isGeneratedComponentActive = !!Component;
|
|
131
|
+
if (!isDesignLibrary)
|
|
132
|
+
return null;
|
|
140
133
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
141
134
|
(0, react_1.useEffect)(() => {
|
|
135
|
+
postToDL((0, editing_1.getDesignLibraryStatusEvent)(editing_1.DesignLibraryStatus.READY, rendering.uid));
|
|
136
|
+
if (!isVariantGeneration) {
|
|
137
|
+
requestAnimationFrame(() => {
|
|
138
|
+
setRenderKey((k) => (k === 0 ? k + 1 : k));
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
const unsubUpdate = (0, editing_1.addComponentUpdateHandler)(rendering, (updated) => {
|
|
142
|
+
setPropsState({ fields: updated.fields, params: updated.params });
|
|
143
|
+
setRenderKey((k) => k + 1);
|
|
144
|
+
});
|
|
145
|
+
// useEffect will cleanup event handler on re-render
|
|
146
|
+
return () => unsubUpdate && unsubUpdate();
|
|
147
|
+
}, [isVariantGeneration, rendering]);
|
|
148
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
149
|
+
(0, react_1.useEffect)(() => {
|
|
150
|
+
// Send a rendered event only as effect of a component update command
|
|
151
|
+
if (renderKey === 0)
|
|
152
|
+
return;
|
|
153
|
+
postToDL((0, editing_1.getDesignLibraryStatusEvent)(editing_1.DesignLibraryStatus.RENDERED, rendering.uid));
|
|
154
|
+
}, [renderKey, rendering]);
|
|
155
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
156
|
+
(0, react_1.useEffect)(() => {
|
|
157
|
+
if (!isDesignLibrary || !isVariantGeneration)
|
|
158
|
+
return undefined;
|
|
142
159
|
let cancelled = false;
|
|
143
160
|
// since import map is loaded lazily, we only need to add preview event handler once the import map is loaded
|
|
144
161
|
// unsubscribe function for useEffect cleanup will also be returned once importMap promise has been resolved or rejected
|
|
145
|
-
let unsubscribe
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
if (!props.loadImportMap) {
|
|
150
|
-
const errorMessage = 'No loadImportMap prop provided. Please provide a dynamic import map function for DesignLibrary.';
|
|
151
|
-
sendErrorEvent(rendering.uid, errorMessage, codegen.DesignLibraryPreviewError.RenderInit);
|
|
162
|
+
let unsubscribe;
|
|
163
|
+
(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
164
|
+
if (!loadImportMap) {
|
|
165
|
+
sendErrorEvent(rendering.uid, 'No loadImportMap provided', codegen.DesignLibraryPreviewError.RenderInit);
|
|
152
166
|
return;
|
|
153
167
|
}
|
|
168
|
+
let importMap;
|
|
154
169
|
try {
|
|
155
|
-
const
|
|
156
|
-
importMap =
|
|
170
|
+
const mod = yield loadImportMap();
|
|
171
|
+
importMap = mod.default;
|
|
157
172
|
}
|
|
158
|
-
catch (
|
|
159
|
-
|
|
160
|
-
sendErrorEvent(rendering.uid, errorMessage, codegen.DesignLibraryPreviewError.RenderInit);
|
|
173
|
+
catch (e) {
|
|
174
|
+
sendErrorEvent(rendering.uid, `Error loading import map: ${e}`, codegen.DesignLibraryPreviewError.RenderInit);
|
|
161
175
|
return;
|
|
162
176
|
}
|
|
163
177
|
// account for component being unmounted while resolving async import map
|
|
@@ -165,56 +179,24 @@ const VariantGeneration = (props) => {
|
|
|
165
179
|
return;
|
|
166
180
|
unsubscribe = addComponentPreviewHandler(importMap, (error, Component) => {
|
|
167
181
|
// Error event is already sent in the addComponentPreviewHandler
|
|
168
|
-
if (error)
|
|
182
|
+
if (error)
|
|
169
183
|
return;
|
|
170
|
-
}
|
|
171
|
-
setRenderKey((key) => key + 1);
|
|
172
184
|
setComponent(() => Component);
|
|
185
|
+
setRenderKey((k) => k + 1);
|
|
173
186
|
});
|
|
174
187
|
const importMapEvent = getDesignLibraryImportMapEvent(rendering.uid, importMap);
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
const readyEvent = (0, editing_1.getDesignLibraryStatusEvent)(editing_1.DesignLibraryStatus.READY, rendering.uid);
|
|
181
|
-
console.debug('Component Library: sending event', readyEvent);
|
|
182
|
-
(_a = window.top) === null || _a === void 0 ? void 0 : _a.postMessage(readyEvent, '*');
|
|
183
|
-
});
|
|
184
|
-
init();
|
|
185
|
-
// return function that calls unsubsubribe - if the component was mounted correctly
|
|
188
|
+
postToDL(importMapEvent);
|
|
189
|
+
const propsEvent = getDesignLibraryComponentPropsEvent(rendering.uid, propsState.fields, propsState.params);
|
|
190
|
+
postToDL(propsEvent);
|
|
191
|
+
}))();
|
|
192
|
+
// return function that calls unsubscribe - if the component was mounted correctly
|
|
186
193
|
return () => {
|
|
187
194
|
cancelled = true;
|
|
188
|
-
|
|
189
|
-
unsubscribe();
|
|
190
|
-
}
|
|
195
|
+
unsubscribe && unsubscribe();
|
|
191
196
|
};
|
|
192
|
-
}, []);
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
// Send a rendered event only as effect of a component update command
|
|
197
|
-
if (renderKey === 0)
|
|
198
|
-
return undefined;
|
|
199
|
-
const renderedEvent = (0, editing_1.getDesignLibraryStatusEvent)(editing_1.DesignLibraryStatus.RENDERED, rendering.uid);
|
|
200
|
-
console.debug('Component Library: sending event', renderedEvent);
|
|
201
|
-
(_a = window.top) === null || _a === void 0 ? void 0 : _a.postMessage(renderedEvent, '*');
|
|
202
|
-
}, [renderKey, rendering === null || rendering === void 0 ? void 0 : rendering.uid]);
|
|
203
|
-
return (react_1.default.createElement("main", null, Component ? (react_1.default.createElement(ErrorBoundary, { uid: rendering.uid, renderKey: renderKey },
|
|
204
|
-
react_1.default.createElement(Component, { fields: rendering.fields, params: rendering.params, key: renderKey }))) : (react_1.default.createElement("div", null, "Loading preview..."))));
|
|
205
|
-
};
|
|
206
|
-
exports.VariantGeneration = VariantGeneration;
|
|
207
|
-
const DesignLibrary = ({ loadImportMap }) => {
|
|
208
|
-
var _a;
|
|
209
|
-
const { page } = (0, withSitecore_1.useSitecore)();
|
|
210
|
-
const { isDesignLibrary } = page.mode;
|
|
211
|
-
const isVariantGeneration = (_a = page.mode.designLibrary) === null || _a === void 0 ? void 0 : _a.isVariantGeneration;
|
|
212
|
-
if (!isDesignLibrary) {
|
|
213
|
-
return null;
|
|
214
|
-
}
|
|
215
|
-
if (isVariantGeneration) {
|
|
216
|
-
return react_1.default.createElement(exports.VariantGeneration, { loadImportMap: loadImportMap });
|
|
217
|
-
}
|
|
218
|
-
return react_1.default.createElement(Preview, null);
|
|
197
|
+
}, [isVariantGeneration, rendering]);
|
|
198
|
+
return (react_1.default.createElement("main", null, isGeneratedComponentActive ? (react_1.default.createElement(ErrorBoundary, { uid: rendering.uid, renderKey: renderKey },
|
|
199
|
+
react_1.default.createElement(Placeholder_2.PlaceholderMetadata, { rendering: rendering },
|
|
200
|
+
react_1.default.createElement(Component, { fields: propsState.fields, params: propsState.params, key: renderKey })))) : (react_1.default.createElement("div", { id: layout_1.EDITING_COMPONENT_ID }, route && (react_1.default.createElement(Placeholder_1.Placeholder, { name: layout_1.EDITING_COMPONENT_PLACEHOLDER, rendering: route, key: renderKey }))))));
|
|
219
201
|
};
|
|
220
202
|
exports.DesignLibrary = DesignLibrary;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
'use client';
|
|
2
3
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
4
|
if (k2 === undefined) k2 = k;
|
|
4
5
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
@@ -45,7 +46,6 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
45
46
|
};
|
|
46
47
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
48
|
exports.Link = void 0;
|
|
48
|
-
/* eslint-disable no-unused-expressions, @typescript-eslint/no-unused-expressions */
|
|
49
49
|
const react_1 = __importStar(require("react"));
|
|
50
50
|
const layout_1 = require("@sitecore-content-sdk/core/layout");
|
|
51
51
|
const withFieldMetadata_1 = require("../enhancers/withFieldMetadata");
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.Placeholder = exports.PlaceholderComponent = void 0;
|
|
8
|
+
const react_1 = __importDefault(require("react"));
|
|
9
|
+
const withComponentMap_1 = require("../../enhancers/withComponentMap");
|
|
10
|
+
const editing_1 = require("@sitecore-content-sdk/core/editing");
|
|
11
|
+
const withSitecore_1 = require("../../enhancers/withSitecore");
|
|
12
|
+
const placeholder_utils_1 = require("./placeholder-utils");
|
|
13
|
+
const PlaceholderMetadata_1 = require("./PlaceholderMetadata");
|
|
14
|
+
const ErrorBoundary_1 = __importDefault(require("../ErrorBoundary"));
|
|
15
|
+
class PlaceholderComponent extends react_1.default.Component {
|
|
16
|
+
constructor(props) {
|
|
17
|
+
super(props);
|
|
18
|
+
this.isEmpty = false;
|
|
19
|
+
this.state = {};
|
|
20
|
+
}
|
|
21
|
+
componentDidMount() {
|
|
22
|
+
if (this.isEmpty && editing_1.PagesEditor.isActive()) {
|
|
23
|
+
editing_1.PagesEditor.resetChromes();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
componentDidCatch(error) {
|
|
27
|
+
this.setState({ error });
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Renders the placeholder when it is empty. The required CSS styles are applied to the placeholder in edit mode.
|
|
31
|
+
* @param {React.ReactNode | React.ReactElement[]} node react node
|
|
32
|
+
* @returns react node
|
|
33
|
+
* @deprecated use renderEmptyPlaceholder from react/nextjs import instead
|
|
34
|
+
*/
|
|
35
|
+
renderEmptyPlaceholder(node) {
|
|
36
|
+
return (0, placeholder_utils_1.renderEmptyPlaceholder)(node);
|
|
37
|
+
}
|
|
38
|
+
render() {
|
|
39
|
+
const childProps = Object.assign({}, this.props);
|
|
40
|
+
delete childProps.componentMap;
|
|
41
|
+
if (this.state.error) {
|
|
42
|
+
if (childProps.errorComponent) {
|
|
43
|
+
return react_1.default.createElement(childProps.errorComponent, { error: this.state.error });
|
|
44
|
+
}
|
|
45
|
+
return (react_1.default.createElement("div", { className: "sc-content-sdk-placeholder-error" },
|
|
46
|
+
"A rendering error occurred: ",
|
|
47
|
+
this.state.error.message,
|
|
48
|
+
"."));
|
|
49
|
+
}
|
|
50
|
+
const renderingData = childProps.rendering;
|
|
51
|
+
const placeholderRenderings = (0, placeholder_utils_1.getPlaceholderRenderings)(renderingData, this.props.name, this.props.page.mode.isEditing);
|
|
52
|
+
this.isEmpty = !placeholderRenderings.length;
|
|
53
|
+
const components = PlaceholderComponent.getRenderedComponents(this.props, placeholderRenderings);
|
|
54
|
+
if (this.isEmpty) {
|
|
55
|
+
const rendered = this.props.renderEmpty ? this.props.renderEmpty(components) : components;
|
|
56
|
+
return this.props.page.mode.isEditing ? (0, placeholder_utils_1.renderEmptyPlaceholder)(rendered) : rendered;
|
|
57
|
+
}
|
|
58
|
+
else if (this.props.render) {
|
|
59
|
+
return this.props.render(components, placeholderRenderings, childProps);
|
|
60
|
+
}
|
|
61
|
+
else if (this.props.renderEach) {
|
|
62
|
+
const renderEach = this.props.renderEach;
|
|
63
|
+
return components.map((component, index) => {
|
|
64
|
+
if (component && component.props && component.props.type === 'text/sitecore') {
|
|
65
|
+
return component;
|
|
66
|
+
}
|
|
67
|
+
return renderEach(component, index);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
return components;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.PlaceholderComponent = PlaceholderComponent;
|
|
76
|
+
/**
|
|
77
|
+
* Renders the components for the placeholder based on the provided rendering data.
|
|
78
|
+
* @param {PlaceholderProps} props placeholder component props
|
|
79
|
+
* @param {ComponentRendering[]} placeholderRenderings renderings within placeholder
|
|
80
|
+
* @returns {React.ReactNode | React.ReactElement[]} rendered components
|
|
81
|
+
*/
|
|
82
|
+
PlaceholderComponent.getRenderedComponents = (props, placeholderRenderings) => {
|
|
83
|
+
const { name, missingComponentComponent, hiddenRenderingComponent } = props;
|
|
84
|
+
const transformedComponents = placeholderRenderings
|
|
85
|
+
.map((componentRendering, index) => {
|
|
86
|
+
const key = componentRendering.uid || `component-${index}`;
|
|
87
|
+
const renderedProps = (0, placeholder_utils_1.getRenderedComponentProps)(props, componentRendering, key);
|
|
88
|
+
const component = (0, placeholder_utils_1.getComponentForRendering)(componentRendering, name, props.componentMap, hiddenRenderingComponent, missingComponentComponent);
|
|
89
|
+
let rendered = react_1.default.createElement(component.component, props.modifyComponentProps ? props.modifyComponentProps(renderedProps) : renderedProps);
|
|
90
|
+
if (!component.isEmpty) {
|
|
91
|
+
const errorBoundaryKey = rendered.type + '-' + index;
|
|
92
|
+
const disableSuspense = props.disableSuspense || false;
|
|
93
|
+
rendered = (react_1.default.createElement(ErrorBoundary_1.default, { "data-testid": "error-boundary", key: errorBoundaryKey, errorComponent: props.errorComponent, componentLoadingMessage: props.componentLoadingMessage, isDynamic: component.dynamic, disableSuspense: disableSuspense, rendering: rendered.props.rendering }, rendered));
|
|
94
|
+
}
|
|
95
|
+
// if in edit mode then emit shallow chromes for hydration in Pages
|
|
96
|
+
if (props.page.mode.isEditing) {
|
|
97
|
+
return (react_1.default.createElement(PlaceholderMetadata_1.PlaceholderMetadata, { key: key, rendering: componentRendering }, rendered));
|
|
98
|
+
}
|
|
99
|
+
return rendered;
|
|
100
|
+
})
|
|
101
|
+
.filter((element) => element); // remove nulls
|
|
102
|
+
if (props.page.mode.isEditing) {
|
|
103
|
+
return [
|
|
104
|
+
react_1.default.createElement(PlaceholderMetadata_1.PlaceholderMetadata, { key: props.rendering.uid, placeholderName: name, rendering: props.rendering }, transformedComponents),
|
|
105
|
+
];
|
|
106
|
+
}
|
|
107
|
+
return transformedComponents;
|
|
108
|
+
};
|
|
109
|
+
const PlaceholderWithComponentMap = (0, withComponentMap_1.withComponentMap)(PlaceholderComponent);
|
|
110
|
+
exports.Placeholder = (0, withSitecore_1.withSitecore)()(PlaceholderWithComponentMap);
|
|
@@ -0,0 +1,77 @@
|
|
|
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.ServerPlaceholder = void 0;
|
|
7
|
+
const models_1 = require("./models");
|
|
8
|
+
const placeholder_utils_1 = require("./placeholder-utils");
|
|
9
|
+
const react_1 = __importDefault(require("react"));
|
|
10
|
+
const PlaceholderMetadata_1 = require("./PlaceholderMetadata");
|
|
11
|
+
const ErrorBoundary_1 = __importDefault(require("../ErrorBoundary"));
|
|
12
|
+
/**
|
|
13
|
+
* React Server Component implementation for Placeholder.
|
|
14
|
+
* Renders components from the layout data for the given placeholder name, with consideration for page edit mode.
|
|
15
|
+
* Pulls components from the provided component map.
|
|
16
|
+
* @param {PlaceholderProps} props Placeholder props
|
|
17
|
+
* @returns {React.ReactNode | React.ReactElement[]} rendered component(s)
|
|
18
|
+
*/
|
|
19
|
+
const ServerPlaceholder = (props) => {
|
|
20
|
+
var _a;
|
|
21
|
+
if (!props.componentMap) {
|
|
22
|
+
throw new Error('Component map is required for ServerPlaceholder');
|
|
23
|
+
}
|
|
24
|
+
// get serializable props for client rendering
|
|
25
|
+
const serializableProps = models_1.nonSerializedPlaceholderProps.reduce((finalProps, prop) => {
|
|
26
|
+
delete finalProps[prop];
|
|
27
|
+
return finalProps;
|
|
28
|
+
}, Object.assign({}, props));
|
|
29
|
+
const placeholderRenderings = (0, placeholder_utils_1.getPlaceholderRenderings)(props.rendering, props.name, (_a = props.page) === null || _a === void 0 ? void 0 : _a.mode.isEditing);
|
|
30
|
+
const components = placeholderRenderings
|
|
31
|
+
.map((rendering, index) => {
|
|
32
|
+
const { component, isEmpty, componentType, dynamic } = (0, placeholder_utils_1.getComponentForRendering)(rendering, props.name, props.componentMap, props.hiddenRenderingComponent, props.missingComponentComponent);
|
|
33
|
+
const isClient = componentType === 'client';
|
|
34
|
+
const key = rendering.uid || `component-${index}`;
|
|
35
|
+
const finalPhProps = isClient ? serializableProps : props;
|
|
36
|
+
const renderedProps = (0, placeholder_utils_1.getRenderedComponentProps)(finalPhProps, rendering, key);
|
|
37
|
+
let rendered = react_1.default.createElement(component, props.modifyComponentProps ? props.modifyComponentProps(renderedProps) : renderedProps);
|
|
38
|
+
if (!isEmpty) {
|
|
39
|
+
const errorBoundaryKey = rendered.type + '-' + index;
|
|
40
|
+
const disableSuspense = props.disableSuspense || false;
|
|
41
|
+
rendered = (react_1.default.createElement(ErrorBoundary_1.default, { "data-testid": "error-boundary", key: errorBoundaryKey, errorComponent: props.errorComponent, componentLoadingMessage: props.componentLoadingMessage, isDynamic: dynamic, disableSuspense: disableSuspense, rendering: rendered.props.rendering }, rendered));
|
|
42
|
+
}
|
|
43
|
+
// if in edit mode then emit shallow chromes for hydration in Pages
|
|
44
|
+
if (props.page.mode.isEditing) {
|
|
45
|
+
const key = rendering.uid || `component-${index}`;
|
|
46
|
+
return (react_1.default.createElement(PlaceholderMetadata_1.PlaceholderMetadata, { key: key, rendering: rendering }, rendered));
|
|
47
|
+
}
|
|
48
|
+
return rendered;
|
|
49
|
+
})
|
|
50
|
+
.filter((element) => element);
|
|
51
|
+
const finalRendering = props.page.mode.isEditing
|
|
52
|
+
? [
|
|
53
|
+
react_1.default.createElement(PlaceholderMetadata_1.PlaceholderMetadata, { key: props.rendering.uid, placeholderName: props.name, rendering: props.rendering }, components),
|
|
54
|
+
]
|
|
55
|
+
: components;
|
|
56
|
+
const placeholderEmpty = !placeholderRenderings.length;
|
|
57
|
+
if (placeholderEmpty) {
|
|
58
|
+
const rendered = props.renderEmpty ? props.renderEmpty(finalRendering) : finalRendering;
|
|
59
|
+
return props.page.mode.isEditing ? (0, placeholder_utils_1.renderEmptyPlaceholder)(rendered) : rendered;
|
|
60
|
+
}
|
|
61
|
+
if (props.render) {
|
|
62
|
+
return props.render(components, placeholderRenderings, serializableProps);
|
|
63
|
+
}
|
|
64
|
+
else if (props.renderEach) {
|
|
65
|
+
const renderEach = props.renderEach;
|
|
66
|
+
return finalRendering.map((component, index) => {
|
|
67
|
+
if (component && component.props && component.props.type === 'text/sitecore') {
|
|
68
|
+
return component;
|
|
69
|
+
}
|
|
70
|
+
return renderEach(component, index);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
return finalRendering;
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
exports.ServerPlaceholder = ServerPlaceholder;
|
|
@@ -0,0 +1,25 @@
|
|
|
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
|
+
exports.PlaceholderMetadata = exports.PlaceholderComponent = exports.Placeholder = exports.ServerPlaceholder = void 0;
|
|
18
|
+
var ServerPlaceholder_1 = require("./ServerPlaceholder");
|
|
19
|
+
Object.defineProperty(exports, "ServerPlaceholder", { enumerable: true, get: function () { return ServerPlaceholder_1.ServerPlaceholder; } });
|
|
20
|
+
var Placeholder_1 = require("./Placeholder");
|
|
21
|
+
Object.defineProperty(exports, "Placeholder", { enumerable: true, get: function () { return Placeholder_1.Placeholder; } });
|
|
22
|
+
Object.defineProperty(exports, "PlaceholderComponent", { enumerable: true, get: function () { return Placeholder_1.PlaceholderComponent; } });
|
|
23
|
+
var PlaceholderMetadata_1 = require("./PlaceholderMetadata");
|
|
24
|
+
Object.defineProperty(exports, "PlaceholderMetadata", { enumerable: true, get: function () { return PlaceholderMetadata_1.PlaceholderMetadata; } });
|
|
25
|
+
__exportStar(require("./placeholder-utils"), exports);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.nonSerializedPlaceholderProps = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Prop names from placeholder that cannot be serialized and passed from server to client side components
|
|
6
|
+
*/
|
|
7
|
+
exports.nonSerializedPlaceholderProps = [
|
|
8
|
+
'renderEmpty',
|
|
9
|
+
'render',
|
|
10
|
+
'renderEach',
|
|
11
|
+
'errorComponent',
|
|
12
|
+
'componentLoadingMessage',
|
|
13
|
+
'modifyComponentProps',
|
|
14
|
+
'componentMap',
|
|
15
|
+
'page',
|
|
16
|
+
'missingComponentComponent',
|
|
17
|
+
'hiddenRenderingComponent',
|
|
18
|
+
'rendering',
|
|
19
|
+
];
|