content/frontend/default/components/versions_menu.vue (85 lines of code) (raw):

<script> import { GlDropdown, GlDropdownItem, GlDropdownDivider } from '@gitlab/ui'; import { getVersions, getArchivesVersions } from '../../services/fetch_versions'; import { isProduction } from '../environment'; export default { components: { GlDropdown, GlDropdownItem, GlDropdownDivider, }, data() { return { versions: {}, archiveVersions: [], activeVersion: '', }; }, computed: { // Do not render this menu on pages that aren't version-specific. showMenu() { const excludePaths = ['/archives/']; return !excludePaths.includes(window.location.pathname); }, }, async created() { // Only fetch version lists for the production site, which includes the pre-release and latest stable versions. // Archives and self-hosted docs will only include one version, so they don't need this. if (isProduction()) { try { this.versions = await getVersions(); this.archiveVersions = await getArchivesVersions(); } catch (err) { console.error(`Failed to fetch versions.json: ${err}`); // eslint-disable-line no-console } } this.activeVersion = document.querySelector('meta[name="gitlab-docs-version"]').content; }, methods: { getVersionPath(versionNumber) { let path = window.location.pathname; // If we're viewing an older version, drop its version prefix when creating links. if (this.activeVersion !== this.versions.next) { const pathArr = window.location.pathname.split('/').filter((n) => n); pathArr.shift(); path = `/${pathArr.join('/')}`; } if (versionNumber) { path = `/${versionNumber}${path}`; } // If this is one of the older major releases, point to the Archives site. if (this.archiveVersions.includes(versionNumber)) { path = `https://archives.docs.gitlab.com${path}`; } return path; }, }, }; </script> <template> <gl-dropdown v-if="showMenu && activeVersion" :text="`v${activeVersion}`" class="gl-mb-4 gl-md-mb-0 gl-md-mr-5 gl-md-ml-3 gl-display-flex" data-testid="versions-menu" > <template v-if="versions.next"> <gl-dropdown-item :href="getVersionPath()"> <span data-testid="next-version">{{ versions.next }}</span> (not yet released) </gl-dropdown-item> <gl-dropdown-divider /> <gl-dropdown-item :href="getVersionPath(versions.current)" data-testid="versions-current"> {{ versions.current }} (recently released) </gl-dropdown-item> <gl-dropdown-item v-for="v in versions.last_minor" :key="v" :href="getVersionPath(v)"> {{ v }} </gl-dropdown-item> <gl-dropdown-divider /> <gl-dropdown-item v-for="v in versions.last_major" :key="v" :href="getVersionPath(v)"> {{ v }} </gl-dropdown-item> <gl-dropdown-divider /> </template> <gl-dropdown-item href="https://docs.gitlab.com/archives">Archives</gl-dropdown-item> </gl-dropdown> </template>