Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
SRCT
schedules
Commits
f2ec598d
Commit
f2ec598d
authored
Mar 31, 2019
by
Zac Wood
Browse files
mini redesign
parent
fbb5d5b8
Pipeline
#4148
failed with stage
in 2 minutes and 41 seconds
Changes
10
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
schedules/app/assets/stylesheets/application.scss
View file @
f2ec598d
...
@@ -20,6 +20,11 @@ body {
...
@@ -20,6 +20,11 @@ body {
background-color
:
#E4E4E4
;
background-color
:
#E4E4E4
;
}
}
#page
{
padding-top
:
16px
;
padding-bottom
:
16px
;
}
.card
{
.card
{
margin-bottom
:
12px
;
margin-bottom
:
12px
;
...
@@ -90,3 +95,30 @@ body {
...
@@ -90,3 +95,30 @@ body {
.quick-add-header
{
.quick-add-header
{
margin-top
:
32px
;
margin-top
:
32px
;
}
}
%flex-display
{
display
:
inline-flex
;
}
.star-rating
{
@extend
%flex-display
;
align-items
:
center
;
font-size
:
1em
;
justify-content
:
flex-start
;
}
.back-stars
{
@extend
%flex-display
;
position
:
relative
;
text-shadow
:
4px
4px
10px
#843a3a
;
}
.front-stars
{
@extend
%flex-display
;
color
:
#FFBC0B
;
overflow
:
hidden
;
position
:
absolute
;
text-shadow
:
2px
2px
5px
#d29b09
;
top
:
0
;
}
// .jumbotron {
// color: #FFFFFF
// }
schedules/app/controllers/application_controller.rb
View file @
f2ec598d
# Configures the application.
# Configures the application.
class
ApplicationController
<
ActionController
::
Base
class
ApplicationController
<
ActionController
::
Base
protect_from_forgery
with: :null_session
include
BySemester
# On each request, set the semester and cart.
# On each request, set the semester and cart.
before_action
:set_semester
,
:set_cart
before_action
:set_cart
# Every page needs to know what semester it should load data from.
# set_semester checks both the semester_id query parameter and the user's cookies
# to look for a semester id and loads whatever it finds into @semester.
#
# By default, load the most recent semester.
def
set_semester
if
params
.
key?
(
:semester_id
)
@semester
=
Semester
.
find_by_id
params
[
:semester_id
]
cookies
[
:semester_id
]
=
@semester
.
id
elsif
cookies
[
:semester_id
].
nil?
@semester
=
Semester
.
first
cookies
[
:semester_id
]
=
@semester
.
id
else
@semester
=
Semester
.
find_by_id
cookies
[
:semester_id
]
end
end
# The user's cart is stored as a JSON-encoded list of CRNs.
# The user's cart is stored as a JSON-encoded list of CRNs.
# set_cart sets the @cart variable, which is a list of the sections represented by the CRNs.
# set_cart sets the @cart variable, which is a list of the sections represented by the CRNs.
...
...
schedules/app/controllers/search_controller.rb
View file @
f2ec598d
class
SearchController
<
ApplicationController
class
SearchController
<
ApplicationController
include
BySemester
def
index
def
index
redirect_to
(
home_url
)
unless
params
[
:query
].
length
>
1
redirect_to
(
home_url
)
unless
params
[
:query
].
length
>
1
...
@@ -10,5 +12,11 @@ class SearchController < ApplicationController
...
@@ -10,5 +12,11 @@ class SearchController < ApplicationController
results
=
SearchHelper
::
GenericItem
.
fetchall
(
String
.
new
(
params
[
:query
]),
semester:
@semester
).
group_by
(
&
:type
)
results
=
SearchHelper
::
GenericItem
.
fetchall
(
String
.
new
(
params
[
:query
]),
semester:
@semester
).
group_by
(
&
:type
)
@instructors
=
results
[
:instructor
]
&
.
map
(
&
:data
)
@instructors
=
results
[
:instructor
]
&
.
map
(
&
:data
)
@courses
=
results
[
:course
]
&
.
map
(
&
:data
)
@courses
=
results
[
:course
]
&
.
map
(
&
:data
)
if
@courses
&
.
count
==
1
redirect_to
course_url
(
@courses
.
first
)
elsif
@instructors
&
.
count
==
1
redirect_to
instructor_url
(
@instructors
.
first
)
end
end
end
end
end
schedules/app/javascript/src/cart.js
View file @
f2ec598d
...
@@ -38,13 +38,13 @@ class Cart {
...
@@ -38,13 +38,13 @@ class Cart {
for
(
const
courseId
in
this
.
_courses
)
{
for
(
const
courseId
in
this
.
_courses
)
{
if
(
this
.
_courses
[
courseId
].
length
===
0
)
delete
this
.
_courses
[
courseId
];
if
(
this
.
_courses
[
courseId
].
length
===
0
)
delete
this
.
_courses
[
courseId
];
}
}
document
.
getElementById
(
'
c
ourse
-counter
'
).
innerText
=
Object
.
keys
(
this
.
_courses
).
length
;
document
.
getElementById
(
'
c
art
-counter
'
).
innerText
=
Object
.
keys
(
this
.
_courses
).
length
;
}
}
async
toggleSection
(
section
)
{
async
toggleSection
(
section
)
{
const
resp
=
await
fetch
(
`/sessions/cart?&crn=
${
section
.
crn
}
`
,
{
const
resp
=
await
fetch
(
`/sessions/cart?&crn=
${
section
.
crn
}
`
,
{
cache
:
'
no-store
'
,
cache
:
'
no-store
'
,
credentials
:
'
same-origin
'
credentials
:
'
same-origin
'
,
});
});
const
json
=
await
resp
.
json
();
const
json
=
await
resp
.
json
();
this
.
courses
=
json
;
this
.
courses
=
json
;
...
@@ -65,4 +65,3 @@ const cart = new Cart();
...
@@ -65,4 +65,3 @@ const cart = new Cart();
document
.
addEventListener
(
'
DOMContentLoaded
'
,
()
=>
cart
.
_parseData
());
document
.
addEventListener
(
'
DOMContentLoaded
'
,
()
=>
cart
.
_parseData
());
export
default
cart
;
export
default
cart
;
schedules/app/views/shared/_course.html.erb
View file @
f2ec598d
...
@@ -33,8 +33,8 @@
...
@@ -33,8 +33,8 @@
<%=
sections
.
count
%>
sections
<%=
sections
.
count
%>
sections
</div>
</div>
</div>
</div>
<p
class=
"description"
>
<%=
course
.
description
%>
</p>
<p
class=
"description"
>
<%=
course
.
description
%>
</p>
<%
unless
course
.
prereqs
.
nil?
||
course
.
prereqs
.
empty?
%>
<%
unless
course
.
prereqs
.
nil?
||
course
.
prereqs
.
empty?
%>
<%
first
,
rest
=
course
.
prereqs
.
split
(
':'
)
%>
<%
first
,
rest
=
course
.
prereqs
.
split
(
':'
)
%>
<%
prereqs
,
note
=
rest
.
split
(
'.'
)
%>
<%
prereqs
,
note
=
rest
.
split
(
'.'
)
%>
...
@@ -53,6 +53,8 @@
...
@@ -53,6 +53,8 @@
</div>
</div>
<%
end
%>
<%
end
%>
<!-- List of Course Sections -->
<!-- List of Course Sections -->
...
...
schedules/app/views/shared/_navbar.html.erb
View file @
f2ec598d
<div
id=
"navbar"
class=
"container-fluid"
>
<!-- <div id="navbar" class="container-fluid">
<div
class=
"row align-left align-sm-center align-md-right"
id=
"navbar"
>
<div class="row align-left align-sm-center align-md-right" id="navbar">
<div
class=
"col align-center"
>
<div class="col align-center">
<div
class=
"center-vert"
>
<div class="center-vert">
<a
href=
"/"
id=
"logo"
>
<a href="/" id="logo">
<i
class=
"fas fa-calendar-alt"
></i>
<i class="fas fa-calendar-alt"></i>
Schedules
Schedules
</a>
</a>
<select
id=
"semester-select"
class=
"custom-select"
>
<%
Semester
.
all
.
each
do
|
semester
|
%>
<option
value=
"
<%=
semester
.
id
%>
"
<%
if
@semester
==
semester
%>
selected
<%
end
%>
>
<%=
"
#{
semester
.
season
}
#{
semester
.
year
}
"
%>
</option>
<%
end
%>
</select>
</div>
</div>
<div
class=
"col-sm align-center order-0 order-sm-1"
>
</div>
<a
id=
"cart-button"
href=
"
<%=
schedule_path
%>
"
>
</div>
<h1>
<span
class=
"fa-layers fa-fw"
id=
"schedule-icon"
>
<div class="col-sm align-center order-0 order-sm-1">
<i
class=
"fas fa-shopping-cart"
></i>
<a id="cart-button" href="
<%=
schedule_path
%>
">
<span
class=
"fa-layers fa-fw"
>
<h1>
<i
class=
"fas fa-circle"
data-fa-transform=
"shrink-3 up-12 right-12"
style=
"color:gray"
></i>
<span class="fa-layers fa-fw" id="schedule-icon">
<span
id=
"course-counter"
class=
"fa-layers-text fa-inverse"
data-fa-transform=
"shrink-10 up-12 right-12"
style=
"font-weight:600"
>
<i class="fas fa-shopping-cart"></i>
<%=
@cart
.
length
%>
<span class="fa-layers fa-fw">
</span>
<i class="fas fa-circle" data-fa-transform="shrink-3 up-12 right-12" style="color:gray"></i>
</span>
<span id="course-counter" class="fa-layers-text fa-inverse" data-fa-transform="shrink-10 up-12 right-12" style="font-weight:600">
</span>
<%=
@cart
.
length
%>
</h1>
</span>
</a>
</span>
</div>
</span>
</h1>
</a>
</div>
<div class="col order-1 order-sm-0">
<form action="/search" class="form">
<div class="input-group" style="width:100%;">
<input
id="searchbar"
value="
<%=
params
[
:query
]
%>
"
name="query"
type="text"
class="form-control"
placeholder="Search course or professor..."
aria-describedby="basic-addon2"
autocomplete="off"
>
<div class="input-group-append">
<button type="submit" class="btn btn-secondary" type="button">
<i class="fas fa-search"></i>
</button>
</div>
</div>
</form>
</div>
</div>
</div> -->
<nav
class=
"navbar navbar-expand-lg navbar-dark"
style=
"background-color: #006633"
>
<div
class=
"container"
>
<a
class=
"navbar-brand mb-0 h1"
href=
"/"
>
<i
class=
"fas fa-calendar-alt"
></i>
Schedules
</a>
<button
class=
"navbar-toggler"
type=
"button"
data-toggle=
"collapse"
data-target=
"#navbarTogglerDemo02"
aria-controls=
"navbarTogglerDemo02"
aria-expanded=
"false"
aria-label=
"Toggle navigation"
>
<span
class=
"navbar-toggler-icon"
></span>
</button>
<div
class=
"col order-1 order-sm-0"
>
<div
class=
"collapse navbar-collapse"
id=
"navbarTogglerDemo02"
>
<form
action=
"/search"
class=
"form"
>
<ul
class=
"navbar-nav mr-auto mt-2 mt-lg-0"
>
<div
class=
"input-group"
style=
"width:100%;"
>
<li
class=
"nav-item"
>
<input
<a
href=
"/schedule"
class=
"nav-link"
>
Your Schedule (
<span
id=
"cart-counter"
>
<%=
@cart
.
length
%>
</span>
)
</a>
id=
"searchbar"
</li>
</ul>
<form
action=
"/search"
class=
"form-inline"
>
<input
id=
"searchbar"
value=
"
<%=
params
[
:query
]
%>
"
value=
"
<%=
params
[
:query
]
%>
"
name=
"query"
name=
"query"
type=
"text"
type=
"text"
...
@@ -47,14 +78,10 @@
...
@@ -47,14 +78,10 @@
placeholder=
"Search course or professor..."
placeholder=
"Search course or professor..."
aria-describedby=
"basic-addon2"
aria-describedby=
"basic-addon2"
autocomplete=
"off"
autocomplete=
"off"
>
>
<div
class=
"input-group-append"
>
<button
class=
"btn btn-secondary my-2 my-sm-0"
type=
"submit"
>
Search
</button>
<button
type=
"submit"
class=
"btn btn-secondary"
type=
"button"
>
<i
class=
"fas fa-search"
></i>
</button>
</div>
</div>
</form>
</form>
</div>
</div>
</div>
</div>
</
di
v>
</
na
v>
schedules/app/views/shared/_page.html.erb
View file @
f2ec598d
<div
class=
"container
-fluid
"
>
<div
class=
"container"
>
<!-- The main screen consists of a row with two columns: the search results, and the cart -->
<!-- The main screen consists of a row with two columns: the search results, and the cart -->
<div
class=
"row"
>
<div
id=
"page"
class=
"row"
>
<!-- Search result, List of Courses -->
<!-- Search result, List of Courses -->
<div
class=
"col-lg-
8
col-12 col-sm-1
0
mx-auto order-2 order-lg-0"
id=
"search-list"
>
<div
class=
"col-lg-
12
col-12 col-sm-1
2
mx-auto order-2 order-lg-0"
id=
"search-list"
>
<%=
yield
%>
<%=
yield
%>
</div>
</div>
<!-- List of sections in the cart -->
<!-- List of sections in the cart -->
</div>
</div>
<footer
class=
"footer"
>
Schedules was built by
<a
href=
"https://srct.gmu.edu"
>
Mason SRCT
</a>
and is completely open source.
<br/>
Want to contribute? View the code on the
<a
href=
"https://git.gmu.edu/srct/schedules"
>
SRCT GitLab
</a>
.
</footer>
</div>
</div>
<template
id=
"cart-data"
data-cart=
"
<%=
@cart
.
to_json
%>
"
></template>
<template
id=
"cart-data"
data-cart=
"
<%=
@cart
.
to_json
%>
"
></template>
schedules/app/views/shared/_section.html.erb
View file @
f2ec598d
...
@@ -24,6 +24,25 @@
...
@@ -24,6 +24,25 @@
TBA
TBA
<%
else
%>
<%
else
%>
<%=
link_to
section
.
instructor
.
name
,
section
.
instructor
%>
<%=
link_to
section
.
instructor
.
name
,
section
.
instructor
%>
<%
unless
section
.
instructor
.
rating
.
nil?
%>
<div
class=
"star-rating"
>
<div
class=
"back-stars"
>
<i
class=
"far fa-star"
aria-hidden=
"true"
></i>
<i
class=
"far fa-star"
aria-hidden=
"true"
></i>
<i
class=
"far fa-star"
aria-hidden=
"true"
></i>
<i
class=
"far fa-star"
aria-hidden=
"true"
></i>
<i
class=
"far fa-star"
aria-hidden=
"true"
></i>
<div
class=
"front-stars"
style=
"width:
<%=
(
section
.
instructor
.
rating
[
0
]
/
5
*
100
).
to_i
%>
%"
>
<i
class=
"fa fa-star"
aria-hidden=
"true"
></i>
<i
class=
"fa fa-star"
aria-hidden=
"true"
></i>
<i
class=
"fa fa-star"
aria-hidden=
"true"
></i>
<i
class=
"fa fa-star"
aria-hidden=
"true"
></i>
<i
class=
"fa fa-star"
aria-hidden=
"true"
></i>
</div>
</div>
</div>
<%
end
%>
<%
end
%>
<%
end
%>
<br/>
<br/>
...
...
schedules/db/load_course_ratings.rb
View file @
f2ec598d
require
'json'
require
'json'
[[
'
f
18'
,
'
Fall
'
,
'2018'
],
[
's
p
18'
,
'S
pring
'
,
'2018'
],
[[
'
sp
18'
,
'
Spring
'
,
'2018'
],
[
's
m
18'
,
'S
ummer'
,
'2018'
],
[
'f18'
,
'Fall
'
,
'2018'
],
[
'
f
17'
,
'
Fall
'
,
'2017'
],
[
's
p
17'
,
'S
pring
'
,
'2017'
]
].
each
do
|
arr
|
[
'
sp
17'
,
'
Spring
'
,
'2017'
],
[
's
m
17'
,
'S
ummer
'
,
'2017'
]
,
[
'f17'
,
'Fall'
,
'2017'
],
puts
arr
[
'sp16'
,
'Spring'
,
'2016'
],
[
'sm16'
,
'Summer'
,
'2016'
],
[
'f16'
,
'Fall'
,
'2016'
]].
each
do
|
arr
|
ratings
=
JSON
.
parse
(
File
.
read
(
"db/data/
#{
arr
[
0
]
}
.json"
))
ratings
=
JSON
.
parse
(
File
.
read
(
"db/data/
#{
arr
[
0
]
}
.json"
))
semester
=
Semester
.
find_by!
(
season:
arr
[
1
],
year:
arr
[
2
])
semester
=
Semester
.
find_by
(
season:
arr
[
1
],
year:
arr
[
2
])
next
if
semester
.
nil?
puts
"
#{
ratings
[
1
]
}
#{
ratings
[
2
]
}
"
ratings
.
each
do
|
section
,
qs
|
ratings
.
each
do
|
section
,
qs
|
section
=
section
.
split
(
','
).
first
section
=
section
.
split
(
','
).
first
subj
=
section
.
match
(
/[A-Z]+/
)[
0
]
subj
=
section
.
match
(
/[A-Z]+/
)[
0
]
...
...
schedules/db/seeds.rb
View file @
f2ec598d
...
@@ -118,7 +118,7 @@ def main
...
@@ -118,7 +118,7 @@ def main
[
parser
.
parse_semesters
.
first
]
[
parser
.
parse_semesters
.
first
]
else
else
# expand to include however many semesters you want
# expand to include however many semesters you want
parser
.
parse_semesters
[
0
..
7
]
parser
.
parse_semesters
[
1
..
7
]
end
end
puts
"
\t
Parsing subjects..."
puts
"
\t
Parsing subjects..."
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment