mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-10-21 21:00:11 +00:00
The query now searches in more fields. For example, when getting a list of tags, the query is applied to the tag name *and* category. When listing persons, the query now also looks in the associated organization name. This has been used to make some headers in the meta data tables clickable to sort the list accordingly. Refs: #965, #538
255 lines
7.1 KiB
Elm
255 lines
7.1 KiB
Elm
{-
|
|
Copyright 2020 Docspell Contributors
|
|
|
|
SPDX-License-Identifier: GPL-3.0-or-later
|
|
-}
|
|
|
|
|
|
module Comp.ClassifierSettingsForm exposing
|
|
( Model
|
|
, Msg
|
|
, getSettings
|
|
, init
|
|
, update
|
|
, view2
|
|
)
|
|
|
|
import Api
|
|
import Api.Model.ClassifierSetting exposing (ClassifierSetting)
|
|
import Api.Model.TagList exposing (TagList)
|
|
import Comp.CalEventInput
|
|
import Comp.Dropdown
|
|
import Comp.FixedDropdown
|
|
import Comp.IntField
|
|
import Data.CalEvent exposing (CalEvent)
|
|
import Data.DropdownStyle as DS
|
|
import Data.Flags exposing (Flags)
|
|
import Data.ListType exposing (ListType)
|
|
import Data.TagOrder
|
|
import Data.UiSettings exposing (UiSettings)
|
|
import Html exposing (..)
|
|
import Html.Attributes exposing (..)
|
|
import Http
|
|
import Markdown
|
|
import Messages.Comp.ClassifierSettingsForm exposing (Texts)
|
|
import Styles as S
|
|
import Util.Tag
|
|
|
|
|
|
type alias Model =
|
|
{ scheduleModel : Comp.CalEventInput.Model
|
|
, schedule : Maybe CalEvent
|
|
, itemCountModel : Comp.IntField.Model
|
|
, itemCount : Maybe Int
|
|
, categoryListModel : Comp.Dropdown.Model String
|
|
, categoryListType : ListType
|
|
, categoryListTypeModel : Comp.FixedDropdown.Model ListType
|
|
}
|
|
|
|
|
|
type Msg
|
|
= ScheduleMsg Comp.CalEventInput.Msg
|
|
| ItemCountMsg Comp.IntField.Msg
|
|
| GetTagsResp (Result Http.Error TagList)
|
|
| CategoryListMsg (Comp.Dropdown.Msg String)
|
|
| CategoryListTypeMsg (Comp.FixedDropdown.Msg ListType)
|
|
|
|
|
|
init : Flags -> ClassifierSetting -> ( Model, Cmd Msg )
|
|
init flags sett =
|
|
let
|
|
newSchedule =
|
|
Data.CalEvent.fromEvent sett.schedule
|
|
|> Maybe.withDefault Data.CalEvent.everyMonth
|
|
|
|
( cem, cec ) =
|
|
Comp.CalEventInput.init flags newSchedule
|
|
in
|
|
( { scheduleModel = cem
|
|
, schedule = Just newSchedule
|
|
, itemCountModel = Comp.IntField.init (Just 0) Nothing True
|
|
, itemCount = Just sett.itemCount
|
|
, categoryListModel =
|
|
let
|
|
minit =
|
|
Comp.Dropdown.makeModel
|
|
{ multiple = True
|
|
, searchable = \n -> n > 0
|
|
}
|
|
|
|
lm =
|
|
Comp.Dropdown.SetSelection sett.categoryList
|
|
|
|
( m_, _ ) =
|
|
Comp.Dropdown.update lm minit
|
|
in
|
|
m_
|
|
, categoryListType =
|
|
Data.ListType.fromString sett.listType
|
|
|> Maybe.withDefault Data.ListType.Whitelist
|
|
, categoryListTypeModel =
|
|
Comp.FixedDropdown.init Data.ListType.all
|
|
}
|
|
, Cmd.batch
|
|
[ Api.getTags flags "" Data.TagOrder.NameAsc GetTagsResp
|
|
, Cmd.map ScheduleMsg cec
|
|
]
|
|
)
|
|
|
|
|
|
getSettings : Model -> Maybe ClassifierSetting
|
|
getSettings model =
|
|
Maybe.map
|
|
(\s ->
|
|
{ schedule =
|
|
Data.CalEvent.makeEvent s
|
|
, itemCount = Maybe.withDefault 0 model.itemCount
|
|
, listType = Data.ListType.toString model.categoryListType
|
|
, categoryList = Comp.Dropdown.getSelected model.categoryListModel
|
|
}
|
|
)
|
|
model.schedule
|
|
|
|
|
|
update : Flags -> Msg -> Model -> ( Model, Cmd Msg )
|
|
update flags msg model =
|
|
case msg of
|
|
GetTagsResp (Ok tl) ->
|
|
let
|
|
categories =
|
|
Util.Tag.getCategories tl.items
|
|
|> List.sort
|
|
|
|
lm =
|
|
Comp.Dropdown.SetOptions categories
|
|
in
|
|
update flags (CategoryListMsg lm) model
|
|
|
|
GetTagsResp (Err _) ->
|
|
( model, Cmd.none )
|
|
|
|
ScheduleMsg lmsg ->
|
|
let
|
|
( cm, cc, ce ) =
|
|
Comp.CalEventInput.update
|
|
flags
|
|
model.schedule
|
|
lmsg
|
|
model.scheduleModel
|
|
in
|
|
( { model
|
|
| scheduleModel = cm
|
|
, schedule = ce
|
|
}
|
|
, Cmd.map ScheduleMsg cc
|
|
)
|
|
|
|
ItemCountMsg lmsg ->
|
|
let
|
|
( im, iv ) =
|
|
Comp.IntField.update lmsg model.itemCountModel
|
|
in
|
|
( { model
|
|
| itemCountModel = im
|
|
, itemCount = iv
|
|
}
|
|
, Cmd.none
|
|
)
|
|
|
|
CategoryListMsg lm ->
|
|
let
|
|
( m_, cmd_ ) =
|
|
Comp.Dropdown.update lm model.categoryListModel
|
|
in
|
|
( { model | categoryListModel = m_ }
|
|
, Cmd.map CategoryListMsg cmd_
|
|
)
|
|
|
|
CategoryListTypeMsg lm ->
|
|
let
|
|
( m_, sel ) =
|
|
Comp.FixedDropdown.update lm model.categoryListTypeModel
|
|
|
|
newListType =
|
|
Maybe.withDefault model.categoryListType sel
|
|
in
|
|
( { model
|
|
| categoryListTypeModel = m_
|
|
, categoryListType = newListType
|
|
}
|
|
, Cmd.none
|
|
)
|
|
|
|
|
|
|
|
--- View2
|
|
|
|
|
|
view2 : Texts -> UiSettings -> Model -> Html Msg
|
|
view2 texts settings model =
|
|
let
|
|
categoryCfg =
|
|
{ makeOption = \s -> { text = s, additional = "" }
|
|
, labelColor = \_ -> \_ -> "grey "
|
|
, placeholder = "Choose categories …"
|
|
, style = DS.mainStyle
|
|
}
|
|
|
|
catListCfg =
|
|
{ display = Data.ListType.label
|
|
, icon = \_ -> Nothing
|
|
, style = DS.mainStyle
|
|
, selectPlaceholder = texts.basics.selectPlaceholder
|
|
}
|
|
in
|
|
div []
|
|
[ Markdown.toHtml [ class "px-2 py-2 opacity-75" ]
|
|
texts.autoTaggingText
|
|
, div [ class "mb-4" ]
|
|
[ label [ class S.inputLabel ]
|
|
[ text texts.blacklistOrWhitelist ]
|
|
, Html.map CategoryListTypeMsg
|
|
(Comp.FixedDropdown.viewStyled2 catListCfg
|
|
False
|
|
(Just model.categoryListType)
|
|
model.categoryListTypeModel
|
|
)
|
|
]
|
|
, div [ class "mb-4" ]
|
|
[ label [ class S.inputLabel ]
|
|
[ case model.categoryListType of
|
|
Data.ListType.Whitelist ->
|
|
text texts.whitelistLabel
|
|
|
|
Data.ListType.Blacklist ->
|
|
text texts.blacklistLabel
|
|
]
|
|
, Html.map CategoryListMsg
|
|
(Comp.Dropdown.view2
|
|
categoryCfg
|
|
settings
|
|
model.categoryListModel
|
|
)
|
|
]
|
|
, Html.map ItemCountMsg
|
|
(Comp.IntField.view
|
|
{ label = texts.itemCount
|
|
, info = texts.itemCountHelp
|
|
, classes = "mb-4"
|
|
, number = model.itemCount
|
|
}
|
|
model.itemCountModel
|
|
)
|
|
, div [ class "mb-4" ]
|
|
[ label [ class S.inputLabel ]
|
|
[ text texts.schedule ]
|
|
, Html.map ScheduleMsg
|
|
(Comp.CalEventInput.view2
|
|
texts.calEventInput
|
|
""
|
|
model.schedule
|
|
model.scheduleModel
|
|
)
|
|
]
|
|
]
|