Skip to content

Commit 8bedb7c

Browse files
authored
fix(VItemGroup): use valueComparator when updating value (#15395)
fixes #15394
1 parent 100053f commit 8bedb7c

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

packages/vuetify/src/components/VItemGroup/VItemGroup.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ export const BaseItemGroup = mixins(
219219
? this.internalValue
220220
: []
221221
const internalValue = defaultValue.slice()
222-
const index = internalValue.findIndex(val => val === value)
222+
const index = internalValue.findIndex(val => this.valueComparator(val, value))
223223

224224
if (
225225
this.mandatory &&
@@ -245,7 +245,7 @@ export const BaseItemGroup = mixins(
245245
this.internalValue = internalValue
246246
},
247247
updateSingle (value: any) {
248-
const isSame = value === this.internalValue
248+
const isSame = this.valueComparator(this.internalValue, value)
249249

250250
if (this.mandatory && isSame) return
251251

packages/vuetify/src/components/VItemGroup/__tests__/VItemGroup.spec.ts

+29
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,18 @@ describe('VItemGroup', () => {
217217
wrapper.vm.updateSingle('foo')
218218
expect(wrapper.vm.internalValue).toBeUndefined()
219219

220+
// Toggling on and off object references
221+
wrapper.vm.updateSingle({ foo: 'foo' })
222+
expect(wrapper.vm.internalValue).toEqual({ foo: 'foo' })
223+
wrapper.vm.updateSingle({ foo: 'foo' })
224+
expect(wrapper.vm.internalValue).toBeUndefined()
225+
226+
// Toggling on and off with custom comparator
227+
wrapper.setProps({ valueComparator: (a: any, b: any) => a?.startsWith(b?.[0]), value: 'foo' })
228+
expect(wrapper.vm.internalValue).toBe('foo')
229+
wrapper.vm.updateSingle('foobar')
230+
expect(wrapper.vm.internalValue).toBeUndefined()
231+
220232
wrapper.setProps({ mandatory: true })
221233

222234
// Toggling off single mandatory
@@ -237,6 +249,12 @@ describe('VItemGroup', () => {
237249
wrapper.vm.updateMultiple('foo')
238250
expect(wrapper.vm.internalValue).toEqual([])
239251

252+
// Toggling on and off object references
253+
wrapper.vm.updateMultiple({ foo: 'foo' })
254+
expect(wrapper.vm.internalValue).toEqual([{ foo: 'foo' }])
255+
wrapper.vm.updateMultiple({ foo: 'foo' })
256+
expect(wrapper.vm.internalValue).toEqual([])
257+
240258
wrapper.setProps({ mandatory: true })
241259

242260
// Toggling off single mandatory
@@ -256,6 +274,17 @@ describe('VItemGroup', () => {
256274
expect(wrapper.vm.internalValue).toEqual(['foo', 'bar', 'fizz'])
257275
})
258276

277+
it('should update a multiple item group with a custom comparator', () => {
278+
const wrapper = mountFunction({
279+
propsData: { multiple: true },
280+
})
281+
282+
wrapper.setProps({ valueComparator: (a: any, b: any) => a?.startsWith(b?.[0]), value: ['foo'] })
283+
expect(wrapper.vm.internalValue).toEqual(['foo'])
284+
wrapper.vm.updateMultiple('foobar')
285+
expect(wrapper.vm.internalValue).toEqual([])
286+
})
287+
259288
it('should update value if mandatory and dynamic items', async () => {
260289
const wrapper = mountFunction({
261290
propsData: {

0 commit comments

Comments
 (0)