docspell/modules/webapp/src/main/elm/Comp/AttachmentMeta.elm
Eike Kettner d2edddd238 Show attachment meta data in ui
Allow to view the extracted text and results from text analysis of an
attachment.
2020-02-08 12:23:59 +01:00

210 lines
5.0 KiB
Elm

module Comp.AttachmentMeta exposing
( Model
, Msg
, init
, update
, view
)
import Api
import Api.Model.AttachmentMeta exposing (AttachmentMeta)
import Api.Model.ItemProposals exposing (ItemProposals)
import Api.Model.Label exposing (Label)
import Data.Flags exposing (Flags)
import Html exposing (..)
import Html.Attributes exposing (..)
import Http
import Util.Http
import Util.Time
type alias Model =
{ id : String
, meta : DataResult AttachmentMeta
}
type DataResult a
= NotAvailable
| Success a
| Failure String
emptyModel : Model
emptyModel =
{ id = ""
, meta = NotAvailable
}
init : Flags -> String -> ( Model, Cmd Msg )
init flags id =
( { emptyModel | id = id }
, Api.getAttachmentMeta flags id MetaResp
)
type Msg
= MetaResp (Result Http.Error AttachmentMeta)
update : Msg -> Model -> Model
update msg model =
case msg of
MetaResp (Ok am) ->
{ model | meta = Success am }
MetaResp (Err err) ->
{ model | meta = Failure (Util.Http.errorToString err) }
view : Model -> Html Msg
view model =
div []
[ h3 [ class "ui header" ]
[ text "Extracted Meta Data"
]
, case model.meta of
NotAvailable ->
div [ class "ui active dimmer" ]
[ div [ class "ui loader" ]
[]
]
Failure msg ->
div [ class "ui error message" ]
[ text msg
]
Success data ->
viewData data
]
viewData : AttachmentMeta -> Html Msg
viewData meta =
div []
[ div [ class "ui dividing header" ]
[ text "Content"
]
, div [ class "extracted-text" ]
[ text meta.content
]
, div [ class "ui dividing header" ]
[ text "Labels"
]
, div []
[ div [ class "ui horizontal list" ]
(List.map renderLabelItem meta.labels)
]
, div [ class "ui dividing header" ]
[ text "Proposals"
]
, viewProposals meta.proposals
]
viewProposals : ItemProposals -> Html Msg
viewProposals props =
let
mkItem n lbl =
div [ class "item" ]
[ div [ class "ui label" ]
[ text lbl.name
, div [ class "detail" ]
[ (String.fromInt (n + 1) ++ ".")
|> text
]
]
]
mkTimeItem ms =
div [ class "item" ]
[ div [ class "ui label" ]
[ Util.Time.formatDateShort ms |> text
]
]
in
div []
[ div [ class "ui small header" ]
[ text "Correspondent Organization"
]
, div [ class "ui horizontal list" ]
(List.indexedMap mkItem props.corrOrg)
, div [ class "ui small header" ]
[ text "Correspondent Person"
]
, div [ class "ui horizontal list" ]
(List.indexedMap mkItem props.corrPerson)
, div [ class "ui small header" ]
[ text "Concerning Person"
]
, div [ class "ui horizontal list" ]
(List.indexedMap mkItem props.concPerson)
, div [ class "ui small header" ]
[ text "Concerning Equipment"
]
, div [ class "ui horizontal list" ]
(List.indexedMap mkItem props.concEquipment)
, div [ class "ui small header" ]
[ text "Item Date"
]
, div [ class "ui horizontal list" ]
(List.map mkTimeItem props.itemDate)
, div [ class "ui small header" ]
[ text "Item Due Date"
]
, div [ class "ui horizontal list" ]
(List.map mkTimeItem props.dueDate)
]
renderLabelItem : Label -> Html Msg
renderLabelItem label =
div [ class "item" ]
[ renderLabel label
]
renderLabel : Label -> Html Msg
renderLabel label =
let
icon =
case label.labelType of
"organization" ->
"factory icon"
"person" ->
"user icon"
"location" ->
"map marker icon"
"date" ->
"calendar alternate icon"
"misc" ->
"help icon"
"email" ->
"at icon"
"website" ->
"external alternate icon"
_ ->
"tag icon"
in
div
[ class "ui basic label"
, title label.labelType
]
[ i [ class icon ] []
, text label.label
, div [ class "detail" ]
[ String.fromInt label.beginPos |> text
, text "-"
, String.fromInt label.endPos |> text
]
]