From 5735a47199d605f6cbcb88d967959f4b0e52fed9 Mon Sep 17 00:00:00 2001 From: Eike Kettner Date: Sun, 25 Oct 2020 22:21:39 +0100 Subject: [PATCH] Replace changed item cards --- modules/webapp/src/main/elm/Data/Items.elm | 41 ++++++++++ .../webapp/src/main/elm/Page/Home/Data.elm | 4 +- .../webapp/src/main/elm/Page/Home/Update.elm | 75 ++++++++++++++++++- 3 files changed, 115 insertions(+), 5 deletions(-) diff --git a/modules/webapp/src/main/elm/Data/Items.elm b/modules/webapp/src/main/elm/Data/Items.elm index 9c393b3e..5e9d124e 100644 --- a/modules/webapp/src/main/elm/Data/Items.elm +++ b/modules/webapp/src/main/elm/Data/Items.elm @@ -3,11 +3,13 @@ module Data.Items exposing , first , idSet , length + , replaceIn ) import Api.Model.ItemLight exposing (ItemLight) import Api.Model.ItemLightGroup exposing (ItemLightGroup) import Api.Model.ItemLightList exposing (ItemLightList) +import Dict exposing (Dict) import Set exposing (Set) import Util.List @@ -79,3 +81,42 @@ idSetGroup : ItemLightGroup -> Set String idSetGroup group = List.map .id group.items |> Set.fromList + + +replaceIn : ItemLightList -> ItemLightList -> ItemLightList +replaceIn origin replacements = + let + newItems = + mkItemDict replacements + + replaceItem item = + case Dict.get item.id newItems of + Just ni -> + ni + + Nothing -> + item + + replaceGroup g = + List.map replaceItem g.items + |> ItemLightGroup g.name + in + List.map replaceGroup origin.groups + |> ItemLightList + + + +--- Helper + + +mkItemDict : ItemLightList -> Dict String ItemLight +mkItemDict list = + let + insertItems : Dict String ItemLight -> List ItemLight -> Dict String ItemLight + insertItems dict items = + List.foldl (\i -> \d -> Dict.insert i.id i d) dict items + + insertGroup dict groups = + List.foldl (\g -> \d -> insertItems d g.items) dict groups + in + insertGroup Dict.empty list.groups diff --git a/modules/webapp/src/main/elm/Page/Home/Data.elm b/modules/webapp/src/main/elm/Page/Home/Data.elm index 22709a6f..27a64671 100644 --- a/modules/webapp/src/main/elm/Page/Home/Data.elm +++ b/modules/webapp/src/main/elm/Page/Home/Data.elm @@ -17,6 +17,7 @@ module Page.Home.Data exposing ) import Api +import Api.Model.BasicResult exposing (BasicResult) import Api.Model.ItemLightList exposing (ItemLightList) import Api.Model.ItemSearch import Browser.Dom as Dom @@ -27,7 +28,6 @@ import Comp.SearchMenu import Comp.YesNoDimmer import Data.Flags exposing (Flags) import Data.ItemNav exposing (ItemNav) -import Data.ItemSelection exposing (ItemSelection) import Data.Items import Data.UiSettings exposing (UiSettings) import Http @@ -167,6 +167,8 @@ type Msg | DeleteSelectedConfirmMsg Comp.YesNoDimmer.Msg | EditSelectedItems | EditMenuMsg Comp.ItemDetail.EditMenu.Msg + | MultiUpdateResp (Result Http.Error BasicResult) + | ReplaceChangedItemsResp (Result Http.Error ItemLightList) type SearchType diff --git a/modules/webapp/src/main/elm/Page/Home/Update.elm b/modules/webapp/src/main/elm/Page/Home/Update.elm index 61a21cee..05a8259b 100644 --- a/modules/webapp/src/main/elm/Page/Home/Update.elm +++ b/modules/webapp/src/main/elm/Page/Home/Update.elm @@ -1,9 +1,14 @@ module Page.Home.Update exposing (update) +import Api +import Api.Model.IdList exposing (IdList) +import Api.Model.ItemLightList exposing (ItemLightList) +import Api.Model.ItemSearch exposing (ItemSearch) import Browser.Navigation as Nav import Comp.FixedDropdown import Comp.ItemCardList import Comp.ItemDetail.EditMenu +import Comp.ItemDetail.FormChange import Comp.SearchMenu import Comp.YesNoDimmer import Data.Flags exposing (Flags) @@ -14,7 +19,7 @@ import Page exposing (Page(..)) import Page.Home.Data exposing (..) import Process import Scroll -import Set +import Set exposing (Set) import Task import Throttle import Time @@ -424,19 +429,81 @@ update mId key flags settings msg model = sub_ = Sub.map EditMenuMsg res.sub - _ = - Debug.log "change" res.change + upCmd = + Comp.ItemDetail.FormChange.multiUpdate flags + svm.ids + res.change + MultiUpdateResp in - ( { model | viewMode = SelectView svm_ }, cmd_, sub_ ) + ( { model | viewMode = SelectView svm_ }, Cmd.batch [ cmd_, upCmd ], sub_ ) _ -> noSub ( model, Cmd.none ) + MultiUpdateResp (Ok res) -> + if res.success then + case model.viewMode of + SelectView svm -> + -- replace changed items in the view + noSub ( model, loadChangedItems flags svm.ids ) + + _ -> + noSub ( model, Cmd.none ) + + else + noSub ( model, Cmd.none ) + + MultiUpdateResp (Err _) -> + noSub ( model, Cmd.none ) + + ReplaceChangedItemsResp (Ok items) -> + noSub ( replaceItems model items, Cmd.none ) + + ReplaceChangedItemsResp (Err _) -> + noSub ( model, Cmd.none ) + --- Helpers +replaceItems : Model -> ItemLightList -> Model +replaceItems model newItems = + let + listModel = + model.itemListModel + + changed = + Data.Items.replaceIn listModel.results newItems + + newList = + { listModel | results = changed } + in + { model | itemListModel = newList } + + +loadChangedItems : Flags -> Set String -> Cmd Msg +loadChangedItems flags ids = + if Set.isEmpty ids then + Cmd.none + + else + let + searchInit = + Api.Model.ItemSearch.empty + + idList = + IdList (Set.toList ids) + + search = + { searchInit + | itemSubset = Just idList + , limit = Set.size ids + } + in + Api.itemSearch flags search ReplaceChangedItemsResp + + scrollToCard : Maybe String -> Model -> ( Model, Cmd Msg, Sub Msg ) scrollToCard mId model = let