summaryrefslogtreecommitdiff
path: root/elm3/VNEdit/Staff.elm
blob: 589475b2c4ad60b1b56b8c8991c83e27b298251f (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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
module VNEdit.Staff exposing (Model, Msg, init, update, view)

import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)
import Lib.Html exposing (..)
import Lib.Autocomplete as A
import Lib.Gen exposing (VNEditStaff, staffRoles)
import Lib.Util exposing (..)
import Lib.Api exposing (Staff)


type alias Model =
  { staff      : List VNEditStaff
  , search     : A.Model Staff
  , duplicates : Bool
  }


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


type Msg
  = Del Int
  | SetNote Int String
  | SetRole Int String
  | Search (A.Msg Staff)


searchConfig : A.Config Msg Staff
searchConfig = { wrap = Search, id = "add-staff", source = A.staffSource }


validate : Model -> Model
validate model = { model | duplicates = hasDuplicates <| List.map (\e -> (e.aid,e.role)) model.staff }


update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
  case msg of
    Del i       -> (validate { model | staff = delidx i model.staff }, Cmd.none)
    SetNote i s -> (validate { model | staff = modidx i (\e -> { e | note = s }) model.staff }, Cmd.none)
    SetRole i s -> (validate { model | staff = modidx i (\e -> { e | role = s }) model.staff }, 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
            role = List.head staffRoles |> Maybe.map Tuple.first |> Maybe.withDefault ""
            nrow = { aid = r.aid, id = r.id, name = r.name, role = role, note = "" }
          in (validate { model | search = A.clear nm, staff = model.staff ++ [nrow] }, c)



view : Model -> Html Msg
view model =
  let
    entry n e = editListRow ""
      [ editListField 1 "col-form-label single-line"
        [ a [href <| "/s" ++ String.fromInt e.id, target "_blank" ] [text e.name ] ]
      , editListField 1 ""
        [ inputSelect [onInput (SetRole n)] e.role staffRoles ]
      , editListField 2 ""
        [ inputText "" e.note (SetNote n) [placeholder "Note", maxlength 250] ]
      , editListField 0 "" [ removeButton (Del n) ]
      ]

  in card "staff" "Staff"
  [ div [class "card__subheading"]
    [ text "For information, check the "
    , a [href "/d2#3", target "_blank"] [text "staff editing guidelines"]
    , text ". You can "
    , a [href "/s/new", target "_blank"] [text "create a new staff entry"]
    , text " if it is not in the database yet, but please "
    , a [href "/s/all", target "_blank"] [text "check for aliases first"]
    , text "."
    ]
  ] <|
  editList (List.indexedMap entry model.staff)
  ++ formGroups (
    (if model.duplicates
      then [ [ div [ class "invalid-feedback" ]
        [ text "The staff list contains duplicates. Make sure that each person is only listed at most once with the same role" ] ] ]
      else []
    ) ++
    [ label [for "add-staff"] [text "Add staff"]
      :: A.view searchConfig model.search [placeholder "Staff name", style "max-width" "400px"]
    ]
  )