1
- var currPlan = false ;
2
- var plan = false ;
1
+ var currPlan = null ;
2
+ var plan = null ;
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 ;
9
-
10
- $ ( getPlans ) ;
6
+ var planTableLoaded = false ;
7
+ var draggedCourse = null ;
8
+ var draggedReqOrigin = null ;
9
+ var draggedPlanOrigin = null ;
10
+ var draggedCatOrigin = null ;
11
11
12
12
// changes plan, triggered on selection of new plan in dropdown
13
13
$ ( document ) . on ( 'change' , '#planSelect' , function ( ) {
@@ -19,15 +19,45 @@ $(document).on('change', '#planSelect', function (){
19
19
selectedCatalogYear = parseInt ( selected [ 1 ] ) ;
20
20
21
21
// send request to load new plan
22
- getPlans ( ) ;
22
+ getPlan ( ) ;
23
23
24
24
} ) ;
25
25
26
- function getPlans ( ) {
27
- $ . get ( "plans.json" , function ( plans ) {
26
+ // For loading the table of plans
27
+ window . getAllPlans = function ( ) {
28
+ $ . get ( "/plans.json" , function ( plans ) {
28
29
//console.log(plans);
29
- plan = false ;
30
+ let buttons = [ ] ;
31
+ let colObjects = [ ] ;
32
+ for ( let p in plans ) {
33
+ let openHtml = "<a href='/plans/" + plans [ p ] . id + "'>Open</a>" ;
34
+ colObjects . push ( { "plan" : plans [ p ] , "open" : openHtml } ) ;
35
+ }
36
+ if ( ! planTableLoaded ) {
37
+ $ ( "#plansTable" ) . DataTable ( {
38
+ "dom" : '<"top"if>t' ,
39
+ "data" : colObjects ,
40
+ "columns" : [
41
+ { "data" : "plan.user.login" } ,
42
+ { "data" : "plan.plan_name" } ,
43
+ { "data" : "plan.major" } ,
44
+ { "data" : "plan.catalog.year" } ,
45
+ { "data" : "open" }
46
+ ] ,
47
+ "paging" : false ,
48
+ } ) ;
49
+ $ ( '.dataTables_scrollHeadInner' ) . css ( 'padding' , '0' ) ;
50
+ planTableLoaded = true ;
51
+ }
52
+ } ) ;
53
+ }
54
+
55
+ // For loading a single plan
56
+ window . getPlan = function ( ) {
57
+ $ . get ( "/plans.json" , function ( plans ) {
58
+ plan = null ;
30
59
$ ( ".dropdown" ) . html ( "<option selected disabled>Change Plan</option>" ) ;
60
+ // set current plan
31
61
for ( let i in plans ) {
32
62
if ( plans [ i ] . major === selectedMajor && plans [ i ] . catalog . year === selectedCatalogYear ) {
33
63
plan = plans [ i ] ;
@@ -37,10 +67,11 @@ function getPlans(){
37
67
$ ( ".dropdown" ) . append ( "<option>" + plans [ i ] . major + ", " + plans [ i ] . catalog . year + "</option>" ) ;
38
68
}
39
69
}
40
- if ( plan === false ) {
70
+ if ( plan == null ) {
41
71
console . log ( "Error: did not find selected plan" ) ;
42
72
}
43
73
74
+ // dynamically generate years, terms, semesters on page
44
75
currPlan = new Plan ( plan . user . login , plan . plan_name , plan . major , plan . curr_year , plan . curr_term , plan . courses , plan . catalog . year ) ;
45
76
currPlan . sortCourses ( ) ;
46
77
currPlan . generateHTML ( ) ;
@@ -52,6 +83,7 @@ function getPlans(){
52
83
$ ( "#hrsFuture" ) . html ( "Remaining Hours: " + currPlan . hrsFuture ) ;
53
84
$ ( "#hrsTotal" ) . html ( "Total Hours Planned: " + currPlan . hrsTotal ) ;
54
85
86
+ // load catalog table
55
87
let courses = [ ] ;
56
88
for ( let c in plan . catalog . courses ) {
57
89
courses . push ( plan . catalog . courses [ c ] ) ;
@@ -68,7 +100,7 @@ function getPlans(){
68
100
] ,
69
101
"scrollY" : "95px" ,
70
102
"paging" : false ,
71
- "scrollCollapse" : false
103
+ "scrollCollapse" : false
72
104
} ) ;
73
105
$ ( '.dataTables_scrollHeadInner' ) . css ( 'padding' , '0' ) ;
74
106
catalogLoaded = true ;
@@ -79,12 +111,11 @@ function getPlans(){
79
111
}
80
112
81
113
114
+ // load accordion with requirements
82
115
var requirements = plan . requirements ;
83
-
84
116
$ ( function ( ) {
85
117
$ ( "#accordion" ) . accordion ( { collapsible : true , active : false } ) ;
86
118
} ) ;
87
-
88
119
$ ( '#accordion' ) . empty ( ) ;
89
120
for ( let i in requirements ) {
90
121
let reqCourses = requirements [ i ] . courses ;
@@ -129,75 +160,118 @@ function checkMissingReqs() {
129
160
}
130
161
131
162
function courseInPlan ( designator ) {
132
- let c = plan . courses [ designator ] ;
163
+ let c = currPlan . courses [ designator ] ;
133
164
return c !== undefined ;
134
165
}
135
166
167
+ // check if course is already in the semester being dropped on
168
+ function courseInSemester ( designator , droppedTerm ) {
169
+ for ( let i = 0 ; i < droppedTerm . children . length ; i ++ ) {
170
+ if ( droppedTerm . children [ i ] . innerText . includes ( designator ) ) {
171
+ return true ;
172
+ }
173
+ }
174
+ return false ;
175
+ }
176
+
177
+ // set source course when dragging from requiremetns accordion
136
178
window . dragFromReq = function ( event ) {
137
179
let desig = event . target . innerText . split ( ": " ) [ 0 ] ;
138
180
draggedCourse = plan . catalog . courses [ desig ] ;
139
181
draggedPlanOrigin = null ;
182
+ draggedCatOrigin = null ;
140
183
draggedReqOrigin = event . target ;
141
184
}
142
185
186
+ // set source course when dragging from catalog table
143
187
window . dragFromCat = function ( event ) {
144
188
let desig = event . target . children [ 0 ] . innerText
145
189
draggedCourse = plan . catalog . courses [ desig ] ;
146
190
draggedPlanOrigin = null ;
147
191
draggedReqOrigin = null ;
192
+ draggedCatOrigin = event . target ;
148
193
}
149
194
195
+ // set source course when dragging from plan
150
196
window . dragFromPlan = function ( event ) {
151
197
let desig = event . target . innerText . split ( ": " ) [ 0 ] ;
152
198
draggedCourse = plan . catalog . courses [ desig ] ;
153
199
draggedReqOrigin = null ;
200
+ draggedPlanOrigin = event . target ;
201
+ draggedCatOrigin = null ;
154
202
draggedPlanOrigin = event . target ;
155
203
checkMissingReqs ( ) ;
156
204
}
157
205
206
+ // indicate valid drop when hovering over plan
158
207
window . hoverOverPlan = function ( event ) {
159
208
event . preventDefault ( ) ;
160
209
}
161
210
211
+ // update db when dropping course on plan
162
212
window . dropOnPlan = function ( event ) {
163
213
event . preventDefault ( ) ;
164
- event . target . children [ 1 ] . innerHTML += "<li draggable='true' ondragstart='dragFromPlan(event)'>" + draggedCourse . designator + ": " + draggedCourse . name + "</li>" ;
165
- if ( event . target . classList . contains ( 'current' ) ) {
166
- currPlan . hrsCurrent += draggedCourse . credits ;
167
- }
168
- else if ( event . target . classList . contains ( 'notStarted' ) ) {
169
- currPlan . hrsFuture += draggedCourse . credits ;
170
- }
171
- else {
172
- currPlan . hrsCompleted += draggedCourse . credits ;
173
- }
174
- let hours = parseInt ( event . target . children [ 0 ] . children [ 1 ] . innerText . split ( ": " ) [ 1 ] ) ;
175
- event . target . children [ 0 ] . children [ 1 ] . innerText = "Hours: " + ( hours + draggedCourse . credits ) ;
176
- if ( draggedReqOrigin !== null ) {
177
- // From requirements accordion
178
- currPlan . hrsTotal += draggedCourse . credits ;
179
- draggedReqOrigin . hidden = true ;
180
- draggedReqOrigin = null ;
181
- }
182
- else if ( draggedPlanOrigin !== null ) {
183
- // From another term
184
- if ( draggedPlanOrigin . parentElement . parentElement . classList . contains ( 'current' ) ) {
185
- currPlan . hrsCurrent -= draggedCourse . credits ;
214
+ if ( ! ( courseInSemester ( draggedCourse . designator , event . target . children [ 1 ] ) || ( courseInPlan ( draggedCourse . designator ) && draggedCatOrigin != null ) ) ) {
215
+ event . target . children [ 1 ] . innerHTML += "<li draggable='true' ondragstart='dragFromPlan(event)'>" + draggedCourse . designator + ": " + draggedCourse . name + "</li>" ;
216
+ if ( event . target . classList . contains ( 'current' ) ) {
217
+ currPlan . hrsCurrent += draggedCourse . credits ;
186
218
}
187
- else if ( draggedPlanOrigin . parentElement . parentElement . classList . contains ( 'notStarted' ) ) {
188
- currPlan . hrsFuture - = draggedCourse . credits ;
219
+ else if ( event . target . classList . contains ( 'notStarted' ) ) {
220
+ currPlan . hrsFuture + = draggedCourse . credits ;
189
221
}
190
222
else {
191
- currPlan . hrsCompleted - = draggedCourse . credits ;
223
+ currPlan . hrsCompleted + = draggedCourse . credits ;
192
224
}
193
- let originHours = parseInt ( draggedPlanOrigin . parentElement . previousSibling . children [ 1 ] . innerText . split ( ": " ) [ 1 ] ) ;
194
- draggedPlanOrigin . parentElement . previousSibling . children [ 1 ] . innerText = "Hours: " + ( originHours - draggedCourse . credits ) ;
195
- draggedPlanOrigin . remove ( ) ;
196
- draggedPlanOrigin = null ;
197
- }
198
- else {
199
- // From catalog table
200
- currPlan . hrsTotal += draggedCourse . credits ;
225
+ let hours = parseInt ( event . target . children [ 0 ] . children [ 1 ] . innerText . split ( ": " ) [ 1 ] ) ;
226
+ event . target . children [ 0 ] . children [ 1 ] . innerText = "Hours: " + ( hours + draggedCourse . credits ) ;
227
+ if ( draggedReqOrigin !== null ) {
228
+ // From requirements accordion
229
+ currPlan . hrsTotal += draggedCourse . credits ;
230
+ draggedReqOrigin . hidden = true ;
231
+ draggedReqOrigin = null ;
232
+ }
233
+ else if ( draggedPlanOrigin !== null ) {
234
+ // From another term
235
+ if ( draggedPlanOrigin . parentElement . parentElement . classList . contains ( 'current' ) ) {
236
+ currPlan . hrsCurrent -= draggedCourse . credits ;
237
+ }
238
+ else if ( draggedPlanOrigin . parentElement . parentElement . classList . contains ( 'notStarted' ) ) {
239
+ currPlan . hrsFuture -= draggedCourse . credits ;
240
+ }
241
+ else {
242
+ currPlan . hrsCompleted -= draggedCourse . credits ;
243
+ }
244
+ let originHours = parseInt ( draggedPlanOrigin . parentElement . previousSibling . children [ 1 ] . innerText . split ( ": " ) [ 1 ] ) ;
245
+ draggedPlanOrigin . parentElement . previousSibling . children [ 1 ] . innerText = "Hours: " + ( originHours - draggedCourse . credits ) ;
246
+ draggedPlanOrigin . remove ( ) ;
247
+ draggedPlanOrigin = null ;
248
+ }
249
+ else {
250
+ // From catalog table
251
+ currPlan . hrsTotal += draggedCourse . credits ;
252
+ removeFromRequirements ( draggedCourse . designator ) ;
253
+ }
254
+ // add to javascript plan object
255
+ let destTerm = event . target . children [ 0 ] . children [ 0 ] . innerText . split ( " " ) [ 0 ] ;
256
+ let destYear = parseInt ( event . target . children [ 0 ] . children [ 0 ] . innerText . split ( " " ) [ 1 ] ) ;
257
+ let newCourse = {
258
+ "designator" : draggedCourse . designator ,
259
+ "term" : destTerm ,
260
+ "year" : destYear
261
+ } ;
262
+ currPlan . courses [ draggedCourse . designator ] = newCourse ;
263
+ //update db
264
+ $ . post ( "/plan_courses" , {
265
+ plan : plan . plan_name ,
266
+ user : plan . user . id ,
267
+ designator : draggedCourse . designator ,
268
+ term : destTerm ,
269
+ year : destYear
270
+ } ) ;
271
+ $ ( "#hrsCompleted" ) . html ( "Hours Completed: " + currPlan . hrsCompleted ) ;
272
+ $ ( "#hrsCurrent" ) . html ( "Current Hours: " + currPlan . hrsCurrent ) ;
273
+ $ ( "#hrsFuture" ) . html ( "Remaining Hours: " + currPlan . hrsFuture ) ;
274
+ $ ( "#hrsTotal" ) . html ( "Total Hours Planned: " + currPlan . hrsTotal ) ;
201
275
}
202
276
$ . post ( "/plan_courses" , {
203
277
plan : plan . plan_name ,
@@ -234,6 +308,7 @@ window.dropInTrash = function(event){
234
308
let originHours = parseInt ( draggedPlanOrigin . parentElement . previousSibling . children [ 1 ] . innerText . split ( ": " ) [ 1 ] ) ;
235
309
draggedPlanOrigin . parentElement . previousSibling . children [ 1 ] . innerText = "Hours: " + ( originHours - draggedCourse . credits ) ;
236
310
draggedPlanOrigin . remove ( ) ;
311
+ delete currPlan . courses [ draggedCourse . designator ] ;
237
312
draggedPlanOrigin = null ;
238
313
239
314
$ . get ( "/plan_courses" , {
@@ -245,10 +320,42 @@ window.dropInTrash = function(event){
245
320
$ ( "#hrsCurrent" ) . html ( "Current Hours: " + currPlan . hrsCurrent ) ;
246
321
$ ( "#hrsFuture" ) . html ( "Remaining Hours: " + currPlan . hrsFuture ) ;
247
322
$ ( "#hrsTotal" ) . html ( "Total Hours Planned: " + currPlan . hrsTotal ) ;
323
+
324
+ addToRequirements ( draggedCourse . designator ) ;
248
325
}
249
326
draggedCourse = null ;
250
327
}
251
328
329
+ // Unhide requirement if removed from plan
330
+ window . addToRequirements = function ( designator ) {
331
+ let acc = $ ( '#accordion' ) . get ( ) [ 0 ] ;
332
+ for ( let i = 1 ; i < acc . children . length ; i += 2 ) {
333
+ let accChild = acc . children [ i ] ;
334
+ for ( let j = 0 ; j < accChild . children . length ; j ++ ) {
335
+ let req = accChild . children [ j ] ;
336
+ if ( req . innerText . includes ( designator ) ) {
337
+ req . removeAttribute ( 'hidden' ) ;
338
+ return ;
339
+ }
340
+ }
341
+ }
342
+ }
343
+
344
+ // Hide requirement if added from catalog table
345
+ window . removeFromRequirements = function ( designator ) {
346
+ let acc = $ ( '#accordion' ) . get ( ) [ 0 ] ;
347
+ for ( let i = 1 ; i < acc . children . length ; i += 2 ) {
348
+ let accChild = acc . children [ i ] ;
349
+ for ( let j = 0 ; j < accChild . children . length ; j ++ ) {
350
+ let req = accChild . children [ j ] ;
351
+ if ( req . innerText . includes ( designator ) ) {
352
+ req . setAttribute ( 'hidden' , true ) ;
353
+ return ;
354
+ }
355
+ }
356
+ }
357
+ }
358
+
252
359
class Course {
253
360
constructor ( desig , year , term ) {
254
361
this . term = term ;
0 commit comments