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:
parent
e5943f814d
commit
fa9b19e3a8
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in a new issue