diff --git a/packages/pinia-orm/src/model/Model.ts b/packages/pinia-orm/src/model/Model.ts index 97986241f..3cde08763 100644 --- a/packages/pinia-orm/src/model/Model.ts +++ b/packages/pinia-orm/src/model/Model.ts @@ -259,6 +259,7 @@ export class Model { */ static clearBootedModels(): void { this.booted = {} + this.original = {} this.schemas = {} this.fieldMutators = {} this.fieldCasts = {} @@ -745,7 +746,7 @@ export class Model { this[key] = this[key] ?? keyValue } - operation === 'set' && (this.$self().original = this.$getAttributes()) + operation === 'set' && (this.$self().original[this.$getKey(this, true) as string] = this.$getAttributes()) modelConfig.withMeta && operation === 'set' && this.$fillMeta(options.action) @@ -930,7 +931,7 @@ export class Model { * Get the original values of the model instance */ $getOriginal(): Element { - return this.$self().original + return this.$self().original[this.$getKey(this, true) as string] } /** diff --git a/packages/pinia-orm/src/store/Config.ts b/packages/pinia-orm/src/store/Config.ts index 0cd001c98..48ca18274 100644 --- a/packages/pinia-orm/src/store/Config.ts +++ b/packages/pinia-orm/src/store/Config.ts @@ -4,7 +4,7 @@ import type { FilledInstallOptions } from './Store' export const CONFIG_DEFAULTS = { model: { withMeta: false, - hidden: ['_meta'], + hidden: ['_meta', 'original'], visible: ['*'], }, cache: { diff --git a/packages/pinia-orm/tests/unit/model/Model.spec.ts b/packages/pinia-orm/tests/unit/model/Model.spec.ts index afb01ebb7..48939b136 100644 --- a/packages/pinia-orm/tests/unit/model/Model.spec.ts +++ b/packages/pinia-orm/tests/unit/model/Model.spec.ts @@ -1,6 +1,7 @@ import { describe, expect, it } from 'vitest' +import { computed } from 'vue-demi' -import { Model } from '../../../src' +import { Model, useRepo } from '../../../src' import { Attr } from '../../../src/decorators' describe('unit/model/Model', () => { @@ -40,4 +41,27 @@ describe('unit/model/Model', () => { expect(user.lastName).toBe('John Doe') expect(() => user.$isDirty('name')).toThrowError() }) + + it('it displays states correctly with multiple same models', () => { + const userRepo = useRepo(User) + userRepo.save([ + { + id: 1, + lastName: 'JohnK', + }, + { + id: 2, + lastName: 'JaneD', + }, + { + id: 3, + lastName: 'TomH', + }, + ]) + + const users = computed(() => userRepo.all()) + const usersOriginal = computed(() => users.value.map(u => u.$getOriginal())) + + expect(users.value.map(user => user.$toJson())).toEqual(usersOriginal.value) + }) })