summaryrefslogtreecommitdiff
path: root/elm3/VNEdit/Staff.elm
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2019-07-25 14:30:04 +0200
committerYorhel <git@yorhel.nl>2019-07-25 14:36:21 +0200
commitf296495a912ce759df11c43e78b4552788bdbff2 (patch)
tree0c10802de65fb7c8475722e12234bff5eb980628 /elm3/VNEdit/Staff.elm
parent0f3cfeb85caec6424bcbea47142eefbf8011636b (diff)
Merge the v3 branch into separate namespace + fix Docker stuff (again)
I was getting tired of having to keep two branches up-to-date with the latest developments, so decided to throw v3 into the same branch - just different files (...which will get mostly rewritten again soon). The two versions aren't very different in terms of dependencies, build system and support code, so they can now properly share files. Added a section to the README to avoid confusion. This merge also makes it easier to quickly switch between the different versions, which is handy for development. It's even possible to run both at the same time, but my scripts use the same port so that needs a workaround. And it's amazing how often I break the Docker scripts.
Diffstat (limited to 'elm3/VNEdit/Staff.elm')
-rw-r--r--elm3/VNEdit/Staff.elm96
1 files changed, 96 insertions, 0 deletions
diff --git a/elm3/VNEdit/Staff.elm b/elm3/VNEdit/Staff.elm
new file mode 100644
index 00000000..589475b2
--- /dev/null
+++ b/elm3/VNEdit/Staff.elm
@@ -0,0 +1,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"]
+ ]
+ )