diff --git a/modules/restserver/src/main/scala/docspell/restserver/webapp/Flags.scala b/modules/restserver/src/main/scala/docspell/restserver/webapp/Flags.scala index ebea34ee..b430e91a 100644 --- a/modules/restserver/src/main/scala/docspell/restserver/webapp/Flags.scala +++ b/modules/restserver/src/main/scala/docspell/restserver/webapp/Flags.scala @@ -15,7 +15,9 @@ case class Flags( signupMode: SignupConfig.Mode, docspellAssetPath: String, integrationEnabled: Boolean, - fullTextSearchEnabled: Boolean + fullTextSearchEnabled: Boolean, + maxPageSize: Int, + maxNoteLength: Int ) object Flags { @@ -26,7 +28,9 @@ object Flags { cfg.backend.signup.mode, s"/app/assets/docspell-webapp/${BuildInfo.version}", cfg.integrationEndpoint.enabled, - cfg.fullTextSearch.enabled + cfg.fullTextSearch.enabled, + cfg.maxItemPageSize, + cfg.maxNoteLength ) implicit val jsonEncoder: Encoder[Flags] = diff --git a/modules/webapp/src/main/elm/App/View.elm b/modules/webapp/src/main/elm/App/View.elm index 376f5153..e33feb29 100644 --- a/modules/webapp/src/main/elm/App/View.elm +++ b/modules/webapp/src/main/elm/App/View.elm @@ -146,7 +146,7 @@ viewQueue model = viewUserSettings : Model -> Html Msg viewUserSettings model = - Html.map UserSettingsMsg (Page.UserSettings.View.view model.uiSettings model.userSettingsModel) + Html.map UserSettingsMsg (Page.UserSettings.View.view model.flags model.uiSettings model.userSettingsModel) viewCollectiveSettings : Model -> Html Msg diff --git a/modules/webapp/src/main/elm/Comp/ItemCardList.elm b/modules/webapp/src/main/elm/Comp/ItemCardList.elm index 78d21a89..d818f35c 100644 --- a/modules/webapp/src/main/elm/Comp/ItemCardList.elm +++ b/modules/webapp/src/main/elm/Comp/ItemCardList.elm @@ -197,6 +197,22 @@ viewItem 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 + ] + ] , div [ class "content" ] [ div [ class "ui horizontal list" ] [ div diff --git a/modules/webapp/src/main/elm/Comp/UiSettingsForm.elm b/modules/webapp/src/main/elm/Comp/UiSettingsForm.elm index 4b256e13..86f4f0cd 100644 --- a/modules/webapp/src/main/elm/Comp/UiSettingsForm.elm +++ b/modules/webapp/src/main/elm/Comp/UiSettingsForm.elm @@ -12,7 +12,7 @@ import Comp.ColorTagger import Comp.IntField import Data.Color exposing (Color) import Data.Flags exposing (Flags) -import Data.UiSettings exposing (StoredUiSettings, UiSettings) +import Data.UiSettings exposing (UiSettings) import Dict exposing (Dict) import Html exposing (..) import Html.Attributes exposing (..) @@ -27,6 +27,8 @@ type alias Model = , tagColors : Dict String Color , tagColorModel : Comp.ColorTagger.Model , nativePdfPreview : Bool + , itemSearchNoteLength : Maybe Int + , searchNoteLengthModel : Comp.IntField.Model } @@ -36,7 +38,7 @@ init flags settings = , searchPageSizeModel = Comp.IntField.init (Just 10) - (Just 500) + (Just flags.config.maxPageSize) False "Page size" , tagColors = settings.tagCategoryColors @@ -45,6 +47,13 @@ init flags settings = [] Data.Color.all , nativePdfPreview = settings.nativePdfPreview + , itemSearchNoteLength = Just settings.itemSearchNoteLength + , searchNoteLengthModel = + Comp.IntField.init + (Just 0) + (Just flags.config.maxNoteLength) + False + "Max. Note Length" } , Api.getTags flags "" GetTagsResp ) @@ -55,6 +64,7 @@ type Msg | TagColorMsg Comp.ColorTagger.Msg | GetTagsResp (Result Http.Error TagList) | TogglePdfPreview + | NoteLengthMsg Comp.IntField.Msg @@ -80,6 +90,22 @@ update sett msg model = in ( model_, nextSettings ) + NoteLengthMsg lm -> + let + ( m, n ) = + Comp.IntField.update lm model.searchNoteLengthModel + + nextSettings = + Maybe.map (\len -> { sett | itemSearchNoteLength = len }) n + + model_ = + { model + | searchNoteLengthModel = m + , itemSearchNoteLength = n + } + in + ( model_, nextSettings ) + TagColorMsg lm -> let ( m_, d_ ) = @@ -139,19 +165,32 @@ tagColorViewOpts = } -view : UiSettings -> Model -> Html Msg -view _ model = +view : Flags -> UiSettings -> Model -> Html Msg +view flags _ model = div [ class "ui form" ] [ div [ class "ui dividing header" ] [ text "Item Search" ] , Html.map SearchPageSizeMsg (Comp.IntField.viewWithInfo - "Maximum results in one page when searching items." + ("Maximum results in one page when searching items. At most " + ++ String.fromInt flags.config.maxPageSize + ++ "." + ) model.itemSearchPageSize "field" model.searchPageSizeModel ) + , Html.map NoteLengthMsg + (Comp.IntField.viewWithInfo + ("Maximum size of the item notes to display in card view. Between 0 - " + ++ String.fromInt flags.config.maxNoteLength + ++ "." + ) + model.itemSearchNoteLength + "field" + model.searchNoteLengthModel + ) , div [ class "ui dividing header" ] [ text "Item Detail" ] diff --git a/modules/webapp/src/main/elm/Comp/UiSettingsManage.elm b/modules/webapp/src/main/elm/Comp/UiSettingsManage.elm index 70730e72..6f6b601b 100644 --- a/modules/webapp/src/main/elm/Comp/UiSettingsManage.elm +++ b/modules/webapp/src/main/elm/Comp/UiSettingsManage.elm @@ -115,10 +115,10 @@ isSuccess model = Maybe.map .success model.message == Just True -view : UiSettings -> String -> Model -> Html Msg -view settings classes model = +view : Flags -> UiSettings -> String -> Model -> Html Msg +view flags settings classes model = div [ class classes ] - [ Html.map UiSettingsFormMsg (Comp.UiSettingsForm.view settings model.formModel) + [ Html.map UiSettingsFormMsg (Comp.UiSettingsForm.view flags settings model.formModel) , div [ class "ui divider" ] [] , button [ class "ui primary button" diff --git a/modules/webapp/src/main/elm/Data/Flags.elm b/modules/webapp/src/main/elm/Data/Flags.elm index 16fd0122..052c8aa3 100644 --- a/modules/webapp/src/main/elm/Data/Flags.elm +++ b/modules/webapp/src/main/elm/Data/Flags.elm @@ -16,6 +16,8 @@ type alias Config = , docspellAssetPath : String , integrationEnabled : Bool , fullTextSearchEnabled : Bool + , maxPageSize : Int + , maxNoteLength : Int } diff --git a/modules/webapp/src/main/elm/Data/UiSettings.elm b/modules/webapp/src/main/elm/Data/UiSettings.elm index 91b7be97..587271b2 100644 --- a/modules/webapp/src/main/elm/Data/UiSettings.elm +++ b/modules/webapp/src/main/elm/Data/UiSettings.elm @@ -26,6 +26,7 @@ type alias StoredUiSettings = { itemSearchPageSize : Maybe Int , tagCategoryColors : List ( String, String ) , nativePdfPreview : Bool + , itemSearchNoteLength : Maybe Int } @@ -40,6 +41,7 @@ type alias UiSettings = { itemSearchPageSize : Int , tagCategoryColors : Dict String Color , nativePdfPreview : Bool + , itemSearchNoteLength : Int } @@ -48,6 +50,7 @@ defaults = { itemSearchPageSize = 60 , tagCategoryColors = Dict.empty , nativePdfPreview = False + , itemSearchNoteLength = 0 } @@ -64,6 +67,8 @@ merge given fallback = ) fallback.tagCategoryColors , nativePdfPreview = given.nativePdfPreview + , itemSearchNoteLength = + choose given.itemSearchNoteLength fallback.itemSearchNoteLength } @@ -79,6 +84,7 @@ toStoredUiSettings settings = Dict.map (\_ -> Data.Color.toString) settings.tagCategoryColors |> Dict.toList , nativePdfPreview = settings.nativePdfPreview + , itemSearchNoteLength = Just settings.itemSearchNoteLength } diff --git a/modules/webapp/src/main/elm/Page/UserSettings/View.elm b/modules/webapp/src/main/elm/Page/UserSettings/View.elm index 42b3a74a..c8adb9da 100644 --- a/modules/webapp/src/main/elm/Page/UserSettings/View.elm +++ b/modules/webapp/src/main/elm/Page/UserSettings/View.elm @@ -6,6 +6,7 @@ import Comp.ImapSettingsManage import Comp.NotificationManage import Comp.ScanMailboxManage import Comp.UiSettingsManage +import Data.Flags exposing (Flags) import Data.UiSettings exposing (UiSettings) import Html exposing (..) import Html.Attributes exposing (..) @@ -14,8 +15,8 @@ import Page.UserSettings.Data exposing (..) import Util.Html exposing (classActive) -view : UiSettings -> Model -> Html Msg -view settings model = +view : Flags -> UiSettings -> Model -> Html Msg +view flags settings model = div [ class "usersetting-page ui padded grid" ] [ div [ class "sixteen wide mobile four wide tablet four wide computer column" ] [ h4 [ class "ui top attached ablue-comp header" ] @@ -51,7 +52,7 @@ view settings model = viewScanMailboxManage settings model Just UiSettingsTab -> - viewUiSettings settings model + viewUiSettings flags settings model Nothing -> [] @@ -72,8 +73,8 @@ makeTab model tab header icon = ] -viewUiSettings : UiSettings -> Model -> List (Html Msg) -viewUiSettings settings model = +viewUiSettings : Flags -> UiSettings -> Model -> List (Html Msg) +viewUiSettings flags settings model = [ h2 [ class "ui header" ] [ i [ class "cog icon" ] [] , text "UI Settings" @@ -84,6 +85,7 @@ viewUiSettings settings model = ] , Html.map UiSettingsMsg (Comp.UiSettingsManage.view + flags settings "ui segment" model.uiSettingsModel diff --git a/modules/webapp/src/main/elm/Util/String.elm b/modules/webapp/src/main/elm/Util/String.elm index c5d637f3..d40cd2ea 100644 --- a/modules/webapp/src/main/elm/Util/String.elm +++ b/modules/webapp/src/main/elm/Util/String.elm @@ -1,6 +1,8 @@ module Util.String exposing ( crazyEncode , ellipsis + , isBlank + , isNothingOrBlank , underscoreToSpace , withDefault ) @@ -31,7 +33,7 @@ ellipsis len str = str else - String.left (len - 3) str ++ "..." + String.left (len - 1) str ++ "…" withDefault : String -> String -> String @@ -46,3 +48,14 @@ withDefault default str = underscoreToSpace : String -> String underscoreToSpace str = String.replace "_" " " str + + +isBlank : String -> Bool +isBlank s = + s == "" || (String.trim s == "") + + +isNothingOrBlank : Maybe String -> Bool +isNothingOrBlank ms = + Maybe.map isBlank ms + |> Maybe.withDefault True