@sitecore-jss/sitecore-jss
Version:
This module is provided as a part of Sitecore JavaScript Rendering SDK. It contains the core JSS APIs (layout service) and utilities.
99 lines (98 loc) • 4.48 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.personalizeLayout = personalizeLayout;
exports.personalizePlaceholder = personalizePlaceholder;
exports.personalizeComponent = personalizeComponent;
const constants_1 = require("../constants");
const models_1 = require("./../layout/models");
const transformToHiddenRenderingVariant = (component) => (Object.assign(Object.assign({}, component), { componentName: constants_1.HIDDEN_RENDERING_NAME, experiences: {} }));
/**
* Apply personalization to layout data. This will recursively go through all placeholders/components, check experiences nodes and replace default with object from specific experience.
* @param {LayoutServiceData} layout Layout data
* @param {string} variantId variant id
* @param {string[]} [componentVariantIds] component variant ids
*/
function personalizeLayout(layout, variantId, componentVariantIds) {
var _a;
// Add (page-level) variantId to Sitecore context so that it is accessible here
layout.sitecore.context.variantId = variantId;
const placeholders = ((_a = layout.sitecore.route) === null || _a === void 0 ? void 0 : _a.placeholders) || {};
if (Object.keys(placeholders).length === 0) {
return undefined;
}
const metadataEditing = layout.sitecore.context.pageEditing && layout.sitecore.context.editMode === models_1.EditMode.Metadata;
if (placeholders) {
Object.keys(placeholders).forEach((placeholder) => {
placeholders[placeholder] = personalizePlaceholder(placeholders[placeholder], [variantId, ...(componentVariantIds || [])], metadataEditing);
});
}
return placeholders;
}
/**
* @param {Array} components components within placeholder
* @param {string[]} variantIds variant ids
* @param {boolean} metadataEditing indicates if page is rendered in metadata edit mode
* @returns {Array<ComponentRendering | HtmlElementRendering>} components with personalization applied
*/
function personalizePlaceholder(components, variantIds, metadataEditing) {
return components
.map((component) => {
const rendering = component;
if (rendering.experiences !== undefined) {
return personalizeComponent(rendering, variantIds, metadataEditing);
}
else if (rendering.placeholders) {
const placeholders = rendering.placeholders;
Object.keys(placeholders).forEach((placeholder) => {
placeholders[placeholder] = personalizePlaceholder(placeholders[placeholder], variantIds, metadataEditing);
});
}
return component;
})
.filter(Boolean);
}
/**
* @param {ComponentRenderingWithExperiences} component component with experiences
* @param {string[]} variantIds variant ids
* @param {boolean} metadataEditing indicates if page is rendered in metadata edit mode
* @returns {ComponentRendering | null} component with personalization applied or null if hidden
*/
function personalizeComponent(component, variantIds, metadataEditing) {
// Check if we have a page/component experience matching any of the variants (there should be at most 1)
const match = Object.keys(component.experiences).find((variantId) => variantIds.includes(variantId));
const variant = match && component.experiences[match];
// variant and componentName can be undefined or null
if (!variant && !component.componentName) {
// DEFAULT IS HIDDEN
if (metadataEditing) {
component = transformToHiddenRenderingVariant(component);
}
else {
return null;
}
}
else if (variant && variant.componentName === null && variant.dataSource === null) {
// VARIANT IS HIDDEN
if (metadataEditing) {
component = transformToHiddenRenderingVariant(component);
}
else {
return null;
}
}
else if (variant) {
component = variant;
}
// remove unused experiences from layout data
if (component.experiences) {
component.experiences = {};
}
if (!component.placeholders)
return component;
Object.keys(component === null || component === void 0 ? void 0 : component.placeholders).forEach((placeholder) => {
if (component.placeholders) {
component.placeholders[placeholder] = personalizePlaceholder(component.placeholders[placeholder], variantIds);
}
});
return component;
}