diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index b51806d6b..9f8e066dd 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -623,7 +623,10 @@ def edit_meeting_schedule(request, num=None, owner=None, name=None): # 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))} - # 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) person_needed_for_groups = defaultdict(set) for c in constraints: diff --git a/ietf/static/ietf/css/ietf.css b/ietf/static/ietf/css/ietf.css index cc279531b..bc6c9deda 100644 --- a/ietf/static/ietf/css/ietf.css +++ b/ietf/static/ietf/css/ietf.css @@ -1140,16 +1140,13 @@ a.fc-event, .fc-event, .fc-content, .fc-title, .fc-event-container { margin: 0.2em; border-radius: 0.4em; overflow: hidden; + cursor: pointer; } .edit-meeting-schedule .session.selected { border: 1px solid #bbb; } -.edit-meeting-schedule .session[draggable] { - cursor: pointer; -} - .edit-meeting-schedule .session.dragging { opacity: 0.3; transition: opacity 0.4s; diff --git a/ietf/static/ietf/js/edit-meeting-schedule.js b/ietf/static/ietf/js/edit-meeting-schedule.js index 6762ddf59..359a3cb75 100644 --- a/ietf/static/ietf/js/edit-meeting-schedule.js +++ b/ietf/static/ietf/js/edit-meeting-schedule.js @@ -1,7 +1,4 @@ jQuery(document).ready(function () { - if (!ietfData.can_edit) - return; - let content = jQuery(".edit-meeting-schedule"); function failHandler(xhr, textStatus, error) { @@ -49,92 +46,94 @@ jQuery(document).ready(function () { }); - // dragging - sessions.on("dragstart", function (event) { - event.originalEvent.dataTransfer.setData("text/plain", this.id); - jQuery(this).addClass("dragging"); + if (ietfData.can_edit) { + // dragging + sessions.on("dragstart", function (event) { + event.originalEvent.dataTransfer.setData("text/plain", this.id); + jQuery(this).addClass("dragging"); - selectSessionElement(this); - }); - sessions.on("dragend", function () { - jQuery(this).removeClass("dragging"); + selectSessionElement(this); + }); + sessions.on("dragend", function () { + jQuery(this).removeClass("dragging"); - }); + }); - sessions.prop('draggable', true); + sessions.prop('draggable', true); - // dropping - let dropElements = content.find(".timeslot,.unassigned-sessions"); - dropElements.on('dragenter', function (event) { - if ((event.originalEvent.dataTransfer.getData("text/plain") || "").slice(0, "session".length) != "session") - return; + // dropping + let dropElements = content.find(".timeslot,.unassigned-sessions"); + dropElements.on('dragenter', function (event) { + if ((event.originalEvent.dataTransfer.getData("text/plain") || "").slice(0, "session".length) != "session") + return; - event.preventDefault(); // default action is signalling that this is not a valid target - jQuery(this).addClass("dropping"); - }); + event.preventDefault(); // default action is signalling that this is not a valid target + jQuery(this).addClass("dropping"); + }); - dropElements.on('dragover', function (event) { - // we don't actually need this event, except we need to signal - // that this is a valid drop target, by cancelling the default - // action - event.preventDefault(); - }); - - dropElements.on('dragleave', function (event) { - // skip dragleave events if they are to children - if (event.originalEvent.currentTarget.contains(event.originalEvent.relatedTarget)) - return; + dropElements.on('dragover', function (event) { + // we don't actually need this event, except we need to signal + // that this is a valid drop target, by cancelling the default + // action + event.preventDefault(); + }); - jQuery(this).removeClass("dropping"); - }); - - dropElements.on('drop', function (event) { - 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)) + return; - let sessionId = event.originalEvent.dataTransfer.getData("text/plain"); - if ((event.originalEvent.dataTransfer.getData("text/plain") || "").slice(0, "session".length) != "session") - return; + jQuery(this).removeClass("dropping"); + }); - let sessionElement = sessions.filter("#" + sessionId); - if (sessionElement.length == 0) - return; + dropElements.on('drop', function (event) { + jQuery(this).removeClass("dropping"); - 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)) - return; + let sessionElement = sessions.filter("#" + sessionId); + if (sessionElement.length == 0) + return; - let dropElement = jQuery(this); + event.preventDefault(); // prevent opening as link - function done() { - dropElement.append(sessionElement); // move element - updateCurrentSchedulingHints(); - if (dropElement.hasClass("unassigned-sessions")) - sortUnassigned(); - } + if (sessionElement.parent().is(this)) + return; - if (dropElement.hasClass("unassigned-sessions")) { - jQuery.ajax({ - url: ietfData.urls.assign, - method: "post", - data: { - action: "unassign", - session: sessionId.slice("session".length) - } - }).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); - } - }); + let dropElement = jQuery(this); + + function done() { + dropElement.append(sessionElement); // move element + updateCurrentSchedulingHints(); + if (dropElement.hasClass("unassigned-sessions")) + sortUnassigned(); + } + + if (dropElement.hasClass("unassigned-sessions")) { + jQuery.ajax({ + url: ietfData.urls.assign, + method: "post", + data: { + action: "unassign", + session: sessionId.slice("session".length) + } + }).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