mirror of
https://github.com/tenrok/vue-select.git
synced 2026-06-22 10:30:34 +03:00
fix(reduce): reduce + taggable bug (#1091)
Resolves #1089 Resolves #993
This commit is contained in:
@@ -629,7 +629,7 @@
|
|||||||
this.setInternalValueFromOptions(this.value)
|
this.setInternalValueFromOptions(this.value)
|
||||||
}
|
}
|
||||||
|
|
||||||
this.$on('option:created', this.maybePushTag)
|
this.$on('option:created', this.pushTag)
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
@@ -662,7 +662,6 @@
|
|||||||
}
|
}
|
||||||
this.updateValue(option);
|
this.updateValue(option);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.onAfterSelect(option)
|
this.onAfterSelect(option)
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -772,7 +771,7 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finds an option from this.options
|
* Finds an option from the options
|
||||||
* where a reduced value matches
|
* where a reduced value matches
|
||||||
* the passed in value.
|
* the passed in value.
|
||||||
*
|
*
|
||||||
@@ -780,7 +779,24 @@
|
|||||||
* @returns {*}
|
* @returns {*}
|
||||||
*/
|
*/
|
||||||
findOptionFromReducedValue (value) {
|
findOptionFromReducedValue (value) {
|
||||||
return this.options.find(option => JSON.stringify(this.reduce(option)) === JSON.stringify(value)) || value;
|
const predicate = option => JSON.stringify(this.reduce(option)) === JSON.stringify(value);
|
||||||
|
|
||||||
|
const matches = [
|
||||||
|
...this.options,
|
||||||
|
...this.pushedTags,
|
||||||
|
].filter(predicate);
|
||||||
|
|
||||||
|
if (matches.length === 1) {
|
||||||
|
return matches[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This second loop is needed to cover an edge case where `taggable` + `reduce`
|
||||||
|
* were used in conjunction with a `create-option` that doesn't create a
|
||||||
|
* unique reduced value.
|
||||||
|
* @see https://github.com/sagalbot/vue-select/issues/1089#issuecomment-597238735
|
||||||
|
*/
|
||||||
|
return matches.find(match => this.optionComparator(match, this.$data._value)) || value;
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -836,10 +852,8 @@
|
|||||||
* @param {Object || String} option
|
* @param {Object || String} option
|
||||||
* @return {void}
|
* @return {void}
|
||||||
*/
|
*/
|
||||||
maybePushTag(option) {
|
pushTag (option) {
|
||||||
if (this.pushTags) {
|
this.pushedTags.push(option);
|
||||||
this.pushedTags.push(option)
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -986,7 +1000,7 @@
|
|||||||
* @return {Array}
|
* @return {Array}
|
||||||
*/
|
*/
|
||||||
optionList () {
|
optionList () {
|
||||||
return this.options.concat(this.pushedTags);
|
return this.options.concat(this.pushTags ? this.pushedTags : []);
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -226,4 +226,33 @@ describe("When reduce prop is defined", () => {
|
|||||||
|
|
||||||
expect(Select.vm.selectedValue).toEqual([optionToChangeTo]);
|
expect(Select.vm.selectedValue).toEqual([optionToChangeTo]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('Reducing Tags', () => {
|
||||||
|
it('tracks values that have been created by the user', async () => {
|
||||||
|
const Parent = mount({
|
||||||
|
data: () => ({selected: null, options: []}),
|
||||||
|
template: `
|
||||||
|
<v-select
|
||||||
|
v-model="selected"
|
||||||
|
:options="options"
|
||||||
|
taggable
|
||||||
|
:reduce="name => name.value"
|
||||||
|
:create-option="label => ({ label, value: -1 })"
|
||||||
|
/>
|
||||||
|
`,
|
||||||
|
components: {'v-select': VueSelect},
|
||||||
|
});
|
||||||
|
const Select = Parent.vm.$children[0];
|
||||||
|
|
||||||
|
// When
|
||||||
|
Select.search = 'hello';
|
||||||
|
Select.typeAheadSelect();
|
||||||
|
await Select.$nextTick();
|
||||||
|
|
||||||
|
// Then
|
||||||
|
expect(Select.selectedValue).toEqual([{label: 'hello', value: -1}]);
|
||||||
|
expect(Select.$refs.selectedOptions.textContent.trim()).toEqual('hello');
|
||||||
|
expect(Parent.vm.selected).toEqual(-1);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user