diff options
author | Yorhel <git@yorhel.nl> | 2019-10-31 18:19:40 +0100 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2019-11-10 12:44:55 +0100 |
commit | b063b1fcf5810a6952fcde99bca2dbbbfb143d34 (patch) | |
tree | bbaab01dc5fe18f5cb6b90676323b08d8e1c69aa /elm | |
parent | 683c2298dcdbda96d44e23d5f4db3f3c959d1161 (diff) |
ulist: Inline start/end date editing
Diffstat (limited to 'elm')
-rw-r--r-- | elm/ULists/DateEdit.elm | 69 |
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 ] + ] |