fix(style): dashboard usage filters
This commit is contained in:
@@ -7,44 +7,15 @@ import { useIntl } from '@umijs/max';
|
|||||||
import { Button, DatePicker, Tooltip } from 'antd';
|
import { Button, DatePicker, Tooltip } from 'antd';
|
||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import styled from 'styled-components';
|
|
||||||
import { DASHBOARD_STATS_API } from '../../apis';
|
import { DASHBOARD_STATS_API } from '../../apis';
|
||||||
import useRangePickerPreset from '../../hooks/use-rangepicker-preset';
|
import useRangePickerPreset from '../../hooks/use-rangepicker-preset';
|
||||||
|
import FilterBarCss from '../../styles/filter-bar.less';
|
||||||
const OptionWrapper = styled.span`
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 8px;
|
|
||||||
`;
|
|
||||||
|
|
||||||
const LabelWrapper = styled.div`
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 8px;
|
|
||||||
`;
|
|
||||||
|
|
||||||
const DefaultDateConfig = {
|
const DefaultDateConfig = {
|
||||||
maxRange: 60,
|
maxRange: 60,
|
||||||
defaultRange: 29
|
defaultRange: 29
|
||||||
};
|
};
|
||||||
|
|
||||||
const FilterWrapper = styled.div`
|
|
||||||
position: relative;
|
|
||||||
z-index: 10;
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
margin-bottom: 0px;
|
|
||||||
.selection {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 12px;
|
|
||||||
}
|
|
||||||
.ant-select-selection-overflow-item > span {
|
|
||||||
height: 24px;
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
interface FilterBarProps {
|
interface FilterBarProps {
|
||||||
query: any;
|
query: any;
|
||||||
userList: any[];
|
userList: any[];
|
||||||
@@ -105,28 +76,28 @@ const FilterBar: React.FC<FilterBarProps> = (props) => {
|
|||||||
|
|
||||||
if (data.providerType === 'deployments') {
|
if (data.providerType === 'deployments') {
|
||||||
return (
|
return (
|
||||||
<OptionWrapper>
|
<span className={FilterBarCss.optionsWrapper}>
|
||||||
<ProviderLogo provider={data.providerType as string} />
|
<ProviderLogo provider={data.providerType as string} />
|
||||||
<AutoTooltip ghost maxWidth={105}>
|
<AutoTooltip ghost>
|
||||||
{intl.formatMessage({ id: 'menu.models.deployment' })}
|
{intl.formatMessage({ id: 'menu.models.deployment' })}
|
||||||
</AutoTooltip>
|
</AutoTooltip>
|
||||||
</OptionWrapper>
|
</span>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<OptionWrapper>
|
<span className={FilterBarCss.optionsWrapper}>
|
||||||
<ProviderLogo provider={data.providerType as string} />
|
<ProviderLogo provider={data.providerType as string} />
|
||||||
<AutoTooltip ghost maxWidth={105}>
|
<AutoTooltip ghost>
|
||||||
<span>{data.label}</span>
|
<span>{data.label}</span>
|
||||||
</AutoTooltip>
|
</AutoTooltip>
|
||||||
</OptionWrapper>
|
</span>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<FilterWrapper>
|
<div className={FilterBarCss.wrapper}>
|
||||||
<div className="selection">
|
<div className={FilterBarCss.selection}>
|
||||||
<DatePicker.RangePicker
|
<DatePicker.RangePicker
|
||||||
maxDate={dayjs()}
|
maxDate={dayjs()}
|
||||||
defaultValue={[
|
defaultValue={[
|
||||||
@@ -149,7 +120,7 @@ const FilterBar: React.FC<FilterBarProps> = (props) => {
|
|||||||
placeholder={intl.formatMessage({
|
placeholder={intl.formatMessage({
|
||||||
id: 'dashboard.usage.selectuser'
|
id: 'dashboard.usage.selectuser'
|
||||||
})}
|
})}
|
||||||
style={{ maxWidth: 200, minWidth: 160 }}
|
style={{ width: '100%' }}
|
||||||
value={query.user_ids}
|
value={query.user_ids}
|
||||||
onChange={handleUsersChange}
|
onChange={handleUsersChange}
|
||||||
></SimpleSelect>
|
></SimpleSelect>
|
||||||
@@ -164,9 +135,12 @@ const FilterBar: React.FC<FilterBarProps> = (props) => {
|
|||||||
}}
|
}}
|
||||||
styles={{
|
styles={{
|
||||||
root: {
|
root: {
|
||||||
width: cascaderWidth
|
width: '100%'
|
||||||
},
|
},
|
||||||
popup: {
|
popup: {
|
||||||
|
list: {
|
||||||
|
flex: 1
|
||||||
|
},
|
||||||
listItem: {
|
listItem: {
|
||||||
padding: '5px 10px'
|
padding: '5px 10px'
|
||||||
}
|
}
|
||||||
@@ -190,7 +164,7 @@ const FilterBar: React.FC<FilterBarProps> = (props) => {
|
|||||||
</Tooltip>
|
</Tooltip>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</FilterWrapper>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -2,23 +2,17 @@ import breakpoints from '@/config/breakpoints';
|
|||||||
import { useIntl } from '@umijs/max';
|
import { useIntl } from '@umijs/max';
|
||||||
import { Col, Row } from 'antd';
|
import { Col, Row } from 'antd';
|
||||||
import { FC, useContext, useEffect, useMemo } from 'react';
|
import { FC, useContext, useEffect, useMemo } from 'react';
|
||||||
import styled from 'styled-components';
|
|
||||||
import { DASHBOARD_STATS_API } from '../../apis';
|
import { DASHBOARD_STATS_API } from '../../apis';
|
||||||
import { baseColorMap } from '../../config';
|
import { baseColorMap } from '../../config';
|
||||||
import { DashboardContext } from '../../config/dashboard-context';
|
import { DashboardContext } from '../../config/dashboard-context';
|
||||||
import { DashboardUsageData } from '../../config/types';
|
import { DashboardUsageData } from '../../config/types';
|
||||||
|
import FilterBarCss from '../../styles/filter-bar.less';
|
||||||
import ExportData from './export-data';
|
import ExportData from './export-data';
|
||||||
import FilterBar from './filter-bar';
|
import FilterBar from './filter-bar';
|
||||||
import RequestTokenInner from './request-token-inner';
|
import RequestTokenInner from './request-token-inner';
|
||||||
import TopUser from './top-user';
|
import TopUser from './top-user';
|
||||||
import useUsageData from './use-usage-data';
|
import useUsageData from './use-usage-data';
|
||||||
|
|
||||||
const TitleWrapper = styled.div`
|
|
||||||
margin: 0;
|
|
||||||
font-weight: 700;
|
|
||||||
min-width: max-content;
|
|
||||||
`;
|
|
||||||
|
|
||||||
const UsageInner: FC<{ maxWidth: number }> = ({ maxWidth }) => {
|
const UsageInner: FC<{ maxWidth: number }> = ({ maxWidth }) => {
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
const { model_usage } = useContext(DashboardContext);
|
const { model_usage } = useContext(DashboardContext);
|
||||||
@@ -95,17 +89,10 @@ const UsageInner: FC<{ maxWidth: number }> = ({ maxWidth }) => {
|
|||||||
<div>
|
<div>
|
||||||
<Row gutter={maxWidth < breakpoints.xl ? [0, 0] : [20, 20]}>
|
<Row gutter={maxWidth < breakpoints.xl ? [0, 0] : [20, 20]}>
|
||||||
<Col xs={24} sm={24} md={24} lg={24} xl={16}>
|
<Col xs={24} sm={24} md={24} lg={24} xl={16}>
|
||||||
<div
|
<div className={FilterBarCss.usageTitle}>
|
||||||
style={{
|
<div className={FilterBarCss.usageTitleText}>
|
||||||
display: 'flex',
|
|
||||||
justifyContent: 'space-between',
|
|
||||||
alignItems: 'center',
|
|
||||||
margin: '20px 0 '
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<TitleWrapper>
|
|
||||||
{intl.formatMessage({ id: 'dashboard.usage' })}
|
{intl.formatMessage({ id: 'dashboard.usage' })}
|
||||||
</TitleWrapper>
|
</div>
|
||||||
<FilterBar
|
<FilterBar
|
||||||
url={DASHBOARD_STATS_API}
|
url={DASHBOARD_STATS_API}
|
||||||
query={query}
|
query={query}
|
||||||
@@ -129,9 +116,9 @@ const UsageInner: FC<{ maxWidth: number }> = ({ maxWidth }) => {
|
|||||||
<div
|
<div
|
||||||
style={{ margin: maxWidth < breakpoints.xl ? '26px 0' : '32px 0' }}
|
style={{ margin: maxWidth < breakpoints.xl ? '26px 0' : '32px 0' }}
|
||||||
>
|
>
|
||||||
<TitleWrapper>
|
<div className={FilterBarCss.usageTitleText}>
|
||||||
{intl.formatMessage({ id: 'dashboard.topusers' })}
|
{intl.formatMessage({ id: 'dashboard.topusers' })}
|
||||||
</TitleWrapper>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<TopUser
|
<TopUser
|
||||||
userData={topUserData.userData}
|
userData={topUserData.userData}
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
.wrapper {
|
||||||
|
position: relative;
|
||||||
|
z-index: 10;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 0;
|
||||||
|
gap: 16px;
|
||||||
|
flex: 1;
|
||||||
|
|
||||||
|
.selection {
|
||||||
|
display: grid;
|
||||||
|
flex: 1;
|
||||||
|
grid-template-columns:
|
||||||
|
max-content minmax(160px, 200px) minmax(300px, 1fr)
|
||||||
|
max-content;
|
||||||
|
gap: 12px;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
:global {
|
||||||
|
.ant-select-selection-overflow-item > span {
|
||||||
|
height: 24px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.optionsWrapper {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
padding-right: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.usageTitle {
|
||||||
|
margin: 20px 0;
|
||||||
|
display: grid;
|
||||||
|
align-items: center;
|
||||||
|
grid-template-columns: minmax(45px, 200px) 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.usageTitleText {
|
||||||
|
margin: 0;
|
||||||
|
font-weight: 700;
|
||||||
|
min-width: max-content;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user