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