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
|
# 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:
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue