mirror of
https://github.com/logto-io/logto.git
synced 2025-02-17 22:04:19 -05:00
feat(dashboard): add tooltip to dashboard items (#1089)
This commit is contained in:
parent
c4a0d7ae35
commit
9dd73ac142
5 changed files with 46 additions and 4 deletions
|
@ -31,6 +31,15 @@
|
||||||
.title {
|
.title {
|
||||||
font: var(--font-title-medium);
|
font: var(--font-title-medium);
|
||||||
margin-bottom: 24px;
|
margin-bottom: 24px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
.icon {
|
||||||
|
margin-left: _.unit(1);
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
color: var(--color-caption);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.content {
|
.content {
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
import { AdminConsoleKey } from '@logto/phrases';
|
import { AdminConsoleKey } from '@logto/phrases';
|
||||||
import { conditionalString } from '@silverhand/essentials';
|
import { conditionalString } from '@silverhand/essentials';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import React from 'react';
|
import React, { useRef } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
|
||||||
import Card from '@/components/Card';
|
import Card from '@/components/Card';
|
||||||
|
import Tooltip from '@/components/Tooltip';
|
||||||
import { ArrowDown, ArrowUp } from '@/icons/Arrow';
|
import { ArrowDown, ArrowUp } from '@/icons/Arrow';
|
||||||
|
import Tip from '@/icons/Tip';
|
||||||
import { formatNumberWithComma } from '@/utilities/number';
|
import { formatNumberWithComma } from '@/utilities/number';
|
||||||
|
|
||||||
import * as styles from './Block.module.scss';
|
import * as styles from './Block.module.scss';
|
||||||
|
@ -14,17 +16,27 @@ type Props = {
|
||||||
count: number;
|
count: number;
|
||||||
delta?: number;
|
delta?: number;
|
||||||
title: AdminConsoleKey;
|
title: AdminConsoleKey;
|
||||||
|
tooltip?: AdminConsoleKey;
|
||||||
varient?: 'bordered' | 'default' | 'plain';
|
varient?: 'bordered' | 'default' | 'plain';
|
||||||
};
|
};
|
||||||
|
|
||||||
const Block = ({ varient = 'default', count, delta, title }: Props) => {
|
const Block = ({ varient = 'default', count, delta, title, tooltip }: Props) => {
|
||||||
const { t } = useTranslation(undefined, { keyPrefix: 'admin_console' });
|
const { t } = useTranslation(undefined, { keyPrefix: 'admin_console' });
|
||||||
|
const tipRef = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
const deltaLable = delta !== undefined && `${conditionalString(delta >= 0 && '+')}${delta}`;
|
const deltaLable = delta !== undefined && `${conditionalString(delta >= 0 && '+')}${delta}`;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Card className={classNames(styles.block, styles[varient])}>
|
<Card className={classNames(styles.block, styles[varient])}>
|
||||||
<div className={styles.title}>{t(title)}</div>
|
<div className={styles.title}>
|
||||||
|
{t(title)}
|
||||||
|
{tooltip && (
|
||||||
|
<div ref={tipRef} className={styles.icon}>
|
||||||
|
<Tip />
|
||||||
|
<Tooltip anchorRef={tipRef} content={t(tooltip)} />
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
<div className={styles.content}>
|
<div className={styles.content}>
|
||||||
<div className={styles.number}>{formatNumberWithComma(count)}</div>
|
<div className={styles.number}>{formatNumberWithComma(count)}</div>
|
||||||
{delta !== undefined && (
|
{delta !== undefined && (
|
||||||
|
|
|
@ -45,14 +45,20 @@ const Dashboard = () => {
|
||||||
{!isLoading && (
|
{!isLoading && (
|
||||||
<>
|
<>
|
||||||
<div className={styles.blocks}>
|
<div className={styles.blocks}>
|
||||||
<Block title="dashboard.total_users" count={totalData.totalUserCount} />
|
<Block
|
||||||
|
title="dashboard.total_users"
|
||||||
|
tooltip="dashboard.total_users_tip"
|
||||||
|
count={totalData.totalUserCount}
|
||||||
|
/>
|
||||||
<Block
|
<Block
|
||||||
title="dashboard.new_users_today"
|
title="dashboard.new_users_today"
|
||||||
|
tooltip="dashboard.new_users_today_tip"
|
||||||
count={newData.today.count}
|
count={newData.today.count}
|
||||||
delta={newData.today.delta}
|
delta={newData.today.delta}
|
||||||
/>
|
/>
|
||||||
<Block
|
<Block
|
||||||
title="dashboard.new_users_7_days"
|
title="dashboard.new_users_7_days"
|
||||||
|
tooltip="dashboard.new_users_7_days_tip"
|
||||||
count={newData.last7Days.count}
|
count={newData.last7Days.count}
|
||||||
delta={newData.last7Days.delta}
|
delta={newData.last7Days.delta}
|
||||||
/>
|
/>
|
||||||
|
@ -60,6 +66,7 @@ const Dashboard = () => {
|
||||||
<Card className={styles.activeCard}>
|
<Card className={styles.activeCard}>
|
||||||
<Block
|
<Block
|
||||||
title="dashboard.daily_active_users"
|
title="dashboard.daily_active_users"
|
||||||
|
tooltip="dashboard.daily_active_users_tip"
|
||||||
count={activeData.dau.count}
|
count={activeData.dau.count}
|
||||||
delta={activeData.dau.delta}
|
delta={activeData.dau.delta}
|
||||||
varient="plain"
|
varient="plain"
|
||||||
|
@ -95,12 +102,14 @@ const Dashboard = () => {
|
||||||
<div className={styles.blocks}>
|
<div className={styles.blocks}>
|
||||||
<Block
|
<Block
|
||||||
title="dashboard.weekly_active_users"
|
title="dashboard.weekly_active_users"
|
||||||
|
tooltip="dashboard.weekly_active_users_tip"
|
||||||
count={activeData.wau.count}
|
count={activeData.wau.count}
|
||||||
delta={activeData.wau.delta}
|
delta={activeData.wau.delta}
|
||||||
varient="bordered"
|
varient="bordered"
|
||||||
/>
|
/>
|
||||||
<Block
|
<Block
|
||||||
title="dashboard.monthly_active_users"
|
title="dashboard.monthly_active_users"
|
||||||
|
tooltip="dashboard.monthly_active_users_tip"
|
||||||
count={activeData.mau.count}
|
count={activeData.mau.count}
|
||||||
delta={activeData.mau.delta}
|
delta={activeData.mau.delta}
|
||||||
varient="bordered"
|
varient="bordered"
|
||||||
|
|
|
@ -528,11 +528,17 @@ const translation = {
|
||||||
title: 'Dashboard',
|
title: 'Dashboard',
|
||||||
description: 'Get an overview about your app performace',
|
description: 'Get an overview about your app performace',
|
||||||
total_users: 'Total users',
|
total_users: 'Total users',
|
||||||
|
total_users_tip: 'Total users',
|
||||||
new_users_today: 'New users today',
|
new_users_today: 'New users today',
|
||||||
|
new_users_today_tip: 'New users today',
|
||||||
new_users_7_days: 'New users past 7 days',
|
new_users_7_days: 'New users past 7 days',
|
||||||
|
new_users_7_days_tip: 'New users past 7 days',
|
||||||
daily_active_users: 'Daily active users',
|
daily_active_users: 'Daily active users',
|
||||||
|
daily_active_users_tip: 'Daily active users',
|
||||||
weekly_active_users: 'Weeky active users',
|
weekly_active_users: 'Weeky active users',
|
||||||
|
weekly_active_users_tip: 'Weeky active users',
|
||||||
monthly_active_users: 'Monthly active users',
|
monthly_active_users: 'Monthly active users',
|
||||||
|
monthly_active_users_tip: 'Monthly active users',
|
||||||
},
|
},
|
||||||
logs: {
|
logs: {
|
||||||
title: 'Audit Logs',
|
title: 'Audit Logs',
|
||||||
|
|
|
@ -512,11 +512,17 @@ const translation = {
|
||||||
title: '仪表盘',
|
title: '仪表盘',
|
||||||
description: '查看运行总览',
|
description: '查看运行总览',
|
||||||
total_users: '总用户',
|
total_users: '总用户',
|
||||||
|
total_users_tip: '总用户',
|
||||||
new_users_today: '今日新增',
|
new_users_today: '今日新增',
|
||||||
|
new_users_today_tip: '今日新增',
|
||||||
new_users_7_days: '7日新增',
|
new_users_7_days: '7日新增',
|
||||||
|
new_users_7_days_tip: '7日新增',
|
||||||
daily_active_users: '日活用户',
|
daily_active_users: '日活用户',
|
||||||
|
daily_active_users_tip: '日活用户',
|
||||||
weekly_active_users: '周活用户',
|
weekly_active_users: '周活用户',
|
||||||
|
weekly_active_users_tip: '周活用户',
|
||||||
monthly_active_users: '月活用户',
|
monthly_active_users: '月活用户',
|
||||||
|
monthly_active_users_tip: '月活用户',
|
||||||
},
|
},
|
||||||
logs: {
|
logs: {
|
||||||
title: '审计日志',
|
title: '审计日志',
|
||||||
|
|
Loading…
Add table
Reference in a new issue