UNPKG

kentico-cloud-delivery

Version:

Official Kentico Cloud Delivery SDK

200 lines 9.79 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var elements_1 = require("../elements"); var RichTextResolver = /** @class */ (function () { function RichTextResolver() { } /** * Resolves linked items inside the Rich text element. * Rich text resolved needs to be configured either on the model or query level */ RichTextResolver.prototype.resolveData = function (contentItemCodename, html, elementName, data) { var _this = this; // prepare config var config = { enableAdvancedLogging: data.enableAdvancedLogging, queryConfig: data.queryConfig, linkedItemWrapperTag: data.linkedItemWrapperTag, linkedItemWrapperClasses: data.linkedItemWrapperClasses }; var result = data.richTextHtmlParser.resolveRichTextElement('root', contentItemCodename, html, elementName, { getUrlSlugResult: function (itemId, linkText) { return _this.getUrlSlugResult({ config: config, links: data.links, itemId: itemId, getLinkedItem: data.getLinkedItem, linkText: linkText }); }, getLinkedItemHtml: function (itemCodename, itemType) { return _this.getLinkedItemHtml({ itemCodename: itemCodename, config: config, getLinkedItem: data.getLinkedItem, itemType: itemType }); }, getImageResult: function (resolverContext, itemCodename, imageId, xElementName) { return _this.getImageResult({ resolverContext: resolverContext, getLinkedItem: data.getLinkedItem, itemCodename: itemCodename, config: config, imageId: imageId, images: data.images, html: html, elementName: xElementName }); } }, { enableAdvancedLogging: data.enableAdvancedLogging, queryConfig: data.queryConfig, linkedItemWrapperTag: data.linkedItemWrapperTag, linkedItemWrapperClasses: data.linkedItemWrapperClasses }); return { html: result.resolvedHtml, componentCodenames: result.linkedItems.filter(function (m) { return m.itemType === 'component'; }).map(function (m) { return m.dataCodename; }), linkedItemCodenames: result.linkedItems.filter(function (m) { return m.itemType === 'linkedItem'; }).map(function (m) { return m.dataCodename; }) }; }; RichTextResolver.prototype.getImageResult = function (data) { // get linked item var linkedItem = data.getLinkedItem(data.itemCodename); if (!linkedItem) { if (data.config.queryConfig.throwErrorForMissingLinkedItems) { throw Error("Linked item with codename '" + data.itemCodename + "' was not found when resolving image with id '" + data.imageId + "'"); } if (data.config.enableAdvancedLogging) { console.warn("Cannot resolve image with id '" + data.imageId + "' because linked item with codename '" + data.itemCodename + "' is not available. Empty image URL is returned."); } return { url: '' }; } // if image is resolved within nested linked item (e.g. rich text element resolves html of linked item which contains images) // the element name is equal to the 'root' element on which the html is resolved. For this reason we have to go through all // elements in linked item and find the image there. var image; if (data.resolverContext === 'nested') { image = this.tryGetImageFromLinkedItem(data.imageId, linkedItem); } else { var richTextElement = linkedItem[data.elementName]; if (!(richTextElement instanceof elements_1.Elements.RichTextElement)) { throw Error("Linked item with codename '" + data.itemCodename + "' has invalid element '" + data.elementName + "'. This element is required to be of RichText type."); } image = richTextElement.images.find(function (m) { return m.imageId === data.imageId; }); } if (!image) { throw Error("Image with id '" + data.imageId + "' was not found in images data for linked item '" + data.itemCodename + "' and element '" + data.elementName + "'"); } // use custom resolver if present if (data.config.queryConfig.richTextImageResolver) { return data.config.queryConfig.richTextImageResolver(image, data.elementName); } // use default resolver return { url: image.url }; }; RichTextResolver.prototype.tryGetImageFromLinkedItem = function (imageId, contentItem) { for (var _i = 0, _a = Object.keys(contentItem); _i < _a.length; _i++) { var propName = _a[_i]; var prop = contentItem[propName]; if (prop instanceof elements_1.Elements.RichTextElement) { var image = prop.images.find(function (m) { return m.imageId === imageId; }); if (image) { return image; } } } return undefined; }; RichTextResolver.prototype.getLinkedItemHtml = function (data) { // get linked item var linkedItem = data.getLinkedItem(data.itemCodename); // resolving cannot be done if the item is not present in response if (!linkedItem) { if (data.config.queryConfig.throwErrorForMissingLinkedItems) { throw Error("Linked item with codename '" + data.itemCodename + "' could not be found in response and therefore the HTML of rich text element could not be evaluated. Increasing 'depth' parameter of your query may solve this issue."); } if (data.config.enableAdvancedLogging) { console.warn("Cannot resolve linked item '" + data.itemCodename + "' because it is not available in response. Increasing 'depth' parameter of query may help. Item is resolved to empty string."); } return ''; } // get html to replace object using Rich text resolver function var resolver = undefined; if (data.config.queryConfig.richTextResolver) { // use resolved defined by query if available resolver = data.config.queryConfig.richTextResolver; } else { // use default resolver defined in models if (linkedItem._config && linkedItem._config.richTextResolver) { resolver = linkedItem._config.richTextResolver; } } // check resolver if (!resolver) { if (data.config.enableAdvancedLogging) { console.warn("Cannot resolve html of '" + linkedItem.system.type + "' used by item '" + data.itemCodename + "' type in 'RichTextElement' because no rich text resolver was configured. Item is resolved to empty string."); return ''; } return ''; } return resolver(linkedItem, { contentType: data.itemType }); }; RichTextResolver.prototype.getUrlSlugResult = function (data) { // find link with the id of content item var existingLink = data.links.find(function (m) { return m.linkId === data.itemId; }); if (!existingLink) { if (data.config.enableAdvancedLogging) { console.warn("Cannot resolve URL for item '" + data.itemId + "' because no link with this id was found."); } return { html: '', url: '' }; } var linkedItem = data.getLinkedItem(existingLink.codename); // prepare link context var linkContext = { linkText: data.linkText, item: linkedItem, linkId: data.itemId }; // try to resolve link using the resolver passed through the query config var queryUrlSlugResolver = data.config.queryConfig.urlSlugResolver; if (queryUrlSlugResolver) { // resolve url using query config var queryUrlSlugResult = queryUrlSlugResolver(existingLink, linkContext); if (queryUrlSlugResult) { return queryUrlSlugResult; } } // url was not resolved, try using global link resolver for item if (linkedItem && linkedItem._config && linkedItem._config.urlSlugResolver) { var globalUrlSlugResult = linkedItem._config.urlSlugResolver(existingLink, linkContext); if (globalUrlSlugResult) { return globalUrlSlugResult; } } // url wasn't resolved if (data.config.enableAdvancedLogging) { console.warn("Url for item of '" + existingLink.type + "' type with id '" + existingLink.linkId + "' wasn't resolved. This might be caused by missing 'urlSlugResolver' for given type."); } return { html: '', url: '' }; }; return RichTextResolver; }()); exports.RichTextResolver = RichTextResolver; exports.richTextResolver = new RichTextResolver(); //# sourceMappingURL=rich-text.resolver.js.map