Split item card it several functions

This commit is contained in:
Eike Kettner 2020-11-10 22:25:25 +01:00
parent ffaded9718
commit ed26fe226b

View File

@ -4,6 +4,7 @@ import Api
import Api.Model.AttachmentLight exposing (AttachmentLight) import Api.Model.AttachmentLight exposing (AttachmentLight)
import Api.Model.HighlightEntry exposing (HighlightEntry) import Api.Model.HighlightEntry exposing (HighlightEntry)
import Api.Model.ItemLight exposing (ItemLight) import Api.Model.ItemLight exposing (ItemLight)
import Data.BasicSize
import Data.Direction import Data.Direction
import Data.Fields import Data.Fields
import Data.Icons as Icons import Data.Icons as Icons
@ -117,29 +118,6 @@ update ddm msg model =
view : ViewConfig -> UiSettings -> Model -> ItemLight -> Html Msg view : ViewConfig -> UiSettings -> Model -> ItemLight -> Html Msg
view cfg settings model item = view cfg settings model item =
let let
dirIcon =
i [ class (Data.Direction.iconFromMaybe item.direction) ] []
corr =
List.filterMap identity [ item.corrOrg, item.corrPerson ]
|> List.map .name
|> List.intersperse ", "
|> String.concat
conc =
List.filterMap identity [ item.concPerson, item.concEquip ]
|> List.map .name
|> List.intersperse ", "
|> String.concat
folder =
Maybe.map .name item.folder
|> Maybe.withDefault ""
dueDate =
Maybe.map Util.Time.formatDateShort item.dueDate
|> Maybe.withDefault ""
isConfirmed = isConfirmed =
item.state /= "created" item.state /= "created"
@ -163,55 +141,6 @@ view cfg settings model item =
Data.ItemSelection.Active ids -> Data.ItemSelection.Active ids ->
onClick (ToggleSelectItem ids item.id) onClick (ToggleSelectItem ids item.id)
mainAttach =
currentAttachment model item
previewUrl =
Maybe.map .id mainAttach
|> Maybe.map Api.attachmentPreviewURL
|> Maybe.withDefault (Api.itemBasePreviewURL item.id)
pageCount =
Maybe.andThen .pageCount mainAttach
|> Maybe.withDefault 0
pageCountLabel =
div
[ classList
[ ( "card-attachment-nav top", True )
, ( "invisible", pageCount == 0 || (item.fileCount == 1 && pageCount == 1) )
]
]
[ if item.fileCount == 1 then
div
[ class "ui secondary basic mini label"
, title "Number of pages"
]
[ text "p."
, text (String.fromInt pageCount)
]
else
div [ class "ui left labeled mini button" ]
[ div [ class "ui basic right pointing mini label" ]
[ currentPosition model item
|> String.fromInt
|> text
, text "/"
, text (String.fromInt item.fileCount)
, text " p."
, text (String.fromInt pageCount)
]
, a
[ class "ui mini icon secondary button"
, href "#"
, onClick (CyclePreview item)
]
[ i [ class "arrow right icon" ] []
]
]
]
in in
div div
([ classList ([ classList
@ -227,104 +156,54 @@ view cfg settings model item =
span [ class "invisible" ] [] span [ class "invisible" ] []
else else
div previewImage settings model item
[ class "image ds-card-image" , mainContent cardAction cardColor isConfirmed settings cfg item
, Data.UiSettings.cardPreviewSize settings , notesContent settings item
] , metaDataContent settings item
[ img , fulltextResultsContent item
[ class "preview-image"
, src previewUrl
, Data.UiSettings.cardPreviewSize settings
]
[]
, pageCountLabel
]
, a
[ class "link content"
, href "#"
, cardAction
]
[ case cfg.selection of
Data.ItemSelection.Active ids ->
div [ class "header" ]
[ Util.Html.checkbox (Set.member item.id ids)
, dirIcon
, Util.String.underscoreToSpace item.name
|> text
] ]
Data.ItemSelection.Inactive ->
if fieldHidden Data.Fields.Direction then fulltextResultsContent : ItemLight -> Html Msg
div [ class "header" ] fulltextResultsContent item =
[ Util.String.underscoreToSpace item.name |> text div
[ classList
[ ( "content search-highlight", True )
, ( "invisible hidden", item.highlighting == [] )
]
]
[ div [ class "ui list" ]
(List.map renderHighlightEntry item.highlighting)
] ]
else
div metaDataContent : UiSettings -> ItemLight -> Html Msg
[ class "header" metaDataContent settings item =
, Data.Direction.labelFromMaybe item.direction let
|> title fieldHidden f =
] Data.UiSettings.fieldHidden settings f
[ dirIcon
, Util.String.underscoreToSpace item.name corr =
|> text List.filterMap identity [ item.corrOrg, item.corrPerson ]
] |> List.map .name
, div |> List.intersperse ", "
[ classList |> String.concat
[ ( "ui right corner label", True )
, ( cardColor, True ) conc =
, ( "invisible", isConfirmed ) List.filterMap identity [ item.concPerson, item.concEquip ]
] |> List.map .name
, title "New" |> List.intersperse ", "
] |> String.concat
[ i [ class "exclamation icon" ] []
] folder =
, div Maybe.map .name item.folder
[ classList |> Maybe.withDefault ""
[ ( "meta", True )
, ( "invisible hidden", fieldHidden Data.Fields.Date ) dueDate =
] Maybe.map Util.Time.formatDateShort item.dueDate
] |> Maybe.withDefault ""
[ Util.Time.formatDate item.date |> text in
] div [ class "content" ]
, div [ class "meta description" ]
[ div
[ classList
[ ( "ui right floated tiny labels", True )
, ( "invisible hidden", item.tags == [] || fieldHidden Data.Fields.Tag )
]
]
(List.map
(\tag ->
div
[ classList
[ ( "ui basic label", True )
, ( Data.UiSettings.tagColorString tag settings, True )
]
]
[ text tag.name ]
)
item.tags
)
]
]
, div
[ classList
[ ( "content", True )
, ( "invisible hidden"
, settings.itemSearchNoteLength
<= 0
|| Util.String.isNothingOrBlank item.notes
)
]
]
[ span [ class "small-info" ]
[ Maybe.withDefault "" item.notes
|> Util.String.ellipsis settings.itemSearchNoteLength
|> text
]
]
, div [ class "content" ]
[ div [ class "ui horizontal list" ] [ div [ class "ui horizontal list" ]
[ div [ div
[ classList [ classList
@ -395,14 +274,173 @@ view cfg settings model item =
] ]
] ]
] ]
notesContent : UiSettings -> ItemLight -> Html Msg
notesContent settings item =
div
[ classList
[ ( "content", True )
, ( "invisible hidden"
, settings.itemSearchNoteLength
<= 0
|| Util.String.isNothingOrBlank item.notes
)
]
]
[ span [ class "small-info" ]
[ Maybe.withDefault "" item.notes
|> Util.String.ellipsis settings.itemSearchNoteLength
|> text
]
]
mainContent : Attribute Msg -> String -> Bool -> UiSettings -> ViewConfig -> ItemLight -> Html Msg
mainContent cardAction cardColor isConfirmed settings cfg item =
let
dirIcon =
i [ class (Data.Direction.iconFromMaybe item.direction) ] []
fieldHidden f =
Data.UiSettings.fieldHidden settings f
in
a
[ class "link content"
, href "#"
, cardAction
]
[ case cfg.selection of
Data.ItemSelection.Active ids ->
div [ class "header" ]
[ Util.Html.checkbox (Set.member item.id ids)
, dirIcon
, Util.String.underscoreToSpace item.name
|> text
]
Data.ItemSelection.Inactive ->
if fieldHidden Data.Fields.Direction then
div [ class "header" ]
[ Util.String.underscoreToSpace item.name |> text
]
else
div
[ class "header"
, Data.Direction.labelFromMaybe item.direction
|> title
]
[ dirIcon
, Util.String.underscoreToSpace item.name
|> text
]
, div , div
[ classList [ classList
[ ( "content search-highlight", True ) [ ( "ui right corner label", True )
, ( "invisible hidden", item.highlighting == [] ) , ( cardColor, True )
, ( "invisible", isConfirmed )
]
, title "New"
]
[ i [ class "exclamation icon" ] []
]
, div
[ classList
[ ( "meta", True )
, ( "invisible hidden", fieldHidden Data.Fields.Date )
] ]
] ]
[ div [ class "ui list" ] [ Util.Time.formatDate item.date |> text
(List.map renderHighlightEntry item.highlighting) ]
, div [ class "meta description" ]
[ div
[ classList
[ ( "ui right floated tiny labels", True )
, ( "invisible hidden", item.tags == [] || fieldHidden Data.Fields.Tag )
]
]
(List.map
(\tag ->
div
[ classList
[ ( "ui basic label", True )
, ( Data.UiSettings.tagColorString tag settings, True )
]
]
[ text tag.name ]
)
item.tags
)
]
]
previewImage : UiSettings -> Model -> ItemLight -> Html Msg
previewImage settings model item =
let
previewUrl =
Maybe.map .id mainAttach
|> Maybe.map Api.attachmentPreviewURL
|> Maybe.withDefault (Api.itemBasePreviewURL item.id)
mainAttach =
currentAttachment model item
in
div
[ class "image ds-card-image"
, Data.UiSettings.cardPreviewSize settings
]
[ img
[ class "preview-image"
, src previewUrl
, Data.UiSettings.cardPreviewSize settings
]
[]
, pageCountLabel model item mainAttach
]
pageCountLabel : Model -> ItemLight -> Maybe AttachmentLight -> Html Msg
pageCountLabel model item mainAttach =
let
pageCount =
Maybe.andThen .pageCount mainAttach
|> Maybe.withDefault 0
in
div
[ classList
[ ( "card-attachment-nav top", True )
, ( "invisible", pageCount == 0 || (item.fileCount == 1 && pageCount == 1) )
]
]
[ if item.fileCount == 1 then
div
[ class "ui secondary basic mini label"
, title "Number of pages"
]
[ text "p."
, text (String.fromInt pageCount)
]
else
div [ class "ui left labeled mini button" ]
[ div [ class "ui basic right pointing mini label" ]
[ currentPosition model item
|> String.fromInt
|> text
, text "/"
, text (String.fromInt item.fileCount)
, text " p."
, text (String.fromInt pageCount)
]
, a
[ class "ui mini icon secondary button"
, href "#"
, onClick (CyclePreview item)
]
[ i [ class "arrow right icon" ] []
]
] ]
] ]