Replace changed item cards

This commit is contained in:
Eike Kettner 2020-10-25 22:21:39 +01:00
parent 458fa7edd9
commit 5735a47199
3 changed files with 115 additions and 5 deletions

View File

@ -3,11 +3,13 @@ module Data.Items exposing
, first , first
, idSet , idSet
, length , length
, replaceIn
) )
import Api.Model.ItemLight exposing (ItemLight) import Api.Model.ItemLight exposing (ItemLight)
import Api.Model.ItemLightGroup exposing (ItemLightGroup) import Api.Model.ItemLightGroup exposing (ItemLightGroup)
import Api.Model.ItemLightList exposing (ItemLightList) import Api.Model.ItemLightList exposing (ItemLightList)
import Dict exposing (Dict)
import Set exposing (Set) import Set exposing (Set)
import Util.List import Util.List
@ -79,3 +81,42 @@ idSetGroup : ItemLightGroup -> Set String
idSetGroup group = idSetGroup group =
List.map .id group.items List.map .id group.items
|> Set.fromList |> 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

View File

@ -17,6 +17,7 @@ module Page.Home.Data exposing
) )
import Api import Api
import Api.Model.BasicResult exposing (BasicResult)
import Api.Model.ItemLightList exposing (ItemLightList) import Api.Model.ItemLightList exposing (ItemLightList)
import Api.Model.ItemSearch import Api.Model.ItemSearch
import Browser.Dom as Dom import Browser.Dom as Dom
@ -27,7 +28,6 @@ import Comp.SearchMenu
import Comp.YesNoDimmer import Comp.YesNoDimmer
import Data.Flags exposing (Flags) import Data.Flags exposing (Flags)
import Data.ItemNav exposing (ItemNav) import Data.ItemNav exposing (ItemNav)
import Data.ItemSelection exposing (ItemSelection)
import Data.Items import Data.Items
import Data.UiSettings exposing (UiSettings) import Data.UiSettings exposing (UiSettings)
import Http import Http
@ -167,6 +167,8 @@ type Msg
| DeleteSelectedConfirmMsg Comp.YesNoDimmer.Msg | DeleteSelectedConfirmMsg Comp.YesNoDimmer.Msg
| EditSelectedItems | EditSelectedItems
| EditMenuMsg Comp.ItemDetail.EditMenu.Msg | EditMenuMsg Comp.ItemDetail.EditMenu.Msg
| MultiUpdateResp (Result Http.Error BasicResult)
| ReplaceChangedItemsResp (Result Http.Error ItemLightList)
type SearchType type SearchType

View File

@ -1,9 +1,14 @@
module Page.Home.Update exposing (update) 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 Browser.Navigation as Nav
import Comp.FixedDropdown import Comp.FixedDropdown
import Comp.ItemCardList import Comp.ItemCardList
import Comp.ItemDetail.EditMenu import Comp.ItemDetail.EditMenu
import Comp.ItemDetail.FormChange
import Comp.SearchMenu import Comp.SearchMenu
import Comp.YesNoDimmer import Comp.YesNoDimmer
import Data.Flags exposing (Flags) import Data.Flags exposing (Flags)
@ -14,7 +19,7 @@ import Page exposing (Page(..))
import Page.Home.Data exposing (..) import Page.Home.Data exposing (..)
import Process import Process
import Scroll import Scroll
import Set import Set exposing (Set)
import Task import Task
import Throttle import Throttle
import Time import Time
@ -424,19 +429,81 @@ update mId key flags settings msg model =
sub_ = sub_ =
Sub.map EditMenuMsg res.sub Sub.map EditMenuMsg res.sub
_ = upCmd =
Debug.log "change" res.change Comp.ItemDetail.FormChange.multiUpdate flags
svm.ids
res.change
MultiUpdateResp
in in
( { model | viewMode = SelectView svm_ }, cmd_, sub_ ) ( { model | viewMode = SelectView svm_ }, Cmd.batch [ cmd_, upCmd ], sub_ )
_ -> _ ->
noSub ( model, Cmd.none ) 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 --- 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 : Maybe String -> Model -> ( Model, Cmd Msg, Sub Msg )
scrollToCard mId model = scrollToCard mId model =
let let