summaryrefslogtreecommitdiff
path: root/elm3/VNEdit/Main.elm
diff options
context:
space:
mode:
Diffstat (limited to 'elm3/VNEdit/Main.elm')
-rw-r--r--elm3/VNEdit/Main.elm199
1 files changed, 199 insertions, 0 deletions
diff --git a/elm3/VNEdit/Main.elm b/elm3/VNEdit/Main.elm
new file mode 100644
index 00000000..bee56211
--- /dev/null
+++ b/elm3/VNEdit/Main.elm
@@ -0,0 +1,199 @@
+module VNEdit.Main exposing (Model, Msg, main, new, view, update)
+
+import Html exposing (..)
+import Html.Attributes exposing (..)
+import Html.Lazy exposing (..)
+import Json.Encode as JE
+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 VNEdit.Titles as Titles
+import VNEdit.General as Gen
+import VNEdit.Seiyuu as Seiyuu
+import VNEdit.Staff as Staff
+import VNEdit.Screenshots as Scr
+import VNEdit.Relations as Rel
+
+
+main : Program VNEdit 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
+ , new : Bool
+ , editsum : Editsum.Model
+ , l_encubed : String
+ , titles : Titles.Model
+ , general : Gen.Model
+ , staff : Staff.Model
+ , seiyuu : Seiyuu.Model
+ , relations : Rel.Model
+ , screenshots : Scr.Model
+ , id : Maybe Int
+ , dupVNs : List Api.VN
+ }
+
+
+init : VNEdit -> Model
+init d =
+ { state = Api.Normal
+ , new = False
+ , editsum = { authmod = d.authmod, editsum = d.editsum, locked = d.locked, hidden = d.hidden }
+ , l_encubed = d.l_encubed
+ , titles = Titles.init d
+ , general = Gen.init d
+ , staff = Staff.init d.staff
+ , seiyuu = Seiyuu.init d.seiyuu d.chars
+ , relations = Rel.init d.relations
+ , screenshots = Scr.init d.screenshots d.releases
+ , id = d.id
+ , dupVNs = []
+ }
+
+
+new : Model
+new =
+ { state = Api.Normal
+ , new = True
+ , editsum = Editsum.new
+ , l_encubed = ""
+ , titles = Titles.new
+ , general = Gen.new
+ , staff = Staff.init []
+ , seiyuu = Seiyuu.init [] []
+ , relations = Rel.init []
+ , screenshots = Scr.init [] []
+ , id = Nothing
+ , dupVNs = []
+ }
+
+
+encode : Model -> VNEditSend
+encode model =
+ { editsum = model.editsum.editsum
+ , hidden = model.editsum.hidden
+ , locked = model.editsum.locked
+ , l_encubed = model.l_encubed
+ , title = model.titles.title
+ , original = model.titles.original
+ , alias = model.titles.alias
+ , desc = model.general.desc
+ , image = model.general.image
+ , img_nsfw = model.general.img_nsfw
+ , length = model.general.length
+ , l_renai = model.general.l_renai
+ , l_wp = model.general.l_wp
+ , anime = model.general.animeList
+ , staff = List.map (\e -> { aid = e.aid, role = e.role, note = e.note }) model.staff.staff
+ , seiyuu = List.map (\e -> { aid = e.aid, cid = e.cid, note = e.note }) model.seiyuu.seiyuu
+ , screenshots = List.map (\e -> { scr = e.scr, rid = e.rid, nsfw = e.nsfw }) model.screenshots.screenshots
+ , relations = List.map (\e -> { vid = e.vid, relation = e.relation, official = e.official }) model.relations.relations
+ }
+
+
+type Msg
+ = Editsum Editsum.Msg
+ | Submit
+ | Submitted Api.Response
+ | Titles Titles.Msg
+ | General Gen.Msg
+ | Staff Staff.Msg
+ | Seiyuu Seiyuu.Msg
+ | Relations Rel.Msg
+ | Screenshots Scr.Msg
+ | CheckDup
+ | RecvDup 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)
+ Titles m -> ({ model | titles = Titles.update m model.titles, dupVNs = [] }, Cmd.none)
+
+ Submit ->
+ let
+ path =
+ case model.id of
+ Just id -> "/v" ++ String.fromInt id ++ "/edit"
+ Nothing -> "/v/add"
+ body = vneditSendEncode (encode model)
+ in ({ model | state = Api.Loading }, Api.post path body Submitted)
+
+ Submitted (Api.Changed id rev) -> (model, load <| "/v" ++ String.fromInt id ++ "." ++ String.fromInt rev)
+ Submitted r -> ({ model | state = Api.Error r }, Cmd.none)
+
+ General m -> let (nm, c) = Gen.update m model.general in ({ model | general = nm }, Cmd.map General c)
+ Staff m -> let (nm, c) = Staff.update m model.staff in ({ model | staff = nm }, Cmd.map Staff c)
+ Seiyuu m -> let (nm, c) = Seiyuu.update m model.seiyuu in ({ model | seiyuu = nm }, Cmd.map Seiyuu c)
+ Screenshots m -> let (nm, c) = Scr.update m model.screenshots in ({ model | screenshots = nm }, Cmd.map Screenshots c)
+ Relations m -> let (nm, c) = Rel.update m model.relations in ({ model | relations = nm }, Cmd.map Relations c)
+
+ CheckDup ->
+ let body = JE.object
+ [ ("search", JE.list JE.string <| List.filter ((/=)"") <| model.titles.title :: model.titles.original :: model.titles.aliasList)
+ , ("hidden", JE.bool True) ]
+ in
+ if List.isEmpty model.dupVNs
+ then ({ model | state = Api.Loading }, Api.post "/js/vn.json" body RecvDup)
+ else ({ model | new = False }, Cmd.none)
+
+ RecvDup (Api.VNResult dup) ->
+ ({ model | state = Api.Normal, dupVNs = dup, new = not (List.isEmpty dup) }, Cmd.none)
+ RecvDup r -> ({ model | state = Api.Error r }, Cmd.none)
+
+
+
+isValid : Model -> Bool
+isValid model = not
+ ( model.titles.aliasDuplicates
+ || not (List.isEmpty model.titles.aliasBad)
+ || model.general.animeDuplicates
+ || model.staff.duplicates
+ || model.seiyuu.duplicates
+ || model.relations.duplicates
+ )
+
+
+view : Model -> Html Msg
+view model =
+ if model.new
+ then form_ CheckDup (model.state == Api.Loading)
+ [ card "new" "Add a new visual novel"
+ [ div [class "card__subheading"]
+ [ text "Carefully read the "
+ , a [ href "/d2" ] [ text "guidelines" ]
+ , text " before creating a new visual novel entry, to make sure that the game indeed conforms to our inclusion criteria."
+ ]
+ ] <|
+ List.map (Html.map Titles) <| Titles.view model.titles
+ , if List.isEmpty model.dupVNs
+ then text ""
+ else card "dup" "Possible duplicates" [ div [ class "card__subheading" ] [ text "Please check the list below for possible duplicates." ] ]
+ [ cardRow "" Nothing <| formGroup [ div [ class "form-group__help" ] [
+ ul [] <| List.map (\e ->
+ li [] [ a [ href <| "/v" ++ String.fromInt e.id, title e.original, target "_black" ] [ text e.title ]
+ , text <| if e.hidden then " (deleted)" else "" ]
+ ) model.dupVNs
+ ] ] ]
+ , submitButton "Continue" model.state (isValid model) False
+ ]
+
+ else form_ Submit (model.state == Api.Loading)
+ [ Gen.view model.general General <| List.map (Html.map Titles) <| Titles.view model.titles
+ , Html.map Staff <| lazy Staff.view model.staff
+ , Html.map Seiyuu <| lazy2 Seiyuu.view model.seiyuu model.id
+ , Html.map Relations <| lazy Rel.view model.relations
+ , Html.map Screenshots <| lazy2 Scr.view model.screenshots model.id
+ , Html.map Editsum <| lazy Editsum.view model.editsum
+ , submitButton "Submit" model.state (isValid model) (model.general.imgState == Api.Loading || Scr.loading model.screenshots)
+ ]