From 7b83c1569edda145fbedcb885ccaf5cbe92b1702 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=A5=9E=E6=A5=BD=E5=9D=82=E3=81=BF=E3=81=9A=E3=81=8D?=
<45122329+CokeMine@users.noreply.github.com>
Date: Thu, 11 Mar 2021 20:32:36 +0800
Subject: [PATCH] fix(select): tag can't close if the option is disabled
(#1605)
* fix(select): tag can't close if the option is disabled
re #1594, #1595
* fix(select): same change on collapse tag
* test: add test for tag of disabled option is not closable
* fix: fix when select is clearable
* test: add test
---
packages/select/__tests__/select.spec.ts | 66 +++++++++++++++++++++++-
packages/select/src/select.vue | 4 +-
packages/select/src/useSelect.ts | 6 +++
3 files changed, 73 insertions(+), 3 deletions(-)
diff --git a/packages/select/__tests__/select.spec.ts b/packages/select/__tests__/select.spec.ts
index f095e2cbf9..81c71cad1d 100644
--- a/packages/select/__tests__/select.spec.ts
+++ b/packages/select/__tests__/select.spec.ts
@@ -115,6 +115,7 @@ describe('Select', () => {
afterEach(() => {
document.body.innerHTML = ''
})
+
test('create', async () => {
const wrapper = _mount(``, () => ({ value: '' }))
expect(wrapper.classes()).toContain('el-select')
@@ -166,7 +167,6 @@ describe('Select', () => {
expect(wrapper.find('.el-input__inner').element.value).toBe('双皮奶')
})
-
test('sync set value and options', async () => {
const wrapper = _mount(`
@@ -859,4 +859,68 @@ describe('Select', () => {
await nextTick()
expect(vm.value).toBe('Shanghai')
})
+
+ test('tag of disabled option is not closable', async () => {
+ const wrapper = _mount(`
+
+
+
+ `, () => ({
+ vendors: [2, 3, 4],
+ isCollapsed: false,
+ isClearable: false,
+ options: [
+ { name: 'Test 1', isDisabled: false },
+ { name: 'Test 2', isDisabled: true },
+ { name: 'Test 3', isDisabled: false },
+ { name: 'Test 4', isDisabled: true },
+ ],
+ }))
+ const vm = wrapper.vm as any
+ await vm.$nextTick()
+ const selectVm = wrapper.findComponent({ name: 'ElSelect' }).vm as any
+ expect(wrapper.findAll('.el-tag').length).toBe(3)
+ const tagCloseIcons = wrapper.findAll('.el-tag__close')
+ expect(tagCloseIcons.length).toBe(1)
+ await tagCloseIcons[0].trigger('click')
+ expect(wrapper.findAll('.el-tag__close').length).toBe(0)
+ expect(wrapper.findAll('.el-tag').length).toBe(2)
+
+ //test if is clearable
+ vm.isClearable = true
+ vm.vendors = [2, 3, 4]
+ await vm.$nextTick()
+ selectVm.inputHovering = true
+ await selectVm.$nextTick()
+ const iconClear = wrapper.find('.el-input__icon.el-icon-circle-close')
+ expect(wrapper.findAll('.el-tag').length).toBe(3)
+ await iconClear.trigger('click')
+ expect(wrapper.findAll('.el-tag').length).toBe(2)
+
+ // test for collapse select
+ vm.vendors = [1, 2, 4]
+ vm.isCollapsed = true
+ vm.isClearable = false
+ await vm.$nextTick()
+ expect(wrapper.findAll('.el-tag').length).toBe(2)
+ await wrapper.find('.el-tag__close').trigger('click')
+ expect(wrapper.findAll('.el-tag').length).toBe(2)
+ expect(wrapper.findAll('.el-tag__close').length).toBe(0)
+
+ // test for collapse select if is clearable
+ vm.vendors = [1, 2, 4]
+ vm.isCollapsed = true
+ vm.isClearable = true
+ await vm.$nextTick()
+ expect(wrapper.findAll('.el-tag__close').length).toBe(1)
+ await wrapper.find('.el-tag__close').trigger('click')
+ expect(wrapper.findAll('.el-tag').length).toBe(2)
+ expect(wrapper.findAll('.el-tag__close').length).toBe(0)
+ })
})
diff --git a/packages/select/src/select.vue b/packages/select/src/select.vue
index d66b727e83..c312b1eaf0 100644
--- a/packages/select/src/select.vue
+++ b/packages/select/src/select.vue
@@ -31,7 +31,7 @@
>
{
option = {
value,
currentLabel: cachedOption.currentLabel,
+ isDisabled: cachedOption.isDisabled,
}
break
}
@@ -469,6 +470,11 @@ export const useSelect = (props, states: States, ctx) => {
const deleteSelected = event => {
event.stopPropagation()
const value = props.multiple ? [] : ''
+ if (typeof value !== 'string') {
+ for (const item of states.selected) {
+ if (item.isDisabled) value.push(item.value)
+ }
+ }
ctx.emit(UPDATE_MODEL_EVENT, value)
emitChange(value)
states.visible = false