2022-01-28 13:00:11 -08:00
import $ from 'jquery' ;
2023-05-17 16:11:13 +08:00
import { minimatch } from 'minimatch' ;
2024-07-07 17:32:30 +02:00
import { createMonaco } from './codeeditor.ts' ;
import { onInputDebounce , queryElems , toggleElem } from '../utils/dom.ts' ;
import { POST } from '../modules/fetch.ts' ;
2024-11-28 10:15:59 +08:00
import { initRepoSettingsBranchesDrag } from './repo-settings-branches.ts' ;
2021-10-17 01:28:04 +08:00
2021-10-21 15:37:43 +08:00
const { appSubUrl , csrfToken } = window . config ;
2021-10-17 01:28:04 +08:00
2024-11-03 19:00:12 +08:00
function initRepoSettingsCollaboration() {
2021-10-17 01:28:04 +08:00
// Change collaborator access mode
2024-11-08 14:04:24 +08:00
for ( const dropdownEl of queryElems ( document , '.page-content.repository .ui.dropdown.access-mode' ) ) {
2024-06-10 12:12:31 +02:00
const textEl = dropdownEl . querySelector ( ':scope > .text' ) ;
$ ( dropdownEl ) . dropdown ( {
async action ( text , value ) {
dropdownEl . classList . add ( 'is-loading' , 'loading-icon-2px' ) ;
const lastValue = dropdownEl . getAttribute ( 'data-last-value' ) ;
$ ( dropdownEl ) . dropdown ( 'hide' ) ;
2024-02-25 01:08:51 +02:00
try {
2024-06-10 12:12:31 +02:00
const uid = dropdownEl . getAttribute ( 'data-uid' ) ;
await POST ( dropdownEl . getAttribute ( 'data-url' ) , { data : new URLSearchParams ( { uid , 'mode' : value } ) } ) ;
textEl . textContent = text ;
dropdownEl . setAttribute ( 'data-last-value' , value ) ;
2024-02-25 01:08:51 +02:00
} catch {
2024-06-10 12:12:31 +02:00
textEl . textContent = '(error)' ; // prevent from misleading users when error occurs
dropdownEl . setAttribute ( 'data-last-value' , lastValue ) ;
} finally {
dropdownEl . classList . remove ( 'is-loading' ) ;
2024-02-25 01:08:51 +02:00
}
2022-06-04 05:38:26 +08:00
} ,
onHide() {
2024-06-10 12:12:31 +02:00
// 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
2022-06-04 05:38:26 +08:00
setTimeout ( ( ) = > {
2024-06-10 12:12:31 +02:00
const $item = $ ( dropdownEl ) . dropdown ( 'get item' , dropdownEl . getAttribute ( 'data-last-value' ) ) ;
2022-06-04 05:38:26 +08:00
if ( $item ) {
2024-06-10 12:12:31 +02:00
$ ( dropdownEl ) . dropdown ( 'set selected' , dropdownEl . getAttribute ( 'data-last-value' ) ) ;
2022-06-04 05:38:26 +08:00
} else {
2024-06-10 12:12:31 +02:00
textEl . textContent = '(none)' ; // prevent from misleading users when the access mode is undefined
2022-06-04 05:38:26 +08:00
}
} , 0 ) ;
2024-03-22 15:06:53 +01:00
} ,
2021-10-17 01:28:04 +08:00
} ) ;
2024-06-10 12:12:31 +02:00
}
2021-10-17 01:28:04 +08:00
}
2024-11-03 19:00:12 +08:00
function initRepoSettingsSearchTeamBox() {
2024-06-10 22:49:33 +02:00
const searchTeamBox = document . querySelector ( '#search-team-box' ) ;
2024-03-23 14:28:53 +02:00
if ( ! searchTeamBox ) return ;
$ ( searchTeamBox ) . search ( {
2021-10-17 01:28:04 +08:00
minCharacters : 2 ,
apiSettings : {
2024-03-23 14:28:53 +02:00
url : ` ${ appSubUrl } /org/ ${ searchTeamBox . getAttribute ( 'data-org-name' ) } /teams/-/search?q={query} ` ,
2021-10-21 15:37:43 +08:00
headers : { 'X-Csrf-Token' : csrfToken } ,
2021-10-17 01:28:04 +08:00
onResponse ( response ) {
const items = [ ] ;
$ . each ( response . data , ( _i , item ) = > {
items . push ( {
2024-02-01 18:10:16 +01:00
title : item.name ,
2024-03-22 15:06:53 +01:00
description : ` ${ item . permission } access ` , // TODO: translate this string
2021-10-17 01:28:04 +08:00
} ) ;
} ) ;
return { results : items } ;
2024-03-22 15:06:53 +01:00
} ,
2021-10-17 01:28:04 +08:00
} ,
searchFields : [ 'name' , 'description' ] ,
2024-03-22 15:06:53 +01:00
showNoResults : false ,
2021-10-17 01:28:04 +08:00
} ) ;
}
2024-11-03 19:00:12 +08:00
function initRepoSettingsGitHook() {
2024-03-25 19:37:55 +01:00
if ( ! $ ( '.edit.githook' ) . length ) return ;
2021-10-17 01:28:04 +08:00
const filename = document . querySelector ( '.hook-filename' ) . textContent ;
2024-12-11 09:29:04 +01:00
createMonaco ( $ ( '#content' ) [ 0 ] as HTMLTextAreaElement , filename , { language : 'shell' } ) ;
2021-10-17 01:28:04 +08:00
}
2024-11-03 19:00:12 +08:00
function initRepoSettingsBranches() {
2024-03-31 00:30:00 +03:00
if ( ! document . querySelector ( '.repository.settings.branches' ) ) return ;
2024-06-10 22:49:33 +02:00
for ( const el of document . querySelectorAll ( '.toggle-target-enabled' ) ) {
2024-03-31 00:30:00 +03:00
el . addEventListener ( 'change' , function ( ) {
const target = document . querySelector ( this . getAttribute ( 'data-target' ) ) ;
target ? . classList . toggle ( 'disabled' , ! this . checked ) ;
} ) ;
}
2024-06-10 22:49:33 +02:00
for ( const el of document . querySelectorAll ( '.toggle-target-disabled' ) ) {
2024-03-31 00:30:00 +03:00
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
} ) ;
}
2024-06-10 22:49:33 +02:00
document . querySelector ( '#dismiss_stale_approvals' ) ? . addEventListener ( 'change' , function ( ) {
document . querySelector ( '#ignore_stale_approvals_box' ) ? . classList . toggle ( 'disabled' , this . checked ) ;
2024-01-15 08:20:01 +01:00
} ) ;
2023-05-17 16:11:13 +08:00
// show the `Matched` mark for the status checks that match the pattern
const markMatchedStatusChecks = ( ) = > {
2024-12-11 09:29:04 +01:00
const patterns = ( document . querySelector < HTMLTextAreaElement > ( '#status_check_contexts' ) . value || '' ) . split ( /[\r\n]+/ ) ;
2023-05-17 16:11:13 +08:00
const validPatterns = patterns . map ( ( item ) = > item . trim ( ) ) . filter ( Boolean ) ;
2024-06-10 22:49:33 +02:00
const marks = document . querySelectorAll ( '.status-check-matched-mark' ) ;
2023-05-17 16:11:13 +08:00
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 ( ) ;
2024-06-10 22:49:33 +02:00
document . querySelector ( '#status_check_contexts' ) . addEventListener ( 'input' , onInputDebounce ( markMatchedStatusChecks ) ) ;
2021-10-17 01:28:04 +08:00
}
2024-11-03 19:00:12 +08:00
function initRepoSettingsOptions() {
if ( $ ( '.repository.settings.options' ) . length > 0 ) {
// Enable or select internal/external wiki system and issue tracker.
2024-12-11 09:29:04 +01:00
$ ( '.enable-system' ) . on ( 'change' , function ( this : HTMLInputElement ) {
2024-11-03 19:00:12 +08:00
if ( this . checked ) {
$ ( $ ( this ) . data ( 'target' ) ) . removeClass ( 'disabled' ) ;
if ( ! $ ( this ) . data ( 'context' ) ) $ ( $ ( this ) . data ( 'context' ) ) . addClass ( 'disabled' ) ;
} else {
$ ( $ ( this ) . data ( 'target' ) ) . addClass ( 'disabled' ) ;
if ( ! $ ( this ) . data ( 'context' ) ) $ ( $ ( this ) . data ( 'context' ) ) . removeClass ( 'disabled' ) ;
}
} ) ;
2024-12-11 09:29:04 +01:00
$ ( '.enable-system-radio' ) . on ( 'change' , function ( this : HTMLInputElement ) {
2024-11-03 19:00:12 +08:00
if ( this . value === 'false' ) {
$ ( $ ( this ) . data ( 'target' ) ) . addClass ( 'disabled' ) ;
if ( $ ( this ) . data ( 'context' ) !== undefined ) $ ( $ ( this ) . data ( 'context' ) ) . removeClass ( 'disabled' ) ;
} else if ( this . value === 'true' ) {
$ ( $ ( this ) . data ( 'target' ) ) . removeClass ( 'disabled' ) ;
if ( $ ( this ) . data ( 'context' ) !== undefined ) $ ( $ ( this ) . data ( 'context' ) ) . addClass ( 'disabled' ) ;
}
} ) ;
const $trackerIssueStyleRadios = $ ( '.js-tracker-issue-style' ) ;
$trackerIssueStyleRadios . on ( 'change input' , ( ) = > {
const checkedVal = $trackerIssueStyleRadios . filter ( ':checked' ) . val ( ) ;
$ ( '#tracker-issue-style-regex-box' ) . toggleClass ( 'disabled' , checkedVal !== 'regexp' ) ;
} ) ;
}
}
export function initRepoSettings() {
if ( ! document . querySelector ( '.page-content.repository.settings' ) ) return ;
initRepoSettingsOptions ( ) ;
initRepoSettingsBranches ( ) ;
initRepoSettingsCollaboration ( ) ;
initRepoSettingsSearchTeamBox ( ) ;
initRepoSettingsGitHook ( ) ;
2024-11-28 10:15:59 +08:00
initRepoSettingsBranchesDrag ( ) ;
2024-11-03 19:00:12 +08:00
}