mirror of
https://github.com/TheAnachronism/docspell.git
synced 2024-11-13 02:31:10 +00:00
831cd8b655
Features: - Upload PDF files let them analyze - Manage meta data and items - See processing in webapp
125 lines
3.9 KiB
Elm
125 lines
3.9 KiB
Elm
module Comp.ContactField exposing (Model
|
|
,emptyModel
|
|
,getContacts
|
|
,Msg(..)
|
|
,update
|
|
,view
|
|
)
|
|
|
|
import Html exposing (..)
|
|
import Html.Attributes exposing (..)
|
|
import Html.Events exposing (onInput, onClick)
|
|
import Api.Model.Contact exposing (Contact)
|
|
import Data.ContactType exposing (ContactType)
|
|
import Comp.Dropdown
|
|
|
|
type alias Model =
|
|
{ items: List Contact
|
|
, kind: Comp.Dropdown.Model ContactType
|
|
, value: String
|
|
}
|
|
|
|
emptyModel: Model
|
|
emptyModel =
|
|
{ items = []
|
|
, kind = Comp.Dropdown.makeSingleList
|
|
{ makeOption = \ct -> { value = Data.ContactType.toString ct, text = Data.ContactType.toString ct }
|
|
, placeholder = ""
|
|
, options = Data.ContactType.all
|
|
, selected = List.head Data.ContactType.all
|
|
}
|
|
, value = ""
|
|
}
|
|
|
|
makeModel: List Contact -> Model
|
|
makeModel contacts =
|
|
let
|
|
em = emptyModel
|
|
in
|
|
{ em | items = contacts }
|
|
|
|
getContacts: Model -> List Contact
|
|
getContacts model =
|
|
List.filter (\c -> c.value /= "") model.items
|
|
|
|
type Msg
|
|
= SetValue String
|
|
| TypeMsg (Comp.Dropdown.Msg ContactType)
|
|
| AddContact
|
|
| Select Contact
|
|
| SetItems (List Contact)
|
|
|
|
update: Msg -> Model -> (Model, Cmd Msg)
|
|
update msg model =
|
|
case msg of
|
|
SetItems contacts ->
|
|
({model | items = contacts, value = "" }, Cmd.none)
|
|
|
|
SetValue v ->
|
|
({model | value = v}, Cmd.none)
|
|
|
|
TypeMsg m ->
|
|
let
|
|
(m1, c1) = Comp.Dropdown.update m model.kind
|
|
in
|
|
({model|kind = m1}, Cmd.map TypeMsg c1)
|
|
|
|
AddContact ->
|
|
if model.value == "" then (model, Cmd.none)
|
|
else
|
|
let
|
|
kind = Comp.Dropdown.getSelected model.kind
|
|
|> List.head
|
|
|> Maybe.map Data.ContactType.toString
|
|
|> Maybe.withDefault ""
|
|
in
|
|
({model| items = (Contact "" model.value kind) :: model.items, value = ""}, Cmd.none)
|
|
|
|
Select contact ->
|
|
let
|
|
newItems = List.filter (\c -> c /= contact) model.items
|
|
(m1, c1) = Data.ContactType.fromString contact.kind
|
|
|> Maybe.map (\ct -> update (TypeMsg (Comp.Dropdown.SetSelection [ct])) model)
|
|
|> Maybe.withDefault (model, Cmd.none)
|
|
in
|
|
({m1 | value = contact.value, items = newItems}, c1)
|
|
|
|
view: Model -> Html Msg
|
|
view model =
|
|
div []
|
|
[div [class "fields"]
|
|
[div [class "four wide field"]
|
|
[Html.map TypeMsg (Comp.Dropdown.view model.kind)
|
|
]
|
|
,div [class "twelve wide field"]
|
|
[div [class "ui action input"]
|
|
[input [type_ "text"
|
|
,onInput SetValue
|
|
,value model.value
|
|
][]
|
|
,a [class "ui button", onClick AddContact, href ""]
|
|
[text "Add"
|
|
]
|
|
]
|
|
]
|
|
]
|
|
,div [classList [("field", True)
|
|
,("invisible", List.isEmpty model.items)
|
|
]
|
|
]
|
|
[div [class "ui vertical secondary fluid menu"]
|
|
(List.map (renderItem model) model.items)
|
|
]
|
|
]
|
|
|
|
|
|
renderItem: Model -> Contact -> Html Msg
|
|
renderItem model contact =
|
|
div [class "link item", onClick (Select contact) ]
|
|
[i [class "delete icon"][]
|
|
,div [class "ui blue label"]
|
|
[text contact.kind
|
|
]
|
|
,text contact.value
|
|
]
|