When a schedule is read only, only disable the part of the JS that

actually changes things so that the rest is still working
 - Legacy-Id: 17560
This commit is contained in:
Ole Laursen 2020-03-30 18:16:37 +00:00
parent e5943f814d
commit fa9b19e3a8
3 changed files with 79 additions and 80 deletions

View file

@ -623,7 +623,10 @@ def edit_meeting_schedule(request, num=None, owner=None, name=None):
# requesters # requesters
requested_by_lookup = {p.pk: p for p in Person.objects.filter(pk__in=set(s.requested_by for s in sessions if s.requested_by))} requested_by_lookup = {p.pk: p for p in Person.objects.filter(pk__in=set(s.requested_by for s in sessions if s.requested_by))}
# constraints # constraints - convert the human-readable rules in the database
# to constraints on the actual sessions, compress them and output
# them, so that the JS simply has to detect violations and show
# the relevant preprocessed label
constraints = Constraint.objects.filter(meeting=meeting) constraints = Constraint.objects.filter(meeting=meeting)
person_needed_for_groups = defaultdict(set) person_needed_for_groups = defaultdict(set)
for c in constraints: for c in constraints:

View file

@ -1140,16 +1140,13 @@ a.fc-event, .fc-event, .fc-content, .fc-title, .fc-event-container {
margin: 0.2em; margin: 0.2em;
border-radius: 0.4em; border-radius: 0.4em;
overflow: hidden; overflow: hidden;
cursor: pointer;
} }
.edit-meeting-schedule .session.selected { .edit-meeting-schedule .session.selected {
border: 1px solid #bbb; border: 1px solid #bbb;
} }
.edit-meeting-schedule .session[draggable] {
cursor: pointer;
}
.edit-meeting-schedule .session.dragging { .edit-meeting-schedule .session.dragging {
opacity: 0.3; opacity: 0.3;
transition: opacity 0.4s; transition: opacity 0.4s;

View file

@ -1,7 +1,4 @@
jQuery(document).ready(function () { jQuery(document).ready(function () {
if (!ietfData.can_edit)
return;
let content = jQuery(".edit-meeting-schedule"); let content = jQuery(".edit-meeting-schedule");
function failHandler(xhr, textStatus, error) { function failHandler(xhr, textStatus, error) {
@ -49,92 +46,94 @@ jQuery(document).ready(function () {
}); });
// dragging if (ietfData.can_edit) {
sessions.on("dragstart", function (event) { // dragging
event.originalEvent.dataTransfer.setData("text/plain", this.id); sessions.on("dragstart", function (event) {
jQuery(this).addClass("dragging"); event.originalEvent.dataTransfer.setData("text/plain", this.id);
jQuery(this).addClass("dragging");
selectSessionElement(this); selectSessionElement(this);
}); });
sessions.on("dragend", function () { sessions.on("dragend", function () {
jQuery(this).removeClass("dragging"); jQuery(this).removeClass("dragging");
}); });
sessions.prop('draggable', true); sessions.prop('draggable', true);
// dropping // dropping
let dropElements = content.find(".timeslot,.unassigned-sessions"); let dropElements = content.find(".timeslot,.unassigned-sessions");
dropElements.on('dragenter', function (event) { dropElements.on('dragenter', function (event) {
if ((event.originalEvent.dataTransfer.getData("text/plain") || "").slice(0, "session".length) != "session") if ((event.originalEvent.dataTransfer.getData("text/plain") || "").slice(0, "session".length) != "session")
return; return;
event.preventDefault(); // default action is signalling that this is not a valid target event.preventDefault(); // default action is signalling that this is not a valid target
jQuery(this).addClass("dropping"); jQuery(this).addClass("dropping");
}); });
dropElements.on('dragover', function (event) { dropElements.on('dragover', function (event) {
// we don't actually need this event, except we need to signal // we don't actually need this event, except we need to signal
// that this is a valid drop target, by cancelling the default // that this is a valid drop target, by cancelling the default
// action // action
event.preventDefault(); event.preventDefault();
}); });
dropElements.on('dragleave', function (event) {
// skip dragleave events if they are to children
if (event.originalEvent.currentTarget.contains(event.originalEvent.relatedTarget))
return;
jQuery(this).removeClass("dropping"); dropElements.on('dragleave', function (event) {
}); // skip dragleave events if they are to children
if (event.originalEvent.currentTarget.contains(event.originalEvent.relatedTarget))
dropElements.on('drop', function (event) { return;
jQuery(this).removeClass("dropping");
let sessionId = event.originalEvent.dataTransfer.getData("text/plain"); jQuery(this).removeClass("dropping");
if ((event.originalEvent.dataTransfer.getData("text/plain") || "").slice(0, "session".length) != "session") });
return;
let sessionElement = sessions.filter("#" + sessionId); dropElements.on('drop', function (event) {
if (sessionElement.length == 0) jQuery(this).removeClass("dropping");
return;
event.preventDefault(); // prevent opening as link let sessionId = event.originalEvent.dataTransfer.getData("text/plain");
if ((event.originalEvent.dataTransfer.getData("text/plain") || "").slice(0, "session".length) != "session")
return;
if (sessionElement.parent().is(this)) let sessionElement = sessions.filter("#" + sessionId);
return; if (sessionElement.length == 0)
return;
let dropElement = jQuery(this); event.preventDefault(); // prevent opening as link
function done() { if (sessionElement.parent().is(this))
dropElement.append(sessionElement); // move element return;
updateCurrentSchedulingHints();
if (dropElement.hasClass("unassigned-sessions"))
sortUnassigned();
}
if (dropElement.hasClass("unassigned-sessions")) { let dropElement = jQuery(this);
jQuery.ajax({
url: ietfData.urls.assign, function done() {
method: "post", dropElement.append(sessionElement); // move element
data: { updateCurrentSchedulingHints();
action: "unassign", if (dropElement.hasClass("unassigned-sessions"))
session: sessionId.slice("session".length) sortUnassigned();
} }
}).fail(failHandler).done(done);
} if (dropElement.hasClass("unassigned-sessions")) {
else { jQuery.ajax({
jQuery.ajax({ url: ietfData.urls.assign,
url: ietfData.urls.assign, method: "post",
method: "post", data: {
data: { action: "unassign",
action: "assign", session: sessionId.slice("session".length)
session: sessionId.slice("session".length), }
timeslot: dropElement.attr("id").slice("timeslot".length) }).fail(failHandler).done(done);
} }
}).fail(failHandler).done(done); else {
} jQuery.ajax({
}); url: ietfData.urls.assign,
method: "post",
data: {
action: "assign",
session: sessionId.slice("session".length),
timeslot: dropElement.attr("id").slice("timeslot".length)
}
}).fail(failHandler).done(done);
}
});
}
// hints for the current schedule // hints for the current schedule