Skip to content

Commit 90015f2

Browse files
committed
Merge branch 'djacobs-dragndrop' into develop
2 parents 030c951 + 2ee8edd commit 90015f2

File tree

11 files changed

+198
-22
lines changed

11 files changed

+198
-22
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
// Place all the styles related to the PlanCourses controller here.
2+
// They will automatically be included in application.css.
3+
// You can use Sass (SCSS) here: https://sass-lang.com/

app/assets/stylesheets/project4.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,3 +190,7 @@ table div, .dataTables_scrollHead, .dataTables_scrollHeadInner, .dataTables_scro
190190
.fsuccess{
191191
color: green;
192192
}
193+
194+
#trash{
195+
font-size: 64px;
196+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class PlanCoursesController < ApplicationController
2+
#post
3+
def create
4+
@planCourse = PlanCourse.new
5+
@planCourse.plan_id = Plan.where(name: params[:plan], user_id: params[:user])[0].id
6+
@planCourse.course_id = Course.where(designator: params[:designator])[0].id
7+
@planCourse.term = params[:term]
8+
@planCourse.year = params[:year]
9+
@planCourse.save!
10+
end
11+
12+
#get
13+
def index
14+
@planCourse = PlanCourse.where(plan_id: Plan.where(name: params[:plan], user_id: params[:user])[0].id, course_id: Course.where(designator: params[:designator])[0].id)[0]
15+
@planCourse.destroy();
16+
end
17+
end

app/helpers/plan_courses_helper.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
module PlanCoursesHelper
2+
end

app/javascript/packs/myjs.js

Lines changed: 150 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ var plan = false;
33
var selectedMajor = "Comp. Sci.";
44
var selectedCatalogYear = 2017;
55
var catalogLoaded = false;
6+
var draggedCourse = false;
7+
var draggedReqOrigin = false;
8+
var draggedPlanOrigin = false;
69

710
$(getPlans);
811

@@ -46,7 +49,8 @@ function getPlans(){
4649

4750
$("#hrsCompleted").html("Hours Completed: " + currPlan.hrsCompleted);
4851
$("#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);
5054

5155
let courses = [];
5256
for (let c in plan.catalog.courses){
@@ -68,6 +72,10 @@ function getPlans(){
6872
});
6973
$('.dataTables_scrollHeadInner').css('padding', '0');
7074
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)');
7179
}
7280

7381

@@ -79,16 +87,140 @@ function getPlans(){
7987

8088
$('#accordion').empty();
8189
for (let i in requirements){
82-
let courses = requirements[i].courses;
90+
let reqCourses = requirements[i].courses;
8391
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+
}
8699
}
87100
$('#accordion').append('<h3><a href="#">' + requirements[i].name + '</a></h3><div>' + itemHtml + '</div>').accordion('refresh');
88101
}
89102
});
90103
}
91104

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+
92224
class Course {
93225
constructor(desig, year, term){
94226
this.term = term;
@@ -114,7 +246,8 @@ class Plan {
114246
this.years = [];
115247
this.hrsCompleted = 0;
116248
this.hrsCurrent = 0;
117-
this.hrsPlanned = 0;
249+
this.hrsFuture = 0;
250+
this.hrsTotal = 0;
118251
}
119252

120253
sortCourses(){
@@ -149,18 +282,19 @@ class Plan {
149282
}
150283
}
151284
else{
285+
this.hrsFuture += year.fallHrs;
152286
urHTML += " notStarted";
153287
}
154-
urHTML += "'>";
288+
urHTML += "' ondragover='hoverOverPlan(event)' ondrop='dropOnPlan(event)'>";
155289
urHTML += "<header><span class='termHeader'>Fall " + (year.name - 1) + "</span><span class='termHours'>Hours: " + year.fallHrs + "</span></header>";
156290
urHTML += "<ul class='courses'>";
157291
for (let j = 0; j < year.fall.length; j++){
158292
let course = year.fall[j];
159-
this.hrsPlanned += course.hours;
293+
this.hrsTotal += course.hours;
160294
if (beforeCurrent){
161295
this.hrsCompleted += course.hours;
162296
}
163-
urHTML += "<li>" + course.id + " " + course.name + "</li>";
297+
urHTML += "<li draggable='true' ondragstart='dragFromPlan(event)'>" + course.id + ": " + course.name + "</li>";
164298
}
165299
urHTML += "</ul></div>";
166300

@@ -173,18 +307,19 @@ class Plan {
173307
}
174308
}
175309
else{
310+
this.hrsFuture += year.springHrs;
176311
urHTML += " notStarted";
177312
}
178-
urHTML += "'>";
313+
urHTML += "' ondragover='hoverOverPlan(event)' ondrop='dropOnPlan(event)'>";
179314
urHTML += "<header><span class='termHeader'>Spring " + year.name + "</span><span class='termHours'>Hours: " + year.springHrs + "</span></header>";
180315
urHTML += "<ul class='courses'>";
181316
for (let j = 0; j < year.spring.length; j++){
182317
let course = year.spring[j];
183-
this.hrsPlanned += course.hours;
318+
this.hrsTotal += course.hours;
184319
if (beforeCurrent){
185320
this.hrsCompleted += course.hours;
186321
}
187-
urHTML += "<li>" + course.id + " " + course.name + "</li>";
322+
urHTML += "<li draggable='true' ondragstart='dragFromPlan(event)'>" + course.id + ": " + course.name + "</li>";
188323
}
189324
urHTML += "</ul></div>";
190325

@@ -197,17 +332,18 @@ class Plan {
197332
}
198333
}
199334
else{
335+
this.hrsFuture += year.summerHrs;
200336
urHTML += " notStarted";
201337
}
202-
urHTML += "'>";
338+
urHTML += "' ondragover='hoverOverPlan(event)' ondrop='dropOnPlan(event)'>";
203339
urHTML += "<header><span class='termHeader'>Summer " + year.name + "</span><span class='termHours'>Hours: " + year.summerHrs + "</span></header><ul class='courses'>";
204340
for (let j = 0; j < year.summer.length; j++){
205341
let course = year.summer[j];
206-
this.hrsPlanned += course.hours;
342+
this.hrsTotal += course.hours;
207343
if (beforeCurrent){
208344
this.hrsCompleted += course.hours;
209345
}
210-
urHTML += "<li>" + course.id + " " + course.name + "</li>";
346+
urHTML += "<li draggable='true' ondragstart='dragFromPlan(event)'>" + course.id + ": " + course.name + "</li>";
211347
}
212348
urHTML += "</ul></div></div>";
213349
}

app/views/layouts/application.html.erb

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,10 @@
77
<%= csrf_meta_tags %>
88
<%= csp_meta_tag %>
99

10-
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
11-
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
1210
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css"/>
1311
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
14-
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
15-
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
16-
<script type="text/javascript" src="https://cdn.datatables.net/1.10.20/js/jquery.dataTables.min.js"></script>
12+
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
13+
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
1714

1815
</head>
1916

app/views/plans/_plan.json.jbuilder

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ json.catalog do
2020
json.year plan.catalog.year
2121
json.courses do
2222
plan.catalog.catalog_courses.each{ |catalogCourse| json.set! catalogCourse.course.designator do
23-
json.id catalogCourse.course.id
2423
json.designator catalogCourse.course.designator
2524
json.name catalogCourse.course.name
2625
json.description catalogCourse.course.description

app/views/plans/index.html.erb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@
3535
<div class="container">
3636
<div id="accordion">
3737
</div>
38+
<div id="trash" ondragover='hoverOverTrash(event)' ondrop='dropInTrash(event)'>
39+
<i class="fa fa-trash" aria-hidden="true"></i>
40+
</div>
3841
</div>
3942
</div>
4043

@@ -50,7 +53,8 @@
5053
<header class="panelHeader">Hours</header> <div class="container">
5154
<p id="hrsCompleted">Hours Completed: </p>
5255
<p id="hrsCurrent">Current Hours: </p>
53-
<p id="hrsPlanned">Total Hours Planned: </p>
56+
<p id="hrsFuture">Remaining Hours: </p>
57+
<p id="hrsTotal">Total Hours Planned: </p>
5458
</div>
5559
</div>
5660

config/routes.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
Rails.application.routes.draw do
22
root 'plans#index'
33
resources :plans
4+
resources :plan_courses
45
devise_for :users, :controllers => {:registrations => 'registrations'}
56
# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
67
end

db/seeds.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@
200200
course17.save!
201201
course18 = Course.new
202202
course18.designator = "EGCP-3010"
203-
course18.name = "C++ ADLD"
203+
course18.name = "ADLD"
204204
course18.description = "I AM ROBOT"
205205
course18.credits = 3
206206
course18.save!
@@ -955,6 +955,12 @@
955955
planCourse39.term = "Spring"
956956
planCourse39.year = 2021
957957
planCourse39.save!
958+
planCourse40 = PlanCourse.new
959+
planCourse40.plan_id = 4
960+
planCourse40.course_id = 33
961+
planCourse40.term = "Spring"
962+
planCourse40.year = 2018
963+
planCourse40.save!
958964

959965

960966
#alternate syntax

0 commit comments

Comments
 (0)