mirror of
https://github.com/vercel/commerce.git
synced 2025-05-18 23:46:58 +00:00
108 lines
3.0 KiB
JavaScript
108 lines
3.0 KiB
JavaScript
const renderHTML = (html) => {
|
|
if (!html) return { __html: "" };
|
|
return { __html: cleanHTML(html) };
|
|
}
|
|
|
|
const cleanHTML = (html) => {
|
|
if (!html) return ""
|
|
|
|
//fix '~' in links in HTML
|
|
return html.replace(/href="~\//gi, 'href="/')
|
|
}
|
|
|
|
const asyncForEach = async (array, callback) => {
|
|
for (let index = 0; index < array.length; index++) {
|
|
await callback(array[index], index, array);
|
|
}
|
|
}
|
|
|
|
|
|
const expandContentList = async ({ agility, contentItems, languageCode, depth }) => {
|
|
|
|
asyncForEach(contentItems, async (contentItem) => {
|
|
await expandContentItem({agility, contentItem, languageCode, depth})
|
|
})
|
|
|
|
}
|
|
|
|
const expandContentItem = async ({ agility, contentItem, languageCode, depth = 1 }) => {
|
|
if (!contentItem) return null;
|
|
|
|
|
|
|
|
const api = agility;
|
|
|
|
if (depth > 0) {
|
|
//make this work for the .fields or the .customFields property...
|
|
let fields = contentItem.fields;
|
|
if (!fields) fields = contentItem.customFields;
|
|
|
|
for (const fieldName in fields) {
|
|
const fieldValue = fields[fieldName];
|
|
|
|
if (fieldValue.contentid > 0) {
|
|
//single linked item
|
|
const childItem = await api.getContentItem({ contentID: fieldValue.contentid, languageCode, depth: depth - 1 });
|
|
if (childItem != null) fields[fieldName] = childItem;
|
|
} else if (fieldValue.sortids && fieldValue.sortids.split) {
|
|
//multi linked item
|
|
const sortIDAry = fieldValue.sortids.split(',');
|
|
const childItems = [];
|
|
for (const childItemID of sortIDAry) {
|
|
const childItem = await api.getContentItem({ contentID: childItemID, languageCode, depth: depth - 1 });
|
|
if (childItem != null) childItems.push(childItem);
|
|
}
|
|
fields[fieldName] = childItems;
|
|
}
|
|
}
|
|
}
|
|
return contentItem;
|
|
}
|
|
|
|
const expandLinkedList = async ({ agility, contentItem, languageCode, fieldName, sortIDField }) => {
|
|
if (!contentItem) return null;
|
|
|
|
let fieldObj = contentItem.fields[fieldName]
|
|
if (! fieldObj) throw Error(`The field ${fieldName} was not found on the content item.`)
|
|
|
|
const referenceName = fieldObj.referencename
|
|
if (! referenceName) throw Error(`A referencename property was not found on the ${fieldName} value.`)
|
|
|
|
//grab the content list...
|
|
let listItems = await agility.getContentList({referenceName, languageCode})
|
|
if (listItems?.length > 0) {
|
|
let sortIDs = contentItem.fields[sortIDField]
|
|
if (sortIDs?.length > 0 && sortIDs?.split) {
|
|
//if we have sort ids, assemble the values in the list based on those...
|
|
const sortIDAry = sortIDs.split(',');
|
|
const sortedItems = [];
|
|
for (const idStr of sortIDAry) {
|
|
const childContentID = parseInt(idStr)
|
|
|
|
const childItemIndex = listItems.findIndex(item => item.contentID === childContentID)
|
|
if (childItemIndex >= 0) {
|
|
sortedItems.push(listItems[childItemIndex]);
|
|
listItems.splice(childItemIndex, 1)
|
|
|
|
}
|
|
}
|
|
|
|
listItems = sortedItems.concat(listItems)
|
|
}
|
|
}
|
|
|
|
contentItem.fields[fieldName] = listItems;
|
|
return contentItem;
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = {
|
|
renderHTML,
|
|
cleanHTML,
|
|
asyncForEach,
|
|
expandContentItem,
|
|
expandContentList,
|
|
expandLinkedList
|
|
} |