+ {highestConversion && (
+
+
+ }
+ />
+
+ {number.formatWithUnit(
+ highestConversion.lastStep.percent / 100,
+ '%',
+ )}
+
+
+ )}
+ {highestCount && (
+
+ }
+ />
+
+ {number.format(highestCount.lastStep.count)}
+
+
+ )}
+
+ );
+}
+
+function ChartName({
+ breakdowns,
+ className,
+}: { breakdowns: string[]; className?: string }) {
+ return (
+
+ {breakdowns.map((name, index) => {
+ return (
+ <>
+ {index !== 0 && }
+ {name}
+ >
+ );
+ })}
+
+ );
+}
+
+export function Tables({
data: {
- current: { steps, totalSessions },
+ current: { steps, mostDropoffsStep, lastStep, breakdowns },
previous,
},
}: Props) {
const number = useNumber();
- const { isEditMode } = useReportChartContext();
- const mostDropoffs = findMostDropoffs(steps);
- const lastStep = last(steps)!;
- const prevLastStep = previous?.steps ? last(previous.steps) : null;
-
+ const hasHeader = breakdowns.length > 0;
return (
-
-
-
-
+ {hasHeader && }
+
+
+
+ previous && (
+
+ )
}
/>
-
- }
- />
-
+ previous && (
+
+ )
}
/>
+ {!!mostDropoffsStep && (
+
+
+ {mostDropoffsStep?.dropoffCount}
+ {' '}
+ dropped after this event. Improve this step and your
+ conversion rate will likely increase.
+
+ }
+ >
+
+
+ }
+ />
+ )}
- {steps.map((step, index) => {
- const percent = (step.count / totalSessions) * 100;
- const isMostDropoffs = mostDropoffs.event.id === step.event.id;
- return (
-
-
-
- {alphabetIds[index]}
-
-
- {step.event.displayName}
-
-
-
-
- Last period:{' '}
-
- {number.format(
- previous?.steps?.[index]?.previousCount,
- )}
-
-
-
-
- }
- >
-
-
- Total:
-
-
-
- {number.format(step.previousCount)}
-
-
-
-
-
-
- Last period:{' '}
-
- {number.format(
- previous?.steps?.[index]?.dropoffCount,
- )}
-
-
-
-
- }
- >
-
-
- Dropoff:
-
-
-
- {isMostDropoffs && }
- {number.format(step.dropoffCount)}
-
-
-
-
-
-
- Last period:{' '}
-
- {number.format(previous?.steps?.[index]?.count)}
-
-
-
-
- }
- >
-
-
- Current:
-
-
-
- {number.format(step.count)}
-
-
-
-
-
-
- Last period:{' '}
-
- {number.format(previous?.steps?.[index]?.count)}
-
-
-
-
- }
- >
-
-
- Percent:
-
-
-
- {Number.isNaN(percent) ? 0 : round(percent, 2)}%
-
-
-
-
-
+
item.event.id!}
+ className={'text-sm @container'}
+ columnClassName="px-2 group/row items-center"
+ eachRow={(item, index) => {
+ return (
+
-
-
- );
- })}
+ );
+ }}
+ columns={[
+ {
+ name: 'Event',
+ render: (item, index) => (
+
+ {alphabetIds[index]}
+ {item.event.displayName}
+
+ ),
+ className: 'text-left font-mono font-semibold',
+ },
+ {
+ name: 'Completed',
+ render: (item) => number.format(item.count),
+ className: 'text-right font-mono',
+ },
+ {
+ name: 'Dropped after',
+ render: (item) =>
+ item.dropoffCount !== null && item.dropoffPercent !== null
+ ? number.format(item.dropoffCount)
+ : null,
+ className: 'text-right font-mono',
+ },
+ {
+ name: 'Conversion',
+ render: (item) => number.formatWithUnit(item.percent / 100, '%'),
+ className: 'text-right font-mono font-semibold',
+ },
+ ]}
+ />