mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 19:06:18 +01:00 
			
		
		
		
	Use querySelector over alternative DOM methods (#31280)
				
					
				
			As per https://github.com/go-gitea/gitea/pull/30115#discussion_r1626060164, prefer `querySelector` by enabling [`unicorn/prefer-query-selector`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-query-selector.md) and autofixing all except 10 issues. According to [this](https://old.reddit.com/r/learnjavascript/comments/i0f5o8/performance_of_getelementbyid_vs_queryselector/), querySelector may be faster as well, so it's a win-win. --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com> Co-authored-by: Giteabot <teabot@gitea.io>
This commit is contained in:
		| @@ -101,7 +101,7 @@ const sfc = { | ||||
|   }, | ||||
|  | ||||
|   mounted() { | ||||
|     const el = document.getElementById('dashboard-repo-list'); | ||||
|     const el = document.querySelector('#dashboard-repo-list'); | ||||
|     this.changeReposFilter(this.reposFilter); | ||||
|     $(el).find('.dropdown').dropdown(); | ||||
|     nextTick(() => { | ||||
| @@ -330,7 +330,7 @@ const sfc = { | ||||
| }; | ||||
|  | ||||
| export function initDashboardRepoList() { | ||||
|   const el = document.getElementById('dashboard-repo-list'); | ||||
|   const el = document.querySelector('#dashboard-repo-list'); | ||||
|   if (el) { | ||||
|     createApp(sfc).mount(el); | ||||
|   } | ||||
|   | ||||
| @@ -5,7 +5,7 @@ import {GET} from '../modules/fetch.js'; | ||||
| export default { | ||||
|   components: {SvgIcon}, | ||||
|   data: () => { | ||||
|     const el = document.getElementById('diff-commit-select'); | ||||
|     const el = document.querySelector('#diff-commit-select'); | ||||
|     return { | ||||
|       menuVisible: false, | ||||
|       isLoading: false, | ||||
|   | ||||
| @@ -7,10 +7,10 @@ export default { | ||||
|     return {store: diffTreeStore()}; | ||||
|   }, | ||||
|   mounted() { | ||||
|     document.getElementById('show-file-list-btn').addEventListener('click', this.toggleFileList); | ||||
|     document.querySelector('#show-file-list-btn').addEventListener('click', this.toggleFileList); | ||||
|   }, | ||||
|   unmounted() { | ||||
|     document.getElementById('show-file-list-btn').removeEventListener('click', this.toggleFileList); | ||||
|     document.querySelector('#show-file-list-btn').removeEventListener('click', this.toggleFileList); | ||||
|   }, | ||||
|   methods: { | ||||
|     toggleFileList() { | ||||
|   | ||||
| @@ -112,7 +112,7 @@ export default { | ||||
|     updateState(visible) { | ||||
|       const btn = document.querySelector('.diff-toggle-file-tree-button'); | ||||
|       const [toShow, toHide] = btn.querySelectorAll('.icon'); | ||||
|       const tree = document.getElementById('diff-file-tree'); | ||||
|       const tree = document.querySelector('#diff-file-tree'); | ||||
|       const newTooltip = btn.getAttribute(visible ? 'data-hide-text' : 'data-show-text'); | ||||
|       btn.setAttribute('data-tooltip-content', newTooltip); | ||||
|       toggleElem(tree, visible); | ||||
|   | ||||
| @@ -325,7 +325,7 @@ const sfc = { | ||||
| export default sfc; | ||||
|  | ||||
| export function initRepositoryActionView() { | ||||
|   const el = document.getElementById('repo-action-view'); | ||||
|   const el = document.querySelector('#repo-action-view'); | ||||
|   if (!el) return; | ||||
|  | ||||
|   // TODO: the parent element's full height doesn't work well now, | ||||
|   | ||||
| @@ -51,7 +51,7 @@ const sfc = { | ||||
| }; | ||||
|  | ||||
| export function initRepoActivityTopAuthorsChart() { | ||||
|   const el = document.getElementById('repo-activity-top-authors-chart'); | ||||
|   const el = document.querySelector('#repo-activity-top-authors-chart'); | ||||
|   if (el) { | ||||
|     createApp(sfc).mount(el); | ||||
|   } | ||||
|   | ||||
| @@ -85,7 +85,7 @@ const sfc = { | ||||
|         this.isViewBranch = false; | ||||
|         this.$refs.dropdownRefName.textContent = item.name; | ||||
|         if (this.setAction) { | ||||
|           document.getElementById(this.branchForm)?.setAttribute('action', url); | ||||
|           document.querySelector(`#${this.branchForm}`)?.setAttribute('action', url); | ||||
|         } else { | ||||
|           $(`#${this.branchForm} input[name="refURL"]`).val(url); | ||||
|         } | ||||
|   | ||||
| @@ -43,25 +43,25 @@ const sfc = { | ||||
|   }, | ||||
|  | ||||
|   mounted() { | ||||
|     document.getElementById('scoped-access-submit').addEventListener('click', this.onClickSubmit); | ||||
|     document.querySelector('#scoped-access-submit').addEventListener('click', this.onClickSubmit); | ||||
|   }, | ||||
|  | ||||
|   unmounted() { | ||||
|     document.getElementById('scoped-access-submit').removeEventListener('click', this.onClickSubmit); | ||||
|     document.querySelector('#scoped-access-submit').removeEventListener('click', this.onClickSubmit); | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     onClickSubmit(e) { | ||||
|       e.preventDefault(); | ||||
|  | ||||
|       const warningEl = document.getElementById('scoped-access-warning'); | ||||
|       const warningEl = document.querySelector('#scoped-access-warning'); | ||||
|       // check that at least one scope has been selected | ||||
|       for (const el of document.getElementsByClassName('access-token-select')) { | ||||
|       for (const el of document.querySelectorAll('.access-token-select')) { | ||||
|         if (el.value) { | ||||
|           // Hide the error if it was visible from previous attempt. | ||||
|           hideElem(warningEl); | ||||
|           // Submit the form. | ||||
|           document.getElementById('scoped-access-form').submit(); | ||||
|           document.querySelector('#scoped-access-form').submit(); | ||||
|           // Don't show the warning. | ||||
|           return; | ||||
|         } | ||||
| @@ -78,7 +78,7 @@ export default sfc; | ||||
|  * Initialize category toggle sections | ||||
|  */ | ||||
| export function initScopedAccessTokenCategories() { | ||||
|   for (const el of document.getElementsByClassName('scoped-access-token-mount')) { | ||||
|   for (const el of document.querySelectorAll('.scoped-access-token-mount')) { | ||||
|     createApp({}) | ||||
|       .component('scoped-access-token-selector', sfc) | ||||
|       .mount(el); | ||||
|   | ||||
| @@ -6,7 +6,7 @@ import {POST} from '../../modules/fetch.js'; | ||||
| const {appSubUrl} = window.config; | ||||
|  | ||||
| function onSecurityProtocolChange() { | ||||
|   if (Number(document.getElementById('security_protocol')?.value) > 0) { | ||||
|   if (Number(document.querySelector('#security_protocol')?.value) > 0) { | ||||
|     showElem('.has-tls'); | ||||
|   } else { | ||||
|     hideElem('.has-tls'); | ||||
| @@ -21,34 +21,34 @@ export function initAdminCommon() { | ||||
|  | ||||
|   // New user | ||||
|   if ($('.admin.new.user').length > 0 || $('.admin.edit.user').length > 0) { | ||||
|     document.getElementById('login_type')?.addEventListener('change', function () { | ||||
|     document.querySelector('#login_type')?.addEventListener('change', function () { | ||||
|       if (this.value?.substring(0, 1) === '0') { | ||||
|         document.getElementById('user_name')?.removeAttribute('disabled'); | ||||
|         document.getElementById('login_name')?.removeAttribute('required'); | ||||
|         document.querySelector('#user_name')?.removeAttribute('disabled'); | ||||
|         document.querySelector('#login_name')?.removeAttribute('required'); | ||||
|         hideElem('.non-local'); | ||||
|         showElem('.local'); | ||||
|         document.getElementById('user_name')?.focus(); | ||||
|         document.querySelector('#user_name')?.focus(); | ||||
|  | ||||
|         if (this.getAttribute('data-password') === 'required') { | ||||
|           document.getElementById('password')?.setAttribute('required', 'required'); | ||||
|           document.querySelector('#password')?.setAttribute('required', 'required'); | ||||
|         } | ||||
|       } else { | ||||
|         if (document.querySelector('.admin.edit.user')) { | ||||
|           document.getElementById('user_name')?.setAttribute('disabled', 'disabled'); | ||||
|           document.querySelector('#user_name')?.setAttribute('disabled', 'disabled'); | ||||
|         } | ||||
|         document.getElementById('login_name')?.setAttribute('required', 'required'); | ||||
|         document.querySelector('#login_name')?.setAttribute('required', 'required'); | ||||
|         showElem('.non-local'); | ||||
|         hideElem('.local'); | ||||
|         document.getElementById('login_name')?.focus(); | ||||
|         document.querySelector('#login_name')?.focus(); | ||||
|  | ||||
|         document.getElementById('password')?.removeAttribute('required'); | ||||
|         document.querySelector('#password')?.removeAttribute('required'); | ||||
|       } | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   function onUsePagedSearchChange() { | ||||
|     const searchPageSizeElements = document.querySelectorAll('.search-page-size'); | ||||
|     if (document.getElementById('use_paged_search').checked) { | ||||
|     if (document.querySelector('#use_paged_search').checked) { | ||||
|       showElem('.search-page-size'); | ||||
|       for (const el of searchPageSizeElements) { | ||||
|         el.querySelector('input')?.setAttribute('required', 'required'); | ||||
| @@ -67,7 +67,7 @@ export function initAdminCommon() { | ||||
|       input.removeAttribute('required'); | ||||
|     } | ||||
|  | ||||
|     const provider = document.getElementById('oauth2_provider').value; | ||||
|     const provider = document.querySelector('#oauth2_provider').value; | ||||
|     switch (provider) { | ||||
|       case 'openidConnect': | ||||
|         document.querySelector('.open_id_connect_auto_discovery_url input').setAttribute('required', 'required'); | ||||
| @@ -91,19 +91,19 @@ export function initAdminCommon() { | ||||
|   } | ||||
|  | ||||
|   function onOAuth2UseCustomURLChange(applyDefaultValues) { | ||||
|     const provider = document.getElementById('oauth2_provider').value; | ||||
|     const provider = document.querySelector('#oauth2_provider').value; | ||||
|     hideElem('.oauth2_use_custom_url_field'); | ||||
|     for (const input of document.querySelectorAll('.oauth2_use_custom_url_field input[required]')) { | ||||
|       input.removeAttribute('required'); | ||||
|     } | ||||
|  | ||||
|     const elProviderCustomUrlSettings = document.querySelector(`#${provider}_customURLSettings`); | ||||
|     if (elProviderCustomUrlSettings && document.getElementById('oauth2_use_custom_url').checked) { | ||||
|     if (elProviderCustomUrlSettings && document.querySelector('#oauth2_use_custom_url').checked) { | ||||
|       for (const custom of ['token_url', 'auth_url', 'profile_url', 'email_url', 'tenant']) { | ||||
|         if (applyDefaultValues) { | ||||
|           document.getElementById(`oauth2_${custom}`).value = document.getElementById(`${provider}_${custom}`).value; | ||||
|           document.querySelector(`#oauth2_${custom}`).value = document.querySelector(`#${provider}_${custom}`).value; | ||||
|         } | ||||
|         const customInput = document.getElementById(`${provider}_${custom}`); | ||||
|         const customInput = document.querySelector(`#${provider}_${custom}`); | ||||
|         if (customInput && customInput.getAttribute('data-available') === 'true') { | ||||
|           for (const input of document.querySelectorAll(`.oauth2_${custom} input`)) { | ||||
|             input.setAttribute('required', 'required'); | ||||
| @@ -115,12 +115,12 @@ export function initAdminCommon() { | ||||
|   } | ||||
|  | ||||
|   function onEnableLdapGroupsChange() { | ||||
|     toggleElem(document.getElementById('ldap-group-options'), $('.js-ldap-group-toggle')[0].checked); | ||||
|     toggleElem(document.querySelector('#ldap-group-options'), $('.js-ldap-group-toggle')[0].checked); | ||||
|   } | ||||
|  | ||||
|   // New authentication | ||||
|   if (document.querySelector('.admin.new.authentication')) { | ||||
|     document.getElementById('auth_type')?.addEventListener('change', function () { | ||||
|     document.querySelector('#auth_type')?.addEventListener('change', function () { | ||||
|       hideElem('.ldap, .dldap, .smtp, .pam, .oauth2, .has-tls, .search-page-size, .sspi'); | ||||
|  | ||||
|       for (const input of document.querySelectorAll('.ldap input[required], .binddnrequired input[required], .dldap input[required], .smtp input[required], .pam input[required], .oauth2 input[required], .has-tls input[required], .sspi input[required]')) { | ||||
| @@ -180,25 +180,25 @@ export function initAdminCommon() { | ||||
|       } | ||||
|     }); | ||||
|     $('#auth_type').trigger('change'); | ||||
|     document.getElementById('security_protocol')?.addEventListener('change', onSecurityProtocolChange); | ||||
|     document.getElementById('use_paged_search')?.addEventListener('change', onUsePagedSearchChange); | ||||
|     document.getElementById('oauth2_provider')?.addEventListener('change', () => onOAuth2Change(true)); | ||||
|     document.getElementById('oauth2_use_custom_url')?.addEventListener('change', () => onOAuth2UseCustomURLChange(true)); | ||||
|     document.querySelector('#security_protocol')?.addEventListener('change', onSecurityProtocolChange); | ||||
|     document.querySelector('#use_paged_search')?.addEventListener('change', onUsePagedSearchChange); | ||||
|     document.querySelector('#oauth2_provider')?.addEventListener('change', () => onOAuth2Change(true)); | ||||
|     document.querySelector('#oauth2_use_custom_url')?.addEventListener('change', () => onOAuth2UseCustomURLChange(true)); | ||||
|     $('.js-ldap-group-toggle').on('change', onEnableLdapGroupsChange); | ||||
|   } | ||||
|   // Edit authentication | ||||
|   if (document.querySelector('.admin.edit.authentication')) { | ||||
|     const authType = document.getElementById('auth_type')?.value; | ||||
|     const authType = document.querySelector('#auth_type')?.value; | ||||
|     if (authType === '2' || authType === '5') { | ||||
|       document.getElementById('security_protocol')?.addEventListener('change', onSecurityProtocolChange); | ||||
|       document.querySelector('#security_protocol')?.addEventListener('change', onSecurityProtocolChange); | ||||
|       $('.js-ldap-group-toggle').on('change', onEnableLdapGroupsChange); | ||||
|       onEnableLdapGroupsChange(); | ||||
|       if (authType === '2') { | ||||
|         document.getElementById('use_paged_search')?.addEventListener('change', onUsePagedSearchChange); | ||||
|         document.querySelector('#use_paged_search')?.addEventListener('change', onUsePagedSearchChange); | ||||
|       } | ||||
|     } else if (authType === '6') { | ||||
|       document.getElementById('oauth2_provider')?.addEventListener('change', () => onOAuth2Change(true)); | ||||
|       document.getElementById('oauth2_use_custom_url')?.addEventListener('change', () => onOAuth2UseCustomURLChange(false)); | ||||
|       document.querySelector('#oauth2_provider')?.addEventListener('change', () => onOAuth2Change(true)); | ||||
|       document.querySelector('#oauth2_use_custom_url')?.addEventListener('change', () => onOAuth2UseCustomURLChange(false)); | ||||
|       onOAuth2Change(false); | ||||
|     } | ||||
|   } | ||||
| @@ -206,13 +206,13 @@ export function initAdminCommon() { | ||||
|   if (document.querySelector('.admin.authentication')) { | ||||
|     $('#auth_name').on('input', function () { | ||||
|       // appSubUrl is either empty or is a path that starts with `/` and doesn't have a trailing slash. | ||||
|       document.getElementById('oauth2-callback-url').textContent = `${window.location.origin}${appSubUrl}/user/oauth2/${encodeURIComponent(this.value)}/callback`; | ||||
|       document.querySelector('#oauth2-callback-url').textContent = `${window.location.origin}${appSubUrl}/user/oauth2/${encodeURIComponent(this.value)}/callback`; | ||||
|     }).trigger('input'); | ||||
|   } | ||||
|  | ||||
|   // Notice | ||||
|   if (document.querySelector('.admin.notice')) { | ||||
|     const detailModal = document.getElementById('detail-modal'); | ||||
|     const detailModal = document.querySelector('#detail-modal'); | ||||
|  | ||||
|     // Attach view detail modals | ||||
|     $('.view-detail').on('click', function () { | ||||
| @@ -244,7 +244,7 @@ export function initAdminCommon() { | ||||
|           break; | ||||
|       } | ||||
|     }); | ||||
|     document.getElementById('delete-selection')?.addEventListener('click', async function (e) { | ||||
|     document.querySelector('#delete-selection')?.addEventListener('click', async function (e) { | ||||
|       e.preventDefault(); | ||||
|       this.classList.add('is-loading', 'disabled'); | ||||
|       const data = new FormData(); | ||||
|   | ||||
| @@ -27,9 +27,9 @@ export async function initCitationFileCopyContent() { | ||||
|  | ||||
|   if (!pageData.citationFileContent) return; | ||||
|  | ||||
|   const citationCopyApa = document.getElementById('citation-copy-apa'); | ||||
|   const citationCopyBibtex = document.getElementById('citation-copy-bibtex'); | ||||
|   const inputContent = document.getElementById('citation-copy-content'); | ||||
|   const citationCopyApa = document.querySelector('#citation-copy-apa'); | ||||
|   const citationCopyBibtex = document.querySelector('#citation-copy-bibtex'); | ||||
|   const inputContent = document.querySelector('#citation-copy-content'); | ||||
|  | ||||
|   if ((!citationCopyApa && !citationCopyBibtex) || !inputContent) return; | ||||
|  | ||||
| @@ -41,7 +41,7 @@ export async function initCitationFileCopyContent() { | ||||
|     citationCopyApa.classList.toggle('primary', !isBibtex); | ||||
|   }; | ||||
|  | ||||
|   document.getElementById('cite-repo-button')?.addEventListener('click', async (e) => { | ||||
|   document.querySelector('#cite-repo-button')?.addEventListener('click', async (e) => { | ||||
|     const dropdownBtn = e.target.closest('.ui.dropdown.button'); | ||||
|     dropdownBtn.classList.add('is-loading'); | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| import {createApp} from 'vue'; | ||||
|  | ||||
| export async function initRepoCodeFrequency() { | ||||
|   const el = document.getElementById('repo-code-frequency-chart'); | ||||
|   const el = document.querySelector('#repo-code-frequency-chart'); | ||||
|   if (!el) return; | ||||
|  | ||||
|   const {default: RepoCodeFrequency} = await import(/* webpackChunkName: "code-frequency-graph" */'../components/RepoCodeFrequency.vue'); | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| import {createTippy} from '../modules/tippy.js'; | ||||
|  | ||||
| export async function initColorPickers() { | ||||
|   const els = document.getElementsByClassName('js-color-picker-input'); | ||||
|   const els = document.querySelectorAll('.js-color-picker-input'); | ||||
|   if (!els.length) return; | ||||
|  | ||||
|   await Promise.all([ | ||||
|   | ||||
| @@ -24,8 +24,8 @@ export function initGlobalFormDirtyLeaveConfirm() { | ||||
| } | ||||
|  | ||||
| export function initHeadNavbarContentToggle() { | ||||
|   const navbar = document.getElementById('navbar'); | ||||
|   const btn = document.getElementById('navbar-expand-toggle'); | ||||
|   const navbar = document.querySelector('#navbar'); | ||||
|   const btn = document.querySelector('#navbar-expand-toggle'); | ||||
|   if (!navbar || !btn) return; | ||||
|  | ||||
|   btn.addEventListener('click', () => { | ||||
|   | ||||
| @@ -29,7 +29,7 @@ export function parseIssueListQuickGotoLink(repoLink, searchText) { | ||||
| } | ||||
|  | ||||
| export function initCommonIssueListQuickGoto() { | ||||
|   const goto = document.getElementById('issue-list-quick-goto'); | ||||
|   const goto = document.querySelector('#issue-list-quick-goto'); | ||||
|   if (!goto) return; | ||||
|  | ||||
|   const form = goto.closest('form'); | ||||
|   | ||||
| @@ -5,7 +5,7 @@ const {appSubUrl} = window.config; | ||||
| const looksLikeEmailAddressCheck = /^\S+@\S+$/; | ||||
|  | ||||
| export function initCompSearchUserBox() { | ||||
|   const searchUserBox = document.getElementById('search-user-box'); | ||||
|   const searchUserBox = document.querySelector('#search-user-box'); | ||||
|   if (!searchUserBox) return; | ||||
|  | ||||
|   const $searchUserBox = $(searchUserBox); | ||||
|   | ||||
| @@ -23,18 +23,18 @@ export function initCompWebHookEditor() { | ||||
|   } | ||||
|  | ||||
|   // some webhooks (like Gitea) allow to set the request method (GET/POST), and it would toggle the "Content Type" field | ||||
|   const httpMethodInput = document.getElementById('http_method'); | ||||
|   const httpMethodInput = document.querySelector('#http_method'); | ||||
|   if (httpMethodInput) { | ||||
|     const updateContentType = function () { | ||||
|       const visible = httpMethodInput.value === 'POST'; | ||||
|       toggleElem(document.getElementById('content_type').closest('.field'), visible); | ||||
|       toggleElem(document.querySelector('#content_type').closest('.field'), visible); | ||||
|     }; | ||||
|     updateContentType(); | ||||
|     httpMethodInput.addEventListener('change', updateContentType); | ||||
|   } | ||||
|  | ||||
|   // Test delivery | ||||
|   document.getElementById('test-delivery')?.addEventListener('click', async function () { | ||||
|   document.querySelector('#test-delivery')?.addEventListener('click', async function () { | ||||
|     this.classList.add('is-loading', 'disabled'); | ||||
|     await POST(this.getAttribute('data-link')); | ||||
|     setTimeout(() => { | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| import {createApp} from 'vue'; | ||||
|  | ||||
| export async function initRepoContributors() { | ||||
|   const el = document.getElementById('repo-contributors-chart'); | ||||
|   const el = document.querySelector('#repo-contributors-chart'); | ||||
|   if (!el) return; | ||||
|  | ||||
|   const {default: RepoContributors} = await import(/* webpackChunkName: "contributors-graph" */'../components/RepoContributors.vue'); | ||||
|   | ||||
| @@ -6,7 +6,7 @@ import {GET} from '../modules/fetch.js'; | ||||
| const {i18n} = window.config; | ||||
|  | ||||
| export function initCopyContent() { | ||||
|   const btn = document.getElementById('copy-content'); | ||||
|   const btn = document.querySelector('#copy-content'); | ||||
|   if (!btn || btn.classList.contains('disabled')) return; | ||||
|  | ||||
|   btn.addEventListener('click', async () => { | ||||
|   | ||||
| @@ -3,7 +3,7 @@ import ActivityHeatmap from '../components/ActivityHeatmap.vue'; | ||||
| import {translateMonth, translateDay} from '../utils.js'; | ||||
|  | ||||
| export function initHeatmap() { | ||||
|   const el = document.getElementById('user-heatmap'); | ||||
|   const el = document.querySelector('#user-heatmap'); | ||||
|   if (!el) return; | ||||
|  | ||||
|   try { | ||||
|   | ||||
| @@ -22,12 +22,12 @@ function initPreInstall() { | ||||
|     mssql: '127.0.0.1:1433', | ||||
|   }; | ||||
|  | ||||
|   const dbHost = document.getElementById('db_host'); | ||||
|   const dbUser = document.getElementById('db_user'); | ||||
|   const dbName = document.getElementById('db_name'); | ||||
|   const dbHost = document.querySelector('#db_host'); | ||||
|   const dbUser = document.querySelector('#db_user'); | ||||
|   const dbName = document.querySelector('#db_name'); | ||||
|  | ||||
|   // Database type change detection. | ||||
|   document.getElementById('db_type').addEventListener('change', function () { | ||||
|   document.querySelector('#db_type').addEventListener('change', function () { | ||||
|     const dbType = this.value; | ||||
|     hideElem('div[data-db-setting-for]'); | ||||
|     showElem(`div[data-db-setting-for=${dbType}]`); | ||||
| @@ -46,14 +46,14 @@ function initPreInstall() { | ||||
|       } | ||||
|     } // else: for SQLite3, the default path is always prepared by backend code (setting) | ||||
|   }); | ||||
|   document.getElementById('db_type').dispatchEvent(new Event('change')); | ||||
|   document.querySelector('#db_type').dispatchEvent(new Event('change')); | ||||
|  | ||||
|   const appUrl = document.getElementById('app_url'); | ||||
|   const appUrl = document.querySelector('#app_url'); | ||||
|   if (appUrl.value.includes('://localhost')) { | ||||
|     appUrl.value = window.location.href; | ||||
|   } | ||||
|  | ||||
|   const domain = document.getElementById('domain'); | ||||
|   const domain = document.querySelector('#domain'); | ||||
|   if (domain.value.trim() === 'localhost') { | ||||
|     domain.value = window.location.hostname; | ||||
|   } | ||||
| @@ -103,7 +103,7 @@ function initPreInstall() { | ||||
| } | ||||
|  | ||||
| function initPostInstall() { | ||||
|   const el = document.getElementById('goto-user-login'); | ||||
|   const el = document.querySelector('#goto-user-login'); | ||||
|   if (!el) return; | ||||
|  | ||||
|   const targetUrl = el.getAttribute('href'); | ||||
|   | ||||
| @@ -7,13 +7,13 @@ const {appSubUrl, notificationSettings, assetVersionEncoded} = window.config; | ||||
| let notificationSequenceNumber = 0; | ||||
|  | ||||
| export function initNotificationsTable() { | ||||
|   const table = document.getElementById('notification_table'); | ||||
|   const table = document.querySelector('#notification_table'); | ||||
|   if (!table) return; | ||||
|  | ||||
|   // when page restores from bfcache, delete previously clicked items | ||||
|   window.addEventListener('pageshow', (e) => { | ||||
|     if (e.persisted) { // page was restored from bfcache | ||||
|       const table = document.getElementById('notification_table'); | ||||
|       const table = document.querySelector('#notification_table'); | ||||
|       const unreadCountEl = document.querySelector('.notifications-unread-count'); | ||||
|       let unreadCount = parseInt(unreadCountEl.textContent); | ||||
|       for (const item of table.querySelectorAll('.notifications-item[data-remove="true"]')) { | ||||
| @@ -145,7 +145,7 @@ async function updateNotificationCountWithCallback(callback, timeout, lastCount) | ||||
| } | ||||
|  | ||||
| async function updateNotificationTable() { | ||||
|   const notificationDiv = document.getElementById('notification_div'); | ||||
|   const notificationDiv = document.querySelector('#notification_div'); | ||||
|   if (notificationDiv) { | ||||
|     try { | ||||
|       const params = new URLSearchParams(window.location.search); | ||||
| @@ -181,7 +181,7 @@ async function updateNotificationCount() { | ||||
|  | ||||
|     toggleElem('.notification_count', data.new !== 0); | ||||
|  | ||||
|     for (const el of document.getElementsByClassName('notification_count')) { | ||||
|     for (const el of document.querySelectorAll('.notification_count')) { | ||||
|       el.textContent = `${data.new}`; | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -12,9 +12,9 @@ const collapseFilesBtnSelector = '#collapse-files-btn'; | ||||
| // Refreshes the summary of viewed files if present | ||||
| // The data used will be window.config.pageData.prReview.numberOf{Viewed}Files | ||||
| function refreshViewedFilesSummary() { | ||||
|   const viewedFilesProgress = document.getElementById('viewed-files-summary'); | ||||
|   const viewedFilesProgress = document.querySelector('#viewed-files-summary'); | ||||
|   viewedFilesProgress?.setAttribute('value', prReview.numberOfViewedFiles); | ||||
|   const summaryLabel = document.getElementById('viewed-files-summary-label'); | ||||
|   const summaryLabel = document.querySelector('#viewed-files-summary-label'); | ||||
|   if (summaryLabel) summaryLabel.innerHTML = summaryLabel.getAttribute('data-text-changed-template') | ||||
|     .replace('%[1]d', prReview.numberOfViewedFiles) | ||||
|     .replace('%[2]d', prReview.numberOfFiles); | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| import {createApp} from 'vue'; | ||||
|  | ||||
| export async function initRepoRecentCommits() { | ||||
|   const el = document.getElementById('repo-recent-commits-chart'); | ||||
|   const el = document.querySelector('#repo-recent-commits-chart'); | ||||
|   if (!el) return; | ||||
|  | ||||
|   const {default: RepoRecentCommits} = await import(/* webpackChunkName: "recent-commits-graph" */'../components/RepoRecentCommits.vue'); | ||||
|   | ||||
| @@ -2,7 +2,7 @@ import {createApp} from 'vue'; | ||||
| import DiffCommitSelector from '../components/DiffCommitSelector.vue'; | ||||
|  | ||||
| export function initDiffCommitSelect() { | ||||
|   const el = document.getElementById('diff-commit-select'); | ||||
|   const el = document.querySelector('#diff-commit-select'); | ||||
|   if (!el) return; | ||||
|  | ||||
|   const commitSelect = createApp(DiffCommitSelector); | ||||
|   | ||||
| @@ -3,13 +3,13 @@ import DiffFileTree from '../components/DiffFileTree.vue'; | ||||
| import DiffFileList from '../components/DiffFileList.vue'; | ||||
|  | ||||
| export function initDiffFileTree() { | ||||
|   const el = document.getElementById('diff-file-tree'); | ||||
|   const el = document.querySelector('#diff-file-tree'); | ||||
|   if (!el) return; | ||||
|  | ||||
|   const fileTreeView = createApp(DiffFileTree); | ||||
|   fileTreeView.mount(el); | ||||
|  | ||||
|   const fileListElement = document.getElementById('diff-file-list'); | ||||
|   const fileListElement = document.querySelector('#diff-file-list'); | ||||
|   if (!fileListElement) return; | ||||
|  | ||||
|   const fileListView = createApp(DiffFileList); | ||||
|   | ||||
| @@ -13,7 +13,7 @@ import {POST, GET} from '../modules/fetch.js'; | ||||
| const {pageData, i18n} = window.config; | ||||
|  | ||||
| function initRepoDiffReviewButton() { | ||||
|   const reviewBox = document.getElementById('review-box'); | ||||
|   const reviewBox = document.querySelector('#review-box'); | ||||
|   if (!reviewBox) return; | ||||
|  | ||||
|   const counter = reviewBox.querySelector('.review-comments-counter'); | ||||
|   | ||||
| @@ -112,7 +112,7 @@ export function initRepoEditor() { | ||||
|  | ||||
|     // Using events from https://github.com/codedance/jquery.AreYouSure#advanced-usage | ||||
|     // to enable or disable the commit button | ||||
|     const commitButton = document.getElementById('commit-button'); | ||||
|     const commitButton = document.querySelector('#commit-button'); | ||||
|     const $editForm = $('.ui.edit.form'); | ||||
|     const dirtyFileClass = 'dirty-file'; | ||||
|  | ||||
|   | ||||
| @@ -106,11 +106,11 @@ async function loadRepoFiles() { | ||||
| } | ||||
|  | ||||
| export function initFindFileInRepo() { | ||||
|   repoFindFileInput = document.getElementById('repo-file-find-input'); | ||||
|   repoFindFileInput = document.querySelector('#repo-file-find-input'); | ||||
|   if (!repoFindFileInput) return; | ||||
|  | ||||
|   repoFindFileTableBody = document.querySelector('#repo-find-file-table tbody'); | ||||
|   repoFindFileNoResult = document.getElementById('repo-find-file-no-result'); | ||||
|   repoFindFileNoResult = document.querySelector('#repo-find-file-no-result'); | ||||
|   repoFindFileInput.addEventListener('input', () => filterRepoFiles(repoFindFileInput.value)); | ||||
|  | ||||
|   loadRepoFiles(); | ||||
|   | ||||
| @@ -3,12 +3,12 @@ import {hideElem, showElem} from '../utils/dom.js'; | ||||
| import {GET} from '../modules/fetch.js'; | ||||
|  | ||||
| export function initRepoGraphGit() { | ||||
|   const graphContainer = document.getElementById('git-graph-container'); | ||||
|   const graphContainer = document.querySelector('#git-graph-container'); | ||||
|   if (!graphContainer) return; | ||||
|  | ||||
|   document.getElementById('flow-color-monochrome')?.addEventListener('click', () => { | ||||
|     document.getElementById('flow-color-monochrome').classList.add('active'); | ||||
|     document.getElementById('flow-color-colored')?.classList.remove('active'); | ||||
|   document.querySelector('#flow-color-monochrome')?.addEventListener('click', () => { | ||||
|     document.querySelector('#flow-color-monochrome').classList.add('active'); | ||||
|     document.querySelector('#flow-color-colored')?.classList.remove('active'); | ||||
|     graphContainer.classList.remove('colored'); | ||||
|     graphContainer.classList.add('monochrome'); | ||||
|     const params = new URLSearchParams(window.location.search); | ||||
| @@ -30,9 +30,9 @@ export function initRepoGraphGit() { | ||||
|     } | ||||
|   }); | ||||
|  | ||||
|   document.getElementById('flow-color-colored')?.addEventListener('click', () => { | ||||
|     document.getElementById('flow-color-colored').classList.add('active'); | ||||
|     document.getElementById('flow-color-monochrome')?.classList.remove('active'); | ||||
|   document.querySelector('#flow-color-colored')?.addEventListener('click', () => { | ||||
|     document.querySelector('#flow-color-colored').classList.add('active'); | ||||
|     document.querySelector('#flow-color-monochrome')?.classList.remove('active'); | ||||
|     graphContainer.classList.add('colored'); | ||||
|     graphContainer.classList.remove('monochrome'); | ||||
|     for (const link of document.querySelectorAll('.pagination a')) { | ||||
| @@ -60,7 +60,7 @@ export function initRepoGraphGit() { | ||||
|     const ajaxUrl = new URL(url); | ||||
|     ajaxUrl.searchParams.set('div-only', 'true'); | ||||
|     window.history.replaceState({}, '', queryString ? `?${queryString}` : window.location.pathname); | ||||
|     document.getElementById('pagination').innerHTML = ''; | ||||
|     document.querySelector('#pagination').innerHTML = ''; | ||||
|     hideElem('#rel-container'); | ||||
|     hideElem('#rev-container'); | ||||
|     showElem('#loading-indicator'); | ||||
| @@ -69,9 +69,9 @@ export function initRepoGraphGit() { | ||||
|       const html = await response.text(); | ||||
|       const div = document.createElement('div'); | ||||
|       div.innerHTML = html; | ||||
|       document.getElementById('pagination').innerHTML = div.getElementById('pagination').innerHTML; | ||||
|       document.getElementById('rel-container').innerHTML = div.getElementById('rel-container').innerHTML; | ||||
|       document.getElementById('rev-container').innerHTML = div.getElementById('rev-container').innerHTML; | ||||
|       document.querySelector('#pagination').innerHTML = div.querySelector('#pagination').innerHTML; | ||||
|       document.querySelector('#rel-container').innerHTML = div.querySelector('#rel-container').innerHTML; | ||||
|       document.querySelector('#rev-container').innerHTML = div.querySelector('#rev-container').innerHTML; | ||||
|       hideElem('#loading-indicator'); | ||||
|       showElem('#rel-container'); | ||||
|       showElem('#rev-container'); | ||||
| @@ -82,7 +82,7 @@ export function initRepoGraphGit() { | ||||
|     dropdownSelected.splice(0, 0, '...flow-hide-pr-refs'); | ||||
|   } | ||||
|  | ||||
|   const flowSelectRefsDropdown = document.getElementById('flow-select-refs-dropdown'); | ||||
|   const flowSelectRefsDropdown = document.querySelector('#flow-select-refs-dropdown'); | ||||
|   $(flowSelectRefsDropdown).dropdown('set selected', dropdownSelected); | ||||
|   $(flowSelectRefsDropdown).dropdown({ | ||||
|     clearable: true, | ||||
| @@ -115,7 +115,7 @@ export function initRepoGraphGit() { | ||||
|     if (e.target.matches('#rev-list li')) { | ||||
|       const flow = e.target.getAttribute('data-flow'); | ||||
|       if (flow === '0') return; | ||||
|       document.getElementById(`flow-${flow}`)?.classList.add('highlight'); | ||||
|       document.querySelector(`#flow-${flow}`)?.classList.add('highlight'); | ||||
|       e.target.classList.add('hover'); | ||||
|       for (const item of document.querySelectorAll(`#rev-list li[data-flow='${flow}']`)) { | ||||
|         item.classList.add('highlight'); | ||||
| @@ -136,7 +136,7 @@ export function initRepoGraphGit() { | ||||
|     if (e.target.matches('#rev-list li')) { | ||||
|       const flow = e.target.getAttribute('data-flow'); | ||||
|       if (flow === '0') return; | ||||
|       document.getElementById(`flow-${flow}`)?.classList.remove('highlight'); | ||||
|       document.querySelector(`#flow-${flow}`)?.classList.remove('highlight'); | ||||
|       e.target.classList.remove('hover'); | ||||
|       for (const item of document.querySelectorAll(`#rev-list li[data-flow='${flow}']`)) { | ||||
|         item.classList.remove('highlight'); | ||||
|   | ||||
| @@ -7,11 +7,11 @@ import {showErrorToast} from '../modules/toast.js'; | ||||
| const {appSubUrl} = window.config; | ||||
|  | ||||
| export function initRepoTopicBar() { | ||||
|   const mgrBtn = document.getElementById('manage_topic'); | ||||
|   const mgrBtn = document.querySelector('#manage_topic'); | ||||
|   if (!mgrBtn) return; | ||||
|  | ||||
|   const editDiv = document.getElementById('topic_edit'); | ||||
|   const viewDiv = document.getElementById('repo-topics'); | ||||
|   const editDiv = document.querySelector('#topic_edit'); | ||||
|   const viewDiv = document.querySelector('#repo-topics'); | ||||
|   const topicDropdown = editDiv.querySelector('.ui.dropdown'); | ||||
|   let lastErrorToast; | ||||
|  | ||||
| @@ -28,7 +28,7 @@ export function initRepoTopicBar() { | ||||
|     mgrBtn.focus(); | ||||
|   }); | ||||
|  | ||||
|   document.getElementById('save_topic').addEventListener('click', async (e) => { | ||||
|   document.querySelector('#save_topic').addEventListener('click', async (e) => { | ||||
|     lastErrorToast?.hideToast(); | ||||
|     const topics = editDiv.querySelector('input[name=topics]').value; | ||||
|  | ||||
|   | ||||
| @@ -55,7 +55,7 @@ async function onEditContent(event) { | ||||
|           dropzone.querySelector('.files').append(input); | ||||
|         }); | ||||
|         this.on('removedfile', async (file) => { | ||||
|           document.getElementById(file.uuid)?.remove(); | ||||
|           document.querySelector(`#${file.uuid}`)?.remove(); | ||||
|           if (disableRemovedfileEvent) return; | ||||
|           if (dropzone.getAttribute('data-remove-url') && !fileUuidDict[file.uuid].submitted) { | ||||
|             try { | ||||
| @@ -137,7 +137,7 @@ async function onEditContent(event) { | ||||
|       } | ||||
|       editContentZone.setAttribute('data-content-version', data.contentVersion); | ||||
|       if (!data.content) { | ||||
|         renderContent.innerHTML = document.getElementById('no-content').innerHTML; | ||||
|         renderContent.innerHTML = document.querySelector('#no-content').innerHTML; | ||||
|         rawContent.textContent = ''; | ||||
|       } else { | ||||
|         renderContent.innerHTML = data.content; | ||||
| @@ -166,7 +166,7 @@ async function onEditContent(event) { | ||||
|  | ||||
|   comboMarkdownEditor = getComboMarkdownEditor(editContentZone.querySelector('.combo-markdown-editor')); | ||||
|   if (!comboMarkdownEditor) { | ||||
|     editContentZone.innerHTML = document.getElementById('issue-comment-editor-template').innerHTML; | ||||
|     editContentZone.innerHTML = document.querySelector('#issue-comment-editor-template').innerHTML; | ||||
|     comboMarkdownEditor = await initComboMarkdownEditor(editContentZone.querySelector('.combo-markdown-editor')); | ||||
|     comboMarkdownEditor.attachedDropzoneInst = await setupDropzone(editContentZone.querySelector('.dropzone')); | ||||
|     editContentZone.querySelector('.ui.cancel.button').addEventListener('click', cancelAndReset); | ||||
|   | ||||
| @@ -158,7 +158,7 @@ function initRepoIssueListAuthorDropdown() { | ||||
| } | ||||
|  | ||||
| function initPinRemoveButton() { | ||||
|   for (const button of document.getElementsByClassName('issue-card-unpin')) { | ||||
|   for (const button of document.querySelectorAll('.issue-card-unpin')) { | ||||
|     button.addEventListener('click', async (event) => { | ||||
|       const el = event.currentTarget; | ||||
|       const id = Number(el.getAttribute('data-issue-id')); | ||||
| @@ -182,7 +182,7 @@ async function pinMoveEnd(e) { | ||||
| } | ||||
|  | ||||
| async function initIssuePinSort() { | ||||
|   const pinDiv = document.getElementById('issue-pins'); | ||||
|   const pinDiv = document.querySelector('#issue-pins'); | ||||
|  | ||||
|   if (pinDiv === null) return; | ||||
|  | ||||
|   | ||||
| @@ -2,7 +2,7 @@ import {createApp} from 'vue'; | ||||
| import PullRequestMergeForm from '../components/PullRequestMergeForm.vue'; | ||||
|  | ||||
| export function initRepoPullRequestMergeForm() { | ||||
|   const el = document.getElementById('pull-request-merge-form'); | ||||
|   const el = document.querySelector('#pull-request-merge-form'); | ||||
|   if (!el) return; | ||||
|  | ||||
|   const view = createApp(PullRequestMergeForm); | ||||
|   | ||||
| @@ -44,14 +44,14 @@ export function initRepoIssueTimeTracking() { | ||||
|  | ||||
| async function updateDeadline(deadlineString) { | ||||
|   hideElem('#deadline-err-invalid-date'); | ||||
|   document.getElementById('deadline-loader')?.classList.add('is-loading'); | ||||
|   document.querySelector('#deadline-loader')?.classList.add('is-loading'); | ||||
|  | ||||
|   let realDeadline = null; | ||||
|   if (deadlineString !== '') { | ||||
|     const newDate = Date.parse(deadlineString); | ||||
|  | ||||
|     if (Number.isNaN(newDate)) { | ||||
|       document.getElementById('deadline-loader')?.classList.remove('is-loading'); | ||||
|       document.querySelector('#deadline-loader')?.classList.remove('is-loading'); | ||||
|       showElem('#deadline-err-invalid-date'); | ||||
|       return false; | ||||
|     } | ||||
| @@ -59,7 +59,7 @@ async function updateDeadline(deadlineString) { | ||||
|   } | ||||
|  | ||||
|   try { | ||||
|     const response = await POST(document.getElementById('update-issue-deadline-form').getAttribute('action'), { | ||||
|     const response = await POST(document.querySelector('#update-issue-deadline-form').getAttribute('action'), { | ||||
|       data: {due_date: realDeadline}, | ||||
|     }); | ||||
|  | ||||
| @@ -70,7 +70,7 @@ async function updateDeadline(deadlineString) { | ||||
|     } | ||||
|   } catch (error) { | ||||
|     console.error(error); | ||||
|     document.getElementById('deadline-loader').classList.remove('is-loading'); | ||||
|     document.querySelector('#deadline-loader').classList.remove('is-loading'); | ||||
|     showElem('#deadline-err-invalid-date'); | ||||
|   } | ||||
| } | ||||
| @@ -182,7 +182,7 @@ export function initRepoIssueCommentDelete() { | ||||
|           counter.textContent = String(num); | ||||
|         } | ||||
|  | ||||
|         document.getElementById(deleteButton.getAttribute('data-comment-id'))?.remove(); | ||||
|         document.querySelector(`#${deleteButton.getAttribute('data-comment-id')}`)?.remove(); | ||||
|  | ||||
|         if (conversationHolder && !conversationHolder.querySelector('.comment')) { | ||||
|           const path = conversationHolder.getAttribute('data-path'); | ||||
| @@ -298,7 +298,7 @@ export function initRepoPullRequestMergeInstruction() { | ||||
| } | ||||
|  | ||||
| export function initRepoPullRequestAllowMaintainerEdit() { | ||||
|   const wrapper = document.getElementById('allow-edits-from-maintainers'); | ||||
|   const wrapper = document.querySelector('#allow-edits-from-maintainers'); | ||||
|   if (!wrapper) return; | ||||
|   const checkbox = wrapper.querySelector('input[type="checkbox"]'); | ||||
|   checkbox.addEventListener('input', async () => { | ||||
| @@ -678,7 +678,7 @@ export function initSingleCommentEditor($commentForm) { | ||||
|   // * normal new issue/pr page, no status-button | ||||
|   // * issue/pr view page, with comment form, has status-button | ||||
|   const opts = {}; | ||||
|   const statusButton = document.getElementById('status-button'); | ||||
|   const statusButton = document.querySelector('#status-button'); | ||||
|   if (statusButton) { | ||||
|     opts.onContentChanged = (editor) => { | ||||
|       const statusText = statusButton.getAttribute(editor.value().trim() ? 'data-status-and-comment' : 'data-status'); | ||||
|   | ||||
| @@ -4,10 +4,10 @@ import {GET, POST} from '../modules/fetch.js'; | ||||
| const {appSubUrl} = window.config; | ||||
|  | ||||
| export function initRepoMigrationStatusChecker() { | ||||
|   const repoMigrating = document.getElementById('repo_migrating'); | ||||
|   const repoMigrating = document.querySelector('#repo_migrating'); | ||||
|   if (!repoMigrating) return; | ||||
|  | ||||
|   document.getElementById('repo_migrating_retry').addEventListener('click', doMigrationRetry); | ||||
|   document.querySelector('#repo_migrating_retry').addEventListener('click', doMigrationRetry); | ||||
|  | ||||
|   const task = repoMigrating.getAttribute('data-migrating-task-id'); | ||||
|  | ||||
| @@ -20,7 +20,7 @@ export function initRepoMigrationStatusChecker() { | ||||
|  | ||||
|     // for all status | ||||
|     if (data.message) { | ||||
|       document.getElementById('repo_migrating_progress_message').textContent = data.message; | ||||
|       document.querySelector('#repo_migrating_progress_message').textContent = data.message; | ||||
|     } | ||||
|  | ||||
|     // TaskStatusFinished | ||||
| @@ -36,7 +36,7 @@ export function initRepoMigrationStatusChecker() { | ||||
|       showElem('#repo_migrating_retry'); | ||||
|       showElem('#repo_migrating_failed'); | ||||
|       showElem('#repo_migrating_failed_image'); | ||||
|       document.getElementById('repo_migrating_failed_error').textContent = data.message; | ||||
|       document.querySelector('#repo_migrating_failed_error').textContent = data.message; | ||||
|       return false; | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -1,13 +1,13 @@ | ||||
| import {hideElem, showElem, toggleElem} from '../utils/dom.js'; | ||||
|  | ||||
| const service = document.getElementById('service_type'); | ||||
| const user = document.getElementById('auth_username'); | ||||
| const pass = document.getElementById('auth_password'); | ||||
| const token = document.getElementById('auth_token'); | ||||
| const mirror = document.getElementById('mirror'); | ||||
| const lfs = document.getElementById('lfs'); | ||||
| const lfsSettings = document.getElementById('lfs_settings'); | ||||
| const lfsEndpoint = document.getElementById('lfs_endpoint'); | ||||
| const service = document.querySelector('#service_type'); | ||||
| const user = document.querySelector('#auth_username'); | ||||
| const pass = document.querySelector('#auth_password'); | ||||
| const token = document.querySelector('#auth_token'); | ||||
| const mirror = document.querySelector('#mirror'); | ||||
| const lfs = document.querySelector('#lfs'); | ||||
| const lfsSettings = document.querySelector('#lfs_settings'); | ||||
| const lfsEndpoint = document.querySelector('#lfs_endpoint'); | ||||
| const items = document.querySelectorAll('#migrate_items input[type=checkbox]'); | ||||
|  | ||||
| export function initRepoMigration() { | ||||
| @@ -18,16 +18,16 @@ export function initRepoMigration() { | ||||
|   pass?.addEventListener('input', () => {checkItems(false)}); | ||||
|   token?.addEventListener('input', () => {checkItems(true)}); | ||||
|   mirror?.addEventListener('change', () => {checkItems(true)}); | ||||
|   document.getElementById('lfs_settings_show')?.addEventListener('click', (e) => { | ||||
|   document.querySelector('#lfs_settings_show')?.addEventListener('click', (e) => { | ||||
|     e.preventDefault(); | ||||
|     e.stopPropagation(); | ||||
|     showElem(lfsEndpoint); | ||||
|   }); | ||||
|   lfs?.addEventListener('change', setLFSSettingsVisibility); | ||||
|  | ||||
|   const cloneAddr = document.getElementById('clone_addr'); | ||||
|   const cloneAddr = document.querySelector('#clone_addr'); | ||||
|   cloneAddr?.addEventListener('change', () => { | ||||
|     const repoName = document.getElementById('repo_name'); | ||||
|     const repoName = document.querySelector('#repo_name'); | ||||
|     if (cloneAddr.value && !repoName?.value) { // Only modify if repo_name input is blank | ||||
|       repoName.value = cloneAddr.value.match(/^(.*\/)?((.+?)(\.git)?)$/)[3]; | ||||
|     } | ||||
|   | ||||
| @@ -5,8 +5,8 @@ import {POST, DELETE, PUT} from '../modules/fetch.js'; | ||||
|  | ||||
| function updateIssueCount(cards) { | ||||
|   const parent = cards.parentElement; | ||||
|   const cnt = parent.getElementsByClassName('issue-card').length; | ||||
|   parent.getElementsByClassName('project-column-issue-count')[0].textContent = cnt; | ||||
|   const cnt = parent.querySelectorAll('.issue-card').length; | ||||
|   parent.querySelectorAll('.project-column-issue-count')[0].textContent = cnt; | ||||
| } | ||||
|  | ||||
| async function createNewColumn(url, columnTitle, projectColorInput) { | ||||
| @@ -26,7 +26,7 @@ async function createNewColumn(url, columnTitle, projectColorInput) { | ||||
| } | ||||
|  | ||||
| async function moveIssue({item, from, to, oldIndex}) { | ||||
|   const columnCards = to.getElementsByClassName('issue-card'); | ||||
|   const columnCards = to.querySelectorAll('.issue-card'); | ||||
|   updateIssueCount(from); | ||||
|   updateIssueCount(to); | ||||
|  | ||||
| @@ -53,7 +53,7 @@ async function initRepoProjectSortable() { | ||||
|  | ||||
|   // the HTML layout is: #project-board > .board > .project-column .cards > .issue-card | ||||
|   const mainBoard = els[0]; | ||||
|   let boardColumns = mainBoard.getElementsByClassName('project-column'); | ||||
|   let boardColumns = mainBoard.querySelectorAll('.project-column'); | ||||
|   createSortable(mainBoard, { | ||||
|     group: 'project-column', | ||||
|     draggable: '.project-column', | ||||
| @@ -61,7 +61,7 @@ async function initRepoProjectSortable() { | ||||
|     delayOnTouchOnly: true, | ||||
|     delay: 500, | ||||
|     onSort: async () => { | ||||
|       boardColumns = mainBoard.getElementsByClassName('project-column'); | ||||
|       boardColumns = mainBoard.querySelectorAll('.project-column'); | ||||
|  | ||||
|       const columnSorting = { | ||||
|         columns: Array.from(boardColumns, (column, i) => ({ | ||||
| @@ -81,7 +81,7 @@ async function initRepoProjectSortable() { | ||||
|   }); | ||||
|  | ||||
|   for (const boardColumn of boardColumns) { | ||||
|     const boardCardList = boardColumn.getElementsByClassName('cards')[0]; | ||||
|     const boardCardList = boardColumn.querySelectorAll('.cards')[0]; | ||||
|     createSortable(boardCardList, { | ||||
|       group: 'shared', | ||||
|       onAdd: moveIssue, | ||||
| @@ -99,7 +99,7 @@ export function initRepoProject() { | ||||
|  | ||||
|   const _promise = initRepoProjectSortable(); | ||||
|  | ||||
|   for (const modal of document.getElementsByClassName('edit-project-column-modal')) { | ||||
|   for (const modal of document.querySelectorAll('.edit-project-column-modal')) { | ||||
|     const projectHeader = modal.closest('.project-column-header'); | ||||
|     const projectTitleLabel = projectHeader?.querySelector('.project-column-title-label'); | ||||
|     const projectTitleInput = modal.querySelector('.project-column-title-input'); | ||||
|   | ||||
| @@ -20,7 +20,7 @@ export function initRepoReleaseNew() { | ||||
| } | ||||
|  | ||||
| function initTagNameEditor() { | ||||
|   const el = document.getElementById('tag-name-editor'); | ||||
|   const el = document.querySelector('#tag-name-editor'); | ||||
|   if (!el) return; | ||||
|  | ||||
|   const existingTags = JSON.parse(el.getAttribute('data-existing-tags')); | ||||
| @@ -30,10 +30,10 @@ function initTagNameEditor() { | ||||
|   const newTagHelperText = el.getAttribute('data-tag-helper-new'); | ||||
|   const existingTagHelperText = el.getAttribute('data-tag-helper-existing'); | ||||
|  | ||||
|   const tagNameInput = document.getElementById('tag-name'); | ||||
|   const tagNameInput = document.querySelector('#tag-name'); | ||||
|   const hideTargetInput = function(tagNameInput) { | ||||
|     const value = tagNameInput.value; | ||||
|     const tagHelper = document.getElementById('tag-helper'); | ||||
|     const tagHelper = document.querySelector('#tag-helper'); | ||||
|     if (existingTags.includes(value)) { | ||||
|       // If the tag already exists, hide the target branch selector. | ||||
|       hideElem('#tag-target-selector'); | ||||
|   | ||||
| @@ -44,7 +44,7 @@ export function initRepoSettingsCollaboration() { | ||||
| } | ||||
|  | ||||
| export function initRepoSettingSearchTeamBox() { | ||||
|   const searchTeamBox = document.getElementById('search-team-box'); | ||||
|   const searchTeamBox = document.querySelector('#search-team-box'); | ||||
|   if (!searchTeamBox) return; | ||||
|  | ||||
|   $(searchTeamBox).search({ | ||||
| @@ -78,29 +78,29 @@ export function initRepoSettingGitHook() { | ||||
| export function initRepoSettingBranches() { | ||||
|   if (!document.querySelector('.repository.settings.branches')) return; | ||||
|  | ||||
|   for (const el of document.getElementsByClassName('toggle-target-enabled')) { | ||||
|   for (const el of document.querySelectorAll('.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')) { | ||||
|   for (const el of document.querySelectorAll('.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); | ||||
|   document.querySelector('#dismiss_stale_approvals')?.addEventListener('change', function () { | ||||
|     document.querySelector('#ignore_stale_approvals_box')?.classList.toggle('disabled', this.checked); | ||||
|   }); | ||||
|  | ||||
|   // 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 patterns = (document.querySelector('#status_check_contexts').value || '').split(/[\r\n]+/); | ||||
|     const validPatterns = patterns.map((item) => item.trim()).filter(Boolean); | ||||
|     const marks = document.getElementsByClassName('status-check-matched-mark'); | ||||
|     const marks = document.querySelectorAll('.status-check-matched-mark'); | ||||
|  | ||||
|     for (const el of marks) { | ||||
|       let matched = false; | ||||
| @@ -115,5 +115,5 @@ export function initRepoSettingBranches() { | ||||
|     } | ||||
|   }; | ||||
|   markMatchedStatusChecks(); | ||||
|   document.getElementById('status_check_contexts').addEventListener('input', onInputDebounce(markMatchedStatusChecks)); | ||||
|   document.querySelector('#status_check_contexts').addEventListener('input', onInputDebounce(markMatchedStatusChecks)); | ||||
| } | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| export function initSshKeyFormParser() { | ||||
|   // Parse SSH Key | ||||
|   document.getElementById('ssh-key-content')?.addEventListener('input', function () { | ||||
|   document.querySelector('#ssh-key-content')?.addEventListener('input', function () { | ||||
|     const arrays = this.value.split(' '); | ||||
|     const title = document.getElementById('ssh-key-title'); | ||||
|     const title = document.querySelector('#ssh-key-title'); | ||||
|     if (!title.value && arrays.length === 3 && arrays[2] !== '') { | ||||
|       title.value = arrays[2]; | ||||
|     } | ||||
|   | ||||
| @@ -109,7 +109,7 @@ async function webauthnRegistered(newCredential) { | ||||
| } | ||||
|  | ||||
| function webAuthnError(errorType, message) { | ||||
|   const elErrorMsg = document.getElementById(`webauthn-error-msg`); | ||||
|   const elErrorMsg = document.querySelector(`#webauthn-error-msg`); | ||||
|  | ||||
|   if (errorType === 'general') { | ||||
|     elErrorMsg.textContent = message || 'unknown error'; | ||||
| @@ -140,7 +140,7 @@ function detectWebAuthnSupport() { | ||||
| } | ||||
|  | ||||
| export function initUserAuthWebAuthnRegister() { | ||||
|   const elRegister = document.getElementById('register-webauthn'); | ||||
|   const elRegister = document.querySelector('#register-webauthn'); | ||||
|   if (!elRegister) { | ||||
|     return; | ||||
|   } | ||||
| @@ -155,7 +155,7 @@ export function initUserAuthWebAuthnRegister() { | ||||
| } | ||||
|  | ||||
| async function webAuthnRegisterRequest() { | ||||
|   const elNickname = document.getElementById('nickname'); | ||||
|   const elNickname = document.querySelector('#nickname'); | ||||
|  | ||||
|   const formData = new FormData(); | ||||
|   formData.append('name', elNickname.value); | ||||
|   | ||||
| @@ -1,9 +1,9 @@ | ||||
| import {checkAppUrl} from './common-global.js'; | ||||
|  | ||||
| export function initUserAuthOauth2() { | ||||
|   const outer = document.getElementById('oauth2-login-navigator'); | ||||
|   const outer = document.querySelector('#oauth2-login-navigator'); | ||||
|   if (!outer) return; | ||||
|   const inner = document.getElementById('oauth2-login-navigator-inner'); | ||||
|   const inner = document.querySelector('#oauth2-login-navigator-inner'); | ||||
|  | ||||
|   checkAppUrl(); | ||||
|  | ||||
|   | ||||
| @@ -3,11 +3,11 @@ import {hideElem, showElem} from '../utils/dom.js'; | ||||
| export function initUserSettings() { | ||||
|   if (!document.querySelectorAll('.user.settings.profile').length) return; | ||||
|  | ||||
|   const usernameInput = document.getElementById('username'); | ||||
|   const usernameInput = document.querySelector('#username'); | ||||
|   if (!usernameInput) return; | ||||
|   usernameInput.addEventListener('input', function () { | ||||
|     const prompt = document.getElementById('name-change-prompt'); | ||||
|     const promptRedirect = document.getElementById('name-change-redirect-prompt'); | ||||
|     const prompt = document.querySelector('#name-change-prompt'); | ||||
|     const promptRedirect = document.querySelector('#name-change-redirect-prompt'); | ||||
|     if (this.value.toLowerCase() !== this.getAttribute('data-name').toLowerCase()) { | ||||
|       showElem(prompt); | ||||
|       showElem(promptRedirect); | ||||
|   | ||||
| @@ -9,19 +9,16 @@ function scrollToAnchor(encodedId) { | ||||
|   if (!encodedId) return; | ||||
|   const id = decodeURIComponent(encodedId); | ||||
|   const prefixedId = addPrefix(id); | ||||
|   let el = document.getElementById(prefixedId); | ||||
|   let el = document.querySelector(`#${prefixedId}`); | ||||
|  | ||||
|   // check for matching user-generated `a[name]` | ||||
|   if (!el) { | ||||
|     const nameAnchors = document.getElementsByName(prefixedId); | ||||
|     if (nameAnchors.length) { | ||||
|       el = nameAnchors[0]; | ||||
|     } | ||||
|     el = document.querySelector(`a[name="${CSS.escape(prefixedId)}"]`); | ||||
|   } | ||||
|  | ||||
|   // compat for links with old 'user-content-' prefixed hashes | ||||
|   if (!el && hasPrefix(id)) { | ||||
|     return document.getElementById(id)?.scrollIntoView(); | ||||
|     return document.querySelector(`#${id}`)?.scrollIntoView(); | ||||
|   } | ||||
|  | ||||
|   el?.scrollIntoView(); | ||||
|   | ||||
| @@ -1,11 +1,11 @@ | ||||
| import {showInfoToast, showWarningToast, showErrorToast} from '../modules/toast.js'; | ||||
|  | ||||
| document.getElementById('info-toast').addEventListener('click', () => { | ||||
| document.querySelector('#info-toast').addEventListener('click', () => { | ||||
|   showInfoToast('success 😀'); | ||||
| }); | ||||
| document.getElementById('warning-toast').addEventListener('click', () => { | ||||
| document.querySelector('#warning-toast').addEventListener('click', () => { | ||||
|   showWarningToast('warning 😐'); | ||||
| }); | ||||
| document.getElementById('error-toast').addEventListener('click', () => { | ||||
| document.querySelector('#error-toast').addEventListener('click', () => { | ||||
|   showErrorToast('error 🙁'); | ||||
| }); | ||||
|   | ||||
| @@ -2,7 +2,7 @@ import SwaggerUI from 'swagger-ui-dist/swagger-ui-es-bundle.js'; | ||||
| import 'swagger-ui-dist/swagger-ui.css'; | ||||
|  | ||||
| window.addEventListener('load', async () => { | ||||
|   const url = document.getElementById('swagger-ui').getAttribute('data-source'); | ||||
|   const url = document.querySelector('#swagger-ui').getAttribute('data-source'); | ||||
|   const res = await fetch(url); | ||||
|   const spec = await res.json(); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user