Skip to content

Commit fa9b19e

Browse files
committed
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
1 parent e5943f8 commit fa9b19e

3 files changed

Lines changed: 79 additions & 80 deletions

File tree

ietf/meeting/views.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,10 @@ def cubehelix(i, total, hue=1.2, start_angle=0.5):
623623
# requesters
624624
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))}
625625

626-
# constraints
626+
# constraints - convert the human-readable rules in the database
627+
# to constraints on the actual sessions, compress them and output
628+
# them, so that the JS simply has to detect violations and show
629+
# the relevant preprocessed label
627630
constraints = Constraint.objects.filter(meeting=meeting)
628631
person_needed_for_groups = defaultdict(set)
629632
for c in constraints:

ietf/static/ietf/css/ietf.css

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1140,16 +1140,13 @@ a.fc-event, .fc-event, .fc-content, .fc-title, .fc-event-container {
11401140
margin: 0.2em;
11411141
border-radius: 0.4em;
11421142
overflow: hidden;
1143+
cursor: pointer;
11431144
}
11441145

11451146
.edit-meeting-schedule .session.selected {
11461147
border: 1px solid #bbb;
11471148
}
11481149

1149-
.edit-meeting-schedule .session[draggable] {
1150-
cursor: pointer;
1151-
}
1152-
11531150
.edit-meeting-schedule .session.dragging {
11541151
opacity: 0.3;
11551152
transition: opacity 0.4s;

ietf/static/ietf/js/edit-meeting-schedule.js

Lines changed: 74 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
jQuery(document).ready(function () {
2-
if (!ietfData.can_edit)
3-
return;
4-
52
let content = jQuery(".edit-meeting-schedule");
63

74
function failHandler(xhr, textStatus, error) {
@@ -49,92 +46,94 @@ jQuery(document).ready(function () {
4946
});
5047

5148

52-
// dragging
53-
sessions.on("dragstart", function (event) {
54-
event.originalEvent.dataTransfer.setData("text/plain", this.id);
55-
jQuery(this).addClass("dragging");
49+
if (ietfData.can_edit) {
50+
// dragging
51+
sessions.on("dragstart", function (event) {
52+
event.originalEvent.dataTransfer.setData("text/plain", this.id);
53+
jQuery(this).addClass("dragging");
5654

57-
selectSessionElement(this);
58-
});
59-
sessions.on("dragend", function () {
60-
jQuery(this).removeClass("dragging");
55+
selectSessionElement(this);
56+
});
57+
sessions.on("dragend", function () {
58+
jQuery(this).removeClass("dragging");
6159

62-
});
60+
});
6361

64-
sessions.prop('draggable', true);
62+
sessions.prop('draggable', true);
6563

66-
// dropping
67-
let dropElements = content.find(".timeslot,.unassigned-sessions");
68-
dropElements.on('dragenter', function (event) {
69-
if ((event.originalEvent.dataTransfer.getData("text/plain") || "").slice(0, "session".length) != "session")
70-
return;
64+
// dropping
65+
let dropElements = content.find(".timeslot,.unassigned-sessions");
66+
dropElements.on('dragenter', function (event) {
67+
if ((event.originalEvent.dataTransfer.getData("text/plain") || "").slice(0, "session".length) != "session")
68+
return;
7169

72-
event.preventDefault(); // default action is signalling that this is not a valid target
73-
jQuery(this).addClass("dropping");
74-
});
70+
event.preventDefault(); // default action is signalling that this is not a valid target
71+
jQuery(this).addClass("dropping");
72+
});
7573

76-
dropElements.on('dragover', function (event) {
77-
// we don't actually need this event, except we need to signal
78-
// that this is a valid drop target, by cancelling the default
79-
// action
80-
event.preventDefault();
81-
});
82-
83-
dropElements.on('dragleave', function (event) {
84-
// skip dragleave events if they are to children
85-
if (event.originalEvent.currentTarget.contains(event.originalEvent.relatedTarget))
86-
return;
74+
dropElements.on('dragover', function (event) {
75+
// we don't actually need this event, except we need to signal
76+
// that this is a valid drop target, by cancelling the default
77+
// action
78+
event.preventDefault();
79+
});
8780

88-
jQuery(this).removeClass("dropping");
89-
});
90-
91-
dropElements.on('drop', function (event) {
92-
jQuery(this).removeClass("dropping");
81+
dropElements.on('dragleave', function (event) {
82+
// skip dragleave events if they are to children
83+
if (event.originalEvent.currentTarget.contains(event.originalEvent.relatedTarget))
84+
return;
9385

94-
let sessionId = event.originalEvent.dataTransfer.getData("text/plain");
95-
if ((event.originalEvent.dataTransfer.getData("text/plain") || "").slice(0, "session".length) != "session")
96-
return;
86+
jQuery(this).removeClass("dropping");
87+
});
9788

98-
let sessionElement = sessions.filter("#" + sessionId);
99-
if (sessionElement.length == 0)
100-
return;
89+
dropElements.on('drop', function (event) {
90+
jQuery(this).removeClass("dropping");
10191

102-
event.preventDefault(); // prevent opening as link
92+
let sessionId = event.originalEvent.dataTransfer.getData("text/plain");
93+
if ((event.originalEvent.dataTransfer.getData("text/plain") || "").slice(0, "session".length) != "session")
94+
return;
10395

104-
if (sessionElement.parent().is(this))
105-
return;
96+
let sessionElement = sessions.filter("#" + sessionId);
97+
if (sessionElement.length == 0)
98+
return;
10699

107-
let dropElement = jQuery(this);
100+
event.preventDefault(); // prevent opening as link
108101

109-
function done() {
110-
dropElement.append(sessionElement); // move element
111-
updateCurrentSchedulingHints();
112-
if (dropElement.hasClass("unassigned-sessions"))
113-
sortUnassigned();
114-
}
102+
if (sessionElement.parent().is(this))
103+
return;
115104

116-
if (dropElement.hasClass("unassigned-sessions")) {
117-
jQuery.ajax({
118-
url: ietfData.urls.assign,
119-
method: "post",
120-
data: {
121-
action: "unassign",
122-
session: sessionId.slice("session".length)
123-
}
124-
}).fail(failHandler).done(done);
125-
}
126-
else {
127-
jQuery.ajax({
128-
url: ietfData.urls.assign,
129-
method: "post",
130-
data: {
131-
action: "assign",
132-
session: sessionId.slice("session".length),
133-
timeslot: dropElement.attr("id").slice("timeslot".length)
134-
}
135-
}).fail(failHandler).done(done);
136-
}
137-
});
105+
let dropElement = jQuery(this);
106+
107+
function done() {
108+
dropElement.append(sessionElement); // move element
109+
updateCurrentSchedulingHints();
110+
if (dropElement.hasClass("unassigned-sessions"))
111+
sortUnassigned();
112+
}
113+
114+
if (dropElement.hasClass("unassigned-sessions")) {
115+
jQuery.ajax({
116+
url: ietfData.urls.assign,
117+
method: "post",
118+
data: {
119+
action: "unassign",
120+
session: sessionId.slice("session".length)
121+
}
122+
}).fail(failHandler).done(done);
123+
}
124+
else {
125+
jQuery.ajax({
126+
url: ietfData.urls.assign,
127+
method: "post",
128+
data: {
129+
action: "assign",
130+
session: sessionId.slice("session".length),
131+
timeslot: dropElement.attr("id").slice("timeslot".length)
132+
}
133+
}).fail(failHandler).done(done);
134+
}
135+
});
136+
}
138137

139138
// hints for the current schedule
140139

0 commit comments

Comments
 (0)