mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-06-06 07:05:59 +00:00
Allow to filter tags/categories in search menu
This commit is contained in:
parent
098e4cf868
commit
57c1144f40
@ -7,9 +7,7 @@ module Comp.TagSelect exposing
|
|||||||
, init
|
, init
|
||||||
, update
|
, update
|
||||||
, updateDrop
|
, updateDrop
|
||||||
, view
|
|
||||||
, viewCats
|
, viewCats
|
||||||
, viewDrop
|
|
||||||
, viewTags
|
, viewTags
|
||||||
, viewTagsDrop
|
, viewTagsDrop
|
||||||
)
|
)
|
||||||
@ -20,14 +18,18 @@ import Data.UiSettings exposing (UiSettings)
|
|||||||
import Dict exposing (Dict)
|
import Dict exposing (Dict)
|
||||||
import Html exposing (..)
|
import Html exposing (..)
|
||||||
import Html.Attributes exposing (..)
|
import Html.Attributes exposing (..)
|
||||||
import Html.Events exposing (onClick)
|
import Html.Events exposing (onClick, onInput)
|
||||||
|
import Simple.Fuzzy
|
||||||
import Util.ExpandCollapse
|
import Util.ExpandCollapse
|
||||||
import Util.ItemDragDrop as DD
|
import Util.ItemDragDrop as DD
|
||||||
|
import Util.String as S
|
||||||
|
|
||||||
|
|
||||||
type alias Model =
|
type alias Model =
|
||||||
{ all : List TagCount
|
{ all : List TagCount
|
||||||
|
, filteredTags : List TagCount
|
||||||
, categories : List Category
|
, categories : List Category
|
||||||
|
, filteredCats : List Category
|
||||||
, selectedTags : Dict String Bool
|
, selectedTags : Dict String Bool
|
||||||
, selectedCats : Dict String Bool
|
, selectedCats : Dict String Bool
|
||||||
, expandedTags : Bool
|
, expandedTags : Bool
|
||||||
@ -58,9 +60,14 @@ init sel tags =
|
|||||||
selCat =
|
selCat =
|
||||||
constDict .name True sel.includeCats
|
constDict .name True sel.includeCats
|
||||||
|> Dict.union (constDict .name False sel.excludeCats)
|
|> Dict.union (constDict .name False sel.excludeCats)
|
||||||
|
|
||||||
|
cats =
|
||||||
|
sumCategories tags
|
||||||
in
|
in
|
||||||
{ all = tags
|
{ all = tags
|
||||||
, categories = sumCategories tags
|
, filteredTags = tags
|
||||||
|
, categories = cats
|
||||||
|
, filteredCats = cats
|
||||||
, selectedTags = selTag
|
, selectedTags = selTag
|
||||||
, selectedCats = selCat
|
, selectedCats = selCat
|
||||||
, expandedTags = False
|
, expandedTags = False
|
||||||
@ -102,6 +109,7 @@ type Msg
|
|||||||
| ToggleExpandTags
|
| ToggleExpandTags
|
||||||
| ToggleExpandCats
|
| ToggleExpandCats
|
||||||
| TagDDMsg DD.Msg
|
| TagDDMsg DD.Msg
|
||||||
|
| Search String
|
||||||
|
|
||||||
|
|
||||||
type alias Selection =
|
type alias Selection =
|
||||||
@ -168,6 +176,32 @@ updateDrop ddm msg model =
|
|||||||
in
|
in
|
||||||
( model, getSelection model, ddd )
|
( model, getSelection model, ddd )
|
||||||
|
|
||||||
|
Search str ->
|
||||||
|
let
|
||||||
|
forTags t =
|
||||||
|
Simple.Fuzzy.match str t.tag.name
|
||||||
|
|
||||||
|
forCats c =
|
||||||
|
Simple.Fuzzy.match str c.name
|
||||||
|
in
|
||||||
|
( { model
|
||||||
|
| filteredTags =
|
||||||
|
if S.isBlank str then
|
||||||
|
model.all
|
||||||
|
|
||||||
|
else
|
||||||
|
List.filter forTags model.all
|
||||||
|
, filteredCats =
|
||||||
|
if S.isBlank str then
|
||||||
|
model.categories
|
||||||
|
|
||||||
|
else
|
||||||
|
List.filter forCats model.categories
|
||||||
|
}
|
||||||
|
, getSelection model
|
||||||
|
, DD.DragDropData ddm Nothing
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
updateSelection : String -> Dict String Bool -> Dict String Bool
|
updateSelection : String -> Dict String Bool -> Dict String Bool
|
||||||
updateSelection id selected =
|
updateSelection id selected =
|
||||||
@ -261,6 +295,15 @@ viewTagsDrop ddm settings model =
|
|||||||
, div [ class "content" ]
|
, div [ class "content" ]
|
||||||
[ div [ class "header" ]
|
[ div [ class "header" ]
|
||||||
[ text "Tags"
|
[ text "Tags"
|
||||||
|
, div [ class "ui small transparent icon right floated input width-70" ]
|
||||||
|
[ input
|
||||||
|
[ type_ "text"
|
||||||
|
, placeholder "Filter …"
|
||||||
|
, onInput Search
|
||||||
|
]
|
||||||
|
[]
|
||||||
|
, i [ class "search icon" ] []
|
||||||
|
]
|
||||||
]
|
]
|
||||||
, div [ class "ui relaxed list" ]
|
, div [ class "ui relaxed list" ]
|
||||||
(renderTagItems ddm settings model)
|
(renderTagItems ddm settings model)
|
||||||
@ -285,42 +328,11 @@ viewCats settings model =
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
view : UiSettings -> Model -> Html Msg
|
|
||||||
view =
|
|
||||||
viewDrop DD.init
|
|
||||||
|
|
||||||
|
|
||||||
viewDrop : DD.Model -> UiSettings -> Model -> Html Msg
|
|
||||||
viewDrop ddm settings model =
|
|
||||||
div [ class "ui list" ]
|
|
||||||
[ div [ class "item" ]
|
|
||||||
[ I.tagIcon ""
|
|
||||||
, div [ class "content" ]
|
|
||||||
[ div [ class "header" ]
|
|
||||||
[ text "Tags"
|
|
||||||
]
|
|
||||||
, div [ class "ui relaxed list" ]
|
|
||||||
(renderTagItems ddm settings model)
|
|
||||||
]
|
|
||||||
]
|
|
||||||
, div [ class "item" ]
|
|
||||||
[ I.tagsIcon ""
|
|
||||||
, div [ class "content" ]
|
|
||||||
[ div [ class "header" ]
|
|
||||||
[ text "Categories"
|
|
||||||
]
|
|
||||||
, div [ class "ui relaxed list" ]
|
|
||||||
(renderCatItems settings model)
|
|
||||||
]
|
|
||||||
]
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
renderTagItems : DD.Model -> UiSettings -> Model -> List (Html Msg)
|
renderTagItems : DD.Model -> UiSettings -> Model -> List (Html Msg)
|
||||||
renderTagItems ddm settings model =
|
renderTagItems ddm settings model =
|
||||||
let
|
let
|
||||||
tags =
|
tags =
|
||||||
model.all
|
model.filteredTags
|
||||||
|
|
||||||
max =
|
max =
|
||||||
settings.searchMenuTagCount
|
settings.searchMenuTagCount
|
||||||
@ -338,20 +350,20 @@ renderTagItems ddm settings model =
|
|||||||
ToggleExpandTags
|
ToggleExpandTags
|
||||||
in
|
in
|
||||||
if max <= 0 then
|
if max <= 0 then
|
||||||
List.map (viewTagItem ddm settings model) model.all
|
List.map (viewTagItem ddm settings model) tags
|
||||||
|
|
||||||
else if model.expandedTags then
|
else if model.expandedTags then
|
||||||
List.map (viewTagItem ddm settings model) model.all ++ cps
|
List.map (viewTagItem ddm settings model) tags ++ cps
|
||||||
|
|
||||||
else
|
else
|
||||||
List.map (viewTagItem ddm settings model) (List.take max model.all) ++ exp
|
List.map (viewTagItem ddm settings model) (List.take max tags) ++ exp
|
||||||
|
|
||||||
|
|
||||||
renderCatItems : UiSettings -> Model -> List (Html Msg)
|
renderCatItems : UiSettings -> Model -> List (Html Msg)
|
||||||
renderCatItems settings model =
|
renderCatItems settings model =
|
||||||
let
|
let
|
||||||
cats =
|
cats =
|
||||||
model.categories
|
model.filteredCats
|
||||||
|
|
||||||
max =
|
max =
|
||||||
settings.searchMenuTagCatCount
|
settings.searchMenuTagCatCount
|
||||||
@ -369,13 +381,13 @@ renderCatItems settings model =
|
|||||||
ToggleExpandCats
|
ToggleExpandCats
|
||||||
in
|
in
|
||||||
if max <= 0 then
|
if max <= 0 then
|
||||||
List.map (viewCategoryItem settings model) model.categories
|
List.map (viewCategoryItem settings model) cats
|
||||||
|
|
||||||
else if model.expandedCats then
|
else if model.expandedCats then
|
||||||
List.map (viewCategoryItem settings model) model.categories ++ cps
|
List.map (viewCategoryItem settings model) cats ++ cps
|
||||||
|
|
||||||
else
|
else
|
||||||
List.map (viewCategoryItem settings model) (List.take max model.categories) ++ exp
|
List.map (viewCategoryItem settings model) (List.take max cats) ++ exp
|
||||||
|
|
||||||
|
|
||||||
viewCategoryItem : UiSettings -> Model -> Category -> Html Msg
|
viewCategoryItem : UiSettings -> Model -> Category -> Html Msg
|
||||||
|
@ -189,6 +189,10 @@ label span.muted {
|
|||||||
margin-left: 0.5em;
|
margin-left: 0.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.width-70 {
|
||||||
|
width: 70%;
|
||||||
|
}
|
||||||
|
|
||||||
.ui.search.dropdown.open, .ui.selection.dropdown.open {
|
.ui.search.dropdown.open, .ui.selection.dropdown.open {
|
||||||
z-index: 20;
|
z-index: 20;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user