mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Remove duplicate logic in initListSubmits (#12660)
* Remove duplicate logic in initListSubmits Using the same logic to handle Choosing reviewers and assignees as choosing label. It's the first step of #10926. Signed-off-by: a1012112796 <1012112796@qq.com> * fix choose block * fix nit * try fix bug * simple code Co-authored-by: techknowlogick <techknowlogick@gitea.io>
This commit is contained in:
		@@ -1516,10 +1516,11 @@ func updatePullReviewRequest(ctx *context.Context) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	reviewID := ctx.QueryInt64("id")
 | 
			
		||||
	event := ctx.Query("is_add")
 | 
			
		||||
	action := ctx.Query("action")
 | 
			
		||||
 | 
			
		||||
	if event != "add" && event != "remove" {
 | 
			
		||||
		ctx.ServerError("updatePullReviewRequest", fmt.Errorf("is_add should not be \"%s\"", event))
 | 
			
		||||
	// TODO: Not support 'clear' now
 | 
			
		||||
	if action != "attach" && action != "detach" {
 | 
			
		||||
		ctx.Status(403)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -1532,19 +1533,20 @@ func updatePullReviewRequest(ctx *context.Context) {
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			err = isLegalReviewRequest(reviewer, ctx.User, event == "add", issue)
 | 
			
		||||
			err = isLegalReviewRequest(reviewer, ctx.User, action == "attach", issue)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				ctx.ServerError("isLegalRequestReview", err)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			err = issue_service.ReviewRequest(issue, ctx.User, reviewer, event == "add")
 | 
			
		||||
			err = issue_service.ReviewRequest(issue, ctx.User, reviewer, action == "attach")
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				ctx.ServerError("ReviewRequest", err)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			ctx.ServerError("updatePullReviewRequest", fmt.Errorf("%d in %d is not Pull Request", issue.ID, issue.Repo.ID))
 | 
			
		||||
			ctx.Status(403)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -49,7 +49,7 @@
 | 
			
		||||
								{{end}}
 | 
			
		||||
 | 
			
		||||
								{{if $canChoose }}
 | 
			
		||||
									<a href="#" class="ui poping up icon re-request-review" data-is-checked="{{if  eq .Type 4}}remove{{else}}add{{end}}" data-issue-id="{{$.Issue.ID}}" data-content="{{ if eq .Type 4 }} {{$.i18n.Tr "repo.issues.remove_request_review"}} {{else}} {{$.i18n.Tr "repo.issues.re_request_review"}} {{end}}"  data-id="{{.ReviewerID}}" data-update-url="{{$.RepoLink}}/issues/request_review">
 | 
			
		||||
									<a href="#" class="ui poping up icon re-request-review" data-is-checked="{{if  eq .Type 4}}true{{else}}false{{end}}" data-issue-id="{{$.Issue.ID}}" data-content="{{ if eq .Type 4 }} {{$.i18n.Tr "repo.issues.remove_request_review"}} {{else}} {{$.i18n.Tr "repo.issues.re_request_review"}} {{end}}"  data-id="{{.ReviewerID}}" data-update-url="{{$.RepoLink}}/issues/request_review">
 | 
			
		||||
										{{svg "octicon-sync" 16}}
 | 
			
		||||
									</a>
 | 
			
		||||
								{{end}}
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@
 | 
			
		||||
					{{svg "octicon-gear" 16}}
 | 
			
		||||
				{{end}}
 | 
			
		||||
			</span>
 | 
			
		||||
			<div class="filter menu" data-action="" data-issue-id="{{$.Issue.ID}}" data-update-url="{{$.RepoLink}}/issues/request_review">
 | 
			
		||||
			<div class="filter menu" data-action="update" data-issue-id="{{$.Issue.ID}}" data-update-url="{{$.RepoLink}}/issues/request_review">
 | 
			
		||||
				<div class="header" style="text-transform: none;font-size:16px;">{{.i18n.Tr "repo.issues.new.add_reviewer_title"}}</div>
 | 
			
		||||
				{{if .Reviewers}}
 | 
			
		||||
					<div class="ui icon search input">
 | 
			
		||||
@@ -44,7 +44,7 @@
 | 
			
		||||
						{{$canChoose = true}}
 | 
			
		||||
					{{end}}
 | 
			
		||||
 | 
			
		||||
					<a class="{{if not $canChoose}}ui poping up{{end}} item {{if $checked}} checked {{end}}" href="#" data-id="{{.ID}}" data-id-selector="#review_request_{{.ID}}" data-can-change="{{if not $canChoose}}block{{end}}" {{if not $canChoose}} data-content="{{$.i18n.Tr "repo.issues.remove_request_review_block"}}"{{end}} data-is-checked="{{if $checked}}add{{else}}remove{{end}}">
 | 
			
		||||
					<a class="{{if not $canChoose}}ui poping up{{end}} item {{if $checked}} checked {{end}} {{if not $canChoose}}ban-change{{end}}" href="#" data-id="{{.ID}}" data-id-selector="#review_request_{{.ID}}" {{if not $canChoose}} data-content="{{$.i18n.Tr "repo.issues.remove_request_review_block"}}"{{end}}>
 | 
			
		||||
						<span class="octicon-check {{if not $checked}}invisible{{end}}">{{svg "octicon-check" 16}}</span>
 | 
			
		||||
						<span class="text">
 | 
			
		||||
							<img class="ui avatar image" src="{{.RelAvatarLink}}"> {{.GetDisplayName}}
 | 
			
		||||
@@ -78,7 +78,7 @@
 | 
			
		||||
							{{end}}
 | 
			
		||||
 | 
			
		||||
							{{if $canChoose}}
 | 
			
		||||
								<a href="#" class="ui poping up icon re-request-review" data-is-checked="{{if  eq .Type 4}}remove{{else}}add{{end}}" data-content="{{ if eq .Type 4 }} {{$.i18n.Tr "repo.issues.remove_request_review"}} {{else}} {{$.i18n.Tr "repo.issues.re_request_review"}} {{end}}" data-issue-id="{{$.Issue.ID}}"  data-id="{{.ReviewerID}}" data-update-url="{{$.RepoLink}}/issues/request_review">
 | 
			
		||||
								<a href="#" class="ui poping up icon re-request-review" data-is-checked="{{if  eq .Type 4}}true{{else}}false{{end}}" data-content="{{ if eq .Type 4 }} {{$.i18n.Tr "repo.issues.remove_request_review"}} {{else}} {{$.i18n.Tr "repo.issues.re_request_review"}} {{end}}" data-issue-id="{{$.Issue.ID}}"  data-id="{{.ReviewerID}}" data-update-url="{{$.RepoLink}}/issues/request_review">
 | 
			
		||||
									{{svg "octicon-sync" 16}}
 | 
			
		||||
								</a>
 | 
			
		||||
							{{end}}
 | 
			
		||||
@@ -244,7 +244,7 @@
 | 
			
		||||
					{{svg "octicon-gear" 16}}
 | 
			
		||||
				{{end}}
 | 
			
		||||
			</span>
 | 
			
		||||
			<div class="filter menu" data-action="" data-issue-id="{{$.Issue.ID}}" data-update-url="{{$.RepoLink}}/issues/assignee">
 | 
			
		||||
			<div class="filter menu" data-action="update" data-issue-id="{{$.Issue.ID}}" data-update-url="{{$.RepoLink}}/issues/assignee">
 | 
			
		||||
				<div class="header" style="text-transform: none;font-size:16px;">{{.i18n.Tr "repo.issues.new.add_assignees_title"}}</div>
 | 
			
		||||
				<div class="ui icon search input">
 | 
			
		||||
					<i class="search icon"></i>
 | 
			
		||||
 
 | 
			
		||||
@@ -157,7 +157,7 @@ function initLabelEdit() {
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function updateIssuesMeta(url, action, issueIds, elementId, isAdd) {
 | 
			
		||||
function updateIssuesMeta(url, action, issueIds, elementId) {
 | 
			
		||||
  return new Promise(((resolve) => {
 | 
			
		||||
    $.ajax({
 | 
			
		||||
      type: 'POST',
 | 
			
		||||
@@ -167,7 +167,6 @@ function updateIssuesMeta(url, action, issueIds, elementId, isAdd) {
 | 
			
		||||
        action,
 | 
			
		||||
        issue_ids: issueIds,
 | 
			
		||||
        id: elementId,
 | 
			
		||||
        is_add: isAdd
 | 
			
		||||
      },
 | 
			
		||||
      success: resolve
 | 
			
		||||
    });
 | 
			
		||||
@@ -373,21 +372,20 @@ function initCommentForm() {
 | 
			
		||||
    const $list = $(`.ui.${outerSelector}.list`);
 | 
			
		||||
    const $noSelect = $list.find('.no-select');
 | 
			
		||||
    const $listMenu = $(`.${selector} .menu`);
 | 
			
		||||
    let hasLabelUpdateAction = $listMenu.data('action') === 'update';
 | 
			
		||||
    const labels = {};
 | 
			
		||||
    let hasUpdateAction = $listMenu.data('action') === 'update';
 | 
			
		||||
    const items = {};
 | 
			
		||||
 | 
			
		||||
    $(`.${selector}`).dropdown('setting', 'onHide', () => {
 | 
			
		||||
      hasLabelUpdateAction = $listMenu.data('action') === 'update'; // Update the var
 | 
			
		||||
      if (hasLabelUpdateAction) {
 | 
			
		||||
      hasUpdateAction = $listMenu.data('action') === 'update'; // Update the var
 | 
			
		||||
      if (hasUpdateAction) {
 | 
			
		||||
        const promises = [];
 | 
			
		||||
        Object.keys(labels).forEach((elementId) => {
 | 
			
		||||
          const label = labels[elementId];
 | 
			
		||||
        Object.keys(items).forEach((elementId) => {
 | 
			
		||||
          const item = items[elementId];
 | 
			
		||||
          const promise = updateIssuesMeta(
 | 
			
		||||
            label['update-url'],
 | 
			
		||||
            label.action,
 | 
			
		||||
            label['issue-id'],
 | 
			
		||||
            item['update-url'],
 | 
			
		||||
            item.action,
 | 
			
		||||
            item['issue-id'],
 | 
			
		||||
            elementId,
 | 
			
		||||
            label['is-checked']
 | 
			
		||||
          );
 | 
			
		||||
          promises.push(promise);
 | 
			
		||||
        });
 | 
			
		||||
@@ -395,67 +393,49 @@ function initCommentForm() {
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    $listMenu.find('.item:not(.no-select)').on('click', function () {
 | 
			
		||||
      // we don't need the action attribute when updating assignees
 | 
			
		||||
      if (selector === 'select-assignees-modify' || selector === 'select-reviewers-modify') {
 | 
			
		||||
        // UI magic. We need to do this here, otherwise it would destroy the functionality of
 | 
			
		||||
        // adding/removing labels
 | 
			
		||||
 | 
			
		||||
        if ($(this).data('can-change') === 'block') {
 | 
			
		||||
          return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($(this).hasClass('checked')) {
 | 
			
		||||
          $(this).removeClass('checked');
 | 
			
		||||
          $(this).find('.octicon-check').addClass('invisible');
 | 
			
		||||
          $(this).data('is-checked', 'remove');
 | 
			
		||||
        } else {
 | 
			
		||||
          $(this).addClass('checked');
 | 
			
		||||
          $(this).find('.octicon-check').removeClass('invisible');
 | 
			
		||||
          $(this).data('is-checked', 'add');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        updateIssuesMeta(
 | 
			
		||||
          $listMenu.data('update-url'),
 | 
			
		||||
          '',
 | 
			
		||||
          $listMenu.data('issue-id'),
 | 
			
		||||
          $(this).data('id'),
 | 
			
		||||
          $(this).data('is-checked')
 | 
			
		||||
        );
 | 
			
		||||
        $listMenu.data('action', 'update'); // Update to reload the page when we updated items
 | 
			
		||||
    $listMenu.find('.item:not(.no-select)').on('click', function (e) {
 | 
			
		||||
      e.preventDefault();
 | 
			
		||||
      if ($(this).hasClass('ban-change')) {
 | 
			
		||||
        return false;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      hasUpdateAction = $listMenu.data('action') === 'update'; // Update the var
 | 
			
		||||
      if ($(this).hasClass('checked')) {
 | 
			
		||||
        $(this).removeClass('checked');
 | 
			
		||||
        $(this).find('.octicon-check').addClass('invisible');
 | 
			
		||||
        if (hasLabelUpdateAction) {
 | 
			
		||||
          if (!($(this).data('id') in labels)) {
 | 
			
		||||
            labels[$(this).data('id')] = {
 | 
			
		||||
        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 labels[$(this).data('id')];
 | 
			
		||||
            delete items[$(this).data('id')];
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      } else {
 | 
			
		||||
        $(this).addClass('checked');
 | 
			
		||||
        $(this).find('.octicon-check').removeClass('invisible');
 | 
			
		||||
        if (hasLabelUpdateAction) {
 | 
			
		||||
          if (!($(this).data('id') in labels)) {
 | 
			
		||||
            labels[$(this).data('id')] = {
 | 
			
		||||
        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 labels[$(this).data('id')];
 | 
			
		||||
            delete items[$(this).data('id')];
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // TODO: Which thing should be done for choosing review requests
 | 
			
		||||
      // to make choosed 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).hasClass('checked')) {
 | 
			
		||||
@@ -473,23 +453,26 @@ function initCommentForm() {
 | 
			
		||||
      $($(this).parent().data('id')).val(listIds.join(','));
 | 
			
		||||
      return false;
 | 
			
		||||
    });
 | 
			
		||||
    $listMenu.find('.no-select.item').on('click', function () {
 | 
			
		||||
      if (hasLabelUpdateAction || selector === 'select-assignees-modify') {
 | 
			
		||||
    $listMenu.find('.no-select.item').on('click', function (e) {
 | 
			
		||||
      e.preventDefault();
 | 
			
		||||
      if (hasUpdateAction) {
 | 
			
		||||
        updateIssuesMeta(
 | 
			
		||||
          $listMenu.data('update-url'),
 | 
			
		||||
          'clear',
 | 
			
		||||
          $listMenu.data('issue-id'),
 | 
			
		||||
          '',
 | 
			
		||||
          ''
 | 
			
		||||
        ).then(reload);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      $(this).parent().find('.item').each(function () {
 | 
			
		||||
        $(this).removeClass('checked');
 | 
			
		||||
        $(this).find('.octicon').addClass('invisible');
 | 
			
		||||
        $(this).data('is-checked', 'remove');
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      if (selector === 'select-reviewers-modify' || selector === 'select-assignees-modify') {
 | 
			
		||||
        return false;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      $list.find('.item').each(function () {
 | 
			
		||||
        $(this).addClass('hide');
 | 
			
		||||
      });
 | 
			
		||||
@@ -521,7 +504,6 @@ function initCommentForm() {
 | 
			
		||||
          '',
 | 
			
		||||
          $menu.data('issue-id'),
 | 
			
		||||
          $(this).data('id'),
 | 
			
		||||
          $(this).data('is-checked')
 | 
			
		||||
        ).then(reload);
 | 
			
		||||
      }
 | 
			
		||||
      switch (input_id) {
 | 
			
		||||
@@ -552,7 +534,6 @@ function initCommentForm() {
 | 
			
		||||
          '',
 | 
			
		||||
          $menu.data('issue-id'),
 | 
			
		||||
          $(this).data('id'),
 | 
			
		||||
          $(this).data('is-checked')
 | 
			
		||||
        ).then(reload);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
@@ -672,10 +653,9 @@ function initIssueComments() {
 | 
			
		||||
    event.preventDefault();
 | 
			
		||||
    updateIssuesMeta(
 | 
			
		||||
      url,
 | 
			
		||||
      '',
 | 
			
		||||
      isChecked === 'true' ? 'attach' : 'detach',
 | 
			
		||||
      issueId,
 | 
			
		||||
      id,
 | 
			
		||||
      isChecked
 | 
			
		||||
    ).then(reload);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user