mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-03-25 16:45:05 +00:00
Replace changed item cards
This commit is contained in:
parent
458fa7edd9
commit
5735a47199
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user