summaryrefslogtreecommitdiff
path: root/elm3/RelEdit/Vn.elm
blob: 35afb9322d02bfe03609756c833f93e48c2ea8fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
module RelEdit.Vn exposing (Model, Msg, init, update, view)

import Html exposing (..)
import Html.Attributes exposing (..)
import Lib.Html exposing (..)
import Lib.Gen exposing (RelEditVn)
import Lib.Util exposing (..)
import Lib.Autocomplete as A
import Lib.Api exposing (VN)


type alias Model =
  { vn         : List RelEditVn
  , search     : A.Model VN
  , duplicates : Bool
  }


init : List RelEditVn -> Model
init l =
  { vn         = l
  , search     = A.init
  , duplicates = False
  }


type Msg
  = Del Int
  | Search (A.Msg VN)


searchConfig : A.Config Msg VN
searchConfig = { wrap = Search, id = "add-vn", source = A.vnSource }


validate : Model -> Model
validate model = { model | duplicates = hasDuplicates <| List.map .vid model.vn }


update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
  case msg of
    Del i    -> (validate { model | vn = delidx i model.vn }, Cmd.none)
    Search m ->
      let (nm, c, res) = A.update searchConfig m model.search
      in case res of
        Nothing -> ({ model | search = nm }, c)
        Just r  ->
          let nrow = { vid = r.id, title = r.title }
          in (validate { model | search = A.clear nm, vn = model.vn ++ [nrow] }, c)


view : Model -> Html Msg
view model =
  let
    entry n e = editListRow "row--ai-center"
      [ editListField 1 "col-form-label single-line"
        [ a [href <| "/v" ++ String.fromInt e.vid, title e.title, target "_blank" ] [text e.title ] ]
      , editListField 0 "" [ removeButton (Del n) ]
      ]

  in cardRow "Visual Novels" Nothing
    <| editList (List.indexedMap entry model.vn)
    ++ formGroups (
      (if model.duplicates
        then [ [ div [ class "invalid-feedback" ]
          [ text "The list contains duplicates. Make sure that the same visual novel is not listed multiple times." ] ] ]
        else []
      ) ++
      (if List.isEmpty model.vn
        then [ [ div [ class "invalid-feedback" ]
          [ text "Please make sure that at least one visual novel is selected." ] ] ]
        else []
      ) ++
      [ label [for "add-vn"] [text "Add visual novel"]
      :: A.view searchConfig model.search [placeholder "Visual Novel...", style "max-width" "400px"]
      ]
    )