diff options
Diffstat (limited to 'elm/UList/LabelEdit.elm')
-rw-r--r-- | elm/UList/LabelEdit.elm | 50 |
1 files changed, 40 insertions, 10 deletions
diff --git a/elm/UList/LabelEdit.elm b/elm/UList/LabelEdit.elm index f6a60d3b..153fad8c 100644 --- a/elm/UList/LabelEdit.elm +++ b/elm/UList/LabelEdit.elm @@ -1,5 +1,3 @@ --- TODO: Would be nice to have a "create new label" option in this model, to make custom labels more discoverable. - port module UList.LabelEdit exposing (main, init, update, view, isPublic, Model, Msg) import Html exposing (..) @@ -14,6 +12,7 @@ import Lib.Html exposing (..) import Lib.Api as Api import Lib.DropDown as DD import Gen.Api as GApi +import Gen.UListLabelAdd as GLA import Gen.UListLabelEdit as GLE @@ -35,22 +34,29 @@ type alias Model = , tsel : Set Int -- Set of label IDs applied on the client , state : Dict Int Api.State -- Only for labels that are being changed , dd : DD.Config Msg + , custom : String + , customSt : Api.State } init : GLE.Recv -> Model init f = { uid = f.uid , vid = f.vid - , labels = f.labels + , labels = List.filter (\l -> l.id > 0) f.labels , sel = Set.fromList f.selected , tsel = Set.fromList f.selected , state = Dict.empty , dd = DD.init ("ulist_labeledit_dd" ++ f.vid) Open + , custom = "" + , customSt = Api.Normal } type Msg = Open Bool | Toggle Int Bool Bool + | Custom String + | CustomSubmit + | CustomSaved GApi.Response | Saved Int Bool GApi.Response @@ -71,10 +77,21 @@ update msg model = GLE.send { uid = model.uid, vid = model.vid, label = l, applied = b } (Saved l b) -- Unselect other progress labels (1..4) when setting a progress label :: if cascade - then (List.map (\i -> selfCmd (Toggle i False False)) <| List.filter (\i -> l >= 0 && l <= 4 && i >= 0 && i <= 4 && i /= l) <| Set.toList model.tsel) + then (List.map (\i -> selfCmd (Toggle i False False)) <| List.filter (\i -> l >= 1 && l <= 4 && i >= 1 && i <= 4 && i /= l) <| Set.toList model.tsel) else [] ) + Custom t -> ({ model | custom = t }, Cmd.none) + CustomSubmit -> ({ model | customSt = Api.Loading }, GLA.send { uid = model.uid, vid = model.vid, label = model.custom } CustomSaved) + CustomSaved (GApi.LabelId id) -> + let new = List.filter (\l -> l.id == id) model.labels |> List.isEmpty + in ({ model | labels = if new then model.labels ++ [{ id = id, label = model.custom, private = True }] else model.labels + , customSt = Api.Normal, custom = "" + , sel = Set.insert id model.sel + , tsel = Set.insert id model.tsel + }, Cmd.none) + CustomSaved e -> ({ model | customSt = Api.Error e }, Cmd.none) + Saved l b (GApi.Success) -> let nmodel = { model | sel = if b then Set.insert l model.sel else Set.remove l model.sel, state = Dict.remove l model.state } in (nmodel, ulistLabelChanged (isPublic nmodel)) @@ -84,21 +101,34 @@ update msg model = view : Model -> String -> Html Msg view model txt = let - str = String.join ", " <| List.filterMap (\l -> if l.id /= 7 && Set.member l.id model.sel then Just l.label else Nothing) model.labels + lbl = List.intersperse (text ", ") <| List.filterMap (\l -> + if l.id /= 7 && Set.member l.id model.sel + then Just <| span [] + [ if l.id <= 6 && txt /= "-" then ulistIcon l.id l.label else text "" + , text (" " ++ l.label) ] + else Nothing) model.labels item l = li [ ] [ linkRadio (Set.member l.id model.tsel) (Toggle l.id True) [ text l.label , text " " - , span [ class "spinner", classList [("invisible", Dict.get l.id model.state /= Just Api.Loading)] ] [] , case Dict.get l.id model.state of - Just (Api.Error _) -> b [ class "standout" ] [ text "error" ] -- Need something better - _ -> text "" + Just Api.Loading -> span [ class "spinner" ] [] + Just (Api.Error _) -> b [] [ text "error" ] -- Need something better + _ -> if l.id <= 6 then ulistIcon l.id l.label else text "" ] ] + + custom = + li [] [ + case model.customSt of + Api.Normal -> Html.form [ onSubmit CustomSubmit ] + [ inputText "" model.custom Custom ([placeholder "new label", style "width" "150px"] ++ GLA.valLabel) ] + Api.Loading -> span [ class "spinner" ] [] + Api.Error _ -> b [] [ text "error" ] ] in DD.view model.dd (if List.any (\s -> s == Api.Loading) <| Dict.values model.state then Api.Loading else Api.Normal) - (text <| if str == "" then txt else str) - (\_ -> [ ul [] <| List.map item <| List.filter (\l -> l.id /= 7) model.labels ]) + (if List.isEmpty lbl then text txt else span [] lbl) + (\_ -> [ ul [] <| List.map item (List.filter (\l -> l.id /= 7) model.labels) ++ [ custom ] ]) |