diff --git a/modules/webapp/src/main/elm/Comp/ItemCard.elm b/modules/webapp/src/main/elm/Comp/ItemCard.elm index 23eaf3cd..11213bf9 100644 --- a/modules/webapp/src/main/elm/Comp/ItemCard.elm +++ b/modules/webapp/src/main/elm/Comp/ItemCard.elm @@ -321,10 +321,10 @@ mainContent cardAction cardColor isConfirmed settings _ item = Data.UiSettings.fieldHidden settings f titlePattern = - IT.name + settings.cardTitleTemplate.template subtitlePattern = - IT.dateLong + settings.cardSubtitleTemplate.template in a [ class "content" diff --git a/modules/webapp/src/main/elm/Comp/UiSettingsForm.elm b/modules/webapp/src/main/elm/Comp/UiSettingsForm.elm index 940de6e6..ec46fa32 100644 --- a/modules/webapp/src/main/elm/Comp/UiSettingsForm.elm +++ b/modules/webapp/src/main/elm/Comp/UiSettingsForm.elm @@ -16,12 +16,15 @@ import Data.BasicSize exposing (BasicSize) import Data.Color exposing (Color) import Data.Fields exposing (Field) import Data.Flags exposing (Flags) -import Data.UiSettings exposing (Pos(..), UiSettings) +import Data.ItemTemplate as IT exposing (ItemTemplate) +import Data.UiSettings exposing (ItemPattern, Pos(..), UiSettings) import Dict exposing (Dict) import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onCheck) +import Html.Events exposing (onCheck, onClick, onInput) import Http +import Markdown +import Util.Maybe import Util.Tag @@ -45,6 +48,44 @@ type alias Model = , searchMenuVisible : Bool , editMenuVisible : Bool , cardPreviewSize : BasicSize + , cardTitlePattern : PatternModel + , cardSubtitlePattern : PatternModel + , showPatternHelp : Bool + } + + +type alias PatternModel = + { pattern : Maybe String + , current : ItemTemplate + , result : Result String ItemTemplate + } + + +initPatternModel : ItemPattern -> PatternModel +initPatternModel ip = + { pattern = Just ip.pattern + , current = ip.template + , result = Ok ip.template + } + + +updatePatternModel : PatternModel -> String -> PatternModel +updatePatternModel pm str = + let + result = + case IT.readTemplate str of + Just t -> + Ok t + + Nothing -> + Err "Template invalid, check for unclosed variables." + + p = + Util.Maybe.fromString str + in + { pattern = p + , current = Result.withDefault pm.current result + , result = result } @@ -97,6 +138,9 @@ init flags settings = , searchMenuVisible = settings.searchMenuVisible , editMenuVisible = settings.editMenuVisible , cardPreviewSize = settings.cardPreviewSize + , cardTitlePattern = initPatternModel settings.cardTitleTemplate + , cardSubtitlePattern = initPatternModel settings.cardSubtitleTemplate + , showPatternHelp = False } , Api.getTags flags "" GetTagsResp ) @@ -117,6 +161,9 @@ type Msg | ToggleSearchMenuVisible | ToggleEditMenuVisible | CardPreviewSizeMsg Comp.BasicSizeField.Msg + | SetCardTitlePattern String + | SetCardSubtitlePattern String + | TogglePatternHelpMsg @@ -319,6 +366,55 @@ update sett msg model = , newSettings ) + SetCardTitlePattern str -> + let + pm = + model.cardTitlePattern + + pm_ = + updatePatternModel pm str + + newSettings = + if pm_.pattern /= Just sett.cardTitleTemplate.pattern then + Just + { sett + | cardTitleTemplate = + ItemPattern + (Maybe.withDefault "" pm_.pattern) + pm_.current + } + + else + Nothing + in + ( { model | cardTitlePattern = pm_ }, newSettings ) + + SetCardSubtitlePattern str -> + let + pm = + model.cardSubtitlePattern + + pm_ = + updatePatternModel pm str + + newSettings = + if pm_.pattern /= Just sett.cardSubtitleTemplate.pattern then + Just + { sett + | cardSubtitleTemplate = + ItemPattern + (Maybe.withDefault "" pm_.pattern) + pm_.current + } + + else + Nothing + in + ( { model | cardSubtitlePattern = pm_ }, newSettings ) + + TogglePatternHelpMsg -> + ( { model | showPatternHelp = not model.showPatternHelp }, Nothing ) + --- View @@ -369,6 +465,51 @@ view flags _ model = "Size of item preview" model.cardPreviewSize ) + , div [ class "field" ] + [ label [] + [ text "Card Title Pattern" + , a + [ class "right-float" + , title "Toggle pattern help text" + , href "#" + , onClick TogglePatternHelpMsg + ] + [ i [ class "help link icon" ] [] + ] + ] + , input + [ type_ "text" + , Maybe.withDefault "" model.cardTitlePattern.pattern |> value + , onInput SetCardTitlePattern + ] + [] + ] + , div [ class "field" ] + [ label [] + [ text "Card Subtitle Pattern" + , a + [ class "right-float" + , title "Toggle pattern help text" + , href "#" + , onClick TogglePatternHelpMsg + ] + [ i [ class "help link icon" ] [] + ] + ] + , input + [ type_ "text" + , Maybe.withDefault "" model.cardSubtitlePattern.pattern |> value + , onInput SetCardSubtitlePattern + ] + [] + ] + , Markdown.toHtml + [ classList + [ ( "ui message", True ) + , ( "hidden", not model.showPatternHelp ) + ] + ] + IT.helpMessage , div [ class "ui dividing header" ] [ text "Search Menu" ] , div [ class "field" ] diff --git a/modules/webapp/src/main/elm/Data/UiSettings.elm b/modules/webapp/src/main/elm/Data/UiSettings.elm index 5a0bc13f..2db6b41b 100644 --- a/modules/webapp/src/main/elm/Data/UiSettings.elm +++ b/modules/webapp/src/main/elm/Data/UiSettings.elm @@ -1,5 +1,6 @@ module Data.UiSettings exposing - ( Pos(..) + ( ItemPattern + , Pos(..) , StoredUiSettings , UiSettings , cardPreviewSize @@ -21,6 +22,7 @@ import Api.Model.Tag exposing (Tag) import Data.BasicSize exposing (BasicSize) import Data.Color exposing (Color) import Data.Fields exposing (Field) +import Data.ItemTemplate exposing (ItemTemplate) import Dict exposing (Dict) import Html exposing (Attribute) import Html.Attributes as HA @@ -48,6 +50,8 @@ type alias StoredUiSettings = , searchMenuVisible : Bool , editMenuVisible : Bool , cardPreviewSize : Maybe String + , cardTitleTemplate : Maybe String + , cardSubtitleTemplate : Maybe String } @@ -72,9 +76,23 @@ type alias UiSettings = , searchMenuVisible : Bool , editMenuVisible : Bool , cardPreviewSize : BasicSize + , cardTitleTemplate : ItemPattern + , cardSubtitleTemplate : ItemPattern } +type alias ItemPattern = + { pattern : String + , template : ItemTemplate + } + + +readPattern : String -> Maybe ItemPattern +readPattern str = + Data.ItemTemplate.readTemplate str + |> Maybe.map (ItemPattern str) + + type Pos = Top | Bottom @@ -118,6 +136,14 @@ defaults = , searchMenuVisible = False , editMenuVisible = False , cardPreviewSize = Data.BasicSize.Medium + , cardTitleTemplate = + { template = Data.ItemTemplate.name + , pattern = "{{name}}" + } + , cardSubtitleTemplate = + { template = Data.ItemTemplate.dateLong + , pattern = "{{dateLong}}" + } } @@ -157,6 +183,12 @@ merge given fallback = given.cardPreviewSize |> Maybe.andThen Data.BasicSize.fromString |> Maybe.withDefault fallback.cardPreviewSize + , cardTitleTemplate = + Maybe.andThen readPattern given.cardTitleTemplate + |> Maybe.withDefault fallback.cardTitleTemplate + , cardSubtitleTemplate = + Maybe.andThen readPattern given.cardSubtitleTemplate + |> Maybe.withDefault fallback.cardSubtitleTemplate } @@ -187,6 +219,8 @@ toStoredUiSettings settings = settings.cardPreviewSize |> Data.BasicSize.asString |> Just + , cardTitleTemplate = settings.cardTitleTemplate.pattern |> Just + , cardSubtitleTemplate = settings.cardSubtitleTemplate.pattern |> Just }