mirror of
https://github.com/umami-software/umami.git
synced 2026-02-18 19:45:35 +01:00
UI for new funnel report.
This commit is contained in:
parent
30a1cdd53c
commit
cfe7089916
13 changed files with 179 additions and 125 deletions
|
|
@ -2,8 +2,8 @@ import { useContext } from 'react';
|
|||
import classNames from 'classnames';
|
||||
import { useMessages } from 'components/hooks';
|
||||
import { ReportContext } from '../[reportId]/Report';
|
||||
import styles from './FunnelChart.module.css';
|
||||
import { formatLongNumber } from 'lib/format';
|
||||
import styles from './FunnelChart.module.css';
|
||||
|
||||
export interface FunnelChartProps {
|
||||
className?: string;
|
||||
|
|
@ -18,35 +18,33 @@ export function FunnelChart({ className }: FunnelChartProps) {
|
|||
|
||||
return (
|
||||
<div className={classNames(styles.chart, className)}>
|
||||
{data?.map(({ url, visitors, dropped, dropoff, remaining }, index: number) => {
|
||||
{data?.map(({ type, value, visitors, dropped, dropoff, remaining }, index: number) => {
|
||||
return (
|
||||
<div key={url} className={styles.step}>
|
||||
<div key={index} className={styles.step}>
|
||||
<div className={styles.num}>{index + 1}</div>
|
||||
<div className={styles.card}>
|
||||
<div className={styles.header}>
|
||||
<span className={styles.label}>{formatMessage(labels.viewedPage)}:</span>
|
||||
<span className={styles.item}>{url}</span>
|
||||
<span className={styles.label}>
|
||||
{formatMessage(type === 'url' ? labels.viewedPage : labels.triggeredEvent)}:
|
||||
</span>
|
||||
<span className={styles.item}>{value}</span>
|
||||
</div>
|
||||
<div className={styles.metric}>
|
||||
<div>
|
||||
<span className={styles.visitors}>{formatLongNumber(visitors)}</span>
|
||||
{formatMessage(labels.visitors)}
|
||||
</div>
|
||||
<div className={styles.percent}>{(remaining * 100).toFixed(2)}%</div>
|
||||
</div>
|
||||
<div className={styles.track}>
|
||||
<div className={styles.bar} style={{ width: `${remaining * 100}%` }}>
|
||||
<span className={styles.value}>
|
||||
{remaining > 0.1 && `${(remaining * 100).toFixed(2)}%`}
|
||||
</span>
|
||||
</div>
|
||||
<div className={styles.bar} style={{ width: `${remaining * 100}%` }}></div>
|
||||
</div>
|
||||
<div className={styles.info}>
|
||||
<div>
|
||||
<b>{formatLongNumber(visitors)}</b>
|
||||
<span> {formatMessage(labels.visitors)}</span>
|
||||
<span> ({(remaining * 100).toFixed(2)}%)</span>
|
||||
{dropoff > 0 && (
|
||||
<div className={styles.info}>
|
||||
<b>{formatLongNumber(dropped)}</b> {formatMessage(labels.visitorsDroppedOff)} (
|
||||
{(dropoff * 100).toFixed(2)}%)
|
||||
</div>
|
||||
{dropoff > 0 && (
|
||||
<div>
|
||||
<b>{formatLongNumber(dropped)}</b> {formatMessage(labels.visitorsDroppedOff)} (
|
||||
{(dropoff * 100).toFixed(2)}%)
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue