From f6568081d8c2057aa1a708e0ca8235d2ee1c2b80 Mon Sep 17 00:00:00 2001 From: jvictordev1 Date: Mon, 9 Mar 2026 11:56:55 -0300 Subject: [PATCH 1/5] =?UTF-8?q?fix:=20corrige=20quebra=20de=20busca=20quan?= =?UTF-8?q?do=20nenhuma=20op=C3=A7=C3=A3o=20=C3=A9=20encontrada?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/components/Select.vue | 28 ++++++++++++++++++++++++---- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 20077d37..2dce9b8c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@sysvale/cuida", - "version": "3.154.8", + "version": "3.154.9", "description": "A design system built by Sysvale, using storybook and Vue components", "repository": { "type": "git", diff --git a/src/components/Select.vue b/src/components/Select.vue index e1a10905..cd15bbc4 100644 --- a/src/components/Select.vue +++ b/src/components/Select.vue @@ -325,6 +325,8 @@ const selectOptions = useTemplateRef('select-options'); const liRefs = ref({}); const { emitClick, emitFocus, emitBlur, emitKeydown } = nativeEmits(emits); const searchString = ref(''); +const isTyping = ref(false); +const internalInputValue = ref(''); /* COMPUTED */ const resolveChevronTop = computed(() => { @@ -362,7 +364,15 @@ const showAddOption = computed(() => { && !localOptions.value.some(option => option[props.optionsField]?.toLowerCase() === searchString?.value.toLowerCase()); }); -const computedModel = computed(() => localValue.value[props.optionsField]); +const computedModel = computed({ + get() { + return isTyping.value ? internalInputValue.value : localValue.value?.[props.optionsField]; + }, + set(val) { + isTyping.value = true; + internalInputValue.value = val; + } +}); //NOTE: Essa computada vai ser removida junto com a descontinuação da prop width na V4 const computedFluid = computed(() => { @@ -394,7 +404,13 @@ watch(model, (newValue, oldValue) => { }, { immediate: true }); watch(localValue, (currentValue) => { - if (currentValue === model.value) return; + if (JSON.stringify(currentValue) === JSON.stringify(model.value)) return; + + const isValueEmpty = !currentValue || (typeof currentValue === 'object' && Object.keys(currentValue).length === 0); + if (isValueEmpty) { + model.value = props.returnValue ? '' : {}; + return; + } const compatibleOptions = localOptions.value.filter( (option) => JSON.stringify(option) === JSON.stringify(currentValue), @@ -482,14 +498,14 @@ function activateSelectionOnEnter() { nextTick(() => { localValue.value = props.searchable && props.addable ? localValue.value - : cloneDeep(localOptions.value[0]); + : localOptions.value.length ? cloneDeep(localOptions.value[0]) : {}; }); - } else { localValue.value = cloneDeep(localOptions.value[currentPos.value]); } searchString.value = ''; + isTyping.value = false; select.value.blur(); } @@ -521,6 +537,7 @@ function hide() { localOptions.value = pristineOptions.value; searchString.value = ''; active.value = false; + isTyping.value = false; }); emitBlur(); @@ -529,6 +546,9 @@ function hide() { function selectItem() { searchString.value = ''; localValue.value = cloneDeep(localOptions.value[currentPos.value]); + active.value = !active.value; + isTyping.value = false; + select.value.blur(); } function getLiInDOM(position) { From afdeadcfda6751760c0cb41b8ead7d3bfed04eeb Mon Sep 17 00:00:00 2001 From: jvictordev1 Date: Tue, 10 Mar 2026 13:42:22 -0300 Subject: [PATCH 2/5] =?UTF-8?q?fix:=20corrige=20filtragem=20da=20lista=20d?= =?UTF-8?q?e=20op=C3=A7=C3=B5es=20quando=20model=20=C3=A9=20setado=20progr?= =?UTF-8?q?amaticamente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Select.vue | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/Select.vue b/src/components/Select.vue index cd15bbc4..f6c3e9c2 100644 --- a/src/components/Select.vue +++ b/src/components/Select.vue @@ -440,6 +440,10 @@ onMounted(() => { /* FUNCTIONS */ function filterOptions(value) { + if (value === localValue.value?.[props.optionsField]) { + return; + } + if (props.searchable && props.addable) { searchString.value = value; } From 74a6ef0c06ce2e6e01f7ebe2aad5fda66a46641c Mon Sep 17 00:00:00 2001 From: jvictordev1 Date: Tue, 10 Mar 2026 14:47:57 -0300 Subject: [PATCH 3/5] refactor: corrige bug ao colar texto no select --- src/components/Select.vue | 41 ++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/src/components/Select.vue b/src/components/Select.vue index f6c3e9c2..c1870282 100644 --- a/src/components/Select.vue +++ b/src/components/Select.vue @@ -328,6 +328,8 @@ const searchString = ref(''); const isTyping = ref(false); const internalInputValue = ref(''); +let isSelectingItem = false; + /* COMPUTED */ const resolveChevronTop = computed(() => { return props.mobile ? '9px' : '6px'; @@ -369,6 +371,8 @@ const computedModel = computed({ return isTyping.value ? internalInputValue.value : localValue.value?.[props.optionsField]; }, set(val) { + if (isSelectingItem) return; + isTyping.value = true; internalInputValue.value = val; } @@ -395,12 +399,17 @@ watch(() => props.options, (newValue, oldValue) => { watch(model, (newValue, oldValue) => { if (newValue !== oldValue && newValue !== localValue.value) { + isSelectingItem = true; if (newValue instanceof Object) { localValue.value = newValue; } else { localValue.value = {id: newValue, value: newValue } } } + + nextTick(() => { + isSelectingItem = false; + }); }, { immediate: true }); watch(localValue, (currentValue) => { @@ -440,7 +449,7 @@ onMounted(() => { /* FUNCTIONS */ function filterOptions(value) { - if (value === localValue.value?.[props.optionsField]) { + if (!isTyping.value) { return; } @@ -492,18 +501,24 @@ function activeSelection() { function activateSelectionOnEnter() { if (props.disabled) return; + if (localOptions.value.length === 0 && !(props.searchable && props.addable)) { + active.value = false; + isTyping.value = false; + select.value.blur(); + return; + } + active.value = !active.value; + isSelectingItem = true; resetActiveSelection(); if (typeof localOptions.value[currentPos.value] === 'undefined') { handleAddOption(); - nextTick(() => { - localValue.value = props.searchable && props.addable - ? localValue.value - : localOptions.value.length ? cloneDeep(localOptions.value[0]) : {}; - }); + localValue.value = props.searchable && props.addable + ? localValue.value + : localOptions.value.length ? cloneDeep(localOptions.value[0]) : {}; } else { localValue.value = cloneDeep(localOptions.value[currentPos.value]); } @@ -511,6 +526,10 @@ function activateSelectionOnEnter() { searchString.value = ''; isTyping.value = false; select.value.blur(); + + nextTick(() => { + isSelectingItem = false; + }); } function activateSelectionOnClick() { @@ -531,6 +550,8 @@ function activateSelectionOnClick() { } function hide() { + isSelectingItem = true; + if (!searchString.value) { localValue.value = localOptions.value.some(item => item[props.optionsField]?.toLowerCase() === get(localValue.value, props.optionsField)?.toLowerCase()) ? localValue.value @@ -542,17 +563,23 @@ function hide() { searchString.value = ''; active.value = false; isTyping.value = false; + isSelectingItem = false; }); emitBlur(); } function selectItem() { + isSelectingItem = false; searchString.value = ''; localValue.value = cloneDeep(localOptions.value[currentPos.value]); - active.value = !active.value; + active.value = false; isTyping.value = false; select.value.blur(); + + nextTick(() => { + isSelectingItem = false; + }); } function getLiInDOM(position) { From 2979e3dcaf6a9a264cf70feaa830a7dde8669d18 Mon Sep 17 00:00:00 2001 From: Lucas Nascimento Date: Wed, 11 Mar 2026 10:49:40 -0300 Subject: [PATCH 4/5] =?UTF-8?q?fix:=20Reseta=20o=20valor=20do=20campo=20qu?= =?UTF-8?q?ando=20a=20searchString=20=C3=A9=20um=20valor=20que=20n=C3=A3o?= =?UTF-8?q?=20existe,=20quando=20busc=C3=A1vel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Select.vue | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/Select.vue b/src/components/Select.vue index c1870282..41bd30f1 100644 --- a/src/components/Select.vue +++ b/src/components/Select.vue @@ -552,6 +552,10 @@ function activateSelectionOnClick() { function hide() { isSelectingItem = true; + if (!searchString.value && !props.addable) { + model.value = null; + } + if (!searchString.value) { localValue.value = localOptions.value.some(item => item[props.optionsField]?.toLowerCase() === get(localValue.value, props.optionsField)?.toLowerCase()) ? localValue.value From cdd1d981913dec5da54f04c836d4c96d899fc117 Mon Sep 17 00:00:00 2001 From: Lucas Nascimento Date: Wed, 11 Mar 2026 11:41:38 -0300 Subject: [PATCH 5/5] =?UTF-8?q?fix:=20Impede=20que=20o=20usu=C3=A1rio=20di?= =?UTF-8?q?gite=20no=20select=20quando=20ele=20est=C3=A1=20fechado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Select.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Select.vue b/src/components/Select.vue index 41bd30f1..69ea74c4 100644 --- a/src/components/Select.vue +++ b/src/components/Select.vue @@ -17,7 +17,7 @@ :onkeypress="`return ${allowSearch};`" :placeholder="placeholder" :disabled="disabled" - :readonly="!searchable" + :readonly="!searchable || !active" :support-link-url="supportLinkUrl || linkUrl" :support-link="supportLink || linkText" :floating-label="floatingLabel || mobile"