mirror of
https://github.com/QuantumNous/new-api.git
synced 2026-09-07 01:56:53 +00:00
feat(ui): improve table controls and analytics filters
This commit is contained in:
+66
-22
@@ -11,6 +11,12 @@ import {
|
||||
CardStaggerItem,
|
||||
FadeIn,
|
||||
} from '@/components/page-transition'
|
||||
import {
|
||||
buildDefaultDashboardFilters,
|
||||
getSavedChartPreferences,
|
||||
saveChartPreferences,
|
||||
} from './lib'
|
||||
import { ModelsChartPreferences } from './components/models/models-chart-preferences'
|
||||
import { ModelsFilter } from './components/models/models-filter-dialog'
|
||||
import { AnnouncementsPanel } from './components/overview/announcements-panel'
|
||||
import { ApiInfoPanel } from './components/overview/api-info-panel'
|
||||
@@ -23,7 +29,11 @@ import {
|
||||
DASHBOARD_DEFAULT_SECTION,
|
||||
DASHBOARD_SECTION_IDS,
|
||||
} from './section-registry'
|
||||
import { type DashboardFilters, type QuotaDataItem } from './types'
|
||||
import {
|
||||
type DashboardChartPreferences,
|
||||
type DashboardFilters,
|
||||
type QuotaDataItem,
|
||||
} from './types'
|
||||
|
||||
const route = getRouteApi('/_authenticated/dashboard/$section')
|
||||
|
||||
@@ -107,17 +117,21 @@ export function Dashboard() {
|
||||
const activeSection = (params.section ??
|
||||
DASHBOARD_DEFAULT_SECTION) as DashboardSectionId
|
||||
|
||||
const [modelFilters, setModelFilters] = useState<DashboardFilters>({})
|
||||
const [modelData, setModelData] = useState<QuotaDataItem[]>([])
|
||||
const [dataLoading, setDataLoading] = useState(false)
|
||||
const [chartPreferences, setChartPreferences] =
|
||||
useState<DashboardChartPreferences>(() => getSavedChartPreferences())
|
||||
const [modelFilters, setModelFilters] = useState<DashboardFilters>(() =>
|
||||
buildDefaultDashboardFilters(getSavedChartPreferences())
|
||||
)
|
||||
|
||||
const handleFilterChange = useCallback((filters: DashboardFilters) => {
|
||||
setModelFilters(filters)
|
||||
}, [])
|
||||
|
||||
const handleResetFilters = useCallback(() => {
|
||||
setModelFilters({})
|
||||
}, [])
|
||||
setModelFilters(buildDefaultDashboardFilters(chartPreferences))
|
||||
}, [chartPreferences])
|
||||
|
||||
const handleDataUpdate = useCallback(
|
||||
(data: QuotaDataItem[], loading: boolean) => {
|
||||
@@ -127,6 +141,15 @@ export function Dashboard() {
|
||||
[]
|
||||
)
|
||||
|
||||
const handleChartPreferencesChange = useCallback(
|
||||
(preferences: DashboardChartPreferences) => {
|
||||
setChartPreferences(preferences)
|
||||
setModelFilters(buildDefaultDashboardFilters(preferences))
|
||||
saveChartPreferences(preferences)
|
||||
},
|
||||
[]
|
||||
)
|
||||
|
||||
const meta = SECTION_META[activeSection] ?? SECTION_META.overview
|
||||
const isAdmin = Boolean(userRole && userRole >= ROLE.ADMIN)
|
||||
const visibleSections = useMemo(
|
||||
@@ -146,6 +169,20 @@ export function Dashboard() {
|
||||
[navigate]
|
||||
)
|
||||
const showSectionTabs = activeSection !== 'overview' && visibleSections.length > 1
|
||||
const modelActions =
|
||||
activeSection === 'models' ? (
|
||||
<>
|
||||
<ModelsChartPreferences
|
||||
preferences={chartPreferences}
|
||||
onPreferencesChange={handleChartPreferencesChange}
|
||||
/>
|
||||
<ModelsFilter
|
||||
preferences={chartPreferences}
|
||||
onFilterChange={handleFilterChange}
|
||||
onReset={handleResetFilters}
|
||||
/>
|
||||
</>
|
||||
) : null
|
||||
|
||||
return (
|
||||
<SectionPageLayout>
|
||||
@@ -153,26 +190,29 @@ export function Dashboard() {
|
||||
<SectionPageLayout.Description>
|
||||
{t(meta.descriptionKey)}
|
||||
</SectionPageLayout.Description>
|
||||
{activeSection === 'models' && (
|
||||
<SectionPageLayout.Actions>
|
||||
<ModelsFilter
|
||||
onFilterChange={handleFilterChange}
|
||||
onReset={handleResetFilters}
|
||||
/>
|
||||
</SectionPageLayout.Actions>
|
||||
)}
|
||||
<SectionPageLayout.Content>
|
||||
<div className='space-y-4'>
|
||||
{showSectionTabs && (
|
||||
<Tabs value={activeSection} onValueChange={handleSectionChange}>
|
||||
<TabsList className='h-auto max-w-full flex-wrap justify-start'>
|
||||
{visibleSections.map((section) => (
|
||||
<TabsTrigger key={section} value={section}>
|
||||
{t(SECTION_META[section].titleKey)}
|
||||
</TabsTrigger>
|
||||
))}
|
||||
</TabsList>
|
||||
</Tabs>
|
||||
{activeSection !== 'overview' && (
|
||||
<div className='flex flex-wrap items-center justify-between gap-2'>
|
||||
{showSectionTabs ? (
|
||||
<Tabs value={activeSection} onValueChange={handleSectionChange}>
|
||||
<TabsList className='h-auto max-w-full flex-wrap justify-start'>
|
||||
{visibleSections.map((section) => (
|
||||
<TabsTrigger key={section} value={section}>
|
||||
{t(SECTION_META[section].titleKey)}
|
||||
</TabsTrigger>
|
||||
))}
|
||||
</TabsList>
|
||||
</Tabs>
|
||||
) : (
|
||||
<div />
|
||||
)}
|
||||
{modelActions != null && (
|
||||
<div className='flex shrink-0 flex-wrap items-center gap-2'>
|
||||
{modelActions}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
{activeSection === 'overview' && (
|
||||
<>
|
||||
@@ -208,6 +248,9 @@ export function Dashboard() {
|
||||
<LazyConsumptionDistributionChart
|
||||
data={modelData}
|
||||
loading={dataLoading}
|
||||
defaultChartType={
|
||||
chartPreferences.consumptionDistributionChart
|
||||
}
|
||||
timeGranularity={
|
||||
modelFilters.time_granularity || DEFAULT_TIME_GRANULARITY
|
||||
}
|
||||
@@ -219,6 +262,7 @@ export function Dashboard() {
|
||||
<LazyModelCharts
|
||||
data={modelData}
|
||||
loading={dataLoading}
|
||||
defaultChartTab={chartPreferences.modelAnalyticsChart}
|
||||
timeGranularity={
|
||||
modelFilters.time_granularity || DEFAULT_TIME_GRANULARITY
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user