2023-05-10 18:50:58 +03:00
import $ from 'jquery' ;
2023-12-15 02:26:36 +03:00
import { isElemHidden , onInputDebounce , submitEventSubmitter , toggleElem } from '../utils/dom.js' ;
2023-09-19 03:50:30 +03:00
import { GET } from '../modules/fetch.js' ;
2023-05-10 18:50:58 +03:00
2023-09-19 03:50:30 +03:00
const { appSubUrl } = window . config ;
2023-05-10 18:50:58 +03:00
const reIssueIndex = /^(\d+)$/ ; // eg: "123"
const reIssueSharpIndex = /^#(\d+)$/ ; // eg: "#123"
const reIssueOwnerRepoIndex = /^([-.\w]+)\/([-.\w]+)#(\d+)$/ ; // eg: "{owner}/{repo}#{index}"
// if the searchText can be parsed to an "issue goto link", return the link, otherwise return empty string
export function parseIssueListQuickGotoLink ( repoLink , searchText ) {
searchText = searchText . trim ( ) ;
let targetUrl = '' ;
if ( repoLink ) {
// try to parse it in current repo
if ( reIssueIndex . test ( searchText ) ) {
targetUrl = ` ${ repoLink } /issues/ ${ searchText } ` ;
} else if ( reIssueSharpIndex . test ( searchText ) ) {
targetUrl = ` ${ repoLink } /issues/ ${ searchText . substr ( 1 ) } ` ;
}
} else {
// try to parse it for a global search (eg: "owner/repo#123")
const matchIssueOwnerRepoIndex = searchText . match ( reIssueOwnerRepoIndex ) ;
if ( matchIssueOwnerRepoIndex ) {
const [ _ , owner , repo , index ] = matchIssueOwnerRepoIndex ;
targetUrl = ` ${ appSubUrl } / ${ owner } / ${ repo } /issues/ ${ index } ` ;
}
}
return targetUrl ;
}
export function initCommonIssueListQuickGoto ( ) {
const $goto = $ ( '#issue-list-quick-goto' ) ;
if ( ! $goto . length ) return ;
const $form = $goto . closest ( 'form' ) ;
const $input = $form . find ( 'input[name=q]' ) ;
const repoLink = $goto . attr ( 'data-repo-link' ) ;
$form . on ( 'submit' , ( e ) => {
// if there is no goto button, or the form is submitted by non-quick-goto elements, submit the form directly
let doQuickGoto = ! isElemHidden ( $goto ) ;
2023-12-15 02:26:36 +03:00
const submitter = submitEventSubmitter ( e . originalEvent ) ;
2023-05-10 18:50:58 +03:00
if ( submitter !== $form [ 0 ] && submitter !== $input [ 0 ] && submitter !== $goto [ 0 ] ) doQuickGoto = false ;
if ( ! doQuickGoto ) return ;
// if there is a goto button, use its link
e . preventDefault ( ) ;
window . location . href = $goto . attr ( 'data-issue-goto-link' ) ;
} ) ;
const onInput = async ( ) => {
const searchText = $input . val ( ) ;
// try to check whether the parsed goto link is valid
let targetUrl = parseIssueListQuickGotoLink ( repoLink , searchText ) ;
if ( targetUrl ) {
2023-09-19 03:50:30 +03:00
const res = await GET ( ` ${ targetUrl } /info ` ) ;
2023-05-10 18:50:58 +03:00
if ( res . status !== 200 ) targetUrl = '' ;
}
// if the input value has changed, then ignore the result
if ( $input . val ( ) !== searchText ) return ;
toggleElem ( $goto , Boolean ( targetUrl ) ) ;
$goto . attr ( 'data-issue-goto-link' , targetUrl ) ;
} ;
$input . on ( 'input' , onInputDebounce ( onInput ) ) ;
onInput ( ) ;
}