kentico-cloud-delivery
Version:
Official Kentico Cloud Delivery SDK
200 lines • 9.79 kB
JavaScript
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
;