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

View file

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