76 lines
1.9 KiB
TypeScript
76 lines
1.9 KiB
TypeScript
import { ReportData } from "../../features/report";
|
|
import {
|
|
mergeBucketPeriods,
|
|
getAmount,
|
|
PeriodKey,
|
|
} from "../report.helpers";
|
|
import { ChartDataPoint } from "./HistoryChart.models";
|
|
|
|
// ─── Tab → PeriodKey ─────────────────────────────────────────
|
|
|
|
const TAB_TO_KEY: Record<string, PeriodKey> = {
|
|
Weekly: "weekly",
|
|
Monthly: "monthly",
|
|
Yearly: "yearly",
|
|
"Financial Year": "fyly",
|
|
"All Time": "full",
|
|
};
|
|
|
|
export function tabToKey(tab: string): PeriodKey {
|
|
return TAB_TO_KEY[tab] ?? "full";
|
|
}
|
|
|
|
// ─── Comparison ──────────────────────────────────────────────
|
|
|
|
function attachComparison(
|
|
points: ChartDataPoint[],
|
|
key: PeriodKey
|
|
): ChartDataPoint[] {
|
|
const getCompareIndex = (i: number) => {
|
|
if (key === "weekly") return i - 4;
|
|
if (key === "monthly") return i - 12;
|
|
if (key === "yearly") return i - 1;
|
|
if (key === "fyly") return i - 1;
|
|
return -1;
|
|
};
|
|
|
|
return points.map((p, i) => {
|
|
const ci = getCompareIndex(i);
|
|
|
|
return {
|
|
...p,
|
|
compare:
|
|
ci >= 0 && points[ci]
|
|
? {
|
|
id: points[ci].id,
|
|
label: points[ci].label,
|
|
amount: points[ci].amount,
|
|
}
|
|
: undefined,
|
|
};
|
|
});
|
|
}
|
|
|
|
// ─── Main adapter ────────────────────────────────────────────
|
|
|
|
export function buildChartData(
|
|
reportData: ReportData,
|
|
key: PeriodKey,
|
|
mode: "expense" | "income",
|
|
comparison: boolean
|
|
): ChartDataPoint[] {
|
|
const merged = mergeBucketPeriods(reportData.buckets, key);
|
|
|
|
let points: ChartDataPoint[] = merged.map((p) => ({
|
|
id: p.id,
|
|
label: p.label,
|
|
amount: getAmount(p, mode),
|
|
}));
|
|
|
|
if (comparison) {
|
|
points = attachComparison(points, key);
|
|
}
|
|
|
|
return points;
|
|
}
|