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.