content/frontend/default/default.js (89 lines of code) (raw):

/* global Vue */ import { getNextUntil } from '../shared/dom'; import { SITE_VERSION, isOnlineArchivedVersion } from '../services/fetch_versions'; import DocsBanner from '../shared/components/docs_banner.vue'; import NavigationToggle from './components/navigation_toggle.vue'; import { setupTableOfContents } from './setup_table_of_contents'; import VersionsMenu from './components/versions_menu.vue'; import TabsSection from './components/tabs_section.vue'; /* eslint-disable no-new */ document.addEventListener('DOMContentLoaded', async () => { setupTableOfContents(); /** * Banner components */ if (await isOnlineArchivedVersion(SITE_VERSION)) { document.body.classList.add('has-archive-banner'); // Create the link to the latest page by dropping the version number from the URL path. const latestURL = `https://docs.gitlab.com/${window.location.pathname.replace(`/${SITE_VERSION}/`, '')}`; new Vue({ el: document.querySelector('#js-version-banner'), components: { DocsBanner, }, render(createElement) { return createElement(DocsBanner, { props: { text: `This is <a href="https://docs.gitlab.com/archives">archived documentation</a> for GitLab. Go to <a href="${latestURL}">the latest</a>.`, isSticky: true, variant: 'tip', dismissible: false, }, }); }, }); } const surveyBanner = document.querySelector('#js-survey-banner'); new Vue({ el: surveyBanner, components: { DocsBanner, }, render(createElement) { return createElement(DocsBanner, { props: { text: surveyBanner.dataset.content, variant: 'info' }, }); }, }); /** * Navigation toggle component */ new Vue({ el: '#js-nav-toggle', components: { NavigationToggle, }, render(createElement) { return createElement(NavigationToggle, { props: { targetSelector: ['.nav-wrapper', '.main'], }, }); }, }); /** * Versions menu component */ new Vue({ el: '.js-versions-menu', components: { VersionsMenu, }, render(createElement) { return createElement(VersionsMenu); }, }); /** * Tabs component */ const tabsetSelector = '.js-tabs'; document.querySelectorAll(tabsetSelector).forEach((tabset) => { const tabTitles = []; const tabContents = []; tabset.querySelectorAll('.tab-title').forEach((tab) => { tabTitles.push(tab.innerText); tabContents.push(getNextUntil(tab, '.tab-title')); }); new Vue({ el: tabsetSelector, components: { TabsSection, }, render(createElement) { return createElement(TabsSection, { props: { tabTitles, tabContents, responsive: false, }, }); }, }); }); });