diff options
Diffstat (limited to 'elm3/RelEdit/Main.elm')
-rw-r--r-- | elm3/RelEdit/Main.elm | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/elm3/RelEdit/Main.elm b/elm3/RelEdit/Main.elm new file mode 100644 index 00000000..6afa2719 --- /dev/null +++ b/elm3/RelEdit/Main.elm @@ -0,0 +1,137 @@ +module RelEdit.Main exposing (..) + +import Html 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 RelEdit.General as General +import RelEdit.Producers as Producers +import RelEdit.Vn as Vn + + +main : Program RelEdit 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 + , producers : Producers.Model + , vn : Vn.Model + , id : Maybe Int + } + + +init : RelEdit -> Model +init d = + { state = Api.Normal + , editsum = { authmod = d.authmod, editsum = d.editsum, locked = d.locked, hidden = d.hidden } + , general = General.init d + , producers = Producers.init d.producers + , vn = Vn.init d.vn + , id = d.id + } + + +new : Int -> String -> String -> Model +new vid title orig = + { state = Api.Normal + , editsum = Editsum.new + , general = General.new title orig + , producers = Producers.init [] + , vn = Vn.init [{vid = vid, title = title}] + , id = Nothing + } + + +encode : Model -> RelEditSend +encode model = + { editsum = model.editsum.editsum + , hidden = model.editsum.hidden + , locked = model.editsum.locked + , catalog = model.general.catalog + , doujin = model.general.doujin + , freeware = model.general.freeware + , gtin = Maybe.withDefault 0 model.general.gtinVal + , lang = model.general.lang + , minage = model.general.minage + , notes = model.general.notes + , original = model.general.original + , patch = model.general.patch + , rtype = model.general.rtype + , released = model.general.released + , title = model.general.title + , uncensored = model.general.uncensored + , website = model.general.website + , resolution = model.general.resolution + , voiced = model.general.voiced + , ani_story = model.general.aniStory + , ani_ero = model.general.aniEro + , platforms = model.general.platforms + , media = model.general.media + , producers = List.map (\e -> { pid = e.pid, developer = e.developer, publisher = e.publisher }) model.producers.producers + , vn = List.map (\e -> { vid = e.vid }) model.vn.vn + } + + +type Msg + = Editsum Editsum.Msg + | General General.Msg + | Producers Producers.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 -> ({ model | general = General.update m model.general }, Cmd.none) + Producers m -> let (nm, c) = Producers.update m model.producers in ({ model | producers = nm }, Cmd.map Producers 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 -> "/r" ++ String.fromInt id ++ "/edit" + Nothing -> "/r/add" + body = releditSendEncode (encode model) + in ({ model | state = Api.Loading }, Api.post path body Submitted) + + Submitted (Api.Changed id rev) -> (model, load <| "/r" ++ String.fromInt id ++ "." ++ String.fromInt rev) + Submitted r -> ({ model | state = Api.Error r }, Cmd.none) + + +isValid : Model -> Bool +isValid model = not + ( List.isEmpty model.general.lang + || model.general.gtinVal == Nothing + || model.producers.duplicates + || model.vn.duplicates + || List.isEmpty model.vn.vn + ) + + +view : Model -> Html Msg +view model = + form_ Submit (model.state == Api.Loading) + [ Html.map General <| General.general model.general + , Html.map General <| General.format model.general + , card "relations" "Relations" [] + [ Html.map Producers <| Producers.view model.producers + , Html.map Vn <| Vn.view model.vn + ] + , Html.map Editsum <| Editsum.view model.editsum + , submitButton "Submit" model.state (isValid model) False + ] |