From 63e0258db7c8ce24f16e177370c08f63cd5999cc Mon Sep 17 00:00:00 2001 From: eikek Date: Sun, 27 Feb 2022 15:00:34 +0100 Subject: [PATCH] Store item selection globally --- modules/webapp/src/main/elm/Api.elm | 20 +- modules/webapp/src/main/elm/App/Data.elm | 3 + modules/webapp/src/main/elm/App/Update.elm | 13 +- modules/webapp/src/main/elm/App/View2.elm | 15 +- modules/webapp/src/main/elm/Comp/ItemCard.elm | 25 +- .../webapp/src/main/elm/Comp/ItemCardList.elm | 11 +- .../main/elm/Comp/ItemDetail/FormChange.elm | 10 +- .../webapp/src/main/elm/Data/Environment.elm | 31 ++ modules/webapp/src/main/elm/Data/ItemIds.elm | 132 ++++++ .../src/main/elm/Data/ItemSelection.elm | 6 +- .../webapp/src/main/elm/Page/Search/Data.elm | 6 +- .../src/main/elm/Page/Search/Update.elm | 429 ++++++++---------- .../webapp/src/main/elm/Page/Search/View2.elm | 68 +-- 13 files changed, 458 insertions(+), 311 deletions(-) create mode 100644 modules/webapp/src/main/elm/Data/Environment.elm create mode 100644 modules/webapp/src/main/elm/Data/ItemIds.elm diff --git a/modules/webapp/src/main/elm/Api.elm b/modules/webapp/src/main/elm/Api.elm index 9489e8aa..13249814 100644 --- a/modules/webapp/src/main/elm/Api.elm +++ b/modules/webapp/src/main/elm/Api.elm @@ -1727,42 +1727,42 @@ mergeItems flags items receive = reprocessMultiple : Flags - -> Set String + -> List String -> (Result Http.Error BasicResult -> msg) -> Cmd msg reprocessMultiple flags items receive = Http2.authPost { url = flags.config.baseUrl ++ "/api/v1/sec/items/reprocess" , account = getAccount flags - , body = Http.jsonBody (Api.Model.IdList.encode (Set.toList items |> IdList)) + , body = Http.jsonBody (Api.Model.IdList.encode (IdList items)) , expect = Http.expectJson receive Api.Model.BasicResult.decoder } confirmMultiple : Flags - -> Set String + -> List String -> (Result Http.Error BasicResult -> msg) -> Cmd msg confirmMultiple flags ids receive = Http2.authPut { url = flags.config.baseUrl ++ "/api/v1/sec/items/confirm" , account = getAccount flags - , body = Http.jsonBody (Api.Model.IdList.encode (IdList (Set.toList ids))) + , body = Http.jsonBody (Api.Model.IdList.encode (IdList ids)) , expect = Http.expectJson receive Api.Model.BasicResult.decoder } unconfirmMultiple : Flags - -> Set String + -> List String -> (Result Http.Error BasicResult -> msg) -> Cmd msg unconfirmMultiple flags ids receive = Http2.authPut { url = flags.config.baseUrl ++ "/api/v1/sec/items/unconfirm" , account = getAccount flags - , body = Http.jsonBody (Api.Model.IdList.encode (IdList (Set.toList ids))) + , body = Http.jsonBody (Api.Model.IdList.encode (IdList ids)) , expect = Http.expectJson receive Api.Model.BasicResult.decoder } @@ -1937,28 +1937,28 @@ setConcEquipmentMultiple flags data receive = deleteAllItems : Flags - -> Set String + -> List String -> (Result Http.Error BasicResult -> msg) -> Cmd msg deleteAllItems flags ids receive = Http2.authPost { url = flags.config.baseUrl ++ "/api/v1/sec/items/deleteAll" , account = getAccount flags - , body = Http.jsonBody (Api.Model.IdList.encode (IdList (Set.toList ids))) + , body = Http.jsonBody (Api.Model.IdList.encode (IdList ids)) , expect = Http.expectJson receive Api.Model.BasicResult.decoder } restoreAllItems : Flags - -> Set String + -> List String -> (Result Http.Error BasicResult -> msg) -> Cmd msg restoreAllItems flags ids receive = Http2.authPost { url = flags.config.baseUrl ++ "/api/v1/sec/items/restoreAll" , account = getAccount flags - , body = Http.jsonBody (Api.Model.IdList.encode (IdList (Set.toList ids))) + , body = Http.jsonBody (Api.Model.IdList.encode (IdList ids)) , expect = Http.expectJson receive Api.Model.BasicResult.decoder } diff --git a/modules/webapp/src/main/elm/App/Data.elm b/modules/webapp/src/main/elm/App/Data.elm index ca2b362c..83cb0854 100644 --- a/modules/webapp/src/main/elm/App/Data.elm +++ b/modules/webapp/src/main/elm/App/Data.elm @@ -19,6 +19,7 @@ import Api.Model.VersionInfo exposing (VersionInfo) import Browser exposing (UrlRequest) import Browser.Navigation exposing (Key) import Data.Flags exposing (Flags) +import Data.ItemIds exposing (ItemIds) import Data.ServerEvent exposing (ServerEvent) import Data.UiSettings exposing (UiSettings) import Data.UiTheme exposing (UiTheme) @@ -69,6 +70,7 @@ type alias Model = , langMenuOpen : Bool , showNewItemsArrived : Bool , jobsWaiting : Int + , selectedItems : ItemIds } @@ -133,6 +135,7 @@ init key url flags_ settings = , langMenuOpen = False , showNewItemsArrived = False , jobsWaiting = 0 + , selectedItems = Data.ItemIds.empty } , Cmd.batch [ Cmd.map DashboardMsg dbc diff --git a/modules/webapp/src/main/elm/App/Update.elm b/modules/webapp/src/main/elm/App/Update.elm index 6da2ac12..96b0d98e 100644 --- a/modules/webapp/src/main/elm/App/Update.elm +++ b/modules/webapp/src/main/elm/App/Update.elm @@ -584,11 +584,20 @@ updateSearch texts lmsg model = _ -> ( Nothing, Nothing ) + env = + { bookmarkId = bmId + , lastViewedItemId = mid + , key = model.key + , selectedItems = model.selectedItems + , flags = model.flags + , settings = model.uiSettings + } + result = - Page.Search.Update.update bmId mid model.key model.flags texts.search model.uiSettings lmsg model.searchModel + Page.Search.Update.update texts.search env lmsg model.searchModel model_ = - { model | searchModel = result.model } + { model | searchModel = result.model, selectedItems = result.selectedItems } lc = case result.appEvent of diff --git a/modules/webapp/src/main/elm/App/View2.elm b/modules/webapp/src/main/elm/App/View2.elm index 09e7697d..de2dc8ac 100644 --- a/modules/webapp/src/main/elm/App/View2.elm +++ b/modules/webapp/src/main/elm/App/View2.elm @@ -549,17 +549,22 @@ viewShareDetail texts shareId itemId model = viewSearch : Messages -> Maybe String -> Model -> List (Html Msg) viewSearch texts bmId model = + let + env = + { sidebarVisible = model.sidebarVisible + , flags = model.flags + , settings = model.uiSettings + , selectedItems = model.selectedItems + } + in [ Html.map SearchMsg (Search.viewSidebar texts.search - model.sidebarVisible - model.flags - model.uiSettings + env model.searchModel ) , Html.map SearchMsg (Search.viewContent texts.search - model.flags - model.uiSettings + env model.searchModel ) ] diff --git a/modules/webapp/src/main/elm/Comp/ItemCard.elm b/modules/webapp/src/main/elm/Comp/ItemCard.elm index 0af6039e..d3369257 100644 --- a/modules/webapp/src/main/elm/Comp/ItemCard.elm +++ b/modules/webapp/src/main/elm/Comp/ItemCard.elm @@ -24,6 +24,7 @@ import Data.Fields import Data.Flags exposing (Flags) import Data.Icons as Icons import Data.ItemArrange exposing (ItemArrange) +import Data.ItemIds exposing (ItemIdChange, ItemIds) import Data.ItemSelection exposing (ItemSelection) import Data.ItemTemplate as IT import Data.UiSettings exposing (UiSettings) @@ -49,7 +50,7 @@ type alias Model = type Msg = CyclePreview ItemLight - | ToggleSelectItem (Set String) String + | ToggleSelectItem ItemIds String | ItemDDMsg DD.Msg | SetLinkTarget LinkTarget | ToggleRowOpen String @@ -70,7 +71,7 @@ type alias ViewConfig = type alias UpdateResult = { model : Model , dragModel : DD.Model - , selection : ItemSelection + , selection : ItemIdChange , linkTarget : LinkTarget , toggleRow : Maybe String } @@ -117,25 +118,21 @@ update : DD.Model -> Msg -> Model -> UpdateResult update ddm msg model = case msg of ToggleRowOpen id -> - UpdateResult model ddm Data.ItemSelection.Inactive LinkNone (Just id) + UpdateResult model ddm Data.ItemIds.noChange LinkNone (Just id) ItemDDMsg lm -> let ddd = DD.update lm ddm in - UpdateResult model ddd.model Data.ItemSelection.Inactive LinkNone Nothing + UpdateResult model ddd.model Data.ItemIds.noChange LinkNone Nothing ToggleSelectItem ids id -> let newSet = - if Set.member id ids then - Set.remove id ids - - else - Set.insert id ids + Data.ItemIds.toggle ids id in - UpdateResult model ddm (Data.ItemSelection.Active newSet) LinkNone Nothing + UpdateResult model ddm newSet LinkNone Nothing CyclePreview item -> let @@ -147,12 +144,12 @@ update ddm msg model = in UpdateResult { model | previewAttach = next } ddm - Data.ItemSelection.Inactive + Data.ItemIds.noChange LinkNone Nothing SetLinkTarget target -> - UpdateResult model ddm Data.ItemSelection.Inactive target Nothing + UpdateResult model ddm Data.ItemIds.noChange target Nothing @@ -532,7 +529,7 @@ viewCard texts cfg settings flags model item = mkCardAction : Texts -> ViewConfig -> UiSettings -> ItemLight -> List (Attribute Msg) -mkCardAction texts cfg settings item = +mkCardAction texts cfg _ item = case cfg.selection of Data.ItemSelection.Inactive -> case cfg.arrange of @@ -977,7 +974,7 @@ isSelected : ViewConfig -> String -> Bool isSelected cfg id = case cfg.selection of Data.ItemSelection.Active ids -> - Set.member id ids + Data.ItemIds.isMember ids id Data.ItemSelection.Inactive -> False diff --git a/modules/webapp/src/main/elm/Comp/ItemCardList.elm b/modules/webapp/src/main/elm/Comp/ItemCardList.elm index 7d37664a..a5577054 100644 --- a/modules/webapp/src/main/elm/Comp/ItemCardList.elm +++ b/modules/webapp/src/main/elm/Comp/ItemCardList.elm @@ -25,6 +25,7 @@ import Comp.ItemCard import Comp.LinkTarget exposing (LinkTarget) import Data.Flags exposing (Flags) import Data.ItemArrange exposing (ItemArrange) +import Data.ItemIds exposing (ItemIdChange) import Data.ItemSelection exposing (ItemSelection) import Data.Items import Data.UiSettings exposing (UiSettings) @@ -83,7 +84,7 @@ type alias UpdateResult = { model : Model , cmd : Cmd Msg , dragModel : DD.Model - , selection : ItemSelection + , selection : ItemIdChange , linkTarget : LinkTarget , toggleOpenRow : Maybe String } @@ -105,7 +106,7 @@ updateDrag dm _ msg model = UpdateResult newModel Cmd.none dm - Data.ItemSelection.Inactive + Data.ItemIds.noChange Comp.LinkTarget.LinkNone Nothing @@ -114,7 +115,7 @@ updateDrag dm _ msg model = UpdateResult model Cmd.none dm - Data.ItemSelection.Inactive + Data.ItemIds.noChange Comp.LinkTarget.LinkNone Nothing @@ -126,7 +127,7 @@ updateDrag dm _ msg model = UpdateResult newModel Cmd.none dm - Data.ItemSelection.Inactive + Data.ItemIds.noChange Comp.LinkTarget.LinkNone Nothing @@ -153,7 +154,7 @@ updateDrag dm _ msg model = UpdateResult { model | results = removeItemById id model.results } Cmd.none dm - Data.ItemSelection.Inactive + Data.ItemIds.noChange Comp.LinkTarget.LinkNone Nothing diff --git a/modules/webapp/src/main/elm/Comp/ItemDetail/FormChange.elm b/modules/webapp/src/main/elm/Comp/ItemDetail/FormChange.elm index 655940be..4a32ae05 100644 --- a/modules/webapp/src/main/elm/Comp/ItemDetail/FormChange.elm +++ b/modules/webapp/src/main/elm/Comp/ItemDetail/FormChange.elm @@ -24,8 +24,8 @@ import Api.Model.ItemsAndRefs exposing (ItemsAndRefs) import Api.Model.ReferenceList exposing (ReferenceList) import Data.Direction exposing (Direction) import Data.Flags exposing (Flags) +import Data.ItemIds exposing (ItemIds) import Http -import Set exposing (Set) type FormChange @@ -49,14 +49,14 @@ type FormChange multiUpdate : Flags - -> Set String + -> ItemIds -> FormChange -> (Result Http.Error BasicResult -> msg) -> Cmd msg multiUpdate flags ids change receive = let items = - Set.toList ids + Data.ItemIds.toList ids in case change of CustomValueChange field value -> @@ -159,10 +159,10 @@ multiUpdate flags ids change receive = ConfirmChange flag -> if flag then - Api.confirmMultiple flags ids receive + Api.confirmMultiple flags items receive else - Api.unconfirmMultiple flags ids receive + Api.unconfirmMultiple flags items receive NoFormChange -> Cmd.none diff --git a/modules/webapp/src/main/elm/Data/Environment.elm b/modules/webapp/src/main/elm/Data/Environment.elm new file mode 100644 index 00000000..171ef95d --- /dev/null +++ b/modules/webapp/src/main/elm/Data/Environment.elm @@ -0,0 +1,31 @@ +{- + Copyright 2020 Eike K. & Contributors + + SPDX-License-Identifier: AGPL-3.0-or-later +-} + + +module Data.Environment exposing (..) + +import Browser.Navigation as Nav +import Data.Flags exposing (Flags) +import Data.ItemIds exposing (ItemIds) +import Data.UiSettings exposing (UiSettings) + + +type alias Update = + { bookmarkId : Maybe String + , lastViewedItemId : Maybe String + , key : Nav.Key + , selectedItems : ItemIds + , flags : Flags + , settings : UiSettings + } + + +type alias View = + { flags : Flags + , sidebarVisible : Bool + , settings : UiSettings + , selectedItems : ItemIds + } diff --git a/modules/webapp/src/main/elm/Data/ItemIds.elm b/modules/webapp/src/main/elm/Data/ItemIds.elm new file mode 100644 index 00000000..9ed02625 --- /dev/null +++ b/modules/webapp/src/main/elm/Data/ItemIds.elm @@ -0,0 +1,132 @@ +{- + Copyright 2020 Eike K. & Contributors + + SPDX-License-Identifier: AGPL-3.0-or-later +-} + + +module Data.ItemIds exposing + ( ItemIdChange + , ItemIds + , apply + , combine + , combineAll + , deselect + , empty + , fromSet + , isEmpty + , isMember + , noChange + , select + , selectAll + , size + , toList + , toQuery + , toggle + , union + ) + +import Data.ItemQuery exposing (ItemQuery) +import Set exposing (Set) + + +type ItemIds + = ItemIds (Set String) + + +empty : ItemIds +empty = + ItemIds Set.empty + + +isEmpty : ItemIds -> Bool +isEmpty (ItemIds ids) = + Set.isEmpty ids + + +isMember : ItemIds -> String -> Bool +isMember (ItemIds ids) id = + Set.member id ids + + +size : ItemIds -> Int +size (ItemIds ids) = + Set.size ids + + +fromSet : Set String -> ItemIds +fromSet ids = + ItemIds ids + + +union : ItemIds -> ItemIds -> ItemIds +union (ItemIds ids1) (ItemIds ids2) = + ItemIds (Set.union ids1 ids2) + + +toList : ItemIds -> List String +toList (ItemIds ids) = + Set.toList ids + + +toQuery : ItemIds -> ItemQuery +toQuery (ItemIds ids) = + Data.ItemQuery.ItemIdIn (Set.toList ids) + + + +--- Change item ids + + +type ItemIdChange + = ItemIdChange + { remove : Set String + , add : Set String + } + + +apply : ItemIds -> ItemIdChange -> ItemIds +apply (ItemIds ids) (ItemIdChange { remove, add }) = + ItemIds (Set.diff ids remove |> Set.union add) + + +noChange : ItemIdChange +noChange = + ItemIdChange { remove = Set.empty, add = Set.empty } + + +combine : ItemIdChange -> ItemIdChange -> ItemIdChange +combine (ItemIdChange c1) (ItemIdChange c2) = + ItemIdChange + { remove = Set.union c1.remove c2.remove + , add = Set.union c1.add c2.add + } + + +combineAll : List ItemIdChange -> ItemIdChange +combineAll all = + List.foldl combine noChange all + + +select : String -> ItemIdChange +select id = + ItemIdChange { add = Set.singleton id, remove = Set.empty } + + +selectAll : Set String -> ItemIdChange +selectAll ids = + ItemIdChange { add = ids, remove = Set.empty } + + +deselect : String -> ItemIdChange +deselect id = + ItemIdChange { add = Set.empty, remove = Set.singleton id } + + +toggle : ItemIds -> String -> ItemIdChange +toggle ids id = + if isMember ids id then + deselect id + + else + select id diff --git a/modules/webapp/src/main/elm/Data/ItemSelection.elm b/modules/webapp/src/main/elm/Data/ItemSelection.elm index 05d8a911..e6f49776 100644 --- a/modules/webapp/src/main/elm/Data/ItemSelection.elm +++ b/modules/webapp/src/main/elm/Data/ItemSelection.elm @@ -11,12 +11,12 @@ module Data.ItemSelection exposing , isSelected ) -import Set exposing (Set) +import Data.ItemIds exposing (ItemIds) type ItemSelection = Inactive - | Active (Set String) + | Active ItemIds isSelected : String -> ItemSelection -> Bool @@ -26,7 +26,7 @@ isSelected id set = False Active ids -> - Set.member id ids + Data.ItemIds.isMember ids id isActive : ItemSelection -> Bool diff --git a/modules/webapp/src/main/elm/Page/Search/Data.elm b/modules/webapp/src/main/elm/Page/Search/Data.elm index ca830f94..e4fa919e 100644 --- a/modules/webapp/src/main/elm/Page/Search/Data.elm +++ b/modules/webapp/src/main/elm/Page/Search/Data.elm @@ -84,8 +84,7 @@ type ConfirmModalValue type alias SelectViewModel = - { ids : Set String - , action : SelectActionMode + { action : SelectActionMode , confirmModal : Maybe ConfirmModalValue , editModel : Comp.ItemDetail.MultiEditMenu.Model , mergeModel : Comp.ItemMerge.Model @@ -97,8 +96,7 @@ type alias SelectViewModel = initSelectViewModel : Flags -> SelectViewModel initSelectViewModel flags = - { ids = Set.empty - , action = NoneAction + { action = NoneAction , confirmModal = Nothing , editModel = Comp.ItemDetail.MultiEditMenu.init , mergeModel = Comp.ItemMerge.init [] diff --git a/modules/webapp/src/main/elm/Page/Search/Update.elm b/modules/webapp/src/main/elm/Page/Search/Update.elm index 73d3510e..67f87525 100644 --- a/modules/webapp/src/main/elm/Page/Search/Update.elm +++ b/modules/webapp/src/main/elm/Page/Search/Update.elm @@ -12,7 +12,6 @@ module Page.Search.Update exposing import Api import Api.Model.ItemLightList exposing (ItemLightList) -import Browser.Navigation as Nav import Comp.BookmarkQueryManage import Comp.ItemCardList import Comp.ItemDetail.FormChange exposing (FormChange(..)) @@ -23,10 +22,11 @@ import Comp.PowerSearchInput import Comp.PublishItems import Comp.SearchMenu import Data.AppEvent exposing (AppEvent(..)) +import Data.Environment as Env import Data.Flags exposing (Flags) import Data.ItemArrange +import Data.ItemIds exposing (ItemIds) import Data.ItemQuery as Q -import Data.ItemSelection import Data.Items import Data.SearchMode exposing (SearchMode) import Data.UiSettings exposing (UiSettings) @@ -35,7 +35,7 @@ import Page exposing (Page(..)) import Page.Search.Data exposing (..) import Process import Scroll -import Set exposing (Set) +import Set import Task import Util.Html exposing (KeyCode(..)) import Util.ItemDragDrop as DD @@ -47,56 +47,57 @@ type alias UpdateResult = , cmd : Cmd Msg , sub : Sub Msg , appEvent : AppEvent + , selectedItems : ItemIds } -update : Maybe String -> Maybe String -> Nav.Key -> Flags -> Texts -> UiSettings -> Msg -> Model -> UpdateResult -update bookmarkId mId key flags texts settings msg model = +update : Texts -> Env.Update -> Msg -> Model -> UpdateResult +update texts env msg model = case msg of Init -> let searchParam = - { flags = flags + { flags = env.flags , searchType = model.lastSearchType - , pageSize = settings.itemSearchPageSize + , pageSize = env.settings.itemSearchPageSize , offset = 0 , scroll = True } setBookmark = - Maybe.map (\bmId -> SearchMenuMsg <| Comp.SearchMenu.SetBookmark bmId) bookmarkId + Maybe.map (\bmId -> SearchMenuMsg <| Comp.SearchMenu.SetBookmark bmId) env.bookmarkId |> Maybe.withDefault DoNothing in - makeResult <| + makeResult env <| Util.Update.andThen3 - [ update bookmarkId mId key flags texts settings (SearchMenuMsg Comp.SearchMenu.Init) - , update bookmarkId mId key flags texts settings setBookmark - , doSearch searchParam + [ update texts env (SearchMenuMsg Comp.SearchMenu.Init) + , update texts env setBookmark + , doSearch env searchParam ] model DoNothing -> - UpdateResult model Cmd.none Sub.none AppNothing + UpdateResult model Cmd.none Sub.none AppNothing env.selectedItems ResetSearch -> let nm = { model | searchOffset = 0, powerSearchInput = Comp.PowerSearchInput.init } in - update bookmarkId mId key flags texts settings (SearchMenuMsg Comp.SearchMenu.ResetForm) nm + update texts env (SearchMenuMsg Comp.SearchMenu.ResetForm) nm SearchMenuMsg m -> let nextState = Comp.SearchMenu.updateDrop model.dragDropData.model - flags - settings + env.flags + env.settings m model.searchMenuModel dropCmd = - DD.makeUpdateCmd flags (\_ -> DoSearch model.lastSearchType) nextState.dragDrop.dropped + DD.makeUpdateCmd env.flags (\_ -> DoSearch model.lastSearchType) nextState.dragDrop.dropped newModel = { model @@ -112,10 +113,10 @@ update bookmarkId mId key flags texts settings msg model = result = if nextState.stateChange && not model.searchInProgress then - doSearch (SearchParam flags BasicSearch settings.itemSearchPageSize 0 False) newModel + doSearch env (SearchParam env.flags BasicSearch env.settings.itemSearchPageSize 0 False) newModel else - resultModelCmd ( newModel, Cmd.none ) + resultModelCmd env ( newModel, Cmd.none ) in { result | cmd = @@ -130,16 +131,16 @@ update bookmarkId mId key flags texts settings msg model = SetLinkTarget lt -> case linkTargetMsg lt of Just m -> - update bookmarkId mId key flags texts settings m model + update texts env m model Nothing -> - makeResult ( model, Cmd.none, Sub.none ) + makeResult env ( model, Cmd.none, Sub.none ) ItemCardListMsg m -> let result = Comp.ItemCardList.updateDrag model.dragDropData.model - flags + env.flags m model.itemListModel @@ -147,13 +148,8 @@ update bookmarkId mId key flags texts settings msg model = Maybe.map Util.Update.cmdUnit (linkTargetMsg result.linkTarget) |> Maybe.withDefault Cmd.none - nextView = - case ( model.viewMode, result.selection ) of - ( SelectView svm, Data.ItemSelection.Active ids ) -> - SelectView { svm | ids = ids } - - ( v, _ ) -> - v + itemIds = + Data.ItemIds.apply env.selectedItems result.selection itemRows = case result.toggleOpenRow of @@ -167,15 +163,17 @@ update bookmarkId mId key flags texts settings msg model = Nothing -> model.itemRowsOpen in - resultModelCmd - ( { model + { model = + { model | itemListModel = result.model - , viewMode = nextView , itemRowsOpen = itemRows , dragDropData = DD.DragDropData result.dragModel Nothing - } - , Cmd.batch [ Cmd.map ItemCardListMsg result.cmd, searchMsg ] - ) + } + , cmd = Cmd.batch [ Cmd.map ItemCardListMsg result.cmd, searchMsg ] + , sub = Sub.none + , appEvent = AppNothing + , selectedItems = itemIds + } ToggleExpandCollapseRows -> let @@ -186,12 +184,12 @@ update bookmarkId mId key flags texts settings msg model = else Set.empty in - resultModelCmd ( { model | itemRowsOpen = itemRows, viewMenuOpen = False }, Cmd.none ) + resultModelCmd env ( { model | itemRowsOpen = itemRows, viewMenuOpen = False }, Cmd.none ) ItemSearchResp scroll (Ok list) -> let noff = - settings.itemSearchPageSize + env.settings.itemSearchPageSize m = { model @@ -200,21 +198,21 @@ update bookmarkId mId key flags texts settings msg model = , moreAvailable = list.groups /= [] } in - makeResult <| + makeResult env <| Util.Update.andThen3 - [ update bookmarkId mId key flags texts settings (ItemCardListMsg (Comp.ItemCardList.SetResults list)) + [ update texts env (ItemCardListMsg (Comp.ItemCardList.SetResults list)) , if scroll then - scrollToCard mId + scrollToCard env else - \next -> makeResult ( next, Cmd.none, Sub.none ) + \next -> makeResult env ( next, Cmd.none, Sub.none ) ] m ItemSearchAddResp (Ok list) -> let noff = - model.searchOffset + settings.itemSearchPageSize + model.searchOffset + env.settings.itemSearchPageSize m = { model @@ -224,10 +222,10 @@ update bookmarkId mId key flags texts settings msg model = , moreAvailable = list.groups /= [] } in - update bookmarkId mId key flags texts settings (ItemCardListMsg (Comp.ItemCardList.AddResults list)) m + update texts env (ItemCardListMsg (Comp.ItemCardList.AddResults list)) m ItemSearchAddResp (Err _) -> - resultModelCmd + resultModelCmd env ( { model | moreInProgress = False } @@ -235,7 +233,7 @@ update bookmarkId mId key flags texts settings msg model = ) ItemSearchResp _ (Err _) -> - resultModelCmd + resultModelCmd env ( { model | searchInProgress = False } @@ -248,41 +246,41 @@ update bookmarkId mId key flags texts settings msg model = { model | searchOffset = 0 } param = - { flags = flags + { flags = env.flags , searchType = stype - , pageSize = settings.itemSearchPageSize + , pageSize = env.settings.itemSearchPageSize , offset = 0 , scroll = False } in if model.searchInProgress then - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) else - doSearch param nm + doSearch env param nm RefreshView -> let param = - { flags = flags + { flags = env.flags , searchType = model.lastSearchType - , pageSize = settings.itemSearchPageSize + , pageSize = env.settings.itemSearchPageSize , offset = model.searchOffset , scroll = False } in if model.searchInProgress then - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) else - doSearch param model + doSearch env param model ToggleSelectView -> let ( nextView, cmd ) = case model.viewMode of SearchView -> - ( SelectView <| initSelectViewModel flags, loadEditModel flags ) + ( SelectView <| initSelectViewModel env.flags, loadEditModel env.flags ) SelectView _ -> ( SearchView, Cmd.none ) @@ -290,92 +288,74 @@ update bookmarkId mId key flags texts settings msg model = PublishView q -> ( PublishView q, Cmd.none ) in - resultModelCmd - ( { model - | viewMode = nextView - } - , cmd - ) + resultModelCmd env ( { model | viewMode = nextView }, cmd ) LoadMore -> if model.moreAvailable then - doSearchMore flags settings model |> resultModelCmd + doSearchMore env.flags env.settings model |> resultModelCmd env else - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) SetBasicSearch str -> let smMsg = SearchMenuMsg (Comp.SearchMenu.SetTextSearch str) in - update bookmarkId mId key flags texts settings smMsg model + update texts env smMsg model ToggleSearchType -> case model.searchTypeDropdownValue of BasicSearch -> - update bookmarkId mId key flags texts settings (SearchMenuMsg Comp.SearchMenu.SetFulltextSearch) model + update texts env (SearchMenuMsg Comp.SearchMenu.SetFulltextSearch) model ContentOnlySearch -> - update bookmarkId mId key flags texts settings (SearchMenuMsg Comp.SearchMenu.SetNamesSearch) model + update texts env (SearchMenuMsg Comp.SearchMenu.SetNamesSearch) model KeyUpSearchbarMsg (Just Enter) -> - update bookmarkId mId key flags texts settings (DoSearch model.searchTypeDropdownValue) model + update texts env (DoSearch model.searchTypeDropdownValue) model KeyUpSearchbarMsg _ -> - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) ScrollResult _ -> let cmd = Process.sleep 800 |> Task.perform (always ClearItemDetailId) in - resultModelCmd ( model, cmd ) + resultModelCmd env ( model, cmd ) ClearItemDetailId -> - resultModelCmd ( { model | scrollToCard = Nothing }, Cmd.none ) + resultModelCmd env ( { model | scrollToCard = Nothing }, Cmd.none ) SelectAllItems -> - case model.viewMode of - SelectView svm -> - let - visible = - Data.Items.idSet model.itemListModel.results + let + visible = + Data.Items.idSet model.itemListModel.results - svm_ = - { svm | ids = Set.union svm.ids visible } - in - resultModelCmd - ( { model | viewMode = SelectView svm_ } - , Cmd.none - ) + itemIds = + Data.ItemIds.apply env.selectedItems (Data.ItemIds.selectAll visible) - _ -> - resultModelCmd ( model, Cmd.none ) + res_ = + resultModelCmd env ( model, Cmd.none ) + in + { res_ | selectedItems = itemIds } SelectNoItems -> - case model.viewMode of - SelectView svm -> - let - svm_ = - { svm | ids = Set.empty } - in - resultModelCmd - ( { model | viewMode = SelectView svm_ } - , Cmd.none - ) - - _ -> - resultModelCmd ( model, Cmd.none ) + let + result = + resultModelCmd env ( model, Cmd.none ) + in + { result | selectedItems = Data.ItemIds.empty } DeleteSelectedConfirmed -> case model.viewMode of SelectView svm -> let cmd = - Api.deleteAllItems flags svm.ids DeleteAllResp + Api.deleteAllItems env.flags (Data.ItemIds.toList env.selectedItems) DeleteAllResp in - resultModelCmd + resultModelCmd env ( { model | viewMode = SelectView @@ -388,16 +368,16 @@ update bookmarkId mId key flags texts settings msg model = ) _ -> - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) RestoreSelectedConfirmed -> case model.viewMode of SelectView svm -> let cmd = - Api.restoreAllItems flags svm.ids DeleteAllResp + Api.restoreAllItems env.flags (Data.ItemIds.toList env.selectedItems) DeleteAllResp in - resultModelCmd + resultModelCmd env ( { model | viewMode = SelectView @@ -410,7 +390,7 @@ update bookmarkId mId key flags texts settings msg model = ) _ -> - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) DeleteAllResp (Ok res) -> if res.success then @@ -419,26 +399,26 @@ update bookmarkId mId key flags texts settings msg model = { model | viewMode = SearchView } param = - { flags = flags + { flags = env.flags , searchType = model.lastSearchType - , pageSize = settings.itemSearchPageSize + , pageSize = env.settings.itemSearchPageSize , offset = 0 , scroll = False } in - doSearch param nm + doSearch env param nm else - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) DeleteAllResp (Err _) -> - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) RequestReprocessSelected -> case model.viewMode of SelectView svm -> - if svm.ids == Set.empty then - resultModelCmd ( model, Cmd.none ) + if Data.ItemIds.isEmpty env.selectedItems then + resultModelCmd env ( model, Cmd.none ) else let @@ -452,15 +432,15 @@ update bookmarkId mId key flags texts settings msg model = } } in - resultModelCmd ( model_, Cmd.none ) + resultModelCmd env ( model_, Cmd.none ) _ -> - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) CloseConfirmModal -> case model.viewMode of SelectView svm -> - resultModelCmd + resultModelCmd env ( { model | viewMode = SelectView { svm | confirmModal = Nothing, action = NoneAction } } @@ -468,20 +448,20 @@ update bookmarkId mId key flags texts settings msg model = ) _ -> - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) ReprocessSelectedConfirmed -> case model.viewMode of SelectView svm -> - if svm.ids == Set.empty then - resultModelCmd ( model, Cmd.none ) + if Data.ItemIds.isEmpty env.selectedItems then + resultModelCmd env ( model, Cmd.none ) else let cmd = - Api.reprocessMultiple flags svm.ids DeleteAllResp + Api.reprocessMultiple env.flags (Data.ItemIds.toList env.selectedItems) DeleteAllResp in - resultModelCmd + resultModelCmd env ( { model | viewMode = SelectView @@ -494,13 +474,13 @@ update bookmarkId mId key flags texts settings msg model = ) _ -> - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) RequestDeleteSelected -> case model.viewMode of SelectView svm -> - if svm.ids == Set.empty then - resultModelCmd ( model, Cmd.none ) + if Data.ItemIds.isEmpty env.selectedItems then + resultModelCmd env ( model, Cmd.none ) else let @@ -514,16 +494,16 @@ update bookmarkId mId key flags texts settings msg model = } } in - resultModelCmd ( model_, Cmd.none ) + resultModelCmd env ( model_, Cmd.none ) _ -> - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) RequestRestoreSelected -> case model.viewMode of SelectView svm -> - if svm.ids == Set.empty then - resultModelCmd ( model, Cmd.none ) + if Data.ItemIds.isEmpty env.selectedItems then + resultModelCmd env ( model, Cmd.none ) else let @@ -537,37 +517,37 @@ update bookmarkId mId key flags texts settings msg model = } } in - resultModelCmd ( model_, Cmd.none ) + resultModelCmd env ( model_, Cmd.none ) _ -> - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) EditSelectedItems -> case model.viewMode of SelectView svm -> if svm.action == EditSelected then - resultModelCmd + resultModelCmd env ( { model | viewMode = SelectView { svm | action = NoneAction } } , Cmd.none ) - else if svm.ids == Set.empty then - resultModelCmd ( model, Cmd.none ) + else if Data.ItemIds.isEmpty env.selectedItems then + resultModelCmd env ( model, Cmd.none ) else - resultModelCmd + resultModelCmd env ( { model | viewMode = SelectView { svm | action = EditSelected } } , Cmd.none ) _ -> - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) MergeSelectedItems -> case model.viewMode of SelectView svm -> if svm.action == MergeSelected then - resultModelCmd + resultModelCmd env ( { model | viewMode = SelectView @@ -579,18 +559,18 @@ update bookmarkId mId key flags texts settings msg model = , Cmd.none ) - else if svm.ids == Set.empty then - resultModelCmd ( model, Cmd.none ) + else if Data.ItemIds.isEmpty env.selectedItems then + resultModelCmd env ( model, Cmd.none ) else let ( mm, mc ) = Comp.ItemMerge.initQuery - flags + env.flags model.searchMenuModel.searchMode - (Q.ItemIdIn (Set.toList svm.ids)) + (Data.ItemIds.toQuery env.selectedItems) in - resultModelCmd + resultModelCmd env ( { model | viewMode = SelectView @@ -603,14 +583,14 @@ update bookmarkId mId key flags texts settings msg model = ) _ -> - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) MergeItemsMsg lmsg -> case model.viewMode of SelectView svm -> let result = - Comp.ItemMerge.update flags lmsg svm.mergeModel + Comp.ItemMerge.update env.flags lmsg svm.mergeModel nextView = case result.outcome of @@ -627,23 +607,19 @@ update bookmarkId mId key flags texts settings msg model = { model | viewMode = nextView } in if result.outcome == Comp.ItemMerge.OutcomeMerged then - update bookmarkId - mId - key - flags - texts - settings + update texts + env (DoSearch model.searchTypeDropdownValue) model_ else - resultModelCmd + resultModelCmd env ( model_ , Cmd.map MergeItemsMsg result.cmd ) _ -> - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) PublishSelectedItems -> case model.viewMode of @@ -651,9 +627,9 @@ update bookmarkId mId key flags texts settings msg model = if svm.action == PublishSelected then let ( mm, mc ) = - Comp.PublishItems.init flags + Comp.PublishItems.init env.flags in - resultModelCmd + resultModelCmd env ( { model | viewMode = SelectView @@ -665,16 +641,16 @@ update bookmarkId mId key flags texts settings msg model = , Cmd.map PublishItemsMsg mc ) - else if svm.ids == Set.empty then - resultModelCmd ( model, Cmd.none ) + else if Data.ItemIds.isEmpty env.selectedItems then + resultModelCmd env ( model, Cmd.none ) else let ( mm, mc ) = - Comp.PublishItems.initQuery flags - (Q.ItemIdIn (Set.toList svm.ids)) + Comp.PublishItems.initQuery env.flags + (Data.ItemIds.toQuery env.selectedItems) in - resultModelCmd + resultModelCmd env ( { model | viewMode = SelectView @@ -687,14 +663,14 @@ update bookmarkId mId key flags texts settings msg model = ) _ -> - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) PublishItemsMsg lmsg -> case model.viewMode of SelectView svm -> let result = - Comp.PublishItems.update texts.publishItems flags lmsg svm.publishModel + Comp.PublishItems.update texts.publishItems env.flags lmsg svm.publishModel nextView = case result.outcome of @@ -708,30 +684,26 @@ update bookmarkId mId key flags texts settings msg model = { model | viewMode = nextView } in if result.outcome == Comp.PublishItems.OutcomeDone then - update bookmarkId - mId - key - flags - texts - settings + update texts + env (DoSearch model.searchTypeDropdownValue) model_ else - resultModelCmd + resultModelCmd env ( model_ , Cmd.map PublishItemsMsg result.cmd ) _ -> - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) EditMenuMsg lmsg -> case model.viewMode of SelectView svm -> let res = - Comp.ItemDetail.MultiEditMenu.update flags lmsg svm.editModel + Comp.ItemDetail.MultiEditMenu.update env.flags lmsg svm.editModel svm_ = { svm @@ -762,19 +734,19 @@ update bookmarkId mId key flags texts settings msg model = Sub.map EditMenuMsg res.sub upCmd = - Comp.ItemDetail.FormChange.multiUpdate flags - svm.ids + Comp.ItemDetail.FormChange.multiUpdate env.flags + env.selectedItems res.change (MultiUpdateResp res.change) in - makeResult + makeResult env ( { model | viewMode = SelectView svm_ } , Cmd.batch [ cmd_, upCmd ] , sub_ ) _ -> - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) MultiUpdateResp change (Ok res) -> let @@ -782,29 +754,24 @@ update bookmarkId mId key flags texts settings msg model = updateSelectViewNameState res.success model change in if res.success then - case model.viewMode of - SelectView svm -> - -- replace changed items in the view - resultModelCmd ( nm, loadChangedItems flags model.searchMenuModel.searchMode svm.ids ) - - _ -> - resultModelCmd ( nm, Cmd.none ) + -- replace changed items in the view + resultModelCmd env ( nm, loadChangedItems env.flags model.searchMenuModel.searchMode env.selectedItems ) else - resultModelCmd ( nm, Cmd.none ) + resultModelCmd env ( nm, Cmd.none ) MultiUpdateResp change (Err _) -> - makeResult + makeResult env ( updateSelectViewNameState False model change , Cmd.none , Sub.none ) ReplaceChangedItemsResp (Ok items) -> - resultModelCmd ( replaceItems model items, Cmd.none ) + resultModelCmd env ( replaceItems model items, Cmd.none ) ReplaceChangedItemsResp (Err _) -> - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) UiSettingsUpdated -> let @@ -822,7 +789,7 @@ update bookmarkId mId key flags texts settings msg model = model_ = { model | viewMode = viewMode } in - update bookmarkId mId key flags texts settings (DoSearch model.lastSearchType) model_ + update texts env (DoSearch model.lastSearchType) model_ SearchStatsResp result -> let @@ -832,17 +799,17 @@ update bookmarkId mId key flags texts settings msg model = stats = Result.withDefault model.searchStats result in - update bookmarkId mId key flags texts settings lm { model | searchStats = stats } + update texts env lm { model | searchStats = stats } TogglePreviewFullWidth -> let newSettings s = - { s | cardPreviewFullWidth = Just (not settings.cardPreviewFullWidth) } + { s | cardPreviewFullWidth = Just (not env.settings.cardPreviewFullWidth) } cmd = - Api.saveUserClientSettingsBy flags newSettings ClientSettingsSaveResp + Api.saveUserClientSettingsBy env.flags newSettings ClientSettingsSaveResp in - resultModelCmd ( { model | viewMenuOpen = False }, cmd ) + resultModelCmd env ( { model | viewMenuOpen = False }, cmd ) ClientSettingsSaveResp (Ok res) -> if res.success then @@ -850,13 +817,14 @@ update bookmarkId mId key flags texts settings msg model = , cmd = Cmd.none , sub = Sub.none , appEvent = AppReloadUiSettings + , selectedItems = env.selectedItems } else - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) ClientSettingsSaveResp (Err _) -> - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) PowerSearchMsg lm -> let @@ -871,58 +839,58 @@ update bookmarkId mId key flags texts settings msg model = in case result.action of Comp.PowerSearchInput.NoAction -> - makeResult ( model_, cmd_, Sub.map PowerSearchMsg result.subs ) + makeResult env ( model_, cmd_, Sub.map PowerSearchMsg result.subs ) Comp.PowerSearchInput.SubmitSearch -> - update bookmarkId mId key flags texts settings (DoSearch model_.searchTypeDropdownValue) model_ + update texts env (DoSearch model_.searchTypeDropdownValue) model_ KeyUpPowerSearchbarMsg (Just Enter) -> - update bookmarkId mId key flags texts settings (DoSearch model.searchTypeDropdownValue) model + update texts env (DoSearch model.searchTypeDropdownValue) model KeyUpPowerSearchbarMsg _ -> - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) RemoveItem id -> - update bookmarkId mId key flags texts settings (ItemCardListMsg (Comp.ItemCardList.RemoveItem id)) model + update texts env (ItemCardListMsg (Comp.ItemCardList.RemoveItem id)) model TogglePublishCurrentQueryView -> case createQuery model of Just q -> let ( pm, pc ) = - Comp.PublishItems.initQuery flags q + Comp.PublishItems.initQuery env.flags q in - resultModelCmd ( { model | viewMode = PublishView pm, viewMenuOpen = False }, Cmd.map PublishViewMsg pc ) + resultModelCmd env ( { model | viewMode = PublishView pm, viewMenuOpen = False }, Cmd.map PublishViewMsg pc ) Nothing -> - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) ToggleBookmarkCurrentQueryView -> case createQuery model of Just q -> case model.topWidgetModel of BookmarkQuery _ -> - resultModelCmd ( { model | topWidgetModel = TopWidgetHidden, viewMenuOpen = False }, Cmd.none ) + resultModelCmd env ( { model | topWidgetModel = TopWidgetHidden, viewMenuOpen = False }, Cmd.none ) TopWidgetHidden -> let ( qm, qc ) = Comp.BookmarkQueryManage.init (Q.render q) in - resultModelCmd + resultModelCmd env ( { model | topWidgetModel = BookmarkQuery qm, viewMenuOpen = False } , Cmd.map BookmarkQueryMsg qc ) Nothing -> - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) BookmarkQueryMsg lm -> case model.topWidgetModel of BookmarkQuery bm -> let res = - Comp.BookmarkQueryManage.update flags lm bm + Comp.BookmarkQueryManage.update env.flags lm bm nextModel = if @@ -938,12 +906,12 @@ update bookmarkId mId key flags texts settings msg model = refreshCmd = if res.outcome == Comp.BookmarkQueryManage.Done then - Cmd.map SearchMenuMsg (Comp.SearchMenu.refreshBookmarks flags) + Cmd.map SearchMenuMsg (Comp.SearchMenu.refreshBookmarks env.flags) else Cmd.none in - makeResult + makeResult env ( { model | topWidgetModel = nextModel } , Cmd.batch [ Cmd.map BookmarkQueryMsg res.cmd @@ -953,43 +921,43 @@ update bookmarkId mId key flags texts settings msg model = ) TopWidgetHidden -> - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) PublishViewMsg lmsg -> case model.viewMode of PublishView inPM -> let result = - Comp.PublishItems.update texts.publishItems flags lmsg inPM + Comp.PublishItems.update texts.publishItems env.flags lmsg inPM in case result.outcome of Comp.PublishItems.OutcomeInProgress -> - resultModelCmd + resultModelCmd env ( { model | viewMode = PublishView result.model } , Cmd.map PublishViewMsg result.cmd ) Comp.PublishItems.OutcomeDone -> - resultModelCmd + resultModelCmd env ( { model | viewMode = SearchView } - , Cmd.map SearchMenuMsg (Comp.SearchMenu.refreshBookmarks flags) + , Cmd.map SearchMenuMsg (Comp.SearchMenu.refreshBookmarks env.flags) ) _ -> - resultModelCmd ( model, Cmd.none ) + resultModelCmd env ( model, Cmd.none ) ToggleViewMenu -> - resultModelCmd ( { model | viewMenuOpen = not model.viewMenuOpen }, Cmd.none ) + resultModelCmd env ( { model | viewMenuOpen = not model.viewMenuOpen }, Cmd.none ) ToggleShowGroups -> let newSettings s = - { s | itemSearchShowGroups = Just (not settings.itemSearchShowGroups) } + { s | itemSearchShowGroups = Just (not env.settings.itemSearchShowGroups) } cmd = - Api.saveUserClientSettingsBy flags newSettings ClientSettingsSaveResp + Api.saveUserClientSettingsBy env.flags newSettings ClientSettingsSaveResp in - resultModelCmd ( { model | viewMenuOpen = False }, cmd ) + resultModelCmd env ( { model | viewMenuOpen = False }, cmd ) ToggleArrange am -> let @@ -997,9 +965,9 @@ update bookmarkId mId key flags texts settings msg model = { s | itemSearchArrange = Data.ItemArrange.asString am |> Just } cmd = - Api.saveUserClientSettingsBy flags newSettings ClientSettingsSaveResp + Api.saveUserClientSettingsBy env.flags newSettings ClientSettingsSaveResp in - resultModelCmd ( { model | viewMenuOpen = False }, cmd ) + resultModelCmd env ( { model | viewMenuOpen = False }, cmd ) @@ -1063,37 +1031,37 @@ replaceItems model newItems = { model | itemListModel = newList } -loadChangedItems : Flags -> SearchMode -> Set String -> Cmd Msg +loadChangedItems : Flags -> SearchMode -> ItemIds -> Cmd Msg loadChangedItems flags smode ids = - if Set.isEmpty ids then + if Data.ItemIds.isEmpty ids then Cmd.none else let idList = - Set.toList ids + Data.ItemIds.toList ids searchInit = Q.request smode (Just <| Q.ItemIdIn idList) search = { searchInit - | limit = Just <| Set.size ids + | limit = Just <| Data.ItemIds.size ids } in Api.itemSearch flags search ReplaceChangedItemsResp -scrollToCard : Maybe String -> Model -> UpdateResult -scrollToCard mId model = +scrollToCard : Env.Update -> Model -> UpdateResult +scrollToCard env model = let scroll id = Scroll.scrollElementY "item-card-list" id 0.5 0.5 in - makeResult <| - case mId of + makeResult env <| + case env.lastViewedItemId of Just id -> - ( { model | scrollToCard = mId } + ( { model | scrollToCard = env.lastViewedItemId } , Task.attempt ScrollResult (scroll id) , Sub.none ) @@ -1107,8 +1075,8 @@ loadEditModel flags = Cmd.map EditMenuMsg (Comp.ItemDetail.MultiEditMenu.loadModel flags) -doSearch : SearchParam -> Model -> UpdateResult -doSearch param model = +doSearch : Env.Update -> SearchParam -> Model -> UpdateResult +doSearch env param model = let param_ = { param | offset = 0 } @@ -1116,7 +1084,7 @@ doSearch param model = searchCmd = doSearchCmd param_ model in - resultModelCmd + resultModelCmd env ( { model | searchInProgress = True , searchOffset = 0 @@ -1150,15 +1118,16 @@ doSearchMore flags settings model = ) -resultModelCmd : ( Model, Cmd Msg ) -> UpdateResult -resultModelCmd ( m, c ) = - makeResult ( m, c, Sub.none ) +resultModelCmd : Env.Update -> ( Model, Cmd Msg ) -> UpdateResult +resultModelCmd env ( m, c ) = + makeResult env ( m, c, Sub.none ) -makeResult : ( Model, Cmd Msg, Sub Msg ) -> UpdateResult -makeResult ( m, c, s ) = +makeResult : Env.Update -> ( Model, Cmd Msg, Sub Msg ) -> UpdateResult +makeResult env ( m, c, s ) = { model = m , cmd = c , sub = s , appEvent = AppNothing + , selectedItems = env.selectedItems } diff --git a/modules/webapp/src/main/elm/Page/Search/View2.elm b/modules/webapp/src/main/elm/Page/Search/View2.elm index 34ecd498..21f59b77 100644 --- a/modules/webapp/src/main/elm/Page/Search/View2.elm +++ b/modules/webapp/src/main/elm/Page/Search/View2.elm @@ -18,9 +18,11 @@ import Comp.PowerSearchInput import Comp.PublishItems import Comp.SearchMenu import Comp.SearchStatsView +import Data.Environment as Env import Data.Flags exposing (Flags) import Data.Icons as Icons import Data.ItemArrange +import Data.ItemIds exposing (ItemIds) import Data.ItemSelection import Data.SearchMode import Data.UiSettings exposing (UiSettings) @@ -36,27 +38,27 @@ import Styles as S import Util.Html -viewSidebar : Texts -> Bool -> Flags -> UiSettings -> Model -> Html Msg -viewSidebar texts visible flags settings model = +viewSidebar : Texts -> Env.View -> Model -> Html Msg +viewSidebar texts env model = div [ id "sidebar" , class S.sidebar , class S.sidebarBg - , classList [ ( "hidden", not visible ) ] + , classList [ ( "hidden", not env.sidebarVisible ) ] ] - [ Page.Search.SideMenu.view texts.sideMenu flags settings model + [ Page.Search.SideMenu.view texts.sideMenu env.flags env.settings model ] -viewContent : Texts -> Flags -> UiSettings -> Model -> Html Msg -viewContent texts flags settings model = +viewContent : Texts -> Env.View -> Model -> Html Msg +viewContent texts env model = div [ id "item-card-list" -- this id is used in scroll-to-card , class S.content ] - (searchStats texts flags settings model - ++ itemsBar texts flags settings model - ++ mainView texts flags settings model + (searchStats texts env.flags env.settings model + ++ itemsBar texts env model + ++ mainView texts env model ++ confirmModal texts model ) @@ -65,8 +67,8 @@ viewContent texts flags settings model = --- Helpers -mainView : Texts -> Flags -> UiSettings -> Model -> List (Html Msg) -mainView texts flags settings model = +mainView : Texts -> Env.View -> Model -> List (Html Msg) +mainView texts env model = let otherView = case model.viewMode of @@ -75,13 +77,13 @@ mainView texts flags settings model = MergeSelected -> Just [ div [ class "sm:relative mb-2" ] - (itemMergeView texts settings svm) + (itemMergeView texts env.settings svm) ] PublishSelected -> Just [ div [ class "sm:relative mb-2" ] - (itemPublishView texts settings flags svm) + (itemPublishView texts env.settings env.flags svm) ] _ -> @@ -90,7 +92,7 @@ mainView texts flags settings model = PublishView pm -> Just [ div [ class "sm:relative mb-2" ] - (publishResults texts settings flags model pm) + (publishResults texts env.settings env.flags model pm) ] SearchView -> @@ -101,8 +103,8 @@ mainView texts flags settings model = body Nothing -> - bookmarkQueryWidget texts settings flags model - ++ itemCardList texts flags settings model + bookmarkQueryWidget texts env.settings env.flags model + ++ itemCardList texts env model bookmarkQueryWidget : Texts -> UiSettings -> Flags -> Model -> List (Html Msg) @@ -182,17 +184,17 @@ confirmModal texts model = [] -itemsBar : Texts -> Flags -> UiSettings -> Model -> List (Html Msg) -itemsBar texts flags settings model = +itemsBar : Texts -> Env.View -> Model -> List (Html Msg) +itemsBar texts env model = case model.viewMode of SearchView -> - [ defaultMenuBar texts flags settings model ] + [ defaultMenuBar texts env.flags env.settings model ] SelectView svm -> - [ editMenuBar texts model svm ] + [ editMenuBar texts model env.selectedItems svm ] PublishView _ -> - [ defaultMenuBar texts flags settings model ] + [ defaultMenuBar texts env.flags env.settings model ] defaultMenuBar : Texts -> Flags -> UiSettings -> Model -> Html Msg @@ -427,11 +429,11 @@ defaultMenuBar texts flags settings model = } -editMenuBar : Texts -> Model -> SelectViewModel -> Html Msg -editMenuBar texts model svm = +editMenuBar : Texts -> Model -> ItemIds -> SelectViewModel -> Html Msg +editMenuBar texts model selectedItems svm = let selectCount = - Set.size svm.ids + Data.ItemIds.size selectedItems btnStyle = S.secondaryBasicButton ++ " text-sm" @@ -565,8 +567,8 @@ searchStats texts _ settings model = [] -itemCardList : Texts -> Flags -> UiSettings -> Model -> List (Html Msg) -itemCardList texts flags settings model = +itemCardList : Texts -> Env.View -> Model -> List (Html Msg) +itemCardList texts env model = let previewUrl attach = Api.attachmentPreviewURL attach.id @@ -581,15 +583,15 @@ itemCardList texts flags settings model = , previewUrlFallback = previewUrlFallback , attachUrl = .id >> Api.fileURL , detailPage = .id >> ItemDetailPage - , arrange = settings.itemSearchArrange - , showGroups = settings.itemSearchShowGroups + , arrange = env.settings.itemSearchArrange + , showGroups = env.settings.itemSearchShowGroups , rowOpen = \id -> Set.member "all" model.itemRowsOpen || Set.member id model.itemRowsOpen } itemViewCfg = case model.viewMode of - SelectView svm -> - viewCfg (Data.ItemSelection.Active svm.ids) + SelectView _ -> + viewCfg (Data.ItemSelection.Active env.selectedItems) _ -> viewCfg Data.ItemSelection.Inactive @@ -597,11 +599,11 @@ itemCardList texts flags settings model = [ Html.map ItemCardListMsg (Comp.ItemCardList.view texts.itemCardList itemViewCfg - settings - flags + env.settings + env.flags model.itemListModel ) - , loadMore texts settings model + , loadMore texts env.settings model ]