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
.map(AttachmentPreview.createPreview(ctx, preview, cfg.chunkSize))
.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 ()

View File

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

View File

@ -4,6 +4,7 @@ import Api
import Api.Model.AttachmentLight exposing (AttachmentLight)
import Api.Model.HighlightEntry exposing (HighlightEntry)
import Api.Model.ItemLight exposing (ItemLight)
import Data.BasicSize
import Data.Direction
import Data.Fields
import Data.Icons as Icons
@ -117,29 +118,6 @@ update ddm msg model =
view : ViewConfig -> UiSettings -> Model -> ItemLight -> Html Msg
view cfg settings model item =
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 =
item.state /= "created"
@ -163,55 +141,6 @@ view cfg settings model item =
Data.ItemSelection.Active ids ->
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
div
([ classList
@ -227,104 +156,54 @@ view cfg settings model item =
span [ class "invisible" ] []
else
div
[ class "image ds-card-image"
, Data.UiSettings.cardPreviewSize settings
]
[ img
[ 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
previewImage settings model item
, mainContent cardAction cardColor isConfirmed settings cfg item
, notesContent settings item
, metaDataContent settings item
, fulltextResultsContent item
]
Data.ItemSelection.Inactive ->
if fieldHidden Data.Fields.Direction then
div [ class "header" ]
[ Util.String.underscoreToSpace item.name |> text
fulltextResultsContent : ItemLight -> Html Msg
fulltextResultsContent item =
div
[ classList
[ ( "content search-highlight", True )
, ( "invisible hidden", item.highlighting == [] )
]
]
[ div [ class "ui list" ]
(List.map renderHighlightEntry item.highlighting)
]
else
div
[ class "header"
, Data.Direction.labelFromMaybe item.direction
|> title
]
[ 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 ]
)
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" ]
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
@ -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
[ classList
[ ( "content search-highlight", True )
, ( "invisible hidden", item.highlighting == [] )
[ ( "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 )
]
]
[ div [ class "ui list" ]
(List.map renderHighlightEntry item.highlighting)
[ 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 ]
)
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" ] []
]
]
]

View File

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