From 126b4d13b133dc1efd9b6f1d6104f8c4c093de58 Mon Sep 17 00:00:00 2001 From: jvictordev1 Date: Mon, 29 Jun 2026 10:43:55 -0300 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20remove=20emiss=C3=A3o=20de=20objeto?= =?UTF-8?q?=20vazio=20ao=20realizar=20blur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Select.vue | 7 +------ src/tests/Select.spec.js | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/components/Select.vue b/src/components/Select.vue index f23aaaf48..321f34c4b 100644 --- a/src/components/Select.vue +++ b/src/components/Select.vue @@ -446,7 +446,7 @@ function filterOptions(value) { return; } - if (props.searchable && props.addable) { + if (props.searchable) { searchString.value = value; } @@ -601,11 +601,6 @@ function hide() { localValue.value = null; } - if (!searchString.value && !shouldClearSelection) { - localValue.value = localOptions.value.some(item => item[props.optionsField]?.toLowerCase() === get(localValue.value, props.optionsField)?.toLowerCase()) - ? localValue.value - : {}; - } nextTick(() => { localOptions.value = pristineOptions.value; diff --git a/src/tests/Select.spec.js b/src/tests/Select.spec.js index 929f1820d..e36ed0a07 100644 --- a/src/tests/Select.spec.js +++ b/src/tests/Select.spec.js @@ -180,4 +180,41 @@ describe('Select', () => { await wrapper.find('input').trigger('blur'); expect(wrapper.vm.active).toBe(false); }); + + test('does not emit update:modelValue when focused and blurred without changes (when modelValue is empty)', async () => { + const wrapper = mount(Select, { + props: { + label: 'label', + id: 'select-input', + options: [{ value: 'Option 1' }, { value: 'Option 2' }], + modelValue: undefined, + }, + }); + + await wrapper.find('input').trigger('focus'); + await wrapper.find('input').trigger('blur'); + + expect(wrapper.emitted('update:modelValue')).toBeUndefined(); + }); + + test('does not reset modelValue when blurred with active filtered search (searchable: true)', async () => { + const wrapper = mount(Select, { + props: { + label: 'label', + id: 'select-input', + options: [{ value: 'Option 1' }, { value: 'Option 2' }], + searchable: true, + modelValue: { value: 'Option 1' }, + }, + }); + + await wrapper.find('input').trigger('focus'); + await wrapper.find('input').setValue('Option 2'); + await wrapper.findComponent(CdsBaseInput).trigger('input'); + + await wrapper.find('input').trigger('blur'); + + expect(wrapper.emitted('update:modelValue')).toBeUndefined(); + expect(wrapper.vm.localValue).toEqual({ value: 'Option 1' }); + }); }); From afae910e8f594fef4ba3593b513090fe92f9b2d7 Mon Sep 17 00:00:00 2001 From: jvictordev1 Date: Mon, 29 Jun 2026 11:24:47 -0300 Subject: [PATCH 2/2] =?UTF-8?q?test:=20adiciona=20teste=20para=20valida?= =?UTF-8?q?=C3=A7=C3=A3o=20da=20pesquisa=20por=20op=C3=A7=C3=B5es=20inexis?= =?UTF-8?q?tentes=20e=20bumpa=20vers=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/tests/Select.spec.js | 25 +++++++++++++++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 12793b4c9..f2e682e26 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@sysvale/cuida", - "version": "3.158.3", + "version": "3.158.4", "description": "A design system built by Sysvale, using storybook and Vue components", "repository": { "type": "git", diff --git a/src/tests/Select.spec.js b/src/tests/Select.spec.js index e36ed0a07..fef828339 100644 --- a/src/tests/Select.spec.js +++ b/src/tests/Select.spec.js @@ -1,7 +1,7 @@ -import { describe, test, expect } from 'vitest'; import { mount } from '@vue/test-utils'; -import Select from '../components/Select.vue'; +import { describe, expect, test } from 'vitest'; import CdsBaseInput from '../components/BaseInput.vue'; +import Select from '../components/Select.vue'; describe('Select', () => { test('renders correctly', () => { @@ -217,4 +217,25 @@ describe('Select', () => { expect(wrapper.emitted('update:modelValue')).toBeUndefined(); expect(wrapper.vm.localValue).toEqual({ value: 'Option 1' }); }); + + test('set modelValue to null when blurred with active filtered search that does not find any items (searchable: true)', async () => { + const wrapper = mount(Select, { + props: { + label: 'label', + id: 'select-input', + options: [{ value: 'Option 1' }, { value: 'Option 2' }], + searchable: true, + modelValue: { value: 'Option 1' }, + }, + }); + + await wrapper.find('input').trigger('focus'); + await wrapper.find('input').setValue('Not an option'); + await wrapper.findComponent(CdsBaseInput).trigger('input'); + + await wrapper.find('input').trigger('blur'); + + expect(wrapper.emitted('update:modelValue')).toStrictEqual([[ null ]]); + expect(wrapper.vm.localValue).toBeNull(); + }); });