|
1 | 1 | module Main exposing (..)
|
2 | 2 |
|
3 |
| -import Http exposing (Error) |
4 |
| -import Html exposing (..) |
5 |
| -import Html.Attributes exposing (value) |
6 |
| -import Html.Events exposing (on, targetValue) |
| 3 | +import Html |
7 | 4 | import Date
|
8 |
| -import Date.Extra as Dateextra |
9 | 5 | import Task
|
10 |
| -import Json.Decode as Json |
11 |
| -import Types exposing (Query, Event, Planning, decodeQuery) |
12 |
| -import Requests exposing (sendRequest, Msg(..), Group) |
13 | 6 |
|
| 7 | +import View exposing (view) |
| 8 | +import Model exposing (Model, initialModel) |
| 9 | +import Update exposing ( update, Msg(..) ) |
14 | 10 |
|
15 |
| ---import Json.Decode as Decode |
16 |
| ----- MODEL ---- |
17 | 11 |
|
18 |
| - |
19 |
| -type alias PlanningResponse = |
20 |
| - Result Error Query |
21 |
| - |
22 |
| - |
23 |
| -type alias Model = |
24 |
| - { data : Maybe PlanningResponse --Maybe (Result String Query) |
25 |
| - , date : Maybe Date.Date |
26 |
| - , selectedGroup : Group |
27 |
| - , loading : Bool |
28 |
| - } |
29 |
| - |
30 |
| - |
31 |
| -allGroups: List Group |
32 |
| -allGroups = |
33 |
| - [ { name = "Cyber1 TD1", slug = "11" } |
34 |
| - , { name = "Cyber1 TD2", slug = "12" } |
35 |
| - , { name = "Cyber2 TD1", slug = "21" } |
36 |
| - , { name = "Cyber2 TD2", slug = "22" } |
37 |
| - , { name = "Cyber3 TD1", slug = "31" } |
38 |
| - , { name = "Cyber3 TD2", slug = "32" } |
39 |
| - ] |
40 |
| - |
41 |
| -toDatetime : Date.Date -> String |
42 |
| -toDatetime = |
43 |
| - Dateextra.toFormattedString "y-MM-dd" |
| 12 | +---- PROGRAM ---- |
44 | 13 |
|
45 | 14 |
|
46 | 15 | init : ( Model, Cmd Msg )
|
47 | 16 | init =
|
48 | 17 | ( initialModel, Date.now |> Task.perform SetDate )
|
49 | 18 |
|
50 | 19 |
|
51 |
| -initialModel : Model |
52 |
| -initialModel = |
53 |
| - { data = Nothing |
54 |
| - , date = Nothing |
55 |
| - , selectedGroup = { name = "Cyber1 TD2", slug = "12" } |
56 |
| - , loading = False |
57 |
| - } |
58 |
| - |
59 |
| - |
60 |
| --- sendRequest "2017-09-29" ["12"] |
61 |
| ----- UPDATE ---- |
62 |
| - |
63 |
| - |
64 |
| -update : Msg -> Model -> ( Model, Cmd Msg ) |
65 |
| -update msg model = |
66 |
| - case msg of |
67 |
| - SetDate date -> |
68 |
| - --( { model | date = Just date, data = Just (Decode.decodeString decodeQuery """{"planning":{"events":[{"title":"Titre1","startDate":"2017-01-02T12:00:00Z","endDate":"2017-01-02T14:00:00Z","groups":["G1","G2"],"classrooms":["CR1","CR2"],"teachers":["M.Duhdeu","Mme.Feef"]}]}}""")}, Cmd.none ) |
69 |
| - ( { model | date = Just date }, createPLanningRequest date model.selectedGroup.slug) |
70 |
| - |
71 |
| - GraphQlMsg response -> |
72 |
| - ( { model | data = Just response, loading = False }, Cmd.none ) |
73 |
| - |
74 |
| - SetGroup slug -> |
75 |
| - let |
76 |
| - group = |
77 |
| - Maybe.withDefault { slug = "12", name = "Cyber1 TD2" } <| find (\x -> x.slug == slug) allGroups |
78 |
| - |
79 |
| - cmd = |
80 |
| - if model.loading then |
81 |
| - Cmd.none |
82 |
| - else |
83 |
| - case model.date of |
84 |
| - Just date -> |
85 |
| - createPLanningRequest date slug |
86 |
| - |
87 |
| - Nothing -> |
88 |
| - Cmd.none |
89 |
| - |
90 |
| - in |
91 |
| - ( { model | selectedGroup = group, loading = True }, cmd ) |
92 |
| - |
93 |
| - |
94 |
| -createPLanningRequest: Date.Date -> String -> Cmd Msg |
95 |
| -createPLanningRequest date slug = |
96 |
| - -- sendRequest (toDatetime (Dateextra.add Dateextra.Month -7 date)) (toDatetime (Dateextra.add Dateextra.Month 7 date)) [ slug ] |
97 |
| - sendRequest (toDatetime date) (toDatetime (Dateextra.add Dateextra.Week 1 date)) [ slug ] |
98 |
| - |
99 |
| - |
100 |
| -find : (a -> Bool) -> List a -> Maybe a |
101 |
| -find predicate list = |
102 |
| - case list of |
103 |
| - [] -> |
104 |
| - Nothing |
105 |
| - |
106 |
| - first::rest -> |
107 |
| - if predicate first then |
108 |
| - Just first |
109 |
| - else |
110 |
| - find predicate rest |
111 |
| - |
112 |
| - |
113 |
| ----- VIEW ---- |
114 |
| - |
115 |
| - |
116 |
| -view : Model -> Html Msg |
117 |
| -view model = |
118 |
| - let |
119 |
| - datetime = |
120 |
| - case model.date of |
121 |
| - Just date -> |
122 |
| - toDatetime date |
123 |
| - |
124 |
| - Nothing -> |
125 |
| - "Nothing" |
126 |
| - |
127 |
| - planning = |
128 |
| - case model.data of |
129 |
| - Just (Ok query) -> |
130 |
| - if List.isEmpty query.planning.events then |
131 |
| - text "Vide :(" |
132 |
| - else |
133 |
| - viewPlanning query |
134 |
| - |
135 |
| - Just (Err error) -> |
136 |
| - text <| toString error |
137 |
| - |
138 |
| - Nothing -> |
139 |
| - text "Loading" |
140 |
| - in |
141 |
| - div [] |
142 |
| - [ viewHeader model.selectedGroup allGroups |
143 |
| - , div [] |
144 |
| - [ datetime |> toString |> text ] |
145 |
| - , div [] |
146 |
| - [ model.loading |> toString |> text ] |
147 |
| - , div [] |
148 |
| - [ planning ] |
149 |
| - ] |
150 |
| - |
151 |
| - |
152 |
| -viewPlanning : Query -> Html Msg |
153 |
| -viewPlanning query = |
154 |
| - div [] <| List.map viewEvent query.planning.events |
155 |
| - |
156 |
| - |
157 |
| -viewEvent: Event -> Html Msg |
158 |
| -viewEvent event = |
159 |
| - div [] |
160 |
| - [ h2 [] [ text event.title ] |
161 |
| - , p [] [ text ( "De " ++ ( viewDateFormat event.startDate firstDateParser ) ++ " à " ++ ( viewDateFormat event.endDate secondDateParser ) ) ] |
162 |
| - , p [] [ text <| String.join ", " event.classrooms ] |
163 |
| - , p [] [ text <| String.join ", " event.groups ] |
164 |
| - , p [] [ text <| String.join ", " event.teachers ] |
165 |
| - ] |
166 |
| - |
167 |
| - |
168 |
| -viewDateFormat: String -> ( Date.Date -> String ) -> String |
169 |
| -viewDateFormat dateString parser = |
170 |
| - let |
171 |
| - parsedDate = Dateextra.fromIsoString (dateString ++ "Z") |
172 |
| - in |
173 |
| - case parsedDate of |
174 |
| - Just date -> |
175 |
| - parser date |
176 |
| - |
177 |
| - Nothing -> |
178 |
| - "Invalid : " ++ dateString |
179 |
| - |
180 |
| - |
181 |
| -firstDateParser : Date.Date -> String |
182 |
| -firstDateParser = |
183 |
| - Dateextra.toFormattedString "eeee dd/MM HH:mm" |
184 |
| - |
185 |
| - |
186 |
| -secondDateParser : Date.Date -> String |
187 |
| -secondDateParser = |
188 |
| - Dateextra.toFormattedString "HH:mm" |
189 |
| - |
190 |
| - |
191 |
| -viewHeader: Group -> List Group -> Html Msg |
192 |
| -viewHeader selected groups= |
193 |
| - div [] |
194 |
| - [ h2 [] [ text <| "Salut " ++ selected.name ++ " voila tes cours :" ] |
195 |
| - , select [ on "change" <| Json.map SetGroup targetValue ] |
196 |
| - (List.map optionGroup groups) |
197 |
| - ] |
198 |
| - |
199 |
| - |
200 |
| -optionGroup: Group -> Html Msg |
201 |
| -optionGroup group = |
202 |
| - option [ value group.slug ] |
203 |
| - [ text group.name ] |
204 |
| - |
205 |
| ----- PROGRAM ---- |
206 |
| - |
207 |
| - |
208 | 20 | main : Program Never Model Msg
|
209 | 21 | main =
|
210 | 22 | Html.program
|
|
0 commit comments