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 = []