mirror of
https://github.com/umami-software/umami.git
synced 2026-02-20 12:35:38 +01:00
Update WebsiteMetricsBar.tsx
This commit is contained in:
parent
cb0210a72c
commit
4e07e70941
1 changed files with 33 additions and 7 deletions
|
|
@ -1,14 +1,15 @@
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { useDateRange, useMessages, useSticky } from 'components/hooks';
|
import { useDateRange, useLocale, useMessages, useSticky } from 'components/hooks';
|
||||||
import WebsiteDateFilter from 'components/input/WebsiteDateFilter';
|
import WebsiteDateFilter from 'components/input/WebsiteDateFilter';
|
||||||
import MetricCard from 'components/metrics/MetricCard';
|
import MetricCard from 'components/metrics/MetricCard';
|
||||||
import MetricsBar from 'components/metrics/MetricsBar';
|
import MetricsBar from 'components/metrics/MetricsBar';
|
||||||
import { formatShortTime, formatLongNumber } from 'lib/format';
|
import { formatShortTime } from 'lib/format';
|
||||||
import WebsiteFilterButton from './WebsiteFilterButton';
|
import WebsiteFilterButton from './WebsiteFilterButton';
|
||||||
import useWebsiteStats from 'components/hooks/queries/useWebsiteStats';
|
import useWebsiteStats from 'components/hooks/queries/useWebsiteStats';
|
||||||
import styles from './WebsiteMetricsBar.module.css';
|
import styles from './WebsiteMetricsBar.module.css';
|
||||||
import { Dropdown, Item } from 'react-basics';
|
import { Dropdown, Item } from 'react-basics';
|
||||||
import useStore, { setWebsiteDateCompare } from 'store/websites';
|
import useStore, { setWebsiteDateCompare } from 'store/websites';
|
||||||
|
import { type FormatNumberOptions, useIntl } from 'react-intl';
|
||||||
|
|
||||||
export function WebsiteMetricsBar({
|
export function WebsiteMetricsBar({
|
||||||
websiteId,
|
websiteId,
|
||||||
|
|
@ -32,8 +33,21 @@ export function WebsiteMetricsBar({
|
||||||
compareMode && dateCompare,
|
compareMode && dateCompare,
|
||||||
);
|
);
|
||||||
const isAllTime = dateRange.value === 'all';
|
const isAllTime = dateRange.value === 'all';
|
||||||
|
const { locale } = useLocale();
|
||||||
|
const intl = useIntl();
|
||||||
|
|
||||||
const { pageviews, visitors, visits, bounces, totaltime } = data || {};
|
const { pageviews, visitors, visits, bounces, totaltime } = data || {};
|
||||||
|
const optionsNumber: FormatNumberOptions = { notation: 'compact', maximumFractionDigits: 2 };
|
||||||
|
const optionsSmallNumber: FormatNumberOptions = { notation: 'compact' };
|
||||||
|
const optionsPercent: FormatNumberOptions = { style: 'percent' };
|
||||||
|
const minimum = {
|
||||||
|
'de-CH': 1000000,
|
||||||
|
'de-DE': 1000000,
|
||||||
|
'it-IT': 1000000,
|
||||||
|
'ja-JP': 10000,
|
||||||
|
'zh-CN': 10000,
|
||||||
|
'zh-TW': 10000,
|
||||||
|
};
|
||||||
|
|
||||||
const metrics = data
|
const metrics = data
|
||||||
? [
|
? [
|
||||||
|
|
@ -41,19 +55,31 @@ export function WebsiteMetricsBar({
|
||||||
...pageviews,
|
...pageviews,
|
||||||
label: formatMessage(labels.views),
|
label: formatMessage(labels.views),
|
||||||
change: pageviews.value - pageviews.prev,
|
change: pageviews.value - pageviews.prev,
|
||||||
formatValue: formatLongNumber,
|
formatValue: (n: number) =>
|
||||||
|
intl.formatNumber(
|
||||||
|
+n,
|
||||||
|
+n < (minimum[locale] || 1000) ? optionsSmallNumber : optionsNumber,
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
...visits,
|
...visits,
|
||||||
label: formatMessage(labels.visits),
|
label: formatMessage(labels.visits),
|
||||||
change: visits.value - visits.prev,
|
change: visits.value - visits.prev,
|
||||||
formatValue: formatLongNumber,
|
formatValue: (n: number) =>
|
||||||
|
intl.formatNumber(
|
||||||
|
+n,
|
||||||
|
+n < (minimum[locale] || 1000) ? optionsSmallNumber : optionsNumber,
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
...visitors,
|
...visitors,
|
||||||
label: formatMessage(labels.visitors),
|
label: formatMessage(labels.visitors),
|
||||||
change: visitors.value - visitors.prev,
|
change: visitors.value - visitors.prev,
|
||||||
formatValue: formatLongNumber,
|
formatValue: (n: number) =>
|
||||||
|
intl.formatNumber(
|
||||||
|
+n,
|
||||||
|
+n < (minimum[locale] || 1000) ? optionsSmallNumber : optionsNumber,
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: formatMessage(labels.bounceRate),
|
label: formatMessage(labels.bounceRate),
|
||||||
|
|
@ -62,7 +88,7 @@ export function WebsiteMetricsBar({
|
||||||
change:
|
change:
|
||||||
(Math.min(visits.value, bounces.value) / visits.value) * 100 -
|
(Math.min(visits.value, bounces.value) / visits.value) * 100 -
|
||||||
(Math.min(visits.prev, bounces.prev) / visits.prev) * 100,
|
(Math.min(visits.prev, bounces.prev) / visits.prev) * 100,
|
||||||
formatValue: n => Math.round(+n) + '%',
|
formatValue: (n: number) => intl.formatNumber(+n / 100, optionsPercent),
|
||||||
reverseColors: true,
|
reverseColors: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -70,7 +96,7 @@ export function WebsiteMetricsBar({
|
||||||
value: totaltime.value / visits.value,
|
value: totaltime.value / visits.value,
|
||||||
prev: totaltime.prev / visits.prev,
|
prev: totaltime.prev / visits.prev,
|
||||||
change: totaltime.value / visits.value - totaltime.prev / visits.prev,
|
change: totaltime.value / visits.value - totaltime.prev / visits.prev,
|
||||||
formatValue: n =>
|
formatValue: (n: number) =>
|
||||||
`${+n < 0 ? '-' : ''}${formatShortTime(Math.abs(~~n), ['m', 's'], ' ')}`,
|
`${+n < 0 ? '-' : ''}${formatShortTime(Math.abs(~~n), ['m', 's'], ' ')}`,
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue