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