From 9c3075f60f5fd1727dccf8701173a3d2b627edfa Mon Sep 17 00:00:00 2001
From: Neil <55785687+carkom@users.noreply.github.com>
Date: Mon, 13 May 2024 16:00:16 +0100
Subject: [PATCH] Custom Reports: TS strict changes #1 (#2726)
* TS strict changes
* notes
* renderRowProps
* RenderTableRow
---
.../src/components/reports/ChooseGraph.tsx | 7 +-
.../src/components/reports/ReportSummary.tsx | 17 ++-
.../components/reports/graphs/AreaGraph.tsx | 6 +-
.../components/reports/graphs/BarGraph.tsx | 14 +--
.../components/reports/graphs/DonutGraph.tsx | 6 +-
.../components/reports/graphs/LineGraph.tsx | 4 +-
.../reports/graphs/StackedBarGraph.tsx | 4 +-
.../reports/graphs/adjustTextSize.ts | 34 ++++--
.../graphs/tableGraph/RenderTableRow.tsx | 55 +++++++++
.../reports/graphs/tableGraph/ReportTable.tsx | 34 ++++--
.../graphs/tableGraph/ReportTableHeader.tsx | 20 ++--
.../graphs/tableGraph/ReportTableList.tsx | 108 +++++++++---------
.../graphs/tableGraph/ReportTableRow.tsx | 4 +-
.../graphs/tableGraph/ReportTableTotals.tsx | 23 ++--
.../reports/reports/CustomReport.tsx | 6 +-
.../reports/spreadsheets/calculateLegend.ts | 23 ++--
.../spreadsheets/custom-spreadsheet.ts | 11 +-
.../spreadsheets/grouped-spreadsheet.ts | 6 +-
.../loot-core/src/types/models/reports.d.ts | 32 ++----
upcoming-release-notes/2726.md | 6 +
20 files changed, 253 insertions(+), 167 deletions(-)
create mode 100644 packages/desktop-client/src/components/reports/graphs/tableGraph/RenderTableRow.tsx
create mode 100644 upcoming-release-notes/2726.md
diff --git a/packages/desktop-client/src/components/reports/ChooseGraph.tsx b/packages/desktop-client/src/components/reports/ChooseGraph.tsx
index c8afbdd50a..0e19a7c146 100644
--- a/packages/desktop-client/src/components/reports/ChooseGraph.tsx
+++ b/packages/desktop-client/src/components/reports/ChooseGraph.tsx
@@ -1,7 +1,7 @@
// @ts-strict-ignore
import React, { useRef } from 'react';
-import { type GroupedEntity } from 'loot-core/src/types/models/reports';
+import { type DataEntity } from 'loot-core/src/types/models/reports';
import { type RuleConditionEntity } from 'loot-core/types/models/rule';
import { type CSSProperties } from '../../style';
@@ -20,7 +20,7 @@ import { ReportTableTotals } from './graphs/tableGraph/ReportTableTotals';
import { ReportOptions } from './ReportOptions';
type ChooseGraphProps = {
- data: GroupedEntity;
+ data: DataEntity;
filters?: RuleConditionEntity[];
mode: string;
graphType: string;
@@ -160,13 +160,14 @@ export function ChooseGraph({
{monthUtils.format(
startDate,
- ReportOptions.intervalFormat.get(interval),
+ ReportOptions.intervalFormat.get(interval) || '',
)}
{monthUtils.format(
startDate,
- ReportOptions.intervalFormat.get(interval),
+ ReportOptions.intervalFormat.get(interval) || '',
) !==
monthUtils.format(
endDate,
- ReportOptions.intervalFormat.get(interval),
+ ReportOptions.intervalFormat.get(interval) || '',
) &&
' to ' +
monthUtils.format(
endDate,
- ReportOptions.intervalFormat.get(interval),
+ ReportOptions.intervalFormat.get(interval) || '',
)}
@@ -153,7 +152,7 @@ export function ReportSummary({
- Per {ReportOptions.intervalMap.get(interval).toLowerCase()}
+ Per {(ReportOptions.intervalMap.get(interval) || '').toLowerCase()}
diff --git a/packages/desktop-client/src/components/reports/graphs/AreaGraph.tsx b/packages/desktop-client/src/components/reports/graphs/AreaGraph.tsx
index ed21a78200..860d2c7fcd 100644
--- a/packages/desktop-client/src/components/reports/graphs/AreaGraph.tsx
+++ b/packages/desktop-client/src/components/reports/graphs/AreaGraph.tsx
@@ -17,7 +17,7 @@ import {
amountToCurrency,
amountToCurrencyNoDecimal,
} from 'loot-core/src/shared/util';
-import { type GroupedEntity } from 'loot-core/src/types/models/reports';
+import { type DataEntity } from 'loot-core/src/types/models/reports';
import { usePrivacyMode } from '../../../hooks/usePrivacyMode';
import { useResponsive } from '../../../ResponsiveProvider';
@@ -105,14 +105,14 @@ const customLabel = (props, width, end) => {
const textAnchor = props.index === 0 ? 'left' : 'middle';
const display =
props.value !== 0 && `${amountToCurrencyNoDecimal(props.value)}`;
- const textSize = adjustTextSize(width, 'area');
+ const textSize = adjustTextSize({ sized: width, type: 'area' });
return renderCustomLabel(calcX, calcY, textAnchor, display, textSize);
};
type AreaGraphProps = {
style?: CSSProperties;
- data: GroupedEntity;
+ data: DataEntity;
balanceTypeOp: string;
compact?: boolean;
viewLabels: boolean;
diff --git a/packages/desktop-client/src/components/reports/graphs/BarGraph.tsx b/packages/desktop-client/src/components/reports/graphs/BarGraph.tsx
index a01984afae..e8d1eb26b7 100644
--- a/packages/desktop-client/src/components/reports/graphs/BarGraph.tsx
+++ b/packages/desktop-client/src/components/reports/graphs/BarGraph.tsx
@@ -19,7 +19,7 @@ import {
amountToCurrency,
amountToCurrencyNoDecimal,
} from 'loot-core/src/shared/util';
-import { type GroupedEntity } from 'loot-core/src/types/models/reports';
+import { type DataEntity } from 'loot-core/src/types/models/reports';
import { type RuleConditionEntity } from 'loot-core/types/models/rule';
import { useAccounts } from '../../../hooks/useAccounts';
@@ -122,18 +122,18 @@ const customLabel = (props, typeOp) => {
const textAnchor = 'middle';
const display =
props.value !== 0 && `${amountToCurrencyNoDecimal(props.value)}`;
- const textSize = adjustTextSize(
- props.width,
- typeOp === 'totalTotals' ? 'default' : 'variable',
- props.value,
- );
+ const textSize = adjustTextSize({
+ sized: props.width,
+ type: typeOp === 'totalTotals' ? 'default' : 'variable',
+ values: props.value,
+ });
return renderCustomLabel(calcX, calcY, textAnchor, display, textSize);
};
type BarGraphProps = {
style?: CSSProperties;
- data: GroupedEntity;
+ data: DataEntity;
filters: RuleConditionEntity[];
groupBy: string;
balanceTypeOp: string;
diff --git a/packages/desktop-client/src/components/reports/graphs/DonutGraph.tsx b/packages/desktop-client/src/components/reports/graphs/DonutGraph.tsx
index e6cfeffa5e..c1f50df27a 100644
--- a/packages/desktop-client/src/components/reports/graphs/DonutGraph.tsx
+++ b/packages/desktop-client/src/components/reports/graphs/DonutGraph.tsx
@@ -4,7 +4,7 @@ import React, { useState } from 'react';
import { PieChart, Pie, Cell, Sector, ResponsiveContainer } from 'recharts';
import { amountToCurrency } from 'loot-core/src/shared/util';
-import { type GroupedEntity } from 'loot-core/src/types/models/reports';
+import { type DataEntity } from 'loot-core/src/types/models/reports';
import { type RuleConditionEntity } from 'loot-core/types/models/rule';
import { useAccounts } from '../../../hooks/useAccounts';
@@ -158,7 +158,7 @@ const customLabel = props => {
const calcY = props.cy + radius * Math.sin(-props.midAngle * RADIAN);
const textAnchor = calcX > props.cx ? 'start' : 'end';
const display = props.value !== 0 && `${(props.percent * 100).toFixed(0)}%`;
- const textSize = adjustTextSize(size, 'donut');
+ const textSize = adjustTextSize({ sized: size, type: 'donut' });
const showLabel = props.percent;
const showLabelThreshold = 0.05;
const fill = theme.reportsInnerLabel;
@@ -177,7 +177,7 @@ const customLabel = props => {
type DonutGraphProps = {
style?: CSSProperties;
- data: GroupedEntity;
+ data: DataEntity;
filters: RuleConditionEntity[];
groupBy: string;
balanceTypeOp: string;
diff --git a/packages/desktop-client/src/components/reports/graphs/LineGraph.tsx b/packages/desktop-client/src/components/reports/graphs/LineGraph.tsx
index e7b1174246..3cb78f3d4d 100644
--- a/packages/desktop-client/src/components/reports/graphs/LineGraph.tsx
+++ b/packages/desktop-client/src/components/reports/graphs/LineGraph.tsx
@@ -16,7 +16,7 @@ import {
amountToCurrency,
amountToCurrencyNoDecimal,
} from 'loot-core/src/shared/util';
-import { type GroupedEntity } from 'loot-core/types/models/reports';
+import { type DataEntity } from 'loot-core/types/models/reports';
import { type RuleConditionEntity } from 'loot-core/types/models/rule';
import { useAccounts } from '../../../hooks/useAccounts';
@@ -109,7 +109,7 @@ const CustomTooltip = ({
type LineGraphProps = {
style?: CSSProperties;
- data: GroupedEntity;
+ data: DataEntity;
filters: RuleConditionEntity[];
groupBy: string;
compact?: boolean;
diff --git a/packages/desktop-client/src/components/reports/graphs/StackedBarGraph.tsx b/packages/desktop-client/src/components/reports/graphs/StackedBarGraph.tsx
index 3712c10a6b..2df89692da 100644
--- a/packages/desktop-client/src/components/reports/graphs/StackedBarGraph.tsx
+++ b/packages/desktop-client/src/components/reports/graphs/StackedBarGraph.tsx
@@ -17,7 +17,7 @@ import {
amountToCurrency,
amountToCurrencyNoDecimal,
} from 'loot-core/src/shared/util';
-import { type GroupedEntity } from 'loot-core/src/types/models/reports';
+import { type DataEntity } from 'loot-core/src/types/models/reports';
import { type RuleConditionEntity } from 'loot-core/types/models/rule';
import { useAccounts } from '../../../hooks/useAccounts';
@@ -138,7 +138,7 @@ const customLabel = props => {
type StackedBarGraphProps = {
style?: CSSProperties;
- data: GroupedEntity;
+ data: DataEntity;
filters: RuleConditionEntity[];
groupBy: string;
compact?: boolean;
diff --git a/packages/desktop-client/src/components/reports/graphs/adjustTextSize.ts b/packages/desktop-client/src/components/reports/graphs/adjustTextSize.ts
index b8e4824140..f1b9116ef6 100644
--- a/packages/desktop-client/src/components/reports/graphs/adjustTextSize.ts
+++ b/packages/desktop-client/src/components/reports/graphs/adjustTextSize.ts
@@ -1,13 +1,23 @@
-// @ts-strict-ignore
-export const adjustTextSize = (
- sized: number,
- type: string,
- values?: number,
-): `${number}px` => {
- let source;
+export const adjustTextSize = ({
+ sized,
+ type,
+ values = 0,
+}: {
+ sized: number;
+ type: string;
+ values?: number;
+}): `${number}px` => {
+ let source: {
+ size: number;
+ font: number;
+ }[] = [{ size: -1, font: -1 }];
switch (type) {
case 'variable':
- source = variableLookup.find(({ value }) => values >= value).arr;
+ const findLookup = variableLookup.find(({ value }) => values >= value);
+ if (!findLookup) {
+ break;
+ }
+ source = findLookup.arr;
break;
case 'donut':
source = donutLookup;
@@ -15,8 +25,12 @@ export const adjustTextSize = (
default:
source = defaultLookup;
}
- const lookup = source.find(({ size }) => sized >= size);
- return `${lookup.font}px`;
+ const findSource = source.find(({ size }) => sized >= size);
+ if (!findSource) {
+ return '13px';
+ }
+
+ return `${findSource.font}px`;
};
const defaultLookup = [
diff --git a/packages/desktop-client/src/components/reports/graphs/tableGraph/RenderTableRow.tsx b/packages/desktop-client/src/components/reports/graphs/tableGraph/RenderTableRow.tsx
new file mode 100644
index 0000000000..aad73c3423
--- /dev/null
+++ b/packages/desktop-client/src/components/reports/graphs/tableGraph/RenderTableRow.tsx
@@ -0,0 +1,55 @@
+import React, { type ReactNode } from 'react';
+
+import { type GroupedEntity } from 'loot-core/src/types/models/reports';
+
+import { type CSSProperties } from '../../../../style';
+import { View } from '../../../common/View';
+
+import { type renderRowProps } from './ReportTable';
+
+type RenderTableRowProps = {
+ index: number;
+ parent_index?: number;
+ compact: boolean;
+ renderRow: (arg: renderRowProps) => ReactNode;
+ intervalsCount: number;
+ mode: string;
+ metadata: GroupedEntity[];
+ style?: CSSProperties;
+ compactStyle?: CSSProperties;
+};
+
+export function RenderTableRow({
+ index,
+ parent_index,
+ compact,
+ renderRow,
+ intervalsCount,
+ mode,
+ metadata,
+ style,
+ compactStyle,
+}: RenderTableRowProps) {
+ const child = metadata[index];
+ const parent =
+ parent_index !== undefined ? metadata[parent_index] : ({} as GroupedEntity);
+
+ const item =
+ parent_index === undefined
+ ? child
+ : (parent.categories && parent.categories[index]) ||
+ ({} as GroupedEntity);
+
+ return (
+
+ {renderRow({
+ item,
+ mode,
+ intervalsCount,
+ compact,
+ style,
+ compactStyle,
+ })}
+
+ );
+}
diff --git a/packages/desktop-client/src/components/reports/graphs/tableGraph/ReportTable.tsx b/packages/desktop-client/src/components/reports/graphs/tableGraph/ReportTable.tsx
index 9987321dbd..c45be017ec 100644
--- a/packages/desktop-client/src/components/reports/graphs/tableGraph/ReportTable.tsx
+++ b/packages/desktop-client/src/components/reports/graphs/tableGraph/ReportTable.tsx
@@ -1,13 +1,15 @@
-// @ts-strict-ignore
import React, {
+ type RefObject,
useCallback,
useLayoutEffect,
useRef,
type UIEventHandler,
} from 'react';
-import { type RefProp } from 'react-spring';
-import { type GroupedEntity } from 'loot-core/src/types/models/reports';
+import {
+ type GroupedEntity,
+ type DataEntity,
+} from 'loot-core/src/types/models/reports';
import { type RuleConditionEntity } from 'loot-core/types/models/rule';
import { type CSSProperties } from '../../../../style';
@@ -19,11 +21,11 @@ import { ReportTableRow } from './ReportTableRow';
type ReportTableProps = {
saveScrollWidth: (value: number) => void;
- listScrollRef: RefProp;
+ listScrollRef: RefObject;
handleScroll: UIEventHandler;
groupBy: string;
balanceTypeOp: 'totalDebts' | 'totalTotals' | 'totalAssets';
- data: GroupedEntity;
+ data: DataEntity;
filters?: RuleConditionEntity[];
mode: string;
intervalsCount: number;
@@ -34,6 +36,15 @@ type ReportTableProps = {
showOffBudget?: boolean;
};
+export type renderRowProps = {
+ item: GroupedEntity;
+ mode: string;
+ intervalsCount: number;
+ compact: boolean;
+ style?: CSSProperties;
+ compactStyle?: CSSProperties;
+};
+
export function ReportTable({
saveScrollWidth,
listScrollRef,
@@ -58,8 +69,15 @@ export function ReportTable({
}
});
- const renderItem = useCallback(
- ({ item, mode, intervalsCount, compact, style, compactStyle }) => {
+ const renderRow = useCallback(
+ ({
+ item,
+ mode,
+ intervalsCount,
+ compact,
+ style,
+ compactStyle,
+ }: renderRowProps) => {
return (
;
+ headerScrollRef: RefObject;
handleScroll: UIEventHandler;
compact: boolean;
- style?: CSSProperties;
- compactStyle?: CSSProperties;
+ style: CSSProperties;
+ compactStyle: CSSProperties;
+ mode: string;
};
export function ReportTableHeader({
@@ -32,6 +31,7 @@ export function ReportTableHeader({
compact,
style,
compactStyle,
+ mode,
}: ReportTableHeaderProps) {
return (
- {data
+ {mode === 'time'
? data.map((header, index) => {
return (
ReactNode;
compact: boolean;
style?: CSSProperties;
compactStyle?: CSSProperties;
@@ -23,47 +28,28 @@ export function ReportTableList({
intervalsCount,
mode,
groupBy,
- renderItem,
+ renderRow,
compact,
style,
compactStyle,
}: ReportTableListProps) {
- const groupByData =
+ const metadata: GroupedEntity[] | undefined =
groupBy === 'Category'
- ? 'groupedData'
+ ? data.groupedData || []
: groupBy === 'Interval'
- ? 'intervalData'
- : 'data';
- const metadata = data[groupByData];
-
- type RenderRowProps = {
- index: number;
- parent_index?: number;
- compact: boolean;
- style?: CSSProperties;
- compactStyle?: CSSProperties;
- };
- function RenderRow({
- index,
- parent_index,
- compact,
- style,
- compactStyle,
- }: RenderRowProps) {
- const item =
- parent_index === undefined
- ? metadata[index]
- : metadata[parent_index].categories[index];
-
- return renderItem({
- item,
- mode,
- intervalsCount,
- compact,
- style,
- compactStyle,
- });
- }
+ ? data.intervalData.map(interval => {
+ return {
+ id: '',
+ name: '',
+ date: interval.date,
+ totalAssets: interval.totalAssets,
+ totalDebts: interval.totalDebts,
+ totalTotals: interval.totalTotals,
+ intervalData: [],
+ categories: [],
+ };
+ })
+ : data.data;
return (
@@ -71,10 +57,14 @@ export function ReportTableList({
{metadata.map((item, index) => {
return (
-
-
+
- {item.categories.map((category, i) => {
- return (
-
- );
- })}
+ {item.categories.map(
+ (category: GroupedEntity, i: number) => {
+ return (
+
+ );
+ },
+ )}
>
diff --git a/packages/desktop-client/src/components/reports/graphs/tableGraph/ReportTableRow.tsx b/packages/desktop-client/src/components/reports/graphs/tableGraph/ReportTableRow.tsx
index 54c1c650f5..d759a90d78 100644
--- a/packages/desktop-client/src/components/reports/graphs/tableGraph/ReportTableRow.tsx
+++ b/packages/desktop-client/src/components/reports/graphs/tableGraph/ReportTableRow.tsx
@@ -5,7 +5,7 @@ import {
amountToInteger,
integerToCurrency,
} from 'loot-core/src/shared/util';
-import { type DataEntity } from 'loot-core/src/types/models/reports';
+import { type GroupedEntity } from 'loot-core/types/models/reports';
import { type RuleConditionEntity } from 'loot-core/types/models/rule';
import { useAccounts } from '../../../../hooks/useAccounts';
@@ -17,7 +17,7 @@ import { Row, Cell } from '../../../table';
import { showActivity } from '../showActivity';
type ReportTableRowProps = {
- item: DataEntity;
+ item: GroupedEntity;
balanceTypeOp: 'totalAssets' | 'totalDebts' | 'totalTotals';
groupBy: string;
mode: string;
diff --git a/packages/desktop-client/src/components/reports/graphs/tableGraph/ReportTableTotals.tsx b/packages/desktop-client/src/components/reports/graphs/tableGraph/ReportTableTotals.tsx
index 48b16e581e..f9f01a6df6 100644
--- a/packages/desktop-client/src/components/reports/graphs/tableGraph/ReportTableTotals.tsx
+++ b/packages/desktop-client/src/components/reports/graphs/tableGraph/ReportTableTotals.tsx
@@ -1,13 +1,16 @@
-// @ts-strict-ignore
-import React, { type UIEventHandler, useLayoutEffect, useState } from 'react';
-import { type RefProp } from 'react-spring';
+import React, {
+ type UIEventHandler,
+ useLayoutEffect,
+ useState,
+ type RefObject,
+} from 'react';
import {
amountToCurrency,
amountToInteger,
integerToCurrency,
} from 'loot-core/src/shared/util';
-import { type GroupedEntity } from 'loot-core/src/types/models/reports';
+import { type DataEntity } from 'loot-core/src/types/models/reports';
import { type RuleConditionEntity } from 'loot-core/types/models/rule';
import { useAccounts } from '../../../../hooks/useAccounts';
@@ -22,11 +25,11 @@ import { Row, Cell } from '../../../table';
import { showActivity } from '../showActivity';
type ReportTableTotalsProps = {
- data: GroupedEntity;
- balanceTypeOp: string;
+ data: DataEntity;
+ balanceTypeOp: 'totalAssets' | 'totalDebts' | 'totalTotals';
mode: string;
intervalsCount: number;
- totalScrollRef: RefProp;
+ totalScrollRef: RefObject;
handleScroll: UIEventHandler;
compact: boolean;
style?: CSSProperties;
@@ -58,11 +61,13 @@ export function ReportTableTotals({
if (totalScrollRef.current) {
const [parent, child] = [
totalScrollRef.current.offsetParent
- ? totalScrollRef.current.parentElement.scrollHeight || 0
+ ? (totalScrollRef.current.parentElement
+ ? totalScrollRef.current.parentElement.scrollHeight
+ : 0) || 0
: 0,
totalScrollRef.current ? totalScrollRef.current.scrollHeight : 0,
];
- setScrollWidthTotals(parent > 0 && child > 0 && parent - child);
+ setScrollWidthTotals(parent > 0 && child > 0 ? parent - child : 0);
}
});
const average = amountToInteger(data[balanceTypeOp]) / intervalsCount;
diff --git a/packages/desktop-client/src/components/reports/reports/CustomReport.tsx b/packages/desktop-client/src/components/reports/reports/CustomReport.tsx
index 53320dd83f..0f0738b7f0 100644
--- a/packages/desktop-client/src/components/reports/reports/CustomReport.tsx
+++ b/packages/desktop-client/src/components/reports/reports/CustomReport.tsx
@@ -8,8 +8,8 @@ import * as monthUtils from 'loot-core/src/shared/months';
import { amountToCurrency } from 'loot-core/src/shared/util';
import { type CategoryEntity } from 'loot-core/types/models/category';
import {
- type GroupedEntity,
type CustomReportEntity,
+ type DataEntity,
} from 'loot-core/types/models/reports';
import { type RuleConditionEntity } from 'loot-core/types/models/rule';
@@ -240,7 +240,7 @@ export function CustomReport() {
}
}, [interval, startDate, endDate, firstDayOfWeekIdx]);
- const balanceTypeOp =
+ const balanceTypeOp: 'totalAssets' | 'totalDebts' | 'totalTotals' =
ReportOptions.balanceTypeMap.get(balanceType) || 'totalDebts';
const payees = usePayees();
const accounts = useAccounts();
@@ -321,7 +321,7 @@ export function CustomReport() {
const graphData = useReport('default', getGraphData);
const groupedData = useReport('grouped', getGroupData);
- const data: GroupedEntity = { ...graphData, groupedData } as GroupedEntity;
+ const data: DataEntity = { ...graphData, groupedData } as DataEntity;
const customReportItems: CustomReportEntity = {
id: '',
diff --git a/packages/desktop-client/src/components/reports/spreadsheets/calculateLegend.ts b/packages/desktop-client/src/components/reports/spreadsheets/calculateLegend.ts
index f19bc69049..de1ed86758 100644
--- a/packages/desktop-client/src/components/reports/spreadsheets/calculateLegend.ts
+++ b/packages/desktop-client/src/components/reports/spreadsheets/calculateLegend.ts
@@ -1,18 +1,19 @@
import {
- type IntervalData,
- type ItemEntity,
+ type LegendEntity,
+ type IntervalEntity,
+ type GroupedEntity,
} from 'loot-core/src/types/models/reports';
import { theme } from '../../../style';
import { getColorScale } from '../chart-theme';
export function calculateLegend(
- intervalData: IntervalData[],
- calcDataFiltered: ItemEntity[],
+ intervalData: IntervalEntity[],
+ calcDataFiltered: GroupedEntity[],
groupBy: string,
- graphType: string,
- balanceTypeOp: string,
-) {
+ graphType?: string,
+ balanceTypeOp?: keyof GroupedEntity,
+): LegendEntity[] {
const colorScale = getColorScale('qualitative');
const chooseData =
groupBy === 'Interval'
@@ -22,10 +23,11 @@ export function calculateLegend(
: calcDataFiltered.map(c => {
return { name: c.name, id: c.id };
});
- return chooseData.map((item, index) => {
+
+ const legend: LegendEntity[] = chooseData.map((item, index) => {
return {
- id: item.id,
- name: item.name,
+ id: item.id || '',
+ name: item.name || '',
color:
graphType === 'DonutGraph'
? colorScale[index % colorScale.length]
@@ -36,4 +38,5 @@ export function calculateLegend(
: colorScale[index % colorScale.length],
};
});
+ return legend;
}
diff --git a/packages/desktop-client/src/components/reports/spreadsheets/custom-spreadsheet.ts b/packages/desktop-client/src/components/reports/spreadsheets/custom-spreadsheet.ts
index 5251bafc1a..149c567857 100644
--- a/packages/desktop-client/src/components/reports/spreadsheets/custom-spreadsheet.ts
+++ b/packages/desktop-client/src/components/reports/spreadsheets/custom-spreadsheet.ts
@@ -13,10 +13,7 @@ import {
type RuleConditionEntity,
type CategoryGroupEntity,
} from 'loot-core/src/types/models';
-import {
- type DataEntity,
- type GroupedEntity,
-} from 'loot-core/src/types/models/reports';
+import { type DataEntity } from 'loot-core/src/types/models/reports';
import { type LocalPrefs } from 'loot-core/types/prefs';
import {
@@ -44,7 +41,7 @@ export type createCustomSpreadsheetProps = {
showHiddenCategories: boolean;
showUncategorized: boolean;
groupBy?: string;
- balanceTypeOp?: keyof DataEntity;
+ balanceTypeOp?: 'totalAssets' | 'totalDebts' | 'totalTotals';
payees?: PayeeEntity[];
accounts?: AccountEntity[];
graphType?: string;
@@ -65,7 +62,7 @@ export function createCustomSpreadsheet({
showHiddenCategories,
showUncategorized,
groupBy,
- balanceTypeOp,
+ balanceTypeOp = 'totalDebts',
payees,
accounts,
graphType,
@@ -92,7 +89,7 @@ export function createCustomSpreadsheet({
return async (
spreadsheet: ReturnType,
- setData: (data: GroupedEntity) => void,
+ setData: (data: DataEntity) => void,
) => {
if (groupByList.length === 0) {
return;
diff --git a/packages/desktop-client/src/components/reports/spreadsheets/grouped-spreadsheet.ts b/packages/desktop-client/src/components/reports/spreadsheets/grouped-spreadsheet.ts
index b273ccf07f..9bd7b45d9a 100644
--- a/packages/desktop-client/src/components/reports/spreadsheets/grouped-spreadsheet.ts
+++ b/packages/desktop-client/src/components/reports/spreadsheets/grouped-spreadsheet.ts
@@ -4,7 +4,7 @@ import { type useSpreadsheet } from 'loot-core/src/client/SpreadsheetProvider';
import { send } from 'loot-core/src/platform/client/fetch';
import * as monthUtils from 'loot-core/src/shared/months';
import { integerToAmount } from 'loot-core/src/shared/util';
-import { type DataEntity } from 'loot-core/src/types/models/reports';
+import { type GroupedEntity } from 'loot-core/src/types/models/reports';
import { categoryLists, ReportOptions } from '../ReportOptions';
@@ -41,7 +41,7 @@ export function createGroupedSpreadsheet({
return async (
spreadsheet: ReturnType,
- setData: (data: DataEntity[]) => void,
+ setData: (data: GroupedEntity[]) => void,
) => {
if (categoryList.length === 0) {
return;
@@ -100,7 +100,7 @@ export function createGroupedSpreadsheet({
endDate,
);
- const groupedData: DataEntity[] = categoryGroup.map(
+ const groupedData: GroupedEntity[] = categoryGroup.map(
group => {
let totalAssets = 0;
let totalDebts = 0;
diff --git a/packages/loot-core/src/types/models/reports.d.ts b/packages/loot-core/src/types/models/reports.d.ts
index f1c01d6ab0..563de0b1f4 100644
--- a/packages/loot-core/src/types/models/reports.d.ts
+++ b/packages/loot-core/src/types/models/reports.d.ts
@@ -57,10 +57,10 @@ export interface SpendingEntity {
totalTotals: number;
}
-export interface GroupedEntity {
- data?: DataEntity[];
- intervalData: DataEntity[];
- groupedData?: DataEntity[] | null;
+export interface DataEntity {
+ data?: GroupedEntity[];
+ intervalData: IntervalEntity[];
+ groupedData?: GroupedEntity[] | null;
legend?: LegendEntity[];
startDate?: string;
endDate?: string;
@@ -75,33 +75,25 @@ type LegendEntity = {
color: string;
};
-export type ItemEntity = {
- id: string;
- name: string;
- intervalData: IntervalData[];
- totalAssets: number;
- totalDebts: number;
- totalTotals: number;
-};
-
-export type IntervalData = {
- date: string;
- dateLookup: string;
+export type IntervalEntity = {
+ date?: string;
+ dateStart?: string;
+ change?: number;
+ dateLookup?: string;
totalAssets: number;
totalDebts: number;
totalTotals: number;
};
-export interface DataEntity {
+export interface GroupedEntity {
id: string;
name: string;
date?: string;
- dateStart?: string;
- intervalData: IntervalData[];
- categories?: ItemEntity[];
+ intervalData: IntervalEntity[];
totalAssets: number;
totalDebts: number;
totalTotals: number;
+ categories?: GroupedEntity[];
}
export type Interval = {
diff --git a/upcoming-release-notes/2726.md b/upcoming-release-notes/2726.md
new file mode 100644
index 0000000000..b6fffc3da2
--- /dev/null
+++ b/upcoming-release-notes/2726.md
@@ -0,0 +1,6 @@
+---
+category: Maintenance
+authors: [carkom]
+---
+
+Making files in custom reports to comply with TS strict - stage #1.
|