fix: restore function of unassigned review management page (#3774)

* style: reformat manage-review-requests.js as StandardJS style

* refactor: use switch statement instead of if/else-if/else

* style: remove needless line break

* fix: fix jquery selectors to be less fragile and easier to read

* fix: clean up bs5 HTML/CSS for review request buttons
This commit is contained in:
Jennifer Richards 2022-04-01 17:42:12 -03:00 committed by GitHub
parent 2859c43677
commit 3865c4bc9c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 128 additions and 129 deletions

View file

@ -1,128 +1,119 @@
$(document)
.ready(function () {
var form = $("form.review-requests");
var saveButtons = form.find("[name=action][value^='save']");
/* global $ */
$(function () {
'use strict'
const form = $('form.review-requests')
const saveButtons = form.find('[name=action][value^="save"]')
function updateSaveButtons() {
saveButtons.prop("disabled", form.find("[name$='-action'][value][value!=']")
.length == 0);
}
function updateSaveButtons () {
saveButtons.prop(
'disabled',
form.find('[name$="-action"][value][value!=""]').length === 0
)
}
function setControlDisplay(row) {
var action = row.find("[name$='-action']")
.val();
if (action == "assign") {
row.find(".reviewer-controls")
.show();
row.find(".close-controls")
.hide();
row.find(".assign-action,.close-action")
.hide();
} else if (action == "close") {
row.find(".reviewer-controls")
.hide();
row.find(".close-controls")
.show();
row.find(".assign-action,.close-action")
.hide();
} else {
row.find(".reviewer-controls,.close-controls")
.hide();
row.find(".assign-action,.close-action")
.show();
function setControlDisplay (row) {
const action = row.find('[name$="-action"]').val()
switch (action) {
case 'assign':
row.find('.reviewer-controls').show()
row.find('.close-controls').hide()
row.find('.assign-action,.close-action').hide()
break
case 'close':
row.find('.reviewer-controls').hide()
row.find('.close-controls').show()
row.find('.assign-action,.close-action').hide()
break
default:
row.find('.reviewer-controls,.close-controls').hide()
row.find('.assign-action,.close-action').show()
}
updateSaveButtons()
}
form.find('.assign-action button')
.on('click', function () {
const row = $(this).closest('.review-request')
const select = row.find('.reviewer-controls [name$="-reviewer"]')
if (!select.val()) {
// collect reviewers already assigned in this session
const reviewerAssigned = {}
select.find('option')
.each(function () {
if (this.value) {
reviewerAssigned[this.value] = 0
}
})
form.find('[name$="-action"][value="assign"]')
.each(function () {
const v = $(this)
.closest('.review-request')
.find('[name$="-reviewer"]')
.val()
if (v) {
reviewerAssigned[v] += 1
}
})
// by default, the select box contains a sorted list, so
// we should be able to select the first, unless that
// person has already been assigned to review in this
// session
let found = null
const options = select.find('option').get()
for (let round = 0; round < 100 && !found; ++round) {
for (let i = 0; i < options.length && !found; ++i) {
const v = options[i].value
if (!v) {
continue
}
updateSaveButtons();
if (reviewerAssigned[v] === round) {
found = v
}
}
}
form.find(".assign-action button")
.on("click", function () {
var row = $(this)
.closest(".review-request");
if (found) {
select.val(found)
}
}
var select = row.find(".reviewer-controls [name$='-reviewer']");
if (!select.val()) {
// collect reviewers already assigned in this session
var reviewerAssigned = {};
select.find("option")
.each(function () {
if (this.value)
reviewerAssigned[this.value] = 0;
});
row.find('[name$="-action"]').val('assign')
setControlDisplay(row)
})
form.find("[name$='-action'][value='assign']")
.each(function () {
var v = $(this)
.closest(".review-request")
.find("[name$='-reviewer']")
.val();
if (v)
reviewerAssigned[v] += 1;
});
form.find('.reviewer-controls .undo')
.on('click', function () {
const row = $(this).closest('.review-request')
row.find('[name$="-action"]').val('')
row.find('[name$="-reviewer"]').val($(this).data('initial'))
setControlDisplay(row)
})
// by default, the select box contains a sorted list, so
// we should be able to select the first, unless that
// person has already been assigned to review in this
// session
var found = null;
var options = select.find("option")
.get();
for (var round = 0; round < 100 && !found; ++round) {
for (var i = 0; i < options.length && !found; ++i) {
var v = options[i].value;
if (!v)
continue;
form.find('.close-action button')
.on('click', function () {
const row = $(this).closest('.review-request')
row.find('[name$="-action"]').val('close')
setControlDisplay(row)
})
if (reviewerAssigned[v] == round)
found = v;
}
}
form.find('.close-controls .undo')
.on('click', function () {
const row = $(this).closest('.review-request')
row.find('[name$="-action"]').val('')
setControlDisplay(row)
})
if (found)
select.val(found);
}
form.find('.assign-action,.close-action')
.each(function () {
const row = $(this).closest('.review-request')
setControlDisplay(row)
})
row.find("[name$='-action']")
.val("assign");
setControlDisplay(row);
});
form.find(".reviewer-controls .undo")
.on("click", function () {
var row = $(this)
.closest(".review-request");
row.find("[name$='-action']")
.val("");
row.find("[name$='-reviewer']")
.val($(this)
.data("initial"));
setControlDisplay(row);
});
form.find(".close-action button")
.on("click", function () {
var row = $(this)
.closest(".review-request");
row.find("[name$='-action']")
.val("close");
setControlDisplay(row);
});
form.find(".close-controls .undo")
.on("click", function () {
var row = $(this)
.closest(".review-request");
row.find("[name$='-action']")
.val("");
setControlDisplay(row);
});
form.find("[class$='-action']")
.each(function () {
var row = $(this)
.closest(".review-request");
setControlDisplay(row);
});
updateSaveButtons();
});
updateSaveButtons()
})

View file

@ -145,16 +145,24 @@
<span class="fw-bold">Abstract:</span>
{{ r.doc.abstract|linkify|urlize_ietf_docs }}
</div>
{% if r.form.non_field_errors %}
<div class="alert alert-danger my-3">
{% for e in r.form.non_field_errors %}{{ e }}{% endfor %}
</div>
{% if r.form.non_field_errors %}
<div class="row">
<div class="col-sm-12">
<div class="alert alert-danger my-3">
{% for e in r.form.non_field_errors %}{{ e }}{% endfor %}
</div>
</div>
{% endif %}
<input type="hidden" name="reviewrequest" value="{{ r.pk }}">
<input type="hidden"
name="{{ r.form.prefix }}-existing_reviewer"
value="{{ r.reviewer_id|default:"" }}">
<div class="assign-action">
</div>
{% endif %}
</div>
<input type="hidden" name="reviewrequest" value="{{ r.pk }}">
<input type="hidden"
name="{{ r.form.prefix }}-existing_reviewer"
value="{{ r.reviewer_id|default:"" }}">
<div class="card-footer">
<div class="d-flex">
<div class="assign-action mx-1">
{% if r.reviewer %}
<button type="button"
class="btn btn-sm btn-primary btn-success"
@ -170,9 +178,9 @@
Assign reviewer
</button>
{% endif %}
{% bootstrap_field r.form.action layout="horizontal" size="sm" %}
</div>
{% bootstrap_field r.form.action layout="horizontal" size="sm" %}
<div class="reviewer-controls">
<div class="reviewer-controls mx-1 flex-fill">
{% if r.form.review_type %}
{% bootstrap_field r.form.review_type layout="horizontal" size="sm" %}
{% endif %}
@ -191,11 +199,11 @@
</div>
{% endif %}
</div>
<div class="close-action">
<div class="close-action mx-1">
<button type="button" class="btn btn-sm btn-primary btn-danger">Close</button>
{% if r.doc.past_telechat_date %}(was on {{ r.doc.past_telechat_date }} telechat){% endif %}
</div>
<div class="close-controls">
<div class="close-controls mx-1 flex-fill">
{% bootstrap_field r.form.close layout="horizontal" size="sm" %}
{% bootstrap_field r.form.close_comment layout="horizontal" size="sm" %}
<button type="button"