mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-06-05 22:55:58 +00:00
172 lines
4.3 KiB
Elm
172 lines
4.3 KiB
Elm
module Comp.PersonForm exposing
|
|
( Model
|
|
, Msg(..)
|
|
, emptyModel
|
|
, getPerson
|
|
, isValid
|
|
, update
|
|
, view
|
|
)
|
|
|
|
import Api.Model.Person exposing (Person)
|
|
import Comp.AddressForm
|
|
import Comp.ContactField
|
|
import Data.Flags exposing (Flags)
|
|
import Data.UiSettings exposing (UiSettings)
|
|
import Html exposing (..)
|
|
import Html.Attributes exposing (..)
|
|
import Html.Events exposing (onCheck, onInput)
|
|
|
|
|
|
type alias Model =
|
|
{ org : Person
|
|
, name : String
|
|
, addressModel : Comp.AddressForm.Model
|
|
, contactModel : Comp.ContactField.Model
|
|
, notes : Maybe String
|
|
, concerning : Bool
|
|
}
|
|
|
|
|
|
emptyModel : Model
|
|
emptyModel =
|
|
{ org = Api.Model.Person.empty
|
|
, name = ""
|
|
, addressModel = Comp.AddressForm.emptyModel
|
|
, contactModel = Comp.ContactField.emptyModel
|
|
, notes = Nothing
|
|
, concerning = False
|
|
}
|
|
|
|
|
|
isValid : Model -> Bool
|
|
isValid model =
|
|
model.name /= ""
|
|
|
|
|
|
getPerson : Model -> Person
|
|
getPerson model =
|
|
let
|
|
o =
|
|
model.org
|
|
in
|
|
{ o
|
|
| name = model.name
|
|
, address = Comp.AddressForm.getAddress model.addressModel
|
|
, contacts = Comp.ContactField.getContacts model.contactModel
|
|
, notes = model.notes
|
|
, concerning = model.concerning
|
|
}
|
|
|
|
|
|
type Msg
|
|
= SetName String
|
|
| SetPerson Person
|
|
| AddressMsg Comp.AddressForm.Msg
|
|
| ContactMsg Comp.ContactField.Msg
|
|
| SetNotes String
|
|
| SetConcerning Bool
|
|
|
|
|
|
update : Flags -> Msg -> Model -> ( Model, Cmd Msg )
|
|
update flags msg model =
|
|
case msg of
|
|
SetPerson t ->
|
|
let
|
|
( m1, c1 ) =
|
|
update flags (AddressMsg (Comp.AddressForm.SetAddress t.address)) model
|
|
|
|
( m2, c2 ) =
|
|
update flags (ContactMsg (Comp.ContactField.SetItems t.contacts)) m1
|
|
in
|
|
( { m2
|
|
| org = t
|
|
, name = t.name
|
|
, notes = t.notes
|
|
, concerning = t.concerning
|
|
}
|
|
, Cmd.batch [ c1, c2 ]
|
|
)
|
|
|
|
AddressMsg am ->
|
|
let
|
|
( m1, c1 ) =
|
|
Comp.AddressForm.update am model.addressModel
|
|
in
|
|
( { model | addressModel = m1 }, Cmd.map AddressMsg c1 )
|
|
|
|
ContactMsg m ->
|
|
let
|
|
( m1, c1 ) =
|
|
Comp.ContactField.update m model.contactModel
|
|
in
|
|
( { model | contactModel = m1 }, Cmd.map ContactMsg c1 )
|
|
|
|
SetName n ->
|
|
( { model | name = n }, Cmd.none )
|
|
|
|
SetNotes str ->
|
|
( { model
|
|
| notes =
|
|
if str == "" then
|
|
Nothing
|
|
|
|
else
|
|
Just str
|
|
}
|
|
, Cmd.none
|
|
)
|
|
|
|
SetConcerning _ ->
|
|
( { model | concerning = not model.concerning }, Cmd.none )
|
|
|
|
|
|
view : UiSettings -> Model -> Html Msg
|
|
view settings model =
|
|
div [ class "ui form" ]
|
|
[ div
|
|
[ classList
|
|
[ ( "field", True )
|
|
, ( "error", not (isValid model) )
|
|
]
|
|
]
|
|
[ label [] [ text "Name*" ]
|
|
, input
|
|
[ type_ "text"
|
|
, onInput SetName
|
|
, placeholder "Name"
|
|
, value model.name
|
|
]
|
|
[]
|
|
]
|
|
, div [ class "inline field" ]
|
|
[ div [ class "ui checkbox" ]
|
|
[ input
|
|
[ type_ "checkbox"
|
|
, checked model.concerning
|
|
, onCheck SetConcerning
|
|
]
|
|
[]
|
|
, label [] [ text "Use for concerning person suggestion only" ]
|
|
]
|
|
]
|
|
, h3 [ class "ui dividing header" ]
|
|
[ text "Address"
|
|
]
|
|
, Html.map AddressMsg (Comp.AddressForm.view settings model.addressModel)
|
|
, h3 [ class "ui dividing header" ]
|
|
[ text "Contacts"
|
|
]
|
|
, Html.map ContactMsg (Comp.ContactField.view settings model.contactModel)
|
|
, h3 [ class "ui dividing header" ]
|
|
[ text "Notes"
|
|
]
|
|
, div [ class "field" ]
|
|
[ textarea
|
|
[ onInput SetNotes
|
|
, Maybe.withDefault "" model.notes |> value
|
|
]
|
|
[]
|
|
]
|
|
]
|