@sitecore-content-sdk/react 1.2.0-canary.1 → 1.2.0-canary.11
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/BYOCComponent.js +1 -0
- package/dist/cjs/components/BYOCWrapper.js +1 -0
- package/dist/cjs/components/DefaultEmptyFieldEditingComponents.js +4 -4
- package/dist/cjs/components/DesignLibrary.js +27 -21
- package/dist/cjs/components/FEaaSComponent.js +1 -0
- package/dist/cjs/components/FEaaSWrapper.js +1 -0
- package/dist/cjs/components/Form.js +1 -0
- package/dist/cjs/components/SitecoreProvider.js +1 -0
- package/dist/cjs/enhancers/withEmptyFieldEditingComponent.js +12 -5
- package/dist/cjs/enhancers/withSitecore.js +1 -0
- package/dist/esm/components/BYOCComponent.js +1 -0
- package/dist/esm/components/BYOCWrapper.js +1 -0
- package/dist/esm/components/DefaultEmptyFieldEditingComponents.js +4 -4
- package/dist/esm/components/DesignLibrary.js +27 -21
- package/dist/esm/components/FEaaSComponent.js +1 -0
- package/dist/esm/components/FEaaSWrapper.js +1 -0
- package/dist/esm/components/Form.js +1 -0
- package/dist/esm/components/SitecoreProvider.js +1 -0
- package/dist/esm/enhancers/withEmptyFieldEditingComponent.js +12 -5
- package/dist/esm/enhancers/withSitecore.js +1 -0
- package/package.json +3 -3
- package/types/components/Date.d.ts +1 -1
- package/types/components/DefaultEmptyFieldEditingComponents.d.ts +8 -2
- package/types/components/Image.d.ts +1 -1
- package/types/components/Link.d.ts +1 -1
- package/types/components/RichText.d.ts +1 -1
- package/types/components/Text.d.ts +1 -1
- package/types/components/sharedTypes/props.d.ts +2 -2
- package/types/enhancers/withEmptyFieldEditingComponent.d.ts +3 -3
|
@@ -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;
|
|
@@ -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);
|
|
@@ -96,6 +97,11 @@ const Preview = () => {
|
|
|
96
97
|
react_1.default.createElement("main", null,
|
|
97
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 }))))));
|
|
98
99
|
};
|
|
100
|
+
const sendErrorEvent = (uid, error, type) => {
|
|
101
|
+
const errorEvent = codegen.getDesignLibraryComponentPreviewErrorEvent(uid, error, type);
|
|
102
|
+
console.error('Component Library: sending error event', errorEvent);
|
|
103
|
+
window.top.postMessage(errorEvent, '*');
|
|
104
|
+
};
|
|
99
105
|
class ErrorBoundary extends react_1.default.Component {
|
|
100
106
|
constructor() {
|
|
101
107
|
super(...arguments);
|
|
@@ -112,9 +118,7 @@ class ErrorBoundary extends react_1.default.Component {
|
|
|
112
118
|
}
|
|
113
119
|
}
|
|
114
120
|
componentDidCatch(error) {
|
|
115
|
-
|
|
116
|
-
console.debug('Component Library: sending error event', errorEvent);
|
|
117
|
-
window.top.postMessage(errorEvent, '*');
|
|
121
|
+
sendErrorEvent(this.props.uid, error, codegen.DesignLibraryPreviewError.Render);
|
|
118
122
|
}
|
|
119
123
|
render() {
|
|
120
124
|
if (this.state.hasError) {
|
|
@@ -132,12 +136,7 @@ const VariantGeneration = (props) => {
|
|
|
132
136
|
const { layout: { sitecore: { route }, }, } = page;
|
|
133
137
|
const rendering = route === null || route === void 0 ? void 0 : route.placeholders[layout_1.EDITING_COMPONENT_PLACEHOLDER][0];
|
|
134
138
|
const [renderKey, setRenderKey] = (0, react_1.useState)(0);
|
|
135
|
-
const [initError, setInitError] = (0, react_1.useState)(false);
|
|
136
|
-
const [importMapError, setImportMapError] = (0, react_1.useState)(false);
|
|
137
139
|
const [Component, setComponent] = (0, react_1.useState)(null);
|
|
138
|
-
if (!rendering) {
|
|
139
|
-
return react_1.default.createElement("div", null, "No component found in layout data. Please check your layout data.");
|
|
140
|
-
}
|
|
141
140
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
142
141
|
(0, react_1.useEffect)(() => {
|
|
143
142
|
let cancelled = false;
|
|
@@ -145,10 +144,11 @@ const VariantGeneration = (props) => {
|
|
|
145
144
|
// unsubscribe function for useEffect cleanup will also be returned once importMap promise has been resolved or rejected
|
|
146
145
|
let unsubscribe = undefined;
|
|
147
146
|
const init = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
147
|
+
var _a;
|
|
148
148
|
let importMap = undefined;
|
|
149
149
|
if (!props.loadImportMap) {
|
|
150
|
-
|
|
151
|
-
|
|
150
|
+
const errorMessage = 'No loadImportMap prop provided. Please provide a dynamic import map function for DesignLibrary.';
|
|
151
|
+
sendErrorEvent(rendering.uid, errorMessage, codegen.DesignLibraryPreviewError.RenderInit);
|
|
152
152
|
return;
|
|
153
153
|
}
|
|
154
154
|
try {
|
|
@@ -156,20 +156,19 @@ const VariantGeneration = (props) => {
|
|
|
156
156
|
importMap = importMapImport.default;
|
|
157
157
|
}
|
|
158
158
|
catch (error) {
|
|
159
|
-
|
|
160
|
-
|
|
159
|
+
const errorMessage = `Error loading import map: ${error}`;
|
|
160
|
+
sendErrorEvent(rendering.uid, errorMessage, codegen.DesignLibraryPreviewError.RenderInit);
|
|
161
161
|
return;
|
|
162
162
|
}
|
|
163
163
|
// account for component being unmounted while resolving async import map
|
|
164
164
|
if (cancelled)
|
|
165
165
|
return;
|
|
166
166
|
unsubscribe = addComponentPreviewHandler(importMap, (error, Component) => {
|
|
167
|
-
|
|
167
|
+
// Error event is already sent in the addComponentPreviewHandler
|
|
168
168
|
if (error) {
|
|
169
|
-
setInitError(true);
|
|
170
169
|
return;
|
|
171
170
|
}
|
|
172
|
-
|
|
171
|
+
setRenderKey((key) => key + 1);
|
|
173
172
|
setComponent(() => Component);
|
|
174
173
|
});
|
|
175
174
|
const importMapEvent = getDesignLibraryImportMapEvent(rendering.uid, importMap);
|
|
@@ -178,6 +177,9 @@ const VariantGeneration = (props) => {
|
|
|
178
177
|
const componentPropsEvent = getDesignLibraryComponentPropsEvent(rendering.uid, rendering.fields, rendering.params);
|
|
179
178
|
console.debug('Component Library: sending event', componentPropsEvent);
|
|
180
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, '*');
|
|
181
183
|
});
|
|
182
184
|
init();
|
|
183
185
|
// return function that calls unsubsubribe - if the component was mounted correctly
|
|
@@ -188,12 +190,16 @@ const VariantGeneration = (props) => {
|
|
|
188
190
|
}
|
|
189
191
|
};
|
|
190
192
|
}, []);
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
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]);
|
|
197
203
|
return (react_1.default.createElement("main", null, Component ? (react_1.default.createElement(ErrorBoundary, { uid: rendering.uid, renderKey: renderKey },
|
|
198
204
|
react_1.default.createElement(Component, { fields: rendering.fields, params: rendering.params, key: renderKey }))) : (react_1.default.createElement("div", null, "Loading preview..."))));
|
|
199
205
|
};
|
|
@@ -46,18 +46,25 @@ function withEmptyFieldEditingComponent(FieldComponent, options) {
|
|
|
46
46
|
var _a;
|
|
47
47
|
const { editable = true } = props;
|
|
48
48
|
if (((_a = props.field) === null || _a === void 0 ? void 0 : _a.metadata) && editable && (0, layout_1.isFieldValueEmpty)(props.field)) {
|
|
49
|
-
|
|
49
|
+
const Component = props.emptyFieldEditingComponent || options.defaultEmptyFieldEditingComponent;
|
|
50
|
+
let resolvedProps = props;
|
|
51
|
+
// If no custom empty field editing component is provided, we can omit unnecessary props
|
|
52
|
+
// to do not insert them to html
|
|
53
|
+
if (!props.emptyFieldEditingComponent) {
|
|
54
|
+
resolvedProps = Object.assign(Object.assign({}, props), { editable: undefined, field: undefined });
|
|
55
|
+
}
|
|
56
|
+
return react_1.default.createElement(Component, Object.assign({}, resolvedProps));
|
|
50
57
|
}
|
|
51
58
|
return null;
|
|
52
59
|
};
|
|
53
60
|
if (options.isForwardRef) {
|
|
54
61
|
return (0, react_1.forwardRef)((props, ref) => {
|
|
55
|
-
const
|
|
56
|
-
return (
|
|
62
|
+
const emptyFieldEditingComponent = getEmptyFieldEditingComponent(props);
|
|
63
|
+
return (emptyFieldEditingComponent || (react_1.default.createElement(FieldComponent, Object.assign({}, props, { ref: ref }))));
|
|
57
64
|
});
|
|
58
65
|
}
|
|
59
66
|
return (props) => {
|
|
60
|
-
const
|
|
61
|
-
return
|
|
67
|
+
const emptyFieldEditingComponent = getEmptyFieldEditingComponent(props);
|
|
68
|
+
return emptyFieldEditingComponent || react_1.default.createElement(FieldComponent, Object.assign({}, props));
|
|
62
69
|
};
|
|
63
70
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
'use client';
|
|
1
2
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
3
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
4
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
export const DefaultEmptyFieldEditingComponentText = () => {
|
|
3
|
-
return React.createElement(
|
|
2
|
+
export const DefaultEmptyFieldEditingComponentText = (props) => {
|
|
3
|
+
return React.createElement(props.tag || 'span', props, '[No text in field]');
|
|
4
4
|
};
|
|
5
|
-
export const DefaultEmptyFieldEditingComponentImage = () => {
|
|
5
|
+
export const DefaultEmptyFieldEditingComponentImage = (props) => {
|
|
6
6
|
const inlineStyles = {
|
|
7
7
|
minWidth: '48px',
|
|
8
8
|
minHeight: '48px',
|
|
@@ -10,5 +10,5 @@ export const DefaultEmptyFieldEditingComponentImage = () => {
|
|
|
10
10
|
maxHeight: '400px',
|
|
11
11
|
cursor: 'pointer',
|
|
12
12
|
};
|
|
13
|
-
return (React.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:
|
|
13
|
+
return (React.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 })));
|
|
14
14
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
'use client';
|
|
1
2
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
3
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
4
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -59,6 +60,11 @@ const Preview = () => {
|
|
|
59
60
|
React.createElement("main", null,
|
|
60
61
|
React.createElement("div", { id: EDITING_COMPONENT_ID }, route && (React.createElement(Placeholder, { name: EDITING_COMPONENT_PLACEHOLDER, rendering: route, key: renderKey }))))));
|
|
61
62
|
};
|
|
63
|
+
const sendErrorEvent = (uid, error, type) => {
|
|
64
|
+
const errorEvent = codegen.getDesignLibraryComponentPreviewErrorEvent(uid, error, type);
|
|
65
|
+
console.error('Component Library: sending error event', errorEvent);
|
|
66
|
+
window.top.postMessage(errorEvent, '*');
|
|
67
|
+
};
|
|
62
68
|
class ErrorBoundary extends React.Component {
|
|
63
69
|
constructor() {
|
|
64
70
|
super(...arguments);
|
|
@@ -75,9 +81,7 @@ class ErrorBoundary extends React.Component {
|
|
|
75
81
|
}
|
|
76
82
|
}
|
|
77
83
|
componentDidCatch(error) {
|
|
78
|
-
|
|
79
|
-
console.debug('Component Library: sending error event', errorEvent);
|
|
80
|
-
window.top.postMessage(errorEvent, '*');
|
|
84
|
+
sendErrorEvent(this.props.uid, error, codegen.DesignLibraryPreviewError.Render);
|
|
81
85
|
}
|
|
82
86
|
render() {
|
|
83
87
|
if (this.state.hasError) {
|
|
@@ -95,12 +99,7 @@ export const VariantGeneration = (props) => {
|
|
|
95
99
|
const { layout: { sitecore: { route }, }, } = page;
|
|
96
100
|
const rendering = route === null || route === void 0 ? void 0 : route.placeholders[EDITING_COMPONENT_PLACEHOLDER][0];
|
|
97
101
|
const [renderKey, setRenderKey] = useState(0);
|
|
98
|
-
const [initError, setInitError] = useState(false);
|
|
99
|
-
const [importMapError, setImportMapError] = useState(false);
|
|
100
102
|
const [Component, setComponent] = useState(null);
|
|
101
|
-
if (!rendering) {
|
|
102
|
-
return React.createElement("div", null, "No component found in layout data. Please check your layout data.");
|
|
103
|
-
}
|
|
104
103
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
105
104
|
useEffect(() => {
|
|
106
105
|
let cancelled = false;
|
|
@@ -108,10 +107,11 @@ export const VariantGeneration = (props) => {
|
|
|
108
107
|
// unsubscribe function for useEffect cleanup will also be returned once importMap promise has been resolved or rejected
|
|
109
108
|
let unsubscribe = undefined;
|
|
110
109
|
const init = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
110
|
+
var _a;
|
|
111
111
|
let importMap = undefined;
|
|
112
112
|
if (!props.loadImportMap) {
|
|
113
|
-
|
|
114
|
-
|
|
113
|
+
const errorMessage = 'No loadImportMap prop provided. Please provide a dynamic import map function for DesignLibrary.';
|
|
114
|
+
sendErrorEvent(rendering.uid, errorMessage, codegen.DesignLibraryPreviewError.RenderInit);
|
|
115
115
|
return;
|
|
116
116
|
}
|
|
117
117
|
try {
|
|
@@ -119,20 +119,19 @@ export const VariantGeneration = (props) => {
|
|
|
119
119
|
importMap = importMapImport.default;
|
|
120
120
|
}
|
|
121
121
|
catch (error) {
|
|
122
|
-
|
|
123
|
-
|
|
122
|
+
const errorMessage = `Error loading import map: ${error}`;
|
|
123
|
+
sendErrorEvent(rendering.uid, errorMessage, codegen.DesignLibraryPreviewError.RenderInit);
|
|
124
124
|
return;
|
|
125
125
|
}
|
|
126
126
|
// account for component being unmounted while resolving async import map
|
|
127
127
|
if (cancelled)
|
|
128
128
|
return;
|
|
129
129
|
unsubscribe = addComponentPreviewHandler(importMap, (error, Component) => {
|
|
130
|
-
|
|
130
|
+
// Error event is already sent in the addComponentPreviewHandler
|
|
131
131
|
if (error) {
|
|
132
|
-
setInitError(true);
|
|
133
132
|
return;
|
|
134
133
|
}
|
|
135
|
-
|
|
134
|
+
setRenderKey((key) => key + 1);
|
|
136
135
|
setComponent(() => Component);
|
|
137
136
|
});
|
|
138
137
|
const importMapEvent = getDesignLibraryImportMapEvent(rendering.uid, importMap);
|
|
@@ -141,6 +140,9 @@ export const VariantGeneration = (props) => {
|
|
|
141
140
|
const componentPropsEvent = getDesignLibraryComponentPropsEvent(rendering.uid, rendering.fields, rendering.params);
|
|
142
141
|
console.debug('Component Library: sending event', componentPropsEvent);
|
|
143
142
|
window.top.postMessage(componentPropsEvent, '*');
|
|
143
|
+
const readyEvent = getDesignLibraryStatusEvent(DesignLibraryStatus.READY, rendering.uid);
|
|
144
|
+
console.debug('Component Library: sending event', readyEvent);
|
|
145
|
+
(_a = window.top) === null || _a === void 0 ? void 0 : _a.postMessage(readyEvent, '*');
|
|
144
146
|
});
|
|
145
147
|
init();
|
|
146
148
|
// return function that calls unsubsubribe - if the component was mounted correctly
|
|
@@ -151,12 +153,16 @@ export const VariantGeneration = (props) => {
|
|
|
151
153
|
}
|
|
152
154
|
};
|
|
153
155
|
}, []);
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
156
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
157
|
+
useEffect(() => {
|
|
158
|
+
var _a;
|
|
159
|
+
// Send a rendered event only as effect of a component update command
|
|
160
|
+
if (renderKey === 0)
|
|
161
|
+
return undefined;
|
|
162
|
+
const renderedEvent = getDesignLibraryStatusEvent(DesignLibraryStatus.RENDERED, rendering.uid);
|
|
163
|
+
console.debug('Component Library: sending event', renderedEvent);
|
|
164
|
+
(_a = window.top) === null || _a === void 0 ? void 0 : _a.postMessage(renderedEvent, '*');
|
|
165
|
+
}, [renderKey, rendering === null || rendering === void 0 ? void 0 : rendering.uid]);
|
|
160
166
|
return (React.createElement("main", null, Component ? (React.createElement(ErrorBoundary, { uid: rendering.uid, renderKey: renderKey },
|
|
161
167
|
React.createElement(Component, { fields: rendering.fields, params: rendering.params, key: renderKey }))) : (React.createElement("div", null, "Loading preview..."))));
|
|
162
168
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
'use client';
|
|
1
2
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
3
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
4
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -10,18 +10,25 @@ export function withEmptyFieldEditingComponent(FieldComponent, options) {
|
|
|
10
10
|
var _a;
|
|
11
11
|
const { editable = true } = props;
|
|
12
12
|
if (((_a = props.field) === null || _a === void 0 ? void 0 : _a.metadata) && editable && isFieldValueEmpty(props.field)) {
|
|
13
|
-
|
|
13
|
+
const Component = props.emptyFieldEditingComponent || options.defaultEmptyFieldEditingComponent;
|
|
14
|
+
let resolvedProps = props;
|
|
15
|
+
// If no custom empty field editing component is provided, we can omit unnecessary props
|
|
16
|
+
// to do not insert them to html
|
|
17
|
+
if (!props.emptyFieldEditingComponent) {
|
|
18
|
+
resolvedProps = Object.assign(Object.assign({}, props), { editable: undefined, field: undefined });
|
|
19
|
+
}
|
|
20
|
+
return React.createElement(Component, Object.assign({}, resolvedProps));
|
|
14
21
|
}
|
|
15
22
|
return null;
|
|
16
23
|
};
|
|
17
24
|
if (options.isForwardRef) {
|
|
18
25
|
return forwardRef((props, ref) => {
|
|
19
|
-
const
|
|
20
|
-
return (
|
|
26
|
+
const emptyFieldEditingComponent = getEmptyFieldEditingComponent(props);
|
|
27
|
+
return (emptyFieldEditingComponent || (React.createElement(FieldComponent, Object.assign({}, props, { ref: ref }))));
|
|
21
28
|
});
|
|
22
29
|
}
|
|
23
30
|
return (props) => {
|
|
24
|
-
const
|
|
25
|
-
return
|
|
31
|
+
const emptyFieldEditingComponent = getEmptyFieldEditingComponent(props);
|
|
32
|
+
return emptyFieldEditingComponent || React.createElement(FieldComponent, Object.assign({}, props));
|
|
26
33
|
};
|
|
27
34
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sitecore-content-sdk/react",
|
|
3
|
-
"version": "1.2.0-canary.
|
|
3
|
+
"version": "1.2.0-canary.11",
|
|
4
4
|
"main": "dist/cjs/index.js",
|
|
5
5
|
"module": "dist/esm/index.js",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -72,12 +72,12 @@
|
|
|
72
72
|
"react-dom": "^19.1.0"
|
|
73
73
|
},
|
|
74
74
|
"dependencies": {
|
|
75
|
-
"@sitecore-content-sdk/core": "1.2.0-canary.
|
|
75
|
+
"@sitecore-content-sdk/core": "1.2.0-canary.11",
|
|
76
76
|
"fast-deep-equal": "^3.1.3"
|
|
77
77
|
},
|
|
78
78
|
"description": "",
|
|
79
79
|
"types": "types/index.d.ts",
|
|
80
|
-
"gitHead": "
|
|
80
|
+
"gitHead": "9bca85610fb5ee5f98e918ae3dd4734419ecdfe3",
|
|
81
81
|
"files": [
|
|
82
82
|
"dist",
|
|
83
83
|
"types"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { EditableFieldProps } from './sharedTypes';
|
|
3
3
|
import { FieldMetadata } from '@sitecore-content-sdk/core/layout';
|
|
4
|
-
export interface DateFieldProps extends EditableFieldProps {
|
|
4
|
+
export interface DateFieldProps extends EditableFieldProps<DateFieldProps> {
|
|
5
5
|
/** The date field data. */
|
|
6
6
|
[htmlAttributes: string]: unknown;
|
|
7
7
|
field: FieldMetadata & {
|
|
@@ -1,3 +1,9 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
export declare const DefaultEmptyFieldEditingComponentText: React.FC
|
|
3
|
-
|
|
2
|
+
export declare const DefaultEmptyFieldEditingComponentText: React.FC<{
|
|
3
|
+
[key: string]: unknown;
|
|
4
|
+
tag?: string;
|
|
5
|
+
}>;
|
|
6
|
+
export declare const DefaultEmptyFieldEditingComponentImage: React.FC<{
|
|
7
|
+
[key: string]: unknown;
|
|
8
|
+
className?: string;
|
|
9
|
+
}>;
|
|
@@ -25,7 +25,7 @@ export interface ImageSizeParameters {
|
|
|
25
25
|
/** Image scale. Defaults to 1.0 */
|
|
26
26
|
sc?: number;
|
|
27
27
|
}
|
|
28
|
-
export interface ImageProps extends EditableFieldProps {
|
|
28
|
+
export interface ImageProps extends EditableFieldProps<ImageProps> {
|
|
29
29
|
[attributeName: string]: unknown;
|
|
30
30
|
/** Image field data (consistent with other field types) */
|
|
31
31
|
field?: (ImageField | ImageFieldValue) & FieldMetadata;
|
|
@@ -16,7 +16,7 @@ export interface LinkFieldValue {
|
|
|
16
16
|
export interface LinkField {
|
|
17
17
|
value: LinkFieldValue;
|
|
18
18
|
}
|
|
19
|
-
export type LinkProps = EditableFieldProps & React.AnchorHTMLAttributes<HTMLAnchorElement> & RefAttributes<HTMLAnchorElement> & {
|
|
19
|
+
export type LinkProps = EditableFieldProps<LinkProps> & React.AnchorHTMLAttributes<HTMLAnchorElement> & RefAttributes<HTMLAnchorElement> & {
|
|
20
20
|
/** The link field data. */
|
|
21
21
|
field: (LinkField | LinkFieldValue) & FieldMetadata;
|
|
22
22
|
/**
|
|
@@ -4,7 +4,7 @@ import { FieldMetadata } from '@sitecore-content-sdk/core/layout';
|
|
|
4
4
|
export interface RichTextField extends FieldMetadata {
|
|
5
5
|
value?: string;
|
|
6
6
|
}
|
|
7
|
-
export interface RichTextProps extends EditableFieldProps {
|
|
7
|
+
export interface RichTextProps extends EditableFieldProps<RichTextProps> {
|
|
8
8
|
[htmlAttributes: string]: unknown;
|
|
9
9
|
/** The rich text field data. */
|
|
10
10
|
field?: RichTextField;
|
|
@@ -4,7 +4,7 @@ import { FieldMetadata } from '@sitecore-content-sdk/core/layout';
|
|
|
4
4
|
export interface TextField extends FieldMetadata {
|
|
5
5
|
value?: string | number;
|
|
6
6
|
}
|
|
7
|
-
export interface TextProps extends EditableFieldProps {
|
|
7
|
+
export interface TextProps extends EditableFieldProps<TextProps> {
|
|
8
8
|
[htmlAttributes: string]: unknown;
|
|
9
9
|
/** The text field data. */
|
|
10
10
|
field?: TextField;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared editing field props
|
|
3
3
|
*/
|
|
4
|
-
export interface EditableFieldProps {
|
|
4
|
+
export interface EditableFieldProps<EmptyFieldEditingComponentProps = unknown> {
|
|
5
5
|
/**
|
|
6
6
|
* Can be used to explicitly disable inline editing.
|
|
7
7
|
* @default true
|
|
@@ -10,5 +10,5 @@ export interface EditableFieldProps {
|
|
|
10
10
|
/**
|
|
11
11
|
* Custom element to render in Pages in edit mode if field value is empty
|
|
12
12
|
*/
|
|
13
|
-
emptyFieldEditingComponent?: React.ComponentClass<
|
|
13
|
+
emptyFieldEditingComponent?: React.ComponentClass<EmptyFieldEditingComponentProps> | React.FC<EmptyFieldEditingComponentProps>;
|
|
14
14
|
}
|
|
@@ -13,15 +13,15 @@ export interface WithEmptyFieldEditingComponentOptions {
|
|
|
13
13
|
*/
|
|
14
14
|
isForwardRef?: boolean;
|
|
15
15
|
}
|
|
16
|
-
interface WithEmptyFieldEditingComponentProps {
|
|
16
|
+
interface WithEmptyFieldEditingComponentProps<Props> {
|
|
17
17
|
field?: (Partial<Field> | GenericFieldValue) & FieldMetadata;
|
|
18
18
|
editable?: boolean;
|
|
19
|
-
emptyFieldEditingComponent?: React.ComponentClass | React.FC
|
|
19
|
+
emptyFieldEditingComponent?: React.ComponentClass<Props> | React.FC<Props>;
|
|
20
20
|
}
|
|
21
21
|
/**
|
|
22
22
|
* Returns the passed field component or default component in case field value is empty and edit mode is 'metadata'
|
|
23
23
|
* @param {ComponentType<FieldComponentProps>} FieldComponent the field component
|
|
24
24
|
* @param {WithEmptyFieldEditingComponentProps} options the options of the HOC;
|
|
25
25
|
*/
|
|
26
|
-
export declare function withEmptyFieldEditingComponent<FieldComponentProps extends WithEmptyFieldEditingComponentProps
|
|
26
|
+
export declare function withEmptyFieldEditingComponent<FieldComponentProps extends WithEmptyFieldEditingComponentProps<FieldComponentProps>, RefElementType = HTMLElement>(FieldComponent: ComponentType<FieldComponentProps>, options: WithEmptyFieldEditingComponentOptions): React.ForwardRefExoticComponent<React.PropsWithoutRef<FieldComponentProps> & React.RefAttributes<RefElementType>> | ((props: FieldComponentProps) => React.JSX.Element);
|
|
27
27
|
export {};
|