2022-01-29 00:00:11 +03:00
import $ from 'jquery' ;
2023-09-10 13:27:23 +03:00
import { hideElem , showElem } from '../utils/dom.js' ;
2024-02-25 19:53:44 +03:00
import { POST } from '../modules/fetch.js' ;
2022-01-29 00:00:11 +03:00
2024-02-25 19:53:44 +03:00
async function getArchive ( $target , url , first ) {
try {
const response = await POST ( url ) ;
if ( response . status === 200 ) {
const data = await response . json ( ) ;
if ( ! data ) {
// XXX Shouldn't happen?
$target . closest ( '.dropdown' ) . children ( 'i' ) . removeClass ( 'loading' ) ;
return ;
}
2021-10-16 20:28:04 +03:00
2024-02-25 19:53:44 +03:00
if ( ! data . complete ) {
$target . closest ( '.dropdown' ) . children ( 'i' ) . addClass ( 'loading' ) ;
// Wait for only three quarters of a second initially, in case it's
// quickly archived.
setTimeout ( ( ) => {
getArchive ( $target , url , false ) ;
} , first ? 750 : 2000 ) ;
} else {
// We don't need to continue checking.
$target . closest ( '.dropdown' ) . children ( 'i' ) . removeClass ( 'loading' ) ;
window . location . href = url ;
2021-10-16 20:28:04 +03:00
}
2024-02-25 19:53:44 +03:00
}
} catch {
$target . closest ( '.dropdown' ) . children ( 'i' ) . removeClass ( 'loading' ) ;
}
2021-10-16 20:28:04 +03:00
}
export function initRepoArchiveLinks ( ) {
$ ( '.archive-link' ) . on ( 'click' , function ( event ) {
event . preventDefault ( ) ;
2021-11-29 16:50:43 +03:00
const url = $ ( this ) . attr ( 'href' ) ;
2021-10-16 20:28:04 +03:00
if ( ! url ) return ;
getArchive ( $ ( event . target ) , url , true ) ;
} ) ;
}
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 ) ;
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 ) {
2022-06-04 19:02:10 +03:00
if ( $choice . attr ( 'data-url' ) ) {
window . location . href = $choice . attr ( 'data-url' ) ;
2021-10-16 20:28:04 +03:00
}
} ,
2022-06-04 19:02:10 +03:00
message : { noResults : $dropdown . attr ( 'data-no-results' ) } ,
2021-10-16 20:28:04 +03:00
} ) ;
}