From 00924fbf79bc9707964126a6a44d027818d60463 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 29 Jun 2026 01:32:05 -0500 Subject: [PATCH] refac --- src/lib/apis/analytics/index.ts | 6 +++- .../Analytics/AnalyticsModelModal.svelte | 32 ++++++++++++++++--- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/lib/apis/analytics/index.ts b/src/lib/apis/analytics/index.ts index 6bab2cbf81..88e16c48e1 100644 --- a/src/lib/apis/analytics/index.ts +++ b/src/lib/apis/analytics/index.ts @@ -246,7 +246,9 @@ export const getModelChats = async ( startDate: number | null = null, endDate: number | null = null, skip: number = 0, - limit: number = 50 + limit: number = 50, + orderBy: string | null = null, + direction: string | null = null ) => { let error = null; @@ -255,6 +257,8 @@ export const getModelChats = async ( if (endDate) searchParams.append('end_date', endDate.toString()); if (skip) searchParams.append('skip', skip.toString()); if (limit) searchParams.append('limit', limit.toString()); + if (orderBy) searchParams.append('order_by', orderBy); + if (direction) searchParams.append('direction', direction); const res = await fetch( `${WEBUI_API_BASE_URL}/analytics/models/${encodeURIComponent(modelId)}/chats?${searchParams.toString()}`, diff --git a/src/lib/components/admin/Analytics/AnalyticsModelModal.svelte b/src/lib/components/admin/Analytics/AnalyticsModelModal.svelte index 4c6ea3e393..c716ab05ec 100644 --- a/src/lib/components/admin/Analytics/AnalyticsModelModal.svelte +++ b/src/lib/components/admin/Analytics/AnalyticsModelModal.svelte @@ -17,6 +17,7 @@ const i18n = getContext('i18n'); type Tab = 'overview' | 'chats'; + type ChatSortKey = 'title' | 'updated_at' | 'user_name'; let selectedTab: Tab = 'overview'; // Overview tab state @@ -41,6 +42,8 @@ }> = []; let chatListLoading = false; let allChatsLoaded = false; + let chatOrderBy: ChatSortKey = 'updated_at'; + let chatDirection: 'asc' | 'desc' = 'desc'; const PAGE_SIZE = 50; const close = () => { @@ -48,6 +51,8 @@ selectedTab = 'overview'; chatList = []; allChatsLoaded = false; + chatOrderBy = 'updated_at'; + chatDirection = 'desc'; history = []; tags = []; onClose(); @@ -88,7 +93,9 @@ startDate, endDate, 0, - PAGE_SIZE + PAGE_SIZE, + chatOrderBy, + chatDirection ); const chats = res?.chats ?? []; chatList = chats.map((c: any) => ({ @@ -98,7 +105,7 @@ user_id: c.user_id, user_name: c.user_name })); - allChatsLoaded = chats.length < PAGE_SIZE; + allChatsLoaded = chatList.length >= (res?.total ?? chats.length); } catch (err) { console.error('Failed to load chats:', err); chatList = []; @@ -118,7 +125,9 @@ startDate, endDate, skip, - PAGE_SIZE + PAGE_SIZE, + chatOrderBy, + chatDirection ); const chats = res?.chats ?? []; const newChats = chats.map((c: any) => ({ @@ -131,13 +140,23 @@ const existingIds = new Set(chatList.map((c) => c.id)); const uniqueNewChats = newChats.filter((c) => !existingIds.has(c.id)); chatList = [...chatList, ...uniqueNewChats]; - allChatsLoaded = chats.length < PAGE_SIZE; + allChatsLoaded = chatList.length >= (res?.total ?? chatList.length); } catch (err) { console.error('Failed to load more chats:', err); } chatListLoading = false; }; + const setChatSort = (key: ChatSortKey) => { + if (chatOrderBy === key) { + chatDirection = chatDirection === 'asc' ? 'desc' : 'asc'; + } else { + chatOrderBy = key; + chatDirection = key === 'updated_at' ? 'desc' : 'asc'; + } + loadChats(); + }; + const selectTab = (tab: Tab) => { selectedTab = tab; if (tab === 'chats' && chatList.length === 0) { @@ -150,6 +169,8 @@ selectedTab = 'overview'; chatList = []; allChatsLoaded = false; + chatOrderBy = 'updated_at'; + chatDirection = 'desc'; selectedRange = '30d'; loadOverview(30); } @@ -251,6 +272,9 @@ allLoaded={allChatsLoaded} showUserInfo={true} shareUrl={true} + orderBy={chatOrderBy} + direction={chatDirection} + onSort={setChatSort} onLoadMore={loadMoreChats} onChatClick={() => (show = false)} />