| /** | |
| * @license | |
| * Copyright 2021 The Go Authors. All rights reserved. | |
| * Use of this source code is governed by a BSD-style | |
| * license that can be found in the LICENSE file. | |
| */ | |
| import { TreeNavController } from './tree.js'; | |
| export class SelectNavController { | |
| constructor(private el: Element) { | |
| this.el.addEventListener('change', e => { | |
| const target = e.target as HTMLSelectElement; | |
| let href = target.value; | |
| if (!target.value.startsWith('/')) { | |
| href = '/' + href; | |
| } | |
| window.location.href = href; | |
| }); | |
| } | |
| } | |
| export function makeSelectNav(tree: TreeNavController): HTMLLabelElement { | |
| const label = document.createElement('label'); | |
| label.classList.add('go-Label'); | |
| label.setAttribute('aria-label', 'Menu'); | |
| const select = document.createElement('select'); | |
| select.classList.add('go-Select', 'js-selectNav'); | |
| label.appendChild(select); | |
| const outline = document.createElement('optgroup'); | |
| outline.label = 'Outline'; | |
| select.appendChild(outline); | |
| const groupMap: Record<string, HTMLOptGroupElement> = {}; | |
| let group: HTMLOptGroupElement; | |
| for (const t of tree.treeitems) { | |
| if (Number(t.depth) > 4) continue; | |
| if (t.groupTreeitem) { | |
| group = groupMap[t.groupTreeitem.label]; | |
| if (!group) { | |
| group = groupMap[t.groupTreeitem.label] = document.createElement('optgroup'); | |
| group.label = t.groupTreeitem.label; | |
| select.appendChild(group); | |
| } | |
| } else { | |
| group = outline; | |
| } | |
| const o = document.createElement('option'); | |
| o.label = t.label; | |
| o.textContent = t.label; | |
| o.value = (t.el as HTMLAnchorElement).href.replace(window.location.origin, '').replace('/', ''); | |
| group.appendChild(o); | |
| } | |
| tree.addObserver(t => { | |
| const hash = (t.el as HTMLAnchorElement).hash; | |
| const value = select.querySelector<HTMLOptionElement>(`[value$="${hash}"]`)?.value; | |
| if (value) { | |
| select.value = value; | |
| } | |
| }, 50); | |
| return label; | |
| } |