2022-01-29 00:00:11 +03:00
import $ from 'jquery' ;
2024-04-18 19:45:50 +03:00
import { hideElem , queryElems , showElem } from '../utils/dom.js' ;
2024-02-25 19:53:44 +03:00
import { POST } from '../modules/fetch.js' ;
2024-04-18 19:45:50 +03:00
import { showErrorToast } from '../modules/toast.js' ;
import { sleep } from '../utils.js' ;
2022-01-29 00:00:11 +03:00
2024-04-18 19:45:50 +03:00
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' ) ;
2024-02-25 19:53:44 +03:00
try {
2024-04-18 19:45:50 +03:00
for ( let tryCount = 0 ; ; tryCount ++ ) {
const response = await POST ( el . href ) ;
if ( ! response . ok ) throw new Error ( ` Invalid server response: ${ response . status } ` ) ;
2021-10-16 20:28:04 +03:00
2024-04-18 19:45:50 +03:00
const data = await response . json ( ) ;
if ( data . complete ) break ;
await sleep ( Math . min ( ( tryCount + 1 ) * 750 , 2000 ) ) ;
2024-02-25 19:53:44 +03:00
}
2024-04-18 19:45:50 +03:00
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' ) ;
2024-02-25 19:53:44 +03:00
}
2021-10-16 20:28:04 +03:00
}
export function initRepoArchiveLinks ( ) {
2024-04-18 19:45:50 +03:00
queryElems ( 'a.archive-link[href]' , ( el ) => el . addEventListener ( 'click' , onDownloadArchive ) ) ;
2021-10-16 20:28:04 +03:00
}
2022-03-29 06:21:30 +03:00
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' , ( ) => {
2021-10-16 20:28:04 +03:00
localStorage . setItem ( 'repo-clone-protocol' , 'ssh' ) ;
2022-07-31 21:29:55 +03:00
window . updateCloneStates ( ) ;
2021-10-16 20:28:04 +03:00
} ) ;
2022-03-29 06:21:30 +03:00
$repoCloneHttps . on ( 'click' , ( ) => {
localStorage . setItem ( 'repo-clone-protocol' , 'https' ) ;
2022-07-31 21:29:55 +03:00
window . updateCloneStates ( ) ;
2021-10-16 20:28:04 +03:00
} ) ;
2022-03-29 06:21:30 +03:00
2022-08-08 02:15:11 +03:00
$inputLink . on ( 'focus' , ( ) => {
2023-04-20 12:28:27 +03:00
$inputLink . trigger ( 'select' ) ;
2021-10-16 20:28:04 +03:00
} ) ;
}
export function initRepoCommonBranchOrTagDropdown ( selector ) {
2022-01-16 14:19:26 +03:00
$ ( selector ) . each ( function ( ) {
2021-10-16 20:28:04 +03:00
const $dropdown = $ ( this ) ;
$dropdown . find ( '.reference.column' ) . on ( 'click' , function ( ) {
2023-02-19 07:06:14 +03:00
hideElem ( $dropdown . find ( '.scrolling.reference-list-menu' ) ) ;
showElem ( $ ( $ ( this ) . data ( 'target' ) ) ) ;
2021-10-16 20:28:04 +03:00
return false ;
} ) ;
} ) ;
}
export function initRepoCommonFilterSearchDropdown ( selector ) {
2022-01-16 14:19:26 +03:00
const $dropdown = $ ( selector ) ;
2024-03-21 13:16:11 +03:00
if ( ! $dropdown . length ) return ;
2021-10-16 20:28:04 +03:00
$dropdown . dropdown ( {
2022-06-04 19:02:10 +03:00
fullTextSearch : 'exact' ,
2021-10-16 20:28:04 +03:00
selectOnKeydown : false ,
onChange ( _text , _value , $choice ) {
2024-03-20 03:04:24 +03:00
if ( $choice [ 0 ] . getAttribute ( 'data-url' ) ) {
window . location . href = $choice [ 0 ] . getAttribute ( 'data-url' ) ;
2021-10-16 20:28:04 +03:00
}
} ,
2024-03-20 03:04:24 +03:00
message : { noResults : $dropdown [ 0 ] . getAttribute ( 'data-no-results' ) } ,
2021-10-16 20:28:04 +03:00
} ) ;
}