265 lines
7.8 KiB
Elm
265 lines
7.8 KiB
Elm
module Pages.Switch exposing (Model, Msg, page)
|
|
|
|
import Element exposing (..)
|
|
import Element.Font as Font
|
|
import Element.Input as Input
|
|
import Generated.Params as Params
|
|
import Global
|
|
import Html
|
|
import Html.Attributes
|
|
import Http
|
|
import Iso8601
|
|
import Json.Decode
|
|
import Mi
|
|
import Mi.SwitchData
|
|
import Spa.Page
|
|
import Utils.Spa exposing (Page, PageContext)
|
|
|
|
|
|
page : Page Params.Switch Model Msg model msg appMsg
|
|
page =
|
|
Spa.Page.component
|
|
{ title = always "Switch Data"
|
|
, init = init
|
|
, update = update
|
|
, subscriptions = always subscriptions
|
|
, view = always view
|
|
}
|
|
|
|
|
|
|
|
-- INIT
|
|
|
|
|
|
type alias Model =
|
|
{ currentFront : Maybe Mi.SwitchData.Switch
|
|
, frontData : Maybe (List Mi.SwitchData.Switch)
|
|
, error : Maybe String
|
|
, amount : Int
|
|
, page : Int
|
|
}
|
|
|
|
|
|
init : PageContext -> Params.Switch -> ( Model, Cmd Msg, Cmd Global.Msg )
|
|
init { global } _ =
|
|
let
|
|
model =
|
|
{ currentFront = Nothing
|
|
, frontData = Nothing
|
|
, error = Nothing
|
|
, amount = 40
|
|
, page = 0
|
|
}
|
|
in
|
|
( model
|
|
, Cmd.batch
|
|
[ Mi.request
|
|
"GET"
|
|
(Maybe.withDefault
|
|
""
|
|
global.token
|
|
)
|
|
Mi.SwitchData.frontURL
|
|
Http.emptyBody
|
|
(Mi.expectJson ValidateCurrentFront Mi.SwitchData.decoder)
|
|
, Mi.request
|
|
"GET"
|
|
(Maybe.withDefault
|
|
""
|
|
global.token
|
|
)
|
|
(Mi.SwitchData.listURL model.amount model.page)
|
|
Http.emptyBody
|
|
(Mi.expectJson ValidateFrontData (Json.Decode.list Mi.SwitchData.decoder))
|
|
]
|
|
, Cmd.none
|
|
)
|
|
|
|
|
|
|
|
-- UPDATE
|
|
|
|
|
|
type Msg
|
|
= ValidateCurrentFront (Result Http.Error Mi.SwitchData.Switch)
|
|
| ValidateFrontData (Result Http.Error (List Mi.SwitchData.Switch))
|
|
| NextPage
|
|
| PrevPage
|
|
|
|
|
|
update : PageContext -> Msg -> Model -> ( Model, Cmd Msg, Cmd Global.Msg )
|
|
update { global } msg model =
|
|
case msg of
|
|
PrevPage ->
|
|
( { model | page = model.page - 1, frontData = Nothing }
|
|
, Mi.request
|
|
"GET"
|
|
(Maybe.withDefault
|
|
""
|
|
global.token
|
|
)
|
|
(Mi.SwitchData.listURL model.amount (model.page - 1))
|
|
Http.emptyBody
|
|
(Mi.expectJson ValidateFrontData (Json.Decode.list Mi.SwitchData.decoder))
|
|
, Cmd.none
|
|
)
|
|
|
|
NextPage ->
|
|
( { model | page = model.page + 1, frontData = Nothing }
|
|
, Mi.request
|
|
"GET"
|
|
(Maybe.withDefault
|
|
""
|
|
global.token
|
|
)
|
|
(Mi.SwitchData.listURL model.amount (model.page + 1))
|
|
Http.emptyBody
|
|
(Mi.expectJson ValidateFrontData (Json.Decode.list Mi.SwitchData.decoder))
|
|
, Cmd.none
|
|
)
|
|
|
|
ValidateCurrentFront result ->
|
|
case result of
|
|
Ok data ->
|
|
( { model | currentFront = Just data }
|
|
, Cmd.none
|
|
, Cmd.none
|
|
)
|
|
|
|
Err _ ->
|
|
( { model | error = Just "can't fetch current front" }
|
|
, Cmd.none
|
|
, Cmd.none
|
|
)
|
|
|
|
ValidateFrontData result ->
|
|
case result of
|
|
Ok data ->
|
|
( { model | frontData = Just data }
|
|
, Cmd.none
|
|
, Cmd.none
|
|
)
|
|
|
|
Err _ ->
|
|
( { model | error = Just "can't fetch historical front data" }
|
|
, Cmd.none
|
|
, Cmd.none
|
|
)
|
|
|
|
|
|
|
|
-- SUBSCRIPTIONS
|
|
|
|
|
|
subscriptions : Model -> Sub Msg
|
|
subscriptions model =
|
|
Sub.none
|
|
|
|
|
|
|
|
-- VIEW
|
|
|
|
|
|
view : Model -> Element Msg
|
|
view model =
|
|
let
|
|
currentFront =
|
|
case model.currentFront of
|
|
Just data ->
|
|
let
|
|
startTime =
|
|
Iso8601.fromTime data.started_at
|
|
in
|
|
column
|
|
[]
|
|
[ row []
|
|
[ html
|
|
(Html.img
|
|
[ Html.Attributes.src ("/static/img/" ++ String.toLower data.who ++ ".png")
|
|
, Html.Attributes.width 64
|
|
, Html.Attributes.height 64
|
|
]
|
|
[]
|
|
)
|
|
, el [ Font.size 30 ] (text data.who)
|
|
]
|
|
, text ("started at " ++ startTime)
|
|
]
|
|
|
|
Nothing ->
|
|
text "Loading..."
|
|
|
|
prevButton =
|
|
if model.page /= 0 then
|
|
Input.button [] { onPress = Just PrevPage, label = text "Prev" }
|
|
|
|
else
|
|
none
|
|
|
|
nextButton =
|
|
Input.button [] { onPress = Just NextPage, label = text "Next" }
|
|
|
|
tableButtons =
|
|
row [] [ prevButton, text "-", nextButton ]
|
|
|
|
switchDataTable =
|
|
case model.frontData of
|
|
Nothing ->
|
|
case model.currentFront of
|
|
Nothing ->
|
|
none
|
|
|
|
Just _ ->
|
|
text "Loading..."
|
|
|
|
Just data ->
|
|
column []
|
|
[ table []
|
|
{ data = data
|
|
, columns =
|
|
[ { header = text "ID"
|
|
, width = fill
|
|
, view =
|
|
\switch ->
|
|
link
|
|
[ Font.underline
|
|
, Font.color (rgb255 204 75 75)
|
|
, mouseOver [ alpha 0.5 ]
|
|
]
|
|
{ label = text (String.slice 0 10 switch.id)
|
|
, url = "/switch/id/" ++ switch.id
|
|
}
|
|
}
|
|
, { header = text "Who"
|
|
, width = fill
|
|
, view =
|
|
\switch -> text switch.who
|
|
}
|
|
, { header = text "Start"
|
|
, width = fill
|
|
, view =
|
|
\switch -> el [ padding 4 ] (text (Iso8601.fromTime switch.started_at))
|
|
}
|
|
, { header = text "End"
|
|
, width = fill
|
|
, view =
|
|
\switch ->
|
|
case switch.ended_at of
|
|
Nothing ->
|
|
none
|
|
|
|
Just time ->
|
|
el [ padding 4 ] (text (Iso8601.fromTime time))
|
|
}
|
|
]
|
|
}
|
|
, tableButtons
|
|
]
|
|
in
|
|
column
|
|
[]
|
|
[ currentFront
|
|
, el [ padding 15 ] none
|
|
, switchDataTable
|
|
]
|