From f61709e17cbb2cd6cd925d5ef82b91661f80cd58 Mon Sep 17 00:00:00 2001 From: carkom Date: Wed, 21 Feb 2024 23:19:16 +0000 Subject: [PATCH 01/36] Button changes and time filters --- .../src/components/reports/Header.jsx | 10 ++- .../src/components/reports/Overview.jsx | 9 +-- .../src/components/reports/ReportSidebar.jsx | 7 +- .../reports/reports/CustomReportCard.jsx | 77 +++++-------------- .../reports/reports/CustomReportListCards.tsx | 16 +++- 5 files changed, 46 insertions(+), 73 deletions(-) diff --git a/packages/desktop-client/src/components/reports/Header.jsx b/packages/desktop-client/src/components/reports/Header.jsx index cb4d8d54a66..6fb0ead91bf 100644 --- a/packages/desktop-client/src/components/reports/Header.jsx +++ b/packages/desktop-client/src/components/reports/Header.jsx @@ -50,9 +50,13 @@ function boundedRange(earliest, start, end) { return [start, end]; } -export function getLatestRange(offset) { - const end = monthUtils.currentMonth(); - const start = monthUtils.subMonths(end, offset); +export function getLatestRange(offset, addNumber) { + const currMonth = monthUtils.currentMonth(); + const start = monthUtils.subMonths(currMonth, offset); + const end = monthUtils.addMonths( + start, + addNumber === null ? offset : addNumber, + ); return [start, end]; } diff --git a/packages/desktop-client/src/components/reports/Overview.jsx b/packages/desktop-client/src/components/reports/Overview.jsx index ce0c49b4499..176465f3e98 100644 --- a/packages/desktop-client/src/components/reports/Overview.jsx +++ b/packages/desktop-client/src/components/reports/Overview.jsx @@ -19,8 +19,6 @@ export function Overview() { const customReportsFeatureFlag = useFeatureFlag('customReports'); - const featureCount = - 3 - (sankeyFeatureFlag ? 1 : 0) - (customReportsFeatureFlag ? 1 : 0); const accounts = useAccounts(); return ( {sankeyFeatureFlag && } - {customReportsFeatureFlag && } - {featureCount !== 3 && - [...Array(featureCount)].map((e, i) => ( - - ))} {customReportsFeatureFlag && ( <> @@ -58,9 +51,11 @@ export function Overview() { height: 1, backgroundColor: theme.pillBorderDark, marginTop: 10, + marginBottom: 10, flexShrink: 0, }} /> + )} diff --git a/packages/desktop-client/src/components/reports/ReportSidebar.jsx b/packages/desktop-client/src/components/reports/ReportSidebar.jsx index 46981a2c085..0cfb4083c53 100644 --- a/packages/desktop-client/src/components/reports/ReportSidebar.jsx +++ b/packages/desktop-client/src/components/reports/ReportSidebar.jsx @@ -74,7 +74,12 @@ export function ReportSidebar({ ); break; default: - onChangeDates(...getLatestRange(ReportOptions.dateRangeMap.get(cond))); + onChangeDates( + ...getLatestRange( + ReportOptions.dateRangeMap.get(cond), + cond === 'Last month' ? 0 : null, + ), + ); } }; diff --git a/packages/desktop-client/src/components/reports/reports/CustomReportCard.jsx b/packages/desktop-client/src/components/reports/reports/CustomReportCard.jsx index 09f73d3ead9..c22f34ef990 100644 --- a/packages/desktop-client/src/components/reports/reports/CustomReportCard.jsx +++ b/packages/desktop-client/src/components/reports/reports/CustomReportCard.jsx @@ -1,67 +1,28 @@ -import React, { useMemo } from 'react'; +import React from 'react'; -import * as monthUtils from 'loot-core/src/shared/months'; - -import { useCategories } from '../../../hooks/useCategories'; import { styles } from '../../../style'; import { Block } from '../../common/Block'; +import { ButtonLink } from '../../common/ButtonLink'; import { View } from '../../common/View'; -import { DateRange } from '../DateRange'; -import { BarGraph } from '../graphs/BarGraph'; -import { LoadingIndicator } from '../LoadingIndicator'; -import { ReportCard } from '../ReportCard'; -import { createCustomSpreadsheet } from '../spreadsheets/custom-spreadsheet'; -import { useReport } from '../useReport'; - -export function CustomReportCard(reports) { - const categories = useCategories(); - - const endDate = monthUtils.currentMonth(); - const startDate = monthUtils.subMonths(endDate, 3); - const groupBy = 'Category'; - - const getGraphData = useMemo(() => { - return createCustomSpreadsheet({ - startDate, - endDate, - groupBy, - balanceTypeOp: 'totalDebts', - categories, - showEmpty: false, - showOffBudget: false, - showHiddenCategories: false, - showUncategorized: false, - }); - }, [startDate, endDate, categories]); - const data = useReport('default', getGraphData); +export function CustomReportCard() { return ( - - - - - - Custom Report - - - + + + + + Create new custom report + - - - {data ? ( - - ) : ( - - )} - + + ); } diff --git a/packages/desktop-client/src/components/reports/reports/CustomReportListCards.tsx b/packages/desktop-client/src/components/reports/reports/CustomReportListCards.tsx index 40d7742a73c..3fbc5450380 100644 --- a/packages/desktop-client/src/components/reports/reports/CustomReportListCards.tsx +++ b/packages/desktop-client/src/components/reports/reports/CustomReportListCards.tsx @@ -4,10 +4,12 @@ import { send } from 'loot-core/src/platform/client/fetch'; import { type CustomReportEntity } from 'loot-core/types/models/reports'; import { styles } from '../../../style'; +import { theme } from '../../../style/theme'; import { Block } from '../../common/Block'; import { Menu } from '../../common/Menu'; import { MenuButton } from '../../common/MenuButton'; import { MenuTooltip } from '../../common/MenuTooltip'; +import { Text } from '../../common/Text'; import { View } from '../../common/View'; import { ChooseGraph } from '../ChooseGraph'; import { DateRange } from '../DateRange'; @@ -138,10 +140,16 @@ export function CustomReportListCards({ > {report.name} - + {report.isDateStatic ? ( + + ) : ( + + {report.dateRange} + + )} From 806590971d3bc173ca852a956aab00adc87bb31a Mon Sep 17 00:00:00 2001 From: carkom Date: Thu, 22 Feb 2024 00:38:21 +0000 Subject: [PATCH 02/36] rename on dashboard --- .../src/components/reports/SaveReport.tsx | 8 ++- .../src/components/reports/SaveReportName.tsx | 17 ++++- .../reports/reports/CustomReportListCards.tsx | 62 ++++++++++++++++++- 3 files changed, 80 insertions(+), 7 deletions(-) diff --git a/packages/desktop-client/src/components/reports/SaveReport.tsx b/packages/desktop-client/src/components/reports/SaveReport.tsx index 4200d781fcf..ed93ea60378 100644 --- a/packages/desktop-client/src/components/reports/SaveReport.tsx +++ b/packages/desktop-client/src/components/reports/SaveReport.tsx @@ -39,7 +39,11 @@ export function SaveReport({ const [name, setName] = useState(report.name ?? ''); const inputRef = createRef(); - const onAddUpdate = async (menuChoice: string) => { + const onAddUpdate = async ({ menuChoice }: { menuChoice?: string }) => { + if (!menuChoice) { + return null; + } + if (menuChoice === 'save-report') { const newSavedReport = { ...report, @@ -103,7 +107,7 @@ export function SaveReport({ case 'update-report': setErr(''); setMenuOpen(false); - onAddUpdate(item); + onAddUpdate({ menuChoice: item }); break; case 'save-report': setErr(''); diff --git a/packages/desktop-client/src/components/reports/SaveReportName.tsx b/packages/desktop-client/src/components/reports/SaveReportName.tsx index c6ef39ed67a..930e7c2f092 100644 --- a/packages/desktop-client/src/components/reports/SaveReportName.tsx +++ b/packages/desktop-client/src/components/reports/SaveReportName.tsx @@ -1,5 +1,7 @@ import React, { type RefObject, useEffect } from 'react'; +import { type CustomReportEntity } from 'loot-core/types/models/reports'; + import { theme } from '../../style'; import { Button } from '../common/Button'; import { Input } from '../common/Input'; @@ -14,8 +16,15 @@ type SaveReportNameProps = { name: string; setName: (name: string) => void; inputRef: RefObject; - onAddUpdate: (menuItem: string) => void; + onAddUpdate: ({ + menuChoice, + reportData, + }: { + menuChoice?: string; + reportData?: CustomReportEntity; + }) => void; err: string; + report?: CustomReportEntity; }; export function SaveReportName({ @@ -26,6 +35,7 @@ export function SaveReportName({ inputRef, onAddUpdate, err, + report, }: SaveReportNameProps) { useEffect(() => { if (inputRef.current) { @@ -61,7 +71,10 @@ export function SaveReportName({ style={{ marginTop: 18 }} onClick={e => { e.preventDefault(); - onAddUpdate(menuItem); + onAddUpdate({ + menuChoice: menuItem ?? undefined, + reportData: report ?? undefined, + }); }} > {menuItem === 'save-report' ? 'Add' : 'Update'} diff --git a/packages/desktop-client/src/components/reports/reports/CustomReportListCards.tsx b/packages/desktop-client/src/components/reports/reports/CustomReportListCards.tsx index 3fbc5450380..268543ca9f3 100644 --- a/packages/desktop-client/src/components/reports/reports/CustomReportListCards.tsx +++ b/packages/desktop-client/src/components/reports/reports/CustomReportListCards.tsx @@ -1,6 +1,6 @@ -import React, { useMemo, useState } from 'react'; +import React, { createRef, useMemo, useState } from 'react'; -import { send } from 'loot-core/src/platform/client/fetch'; +import { send, sendCatch } from 'loot-core/platform/client/fetch/index'; import { type CustomReportEntity } from 'loot-core/types/models/reports'; import { styles } from '../../../style'; @@ -15,6 +15,7 @@ import { ChooseGraph } from '../ChooseGraph'; import { DateRange } from '../DateRange'; import { LoadingIndicator } from '../LoadingIndicator'; import { ReportCard } from '../ReportCard'; +import { SaveReportName } from '../SaveReportName'; type CardMenuProps = { onClose: () => void; @@ -33,7 +34,6 @@ function CardMenu({ onClose, onMenuSelect, reportId }: CardMenuProps) { { name: 'rename', text: 'Rename report', - disabled: true, }, { name: 'delete', @@ -63,20 +63,57 @@ export function CustomReportListCards({ }) { const result: { [key: string]: boolean }[] = index(reports); const [reportMenu, setReportMenu] = useState(result); + const [nameMenuOpen, setNameMenuOpen] = useState(result); + const [err, setErr] = useState(''); + const [name, setName] = useState(''); + const inputRef = createRef(); const [isCardHovered, setIsCardHovered] = useState(''); + const onAddUpdate = async ({ + reportData, + }: { + reportData?: CustomReportEntity; + }) => { + if (!reportData) { + return null; + } + + const updatedReport = { + ...reportData, + name, + }; + + const response = await sendCatch('report/update', updatedReport); + + if (response.error) { + setErr(response.error.message); + onNameMenuOpen(reportData.id === undefined ? '' : reportData.id, true); + return; + } + + onNameMenuOpen(reportData.id === undefined ? '' : reportData.id, false); + }; + const onMenuSelect = async (item: string, reportId: string) => { if (item === 'delete') { onMenuOpen(reportId, false); await send('report/delete', reportId); } + if (item === 'rename') { + onMenuOpen(reportId, false); + onNameMenuOpen(reportId, true); + } }; const onMenuOpen = (item: string, state: boolean) => { setReportMenu({ ...reportMenu, [item]: state }); }; + const onNameMenuOpen = (item: string, state: boolean) => { + setNameMenuOpen({ ...nameMenuOpen, [item]: state }); + }; + const chunkSize = 3; const groups = useMemo(() => { @@ -202,6 +239,25 @@ export function CustomReportListCards({ reportId={report.id} /> )} + {report.id === undefined + ? null + : nameMenuOpen[report.id as keyof typeof nameMenuOpen] && ( + + onNameMenuOpen( + report.id === undefined ? '' : report.id, + false, + ) + } + menuItem="rename" + name={name} + setName={setName} + inputRef={inputRef} + onAddUpdate={onAddUpdate} + err={err} + report={report} + /> + )} ))} From 4d4062e9bf0675243d05897163136ae6646670b0 Mon Sep 17 00:00:00 2001 From: carkom Date: Thu, 22 Feb 2024 00:41:03 +0000 Subject: [PATCH 03/36] notes --- upcoming-release-notes/2386.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 upcoming-release-notes/2386.md diff --git a/upcoming-release-notes/2386.md b/upcoming-release-notes/2386.md new file mode 100644 index 00000000000..745dcf6c91f --- /dev/null +++ b/upcoming-release-notes/2386.md @@ -0,0 +1,6 @@ +--- +category: Enhancements +authors: [carkom] +--- + +Enable dashboard card "rename" menu. Change default custom report card to just show a button. Adjust time filters. From eeea9d05f609c3f918d8068c4f28cb668f62cd48 Mon Sep 17 00:00:00 2001 From: carkom Date: Thu, 22 Feb 2024 00:56:12 +0000 Subject: [PATCH 04/36] fix time filters --- packages/desktop-client/src/components/reports/Header.jsx | 8 +++++++- .../src/components/reports/ReportSidebar.jsx | 4 ++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/desktop-client/src/components/reports/Header.jsx b/packages/desktop-client/src/components/reports/Header.jsx index 6fb0ead91bf..bd4ebe076e9 100644 --- a/packages/desktop-client/src/components/reports/Header.jsx +++ b/packages/desktop-client/src/components/reports/Header.jsx @@ -50,7 +50,13 @@ function boundedRange(earliest, start, end) { return [start, end]; } -export function getLatestRange(offset, addNumber) { +function getLatestRange(offset) { + const end = monthUtils.currentMonth(); + const start = monthUtils.subMonths(end, offset); + return [start, end]; +} + +export function getSpecificRange(offset, addNumber) { const currMonth = monthUtils.currentMonth(); const start = monthUtils.subMonths(currMonth, offset); const end = monthUtils.addMonths( diff --git a/packages/desktop-client/src/components/reports/ReportSidebar.jsx b/packages/desktop-client/src/components/reports/ReportSidebar.jsx index 0cfb4083c53..cb8405da9fd 100644 --- a/packages/desktop-client/src/components/reports/ReportSidebar.jsx +++ b/packages/desktop-client/src/components/reports/ReportSidebar.jsx @@ -14,9 +14,9 @@ import { CategorySelector } from './CategorySelector'; import { validateStart, validateEnd, - getLatestRange, getFullRange, validateRange, + getSpecificRange, } from './Header'; import { ModeButton } from './ModeButton'; import { ReportOptions } from './ReportOptions'; @@ -75,7 +75,7 @@ export function ReportSidebar({ break; default: onChangeDates( - ...getLatestRange( + ...getSpecificRange( ReportOptions.dateRangeMap.get(cond), cond === 'Last month' ? 0 : null, ), From 28599fc35eadc216611fe75f3f79a5d2445619b3 Mon Sep 17 00:00:00 2001 From: carkom Date: Thu, 22 Feb 2024 23:31:23 +0000 Subject: [PATCH 05/36] Sort Categories --- .../src/components/reports/ReportOptions.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/desktop-client/src/components/reports/ReportOptions.ts b/packages/desktop-client/src/components/reports/ReportOptions.ts index a79c2059abf..300c434d90a 100644 --- a/packages/desktop-client/src/components/reports/ReportOptions.ts +++ b/packages/desktop-client/src/components/reports/ReportOptions.ts @@ -145,7 +145,15 @@ export const categoryLists = (categories: { grouped: CategoryGroupEntity[]; }) => { const categoryList = [ - ...categories.list, + ...categories.list.sort((a, b) => { + const catGroupA = categories.grouped.find(f => f.id === a.cat_group); + const catGroupB = categories.grouped.find(f => f.id === b.cat_group); + return a.sort_order && b.sort_order && catGroupA && catGroupB + ? 2 * (catGroupA.sort_order ?? 0) + + a.sort_order - + (2 * (catGroupB.sort_order ?? 0) + b.sort_order) + : 0; + }), uncategorizedCategory, offBudgetCategory, transferCategory, From 76b77e1e104cc435a0738f46520051ecd49da128 Mon Sep 17 00:00:00 2001 From: carkom Date: Fri, 23 Feb 2024 11:15:14 +0000 Subject: [PATCH 06/36] Page title --- .../src/components/reports/reports/CustomReport.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/desktop-client/src/components/reports/reports/CustomReport.jsx b/packages/desktop-client/src/components/reports/reports/CustomReport.jsx index 32b8b7fc278..f420b46b003 100644 --- a/packages/desktop-client/src/components/reports/reports/CustomReport.jsx +++ b/packages/desktop-client/src/components/reports/reports/CustomReport.jsx @@ -314,7 +314,7 @@ export function CustomReport() { return ( -
+
Date: Sat, 24 Feb 2024 08:46:25 +0000 Subject: [PATCH 07/36] category sort order --- .../desktop-client/src/components/reports/ReportOptions.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/desktop-client/src/components/reports/ReportOptions.ts b/packages/desktop-client/src/components/reports/ReportOptions.ts index 300c434d90a..21a51124493 100644 --- a/packages/desktop-client/src/components/reports/ReportOptions.ts +++ b/packages/desktop-client/src/components/reports/ReportOptions.ts @@ -149,9 +149,9 @@ export const categoryLists = (categories: { const catGroupA = categories.grouped.find(f => f.id === a.cat_group); const catGroupB = categories.grouped.find(f => f.id === b.cat_group); return a.sort_order && b.sort_order && catGroupA && catGroupB - ? 2 * (catGroupA.sort_order ?? 0) + - a.sort_order - - (2 * (catGroupB.sort_order ?? 0) + b.sort_order) + ? Number(catGroupA.is_income) - Number(catGroupB.is_income) || + (catGroupA.sort_order ?? 0) - (catGroupB.sort_order ?? 0) || + a.sort_order - b.sort_order : 0; }), uncategorizedCategory, From f8cbfb0c4ba7c6449db72f442db0e032d0af2a13 Mon Sep 17 00:00:00 2001 From: carkom Date: Wed, 28 Feb 2024 09:32:26 +0000 Subject: [PATCH 08/36] move button --- .../src/components/reports/Overview.jsx | 31 ++++++++++--------- .../reports/reports/CashFlowCard.jsx | 2 +- .../reports/reports/CustomReportCard.jsx | 28 ----------------- .../reports/reports/NetWorthCard.jsx | 2 +- 4 files changed, 18 insertions(+), 45 deletions(-) delete mode 100644 packages/desktop-client/src/components/reports/reports/CustomReportCard.jsx diff --git a/packages/desktop-client/src/components/reports/Overview.jsx b/packages/desktop-client/src/components/reports/Overview.jsx index 176465f3e98..c95d062a3bc 100644 --- a/packages/desktop-client/src/components/reports/Overview.jsx +++ b/packages/desktop-client/src/components/reports/Overview.jsx @@ -4,11 +4,12 @@ import { useReports } from 'loot-core/src/client/data-hooks/reports'; import { useAccounts } from '../../hooks/useAccounts'; import { useFeatureFlag } from '../../hooks/useFeatureFlag'; -import { theme, styles } from '../../style'; +import { styles } from '../../style'; +import { ButtonLink } from '../common/ButtonLink'; +import { Text } from '../common/Text'; import { View } from '../common/View'; import { CashFlowCard } from './reports/CashFlowCard'; -import { CustomReportCard } from './reports/CustomReportCard'; import { CustomReportListCards } from './reports/CustomReportListCards'; import { NetWorthCard } from './reports/NetWorthCard'; import { SankeyCard } from './reports/SankeyCard'; @@ -27,6 +28,18 @@ export function Overview() { ...{ paddingLeft: 40, paddingRight: 40, minWidth: 700 }, }} > + + + Create new custom report + + } {customReportsFeatureFlag && ( - <> - - - - + )} ); diff --git a/packages/desktop-client/src/components/reports/reports/CashFlowCard.jsx b/packages/desktop-client/src/components/reports/reports/CashFlowCard.jsx index 07759a4ece3..b186e31565d 100644 --- a/packages/desktop-client/src/components/reports/reports/CashFlowCard.jsx +++ b/packages/desktop-client/src/components/reports/reports/CashFlowCard.jsx @@ -58,7 +58,7 @@ export function CashFlowCard() { const income = graphData?.income || 0; return ( - + - - - - Create new custom report - - - - - ); -} diff --git a/packages/desktop-client/src/components/reports/reports/NetWorthCard.jsx b/packages/desktop-client/src/components/reports/reports/NetWorthCard.jsx index 3b2963bd4a4..128a6dc045e 100644 --- a/packages/desktop-client/src/components/reports/reports/NetWorthCard.jsx +++ b/packages/desktop-client/src/components/reports/reports/NetWorthCard.jsx @@ -29,7 +29,7 @@ export function NetWorthCard({ accounts }) { const data = useReport('net_worth', params); return ( - + Date: Wed, 28 Feb 2024 09:36:38 +0000 Subject: [PATCH 09/36] featureflag --- .../src/components/reports/Overview.jsx | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/packages/desktop-client/src/components/reports/Overview.jsx b/packages/desktop-client/src/components/reports/Overview.jsx index c95d062a3bc..edd8b359104 100644 --- a/packages/desktop-client/src/components/reports/Overview.jsx +++ b/packages/desktop-client/src/components/reports/Overview.jsx @@ -28,18 +28,20 @@ export function Overview() { ...{ paddingLeft: 40, paddingRight: 40, minWidth: 700 }, }} > - - - Create new custom report - - + {customReportsFeatureFlag && ( + + + Create new custom report + + + )} Date: Wed, 28 Feb 2024 10:12:47 +0000 Subject: [PATCH 10/36] Highlight report name --- .../components/reports/reports/CustomReport.jsx | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/packages/desktop-client/src/components/reports/reports/CustomReport.jsx b/packages/desktop-client/src/components/reports/reports/CustomReport.jsx index f420b46b003..3392a27eaeb 100644 --- a/packages/desktop-client/src/components/reports/reports/CustomReport.jsx +++ b/packages/desktop-client/src/components/reports/reports/CustomReport.jsx @@ -314,7 +314,22 @@ export function CustomReport() { return ( -
+ +
+ + {report.name ?? 'Unsaved report'} + + Date: Wed, 28 Feb 2024 21:11:45 +0000 Subject: [PATCH 11/36] sankey fix --- .../desktop-client/src/components/reports/Overview.jsx | 7 ------- .../src/components/reports/reports/CashFlowCard.jsx | 2 +- .../src/components/reports/reports/CustomReport.jsx | 6 +++--- .../src/components/reports/reports/NetWorthCard.jsx | 2 +- 4 files changed, 5 insertions(+), 12 deletions(-) diff --git a/packages/desktop-client/src/components/reports/Overview.jsx b/packages/desktop-client/src/components/reports/Overview.jsx index edd8b359104..856aa7252db 100644 --- a/packages/desktop-client/src/components/reports/Overview.jsx +++ b/packages/desktop-client/src/components/reports/Overview.jsx @@ -50,13 +50,6 @@ export function Overview() { > - - {sankeyFeatureFlag && } {customReportsFeatureFlag && ( diff --git a/packages/desktop-client/src/components/reports/reports/CashFlowCard.jsx b/packages/desktop-client/src/components/reports/reports/CashFlowCard.jsx index b186e31565d..07759a4ece3 100644 --- a/packages/desktop-client/src/components/reports/reports/CashFlowCard.jsx +++ b/packages/desktop-client/src/components/reports/reports/CashFlowCard.jsx @@ -58,7 +58,7 @@ export function CashFlowCard() { const income = graphData?.income || 0; return ( - + -
- + {report.name ?? 'Unsaved report'} diff --git a/packages/desktop-client/src/components/reports/reports/NetWorthCard.jsx b/packages/desktop-client/src/components/reports/reports/NetWorthCard.jsx index 128a6dc045e..eda93413cc7 100644 --- a/packages/desktop-client/src/components/reports/reports/NetWorthCard.jsx +++ b/packages/desktop-client/src/components/reports/reports/NetWorthCard.jsx @@ -29,7 +29,7 @@ export function NetWorthCard({ accounts }) { const data = useReport('net_worth', params); return ( - + Date: Wed, 28 Feb 2024 21:47:08 +0000 Subject: [PATCH 12/36] VRT --- ...and-cash-flow-reports-1-chromium-linux.png | Bin 59435 -> 58406 bytes ...and-cash-flow-reports-2-chromium-linux.png | Bin 58783 -> 57777 bytes ...ph-and-checks-visuals-2-chromium-linux.png | Bin 83838 -> 83376 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/desktop-client/e2e/reports.test.js-snapshots/Reports-loads-net-worth-and-cash-flow-reports-1-chromium-linux.png b/packages/desktop-client/e2e/reports.test.js-snapshots/Reports-loads-net-worth-and-cash-flow-reports-1-chromium-linux.png index 564f198a32b11a5f6c7b7a5b5ffd8a46d592a72c..626f79855e42410e7fff6eb4c4e26ebb7dd30b05 100644 GIT binary patch literal 58406 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

!2JPW`#rs|xB2gx0W-~*I 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 Kx#(w`$NvLhrn+MQ literal 59435 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

  • NSXxLL;k6_mZjR zTeQAOepnj&^62a@L+ot7`` z^bq@Jic{dDU!^AAseuTpS#-W3jbN6fx6!DvG@N_8u;H;WbC`3eY?W~gi1YaPAL5vg zv2JB2qTGtE61Ctl&}|mwi~m-YV;%=4{|4E zLSuHw>zhT0una_5>(6H+Y1~&Z@%Tk%7V`r*t*;CgujSZ_?@h|8$6ZYy_8-e*f(}*Qb$%{?e2rW^?(;5~ z^8t37tGWJv4UgiiZ$9y!3!Ygg+A&_YMDiz125G8Cr^w=s_-l2Yb`WJ|q@}&!iGI7) z1uo?+8rSD4J9);K9@OL?;V{0^4>FvY?}p};Jm;}eFUK+NcJq1Kuq=6TP<_3r|7Qe) z+KAY5a7NLi73Hlgo$Hra!Li0Sbqf9((8$!qV@S2?qZK2<1T$|qJJH?z%o~}Hy0~$F zquO}**64Xj=Y~rFf-xaeAByt8$n|8X#or*HT>qfx=rEMcT|A2Ht*iUUx($GqP)503 zbS4=0ARM=YIoy;Fio0Y?33Yu{0-cZj(`r8 ztBLJw&F^AkWwXXg_HTR=rzHD-?yr-H+L6h?rvxFXXZa(20#FwJ1}%wB8N#{ z7QHuFT7ym?7Y8q4dX^ZdK^Rp=*(v>H5f$KxD2N zx3pt|GwX8tOh`&1NCE~152Co8ljFe7p>~T%4rlL`3Mkfgxz@{m%r;vpfs#G0Y-Qy- zR9r3<;-hd8c_=OJq=-ngzzOH{w373hXdt(%cs2k)+lPb_QvA^e)uLJX;g^)ym!sR$ zc67ptgJe@>P=HIGQ}tB1xM2!YYGG{9_($zf;wv#Hc6bt}tYn4|t_#~?K!E1*Y%XCI z*#Q2gOYW**XdPZMSOiEgImSr&lX<#2WV5YFn!TZ}Zr)DTqWiBCs}kVaSFtA-hV0BM zDox}oF-}UDNj#G@mlPpE^mm>)xOkT&sIT2 z>53+2Kgf8V=sk0in{`0_l87E+HeiBX{)Ym?%8pNYVt1pZ9QBg~n1k=Kak+2VuXh#* znr`gZ;v_foW<88sTFTDM)vscQugxnGP@>q!tS+-VrqmHoALrT+9Q`_5=TP!x-Uhem3 zF23sLv#|cC&@|O_zp5?3HWj1l6fstO7q?5EH`_|^j3y>3geT>t_R8pzzZWtdlPkWw z7hHdpQBYs!X%HuBmS!)>-!q3($ums<7xbc`L(^2K>|x&c+bA3w5G?g5OB;~o&&R_N zOCg0i+6&&Ol(P;8<4kP!J{k;9~%)~*Do zI4^^`O&uTwO>V^>ZfeP|+@yT5&DN!k2AXv(wIg&3_L}6hvIy^3vDK49D>gQ_Z+D%M zy_=kBIQS)YuYDl9-9nC5-eg~UGe$}n`b%+$L6xu7_$pL7MCFN}i9cMWg=vY@VHC!R z8KvD0jn4#yuU1Q6-_qyI%WxQ9oL`Z%;#uFR>V8Sz>*K<~3KuB#Wz1kK`^#l{LN!Fo}NLqKgP z-!!JXU8_ef`&cLK4*A|T2keIGl;Suydde{H zS%0ItcxEvJiUQ0mQLGaX0y$epn=sMcg~U^_0WzinhHAA5+5qj?)K>|ORPHn#whiPV{)qFrT)+MW&5f-xgt zqqlSNL(-h^{W^y8@GVyFf;O7;;Mp)ERCC_{Wp^_Wt~CKRGA*`wXU3nb0yk7j#UCO1lM& z_7Tk05T9;2Ko&l;u#y113#AE_@t*!0Lgyx}(qZJBU8=u39i!Kf!klwq24#|dJ8=Ga zJwSGh%lZY3E|pu+3utRP%S`;!uSvgiNw28Tq0Xu;e_V=+=ID9w@S#dZ2wXCRcbAl7 zTqa+oiImkQ!Hb7}rGIVmG$Doh22p^Q>HnbT7jex(KTgafj+An>erSeSaIXipJNBNc ze5|6xP6V52!_I;Pnp0LWvQ_J&bY-H>8~s`m-5a&1)!FxC$^R?sPU>)#9Up_rcof`@=r4gMkITSq2T?iT+A31J>d`J+#8f1z z7`Ag%S*fKxP-Xwl);$7(=1@RncInvN)QNrdxup`4D+mEbIblWTZ%Lp|W!Q2Qm#kT= zpiQ_WWkqcPNBfxT7UHv<0uwZe5n4e?%NlPXmufvibvL+?L~UaPv-xmz`f?t1mAr)pvA`D)asj?Tu>T5@?60t=^JMiVj3aW9oNv^W&MW@%K zw5y8o;V3!cPywTH7;GCpw<^YJi+7swz|9gR0?biw-UO_o?rqp=^fx#W6&cg@xs?Rd z0AbkjT8-haJn)ACdHN7Qr+lf(S1%k}%+7b4*`)`^yQ2@r3ypl+=%w(O!J{(U!=%H& zb7nF!M;CFhGK{iOl{36B$<>G%AO)xk6CATUp{S}snp*VVft0~G(|yVpXmGdml+T2Y zqx>6t90lTl3Slt#O+i_w)zymK6#(7W+i_MXtGuZVv3`?vv$qU`OyFctv_?Rs!O^qE zBwj#5rS|fh{*(-utxi8iA~-&s0GNq9^4L2y12DxjTXS`EoVq7rDjMBg4m!VdVO-@U zh;d2jIlvj*i#EQtvI$sODHl|kz@HF|%;b;1lPx*J_WI`-P`bKu8z|rwoLU{Z%-!{ zUx6jq;aegBxp_WDz--d4h{t~wMR=y&7BIUlr$v9iNC8U3T;E#NEX*!-=P6`$@1#gS z0D^$$>H!H}Ky4#SVHO!H0{!h)7MD(aRnsPQewnDt>eVcW7Eqrwi31Pe!_7Jw9r$lJ zh5Au=aR5gWQmgfmyP`MgYa~zMd5uc67W;c|fC&{~Kbc2O zw?m}IM2xNK;s6@++srYu0on&snG!XU!n|gIOG3A1bgV#S0)}XY!`X?-Q7wQN=AbmV zFsKB8vxo!jC!xe~5<)*eT%r?d4F6JnuNu(hflGG$AI(5FALaX;y|}@Z{f3a)pqdTX zu@M?uI_61(5|h4=*+fo12N@vE8Gb0sDE+ApCSwV}+d$fQr~ycinu;s)V6-b7yUU%) zlrW?>GZi8O5Th1|Zjj=F0Ru>aK-KPM8V}$ebFY)8p@OrZXC4xEV##8K;p zSz6T+SQB^Cm4vH#qla6Q7JrTQOgKRMO4OR-|NI*q0NuT=1rte6;7m_hvv*;#ox|us zuvTZgyxe(E!Ub)%op^-7{I)|2c#{?X3l_M4Lg;@j*Zf_s|2Ng1|E8}mN)EP$J_6 zpsbTz_;AGj$zPN&2BfkZQrvD~vcBXYo(U#i`j&2`ILs=;=J25Y_%3)r|22lZ& zi9OafI|VU9mdo#cYJY$9tsxwgbJWS<{`L8=mo=0j=thwlb-g{8fn;AE!|#@<;+uqJ z@oO-_xpq#tQ2Lk`A=e*(>6ELx$$q|z8h)NTpHg7>7XXSITNS7o%%mvT-olUjdGJ-w zJU^;b;sOrwjh_w5{!VtU9;j)4zN620zAV2Tmt06vbR!kitVD10b5fATVQwuupI9U<$Jr0%VxwKUj3wU$;@C$(vVkjPJ87iaOyz?IooZIT+PB!vh)3 z{LrezLl+h%D?Bun2tNyS21P2z@`ZSJT50WFQtSI@(c-D(%Gl(UkY}nNrSH#GVXDOe z+pk-&$d7-Y=M3b+xVS98GFyZ4?TG+#H%(x~wVBj$lU*}CM%9K2Be~2Y=8l2jykHAu z3M5rQTbQ+*=={<4V^td6Z|QRL8bS~VYn0lp8;_8Z7X(~#9Dp}@7LmB(1VZZH{I(WJ7m8?2eYSdi#Dcv~&{`7!kv0Vg9; zLU8D*Y@KdA^Uw9OC+{1u=90u7JAdv~jWf$6T`ENRfTD0}@ zXoY>T+S@9tZoH9yC$kmiWtGYCPs&GfbQ&sg@k}_U14X!^V;218o7AE~Qu`&$`|JCG zVplUSPSo8Jm!<=Uf_b<@CfZEYdQpjWa?H!7_^-?6_EI`#P#r#ZIJC;L6fyw;CzJ%8O~sry9P`a9Da6d zb%Ub_YEPN42o%H*Qm9%qlgVc`+^d}o`Z>79rfXtw2m1&&0JszUZ{++2GpfwOteCW2 zong9qAyUqzUQVUorQs6rPqe*x^JX?g5BJDw`EQb*jB)lKrV8qUMmzzFq0_BQ^8Q@@ z%0`e+nKRq2Y{*PFW6d2aLABnKDj4Lpdj(;dWegpvh2Ac&Vt&Mtu(-+f1OYP=XZ}_U zA9hY-`DGjrD6#y&eCxkz9QbcaB?q1`8~Yz@3;%QV|Fq-de;(ccJUTF?{!fiU|4qY& b&Ohle$hc#9Q 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όl{80CT+ol-c3me4a%lXN!#MSJCb9%ip2YmqknCf%bp@Kesy3_I zsEV%wKMKA4?71%=^~yCBva$cssFW8gXnCT5d_-(6nW_{luJ4abQc{35oV3Twf1=%Qj3C+vft` zXacxPM7173?)<7n2G?@A9NF-6C>z6sQ&^`Gv7(=wE2i1c!C+cqtX=ITSETOim9?$fykuZCwdfajg* zC@m1qgQL(VEZPlp;3f`^1y4-TdD@l^Q!CP>r)bb1osy^m8Gr-O)b3yg5 zGY)-kzr+SeOj==MqBAwdMOS$_T~BSy&7a49sGhqryRr~X(g`T2r0>#n^ED2iUW-KQu~?3mJu3vF@Qnm%)kX**zSw9aX_`k2X<*pB47IR= zP*22bUNE%p2)|p2rCqL8;o#EfjN_RHOmmHh(0p-)B%p;W=ru*n$+dGjAnJ0 zQ)J6y{o%XiuOliDOY?3|q1Za2Tyt+{?mzEl`mfJ6c-HEdhyyTq6yKWg=-Z5y>`ry9 z(Oh+C^r`6mZWaX*sqe5ABrp4hSUa?u7Y?o*7N-lM3NIZuEt)MSI%yZyREz2$HF%j*Yygi zKg>FR=GxzQc?x)cw=L#cXz|k-8IiWxc9Sv@A2;c@qT%qZ_gZln2}j)*1GR2&g;BleGR=fR_X8M z(QZXo&qDMeCjl~)IvF0~BwVGifUD|?k974Ln>;z6s^1{I4Yp7p$l=J#5S@)V8UlnJlLVbIJ}PA&MBDuSeuRANtS}beFgua>1(S>6Dx;p?rRdCo{%FjmrDDb}G93Za>4#JaoAWq>C=^oq}d3 zprQ99Z}fh?_xx3_H|tPP$I|?Xziel0rJp8(UVoz!+JCjBPhif=hVOdPw))}9Os{B+ z(`k*xqKcnQd}}bK$Vj}r=#(JW!`*nj;}o927Vtq_!SX!UE<<_KIdN?wtS*?pQx*bm z3Yt23D%HW|E!12k4Ln<1`-r*TTTRx4Bz+`>pS= zLxJNm`@!loO~bl*8If0?h;?Dp`FJUb3oKLN{#UQBRZv!QODq8lexY*CPK1s5WW~)g zqSEd04j=jnunsJ!+|hxrxjo{KMsdD*gkfv@4#dl~x_wN+=0i z9B+e)37hHfPnU5{#li+bqyfn$zQfZo-=bWuyc<7jxE$T3dq%72ihS%Z+E#2j{?HR? zzXe-_qT-AvYRf9Qei;LV2K`2K!1_A7mX%4>7H|l;vH5=z(Cj=sO>(uuzj`*B9Y+xu1#a_19p zkU>rX$m*2i*FgAgOTQJQ0~kXmZ|G4+-cr2!8v@1l7<8s&Db?!+#E|-ihsyg5@Jp

    -LTisR{=BYeFGC};1I&2f9KxIs_rSlL37Eq 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 Bio*Z^ diff --git a/packages/desktop-client/e2e/reports.test.js-snapshots/Reports-loads-net-worth-graph-and-checks-visuals-2-chromium-linux.png b/packages/desktop-client/e2e/reports.test.js-snapshots/Reports-loads-net-worth-graph-and-checks-visuals-2-chromium-linux.png index ec8a8bef52c5c11c0f0da042a2bb8909b26ffb5f..dcbef321ab0eaa2d7ce789d9b265a365d124fd75 100644 GIT binary patch literal 83376 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 literal 83838 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 From 00e3b5b613cbd59cd1d4b20be2d3a75f0d7a4934 Mon Sep 17 00:00:00 2001 From: carkom Date: Wed, 28 Feb 2024 22:34:06 +0000 Subject: [PATCH 13/36] remove doubled element --- packages/loot-core/src/types/models/reports.d.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/loot-core/src/types/models/reports.d.ts b/packages/loot-core/src/types/models/reports.d.ts index 4d6464573e6..b5cbcad9b64 100644 --- a/packages/loot-core/src/types/models/reports.d.ts +++ b/packages/loot-core/src/types/models/reports.d.ts @@ -81,7 +81,6 @@ export interface CustomReportData { date_range: string; mode: string; group_by: string; - interval: string; balance_type: string; show_empty: number; show_offbudget: number; @@ -92,6 +91,6 @@ export interface CustomReportData { conditions?: RuleConditionEntity[]; conditions_op: string; metadata?: GroupedEntity; - interval?: string; + interval: string; color_scheme?: string; } From bd443ff65f14f79398a0f8eb42fbbf4e330cf1c1 Mon Sep 17 00:00:00 2001 From: carkom Date: Fri, 15 Mar 2024 09:39:21 +0000 Subject: [PATCH 14/36] adjust to match master --- .../src/components/reports/reports/NetWorthCard.jsx | 2 +- upcoming-release-notes/2386.md | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) delete mode 100644 upcoming-release-notes/2386.md diff --git a/packages/desktop-client/src/components/reports/reports/NetWorthCard.jsx b/packages/desktop-client/src/components/reports/reports/NetWorthCard.jsx index eda93413cc7..3b2963bd4a4 100644 --- a/packages/desktop-client/src/components/reports/reports/NetWorthCard.jsx +++ b/packages/desktop-client/src/components/reports/reports/NetWorthCard.jsx @@ -29,7 +29,7 @@ export function NetWorthCard({ accounts }) { const data = useReport('net_worth', params); return ( - + Date: Fri, 15 Mar 2024 09:48:13 +0000 Subject: [PATCH 15/36] add Year --- .../src/components/reports/ReportOptions.ts | 16 +++--- .../src/components/reports/ReportSidebar.jsx | 19 ++----- .../reports/reports/CustomReport.jsx | 50 +++++++++++++++---- .../spreadsheets/custom-spreadsheet.ts | 15 ++++-- .../spreadsheets/grouped-spreadsheet.ts | 7 ++- .../reports/spreadsheets/makeQuery.ts | 11 ++-- .../reports/spreadsheets/recalculate.ts | 7 --- packages/loot-core/src/shared/months.ts | 43 ++++++++++++++++ 8 files changed, 122 insertions(+), 46 deletions(-) diff --git a/packages/desktop-client/src/components/reports/ReportOptions.ts b/packages/desktop-client/src/components/reports/ReportOptions.ts index b62b6c367b3..f2ac3b170b0 100644 --- a/packages/desktop-client/src/components/reports/ReportOptions.ts +++ b/packages/desktop-client/src/components/reports/ReportOptions.ts @@ -45,14 +45,14 @@ const groupByOptions = [ ]; const dateRangeOptions = [ - { description: 'This month', name: 0 }, - { description: 'Last month', name: 1 }, - { description: 'Last 3 months', name: 2 }, - { description: 'Last 6 months', name: 5 }, - { description: 'Last 12 months', name: 11 }, - { description: 'Year to date', name: 'yearToDate' }, - { description: 'Last year', name: 'lastYear' }, - { description: 'All time', name: 'allMonths' }, + { description: 'This month', name: 0, Yearly: false, Monthly: true }, + { description: 'Last month', name: 1, Yearly: false, Monthly: true }, + { description: 'Last 3 months', name: 2, Yearly: false, Monthly: true }, + { description: 'Last 6 months', name: 5, Yearly: false, Monthly: true }, + { description: 'Last 12 months', name: 11, Yearly: false, Monthly: true }, + { description: 'Year to date', name: 'yearToDate', Yearly: true, Monthly: true }, + { description: 'Last year', name: 'lastYear', Yearly: true, Monthly: true }, + { description: 'All time', name: 'allMonths', Yearly: true, Monthly: true}, ]; const intervalOptions = [ diff --git a/packages/desktop-client/src/components/reports/ReportSidebar.jsx b/packages/desktop-client/src/components/reports/ReportSidebar.jsx index 2b42b4af260..b086cb307ff 100644 --- a/packages/desktop-client/src/components/reports/ReportSidebar.jsx +++ b/packages/desktop-client/src/components/reports/ReportSidebar.jsx @@ -215,11 +215,7 @@ export function ReportSidebar({ option.description, option.description, ])} - disabledKeys={ - customReportItems.mode === 'time' - ? ['Monthly', 'Yearly'] - : ['Yearly'] - } + disabledKeys={[]} /> { onSelectRange(e); }} - options={ReportOptions.dateRange.map(option => [ - option.description, - option.description, - ])} - line={dateRangeLine} + options={ReportOptions.dateRange + .filter(f => f[customReportItems.interval]) + .map(option => [option.description, option.description])} + line={customReportItems.interval === 'Monthly' && dateRangeLine} /> ) : ( @@ -385,10 +380,6 @@ export function ReportSidebar({ ) } value={customReportItems.startDate} - defaultLabel={monthUtils.format( - customReportItems.startDate, - 'MMMM, yyyy', - )} options={allMonths.map(({ name, pretty }) => [name, pretty])} /> diff --git a/packages/desktop-client/src/components/reports/reports/CustomReport.jsx b/packages/desktop-client/src/components/reports/reports/CustomReport.jsx index 406c14991f9..6f8cce3523f 100644 --- a/packages/desktop-client/src/components/reports/reports/CustomReport.jsx +++ b/packages/desktop-client/src/components/reports/reports/CustomReport.jsx @@ -83,11 +83,32 @@ export function CustomReport() { const [dataCheck, setDataCheck] = useState(false); const dateRangeLine = ReportOptions.dateRange.length - 3; + const [months, setMonths] = useState( + monthUtils.yearRangeInclusive(startDate, endDate), + ); const [report, setReport] = useState(loadReport); const [savedStatus, setSavedStatus] = useState( location.state ? (location.state.report ? 'saved' : 'new') : 'new', ); - const months = monthUtils.rangeInclusive(startDate, endDate); + + useEffect(() => { + const rangeInc = + interval === 'Monthly' ? 'rangeInclusive' : 'yearRangeInclusive'; + setMonths(monthUtils[rangeInc](startDate, endDate)); + + let start; + let end; + if (interval === 'Monthly') { + start = monthUtils.subMonths(monthUtils.currentMonth(), 5); + end = monthUtils.currentMonth(); + } else { + start = monthUtils.subYears(monthUtils.currentYear(), 3); + end = monthUtils.currentYear(); + } + + setStartDate(start); + setEndDate(end); + }, [interval]); useEffect(() => { if (selectedCategories === undefined && categories.list.length !== 0) { @@ -99,7 +120,10 @@ export function CustomReport() { async function run() { report.conditions.forEach(condition => onApplyFilter(condition)); const trans = await send('get-earliest-transaction'); - const currentMonth = monthUtils.currentMonth(); + const currentMonth = + interval === 'Monthly' + ? monthUtils.currentMonth() + : monthUtils.currentYear(); let earliestMonth = trans ? monthUtils.monthFromDate(d.parseISO(fromDateRepr(trans.date))) : currentMonth; @@ -107,23 +131,31 @@ export function CustomReport() { // Make sure the month selects are at least populates with a // year's worth of months. We can undo this when we have fancier // date selects. - const yearAgo = monthUtils.subMonths(monthUtils.currentMonth(), 12); + const rangeInc = + interval === 'Monthly' ? 'rangeInclusive' : 'yearRangeInclusive'; + const sub = interval === 'Monthly' ? 'subMonths' : 'subYears'; + const yearAgo = monthUtils[sub]( + currentMonth, + interval === 'Monthly' ? 12 : 1, + ); if (earliestMonth > yearAgo) { earliestMonth = yearAgo; } - const allMonths = monthUtils - .rangeInclusive(earliestMonth, monthUtils.currentMonth()) + const allMonths = monthUtils[rangeInc](earliestMonth, currentMonth) .map(month => ({ name: month, - pretty: monthUtils.format(month, 'MMMM, yyyy'), + pretty: + interval === 'Monthly' + ? monthUtils.format(month, 'MMMM, yyyy') + : month, })) .reverse(); setAllMonths(allMonths); } run(); - }, []); + }, [interval]); const balanceTypeOp = ReportOptions.balanceTypeMap.get(balanceType); const payees = usePayees(); @@ -134,6 +166,7 @@ export function CustomReport() { startDate, endDate, categories, + interval, selectedCategories, conditions: filters, conditionsOp, @@ -147,7 +180,6 @@ export function CustomReport() { startDate, endDate, groupBy, - interval, balanceType, categories, selectedCategories, @@ -168,6 +200,7 @@ export function CustomReport() { startDate, endDate, categories, + interval, selectedCategories, conditions: filters, conditionsOp, @@ -186,7 +219,6 @@ export function CustomReport() { startDate, endDate, groupBy, - interval, balanceType, categories, selectedCategories, 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 e0dc578a58a..ae41700302c 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/custom-spreadsheet.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/custom-spreadsheet.ts @@ -25,6 +25,7 @@ export type createCustomSpreadsheetProps = { startDate: string; endDate: string; categories: { list: CategoryEntity[]; grouped: CategoryGroupEntity[] }; + interval: string; selectedCategories: CategoryEntity[]; conditions: RuleConditionEntity[]; conditionsOp: string; @@ -44,6 +45,7 @@ export function createCustomSpreadsheet({ startDate, endDate, categories, + interval, selectedCategories, conditions = [], conditionsOp, @@ -96,6 +98,7 @@ export function createCustomSpreadsheet({ categoryFilter, conditionsOpKey, filters, + interval, ), ).then(({ data }) => data), runQuery( @@ -107,11 +110,14 @@ export function createCustomSpreadsheet({ categoryFilter, conditionsOpKey, filters, + interval, ), ).then(({ data }) => data), ]); - const months = monthUtils.rangeInclusive(startDate, endDate); + const rangeInc = + interval === 'Monthly' ? 'rangeInclusive' : 'yearRangeInclusive'; + const months = monthUtils[rangeInc](startDate, endDate); let totalAssets = 0; let totalDebts = 0; @@ -168,8 +174,11 @@ export function createCustomSpreadsheet({ totalDebts += perMonthDebts; arr.push({ - // eslint-disable-next-line rulesdir/typography - date: d.format(d.parseISO(`${month}-01`), "MMM ''yy"), + date: + interval === 'Monthly' + ? // eslint-disable-next-line rulesdir/typography + d.format(d.parseISO(`${month}-01`), "MMM ''yy") + : month, ...stacked, totalDebts: integerToAmount(perMonthDebts), totalAssets: integerToAmount(perMonthAssets), 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 f44cddf8ca4..99172bd22f9 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/grouped-spreadsheet.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/grouped-spreadsheet.ts @@ -17,6 +17,7 @@ export function createGroupedSpreadsheet({ startDate, endDate, categories, + interval, selectedCategories, conditions = [], conditionsOp, @@ -56,6 +57,7 @@ export function createGroupedSpreadsheet({ categoryFilter, conditionsOpKey, filters, + interval, ), ).then(({ data }) => data), runQuery( @@ -67,11 +69,14 @@ export function createGroupedSpreadsheet({ categoryFilter, conditionsOpKey, filters, + interval, ), ).then(({ data }) => data), ]); - const months = monthUtils.rangeInclusive(startDate, endDate); + const rangeInc = + interval === 'Monthly' ? 'rangeInclusive' : 'yearRangeInclusive'; + const months = monthUtils[rangeInc](startDate, endDate); const groupedData: GroupedEntity[] = categoryGroup.map( group => { diff --git a/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts b/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts index 9598aac0294..34d7b20f42e 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts @@ -9,7 +9,10 @@ export function makeQuery( categoryFilter: CategoryEntity[], conditionsOpKey: string, filters: unknown[], + interval: string, ) { + const int = interval === 'Monthly' ? { $month: '$date' } : { $year: '$date' }; + const int2 = interval === 'Monthly' ? '$month' : '$year'; const query = q('transactions') //Apply Category_Selector .filter( @@ -31,8 +34,8 @@ export function makeQuery( //Apply month range filters .filter({ $and: [ - { date: { $transform: '$month', $gte: startDate } }, - { date: { $transform: '$month', $lte: endDate } }, + { date: { $transform: int2, $gte: startDate } }, + { date: { $transform: int2, $lte: endDate } }, ], }) //Show assets or debts @@ -42,14 +45,14 @@ export function makeQuery( return query .groupBy([ - { $month: '$date' }, + int, { $id: '$account' }, { $id: '$payee' }, { $id: '$category' }, { $id: '$payee.transfer_acct.id' }, ]) .select([ - { date: { $month: '$date' } }, + { date: int }, { category: { $id: '$category.id' } }, { categoryHidden: { $id: '$category.hidden' } }, { categoryGroup: { $id: '$category.group.id' } }, diff --git a/packages/desktop-client/src/components/reports/spreadsheets/recalculate.ts b/packages/desktop-client/src/components/reports/spreadsheets/recalculate.ts index ee914401c8e..6bc32321066 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/recalculate.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/recalculate.ts @@ -1,6 +1,4 @@ // @ts-strict-ignore -import * as d from 'date-fns'; - import { amountToInteger, integerToAmount } from 'loot-core/src/shared/util'; import { type QueryDataEntity } from '../ReportOptions'; @@ -60,20 +58,15 @@ export function recalculate({ .reduce((a, v) => (a = a + v.amount), 0); totalDebts += monthDebts; - const dateParse = d.parseISO(`${month}-01`); - const change = last ? monthAssets + monthDebts - amountToInteger(last.totalTotals) : 0; arr.push({ - dateParse, totalAssets: integerToAmount(monthAssets), totalDebts: integerToAmount(monthDebts), totalTotals: integerToAmount(monthAssets + monthDebts), change, - // eslint-disable-next-line rulesdir/typography - date: d.format(dateParse, "MMM ''yy"), dateLookup: month, }); diff --git a/packages/loot-core/src/shared/months.ts b/packages/loot-core/src/shared/months.ts index 5655104eae9..995c8345d77 100644 --- a/packages/loot-core/src/shared/months.ts +++ b/packages/loot-core/src/shared/months.ts @@ -87,6 +87,10 @@ export function monthFromDate(date: DateLike): string { return d.format(_parse(date), 'yyyy-MM'); } +export function weekFromDate(date: DateLike): string { + return d.format(_parse(date), 'yyyy-ww'); +} + export function dayFromDate(date: DateLike): string { return d.format(_parse(date), 'yyyy-MM-dd'); } @@ -99,6 +103,14 @@ export function currentMonth(): string { } } +export function currentYear(): string { + if (global.IS_TESTING || Platform.isPlaywright) { + return global.currentMonth || '2017'; + } else { + return d.format(new Date(), 'yyyy'); + } +} + export function currentDate(): Date { if (global.IS_TESTING || Platform.isPlaywright) { return d.parse(currentDay(), 'yyyy-MM-dd', new Date()); @@ -127,6 +139,10 @@ export function prevMonth(month: DateLike): string { return d.format(d.subMonths(_parse(month), 1), 'yyyy-MM'); } +export function addYears(year: DateLike, n: number): string { + return d.format(d.addYears(_parse(year), n), 'yyyy'); +} + export function addMonths(month: DateLike, n: number): string { return d.format(d.addMonths(_parse(month), n), 'yyyy-MM'); } @@ -153,6 +169,10 @@ export function subMonths(month: string | Date, n: number) { return d.format(d.subMonths(_parse(month), n), 'yyyy-MM'); } +export function subYears(year: string | Date, n: number) { + return d.format(d.subYears(_parse(year), n), 'yyyy'); +} + export function addDays(day: DateLike, n: number): string { return d.format(d.addDays(_parse(day), n), 'yyyy-MM-dd'); } @@ -178,6 +198,29 @@ export function bounds(month: DateLike): { start: number; end: number } { }; } +export function _yearRange( + start: DateLike, + end: DateLike, + inclusive = false, +): string[] { + const years: string[] = []; + let year = yearFromDate(start); + while (d.isBefore(_parse(year), _parse(end))) { + years.push(year); + year = addYears(year, 1); + } + + if (inclusive) { + years.push(year); + } + + return years; +} + +export function yearRangeInclusive(start: DateLike, end: DateLike): string[] { + return _yearRange(start, end, true); +} + export function _range( start: DateLike, end: DateLike, From cd4cffbf767a7c4fa27a1a232b3a3c05548bc308 Mon Sep 17 00:00:00 2001 From: carkom Date: Fri, 15 Mar 2024 09:52:40 +0000 Subject: [PATCH 16/36] notes --- upcoming-release-notes/2466.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 upcoming-release-notes/2466.md diff --git a/upcoming-release-notes/2466.md b/upcoming-release-notes/2466.md new file mode 100644 index 00000000000..087f1d1d862 --- /dev/null +++ b/upcoming-release-notes/2466.md @@ -0,0 +1,6 @@ +--- +category: Enhancements +authors: [carkom] +--- + +Enable "yearly" interval to custom reports. Also sets-up groudwork for adding weekly/daily in the near future. From 6bb5a7eb6d166e6d466bafe77720b8dee2371297 Mon Sep 17 00:00:00 2001 From: carkom Date: Fri, 15 Mar 2024 09:54:33 +0000 Subject: [PATCH 17/36] lint fix --- .../src/components/reports/ReportOptions.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/desktop-client/src/components/reports/ReportOptions.ts b/packages/desktop-client/src/components/reports/ReportOptions.ts index f2ac3b170b0..c41b53e0504 100644 --- a/packages/desktop-client/src/components/reports/ReportOptions.ts +++ b/packages/desktop-client/src/components/reports/ReportOptions.ts @@ -50,9 +50,14 @@ const dateRangeOptions = [ { description: 'Last 3 months', name: 2, Yearly: false, Monthly: true }, { description: 'Last 6 months', name: 5, Yearly: false, Monthly: true }, { description: 'Last 12 months', name: 11, Yearly: false, Monthly: true }, - { description: 'Year to date', name: 'yearToDate', Yearly: true, Monthly: true }, + { + description: 'Year to date', + name: 'yearToDate', + Yearly: true, + Monthly: true, + }, { description: 'Last year', name: 'lastYear', Yearly: true, Monthly: true }, - { description: 'All time', name: 'allMonths', Yearly: true, Monthly: true}, + { description: 'All time', name: 'allMonths', Yearly: true, Monthly: true }, ]; const intervalOptions = [ From 299c9e9ccf36c9d4a883afe6d941292bae8f77d2 Mon Sep 17 00:00:00 2001 From: carkom Date: Mon, 18 Mar 2024 09:12:34 +0000 Subject: [PATCH 18/36] update names --- .../src/components/reports/ReportSidebar.jsx | 8 ++++ .../reports/reports/CustomReport.jsx | 23 ++++++----- .../spreadsheets/custom-spreadsheet.ts | 40 +++++++++---------- .../spreadsheets/grouped-spreadsheet.ts | 20 +++++----- .../reports/spreadsheets/makeQuery.ts | 13 +++--- .../reports/spreadsheets/recalculate.ts | 31 +++++++------- 6 files changed, 74 insertions(+), 61 deletions(-) diff --git a/packages/desktop-client/src/components/reports/ReportSidebar.jsx b/packages/desktop-client/src/components/reports/ReportSidebar.jsx index b086cb307ff..44dc03495e1 100644 --- a/packages/desktop-client/src/components/reports/ReportSidebar.jsx +++ b/packages/desktop-client/src/components/reports/ReportSidebar.jsx @@ -210,6 +210,14 @@ export function ReportSidebar({ onChange={e => { setInterval(e); onReportChange({ type: 'modify' }); + if ( + ReportOptions.dateRange + .filter(int => !int[e]) + .map(int => int.description) + .includes(customReportItems.dateRange) + ) { + setDateRange('Year to date'); + } }} options={ReportOptions.interval.map(option => [ option.description, diff --git a/packages/desktop-client/src/components/reports/reports/CustomReport.jsx b/packages/desktop-client/src/components/reports/reports/CustomReport.jsx index 6f8cce3523f..6430e899892 100644 --- a/packages/desktop-client/src/components/reports/reports/CustomReport.jsx +++ b/packages/desktop-client/src/components/reports/reports/CustomReport.jsx @@ -92,20 +92,23 @@ export function CustomReport() { ); useEffect(() => { - const rangeInc = - interval === 'Monthly' ? 'rangeInclusive' : 'yearRangeInclusive'; - setMonths(monthUtils[rangeInc](startDate, endDate)); - let start; let end; + if (interval === 'Monthly') { start = monthUtils.subMonths(monthUtils.currentMonth(), 5); end = monthUtils.currentMonth(); - } else { - start = monthUtils.subYears(monthUtils.currentYear(), 3); - end = monthUtils.currentYear(); } + if (interval === 'Yearly') { + start = monthUtils.yearFromMonth(startDate); + end = monthUtils.yearFromMonth(endDate); + } + + const rangeInc = + interval === 'Monthly' ? 'rangeInclusive' : 'yearRangeInclusive'; + setMonths(monthUtils[rangeInc](start, end)); + setStartDate(start); setEndDate(end); }, [interval]); @@ -321,9 +324,9 @@ export function CustomReport() { } }; - const onChangeDates = (startDate, endDate) => { - setStartDate(startDate); - setEndDate(endDate); + const onChangeDates = (dateStart, dateEnd) => { + setStartDate(dateStart); + setEndDate(dateEnd); onReportChange({ type: 'modify' }); }; 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 ae41700302c..bbf19dae7c5 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/custom-spreadsheet.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/custom-spreadsheet.ts @@ -117,20 +117,20 @@ export function createCustomSpreadsheet({ const rangeInc = interval === 'Monthly' ? 'rangeInclusive' : 'yearRangeInclusive'; - const months = monthUtils[rangeInc](startDate, endDate); + const intervals = monthUtils[rangeInc](startDate, endDate); let totalAssets = 0; let totalDebts = 0; - const monthData = months.reduce((arr, month) => { - let perMonthAssets = 0; - let perMonthDebts = 0; + const monthData = intervals.reduce((arr, inter) => { + let perIntervalAssets = 0; + let perIntervalDebts = 0; const stacked = {}; groupByList.map(item => { let stackAmounts = 0; - const monthAssets = filterHiddenItems( + const intervalAssets = filterHiddenItems( item, assets, showOffBudget, @@ -139,12 +139,12 @@ export function createCustomSpreadsheet({ ) .filter( asset => - asset.date === month && asset[groupByLabel] === (item.id ?? null), + asset.date === inter && asset[groupByLabel] === (item.id ?? null), ) .reduce((a, v) => (a = a + v.amount), 0); - perMonthAssets += monthAssets; + perIntervalAssets += intervalAssets; - const monthDebts = filterHiddenItems( + const intervalDebts = filterHiddenItems( item, debts, showOffBudget, @@ -153,16 +153,16 @@ export function createCustomSpreadsheet({ ) .filter( debt => - debt.date === month && debt[groupByLabel] === (item.id ?? null), + debt.date === inter && debt[groupByLabel] === (item.id ?? null), ) .reduce((a, v) => (a = a + v.amount), 0); - perMonthDebts += monthDebts; + perIntervalDebts += intervalDebts; if (balanceTypeOp === 'totalAssets') { - stackAmounts += monthAssets; + stackAmounts += intervalAssets; } if (balanceTypeOp === 'totalDebts') { - stackAmounts += monthDebts; + stackAmounts += intervalDebts; } if (stackAmounts !== 0) { stacked[item.name] = integerToAmount(Math.abs(stackAmounts)); @@ -170,19 +170,19 @@ export function createCustomSpreadsheet({ return null; }); - totalAssets += perMonthAssets; - totalDebts += perMonthDebts; + totalAssets += perIntervalAssets; + totalDebts += perIntervalDebts; arr.push({ date: interval === 'Monthly' ? // eslint-disable-next-line rulesdir/typography - d.format(d.parseISO(`${month}-01`), "MMM ''yy") - : month, + d.format(d.parseISO(`${inter}-01`), "MMM ''yy") + : inter, ...stacked, - totalDebts: integerToAmount(perMonthDebts), - totalAssets: integerToAmount(perMonthAssets), - totalTotals: integerToAmount(perMonthDebts + perMonthAssets), + totalDebts: integerToAmount(perIntervalDebts), + totalAssets: integerToAmount(perIntervalAssets), + totalTotals: integerToAmount(perIntervalDebts + perIntervalAssets), }); return arr; @@ -191,7 +191,7 @@ export function createCustomSpreadsheet({ const calcData = groupByList.map(item => { const calc = recalculate({ item, - months, + intervals, assets, debts, groupByLabel, 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 99172bd22f9..8bdce547cb5 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/grouped-spreadsheet.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/grouped-spreadsheet.ts @@ -76,19 +76,19 @@ export function createGroupedSpreadsheet({ const rangeInc = interval === 'Monthly' ? 'rangeInclusive' : 'yearRangeInclusive'; - const months = monthUtils[rangeInc](startDate, endDate); + const intervals = monthUtils[rangeInc](startDate, endDate); const groupedData: GroupedEntity[] = categoryGroup.map( group => { let totalAssets = 0; let totalDebts = 0; - const monthData = months.reduce((arr, month) => { + const monthData = intervals.reduce((arr, inter) => { let groupedAssets = 0; let groupedDebts = 0; group.categories.forEach(item => { - const monthAssets = filterHiddenItems( + const intervalAssets = filterHiddenItems( item, assets, showOffBudget, @@ -97,12 +97,12 @@ export function createGroupedSpreadsheet({ ) .filter( asset => - asset.date === month && asset.category === (item.id ?? null), + asset.date === inter && asset.category === (item.id ?? null), ) .reduce((a, v) => (a = a + v.amount), 0); - groupedAssets += monthAssets; + groupedAssets += intervalAssets; - const monthDebts = filterHiddenItems( + const intervalDebts = filterHiddenItems( item, debts, showOffBudget, @@ -111,17 +111,17 @@ export function createGroupedSpreadsheet({ ) .filter( debts => - debts.date === month && debts.category === (item.id ?? null), + debts.date === inter && debts.category === (item.id ?? null), ) .reduce((a, v) => (a = a + v.amount), 0); - groupedDebts += monthDebts; + groupedDebts += intervalDebts; }); totalAssets += groupedAssets; totalDebts += groupedDebts; arr.push({ - date: month, + date: inter, totalAssets: integerToAmount(groupedAssets), totalDebts: integerToAmount(groupedDebts), totalTotals: integerToAmount(groupedDebts + groupedAssets), @@ -133,7 +133,7 @@ export function createGroupedSpreadsheet({ const stackedCategories = group.categories.map(item => { const calc = recalculate({ item, - months, + intervals, assets, debts, groupByLabel: 'category', diff --git a/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts b/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts index 34d7b20f42e..81e987a779a 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts @@ -11,8 +11,9 @@ export function makeQuery( filters: unknown[], interval: string, ) { - const int = interval === 'Monthly' ? { $month: '$date' } : { $year: '$date' }; - const int2 = interval === 'Monthly' ? '$month' : '$year'; + const intervalGroup = + interval === 'Monthly' ? { $month: '$date' } : { $year: '$date' }; + const intervalFilter = interval === 'Monthly' ? '$month' : '$year'; const query = q('transactions') //Apply Category_Selector .filter( @@ -34,8 +35,8 @@ export function makeQuery( //Apply month range filters .filter({ $and: [ - { date: { $transform: int2, $gte: startDate } }, - { date: { $transform: int2, $lte: endDate } }, + { date: { $transform: intervalFilter, $gte: startDate } }, + { date: { $transform: intervalFilter, $lte: endDate } }, ], }) //Show assets or debts @@ -45,14 +46,14 @@ export function makeQuery( return query .groupBy([ - int, + intervalGroup, { $id: '$account' }, { $id: '$payee' }, { $id: '$category' }, { $id: '$payee.transfer_acct.id' }, ]) .select([ - { date: int }, + { date: intervalGroup }, { category: { $id: '$category.id' } }, { categoryHidden: { $id: '$category.hidden' } }, { categoryGroup: { $id: '$category.group.id' } }, diff --git a/packages/desktop-client/src/components/reports/spreadsheets/recalculate.ts b/packages/desktop-client/src/components/reports/spreadsheets/recalculate.ts index 6bc32321066..e2cd73ec792 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/recalculate.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/recalculate.ts @@ -7,7 +7,7 @@ import { filterHiddenItems } from './filterHiddenItems'; type recalculateProps = { item; - months: Array; + intervals: Array; assets: QueryDataEntity[]; debts: QueryDataEntity[]; groupByLabel: string; @@ -18,7 +18,7 @@ type recalculateProps = { export function recalculate({ item, - months, + intervals, assets, debts, groupByLabel, @@ -28,10 +28,10 @@ export function recalculate({ }: recalculateProps) { let totalAssets = 0; let totalDebts = 0; - const monthData = months.reduce((arr, month) => { + const intervalData = intervals.reduce((arr, interval) => { const last = arr.length === 0 ? null : arr[arr.length - 1]; - const monthAssets = filterHiddenItems( + const intervalAssets = filterHiddenItems( item, assets, showOffBudget, @@ -40,12 +40,12 @@ export function recalculate({ ) .filter( asset => - asset.date === month && asset[groupByLabel] === (item.id ?? null), + asset.date === interval && asset[groupByLabel] === (item.id ?? null), ) .reduce((a, v) => (a = a + v.amount), 0); - totalAssets += monthAssets; + totalAssets += intervalAssets; - const monthDebts = filterHiddenItems( + const intervalDebts = filterHiddenItems( item, debts, showOffBudget, @@ -53,21 +53,22 @@ export function recalculate({ showUncategorized, ) .filter( - debt => debt.date === month && debt[groupByLabel] === (item.id ?? null), + debt => + debt.date === interval && debt[groupByLabel] === (item.id ?? null), ) .reduce((a, v) => (a = a + v.amount), 0); - totalDebts += monthDebts; + totalDebts += intervalDebts; const change = last - ? monthAssets + monthDebts - amountToInteger(last.totalTotals) + ? intervalAssets + intervalDebts - amountToInteger(last.totalTotals) : 0; arr.push({ - totalAssets: integerToAmount(monthAssets), - totalDebts: integerToAmount(monthDebts), - totalTotals: integerToAmount(monthAssets + monthDebts), + totalAssets: integerToAmount(intervalAssets), + totalDebts: integerToAmount(intervalDebts), + totalTotals: integerToAmount(intervalAssets + intervalDebts), change, - dateLookup: month, + dateLookup: interval, }); return arr; @@ -79,6 +80,6 @@ export function recalculate({ totalAssets: integerToAmount(totalAssets), totalDebts: integerToAmount(totalDebts), totalTotals: integerToAmount(totalAssets + totalDebts), - monthData, + monthData: intervalData, }; } From 1fb6434b2b66a8d4b199ea0ce34112f659d3a458 Mon Sep 17 00:00:00 2001 From: carkom Date: Mon, 18 Mar 2024 10:36:18 +0000 Subject: [PATCH 19/36] IntervalsUpdates --- .../src/components/reports/ChooseGraph.tsx | 10 ++-- .../src/components/reports/ReportOptions.ts | 4 +- .../src/components/reports/ReportSidebar.jsx | 58 ++++++++++--------- .../src/components/reports/ReportSummary.tsx | 12 ++-- .../components/reports/graphs/AreaGraph.tsx | 10 ++-- .../components/reports/graphs/BarGraph.tsx | 2 +- .../components/reports/graphs/DonutGraph.tsx | 2 +- .../reports/graphs/StackedBarGraph.tsx | 6 +- .../reports/graphs/tableGraph/ReportTable.tsx | 10 ++-- .../graphs/tableGraph/ReportTableList.tsx | 6 +- .../graphs/tableGraph/ReportTableRow.tsx | 18 +++--- .../graphs/tableGraph/ReportTableTotals.tsx | 8 +-- .../reports/reports/CustomReport.jsx | 16 +++-- .../reports/spreadsheets/calculateLegend.ts | 6 +- .../spreadsheets/custom-spreadsheet.ts | 10 +++- .../spreadsheets/grouped-spreadsheet.ts | 7 ++- .../reports/spreadsheets/makeQuery.ts | 10 +++- .../reports/spreadsheets/recalculate.ts | 17 +++++- .../loot-core/src/types/models/reports.d.ts | 12 ++-- 19 files changed, 131 insertions(+), 93 deletions(-) diff --git a/packages/desktop-client/src/components/reports/ChooseGraph.tsx b/packages/desktop-client/src/components/reports/ChooseGraph.tsx index 1eef9fabc0c..ab945112d28 100644 --- a/packages/desktop-client/src/components/reports/ChooseGraph.tsx +++ b/packages/desktop-client/src/components/reports/ChooseGraph.tsx @@ -48,14 +48,14 @@ export function ChooseGraph({ compact, style, }: ChooseGraphProps) { - const months: string[] = monthUtils.rangeInclusive(startDate, endDate); + const intervals: string[] = monthUtils.rangeInclusive(startDate, endDate); const graphStyle = compact ? { ...style } : { flexGrow: 1 }; const balanceTypeOp = ReportOptions.balanceTypeMap.get(balanceType); const groupByData = groupBy === 'Category' ? 'groupedData' : groupBy === 'Interval' - ? 'monthData' + ? 'intervalData' : 'data'; const saveScrollWidth = value => { @@ -144,7 +144,7 @@ export function ChooseGraph({ { onReportChange({ type: 'modify' }); setDateRange(cond); + let dateStart; + let dateEnd; switch (cond) { case 'All time': - onChangeDates(...getFullRange(allMonths)); + [dateStart, dateEnd] = getFullRange(allIntervals); + onChangeDates(dateStart + '-01', dateEnd + '-01'); break; case 'Year to date': - onChangeDates( - ...validateRange( - allMonths, - monthUtils.getYearStart(monthUtils.currentMonth()), - monthUtils.currentMonth(), - ), + [dateStart, dateEnd] = validateRange( + allIntervals, + monthUtils.getYearStart(monthUtils.currentMonth()), + monthUtils.currentMonth(), ); + onChangeDates(dateStart + '-01', dateEnd + '-01'); break; case 'Last year': - onChangeDates( - ...validateRange( - allMonths, - monthUtils.getYearStart( - monthUtils.prevYear(monthUtils.currentMonth()), - ), - monthUtils.getYearEnd( - monthUtils.prevYear(monthUtils.currentDate()), - ), + [dateStart, dateEnd] = validateRange( + allIntervals, + monthUtils.getYearStart( + monthUtils.prevYear(monthUtils.currentMonth()), ), + monthUtils.getYearEnd(monthUtils.prevYear(monthUtils.currentDate())), ); + onChangeDates(dateStart + '-01', dateEnd + '-01'); break; default: - onChangeDates( - ...getSpecificRange( - ReportOptions.dateRangeMap.get(cond), - cond === 'Last month' ? 0 : null, - ), + [dateStart, dateEnd] = getSpecificRange( + ReportOptions.dateRangeMap.get(cond), + cond === 'Last month' ? 0 : null, ); + onChangeDates(dateStart + '-01', dateEnd + '-01'); } }; @@ -381,14 +379,18 @@ export function ReportSidebar({ onChange={newValue => onChangeDates( ...validateStart( - allMonths, + allIntervals, newValue, customReportItems.endDate, ), ) } value={customReportItems.startDate} - options={allMonths.map(({ name, pretty }) => [name, pretty])} + defaultLabel={monthUtils.format( + customReportItems.startDate, + 'MMMM, yyyy', + )} + options={allIntervals.map(({ name, pretty }) => [name, pretty])} /> onChangeDates( ...validateEnd( - allMonths, + allIntervals, customReportItems.startDate, newValue, ), ) } value={customReportItems.endDate} - options={allMonths.map(({ name, pretty }) => [name, pretty])} + defaultLabel={monthUtils.format( + customReportItems.endDate, + 'MMMM, yyyy', + )} + options={allIntervals.map(({ name, pretty }) => [name, pretty])} /> diff --git a/packages/desktop-client/src/components/reports/ReportSummary.tsx b/packages/desktop-client/src/components/reports/ReportSummary.tsx index eab6d9a0709..5653a19ce30 100644 --- a/packages/desktop-client/src/components/reports/ReportSummary.tsx +++ b/packages/desktop-client/src/components/reports/ReportSummary.tsx @@ -19,7 +19,8 @@ type ReportSummaryProps = { endDate: string; data: GroupedEntity; balanceTypeOp: string; - monthsCount: number; + interval: string; + intervalsCount: number; }; export function ReportSummary({ @@ -27,13 +28,14 @@ export function ReportSummary({ endDate, data, balanceTypeOp, - monthsCount, + interval, + intervalsCount, }: ReportSummaryProps) { const net = Math.abs(data.totalDebts) > Math.abs(data.totalAssets) ? 'PAYMENT' : 'DEPOSIT'; - const average = amountToInteger(data[balanceTypeOp]) / monthsCount; + const average = amountToInteger(data[balanceTypeOp]) / intervalsCount; return ( - Per month + + Per {interval === 'Monthly' ? 'month' : 'year'} + ); diff --git a/packages/desktop-client/src/components/reports/graphs/AreaGraph.tsx b/packages/desktop-client/src/components/reports/graphs/AreaGraph.tsx index 276c15a401b..4918c92ce39 100644 --- a/packages/desktop-client/src/components/reports/graphs/AreaGraph.tsx +++ b/packages/desktop-client/src/components/reports/graphs/AreaGraph.tsx @@ -125,8 +125,8 @@ export function AreaGraph({ viewLabels, }: AreaGraphProps) { const privacyMode = usePrivacyMode(); - const dataMax = Math.max(...data.monthData.map(i => i[balanceTypeOp])); - const dataMin = Math.min(...data.monthData.map(i => i[balanceTypeOp])); + const dataMax = Math.max(...data.intervalData.map(i => i[balanceTypeOp])); + const dataMin = Math.min(...data.intervalData.map(i => i[balanceTypeOp])); const labelsMargin = viewLabels ? 30 : 0; const dataDiff = dataMax - dataMin; @@ -144,7 +144,7 @@ export function AreaGraph({ dataMax === 0 || Math.abs(dataMax) <= extendRangeAmount ? 0 : Math.ceil((dataMax + extendRangeAmount) / 100) * 100; - const lastLabel = data.monthData.length - 1; + const lastLabel = data.intervalData.length - 1; const tickFormatter = tick => { if (!privacyMode) return `${amountToCurrencyNoDecimal(tick)}`; // Formats the tick values as strings with commas @@ -173,14 +173,14 @@ export function AreaGraph({ }} > {(width, height) => - data.monthData && ( + data.intervalData && (

    {!compact &&
    } { diff --git a/packages/desktop-client/src/components/reports/graphs/DonutGraph.tsx b/packages/desktop-client/src/components/reports/graphs/DonutGraph.tsx index 40ba708aa02..a129f6c3013 100644 --- a/packages/desktop-client/src/components/reports/graphs/DonutGraph.tsx +++ b/packages/desktop-client/src/components/reports/graphs/DonutGraph.tsx @@ -188,7 +188,7 @@ export function DonutGraph({ viewLabels, }: DonutGraphProps) { const yAxis = groupBy === 'Interval' ? 'date' : 'name'; - const splitData = groupBy === 'Interval' ? 'monthData' : 'data'; + const splitData = groupBy === 'Interval' ? 'intervalData' : 'data'; const getVal = obj => { if (balanceTypeOp === 'totalDebts') { diff --git a/packages/desktop-client/src/components/reports/graphs/StackedBarGraph.tsx b/packages/desktop-client/src/components/reports/graphs/StackedBarGraph.tsx index 3f1d5849b49..2a3136fe6e3 100644 --- a/packages/desktop-client/src/components/reports/graphs/StackedBarGraph.tsx +++ b/packages/desktop-client/src/components/reports/graphs/StackedBarGraph.tsx @@ -142,7 +142,7 @@ export function StackedBarGraph({ }: StackedBarGraphProps) { const privacyMode = usePrivacyMode(); - const largestValue = data.monthData + const largestValue = data.intervalData .map(c => c[balanceTypeOp]) .reduce((acc, cur) => (Math.abs(cur) > Math.abs(acc) ? cur : acc), 0); @@ -155,14 +155,14 @@ export function StackedBarGraph({ }} > {(width, height) => - data.monthData && ( + data.intervalData && (
    {!compact &&
    } { - const average = amountToInteger(item[balanceTypeOp]) / monthsCount; + const average = amountToInteger(item[balanceTypeOp]) / intervalsCount; return ( - {item.monthData && mode === 'time' - ? item.monthData.map(month => { + {item.intervalData && mode === 'time' + ? item.intervalData.map(inter => { return ( 100000 - ? amountToCurrency(month[balanceTypeOp]) + Math.abs(inter[balanceTypeOp]) > 100000 + ? amountToCurrency(inter[balanceTypeOp]) : undefined } width="flex" 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 40228d0d29a..d47cf02530d 100644 --- a/packages/desktop-client/src/components/reports/graphs/tableGraph/ReportTableTotals.tsx +++ b/packages/desktop-client/src/components/reports/graphs/tableGraph/ReportTableTotals.tsx @@ -18,7 +18,7 @@ type ReportTableTotalsProps = { data: GroupedEntity; balanceTypeOp: string; mode: string; - monthsCount: number; + intervalsCount: number; totalScrollRef: RefProp; handleScroll: UIEventHandler; compact: boolean; @@ -30,7 +30,7 @@ export function ReportTableTotals({ data, balanceTypeOp, mode, - monthsCount, + intervalsCount, totalScrollRef, handleScroll, compact, @@ -51,7 +51,7 @@ export function ReportTableTotals({ } }); - const average = amountToInteger(data[balanceTypeOp]) / monthsCount; + const average = amountToInteger(data[balanceTypeOp]) / intervalsCount; return ( {mode === 'time' - ? data.monthData.map(item => { + ? data.intervalData.map(item => { return ( ({ name: month, pretty: @@ -155,7 +156,7 @@ export function CustomReport() { })) .reverse(); - setAllMonths(allMonths); + setAllIntervals(allInter); } run(); }, [interval]); @@ -168,6 +169,7 @@ export function CustomReport() { return createGroupedSpreadsheet({ startDate, endDate, + interval, categories, interval, selectedCategories, @@ -202,6 +204,7 @@ export function CustomReport() { return createCustomSpreadsheet({ startDate, endDate, + interval, categories, interval, selectedCategories, @@ -261,7 +264,7 @@ export function CustomReport() { const [scrollWidth, setScrollWidth] = useState(0); - if (!allMonths || !data) { + if (!allIntervals || !data) { return null; } @@ -436,7 +439,7 @@ export function CustomReport() { customReportItems={customReportItems} categories={categories} dateRangeLine={dateRangeLine} - allMonths={allMonths} + allIntervals={allIntervals} setDateRange={setDateRange} setGraphType={setGraphType} setGroupBy={setGroupBy} @@ -581,7 +584,8 @@ export function CustomReport() { endDate={endDate} balanceTypeOp={balanceTypeOp} data={data} - monthsCount={months.length} + interval={interval} + intervalsCount={intervals.length} /> )} {viewLegend && ( diff --git a/packages/desktop-client/src/components/reports/spreadsheets/calculateLegend.ts b/packages/desktop-client/src/components/reports/spreadsheets/calculateLegend.ts index 2190b7ea638..0b3a2646bbc 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/calculateLegend.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/calculateLegend.ts @@ -1,21 +1,21 @@ // @ts-strict-ignore import { + type IntervalData, type ItemEntity, - type MonthData, } from 'loot-core/src/types/models/reports'; import { theme } from '../../../style'; import { getColorScale } from '../chart-theme'; export function calculateLegend( - monthData: MonthData[], + intervalData: IntervalData[], calcDataFiltered: ItemEntity[], groupBy: string, graphType: string, balanceTypeOp: string, ) { const colorScale = getColorScale('qualitative'); - const chooseData = groupBy === 'Interval' ? monthData : calcDataFiltered; + const chooseData = groupBy === 'Interval' ? intervalData : calcDataFiltered; return chooseData.map((c, index) => { return { name: groupBy === 'Interval' ? c.date : c.name, 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 bbf19dae7c5..a6d521c25da 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/custom-spreadsheet.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/custom-spreadsheet.ts @@ -24,6 +24,7 @@ import { recalculate } from './recalculate'; export type createCustomSpreadsheetProps = { startDate: string; endDate: string; + interval: string; categories: { list: CategoryEntity[]; grouped: CategoryGroupEntity[] }; interval: string; selectedCategories: CategoryEntity[]; @@ -44,6 +45,7 @@ export type createCustomSpreadsheetProps = { export function createCustomSpreadsheet({ startDate, endDate, + interval, categories, interval, selectedCategories, @@ -94,6 +96,7 @@ export function createCustomSpreadsheet({ 'assets', startDate, endDate, + interval, selectedCategories, categoryFilter, conditionsOpKey, @@ -106,6 +109,7 @@ export function createCustomSpreadsheet({ 'debts', startDate, endDate, + interval, selectedCategories, categoryFilter, conditionsOpKey, @@ -122,7 +126,7 @@ export function createCustomSpreadsheet({ let totalAssets = 0; let totalDebts = 0; - const monthData = intervals.reduce((arr, inter) => { + const intervalData = intervals.reduce((arr, inter) => { let perIntervalAssets = 0; let perIntervalDebts = 0; const stacked = {}; @@ -206,7 +210,7 @@ export function createCustomSpreadsheet({ ); const legend = calculateLegend( - monthData, + intervalData, calcDataFiltered, groupBy, graphType, @@ -215,7 +219,7 @@ export function createCustomSpreadsheet({ setData({ data: calcDataFiltered, - monthData, + intervalData, legend, startDate, endDate, 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 8bdce547cb5..39e8d96234d 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/grouped-spreadsheet.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/grouped-spreadsheet.ts @@ -16,6 +16,7 @@ import { recalculate } from './recalculate'; export function createGroupedSpreadsheet({ startDate, endDate, + interval, categories, interval, selectedCategories, @@ -53,6 +54,7 @@ export function createGroupedSpreadsheet({ 'assets', startDate, endDate, + interval, selectedCategories, categoryFilter, conditionsOpKey, @@ -65,6 +67,7 @@ export function createGroupedSpreadsheet({ 'debts', startDate, endDate, + interval, selectedCategories, categoryFilter, conditionsOpKey, @@ -83,7 +86,7 @@ export function createGroupedSpreadsheet({ let totalAssets = 0; let totalDebts = 0; - const monthData = intervals.reduce((arr, inter) => { + const intervalData = intervals.reduce((arr, inter) => { let groupedAssets = 0; let groupedDebts = 0; @@ -150,7 +153,7 @@ export function createGroupedSpreadsheet({ totalAssets: integerToAmount(totalAssets), totalDebts: integerToAmount(totalDebts), totalTotals: integerToAmount(totalAssets + totalDebts), - monthData, + intervalData, categories: stackedCategories.filter(i => filterEmptyRows(showEmpty, i, balanceTypeOp), ), diff --git a/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts b/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts index 81e987a779a..3d8e986b3f1 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts @@ -1,3 +1,4 @@ +import { monthFromDate } from 'loot-core/shared/months'; import { q } from 'loot-core/src/shared/query'; import { type CategoryEntity } from 'loot-core/src/types/models'; @@ -5,15 +6,18 @@ export function makeQuery( name: string, startDate: string, endDate: string, + interval: string, selectedCategories: CategoryEntity[], categoryFilter: CategoryEntity[], conditionsOpKey: string, filters: unknown[], - interval: string, ) { const intervalGroup = interval === 'Monthly' ? { $month: '$date' } : { $year: '$date' }; const intervalFilter = interval === 'Monthly' ? '$month' : '$year'; + const dateStart = + interval === 'Monthly' ? monthFromDate(startDate) : startDate; + const dateEnd = interval === 'Monthly' ? monthFromDate(endDate) : endDate; const query = q('transactions') //Apply Category_Selector .filter( @@ -35,8 +39,8 @@ export function makeQuery( //Apply month range filters .filter({ $and: [ - { date: { $transform: intervalFilter, $gte: startDate } }, - { date: { $transform: intervalFilter, $lte: endDate } }, + { date: { $transform: intervalFilter, $gte: dateStart } }, + { date: { $transform: intervalFilter, $lte: dateEnd } }, ], }) //Show assets or debts diff --git a/packages/desktop-client/src/components/reports/spreadsheets/recalculate.ts b/packages/desktop-client/src/components/reports/spreadsheets/recalculate.ts index e2cd73ec792..d44957a376c 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/recalculate.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/recalculate.ts @@ -8,6 +8,7 @@ import { filterHiddenItems } from './filterHiddenItems'; type recalculateProps = { item; intervals: Array; + intervals: Array; assets: QueryDataEntity[]; debts: QueryDataEntity[]; groupByLabel: string; @@ -19,6 +20,7 @@ type recalculateProps = { export function recalculate({ item, intervals, + intervals, assets, debts, groupByLabel, @@ -29,8 +31,10 @@ export function recalculate({ let totalAssets = 0; let totalDebts = 0; const intervalData = intervals.reduce((arr, interval) => { + const intervalData = intervals.reduce((arr, inter) => { const last = arr.length === 0 ? null : arr[arr.length - 1]; + const intervalAssets = filterHiddenItems( const intervalAssets = filterHiddenItems( item, assets, @@ -41,10 +45,13 @@ export function recalculate({ .filter( asset => asset.date === interval && asset[groupByLabel] === (item.id ?? null), + asset.date === inter && asset[groupByLabel] === (item.id ?? null), ) .reduce((a, v) => (a = a + v.amount), 0); totalAssets += intervalAssets; + totalAssets += intervalAssets; + const intervalDebts = filterHiddenItems( const intervalDebts = filterHiddenItems( item, debts, @@ -55,20 +62,26 @@ export function recalculate({ .filter( debt => debt.date === interval && debt[groupByLabel] === (item.id ?? null), + debt => debt.date === inter && debt[groupByLabel] === (item.id ?? null), ) .reduce((a, v) => (a = a + v.amount), 0); totalDebts += intervalDebts; + totalDebts += intervalDebts; const change = last + ? intervalAssets + intervalDebts - amountToInteger(last.totalTotals) ? intervalAssets + intervalDebts - amountToInteger(last.totalTotals) : 0; arr.push({ + totalAssets: integerToAmount(intervalAssets), + totalDebts: integerToAmount(intervalDebts), + totalTotals: integerToAmount(intervalAssets + intervalDebts), totalAssets: integerToAmount(intervalAssets), totalDebts: integerToAmount(intervalDebts), totalTotals: integerToAmount(intervalAssets + intervalDebts), change, - dateLookup: interval, + dateLookup: inter, }); return arr; @@ -80,6 +93,6 @@ export function recalculate({ totalAssets: integerToAmount(totalAssets), totalDebts: integerToAmount(totalDebts), totalTotals: integerToAmount(totalAssets + totalDebts), - monthData: intervalData, + intervalData, }; } diff --git a/packages/loot-core/src/types/models/reports.d.ts b/packages/loot-core/src/types/models/reports.d.ts index b5cbcad9b64..0b1af87a75c 100644 --- a/packages/loot-core/src/types/models/reports.d.ts +++ b/packages/loot-core/src/types/models/reports.d.ts @@ -26,7 +26,7 @@ export interface CustomReportEntity { export interface GroupedEntity { data?: DataEntity[]; - monthData: DataEntity[]; + intervalData: DataEntity[]; groupedData?: DataEntity[]; legend?: LegendEntity[]; startDate?: string; @@ -44,13 +44,13 @@ type LegendEntity = { export type ItemEntity = { id: string; name: string; - monthData: MonthData[]; + intervalData: IntervalData[]; totalAssets: number; totalDebts: number; totalTotals: number; }; -export type MonthData = { +export type IntervalData = { date: string; totalAssets: number; totalDebts: number; @@ -61,15 +61,15 @@ export interface DataEntity { id: string; name: string; date?: string; - monthData: MonthData[]; + intervalData: IntervalData[]; categories?: ItemEntity[]; totalAssets: number; totalDebts: number; totalTotals: number; } -export type Month = { - month: string; +export type Interval = { + interval: string; }; export interface CustomReportData { From b8fd126eccdb49abaf5b2ca3fd9c9074a01ab15f Mon Sep 17 00:00:00 2001 From: carkom Date: Mon, 18 Mar 2024 23:16:10 +0000 Subject: [PATCH 20/36] fixing bugs --- .../src/components/reports/Header.jsx | 28 +--- .../src/components/reports/ReportOptions.ts | 7 +- .../src/components/reports/ReportSidebar.jsx | 47 +++--- .../src/components/reports/ReportSummary.tsx | 15 +- .../src/components/reports/reportRanges.ts | 144 ++++++++++++++++++ .../reports/reports/CustomReport.jsx | 85 ++++++----- .../spreadsheets/custom-spreadsheet.ts | 10 +- .../spreadsheets/grouped-spreadsheet.ts | 9 +- .../reports/spreadsheets/makeQuery.ts | 9 +- .../reports/spreadsheets/recalculate.ts | 14 -- 10 files changed, 246 insertions(+), 122 deletions(-) create mode 100644 packages/desktop-client/src/components/reports/reportRanges.ts diff --git a/packages/desktop-client/src/components/reports/Header.jsx b/packages/desktop-client/src/components/reports/Header.jsx index bd4ebe076e9..12ce09f31f7 100644 --- a/packages/desktop-client/src/components/reports/Header.jsx +++ b/packages/desktop-client/src/components/reports/Header.jsx @@ -11,7 +11,7 @@ import { View } from '../common/View'; import { AppliedFilters } from '../filters/AppliedFilters'; import { FilterButton } from '../filters/FiltersMenu'; -export function validateStart(allMonths, start, end) { +function validateStart(allMonths, start, end) { const earliest = allMonths[allMonths.length - 1].name; if (end < start) { end = monthUtils.addMonths(start, 6); @@ -19,7 +19,7 @@ export function validateStart(allMonths, start, end) { return boundedRange(earliest, start, end); } -export function validateEnd(allMonths, start, end) { +function validateEnd(allMonths, start, end) { const earliest = allMonths[allMonths.length - 1].name; if (start > end) { start = monthUtils.subMonths(end, 6); @@ -27,18 +27,6 @@ export function validateEnd(allMonths, start, end) { return boundedRange(earliest, start, end); } -export function validateRange(allMonths, start, end) { - const latest = monthUtils.currentMonth(); - const earliest = allMonths[allMonths.length - 1].name; - if (end > latest) { - end = latest; - } - if (start < earliest) { - start = earliest; - } - return [start, end]; -} - function boundedRange(earliest, start, end) { const latest = monthUtils.currentMonth(); if (end > latest) { @@ -56,17 +44,7 @@ function getLatestRange(offset) { return [start, end]; } -export function getSpecificRange(offset, addNumber) { - const currMonth = monthUtils.currentMonth(); - const start = monthUtils.subMonths(currMonth, offset); - const end = monthUtils.addMonths( - start, - addNumber === null ? offset : addNumber, - ); - return [start, end]; -} - -export function getFullRange(allMonths) { +function getFullRange(allMonths) { const start = allMonths[allMonths.length - 1].name; const end = monthUtils.currentMonth(); return [start, end]; diff --git a/packages/desktop-client/src/components/reports/ReportOptions.ts b/packages/desktop-client/src/components/reports/ReportOptions.ts index d6f61e497f5..94c9dda21f7 100644 --- a/packages/desktop-client/src/components/reports/ReportOptions.ts +++ b/packages/desktop-client/src/components/reports/ReportOptions.ts @@ -64,8 +64,8 @@ const intervalOptions = [ //{ value: 1, description: 'Daily', name: 'Day'}, //{ value: 2, description: 'Weekly', name: 'Week'}, //{ value: 3, description: 'Fortnightly', name: 3}, - { value: 4, description: 'Monthly', name: 'Month' }, - { value: 5, description: 'Yearly', name: 'Year' }, + { description: 'Monthly', name: 'Month', format: 'MMMM, yyyy' }, + { description: 'Yearly', name: 'Year', format: 'yyyy' }, ]; export const ReportOptions = { @@ -82,6 +82,9 @@ export const ReportOptions = { intervalMap: new Map( intervalOptions.map(item => [item.description, item.name]), ), + intervalFormat: new Map( + intervalOptions.map(item => [item.description, item.format]), + ), }; export type QueryDataEntity = { diff --git a/packages/desktop-client/src/components/reports/ReportSidebar.jsx b/packages/desktop-client/src/components/reports/ReportSidebar.jsx index ded2d771e57..43e742aa291 100644 --- a/packages/desktop-client/src/components/reports/ReportSidebar.jsx +++ b/packages/desktop-client/src/components/reports/ReportSidebar.jsx @@ -11,15 +11,14 @@ import { View } from '../common/View'; import { Tooltip } from '../tooltips'; import { CategorySelector } from './CategorySelector'; +import { ModeButton } from './ModeButton'; +import { ReportOptions } from './ReportOptions'; import { - validateStart, + getSpecificRange, validateEnd, - getFullRange, validateRange, - getSpecificRange, -} from './Header'; -import { ModeButton } from './ModeButton'; -import { ReportOptions } from './ReportOptions'; + validateStart, +} from './reportRanges'; export function ReportSidebar({ customReportItems, @@ -43,6 +42,7 @@ export function ReportSidebar({ disabledItems, defaultItems, defaultModeItems, + earliestTransaction, }) { const [menuOpen, setMenuOpen] = useState(false); const onSelectRange = cond => { @@ -52,33 +52,34 @@ export function ReportSidebar({ let dateEnd; switch (cond) { case 'All time': - [dateStart, dateEnd] = getFullRange(allIntervals); - onChangeDates(dateStart + '-01', dateEnd + '-01'); + onChangeDates(earliestTransaction, monthUtils.currentDay()); break; case 'Year to date': [dateStart, dateEnd] = validateRange( - allIntervals, - monthUtils.getYearStart(monthUtils.currentMonth()), - monthUtils.currentMonth(), + earliestTransaction, + monthUtils.getYearStart(monthUtils.currentMonth()) + '-01', + monthUtils.currentDay(), ); - onChangeDates(dateStart + '-01', dateEnd + '-01'); + onChangeDates(dateStart, dateEnd); break; case 'Last year': [dateStart, dateEnd] = validateRange( - allIntervals, + earliestTransaction, monthUtils.getYearStart( monthUtils.prevYear(monthUtils.currentMonth()), - ), - monthUtils.getYearEnd(monthUtils.prevYear(monthUtils.currentDate())), + ) + '-01', + monthUtils.getYearEnd(monthUtils.prevYear(monthUtils.currentDate())) + + '-31', ); - onChangeDates(dateStart + '-01', dateEnd + '-01'); + onChangeDates(dateStart, dateEnd); break; default: [dateStart, dateEnd] = getSpecificRange( ReportOptions.dateRangeMap.get(cond), cond === 'Last month' ? 0 : null, + customReportItems.interval, ); - onChangeDates(dateStart + '-01', dateEnd + '-01'); + onChangeDates(dateStart, dateEnd); } }; @@ -214,7 +215,7 @@ export function ReportSidebar({ .map(int => int.description) .includes(customReportItems.dateRange) ) { - setDateRange('Year to date'); + onSelectRange('Year to date'); } }} options={ReportOptions.interval.map(option => [ @@ -379,16 +380,17 @@ export function ReportSidebar({ onChange={newValue => onChangeDates( ...validateStart( - allIntervals, + earliestTransaction, newValue, customReportItems.endDate, + customReportItems.interval, ), ) } value={customReportItems.startDate} defaultLabel={monthUtils.format( customReportItems.startDate, - 'MMMM, yyyy', + ReportOptions.intervalFormat.get(customReportItems.interval), )} options={allIntervals.map(({ name, pretty }) => [name, pretty])} /> @@ -407,16 +409,17 @@ export function ReportSidebar({ onChange={newValue => onChangeDates( ...validateEnd( - allIntervals, + earliestTransaction, customReportItems.startDate, newValue, + customReportItems.interval, ), ) } value={customReportItems.endDate} defaultLabel={monthUtils.format( customReportItems.endDate, - 'MMMM, yyyy', + ReportOptions.intervalFormat.get(customReportItems.interval), )} options={allIntervals.map(({ name, pretty }) => [name, pretty])} /> diff --git a/packages/desktop-client/src/components/reports/ReportSummary.tsx b/packages/desktop-client/src/components/reports/ReportSummary.tsx index 5653a19ce30..48f570c6b3a 100644 --- a/packages/desktop-client/src/components/reports/ReportSummary.tsx +++ b/packages/desktop-client/src/components/reports/ReportSummary.tsx @@ -14,6 +14,8 @@ import { Text } from '../common/Text'; import { View } from '../common/View'; import { PrivacyFilter } from '../PrivacyFilter'; +import { ReportOptions } from './ReportOptions'; + type ReportSummaryProps = { startDate: string; endDate: string; @@ -59,8 +61,15 @@ export function ReportSummary({ fontWeight: 600, }} > - {monthUtils.format(startDate, 'MMM yyyy')} -{' '} - {monthUtils.format(endDate, 'MMM yyyy')} + {monthUtils.format( + startDate, + ReportOptions.intervalFormat.get(interval), + )}{' '} + -{' '} + {monthUtils.format( + endDate, + ReportOptions.intervalFormat.get(interval), + )} - Per {interval === 'Monthly' ? 'month' : 'year'} + Per {ReportOptions.intervalMap.get(interval).toLowerCase()} diff --git a/packages/desktop-client/src/components/reports/reportRanges.ts b/packages/desktop-client/src/components/reports/reportRanges.ts new file mode 100644 index 00000000000..34654db06e4 --- /dev/null +++ b/packages/desktop-client/src/components/reports/reportRanges.ts @@ -0,0 +1,144 @@ +import * as monthUtils from 'loot-core/src/shared/months'; + +export function validateStart( + earliest: string, + start: string, + end: string, + interval: string, +) { + let addDays; + let dateStart; + switch (interval) { + case 'Monthly': + dateStart = start + '-01'; + addDays = 180; + break; + case 'Yearly': + dateStart = start + '-01-01'; + addDays = 1095; + break; + default: + dateStart = start; + addDays = 6; + break; + } + + if (end < start) { + end = monthUtils.addDays(dateStart, addDays); + } + return boundedRange(earliest, dateStart, end, interval); +} + +export function validateEnd( + earliest: string, + start: string, + end: string, + interval: string, +) { + let subDays; + let dateEnd; + switch (interval) { + case 'Monthly': + dateEnd = end + '-31'; + subDays = 180; + break; + case 'Yearly': + dateEnd = end + '-12-31'; + subDays = 1095; + break; + default: + dateEnd = end; + subDays = 6; + break; + } + + if (start > end) { + start = monthUtils.subDays(dateEnd, subDays); + } + return boundedRange(earliest, start, dateEnd, interval); +} + +export function validateRange(earliest: string, start: string, end: string) { + const latest = monthUtils.currentDay(); + if (end > latest) { + end = latest; + } + if (start < earliest) { + start = earliest; + } + return [start, end]; +} + +function boundedRange( + earliest: string, + start: string, + end: string, + interval: string, +) { + let latest; + switch (interval) { + case 'Monthly': + latest = monthUtils.currentMonth() + '-31'; + break; + case 'Yearly': + latest = monthUtils.currentYear() + '-12-31'; + break; + default: + latest = monthUtils.currentDay(); + break; + } + + if (end > latest) { + end = latest; + } + if (start < earliest) { + start = earliest; + } + return [start, end]; +} + +/* +function getLatestRange(offset) { + const end = monthUtils.currentMonth(); + const start = monthUtils.subMonths(end, offset); + return [start, end]; +} +*/ + +export function getSpecificRange( + offset: number, + addNumber: number, + interval: string, +) { + const currentDay = monthUtils.currentDay(); + let currInterval; + let dateStart; + let dateEnd; + switch (interval) { + case 'Monthly': + currInterval = monthUtils.monthFromDate(currentDay); + dateStart = monthUtils.subMonths(currInterval, offset); + dateEnd = monthUtils.addMonths( + dateStart, + addNumber === null ? offset : addNumber, + ); + break; + case 'Yearly': + currInterval = monthUtils.yearFromDate(currentDay); + dateStart = monthUtils.subYears(currInterval, offset); + dateEnd = monthUtils.addYears( + dateStart, + addNumber === null ? offset : addNumber, + ); + break; + default: + currInterval = currentDay; + dateStart = monthUtils.subDays(currInterval, offset); + dateEnd = monthUtils.addDays( + dateStart, + addNumber === null ? offset : addNumber, + ); + break; + } + return [dateStart, dateEnd]; +} diff --git a/packages/desktop-client/src/components/reports/reports/CustomReport.jsx b/packages/desktop-client/src/components/reports/reports/CustomReport.jsx index 59204de675f..3a258ffcc73 100644 --- a/packages/desktop-client/src/components/reports/reports/CustomReport.jsx +++ b/packages/desktop-client/src/components/reports/reports/CustomReport.jsx @@ -83,9 +83,10 @@ export function CustomReport() { const [dataCheck, setDataCheck] = useState(false); const dateRangeLine = ReportOptions.dateRange.length - 3; - const [months, setMonths] = useState( - monthUtils.yearRangeInclusive(startDate, endDate), + const [intervals, setIntervals] = useState( + monthUtils.rangeInclusive(startDate, endDate), ); + const [earliestTransaction, setEarliestTransaction] = useState(''); const [report, setReport] = useState(loadReport); const [savedStatus, setSavedStatus] = useState( location.state ? (location.state.report ? 'saved' : 'new') : 'new', @@ -96,22 +97,19 @@ export function CustomReport() { let end; if (interval === 'Monthly') { - start = monthUtils.subMonths(monthUtils.currentMonth(), 5); - end = monthUtils.currentMonth(); + start = monthUtils.monthFromDate(startDate); + end = monthUtils.monthFromDate(endDate); } if (interval === 'Yearly') { - start = monthUtils.yearFromMonth(startDate); - end = monthUtils.yearFromMonth(endDate); + start = monthUtils.yearFromDate(startDate); + end = monthUtils.yearFromDate(endDate); } const rangeInc = interval === 'Monthly' ? 'rangeInclusive' : 'yearRangeInclusive'; - setMonths(monthUtils[rangeInc](start, end)); - - setStartDate(start); - setEndDate(end); - }, [interval]); + setIntervals(monthUtils[rangeInc](start, end)); + }, [interval, startDate, endDate]); useEffect(() => { if (selectedCategories === undefined && categories.list.length !== 0) { @@ -123,36 +121,40 @@ export function CustomReport() { async function run() { report.conditions.forEach(condition => onApplyFilter(condition)); const trans = await send('get-earliest-transaction'); - const currentMonth = - interval === 'Monthly' - ? monthUtils.currentMonth() - : monthUtils.currentYear(); - let earliestMonth = trans - ? monthUtils.monthFromDate(d.parseISO(fromDateRepr(trans.date))) - : currentMonth; - - // Make sure the month selects are at least populates with a - // year's worth of months. We can undo this when we have fancier - // date selects. - const rangeInc = - interval === 'Monthly' ? 'rangeInclusive' : 'yearRangeInclusive'; - const sub = interval === 'Monthly' ? 'subMonths' : 'subYears'; - const yearAgo = monthUtils[sub]( - currentMonth, - interval === 'Monthly' ? 12 : 1, - ); - if (earliestMonth > yearAgo) { - earliestMonth = yearAgo; + setEarliestTransaction(trans ? trans.date : monthUtils.currentDay()); + let rangeInc; + let currentInterval; + let earliestInterval; + switch (interval) { + case 'Monthly': + currentInterval = monthUtils.currentMonth(); + earliestInterval = trans + ? monthUtils.monthFromDate(d.parseISO(fromDateRepr(trans.date))) + : currentInterval; + rangeInc = 'rangeInclusive'; + break; + case 'Yearly': + currentInterval = monthUtils.currentYear(); + earliestInterval = trans + ? monthUtils.yearFromDate(d.parseISO(fromDateRepr(trans.date))) + : currentInterval; + rangeInc = 'yearRangeInclusive'; + break; + default: + currentInterval = monthUtils.currentDay(); + earliestInterval = trans + ? monthUtils.dayFromDate(d.parseISO(fromDateRepr(trans.date))) + : currentInterval; + rangeInc = 'dayRangeInclusive'; } - const allInter = monthUtils - .rangeInclusive(earliestMonth, monthUtils.currentMonth()) - .map(month => ({ - name: month, - pretty: - interval === 'Monthly' - ? monthUtils.format(month, 'MMMM, yyyy') - : month, + const allInter = monthUtils[rangeInc](earliestInterval, currentInterval) + .map(inter => ({ + name: inter, + pretty: monthUtils.format( + inter, + ReportOptions.intervalFormat.get(interval), + ), })) .reverse(); @@ -171,7 +173,6 @@ export function CustomReport() { endDate, interval, categories, - interval, selectedCategories, conditions: filters, conditionsOp, @@ -184,6 +185,7 @@ export function CustomReport() { }, [ startDate, endDate, + interval, groupBy, balanceType, categories, @@ -206,7 +208,6 @@ export function CustomReport() { endDate, interval, categories, - interval, selectedCategories, conditions: filters, conditionsOp, @@ -224,6 +225,7 @@ export function CustomReport() { }, [ startDate, endDate, + interval, groupBy, balanceType, categories, @@ -457,6 +459,7 @@ export function CustomReport() { disabledItems={disabledItems} defaultItems={defaultItems} defaultModeItems={defaultModeItems} + earliestTransaction={earliestTransaction} /> data), runQuery( @@ -114,14 +111,17 @@ export function createCustomSpreadsheet({ categoryFilter, conditionsOpKey, filters, - interval, ), ).then(({ data }) => data), ]); const rangeInc = interval === 'Monthly' ? 'rangeInclusive' : 'yearRangeInclusive'; - const intervals = monthUtils[rangeInc](startDate, endDate); + const format = interval === 'Monthly' ? 'monthFromDate' : 'yearFromDate'; + const intervals = monthUtils[rangeInc]( + monthUtils[format](startDate), + monthUtils[format](endDate), + ); let totalAssets = 0; let totalDebts = 0; 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 39e8d96234d..d7b90903fb6 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/grouped-spreadsheet.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/grouped-spreadsheet.ts @@ -18,7 +18,6 @@ export function createGroupedSpreadsheet({ endDate, interval, categories, - interval, selectedCategories, conditions = [], conditionsOp, @@ -59,7 +58,6 @@ export function createGroupedSpreadsheet({ categoryFilter, conditionsOpKey, filters, - interval, ), ).then(({ data }) => data), runQuery( @@ -72,14 +70,17 @@ export function createGroupedSpreadsheet({ categoryFilter, conditionsOpKey, filters, - interval, ), ).then(({ data }) => data), ]); const rangeInc = interval === 'Monthly' ? 'rangeInclusive' : 'yearRangeInclusive'; - const intervals = monthUtils[rangeInc](startDate, endDate); + const format = interval === 'Monthly' ? 'monthFromDate' : 'yearFromDate'; + const intervals = monthUtils[rangeInc]( + monthUtils[format](startDate), + monthUtils[format](endDate), + ); const groupedData: GroupedEntity[] = categoryGroup.map( group => { diff --git a/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts b/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts index 3d8e986b3f1..3b33809d7d0 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts @@ -1,4 +1,3 @@ -import { monthFromDate } from 'loot-core/shared/months'; import { q } from 'loot-core/src/shared/query'; import { type CategoryEntity } from 'loot-core/src/types/models'; @@ -15,9 +14,7 @@ export function makeQuery( const intervalGroup = interval === 'Monthly' ? { $month: '$date' } : { $year: '$date' }; const intervalFilter = interval === 'Monthly' ? '$month' : '$year'; - const dateStart = - interval === 'Monthly' ? monthFromDate(startDate) : startDate; - const dateEnd = interval === 'Monthly' ? monthFromDate(endDate) : endDate; + const query = q('transactions') //Apply Category_Selector .filter( @@ -39,8 +36,8 @@ export function makeQuery( //Apply month range filters .filter({ $and: [ - { date: { $transform: intervalFilter, $gte: dateStart } }, - { date: { $transform: intervalFilter, $lte: dateEnd } }, + { date: { $transform: intervalFilter, $gte: startDate } }, + { date: { $transform: intervalFilter, $lte: endDate } }, ], }) //Show assets or debts diff --git a/packages/desktop-client/src/components/reports/spreadsheets/recalculate.ts b/packages/desktop-client/src/components/reports/spreadsheets/recalculate.ts index d44957a376c..f8c52889db2 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/recalculate.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/recalculate.ts @@ -8,7 +8,6 @@ import { filterHiddenItems } from './filterHiddenItems'; type recalculateProps = { item; intervals: Array; - intervals: Array; assets: QueryDataEntity[]; debts: QueryDataEntity[]; groupByLabel: string; @@ -20,7 +19,6 @@ type recalculateProps = { export function recalculate({ item, intervals, - intervals, assets, debts, groupByLabel, @@ -30,11 +28,9 @@ export function recalculate({ }: recalculateProps) { let totalAssets = 0; let totalDebts = 0; - const intervalData = intervals.reduce((arr, interval) => { const intervalData = intervals.reduce((arr, inter) => { const last = arr.length === 0 ? null : arr[arr.length - 1]; - const intervalAssets = filterHiddenItems( const intervalAssets = filterHiddenItems( item, assets, @@ -44,14 +40,11 @@ export function recalculate({ ) .filter( asset => - asset.date === interval && asset[groupByLabel] === (item.id ?? null), asset.date === inter && asset[groupByLabel] === (item.id ?? null), ) .reduce((a, v) => (a = a + v.amount), 0); totalAssets += intervalAssets; - totalAssets += intervalAssets; - const intervalDebts = filterHiddenItems( const intervalDebts = filterHiddenItems( item, debts, @@ -60,23 +53,16 @@ export function recalculate({ showUncategorized, ) .filter( - debt => - debt.date === interval && debt[groupByLabel] === (item.id ?? null), debt => debt.date === inter && debt[groupByLabel] === (item.id ?? null), ) .reduce((a, v) => (a = a + v.amount), 0); totalDebts += intervalDebts; - totalDebts += intervalDebts; const change = last - ? intervalAssets + intervalDebts - amountToInteger(last.totalTotals) ? intervalAssets + intervalDebts - amountToInteger(last.totalTotals) : 0; arr.push({ - totalAssets: integerToAmount(intervalAssets), - totalDebts: integerToAmount(intervalDebts), - totalTotals: integerToAmount(intervalAssets + intervalDebts), totalAssets: integerToAmount(intervalAssets), totalDebts: integerToAmount(intervalDebts), totalTotals: integerToAmount(intervalAssets + intervalDebts), From 44731e84bdcfc5811904e92d7066ffcc147806c9 Mon Sep 17 00:00:00 2001 From: carkom Date: Tue, 19 Mar 2024 09:55:11 +0000 Subject: [PATCH 21/36] ts updates --- .../src/components/reports/Header.jsx | 66 +++++++------------ .../src/components/reports/reportRanges.ts | 63 +++++++++++------- .../reports/spreadsheets/calculateLegend.ts | 10 +-- 3 files changed, 69 insertions(+), 70 deletions(-) diff --git a/packages/desktop-client/src/components/reports/Header.jsx b/packages/desktop-client/src/components/reports/Header.jsx index 12ce09f31f7..2e9fa94a461 100644 --- a/packages/desktop-client/src/components/reports/Header.jsx +++ b/packages/desktop-client/src/components/reports/Header.jsx @@ -11,44 +11,12 @@ import { View } from '../common/View'; import { AppliedFilters } from '../filters/AppliedFilters'; import { FilterButton } from '../filters/FiltersMenu'; -function validateStart(allMonths, start, end) { - const earliest = allMonths[allMonths.length - 1].name; - if (end < start) { - end = monthUtils.addMonths(start, 6); - } - return boundedRange(earliest, start, end); -} - -function validateEnd(allMonths, start, end) { - const earliest = allMonths[allMonths.length - 1].name; - if (start > end) { - start = monthUtils.subMonths(end, 6); - } - return boundedRange(earliest, start, end); -} - -function boundedRange(earliest, start, end) { - const latest = monthUtils.currentMonth(); - if (end > latest) { - end = latest; - } - if (start < earliest) { - start = earliest; - } - return [start, end]; -} - -function getLatestRange(offset) { - const end = monthUtils.currentMonth(); - const start = monthUtils.subMonths(end, offset); - return [start, end]; -} - -function getFullRange(allMonths) { - const start = allMonths[allMonths.length - 1].name; - const end = monthUtils.currentMonth(); - return [start, end]; -} +import { + getFullRange, + getLatestRange, + validateEnd, + validateStart, +} from './reportRanges'; export function Header({ title, @@ -106,7 +74,13 @@ export function Header({ > - onChangeDates(...validateEnd(allMonths, start, newValue)) + onChangeDates( + ...validateEnd( + allMonths[allMonths.length - 1].name, + start, + newValue, + ), + ) } value={end} options={allMonths.map(({ name, pretty }) => [name, pretty])} @@ -152,7 +132,11 @@ export function Header({ diff --git a/packages/desktop-client/src/components/reports/reportRanges.ts b/packages/desktop-client/src/components/reports/reportRanges.ts index 34654db06e4..ae0e1a33bcf 100644 --- a/packages/desktop-client/src/components/reports/reportRanges.ts +++ b/packages/desktop-client/src/components/reports/reportRanges.ts @@ -4,7 +4,7 @@ export function validateStart( earliest: string, start: string, end: string, - interval: string, + interval?: string, ) { let addDays; let dateStart; @@ -17,23 +17,32 @@ export function validateStart( dateStart = start + '-01-01'; addDays = 1095; break; - default: + case 'Daily': dateStart = start; addDays = 6; break; + default: + dateStart = start; + addDays = 180; + break; } if (end < start) { end = monthUtils.addDays(dateStart, addDays); } - return boundedRange(earliest, dateStart, end, interval); + return boundedRange( + earliest, + dateStart, + interval ? end : monthUtils.monthFromDate(end), + interval, + ); } export function validateEnd( earliest: string, start: string, end: string, - interval: string, + interval?: string, ) { let subDays; let dateEnd; @@ -46,16 +55,25 @@ export function validateEnd( dateEnd = end + '-12-31'; subDays = 1095; break; - default: + case 'Daily': dateEnd = end; subDays = 6; break; + default: + dateEnd = end; + subDays = 180; + break; } if (start > end) { start = monthUtils.subDays(dateEnd, subDays); } - return boundedRange(earliest, start, dateEnd, interval); + return boundedRange( + earliest, + interval ? start : monthUtils.monthFromDate(start), + dateEnd, + interval, + ); } export function validateRange(earliest: string, start: string, end: string) { @@ -73,7 +91,7 @@ function boundedRange( earliest: string, start: string, end: string, - interval: string, + interval?: string, ) { let latest; switch (interval) { @@ -81,10 +99,10 @@ function boundedRange( latest = monthUtils.currentMonth() + '-31'; break; case 'Yearly': - latest = monthUtils.currentYear() + '-12-31'; + latest = monthUtils.currentDay(); break; default: - latest = monthUtils.currentDay(); + latest = monthUtils.currentMonth(); break; } @@ -97,14 +115,6 @@ function boundedRange( return [start, end]; } -/* -function getLatestRange(offset) { - const end = monthUtils.currentMonth(); - const start = monthUtils.subMonths(end, offset); - return [start, end]; -} -*/ - export function getSpecificRange( offset: number, addNumber: number, @@ -123,14 +133,6 @@ export function getSpecificRange( addNumber === null ? offset : addNumber, ); break; - case 'Yearly': - currInterval = monthUtils.yearFromDate(currentDay); - dateStart = monthUtils.subYears(currInterval, offset); - dateEnd = monthUtils.addYears( - dateStart, - addNumber === null ? offset : addNumber, - ); - break; default: currInterval = currentDay; dateStart = monthUtils.subDays(currInterval, offset); @@ -142,3 +144,14 @@ export function getSpecificRange( } return [dateStart, dateEnd]; } + +export function getFullRange(start: string) { + const end = monthUtils.currentMonth(); + return [start, end]; +} + +export function getLatestRange(offset: number) { + const end = monthUtils.currentMonth(); + const start = monthUtils.subMonths(end, offset); + return [start, end]; +} diff --git a/packages/desktop-client/src/components/reports/spreadsheets/calculateLegend.ts b/packages/desktop-client/src/components/reports/spreadsheets/calculateLegend.ts index 0b3a2646bbc..db3976bd9d0 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/calculateLegend.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/calculateLegend.ts @@ -1,4 +1,3 @@ -// @ts-strict-ignore import { type IntervalData, type ItemEntity, @@ -15,10 +14,13 @@ export function calculateLegend( balanceTypeOp: string, ) { const colorScale = getColorScale('qualitative'); - const chooseData = groupBy === 'Interval' ? intervalData : calcDataFiltered; - return chooseData.map((c, index) => { + const chooseData = + groupBy === 'Interval' + ? intervalData.map(c => c.date) + : calcDataFiltered.map(c => c.name); + return chooseData.map((name, index) => { return { - name: groupBy === 'Interval' ? c.date : c.name, + name, color: graphType === 'DonutGraph' ? colorScale[index % colorScale.length] From c81b85c39c4385c70e622e821a7309e08cd47198 Mon Sep 17 00:00:00 2001 From: carkom Date: Tue, 19 Mar 2024 10:29:20 +0000 Subject: [PATCH 22/36] lint fix --- packages/desktop-client/src/components/reports/reportRanges.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/desktop-client/src/components/reports/reportRanges.ts b/packages/desktop-client/src/components/reports/reportRanges.ts index ae0e1a33bcf..341da676bf9 100644 --- a/packages/desktop-client/src/components/reports/reportRanges.ts +++ b/packages/desktop-client/src/components/reports/reportRanges.ts @@ -155,3 +155,4 @@ export function getLatestRange(offset: number) { const start = monthUtils.subMonths(end, offset); return [start, end]; } + \ No newline at end of file From 19e5b22fd2dbd2fe4c0a60ed52a85fc318852c85 Mon Sep 17 00:00:00 2001 From: carkom Date: Wed, 20 Mar 2024 09:12:15 +0000 Subject: [PATCH 23/36] merge fixes --- .../src/components/reports/ReportOptions.ts | 2 +- .../reports/graphs/tableGraph/ReportTableRow.tsx | 10 +++++----- .../src/components/reports/reportRanges.ts | 1 - .../reports/spreadsheets/custom-spreadsheet.ts | 12 +++++++----- .../reports/spreadsheets/grouped-spreadsheet.ts | 10 ++++++---- .../components/reports/spreadsheets/recalculate.ts | 11 +++++++---- upcoming-release-notes/2479.md | 6 ++++++ 7 files changed, 32 insertions(+), 20 deletions(-) create mode 100644 upcoming-release-notes/2479.md diff --git a/packages/desktop-client/src/components/reports/ReportOptions.ts b/packages/desktop-client/src/components/reports/ReportOptions.ts index 94c9dda21f7..3336728ea38 100644 --- a/packages/desktop-client/src/components/reports/ReportOptions.ts +++ b/packages/desktop-client/src/components/reports/ReportOptions.ts @@ -8,7 +8,7 @@ import { } from 'loot-core/src/types/models'; const startDate = monthUtils.subMonths(monthUtils.currentMonth(), 5) + '-01'; -const endDate = monthUtils.currentMonth() + '-01'; +const endDate = monthUtils.currentDay(); export const defaultReport: CustomReportEntity = { id: '', 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 e997ca5ee1c..fabe9698f43 100644 --- a/packages/desktop-client/src/components/reports/graphs/tableGraph/ReportTableRow.tsx +++ b/packages/desktop-client/src/components/reports/graphs/tableGraph/ReportTableRow.tsx @@ -53,18 +53,18 @@ export const ReportTableRow = memo( valueStyle={compactStyle} /> {item.intervalData && mode === 'time' - ? item.intervalData.map(inter => { + ? item.intervalData.map(intervalItem => { return ( 100000 - ? amountToCurrency(inter[balanceTypeOp]) + Math.abs(intervalItem[balanceTypeOp]) > 100000 + ? amountToCurrency(intervalItem[balanceTypeOp]) : undefined } width="flex" diff --git a/packages/desktop-client/src/components/reports/reportRanges.ts b/packages/desktop-client/src/components/reports/reportRanges.ts index 341da676bf9..ae0e1a33bcf 100644 --- a/packages/desktop-client/src/components/reports/reportRanges.ts +++ b/packages/desktop-client/src/components/reports/reportRanges.ts @@ -155,4 +155,3 @@ export function getLatestRange(offset: number) { const start = monthUtils.subMonths(end, offset); return [start, end]; } - \ No newline at end of file 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 f9ddcb16073..9d03d9ccf55 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/custom-spreadsheet.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/custom-spreadsheet.ts @@ -126,7 +126,7 @@ export function createCustomSpreadsheet({ let totalAssets = 0; let totalDebts = 0; - const intervalData = intervals.reduce((arr, inter) => { + const intervalData = intervals.reduce((arr, intervalItem) => { let perIntervalAssets = 0; let perIntervalDebts = 0; const stacked = {}; @@ -143,7 +143,8 @@ export function createCustomSpreadsheet({ ) .filter( asset => - asset.date === inter && asset[groupByLabel] === (item.id ?? null), + asset.date === intervalItem && + asset[groupByLabel] === (item.id ?? null), ) .reduce((a, v) => (a = a + v.amount), 0); perIntervalAssets += intervalAssets; @@ -157,7 +158,8 @@ export function createCustomSpreadsheet({ ) .filter( debt => - debt.date === inter && debt[groupByLabel] === (item.id ?? null), + debt.date === intervalItem && + debt[groupByLabel] === (item.id ?? null), ) .reduce((a, v) => (a = a + v.amount), 0); perIntervalDebts += intervalDebts; @@ -181,8 +183,8 @@ export function createCustomSpreadsheet({ date: interval === 'Monthly' ? // eslint-disable-next-line rulesdir/typography - d.format(d.parseISO(`${inter}-01`), "MMM ''yy") - : inter, + d.format(d.parseISO(`${intervalItem}-01`), "MMM ''yy") + : intervalItem, ...stacked, totalDebts: integerToAmount(perIntervalDebts), totalAssets: integerToAmount(perIntervalAssets), 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 d7b90903fb6..57baa600986 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/grouped-spreadsheet.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/grouped-spreadsheet.ts @@ -87,7 +87,7 @@ export function createGroupedSpreadsheet({ let totalAssets = 0; let totalDebts = 0; - const intervalData = intervals.reduce((arr, inter) => { + const intervalData = intervals.reduce((arr, intervalItem) => { let groupedAssets = 0; let groupedDebts = 0; @@ -101,7 +101,8 @@ export function createGroupedSpreadsheet({ ) .filter( asset => - asset.date === inter && asset.category === (item.id ?? null), + asset.date === intervalItem && + asset.category === (item.id ?? null), ) .reduce((a, v) => (a = a + v.amount), 0); groupedAssets += intervalAssets; @@ -115,7 +116,8 @@ export function createGroupedSpreadsheet({ ) .filter( debts => - debts.date === inter && debts.category === (item.id ?? null), + debts.date === intervalItem && + debts.category === (item.id ?? null), ) .reduce((a, v) => (a = a + v.amount), 0); groupedDebts += intervalDebts; @@ -125,7 +127,7 @@ export function createGroupedSpreadsheet({ totalDebts += groupedDebts; arr.push({ - date: inter, + date: intervalItem, totalAssets: integerToAmount(groupedAssets), totalDebts: integerToAmount(groupedDebts), totalTotals: integerToAmount(groupedDebts + groupedAssets), diff --git a/packages/desktop-client/src/components/reports/spreadsheets/recalculate.ts b/packages/desktop-client/src/components/reports/spreadsheets/recalculate.ts index f8c52889db2..a19ed597310 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/recalculate.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/recalculate.ts @@ -28,7 +28,7 @@ export function recalculate({ }: recalculateProps) { let totalAssets = 0; let totalDebts = 0; - const intervalData = intervals.reduce((arr, inter) => { + const intervalData = intervals.reduce((arr, intervalItem) => { const last = arr.length === 0 ? null : arr[arr.length - 1]; const intervalAssets = filterHiddenItems( @@ -40,7 +40,8 @@ export function recalculate({ ) .filter( asset => - asset.date === inter && asset[groupByLabel] === (item.id ?? null), + asset.date === intervalItem && + asset[groupByLabel] === (item.id ?? null), ) .reduce((a, v) => (a = a + v.amount), 0); totalAssets += intervalAssets; @@ -53,7 +54,9 @@ export function recalculate({ showUncategorized, ) .filter( - debt => debt.date === inter && debt[groupByLabel] === (item.id ?? null), + debt => + debt.date === intervalItem && + debt[groupByLabel] === (item.id ?? null), ) .reduce((a, v) => (a = a + v.amount), 0); totalDebts += intervalDebts; @@ -67,7 +70,7 @@ export function recalculate({ totalDebts: integerToAmount(intervalDebts), totalTotals: integerToAmount(intervalAssets + intervalDebts), change, - dateLookup: inter, + dateLookup: intervalItem, }); return arr; diff --git a/upcoming-release-notes/2479.md b/upcoming-release-notes/2479.md new file mode 100644 index 00000000000..4bb65c35122 --- /dev/null +++ b/upcoming-release-notes/2479.md @@ -0,0 +1,6 @@ +--- +category: Maintenance +authors: [carkom] +--- + +Changing custom reports variable naming from "months" to "interval" so it's less confusing when adding new intervals From ee4c72d5df9534ae2543a7d76fd9c7d45c834be0 Mon Sep 17 00:00:00 2001 From: carkom Date: Wed, 20 Mar 2024 09:27:17 +0000 Subject: [PATCH 24/36] notes --- upcoming-release-notes/2466.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/upcoming-release-notes/2466.md b/upcoming-release-notes/2466.md index 087f1d1d862..17be3c75e40 100644 --- a/upcoming-release-notes/2466.md +++ b/upcoming-release-notes/2466.md @@ -3,4 +3,4 @@ category: Enhancements authors: [carkom] --- -Enable "yearly" interval to custom reports. Also sets-up groudwork for adding weekly/daily in the near future. +Enable "yearly" interval to custom reports. Also sets-up groudwork for adding weekly/daily in the near future From 5feb103371e77423984570677349dd6a3dbb971d Mon Sep 17 00:00:00 2001 From: carkom Date: Wed, 20 Mar 2024 10:43:11 +0000 Subject: [PATCH 25/36] simplify lookups --- .../src/components/reports/ReportOptions.ts | 17 ++++- .../src/components/reports/ReportSidebar.jsx | 1 - .../src/components/reports/reportRanges.ts | 32 ++-------- .../reports/reports/CustomReport.jsx | 63 +++++++------------ .../spreadsheets/custom-spreadsheet.ts | 13 ++-- .../spreadsheets/grouped-spreadsheet.ts | 9 ++- .../reports/spreadsheets/makeQuery.ts | 5 +- packages/loot-core/src/shared/months.ts | 4 ++ 8 files changed, 62 insertions(+), 82 deletions(-) diff --git a/packages/desktop-client/src/components/reports/ReportOptions.ts b/packages/desktop-client/src/components/reports/ReportOptions.ts index 3336728ea38..cf6e8becdfb 100644 --- a/packages/desktop-client/src/components/reports/ReportOptions.ts +++ b/packages/desktop-client/src/components/reports/ReportOptions.ts @@ -64,8 +64,18 @@ const intervalOptions = [ //{ value: 1, description: 'Daily', name: 'Day'}, //{ value: 2, description: 'Weekly', name: 'Week'}, //{ value: 3, description: 'Fortnightly', name: 3}, - { description: 'Monthly', name: 'Month', format: 'MMMM, yyyy' }, - { description: 'Yearly', name: 'Year', format: 'yyyy' }, + { + description: 'Monthly', + name: 'Month', + format: 'MMMM, yyyy', + range: 'rangeInclusive', + }, + { + description: 'Yearly', + name: 'Year', + format: 'yyyy', + range: 'yearRangeInclusive', + }, ]; export const ReportOptions = { @@ -85,6 +95,9 @@ export const ReportOptions = { intervalFormat: new Map( intervalOptions.map(item => [item.description, item.format]), ), + intervalRange: new Map( + intervalOptions.map(item => [item.description, item.range]), + ), }; export type QueryDataEntity = { diff --git a/packages/desktop-client/src/components/reports/ReportSidebar.jsx b/packages/desktop-client/src/components/reports/ReportSidebar.jsx index 43e742aa291..e916183c79e 100644 --- a/packages/desktop-client/src/components/reports/ReportSidebar.jsx +++ b/packages/desktop-client/src/components/reports/ReportSidebar.jsx @@ -77,7 +77,6 @@ export function ReportSidebar({ [dateStart, dateEnd] = getSpecificRange( ReportOptions.dateRangeMap.get(cond), cond === 'Last month' ? 0 : null, - customReportItems.interval, ); onChangeDates(dateStart, dateEnd); } diff --git a/packages/desktop-client/src/components/reports/reportRanges.ts b/packages/desktop-client/src/components/reports/reportRanges.ts index ae0e1a33bcf..52a79c1d211 100644 --- a/packages/desktop-client/src/components/reports/reportRanges.ts +++ b/packages/desktop-client/src/components/reports/reportRanges.ts @@ -115,33 +115,13 @@ function boundedRange( return [start, end]; } -export function getSpecificRange( - offset: number, - addNumber: number, - interval: string, -) { +export function getSpecificRange(offset: number, addNumber: number) { const currentDay = monthUtils.currentDay(); - let currInterval; - let dateStart; - let dateEnd; - switch (interval) { - case 'Monthly': - currInterval = monthUtils.monthFromDate(currentDay); - dateStart = monthUtils.subMonths(currInterval, offset); - dateEnd = monthUtils.addMonths( - dateStart, - addNumber === null ? offset : addNumber, - ); - break; - default: - currInterval = currentDay; - dateStart = monthUtils.subDays(currInterval, offset); - dateEnd = monthUtils.addDays( - dateStart, - addNumber === null ? offset : addNumber, - ); - break; - } + const dateStart = monthUtils.subMonths(currentDay, offset) + '-01'; + const dateEnd = monthUtils.getMonthEnd( + monthUtils.addMonths(dateStart, addNumber === null ? offset : addNumber) + + '-01', + ); return [dateStart, dateEnd]; } diff --git a/packages/desktop-client/src/components/reports/reports/CustomReport.jsx b/packages/desktop-client/src/components/reports/reports/CustomReport.jsx index 3a258ffcc73..10d60460914 100644 --- a/packages/desktop-client/src/components/reports/reports/CustomReport.jsx +++ b/packages/desktop-client/src/components/reports/reports/CustomReport.jsx @@ -81,7 +81,8 @@ export function CustomReport() { const [dateRange, setDateRange] = useState(loadReport.dateRange); const [dataCheck, setDataCheck] = useState(false); - const dateRangeLine = ReportOptions.dateRange.length - 3; + const dateRangeLine = + ReportOptions.dateRange.filter(f => f[interval]).length - 3; const [intervals, setIntervals] = useState( monthUtils.rangeInclusive(startDate, endDate), @@ -93,22 +94,15 @@ export function CustomReport() { ); useEffect(() => { - let start; - let end; + const format = + ReportOptions.intervalMap.get(interval).toLowerCase() + 'FromDate'; - if (interval === 'Monthly') { - start = monthUtils.monthFromDate(startDate); - end = monthUtils.monthFromDate(endDate); - } - - if (interval === 'Yearly') { - start = monthUtils.yearFromDate(startDate); - end = monthUtils.yearFromDate(endDate); - } + const dateStart = monthUtils[format](startDate); + const dateEnd = monthUtils[format](endDate); - const rangeInc = - interval === 'Monthly' ? 'rangeInclusive' : 'yearRangeInclusive'; - setIntervals(monthUtils[rangeInc](start, end)); + setIntervals( + monthUtils[ReportOptions.intervalRange.get(interval)](dateStart, dateEnd), + ); }, [interval, startDate, endDate]); useEffect(() => { @@ -122,33 +116,18 @@ export function CustomReport() { report.conditions.forEach(condition => onApplyFilter(condition)); const trans = await send('get-earliest-transaction'); setEarliestTransaction(trans ? trans.date : monthUtils.currentDay()); - let rangeInc; - let currentInterval; - let earliestInterval; - switch (interval) { - case 'Monthly': - currentInterval = monthUtils.currentMonth(); - earliestInterval = trans - ? monthUtils.monthFromDate(d.parseISO(fromDateRepr(trans.date))) - : currentInterval; - rangeInc = 'rangeInclusive'; - break; - case 'Yearly': - currentInterval = monthUtils.currentYear(); - earliestInterval = trans - ? monthUtils.yearFromDate(d.parseISO(fromDateRepr(trans.date))) - : currentInterval; - rangeInc = 'yearRangeInclusive'; - break; - default: - currentInterval = monthUtils.currentDay(); - earliestInterval = trans - ? monthUtils.dayFromDate(d.parseISO(fromDateRepr(trans.date))) - : currentInterval; - rangeInc = 'dayRangeInclusive'; - } - - const allInter = monthUtils[rangeInc](earliestInterval, currentInterval) + const format = + ReportOptions.intervalMap.get(interval).toLowerCase() + 'FromDate'; + const currentInterval = + monthUtils['current' + ReportOptions.intervalMap.get(interval)](); + const earliestInterval = trans + ? monthUtils[format](d.parseISO(fromDateRepr(trans.date))) + : currentInterval; + + const allInter = monthUtils[ReportOptions.intervalRange.get(interval)]( + earliestInterval, + currentInterval, + ) .map(inter => ({ name: inter, pretty: monthUtils.format( 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 9d03d9ccf55..460e0d2a2a3 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/custom-spreadsheet.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/custom-spreadsheet.ts @@ -13,7 +13,11 @@ import { type CategoryGroupEntity, } from 'loot-core/src/types/models'; -import { categoryLists, groupBySelections } from '../ReportOptions'; +import { + categoryLists, + groupBySelections, + ReportOptions, +} from '../ReportOptions'; import { calculateLegend } from './calculateLegend'; import { filterEmptyRows } from './filterEmptyRows'; @@ -115,10 +119,9 @@ export function createCustomSpreadsheet({ ).then(({ data }) => data), ]); - const rangeInc = - interval === 'Monthly' ? 'rangeInclusive' : 'yearRangeInclusive'; - const format = interval === 'Monthly' ? 'monthFromDate' : 'yearFromDate'; - const intervals = monthUtils[rangeInc]( + const format = + ReportOptions.intervalMap.get(interval).toLowerCase() + 'FromDate'; + const intervals = monthUtils[ReportOptions.intervalRange.get(interval)]( monthUtils[format](startDate), monthUtils[format](endDate), ); 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 57baa600986..960c727c177 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/grouped-spreadsheet.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/grouped-spreadsheet.ts @@ -5,7 +5,7 @@ import * as monthUtils from 'loot-core/src/shared/months'; import { integerToAmount } from 'loot-core/src/shared/util'; import { type GroupedEntity } from 'loot-core/src/types/models/reports'; -import { categoryLists } from '../ReportOptions'; +import { categoryLists, ReportOptions } from '../ReportOptions'; import { type createCustomSpreadsheetProps } from './custom-spreadsheet'; import { filterEmptyRows } from './filterEmptyRows'; @@ -74,10 +74,9 @@ export function createGroupedSpreadsheet({ ).then(({ data }) => data), ]); - const rangeInc = - interval === 'Monthly' ? 'rangeInclusive' : 'yearRangeInclusive'; - const format = interval === 'Monthly' ? 'monthFromDate' : 'yearFromDate'; - const intervals = monthUtils[rangeInc]( + const format = + ReportOptions.intervalMap.get(interval).toLowerCase() + 'FromDate'; + const intervals = monthUtils[ReportOptions.intervalRange.get(interval)]( monthUtils[format](startDate), monthUtils[format](endDate), ); diff --git a/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts b/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts index 3b33809d7d0..31f1e8b7f8b 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts @@ -1,6 +1,8 @@ import { q } from 'loot-core/src/shared/query'; import { type CategoryEntity } from 'loot-core/src/types/models'; +import { ReportOptions } from '../ReportOptions'; + export function makeQuery( name: string, startDate: string, @@ -13,7 +15,8 @@ export function makeQuery( ) { const intervalGroup = interval === 'Monthly' ? { $month: '$date' } : { $year: '$date' }; - const intervalFilter = interval === 'Monthly' ? '$month' : '$year'; + const intervalFilter = + '$' + ReportOptions.intervalMap.get(interval)?.toLowerCase() || 'month'; const query = q('transactions') //Apply Category_Selector diff --git a/packages/loot-core/src/shared/months.ts b/packages/loot-core/src/shared/months.ts index 995c8345d77..488e4d72cd5 100644 --- a/packages/loot-core/src/shared/months.ts +++ b/packages/loot-core/src/shared/months.ts @@ -292,6 +292,10 @@ export function getMonth(day: string): string { return day.slice(0, 7); } +export function getMonthEnd(day: string): string { + return subDays(nextMonth(day.slice(0, 7)) + '-01', 1); +} + export function getYearStart(month: string): string { return getYear(month) + '-01'; } From 68094078a066db2b51120d53fe671f462c694827 Mon Sep 17 00:00:00 2001 From: carkom Date: Thu, 21 Mar 2024 09:34:38 +0000 Subject: [PATCH 26/36] Add Daily and Weekly --- .../src/components/reports/ReportOptions.ts | 103 ++++++++++++++++-- .../src/components/reports/ReportSidebar.jsx | 8 +- .../src/components/reports/ReportSummary.tsx | 16 ++- .../src/components/reports/disabledList.ts | 22 ++++ .../src/components/reports/reportRanges.ts | 35 +++++- .../reports/spreadsheets/makeQuery.ts | 8 +- packages/loot-core/src/server/aql/compiler.ts | 35 ++++++ .../src/server/aql/schema-helpers.ts | 6 +- packages/loot-core/src/shared/months.ts | 43 +++++++- 9 files changed, 250 insertions(+), 26 deletions(-) diff --git a/packages/desktop-client/src/components/reports/ReportOptions.ts b/packages/desktop-client/src/components/reports/ReportOptions.ts index cf6e8becdfb..4f58c81def3 100644 --- a/packages/desktop-client/src/components/reports/ReportOptions.ts +++ b/packages/desktop-client/src/components/reports/ReportOptions.ts @@ -45,24 +45,106 @@ const groupByOptions = [ ]; const dateRangeOptions = [ - { description: 'This month', name: 0, Yearly: false, Monthly: true }, - { description: 'Last month', name: 1, Yearly: false, Monthly: true }, - { description: 'Last 3 months', name: 2, Yearly: false, Monthly: true }, - { description: 'Last 6 months', name: 5, Yearly: false, Monthly: true }, - { description: 'Last 12 months', name: 11, Yearly: false, Monthly: true }, + { + description: 'This week', + type: 'Weeks', + name: 0, + Yearly: false, + Monthly: false, + Daily: true, + Weekly: true, + }, + { + description: 'Last week', + type: 'Weeks', + name: 1, + Yearly: false, + Monthly: false, + Daily: true, + Weekly: true, + }, + { + description: 'This month', + type: 'Months', + name: 0, + Yearly: false, + Monthly: true, + Daily: true, + Weekly: true, + }, + { + description: 'Last month', + type: 'Months', + name: 1, + Yearly: false, + Monthly: true, + Daily: true, + Weekly: true, + }, + { + description: 'Last 3 months', + type: 'Months', + name: 2, + Yearly: false, + Monthly: true, + Daily: true, + Weekly: true, + }, + { + description: 'Last 6 months', + type: 'Months', + name: 5, + Yearly: false, + Monthly: true, + Daily: false, + }, + { + description: 'Last 12 months', + type: 'Months', + name: 11, + Yearly: false, + Monthly: true, + Daily: false, + }, { description: 'Year to date', name: 'yearToDate', Yearly: true, Monthly: true, + Daily: true, + Weekly: true, + }, + { + description: 'Last year', + name: 'lastYear', + Yearly: true, + Monthly: true, + Daily: true, + Weekly: true, + }, + { + description: 'All time', + name: 'allTime', + Yearly: true, + Monthly: true, + Daily: true, + Weekly: true, }, - { description: 'Last year', name: 'lastYear', Yearly: true, Monthly: true }, - { description: 'All time', name: 'allMonths', Yearly: true, Monthly: true }, ]; const intervalOptions = [ - //{ value: 1, description: 'Daily', name: 'Day'}, - //{ value: 2, description: 'Weekly', name: 'Week'}, + { + description: 'Daily', + name: 'Day', + format: 'yyyy-MM-dd', + range: 'dayRangeInclusive', + }, + { + description: 'Weekly', + name: 'Week', + format: 'yyyy-MM-dd', + range: 'weekRangeInclusive', + }, //{ value: 3, description: 'Fortnightly', name: 3}, { description: 'Monthly', @@ -88,6 +170,9 @@ export const ReportOptions = { dateRangeMap: new Map( dateRangeOptions.map(item => [item.description, item.name]), ), + dateRangeType: new Map( + dateRangeOptions.map(item => [item.description, item.type]), + ), interval: intervalOptions, intervalMap: new Map( intervalOptions.map(item => [item.description, item.name]), diff --git a/packages/desktop-client/src/components/reports/ReportSidebar.jsx b/packages/desktop-client/src/components/reports/ReportSidebar.jsx index e916183c79e..20abff72654 100644 --- a/packages/desktop-client/src/components/reports/ReportSidebar.jsx +++ b/packages/desktop-client/src/components/reports/ReportSidebar.jsx @@ -11,6 +11,7 @@ import { View } from '../common/View'; import { Tooltip } from '../tooltips'; import { CategorySelector } from './CategorySelector'; +import { defaultsList } from './disabledList'; import { ModeButton } from './ModeButton'; import { ReportOptions } from './ReportOptions'; import { @@ -76,7 +77,8 @@ export function ReportSidebar({ default: [dateStart, dateEnd] = getSpecificRange( ReportOptions.dateRangeMap.get(cond), - cond === 'Last month' ? 0 : null, + cond === 'Last month' || cond === 'Last week' ? 0 : null, + ReportOptions.dateRangeType.get(cond), ); onChangeDates(dateStart, dateEnd); } @@ -214,7 +216,7 @@ export function ReportSidebar({ .map(int => int.description) .includes(customReportItems.dateRange) ) { - onSelectRange('Year to date'); + onSelectRange(defaultsList.intervalRange.get(e)); } }} options={ReportOptions.interval.map(option => [ @@ -360,7 +362,7 @@ export function ReportSidebar({ options={ReportOptions.dateRange .filter(f => f[customReportItems.interval]) .map(option => [option.description, option.description])} - line={customReportItems.interval === 'Monthly' && dateRangeLine} + line={dateRangeLine > 0 && dateRangeLine} /> ) : ( diff --git a/packages/desktop-client/src/components/reports/ReportSummary.tsx b/packages/desktop-client/src/components/reports/ReportSummary.tsx index 48f570c6b3a..790f52193ac 100644 --- a/packages/desktop-client/src/components/reports/ReportSummary.tsx +++ b/packages/desktop-client/src/components/reports/ReportSummary.tsx @@ -64,12 +64,20 @@ export function ReportSummary({ {monthUtils.format( startDate, ReportOptions.intervalFormat.get(interval), - )}{' '} - -{' '} + )} {monthUtils.format( - endDate, + startDate, ReportOptions.intervalFormat.get(interval), - )} + ) !== + monthUtils.format( + endDate, + ReportOptions.intervalFormat.get(interval), + ) && + ' to ' + + monthUtils.format( + endDate, + ReportOptions.intervalFormat.get(interval), + )} [f.description, f.defaultType])), ]), ), + intervalRange: new Map( + intervalOptions.map(item => [item.description, item.defaultRange]), + ), }; diff --git a/packages/desktop-client/src/components/reports/reportRanges.ts b/packages/desktop-client/src/components/reports/reportRanges.ts index 52a79c1d211..b823c1de0bd 100644 --- a/packages/desktop-client/src/components/reports/reportRanges.ts +++ b/packages/desktop-client/src/components/reports/reportRanges.ts @@ -95,6 +95,12 @@ function boundedRange( ) { let latest; switch (interval) { + case 'Daily': + latest = monthUtils.currentDay(); + break; + case 'Weekly': + latest = monthUtils.currentWeek(); + break; case 'Monthly': latest = monthUtils.currentMonth() + '-31'; break; @@ -115,13 +121,30 @@ function boundedRange( return [start, end]; } -export function getSpecificRange(offset: number, addNumber: number) { +export function getSpecificRange( + offset: number, + addNumber: number, + type: string, +) { const currentDay = monthUtils.currentDay(); - const dateStart = monthUtils.subMonths(currentDay, offset) + '-01'; - const dateEnd = monthUtils.getMonthEnd( - monthUtils.addMonths(dateStart, addNumber === null ? offset : addNumber) + - '-01', - ); + + let dateStart; + let dateEnd; + if (type === 'Months') { + dateStart = monthUtils.subMonths(currentDay, offset) + '-01'; + dateEnd = monthUtils.getMonthEnd( + monthUtils.addMonths(dateStart, addNumber === null ? offset : addNumber) + + '-01', + ); + } + + if (type === 'Weeks') { + dateStart = monthUtils.subWeeks(currentDay, offset); + dateEnd = monthUtils.getWeekEnd( + monthUtils.addWeeks(dateStart, addNumber === null ? offset : addNumber), + ); + } + return [dateStart, dateEnd]; } diff --git a/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts b/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts index 31f1e8b7f8b..9c9d4c445a0 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts @@ -14,7 +14,13 @@ export function makeQuery( filters: unknown[], ) { const intervalGroup = - interval === 'Monthly' ? { $month: '$date' } : { $year: '$date' }; + interval === 'Weekly' + ? { $week: '$date' } + : interval === 'Daily' + ? { $day: '$date' } + : interval === 'Monthly' + ? { $month: '$date' } + : { $year: '$date' }; const intervalFilter = '$' + ReportOptions.intervalMap.get(interval)?.toLowerCase() || 'month'; diff --git a/packages/loot-core/src/server/aql/compiler.ts b/packages/loot-core/src/server/aql/compiler.ts index 8c6bb76b7d5..e247c922df3 100644 --- a/packages/loot-core/src/server/aql/compiler.ts +++ b/packages/loot-core/src/server/aql/compiler.ts @@ -189,6 +189,14 @@ function parseDate(str) { return null; } +function parseWeek(str) { + const m = str.match(/^(\d{4}-\d{2}-\d{2})$/); + if (m) { + return typed(dateToInt(m[1]), 'date', { literal: true }); + } + return null; +} + function parseMonth(str) { const m = str.match(/^(\d{4}-\d{2})$/); if (m) { @@ -214,6 +222,7 @@ function inferParam(param, type) { if (existingType) { const casts = { date: ['string'], + 'date-week': ['date'], 'date-month': ['date'], 'date-year': ['date', 'date-month'], id: ['string'], @@ -312,6 +321,24 @@ function castInput(state, expr, type) { 'date-year', ); } + } else if (type === 'date-week') { + let expr2; + if (expr.type === 'date') { + expr2 = expr; + } else if (expr.type === 'string') { + expr2 = + parseWeek(expr.value) || + parseDate(expr.value) || + badDateFormat(expr.value, 'date-week'); + } else { + throw new CompileError(`Can’t cast ${expr.type} to date-week`); + } + + return typed( + // eslint-disable-next-line rulesdir/typography + `CAST(strftime('%Y%m%d',datetime(substr(${expr2.value}, 1, 4) || '-' || substr(${expr2.value}, 5, 2) || '-' || substr(${expr2.value}, 7, 2)), 'weekday 0', '-6 days') AS integer)`, + 'date-week', + ); } else if (type === 'id') { if (expr.type === 'string') { return typed(expr.value, 'id', { literal: expr.literal }); @@ -600,6 +627,14 @@ const compileFunction = saveStack('function', (state, func) => { } // date functions + case '$day': { + validateArgLength(args, 1); + return castInput(state, args[0], 'date'); + } + case '$week': { + validateArgLength(args, 1); + return castInput(state, args[0], 'date-week'); + } case '$month': { validateArgLength(args, 1); return castInput(state, args[0], 'date-month'); diff --git a/packages/loot-core/src/server/aql/schema-helpers.ts b/packages/loot-core/src/server/aql/schema-helpers.ts index 7bce6f5de5e..f83a96d3b9d 100644 --- a/packages/loot-core/src/server/aql/schema-helpers.ts +++ b/packages/loot-core/src/server/aql/schema-helpers.ts @@ -1,5 +1,5 @@ // @ts-strict-ignore -import { dayFromDate } from '../../shared/months'; +import { dayFromDate, weekFromDate } from '../../shared/months'; import { toDateRepr, fromDateRepr } from '../models'; function isRequired(name, fieldDesc) { @@ -31,6 +31,8 @@ export function convertInputType(value, type) { } return toDateRepr(value); + case 'date-week': + return toDateRepr(weekFromDate(value)); case 'date-month': return toDateRepr(value.slice(0, 7)); case 'date-year': @@ -66,6 +68,8 @@ export function convertOutputType(value, type) { switch (type) { case 'date': return fromDateRepr(value); + case 'date-week': + return fromDateRepr(value); case 'date-month': return fromDateRepr(value).slice(0, 7); case 'date-year': diff --git a/packages/loot-core/src/shared/months.ts b/packages/loot-core/src/shared/months.ts index 488e4d72cd5..0a3b182d453 100644 --- a/packages/loot-core/src/shared/months.ts +++ b/packages/loot-core/src/shared/months.ts @@ -88,7 +88,7 @@ export function monthFromDate(date: DateLike): string { } export function weekFromDate(date: DateLike): string { - return d.format(_parse(date), 'yyyy-ww'); + return d.format(d.startOfISOWeek(_parse(date)), 'yyyy-MM-dd'); } export function dayFromDate(date: DateLike): string { @@ -103,6 +103,14 @@ export function currentMonth(): string { } } +export function currentWeek(): string { + if (global.IS_TESTING || Platform.isPlaywright) { + return global.currentWeek || '2017-01'; + } else { + return d.format(d.startOfISOWeek(new Date()), 'yyyy-MM-dd'); + } +} + export function currentYear(): string { if (global.IS_TESTING || Platform.isPlaywright) { return global.currentMonth || '2017'; @@ -148,7 +156,7 @@ export function addMonths(month: DateLike, n: number): string { } export function addWeeks(date: DateLike, n: number): string { - return d.format(d.addWeeks(_parse(date), n), 'yyyy-MM-dd'); + return d.format(d.addWeeks(d.startOfISOWeek(_parse(date)), n), 'yyyy-MM-dd'); } export function differenceInCalendarMonths( @@ -169,6 +177,10 @@ export function subMonths(month: string | Date, n: number) { return d.format(d.subMonths(_parse(month), n), 'yyyy-MM'); } +export function subWeeks(date: DateLike, n: number): string { + return d.format(d.subWeeks(d.startOfISOWeek(_parse(date)), n), 'yyyy-MM-dd'); +} + export function subYears(year: string | Date, n: number) { return d.format(d.subYears(_parse(year), n), 'yyyy'); } @@ -221,6 +233,29 @@ export function yearRangeInclusive(start: DateLike, end: DateLike): string[] { return _yearRange(start, end, true); } +export function _weekRange( + start: DateLike, + end: DateLike, + inclusive = false, +): string[] { + const weeks: string[] = []; + let week = weekFromDate(start); + while (d.isBefore(_parse(week), _parse(end))) { + weeks.push(week); + week = addWeeks(week, 1); + } + + if (inclusive) { + weeks.push(week); + } + + return weeks; +} + +export function weekRangeInclusive(start: DateLike, end: DateLike): string[] { + return _weekRange(start, end, true); +} + export function _range( start: DateLike, end: DateLike, @@ -296,6 +331,10 @@ export function getMonthEnd(day: string): string { return subDays(nextMonth(day.slice(0, 7)) + '-01', 1); } +export function getWeekEnd(date: DateLike): string { + return d.format(d.endOfISOWeek(_parse(date)), 'yyyy-MM-dd'); +} + export function getYearStart(month: string): string { return getYear(month) + '-01'; } From 1a75d1b2b12227d0dfb06fb5120574385251f09d Mon Sep 17 00:00:00 2001 From: carkom Date: Thu, 21 Mar 2024 09:36:47 +0000 Subject: [PATCH 27/36] notes --- upcoming-release-notes/2843.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 upcoming-release-notes/2843.md diff --git a/upcoming-release-notes/2843.md b/upcoming-release-notes/2843.md new file mode 100644 index 00000000000..351be9bec4d --- /dev/null +++ b/upcoming-release-notes/2843.md @@ -0,0 +1,6 @@ +--- +category: Enhancements +authors: [carkom] +--- + +Add daily and weekly to custom reports interval list. From 930145a6cc6557d04527ec1ecf2a2b09cc5111d1 Mon Sep 17 00:00:00 2001 From: carkom Date: Thu, 21 Mar 2024 09:43:18 +0000 Subject: [PATCH 28/36] notes --- upcoming-release-notes/{2843.md => 2483.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename upcoming-release-notes/{2843.md => 2483.md} (100%) diff --git a/upcoming-release-notes/2843.md b/upcoming-release-notes/2483.md similarity index 100% rename from upcoming-release-notes/2843.md rename to upcoming-release-notes/2483.md From ad2191dfb2ddfddd41cee2f615e2150f0dce062d Mon Sep 17 00:00:00 2001 From: carkom Date: Mon, 8 Apr 2024 19:29:12 +0100 Subject: [PATCH 29/36] merge fix --- .../desktop-client/src/components/reports/getLiveRange.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/desktop-client/src/components/reports/getLiveRange.ts b/packages/desktop-client/src/components/reports/getLiveRange.ts index a1a44274b1b..4258bace678 100644 --- a/packages/desktop-client/src/components/reports/getLiveRange.ts +++ b/packages/desktop-client/src/components/reports/getLiveRange.ts @@ -25,7 +25,7 @@ export function getLiveRange(cond: string, earliestTransaction: string) { '-31', ); break; - case 'allMonths': + case 'allTime': dateStart = earliestTransaction; dateEnd = monthUtils.currentDay(); break; @@ -33,7 +33,8 @@ export function getLiveRange(cond: string, earliestTransaction: string) { if (typeof rangeName === 'number') { [dateStart, dateEnd] = getSpecificRange( rangeName, - cond === 'Last month' ? 0 : null, + cond === 'Last month' || cond === 'Last week' ? 0 : null, + ReportOptions.dateRangeType.get(cond), ); } else { break; From f92fc4b309cb03cc5e445cff12c4494a7d67d7e9 Mon Sep 17 00:00:00 2001 From: carkom Date: Mon, 8 Apr 2024 19:49:25 +0100 Subject: [PATCH 30/36] TS fix --- .../src/components/reports/reportRanges.ts | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/packages/desktop-client/src/components/reports/reportRanges.ts b/packages/desktop-client/src/components/reports/reportRanges.ts index 41d3f91151d..9dacbfc8af9 100644 --- a/packages/desktop-client/src/components/reports/reportRanges.ts +++ b/packages/desktop-client/src/components/reports/reportRanges.ts @@ -124,19 +124,15 @@ function boundedRange( export function getSpecificRange( offset: number, addNumber: number | null, - type: string, + type?: string, ) { const currentDay = monthUtils.currentDay(); - let dateStart; - let dateEnd; - if (type === 'Months') { - dateStart = monthUtils.subMonths(currentDay, offset) + '-01'; - dateEnd = monthUtils.getMonthEnd( - monthUtils.addMonths(dateStart, addNumber === null ? offset : addNumber) + - '-01', - ); - } + let dateStart = monthUtils.subMonths(currentDay, offset) + '-01'; + let dateEnd = monthUtils.getMonthEnd( + monthUtils.addMonths(dateStart, addNumber === null ? offset : addNumber) + + '-01', + ); if (type === 'Weeks') { dateStart = monthUtils.subWeeks(currentDay, offset); From 65db5fe33a025355879c0d18e9e7a5d15d3b2b0e Mon Sep 17 00:00:00 2001 From: carkom Date: Mon, 8 Apr 2024 22:43:22 +0100 Subject: [PATCH 31/36] Change week start date based on user prefs --- .../src/components/reports/ReportSidebar.jsx | 7 ++- .../src/components/reports/getLiveRange.ts | 7 ++- .../src/components/reports/reportRanges.ts | 9 ++- .../reports/reports/CustomReport.jsx | 22 ++++++-- .../spreadsheets/custom-spreadsheet.ts | 13 ++++- .../spreadsheets/grouped-spreadsheet.ts | 12 +++- packages/loot-core/src/server/aql/compiler.ts | 3 +- .../src/server/aql/schema-helpers.ts | 2 +- packages/loot-core/src/shared/months.ts | 56 +++++++++++++++---- 9 files changed, 106 insertions(+), 25 deletions(-) diff --git a/packages/desktop-client/src/components/reports/ReportSidebar.jsx b/packages/desktop-client/src/components/reports/ReportSidebar.jsx index 5b00a86c747..654513cf2d5 100644 --- a/packages/desktop-client/src/components/reports/ReportSidebar.jsx +++ b/packages/desktop-client/src/components/reports/ReportSidebar.jsx @@ -40,12 +40,15 @@ export function ReportSidebar({ defaultItems, defaultModeItems, earliestTransaction, + firstDayOfWeekIdx, }) { const [menuOpen, setMenuOpen] = useState(false); const onSelectRange = cond => { onReportChange({ type: 'modify' }); setDateRange(cond); - onChangeDates(...getLiveRange(cond, earliestTransaction)); + onChangeDates( + ...getLiveRange(cond, earliestTransaction, firstDayOfWeekIdx), + ); }; const onChangeMode = cond => { @@ -349,6 +352,7 @@ export function ReportSidebar({ newValue, customReportItems.endDate, customReportItems.interval, + firstDayOfWeekIdx, ), ) } @@ -378,6 +382,7 @@ export function ReportSidebar({ customReportItems.startDate, newValue, customReportItems.interval, + firstDayOfWeekIdx, ), ) } diff --git a/packages/desktop-client/src/components/reports/getLiveRange.ts b/packages/desktop-client/src/components/reports/getLiveRange.ts index 4258bace678..bb0408b3e0f 100644 --- a/packages/desktop-client/src/components/reports/getLiveRange.ts +++ b/packages/desktop-client/src/components/reports/getLiveRange.ts @@ -3,7 +3,11 @@ import * as monthUtils from 'loot-core/src/shared/months'; import { ReportOptions } from './ReportOptions'; import { getSpecificRange, validateRange } from './reportRanges'; -export function getLiveRange(cond: string, earliestTransaction: string) { +export function getLiveRange( + cond: string, + earliestTransaction: string, + firstDayOfWeekIdx?: number, +) { let dateStart; let dateEnd; const rangeName = ReportOptions.dateRangeMap.get(cond); @@ -35,6 +39,7 @@ export function getLiveRange(cond: string, earliestTransaction: string) { rangeName, cond === 'Last month' || cond === 'Last week' ? 0 : null, ReportOptions.dateRangeType.get(cond), + firstDayOfWeekIdx, ); } else { break; diff --git a/packages/desktop-client/src/components/reports/reportRanges.ts b/packages/desktop-client/src/components/reports/reportRanges.ts index 9dacbfc8af9..0ee3aec8235 100644 --- a/packages/desktop-client/src/components/reports/reportRanges.ts +++ b/packages/desktop-client/src/components/reports/reportRanges.ts @@ -5,6 +5,7 @@ export function validateStart( start: string, end: string, interval?: string, + firstDayOfWeekIdx?: number, ) { let addDays; let dateStart; @@ -35,6 +36,7 @@ export function validateStart( dateStart, interval ? end : monthUtils.monthFromDate(end), interval, + firstDayOfWeekIdx, ); } @@ -43,6 +45,7 @@ export function validateEnd( start: string, end: string, interval?: string, + firstDayOfWeekIdx?: number, ) { let subDays; let dateEnd; @@ -73,6 +76,7 @@ export function validateEnd( interval ? start : monthUtils.monthFromDate(start), dateEnd, interval, + firstDayOfWeekIdx, ); } @@ -92,6 +96,7 @@ function boundedRange( start: string, end: string, interval?: string, + firstDayOfWeekIdx?: number, ) { let latest; switch (interval) { @@ -99,7 +104,7 @@ function boundedRange( latest = monthUtils.currentDay(); break; case 'Weekly': - latest = monthUtils.currentWeek(); + latest = monthUtils.currentWeek(firstDayOfWeekIdx); break; case 'Monthly': latest = monthUtils.currentMonth() + '-31'; @@ -125,6 +130,7 @@ export function getSpecificRange( offset: number, addNumber: number | null, type?: string, + firstDayOfWeekIdx?: number, ) { const currentDay = monthUtils.currentDay(); @@ -138,6 +144,7 @@ export function getSpecificRange( dateStart = monthUtils.subWeeks(currentDay, offset); dateEnd = monthUtils.getWeekEnd( monthUtils.addWeeks(dateStart, addNumber === null ? offset : addNumber), + firstDayOfWeekIdx, ); } diff --git a/packages/desktop-client/src/components/reports/reports/CustomReport.jsx b/packages/desktop-client/src/components/reports/reports/CustomReport.jsx index c6da3eb0a0d..fb4d3b36f00 100644 --- a/packages/desktop-client/src/components/reports/reports/CustomReport.jsx +++ b/packages/desktop-client/src/components/reports/reports/CustomReport.jsx @@ -5,7 +5,7 @@ import * as d from 'date-fns'; import { send } from 'loot-core/src/platform/client/fetch'; import * as monthUtils from 'loot-core/src/shared/months'; -import { amountToCurrency } from 'loot-core/src/shared/util'; +import { amountToCurrency, stringToInteger } from 'loot-core/src/shared/util'; import { useAccounts } from '../../../hooks/useAccounts'; import { useCategories } from '../../../hooks/useCategories'; @@ -36,6 +36,8 @@ import { fromDateRepr } from '../util'; export function CustomReport() { const categories = useCategories(); + const [_firstDayOfWeekIdx] = useLocalPref('firstDayOfWeekIdx'); + const firstDayOfWeekIdx = stringToInteger(_firstDayOfWeekIdx || '0'); const [viewLegend = false, setViewLegendPref] = useLocalPref('reportsViewLegend'); @@ -113,9 +115,12 @@ export function CustomReport() { ? monthUtils[format](d.parseISO(fromDateRepr(trans.date))) : currentInterval; + const rangeProps = + interval === 'Weekly' + ? [earliestInterval, currentInterval, firstDayOfWeekIdx] + : [earliestInterval, currentInterval]; const allInter = monthUtils[ReportOptions.intervalRange.get(interval)]( - earliestInterval, - currentInterval, + ...rangeProps, ) .map(inter => ({ name: inter, @@ -147,8 +152,12 @@ export function CustomReport() { const dateStart = monthUtils[format](startDate); const dateEnd = monthUtils[format](endDate); + const rangeProps = + interval === 'Weekly' + ? [dateStart, dateEnd, firstDayOfWeekIdx] + : [dateStart, dateEnd]; setIntervals( - monthUtils[ReportOptions.intervalRange.get(interval)](dateStart, dateEnd), + monthUtils[ReportOptions.intervalRange.get(interval)](...rangeProps), ); }, [interval, startDate, endDate]); @@ -170,6 +179,7 @@ export function CustomReport() { showHiddenCategories, showUncategorized, balanceTypeOp, + firstDayOfWeekIdx, }); }, [ startDate, @@ -188,6 +198,7 @@ export function CustomReport() { showHiddenCategories, showUncategorized, graphType, + firstDayOfWeekIdx, ]); const getGraphData = useMemo(() => { @@ -209,6 +220,7 @@ export function CustomReport() { payees, accounts, graphType, + firstDayOfWeekIdx, setDataCheck, }); }, [ @@ -228,6 +240,7 @@ export function CustomReport() { showHiddenCategories, showUncategorized, graphType, + firstDayOfWeekIdx, ]); const graphData = useReport('default', getGraphData); const groupedData = useReport('grouped', getGroupData); @@ -449,6 +462,7 @@ export function CustomReport() { defaultItems={defaultItems} defaultModeItems={defaultModeItems} earliestTransaction={earliestTransaction} + firstDayOfWeekIdx={firstDayOfWeekIdx} /> void; }; @@ -67,6 +68,7 @@ export function createCustomSpreadsheet({ payees, accounts, graphType, + firstDayOfWeekIdx, setDataCheck, }: createCustomSpreadsheetProps) { const [categoryList, categoryGroup] = categoryLists(categories); @@ -129,9 +131,16 @@ export function createCustomSpreadsheet({ const format = ReportOptions.intervalMap.get(interval).toLowerCase() + 'FromDate'; + const rangeProps = + interval === 'Weekly' + ? [ + monthUtils[format](startDate), + monthUtils[format](endDate), + firstDayOfWeekIdx, + ] + : [monthUtils[format](startDate), monthUtils[format](endDate)]; const intervals = monthUtils[ReportOptions.intervalRange.get(interval)]( - monthUtils[format](startDate), - monthUtils[format](endDate), + ...rangeProps, ); let totalAssets = 0; 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 95cbf490d0b..b047790b2e1 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/grouped-spreadsheet.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/grouped-spreadsheet.ts @@ -27,6 +27,7 @@ export function createGroupedSpreadsheet({ showHiddenCategories, showUncategorized, balanceTypeOp, + firstDayOfWeekIdx, }: createCustomSpreadsheetProps) { const [categoryList, categoryGroup] = categoryLists(categories); @@ -80,9 +81,16 @@ export function createGroupedSpreadsheet({ const format = ReportOptions.intervalMap.get(interval).toLowerCase() + 'FromDate'; + const rangeProps = + interval === 'Weekly' + ? [ + monthUtils[format](startDate), + monthUtils[format](endDate), + firstDayOfWeekIdx, + ] + : [monthUtils[format](startDate), monthUtils[format](endDate)]; const intervals = monthUtils[ReportOptions.intervalRange.get(interval)]( - monthUtils[format](startDate), - monthUtils[format](endDate), + ...rangeProps, ); const groupedData: DataEntity[] = categoryGroup.map( diff --git a/packages/loot-core/src/server/aql/compiler.ts b/packages/loot-core/src/server/aql/compiler.ts index e247c922df3..dee812a78b6 100644 --- a/packages/loot-core/src/server/aql/compiler.ts +++ b/packages/loot-core/src/server/aql/compiler.ts @@ -334,9 +334,10 @@ function castInput(state, expr, type) { throw new CompileError(`Can’t cast ${expr.type} to date-week`); } + const test = 3; return typed( // eslint-disable-next-line rulesdir/typography - `CAST(strftime('%Y%m%d',datetime(substr(${expr2.value}, 1, 4) || '-' || substr(${expr2.value}, 5, 2) || '-' || substr(${expr2.value}, 7, 2)), 'weekday 0', '-6 days') AS integer)`, + `CAST(strftime('%Y%m%d',datetime(substr(${expr2.value}, 1, 4) || '-' || substr(${expr2.value}, 5, 2) || '-' || substr(${expr2.value}, 7, 2)), 'weekday ${test}', '-6 days') AS integer)`, 'date-week', ); } else if (type === 'id') { diff --git a/packages/loot-core/src/server/aql/schema-helpers.ts b/packages/loot-core/src/server/aql/schema-helpers.ts index f83a96d3b9d..5fe83df234d 100644 --- a/packages/loot-core/src/server/aql/schema-helpers.ts +++ b/packages/loot-core/src/server/aql/schema-helpers.ts @@ -32,7 +32,7 @@ export function convertInputType(value, type) { return toDateRepr(value); case 'date-week': - return toDateRepr(weekFromDate(value)); + return toDateRepr(dayFromDate(value)); case 'date-month': return toDateRepr(value.slice(0, 7)); case 'date-year': diff --git a/packages/loot-core/src/shared/months.ts b/packages/loot-core/src/shared/months.ts index 0a3b182d453..60b665598b4 100644 --- a/packages/loot-core/src/shared/months.ts +++ b/packages/loot-core/src/shared/months.ts @@ -4,6 +4,21 @@ import memoizeOne from 'memoize-one'; import * as Platform from '../client/platform'; +function isoWeekSettings( + date: Date, + type: string, + firstDayOfWeekIdx: number, +): Date { + const checkNull = firstDayOfWeekIdx || 1; + const subNum = checkNull <= 1 ? 1 - checkNull : 8 - checkNull; + + if (type === 'start') { + return _parse(subDays(d.startOfISOWeek(date), subNum)); + } else { + return _parse(subDays(d.startOfISOWeek(date), subNum - 6)); + } +} + type DateLike = string | Date; export function _parse(value: DateLike): Date { @@ -87,8 +102,14 @@ export function monthFromDate(date: DateLike): string { return d.format(_parse(date), 'yyyy-MM'); } -export function weekFromDate(date: DateLike): string { - return d.format(d.startOfISOWeek(_parse(date)), 'yyyy-MM-dd'); +export function weekFromDate( + date: DateLike, + firstDayOfWeekIdx: number, +): string { + return d.format( + isoWeekSettings(_parse(date), 'start', firstDayOfWeekIdx), + 'yyyy-MM-dd', + ); } export function dayFromDate(date: DateLike): string { @@ -103,11 +124,14 @@ export function currentMonth(): string { } } -export function currentWeek(): string { +export function currentWeek(firstDayOfWeekIdx?: number): string { if (global.IS_TESTING || Platform.isPlaywright) { - return global.currentWeek || '2017-01'; + return global.currentWeek || '2017-01-01'; } else { - return d.format(d.startOfISOWeek(new Date()), 'yyyy-MM-dd'); + return d.format( + isoWeekSettings(new Date(), 'start', firstDayOfWeekIdx), + 'yyyy-MM-dd', + ); } } @@ -156,7 +180,7 @@ export function addMonths(month: DateLike, n: number): string { } export function addWeeks(date: DateLike, n: number): string { - return d.format(d.addWeeks(d.startOfISOWeek(_parse(date)), n), 'yyyy-MM-dd'); + return d.format(d.addWeeks(_parse(date), n), 'yyyy-MM-dd'); } export function differenceInCalendarMonths( @@ -178,7 +202,7 @@ export function subMonths(month: string | Date, n: number) { } export function subWeeks(date: DateLike, n: number): string { - return d.format(d.subWeeks(d.startOfISOWeek(_parse(date)), n), 'yyyy-MM-dd'); + return d.format(d.subWeeks(_parse(date), n), 'yyyy-MM-dd'); } export function subYears(year: string | Date, n: number) { @@ -237,9 +261,10 @@ export function _weekRange( start: DateLike, end: DateLike, inclusive = false, + firstDayOfWeekIdx?: number, ): string[] { const weeks: string[] = []; - let week = weekFromDate(start); + let week = weekFromDate(start, firstDayOfWeekIdx); while (d.isBefore(_parse(week), _parse(end))) { weeks.push(week); week = addWeeks(week, 1); @@ -252,8 +277,12 @@ export function _weekRange( return weeks; } -export function weekRangeInclusive(start: DateLike, end: DateLike): string[] { - return _weekRange(start, end, true); +export function weekRangeInclusive( + start: DateLike, + end: DateLike, + firstDayOfWeekIdx?: number, +): string[] { + return _weekRange(start, end, true, firstDayOfWeekIdx); } export function _range( @@ -331,8 +360,11 @@ export function getMonthEnd(day: string): string { return subDays(nextMonth(day.slice(0, 7)) + '-01', 1); } -export function getWeekEnd(date: DateLike): string { - return d.format(d.endOfISOWeek(_parse(date)), 'yyyy-MM-dd'); +export function getWeekEnd(date: DateLike, firstDayOfWeekIdx?: number): string { + return d.format( + isoWeekSettings(_parse(date), 'end', firstDayOfWeekIdx), + 'yyyy-MM-dd', + ); } export function getYearStart(month: string): string { From e58afce88a781f66cc55fb7e3c181adb5f498a91 Mon Sep 17 00:00:00 2001 From: carkom Date: Tue, 9 Apr 2024 01:31:23 +0100 Subject: [PATCH 32/36] fix weeks --- .../reports/spreadsheets/custom-spreadsheet.ts | 17 ++++++++++++++++- .../reports/spreadsheets/grouped-spreadsheet.ts | 17 ++++++++++++++++- .../reports/spreadsheets/makeQuery.ts | 6 ++++-- packages/loot-core/src/server/aql/compiler.ts | 2 -- .../loot-core/src/server/aql/schema-helpers.ts | 2 +- packages/loot-core/src/shared/months.ts | 9 +++++++-- 6 files changed, 44 insertions(+), 9 deletions(-) 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 a898f018ab8..72abe241b30 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/custom-spreadsheet.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/custom-spreadsheet.ts @@ -102,7 +102,7 @@ export function createCustomSpreadsheet({ }); const conditionsOpKey = conditionsOp === 'or' ? '$or' : '$and'; - const [assets, debts] = await Promise.all([ + let [assets, debts] = await Promise.all([ runQuery( makeQuery( 'assets', @@ -129,6 +129,21 @@ export function createCustomSpreadsheet({ ).then(({ data }) => data), ]); + if (interval === 'Weekly') { + debts = debts.map(d => { + return { + ...d, + date: monthUtils.weekFromDate(d.date, firstDayOfWeekIdx), + }; + }); + assets = assets.map(d => { + return { + ...d, + date: monthUtils.weekFromDate(d.date, firstDayOfWeekIdx), + }; + }); + } + const format = ReportOptions.intervalMap.get(interval).toLowerCase() + 'FromDate'; const rangeProps = 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 b047790b2e1..b473e557754 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/grouped-spreadsheet.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/grouped-spreadsheet.ts @@ -52,7 +52,7 @@ export function createGroupedSpreadsheet({ }); const conditionsOpKey = conditionsOp === 'or' ? '$or' : '$and'; - const [assets, debts] = await Promise.all([ + let [assets, debts] = await Promise.all([ runQuery( makeQuery( 'assets', @@ -79,6 +79,21 @@ export function createGroupedSpreadsheet({ ).then(({ data }) => data), ]); + if (interval === 'Weekly') { + debts = debts.map(d => { + return { + ...d, + date: monthUtils.weekFromDate(d.date, firstDayOfWeekIdx), + }; + }); + assets = assets.map(d => { + return { + ...d, + date: monthUtils.weekFromDate(d.date, firstDayOfWeekIdx), + }; + }); + } + const format = ReportOptions.intervalMap.get(interval).toLowerCase() + 'FromDate'; const rangeProps = diff --git a/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts b/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts index 9c9d4c445a0..93850b3e3ca 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts @@ -15,14 +15,16 @@ export function makeQuery( ) { const intervalGroup = interval === 'Weekly' - ? { $week: '$date' } + ? { $day: '$date' } : interval === 'Daily' ? { $day: '$date' } : interval === 'Monthly' ? { $month: '$date' } : { $year: '$date' }; const intervalFilter = - '$' + ReportOptions.intervalMap.get(interval)?.toLowerCase() || 'month'; + interval === 'Weekly' + ? '$day' + : '$' + ReportOptions.intervalMap.get(interval)?.toLowerCase() || 'month'; const query = q('transactions') //Apply Category_Selector diff --git a/packages/loot-core/src/server/aql/compiler.ts b/packages/loot-core/src/server/aql/compiler.ts index dee812a78b6..7aa33e54ab3 100644 --- a/packages/loot-core/src/server/aql/compiler.ts +++ b/packages/loot-core/src/server/aql/compiler.ts @@ -333,8 +333,6 @@ function castInput(state, expr, type) { } else { throw new CompileError(`Can’t cast ${expr.type} to date-week`); } - - const test = 3; return typed( // eslint-disable-next-line rulesdir/typography `CAST(strftime('%Y%m%d',datetime(substr(${expr2.value}, 1, 4) || '-' || substr(${expr2.value}, 5, 2) || '-' || substr(${expr2.value}, 7, 2)), 'weekday ${test}', '-6 days') AS integer)`, diff --git a/packages/loot-core/src/server/aql/schema-helpers.ts b/packages/loot-core/src/server/aql/schema-helpers.ts index 5fe83df234d..440f4273c14 100644 --- a/packages/loot-core/src/server/aql/schema-helpers.ts +++ b/packages/loot-core/src/server/aql/schema-helpers.ts @@ -1,5 +1,5 @@ // @ts-strict-ignore -import { dayFromDate, weekFromDate } from '../../shared/months'; +import { dayFromDate } from '../../shared/months'; import { toDateRepr, fromDateRepr } from '../models'; function isRequired(name, fieldDesc) { diff --git a/packages/loot-core/src/shared/months.ts b/packages/loot-core/src/shared/months.ts index 60b665598b4..a0c95243969 100644 --- a/packages/loot-core/src/shared/months.ts +++ b/packages/loot-core/src/shared/months.ts @@ -9,8 +9,13 @@ function isoWeekSettings( type: string, firstDayOfWeekIdx: number, ): Date { - const checkNull = firstDayOfWeekIdx || 1; - const subNum = checkNull <= 1 ? 1 - checkNull : 8 - checkNull; + const checkNull = firstDayOfWeekIdx === undefined ? 1 : firstDayOfWeekIdx + 1; + const subNum = + d.getISODay(date) === 7 && checkNull === 1 + ? -6 + : d.getISODay(date) + 1 >= checkNull + ? 2 - checkNull + : 9 - checkNull; if (type === 'start') { return _parse(subDays(d.startOfISOWeek(date), subNum)); From e256736872d6d559b314ccf0d155f837480af125 Mon Sep 17 00:00:00 2001 From: carkom Date: Sun, 14 Apr 2024 08:49:50 +0100 Subject: [PATCH 33/36] fix averages --- .../src/components/reports/ChooseGraph.tsx | 12 ++++-------- .../src/components/reports/reports/CustomReport.jsx | 3 +-- .../src/components/reports/reports/GetCardData.tsx | 2 -- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/packages/desktop-client/src/components/reports/ChooseGraph.tsx b/packages/desktop-client/src/components/reports/ChooseGraph.tsx index d84829a3c9a..2a671ffc475 100644 --- a/packages/desktop-client/src/components/reports/ChooseGraph.tsx +++ b/packages/desktop-client/src/components/reports/ChooseGraph.tsx @@ -1,7 +1,6 @@ // @ts-strict-ignore import React, { useRef } from 'react'; -import * as monthUtils from 'loot-core/src/shared/months'; import { type GroupedEntity } from 'loot-core/src/types/models/reports'; import { type CSSProperties } from '../../style'; @@ -20,8 +19,6 @@ import { ReportTableTotals } from './graphs/tableGraph/ReportTableTotals'; import { ReportOptions } from './ReportOptions'; type ChooseGraphProps = { - startDate: string; - endDate: string; data: GroupedEntity; mode: string; graphType: string; @@ -34,11 +31,10 @@ type ChooseGraphProps = { style?: CSSProperties; showHiddenCategories?: boolean; showOffBudget?: boolean; + intervalsCount?: number; }; export function ChooseGraph({ - startDate, - endDate, data, mode, graphType, @@ -51,8 +47,8 @@ export function ChooseGraph({ style, showHiddenCategories, showOffBudget, + intervalsCount, }: ChooseGraphProps) { - const intervals: string[] = monthUtils.rangeInclusive(startDate, endDate); const graphStyle = compact ? { ...style } : { flexGrow: 1 }; const balanceTypeOp = ReportOptions.balanceTypeMap.get(balanceType); const groupByData = @@ -166,7 +162,7 @@ export function ChooseGraph({ groupBy={groupBy} data={data[groupByData]} mode={mode} - intervalsCount={intervals.length} + intervalsCount={intervalsCount} compact={compact} style={rowStyle} compactStyle={compactStyle} @@ -177,7 +173,7 @@ export function ChooseGraph({ data={data} mode={mode} balanceTypeOp={balanceTypeOp} - intervalsCount={intervals.length} + intervalsCount={intervalsCount} compact={compact} style={rowStyle} compactStyle={compactStyle} diff --git a/packages/desktop-client/src/components/reports/reports/CustomReport.jsx b/packages/desktop-client/src/components/reports/reports/CustomReport.jsx index 200cb7b0954..116e42d1f9d 100644 --- a/packages/desktop-client/src/components/reports/reports/CustomReport.jsx +++ b/packages/desktop-client/src/components/reports/reports/CustomReport.jsx @@ -577,8 +577,6 @@ export function CustomReport() { {dataCheck ? ( ) : ( diff --git a/packages/desktop-client/src/components/reports/reports/GetCardData.tsx b/packages/desktop-client/src/components/reports/reports/GetCardData.tsx index 44f58d36806..fe5f0c1b5f1 100644 --- a/packages/desktop-client/src/components/reports/reports/GetCardData.tsx +++ b/packages/desktop-client/src/components/reports/reports/GetCardData.tsx @@ -101,8 +101,6 @@ export function GetCardData({ return data?.data ? ( Date: Mon, 15 Apr 2024 06:45:10 +0100 Subject: [PATCH 34/36] remove $week --- packages/loot-core/src/server/aql/compiler.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/loot-core/src/server/aql/compiler.ts b/packages/loot-core/src/server/aql/compiler.ts index 7aa33e54ab3..ef1d2c29e5d 100644 --- a/packages/loot-core/src/server/aql/compiler.ts +++ b/packages/loot-core/src/server/aql/compiler.ts @@ -630,10 +630,6 @@ const compileFunction = saveStack('function', (state, func) => { validateArgLength(args, 1); return castInput(state, args[0], 'date'); } - case '$week': { - validateArgLength(args, 1); - return castInput(state, args[0], 'date-week'); - } case '$month': { validateArgLength(args, 1); return castInput(state, args[0], 'date-month'); From 6933ef7c1add852813b5f138ae7931171cd7e6aa Mon Sep 17 00:00:00 2001 From: carkom Date: Mon, 15 Apr 2024 18:04:37 +0100 Subject: [PATCH 35/36] remove date-week --- packages/loot-core/src/server/aql/compiler.ts | 26 ------------------- .../src/server/aql/schema-helpers.ts | 4 --- 2 files changed, 30 deletions(-) diff --git a/packages/loot-core/src/server/aql/compiler.ts b/packages/loot-core/src/server/aql/compiler.ts index ef1d2c29e5d..66c4e372373 100644 --- a/packages/loot-core/src/server/aql/compiler.ts +++ b/packages/loot-core/src/server/aql/compiler.ts @@ -189,14 +189,6 @@ function parseDate(str) { return null; } -function parseWeek(str) { - const m = str.match(/^(\d{4}-\d{2}-\d{2})$/); - if (m) { - return typed(dateToInt(m[1]), 'date', { literal: true }); - } - return null; -} - function parseMonth(str) { const m = str.match(/^(\d{4}-\d{2})$/); if (m) { @@ -222,7 +214,6 @@ function inferParam(param, type) { if (existingType) { const casts = { date: ['string'], - 'date-week': ['date'], 'date-month': ['date'], 'date-year': ['date', 'date-month'], id: ['string'], @@ -321,23 +312,6 @@ function castInput(state, expr, type) { 'date-year', ); } - } else if (type === 'date-week') { - let expr2; - if (expr.type === 'date') { - expr2 = expr; - } else if (expr.type === 'string') { - expr2 = - parseWeek(expr.value) || - parseDate(expr.value) || - badDateFormat(expr.value, 'date-week'); - } else { - throw new CompileError(`Can’t cast ${expr.type} to date-week`); - } - return typed( - // eslint-disable-next-line rulesdir/typography - `CAST(strftime('%Y%m%d',datetime(substr(${expr2.value}, 1, 4) || '-' || substr(${expr2.value}, 5, 2) || '-' || substr(${expr2.value}, 7, 2)), 'weekday ${test}', '-6 days') AS integer)`, - 'date-week', - ); } else if (type === 'id') { if (expr.type === 'string') { return typed(expr.value, 'id', { literal: expr.literal }); diff --git a/packages/loot-core/src/server/aql/schema-helpers.ts b/packages/loot-core/src/server/aql/schema-helpers.ts index 440f4273c14..7bce6f5de5e 100644 --- a/packages/loot-core/src/server/aql/schema-helpers.ts +++ b/packages/loot-core/src/server/aql/schema-helpers.ts @@ -31,8 +31,6 @@ export function convertInputType(value, type) { } return toDateRepr(value); - case 'date-week': - return toDateRepr(dayFromDate(value)); case 'date-month': return toDateRepr(value.slice(0, 7)); case 'date-year': @@ -68,8 +66,6 @@ export function convertOutputType(value, type) { switch (type) { case 'date': return fromDateRepr(value); - case 'date-week': - return fromDateRepr(value); case 'date-month': return fromDateRepr(value).slice(0, 7); case 'date-year': From b1cc23db68dd610ac1afd8e7cb5eb51622b9f186 Mon Sep 17 00:00:00 2001 From: carkom Date: Mon, 15 Apr 2024 18:56:06 +0100 Subject: [PATCH 36/36] TS fixes --- .../src/components/reports/getLiveRange.ts | 2 +- .../src/components/reports/reportRanges.ts | 8 ++-- .../reports/reports/CustomReport.jsx | 4 +- .../spreadsheets/custom-spreadsheet.ts | 2 +- .../reports/spreadsheets/makeQuery.ts | 12 +++--- packages/loot-core/src/shared/months.ts | 41 ++++++------------- 6 files changed, 26 insertions(+), 43 deletions(-) diff --git a/packages/desktop-client/src/components/reports/getLiveRange.ts b/packages/desktop-client/src/components/reports/getLiveRange.ts index bb0408b3e0f..37aff3458f7 100644 --- a/packages/desktop-client/src/components/reports/getLiveRange.ts +++ b/packages/desktop-client/src/components/reports/getLiveRange.ts @@ -6,7 +6,7 @@ import { getSpecificRange, validateRange } from './reportRanges'; export function getLiveRange( cond: string, earliestTransaction: string, - firstDayOfWeekIdx?: number, + firstDayOfWeekIdx?: 0 | 1 | 2 | 3 | 4 | 5 | 6, ) { let dateStart; let dateEnd; diff --git a/packages/desktop-client/src/components/reports/reportRanges.ts b/packages/desktop-client/src/components/reports/reportRanges.ts index 0ee3aec8235..12a80d9d276 100644 --- a/packages/desktop-client/src/components/reports/reportRanges.ts +++ b/packages/desktop-client/src/components/reports/reportRanges.ts @@ -5,7 +5,7 @@ export function validateStart( start: string, end: string, interval?: string, - firstDayOfWeekIdx?: number, + firstDayOfWeekIdx?: 0 | 1 | 2 | 3 | 4 | 5 | 6, ) { let addDays; let dateStart; @@ -45,7 +45,7 @@ export function validateEnd( start: string, end: string, interval?: string, - firstDayOfWeekIdx?: number, + firstDayOfWeekIdx?: 0 | 1 | 2 | 3 | 4 | 5 | 6, ) { let subDays; let dateEnd; @@ -96,7 +96,7 @@ function boundedRange( start: string, end: string, interval?: string, - firstDayOfWeekIdx?: number, + firstDayOfWeekIdx?: 0 | 1 | 2 | 3 | 4 | 5 | 6, ) { let latest; switch (interval) { @@ -130,7 +130,7 @@ export function getSpecificRange( offset: number, addNumber: number | null, type?: string, - firstDayOfWeekIdx?: number, + firstDayOfWeekIdx?: 0 | 1 | 2 | 3 | 4 | 5 | 6, ) { const currentDay = monthUtils.currentDay(); diff --git a/packages/desktop-client/src/components/reports/reports/CustomReport.jsx b/packages/desktop-client/src/components/reports/reports/CustomReport.jsx index 116e42d1f9d..527ebf375f6 100644 --- a/packages/desktop-client/src/components/reports/reports/CustomReport.jsx +++ b/packages/desktop-client/src/components/reports/reports/CustomReport.jsx @@ -5,7 +5,7 @@ import * as d from 'date-fns'; import { send } from 'loot-core/src/platform/client/fetch'; import * as monthUtils from 'loot-core/src/shared/months'; -import { amountToCurrency, stringToInteger } from 'loot-core/src/shared/util'; +import { amountToCurrency } from 'loot-core/src/shared/util'; import { useAccounts } from '../../../hooks/useAccounts'; import { useCategories } from '../../../hooks/useCategories'; @@ -37,7 +37,7 @@ import { fromDateRepr } from '../util'; export function CustomReport() { const categories = useCategories(); const [_firstDayOfWeekIdx] = useLocalPref('firstDayOfWeekIdx'); - const firstDayOfWeekIdx = stringToInteger(_firstDayOfWeekIdx || '0'); + const firstDayOfWeekIdx = _firstDayOfWeekIdx || 0; const [viewLegend = false, setViewLegendPref] = useLocalPref('reportsViewLegend'); 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 72abe241b30..d950c615e71 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/custom-spreadsheet.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/custom-spreadsheet.ts @@ -47,7 +47,7 @@ export type createCustomSpreadsheetProps = { payees?: PayeeEntity[]; accounts?: AccountEntity[]; graphType?: string; - firstDayOfWeekIdx?: number; + firstDayOfWeekIdx?: 0 | 1 | 2 | 3 | 4 | 5 | 6; setDataCheck?: (value: boolean) => void; }; diff --git a/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts b/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts index 93850b3e3ca..986738eaeeb 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/makeQuery.ts @@ -14,13 +14,11 @@ export function makeQuery( filters: unknown[], ) { const intervalGroup = - interval === 'Weekly' - ? { $day: '$date' } - : interval === 'Daily' - ? { $day: '$date' } - : interval === 'Monthly' - ? { $month: '$date' } - : { $year: '$date' }; + interval === 'Monthly' + ? { $month: '$date' } + : interval === 'Yearly' + ? { $year: '$date' } + : { $day: '$date' }; const intervalFilter = interval === 'Weekly' ? '$day' diff --git a/packages/loot-core/src/shared/months.ts b/packages/loot-core/src/shared/months.ts index a0c95243969..49108e8cb0c 100644 --- a/packages/loot-core/src/shared/months.ts +++ b/packages/loot-core/src/shared/months.ts @@ -4,26 +4,6 @@ import memoizeOne from 'memoize-one'; import * as Platform from '../client/platform'; -function isoWeekSettings( - date: Date, - type: string, - firstDayOfWeekIdx: number, -): Date { - const checkNull = firstDayOfWeekIdx === undefined ? 1 : firstDayOfWeekIdx + 1; - const subNum = - d.getISODay(date) === 7 && checkNull === 1 - ? -6 - : d.getISODay(date) + 1 >= checkNull - ? 2 - checkNull - : 9 - checkNull; - - if (type === 'start') { - return _parse(subDays(d.startOfISOWeek(date), subNum)); - } else { - return _parse(subDays(d.startOfISOWeek(date), subNum - 6)); - } -} - type DateLike = string | Date; export function _parse(value: DateLike): Date { @@ -109,10 +89,10 @@ export function monthFromDate(date: DateLike): string { export function weekFromDate( date: DateLike, - firstDayOfWeekIdx: number, + firstDayOfWeekIdx: 0 | 1 | 2 | 3 | 4 | 5 | 6, ): string { return d.format( - isoWeekSettings(_parse(date), 'start', firstDayOfWeekIdx), + _parse(d.startOfWeek(_parse(date), { weekStartsOn: firstDayOfWeekIdx })), 'yyyy-MM-dd', ); } @@ -129,12 +109,14 @@ export function currentMonth(): string { } } -export function currentWeek(firstDayOfWeekIdx?: number): string { +export function currentWeek( + firstDayOfWeekIdx?: 0 | 1 | 2 | 3 | 4 | 5 | 6, +): string { if (global.IS_TESTING || Platform.isPlaywright) { return global.currentWeek || '2017-01-01'; } else { return d.format( - isoWeekSettings(new Date(), 'start', firstDayOfWeekIdx), + _parse(d.startOfWeek(new Date(), { weekStartsOn: firstDayOfWeekIdx })), 'yyyy-MM-dd', ); } @@ -266,7 +248,7 @@ export function _weekRange( start: DateLike, end: DateLike, inclusive = false, - firstDayOfWeekIdx?: number, + firstDayOfWeekIdx?: 0 | 1 | 2 | 3 | 4 | 5 | 6, ): string[] { const weeks: string[] = []; let week = weekFromDate(start, firstDayOfWeekIdx); @@ -285,7 +267,7 @@ export function _weekRange( export function weekRangeInclusive( start: DateLike, end: DateLike, - firstDayOfWeekIdx?: number, + firstDayOfWeekIdx?: 0 | 1 | 2 | 3 | 4 | 5 | 6, ): string[] { return _weekRange(start, end, true, firstDayOfWeekIdx); } @@ -365,9 +347,12 @@ export function getMonthEnd(day: string): string { return subDays(nextMonth(day.slice(0, 7)) + '-01', 1); } -export function getWeekEnd(date: DateLike, firstDayOfWeekIdx?: number): string { +export function getWeekEnd( + date: DateLike, + firstDayOfWeekIdx?: 0 | 1 | 2 | 3 | 4 | 5 | 6, +): string { return d.format( - isoWeekSettings(_parse(date), 'end', firstDayOfWeekIdx), + _parse(d.endOfWeek(_parse(date), { weekStartsOn: firstDayOfWeekIdx })), 'yyyy-MM-dd', ); }