diff --git a/app/javascript/dashboard/components-next/dropdown-menu/DropdownMenu.vue b/app/javascript/dashboard/components-next/dropdown-menu/DropdownMenu.vue index 6276dfec6..b79f3a0d2 100644 --- a/app/javascript/dashboard/components-next/dropdown-menu/DropdownMenu.vue +++ b/app/javascript/dashboard/components-next/dropdown-menu/DropdownMenu.vue @@ -4,6 +4,7 @@ import { useI18n } from 'vue-i18n'; import Icon from 'dashboard/components-next/icon/Icon.vue'; import Avatar from 'dashboard/components-next/avatar/Avatar.vue'; +import Spinner from 'dashboard/components-next/spinner/Spinner.vue'; const props = defineProps({ menuItems: { @@ -37,9 +38,17 @@ const props = defineProps({ type: String, default: '', }, + disableLocalFiltering: { + type: Boolean, + default: false, + }, + isLoading: { + type: Boolean, + default: false, + }, }); -const emit = defineEmits(['action']); +const emit = defineEmits(['action', 'search']); const { t } = useI18n(); @@ -57,6 +66,7 @@ const flattenedMenuItems = computed(() => { }); const filteredMenuItems = computed(() => { + if (props.disableLocalFiltering) return props.menuItems; if (!searchQuery.value) return flattenedMenuItems.value; return flattenedMenuItems.value.filter(item => @@ -69,7 +79,7 @@ const filteredMenuSections = computed(() => { return []; } - if (!searchQuery.value) { + if (props.disableLocalFiltering || !searchQuery.value) { return props.menuSections; } @@ -89,6 +99,12 @@ const filteredMenuSections = computed(() => { .filter(section => section.items.length > 0); }); +const handleSearchInput = event => { + if (props.disableLocalFiltering) { + emit('search', event.target.value); + } +}; + const handleAction = item => { const { action, value, ...rest } = item; emit('action', { action, value, ...rest }); @@ -118,7 +134,7 @@ onMounted(() => { >
@@ -130,6 +146,7 @@ onMounted(() => { searchPlaceholder || t('DROPDOWN_MENU.SEARCH_PLACEHOLDER') " class="reset-base w-full h-8 py-2 pl-10 pr-2 text-sm focus:outline-none border-none rounded-lg bg-n-alpha-black2 dark:bg-n-solid-1 text-n-slate-12" + @input="handleSearchInput" />
@@ -141,10 +158,23 @@ onMounted(() => { >

{{ section.title }}

+
+ +
+
+ {{ section.emptyState }} +
{
{ : t('DROPDOWN_MENU.EMPTY_STATE') }}
+ diff --git a/app/javascript/dashboard/components-next/filter/ActiveFilterPreview.vue b/app/javascript/dashboard/components-next/filter/ActiveFilterPreview.vue index 38b3d72db..125db2722 100644 --- a/app/javascript/dashboard/components-next/filter/ActiveFilterPreview.vue +++ b/app/javascript/dashboard/components-next/filter/ActiveFilterPreview.vue @@ -39,38 +39,45 @@ const formatFilterValue = value => { // Case 2: array → map each item, use name if present, else the item itself if (Array.isArray(value)) { + // Empty array + if (value.length === 0) return ''; return value.map(item => item?.name ?? item).join(', '); } - // Case 3: object with a "name" property → return name - // Case 4: primitive (string, number, etc.) → return as is + // Case 3: empty object + if (typeof value === 'object' && Object.keys(value).length === 0) { + return ''; + } + + // Case 4: object with a "name" property → return name + // Case 5: primitive (string, number, etc.) → return as is return value?.name ?? value; }; diff --git a/app/javascript/dashboard/components-next/filter/ConversationFilter.vue b/app/javascript/dashboard/components-next/filter/ConversationFilter.vue index 79897d944..30b92fd41 100644 --- a/app/javascript/dashboard/components-next/filter/ConversationFilter.vue +++ b/app/javascript/dashboard/components-next/filter/ConversationFilter.vue @@ -1,12 +1,14 @@ + + diff --git a/app/javascript/dashboard/components/ChatListHeader.vue b/app/javascript/dashboard/components/ChatListHeader.vue index a5f6490d7..50baf5dcb 100644 --- a/app/javascript/dashboard/components/ChatListHeader.vue +++ b/app/javascript/dashboard/components/ChatListHeader.vue @@ -18,13 +18,7 @@ const props = defineProps({ isListLoading: { type: Boolean, required: true }, }); -const emit = defineEmits([ - 'addFolders', - 'deleteFolders', - 'resetFilters', - 'basicFilterChange', - 'filtersModal', -]); +const emit = defineEmits(['basicFilterChange', 'filtersModal']); const { uiSettings, updateUISettings } = useUISettings(); @@ -56,12 +50,7 @@ const toggleConversationLayout = () => {