summaryrefslogtreecommitdiff
path: root/elm/UList/DateEdit.elm
blob: fc5da2341dde46b75319f6caf211c24bc8051168 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
module UList.DateEdit exposing (main)

import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)
import Task
import Process
import Browser
import Lib.Api as Api
import Gen.Api as GApi
import Gen.UListDateEdit as GDE


main : Program GDE.Send Model Msg
main = Browser.element
  { init = \f -> (init f, Cmd.none)
  , subscriptions = always Sub.none
  , view = view
  , update = update
  }

type alias Model =
  { state  : Api.State
  , flags  : GDE.Send
  , val    : String
  , debnum : Int -- Debounce for submit
  }

init : GDE.Send -> Model
init f =
  { state  = Api.Normal
  , flags  = f
  , val    = f.date
  , debnum = 0
  }

type Msg
  = Val String
  | Save Int
  | Saved GApi.Response


update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
  case msg of
    Val s  -> ({ model | val = s, debnum = model.debnum + 1 }, Task.perform (\_ -> Save (model.debnum+1)) <| Process.sleep 500)

    Save n ->
      if n /= model.debnum || model.val == model.flags.date
      then (model, Cmd.none)
      else ( { model | state = Api.Loading, debnum = model.debnum+1 }
           , Api.post "/u/ulist/setdate.json" (GDE.encode { uid = model.flags.uid, vid = model.flags.vid, start = model.flags.start, date = model.val }) Saved )

    Saved GApi.Success ->
      let f  = model.flags
          nf = { f | date = model.val }
      in ({ model | state = Api.Normal, flags = nf }, Cmd.none)
    Saved e -> ({ model | state = Api.Error e }, Cmd.none)


view : Model -> Html Msg
view model = div [ class "compact" ] <|
  case model.state of
    Api.Loading -> [ span [ class "spinner" ] [] ]
    Api.Error _ -> [ b [ class "standout" ] [ text "error" ] ] -- Argh
    Api.Normal ->
      [ input ([ type_ "date", class "text", value model.val, onInput Val, onBlur (Save model.debnum), pattern "yyyy-mm-dd" ] ++ GDE.valDate) []
      , span [] [ text model.val ]
      ]