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