2022-01-29 02:30:11 +05:30
import $ from 'jquery' ;
2023-05-17 13:41:13 +05:30
import { minimatch } from 'minimatch' ;
2021-10-16 22:58:04 +05:30
import { createMonaco } from './codeeditor.js' ;
2023-05-17 13:41:13 +05:30
import { onInputDebounce , toggleElem } from '../utils/dom.js' ;
2024-02-25 04:38:51 +05:30
import { POST } from '../modules/fetch.js' ;
2021-10-16 22:58:04 +05:30
2021-10-21 13:07:43 +05:30
const { appSubUrl , csrfToken } = window . config ;
2021-10-16 22:58:04 +05:30
export function initRepoSettingsCollaboration ( ) {
// Change collaborator access mode
2024-03-23 17:58:53 +05:30
$ ( '.page-content.repository .ui.dropdown.access-mode' ) . each ( ( _ , el ) => {
const $dropdown = $ ( el ) ;
2022-06-04 03:08:26 +05:30
const $text = $dropdown . find ( '> .text' ) ;
$dropdown . dropdown ( {
2024-02-25 04:38:51 +05:30
async action ( _text , value ) {
2024-03-23 17:58:53 +05:30
const lastValue = el . getAttribute ( 'data-last-value' ) ;
2024-02-25 04:38:51 +05:30
try {
2024-03-23 17:58:53 +05:30
el . setAttribute ( 'data-last-value' , value ) ;
2024-02-25 04:38:51 +05:30
$dropdown . dropdown ( 'hide' ) ;
const data = new FormData ( ) ;
2024-03-23 17:58:53 +05:30
data . append ( 'uid' , el . getAttribute ( 'data-uid' ) ) ;
2024-02-25 04:38:51 +05:30
data . append ( 'mode' , value ) ;
2024-03-23 17:58:53 +05:30
await POST ( el . getAttribute ( 'data-url' ) , { data } ) ;
2024-02-25 04:38:51 +05:30
} catch {
2022-06-04 03:08:26 +05:30
$text . text ( '(error)' ) ; // prevent from misleading users when error occurs
2024-03-23 17:58:53 +05:30
el . setAttribute ( 'data-last-value' , lastValue ) ;
2024-02-25 04:38:51 +05:30
}
2022-06-04 03:08:26 +05:30
} ,
onChange ( _value , text , _$choice ) {
$text . text ( text ) ; // update the text when using keyboard navigating
} ,
onHide ( ) {
// set to the really selected value, defer to next tick to make sure `action` has finished its work because the calling order might be onHide -> action
setTimeout ( ( ) => {
2024-03-23 17:58:53 +05:30
const $item = $dropdown . dropdown ( 'get item' , el . getAttribute ( 'data-last-value' ) ) ;
2022-06-04 03:08:26 +05:30
if ( $item ) {
2024-03-23 17:58:53 +05:30
$dropdown . dropdown ( 'set selected' , el . getAttribute ( 'data-last-value' ) ) ;
2022-06-04 03:08:26 +05:30
} else {
2023-05-02 15:24:29 +05:30
$text . text ( '(none)' ) ; // prevent from misleading users when the access mode is undefined
2022-06-04 03:08:26 +05:30
}
} , 0 ) ;
2024-03-22 19:36:53 +05:30
} ,
2021-10-16 22:58:04 +05:30
} ) ;
} ) ;
}
export function initRepoSettingSearchTeamBox ( ) {
2024-03-23 17:58:53 +05:30
const searchTeamBox = document . getElementById ( 'search-team-box' ) ;
if ( ! searchTeamBox ) return ;
$ ( searchTeamBox ) . search ( {
2021-10-16 22:58:04 +05:30
minCharacters : 2 ,
apiSettings : {
2024-03-23 17:58:53 +05:30
url : ` ${ appSubUrl } /org/ ${ searchTeamBox . getAttribute ( 'data-org-name' ) } /teams/-/search?q={query} ` ,
2021-10-21 13:07:43 +05:30
headers : { 'X-Csrf-Token' : csrfToken } ,
2021-10-16 22:58:04 +05:30
onResponse ( response ) {
const items = [ ] ;
$ . each ( response . data , ( _i , item ) => {
items . push ( {
2024-02-01 22:40:16 +05:30
title : item . name ,
2024-03-22 19:36:53 +05:30
description : ` ${ item . permission } access ` , // TODO: translate this string
2021-10-16 22:58:04 +05:30
} ) ;
} ) ;
return { results : items } ;
2024-03-22 19:36:53 +05:30
} ,
2021-10-16 22:58:04 +05:30
} ,
searchFields : [ 'name' , 'description' ] ,
2024-03-22 19:36:53 +05:30
showNoResults : false ,
2021-10-16 22:58:04 +05:30
} ) ;
}
2021-11-09 14:57:25 +05:30
export function initRepoSettingGitHook ( ) {
2024-03-26 00:07:55 +05:30
if ( ! $ ( '.edit.githook' ) . length ) return ;
2021-10-16 22:58:04 +05:30
const filename = document . querySelector ( '.hook-filename' ) . textContent ;
2021-11-09 14:57:25 +05:30
const _promise = createMonaco ( $ ( '#content' ) [ 0 ] , filename , { language : 'shell' } ) ;
2021-10-16 22:58:04 +05:30
}
export function initRepoSettingBranches ( ) {
2024-03-31 03:00:00 +05:30
if ( ! document . querySelector ( '.repository.settings.branches' ) ) return ;
for ( const el of document . getElementsByClassName ( 'toggle-target-enabled' ) ) {
el . addEventListener ( 'change' , function ( ) {
const target = document . querySelector ( this . getAttribute ( 'data-target' ) ) ;
target ? . classList . toggle ( 'disabled' , ! this . checked ) ;
} ) ;
}
for ( const el of document . getElementsByClassName ( 'toggle-target-disabled' ) ) {
el . addEventListener ( 'change' , function ( ) {
const target = document . querySelector ( this . getAttribute ( 'data-target' ) ) ;
if ( this . checked ) target ? . classList . add ( 'disabled' ) ; // only disable, do not auto enable
} ) ;
}
document . getElementById ( 'dismiss_stale_approvals' ) ? . addEventListener ( 'change' , function ( ) {
document . getElementById ( 'ignore_stale_approvals_box' ) ? . classList . toggle ( 'disabled' , this . checked ) ;
2024-01-15 12:50:01 +05:30
} ) ;
2023-05-17 13:41:13 +05:30
// show the `Matched` mark for the status checks that match the pattern
const markMatchedStatusChecks = ( ) => {
const patterns = ( document . getElementById ( 'status_check_contexts' ) . value || '' ) . split ( /[\r\n]+/ ) ;
const validPatterns = patterns . map ( ( item ) => item . trim ( ) ) . filter ( Boolean ) ;
const marks = document . getElementsByClassName ( 'status-check-matched-mark' ) ;
for ( const el of marks ) {
let matched = false ;
const statusCheck = el . getAttribute ( 'data-status-check' ) ;
for ( const pattern of validPatterns ) {
if ( minimatch ( statusCheck , pattern ) ) {
matched = true ;
break ;
}
}
toggleElem ( el , matched ) ;
}
} ;
markMatchedStatusChecks ( ) ;
document . getElementById ( 'status_check_contexts' ) . addEventListener ( 'input' , onInputDebounce ( markMatchedStatusChecks ) ) ;
2021-10-16 22:58:04 +05:30
}