summaryrefslogtreecommitdiff
path: root/elm
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2019-10-31 18:19:40 +0100
committerYorhel <git@yorhel.nl>2019-11-10 12:44:55 +0100
commitb063b1fcf5810a6952fcde99bca2dbbbfb143d34 (patch)
treebbaab01dc5fe18f5cb6b90676323b08d8e1c69aa /elm
parent683c2298dcdbda96d44e23d5f4db3f3c959d1161 (diff)
ulist: Inline start/end date editing
Diffstat (limited to 'elm')
-rw-r--r--elm/ULists/DateEdit.elm69
1 files changed, 69 insertions, 0 deletions
diff --git a/elm/ULists/DateEdit.elm b/elm/ULists/DateEdit.elm
new file mode 100644
index 00000000..98ccf5d0
--- /dev/null
+++ b/elm/ULists/DateEdit.elm
@@ -0,0 +1,69 @@
+module ULists.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.DateEdit 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 ]
+ ]