mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	Refactor repo legacy (#32404)
Only move code, no unnecessary logic change. (There are many problems in old code, but changing them is not in this PR's scope) Co-authored-by: Giteabot <teabot@gitea.io>
This commit is contained in:
		| @@ -90,3 +90,14 @@ export function initRepoCommonFilterSearchDropdown(selector) { | |||||||
|     message: {noResults: $dropdown[0].getAttribute('data-no-results')}, |     message: {noResults: $dropdown[0].getAttribute('data-no-results')}, | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | export async function updateIssuesMeta(url, action, issue_ids, id) { | ||||||
|  |   try { | ||||||
|  |     const response = await POST(url, {data: new URLSearchParams({action, issue_ids, id})}); | ||||||
|  |     if (!response.ok) { | ||||||
|  |       throw new Error('Failed to update issues meta'); | ||||||
|  |     } | ||||||
|  |   } catch (error) { | ||||||
|  |     console.error(error); | ||||||
|  |   } | ||||||
|  | } | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| import $ from 'jquery'; | import $ from 'jquery'; | ||||||
| import {updateIssuesMeta} from './repo-issue.ts'; | import {updateIssuesMeta} from './repo-common.ts'; | ||||||
| import {toggleElem, hideElem, isElemHidden} from '../utils/dom.ts'; | import {toggleElem, hideElem, isElemHidden} from '../utils/dom.ts'; | ||||||
| import {htmlEscape} from 'escape-goat'; | import {htmlEscape} from 'escape-goat'; | ||||||
| import {confirmModal} from './comp/ConfirmModal.ts'; | import {confirmModal} from './comp/ConfirmModal.ts'; | ||||||
|   | |||||||
							
								
								
									
										274
									
								
								web_src/js/features/repo-issue-sidebar.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										274
									
								
								web_src/js/features/repo-issue-sidebar.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,274 @@ | |||||||
|  | import $ from 'jquery'; | ||||||
|  | import {POST} from '../modules/fetch.ts'; | ||||||
|  | import {updateIssuesMeta} from './repo-common.ts'; | ||||||
|  | import {svg} from '../svg.ts'; | ||||||
|  | import {htmlEscape} from 'escape-goat'; | ||||||
|  |  | ||||||
|  | // if there are draft comments, confirm before reloading, to avoid losing comments | ||||||
|  | function reloadConfirmDraftComment() { | ||||||
|  |   const commentTextareas = [ | ||||||
|  |     document.querySelector('.edit-content-zone:not(.tw-hidden) textarea'), | ||||||
|  |     document.querySelector('#comment-form textarea'), | ||||||
|  |   ]; | ||||||
|  |   for (const textarea of commentTextareas) { | ||||||
|  |     // Most users won't feel too sad if they lose a comment with 10 chars, they can re-type these in seconds. | ||||||
|  |     // But if they have typed more (like 50) chars and the comment is lost, they will be very unhappy. | ||||||
|  |     if (textarea && textarea.value.trim().length > 10) { | ||||||
|  |       textarea.parentElement.scrollIntoView(); | ||||||
|  |       if (!window.confirm('Page will be reloaded, but there are draft comments. Continuing to reload will discard the comments. Continue?')) { | ||||||
|  |         return; | ||||||
|  |       } | ||||||
|  |       break; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   window.location.reload(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function initBranchSelector() { | ||||||
|  |   const elSelectBranch = document.querySelector('.ui.dropdown.select-branch'); | ||||||
|  |   if (!elSelectBranch) return; | ||||||
|  |  | ||||||
|  |   const urlUpdateIssueRef = elSelectBranch.getAttribute('data-url-update-issueref'); | ||||||
|  |   const $selectBranch = $(elSelectBranch); | ||||||
|  |   const $branchMenu = $selectBranch.find('.reference-list-menu'); | ||||||
|  |   $branchMenu.find('.item:not(.no-select)').on('click', async function (e) { | ||||||
|  |     e.preventDefault(); | ||||||
|  |     const selectedValue = this.getAttribute('data-id'); // eg: "refs/heads/my-branch" | ||||||
|  |     const selectedText = this.getAttribute('data-name'); // eg: "my-branch" | ||||||
|  |     if (urlUpdateIssueRef) { | ||||||
|  |       // for existing issue, send request to update issue ref, and reload page | ||||||
|  |       try { | ||||||
|  |         await POST(urlUpdateIssueRef, {data: new URLSearchParams({ref: selectedValue})}); | ||||||
|  |         window.location.reload(); | ||||||
|  |       } catch (error) { | ||||||
|  |         console.error(error); | ||||||
|  |       } | ||||||
|  |     } else { | ||||||
|  |       // for new issue, only update UI&form, do not send request/reload | ||||||
|  |       const selectedHiddenSelector = this.getAttribute('data-id-selector'); | ||||||
|  |       document.querySelector(selectedHiddenSelector).value = selectedValue; | ||||||
|  |       elSelectBranch.querySelector('.text-branch-name').textContent = selectedText; | ||||||
|  |     } | ||||||
|  |   }); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // List submits | ||||||
|  | function initListSubmits(selector, outerSelector) { | ||||||
|  |   const $list = $(`.ui.${outerSelector}.list`); | ||||||
|  |   const $noSelect = $list.find('.no-select'); | ||||||
|  |   const $listMenu = $(`.${selector} .menu`); | ||||||
|  |   let hasUpdateAction = $listMenu.data('action') === 'update'; | ||||||
|  |   const items = {}; | ||||||
|  |  | ||||||
|  |   $(`.${selector}`).dropdown({ | ||||||
|  |     'action': 'nothing', // do not hide the menu if user presses Enter | ||||||
|  |     fullTextSearch: 'exact', | ||||||
|  |     async onHide() { | ||||||
|  |       hasUpdateAction = $listMenu.data('action') === 'update'; // Update the var | ||||||
|  |       if (hasUpdateAction) { | ||||||
|  |         // TODO: Add batch functionality and make this 1 network request. | ||||||
|  |         const itemEntries = Object.entries(items); | ||||||
|  |         for (const [elementId, item] of itemEntries) { | ||||||
|  |           await updateIssuesMeta( | ||||||
|  |             item['update-url'], | ||||||
|  |             item.action, | ||||||
|  |             item['issue-id'], | ||||||
|  |             elementId, | ||||||
|  |           ); | ||||||
|  |         } | ||||||
|  |         if (itemEntries.length) { | ||||||
|  |           reloadConfirmDraftComment(); | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   $listMenu.find('.item:not(.no-select)').on('click', function (e) { | ||||||
|  |     e.preventDefault(); | ||||||
|  |     if (this.classList.contains('ban-change')) { | ||||||
|  |       return false; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     hasUpdateAction = $listMenu.data('action') === 'update'; // Update the var | ||||||
|  |  | ||||||
|  |     const clickedItem = this; // eslint-disable-line unicorn/no-this-assignment | ||||||
|  |     const scope = this.getAttribute('data-scope'); | ||||||
|  |  | ||||||
|  |     $(this).parent().find('.item').each(function () { | ||||||
|  |       if (scope) { | ||||||
|  |         // Enable only clicked item for scoped labels | ||||||
|  |         if (this.getAttribute('data-scope') !== scope) { | ||||||
|  |           return true; | ||||||
|  |         } | ||||||
|  |         if (this !== clickedItem && !this.classList.contains('checked')) { | ||||||
|  |           return true; | ||||||
|  |         } | ||||||
|  |       } else if (this !== clickedItem) { | ||||||
|  |         // Toggle for other labels | ||||||
|  |         return true; | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       if (this.classList.contains('checked')) { | ||||||
|  |         $(this).removeClass('checked'); | ||||||
|  |         $(this).find('.octicon-check').addClass('tw-invisible'); | ||||||
|  |         if (hasUpdateAction) { | ||||||
|  |           if (!($(this).data('id') in items)) { | ||||||
|  |             items[$(this).data('id')] = { | ||||||
|  |               'update-url': $listMenu.data('update-url'), | ||||||
|  |               action: 'detach', | ||||||
|  |               'issue-id': $listMenu.data('issue-id'), | ||||||
|  |             }; | ||||||
|  |           } else { | ||||||
|  |             delete items[$(this).data('id')]; | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } else { | ||||||
|  |         $(this).addClass('checked'); | ||||||
|  |         $(this).find('.octicon-check').removeClass('tw-invisible'); | ||||||
|  |         if (hasUpdateAction) { | ||||||
|  |           if (!($(this).data('id') in items)) { | ||||||
|  |             items[$(this).data('id')] = { | ||||||
|  |               'update-url': $listMenu.data('update-url'), | ||||||
|  |               action: 'attach', | ||||||
|  |               'issue-id': $listMenu.data('issue-id'), | ||||||
|  |             }; | ||||||
|  |           } else { | ||||||
|  |             delete items[$(this).data('id')]; | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     // TODO: Which thing should be done for choosing review requests | ||||||
|  |     // to make chosen items be shown on time here? | ||||||
|  |     if (selector === 'select-reviewers-modify' || selector === 'select-assignees-modify') { | ||||||
|  |       return false; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     const listIds = []; | ||||||
|  |     $(this).parent().find('.item').each(function () { | ||||||
|  |       if (this.classList.contains('checked')) { | ||||||
|  |         listIds.push($(this).data('id')); | ||||||
|  |         $($(this).data('id-selector')).removeClass('tw-hidden'); | ||||||
|  |       } else { | ||||||
|  |         $($(this).data('id-selector')).addClass('tw-hidden'); | ||||||
|  |       } | ||||||
|  |     }); | ||||||
|  |     if (!listIds.length) { | ||||||
|  |       $noSelect.removeClass('tw-hidden'); | ||||||
|  |     } else { | ||||||
|  |       $noSelect.addClass('tw-hidden'); | ||||||
|  |     } | ||||||
|  |     $($(this).parent().data('id')).val(listIds.join(',')); | ||||||
|  |     return false; | ||||||
|  |   }); | ||||||
|  |   $listMenu.find('.no-select.item').on('click', function (e) { | ||||||
|  |     e.preventDefault(); | ||||||
|  |     if (hasUpdateAction) { | ||||||
|  |       (async () => { | ||||||
|  |         await updateIssuesMeta( | ||||||
|  |           $listMenu.data('update-url'), | ||||||
|  |           'clear', | ||||||
|  |           $listMenu.data('issue-id'), | ||||||
|  |           '', | ||||||
|  |         ); | ||||||
|  |         reloadConfirmDraftComment(); | ||||||
|  |       })(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     $(this).parent().find('.item').each(function () { | ||||||
|  |       $(this).removeClass('checked'); | ||||||
|  |       $(this).find('.octicon-check').addClass('tw-invisible'); | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     if (selector === 'select-reviewers-modify' || selector === 'select-assignees-modify') { | ||||||
|  |       return false; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     $list.find('.item').each(function () { | ||||||
|  |       $(this).addClass('tw-hidden'); | ||||||
|  |     }); | ||||||
|  |     $noSelect.removeClass('tw-hidden'); | ||||||
|  |     $($(this).parent().data('id')).val(''); | ||||||
|  |   }); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function selectItem(select_id, input_id) { | ||||||
|  |   const $menu = $(`${select_id} .menu`); | ||||||
|  |   const $list = $(`.ui${select_id}.list`); | ||||||
|  |   const hasUpdateAction = $menu.data('action') === 'update'; | ||||||
|  |  | ||||||
|  |   $menu.find('.item:not(.no-select)').on('click', function () { | ||||||
|  |     $(this).parent().find('.item').each(function () { | ||||||
|  |       $(this).removeClass('selected active'); | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     $(this).addClass('selected active'); | ||||||
|  |     if (hasUpdateAction) { | ||||||
|  |       (async () => { | ||||||
|  |         await updateIssuesMeta( | ||||||
|  |           $menu.data('update-url'), | ||||||
|  |           '', | ||||||
|  |           $menu.data('issue-id'), | ||||||
|  |           $(this).data('id'), | ||||||
|  |         ); | ||||||
|  |         reloadConfirmDraftComment(); | ||||||
|  |       })(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     let icon = ''; | ||||||
|  |     if (input_id === '#milestone_id') { | ||||||
|  |       icon = svg('octicon-milestone', 18, 'tw-mr-2'); | ||||||
|  |     } else if (input_id === '#project_id') { | ||||||
|  |       icon = svg('octicon-project', 18, 'tw-mr-2'); | ||||||
|  |     } else if (input_id === '#assignee_id') { | ||||||
|  |       icon = `<img class="ui avatar image tw-mr-2" alt="avatar" src=${$(this).data('avatar')}>`; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     $list.find('.selected').html(` | ||||||
|  |         <a class="item muted sidebar-item-link" href="${htmlEscape(this.getAttribute('data-href'))}"> | ||||||
|  |           ${icon} | ||||||
|  |           ${htmlEscape(this.textContent)} | ||||||
|  |         </a> | ||||||
|  |       `); | ||||||
|  |  | ||||||
|  |     $(`.ui${select_id}.list .no-select`).addClass('tw-hidden'); | ||||||
|  |     $(input_id).val($(this).data('id')); | ||||||
|  |   }); | ||||||
|  |   $menu.find('.no-select.item').on('click', function () { | ||||||
|  |     $(this).parent().find('.item:not(.no-select)').each(function () { | ||||||
|  |       $(this).removeClass('selected active'); | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     if (hasUpdateAction) { | ||||||
|  |       (async () => { | ||||||
|  |         await updateIssuesMeta( | ||||||
|  |           $menu.data('update-url'), | ||||||
|  |           '', | ||||||
|  |           $menu.data('issue-id'), | ||||||
|  |           $(this).data('id'), | ||||||
|  |         ); | ||||||
|  |         reloadConfirmDraftComment(); | ||||||
|  |       })(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     $list.find('.selected').html(''); | ||||||
|  |     $list.find('.no-select').removeClass('tw-hidden'); | ||||||
|  |     $(input_id).val(''); | ||||||
|  |   }); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | export function initRepoIssueSidebar() { | ||||||
|  |   initBranchSelector(); | ||||||
|  |  | ||||||
|  |   // Init labels and assignees | ||||||
|  |   initListSubmits('select-label', 'labels'); | ||||||
|  |   initListSubmits('select-assignees', 'assignees'); | ||||||
|  |   initListSubmits('select-assignees-modify', 'assignees'); | ||||||
|  |   initListSubmits('select-reviewers-modify', 'assignees'); | ||||||
|  |  | ||||||
|  |   // Milestone, Assignee, Project | ||||||
|  |   selectItem('.select-project', '#project_id'); | ||||||
|  |   selectItem('.select-milestone', '#milestone_id'); | ||||||
|  |   selectItem('.select-assignee', '#assignee_id'); | ||||||
|  | } | ||||||
| @@ -7,6 +7,8 @@ import {ComboMarkdownEditor, getComboMarkdownEditor, initComboMarkdownEditor} fr | |||||||
| import {toAbsoluteUrl} from '../utils.ts'; | import {toAbsoluteUrl} from '../utils.ts'; | ||||||
| import {GET, POST} from '../modules/fetch.ts'; | import {GET, POST} from '../modules/fetch.ts'; | ||||||
| import {showErrorToast} from '../modules/toast.ts'; | import {showErrorToast} from '../modules/toast.ts'; | ||||||
|  | import {initRepoIssueSidebar} from './repo-issue-sidebar.ts'; | ||||||
|  | import {updateIssuesMeta} from './repo-common.ts'; | ||||||
|  |  | ||||||
| const {appSubUrl} = window.config; | const {appSubUrl} = window.config; | ||||||
|  |  | ||||||
| @@ -369,17 +371,6 @@ export function initRepoIssueWipTitle() { | |||||||
|   }); |   }); | ||||||
| } | } | ||||||
|  |  | ||||||
| export async function updateIssuesMeta(url, action, issue_ids, id) { |  | ||||||
|   try { |  | ||||||
|     const response = await POST(url, {data: new URLSearchParams({action, issue_ids, id})}); |  | ||||||
|     if (!response.ok) { |  | ||||||
|       throw new Error('Failed to update issues meta'); |  | ||||||
|     } |  | ||||||
|   } catch (error) { |  | ||||||
|     console.error(error); |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| export function initRepoIssueComments() { | export function initRepoIssueComments() { | ||||||
|   if (!$('.repository.view.issue .timeline').length) return; |   if (!$('.repository.view.issue .timeline').length) return; | ||||||
|  |  | ||||||
| @@ -665,7 +656,7 @@ export function initRepoIssueBranchSelect() { | |||||||
|   }); |   }); | ||||||
| } | } | ||||||
|  |  | ||||||
| export async function initSingleCommentEditor($commentForm) { | async function initSingleCommentEditor($commentForm) { | ||||||
|   // pages: |   // pages: | ||||||
|   // * normal new issue/pr page: no status-button, no comment-button (there is only a normal submit button which can submit empty content) |   // * normal new issue/pr page: no status-button, no comment-button (there is only a normal submit button which can submit empty content) | ||||||
|   // * issue/pr view page: with comment form, has status-button and comment-button |   // * issue/pr view page: with comment form, has status-button and comment-button | ||||||
| @@ -687,7 +678,7 @@ export async function initSingleCommentEditor($commentForm) { | |||||||
|   syncUiState(); |   syncUiState(); | ||||||
| } | } | ||||||
|  |  | ||||||
| export function initIssueTemplateCommentEditors($commentForm) { | function initIssueTemplateCommentEditors($commentForm) { | ||||||
|   // pages: |   // pages: | ||||||
|   // * new issue with issue template |   // * new issue with issue template | ||||||
|   const $comboFields = $commentForm.find('.combo-editor-dropzone'); |   const $comboFields = $commentForm.find('.combo-editor-dropzone'); | ||||||
| @@ -733,3 +724,18 @@ export function initArchivedLabelHandler() { | |||||||
|     toggleElem(label, label.classList.contains('checked')); |     toggleElem(label, label.classList.contains('checked')); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | export function initRepoCommentFormAndSidebar() { | ||||||
|  |   const $commentForm = $('.comment.form'); | ||||||
|  |   if (!$commentForm.length) return; | ||||||
|  |  | ||||||
|  |   if ($commentForm.find('.field.combo-editor-dropzone').length) { | ||||||
|  |     // at the moment, if a form has multiple combo-markdown-editors, it must be an issue template form | ||||||
|  |     initIssueTemplateCommentEditors($commentForm); | ||||||
|  |   } else if ($commentForm.find('.combo-markdown-editor').length) { | ||||||
|  |     // it's quite unclear about the "comment form" elements, sometimes it's for issue comment, sometimes it's for file editor/uploader message | ||||||
|  |     initSingleCommentEditor($commentForm); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   initRepoIssueSidebar(); | ||||||
|  | } | ||||||
|   | |||||||
| @@ -1,13 +1,12 @@ | |||||||
| import $ from 'jquery'; | import $ from 'jquery'; | ||||||
| import { | import { | ||||||
|  |   initRepoCommentFormAndSidebar, | ||||||
|   initRepoIssueBranchSelect, initRepoIssueCodeCommentCancel, initRepoIssueCommentDelete, |   initRepoIssueBranchSelect, initRepoIssueCodeCommentCancel, initRepoIssueCommentDelete, | ||||||
|   initRepoIssueComments, initRepoIssueDependencyDelete, initRepoIssueReferenceIssue, |   initRepoIssueComments, initRepoIssueDependencyDelete, initRepoIssueReferenceIssue, | ||||||
|   initRepoIssueTitleEdit, initRepoIssueWipToggle, |   initRepoIssueTitleEdit, initRepoIssueWipToggle, | ||||||
|   initRepoPullRequestUpdate, updateIssuesMeta, initIssueTemplateCommentEditors, initSingleCommentEditor, |   initRepoPullRequestUpdate, | ||||||
| } from './repo-issue.ts'; | } from './repo-issue.ts'; | ||||||
| import {initUnicodeEscapeButton} from './repo-unicode-escape.ts'; | import {initUnicodeEscapeButton} from './repo-unicode-escape.ts'; | ||||||
| import {svg} from '../svg.ts'; |  | ||||||
| import {htmlEscape} from 'escape-goat'; |  | ||||||
| import {initRepoBranchTagSelector} from '../components/RepoBranchTagSelector.vue'; | import {initRepoBranchTagSelector} from '../components/RepoBranchTagSelector.vue'; | ||||||
| import { | import { | ||||||
|   initRepoCloneLink, initRepoCommonBranchOrTagDropdown, initRepoCommonFilterSearchDropdown, |   initRepoCloneLink, initRepoCommonBranchOrTagDropdown, initRepoCommonFilterSearchDropdown, | ||||||
| @@ -16,32 +15,13 @@ import {initCitationFileCopyContent} from './citation.ts'; | |||||||
| import {initCompLabelEdit} from './comp/LabelEdit.ts'; | import {initCompLabelEdit} from './comp/LabelEdit.ts'; | ||||||
| import {initRepoDiffConversationNav} from './repo-diff.ts'; | import {initRepoDiffConversationNav} from './repo-diff.ts'; | ||||||
| import {initCompReactionSelector} from './comp/ReactionSelector.ts'; | import {initCompReactionSelector} from './comp/ReactionSelector.ts'; | ||||||
| import {initRepoSettingBranches} from './repo-settings.ts'; | import {initRepoSettings} from './repo-settings.ts'; | ||||||
| import {initRepoPullRequestMergeForm} from './repo-issue-pr-form.ts'; | import {initRepoPullRequestMergeForm} from './repo-issue-pr-form.ts'; | ||||||
| import {initRepoPullRequestCommitStatus} from './repo-issue-pr-status.ts'; | import {initRepoPullRequestCommitStatus} from './repo-issue-pr-status.ts'; | ||||||
| import {hideElem, queryElemChildren, showElem} from '../utils/dom.ts'; | import {hideElem, queryElemChildren, showElem} from '../utils/dom.ts'; | ||||||
| import {POST} from '../modules/fetch.ts'; |  | ||||||
| import {initRepoIssueCommentEdit} from './repo-issue-edit.ts'; | import {initRepoIssueCommentEdit} from './repo-issue-edit.ts'; | ||||||
|  | import {initRepoMilestone} from './repo-milestone.ts'; | ||||||
| // if there are draft comments, confirm before reloading, to avoid losing comments | import {initRepoNew} from './repo-new.ts'; | ||||||
| function reloadConfirmDraftComment() { |  | ||||||
|   const commentTextareas = [ |  | ||||||
|     document.querySelector('.edit-content-zone:not(.tw-hidden) textarea'), |  | ||||||
|     document.querySelector('#comment-form textarea'), |  | ||||||
|   ]; |  | ||||||
|   for (const textarea of commentTextareas) { |  | ||||||
|     // Most users won't feel too sad if they lose a comment with 10 chars, they can re-type these in seconds. |  | ||||||
|     // But if they have typed more (like 50) chars and the comment is lost, they will be very unhappy. |  | ||||||
|     if (textarea && textarea.value.trim().length > 10) { |  | ||||||
|       textarea.parentElement.scrollIntoView(); |  | ||||||
|       if (!window.confirm('Page will be reloaded, but there are draft comments. Continuing to reload will discard the comments. Continue?')) { |  | ||||||
|         return; |  | ||||||
|       } |  | ||||||
|       break; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|   window.location.reload(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| export function initBranchSelectorTabs() { | export function initBranchSelectorTabs() { | ||||||
|   const elSelectBranch = document.querySelector('.ui.dropdown.select-branch'); |   const elSelectBranch = document.querySelector('.ui.dropdown.select-branch'); | ||||||
| @@ -56,320 +36,16 @@ export function initBranchSelectorTabs() { | |||||||
|   }); |   }); | ||||||
| } | } | ||||||
|  |  | ||||||
| export function initRepoCommentForm() { |  | ||||||
|   const $commentForm = $('.comment.form'); |  | ||||||
|   if (!$commentForm.length) return; |  | ||||||
|  |  | ||||||
|   if ($commentForm.find('.field.combo-editor-dropzone').length) { |  | ||||||
|     // at the moment, if a form has multiple combo-markdown-editors, it must be an issue template form |  | ||||||
|     initIssueTemplateCommentEditors($commentForm); |  | ||||||
|   } else if ($commentForm.find('.combo-markdown-editor').length) { |  | ||||||
|     // it's quite unclear about the "comment form" elements, sometimes it's for issue comment, sometimes it's for file editor/uploader message |  | ||||||
|     initSingleCommentEditor($commentForm); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   function initBranchSelector() { |  | ||||||
|     const elSelectBranch = document.querySelector('.ui.dropdown.select-branch'); |  | ||||||
|     if (!elSelectBranch) return; |  | ||||||
|  |  | ||||||
|     const urlUpdateIssueRef = elSelectBranch.getAttribute('data-url-update-issueref'); |  | ||||||
|     const $selectBranch = $(elSelectBranch); |  | ||||||
|     const $branchMenu = $selectBranch.find('.reference-list-menu'); |  | ||||||
|     $branchMenu.find('.item:not(.no-select)').on('click', async function (e) { |  | ||||||
|       e.preventDefault(); |  | ||||||
|       const selectedValue = this.getAttribute('data-id'); // eg: "refs/heads/my-branch" |  | ||||||
|       const selectedText = this.getAttribute('data-name'); // eg: "my-branch" |  | ||||||
|       if (urlUpdateIssueRef) { |  | ||||||
|         // for existing issue, send request to update issue ref, and reload page |  | ||||||
|         try { |  | ||||||
|           await POST(urlUpdateIssueRef, {data: new URLSearchParams({ref: selectedValue})}); |  | ||||||
|           window.location.reload(); |  | ||||||
|         } catch (error) { |  | ||||||
|           console.error(error); |  | ||||||
|         } |  | ||||||
|       } else { |  | ||||||
|         // for new issue, only update UI&form, do not send request/reload |  | ||||||
|         const selectedHiddenSelector = this.getAttribute('data-id-selector'); |  | ||||||
|         document.querySelector(selectedHiddenSelector).value = selectedValue; |  | ||||||
|         elSelectBranch.querySelector('.text-branch-name').textContent = selectedText; |  | ||||||
|       } |  | ||||||
|     }); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   initBranchSelector(); |  | ||||||
|  |  | ||||||
|   // List submits |  | ||||||
|   function initListSubmits(selector, outerSelector) { |  | ||||||
|     const $list = $(`.ui.${outerSelector}.list`); |  | ||||||
|     const $noSelect = $list.find('.no-select'); |  | ||||||
|     const $listMenu = $(`.${selector} .menu`); |  | ||||||
|     let hasUpdateAction = $listMenu.data('action') === 'update'; |  | ||||||
|     const items = {}; |  | ||||||
|  |  | ||||||
|     $(`.${selector}`).dropdown({ |  | ||||||
|       'action': 'nothing', // do not hide the menu if user presses Enter |  | ||||||
|       fullTextSearch: 'exact', |  | ||||||
|       async onHide() { |  | ||||||
|         hasUpdateAction = $listMenu.data('action') === 'update'; // Update the var |  | ||||||
|         if (hasUpdateAction) { |  | ||||||
|           // TODO: Add batch functionality and make this 1 network request. |  | ||||||
|           const itemEntries = Object.entries(items); |  | ||||||
|           for (const [elementId, item] of itemEntries) { |  | ||||||
|             await updateIssuesMeta( |  | ||||||
|               item['update-url'], |  | ||||||
|               item.action, |  | ||||||
|               item['issue-id'], |  | ||||||
|               elementId, |  | ||||||
|             ); |  | ||||||
|           } |  | ||||||
|           if (itemEntries.length) { |  | ||||||
|             reloadConfirmDraftComment(); |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|       }, |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     $listMenu.find('.item:not(.no-select)').on('click', function (e) { |  | ||||||
|       e.preventDefault(); |  | ||||||
|       if (this.classList.contains('ban-change')) { |  | ||||||
|         return false; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       hasUpdateAction = $listMenu.data('action') === 'update'; // Update the var |  | ||||||
|  |  | ||||||
|       const clickedItem = this; // eslint-disable-line unicorn/no-this-assignment |  | ||||||
|       const scope = this.getAttribute('data-scope'); |  | ||||||
|  |  | ||||||
|       $(this).parent().find('.item').each(function () { |  | ||||||
|         if (scope) { |  | ||||||
|           // Enable only clicked item for scoped labels |  | ||||||
|           if (this.getAttribute('data-scope') !== scope) { |  | ||||||
|             return true; |  | ||||||
|           } |  | ||||||
|           if (this !== clickedItem && !this.classList.contains('checked')) { |  | ||||||
|             return true; |  | ||||||
|           } |  | ||||||
|         } else if (this !== clickedItem) { |  | ||||||
|           // Toggle for other labels |  | ||||||
|           return true; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         if (this.classList.contains('checked')) { |  | ||||||
|           $(this).removeClass('checked'); |  | ||||||
|           $(this).find('.octicon-check').addClass('tw-invisible'); |  | ||||||
|           if (hasUpdateAction) { |  | ||||||
|             if (!($(this).data('id') in items)) { |  | ||||||
|               items[$(this).data('id')] = { |  | ||||||
|                 'update-url': $listMenu.data('update-url'), |  | ||||||
|                 action: 'detach', |  | ||||||
|                 'issue-id': $listMenu.data('issue-id'), |  | ||||||
|               }; |  | ||||||
|             } else { |  | ||||||
|               delete items[$(this).data('id')]; |  | ||||||
|             } |  | ||||||
|           } |  | ||||||
|         } else { |  | ||||||
|           $(this).addClass('checked'); |  | ||||||
|           $(this).find('.octicon-check').removeClass('tw-invisible'); |  | ||||||
|           if (hasUpdateAction) { |  | ||||||
|             if (!($(this).data('id') in items)) { |  | ||||||
|               items[$(this).data('id')] = { |  | ||||||
|                 'update-url': $listMenu.data('update-url'), |  | ||||||
|                 action: 'attach', |  | ||||||
|                 'issue-id': $listMenu.data('issue-id'), |  | ||||||
|               }; |  | ||||||
|             } else { |  | ||||||
|               delete items[$(this).data('id')]; |  | ||||||
|             } |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|       }); |  | ||||||
|  |  | ||||||
|       // TODO: Which thing should be done for choosing review requests |  | ||||||
|       // to make chosen items be shown on time here? |  | ||||||
|       if (selector === 'select-reviewers-modify' || selector === 'select-assignees-modify') { |  | ||||||
|         return false; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       const listIds = []; |  | ||||||
|       $(this).parent().find('.item').each(function () { |  | ||||||
|         if (this.classList.contains('checked')) { |  | ||||||
|           listIds.push($(this).data('id')); |  | ||||||
|           $($(this).data('id-selector')).removeClass('tw-hidden'); |  | ||||||
|         } else { |  | ||||||
|           $($(this).data('id-selector')).addClass('tw-hidden'); |  | ||||||
|         } |  | ||||||
|       }); |  | ||||||
|       if (!listIds.length) { |  | ||||||
|         $noSelect.removeClass('tw-hidden'); |  | ||||||
|       } else { |  | ||||||
|         $noSelect.addClass('tw-hidden'); |  | ||||||
|       } |  | ||||||
|       $($(this).parent().data('id')).val(listIds.join(',')); |  | ||||||
|       return false; |  | ||||||
|     }); |  | ||||||
|     $listMenu.find('.no-select.item').on('click', function (e) { |  | ||||||
|       e.preventDefault(); |  | ||||||
|       if (hasUpdateAction) { |  | ||||||
|         (async () => { |  | ||||||
|           await updateIssuesMeta( |  | ||||||
|             $listMenu.data('update-url'), |  | ||||||
|             'clear', |  | ||||||
|             $listMenu.data('issue-id'), |  | ||||||
|             '', |  | ||||||
|           ); |  | ||||||
|           reloadConfirmDraftComment(); |  | ||||||
|         })(); |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       $(this).parent().find('.item').each(function () { |  | ||||||
|         $(this).removeClass('checked'); |  | ||||||
|         $(this).find('.octicon-check').addClass('tw-invisible'); |  | ||||||
|       }); |  | ||||||
|  |  | ||||||
|       if (selector === 'select-reviewers-modify' || selector === 'select-assignees-modify') { |  | ||||||
|         return false; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       $list.find('.item').each(function () { |  | ||||||
|         $(this).addClass('tw-hidden'); |  | ||||||
|       }); |  | ||||||
|       $noSelect.removeClass('tw-hidden'); |  | ||||||
|       $($(this).parent().data('id')).val(''); |  | ||||||
|     }); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // Init labels and assignees |  | ||||||
|   initListSubmits('select-label', 'labels'); |  | ||||||
|   initListSubmits('select-assignees', 'assignees'); |  | ||||||
|   initListSubmits('select-assignees-modify', 'assignees'); |  | ||||||
|   initListSubmits('select-reviewers-modify', 'assignees'); |  | ||||||
|  |  | ||||||
|   function selectItem(select_id, input_id) { |  | ||||||
|     const $menu = $(`${select_id} .menu`); |  | ||||||
|     const $list = $(`.ui${select_id}.list`); |  | ||||||
|     const hasUpdateAction = $menu.data('action') === 'update'; |  | ||||||
|  |  | ||||||
|     $menu.find('.item:not(.no-select)').on('click', function () { |  | ||||||
|       $(this).parent().find('.item').each(function () { |  | ||||||
|         $(this).removeClass('selected active'); |  | ||||||
|       }); |  | ||||||
|  |  | ||||||
|       $(this).addClass('selected active'); |  | ||||||
|       if (hasUpdateAction) { |  | ||||||
|         (async () => { |  | ||||||
|           await updateIssuesMeta( |  | ||||||
|             $menu.data('update-url'), |  | ||||||
|             '', |  | ||||||
|             $menu.data('issue-id'), |  | ||||||
|             $(this).data('id'), |  | ||||||
|           ); |  | ||||||
|           reloadConfirmDraftComment(); |  | ||||||
|         })(); |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       let icon = ''; |  | ||||||
|       if (input_id === '#milestone_id') { |  | ||||||
|         icon = svg('octicon-milestone', 18, 'tw-mr-2'); |  | ||||||
|       } else if (input_id === '#project_id') { |  | ||||||
|         icon = svg('octicon-project', 18, 'tw-mr-2'); |  | ||||||
|       } else if (input_id === '#assignee_id') { |  | ||||||
|         icon = `<img class="ui avatar image tw-mr-2" alt="avatar" src=${$(this).data('avatar')}>`; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       $list.find('.selected').html(` |  | ||||||
|         <a class="item muted sidebar-item-link" href="${htmlEscape(this.getAttribute('data-href'))}"> |  | ||||||
|           ${icon} |  | ||||||
|           ${htmlEscape(this.textContent)} |  | ||||||
|         </a> |  | ||||||
|       `); |  | ||||||
|  |  | ||||||
|       $(`.ui${select_id}.list .no-select`).addClass('tw-hidden'); |  | ||||||
|       $(input_id).val($(this).data('id')); |  | ||||||
|     }); |  | ||||||
|     $menu.find('.no-select.item').on('click', function () { |  | ||||||
|       $(this).parent().find('.item:not(.no-select)').each(function () { |  | ||||||
|         $(this).removeClass('selected active'); |  | ||||||
|       }); |  | ||||||
|  |  | ||||||
|       if (hasUpdateAction) { |  | ||||||
|         (async () => { |  | ||||||
|           await updateIssuesMeta( |  | ||||||
|             $menu.data('update-url'), |  | ||||||
|             '', |  | ||||||
|             $menu.data('issue-id'), |  | ||||||
|             $(this).data('id'), |  | ||||||
|           ); |  | ||||||
|           reloadConfirmDraftComment(); |  | ||||||
|         })(); |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       $list.find('.selected').html(''); |  | ||||||
|       $list.find('.no-select').removeClass('tw-hidden'); |  | ||||||
|       $(input_id).val(''); |  | ||||||
|     }); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // Milestone, Assignee, Project |  | ||||||
|   selectItem('.select-project', '#project_id'); |  | ||||||
|   selectItem('.select-milestone', '#milestone_id'); |  | ||||||
|   selectItem('.select-assignee', '#assignee_id'); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| export function initRepository() { | export function initRepository() { | ||||||
|   if (!$('.page-content.repository').length) return; |   if (!$('.page-content.repository').length) return; | ||||||
|  |  | ||||||
|   initRepoBranchTagSelector('.js-branch-tag-selector'); |   initRepoBranchTagSelector('.js-branch-tag-selector'); | ||||||
|  |   initRepoCommentFormAndSidebar(); | ||||||
|   // Options |  | ||||||
|   if ($('.repository.settings.options').length > 0) { |  | ||||||
|     // Enable or select internal/external wiki system and issue tracker. |  | ||||||
|     $('.enable-system').on('change', function () { |  | ||||||
|       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'); |  | ||||||
|       } |  | ||||||
|     }); |  | ||||||
|     $('.enable-system-radio').on('change', function () { |  | ||||||
|       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'); |  | ||||||
|     }); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // Labels |   // Labels | ||||||
|   initCompLabelEdit('.repository.labels'); |   initCompLabelEdit('.repository.labels'); | ||||||
|  |   initRepoMilestone(); | ||||||
|   // Milestones |   initRepoNew(); | ||||||
|   if ($('.repository.new.milestone').length > 0) { |  | ||||||
|     $('#clear-date').on('click', () => { |  | ||||||
|       $('#deadline').val(''); |  | ||||||
|       return false; |  | ||||||
|     }); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // Repo Creation |  | ||||||
|   if ($('.repository.new.repo').length > 0) { |  | ||||||
|     $('input[name="gitignores"], input[name="license"]').on('change', () => { |  | ||||||
|       const gitignores = $('input[name="gitignores"]').val(); |  | ||||||
|       const license = $('input[name="license"]').val(); |  | ||||||
|       if (gitignores || license) { |  | ||||||
|         document.querySelector('input[name="auto_init"]').checked = true; |  | ||||||
|       } |  | ||||||
|     }); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // Compare or pull request |   // Compare or pull request | ||||||
|   const $repoDiff = $('.repository.diff'); |   const $repoDiff = $('.repository.diff'); | ||||||
| @@ -380,7 +56,7 @@ export function initRepository() { | |||||||
|  |  | ||||||
|   initRepoCloneLink(); |   initRepoCloneLink(); | ||||||
|   initCitationFileCopyContent(); |   initCitationFileCopyContent(); | ||||||
|   initRepoSettingBranches(); |   initRepoSettings(); | ||||||
|  |  | ||||||
|   // Issues |   // Issues | ||||||
|   if ($('.repository.view.issue').length > 0) { |   if ($('.repository.view.issue').length > 0) { | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								web_src/js/features/repo-milestone.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								web_src/js/features/repo-milestone.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | import $ from 'jquery'; | ||||||
|  |  | ||||||
|  | export function initRepoMilestone() { | ||||||
|  |   // Milestones | ||||||
|  |   if ($('.repository.new.milestone').length > 0) { | ||||||
|  |     $('#clear-date').on('click', () => { | ||||||
|  |       $('#deadline').val(''); | ||||||
|  |       return false; | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										14
									
								
								web_src/js/features/repo-new.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								web_src/js/features/repo-new.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | |||||||
|  | import $ from 'jquery'; | ||||||
|  |  | ||||||
|  | export function initRepoNew() { | ||||||
|  |   // Repo Creation | ||||||
|  |   if ($('.repository.new.repo').length > 0) { | ||||||
|  |     $('input[name="gitignores"], input[name="license"]').on('change', () => { | ||||||
|  |       const gitignores = $('input[name="gitignores"]').val(); | ||||||
|  |       const license = $('input[name="license"]').val(); | ||||||
|  |       if (gitignores || license) { | ||||||
|  |         document.querySelector('input[name="auto_init"]').checked = true; | ||||||
|  |       } | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -6,7 +6,7 @@ import {POST} from '../modules/fetch.ts'; | |||||||
|  |  | ||||||
| const {appSubUrl, csrfToken} = window.config; | const {appSubUrl, csrfToken} = window.config; | ||||||
|  |  | ||||||
| export function initRepoSettingsCollaboration() { | function initRepoSettingsCollaboration() { | ||||||
|   // Change collaborator access mode |   // Change collaborator access mode | ||||||
|   for (const dropdownEl of queryElems('.page-content.repository .ui.dropdown.access-mode')) { |   for (const dropdownEl of queryElems('.page-content.repository .ui.dropdown.access-mode')) { | ||||||
|     const textEl = dropdownEl.querySelector(':scope > .text'); |     const textEl = dropdownEl.querySelector(':scope > .text'); | ||||||
| @@ -43,7 +43,7 @@ export function initRepoSettingsCollaboration() { | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| export function initRepoSettingSearchTeamBox() { | function initRepoSettingsSearchTeamBox() { | ||||||
|   const searchTeamBox = document.querySelector('#search-team-box'); |   const searchTeamBox = document.querySelector('#search-team-box'); | ||||||
|   if (!searchTeamBox) return; |   if (!searchTeamBox) return; | ||||||
|  |  | ||||||
| @@ -69,13 +69,13 @@ export function initRepoSettingSearchTeamBox() { | |||||||
|   }); |   }); | ||||||
| } | } | ||||||
|  |  | ||||||
| export function initRepoSettingGitHook() { | function initRepoSettingsGitHook() { | ||||||
|   if (!$('.edit.githook').length) return; |   if (!$('.edit.githook').length) return; | ||||||
|   const filename = document.querySelector('.hook-filename').textContent; |   const filename = document.querySelector('.hook-filename').textContent; | ||||||
|   const _promise = createMonaco($('#content')[0], filename, {language: 'shell'}); |   createMonaco($('#content')[0], filename, {language: 'shell'}); | ||||||
| } | } | ||||||
|  |  | ||||||
| export function initRepoSettingBranches() { | function initRepoSettingsBranches() { | ||||||
|   if (!document.querySelector('.repository.settings.branches')) return; |   if (!document.querySelector('.repository.settings.branches')) return; | ||||||
|  |  | ||||||
|   for (const el of document.querySelectorAll('.toggle-target-enabled')) { |   for (const el of document.querySelectorAll('.toggle-target-enabled')) { | ||||||
| @@ -117,3 +117,41 @@ export function initRepoSettingBranches() { | |||||||
|   markMatchedStatusChecks(); |   markMatchedStatusChecks(); | ||||||
|   document.querySelector('#status_check_contexts').addEventListener('input', onInputDebounce(markMatchedStatusChecks)); |   document.querySelector('#status_check_contexts').addEventListener('input', onInputDebounce(markMatchedStatusChecks)); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | function initRepoSettingsOptions() { | ||||||
|  |   if ($('.repository.settings.options').length > 0) { | ||||||
|  |     // Enable or select internal/external wiki system and issue tracker. | ||||||
|  |     $('.enable-system').on('change', function () { | ||||||
|  |       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'); | ||||||
|  |       } | ||||||
|  |     }); | ||||||
|  |     $('.enable-system-radio').on('change', function () { | ||||||
|  |       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(); | ||||||
|  | } | ||||||
|   | |||||||
| @@ -43,11 +43,6 @@ import {initSshKeyFormParser} from './features/sshkey-helper.ts'; | |||||||
| import {initUserSettings} from './features/user-settings.ts'; | import {initUserSettings} from './features/user-settings.ts'; | ||||||
| import {initRepoActivityTopAuthorsChart, initRepoArchiveLinks} from './features/repo-common.ts'; | import {initRepoActivityTopAuthorsChart, initRepoArchiveLinks} from './features/repo-common.ts'; | ||||||
| import {initRepoMigrationStatusChecker} from './features/repo-migrate.ts'; | import {initRepoMigrationStatusChecker} from './features/repo-migrate.ts'; | ||||||
| import { |  | ||||||
|   initRepoSettingGitHook, |  | ||||||
|   initRepoSettingsCollaboration, |  | ||||||
|   initRepoSettingSearchTeamBox, |  | ||||||
| } from './features/repo-settings.ts'; |  | ||||||
| import {initRepoDiffView} from './features/repo-diff.ts'; | import {initRepoDiffView} from './features/repo-diff.ts'; | ||||||
| import {initOrgTeamSearchRepoBox, initOrgTeamSettings} from './features/org-team.ts'; | import {initOrgTeamSearchRepoBox, initOrgTeamSettings} from './features/org-team.ts'; | ||||||
| import {initUserAuthWebAuthn, initUserAuthWebAuthnRegister} from './features/user-auth-webauthn.ts'; | import {initUserAuthWebAuthn, initUserAuthWebAuthnRegister} from './features/user-auth-webauthn.ts'; | ||||||
| @@ -59,7 +54,7 @@ import {initCompWebHookEditor} from './features/comp/WebHookEditor.ts'; | |||||||
| import {initRepoBranchButton} from './features/repo-branch.ts'; | import {initRepoBranchButton} from './features/repo-branch.ts'; | ||||||
| import {initCommonOrganization} from './features/common-organization.ts'; | import {initCommonOrganization} from './features/common-organization.ts'; | ||||||
| import {initRepoWikiForm} from './features/repo-wiki.ts'; | import {initRepoWikiForm} from './features/repo-wiki.ts'; | ||||||
| import {initRepoCommentForm, initRepository, initBranchSelectorTabs} from './features/repo-legacy.ts'; | import {initRepository, initBranchSelectorTabs} from './features/repo-legacy.ts'; | ||||||
| import {initCopyContent} from './features/copycontent.ts'; | import {initCopyContent} from './features/copycontent.ts'; | ||||||
| import {initCaptcha} from './features/captcha.ts'; | import {initCaptcha} from './features/captcha.ts'; | ||||||
| import {initRepositoryActionView} from './components/RepoActionView.vue'; | import {initRepositoryActionView} from './components/RepoActionView.vue'; | ||||||
| @@ -180,7 +175,6 @@ onDomReady(() => { | |||||||
|     initRepoArchiveLinks, |     initRepoArchiveLinks, | ||||||
|     initRepoBranchButton, |     initRepoBranchButton, | ||||||
|     initRepoCodeView, |     initRepoCodeView, | ||||||
|     initRepoCommentForm, |  | ||||||
|     initBranchSelectorTabs, |     initBranchSelectorTabs, | ||||||
|     initRepoEllipsisButton, |     initRepoEllipsisButton, | ||||||
|     initRepoDiffCommitBranchesAndTags, |     initRepoDiffCommitBranchesAndTags, | ||||||
| @@ -202,9 +196,6 @@ onDomReady(() => { | |||||||
|     initRepoPullRequestReview, |     initRepoPullRequestReview, | ||||||
|     initRepoRelease, |     initRepoRelease, | ||||||
|     initRepoReleaseNew, |     initRepoReleaseNew, | ||||||
|     initRepoSettingGitHook, |  | ||||||
|     initRepoSettingSearchTeamBox, |  | ||||||
|     initRepoSettingsCollaboration, |  | ||||||
|     initRepoTemplateSearch, |     initRepoTemplateSearch, | ||||||
|     initRepoTopicBar, |     initRepoTopicBar, | ||||||
|     initRepoWikiForm, |     initRepoWikiForm, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user