fix: sync filters

This commit is contained in:
jialin
2026-04-22 13:16:48 +08:00
committed by jialin
parent 128f59ed6f
commit 8ba77beeed
5 changed files with 87 additions and 31 deletions
@@ -1,3 +1,4 @@
import { useIntl } from '@umijs/max';
import { Tabs } from 'antd'; import { Tabs } from 'antd';
import React, { useMemo } from 'react'; import React, { useMemo } from 'react';
import { GroupOption } from '../config'; import { GroupOption } from '../config';
@@ -23,6 +24,7 @@ const BreakdownTabs: React.FC<{
api_keys?: FilterOptionType[]; api_keys?: FilterOptionType[];
}; };
}> = ({ filters, dateRange, scope, refreshKey = 0 }) => { }> = ({ filters, dateRange, scope, refreshKey = 0 }) => {
const intl = useIntl();
const models = filters.models || EMPTY_FILTERS; const models = filters.models || EMPTY_FILTERS;
const users = filters.users || EMPTY_FILTERS; const users = filters.users || EMPTY_FILTERS;
const apiKeys = filters.api_keys || EMPTY_FILTERS; const apiKeys = filters.api_keys || EMPTY_FILTERS;
@@ -31,7 +33,7 @@ const BreakdownTabs: React.FC<{
return [ return [
{ {
key: 'models', key: 'models',
label: 'Models', label: intl.formatMessage({ id: 'usage.tabs.models' }),
forceRender: true, forceRender: true,
children: ( children: (
<ModelsTable <ModelsTable
@@ -45,7 +47,7 @@ const BreakdownTabs: React.FC<{
}, },
{ {
key: 'users', key: 'users',
label: 'Users', label: intl.formatMessage({ id: 'usage.tabs.users' }),
forceRender: true, forceRender: true,
children: ( children: (
<UsersTable <UsersTable
@@ -59,7 +61,7 @@ const BreakdownTabs: React.FC<{
}, },
{ {
key: 'api_keys', key: 'api_keys',
label: 'API Keys', label: intl.formatMessage({ id: 'usage.tabs.apikeys' }),
forceRender: true, forceRender: true,
children: ( children: (
<ApiKeysTable <ApiKeysTable
+11 -10
View File
@@ -12,6 +12,10 @@ import FilterBar from './filter-bar';
type DateType = 'date' | 'week' | 'month' | 'quarter' | 'year'; type DateType = 'date' | 'week' | 'month' | 'quarter' | 'year';
type ValueType = string | number | null; type ValueType = string | number | null;
const INITIAL_PAGE_PARAMS = {
page: 1,
perPage: 100
};
const ExportData: React.FC<{ const ExportData: React.FC<{
open: boolean; open: boolean;
@@ -22,6 +26,9 @@ const ExportData: React.FC<{
initialState: { initialState: {
activeModels: ValueType[][]; activeModels: ValueType[][];
activeApiKeys: ValueType[][]; activeApiKeys: ValueType[][];
users: string[];
start_date: string;
end_date: string;
}; };
commonFilters: { commonFilters: {
scope: string; scope: string;
@@ -48,10 +55,7 @@ const ExportData: React.FC<{
const [pageParams, setPageParams] = React.useState<{ const [pageParams, setPageParams] = React.useState<{
page: number; page: number;
perPage: number; perPage: number;
}>({ }>(INITIAL_PAGE_PARAMS);
page: 1,
perPage: 100
});
const { const {
fetchData: fetchExportData, fetchData: fetchExportData,
@@ -62,8 +66,6 @@ const ExportData: React.FC<{
key: 'exportTableData' key: 'exportTableData'
}); });
console.log('initialState========', initialState);
const { filters, commonFilters, filterBar } = useUsageFilters({ const { filters, commonFilters, filterBar } = useUsageFilters({
initialScope: initialScope, initialScope: initialScope,
metaData, metaData,
@@ -234,8 +236,9 @@ const ExportData: React.FC<{
useEffect(() => { useEffect(() => {
if (open) { if (open) {
setPageParams(INITIAL_PAGE_PARAMS);
fetchExportData({ fetchExportData({
...pageParams, ...INITIAL_PAGE_PARAMS,
granularity, granularity,
group_by: ['date', 'user', 'model', 'api_key'], group_by: ['date', 'user', 'model', 'api_key'],
filters, filters,
@@ -248,8 +251,6 @@ const ExportData: React.FC<{
} }
}, [open]); }, [open]);
console.log('export dataSource', filterBar);
return ( return (
<ScrollerModal <ScrollerModal
title={intl.formatMessage({ id: 'dashboard.usage.export' })} title={intl.formatMessage({ id: 'dashboard.usage.export' })}
@@ -282,7 +283,7 @@ const ExportData: React.FC<{
<Table <Table
columns={exportTableColumns} columns={exportTableColumns}
tableLayout={'auto'} tableLayout={'auto'}
style={{ width: '100%', marginTop: '16px', minHeight: 300 }} style={{ width: '100%', marginTop: '16px', minHeight: 400 }}
dataSource={dataSource.dataList || []} dataSource={dataSource.dataList || []}
rowKey={getBreakdownRowKey} rowKey={getBreakdownRowKey}
loading={{ loading={{
+6 -4
View File
@@ -226,6 +226,11 @@ const FilterBar: React.FC<FilterBarProps> = (props) => {
handlePickerChange(picker); handlePickerChange(picker);
}; };
const rangePickerValue: [dayjs.Dayjs, dayjs.Dayjs] =
startDate && endDate
? normalizeRangeValue(startDate, endDate, picker)
: [dayjs().add(-DefaultDateConfig.defaultRange, 'd'), dayjs()];
const renderFooter = () => { const renderFooter = () => {
return ( return (
<Segmented <Segmented
@@ -291,10 +296,7 @@ const FilterBar: React.FC<FilterBarProps> = (props) => {
<div className={FilterBarCss.filters}> <div className={FilterBarCss.filters}>
<DatePicker.RangePicker <DatePicker.RangePicker
maxDate={dayjs()} maxDate={dayjs()}
defaultValue={[ value={rangePickerValue}
dayjs().add(-DefaultDateConfig.defaultRange, 'd'),
dayjs()
]}
format={'YYYY-MM-DD'} format={'YYYY-MM-DD'}
picker={picker} picker={picker}
disabledDate={disabledDate} disabledDate={disabledDate}
+61 -13
View File
@@ -1,6 +1,6 @@
import { exportJsonToExcel } from '@/utils/excel-reader'; import { exportJsonToExcel } from '@/utils/excel-reader';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { useMemo, useState } from 'react'; import { useEffect, useMemo, useState } from 'react';
import { import {
generateColumns, generateColumns,
GroupOption, GroupOption,
@@ -36,6 +36,9 @@ interface UseUsageFiltersParams {
initialState?: { initialState?: {
activeModels?: ValueType[][]; activeModels?: ValueType[][];
activeApiKeys?: ValueType[][]; activeApiKeys?: ValueType[][];
users?: string[];
start_date?: string;
end_date?: string;
}; };
summaryColumns: { summaryColumns: {
title: string; title: string;
@@ -66,28 +69,43 @@ export const useUsageFilters = ({
metaData, metaData,
chartFilters, chartFilters,
summaryColumns, summaryColumns,
initialState: { initialState,
activeModels: initialActiveModels = [],
activeApiKeys: initialActiveApiKeys = []
} = {},
autoFetchOnFilterChange = true, autoFetchOnFilterChange = true,
onFetchData onFetchData
}: UseUsageFiltersParams) => { }: UseUsageFiltersParams) => {
const {
activeModels: initialActiveModels = [],
activeApiKeys: initialActiveApiKeys = [],
users: initialUsers = [],
start_date = '',
end_date = ''
} = initialState || {};
const { const {
detailData: timeSeriesData, detailData: timeSeriesData,
loading, loading,
fetchData: fetchTimeSeriesData fetchData: fetchTimeSeriesData
} = useQueryTimeSeriesData(); } = useQueryTimeSeriesData();
const extractSelectedValues = (value: ValueType[][] = []) =>
value.map((item) => {
if (Array.isArray(item)) {
return item[item.length - 1] as string;
}
return item as string;
});
const [commonFilters, setCommonFilters] = useState({ const [commonFilters, setCommonFilters] = useState({
scope: initialScope, scope: initialScope,
models: [] as string[], models: extractSelectedValues(initialActiveModels),
users: [] as string[], users: initialUsers || [],
api_keys: [] as string[], api_keys: extractSelectedValues(initialActiveApiKeys),
start_date: dayjs() start_date:
.subtract(DefaultDateConfig.defaultRange, 'days') start_date ||
.format('YYYY-MM-DD'), dayjs()
end_date: dayjs().format('YYYY-MM-DD') .subtract(DefaultDateConfig.defaultRange, 'days')
.format('YYYY-MM-DD'),
end_date: end_date || dayjs().format('YYYY-MM-DD')
}); });
const modelOptions = metaData?.models || []; const modelOptions = metaData?.models || [];
@@ -98,6 +116,36 @@ export const useUsageFilters = ({
const [activeApiKeys, setActiveApiKeys] = const [activeApiKeys, setActiveApiKeys] =
useState<ValueType[][]>(initialActiveApiKeys); useState<ValueType[][]>(initialActiveApiKeys);
useEffect(() => {
if (!initialState) {
return;
}
setActiveModels(initialActiveModels);
setActiveApiKeys(initialActiveApiKeys);
setCommonFilters((prev) => ({
...prev,
scope: initialScope,
models: extractSelectedValues(initialActiveModels),
users: initialUsers || [],
api_keys: extractSelectedValues(initialActiveApiKeys),
start_date:
start_date ||
dayjs()
.subtract(DefaultDateConfig.defaultRange, 'days')
.format('YYYY-MM-DD'),
end_date: end_date || dayjs().format('YYYY-MM-DD')
}));
}, [
end_date,
initialActiveApiKeys,
initialActiveModels,
initialUsers,
initialScope,
initialState,
start_date
]);
const buildFilters = (selected: typeof commonFilters) => { const buildFilters = (selected: typeof commonFilters) => {
const filters: { const filters: {
models?: FilterOptionType[]; models?: FilterOptionType[];
+4 -1
View File
@@ -201,7 +201,10 @@ const Usage: React.FC = () => {
onCancel={() => setOpenExportModal(false)} onCancel={() => setOpenExportModal(false)}
initialState={{ initialState={{
activeModels: filterBar.activeModels, activeModels: filterBar.activeModels,
activeApiKeys: filterBar.activeApiKeys activeApiKeys: filterBar.activeApiKeys,
users: commonFilters.users,
start_date: commonFilters.start_date,
end_date: commonFilters.end_date
}} }}
></ExportData> ></ExportData>
</div> </div>