Add initial non-schedule, non-CSS version.
This commit is contained in:
commit
91205fdea9
24
elm.json
Normal file
24
elm.json
Normal file
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"type": "application",
|
||||
"source-directories": [
|
||||
"src"
|
||||
],
|
||||
"elm-version": "0.19.1",
|
||||
"dependencies": {
|
||||
"direct": {
|
||||
"elm/browser": "1.0.2",
|
||||
"elm/core": "1.0.5",
|
||||
"elm/html": "1.0.0"
|
||||
},
|
||||
"indirect": {
|
||||
"elm/json": "1.1.3",
|
||||
"elm/time": "1.0.0",
|
||||
"elm/url": "1.0.0",
|
||||
"elm/virtual-dom": "1.0.2"
|
||||
}
|
||||
},
|
||||
"test-dependencies": {
|
||||
"direct": {},
|
||||
"indirect": {}
|
||||
}
|
||||
}
|
16
index.html
Normal file
16
index.html
Normal file
|
@ -0,0 +1,16 @@
|
|||
<html>
|
||||
<head>
|
||||
<script src="course.js"></script>
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Lora&family=Roboto+Mono&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" media="screen" href="css/style.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="#elm">
|
||||
</div>
|
||||
<script>
|
||||
var container = document.getElementById("elm");
|
||||
var app = Elm.Main.init( { node: container });
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
77
src/ClassSchedule/Model.elm
Normal file
77
src/ClassSchedule/Model.elm
Normal file
|
@ -0,0 +1,77 @@
|
|||
module ClassSchedule.Model exposing (..)
|
||||
import Dict exposing (..)
|
||||
|
||||
type Department
|
||||
= ComputerScience
|
||||
| Mathematics
|
||||
| Art
|
||||
| Biology
|
||||
|
||||
type alias Crn = (Department, Int)
|
||||
|
||||
type DayOfWeek
|
||||
= Monday
|
||||
| Tuesday
|
||||
| Wednesday
|
||||
| Thursday
|
||||
| Friday
|
||||
| Saturday
|
||||
| Sunday
|
||||
|
||||
type DayHalf = AM | PM
|
||||
|
||||
type alias Time = (Int, Int, DayHalf)
|
||||
|
||||
flipDayHalf : DayHalf -> DayHalf
|
||||
flipDayHalf dh =
|
||||
case dh of
|
||||
AM -> PM
|
||||
PM -> AM
|
||||
|
||||
addHours : Int -> Time -> Time
|
||||
addHours hh (h, m, dh) =
|
||||
if h + hh >= 12
|
||||
then (h + hh - 12, m, flipDayHalf dh)
|
||||
else (h + hh, m, dh)
|
||||
|
||||
addMinutes : Int -> Time -> Time
|
||||
addMinutes mm (h, m, dh) =
|
||||
let
|
||||
remainder = modBy 60 (m + mm)
|
||||
hh = (m + mm) // 60
|
||||
in
|
||||
addHours hh (h, remainder, dh)
|
||||
|
||||
type alias Course =
|
||||
{ crn : Crn
|
||||
, name : String
|
||||
, instructors : List String
|
||||
, times : List (DayOfWeek, Time, Time)
|
||||
}
|
||||
|
||||
type CourseStatus = None | Selected | Added
|
||||
|
||||
isSelected : CourseStatus -> Bool
|
||||
isSelected cs =
|
||||
case cs of
|
||||
Selected -> True
|
||||
_ -> False
|
||||
|
||||
isAdded : CourseStatus -> Bool
|
||||
isAdded cs =
|
||||
case cs of
|
||||
Added -> True
|
||||
_ -> False
|
||||
|
||||
type alias Flags = ()
|
||||
|
||||
type Msg
|
||||
= SearchInput String
|
||||
| SelectTerm String
|
||||
| MarkCourse Int CourseStatus
|
||||
|
||||
type alias Model =
|
||||
{ terms : Dict String (List (CourseStatus, Course))
|
||||
, term : String
|
||||
, searchInput : String
|
||||
}
|
112
src/ClassSchedule/View.elm
Normal file
112
src/ClassSchedule/View.elm
Normal file
|
@ -0,0 +1,112 @@
|
|||
module ClassSchedule.View exposing (..)
|
||||
import ClassSchedule.Model exposing (..)
|
||||
import Html exposing (Html, div, text, table, td, th, tr, span, input, h1)
|
||||
import Html.Attributes exposing (class, classList, type_)
|
||||
import Tuple exposing (..)
|
||||
import Dict exposing (..)
|
||||
|
||||
viewDept : Department -> String
|
||||
viewDept d =
|
||||
case d of
|
||||
ComputerScience -> "CS"
|
||||
Mathematics -> "MTH"
|
||||
Art -> "ART"
|
||||
Biology -> "BIO"
|
||||
|
||||
viewCrn : Crn -> String
|
||||
viewCrn (d, i) = viewDept d ++ " " ++ (String.pad 3 '0' <| String.fromInt i)
|
||||
|
||||
viewTimeNumber : Int -> String
|
||||
viewTimeNumber i = String.pad 2 '0' <| String.fromInt i
|
||||
|
||||
viewDayHalf : DayHalf -> String
|
||||
viewDayHalf dh =
|
||||
case dh of
|
||||
AM -> "AM"
|
||||
PM -> "PM"
|
||||
|
||||
viewTime : Time -> String
|
||||
viewTime (m, h, dh) = viewTimeNumber m ++ ":" ++ viewTimeNumber h ++ viewDayHalf dh
|
||||
|
||||
viewTimeRange : (Time, Time) -> String
|
||||
viewTimeRange (t1, t2) = viewTime t1 ++ " to " ++ viewTime t2
|
||||
|
||||
viewDayCode : DayOfWeek -> String
|
||||
viewDayCode dw =
|
||||
case dw of
|
||||
Monday -> "M"
|
||||
Tuesday -> "T"
|
||||
Wednesday -> "W"
|
||||
Thursday -> "R"
|
||||
Friday -> "F"
|
||||
Saturday -> "S"
|
||||
Sunday -> "U"
|
||||
|
||||
unique : List eq -> List eq
|
||||
unique l =
|
||||
case l of
|
||||
[] -> []
|
||||
(x::xs) -> x :: unique (List.filter ((/=) x) xs)
|
||||
|
||||
extractTimes : Course -> List (Time, Time)
|
||||
extractTimes c =
|
||||
let extractTime (d, t1, t2) = (t2, t2)
|
||||
in unique <| List.map extractTime (c.times)
|
||||
|
||||
extractClasses : Course -> (Time, Time) -> List DayOfWeek
|
||||
extractClasses c (t1, t2) =
|
||||
let matches (d, tt1, tt2) = if tt1 == t1 && tt2 == t2 then Just d else Nothing
|
||||
in List.filterMap matches (c.times)
|
||||
|
||||
extractTimeCodes : Course -> List String
|
||||
extractTimeCodes c =
|
||||
let
|
||||
fromTime tr =
|
||||
let dayCodes = String.concat <| List.map viewDayCode <| extractClasses c tr
|
||||
in dayCodes ++ " " ++ viewTimeRange tr
|
||||
in List.map fromTime <| extractTimes c
|
||||
|
||||
viewClass : Course -> Html Msg
|
||||
viewClass c = tr []
|
||||
[ td [] [ text <| viewCrn (c.crn) ]
|
||||
, td [] [ text <| c.name ]
|
||||
, td [] [ text <| String.join ", " <| c.instructors ]
|
||||
, td [] [ text <| String.join ", " <| extractTimeCodes c ]
|
||||
]
|
||||
|
||||
viewClassTable : List (CourseStatus, Course) -> Html Msg
|
||||
viewClassTable =
|
||||
let
|
||||
header = tr []
|
||||
[ th [] [ text "Crn." ]
|
||||
, th [] [ text "Course Name" ]
|
||||
, th [] [ text "Instructors" ]
|
||||
, th [] [ text "Times" ]
|
||||
]
|
||||
in
|
||||
table [] << (::) header << List.map (viewClass << second)
|
||||
|
||||
viewToolbar : Model -> Html Msg
|
||||
viewToolbar m = div []
|
||||
[ span [] [ text "Search: " , input [ type_ "text" ] [] ]
|
||||
]
|
||||
|
||||
viewClassList : Model -> Html Msg
|
||||
viewClassList m = div []
|
||||
[ viewToolbar m
|
||||
, case get (m.term) (m.terms) of
|
||||
Just cs -> viewClassTable cs
|
||||
Nothing -> text "Please select a term!"
|
||||
]
|
||||
|
||||
viewClassSchedule : Model -> Html Msg
|
||||
viewClassSchedule m = text "Class schedule goes here!"
|
||||
|
||||
viewModel : Model -> Html Msg
|
||||
viewModel m = div [ class "main" ]
|
||||
[ h1 [] [ text "Oregon State University Course Schedule" ]
|
||||
, div [ class "split-pane" ]
|
||||
[ div [ class "split-elem" ] [ viewClassList m ]
|
||||
, div [ class "split-elem" ] [ viewClassSchedule m ]
|
||||
]
|
||||
]
|
63
src/Main.elm
Normal file
63
src/Main.elm
Normal file
|
@ -0,0 +1,63 @@
|
|||
module Main exposing (..)
|
||||
import ClassSchedule.Model exposing (..)
|
||||
import ClassSchedule.View exposing (..)
|
||||
import Browser exposing (Document, document)
|
||||
import Dict exposing (..)
|
||||
import Tuple exposing (..)
|
||||
|
||||
oneHour : Time -> (Time, Time)
|
||||
oneHour t = (t, addMinutes 50 t)
|
||||
|
||||
nAm : Int -> Time
|
||||
nAm i = (i, 0, AM)
|
||||
|
||||
nPm : Int -> Time
|
||||
nPm i = (i, 0, PM)
|
||||
|
||||
onDays : List DayOfWeek -> (Time, Time) -> List (DayOfWeek, Time, Time)
|
||||
onDays dds (t1, t2) = List.map (\d -> (d, t1, t2)) dds
|
||||
|
||||
classes : List Course
|
||||
classes =
|
||||
[ { crn = (ComputerScience, 544)
|
||||
, name = "Operating Systems II"
|
||||
, instructors = ["Yeongjin Jang"]
|
||||
, times = onDays [Tuesday, Thursday] <| oneHour <| nAm 8
|
||||
}
|
||||
, { crn = (ComputerScience, 480)
|
||||
, name = "Translators"
|
||||
, instructors = ["Rob Hess"]
|
||||
, times = onDays [Tuesday, Thursday] <| oneHour <| nAm 10
|
||||
}
|
||||
, { crn = (ComputerScience, 583)
|
||||
, name = "Advanced Functional Programming"
|
||||
, instructors = ["Eric Walkingshaw"]
|
||||
, times = onDays [Monday, Wednesday] <| oneHour <| nAm 10
|
||||
}
|
||||
]
|
||||
|
||||
terms : Dict String (List (CourseStatus, Course))
|
||||
terms = Dict.singleton "Spring 2021"
|
||||
<| List.map (pair None) classes
|
||||
|
||||
init : Flags -> (Model, Cmd Msg)
|
||||
init () = ({ terms = terms, term = "Spring 2021", searchInput = "" }, Cmd.none)
|
||||
|
||||
view : Model -> Document Msg
|
||||
view m =
|
||||
{ title = "Course Scheduler"
|
||||
, body = [ viewModel m ]
|
||||
}
|
||||
|
||||
update : Msg -> Model -> (Model, Cmd Msg)
|
||||
update msg m = (m, Cmd.none)
|
||||
|
||||
subscriptions : Model -> Sub Msg
|
||||
subscriptions m = Sub.none
|
||||
|
||||
main = document
|
||||
{ init = init
|
||||
, view = view
|
||||
, update = update
|
||||
, subscriptions = subscriptions
|
||||
}
|
Loading…
Reference in New Issue
Block a user