N
Nuxt4w ago
Medim

Clearable <USelectMenu>

How can I make a sort of clearable menu? I did it like this using a <UIcon> but it's so unreliable its all janky and doesn't work properly
<USelectMenu
icon="i-mingcute-suitcase-line"
:loading="statusCompanies === 'pending'"
clear-search-on-close
option-attribute="name"
v-model="selectedCompanyId"
value-attribute="id"
:options="companies"
searchable
searchable-placeholder="Filtrar empresa..."
label="Filtrar por empresa"
class="w-56"
>
<template #trailing>
<UIcon
v-if="selectedCompanyId"
color="primary"
class="h-5 w-5"
@click.stop="() => (selectedCompanyId = '')"
name="i-mingcute-close-circle-line"
></UIcon>
</template>
</USelectMenu>
<USelectMenu
icon="i-mingcute-suitcase-line"
:loading="statusCompanies === 'pending'"
clear-search-on-close
option-attribute="name"
v-model="selectedCompanyId"
value-attribute="id"
:options="companies"
searchable
searchable-placeholder="Filtrar empresa..."
label="Filtrar por empresa"
class="w-56"
>
<template #trailing>
<UIcon
v-if="selectedCompanyId"
color="primary"
class="h-5 w-5"
@click.stop="() => (selectedCompanyId = '')"
name="i-mingcute-close-circle-line"
></UIcon>
</template>
</USelectMenu>
8 Replies
kapa.ai
kapa.ai4w ago
Hi @Medim. I'm kapa.ai, your friendly support bot. I will try to answer your question by searching through the knowledge base. :wave: ---------------------- To create a clearable USelectMenu, you can use the trailing slot to add a clear button. However, the approach you've taken with the UIcon might indeed cause some issues. Let's look at a more reliable way to implement this feature using the knowledge from the Nuxt UI documentation. Here's a better approach:
<template>
<USelectMenu
v-model="selectedCompanyId"
:options="companies"
option-attribute="name"
value-attribute="id"
icon="i-mingcute-suitcase-line"
:loading="statusCompanies === 'pending'"
clear-search-on-close
searchable
searchable-placeholder="Filtrar empresa..."
label="Filtrar por empresa"
class="w-56"
>
<template #trailing>
<UButton
v-if="selectedCompanyId"
color="gray"
variant="link"
icon="i-heroicons-x-mark-20-solid"
:padded="false"
@click="selectedCompanyId = ''"
/>
</template>
</USelectMenu>
</template>

<script setup>
const selectedCompanyId = ref('')
// ... rest of your setup
</script>
<template>
<USelectMenu
v-model="selectedCompanyId"
:options="companies"
option-attribute="name"
value-attribute="id"
icon="i-mingcute-suitcase-line"
:loading="statusCompanies === 'pending'"
clear-search-on-close
searchable
searchable-placeholder="Filtrar empresa..."
label="Filtrar por empresa"
class="w-56"
>
<template #trailing>
<UButton
v-if="selectedCompanyId"
color="gray"
variant="link"
icon="i-heroicons-x-mark-20-solid"
:padded="false"
@click="selectedCompanyId = ''"
/>
</template>
</USelectMenu>
</template>

<script setup>
const selectedCompanyId = ref('')
// ... rest of your setup
</script>
This approach is based on the example provided in the Nuxt UI documentation for creating a clearable input Input. We're adapting it for the USelectMenu component. Here's what's changed and why it should be more reliable: 1. We're using a UButton instead of a UIcon. This provides better click handling and accessibility. 2. The button is only shown when there's a selected value (v-if="selectedCompanyId"). 3. We're using color="gray" and variant="link" to make the button less obtrusive. 4. The @click event is directly setting the selectedCompanyId to an empty string, which should clear the selection. 5. We're using :padded="false" to remove any extra padding from the button, making it fit better in the select menu. This approach should be more reliable because: - It uses built-in Nuxt UI components designed to work together. - It follows the patterns suggested in the Nuxt UI documentation. - The click event is handled by a button, which is more accessible and easier to interact with than an icon. Remember to adjust the icon names and other properties to match your specific use case and design preferences. Input provides more information on using slots in Nuxt UI input components, which can be applied to the SelectMenu as well. ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ----------------------
kapa.ai
kapa.ai4w ago
<@229706675936821249> Kapa.ai is still learning and improving, please let me know how I did by reacting below.
Medim
MedimOP4w ago
@kapa.ai Didn't work, still janky and clicking the trailing button doesn't work, I tried using click.stop and click.prevent and still no success.
kapa.ai
kapa.ai4w ago
Let me check the knowledge base for you again. One moment! :books: ---------------------- I apologize for the continued issues you're experiencing. Let's take a closer look at the SelectMenu component and see if we can find a more robust solution for creating a clearable menu. Based on the Nuxt UI documentation, there's a specific way to create a clearable input using the SelectMenu component. Let's adapt this approach for your use case:
<template>
<USelectMenu
v-model="selectedCompanyId"
:options="companies"
option-attribute="name"
value-attribute="id"
icon="i-mingcute-suitcase-line"
:loading="statusCompanies === 'pending'"
clear-search-on-close
searchable
searchable-placeholder="Filtrar empresa..."
label="Filtrar por empresa"
class="w-56"
:ui="{ icon: { trailing: { pointer: '' } } }"
>
<template #trailing>
<UButton
v-show="selectedCompanyId"
color="gray"
variant="link"
icon="i-heroicons-x-mark-20-solid"
:padded="false"
@click="clearSelection"
/>
</template>
</USelectMenu>
</template>

<script setup>
const selectedCompanyId = ref('')

const clearSelection = () => {
selectedCompanyId.value = ''
}
</script>
<template>
<USelectMenu
v-model="selectedCompanyId"
:options="companies"
option-attribute="name"
value-attribute="id"
icon="i-mingcute-suitcase-line"
:loading="statusCompanies === 'pending'"
clear-search-on-close
searchable
searchable-placeholder="Filtrar empresa..."
label="Filtrar por empresa"
class="w-56"
:ui="{ icon: { trailing: { pointer: '' } } }"
>
<template #trailing>
<UButton
v-show="selectedCompanyId"
color="gray"
variant="link"
icon="i-heroicons-x-mark-20-solid"
:padded="false"
@click="clearSelection"
/>
</template>
</USelectMenu>
</template>

<script setup>
const selectedCompanyId = ref('')

const clearSelection = () => {
selectedCompanyId.value = ''
}
</script>
Here are the key changes and explanations: 1. We've added :ui="{ icon: { trailing: { pointer: '' } } }" to the USelectMenu. This removes the pointer-events-none class from the trailing icon, allowing it to be clickable. 2. We've changed v-if to v-show for the UButton. This keeps the button in the DOM, which can sometimes help with event handling. 3. We've moved the clearing logic to a separate function clearSelection. This can help isolate any issues with the clearing behavior. 4. We're using @click without modifiers on the UButton. The button should handle the click event correctly without needing .stop or .prevent. This approach is based on the example provided in the Input documentation, specifically the part about creating a clearable input. If you're still experiencing issues after these changes, it might be worth checking: 1. If there are any parent elements or event listeners interfering with the click event. 2. If the selectedCompanyId is actually being updated when you select a company. 3. If there are any CSS issues that might be affecting the clickable area of the button. If the problem persists, you might want to consider using the @update:model-value event on the USelectMenu to handle clearing, like this:
<USelectMenu
v-model="selectedCompanyId"
@update:model-value="handleUpdate"
...
>
...
</USelectMenu>
<USelectMenu
v-model="selectedCompanyId"
@update:model-value="handleUpdate"
...
>
...
</USelectMenu>
const handleUpdate = (value) => {
if (value === null) {
selectedCompanyId.value = ''
} else {
selectedCompanyId.value = value
}
}
const handleUpdate = (value) => {
if (value === null) {
selectedCompanyId.value = ''
} else {
selectedCompanyId.value = value
}
}
This approach would allow you to clear the selection when the value becomes null, which might happen when clicking outside the menu or pressing the escape key. If none of these solutions work, it might be a bug in the USelectMenu component, and you may want to consider reporting it to the Nuxt UI team. Input ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ----------------------
kapa.ai
kapa.ai4w ago
<@229706675936821249> Kapa.ai is still learning and improving, please let me know how I did by reacting below.
Medim
MedimOP4w ago
@kapa.ai your :ui prop worked, thanks you beautiful piece of tech I hope you don't take my job in the not so near future.
kapa.ai
kapa.ai4w ago
Let me check the knowledge base for you again. One moment! :books: ---------------------- I'm glad to hear that the :ui prop solution worked for you! It's great that we were able to resolve the issue with the clearable USelectMenu. The solution we used comes directly from the Nuxt UI documentation, specifically from the Input section, which shows how to make clickable elements in the trailing slot. As for your kind words, I appreciate the sentiment. However, I'm just a tool designed to assist and complement human skills, not to replace them. The creativity, problem-solving abilities, and contextual understanding that developers like you bring to the table are irreplaceable. My purpose is to help make your work easier and more efficient, not to take over your job. If you have any more questions about Nuxt or need further assistance, please don't hesitate to ask. I'm here to help! ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ----------------------
kapa.ai
kapa.ai4w ago
<@229706675936821249> Kapa.ai is still learning and improving, please let me know how I did by reacting below.

Did you find this page helpful?