]> source.dussan.org Git - gitea.git/commitdiff
Refactor repo legacy (#32404)
authorwxiaoguang <wxiaoguang@gmail.com>
Sun, 3 Nov 2024 11:00:12 +0000 (19:00 +0800)
committerGitHub <noreply@github.com>
Sun, 3 Nov 2024 11:00:12 +0000 (11:00 +0000)
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>
web_src/js/features/repo-common.ts
web_src/js/features/repo-issue-list.ts
web_src/js/features/repo-issue-sidebar.ts [new file with mode: 0644]
web_src/js/features/repo-issue.ts
web_src/js/features/repo-legacy.ts
web_src/js/features/repo-milestone.ts [new file with mode: 0644]
web_src/js/features/repo-new.ts [new file with mode: 0644]
web_src/js/features/repo-settings.ts
web_src/js/index.ts

index de967ffba033dec23c2976bfdcdf4fb89d883d56..c7d84de9f09b1e2e188858947dcdc04c42ed6c26 100644 (file)
@@ -90,3 +90,14 @@ export function initRepoCommonFilterSearchDropdown(selector) {
     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);
+  }
+}
index 134304617be5464e4a074cc20ee7fd9fd46d211d..caf517c5e0e711f6e8d1f5c99120a77cd05ce1dc 100644 (file)
@@ -1,5 +1,5 @@
 import $ from 'jquery';
-import {updateIssuesMeta} from './repo-issue.ts';
+import {updateIssuesMeta} from './repo-common.ts';
 import {toggleElem, hideElem, isElemHidden} from '../utils/dom.ts';
 import {htmlEscape} from 'escape-goat';
 import {confirmModal} from './comp/ConfirmModal.ts';
diff --git a/web_src/js/features/repo-issue-sidebar.ts b/web_src/js/features/repo-issue-sidebar.ts
new file mode 100644 (file)
index 0000000..f33e192
--- /dev/null
@@ -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');
+}
index 520f2081b0b0e24a723758dc694292679eb992df..a9a65cdc819bc7da85a49fd690ba3d0321be007d 100644 (file)
@@ -7,6 +7,8 @@ import {ComboMarkdownEditor, getComboMarkdownEditor, initComboMarkdownEditor} fr
 import {toAbsoluteUrl} from '../utils.ts';
 import {GET, POST} from '../modules/fetch.ts';
 import {showErrorToast} from '../modules/toast.ts';
+import {initRepoIssueSidebar} from './repo-issue-sidebar.ts';
+import {updateIssuesMeta} from './repo-common.ts';
 
 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() {
   if (!$('.repository.view.issue .timeline').length) return;
 
@@ -665,7 +656,7 @@ export function initRepoIssueBranchSelect() {
   });
 }
 
-export async function initSingleCommentEditor($commentForm) {
+async function initSingleCommentEditor($commentForm) {
   // pages:
   // * 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
@@ -687,7 +678,7 @@ export async function initSingleCommentEditor($commentForm) {
   syncUiState();
 }
 
-export function initIssueTemplateCommentEditors($commentForm) {
+function initIssueTemplateCommentEditors($commentForm) {
   // pages:
   // * new issue with issue template
   const $comboFields = $commentForm.find('.combo-editor-dropzone');
@@ -733,3 +724,18 @@ export function initArchivedLabelHandler() {
     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();
+}
index 5844037770cf3f511f9f9b5f0d7d7cd02207642d..6be3252a2bbbeb9210f20dec681a5e5afaf9fe7b 100644 (file)
@@ -1,13 +1,12 @@
 import $ from 'jquery';
 import {
+  initRepoCommentFormAndSidebar,
   initRepoIssueBranchSelect, initRepoIssueCodeCommentCancel, initRepoIssueCommentDelete,
   initRepoIssueComments, initRepoIssueDependencyDelete, initRepoIssueReferenceIssue,
   initRepoIssueTitleEdit, initRepoIssueWipToggle,
-  initRepoPullRequestUpdate, updateIssuesMeta, initIssueTemplateCommentEditors, initSingleCommentEditor,
+  initRepoPullRequestUpdate,
 } from './repo-issue.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 {
   initRepoCloneLink, initRepoCommonBranchOrTagDropdown, initRepoCommonFilterSearchDropdown,
@@ -16,32 +15,13 @@ import {initCitationFileCopyContent} from './citation.ts';
 import {initCompLabelEdit} from './comp/LabelEdit.ts';
 import {initRepoDiffConversationNav} from './repo-diff.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 {initRepoPullRequestCommitStatus} from './repo-issue-pr-status.ts';
 import {hideElem, queryElemChildren, showElem} from '../utils/dom.ts';
-import {POST} from '../modules/fetch.ts';
 import {initRepoIssueCommentEdit} from './repo-issue-edit.ts';
-
-// 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();
-}
+import {initRepoMilestone} from './repo-milestone.ts';
+import {initRepoNew} from './repo-new.ts';
 
 export function initBranchSelectorTabs() {
   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() {
   if (!$('.page-content.repository').length) return;
 
   initRepoBranchTagSelector('.js-branch-tag-selector');
-
-  // 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');
-    });
-  }
+  initRepoCommentFormAndSidebar();
 
   // Labels
   initCompLabelEdit('.repository.labels');
-
-  // Milestones
-  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;
-      }
-    });
-  }
+  initRepoMilestone();
+  initRepoNew();
 
   // Compare or pull request
   const $repoDiff = $('.repository.diff');
@@ -380,7 +56,7 @@ export function initRepository() {
 
   initRepoCloneLink();
   initCitationFileCopyContent();
-  initRepoSettingBranches();
+  initRepoSettings();
 
   // Issues
   if ($('.repository.view.issue').length > 0) {
diff --git a/web_src/js/features/repo-milestone.ts b/web_src/js/features/repo-milestone.ts
new file mode 100644 (file)
index 0000000..ddef723
--- /dev/null
@@ -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;
+    });
+  }
+}
diff --git a/web_src/js/features/repo-new.ts b/web_src/js/features/repo-new.ts
new file mode 100644 (file)
index 0000000..22d8c8a
--- /dev/null
@@ -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;
+      }
+    });
+  }
+}
index 97211d035e8658b24564a8b91ac0d94fdb83433f..34a3b635b243926170212bff4eb0255136860047 100644 (file)
@@ -6,7 +6,7 @@ import {POST} from '../modules/fetch.ts';
 
 const {appSubUrl, csrfToken} = window.config;
 
-export function initRepoSettingsCollaboration() {
+function initRepoSettingsCollaboration() {
   // Change collaborator access mode
   for (const dropdownEl of queryElems('.page-content.repository .ui.dropdown.access-mode')) {
     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');
   if (!searchTeamBox) return;
 
@@ -69,13 +69,13 @@ export function initRepoSettingSearchTeamBox() {
   });
 }
 
-export function initRepoSettingGitHook() {
+function initRepoSettingsGitHook() {
   if (!$('.edit.githook').length) return;
   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;
 
   for (const el of document.querySelectorAll('.toggle-target-enabled')) {
@@ -117,3 +117,41 @@ export function initRepoSettingBranches() {
   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();
+}
index f63d1994886043db26d92992b7c649fcea96f023..08d8997fd181618589418f235223111e8b61dbc3 100644 (file)
@@ -43,11 +43,6 @@ import {initSshKeyFormParser} from './features/sshkey-helper.ts';
 import {initUserSettings} from './features/user-settings.ts';
 import {initRepoActivityTopAuthorsChart, initRepoArchiveLinks} from './features/repo-common.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 {initOrgTeamSearchRepoBox, initOrgTeamSettings} from './features/org-team.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 {initCommonOrganization} from './features/common-organization.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 {initCaptcha} from './features/captcha.ts';
 import {initRepositoryActionView} from './components/RepoActionView.vue';
@@ -180,7 +175,6 @@ onDomReady(() => {
     initRepoArchiveLinks,
     initRepoBranchButton,
     initRepoCodeView,
-    initRepoCommentForm,
     initBranchSelectorTabs,
     initRepoEllipsisButton,
     initRepoDiffCommitBranchesAndTags,
@@ -202,9 +196,6 @@ onDomReady(() => {
     initRepoPullRequestReview,
     initRepoRelease,
     initRepoReleaseNew,
-    initRepoSettingGitHook,
-    initRepoSettingSearchTeamBox,
-    initRepoSettingsCollaboration,
     initRepoTemplateSearch,
     initRepoTopicBar,
     initRepoWikiForm,