@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.
Files changed (63) hide show
  1. package/dist/cjs/components/ClientEditingChromesUpdate.js +52 -0
  2. package/dist/cjs/components/DefaultEmptyFieldEditingComponents.js +4 -4
  3. package/dist/cjs/components/DesignLibrary.js +85 -103
  4. package/dist/cjs/components/EditingScripts.js +1 -0
  5. package/dist/cjs/components/ErrorBoundary.js +1 -0
  6. package/dist/cjs/components/Link.js +1 -1
  7. package/dist/cjs/components/Placeholder/Placeholder.js +110 -0
  8. package/dist/cjs/components/Placeholder/ServerPlaceholder.js +77 -0
  9. package/dist/cjs/components/Placeholder/index.js +25 -0
  10. package/dist/cjs/components/Placeholder/models.js +19 -0
  11. package/dist/cjs/components/Placeholder/placeholder-utils.js +187 -0
  12. package/dist/cjs/components/RichText.js +1 -0
  13. package/dist/cjs/components/Text.js +1 -0
  14. package/dist/cjs/enhancers/withEmptyFieldEditingComponent.js +12 -5
  15. package/dist/cjs/enhancers/withPlaceholder.js +7 -7
  16. package/dist/cjs/enhancers/withServerPlaceholder.js +21 -0
  17. package/dist/cjs/index.js +4 -1
  18. package/dist/esm/components/ClientEditingChromesUpdate.js +15 -0
  19. package/dist/esm/components/DefaultEmptyFieldEditingComponents.js +4 -4
  20. package/dist/esm/components/DesignLibrary.js +85 -102
  21. package/dist/esm/components/EditingScripts.js +1 -0
  22. package/dist/esm/components/ErrorBoundary.js +1 -0
  23. package/dist/esm/components/Link.js +1 -1
  24. package/dist/esm/components/Placeholder/Placeholder.js +103 -0
  25. package/dist/esm/components/Placeholder/ServerPlaceholder.js +70 -0
  26. package/dist/esm/components/Placeholder/index.js +4 -0
  27. package/dist/esm/components/Placeholder/models.js +16 -0
  28. package/dist/esm/components/Placeholder/placeholder-utils.js +176 -0
  29. package/dist/esm/components/RichText.js +1 -0
  30. package/dist/esm/components/Text.js +1 -0
  31. package/dist/esm/enhancers/withEmptyFieldEditingComponent.js +12 -5
  32. package/dist/esm/enhancers/withPlaceholder.js +7 -7
  33. package/dist/esm/enhancers/withServerPlaceholder.js +14 -0
  34. package/dist/esm/index.js +2 -1
  35. package/package.json +3 -3
  36. package/types/components/ClientEditingChromesUpdate.d.ts +6 -0
  37. package/types/components/Date.d.ts +1 -1
  38. package/types/components/DefaultEmptyFieldEditingComponents.d.ts +8 -2
  39. package/types/components/DesignLibrary.d.ts +13 -13
  40. package/types/components/ErrorBoundary.d.ts +0 -1
  41. package/types/components/Image.d.ts +1 -1
  42. package/types/components/Link.d.ts +1 -1
  43. package/types/components/Placeholder/Placeholder.d.ts +28 -0
  44. package/types/components/Placeholder/ServerPlaceholder.d.ts +10 -0
  45. package/types/components/Placeholder/index.d.ts +5 -0
  46. package/types/components/{PlaceholderCommon.d.ts → Placeholder/models.d.ts} +32 -18
  47. package/types/components/Placeholder/placeholder-utils.d.ts +77 -0
  48. package/types/components/RichText.d.ts +1 -1
  49. package/types/components/Text.d.ts +1 -1
  50. package/types/components/sharedTypes/components.d.ts +6 -0
  51. package/types/components/sharedTypes/props.d.ts +2 -2
  52. package/types/enhancers/withEmptyFieldEditingComponent.d.ts +3 -3
  53. package/types/enhancers/withPlaceholder.d.ts +2 -1
  54. package/types/enhancers/withServerPlaceholder.d.ts +15 -0
  55. package/types/index.d.ts +2 -1
  56. package/dist/cjs/components/Placeholder.js +0 -68
  57. package/dist/cjs/components/PlaceholderCommon.js +0 -176
  58. package/dist/esm/components/Placeholder.js +0 -62
  59. package/dist/esm/components/PlaceholderCommon.js +0 -169
  60. package/types/components/Placeholder.d.ts +0 -20
  61. /package/dist/cjs/components/{PlaceholderMetadata.js → Placeholder/PlaceholderMetadata.js} +0 -0
  62. /package/dist/esm/components/{PlaceholderMetadata.js → Placeholder/PlaceholderMetadata.js} +0 -0
  63. /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("span", null, "[No text in field]");
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: "scEmptyImage", style: inlineStyles }));
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.VariantGeneration = exports.__mockDependencies = void 0;
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
- window.top.postMessage(errorEvent, '*');
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
- * This component is used to render the component in variant generation mode.
132
- * It is used to send the import-map and component-props events to the parent window and render the dynamic component.
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 VariantGeneration = (props) => {
117
+ const DesignLibrary = ({ loadImportMap }) => {
118
+ var _a, _b;
135
119
  const { page } = (0, withSitecore_1.useSitecore)();
136
- const { layout: { sitecore: { route }, }, } = page;
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 = undefined;
146
- const init = () => __awaiter(void 0, void 0, void 0, function* () {
147
- var _a;
148
- let importMap = undefined;
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 importMapImport = yield props.loadImportMap();
156
- importMap = importMapImport.default;
170
+ const mod = yield loadImportMap();
171
+ importMap = mod.default;
157
172
  }
158
- catch (error) {
159
- const errorMessage = `Error loading import map: ${error}`;
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
- console.debug('Component Library: sending event', importMapEvent);
176
- window.parent.postMessage(importMapEvent, '*');
177
- const componentPropsEvent = getDesignLibraryComponentPropsEvent(rendering.uid, rendering.fields, rendering.params);
178
- console.debug('Component Library: sending event', componentPropsEvent);
179
- window.top.postMessage(componentPropsEvent, '*');
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
- if (unsubscribe) {
189
- unsubscribe();
190
- }
195
+ unsubscribe && unsubscribe();
191
196
  };
192
- }, []);
193
- // eslint-disable-next-line react-hooks/rules-of-hooks
194
- (0, react_1.useEffect)(() => {
195
- var _a;
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 __importDefault = (this && this.__importDefault) || function (mod) {
3
4
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
5
  };
@@ -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);
@@ -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
+ ];