@sitecore-content-sdk/react 0.1.0-beta.1

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 (99) hide show
  1. package/LICENSE.txt +202 -0
  2. package/README.md +10 -0
  3. package/dist/cjs/ComponentBuilder.js +25 -0
  4. package/dist/cjs/components/BYOCComponent.js +132 -0
  5. package/dist/cjs/components/BYOCWrapper.js +21 -0
  6. package/dist/cjs/components/ComponentLibraryLayout.js +80 -0
  7. package/dist/cjs/components/Date.js +57 -0
  8. package/dist/cjs/components/DefaultEmptyFieldEditingComponents.js +22 -0
  9. package/dist/cjs/components/EditingScripts.js +27 -0
  10. package/dist/cjs/components/ErrorBoundary.js +95 -0
  11. package/dist/cjs/components/FEaaSComponent.js +161 -0
  12. package/dist/cjs/components/FEaaSWrapper.js +18 -0
  13. package/dist/cjs/components/FieldMetadata.js +34 -0
  14. package/dist/cjs/components/File.js +51 -0
  15. package/dist/cjs/components/HiddenRendering.js +18 -0
  16. package/dist/cjs/components/Image.js +83 -0
  17. package/dist/cjs/components/Link.js +106 -0
  18. package/dist/cjs/components/MissingComponent.js +34 -0
  19. package/dist/cjs/components/Placeholder.js +72 -0
  20. package/dist/cjs/components/PlaceholderCommon.js +191 -0
  21. package/dist/cjs/components/PlaceholderMetadata.js +63 -0
  22. package/dist/cjs/components/RichText.js +82 -0
  23. package/dist/cjs/components/SitecoreContext.js +67 -0
  24. package/dist/cjs/components/Text.js +78 -0
  25. package/dist/cjs/components/sharedTypes.js +2 -0
  26. package/dist/cjs/enhancers/withComponentFactory.js +26 -0
  27. package/dist/cjs/enhancers/withDatasourceCheck.js +28 -0
  28. package/dist/cjs/enhancers/withEditorChromes.js +24 -0
  29. package/dist/cjs/enhancers/withEmptyFieldEditingComponent.js +65 -0
  30. package/dist/cjs/enhancers/withFieldMetadata.js +69 -0
  31. package/dist/cjs/enhancers/withPlaceholder.js +63 -0
  32. package/dist/cjs/enhancers/withSitecoreContext.js +48 -0
  33. package/dist/cjs/index.js +78 -0
  34. package/dist/cjs/utils.js +38 -0
  35. package/dist/esm/ComponentBuilder.js +21 -0
  36. package/dist/esm/components/BYOCComponent.js +91 -0
  37. package/dist/esm/components/BYOCWrapper.js +14 -0
  38. package/dist/esm/components/ComponentLibraryLayout.js +43 -0
  39. package/dist/esm/components/Date.js +51 -0
  40. package/dist/esm/components/DefaultEmptyFieldEditingComponents.js +14 -0
  41. package/dist/esm/components/EditingScripts.js +20 -0
  42. package/dist/esm/components/ErrorBoundary.js +60 -0
  43. package/dist/esm/components/FEaaSComponent.js +119 -0
  44. package/dist/esm/components/FEaaSWrapper.js +11 -0
  45. package/dist/esm/components/FieldMetadata.js +27 -0
  46. package/dist/esm/components/File.js +44 -0
  47. package/dist/esm/components/HiddenRendering.js +11 -0
  48. package/dist/esm/components/Image.js +77 -0
  49. package/dist/esm/components/Link.js +67 -0
  50. package/dist/esm/components/MissingComponent.js +27 -0
  51. package/dist/esm/components/Placeholder.js +66 -0
  52. package/dist/esm/components/PlaceholderCommon.js +184 -0
  53. package/dist/esm/components/PlaceholderMetadata.js +56 -0
  54. package/dist/esm/components/RichText.js +43 -0
  55. package/dist/esm/components/SitecoreContext.js +60 -0
  56. package/dist/esm/components/Text.js +72 -0
  57. package/dist/esm/components/sharedTypes.js +1 -0
  58. package/dist/esm/enhancers/withComponentFactory.js +20 -0
  59. package/dist/esm/enhancers/withDatasourceCheck.js +20 -0
  60. package/dist/esm/enhancers/withEditorChromes.js +17 -0
  61. package/dist/esm/enhancers/withEmptyFieldEditingComponent.js +29 -0
  62. package/dist/esm/enhancers/withFieldMetadata.js +33 -0
  63. package/dist/esm/enhancers/withPlaceholder.js +57 -0
  64. package/dist/esm/enhancers/withSitecoreContext.js +41 -0
  65. package/dist/esm/index.js +28 -0
  66. package/dist/esm/utils.js +33 -0
  67. package/package.json +78 -0
  68. package/types/ComponentBuilder.d.ts +27 -0
  69. package/types/components/BYOCComponent.d.ts +93 -0
  70. package/types/components/BYOCWrapper.d.ts +6 -0
  71. package/types/components/ComponentLibraryLayout.d.ts +2 -0
  72. package/types/components/Date.d.ts +16 -0
  73. package/types/components/DefaultEmptyFieldEditingComponents.d.ts +3 -0
  74. package/types/components/EditingScripts.d.ts +4 -0
  75. package/types/components/ErrorBoundary.d.ts +17 -0
  76. package/types/components/FEaaSComponent.d.ts +71 -0
  77. package/types/components/FEaaSWrapper.d.ts +3 -0
  78. package/types/components/FieldMetadata.d.ts +22 -0
  79. package/types/components/File.d.ts +18 -0
  80. package/types/components/HiddenRendering.d.ts +2 -0
  81. package/types/components/Image.d.ts +48 -0
  82. package/types/components/Link.d.ts +38 -0
  83. package/types/components/MissingComponent.d.ts +8 -0
  84. package/types/components/Placeholder.d.ts +20 -0
  85. package/types/components/PlaceholderCommon.d.ts +98 -0
  86. package/types/components/PlaceholderMetadata.d.ts +28 -0
  87. package/types/components/RichText.d.ts +29 -0
  88. package/types/components/SitecoreContext.d.ts +42 -0
  89. package/types/components/Text.d.ts +20 -0
  90. package/types/components/sharedTypes.d.ts +28 -0
  91. package/types/enhancers/withComponentFactory.d.ts +12 -0
  92. package/types/enhancers/withDatasourceCheck.d.ts +21 -0
  93. package/types/enhancers/withEditorChromes.d.ts +2 -0
  94. package/types/enhancers/withEmptyFieldEditingComponent.d.ts +27 -0
  95. package/types/enhancers/withFieldMetadata.d.ts +16 -0
  96. package/types/enhancers/withPlaceholder.d.ts +34 -0
  97. package/types/enhancers/withSitecoreContext.d.ts +40 -0
  98. package/types/index.d.ts +30 -0
  99. package/types/utils.d.ts +17 -0
@@ -0,0 +1,72 @@
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.Placeholder = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const PlaceholderCommon_1 = require("./PlaceholderCommon");
9
+ const withComponentFactory_1 = require("../enhancers/withComponentFactory");
10
+ const editing_1 = require("@sitecore-content-sdk/core/editing");
11
+ const withSitecoreContext_1 = require("../enhancers/withSitecoreContext");
12
+ class PlaceholderComponent extends PlaceholderCommon_1.PlaceholderCommon {
13
+ constructor(props) {
14
+ super(props);
15
+ this.isEmpty = false;
16
+ }
17
+ componentDidMount() {
18
+ if (this.isEmpty && editing_1.PagesEditor.isActive()) {
19
+ editing_1.PagesEditor.resetChromes();
20
+ }
21
+ }
22
+ /**
23
+ * Renders the placeholder when it is empty. The required CSS styles are applied to the placeholder in edit mode.
24
+ * @param {React.ReactNode | React.ReactElement[]} node react node
25
+ * @returns react node
26
+ */
27
+ renderEmptyPlaceholder(node) {
28
+ return react_1.default.createElement("div", { className: "sc-jss-empty-placeholder" }, node);
29
+ }
30
+ render() {
31
+ var _a, _b;
32
+ const childProps = Object.assign({}, this.props);
33
+ delete childProps.componentFactory;
34
+ if (this.state.error) {
35
+ if (childProps.errorComponent) {
36
+ return react_1.default.createElement(childProps.errorComponent, { error: this.state.error });
37
+ }
38
+ return (react_1.default.createElement("div", { className: "sc-jss-placeholder-error" },
39
+ "A rendering error occurred: ",
40
+ this.state.error.message,
41
+ "."));
42
+ }
43
+ const renderingData = childProps.rendering;
44
+ const placeholderData = PlaceholderCommon_1.PlaceholderCommon.getPlaceholderDataFromRenderingData(renderingData, this.props.name, (_a = this.props.sitecoreContext) === null || _a === void 0 ? void 0 : _a.pageEditing);
45
+ this.isEmpty = !placeholderData.length;
46
+ const components = this.getComponentsForRenderingData(placeholderData);
47
+ if (this.isEmpty) {
48
+ const rendered = this.props.renderEmpty ? this.props.renderEmpty(components) : components;
49
+ return ((_b = this.props.sitecoreContext) === null || _b === void 0 ? void 0 : _b.pageEditing)
50
+ ? this.renderEmptyPlaceholder(rendered)
51
+ : rendered;
52
+ }
53
+ else if (this.props.render) {
54
+ return this.props.render(components, placeholderData, childProps);
55
+ }
56
+ else if (this.props.renderEach) {
57
+ const renderEach = this.props.renderEach;
58
+ return components.map((component, index) => {
59
+ if (component && component.props && component.props.type === 'text/sitecore') {
60
+ return component;
61
+ }
62
+ return renderEach(component, index);
63
+ });
64
+ }
65
+ else {
66
+ return components;
67
+ }
68
+ }
69
+ }
70
+ PlaceholderComponent.propTypes = PlaceholderCommon_1.PlaceholderCommon.propTypes;
71
+ const PlaceholderWithComponentFactory = (0, withComponentFactory_1.withComponentFactory)(PlaceholderComponent);
72
+ exports.Placeholder = (0, withSitecoreContext_1.withSitecoreContext)()(PlaceholderWithComponentFactory);
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.PlaceholderCommon = void 0;
18
+ const react_1 = __importDefault(require("react"));
19
+ const prop_types_1 = __importDefault(require("prop-types"));
20
+ const MissingComponent_1 = require("./MissingComponent");
21
+ const layout_1 = require("@sitecore-content-sdk/core/layout");
22
+ const core_1 = require("@sitecore-content-sdk/core");
23
+ const HiddenRendering_1 = require("./HiddenRendering");
24
+ const FEaaSComponent_1 = require("./FEaaSComponent");
25
+ const FEaaSWrapper_1 = require("./FEaaSWrapper");
26
+ const BYOCComponent_1 = require("./BYOCComponent");
27
+ const BYOCWrapper_1 = require("./BYOCWrapper");
28
+ const PlaceholderMetadata_1 = require("./PlaceholderMetadata");
29
+ const ErrorBoundary_1 = __importDefault(require("./ErrorBoundary"));
30
+ class PlaceholderCommon extends react_1.default.Component {
31
+ constructor(props) {
32
+ super(props);
33
+ this.state = {};
34
+ }
35
+ static getPlaceholderDataFromRenderingData(rendering, name, isEditing) {
36
+ let result;
37
+ let phName = name.slice();
38
+ /**
39
+ * Process (SXA) dynamic placeholders
40
+ * Find and replace the matching dynamic placeholder e.g 'nameOfContainer-{*}' with the requested e.g. 'nameOfContainer-1'.
41
+ * For Metadata EditMode, we need to keep the raw placeholder name in place.
42
+ */
43
+ if (rendering === null || rendering === void 0 ? void 0 : rendering.placeholders) {
44
+ Object.keys(rendering.placeholders).forEach((placeholder) => {
45
+ const patternPlaceholder = (0, layout_1.isDynamicPlaceholder)(placeholder)
46
+ ? (0, layout_1.getDynamicPlaceholderPattern)(placeholder)
47
+ : null;
48
+ if (patternPlaceholder && patternPlaceholder.test(phName)) {
49
+ if (isEditing) {
50
+ phName = placeholder;
51
+ }
52
+ else {
53
+ rendering.placeholders[phName] = rendering.placeholders[placeholder];
54
+ delete rendering.placeholders[placeholder];
55
+ }
56
+ }
57
+ });
58
+ }
59
+ if (rendering && rendering.placeholders && Object.keys(rendering.placeholders).length > 0) {
60
+ result = rendering.placeholders[phName];
61
+ }
62
+ else {
63
+ result = null;
64
+ }
65
+ if (!result) {
66
+ console.warn(`Placeholder '${phName}' was not found in the current rendering data`, JSON.stringify(rendering, null, 2));
67
+ return [];
68
+ }
69
+ return result;
70
+ }
71
+ componentDidCatch(error) {
72
+ this.setState({ error });
73
+ }
74
+ getSXAParams(rendering) {
75
+ if (!rendering.params)
76
+ return {};
77
+ return (rendering.params.FieldNames && {
78
+ styles: `${rendering.params.GridParameters || ''} ${rendering.params.Styles || ''}`,
79
+ });
80
+ }
81
+ getComponentsForRenderingData(placeholderData) {
82
+ var _a;
83
+ const _b = this.props, { name, fields: placeholderFields, params: placeholderParams, missingComponentComponent, hiddenRenderingComponent } = _b, placeholderProps = __rest(_b, ["name", "fields", "params", "missingComponentComponent", "hiddenRenderingComponent"]);
84
+ const transformedComponents = placeholderData
85
+ .map((rendering, index) => {
86
+ var _a, _b;
87
+ const key = rendering.uid
88
+ ? rendering.uid
89
+ : `component-${index}`;
90
+ const commonProps = { key };
91
+ let isEmpty = false;
92
+ const componentRendering = rendering;
93
+ let component;
94
+ if (componentRendering.componentName === core_1.constants.HIDDEN_RENDERING_NAME) {
95
+ component = hiddenRenderingComponent !== null && hiddenRenderingComponent !== void 0 ? hiddenRenderingComponent : HiddenRendering_1.HiddenRendering;
96
+ isEmpty = true;
97
+ }
98
+ else if (!componentRendering.componentName) {
99
+ component = () => react_1.default.createElement(react_1.default.Fragment, null);
100
+ isEmpty = true;
101
+ }
102
+ else {
103
+ component = this.getComponentForRendering(componentRendering);
104
+ }
105
+ // Fallback/defaults for Sitecore Component renderings (in case not defined in component factory)
106
+ if (!component) {
107
+ if (componentRendering.componentName === FEaaSComponent_1.FEAAS_COMPONENT_RENDERING_NAME) {
108
+ component = FEaaSComponent_1.FEaaSComponent;
109
+ }
110
+ else if (componentRendering.componentName === FEaaSWrapper_1.FEAAS_WRAPPER_RENDERING_NAME) {
111
+ component = FEaaSWrapper_1.FEaaSWrapper;
112
+ }
113
+ else if (componentRendering.componentName === BYOCComponent_1.BYOC_COMPONENT_RENDERING_NAME) {
114
+ component = BYOCComponent_1.BYOCComponent;
115
+ }
116
+ else if (componentRendering.componentName === BYOCWrapper_1.BYOC_WRAPPER_RENDERING_NAME) {
117
+ component = BYOCWrapper_1.BYOCWrapper;
118
+ }
119
+ }
120
+ if (!component) {
121
+ console.error(`Placeholder ${name} contains unknown component ${componentRendering.componentName}. Ensure that a React component exists for it, and that it is registered in your componentFactory.js.`);
122
+ component = missingComponentComponent !== null && missingComponentComponent !== void 0 ? missingComponentComponent : MissingComponent_1.MissingComponent;
123
+ isEmpty = true;
124
+ }
125
+ const finalProps = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, commonProps), placeholderProps), ((placeholderFields || componentRendering.fields) && {
126
+ fields: Object.assign(Object.assign({}, placeholderFields), componentRendering.fields),
127
+ })), ((placeholderParams || componentRendering.params) && {
128
+ params: Object.assign(Object.assign(Object.assign({}, placeholderParams), componentRendering.params), this.getSXAParams(componentRendering)),
129
+ })), { rendering: componentRendering });
130
+ let rendered = react_1.default.createElement(component, this.props.modifyComponentProps ? this.props.modifyComponentProps(finalProps) : finalProps);
131
+ if (!isEmpty) {
132
+ // assign type based on passed element - type='text/sitecore' should be ignored when renderEach Placeholder prop function is being used
133
+ const type = rendered.props.type === 'text/sitecore' ? rendered.props.type : '';
134
+ // wrapping with error boundary could cause problems in case where parent component uses withPlaceholder HOC and tries to access its children props
135
+ // that's why we need to expose element's props here
136
+ rendered = (react_1.default.createElement(ErrorBoundary_1.default, Object.assign({ key: rendered.type + '-' + index, errorComponent: this.props.errorComponent, componentLoadingMessage: this.props.componentLoadingMessage, type: type, isDynamic: ((_a = component.render) === null || _a === void 0 ? void 0 : _a.preload) ? true : false }, rendered.props), rendered));
137
+ }
138
+ // if in edit mode then emit shallow chromes for hydration in Pages
139
+ if ((_b = this.props.sitecoreContext) === null || _b === void 0 ? void 0 : _b.pageEditing) {
140
+ return (react_1.default.createElement(PlaceholderMetadata_1.PlaceholderMetadata, { key: key, rendering: rendering }, rendered));
141
+ }
142
+ return rendered;
143
+ })
144
+ .filter((element) => element); // remove nulls
145
+ if ((_a = this.props.sitecoreContext) === null || _a === void 0 ? void 0 : _a.pageEditing) {
146
+ return [
147
+ react_1.default.createElement(PlaceholderMetadata_1.PlaceholderMetadata, { key: this.props.rendering.uid, placeholderName: name, rendering: this.props.rendering }, transformedComponents),
148
+ ];
149
+ }
150
+ return transformedComponents;
151
+ }
152
+ getComponentForRendering(renderingDefinition) {
153
+ var _a;
154
+ const componentFactory = this.props.componentFactory;
155
+ if (!componentFactory || typeof componentFactory !== 'function') {
156
+ console.warn(`No componentFactory was available to service request for component ${renderingDefinition}`);
157
+ return null;
158
+ }
159
+ // Render SXA Rendering Variant
160
+ if ((_a = renderingDefinition.params) === null || _a === void 0 ? void 0 : _a.FieldNames) {
161
+ return componentFactory(renderingDefinition.componentName, renderingDefinition.params.FieldNames);
162
+ }
163
+ return componentFactory(renderingDefinition.componentName);
164
+ }
165
+ }
166
+ exports.PlaceholderCommon = PlaceholderCommon;
167
+ PlaceholderCommon.propTypes = {
168
+ rendering: prop_types_1.default.oneOfType([
169
+ prop_types_1.default.object,
170
+ prop_types_1.default.object,
171
+ ]).isRequired,
172
+ fields: prop_types_1.default.objectOf(prop_types_1.default.oneOfType([
173
+ prop_types_1.default.object,
174
+ prop_types_1.default.object,
175
+ ]).isRequired),
176
+ params: prop_types_1.default.objectOf(prop_types_1.default.string.isRequired),
177
+ missingComponentComponent: prop_types_1.default.oneOfType([
178
+ prop_types_1.default.object,
179
+ prop_types_1.default.func,
180
+ ]),
181
+ hiddenRenderingComponent: prop_types_1.default.oneOfType([
182
+ prop_types_1.default.object,
183
+ prop_types_1.default.func,
184
+ ]),
185
+ errorComponent: prop_types_1.default.oneOfType([
186
+ prop_types_1.default.object,
187
+ prop_types_1.default.func,
188
+ ]),
189
+ modifyComponentProps: prop_types_1.default.func,
190
+ sitecoreContext: prop_types_1.default.object,
191
+ };
@@ -0,0 +1,63 @@
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.PlaceholderMetadata = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const layout_1 = require("@sitecore-content-sdk/core/layout");
9
+ const editing_1 = require("@sitecore-content-sdk/core/editing");
10
+ /**
11
+ * A React component to generate metadata blocks for a placeholder or rendering.
12
+ * It utilizes dynamic attributes based on whether the component acts as a placeholder
13
+ * or as a rendering to properly render the surrounding code blocks.
14
+ * @param {object} props The properties passed to the component.
15
+ * @param {ComponentRendering} props.rendering The rendering data.
16
+ * @param {string} [props.placeholderName] The name of the placeholder.
17
+ * @param {JSX.Element} props.children The child components or elements to be wrapped by the metadata code blocks.
18
+ * @returns {JSX.Element} A React fragment containing open and close code blocks surrounding the children elements.
19
+ */
20
+ const PlaceholderMetadata = ({ rendering, placeholderName, children, }) => {
21
+ const getCodeBlockAttributes = (kind, id, placeholderName) => {
22
+ const chrometype = placeholderName ? 'placeholder' : 'rendering';
23
+ const attributes = {
24
+ type: 'text/sitecore',
25
+ chrometype: chrometype,
26
+ className: 'scpm',
27
+ kind: kind,
28
+ };
29
+ if (kind === editing_1.MetadataKind.Open) {
30
+ if (chrometype === 'placeholder' && placeholderName) {
31
+ let phId = '';
32
+ for (const placeholder of Object.keys(rendering.placeholders)) {
33
+ if (placeholderName === placeholder) {
34
+ phId = id
35
+ ? `${placeholderName}_${id}`
36
+ : `${placeholderName}_${editing_1.DEFAULT_PLACEHOLDER_UID}`;
37
+ break;
38
+ }
39
+ // Check if the placeholder is a dynamic placeholder
40
+ if ((0, layout_1.isDynamicPlaceholder)(placeholder)) {
41
+ const pattern = (0, layout_1.getDynamicPlaceholderPattern)(placeholder);
42
+ // Check if the placeholder matches the dynamic placeholder pattern
43
+ if (pattern.test(placeholderName)) {
44
+ phId = id ? `${placeholder}_${id}` : `${placeholder}_${editing_1.DEFAULT_PLACEHOLDER_UID}`;
45
+ break;
46
+ }
47
+ }
48
+ }
49
+ attributes.id = phId;
50
+ }
51
+ else {
52
+ attributes.id = id;
53
+ }
54
+ }
55
+ return attributes;
56
+ };
57
+ const renderComponent = (uid, placeholderName) => (react_1.default.createElement(react_1.default.Fragment, null,
58
+ react_1.default.createElement("code", Object.assign({}, getCodeBlockAttributes(editing_1.MetadataKind.Open, uid, placeholderName))),
59
+ children,
60
+ react_1.default.createElement("code", Object.assign({}, getCodeBlockAttributes(editing_1.MetadataKind.Close, uid, placeholderName)))));
61
+ return react_1.default.createElement(react_1.default.Fragment, null, renderComponent(rendering.uid, placeholderName));
62
+ };
63
+ exports.PlaceholderMetadata = PlaceholderMetadata;
@@ -0,0 +1,82 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __rest = (this && this.__rest) || function (s, e) {
36
+ var t = {};
37
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
38
+ t[p] = s[p];
39
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
40
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
41
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
42
+ t[p[i]] = s[p[i]];
43
+ }
44
+ return t;
45
+ };
46
+ var __importDefault = (this && this.__importDefault) || function (mod) {
47
+ return (mod && mod.__esModule) ? mod : { "default": mod };
48
+ };
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.RichTextPropTypes = exports.RichText = void 0;
51
+ const react_1 = __importStar(require("react"));
52
+ const prop_types_1 = __importDefault(require("prop-types"));
53
+ const withFieldMetadata_1 = require("../enhancers/withFieldMetadata");
54
+ const withEmptyFieldEditingComponent_1 = require("../enhancers/withEmptyFieldEditingComponent");
55
+ const DefaultEmptyFieldEditingComponents_1 = require("./DefaultEmptyFieldEditingComponents");
56
+ const layout_1 = require("@sitecore-content-sdk/core/layout");
57
+ exports.RichText = (0, withFieldMetadata_1.withFieldMetadata)((0, withEmptyFieldEditingComponent_1.withEmptyFieldEditingComponent)(
58
+ // eslint-disable-next-line react/display-name
59
+ (0, react_1.forwardRef)((_a, ref) => {
60
+ var { field, tag = 'div', editable = true } = _a, otherProps = __rest(_a, ["field", "tag", "editable"]);
61
+ if ((0, layout_1.isFieldValueEmpty)(field)) {
62
+ return null;
63
+ }
64
+ const htmlProps = Object.assign({ dangerouslySetInnerHTML: {
65
+ __html: field.value,
66
+ }, ref }, otherProps);
67
+ return react_1.default.createElement(tag || 'div', htmlProps);
68
+ }), { defaultEmptyFieldEditingComponent: DefaultEmptyFieldEditingComponents_1.DefaultEmptyFieldEditingComponentText, isForwardRef: true }), true);
69
+ exports.RichTextPropTypes = {
70
+ field: prop_types_1.default.shape({
71
+ value: prop_types_1.default.string,
72
+ metadata: prop_types_1.default.objectOf(prop_types_1.default.any),
73
+ }),
74
+ tag: prop_types_1.default.string,
75
+ editable: prop_types_1.default.bool,
76
+ emptyFieldEditingComponent: prop_types_1.default.oneOfType([
77
+ prop_types_1.default.object,
78
+ prop_types_1.default.func,
79
+ ]),
80
+ };
81
+ exports.RichText.propTypes = exports.RichTextPropTypes;
82
+ exports.RichText.displayName = 'RichText';
@@ -0,0 +1,67 @@
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.SitecoreContext = exports.ComponentFactoryReactContext = exports.SitecoreContextReactContext = void 0;
7
+ /* eslint-disable @typescript-eslint/no-explicit-any */
8
+ const react_1 = __importDefault(require("react"));
9
+ const prop_types_1 = __importDefault(require("prop-types"));
10
+ const react_2 = __importDefault(require("fast-deep-equal/es6/react"));
11
+ exports.SitecoreContextReactContext = react_1.default.createContext({});
12
+ exports.ComponentFactoryReactContext = react_1.default.createContext({});
13
+ class SitecoreContext extends react_1.default.Component {
14
+ constructor(props) {
15
+ super(props);
16
+ /**
17
+ * Update context state. Value can be @type {LayoutServiceData} which will be automatically transformed
18
+ * or you can provide exact @type {SitecoreContextValue}
19
+ * @param {SitecoreContextValue | LayoutServiceData} value New context value
20
+ */
21
+ this.setContext = (value) => {
22
+ this.setState({
23
+ context: value.sitecore
24
+ ? this.constructContext(value)
25
+ : Object.assign({}, value),
26
+ });
27
+ };
28
+ const context = this.constructContext(props.layoutData);
29
+ this.state = {
30
+ context,
31
+ setContext: this.setContext,
32
+ };
33
+ }
34
+ constructContext(layoutData) {
35
+ var _a;
36
+ if (!layoutData) {
37
+ return {
38
+ pageEditing: false,
39
+ };
40
+ }
41
+ return Object.assign({ route: layoutData.sitecore.route, itemId: (_a = layoutData.sitecore.route) === null || _a === void 0 ? void 0 : _a.itemId }, layoutData.sitecore.context);
42
+ }
43
+ componentDidUpdate(prevProps) {
44
+ // In case if somebody will manage SitecoreContext state by passing fresh `layoutData` prop
45
+ // instead of using `updateSitecoreContext`
46
+ if (!(0, react_2.default)(prevProps.layoutData, this.props.layoutData)) {
47
+ this.setContext(this.props.layoutData);
48
+ return;
49
+ }
50
+ }
51
+ render() {
52
+ return (react_1.default.createElement(exports.ComponentFactoryReactContext.Provider, { value: this.props.componentFactory },
53
+ react_1.default.createElement(exports.SitecoreContextReactContext.Provider, { value: this.state }, this.props.children)));
54
+ }
55
+ }
56
+ exports.SitecoreContext = SitecoreContext;
57
+ SitecoreContext.propTypes = {
58
+ children: prop_types_1.default.any.isRequired,
59
+ componentFactory: prop_types_1.default.func,
60
+ layoutData: prop_types_1.default.shape({
61
+ sitecore: prop_types_1.default.shape({
62
+ context: prop_types_1.default.any,
63
+ route: prop_types_1.default.any,
64
+ }),
65
+ }),
66
+ };
67
+ SitecoreContext.displayName = 'SitecoreContext';
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.Text = void 0;
18
+ const react_1 = __importDefault(require("react"));
19
+ const withFieldMetadata_1 = require("../enhancers/withFieldMetadata");
20
+ const withEmptyFieldEditingComponent_1 = require("../enhancers/withEmptyFieldEditingComponent");
21
+ const DefaultEmptyFieldEditingComponents_1 = require("./DefaultEmptyFieldEditingComponents");
22
+ const prop_types_1 = __importDefault(require("prop-types"));
23
+ const layout_1 = require("@sitecore-content-sdk/core/layout");
24
+ exports.Text = (0, withFieldMetadata_1.withFieldMetadata)((0, withEmptyFieldEditingComponent_1.withEmptyFieldEditingComponent)((_a) => {
25
+ var { field, tag, editable = true, encode = true } = _a, otherProps = __rest(_a, ["field", "tag", "editable", "encode"]);
26
+ if ((0, layout_1.isFieldValueEmpty)(field)) {
27
+ return null;
28
+ }
29
+ // can't use editable value if we want to output unencoded
30
+ if (!encode) {
31
+ // eslint-disable-next-line no-param-reassign
32
+ editable = false;
33
+ }
34
+ let output = field.value === undefined ? '' : field.value;
35
+ // when string value isn't formatted, we should format line breaks
36
+ const splitted = String(output).split('\n');
37
+ if (splitted.length) {
38
+ const formatted = [];
39
+ splitted.forEach((str, i) => {
40
+ const isLast = i === splitted.length - 1;
41
+ formatted.push(str);
42
+ if (!isLast) {
43
+ formatted.push(react_1.default.createElement("br", { key: i }));
44
+ }
45
+ });
46
+ output = formatted;
47
+ }
48
+ let children = null;
49
+ const htmlProps = Object.assign({}, otherProps);
50
+ if (!encode) {
51
+ htmlProps.dangerouslySetInnerHTML = {
52
+ __html: output,
53
+ };
54
+ }
55
+ else {
56
+ children = output;
57
+ }
58
+ if (tag || !encode) {
59
+ return react_1.default.createElement(tag || 'span', htmlProps, children);
60
+ }
61
+ else {
62
+ return react_1.default.createElement(react_1.default.Fragment, null, children);
63
+ }
64
+ }, { defaultEmptyFieldEditingComponent: DefaultEmptyFieldEditingComponents_1.DefaultEmptyFieldEditingComponentText }));
65
+ exports.Text.propTypes = {
66
+ field: prop_types_1.default.shape({
67
+ value: prop_types_1.default.oneOfType([prop_types_1.default.string, prop_types_1.default.number]),
68
+ metadata: prop_types_1.default.objectOf(prop_types_1.default.any),
69
+ }),
70
+ tag: prop_types_1.default.string,
71
+ editable: prop_types_1.default.bool,
72
+ encode: prop_types_1.default.bool,
73
+ emptyFieldEditingComponent: prop_types_1.default.oneOfType([
74
+ prop_types_1.default.object,
75
+ prop_types_1.default.func,
76
+ ]),
77
+ };
78
+ exports.Text.displayName = 'Text';
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,26 @@
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.withComponentFactory = withComponentFactory;
7
+ const react_1 = __importDefault(require("react"));
8
+ const SitecoreContext_1 = require("../components/SitecoreContext");
9
+ const react_2 = require("react");
10
+ /**
11
+ * @param {React.ComponentClass<T> | React.FC<T>} Component
12
+ */
13
+ function withComponentFactory(Component) {
14
+ /**
15
+ * @param {T} props - props to pass to the wrapped component
16
+ * @returns {JSX.Element} - the rendered component
17
+ */
18
+ function WithComponentFactory(props) {
19
+ const context = (0, react_2.useContext)(SitecoreContext_1.ComponentFactoryReactContext);
20
+ return react_1.default.createElement(Component, Object.assign({}, props, { componentFactory: props.componentFactory || context }));
21
+ }
22
+ WithComponentFactory.displayName = `withComponentFactory(${Component.displayName ||
23
+ Component.name ||
24
+ 'Anonymous'})`;
25
+ return WithComponentFactory;
26
+ }
@@ -0,0 +1,28 @@
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.DefaultEditingError = void 0;
7
+ exports.withDatasourceCheck = withDatasourceCheck;
8
+ const react_1 = __importDefault(require("react"));
9
+ const withSitecoreContext_1 = require("./withSitecoreContext");
10
+ const DefaultEditingError = () => (react_1.default.createElement("div", { className: "sc-jss-editing-error", role: "alert" }, "Datasource is required. Please choose a content item for this component."));
11
+ exports.DefaultEditingError = DefaultEditingError;
12
+ /**
13
+ * Checks whether a Sitecore datasource is present and renders appropriately depending on page mode (normal vs editing).
14
+ * @param {WithDatasourceCheckOptions} [options]
15
+ * @returns
16
+ * The wrapped component, if a datasource is present.
17
+ * A null component (in normal mode) or an error component (in editing mode), if a datasource is not present.
18
+ */
19
+ function withDatasourceCheck(options) {
20
+ return function withDatasourceCheckHoc(Component) {
21
+ return function WithDatasourceCheck(props) {
22
+ var _a, _b;
23
+ const { sitecoreContext } = (0, withSitecoreContext_1.useSitecoreContext)();
24
+ const EditingError = (_a = options === null || options === void 0 ? void 0 : options.editingErrorComponent) !== null && _a !== void 0 ? _a : exports.DefaultEditingError;
25
+ return ((_b = props.rendering) === null || _b === void 0 ? void 0 : _b.dataSource) ? (react_1.default.createElement(Component, Object.assign({}, props))) : sitecoreContext.pageEditing ? (react_1.default.createElement(EditingError, null)) : null;
26
+ };
27
+ };
28
+ }
@@ -0,0 +1,24 @@
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.withEditorChromes = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const __1 = require("..");
9
+ const withEditorChromes = (WrappedComponent) => {
10
+ class Enhancer extends react_1.default.Component {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.displayName = WrappedComponent.displayName || WrappedComponent.name || 'Component';
14
+ }
15
+ componentDidUpdate() {
16
+ (0, __1.resetEditorChromes)();
17
+ }
18
+ render() {
19
+ return react_1.default.createElement(WrappedComponent, Object.assign({}, this.props));
20
+ }
21
+ }
22
+ return Enhancer;
23
+ };
24
+ exports.withEditorChromes = withEditorChromes;