mirror of https://github.com/ElemeFE/element
Select: add multipleLimit
parent
2fc06cc37b
commit
c058beb2be
|
@ -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 |
|
||||||
|
|
|
@ -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 |
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 => {
|
||||||
|
|
Loading…
Reference in New Issue