| /*! |
| * @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. |
| */ |
| |
| /** |
| * VersionsController encapsulates event listeners and UI updates |
| * for the versions page. As the the expandable sections containing |
| * the symbol history for a package are opened and closed it toggles |
| * visiblity of the buttons to expand or collapse them. On page load |
| * it adds an indicator to the version that matches the version request |
| * by the user for the page or the canonical url path. |
| */ |
| class VersionsController { |
| private expand = document.querySelector<HTMLButtonElement>('.js-versionsExpand'); |
| private collapse = document.querySelector<HTMLButtonElement>('.js-versionsCollapse'); |
| private details = [...document.querySelectorAll<HTMLDetailsElement>('.js-versionDetails')]; |
| |
| constructor() { |
| if (!this.expand?.parentElement) return; |
| if (this.details.some(d => d.tagName === 'DETAILS')) { |
| this.expand.parentElement.style.display = 'block'; |
| } |
| |
| for (const d of this.details) { |
| d.addEventListener('click', () => { |
| this.updateButtons(); |
| }); |
| } |
| |
| this.expand?.addEventListener('click', () => { |
| this.details.map(d => (d.open = true)); |
| this.updateButtons(); |
| }); |
| |
| this.collapse?.addEventListener('click', () => { |
| this.details.map(d => (d.open = false)); |
| this.updateButtons(); |
| }); |
| |
| this.updateButtons(); |
| this.setCurrent(); |
| } |
| |
| /** |
| * setCurrent applies the active style to the version dot |
| * for the version that matches the canonical URL path. |
| */ |
| private setCurrent() { |
| const canonicalPath = document.querySelector<HTMLElement>('.js-canonicalURLPath')?.dataset |
| ?.canonicalUrlPath; |
| const versionLink = document.querySelector<HTMLElement>( |
| `.js-versionLink[href="${canonicalPath}"]` |
| ); |
| if (versionLink) { |
| versionLink.style.fontWeight = 'bold'; |
| } |
| } |
| |
| private updateButtons() { |
| setTimeout(() => { |
| if (!this.expand || !this.collapse) return; |
| let someOpen, someClosed; |
| for (const d of this.details) { |
| someOpen = someOpen || d.open; |
| someClosed = someClosed || !d.open; |
| } |
| this.expand.style.display = someClosed ? 'inline-block' : 'none'; |
| this.collapse.style.display = someClosed ? 'none' : 'inline-block'; |
| }); |
| } |
| } |
| |
| new VersionsController(); |