Skip to content

Commit 6784150

Browse files
committed
added admin and user main page
1 parent 90015f2 commit 6784150

File tree

11 files changed

+256
-102
lines changed

11 files changed

+256
-102
lines changed

app/assets/stylesheets/project4.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,11 @@ table div, .dataTables_scrollHead, .dataTables_scrollHeadInner, .dataTables_scro
191191
color: green;
192192
}
193193

194+
#upperPanel {
195+
text-align: center;
196+
flex-direction: column;
197+
}
198+
194199
#trash{
195200
font-size: 64px;
196201
}

app/controllers/plans_controller.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@ class PlansController < ApplicationController
55
# GET /plans
66
# GET /plans.json
77
def index
8-
@plans = Plan.where(user_id: current_user.id)
8+
if current_user.role == "admin"
9+
@plans = Plan.all
10+
else
11+
@plans = Plan.where(user_id: current_user.id)
12+
end
913
end
1014

1115
# GET /plans/1

app/javascript/packs/myjs.js

Lines changed: 123 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
var currPlan = false;
2-
var plan = false;
1+
var currPlan = null;
2+
var plan = null;
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;
9-
10-
$(getPlans);
6+
var planTableLoaded = false;
7+
var draggedCourse = null;
8+
var draggedReqOrigin = null;
9+
var draggedPlanOrigin = null;
10+
var draggedCatOrigin = null;
1111

1212
// changes plan, triggered on selection of new plan in dropdown
1313
$(document).on('change', '#planSelect', function (){
@@ -19,15 +19,46 @@ $(document).on('change', '#planSelect', function (){
1919
selectedCatalogYear = parseInt(selected[1]);
2020

2121
// send request to load new plan
22-
getPlans();
22+
getPlan();
2323

2424
});
2525

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){
2829
//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;
3060
$(".dropdown").html("<option selected disabled>Change Plan</option>");
61+
// set current plan
3162
for (let i in plans){
3263
if (plans[i].major === selectedMajor && plans[i].catalog.year === selectedCatalogYear){
3364
plan = plans[i];
@@ -37,10 +68,11 @@ function getPlans(){
3768
$(".dropdown").append("<option>" + plans[i].major + ", " + plans[i].catalog.year + "</option>");
3869
}
3970
}
40-
if (plan === false){
71+
if (plan == null){
4172
console.log("Error: did not find selected plan");
4273
}
4374

75+
// dynamically generate years, terms, semesters on page
4476
currPlan = new Plan(plan.user.login, plan.plan_name, plan.major, plan.curr_year, plan.curr_term, plan.courses, plan.catalog.year);
4577
currPlan.sortCourses();
4678
currPlan.generateHTML();
@@ -52,6 +84,7 @@ function getPlans(){
5284
$("#hrsFuture").html("Remaining Hours: " + currPlan.hrsFuture);
5385
$("#hrsTotal").html("Total Hours Planned: " + currPlan.hrsTotal);
5486

87+
// load catalog table
5588
let courses = [];
5689
for (let c in plan.catalog.courses){
5790
courses.push(plan.catalog.courses[c]);
@@ -79,12 +112,11 @@ function getPlans(){
79112
}
80113

81114

115+
// load accordion with requirements
82116
var requirements = plan.requirements;
83-
84117
$( function() {
85118
$( "#accordion" ).accordion({collapsible: true, active: false});
86119
});
87-
88120
$('#accordion').empty();
89121
for (let i in requirements){
90122
let reqCourses = requirements[i].courses;
@@ -102,87 +134,118 @@ function getPlans(){
102134
});
103135
}
104136

137+
// check if course is already in the plan
105138
function courseInPlan(designator){
106-
let c = plan.courses[designator];
139+
let c = currPlan.courses[designator];
107140
return c !== undefined;
108141
}
109142

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
110154
window.dragFromReq = function(event){
111155
let desig = event.target.innerText.split(": ")[0];
112156
draggedCourse = plan.catalog.courses[desig];
113157
draggedPlanOrigin = null;
158+
draggedCatOrigin = null;
114159
draggedReqOrigin = event.target;
115160
}
116161

162+
// set source course when dragging from catalog table
117163
window.dragFromCat = function(event){
118164
let desig = event.target.children[0].innerText
119165
draggedCourse = plan.catalog.courses[desig];
120166
draggedPlanOrigin = null;
121167
draggedReqOrigin = null;
168+
draggedCatOrigin = event.target;
122169
}
123170

171+
// set source course when dragging from plan
124172
window.dragFromPlan = function(event){
125173
let desig = event.target.innerText.split(": ")[0];
126174
draggedCourse = plan.catalog.courses[desig];
127175
draggedReqOrigin = null;
176+
draggedCatOrigin = null;
128177
draggedPlanOrigin = event.target;
129178
}
130179

180+
// indicate valid drop when hovering over plan
131181
window.hoverOverPlan = function(event){
132182
event.preventDefault();
133183
}
134184

185+
// update db when dropping course on plan
135186
window.dropOnPlan = function(event){
136187
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;
159192
}
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;
162195
}
163196
else{
164-
currPlan.hrsCompleted -= draggedCourse.credits;
197+
currPlan.hrsCompleted += draggedCourse.credits;
165198
}
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);
174248
}
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);
186249
draggedCourse = null;
187250
}
188251

@@ -206,6 +269,7 @@ window.dropInTrash = function(event){
206269
let originHours = parseInt(draggedPlanOrigin.parentElement.previousSibling.children[1].innerText.split(": ")[1]);
207270
draggedPlanOrigin.parentElement.previousSibling.children[1].innerText = "Hours: " + (originHours - draggedCourse.credits);
208271
draggedPlanOrigin.remove();
272+
delete currPlan.courses[draggedCourse.designator];
209273
draggedPlanOrigin = null;
210274

211275
$.get("/plan_courses", {

app/models/user.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ class User < ApplicationRecord
44
devise :database_authenticatable, :registerable,
55
:recoverable, :rememberable, :validatable
66
has_many :plans
7-
belongs_to :major
7+
belongs_to :major, optional: true
88
end

app/views/plans/_plan.json.jbuilder

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ json.user do
33
json.login plan.user.login
44
json.role plan.user.role
55
end
6+
json.id plan.id
67
json.plan_name plan.name
78
json.major plan.major.name
89
json.curr_year plan.curr_year

app/views/plans/index.html.erb

Lines changed: 41 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,44 @@
11
<nav id="header">
2+
<div>
3+
<% if user_signed_in?%>
4+
<h1>Welcome, <%= current_user.login %></h1>
5+
<h1 id="major"></h1>
6+
<h1 id="catYear"></h1>
7+
<% else %>
8+
<%= link_to "Sign In", new_user_session_path, :method => :get %>
9+
<%= link_to "Sign up", new_user_registration_path, :method => :get %>
10+
<% end %>
11+
12+
</div>
13+
<div>
14+
<% if user_signed_in?%>
15+
<%= link_to "Sign Out", destroy_user_session_path, :method => :delete %>
16+
<% else %>
17+
<% end %>
18+
<a href="http://judah.cedarville.edu/peopleschoice/index.php"><i class="fa fa-home"></i>Home</a>
19+
</div>
20+
</nav>
21+
22+
<div class="main">
23+
<div id="upperPanel" class="upper panel">
24+
<header class="panelHeader">Plans</header>
25+
<div class="container">
26+
<table id="plansTable">
27+
<thead>
28+
<tr>
29+
<th>User</th>
30+
<th>Plan Name</th>
31+
<th>Major</th>
32+
<th>Catalog Year</th>
33+
<th>Open</th>
34+
</tr>
35+
</thead>
36+
</table>
37+
</div>
38+
</div>
39+
</div>
40+
<script>getAllPlans()</script>
41+
<!--<nav id="header">
242
<div>
343
<% if user_signed_in?%>
444
<h1>Welcome, <%= current_user.login %></h1>
@@ -73,32 +113,4 @@
73113
</div>
74114
</div>
75115
<div id='testDiv'></div>
76-
</div>
77-
78-
<!--<p id="notice"><%= notice %></p>
79-
80-
<h1>Plans</h1>
81-
82-
<table>
83-
<thead>
84-
<tr>
85-
<th>Name</th>
86-
<th colspan="3"></th>
87-
</tr>
88-
</thead>
89-
90-
<tbody>
91-
<% @plans.each do |plan| %>
92-
<tr>
93-
<td><%= plan.name %></td>
94-
<td><%= link_to 'Show', plan %></td>
95-
<td><%= link_to 'Edit', edit_plan_path(plan) %></td>
96-
<td><%= link_to 'Destroy', plan, method: :delete, data: { confirm: 'Are you sure?' } %></td>
97-
</tr>
98-
<% end %>
99-
</tbody>
100-
</table>
101-
102-
<br>
103-
104-
<%= link_to 'New Plan', new_plan_path %>
116+
</div>

0 commit comments

Comments
 (0)