* 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>tags/v1.13.0-rc1
@@ -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); | |||
}); | |||