mirror of
https://github.com/umami-software/umami.git
synced 2026-02-24 06:25:43 +01:00
Merge branch 'dev' into master
This commit is contained in:
commit
910a14296b
469 changed files with 7142 additions and 7426 deletions
|
|
@ -1,9 +1,9 @@
|
|||
import { useCallback } from 'react';
|
||||
import ListTable from 'components/metrics/ListTable';
|
||||
import { useLocale, useCountryNames, useMessages } from 'components/hooks';
|
||||
import ListTable from '@/components/metrics/ListTable';
|
||||
import { useLocale, useCountryNames, useMessages } from '@/components/hooks';
|
||||
import classNames from 'classnames';
|
||||
import styles from './RealtimeCountries.module.css';
|
||||
import TypeIcon from 'components/common/TypeIcon';
|
||||
import TypeIcon from '@/components/common/TypeIcon';
|
||||
|
||||
export function RealtimeCountries({ data }) {
|
||||
const { formatMessage, labels } = useMessages();
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import MetricCard from 'components/metrics/MetricCard';
|
||||
import { useMessages } from 'components/hooks';
|
||||
import { RealtimeData } from 'lib/types';
|
||||
import MetricCard from '@/components/metrics/MetricCard';
|
||||
import { useMessages } from '@/components/hooks';
|
||||
import { RealtimeData } from '@/lib/types';
|
||||
import styles from './RealtimeHeader.module.css';
|
||||
|
||||
export function RealtimeHeader({ data }: { data: RealtimeData }) {
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
import { useEffect } from 'react';
|
||||
import { useRouter } from 'next/navigation';
|
||||
import Page from 'components/layout/Page';
|
||||
import PageHeader from 'components/layout/PageHeader';
|
||||
import { useApi, useMessages } from 'components/hooks';
|
||||
import EmptyPlaceholder from 'components/common/EmptyPlaceholder';
|
||||
import Page from '@/components/layout/Page';
|
||||
import PageHeader from '@/components/layout/PageHeader';
|
||||
import { useApi, useMessages } from '@/components/hooks';
|
||||
import EmptyPlaceholder from '@/components/common/EmptyPlaceholder';
|
||||
|
||||
export function RealtimeHome() {
|
||||
const { formatMessage, labels, messages } = useMessages();
|
||||
|
|
|
|||
|
|
@ -1,12 +1,11 @@
|
|||
import useFormat from 'components//hooks/useFormat';
|
||||
import Empty from 'components/common/Empty';
|
||||
import FilterButtons from 'components/common/FilterButtons';
|
||||
import { useCountryNames, useLocale, useMessages, useTimezone } from 'components/hooks';
|
||||
import Icons from 'components/icons';
|
||||
import { BROWSERS, OS_NAMES } from 'lib/constants';
|
||||
import { stringToColor } from 'lib/format';
|
||||
import { RealtimeData } from 'lib/types';
|
||||
import { safeDecodeURI } from 'next-basics';
|
||||
import useFormat from '@/components//hooks/useFormat';
|
||||
import Empty from '@/components/common/Empty';
|
||||
import FilterButtons from '@/components/common/FilterButtons';
|
||||
import { useCountryNames, useLocale, useMessages, useTimezone } from '@/components/hooks';
|
||||
import Icons from '@/components/icons';
|
||||
import { BROWSERS, OS_NAMES } from '@/lib/constants';
|
||||
import { stringToColor } from '@/lib/format';
|
||||
import { RealtimeData } from '@/lib/types';
|
||||
import { useContext, useMemo, useState } from 'react';
|
||||
import { Icon, SearchField, StatusLight, Text } from 'react-basics';
|
||||
import { FixedSizeList } from 'react-window';
|
||||
|
|
@ -27,7 +26,7 @@ const icons = {
|
|||
export function RealtimeLog({ data }: { data: RealtimeData }) {
|
||||
const website = useContext(WebsiteContext);
|
||||
const [search, setSearch] = useState('');
|
||||
const { formatMessage, labels, messages, FormattedMessage } = useMessages();
|
||||
const { formatMessage, labels, messages } = useMessages();
|
||||
const { formatValue } = useFormat();
|
||||
const { locale } = useLocale();
|
||||
const { formatTimezoneDate } = useTimezone();
|
||||
|
|
@ -71,24 +70,19 @@ export function RealtimeLog({ data }: { data: RealtimeData }) {
|
|||
const { __type, eventName, urlPath: url, browser, os, country, device } = log;
|
||||
|
||||
if (__type === TYPE_EVENT) {
|
||||
return (
|
||||
<FormattedMessage
|
||||
{...messages.eventLog}
|
||||
values={{
|
||||
event: <b>{eventName || formatMessage(labels.unknown)}</b>,
|
||||
url: (
|
||||
<a
|
||||
href={`//${website?.domain}${url}`}
|
||||
className={styles.link}
|
||||
target="_blank"
|
||||
rel="noreferrer noopener"
|
||||
>
|
||||
{url}
|
||||
</a>
|
||||
),
|
||||
}}
|
||||
/>
|
||||
);
|
||||
return formatMessage(messages.eventLog, {
|
||||
event: <b>{eventName || formatMessage(labels.unknown)}</b>,
|
||||
url: (
|
||||
<a
|
||||
href={`//${website?.domain}${url}`}
|
||||
className={styles.link}
|
||||
target="_blank"
|
||||
rel="noreferrer noopener"
|
||||
>
|
||||
{url}
|
||||
</a>
|
||||
),
|
||||
});
|
||||
}
|
||||
|
||||
if (__type === TYPE_PAGEVIEW) {
|
||||
|
|
@ -99,23 +93,18 @@ export function RealtimeLog({ data }: { data: RealtimeData }) {
|
|||
target="_blank"
|
||||
rel="noreferrer noopener"
|
||||
>
|
||||
{safeDecodeURI(url)}
|
||||
{url}
|
||||
</a>
|
||||
);
|
||||
}
|
||||
|
||||
if (__type === TYPE_SESSION) {
|
||||
return (
|
||||
<FormattedMessage
|
||||
{...messages.visitorLog}
|
||||
values={{
|
||||
country: <b>{countryNames[country] || formatMessage(labels.unknown)}</b>,
|
||||
browser: <b>{BROWSERS[browser]}</b>,
|
||||
os: <b>{OS_NAMES[os] || os}</b>,
|
||||
device: <b>{formatMessage(labels[device] || labels.unknown)}</b>,
|
||||
}}
|
||||
/>
|
||||
);
|
||||
return formatMessage(messages.visitorLog, {
|
||||
country: <b>{countryNames[country] || formatMessage(labels.unknown)}</b>,
|
||||
browser: <b>{BROWSERS[browser]}</b>,
|
||||
os: <b>{OS_NAMES[os] || os}</b>,
|
||||
device: <b>{formatMessage(labels[device] || labels.unknown)}</b>,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
import { Key, useContext, useState } from 'react';
|
||||
import { ButtonGroup, Button, Flexbox } from 'react-basics';
|
||||
import thenby from 'thenby';
|
||||
import { percentFilter } from 'lib/filters';
|
||||
import ListTable from 'components/metrics/ListTable';
|
||||
import { FILTER_PAGES, FILTER_REFERRERS } from 'lib/constants';
|
||||
import { useMessages } from 'components/hooks';
|
||||
import { RealtimeData } from 'lib/types';
|
||||
import { percentFilter } from '@/lib/filters';
|
||||
import ListTable from '@/components/metrics/ListTable';
|
||||
import { FILTER_PAGES, FILTER_REFERRERS } from '@/lib/constants';
|
||||
import { useMessages } from '@/components/hooks';
|
||||
import { RealtimeData } from '@/lib/types';
|
||||
import { WebsiteContext } from '../WebsiteProvider';
|
||||
|
||||
export function RealtimeUrls({ data }: { data: RealtimeData }) {
|
||||
|
|
|
|||
|
|
@ -1,16 +1,16 @@
|
|||
'use client';
|
||||
import { firstBy } from 'thenby';
|
||||
import { Grid, GridRow } from 'components/layout/Grid';
|
||||
import Page from 'components/layout/Page';
|
||||
import RealtimeChart from 'components/metrics/RealtimeChart';
|
||||
import WorldMap from 'components/metrics/WorldMap';
|
||||
import { useRealtime } from 'components/hooks';
|
||||
import { Grid, GridRow } from '@/components/layout/Grid';
|
||||
import Page from '@/components/layout/Page';
|
||||
import RealtimeChart from '@/components/metrics/RealtimeChart';
|
||||
import WorldMap from '@/components/metrics/WorldMap';
|
||||
import { useRealtime } from '@/components/hooks';
|
||||
import RealtimeLog from './RealtimeLog';
|
||||
import RealtimeHeader from './RealtimeHeader';
|
||||
import RealtimeUrls from './RealtimeUrls';
|
||||
import RealtimeCountries from './RealtimeCountries';
|
||||
import WebsiteHeader from '../WebsiteHeader';
|
||||
import { percentFilter } from 'lib/filters';
|
||||
import { percentFilter } from '@/lib/filters';
|
||||
|
||||
export function WebsiteRealtimePage({ websiteId }) {
|
||||
const { data, isLoading, error } = useRealtime(websiteId);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue