From 342582676a5212bf196a69d11825cb407992f257 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 2 Apr 2026 02:57:45 -0500 Subject: [PATCH] refac --- .../admin/Evaluations/Feedbacks.svelte | 90 ++++++++++++++++--- 1 file changed, 76 insertions(+), 14 deletions(-) diff --git a/src/lib/components/admin/Evaluations/Feedbacks.svelte b/src/lib/components/admin/Evaluations/Feedbacks.svelte index 0e47aaba0..6e11291d5 100644 --- a/src/lib/components/admin/Evaluations/Feedbacks.svelte +++ b/src/lib/components/admin/Evaluations/Feedbacks.svelte @@ -25,6 +25,7 @@ import FeedbackMenu from './FeedbackMenu.svelte'; import FeedbackModal from './FeedbackModal.svelte'; import EllipsisHorizontal from '$lib/components/icons/EllipsisHorizontal.svelte'; + import Dropdown from '$lib/components/common/Dropdown.svelte'; import ChevronUp from '$lib/components/icons/ChevronUp.svelte'; import ChevronDown from '$lib/components/icons/ChevronDown.svelte'; @@ -148,7 +149,40 @@ window.addEventListener('message', messageHandler, false); }; - const exportHandler = async () => { + const feedbacksToCsv = (feedbacks) => { + const rows = feedbacks.map((f) => { + const { data, ...rest } = f; + return { + id: rest.id, + user_id: rest.user_id, + chat_id: data?.chat_id ?? '', + model_id: data?.model_id ?? '', + sibling_model_ids: (data?.sibling_model_ids ?? []).join(';'), + rating: data?.rating ?? '', + reason: data?.reason ?? '', + comment: data?.comment ?? '', + created_at: rest.created_at, + updated_at: rest.updated_at + }; + }); + + if (rows.length === 0) return ''; + + const headers = Object.keys(rows[0]); + const escape = (val) => { + const s = String(val ?? ''); + return s.includes(',') || s.includes('"') || s.includes('\n') + ? `"${s.replace(/"/g, '""')}"` + : s; + }; + + return [ + headers.join(','), + ...rows.map((r) => headers.map((h) => escape(r[h])).join(',')) + ].join('\n'); + }; + + const exportHandler = async (format: 'json' | 'csv' = 'json') => { const _feedbacks = await exportAllFeedbacks(localStorage.token, selectedModelId).catch( (err) => { toast.error(err); @@ -157,10 +191,16 @@ ); if (_feedbacks) { - let blob = new Blob([JSON.stringify(_feedbacks)], { - type: 'application/json' - }); - saveAs(blob, `feedback-history-export-${Date.now()}.json`); + if (format === 'csv') { + const csv = feedbacksToCsv(_feedbacks); + let blob = new Blob([csv], { type: 'text/csv' }); + saveAs(blob, `feedback-history-export-${Date.now()}.csv`); + } else { + let blob = new Blob([JSON.stringify(_feedbacks)], { + type: 'application/json' + }); + saveAs(blob, `feedback-history-export-${Date.now()}.json`); + } } }; @@ -190,16 +230,38 @@
{#if total > 0} - + +
+
+ + + +
- + {/if}