@sitecore-jss/sitecore-jss-react 0.1.0-beta.2
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/LICENSE.txt +202 -0
- package/README.md +8 -0
- package/dist/cjs/ComponentBuilder.js +25 -0
- package/dist/cjs/components/BYOCComponent.js +122 -0
- package/dist/cjs/components/BYOCWrapper.js +18 -0
- package/dist/cjs/components/Date.js +58 -0
- package/dist/cjs/components/EditFrame.js +39 -0
- package/dist/cjs/components/FEaaSComponent.js +152 -0
- package/dist/cjs/components/FEaaSWrapper.js +18 -0
- package/dist/cjs/components/File.js +53 -0
- package/dist/cjs/components/HiddenRendering.js +15 -0
- package/dist/cjs/components/Image.js +120 -0
- package/dist/cjs/components/Link.js +115 -0
- package/dist/cjs/components/MissingComponent.js +34 -0
- package/dist/cjs/components/Placeholder.js +80 -0
- package/dist/cjs/components/PlaceholderCommon.js +212 -0
- package/dist/cjs/components/RichText.js +66 -0
- package/dist/cjs/components/SitecoreContext.js +67 -0
- package/dist/cjs/components/Text.js +83 -0
- package/dist/cjs/components/sharedTypes.js +2 -0
- package/dist/cjs/enhancers/withComponentFactory.js +27 -0
- package/dist/cjs/enhancers/withDatasourceCheck.js +28 -0
- package/dist/cjs/enhancers/withEditorChromes.js +24 -0
- package/dist/cjs/enhancers/withPlaceholder.js +63 -0
- package/dist/cjs/enhancers/withSitecoreContext.js +53 -0
- package/dist/cjs/index.js +66 -0
- package/dist/cjs/utils.js +118 -0
- package/dist/esm/ComponentBuilder.js +21 -0
- package/dist/esm/components/BYOCComponent.js +91 -0
- package/dist/esm/components/BYOCWrapper.js +11 -0
- package/dist/esm/components/Date.js +51 -0
- package/dist/esm/components/EditFrame.js +32 -0
- package/dist/esm/components/FEaaSComponent.js +120 -0
- package/dist/esm/components/FEaaSWrapper.js +11 -0
- package/dist/esm/components/File.js +46 -0
- package/dist/esm/components/HiddenRendering.js +8 -0
- package/dist/esm/components/Image.js +112 -0
- package/dist/esm/components/Link.js +86 -0
- package/dist/esm/components/MissingComponent.js +27 -0
- package/dist/esm/components/Placeholder.js +74 -0
- package/dist/esm/components/PlaceholderCommon.js +205 -0
- package/dist/esm/components/RichText.js +37 -0
- package/dist/esm/components/SitecoreContext.js +60 -0
- package/dist/esm/components/Text.js +76 -0
- package/dist/esm/components/sharedTypes.js +1 -0
- package/dist/esm/enhancers/withComponentFactory.js +20 -0
- package/dist/esm/enhancers/withDatasourceCheck.js +20 -0
- package/dist/esm/enhancers/withEditorChromes.js +17 -0
- package/dist/esm/enhancers/withPlaceholder.js +56 -0
- package/dist/esm/enhancers/withSitecoreContext.js +45 -0
- package/dist/esm/index.js +23 -0
- package/dist/esm/utils.js +109 -0
- package/package.json +76 -0
- package/types/ComponentBuilder.d.ts +28 -0
- package/types/components/BYOCComponent.d.ts +87 -0
- package/types/components/BYOCWrapper.d.ts +3 -0
- package/types/components/Date.d.ts +22 -0
- package/types/components/EditFrame.d.ts +12 -0
- package/types/components/FEaaSComponent.d.ts +71 -0
- package/types/components/FEaaSWrapper.d.ts +3 -0
- package/types/components/File.d.ts +19 -0
- package/types/components/HiddenRendering.d.ts +4 -0
- package/types/components/Image.d.ts +62 -0
- package/types/components/Link.d.ts +47 -0
- package/types/components/MissingComponent.d.ts +9 -0
- package/types/components/Placeholder.d.ts +25 -0
- package/types/components/PlaceholderCommon.d.ts +105 -0
- package/types/components/RichText.d.ts +32 -0
- package/types/components/SitecoreContext.d.ts +43 -0
- package/types/components/Text.d.ts +26 -0
- package/types/components/sharedTypes.d.ts +7 -0
- package/types/enhancers/withComponentFactory.d.ts +13 -0
- package/types/enhancers/withDatasourceCheck.d.ts +22 -0
- package/types/enhancers/withEditorChromes.d.ts +3 -0
- package/types/enhancers/withPlaceholder.d.ts +37 -0
- package/types/enhancers/withSitecoreContext.d.ts +47 -0
- package/types/index.d.ts +24 -0
- package/types/utils.d.ts +42 -0
|
@@ -0,0 +1,66 @@
|
|
|
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 (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
26
|
+
var t = {};
|
|
27
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
28
|
+
t[p] = s[p];
|
|
29
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
30
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
31
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
32
|
+
t[p[i]] = s[p[i]];
|
|
33
|
+
}
|
|
34
|
+
return t;
|
|
35
|
+
};
|
|
36
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
|
+
};
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.RichTextPropTypes = exports.RichText = void 0;
|
|
41
|
+
const react_1 = __importStar(require("react"));
|
|
42
|
+
const prop_types_1 = __importDefault(require("prop-types"));
|
|
43
|
+
exports.RichText = (0, react_1.forwardRef)((_a, ref) => {
|
|
44
|
+
var { field, tag, editable } = _a, otherProps = __rest(_a, ["field", "tag", "editable"]);
|
|
45
|
+
if (!field || (!field.editable && !field.value)) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
const htmlProps = Object.assign({ dangerouslySetInnerHTML: {
|
|
49
|
+
__html: field.editable && editable ? field.editable : field.value,
|
|
50
|
+
}, ref }, otherProps);
|
|
51
|
+
return react_1.default.createElement(tag || 'div', htmlProps);
|
|
52
|
+
});
|
|
53
|
+
exports.RichTextPropTypes = {
|
|
54
|
+
field: prop_types_1.default.shape({
|
|
55
|
+
value: prop_types_1.default.string,
|
|
56
|
+
editable: prop_types_1.default.string,
|
|
57
|
+
}),
|
|
58
|
+
tag: prop_types_1.default.string,
|
|
59
|
+
editable: prop_types_1.default.bool,
|
|
60
|
+
};
|
|
61
|
+
exports.RichText.propTypes = exports.RichTextPropTypes;
|
|
62
|
+
exports.RichText.defaultProps = {
|
|
63
|
+
tag: 'div',
|
|
64
|
+
editable: true,
|
|
65
|
+
};
|
|
66
|
+
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,83 @@
|
|
|
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 prop_types_1 = __importDefault(require("prop-types"));
|
|
20
|
+
const Text = (_a) => {
|
|
21
|
+
var { field, tag, editable, encode } = _a, otherProps = __rest(_a, ["field", "tag", "editable", "encode"]);
|
|
22
|
+
if (!field || (!field.editable && (field.value === undefined || field.value === ''))) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
// can't use editable value if we want to output unencoded
|
|
26
|
+
if (!encode) {
|
|
27
|
+
// eslint-disable-next-line no-param-reassign
|
|
28
|
+
editable = false;
|
|
29
|
+
}
|
|
30
|
+
const isEditable = field.editable && editable;
|
|
31
|
+
let output = isEditable
|
|
32
|
+
? field.editable || ''
|
|
33
|
+
: field.value === undefined
|
|
34
|
+
? ''
|
|
35
|
+
: field.value;
|
|
36
|
+
// when string value isn't formatted, we should format line breaks
|
|
37
|
+
if (!field.editable && typeof output === 'string') {
|
|
38
|
+
const splitted = String(output).split('\n');
|
|
39
|
+
if (splitted.length) {
|
|
40
|
+
const formatted = [];
|
|
41
|
+
splitted.forEach((str, i) => {
|
|
42
|
+
const isLast = i === splitted.length - 1;
|
|
43
|
+
formatted.push(str);
|
|
44
|
+
if (!isLast) {
|
|
45
|
+
formatted.push(react_1.default.createElement("br", { key: i }));
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
output = formatted;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const setDangerously = isEditable || !encode;
|
|
52
|
+
let children = null;
|
|
53
|
+
const htmlProps = Object.assign({}, otherProps);
|
|
54
|
+
if (setDangerously) {
|
|
55
|
+
htmlProps.dangerouslySetInnerHTML = {
|
|
56
|
+
__html: output,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
children = output;
|
|
61
|
+
}
|
|
62
|
+
if (tag || setDangerously) {
|
|
63
|
+
return react_1.default.createElement(tag || 'span', htmlProps, children);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
return react_1.default.createElement(react_1.default.Fragment, null, children);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
exports.Text = Text;
|
|
70
|
+
exports.Text.propTypes = {
|
|
71
|
+
field: prop_types_1.default.shape({
|
|
72
|
+
value: prop_types_1.default.oneOfType([prop_types_1.default.string, prop_types_1.default.number]),
|
|
73
|
+
editable: prop_types_1.default.string,
|
|
74
|
+
}),
|
|
75
|
+
tag: prop_types_1.default.string,
|
|
76
|
+
editable: prop_types_1.default.bool,
|
|
77
|
+
encode: prop_types_1.default.bool,
|
|
78
|
+
};
|
|
79
|
+
exports.Text.defaultProps = {
|
|
80
|
+
editable: true,
|
|
81
|
+
encode: true,
|
|
82
|
+
};
|
|
83
|
+
exports.Text.displayName = 'Text';
|
|
@@ -0,0 +1,27 @@
|
|
|
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 = void 0;
|
|
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
|
+
}
|
|
27
|
+
exports.withComponentFactory = withComponentFactory;
|
|
@@ -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.withDatasourceCheck = exports.DefaultEditingError = void 0;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const withSitecoreContext_1 = require("./withSitecoreContext");
|
|
9
|
+
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."));
|
|
10
|
+
exports.DefaultEditingError = DefaultEditingError;
|
|
11
|
+
/**
|
|
12
|
+
* Checks whether a Sitecore datasource is present and renders appropriately depending on page mode (normal vs editing).
|
|
13
|
+
* @param {WithDatasourceCheckOptions} [options]
|
|
14
|
+
* @returns
|
|
15
|
+
* The wrapped component, if a datasource is present.
|
|
16
|
+
* A null component (in normal mode) or an error component (in editing mode), if a datasource is not present.
|
|
17
|
+
*/
|
|
18
|
+
function withDatasourceCheck(options) {
|
|
19
|
+
return function withDatasourceCheckHoc(Component) {
|
|
20
|
+
return function WithDatasourceCheck(props) {
|
|
21
|
+
var _a, _b;
|
|
22
|
+
const { sitecoreContext } = (0, withSitecoreContext_1.useSitecoreContext)();
|
|
23
|
+
const EditingError = (_a = options === null || options === void 0 ? void 0 : options.editingErrorComponent) !== null && _a !== void 0 ? _a : exports.DefaultEditingError;
|
|
24
|
+
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;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
exports.withDatasourceCheck = withDatasourceCheck;
|
|
@@ -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;
|
|
@@ -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.withPlaceholder = void 0;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const PlaceholderCommon_1 = require("../components/PlaceholderCommon");
|
|
9
|
+
const withComponentFactory_1 = require("./withComponentFactory");
|
|
10
|
+
/**
|
|
11
|
+
* @param {WithPlaceholderSpec} placeholders
|
|
12
|
+
* @param {WithPlaceholderOptions} [options]
|
|
13
|
+
*/
|
|
14
|
+
function withPlaceholder(placeholders, options) {
|
|
15
|
+
return (WrappedComponent) => {
|
|
16
|
+
class WithPlaceholder extends PlaceholderCommon_1.PlaceholderCommon {
|
|
17
|
+
constructor(props) {
|
|
18
|
+
super(props);
|
|
19
|
+
}
|
|
20
|
+
render() {
|
|
21
|
+
let childProps = Object.assign({}, this.props);
|
|
22
|
+
delete childProps.componentFactory;
|
|
23
|
+
if (options && options.propsTransformer) {
|
|
24
|
+
childProps = options.propsTransformer(childProps);
|
|
25
|
+
}
|
|
26
|
+
if (this.state.error) {
|
|
27
|
+
if (childProps.errorComponent) {
|
|
28
|
+
return react_1.default.createElement(childProps.errorComponent, { error: this.state.error });
|
|
29
|
+
}
|
|
30
|
+
return (react_1.default.createElement("div", { className: "sc-jss-placeholder-error" },
|
|
31
|
+
"A rendering error occurred: ",
|
|
32
|
+
this.state.error.message,
|
|
33
|
+
"."));
|
|
34
|
+
}
|
|
35
|
+
const renderingData = options && options.resolvePlaceholderDataFromProps
|
|
36
|
+
? options.resolvePlaceholderDataFromProps(childProps)
|
|
37
|
+
: childProps.rendering;
|
|
38
|
+
const definitelyArrayPlacholders = !Array.isArray(placeholders)
|
|
39
|
+
? [placeholders]
|
|
40
|
+
: placeholders;
|
|
41
|
+
definitelyArrayPlacholders.forEach((placeholder) => {
|
|
42
|
+
let placeholderData;
|
|
43
|
+
if (typeof placeholder !== 'string' && placeholder.placeholder && placeholder.prop) {
|
|
44
|
+
placeholderData = PlaceholderCommon_1.PlaceholderCommon.getPlaceholderDataFromRenderingData(renderingData, placeholder.placeholder);
|
|
45
|
+
if (placeholderData) {
|
|
46
|
+
childProps[placeholder.prop] = this.getComponentsForRenderingData(placeholderData);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
placeholderData = PlaceholderCommon_1.PlaceholderCommon.getPlaceholderDataFromRenderingData(renderingData, placeholder);
|
|
51
|
+
if (placeholderData) {
|
|
52
|
+
childProps[placeholder] = this.getComponentsForRenderingData(placeholderData);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
return react_1.default.createElement(WrappedComponent, Object.assign({}, childProps));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
WithPlaceholder.propTypes = PlaceholderCommon_1.PlaceholderCommon.propTypes;
|
|
60
|
+
return (0, withComponentFactory_1.withComponentFactory)(WithPlaceholder);
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
exports.withPlaceholder = withPlaceholder;
|
|
@@ -0,0 +1,53 @@
|
|
|
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.useSitecoreContext = exports.withSitecoreContext = void 0;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const SitecoreContext_1 = require("../components/SitecoreContext");
|
|
9
|
+
/**
|
|
10
|
+
* @param {WithSitecoreContextOptions} [options]
|
|
11
|
+
*/
|
|
12
|
+
function withSitecoreContext(options) {
|
|
13
|
+
return function withSitecoreContextHoc(Component) {
|
|
14
|
+
return function WithSitecoreContext(props) {
|
|
15
|
+
return (react_1.default.createElement(SitecoreContext_1.SitecoreContextReactContext.Consumer, null, (context) => (react_1.default.createElement(Component, Object.assign({}, props, { sitecoreContext: context.context, updateSitecoreContext: options && options.updatable && context.setContext })))));
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
exports.withSitecoreContext = withSitecoreContext;
|
|
20
|
+
/**
|
|
21
|
+
* This hook grants acсess to the current Sitecore page context
|
|
22
|
+
* by default JSS includes the following properties in this context:
|
|
23
|
+
* - pageEditing - Provided by Layout Service, a boolean indicating whether the route is being accessed via the Experience Editor.
|
|
24
|
+
* - pageState - Like pageEditing, but a string: normal, preview or edit.
|
|
25
|
+
* - site - Provided by Layout Service, an object containing the name of the current Sitecore site context.
|
|
26
|
+
*
|
|
27
|
+
* @see https://jss.sitecore.com/docs/techniques/extending-layout-service/layoutservice-extending-context
|
|
28
|
+
*
|
|
29
|
+
* @param {WithSitecoreContextOptions} [options] hook options
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* const EditMode = () => {
|
|
33
|
+
* const { sitecoreContext } = useSitecoreContext();
|
|
34
|
+
* return <span>Edit Mode is {sitecoreContext.pageEditing ? 'active' : 'inactive'}</span>
|
|
35
|
+
* }
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* const EditMode = () => {
|
|
39
|
+
* const { sitecoreContext, updateSitecoreContext } = useSitecoreContext({ updatable: true });
|
|
40
|
+
* const onClick = () => updateSitecoreContext({ pageEditing: true });
|
|
41
|
+
* return <span onClick={onClick}>Edit Mode is {sitecoreContext.pageEditing ? 'active' : 'inactive'}</span>
|
|
42
|
+
* }
|
|
43
|
+
* @returns {Object} { sitecoreContext, updateSitecoreContext }
|
|
44
|
+
*/
|
|
45
|
+
function useSitecoreContext(options) {
|
|
46
|
+
const reactContext = react_1.default.useContext(SitecoreContext_1.SitecoreContextReactContext);
|
|
47
|
+
const updatable = options === null || options === void 0 ? void 0 : options.updatable;
|
|
48
|
+
return {
|
|
49
|
+
sitecoreContext: reactContext.context,
|
|
50
|
+
updateSitecoreContext: updatable ? reactContext.setContext : undefined,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
exports.useSitecoreContext = useSitecoreContext;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ComponentBuilder = exports.EditFrame = exports.withDatasourceCheck = exports.withPlaceholder = exports.withEditorChromes = exports.useSitecoreContext = exports.withSitecoreContext = exports.SitecoreContextReactContext = exports.SitecoreContext = exports.File = exports.LinkPropTypes = exports.Link = exports.BYOCWrapper = exports.fetchBYOCComponentServerProps = exports.BYOCComponent = exports.FEaaSWrapper = exports.fetchFEaaSComponentServerProps = exports.FEaaSComponent = exports.DateField = exports.Text = exports.RichTextPropTypes = exports.RichText = exports.getEEMarkup = exports.Image = exports.Placeholder = exports.mediaApi = exports.GraphQLDictionaryService = exports.getFieldValue = exports.getChildPlaceholder = exports.GraphQLLayoutService = exports.LayoutServicePageState = exports.getComponentLibraryStylesheetLinks = exports.getContentStylesheetLink = exports.DefaultEditFrameButtons = exports.DefaultEditFrameButton = exports.resetEditorChromes = exports.isEditorActive = exports.enableDebug = exports.NativeDataFetcher = exports.constants = void 0;
|
|
4
|
+
var sitecore_jss_1 = require("@sitecore-jss/sitecore-jss");
|
|
5
|
+
Object.defineProperty(exports, "constants", { enumerable: true, get: function () { return sitecore_jss_1.constants; } });
|
|
6
|
+
Object.defineProperty(exports, "NativeDataFetcher", { enumerable: true, get: function () { return sitecore_jss_1.NativeDataFetcher; } });
|
|
7
|
+
Object.defineProperty(exports, "enableDebug", { enumerable: true, get: function () { return sitecore_jss_1.enableDebug; } });
|
|
8
|
+
var utils_1 = require("@sitecore-jss/sitecore-jss/utils");
|
|
9
|
+
Object.defineProperty(exports, "isEditorActive", { enumerable: true, get: function () { return utils_1.isEditorActive; } });
|
|
10
|
+
Object.defineProperty(exports, "resetEditorChromes", { enumerable: true, get: function () { return utils_1.resetEditorChromes; } });
|
|
11
|
+
Object.defineProperty(exports, "DefaultEditFrameButton", { enumerable: true, get: function () { return utils_1.DefaultEditFrameButton; } });
|
|
12
|
+
Object.defineProperty(exports, "DefaultEditFrameButtons", { enumerable: true, get: function () { return utils_1.DefaultEditFrameButtons; } });
|
|
13
|
+
var layout_1 = require("@sitecore-jss/sitecore-jss/layout");
|
|
14
|
+
Object.defineProperty(exports, "getContentStylesheetLink", { enumerable: true, get: function () { return layout_1.getContentStylesheetLink; } });
|
|
15
|
+
Object.defineProperty(exports, "getComponentLibraryStylesheetLinks", { enumerable: true, get: function () { return layout_1.getComponentLibraryStylesheetLinks; } });
|
|
16
|
+
Object.defineProperty(exports, "LayoutServicePageState", { enumerable: true, get: function () { return layout_1.LayoutServicePageState; } });
|
|
17
|
+
Object.defineProperty(exports, "GraphQLLayoutService", { enumerable: true, get: function () { return layout_1.GraphQLLayoutService; } });
|
|
18
|
+
Object.defineProperty(exports, "getChildPlaceholder", { enumerable: true, get: function () { return layout_1.getChildPlaceholder; } });
|
|
19
|
+
Object.defineProperty(exports, "getFieldValue", { enumerable: true, get: function () { return layout_1.getFieldValue; } });
|
|
20
|
+
var i18n_1 = require("@sitecore-jss/sitecore-jss/i18n");
|
|
21
|
+
Object.defineProperty(exports, "GraphQLDictionaryService", { enumerable: true, get: function () { return i18n_1.GraphQLDictionaryService; } });
|
|
22
|
+
var media_1 = require("@sitecore-jss/sitecore-jss/media");
|
|
23
|
+
Object.defineProperty(exports, "mediaApi", { enumerable: true, get: function () { return media_1.mediaApi; } });
|
|
24
|
+
var Placeholder_1 = require("./components/Placeholder");
|
|
25
|
+
Object.defineProperty(exports, "Placeholder", { enumerable: true, get: function () { return Placeholder_1.Placeholder; } });
|
|
26
|
+
var Image_1 = require("./components/Image");
|
|
27
|
+
Object.defineProperty(exports, "Image", { enumerable: true, get: function () { return Image_1.Image; } });
|
|
28
|
+
Object.defineProperty(exports, "getEEMarkup", { enumerable: true, get: function () { return Image_1.getEEMarkup; } });
|
|
29
|
+
var RichText_1 = require("./components/RichText");
|
|
30
|
+
Object.defineProperty(exports, "RichText", { enumerable: true, get: function () { return RichText_1.RichText; } });
|
|
31
|
+
Object.defineProperty(exports, "RichTextPropTypes", { enumerable: true, get: function () { return RichText_1.RichTextPropTypes; } });
|
|
32
|
+
var Text_1 = require("./components/Text");
|
|
33
|
+
Object.defineProperty(exports, "Text", { enumerable: true, get: function () { return Text_1.Text; } });
|
|
34
|
+
var Date_1 = require("./components/Date");
|
|
35
|
+
Object.defineProperty(exports, "DateField", { enumerable: true, get: function () { return Date_1.DateField; } });
|
|
36
|
+
var FEaaSComponent_1 = require("./components/FEaaSComponent");
|
|
37
|
+
Object.defineProperty(exports, "FEaaSComponent", { enumerable: true, get: function () { return FEaaSComponent_1.FEaaSComponent; } });
|
|
38
|
+
Object.defineProperty(exports, "fetchFEaaSComponentServerProps", { enumerable: true, get: function () { return FEaaSComponent_1.fetchFEaaSComponentServerProps; } });
|
|
39
|
+
var FEaaSWrapper_1 = require("./components/FEaaSWrapper");
|
|
40
|
+
Object.defineProperty(exports, "FEaaSWrapper", { enumerable: true, get: function () { return FEaaSWrapper_1.FEaaSWrapper; } });
|
|
41
|
+
var BYOCComponent_1 = require("./components/BYOCComponent");
|
|
42
|
+
Object.defineProperty(exports, "BYOCComponent", { enumerable: true, get: function () { return BYOCComponent_1.BYOCComponent; } });
|
|
43
|
+
Object.defineProperty(exports, "fetchBYOCComponentServerProps", { enumerable: true, get: function () { return BYOCComponent_1.fetchBYOCComponentServerProps; } });
|
|
44
|
+
var BYOCWrapper_1 = require("./components/BYOCWrapper");
|
|
45
|
+
Object.defineProperty(exports, "BYOCWrapper", { enumerable: true, get: function () { return BYOCWrapper_1.BYOCWrapper; } });
|
|
46
|
+
var Link_1 = require("./components/Link");
|
|
47
|
+
Object.defineProperty(exports, "Link", { enumerable: true, get: function () { return Link_1.Link; } });
|
|
48
|
+
Object.defineProperty(exports, "LinkPropTypes", { enumerable: true, get: function () { return Link_1.LinkPropTypes; } });
|
|
49
|
+
var File_1 = require("./components/File");
|
|
50
|
+
Object.defineProperty(exports, "File", { enumerable: true, get: function () { return File_1.File; } });
|
|
51
|
+
var SitecoreContext_1 = require("./components/SitecoreContext");
|
|
52
|
+
Object.defineProperty(exports, "SitecoreContext", { enumerable: true, get: function () { return SitecoreContext_1.SitecoreContext; } });
|
|
53
|
+
Object.defineProperty(exports, "SitecoreContextReactContext", { enumerable: true, get: function () { return SitecoreContext_1.SitecoreContextReactContext; } });
|
|
54
|
+
var withSitecoreContext_1 = require("./enhancers/withSitecoreContext");
|
|
55
|
+
Object.defineProperty(exports, "withSitecoreContext", { enumerable: true, get: function () { return withSitecoreContext_1.withSitecoreContext; } });
|
|
56
|
+
Object.defineProperty(exports, "useSitecoreContext", { enumerable: true, get: function () { return withSitecoreContext_1.useSitecoreContext; } });
|
|
57
|
+
var withEditorChromes_1 = require("./enhancers/withEditorChromes");
|
|
58
|
+
Object.defineProperty(exports, "withEditorChromes", { enumerable: true, get: function () { return withEditorChromes_1.withEditorChromes; } });
|
|
59
|
+
var withPlaceholder_1 = require("./enhancers/withPlaceholder");
|
|
60
|
+
Object.defineProperty(exports, "withPlaceholder", { enumerable: true, get: function () { return withPlaceholder_1.withPlaceholder; } });
|
|
61
|
+
var withDatasourceCheck_1 = require("./enhancers/withDatasourceCheck");
|
|
62
|
+
Object.defineProperty(exports, "withDatasourceCheck", { enumerable: true, get: function () { return withDatasourceCheck_1.withDatasourceCheck; } });
|
|
63
|
+
var EditFrame_1 = require("./components/EditFrame");
|
|
64
|
+
Object.defineProperty(exports, "EditFrame", { enumerable: true, get: function () { return EditFrame_1.EditFrame; } });
|
|
65
|
+
var ComponentBuilder_1 = require("./ComponentBuilder");
|
|
66
|
+
Object.defineProperty(exports, "ComponentBuilder", { enumerable: true, get: function () { return ComponentBuilder_1.ComponentBuilder; } });
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.getDataFromFields = exports.getAttributesString = exports.addClassName = exports.convertAttributesToReactProps = exports.convertStyleAttribute = exports.convertKebabCasetoCamelCase = void 0;
|
|
15
|
+
const layout_1 = require("@sitecore-jss/sitecore-jss/layout");
|
|
16
|
+
const style_attr_1 = require("style-attr");
|
|
17
|
+
// https://stackoverflow.com/a/10426674/9324
|
|
18
|
+
const convertKebabCasetoCamelCase = (str) => str.replace(/^.|-./g, (letter, index) => index === 0 ? letter.toLowerCase() : letter.substr(1).toUpperCase());
|
|
19
|
+
exports.convertKebabCasetoCamelCase = convertKebabCasetoCamelCase;
|
|
20
|
+
/**
|
|
21
|
+
* https://facebook.github.io/react/docs/dom-elements.html
|
|
22
|
+
* We are only concerned with style at the moment, which needs to be converted from string to object to satisfy React.
|
|
23
|
+
* We don't need to convert any other attributes (that we know of), because the placeholder renders them "as-is" by using the special "is" React prop.
|
|
24
|
+
* For whatever reason though, the "style" prop is still validated as needing to be an object when using the "is" prop, which is why we need to convert from string to object.
|
|
25
|
+
* @param {string} [style] style
|
|
26
|
+
* @returns {Array} converted attributes
|
|
27
|
+
*/
|
|
28
|
+
const convertStyleAttribute = (style = '') => {
|
|
29
|
+
// styleParse converts a style attribute string into an object format
|
|
30
|
+
const parsedStyle = (0, style_attr_1.parse)(style, { preserveNumbers: true });
|
|
31
|
+
return Object.keys(parsedStyle).reduce((initialResult, styleKey) => {
|
|
32
|
+
const result = initialResult;
|
|
33
|
+
const convertedKey = (0, exports.convertKebabCasetoCamelCase)(styleKey);
|
|
34
|
+
result[convertedKey] = parsedStyle[styleKey];
|
|
35
|
+
return result;
|
|
36
|
+
}, {});
|
|
37
|
+
};
|
|
38
|
+
exports.convertStyleAttribute = convertStyleAttribute;
|
|
39
|
+
const convertAttributesToReactProps = (attributes) => {
|
|
40
|
+
if (!attributes) {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
return Object.keys(attributes).reduce((initialResult, attrName) => {
|
|
44
|
+
const result = initialResult;
|
|
45
|
+
switch (attrName) {
|
|
46
|
+
case 'class': {
|
|
47
|
+
result.className = attributes.class;
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
case 'style': {
|
|
51
|
+
result.style = (0, exports.convertStyleAttribute)(attributes.style);
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
default: {
|
|
55
|
+
result[attrName] = attributes[attrName];
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
60
|
+
}, {});
|
|
61
|
+
};
|
|
62
|
+
exports.convertAttributesToReactProps = convertAttributesToReactProps;
|
|
63
|
+
/**
|
|
64
|
+
* "class" property will be transformed into or appended to "className" instead.
|
|
65
|
+
* @param {string} otherAttrs all other props included on the image component
|
|
66
|
+
* @returns {void}
|
|
67
|
+
*/
|
|
68
|
+
const addClassName = (otherAttrs) => {
|
|
69
|
+
if (otherAttrs.class) {
|
|
70
|
+
// if any classes are defined properly already
|
|
71
|
+
if (otherAttrs.className) {
|
|
72
|
+
let className = otherAttrs.className;
|
|
73
|
+
className += ` ${otherAttrs.class}`;
|
|
74
|
+
otherAttrs.className = className;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
otherAttrs.className = otherAttrs.class;
|
|
78
|
+
}
|
|
79
|
+
delete otherAttrs.class;
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
exports.addClassName = addClassName;
|
|
83
|
+
/**
|
|
84
|
+
* Converts the given tag attributes object to a string
|
|
85
|
+
* @param {Object.<string, unknown>} attributes the attributes object
|
|
86
|
+
* @returns {string} string representation of the attributes
|
|
87
|
+
*/
|
|
88
|
+
const getAttributesString = (attributes) => {
|
|
89
|
+
const { className } = attributes, restAttributes = __rest(attributes, ["className"]);
|
|
90
|
+
const attributesEntries = Object.entries(restAttributes).map(([key, value]) => {
|
|
91
|
+
if (typeof value === 'object') {
|
|
92
|
+
const valueString = JSON.stringify(value)
|
|
93
|
+
.replace(/"|{|}/g, '')
|
|
94
|
+
.replace(/,/g, ';');
|
|
95
|
+
return `${key}="${valueString}"`;
|
|
96
|
+
}
|
|
97
|
+
return `${key}="${value}"`;
|
|
98
|
+
});
|
|
99
|
+
if (className) {
|
|
100
|
+
attributesEntries.push(`class="${className}"`);
|
|
101
|
+
}
|
|
102
|
+
return attributesEntries.join(' ');
|
|
103
|
+
};
|
|
104
|
+
exports.getAttributesString = getAttributesString;
|
|
105
|
+
/**
|
|
106
|
+
* Used in FEAAS and BYOC implementations to convert datasource item field values into component props
|
|
107
|
+
* @param {ComponentFields} fields field collection from Sitecore
|
|
108
|
+
* @returns JSON object that can be used as props
|
|
109
|
+
*/
|
|
110
|
+
const getDataFromFields = (fields) => {
|
|
111
|
+
let data = {};
|
|
112
|
+
data = Object.entries(fields).reduce((acc, [key]) => {
|
|
113
|
+
acc[key] = (0, layout_1.getFieldValue)(fields, key);
|
|
114
|
+
return acc;
|
|
115
|
+
}, data);
|
|
116
|
+
return data;
|
|
117
|
+
};
|
|
118
|
+
exports.getDataFromFields = getDataFromFields;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React implementation of component builder class for building components based on the configuration.
|
|
3
|
+
*/
|
|
4
|
+
export class ComponentBuilder {
|
|
5
|
+
constructor(config) {
|
|
6
|
+
this.config = config;
|
|
7
|
+
this.components = new Map([...config.components]);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Creates a new instance of component factory
|
|
11
|
+
* @returns {ComponentFactory} Component factory implementation
|
|
12
|
+
*/
|
|
13
|
+
getComponentFactory() {
|
|
14
|
+
return (componentName) => {
|
|
15
|
+
const component = this.components.get(componentName);
|
|
16
|
+
if (!component)
|
|
17
|
+
return null;
|
|
18
|
+
return component;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
}
|