summaryrefslogtreecommitdiff
path: root/elm3/CharEdit/Main.elm
diff options
context:
space:
mode:
Diffstat (limited to 'elm3/CharEdit/Main.elm')
-rw-r--r--elm3/CharEdit/Main.elm130
1 files changed, 130 insertions, 0 deletions
diff --git a/elm3/CharEdit/Main.elm b/elm3/CharEdit/Main.elm
new file mode 100644
index 00000000..b3332f25
--- /dev/null
+++ b/elm3/CharEdit/Main.elm
@@ -0,0 +1,130 @@
+module CharEdit.Main exposing (Model,Msg,main,new,update,view)
+
+import Html exposing (..)
+import Html.Lazy exposing (..)
+import Browser
+import Browser.Navigation exposing (load)
+import Lib.Html exposing (..)
+import Lib.Gen exposing (..)
+import Lib.Api as Api
+import Lib.Editsum as Editsum
+import CharEdit.General as General
+import CharEdit.Traits as Traits
+import CharEdit.VN as VN
+
+
+main : Program CharEdit Model Msg
+main = Browser.element
+ { init = \e -> (init e, Cmd.none)
+ , view = view
+ , update = update
+ , subscriptions = always Sub.none
+ }
+
+
+type alias Model =
+ { state : Api.State
+ , editsum : Editsum.Model
+ , general : General.Model
+ , traits : Traits.Model
+ , vn : VN.Model
+ , id : Maybe Int
+ }
+
+
+init : CharEdit -> Model
+init d =
+ { state = Api.Normal
+ , editsum = { authmod = d.authmod, editsum = d.editsum, locked = d.locked, hidden = d.hidden }
+ , general = General.init d
+ , traits = Traits.init d.traits
+ , vn = VN.init d.vns d.vnrels
+ , id = d.id
+ }
+
+
+new : List CharEditVns -> List CharEditVnrels -> Model
+new vns vnrels =
+ { state = Api.Normal
+ , editsum = Editsum.new
+ , general = General.new
+ , traits = Traits.init []
+ , vn = VN.init vns vnrels
+ , id = Nothing
+ }
+
+
+encode : Model -> CharEditSend
+encode model =
+ { editsum = model.editsum.editsum
+ , hidden = model.editsum.hidden
+ , locked = model.editsum.locked
+ , alias = model.general.alias
+ , b_day = model.general.bDay
+ , b_month = model.general.bMonth
+ , bloodt = model.general.bloodt
+ , desc = model.general.desc
+ , gender = model.general.gender
+ , height = model.general.height
+ , image = model.general.image
+ , name = model.general.name
+ , original = model.general.original
+ , s_bust = model.general.sBust
+ , s_hip = model.general.sHip
+ , s_waist = model.general.sWaist
+ , weight = model.general.weight
+ , main = if not model.general.mainInstance || model.general.mainId == 0 then Nothing else Just model.general.mainId
+ , main_spoil = model.general.mainSpoil
+ , traits = List.map (\e -> { tid = e.tid, spoil = e.spoil }) model.traits.traits
+ , vns = VN.encode model.vn
+ }
+
+
+type Msg
+ = Editsum Editsum.Msg
+ | General General.Msg
+ | Traits Traits.Msg
+ | VN VN.Msg
+ | Submit
+ | Submitted Api.Response
+
+
+update : Msg -> Model -> (Model, Cmd Msg)
+update msg model =
+ case msg of
+ Editsum m -> ({ model | editsum = Editsum.update m model.editsum }, Cmd.none)
+ General m -> let (nm, c) = General.update m model.general in ({ model | general = nm }, Cmd.map General c)
+ Traits m -> let (nm, c) = Traits.update m model.traits in ({ model | traits = nm }, Cmd.map Traits c)
+ VN m -> let (nm, c) = VN.update m model.vn in ({ model | vn = nm }, Cmd.map VN c)
+
+ Submit ->
+ let
+ path =
+ case model.id of
+ Just id -> "/c" ++ String.fromInt id ++ "/edit"
+ Nothing -> "/c/add"
+ body = chareditSendEncode (encode model)
+ in ({ model | state = Api.Loading }, Api.post path body Submitted)
+
+ Submitted (Api.Changed id rev) -> (model, load <| "/c" ++ String.fromInt id ++ "." ++ String.fromInt rev)
+ Submitted r -> ({ model | state = Api.Error r }, Cmd.none)
+
+
+isValid : Model -> Bool
+isValid model = not
+ ( model.general.aliasDuplicates
+ || (model.general.mainInstance && model.general.mainId == 0)
+ || model.traits.duplicates
+ || model.vn.duplicates
+ )
+
+
+view : Model -> Html Msg
+view model =
+ form_ Submit (model.state == Api.Loading)
+ [ Html.map General <| lazy General.view model.general
+ , Html.map Traits <| lazy Traits.view model.traits
+ , Html.map VN <| lazy VN.view model.vn
+ , Html.map Editsum <| lazy Editsum.view model.editsum
+ , submitButton "Submit" model.state (isValid model) False
+ ]