Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quarto-dev
GitHub Repository: quarto-dev/quarto-cli
Path: blob/main/src/format/dashboard/format-dashboard-navbutton.ts
6451 views
1
/*
2
* format-dashboard-navbutton.ts
3
*
4
* Copyright (C) 2020-2022 Posit Software, PBC
5
*/
6
7
import { Document } from "../../core/deno-dom.ts";
8
import {
9
DashboardMeta,
10
kNavButtons,
11
makeEl,
12
} from "./format-dashboard-shared.ts";
13
14
export function processNavButtons(doc: Document, dashboardMeta: DashboardMeta) {
15
const buttons = dashboardMeta[kNavButtons];
16
17
// Don't bother if there are no butons
18
if (buttons === undefined || buttons.length === 0) {
19
return;
20
}
21
22
// Find the navbar, which will be using to make navigation
23
const navbarEl = doc.querySelector(".navbar");
24
if (!navbarEl) {
25
throw new Error(
26
"Expected a navbar in the dashboard output since pages are specified.",
27
);
28
}
29
30
// The target container
31
const navbarContainerEl = navbarEl.querySelector(".navbar-container");
32
if (!navbarContainerEl) {
33
throw new Error(
34
"Expected the navbar to have a container marked with `.navbar-container`.",
35
);
36
}
37
38
const containerEl = makeEl(
39
"DIV",
40
{ classes: ["quarto-dashboard-links"] },
41
doc,
42
);
43
buttons.forEach((btn) => {
44
const linkAttr: Record<string, string> = {
45
href: btn.href,
46
};
47
if (btn.rel) {
48
linkAttr.rel = btn.rel;
49
}
50
if (btn.title) {
51
linkAttr.title = btn.title;
52
}
53
if (btn.target) {
54
linkAttr.target = btn.target;
55
}
56
57
if (btn["aria-label"]) {
58
linkAttr["aria-label"] = btn["aria-label"];
59
}
60
61
const linkEl = makeEl("A", {
62
classes: ["quarto-dashboard-link"],
63
attributes: linkAttr,
64
}, doc);
65
66
if (btn.icon) {
67
const iconEl = makeEl("I", { classes: ["bi", `bi-${btn.icon}`] }, doc);
68
linkEl.appendChild(iconEl);
69
}
70
71
if (btn.text) {
72
const textEl = makeEl(
73
"SPAN",
74
{ classes: ["quarto-dashboard-link-text"] },
75
doc,
76
);
77
textEl.innerText = btn.text;
78
linkEl.appendChild(textEl);
79
}
80
containerEl.appendChild(linkEl);
81
});
82
83
// See if we can place this in the `collapse` region
84
const navbarCollapseEl = navbarEl.querySelector(`.navbar-collapse`);
85
if (navbarCollapseEl) {
86
navbarCollapseEl.appendChild(containerEl);
87
} else {
88
navbarContainerEl.appendChild(containerEl);
89
}
90
}
91
92