summaryrefslogtreecommitdiff
path: root/gui/src/components/histogram/Histogram.tsx
diff options
context:
space:
mode:
authorJoe Carstairs <me@joeac.net>2024-09-05 22:44:37 +0100
committerJoe Carstairs <me@joeac.net>2024-09-05 22:44:37 +0100
commit6e827308ce332a842c87f19d7adedf827544317e (patch)
tree9509622166b56537469ec48bbe980efee75b6974 /gui/src/components/histogram/Histogram.tsx
parent95d4db4da725b74999524a1307e5e17b434dbfeb (diff)
Adds GUI with basic histogram
Diffstat (limited to 'gui/src/components/histogram/Histogram.tsx')
-rw-r--r--gui/src/components/histogram/Histogram.tsx70
1 files changed, 70 insertions, 0 deletions
diff --git a/gui/src/components/histogram/Histogram.tsx b/gui/src/components/histogram/Histogram.tsx
new file mode 100644
index 0000000..ee4b7b0
--- /dev/null
+++ b/gui/src/components/histogram/Histogram.tsx
@@ -0,0 +1,70 @@
+import Category from "../../types/category";
+import './Histogram.scss';
+
+function Histogram({ categories }: Props) {
+ const maxAbsBalanceToBudgetRatio = Math.max(
+ ...categories.map((c) => Math.abs(c.balanceToBudgetRatio))
+ );
+
+ return (
+ <table>
+ <thead>
+ <tr>
+ <th>Category</th>
+ <th>Balance-to-Budget Ratio</th>
+ <th>Balance</th>
+ </tr>
+ </thead>
+
+ <tbody>
+ {
+ categories
+ .sort((c1, c2) => c1.balanceToBudgetRatio - c2.balanceToBudgetRatio)
+ .map((category) => Row({ category, maxAbsBalanceToBudgetRatio }))
+ }
+ </tbody>
+ </table>
+ );
+}
+
+function Row({ category, maxAbsBalanceToBudgetRatio }: RowProps) {
+ const normalisedRatio = category.balanceToBudgetRatio / maxAbsBalanceToBudgetRatio;
+ const variant = getRowVariant(new Number(normalisedRatio).valueOf());
+
+ return (
+ <tr>
+ <td class="name">{category.name}</td>
+ <td
+ class={`ratio ratio--${variant}`}
+ style={`--normal-abs-ratio: ${Math.abs(normalisedRatio)};`}
+ >
+ <span class="ratio__text">
+ {category.balanceToBudgetRatio.toFixed(2)}
+ </span>
+ <span class="ratio__bar"></span>
+ </td>
+ <td class="balance">{category.currentBalance.toString()}</td>
+ </tr>
+ );
+}
+
+function getRowVariant(balanceToBudgetRatio: number) {
+ if (balanceToBudgetRatio < 0) {
+ return 'arrears';
+ }
+ if (balanceToBudgetRatio >= 1) {
+ return 'spend';
+ }
+ return 'save';
+}
+
+type Props = {
+ categories: Category[],
+};
+
+type RowProps = {
+ category: Category,
+ maxAbsBalanceToBudgetRatio: number,
+};
+
+export default Histogram;