Path: blob/main/src/format/dashboard/format-dashboard-navbutton.ts
6451 views
/*1* format-dashboard-navbutton.ts2*3* Copyright (C) 2020-2022 Posit Software, PBC4*/56import { Document } from "../../core/deno-dom.ts";7import {8DashboardMeta,9kNavButtons,10makeEl,11} from "./format-dashboard-shared.ts";1213export function processNavButtons(doc: Document, dashboardMeta: DashboardMeta) {14const buttons = dashboardMeta[kNavButtons];1516// Don't bother if there are no butons17if (buttons === undefined || buttons.length === 0) {18return;19}2021// Find the navbar, which will be using to make navigation22const navbarEl = doc.querySelector(".navbar");23if (!navbarEl) {24throw new Error(25"Expected a navbar in the dashboard output since pages are specified.",26);27}2829// The target container30const navbarContainerEl = navbarEl.querySelector(".navbar-container");31if (!navbarContainerEl) {32throw new Error(33"Expected the navbar to have a container marked with `.navbar-container`.",34);35}3637const containerEl = makeEl(38"DIV",39{ classes: ["quarto-dashboard-links"] },40doc,41);42buttons.forEach((btn) => {43const linkAttr: Record<string, string> = {44href: btn.href,45};46if (btn.rel) {47linkAttr.rel = btn.rel;48}49if (btn.title) {50linkAttr.title = btn.title;51}52if (btn.target) {53linkAttr.target = btn.target;54}5556if (btn["aria-label"]) {57linkAttr["aria-label"] = btn["aria-label"];58}5960const linkEl = makeEl("A", {61classes: ["quarto-dashboard-link"],62attributes: linkAttr,63}, doc);6465if (btn.icon) {66const iconEl = makeEl("I", { classes: ["bi", `bi-${btn.icon}`] }, doc);67linkEl.appendChild(iconEl);68}6970if (btn.text) {71const textEl = makeEl(72"SPAN",73{ classes: ["quarto-dashboard-link-text"] },74doc,75);76textEl.innerText = btn.text;77linkEl.appendChild(textEl);78}79containerEl.appendChild(linkEl);80});8182// See if we can place this in the `collapse` region83const navbarCollapseEl = navbarEl.querySelector(`.navbar-collapse`);84if (navbarCollapseEl) {85navbarCollapseEl.appendChild(containerEl);86} else {87navbarContainerEl.appendChild(containerEl);88}89}909192