fix: sync filters
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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={{
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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[];
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user