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,46 @@ $(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
+ "scrollCollapse" : false
49
+ } ) ;
50
+ $ ( '.dataTables_scrollHeadInner' ) . css ( 'padding' , '0' ) ;
51
+ planTableLoaded = true ;
52
+ }
53
+ } ) ;
54
+ }
55
+
56
+ // For loading a single plan
57
+ window . getPlan = function ( ) {
58
+ $ . get ( "/plans.json" , function ( plans ) {
59
+ plan = null ;
30
60
$ ( ".dropdown" ) . html ( "<option selected disabled>Change Plan</option>" ) ;
61
+ // set current plan
31
62
for ( let i in plans ) {
32
63
if ( plans [ i ] . major === selectedMajor && plans [ i ] . catalog . year === selectedCatalogYear ) {
33
64
plan = plans [ i ] ;
@@ -37,10 +68,11 @@ function getPlans(){
37
68
$ ( ".dropdown" ) . append ( "<option>" + plans [ i ] . major + ", " + plans [ i ] . catalog . year + "</option>" ) ;
38
69
}
39
70
}
40
- if ( plan === false ) {
71
+ if ( plan == null ) {
41
72
console . log ( "Error: did not find selected plan" ) ;
42
73
}
43
74
75
+ // dynamically generate years, terms, semesters on page
44
76
currPlan = new Plan ( plan . user . login , plan . plan_name , plan . major , plan . curr_year , plan . curr_term , plan . courses , plan . catalog . year ) ;
45
77
currPlan . sortCourses ( ) ;
46
78
currPlan . generateHTML ( ) ;
@@ -52,6 +84,7 @@ function getPlans(){
52
84
$ ( "#hrsFuture" ) . html ( "Remaining Hours: " + currPlan . hrsFuture ) ;
53
85
$ ( "#hrsTotal" ) . html ( "Total Hours Planned: " + currPlan . hrsTotal ) ;
54
86
87
+ // load catalog table
55
88
let courses = [ ] ;
56
89
for ( let c in plan . catalog . courses ) {
57
90
courses . push ( plan . catalog . courses [ c ] ) ;
@@ -79,12 +112,11 @@ function getPlans(){
79
112
}
80
113
81
114
115
+ // load accordion with requirements
82
116
var requirements = plan . requirements ;
83
-
84
117
$ ( function ( ) {
85
118
$ ( "#accordion" ) . accordion ( { collapsible : true , active : false } ) ;
86
119
} ) ;
87
-
88
120
$ ( '#accordion' ) . empty ( ) ;
89
121
for ( let i in requirements ) {
90
122
let reqCourses = requirements [ i ] . courses ;
@@ -102,87 +134,118 @@ function getPlans(){
102
134
} ) ;
103
135
}
104
136
137
+ // check if course is already in the plan
105
138
function courseInPlan ( designator ) {
106
- let c = plan . courses [ designator ] ;
139
+ let c = currPlan . courses [ designator ] ;
107
140
return c !== undefined ;
108
141
}
109
142
143
+ // check if course is already in the semester being dropped on
144
+ function courseInSemester ( designator , droppedTerm ) {
145
+ for ( let i = 0 ; i < droppedTerm . children . length ; i ++ ) {
146
+ if ( droppedTerm . children [ i ] . innerText . includes ( designator ) ) {
147
+ return true ;
148
+ }
149
+ }
150
+ return false ;
151
+ }
152
+
153
+ // set source course when dragging from requiremetns accordion
110
154
window . dragFromReq = function ( event ) {
111
155
let desig = event . target . innerText . split ( ": " ) [ 0 ] ;
112
156
draggedCourse = plan . catalog . courses [ desig ] ;
113
157
draggedPlanOrigin = null ;
158
+ draggedCatOrigin = null ;
114
159
draggedReqOrigin = event . target ;
115
160
}
116
161
162
+ // set source course when dragging from catalog table
117
163
window . dragFromCat = function ( event ) {
118
164
let desig = event . target . children [ 0 ] . innerText
119
165
draggedCourse = plan . catalog . courses [ desig ] ;
120
166
draggedPlanOrigin = null ;
121
167
draggedReqOrigin = null ;
168
+ draggedCatOrigin = event . target ;
122
169
}
123
170
171
+ // set source course when dragging from plan
124
172
window . dragFromPlan = function ( event ) {
125
173
let desig = event . target . innerText . split ( ": " ) [ 0 ] ;
126
174
draggedCourse = plan . catalog . courses [ desig ] ;
127
175
draggedReqOrigin = null ;
176
+ draggedCatOrigin = null ;
128
177
draggedPlanOrigin = event . target ;
129
178
}
130
179
180
+ // indicate valid drop when hovering over plan
131
181
window . hoverOverPlan = function ( event ) {
132
182
event . preventDefault ( ) ;
133
183
}
134
184
185
+ // update db when dropping course on plan
135
186
window . dropOnPlan = function ( event ) {
136
187
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 ;
188
+ if ( ! ( courseInSemester ( draggedCourse . designator , event . target . children [ 1 ] ) || ( courseInPlan ( draggedCourse . designator ) && draggedCatOrigin != null ) ) ) {
189
+ event . target . children [ 1 ] . innerHTML += "<li draggable='true' ondragstart='dragFromPlan(event)'>" + draggedCourse . designator + ": " + draggedCourse . name + "</li>" ;
190
+ if ( event . target . classList . contains ( 'current' ) ) {
191
+ currPlan . hrsCurrent += draggedCourse . credits ;
159
192
}
160
- else if ( draggedPlanOrigin . parentElement . parentElement . classList . contains ( 'notStarted' ) ) {
161
- currPlan . hrsFuture - = draggedCourse . credits ;
193
+ else if ( event . target . classList . contains ( 'notStarted' ) ) {
194
+ currPlan . hrsFuture + = draggedCourse . credits ;
162
195
}
163
196
else {
164
- currPlan . hrsCompleted - = draggedCourse . credits ;
197
+ currPlan . hrsCompleted + = draggedCourse . credits ;
165
198
}
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 ;
199
+ let hours = parseInt ( event . target . children [ 0 ] . children [ 1 ] . innerText . split ( ": " ) [ 1 ] ) ;
200
+ event . target . children [ 0 ] . children [ 1 ] . innerText = "Hours: " + ( hours + draggedCourse . credits ) ;
201
+ if ( draggedReqOrigin !== null ) {
202
+ // From requirements accordion
203
+ currPlan . hrsTotal += draggedCourse . credits ;
204
+ draggedReqOrigin . hidden = true ;
205
+ draggedReqOrigin = null ;
206
+ }
207
+ else if ( draggedPlanOrigin !== null ) {
208
+ // From another term
209
+ if ( draggedPlanOrigin . parentElement . parentElement . classList . contains ( 'current' ) ) {
210
+ currPlan . hrsCurrent -= draggedCourse . credits ;
211
+ }
212
+ else if ( draggedPlanOrigin . parentElement . parentElement . classList . contains ( 'notStarted' ) ) {
213
+ currPlan . hrsFuture -= draggedCourse . credits ;
214
+ }
215
+ else {
216
+ currPlan . hrsCompleted -= draggedCourse . credits ;
217
+ }
218
+ let originHours = parseInt ( draggedPlanOrigin . parentElement . previousSibling . children [ 1 ] . innerText . split ( ": " ) [ 1 ] ) ;
219
+ draggedPlanOrigin . parentElement . previousSibling . children [ 1 ] . innerText = "Hours: " + ( originHours - draggedCourse . credits ) ;
220
+ draggedPlanOrigin . remove ( ) ;
221
+ draggedPlanOrigin = null ;
222
+ }
223
+ else {
224
+ // From catalog table
225
+ currPlan . hrsTotal += draggedCourse . credits ;
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" , {
0 commit comments