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
, 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

View File

@ -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

View File

@ -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