diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--14404-in-the-page-header-opens-the-month-menu-modal-3-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--14404-in-the-page-header-opens-the-month-menu-modal-3-chromium-linux.png index d6e730792b6..d5954385694 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--14404-in-the-page-header-opens-the-month-menu-modal-3-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--14404-in-the-page-header-opens-the-month-menu-modal-3-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--321fd-ed-amount-opens-the-budget-summary-menu-modal-2-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--321fd-ed-amount-opens-the-budget-summary-menu-modal-2-chromium-linux.png index 76654922336..b31314a5707 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--321fd-ed-amount-opens-the-budget-summary-menu-modal-2-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--321fd-ed-amount-opens-the-budget-summary-menu-modal-2-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--4bb70-ed-amount-opens-the-budget-summary-menu-modal-1-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--4bb70-ed-amount-opens-the-budget-summary-menu-modal-1-chromium-linux.png index 38610d41744..f400d85a126 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--4bb70-ed-amount-opens-the-budget-summary-menu-modal-1-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--4bb70-ed-amount-opens-the-budget-summary-menu-modal-1-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--6ab37-roup-name-opens-the-category-group-menu-modal-1-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--6ab37-roup-name-opens-the-category-group-menu-modal-1-chromium-linux.png index 18443aa0897..488a1a1eef8 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--6ab37-roup-name-opens-the-category-group-menu-modal-1-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--6ab37-roup-name-opens-the-category-group-menu-modal-1-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--94a79-roup-name-opens-the-category-group-menu-modal-2-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--94a79-roup-name-opens-the-category-group-menu-modal-2-chromium-linux.png index 8d67f0370be..864a20db262 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--94a79-roup-name-opens-the-category-group-menu-modal-2-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--94a79-roup-name-opens-the-category-group-menu-modal-2-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--94a85-ed-amount-opens-the-budget-summary-menu-modal-3-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--94a85-ed-amount-opens-the-budget-summary-menu-modal-3-chromium-linux.png index 7ab2d96281a..08b9252de66 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--94a85-ed-amount-opens-the-budget-summary-menu-modal-3-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--94a85-ed-amount-opens-the-budget-summary-menu-modal-3-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--9e6aa-in-the-page-header-opens-the-budget-page-menu-1-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--9e6aa-in-the-page-header-opens-the-budget-page-menu-1-chromium-linux.png index 884a0f4128f..8095e242ede 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--9e6aa-in-the-page-header-opens-the-budget-page-menu-1-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--9e6aa-in-the-page-header-opens-the-budget-page-menu-1-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--bbde3-roup-name-opens-the-category-group-menu-modal-3-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--bbde3-roup-name-opens-the-category-group-menu-modal-3-chromium-linux.png index c0d986ac04f..fe047e927c7 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--bbde3-roup-name-opens-the-category-group-menu-modal-3-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--bbde3-roup-name-opens-the-category-group-menu-modal-3-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--bed18-in-the-page-header-opens-the-month-menu-modal-1-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--bed18-in-the-page-header-opens-the-month-menu-modal-1-chromium-linux.png index 4df329fd58f..702e3ee8ff2 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--bed18-in-the-page-header-opens-the-month-menu-modal-1-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--bed18-in-the-page-header-opens-the-month-menu-modal-1-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--ceb3a-in-the-page-header-opens-the-month-menu-modal-2-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--ceb3a-in-the-page-header-opens-the-month-menu-modal-2-chromium-linux.png index a63219d6de3..41cced4df73 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--ceb3a-in-the-page-header-opens-the-month-menu-modal-2-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--ceb3a-in-the-page-header-opens-the-month-menu-modal-2-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--d270d-in-the-page-header-opens-the-budget-page-menu-2-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--d270d-in-the-page-header-opens-the-budget-page-menu-2-chromium-linux.png index b9ba2b27d1e..36d8a1a9b35 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--d270d-in-the-page-header-opens-the-budget-page-menu-2-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--d270d-in-the-page-header-opens-the-budget-page-menu-2-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--fdd57-in-the-page-header-opens-the-budget-page-menu-3-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--fdd57-in-the-page-header-opens-the-budget-page-menu-3-chromium-linux.png index d75d89ff1ba..ac2b51b1a84 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--fdd57-in-the-page-header-opens-the-budget-page-menu-3-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking--fdd57-in-the-page-header-opens-the-budget-page-menu-3-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-balance-cell-opens-the-balance-menu-modal-1-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-balance-cell-opens-the-balance-menu-modal-1-chromium-linux.png index 7d516a7189e..9a4018ca1cc 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-balance-cell-opens-the-balance-menu-modal-1-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-balance-cell-opens-the-balance-menu-modal-1-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-balance-cell-opens-the-balance-menu-modal-2-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-balance-cell-opens-the-balance-menu-modal-2-chromium-linux.png index 034d3082d75..26354764c8e 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-balance-cell-opens-the-balance-menu-modal-2-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-balance-cell-opens-the-balance-menu-modal-2-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-balance-cell-opens-the-balance-menu-modal-3-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-balance-cell-opens-the-balance-menu-modal-3-chromium-linux.png index 03936745669..6aaaed2de0d 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-balance-cell-opens-the-balance-menu-modal-3-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-balance-cell-opens-the-balance-menu-modal-3-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-budgeted-cell-opens-the-budget-menu-modal-1-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-budgeted-cell-opens-the-budget-menu-modal-1-chromium-linux.png index ad6a4abf307..e2cdde0d388 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-budgeted-cell-opens-the-budget-menu-modal-1-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-budgeted-cell-opens-the-budget-menu-modal-1-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-budgeted-cell-opens-the-budget-menu-modal-2-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-budgeted-cell-opens-the-budget-menu-modal-2-chromium-linux.png index 2e97ccad230..e349b84c89a 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-budgeted-cell-opens-the-budget-menu-modal-2-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-budgeted-cell-opens-the-budget-menu-modal-2-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-budgeted-cell-opens-the-budget-menu-modal-3-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-budgeted-cell-opens-the-budget-menu-modal-3-chromium-linux.png index de6d2e71ce4..66c6fb6ea03 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-budgeted-cell-opens-the-budget-menu-modal-3-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-budgeted-cell-opens-the-budget-menu-modal-3-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-category-name-opens-the-category-menu-modal-1-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-category-name-opens-the-category-menu-modal-1-chromium-linux.png index f8440c8042b..f6ee99e7e85 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-category-name-opens-the-category-menu-modal-1-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-category-name-opens-the-category-menu-modal-1-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-category-name-opens-the-category-menu-modal-2-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-category-name-opens-the-category-menu-modal-2-chromium-linux.png index 3e85352b87b..f43f528db36 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-category-name-opens-the-category-menu-modal-2-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-category-name-opens-the-category-menu-modal-2-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-category-name-opens-the-category-menu-modal-3-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-category-name-opens-the-category-menu-modal-3-chromium-linux.png index 9f8ea6d6929..afab8bed374 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-category-name-opens-the-category-menu-modal-3-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Envelope-checks-that-clicking-the-category-name-opens-the-category-menu-modal-3-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--0ba04-nt-amount-opens-the-budget-summary-menu-modal-1-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--0ba04-nt-amount-opens-the-budget-summary-menu-modal-1-chromium-linux.png index 5dc07de4460..ce81ed35619 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--0ba04-nt-amount-opens-the-budget-summary-menu-modal-1-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--0ba04-nt-amount-opens-the-budget-summary-menu-modal-1-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--1ce6d-nt-amount-opens-the-budget-summary-menu-modal-2-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--1ce6d-nt-amount-opens-the-budget-summary-menu-modal-2-chromium-linux.png index 548b0a3d9a8..99485f83c0f 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--1ce6d-nt-amount-opens-the-budget-summary-menu-modal-2-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--1ce6d-nt-amount-opens-the-budget-summary-menu-modal-2-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--42062-in-the-page-header-opens-the-month-menu-modal-2-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--42062-in-the-page-header-opens-the-month-menu-modal-2-chromium-linux.png index 75a2f7234cc..6dac5c567f2 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--42062-in-the-page-header-opens-the-month-menu-modal-2-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--42062-in-the-page-header-opens-the-month-menu-modal-2-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--49fb6-in-the-page-header-opens-the-month-menu-modal-3-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--49fb6-in-the-page-header-opens-the-month-menu-modal-3-chromium-linux.png index 0a6d217ad52..0f9398c3873 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--49fb6-in-the-page-header-opens-the-month-menu-modal-3-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--49fb6-in-the-page-header-opens-the-month-menu-modal-3-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--5f098-roup-name-opens-the-category-group-menu-modal-1-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--5f098-roup-name-opens-the-category-group-menu-modal-1-chromium-linux.png index c599478f424..b3dced3da41 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--5f098-roup-name-opens-the-category-group-menu-modal-1-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--5f098-roup-name-opens-the-category-group-menu-modal-1-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--929be-roup-name-opens-the-category-group-menu-modal-3-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--929be-roup-name-opens-the-category-group-menu-modal-3-chromium-linux.png index 95f3f10b042..6d8cb23a464 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--929be-roup-name-opens-the-category-group-menu-modal-3-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--929be-roup-name-opens-the-category-group-menu-modal-3-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--a3783-in-the-page-header-opens-the-budget-page-menu-1-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--a3783-in-the-page-header-opens-the-budget-page-menu-1-chromium-linux.png index 6484a50e024..0eb679a919e 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--a3783-in-the-page-header-opens-the-budget-page-menu-1-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--a3783-in-the-page-header-opens-the-budget-page-menu-1-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--a8b5e-in-the-page-header-opens-the-budget-page-menu-3-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--a8b5e-in-the-page-header-opens-the-budget-page-menu-3-chromium-linux.png index f7136804f45..70175ca8492 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--a8b5e-in-the-page-header-opens-the-budget-page-menu-3-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--a8b5e-in-the-page-header-opens-the-budget-page-menu-3-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--b1562-in-the-page-header-opens-the-month-menu-modal-1-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--b1562-in-the-page-header-opens-the-month-menu-modal-1-chromium-linux.png index d89bd29270b..6443198c425 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--b1562-in-the-page-header-opens-the-month-menu-modal-1-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--b1562-in-the-page-header-opens-the-month-menu-modal-1-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--dc927-roup-name-opens-the-category-group-menu-modal-2-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--dc927-roup-name-opens-the-category-group-menu-modal-2-chromium-linux.png index f9556fe46c0..d43e779a9ce 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--dc927-roup-name-opens-the-category-group-menu-modal-2-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--dc927-roup-name-opens-the-category-group-menu-modal-2-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--f224f-nt-amount-opens-the-budget-summary-menu-modal-3-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--f224f-nt-amount-opens-the-budget-summary-menu-modal-3-chromium-linux.png index 28ffda6ae88..6bb02c428c4 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--f224f-nt-amount-opens-the-budget-summary-menu-modal-3-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--f224f-nt-amount-opens-the-budget-summary-menu-modal-3-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--f8a19-in-the-page-header-opens-the-budget-page-menu-2-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--f8a19-in-the-page-header-opens-the-budget-page-menu-2-chromium-linux.png index 73cd3660794..2660f55f70e 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--f8a19-in-the-page-header-opens-the-budget-page-menu-2-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking--f8a19-in-the-page-header-opens-the-budget-page-menu-2-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-balance-cell-opens-the-balance-menu-modal-1-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-balance-cell-opens-the-balance-menu-modal-1-chromium-linux.png index 91e45c2a9ee..839ef4511b3 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-balance-cell-opens-the-balance-menu-modal-1-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-balance-cell-opens-the-balance-menu-modal-1-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-balance-cell-opens-the-balance-menu-modal-2-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-balance-cell-opens-the-balance-menu-modal-2-chromium-linux.png index e43057e5fb1..5817e79f764 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-balance-cell-opens-the-balance-menu-modal-2-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-balance-cell-opens-the-balance-menu-modal-2-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-balance-cell-opens-the-balance-menu-modal-3-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-balance-cell-opens-the-balance-menu-modal-3-chromium-linux.png index 65aab550f2c..6c1c349ba81 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-balance-cell-opens-the-balance-menu-modal-3-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-balance-cell-opens-the-balance-menu-modal-3-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-budgeted-cell-opens-the-budget-menu-modal-1-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-budgeted-cell-opens-the-budget-menu-modal-1-chromium-linux.png index 7f442d933e2..12415a1b4cf 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-budgeted-cell-opens-the-budget-menu-modal-1-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-budgeted-cell-opens-the-budget-menu-modal-1-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-budgeted-cell-opens-the-budget-menu-modal-2-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-budgeted-cell-opens-the-budget-menu-modal-2-chromium-linux.png index 0025f5e29c7..3036ffbf68f 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-budgeted-cell-opens-the-budget-menu-modal-2-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-budgeted-cell-opens-the-budget-menu-modal-2-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-budgeted-cell-opens-the-budget-menu-modal-3-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-budgeted-cell-opens-the-budget-menu-modal-3-chromium-linux.png index aadd6efa3d0..79274e17487 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-budgeted-cell-opens-the-budget-menu-modal-3-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-budgeted-cell-opens-the-budget-menu-modal-3-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-category-name-opens-the-category-menu-modal-1-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-category-name-opens-the-category-menu-modal-1-chromium-linux.png index 75f8db9c1ce..5df130f15ee 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-category-name-opens-the-category-menu-modal-1-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-category-name-opens-the-category-menu-modal-1-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-category-name-opens-the-category-menu-modal-2-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-category-name-opens-the-category-menu-modal-2-chromium-linux.png index 66c1f799be3..4195428bb4e 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-category-name-opens-the-category-menu-modal-2-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-category-name-opens-the-category-menu-modal-2-chromium-linux.png differ diff --git a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-category-name-opens-the-category-menu-modal-3-chromium-linux.png b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-category-name-opens-the-category-menu-modal-3-chromium-linux.png index 0ab29fefb78..76fe25abd17 100644 Binary files a/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-category-name-opens-the-category-menu-modal-3-chromium-linux.png and b/packages/desktop-client/e2e/budget.mobile.test.js-snapshots/Mobile-Budget-Tracking-checks-that-clicking-the-category-name-opens-the-category-menu-modal-3-chromium-linux.png differ diff --git a/packages/desktop-client/src/components/autocomplete/CategoryAutocomplete.tsx b/packages/desktop-client/src/components/autocomplete/CategoryAutocomplete.tsx index f223b6335ac..7a81c5058a8 100644 --- a/packages/desktop-client/src/components/autocomplete/CategoryAutocomplete.tsx +++ b/packages/desktop-client/src/components/autocomplete/CategoryAutocomplete.tsx @@ -88,7 +88,8 @@ function CategoryList({ { + const { isNarrowWidth } = useResponsive(); const { enableScope, disableScope } = useHotkeysContext(); // This deactivates any key handlers in the "app" scope @@ -82,7 +84,15 @@ export const Modal = ({ alignItems: 'center', justifyContent: 'center', fontSize: 14, - backdropFilter: 'blur(1px) brightness(0.9)', + willChange: 'transform', + // on mobile, we disable the blurred background for performance reasons + ...(isNarrowWidth + ? { + backgroundColor: 'rgba(0, 0, 0, 0.4)', + } + : { + backdropFilter: 'blur(1px) brightness(0.9)', + }), ...style, }} {...props} diff --git a/packages/desktop-client/src/components/reports/DateRange.tsx b/packages/desktop-client/src/components/reports/DateRange.tsx index 6734a0b8ec5..29d743064b4 100644 --- a/packages/desktop-client/src/components/reports/DateRange.tsx +++ b/packages/desktop-client/src/components/reports/DateRange.tsx @@ -2,6 +2,8 @@ import React, { type ReactElement } from 'react'; import * as d from 'date-fns'; +import * as monthUtils from 'loot-core/src/shared/months'; + import { theme } from '../../style'; import { styles } from '../../style/styles'; import { Block } from '../common/Block'; @@ -14,8 +16,8 @@ type DateRangeProps = { }; function checkDate(date: string) { - const dateParsed = new Date(date); - if (dateParsed.toString() !== 'Invalid Date') { + const dateParsed = monthUtils.parseDate(date); + if (dateParsed) { return d.format(dateParsed, 'yyyy-MM-dd'); } else { return null; diff --git a/packages/desktop-client/src/components/reports/ReportOptions.ts b/packages/desktop-client/src/components/reports/ReportOptions.ts index e96b14c0f32..1ef7d652e9d 100644 --- a/packages/desktop-client/src/components/reports/ReportOptions.ts +++ b/packages/desktop-client/src/components/reports/ReportOptions.ts @@ -232,49 +232,32 @@ export type QueryDataEntity = { amount: number; }; +type UncategorizedId = 'off_budget' | 'transfer' | 'other' | 'all'; + export type UncategorizedEntity = Pick< CategoryEntity, - 'id' | 'name' | 'hidden' + 'id' | 'name' | 'hidden' | 'cat_group' > & { - /* - When looking at uncategorized and hidden transactions we - need a way to group them. To do this we give them a unique - uncategorized_id. We also need a way to filter the - transctions from our query. For this we use the 3 variables - below. - */ - uncategorized_id?: string; - is_off_budget?: boolean; - is_transfer?: boolean; - has_category?: boolean; + uncategorized_id?: UncategorizedId; }; const uncategorizedCategory: UncategorizedEntity = { id: '', name: 'Uncategorized', - uncategorized_id: '1', + uncategorized_id: 'other', hidden: false, - is_off_budget: false, - is_transfer: false, - has_category: false, }; const transferCategory: UncategorizedEntity = { id: '', name: 'Transfers', - uncategorized_id: '2', + uncategorized_id: 'transfer', hidden: false, - is_off_budget: false, - is_transfer: true, - has_category: false, }; const offBudgetCategory: UncategorizedEntity = { id: '', name: 'Off Budget', - uncategorized_id: '3', + uncategorized_id: 'off_budget', hidden: false, - is_off_budget: true, - is_transfer: false, - has_category: true, }; type UncategorizedGroupEntity = Pick< @@ -282,12 +265,14 @@ type UncategorizedGroupEntity = Pick< 'name' | 'id' | 'hidden' > & { categories?: UncategorizedEntity[]; + uncategorized_id?: UncategorizedId; }; const uncategorizedGroup: UncategorizedGroupEntity = { name: 'Uncategorized & Off Budget', id: 'uncategorized', hidden: false, + uncategorized_id: 'all', categories: [uncategorizedCategory, transferCategory, offBudgetCategory], }; @@ -302,7 +287,7 @@ export const categoryLists = (categories: { const catGroupB = categories.grouped.find(f => f.id === b.cat_group); //initial check that both a and b have a sort_order and category group return a.sort_order && b.sort_order && catGroupA && catGroupB - ? /*sorting by "is_income" because sort_order for this group is + ? /*sorting by "is_income" because sort_order for this group is separate from other groups*/ Number(catGroupA.is_income) - Number(catGroupB.is_income) || //Next, sorting by group sort_order @@ -342,7 +327,12 @@ export const groupBySelections = ( break; case 'Group': groupByList = categoryGroup.map(group => { - return { id: group.id, name: group.name, hidden: group.hidden }; + return { + ...group, + id: group.id, + name: group.name, + hidden: group.hidden, + }; }); groupByLabel = 'categoryGroup'; break; diff --git a/packages/desktop-client/src/components/reports/reports/CustomReport.tsx b/packages/desktop-client/src/components/reports/reports/CustomReport.tsx index a3a438b0909..8a31f038061 100644 --- a/packages/desktop-client/src/components/reports/reports/CustomReport.tsx +++ b/packages/desktop-client/src/components/reports/reports/CustomReport.tsx @@ -1,4 +1,5 @@ import React, { useState, useEffect, useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; import { useLocation } from 'react-router-dom'; import * as d from 'date-fns'; @@ -102,6 +103,7 @@ function useSelectedCategories( } export function CustomReport() { + const { t } = useTranslation(); const categories = useCategories(); const { isNarrowWidth } = useResponsive(); const [_firstDayOfWeekIdx] = useSyncedPref('firstDayOfWeekIdx'); @@ -644,16 +646,20 @@ export function CustomReport() { header={ isNarrowWidth ? ( } /> ) : ( - Custom Report: + {t('Custom Report:')} - {report.name || 'Unsaved report'} + {report.name || t('Unsaved report')} } @@ -766,8 +772,9 @@ export function CustomReport() { {hasWarning && ( - This report is configured to use a non-existing filter value - (i.e. category/account/payee). + {t( + 'This report is configured to use a non-existing filter value (i.e. category/account/payee).', + )} )} @@ -830,7 +837,7 @@ export function CustomReport() { intervalsCount={intervals.length} /> ) : ( - + )} 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 1afe00b3a40..bbfec733876 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/custom-spreadsheet.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/custom-spreadsheet.ts @@ -145,6 +145,8 @@ export function createCustomSpreadsheet({ let netAssets = 0; let netDebts = 0; + const groupsByCategory = + groupByLabel === 'category' || groupByLabel === 'categoryGroup'; const intervalData = intervals.reduce( (arr: IntervalEntity[], intervalItem, index) => { let perIntervalAssets = 0; @@ -163,11 +165,13 @@ export function createCustomSpreadsheet({ showOffBudget, showHiddenCategories, showUncategorized, + groupsByCategory, ) .filter( asset => asset.date === intervalItem && - asset[groupByLabel] === (item.id ?? null), + (asset[groupByLabel] === (item.id ?? null) || + (item.uncategorized_id && groupsByCategory)), ) .reduce((a, v) => (a = a + v.amount), 0); perIntervalAssets += intervalAssets; @@ -178,11 +182,13 @@ export function createCustomSpreadsheet({ showOffBudget, showHiddenCategories, showUncategorized, + groupsByCategory, ) .filter( debt => debt.date === intervalItem && - debt[groupByLabel] === (item.id ?? null), + (debt[groupByLabel] === (item.id ?? null) || + (item.uncategorized_id && groupsByCategory)), ) .reduce((a, v) => (a = a + v.amount), 0); perIntervalDebts += intervalDebts; diff --git a/packages/desktop-client/src/components/reports/spreadsheets/filterHiddenItems.ts b/packages/desktop-client/src/components/reports/spreadsheets/filterHiddenItems.ts index 538f5c599d1..492e8def099 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/filterHiddenItems.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/filterHiddenItems.ts @@ -9,43 +9,42 @@ export function filterHiddenItems( showOffBudget?: boolean, showHiddenCategories?: boolean, showUncategorized?: boolean, + groupByCategory?: boolean, ) { const showHide = data - .filter(e => - !showHiddenCategories - ? e.categoryHidden === false && e.categoryGroupHidden === false - : true, + .filter( + e => + showHiddenCategories || + (e.categoryHidden === false && e.categoryGroupHidden === false), ) - .filter(f => - showOffBudget - ? showUncategorized - ? //true,true - true - : //true,false - f.category !== null || - f.accountOffBudget !== false || - f.transferAccount !== null - : showUncategorized - ? //false, true - f.accountOffBudget === false && - (f.transferAccount === null || f.category !== null) - : //false false - f.category !== null && f.accountOffBudget === false, + .filter(e => showOffBudget || e.accountOffBudget === false) + .filter( + e => + showUncategorized || e.category !== null || e.accountOffBudget === true, ); return showHide.filter(query => { - if (!item.uncategorized_id) { - return true; - } + if (!groupByCategory) return true; + + const hasCategory = !!query.category; + const isOffBudget = query.accountOffBudget; + const isTransfer = !!query.transferAccount; - const isTransfer = item.is_transfer - ? query.transferAccount - : !query.transferAccount; - const isHidden = item.has_category ? true : !query.category; - const isOffBudget = item.is_off_budget - ? query.accountOffBudget - : !query.accountOffBudget; + if (hasCategory && !isOffBudget) { + return item.uncategorized_id == null; + } - return isTransfer && isHidden && isOffBudget; + switch (item.uncategorized_id) { + case 'off_budget': + return isOffBudget; + case 'transfer': + return isTransfer && !isOffBudget; + case 'other': + return !isOffBudget && !isTransfer; + case 'all': + return true; + default: + return false; + } }); } 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 26b7e943921..799f0589ba1 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/grouped-spreadsheet.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/grouped-spreadsheet.ts @@ -2,11 +2,7 @@ import { runQuery } from 'loot-core/src/client/query-helpers'; import { type useSpreadsheet } from 'loot-core/src/client/SpreadsheetProvider'; import { send } from 'loot-core/src/platform/client/fetch'; import * as monthUtils from 'loot-core/src/shared/months'; -import { integerToAmount } from 'loot-core/src/shared/util'; -import { - type IntervalEntity, - type GroupedEntity, -} from 'loot-core/src/types/models/reports'; +import { type GroupedEntity } from 'loot-core/src/types/models/reports'; import { categoryLists, @@ -16,7 +12,6 @@ import { import { type createCustomSpreadsheetProps } from './custom-spreadsheet'; import { filterEmptyRows } from './filterEmptyRows'; -import { filterHiddenItems } from './filterHiddenItems'; import { makeQuery } from './makeQuery'; import { recalculate } from './recalculate'; @@ -98,85 +93,18 @@ export function createGroupedSpreadsheet({ const groupedData: GroupedEntity[] = categoryGroup.map( group => { - let totalAssets = 0; - let totalDebts = 0; - let netAssets = 0; - let netDebts = 0; - - const intervalData = intervals.reduce( - (arr: IntervalEntity[], intervalItem) => { - let groupedAssets = 0; - let groupedDebts = 0; - let groupedNetAssets = 0; - let groupedNetDebts = 0; - let groupedTotals = 0; - - if (!group.categories) { - return []; - } - - group.categories.forEach(item => { - const intervalAssets = filterHiddenItems( - item, - assets, - showOffBudget, - showHiddenCategories, - showUncategorized, - ) - .filter( - asset => - asset.date === intervalItem && - asset.category === (item.id ?? null), - ) - .reduce((a, v) => (a = a + v.amount), 0); - groupedAssets += intervalAssets; - - const intervalDebts = filterHiddenItems( - item, - debts, - showOffBudget, - showHiddenCategories, - showUncategorized, - ) - .filter( - debts => - debts.date === intervalItem && - debts.category === (item.id ?? null), - ) - .reduce((a, v) => (a = a + v.amount), 0); - groupedDebts += intervalDebts; - - const intervalTotals = intervalAssets + intervalDebts; - - groupedNetAssets = - intervalTotals > 0 - ? groupedNetAssets + intervalTotals - : groupedNetAssets; - groupedNetDebts = - intervalTotals < 0 - ? groupedNetDebts + intervalTotals - : groupedNetDebts; - groupedTotals += intervalTotals; - }); - - totalAssets += groupedAssets; - totalDebts += groupedDebts; - netAssets += groupedNetAssets; - netDebts += groupedNetDebts; - - arr.push({ - date: intervalItem, - totalAssets: integerToAmount(groupedAssets), - totalDebts: integerToAmount(groupedDebts), - netAssets: integerToAmount(groupedNetAssets), - netDebts: integerToAmount(groupedNetDebts), - totalTotals: integerToAmount(groupedTotals), - }); - - return arr; - }, - [], - ); + const grouped = recalculate({ + item: group, + intervals, + assets, + debts, + groupByLabel: 'categoryGroup', + showOffBudget, + showHiddenCategories, + showUncategorized, + startDate, + endDate, + }); const stackedCategories = group.categories && @@ -197,14 +125,7 @@ export function createGroupedSpreadsheet({ }); return { - id: group.id || '', - name: group.name, - totalAssets: integerToAmount(totalAssets), - totalDebts: integerToAmount(totalDebts), - netAssets: integerToAmount(netAssets), - netDebts: integerToAmount(netDebts), - totalTotals: integerToAmount(totalAssets + totalDebts), - intervalData, + ...grouped, categories: stackedCategories && stackedCategories.filter(i => diff --git a/packages/desktop-client/src/components/reports/spreadsheets/recalculate.ts b/packages/desktop-client/src/components/reports/spreadsheets/recalculate.ts index d0dc1e1c9f9..c0e21f37fa5 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/recalculate.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/recalculate.ts @@ -43,17 +43,21 @@ export function recalculate({ (arr: IntervalEntity[], intervalItem, index) => { const last = arr.length === 0 ? null : arr[arr.length - 1]; + const groupsByCategory = + groupByLabel === 'category' || groupByLabel === 'categoryGroup'; const intervalAssets = filterHiddenItems( item, assets, showOffBudget, showHiddenCategories, showUncategorized, + groupsByCategory, ) .filter( asset => asset.date === intervalItem && - asset[groupByLabel] === (item.id ?? null), + (asset[groupByLabel] === (item.id ?? null) || + (item.uncategorized_id && groupsByCategory)), ) .reduce((a, v) => (a = a + v.amount), 0); totalAssets += intervalAssets; @@ -64,11 +68,13 @@ export function recalculate({ showOffBudget, showHiddenCategories, showUncategorized, + groupsByCategory, ) .filter( debt => debt.date === intervalItem && - debt[groupByLabel] === (item.id ?? null), + (debt[groupByLabel] === (item.id ?? null) || + (item.uncategorized_id && groupsByCategory)), ) .reduce((a, v) => (a = a + v.amount), 0); totalDebts += intervalDebts; diff --git a/packages/desktop-client/src/components/reports/spreadsheets/spending-spreadsheet.ts b/packages/desktop-client/src/components/reports/spreadsheets/spending-spreadsheet.ts index 851b4751efb..997bcd3a5a0 100644 --- a/packages/desktop-client/src/components/reports/spreadsheets/spending-spreadsheet.ts +++ b/packages/desktop-client/src/components/reports/spreadsheets/spending-spreadsheet.ts @@ -194,7 +194,11 @@ export function createSpendingSpreadsheet({ } return null; }); - if (month.month >= startDate && month.month < compare) { + + if ( + month.month >= monthUtils.monthFromDate(startDate) && + month.month < compare + ) { if (day === '28') { if (monthUtils.getMonthEnd(intervalItem) === intervalItem) { averageSum += cumulativeAssets + cumulativeDebts; diff --git a/packages/desktop-client/src/components/transactions/TransactionList.jsx b/packages/desktop-client/src/components/transactions/TransactionList.jsx index 0a7784e0472..abd0cb2f030 100644 --- a/packages/desktop-client/src/components/transactions/TransactionList.jsx +++ b/packages/desktop-client/src/components/transactions/TransactionList.jsx @@ -106,6 +106,7 @@ export function TransactionList({ const onSave = useCallback(async transaction => { const changes = updateTransaction(transactionsLatest.current, transaction); + transactionsLatest.current = changes.data; if (changes.diff.updated.length > 0) { const dateChanged = !!changes.diff.updated[0].date; diff --git a/packages/desktop-client/src/hooks/useLocalPref.ts b/packages/desktop-client/src/hooks/useLocalPref.ts index 3da16da937c..d5c236cc766 100644 --- a/packages/desktop-client/src/hooks/useLocalPref.ts +++ b/packages/desktop-client/src/hooks/useLocalPref.ts @@ -1,5 +1,3 @@ -import { useEffect } from 'react'; - import { useLocalStorage } from 'usehooks-ts'; import { type LocalPrefs } from 'loot-core/src/types/prefs'; @@ -18,25 +16,8 @@ export function useLocalPref( ): [LocalPrefs[K], SetLocalPrefAction] { const [budgetId] = useMetadataPref('id'); - const [value, setValue] = useLocalStorage( - `${budgetId}-${prefName}`, - undefined, - { - deserializer: JSON.parse, - serializer: JSON.stringify, - }, - ); - - // Migrate from old pref storage location (metadata.json) to local storage - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const [metadataPref] = useMetadataPref(prefName as any); - useEffect(() => { - if (value !== undefined || metadataPref === undefined) { - return; - } - - setValue(metadataPref); - }, [value, metadataPref, setValue]); - - return [value, setValue]; + return useLocalStorage(`${budgetId}-${prefName}`, undefined, { + deserializer: JSON.parse, + serializer: JSON.stringify, + }); } diff --git a/packages/loot-core/src/client/actions/account.ts b/packages/loot-core/src/client/actions/account.ts index e10263f6cb0..426f63a9711 100644 --- a/packages/loot-core/src/client/actions/account.ts +++ b/packages/loot-core/src/client/actions/account.ts @@ -62,10 +62,6 @@ export function linkAccount( offBudget?: boolean, ) { return async (dispatch: Dispatch) => { - if (upgradingId) { - await dispatch(setAccountsSyncing([upgradingId])); - } - await send('gocardless-accounts-link', { requisitionId, account, @@ -83,10 +79,6 @@ export function linkAccountSimpleFin( offBudget?: boolean, ) { return async (dispatch: Dispatch) => { - if (upgradingId) { - await dispatch(setAccountsSyncing([upgradingId])); - } - await send('simplefin-accounts-link', { externalAccount, upgradingId, diff --git a/packages/loot-core/src/client/actions/queries.ts b/packages/loot-core/src/client/actions/queries.ts index 100912a0ede..f24c7912300 100644 --- a/packages/loot-core/src/client/actions/queries.ts +++ b/packages/loot-core/src/client/actions/queries.ts @@ -33,10 +33,16 @@ export function applyBudgetAction(month, type, args) { dispatch(addNotification(await send('budget/check-templates'))); break; case 'apply-goal-template': - await send('budget/apply-goal-template', { month }); + dispatch( + addNotification(await send('budget/apply-goal-template', { month })), + ); break; case 'overwrite-goal-template': - await send('budget/overwrite-goal-template', { month }); + dispatch( + addNotification( + await send('budget/overwrite-goal-template', { month }), + ), + ); break; case 'cleanup-goal-template': dispatch( diff --git a/packages/loot-core/src/server/main.ts b/packages/loot-core/src/server/main.ts index a2a547173af..a7979f03781 100644 --- a/packages/loot-core/src/server/main.ts +++ b/packages/loot-core/src/server/main.ts @@ -1716,7 +1716,7 @@ handlers['download-budget'] = async function ({ fileId }) { const id = result.id; await handlers['load-budget']({ id }); result = await handlers['sync-budget'](); - await handlers['close-budget'](); + if (result.error) { return result; } diff --git a/packages/loot-core/src/server/server-config.ts b/packages/loot-core/src/server/server-config.ts index 79f4933254e..df30b721f43 100644 --- a/packages/loot-core/src/server/server-config.ts +++ b/packages/loot-core/src/server/server-config.ts @@ -27,13 +27,22 @@ export function setServer(url: string): void { // `url` is optional; if not given it will provide the global config export function getServer(url?: string): ServerConfig | null { if (url) { - return { - BASE_SERVER: url, - SYNC_SERVER: joinURL(url, '/sync'), - SIGNUP_SERVER: joinURL(url, '/account'), - GOCARDLESS_SERVER: joinURL(url, '/gocardless'), - SIMPLEFIN_SERVER: joinURL(url, '/simplefin'), - }; + try { + return { + BASE_SERVER: url, + SYNC_SERVER: joinURL(url, '/sync'), + SIGNUP_SERVER: joinURL(url, '/account'), + GOCARDLESS_SERVER: joinURL(url, '/gocardless'), + SIMPLEFIN_SERVER: joinURL(url, '/simplefin'), + }; + } catch (error) { + console.warn( + 'Unable to parse server URL - using the global config.', + { config }, + error, + ); + return config; + } } return config; } diff --git a/upcoming-release-notes/3343.md b/upcoming-release-notes/3343.md new file mode 100644 index 00000000000..a70475c94f6 --- /dev/null +++ b/upcoming-release-notes/3343.md @@ -0,0 +1,6 @@ +--- +category: Bugfix +authors: [tim-smart] +--- + +Fix slow scrolling in mobile modals diff --git a/upcoming-release-notes/3633.md b/upcoming-release-notes/3633.md new file mode 100644 index 00000000000..7b8a748adce --- /dev/null +++ b/upcoming-release-notes/3633.md @@ -0,0 +1,6 @@ +--- +category: Bugfix +authors: [UnderKoen] +--- + +Fix 'show uncategorized' and 'show off budget' for custom reports diff --git a/upcoming-release-notes/3717.md b/upcoming-release-notes/3717.md new file mode 100644 index 00000000000..7d15f5f138d --- /dev/null +++ b/upcoming-release-notes/3717.md @@ -0,0 +1,6 @@ +--- +category: Bugfix +authors: [MikesGlitch] +--- + +Fix race condition during downloading budget. diff --git a/upcoming-release-notes/3718.md b/upcoming-release-notes/3718.md new file mode 100644 index 00000000000..a62702a5925 --- /dev/null +++ b/upcoming-release-notes/3718.md @@ -0,0 +1,6 @@ +--- +category: Maintenance +authors: [MatissJanis] +--- + +SyncedPrefs: remove no longer necessary migration. diff --git a/upcoming-release-notes/3720.md b/upcoming-release-notes/3720.md new file mode 100644 index 00000000000..b05be5611eb --- /dev/null +++ b/upcoming-release-notes/3720.md @@ -0,0 +1,6 @@ +--- +category: Bugfix +authors: [MatissJanis] +--- + +Revert initial bank-sync operation status indicator change. diff --git a/upcoming-release-notes/3721.md b/upcoming-release-notes/3721.md new file mode 100644 index 00000000000..e01b303f961 --- /dev/null +++ b/upcoming-release-notes/3721.md @@ -0,0 +1,6 @@ +--- +category: Bugfix +authors: [youngcw] +--- + +Fix template notifications not showing diff --git a/upcoming-release-notes/3722.md b/upcoming-release-notes/3722.md new file mode 100644 index 00000000000..708b67c9269 --- /dev/null +++ b/upcoming-release-notes/3722.md @@ -0,0 +1,6 @@ +--- +category: Enhancements +authors: [AhmedElbohoty] +--- + +Translation support for desktop-client/src/components/reports/reports/CustomReport.tsx diff --git a/upcoming-release-notes/3723.md b/upcoming-release-notes/3723.md new file mode 100644 index 00000000000..737ce272555 --- /dev/null +++ b/upcoming-release-notes/3723.md @@ -0,0 +1,6 @@ +--- +category: Bugfix +authors: [joel-rich] +--- + +Fix issue with Monthly Spending report not properly averaging previous three months diff --git a/upcoming-release-notes/3728.md b/upcoming-release-notes/3728.md new file mode 100644 index 00000000000..69309c77d4b --- /dev/null +++ b/upcoming-release-notes/3728.md @@ -0,0 +1,6 @@ +--- +category: Bugfix +authors: [lelemm] +--- + +Fix Distribute button calculates splits one at a time. diff --git a/upcoming-release-notes/3735.md b/upcoming-release-notes/3735.md new file mode 100644 index 00000000000..d673a6f13ad --- /dev/null +++ b/upcoming-release-notes/3735.md @@ -0,0 +1,6 @@ +--- +category: Bugfix +authors: [carkom] +--- + +Fix parse date in DateRange element which is causing the cards to display the wrong dates. diff --git a/upcoming-release-notes/3736.md b/upcoming-release-notes/3736.md new file mode 100644 index 00000000000..71d80fd35f7 --- /dev/null +++ b/upcoming-release-notes/3736.md @@ -0,0 +1,6 @@ +--- +category: Bugfix +authors: [MikesGlitch] +--- + +Add extra error handling for when an incorrect server URL has been setup