feat(admin): add visibility controls and link modes
This commit is contained in:
@@ -68,6 +68,55 @@ function applySharedDemoRequest(model) {
|
||||
}
|
||||
}
|
||||
|
||||
const LINK_WINDOW_TARGETS = new Set(["_blank", "_self", "_parent", "_top"]);
|
||||
|
||||
function isWindowTarget(value) {
|
||||
return LINK_WINDOW_TARGETS.has(String(value || "").trim());
|
||||
}
|
||||
|
||||
function isExternalHref(value) {
|
||||
return /^(https?:)?\/\//i.test(String(value || "")) || /^(mailto:|tel:)/i.test(String(value || ""));
|
||||
}
|
||||
|
||||
function normalizeLinkForRender(item) {
|
||||
if (!item || typeof item !== "object") return;
|
||||
|
||||
let href = item.href ?? "";
|
||||
let target = item.target ?? "";
|
||||
let linkTarget = item.linkTarget ?? "";
|
||||
|
||||
if (isWindowTarget(target)) {
|
||||
linkTarget ||= target;
|
||||
target = "";
|
||||
}
|
||||
|
||||
const mode = item.linkMode === "href" || item.linkMode === "target" ? item.linkMode : isExternalHref(href) ? "href" : "target";
|
||||
|
||||
if (mode === "target" && !target && href && !isExternalHref(href)) {
|
||||
target = href;
|
||||
href = "";
|
||||
}
|
||||
|
||||
const primaryHref = mode === "href" ? href : target;
|
||||
const fallbackHref = mode === "href" ? target : href;
|
||||
item.resolvedHref = primaryHref || fallbackHref || "#";
|
||||
item.resolvedTarget = mode === "href" ? linkTarget : "";
|
||||
}
|
||||
|
||||
function applyRenderableLinks(model) {
|
||||
const staticLinks = model.staticElements?.content?.navigation?.links;
|
||||
if (Array.isArray(staticLinks)) {
|
||||
staticLinks.forEach(normalizeLinkForRender);
|
||||
}
|
||||
|
||||
for (const block of allBlocks(model)) {
|
||||
const footer = block.content?.footer;
|
||||
if (!footer) continue;
|
||||
if (Array.isArray(footer.navLinks)) footer.navLinks.forEach(normalizeLinkForRender);
|
||||
if (Array.isArray(footer.contactLinks)) footer.contactLinks.forEach(normalizeLinkForRender);
|
||||
}
|
||||
}
|
||||
|
||||
function escapeHtml(value) {
|
||||
return String(value)
|
||||
.replaceAll("&", "&")
|
||||
@@ -232,6 +281,7 @@ async function renderSections() {
|
||||
}
|
||||
|
||||
applySharedDemoRequest(page);
|
||||
applyRenderableLinks(page);
|
||||
|
||||
let output = renderTemplate(shell, { id: page.slug, ...page });
|
||||
|
||||
|
||||
Reference in New Issue
Block a user