import $ from 'jquery'; import {hideElem, queryElems, showElem} from '../utils/dom.ts'; import {POST} from '../modules/fetch.ts'; import {showErrorToast} from '../modules/toast.ts'; import {sleep} from '../utils.ts'; import RepoActivityTopAuthors from '../components/RepoActivityTopAuthors.vue'; import {createApp} from 'vue'; async function onDownloadArchive(e) { e.preventDefault(); // there are many places using the "archive-link", eg: the dropdown on the repo code page, the release list const el = e.target.closest('a.archive-link[href]'); const targetLoading = el.closest('.ui.dropdown') ?? el; targetLoading.classList.add('is-loading', 'loading-icon-2px'); try { for (let tryCount = 0; ;tryCount++) { const response = await POST(el.href); if (!response.ok) throw new Error(`Invalid server response: ${response.status}`); const data = await response.json(); if (data.complete) break; await sleep(Math.min((tryCount + 1) * 750, 2000)); } window.location.href = el.href; // the archive is ready, start real downloading } catch (e) { console.error(e); showErrorToast(`Failed to download the archive: ${e}`, {duration: 2500}); } finally { targetLoading.classList.remove('is-loading', 'loading-icon-2px'); } } export function initRepoArchiveLinks() { queryElems(document, 'a.archive-link[href]', (el) => el.addEventListener('click', onDownloadArchive)); } export function initRepoActivityTopAuthorsChart() { const el = document.querySelector('#repo-activity-top-authors-chart'); if (el) { createApp(RepoActivityTopAuthors).mount(el); } } export function initRepoCloneLink() { const $repoCloneSsh = $('#repo-clone-ssh'); const $repoCloneHttps = $('#repo-clone-https'); const $inputLink = $('#repo-clone-url'); if ((!$repoCloneSsh.length && !$repoCloneHttps.length) || !$inputLink.length) { return; } $repoCloneSsh.on('click', () => { localStorage.setItem('repo-clone-protocol', 'ssh'); window.updateCloneStates(); }); $repoCloneHttps.on('click', () => { localStorage.setItem('repo-clone-protocol', 'https'); window.updateCloneStates(); }); $inputLink.on('focus', () => { $inputLink.trigger('select'); }); } export function initRepoCommonBranchOrTagDropdown(selector) { $(selector).each(function () { const $dropdown = $(this); $dropdown.find('.reference.column').on('click', function () { hideElem($dropdown.find('.scrolling.reference-list-menu')); showElem($($(this).data('target'))); return false; }); }); } export function initRepoCommonFilterSearchDropdown(selector) { const $dropdown = $(selector); if (!$dropdown.length) return; $dropdown.dropdown({ fullTextSearch: 'exact', selectOnKeydown: false, onChange(_text, _value, $choice) { if ($choice[0].getAttribute('data-url')) { window.location.href = $choice[0].getAttribute('data-url'); } }, message: {noResults: $dropdown[0].getAttribute('data-no-results')}, }); } export async function updateIssuesMeta(url, action, issue_ids, id) { try { const response = await POST(url, {data: new URLSearchParams({action, issue_ids, id})}); if (!response.ok) { throw new Error('Failed to update issues meta'); } } catch (error) { console.error(error); } }