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,12 +57,16 @@ 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) =>
ctx.logger.debug("Preview generated, saving to database…") *>
createRecord(ctx, out, ra, chunkSize).map(_.some) createRecord(ctx, out, ra, chunkSize).map(_.some)
case None => case None =>
ctx.logger
.info(s"Preview could not be generated. Maybe the pdf has no pages?") *>
(None: Option[RAttachmentPreview]).pure[F] (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] (None: Option[RAttachmentPreview]).pure[F]
} }

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" ] []
]
] ]
] ]

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