Add selection to search menu

This commit is contained in:
eikek
2022-02-27 19:47:16 +01:00
parent 63e0258db7
commit adcfe10460
9 changed files with 280 additions and 99 deletions

View File

@@ -19,6 +19,7 @@ module Comp.SearchMenu exposing
, linkTargetMsg
, refreshBookmarks
, setFromStats
, setIncludeSelection
, textSearchString
, update
, updateDrop
@@ -52,6 +53,7 @@ import Data.EquipmentOrder
import Data.EquipmentUse
import Data.Fields
import Data.Flags exposing (Flags)
import Data.ItemIds exposing (ItemIdChange, ItemIds)
import Data.ItemQuery as Q exposing (ItemQuery)
import Data.PersonOrder
import Data.PersonUse
@@ -102,6 +104,7 @@ type alias Model =
, sourceModel : Maybe String
, allBookmarks : Comp.BookmarkChooser.Model
, selectedBookmarks : Comp.BookmarkChooser.Selection
, includeSelection : Bool
, openTabs : Set String
, searchMode : SearchMode
}
@@ -149,6 +152,7 @@ init flags =
, sourceModel = Nothing
, allBookmarks = Comp.BookmarkChooser.init Data.Bookmarks.empty
, selectedBookmarks = Comp.BookmarkChooser.emptySelection
, includeSelection = False
, openTabs = Set.fromList [ "Tags", "Inbox" ]
, searchMode = Data.SearchMode.Normal
}
@@ -222,8 +226,8 @@ isNamesSearch model =
True
getItemQuery : Model -> Maybe ItemQuery
getItemQuery model =
getItemQuery : ItemIds -> Model -> Maybe ItemQuery
getItemQuery selectedItems model =
let
when flag body =
if flag then
@@ -258,6 +262,11 @@ getItemQuery model =
in
Q.and
[ when model.inboxCheckbox (Q.Inbox True)
, if model.includeSelection then
Data.ItemIds.toQuery selectedItems
else
Nothing
, whenNotEmpty (model.tagSelection.includeTags |> Set.toList)
(Q.TagIds Q.AllMatch)
, whenNotEmpty (model.tagSelection.excludeTags |> Set.toList)
@@ -347,6 +356,7 @@ resetModel model =
, customValues = Data.CustomFieldChange.emptyCollect
, sourceModel = Nothing
, selectedBookmarks = Comp.BookmarkChooser.emptySelection
, includeSelection = False
, searchMode = Data.SearchMode.Normal
}
@@ -397,6 +407,8 @@ type Msg
| ToggleOpenAllAkkordionTabs
| AllBookmarksResp (Result Http.Error AllBookmarks)
| SelectBookmarkMsg Comp.BookmarkChooser.Msg
| SetIncludeSelection Bool
| ClearSelection
setFromStats : SearchStats -> Msg
@@ -409,6 +421,11 @@ initFromStats stats =
GetAllTagsResp (Ok stats)
setIncludeSelection : Bool -> Msg
setIncludeSelection flag =
SetIncludeSelection flag
linkTargetMsg : LinkTarget -> Maybe Msg
linkTargetMsg linkTarget =
case linkTarget of
@@ -449,6 +466,7 @@ type alias NextState =
, sub : Sub Msg
, stateChange : Bool
, dragDrop : DD.DragDropData
, selectionChange : ItemIdChange
}
@@ -483,6 +501,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = True
, dragDrop = set.dragDrop
, selectionChange = Data.ItemIds.noChange
}
in
case msg of
@@ -525,6 +544,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = False
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
ResetForm ->
@@ -533,6 +553,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = True
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
SetCorrOrg id ->
@@ -555,6 +576,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = False
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
SetConcEquip id ->
@@ -586,6 +608,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = sel /= model.selectedBookmarks
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
GetAllTagsResp (Ok stats) ->
@@ -600,6 +623,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = False
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
GetAllTagsResp (Err _) ->
@@ -608,6 +632,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = False
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
GetStatsResp (Ok stats) ->
@@ -676,6 +701,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = False
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
GetStatsResp (Err _) ->
@@ -684,6 +710,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = False
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
GetEquipResp (Ok equips) ->
@@ -699,6 +726,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = False
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
GetOrgResp (Ok orgs) ->
@@ -714,6 +742,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = False
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
GetPersonResp (Ok ps) ->
@@ -749,6 +778,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = False
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
TagSelectMsg m ->
@@ -765,6 +795,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = sel /= model.tagSelection
, dragDrop = ddd
, selectionChange = Data.ItemIds.noChange
}
DirectionMsg m ->
@@ -777,6 +808,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = isDropdownChangeMsg m
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
OrgMsg m ->
@@ -789,6 +821,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = isDropdownChangeMsg m
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
CorrPersonMsg m ->
@@ -801,6 +834,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = isDropdownChangeMsg m
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
ConcPersonMsg m ->
@@ -813,6 +847,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = isDropdownChangeMsg m
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
ConcEquipmentMsg m ->
@@ -825,6 +860,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = isDropdownChangeMsg m
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
ToggleInbox ->
@@ -837,6 +873,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = True
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
ToggleSearchMode ->
@@ -856,6 +893,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = True
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
FromDateMsg m ->
@@ -876,6 +914,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = model.fromDate /= nextDate
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
UntilDateMsg m ->
@@ -896,6 +935,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = model.untilDate /= nextDate
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
FromDueDateMsg m ->
@@ -916,6 +956,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = model.fromDueDate /= nextDate
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
UntilDueDateMsg m ->
@@ -936,6 +977,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = model.untilDueDate /= nextDate
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
SetName str ->
@@ -948,6 +990,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = False
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
SetTextSearch str ->
@@ -956,6 +999,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = False
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
SwapTextSearch ->
@@ -965,6 +1009,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = False
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
else
@@ -973,6 +1018,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = False
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
SetFulltextSearch ->
@@ -983,6 +1029,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = False
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
Names s ->
@@ -991,6 +1038,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = False
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
SetNamesSearch ->
@@ -1001,6 +1049,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = False
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
Names _ ->
@@ -1009,6 +1058,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = False
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
KeyUpMsg (Just Enter) ->
@@ -1017,6 +1067,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = True
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
KeyUpMsg _ ->
@@ -1025,6 +1076,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = False
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
FolderSelectMsg lm ->
@@ -1041,6 +1093,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = model.selectedFolder /= sel
, dragDrop = ddd
, selectionChange = Data.ItemIds.noChange
}
CustomFieldMsg lm ->
@@ -1058,6 +1111,7 @@ updateDrop ddm flags settings msg model =
, stateChange =
Data.CustomFieldChange.isValueChange res.result
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
SetCustomField cv ->
@@ -1086,6 +1140,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = False
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
ResetToSource str ->
@@ -1105,6 +1160,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = False
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
ToggleOpenAllAkkordionTabs ->
@@ -1125,6 +1181,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = False
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
AllBookmarksResp (Ok bm) ->
@@ -1133,6 +1190,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = model.allBookmarks /= Comp.BookmarkChooser.init bm
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
AllBookmarksResp (Err _) ->
@@ -1141,6 +1199,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = False
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
SelectBookmarkMsg lm ->
@@ -1153,6 +1212,26 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none
, stateChange = sel /= model.selectedBookmarks || model.allBookmarks /= next
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
SetIncludeSelection flag ->
{ model =
{ model | includeSelection = flag }
, cmd = Cmd.none
, sub = Sub.none
, stateChange = True
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
ClearSelection ->
{ model = { model | includeSelection = False }
, cmd = Cmd.none
, sub = Sub.none
, stateChange = True
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.clearAll
}
@@ -1162,6 +1241,7 @@ updateDrop ddm flags settings msg model =
type alias ViewConfig =
{ overrideTabLook : SearchTab -> Comp.Tabs.Look -> Comp.Tabs.Look
, selectedItems : ItemIds
}
@@ -1174,7 +1254,7 @@ viewDrop2 texts ddd flags cfg settings model =
Comp.Tabs.akkordion
akkordionStyle
(searchTabState settings cfg model)
(searchTabs texts ddd flags settings model)
(searchTabs texts ddd flags settings cfg.selectedItems model)
type SearchTab
@@ -1191,6 +1271,7 @@ type SearchTab
| TabSource
| TabDirection
| TabTrashed
| TabSelection
allTabs : List SearchTab
@@ -1208,6 +1289,7 @@ allTabs =
, TabSource
, TabDirection
, TabTrashed
, TabSelection
]
@@ -1253,6 +1335,9 @@ tabName tab =
TabTrashed ->
"trashed"
TabSelection ->
"selection"
findTab : Comp.Tabs.Tab msg -> Maybe SearchTab
findTab tab =
@@ -1296,12 +1381,15 @@ findTab tab =
"trashed" ->
Just TabTrashed
"selection" ->
Just TabSelection
_ ->
Nothing
tabLook : UiSettings -> Model -> SearchTab -> Comp.Tabs.Look
tabLook settings model tab =
tabLook : UiSettings -> ItemIds -> Model -> SearchTab -> Comp.Tabs.Look
tabLook settings selectedItems model tab =
let
isHidden f =
Data.UiSettings.fieldHidden settings f
@@ -1396,6 +1484,16 @@ tabLook settings model tab =
TabTrashed ->
activeWhen (model.searchMode == Data.SearchMode.Trashed)
TabSelection ->
if Data.ItemIds.isEmpty selectedItems then
Comp.Tabs.Hidden
else if model.includeSelection then
Comp.Tabs.Active
else
Comp.Tabs.Normal
_ ->
Comp.Tabs.Normal
@@ -1416,15 +1514,15 @@ searchTabState settings cfg model tab =
state =
{ folded = folded
, look =
Maybe.map (\t -> tabLook settings model t |> cfg.overrideTabLook t) searchTab
Maybe.map (\t -> tabLook settings cfg.selectedItems model t |> cfg.overrideTabLook t) searchTab
|> Maybe.withDefault Comp.Tabs.Normal
}
in
( state, ToggleAkkordionTab tab.name )
searchTabs : Texts -> DD.DragDropData -> Flags -> UiSettings -> Model -> List (Comp.Tabs.Tab Msg)
searchTabs texts ddd flags settings model =
searchTabs : Texts -> DD.DragDropData -> Flags -> UiSettings -> ItemIds -> Model -> List (Comp.Tabs.Tab Msg)
searchTabs texts ddd flags settings selectedItems model =
let
isHidden f =
Data.UiSettings.fieldHidden settings f
@@ -1477,6 +1575,40 @@ searchTabs texts ddd flags settings model =
(Comp.BookmarkChooser.view texts.bookmarkChooser model.allBookmarks model.selectedBookmarks)
]
}
, { name = tabName TabSelection
, title = texts.selection
, titleRight =
[ span [ class "flex items-center rounded-full bg-blue-100 dark:bg-sky-600 text-xs px-2 py-0.5 " ]
[ text (String.fromInt (Data.ItemIds.size selectedItems)) ]
]
, info = Nothing
, body =
[ div [ class "flex flex-col ml-1" ]
[ a
[ class "flex flex-row items-center"
, class "rounded px-1 py-1 hover:bg-blue-100 dark:hover:bg-slate-600"
, href "#"
, Html.Events.onClick (SetIncludeSelection (not model.includeSelection))
]
[ if model.includeSelection then
i [ class "fa fa-check mr-2" ] []
else
i [ class "fa fa-list mr-2" ] []
, text "Show selection"
]
, a
[ class "flex flex-row items-center"
, class "rounded px-1 py-1 hover:bg-blue-100 dark:hover:bg-slate-600"
, href "#"
, Html.Events.onClick ClearSelection
]
[ i [ class "fa fa-times mr-2" ] []
, text "Clear selection"
]
]
]
}
, { name = tabName TabTags
, title = texts.basics.tags
, titleRight = []