@@ -3,6 +3,9 @@ var plan = false;
3
3
var selectedMajor = "Comp. Sci." ;
4
4
var selectedCatalogYear = 2017 ;
5
5
var catalogLoaded = false ;
6
+ var draggedCourse = false ;
7
+ var draggedReqOrigin = false ;
8
+ var draggedPlanOrigin = false ;
6
9
7
10
$ ( getPlans ) ;
8
11
@@ -46,7 +49,8 @@ function getPlans(){
46
49
47
50
$ ( "#hrsCompleted" ) . html ( "Hours Completed: " + currPlan . hrsCompleted ) ;
48
51
$ ( "#hrsCurrent" ) . html ( "Current Hours: " + currPlan . hrsCurrent ) ;
49
- $ ( "#hrsPlanned" ) . html ( "Total Hours Planned: " + currPlan . hrsPlanned ) ;
52
+ $ ( "#hrsFuture" ) . html ( "Remaining Hours: " + currPlan . hrsFuture ) ;
53
+ $ ( "#hrsTotal" ) . html ( "Total Hours Planned: " + currPlan . hrsTotal ) ;
50
54
51
55
let courses = [ ] ;
52
56
for ( let c in plan . catalog . courses ) {
@@ -68,6 +72,10 @@ function getPlans(){
68
72
} ) ;
69
73
$ ( '.dataTables_scrollHeadInner' ) . css ( 'padding' , '0' ) ;
70
74
catalogLoaded = true ;
75
+ $ ( 'tr.odd' ) . attr ( 'draggable' , 'true' ) ;
76
+ $ ( 'tr.odd' ) . attr ( 'ondragstart' , 'dragFromCat(event)' ) ;
77
+ $ ( 'tr.even' ) . attr ( 'draggable' , 'true' ) ;
78
+ $ ( 'tr.even' ) . attr ( 'ondragstart' , 'dragFromCat(event)' ) ;
71
79
}
72
80
73
81
@@ -79,16 +87,140 @@ function getPlans(){
79
87
80
88
$ ( '#accordion' ) . empty ( ) ;
81
89
for ( let i in requirements ) {
82
- let courses = requirements [ i ] . courses ;
90
+ let reqCourses = requirements [ i ] . courses ;
83
91
let itemHtml = "" ;
84
- for ( let c in courses ) {
85
- itemHtml += '<li>' + courses [ c ] + ': ' + plan . catalog . courses [ courses [ c ] ] . name + '</li>' ;
92
+ for ( let reqC in reqCourses ) {
93
+ if ( ! courseInPlan ( reqCourses [ reqC ] ) ) {
94
+ itemHtml += '<li draggable="true" ondragstart="dragFromReq(event)">' + reqCourses [ reqC ] + ': ' + plan . catalog . courses [ reqCourses [ reqC ] ] . name + '</li>' ;
95
+ }
96
+ else {
97
+ itemHtml += '<li draggable="true" ondragstart="dragFromReq(event)" hidden="true">' + reqCourses [ reqC ] + ': ' + plan . catalog . courses [ reqCourses [ reqC ] ] . name + '</li>' ;
98
+ }
86
99
}
87
100
$ ( '#accordion' ) . append ( '<h3><a href="#">' + requirements [ i ] . name + '</a></h3><div>' + itemHtml + '</div>' ) . accordion ( 'refresh' ) ;
88
101
}
89
102
} ) ;
90
103
}
91
104
105
+ function courseInPlan ( designator ) {
106
+ let c = plan . courses [ designator ] ;
107
+ return c !== undefined ;
108
+ }
109
+
110
+ window . dragFromReq = function ( event ) {
111
+ let desig = event . target . innerText . split ( ": " ) [ 0 ] ;
112
+ draggedCourse = plan . catalog . courses [ desig ] ;
113
+ draggedPlanOrigin = null ;
114
+ draggedReqOrigin = event . target ;
115
+ }
116
+
117
+ window . dragFromCat = function ( event ) {
118
+ let desig = event . target . children [ 0 ] . innerText
119
+ draggedCourse = plan . catalog . courses [ desig ] ;
120
+ draggedPlanOrigin = null ;
121
+ draggedReqOrigin = null ;
122
+ }
123
+
124
+ window . dragFromPlan = function ( event ) {
125
+ let desig = event . target . innerText . split ( ": " ) [ 0 ] ;
126
+ draggedCourse = plan . catalog . courses [ desig ] ;
127
+ draggedReqOrigin = null ;
128
+ draggedPlanOrigin = event . target ;
129
+ }
130
+
131
+ window . hoverOverPlan = function ( event ) {
132
+ event . preventDefault ( ) ;
133
+ }
134
+
135
+ window . dropOnPlan = function ( event ) {
136
+ event . preventDefault ( ) ;
137
+ event . target . children [ 1 ] . innerHTML += "<li draggable='true' ondragstart='dragFromPlan(event)'>" + draggedCourse . designator + ": " + draggedCourse . name + "</li>" ;
138
+ if ( event . target . classList . contains ( 'current' ) ) {
139
+ currPlan . hrsCurrent += draggedCourse . credits ;
140
+ }
141
+ else if ( event . target . classList . contains ( 'notStarted' ) ) {
142
+ currPlan . hrsFuture += draggedCourse . credits ;
143
+ }
144
+ else {
145
+ currPlan . hrsCompleted += draggedCourse . credits ;
146
+ }
147
+ let hours = parseInt ( event . target . children [ 0 ] . children [ 1 ] . innerText . split ( ": " ) [ 1 ] ) ;
148
+ event . target . children [ 0 ] . children [ 1 ] . innerText = "Hours: " + ( hours + draggedCourse . credits ) ;
149
+ if ( draggedReqOrigin !== null ) {
150
+ // From requirements accordion
151
+ currPlan . hrsTotal += draggedCourse . credits ;
152
+ draggedReqOrigin . hidden = true ;
153
+ draggedReqOrigin = null ;
154
+ }
155
+ else if ( draggedPlanOrigin !== null ) {
156
+ // From another term
157
+ if ( draggedPlanOrigin . parentElement . parentElement . classList . contains ( 'current' ) ) {
158
+ currPlan . hrsCurrent -= draggedCourse . credits ;
159
+ }
160
+ else if ( draggedPlanOrigin . parentElement . parentElement . classList . contains ( 'notStarted' ) ) {
161
+ currPlan . hrsFuture -= draggedCourse . credits ;
162
+ }
163
+ else {
164
+ currPlan . hrsCompleted -= draggedCourse . credits ;
165
+ }
166
+ let originHours = parseInt ( draggedPlanOrigin . parentElement . previousSibling . children [ 1 ] . innerText . split ( ": " ) [ 1 ] ) ;
167
+ draggedPlanOrigin . parentElement . previousSibling . children [ 1 ] . innerText = "Hours: " + ( originHours - draggedCourse . credits ) ;
168
+ draggedPlanOrigin . remove ( ) ;
169
+ draggedPlanOrigin = null ;
170
+ }
171
+ else {
172
+ // From catalog table
173
+ currPlan . hrsTotal += draggedCourse . credits ;
174
+ }
175
+ $ . post ( "/plan_courses" , {
176
+ plan : plan . plan_name ,
177
+ user : plan . user . id ,
178
+ designator : draggedCourse . designator ,
179
+ term : event . target . children [ 0 ] . children [ 0 ] . innerText . split ( " " ) [ 0 ] ,
180
+ year : parseInt ( event . target . children [ 0 ] . children [ 0 ] . innerText . split ( " " ) [ 1 ] ) ,
181
+ } ) ;
182
+ $ ( "#hrsCompleted" ) . html ( "Hours Completed: " + currPlan . hrsCompleted ) ;
183
+ $ ( "#hrsCurrent" ) . html ( "Current Hours: " + currPlan . hrsCurrent ) ;
184
+ $ ( "#hrsFuture" ) . html ( "Remaining Hours: " + currPlan . hrsFuture ) ;
185
+ $ ( "#hrsTotal" ) . html ( "Total Hours Planned: " + currPlan . hrsTotal ) ;
186
+ draggedCourse = null ;
187
+ }
188
+
189
+ window . hoverOverTrash = function ( event ) {
190
+ event . preventDefault ( ) ;
191
+ }
192
+
193
+ window . dropInTrash = function ( event ) {
194
+ event . preventDefault ( ) ;
195
+ if ( draggedPlanOrigin !== null ) {
196
+ currPlan . hrsTotal -= draggedCourse . credits ;
197
+ if ( draggedPlanOrigin . parentElement . parentElement . classList . contains ( 'current' ) ) {
198
+ currPlan . hrsCurrent -= draggedCourse . credits ;
199
+ }
200
+ else if ( draggedPlanOrigin . parentElement . parentElement . classList . contains ( 'notStarted' ) ) {
201
+ currPlan . hrsFuture -= draggedCourse . credits ;
202
+ }
203
+ else {
204
+ currPlan . hrsCompleted -= draggedCourse . credits ;
205
+ }
206
+ let originHours = parseInt ( draggedPlanOrigin . parentElement . previousSibling . children [ 1 ] . innerText . split ( ": " ) [ 1 ] ) ;
207
+ draggedPlanOrigin . parentElement . previousSibling . children [ 1 ] . innerText = "Hours: " + ( originHours - draggedCourse . credits ) ;
208
+ draggedPlanOrigin . remove ( ) ;
209
+ draggedPlanOrigin = null ;
210
+
211
+ $ . get ( "/plan_courses" , {
212
+ designator : draggedCourse . designator ,
213
+ user : plan . user . id ,
214
+ plan : plan . plan_name
215
+ } ) ;
216
+ $ ( "#hrsCompleted" ) . html ( "Hours Completed: " + currPlan . hrsCompleted ) ;
217
+ $ ( "#hrsCurrent" ) . html ( "Current Hours: " + currPlan . hrsCurrent ) ;
218
+ $ ( "#hrsFuture" ) . html ( "Remaining Hours: " + currPlan . hrsFuture ) ;
219
+ $ ( "#hrsTotal" ) . html ( "Total Hours Planned: " + currPlan . hrsTotal ) ;
220
+ }
221
+ draggedCourse = null ;
222
+ }
223
+
92
224
class Course {
93
225
constructor ( desig , year , term ) {
94
226
this . term = term ;
@@ -114,7 +246,8 @@ class Plan {
114
246
this . years = [ ] ;
115
247
this . hrsCompleted = 0 ;
116
248
this . hrsCurrent = 0 ;
117
- this . hrsPlanned = 0 ;
249
+ this . hrsFuture = 0 ;
250
+ this . hrsTotal = 0 ;
118
251
}
119
252
120
253
sortCourses ( ) {
@@ -149,18 +282,19 @@ class Plan {
149
282
}
150
283
}
151
284
else {
285
+ this . hrsFuture += year . fallHrs ;
152
286
urHTML += " notStarted" ;
153
287
}
154
- urHTML += "'>" ;
288
+ urHTML += "' ondragover='hoverOverPlan(event)' ondrop='dropOnPlan(event)' >" ;
155
289
urHTML += "<header><span class='termHeader'>Fall " + ( year . name - 1 ) + "</span><span class='termHours'>Hours: " + year . fallHrs + "</span></header>" ;
156
290
urHTML += "<ul class='courses'>" ;
157
291
for ( let j = 0 ; j < year . fall . length ; j ++ ) {
158
292
let course = year . fall [ j ] ;
159
- this . hrsPlanned += course . hours ;
293
+ this . hrsTotal += course . hours ;
160
294
if ( beforeCurrent ) {
161
295
this . hrsCompleted += course . hours ;
162
296
}
163
- urHTML += "<li>" + course . id + " " + course . name + "</li>" ;
297
+ urHTML += "<li draggable='true' ondragstart='dragFromPlan(event)' >" + course . id + ": " + course . name + "</li>" ;
164
298
}
165
299
urHTML += "</ul></div>" ;
166
300
@@ -173,18 +307,19 @@ class Plan {
173
307
}
174
308
}
175
309
else {
310
+ this . hrsFuture += year . springHrs ;
176
311
urHTML += " notStarted" ;
177
312
}
178
- urHTML += "'>" ;
313
+ urHTML += "' ondragover='hoverOverPlan(event)' ondrop='dropOnPlan(event)' >" ;
179
314
urHTML += "<header><span class='termHeader'>Spring " + year . name + "</span><span class='termHours'>Hours: " + year . springHrs + "</span></header>" ;
180
315
urHTML += "<ul class='courses'>" ;
181
316
for ( let j = 0 ; j < year . spring . length ; j ++ ) {
182
317
let course = year . spring [ j ] ;
183
- this . hrsPlanned += course . hours ;
318
+ this . hrsTotal += course . hours ;
184
319
if ( beforeCurrent ) {
185
320
this . hrsCompleted += course . hours ;
186
321
}
187
- urHTML += "<li>" + course . id + " " + course . name + "</li>" ;
322
+ urHTML += "<li draggable='true' ondragstart='dragFromPlan(event)' >" + course . id + ": " + course . name + "</li>" ;
188
323
}
189
324
urHTML += "</ul></div>" ;
190
325
@@ -197,17 +332,18 @@ class Plan {
197
332
}
198
333
}
199
334
else {
335
+ this . hrsFuture += year . summerHrs ;
200
336
urHTML += " notStarted" ;
201
337
}
202
- urHTML += "'>" ;
338
+ urHTML += "' ondragover='hoverOverPlan(event)' ondrop='dropOnPlan(event)' >" ;
203
339
urHTML += "<header><span class='termHeader'>Summer " + year . name + "</span><span class='termHours'>Hours: " + year . summerHrs + "</span></header><ul class='courses'>" ;
204
340
for ( let j = 0 ; j < year . summer . length ; j ++ ) {
205
341
let course = year . summer [ j ] ;
206
- this . hrsPlanned += course . hours ;
342
+ this . hrsTotal += course . hours ;
207
343
if ( beforeCurrent ) {
208
344
this . hrsCompleted += course . hours ;
209
345
}
210
- urHTML += "<li>" + course . id + " " + course . name + "</li>" ;
346
+ urHTML += "<li draggable='true' ondragstart='dragFromPlan(event)' >" + course . id + ": " + course . name + "</li>" ;
211
347
}
212
348
urHTML += "</ul></div></div>" ;
213
349
}
0 commit comments