Skip to content

ReplaceItems option doesn't works when patching/updating value with null #599

Open
@J3m5

Description

@J3m5

Steps to reproduce

If you make an update with deleted properties or a patch with properties with null values, you'll get back the new items from the api without those properties.
When adding the replaceItems for the items to be completely replaced, this doesn't works because a merge is still done at the end, the items are not replaced.

Expected behavior

The replaceItems option should really replace the item.

Actual behavior

With replaceItems set to true and with an existing item, a new instance is created with the item received from the api.

if (replaceItems) {
if (Model && !(item instanceof Model)) {
item = new Model(item)
}
Vue.set(state.keyedById, id, item)
// Merge in changes
} else {

Then in the base model constructor, the mergeInstance mutation is called.

if (existingItem) {
data = setupInstance.call(this, data, { models, store }) || data
_commit.call(this.constructor, 'mergeInstance', data)
return existingItem
}

Which then call the mergeWithAccessor function
function mergeInstance(state, item) {
const { idField } = state
const id = getId(item, idField)
const existingItem = state.keyedById[id]
if (existingItem) {
mergeWithAccessors(existingItem, item)
}
}

Possible solution

The mergeInstance mutation in the base model should be called only if replaceItems is not set to true.

System configuration

Module versions: 3.16.0

NodeJS version: 14.17.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions