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 ;
@@ -102,87 +133,119 @@ function getPlans(){
102
133
} ) ;
103
134
}
104
135
136
+ // check if course is already in the plan
105
137
function courseInPlan ( designator ) {
106
- let c = plan . courses [ designator ] ;
138
+ let c = currPlan . courses [ designator ] ;
107
139
return c !== undefined ;
108
140
}
109
141
142
+ // check if course is already in the semester being dropped on
143
+ function courseInSemester ( designator , droppedTerm ) {
144
+ for ( let i = 0 ; i < droppedTerm . children . length ; i ++ ) {
145
+ if ( droppedTerm . children [ i ] . innerText . includes ( designator ) ) {
146
+ return true ;
147
+ }
148
+ }
149
+ return false ;
150
+ }
151
+
152
+ // set source course when dragging from requiremetns accordion
110
153
window . dragFromReq = function ( event ) {
111
154
let desig = event . target . innerText . split ( ": " ) [ 0 ] ;
112
155
draggedCourse = plan . catalog . courses [ desig ] ;
113
156
draggedPlanOrigin = null ;
157
+ draggedCatOrigin = null ;
114
158
draggedReqOrigin = event . target ;
115
159
}
116
160
161
+ // set source course when dragging from catalog table
117
162
window . dragFromCat = function ( event ) {
118
163
let desig = event . target . children [ 0 ] . innerText
119
164
draggedCourse = plan . catalog . courses [ desig ] ;
120
165
draggedPlanOrigin = null ;
121
166
draggedReqOrigin = null ;
167
+ draggedCatOrigin = event . target ;
122
168
}
123
169
170
+ // set source course when dragging from plan
124
171
window . dragFromPlan = function ( event ) {
125
172
let desig = event . target . innerText . split ( ": " ) [ 0 ] ;
126
173
draggedCourse = plan . catalog . courses [ desig ] ;
127
174
draggedReqOrigin = null ;
175
+ draggedCatOrigin = null ;
128
176
draggedPlanOrigin = event . target ;
129
177
}
130
178
179
+ // indicate valid drop when hovering over plan
131
180
window . hoverOverPlan = function ( event ) {
132
181
event . preventDefault ( ) ;
133
182
}
134
183
184
+ // update db when dropping course on plan
135
185
window . dropOnPlan = function ( event ) {
136
186
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 ;
187
+ if ( ! ( courseInSemester ( draggedCourse . designator , event . target . children [ 1 ] ) || ( courseInPlan ( draggedCourse . designator ) && draggedCatOrigin != null ) ) ) {
188
+ event . target . children [ 1 ] . innerHTML += "<li draggable='true' ondragstart='dragFromPlan(event)'>" + draggedCourse . designator + ": " + draggedCourse . name + "</li>" ;
189
+ if ( event . target . classList . contains ( 'current' ) ) {
190
+ currPlan . hrsCurrent += draggedCourse . credits ;
159
191
}
160
- else if ( draggedPlanOrigin . parentElement . parentElement . classList . contains ( 'notStarted' ) ) {
161
- currPlan . hrsFuture - = draggedCourse . credits ;
192
+ else if ( event . target . classList . contains ( 'notStarted' ) ) {
193
+ currPlan . hrsFuture + = draggedCourse . credits ;
162
194
}
163
195
else {
164
- currPlan . hrsCompleted - = draggedCourse . credits ;
196
+ currPlan . hrsCompleted + = draggedCourse . credits ;
165
197
}
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 ;
198
+ let hours = parseInt ( event . target . children [ 0 ] . children [ 1 ] . innerText . split ( ": " ) [ 1 ] ) ;
199
+ event . target . children [ 0 ] . children [ 1 ] . innerText = "Hours: " + ( hours + draggedCourse . credits ) ;
200
+ if ( draggedReqOrigin !== null ) {
201
+ // From requirements accordion
202
+ currPlan . hrsTotal += draggedCourse . credits ;
203
+ draggedReqOrigin . hidden = true ;
204
+ draggedReqOrigin = null ;
205
+ }
206
+ else if ( draggedPlanOrigin !== null ) {
207
+ // From another term
208
+ if ( draggedPlanOrigin . parentElement . parentElement . classList . contains ( 'current' ) ) {
209
+ currPlan . hrsCurrent -= draggedCourse . credits ;
210
+ }
211
+ else if ( draggedPlanOrigin . parentElement . parentElement . classList . contains ( 'notStarted' ) ) {
212
+ currPlan . hrsFuture -= draggedCourse . credits ;
213
+ }
214
+ else {
215
+ currPlan . hrsCompleted -= draggedCourse . credits ;
216
+ }
217
+ let originHours = parseInt ( draggedPlanOrigin . parentElement . previousSibling . children [ 1 ] . innerText . split ( ": " ) [ 1 ] ) ;
218
+ draggedPlanOrigin . parentElement . previousSibling . children [ 1 ] . innerText = "Hours: " + ( originHours - draggedCourse . credits ) ;
219
+ draggedPlanOrigin . remove ( ) ;
220
+ draggedPlanOrigin = null ;
221
+ }
222
+ else {
223
+ // From catalog table
224
+ currPlan . hrsTotal += draggedCourse . credits ;
225
+ removeFromRequirements ( draggedCourse . designator ) ;
226
+ }
227
+ // add to javascript plan object
228
+ let destTerm = event . target . children [ 0 ] . children [ 0 ] . innerText . split ( " " ) [ 0 ] ;
229
+ let destYear = parseInt ( event . target . children [ 0 ] . children [ 0 ] . innerText . split ( " " ) [ 1 ] ) ;
230
+ let newCourse = {
231
+ "designator" : draggedCourse . designator ,
232
+ "term" : destTerm ,
233
+ "year" : destYear
234
+ } ;
235
+ currPlan . courses [ draggedCourse . designator ] = newCourse ;
236
+ //update db
237
+ $ . post ( "/plan_courses" , {
238
+ plan : plan . plan_name ,
239
+ user : plan . user . id ,
240
+ designator : draggedCourse . designator ,
241
+ term : destTerm ,
242
+ year : destYear
243
+ } ) ;
244
+ $ ( "#hrsCompleted" ) . html ( "Hours Completed: " + currPlan . hrsCompleted ) ;
245
+ $ ( "#hrsCurrent" ) . html ( "Current Hours: " + currPlan . hrsCurrent ) ;
246
+ $ ( "#hrsFuture" ) . html ( "Remaining Hours: " + currPlan . hrsFuture ) ;
247
+ $ ( "#hrsTotal" ) . html ( "Total Hours Planned: " + currPlan . hrsTotal ) ;
174
248
}
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
249
draggedCourse = null ;
187
250
}
188
251
@@ -206,6 +269,7 @@ window.dropInTrash = function(event){
206
269
let originHours = parseInt ( draggedPlanOrigin . parentElement . previousSibling . children [ 1 ] . innerText . split ( ": " ) [ 1 ] ) ;
207
270
draggedPlanOrigin . parentElement . previousSibling . children [ 1 ] . innerText = "Hours: " + ( originHours - draggedCourse . credits ) ;
208
271
draggedPlanOrigin . remove ( ) ;
272
+ delete currPlan . courses [ draggedCourse . designator ] ;
209
273
draggedPlanOrigin = null ;
210
274
211
275
$ . get ( "/plan_courses" , {
@@ -217,10 +281,42 @@ window.dropInTrash = function(event){
217
281
$ ( "#hrsCurrent" ) . html ( "Current Hours: " + currPlan . hrsCurrent ) ;
218
282
$ ( "#hrsFuture" ) . html ( "Remaining Hours: " + currPlan . hrsFuture ) ;
219
283
$ ( "#hrsTotal" ) . html ( "Total Hours Planned: " + currPlan . hrsTotal ) ;
284
+
285
+ addToRequirements ( draggedCourse . designator ) ;
220
286
}
221
287
draggedCourse = null ;
222
288
}
223
289
290
+ // Unhide requirement if removed from plan
291
+ window . addToRequirements = function ( designator ) {
292
+ let acc = $ ( '#accordion' ) . get ( ) [ 0 ] ;
293
+ for ( let i = 1 ; i < acc . children . length ; i += 2 ) {
294
+ let accChild = acc . children [ i ] ;
295
+ for ( let j = 0 ; j < accChild . children . length ; j ++ ) {
296
+ let req = accChild . children [ j ] ;
297
+ if ( req . innerText . includes ( designator ) ) {
298
+ req . removeAttribute ( 'hidden' ) ;
299
+ return ;
300
+ }
301
+ }
302
+ }
303
+ }
304
+
305
+ // Hide requirement if added from catalog table
306
+ window . removeFromRequirements = function ( designator ) {
307
+ let acc = $ ( '#accordion' ) . get ( ) [ 0 ] ;
308
+ for ( let i = 1 ; i < acc . children . length ; i += 2 ) {
309
+ let accChild = acc . children [ i ] ;
310
+ for ( let j = 0 ; j < accChild . children . length ; j ++ ) {
311
+ let req = accChild . children [ j ] ;
312
+ if ( req . innerText . includes ( designator ) ) {
313
+ req . setAttribute ( 'hidden' , true ) ;
314
+ return ;
315
+ }
316
+ }
317
+ }
318
+ }
319
+
224
320
class Course {
225
321
constructor ( desig , year , term ) {
226
322
this . term = term ;
0 commit comments