Merge pull request #434 from eikek/improvements

Improvements
This commit is contained in:
mergify[bot] 2020-11-10 22:53:21 +00:00 committed by GitHub
commit b5038255a9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 287 additions and 240 deletions

View File

@ -47,7 +47,7 @@ object MakePreviewTask {
_ <- ra _ <- ra
.map(AttachmentPreview.createPreview(ctx, preview, cfg.chunkSize)) .map(AttachmentPreview.createPreview(ctx, preview, cfg.chunkSize))
.getOrElse( .getOrElse(
ctx.logger.warn(s"No attachment found with id: ${ctx.args.attachment}") ctx.logger.error(s"No attachment found with id: ${ctx.args.attachment}")
) )
} yield () } yield ()

View File

@ -57,13 +57,17 @@ object AttachmentPreview {
case MimeType.PdfMatch(_) => case MimeType.PdfMatch(_) =>
preview.previewPNG(loadFile(ctx)(ra)).flatMap { preview.previewPNG(loadFile(ctx)(ra)).flatMap {
case Some(out) => case Some(out) =>
createRecord(ctx, out, ra, chunkSize).map(_.some) ctx.logger.debug("Preview generated, saving to database…") *>
createRecord(ctx, out, ra, chunkSize).map(_.some)
case None => case None =>
(None: Option[RAttachmentPreview]).pure[F] ctx.logger
.info(s"Preview could not be generated. Maybe the pdf has no pages?") *>
(None: Option[RAttachmentPreview]).pure[F]
} }
case _ => case mt =>
(None: Option[RAttachmentPreview]).pure[F] ctx.logger.warn(s"Not a pdf file, but ${mt.asString}, cannot get page count.") *>
(None: Option[RAttachmentPreview]).pure[F]
} }
private def createRecord[F[_]: Sync]( private def createRecord[F[_]: Sync](

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,183 +156,292 @@ 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
] fulltextResultsContent : ItemLight -> Html Msg
[] fulltextResultsContent item =
, pageCountLabel div
] [ classList
, a [ ( "content search-highlight", True )
[ class "link content" , ( "invisible hidden", item.highlighting == [] )
, href "#"
, cardAction
] ]
[ case cfg.selection of ]
Data.ItemSelection.Active ids -> [ div [ class "ui list" ]
(List.map renderHighlightEntry item.highlighting)
]
metaDataContent : UiSettings -> ItemLight -> Html Msg
metaDataContent settings item =
let
fieldHidden f =
Data.UiSettings.fieldHidden settings f
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 ""
in
div [ class "content" ]
[ div [ class "ui horizontal list" ]
[ div
[ classList
[ ( "item", True )
, ( "invisible hidden"
, fieldHidden Data.Fields.CorrOrg
&& fieldHidden Data.Fields.CorrPerson
)
]
, title "Correspondent"
]
[ Icons.correspondentIcon ""
, text " "
, Util.String.withDefault "-" corr |> text
]
, div
[ classList
[ ( "item", True )
, ( "invisible hidden"
, fieldHidden Data.Fields.ConcPerson
&& fieldHidden Data.Fields.ConcEquip
)
]
, title "Concerning"
]
[ Icons.concernedIcon
, text " "
, Util.String.withDefault "-" conc |> text
]
, div
[ classList
[ ( "item", True )
, ( "invisible hidden", fieldHidden Data.Fields.Folder )
]
, title "Folder"
]
[ Icons.folderIcon ""
, text " "
, Util.String.withDefault "-" folder |> text
]
]
, div [ class "right floated meta" ]
[ div [ class "ui horizontal list" ]
[ div
[ class "item"
, title "Source"
]
[ text item.source
]
, div
[ classList
[ ( "item", True )
, ( "invisible hidden"
, item.dueDate
== Nothing
|| fieldHidden Data.Fields.DueDate
)
]
, title ("Due on " ++ dueDate)
]
[ div
[ class "ui basic grey label"
]
[ Icons.dueDateIcon ""
, text (" " ++ dueDate)
]
]
]
]
]
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" ] div [ class "header" ]
[ Util.Html.checkbox (Set.member item.id ids) [ Util.String.underscoreToSpace item.name |> text
, dirIcon ]
else
div
[ class "header"
, Data.Direction.labelFromMaybe item.direction
|> title
]
[ dirIcon
, Util.String.underscoreToSpace item.name , Util.String.underscoreToSpace item.name
|> text |> text
] ]
, div
Data.ItemSelection.Inactive -> [ classList
if fieldHidden Data.Fields.Direction then [ ( "ui right corner label", True )
div [ class "header" ] , ( cardColor, True )
[ Util.String.underscoreToSpace item.name |> text , ( "invisible", isConfirmed )
] ]
, title "New"
else ]
[ i [ class "exclamation icon" ] []
]
, div
[ classList
[ ( "meta", True )
, ( "invisible hidden", fieldHidden Data.Fields.Date )
]
]
[ Util.Time.formatDate item.date |> text
]
, div [ class "meta description" ]
[ div
[ classList
[ ( "ui right floated tiny labels", True )
, ( "invisible hidden", item.tags == [] || fieldHidden Data.Fields.Tag )
]
]
(List.map
(\tag ->
div div
[ class "header" [ classList
, Data.Direction.labelFromMaybe item.direction [ ( "ui basic label", True )
|> title , ( Data.UiSettings.tagColorString tag settings, True )
]
[ dirIcon
, Util.String.underscoreToSpace item.name
|> text
]
, div
[ classList
[ ( "ui right corner label", True )
, ( cardColor, True )
, ( "invisible", isConfirmed )
]
, title "New"
]
[ i [ class "exclamation icon" ] []
]
, div
[ classList
[ ( "meta", True )
, ( "invisible hidden", fieldHidden Data.Fields.Date )
]
]
[ Util.Time.formatDate item.date |> text
]
, 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 ] ]
) [ text tag.name ]
item.tags
) )
] item.tags
)
] ]
, div ]
[ classList
[ ( "content", True )
, ( "invisible hidden" previewImage : UiSettings -> Model -> ItemLight -> Html Msg
, settings.itemSearchNoteLength previewImage settings model item =
<= 0 let
|| Util.String.isNothingOrBlank item.notes 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
] ]
[ span [ class "small-info" ] []
[ Maybe.withDefault "" item.notes , pageCountLabel model item mainAttach
|> Util.String.ellipsis settings.itemSearchNoteLength ]
|> text
]
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) )
] ]
, div [ class "content" ] ]
[ div [ class "ui horizontal list" ] [ if item.fileCount == 1 then
[ div div
[ classList [ class "ui secondary basic mini label"
[ ( "item", True ) , title "Number of pages"
, ( "invisible hidden" ]
, fieldHidden Data.Fields.CorrOrg [ text "p."
&& fieldHidden Data.Fields.CorrPerson , text (String.fromInt pageCount)
) ]
]
, title "Correspondent" 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)
] ]
[ Icons.correspondentIcon "" , a
, text " " [ class "ui mini icon secondary button"
, Util.String.withDefault "-" corr |> text , href "#"
, onClick (CyclePreview item)
] ]
, div [ i [ class "arrow right icon" ] []
[ classList
[ ( "item", True )
, ( "invisible hidden"
, fieldHidden Data.Fields.ConcPerson
&& fieldHidden Data.Fields.ConcEquip
)
]
, title "Concerning"
]
[ Icons.concernedIcon
, text " "
, Util.String.withDefault "-" conc |> text
]
, div
[ classList
[ ( "item", True )
, ( "invisible hidden", fieldHidden Data.Fields.Folder )
]
, title "Folder"
]
[ Icons.folderIcon ""
, text " "
, Util.String.withDefault "-" folder |> text
] ]
] ]
, div [ class "right floated meta" ]
[ div [ class "ui horizontal list" ]
[ div
[ class "item"
, title "Source"
]
[ text item.source
]
, div
[ classList
[ ( "item", True )
, ( "invisible hidden"
, item.dueDate
== Nothing
|| fieldHidden Data.Fields.DueDate
)
]
, title ("Due on " ++ dueDate)
]
[ div
[ class "ui basic grey label"
]
[ Icons.dueDateIcon ""
, text (" " ++ dueDate)
]
]
]
]
]
, div
[ classList
[ ( "content search-highlight", True )
, ( "invisible hidden", item.highlighting == [] )
]
]
[ div [ class "ui list" ]
(List.map renderHighlightEntry item.highlighting)
]
] ]

View File

@ -21,6 +21,7 @@ object Dependencies {
val Icu4jVersion = "68.1" val Icu4jVersion = "68.1"
val JsoupVersion = "1.13.1" val JsoupVersion = "1.13.1"
val KindProjectorVersion = "0.10.3" val KindProjectorVersion = "0.10.3"
val LevigoJbig2Version = "2.0"
val Log4sVersion = "1.9.0" val Log4sVersion = "1.9.0"
val LogbackVersion = "1.2.3" val LogbackVersion = "1.2.3"
val MariaDbVersion = "2.7.0" val MariaDbVersion = "2.7.0"
@ -85,12 +86,16 @@ object Dependencies {
"com.twelvemonkeys.imageio" % "imageio-tiff" % TwelveMonkeysVersion "com.twelvemonkeys.imageio" % "imageio-tiff" % TwelveMonkeysVersion
) )
val levigoJbig2 = Seq(
"com.levigo.jbig2" % "levigo-jbig2-imageio" % LevigoJbig2Version
)
val pdfbox = Seq( val pdfbox = Seq(
("org.apache.pdfbox" % "pdfbox" % PdfboxVersion).excludeAll( ("org.apache.pdfbox" % "pdfbox" % PdfboxVersion).excludeAll(
ExclusionRule("org.bouncycastle"), ExclusionRule("org.bouncycastle"),
ExclusionRule("commons-logging") ExclusionRule("commons-logging")
) )
) ++ jclOverSlf4j ) ++ jclOverSlf4j ++ levigoJbig2
val emilCommon = Seq( val emilCommon = Seq(
"com.github.eikek" %% "emil-common" % EmilVersion "com.github.eikek" %% "emil-common" % EmilVersion