| /** |
| * @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; |
| } |