From 1e462714e406a14adfc244de7bd58231994f2a0e Mon Sep 17 00:00:00 2001
From: Mohamed El Mahdali <mohamed.elmahdali.developer@gmail.com>
Date: Tue, 16 Apr 2024 18:27:13 +0100
Subject: [PATCH] fix(#2575): Stop cash flow card labels from getting cutting
 off if bar height is too low (#2597)

---
 .../reports/reports/CashFlowCard.jsx          | 71 +++++++++++++------
 upcoming-release-notes/2597.md                |  6 ++
 2 files changed, 55 insertions(+), 22 deletions(-)
 create mode 100644 upcoming-release-notes/2597.md

diff --git a/packages/desktop-client/src/components/reports/reports/CashFlowCard.jsx b/packages/desktop-client/src/components/reports/reports/CashFlowCard.jsx
index 07759a4ec..ed8daeb6a 100644
--- a/packages/desktop-client/src/components/reports/reports/CashFlowCard.jsx
+++ b/packages/desktop-client/src/components/reports/reports/CashFlowCard.jsx
@@ -1,6 +1,6 @@
 import React, { useState, useMemo, useCallback } from 'react';
 
-import { Bar, BarChart, ResponsiveContainer } from 'recharts';
+import { Bar, BarChart, LabelList, ResponsiveContainer } from 'recharts';
 
 import * as monthUtils from 'loot-core/src/shared/months';
 import { integerToCurrency } from 'loot-core/src/shared/util';
@@ -17,23 +17,48 @@ import { ReportCard } from '../ReportCard';
 import { simpleCashFlow } from '../spreadsheets/cash-flow-spreadsheet';
 import { useReport } from '../useReport';
 
-function CustomLabel({ value, name, position, ...props }) {
+function CustomLabel({
+  value,
+  name,
+  position,
+  x,
+  y,
+  width: barWidth,
+  height: barHeight,
+}) {
+  const valueLengthOffset = value.toString().length < 5 ? -40 : 20;
+
+  const yOffset = barHeight < 25 ? 105 : y;
+
+  const labelXOffsets = {
+    right: 6,
+    left: -valueLengthOffset + 1,
+  };
+
+  const valueXOffsets = {
+    right: 6,
+    left: -valueLengthOffset + 2,
+  };
+
+  const anchorValue = {
+    right: 'start',
+    left: 'end',
+  };
+
   return (
     <>
       <text
-        {...props}
-        dy={10}
-        dx={position === 'right' ? 20 : -5}
-        textAnchor={position === 'right' ? 'start' : 'end'}
+        x={x + barWidth + labelXOffsets[position]}
+        y={yOffset + 10}
+        textAnchor={anchorValue[position]}
         fill={theme.tableText}
       >
         {name}
       </text>
       <text
-        {...props}
-        dy={26}
-        dx={position === 'right' ? 20 : -4}
-        textAnchor={position === 'right' ? 'start' : 'end'}
+        x={x + barWidth + valueXOffsets[position]}
+        y={yOffset + 26}
+        textAnchor={anchorValue[position]}
         fill={theme.tableText}
       >
         <PrivacyFilter>{integerToCurrency(value)}</PrivacyFilter>
@@ -100,18 +125,20 @@ export function CashFlowCard() {
                 bottom: 0,
               }}
             >
-              <Bar
-                dataKey="income"
-                fill={chartTheme.colors.blue}
-                barSize={14}
-                label={<CustomLabel name="Income" position="left" />}
-              />
-              <Bar
-                dataKey="expenses"
-                fill={chartTheme.colors.red}
-                barSize={14}
-                label={<CustomLabel name="Expenses" position="right" />}
-              />
+              <Bar dataKey="income" fill={chartTheme.colors.blue} barSize={14}>
+                <LabelList
+                  dataKey="income"
+                  position="left"
+                  content={<CustomLabel name="Income" />}
+                />
+              </Bar>
+              <Bar dataKey="expenses" fill={chartTheme.colors.red} barSize={14}>
+                <LabelList
+                  dataKey="expenses"
+                  position="right"
+                  content={<CustomLabel name="Expenses" />}
+                />
+              </Bar>
             </BarChart>
           </ResponsiveContainer>
         ) : (
diff --git a/upcoming-release-notes/2597.md b/upcoming-release-notes/2597.md
new file mode 100644
index 000000000..3e370b40f
--- /dev/null
+++ b/upcoming-release-notes/2597.md
@@ -0,0 +1,6 @@
+---
+category: Bugfix
+authors: [ttlgeek]
+---
+
+Stop cash flow card labels from getting cutting off if bar height is too low
-- 
GitLab