Select: add multipleLimit

pull/1401/head
Leopoldthecoder 2016-11-28 22:34:03 +08:00
parent 2fc06cc37b
commit c058beb2be
5 changed files with 35 additions and 2 deletions

View File

@ -575,6 +575,7 @@ Enter keywords and search data from server.
| multiple | whether multiple-select is activated | boolean | — | false | | multiple | whether multiple-select is activated | boolean | — | false |
| disabled | whether Select is disabled | boolean | — | false | | disabled | whether Select is disabled | boolean | — | false |
| clearable | whether single select can be cleared | boolean | — | false | | clearable | whether single select can be cleared | boolean | — | false |
| multiple-limit | maximum number of options user can select when `multiple` is `true`. No limit when set to 0 | number | — | 0 |
| name | the name attribute of select input | string | — | — | | name | the name attribute of select input | string | — | — |
| placeholder | placeholder | string | — | Select | | placeholder | placeholder | string | — | Select |
| filterable | whether Select is filterable | boolean | — | false | | filterable | whether Select is filterable | boolean | — | false |

View File

@ -590,6 +590,7 @@
| multiple | 是否多选 | boolean | — | false | | multiple | 是否多选 | boolean | — | false |
| disabled | 是否禁用 | boolean | — | false | | disabled | 是否禁用 | boolean | — | false |
| clearable | 单选时是否可以清空选项 | boolean | — | false | | clearable | 单选时是否可以清空选项 | boolean | — | false |
| multiple-limit | 多选时用户最多可以选择的项目数,为 0 则不限制 | number | — | 0 |
| name | select input 的 name 属性 | string | — | — | | name | select input 的 name 属性 | string | — | — |
| placeholder | 占位符 | string | — | 请选择 | | placeholder | 占位符 | string | — | 请选择 |
| filterable | 是否可搜索 | boolean | — | false | | filterable | 是否可搜索 | boolean | — | false |

View File

@ -6,7 +6,7 @@
v-show="visible" v-show="visible"
:class="{ :class="{
'selected': itemSelected, 'selected': itemSelected,
'is-disabled': disabled || groupDisabled, 'is-disabled': disabled || groupDisabled || limitReached,
'hover': parent.hoverIndex === index 'hover': parent.hoverIndex === index
}"> }">
<slot> <slot>
@ -72,6 +72,16 @@
} else { } else {
return this.parent.value.indexOf(this.value) > -1; return this.parent.value.indexOf(this.value) > -1;
} }
},
limitReached() {
if (this.parent.multiple) {
return !this.itemSelected &&
this.parent.value.length >= this.parent.multipleLimit &&
this.parent.multipleLimit > 0;
} else {
return false;
}
} }
}, },

View File

@ -154,6 +154,10 @@
remoteMethod: Function, remoteMethod: Function,
filterMethod: Function, filterMethod: Function,
multiple: Boolean, multiple: Boolean,
multipleLimit: {
type: Number,
default: 0
},
placeholder: { placeholder: {
type: String, type: String,
default() { default() {
@ -398,7 +402,7 @@
}); });
if (optionIndex > -1) { if (optionIndex > -1) {
this.value.splice(optionIndex, 1); this.value.splice(optionIndex, 1);
} else { } else if (this.multipleLimit <= 0 || this.value.length < this.multipleLimit) {
this.value.push(option.value); this.value.push(option.value);
} }
} }

View File

@ -6,6 +6,7 @@ describe('Select', () => {
['multiple', 'clearable', 'filterable', 'remote'].forEach(config => { ['multiple', 'clearable', 'filterable', 'remote'].forEach(config => {
configs[config] = configs[config] || false; configs[config] = configs[config] || false;
}); });
configs.multipleLimit = configs.multipleLimit || 0;
if (!options) { if (!options) {
options = [{ options = [{
value: '选项1', value: '选项1',
@ -35,6 +36,7 @@ describe('Select', () => {
<el-select <el-select
v-model="value" v-model="value"
:multiple="multiple" :multiple="multiple"
:multiple-limit="multipleLimit"
:clearable="clearable" :clearable="clearable"
:filterable="filterable" :filterable="filterable"
:filterMethod="filterMethod" :filterMethod="filterMethod"
@ -55,6 +57,7 @@ describe('Select', () => {
return { return {
options, options,
multiple: configs.multiple, multiple: configs.multiple,
multipleLimit: configs.multipleLimit,
clearable: configs.clearable, clearable: configs.clearable,
filterable: configs.filterable, filterable: configs.filterable,
loading: false, loading: false,
@ -368,6 +371,20 @@ describe('Select', () => {
}, 100); }, 100);
}); });
it('multiple limit', done => {
vm = getSelectVm({ multiple: true, multipleLimit: 1 });
const options = vm.$el.querySelectorAll('.el-select-dropdown__item');
options[1].click();
setTimeout(() => {
expect(vm.value.indexOf('选项2') > -1).to.true;
options[3].click();
setTimeout(() => {
expect(vm.value.indexOf('选项4')).to.equal(-1);
done();
}, 50);
}, 50);
});
it('multiple remote search', done => { it('multiple remote search', done => {
const remoteMethod = vm => { const remoteMethod = vm => {
return query => { return query => {