From 84548a669e771a6b1a14a999e5484b7bf48c02a1 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Fri, 14 Jun 2024 18:33:54 -0700 Subject: [PATCH] Added drop-off info to journey. --- .../reports/journey/JourneyView.module.css | 25 +++++++++++++-- .../(main)/reports/journey/JourneyView.tsx | 32 ++++++++++++++++--- 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/src/app/(main)/reports/journey/JourneyView.module.css b/src/app/(main)/reports/journey/JourneyView.module.css index f4571cda..dcc1e467 100644 --- a/src/app/(main)/reports/journey/JourneyView.module.css +++ b/src/app/(main)/reports/journey/JourneyView.module.css @@ -22,8 +22,29 @@ } .header { + margin-bottom: 20px; +} + +.stats { display: flex; - min-height: 70px; + align-items: center; + justify-content: center; + gap: 20px; + width: 100%; +} + +.visitors { + font-weight: 600; + font-size: 16px; + text-transform: lowercase; +} + +.dropoff { + font-weight: 600; + color: var(--base800); + background: var(--base200); + padding: 4px 8px; + border-radius: 5px; } .num { @@ -38,7 +59,7 @@ color: var(--base100); background: var(--base800); z-index: 1; - margin: 0 auto; + margin: 0 auto 20px; } .column { diff --git a/src/app/(main)/reports/journey/JourneyView.tsx b/src/app/(main)/reports/journey/JourneyView.tsx index d9a43346..b013a3e1 100644 --- a/src/app/(main)/reports/journey/JourneyView.tsx +++ b/src/app/(main)/reports/journey/JourneyView.tsx @@ -1,7 +1,8 @@ import { useContext, useMemo, useState } from 'react'; +import { TooltipPopup } from 'react-basics'; import { firstBy } from 'thenby'; import classNames from 'classnames'; -import { useEscapeKey } from 'components/hooks'; +import { useEscapeKey, useMessages } from 'components/hooks'; import { objectToArray } from 'lib/data'; import { ReportContext } from '../[reportId]/Report'; // eslint-disable-next-line css-modules/no-unused-class @@ -16,6 +17,7 @@ export default function JourneyView() { const [activeNode, setActiveNode] = useState(null); const { report } = useContext(ReportContext); const { data, parameters } = report || {}; + const { formatMessage, labels } = useMessages(); useEscapeKey(() => setSelectedNode(null)); @@ -74,8 +76,16 @@ export default function JourneyView() { } }); + const nodesArray = objectToArray(nodes).sort(firstBy('total', -1)); + return { - nodes: objectToArray(nodes).sort(firstBy('total', -1)), + nodes: nodesArray, + visitors: nodesArray.reduce((sum, { selected, total }) => { + if (!selectedNode || (selectedNode && selected)) { + sum += total; + } + return sum; + }, 0), }; }); }, [data, selectedNode, activeNode]); @@ -99,6 +109,10 @@ export default function JourneyView() {
{columns.map((column, columnIndex) => { + const previousTotal = columns[columnIndex - 1]?.visitors ?? 0; + const dropOff = + previousTotal > 0 ? ((column.visitors - previousTotal) / previousTotal) * 100 : 0; + return (
{columnIndex + 1}
+
+
+ {column.visitors} {formatMessage(labels.visitors)} +
+ {columnIndex > 0 &&
{`${~~dropOff}%`}
} +
{column.nodes.map(({ name, total, selected, active, paths, from }, nodeIndex) => { @@ -146,9 +166,11 @@ export default function JourneyView() { onMouseLeave={() => selected && setActiveNode(null)} >
{name}
-
- {selected ? (active ? activeCount : selectedCount) : total} -
+ +
+ {selected ? (active ? activeCount : selectedCount) : total} +
+
{columnIndex < columns.length && lines.map(([fromIndex, nodeIndex], i) => { const height =