module UVNList.Status exposing (main) import Html exposing (..) import Html.Attributes exposing (..) import Html.Events exposing (..) import Json.Encode as JE import Browser import Lib.Api as Api import Lib.Html exposing (..) import Lib.Util exposing (lookup) import Lib.Gen exposing (vnlistStatus) main : Program Flags Model Msg main = Browser.element { init = \f -> (init f, Cmd.none) , subscriptions = always Sub.none , view = view , update = update } type alias Flags = { uid : Int , vid : Int , status : Int } type alias Model = { state : Api.State , flags : Flags } init : Flags -> Model init f = { state = Api.Normal , flags = f } encodeForm : Model -> JE.Value encodeForm o = JE.object [ ("uid", JE.int o.flags.uid) , ("vid", JE.int o.flags.vid) , ("status", JE.int o.flags.status) ] type Msg = Input String | Saved Api.Response update : Msg -> Model -> (Model, Cmd Msg) update msg model = case msg of Input s -> let flags = model.flags nflags = { flags | status = Maybe.withDefault 0 <| String.toInt s } nmodel = { model | flags = nflags, state = Api.Loading } in ( nmodel , Api.post "/u/setvnstatus" (encodeForm nmodel) Saved ) Saved Api.Success -> ({ model | state = Api.Normal }, Cmd.none) Saved e -> ({ model | state = Api.Error e }, Cmd.none) view : Model -> Html Msg view model = -- TODO: Display error somewhere if model.state == Api.Loading then div [ class "spinner spinner--md" ] [] else div [] [ text <| Maybe.withDefault "" <| lookup model.flags.status vnlistStatus , inputSelect [ class "form-control--table-edit form-control--table-edit-overlay", onInput Input ] (String.fromInt model.flags.status) (List.map (\(a,b) -> (String.fromInt a, b)) vnlistStatus) ]