Compare commits

...

308 Commits

Author SHA1 Message Date
Joel Jeremy Marquez
f515ed81a0 DB models 2025-01-27 13:37:14 -08:00
Joel Jeremy Marquez
4fe5834532 Fix types 2025-01-24 14:10:29 -08:00
Joel Jeremy Marquez
999ed1cb3d Release notes 2025-01-24 14:00:56 -08:00
Joel Jeremy Marquez
ab40428ed3 [TypeScript] Make runQuery generic 2025-01-24 13:50:49 -08:00
Samuel Barnes
f09f4af667 Custom upcoming length (#4206)
* save button

* release notes

* custom component shows

* custom input and saving working

* updated getUpcomingDays to handle custom values

* close modal after save

* test around getUpcomingDays

* updated to use more accurate timespan calculation

* fix for scheduled events only occurring till end of period

* add a day

* fixed input step down
2025-01-23 19:56:43 +00:00
Joel Jeremy Marquez
1f5e5d41a4 Remove unnecessary dispatch calls that are already being handled by shared-listeners.ts (#4179)
* Remove unnecessary dispatch calls that are already being handles by shared-listeners.ts

* Release notes

* Fix lint error
2025-01-23 08:28:05 -08:00
Matt Fiddaman
46f04f5d4c fix mobile template application e2e test (#4223) 2025-01-23 16:13:27 +00:00
Matt Fiddaman
caaa801d24 add option to complete non-recurring schedules from transaction menu (#4180) 2025-01-23 15:18:33 +00:00
youngcw
5448a5c264 🐛 [Goals]: Fix notifications not showing for single category template applications (#4222)
* show broken transfers

* more detail

* feat: add step to fix splits for fixing transfers with categories that should not be there

* reword

* update the setting

* note

* lint

* typo

* another misspelling

* fix single notification

* note

* Update VRT

* run checks

---------

Co-authored-by: UnderKoen <koenvanstaveren@hotmail.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-22 18:02:51 -07:00
youngcw
977657a0be Identify and fix broken transfers (#4216)
* show broken transfers

* more detail

* feat: add step to fix splits for fixing transfers with categories that should not be there

* reword

* update the setting

* note

* lint

* typo

* another misspelling

---------

Co-authored-by: UnderKoen <koenvanstaveren@hotmail.com>
2025-01-22 17:07:15 -07:00
Matt Fiddaman
2f8b839036 release schedule upcoming length adjustment (#4173)
* release schedule upcoming length adjustment

* note

* Update VRT

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-22 20:09:27 +00:00
DarkWolfSLV
1cf64f87ab Display transaction notes on mobile, fixes #1764 (#4159)
* Display transaction notes on mobile, fixes #1764

* Display transaction notes on mobile, fixes #1764

* Display transaction notes on mobile, fixes #1764

* Display transaction notes on mobile, fixes #1764

* Moving the notes to the bottom

* Moving the notes to the bottom - right file.

* Updating the code as requested

* Adding conditional rendering as suggested by Bugs Bunny

* Adding conditional rendering as suggested by Bugs Bunny and lint

---------

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2025-01-22 09:08:24 -08:00
Joel Jeremy Marquez
012cfd09ea [TypeScript] Convert playwright config and tests to TS (#4217)
* Convert playwright config and tests to TS

* Release notes

* Update VRT

* Dummy commit

* Delete js snapshots

* Fix call to expect

* Move extended expect and test to fixtures

* Fix wrong commit

* Fix typecheck error

* Update VRT

* Dummy commit to run GH actions

* Delete mobile budget test JS

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-22 09:00:10 -08:00
Kate
39361e5b62 Spending Report: Fix budget category filtering (#4194)
* Spending: Fix budget comparison filters
- Previously only worked for category *is*, now should work for any category filters

* Add release notes

* Spending Report: Fix linting, remove unused filters from budget filter options
- Removed ability to select 'contains', 'doesNotContain', or 'matches' filters for budget categories

* enhance: add possibility for join between zero budget and category

---------

Co-authored-by: Koen van Staveren <koenvanstaveren@hotmail.com>
2025-01-22 10:08:05 +01:00
Joel Jeremy Marquez
f0c81eebbf Update global event listeners to handle sync server and DB update sync events (#4161)
* Update global event listeners

* Release notes

* Fix lint error
2025-01-21 22:18:06 -08:00
Joel Jeremy Marquez
a84af23e7e [e2e] Mobile budget menu modal VRT (#3583)
* Initial tests

* Mobile budget menu tests

* Fix + release notes

* Apply budget template test

* Fix test

* Fix category menu modal test

* Cleanup balance menu modal test

* Cleanup budget summary tests

* Updates

* Fix flakiness

* Cleanup

* Update packages/desktop-client/src/components/mobile/MobileNavTabs.tsx

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Cleanup based on coderabbit

* Fix flaky mobile test

* Assert data-navbar-state attribute

* Fix lint

* Update playwright timeout

* Remove Budget mode toggle logic

* VRT

* Update VRT

* Dummy commit

* Remove expect in mobile-navigation

* Update VRT

* Dummy commit to rerun GH actions

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-21 20:08:40 -08:00
Joel Jeremy Marquez
1442662eb7 [Typescript] Update validateBudgetName and uniqueBudgetName return types (#4208)
* Update validateBudgetName and uniqueBudgetName per coderabbit review

* Release notes
2025-01-21 10:44:03 -08:00
Joel Jeremy Marquez
4850034e6f [TypeScript] Add types to amount utils (#4207)
* Add types to amount utils

* Release notes
2025-01-21 10:03:54 -08:00
Matt Fiddaman
90dc050102 🌍 improve translation strings - part 2 (#4154) 2025-01-21 16:40:37 +00:00
Julian Dominguez-Schatz
7791b7401e Make Account.tsx compatible with exactOptionalPropertyTypes (#4189)
* Make `Account.tsx` compatible with `exactOptionalPropertyTypes`

* Add release notes
2025-01-20 21:40:43 -05:00
Julian Dominguez-Schatz
a97471557b Fix send types in a number of places (2/2) (#4147)
* Fix `send` types in a number of places

* Add release notes

* PR feedback
2025-01-20 17:09:27 -05:00
Joel Jeremy Marquez
dd2b0a8bd5 [Mobile] Fix "Category budget has been updated to ..." notification even when the budget was not updated (#4200)
* Fix FocusableAmountInput's onUpdate to only fire when amount was updated

* Release notes
2025-01-20 06:31:51 -08:00
Samuel Barnes
6cbf3e33e6 Fix type mismatch in getStatus (#4199)
* fixed type mismatch

* release notes

* updated references to submit string

* fixed type in test

* updated test to work with add days method
2025-01-20 08:40:28 +00:00
Pierre Payet
cdbf3e06c1 Fix: update toolbar server status on sync (#4075)
* fix/#3128: listen to 'sync-event' to update user data when sync status changed, so 'userData.offline' is up to date and server status displayed is valid

* add upcoming release note

* fix: use of optional chaining for 'userData.offline' to fix typecheck errors

* fix: replace 'userData?.offline' by 'userDate' in useEffect's dependencies

* fix: add error handling for 'initializeUserData' method

* fix: remove optional chaining for 'userData.offline' and directly check if userData is not null

* fix: eslint warning "`loot-core/client/actions` import should occur before import of `loot-core/src/platform/client/fetch`"
2025-01-19 14:39:22 -08:00
Matt Fiddaman
1f2c6541b8 fix api crash - schedule upcoming length used raw (#4195)
* fix schedule bug

* note
2025-01-19 20:20:25 +00:00
Bruno Ribeiro
e70dc4efb0 enhance: add ability to control category learning per payee and globally (#4081)
* Added ability to control auto categories per payee and globally

* Added unit test

* Changed order of Learn Categories in settings page

* Removed console log and fixed prefs type

* Added release note

* Fixed default value for global setting

* Added tooltip and context menu option

* Removed test assertion

* Refactored default value for global setting

* Added missing boolean to saveDiff and saveDiffAndApply

* Fixed default global value

* Icon and Disable payee menu hidden when globally disabled

* Moved category learning settings to payees page

* Added automatic centering for payee SVGs

* Lint changes

* Typecheck changes

* Fixed copy paste

* Added more translation

* Changed global setting to a modal

* Fixed import order

* Renamed migration

* Update packages/desktop-client/src/components/payees/CategoryLearning.tsx

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>

* Update packages/desktop-client/src/components/payees/CategoryLearning.tsx

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>

* Update packages/desktop-client/src/components/payees/ManagePayees.tsx

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>

* Update packages/desktop-client/src/components/payees/CategoryLearning.tsx

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>

* Changed wording

---------

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2025-01-19 19:41:43 +00:00
Julian Dominguez-Schatz
bbebf71378 Use 'cimode' as default language in tests (#4191)
* Use cimode as default language in tests

* Add release notes

* Temp: testing VRT

* Update VRT

* Revert test change

* Update VRT

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-19 11:37:01 -05:00
Matt Fiddaman
f35c5a0ed9 Fix app hanging when schedule moved before weekend (#4196) 2025-01-19 16:32:17 +00:00
Joel Jeremy Marquez
9d63b23463 [Mobile] Show undo notification when updating category budget (#4181)
* [Mobile] Show undo notification when updating category budget

* Release notes

* Update VRT

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2025-01-18 23:57:23 -08:00
Julian Dominguez-Schatz
705985a8df Fix rounding of split rules (#4190)
* Fix rounding of split rules

* Add release notes

* PR feedback
2025-01-18 20:02:02 -05:00
Matt Fiddaman
eb31071043 fix paid schedules showing as upcoming in the account (#4188) 2025-01-18 21:34:15 +00:00
Joel Jeremy Marquez
91c4e3e067 [Redux Toolkit Migration] appSlice (#4018)
* Migrate to accountSlice

* Fix lint and typecheck errors

* Update types

* Fix lint

* Fix types

* Cleanup

* Rename file

* Rename state

* Cleanup

* Fix typecheck error

* Move createAppAsyncThunk

* Queries slice

* App slice

* Release notes

* Remove app state type

* [TS] Actual startOAuthServer function

* Rename slice

* Fix types

* Slice name

* Cleanup

* Fix lint errors

* Fix import

* Move sync actions to appSlice

* Revert to window

* Updates

* Revert browser-preload.browser.js
2025-01-18 13:34:04 -08:00
Matiss Janis Aboltins
7cb53502b8 ♻️ do not check outdated version for preview builds (#4183) 2025-01-18 20:23:38 +00:00
Matiss Janis Aboltins
87c26042b9 🐛 (mobile) fix amount input requiring two clicks on safari mobile (#4182) 2025-01-18 20:23:10 +00:00
Julian Dominguez-Schatz
6070166f4e Fix i18n language fallback for regional languages (#4185)
* Fix i18n language fallback for regional languages

* Add release notes

* Fix test
2025-01-18 15:07:15 -05:00
Julian Dominguez-Schatz
66619fa20d Fix various split transaction edits not working (#4186)
* Fix various split transaction edits not working

* Add release notes
2025-01-18 15:00:32 -05:00
Thiago Rodrigues (xthiago)
5e8a24f283 ensure GitHub name is used correctly across the project (#4187)
It follows the official trademark style[1].

[1] https://docs.github.com/en/site-policy/content-removal-policies/github-trademark-policy
2025-01-18 19:54:05 +00:00
Matiss Janis Aboltins
278e4ad74f 🐛 patch lint issues in master branch (#4184) 2025-01-17 22:08:48 +00:00
Joel Jeremy Marquez
c347653566 [Address suppressed ESLint errors] Fix exhaustive deps errors in App.tsx (#4124)
* Fix exhaustive deps errors in App.tsx

* Release notes
2025-01-17 11:37:52 -08:00
Joel Jeremy Marquez
c4593f3be9 [Redux Toolkit Migration] queriesSlice (#4016)
* Migrate to accountSlice

* Fix lint and typecheck errors

* Update types

* Fix lint

* Fix types

* Cleanup

* Rename file

* Rename state

* Cleanup

* Fix typecheck error

* Move createAppAsyncThunk

* Queries slice

* Release notes

* Cleanup types

* Cleanup

* Fix typecheck error

* Lint

* Fix typecheck error

* Fix import

* Fix typo

* Fix typo

* Update

* Copy category list so that sorting is not applied directly on category list redux state

* Update setLastTransaction payload

* Remove optional optional chaining on unwrap

* Rename accountId

* Fix type

* Remove return value of initiallyLoadPayees since no callers use it

* No need to getPayees. Just use the already loaded payees.

* Notify on action errors
2025-01-17 10:33:58 -08:00
Julian Dominguez-Schatz
99724f611c Add language setting (#4112)
* Add language global pref

* Add setting to control language

* Add release notes

* Update VRT

* Wrap missed strings in `t`

* Update VRT

* [placeholder] Bump CI

* Fix crash on old language file

* Fix loading wrong language

* Update packages/desktop-client/src/i18n.ts

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2025-01-17 12:39:16 -05:00
Joel Jeremy Marquez
f07ad1f8c6 [TypeScript] Add types to loot-core app (#4155)
* Add types to loot-core app

* Release notes

---------

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2025-01-17 09:26:47 -08:00
Sam Pellino
4bfb64cdfc Update ConfirmCategoryDeleteModal.tsx (#4175)
* Update ConfirmCategoryDeleteModal.tsx

Added space between category name and "is"

* Create 4175.md

* added space to trigger change; cloned repo in vscode with prettier linter to fix github bot alerting about lint

* Formatted chate with Prettier
2025-01-17 14:50:06 +00:00
rodriguestiago0
626e7973ac Add YTD and last year to Reports headers (#4019)
* Add YTD and last year to Reports headers

* Add release note

* lint

* fix end date picker

* remove debugger

* Update VRT

* Update VRT

* Fix year to date and last year

* remove debugger

* pr comments

* fix small size

* Update VRT

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: youngcw <calebyoung94@gmail.com>
2025-01-17 09:48:44 +00:00
Leo Lee
7ae6442296 (typescript) Refactoring the mobile TransactionList component to typescript (#4063)
* refactor: transaction-list to ts

* docs: add release note

* address PR comments

* typing getMenuItemStyle

* refactor: added runtime check for NaN
2025-01-16 14:38:22 -08:00
Matt Fiddaman
774402503f fix mobile schedule status (#4172) 2025-01-16 21:51:51 +00:00
Matt Fiddaman
cf360ad398 make one month schedule upcoming length dynamic and add current month option (#4168)
* improve one month upcoming length

* add current month upcoming length option

* note

* fix undefined
2025-01-16 20:47:39 +00:00
Matt Fiddaman
2a275b3821 Fix schedule actions not applying and schedules paid the same day not showing (#4171)
* fix schedule actions and schedules paid on current day not displaying

* note

* change wording of post/skip actions
2025-01-16 20:16:41 +00:00
Matiss Janis Aboltins
87428a7b65 🔧 (typescript) change moduleResolution to bundler (#4163) 2025-01-16 18:35:22 +00:00
Matt Fiddaman
6655f51ccc show all occurrences of upcoming schedules within the upcoming period (#4166)
* load all instances of scheduled transactions that occur within the upcoming period

* correct status in transaction table

* ts

* note

* ci

* upcoming -> forceUpcoming

* remove caveat from upcoming length setting modal
2025-01-16 17:04:31 +00:00
NiceDevil
ceeef91a45 Update Link to official authentik documentation (#4165) 2025-01-16 08:31:47 -07:00
Matt Fiddaman
b831d15eab upcoming schedule setting: move setting to modal (#4164)
* upcoming schedule setting: move setting to modal

* note

* change nomenclature

* remove strict override
2025-01-16 15:13:45 +00:00
Julian Dominguez-Schatz
26907d3b12 Improve string to be clearer in other languages (#4167)
* Improve string to be clearer in other languages

Change from using ':' and no question mark to a full sentence and a question mark

* Create 4167.md

* Fix quotes

* Fix

* Fix
2025-01-16 10:12:26 -05:00
Michael Clark
b9eaeafc1c 👷 Prep work for merging actual-server into actual repo (#4160)
* prep work for merging actual-server into actual repo

* release notes
2025-01-16 09:51:37 +00:00
Julian Dominguez-Schatz
b1627d7073 Fix send types in a number of places (1/2) (#4146)
* Fix `send` types in a number of places

* Add release notes
2025-01-15 17:18:55 -05:00
Matt Fiddaman
5fc3e2ea47 Fix inconsistent legend coloring in custom reports (#4162)
* fix inconsistent legend colouring in custom reports

* note

* Update VRT

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-15 21:25:55 +00:00
Koen van Staveren
97b28ca375 Remove code injection for /update-vrt (#4151)
* Remove code injection for /update-vrt

* chore: release note

---------

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2025-01-15 13:13:44 +01:00
Nik
aa529a2cf1 Add ability to provide defaults for and skip updating cleared status in API (#4129)
* Cleared import changes
- Add ability to provide default for cleared field
- Add ability to skip updating cleared field

* Add release notes

* Make linter happy

* Fix optional param

* Use nullish coalescing operator
2025-01-15 11:21:21 +00:00
Matiss Janis Aboltins
b92fa709eb ♻️ (typescript) ported TransactionsTable.test to TS (#4108) 2025-01-14 18:33:02 +00:00
Julian Dominguez-Schatz
5d91d29d77 Exclude untranslated languages from builds (#4148)
* Add script to remove untranslated language JSON files

* Remove untranslated languages in CI

* Add release notes
2025-01-14 09:57:11 -05:00
Julian Dominguez-Schatz
61d41cc28a Update issue template with translation issue type (#4144)
* Update issue template with translation issue type

* Add release notes
2025-01-14 09:44:11 -05:00
Julian Dominguez-Schatz
5921a35340 Fix string upload if new changes are present (#4149)
* Fix string upload if new changes are present

* Add release notes
2025-01-14 09:19:37 -05:00
Joel Jeremy Marquez
6573a52411 [Redux Toolkit Migration] accountsSlice (#4012)
* Migrate to accountSlice

* Release notes

* Fix lint and typecheck errors

* Update types

* Fix lint

* Fix types

* Cleanup

* Rename file

* Rename state

* Cleanup types

* Cleanup

* Remove useActions

* AppStore type

* Fix typecheck error

* Fix typecheck error

* Move createAppAsyncThunk

* Fix errors

* Rename LinkAccountArgs to LinkAccountPayload

* Fix import transactions modal

* Update upgradingId type

* Undo accounts redux state rename

* Fix typecheck error

* Fix lint error

* Revert PayeeEntity import order
2025-01-13 14:42:12 -08:00
Matt Fiddaman
bec841932d Add sorting option to custom reports (#4141)
* support sorting data in custom reports

* disable on unsupported report types

* db migration

* note

* typecheck

* split out sorting function and support complete sorting of nested data

* Update VRT

* fix defaults

* Update VRT

* always allow sorting on data tables

* Update VRT

* coderabbit

* migration: populate sort_by for existing reports

* automagically reverse sort direction, add options for alphabetical and budget sort order

* Update VRT

* fix migration

* default sorting options for different report types

* revert vrt

* Update VRT

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-13 22:11:51 +00:00
youngcw
629b001c01 [Goals]: fix stacked templates (#4120)
* fix stacked amounts

* note/lint
2025-01-13 15:10:32 -07:00
Stefano
a1be1d43f6 Enactment: enable triggering of rules on selected transaction form the account view. (#3805)
* Adding functionality to trigger the rules of transaction from the transaction view

Signed-off-by: Stefano Tranquillini <stefano.tranquillini@gmail.com>

* fix warnings

Signed-off-by: Stefano Tranquillini <stefano.tranquillini@gmail.com>

* Fixing errors on the checks: adding changelog and lint

Signed-off-by: Stefano Tranquillini <1928354+esseti@users.noreply.github.com>

* Applying suggestion from the bot.

Signed-off-by: Stefano Tranquillini <1928354+esseti@users.noreply.github.com>

*  Enhance transaction processing in Account component by implementing rules execution and batch updates. Added utility function imports for improved functionality.

* Update packages/desktop-client/src/components/accounts/Account.tsx

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Refactor Account component imports by removing unused utility functions for cleaner code.

* Update packages/desktop-client/src/components/accounts/Account.tsx

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* chore: correct coderabbitai

* Removed hotkey

* Update packages/desktop-client/src/components/transactions/SelectedTransactionsButton.tsx

---------

Signed-off-by: Stefano Tranquillini <stefano.tranquillini@gmail.com>
Signed-off-by: Stefano Tranquillini <1928354+esseti@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: UnderKoen <koenvanstaveren@hotmail.com>
2025-01-12 19:37:12 +01:00
Julian Dominguez-Schatz
1c6697a7ee Fix translations missing from preview deploys (#4130)
* Fix translations missing from preview deploys

* Add release notes
2025-01-11 12:31:07 -05:00
NiceDevil
da13dfa570 Correct name for authentik IDP (#4121) 2025-01-10 15:41:02 -07:00
Joel Jeremy Marquez
6bcccaa943 Add back eslint useDispatch and useSelector rules (#4123)
* Add back eslint useDispatch and useSelector rules

* Release notes

* Bring back import/no-unresolved
2025-01-10 14:06:10 -08:00
Julian Dominguez-Schatz
5a34c06859 Include translations in builds (#4089)
* Pull/push strings via Git instead of via API

This is necessary because the Weblate API doesn't handle stale strings
well. In particular, it won't remove them automatically.

* Schedule workflow instead of running on every commit

This is so we can minimize downtime for Weblate translations.

* Prevent pull requests modifying translations

* Don't commit translations during the merge freeze

* Add release notes

* Undo rename

* Don't commit translations nightly, per feedback

* Include translations just-in-time in builds

* Revert "Prevent pull requests modifying translations"

This reverts commit 8c19a0ce13.

* Re-ignore translations

* Update release notes to be accurate

* Create missing directory

* Fix conditional logic
2025-01-09 20:13:25 -05:00
Joel Jeremy Marquez
92c93b3f6e [Typescript] Server event types (#4110)
* [Typescript] Server event types

* Release notes
2025-01-09 15:09:52 -08:00
Matiss Janis Aboltins
34ffc5c4b2 ♻️ refactor theme variable to be statically defined (#4086) 2025-01-09 18:12:16 +00:00
Koen van Staveren
14b0cd7b1d fix: notes is (nothing) not working (#3998) 2025-01-09 09:21:38 +01:00
Koen van Staveren
daca767808 enhance: allow prefix for budget templates (#4032)
* enhance: allow prefix for budget templates

for example:
Prime video: #template $10

* chore: note

* chore: fix test

* chore: move prefix to template-notes.ts
2025-01-09 09:20:43 +01:00
Matt Fiddaman
6111f94b51 Sort barchart data (#4072) 2025-01-08 17:52:51 +00:00
Travis Lesicka
ce0ca60bcf ♻️ (typescript) Refactor Accounts/Balances to tsx and Remove ts-strict-ignore from Accounts/Account (#4047)
* Convert Balance.jsx to Balance.tsx

* Removed @ts-strict-ignore from Account.tsx

* Create 4047.md

* Fix typo

* Added Translation helpers to aria-labels

* Clarified canCalculateBalance return value logic
2025-01-08 08:59:22 +01:00
douugdev
3fbe6d05c8 fix: any rule not accounting for empty filter (#4051)
* fix: any rule not accounting for empty filter

* chore: add changelog
2025-01-08 00:37:50 +00:00
Joel Jeremy Marquez
cc1c11aac9 [Redux Toolkit Migration] Use new Redux Toolkit configureStore API (#4000)
* Initial upgrade to redux toolkit, more fixes needed e.g. removing non-serializable values from the state

* Fix typecheck and lint

* Fix lint and typecheck errors

* Fix lint and typecheck errors

* Fix typecheck error

* Cleanup

* Remove useAppStore

* Cleanup

* Undo renames

* Code review feedback

* UndoState type

* UndoState type

* yarn install
2025-01-07 16:34:21 -08:00
Robert Dyer
7dad36528c Add Copy last 6/12 months to budget menu (#4096)
* Add Copy last 12 months to budget menu

* add release note

* Make sure budget month actions use showUndoNotification
2025-01-08 00:33:03 +00:00
Julian Dominguez-Schatz
c956f8003b Mark release as draft initially (#4105)
* Mark release as draft initially

* Add release notes
2025-01-07 18:35:44 -05:00
sveselinovic
a5d591fed7 fix: creating new payee with 'one of'-condition broken (#4099)
* fix: creating new payee with 'one of'-condition broken

* change author and description of release note
2025-01-07 21:57:53 +01:00
Koen van Staveren
1f44903e4b enhance: net bar graph show net instead of two separate bars (#4033)
* enhance: net bar graph show net instead of two separate bars

* chore: note
2025-01-07 19:57:56 +01:00
Matt Fiddaman
bd77dfd111 🔧 Migrate to ESLint v9 (#3993) 2025-01-07 18:51:59 +00:00
Matt Fiddaman
39cfa11b25 🌍 improve translation strings - part 1 (#4041) 2025-01-07 18:47:13 +00:00
Matiss Janis Aboltins
af0a14ce3d ♻️ (typescript) refactor ScheduleDetails to tsx (#3964) 2025-01-07 18:45:52 +00:00
Matiss Janis Aboltins
1f2155053f 🔥 remove unused permissions prop from Button components (#4085) 2025-01-07 18:25:05 +00:00
Matiss Janis Aboltins
d5ebcced38 🔥 remove unused report prop from Link component (#4083) 2025-01-07 18:24:49 +00:00
Robert Dyer
7c2408daa6 Do not show undo notifications on desktop (#4097)
* Do not show undo notifications on desktop

* add release note

* fix linter

* Update packages/desktop-client/src/hooks/useUndo.ts

Co-authored-by: Joel Jeremy Marquez <joeljeremy.marquez@gmail.com>

* Update useUndo.ts

* fix code pasted on wrong line

* drive-by fix typo

* Update 4097.md

---------

Co-authored-by: Joel Jeremy Marquez <joeljeremy.marquez@gmail.com>
2025-01-07 08:08:14 -07:00
Julian Dominguez-Schatz
82e1922bee 🔖 (25.1.0) (#4095)
* 🔖 (25.1.0)

* Remove used release notes

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-01-07 01:06:34 -05:00
gabe
8f66605994 add buttons for combined-account transaction pages on mobile (#3734)
* add buttons for combined-account transaction pages (#2333)

* add release note for #3734

* add accessibility label to mobile combined-account header button

* increase touch targets for combined-account buttons

* remove highlight color and add bounce to header buttons

to match the feel of the other account buttons

* update vrt screenshots for actualbudget#3734
2025-01-06 16:18:54 -08:00
Leo Lee
eadd11b7f0 (typescript) Refactoring the mobile TransactionListWithBalance component into typescript. (#4061)
* refactor: convert txListwBal to tsx

* docs: add release notes

* docs: rename notes

* refactor: fix missing cleared/uncleared balance

* refactor: use Binding type
2025-01-06 13:23:03 -08:00
Julian Dominguez-Schatz
832fd1e5d8 Fix schedule split template amounts (#4077)
* Fix incorrect argument to goals schedule function

* Add argument types to prevent similar issues

* Add release notes

* Fix test types
2025-01-02 18:01:19 -05:00
Matt Fiddaman
928260ca3a Fix calendar report day background colour in development theme (#4073)
* fix calendar background in development theme

* note
2025-01-02 17:12:27 +00:00
Julian Dominguez-Schatz
be5bfa275e Fix icon hover effect in transaction table (#4070)
* Fix icon hover effect in transaction table

* Add release notes

* Add test
2025-01-02 11:45:59 -05:00
Matt Fiddaman
1e65939147 fix mobile hold buffer initial sign (#4068) 2025-01-01 22:18:28 +00:00
youngcw
7060e4b657 [Goals]: fix repeating spend templates (#4066)
* fix repeating spend templates

* work with all repeat types

* note
2025-01-01 15:03:30 -07:00
Matt Fiddaman
da613ab673 Fix payee cell overflowing when it contains an icon (#4056) 2024-12-30 20:39:47 +00:00
Koen van Staveren
d894281465 enhance: context menu on sidebar elements (#3777)
* enhance: context menu on sidebar account

* enhance: context menu on EditableBudgetName

* chore: release note

* chore: lint

* Update packages/desktop-client/src/components/sidebar/Sidebar.tsx

* chore: fix margin

* fix: merge

* chore: use useContextMenu hook

* style: change account name field an input

* lint

---------

Co-authored-by: matt <matt@fiddaman.net>
Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2024-12-29 21:13:57 +00:00
Koen van Staveren
5c577aa069 enhance: context menu on custom reports page (#3776)
* enhance: context menu on custom reports page

* chore: release note

* chore: lint

* chore: use both feature flags

* chore: use both feature flags

* chore: pr feedback

* fix: changing name with context menu
2024-12-29 20:51:56 +00:00
Robert Dyer
e6aeea668b Fix issue where the UI is stuck sync'ing if no data from server (#3941)
* Fix issue where the UI is stuck sync'ing if no data from server

* add release note
2024-12-29 20:49:19 +00:00
Julian Dominguez-Schatz
ded2f39e13 Fix loading of number format on initial app startup (#4038)
* Fix loading of number format on initial app load

* Add release notes
2024-12-27 18:19:22 -05:00
Matt Fiddaman
3f6068fe88 add electron build files to eslint ignore list (#4042)
* add electron build files to eslintignore

* note
2024-12-26 01:22:53 +00:00
Julian Dominguez-Schatz
9213ed75b5 Upload translations on builds of master (#4002)
* fix: translations were not being loaded properly

* fix: support running GitHub actions locally with `act`

* feat: upload new strings on master build

* Add release notes

* PR feedback: security
2024-12-24 12:48:41 -05:00
Matt Fiddaman
93262e7fb4 extend fix splits tool to report splits with mismatched amounts (#3970) 2024-12-24 07:43:44 +00:00
Matt Fiddaman
cd8bb8e139 change feedback issue for openid (#4030) 2024-12-23 17:11:46 -07:00
Koen van Staveren
bd126b499b feat: now button at budget page (#3703)
* feat: now button on budget

* Update VRT

* chore: change to icon

* chore: rename to today

* chore: fix not being centered on multiple months

* Update VRT

* Update VRT

* Trigger Build

* fix: keep now button with monthpicker not left

* Update VRT

* fix: center MonthPicker

* Update VRT

* Trigger Build

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-12-23 23:11:15 +01:00
Koen van Staveren
8976ffc256 enhance: allow negatives in the budget template (#4028)
* enhance: allow negatives in the budget template

* chore: add test case

* chore: release note
2024-12-23 23:10:54 +01:00
lelemm
0b2c8ccd88 OpenId Implementation (#3878)
* OpenId implementation

* Code rabbit auto generated code applied

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Code rabbit suggestions round 2

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* fixes from code rabbit round 1

* fixes from code rabbit round 2

* change variable name

* code review round 3

* Update VRT

* small fix

* Update VRT

* linter

* app.tsx

* LoggedInUser

* UserAccess

* UserAccessHeader

* UserAccessPage

* UserAccessRow

* UserDirectory

* UserDirectoryHeader

* UserDirectoryPage

* UserDirectoryRow

* BudgetList

* Bootstrap

* Login

* OpenIdForm

* CreateAccountModal

* EditAccess

* EditUser

* GoCardlessInitialiseModal

* OpenIDEnableModal

* PasswordEnableModal

* SimpleFinInitialiseModal

* TransferOwnership

* AuthSettings

* fix hooks in EditUser

* enable electron openid login

* typecheck

* linter and typecheck fixes

* Update VRT

* small fix

* linter

* small changes for file owner name and a fix for privacyfilter in the username

* linter for merge

* change the entra url and changing the electron loopback url when built

* "logged in as" was showing when had no user

* linter

* linter²

* code review

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: matt <matt@fiddaman.net>
2024-12-23 09:46:22 -07:00
youngcw
cde81da72c [Goals]: Fix applying templates in tracking budget (#4010)
* fix logic

* note
2024-12-21 19:49:29 -07:00
Matt Fiddaman
6cfb9d2a7a Fix incorrect boldening of synced accounts in the sidebar (#4009) 2024-12-19 15:13:44 +00:00
Matt Fiddaman
4ce5e2fd07 Prevent schedules with null amounts from crashing the app (#3958)
* test

* note

* add comment
2024-12-18 21:55:23 +00:00
Matt Fiddaman
11bde73fa5 🔧 upgrade better-sqlite3 (#3987)
* upgrade better-sqlite3

* note
2024-12-18 09:05:46 +00:00
Matiss Janis Aboltins
94666a2ac1 Update bug-report.yml 2024-12-16 20:21:44 +00:00
Matiss Janis Aboltins
b6fbcef6f0 Update bug-report.yml 2024-12-16 20:21:15 +00:00
Matiss Janis Aboltins
1165c4c008 Update bug-report.yml (#3992) 2024-12-16 20:20:21 +00:00
Darin Loh
8446356cc6 fix: space missing on create local account copy (#3985) 2024-12-15 12:27:39 +00:00
lelemm
ec977ee51a Calendar Report (#3828) 2024-12-14 20:19:14 +00:00
Dany Khalife (MSFT)
ef95850e93 Migrate useSplitsExpanded to TypeScript (#3945)
* useSplitsExpanded renamed to .tsx

* Some type hardening

* add release note

* lint

* typecheck

* lint

* rename expanded -> isExpanded
2024-12-11 17:52:41 -08:00
Joel Jeremy Marquez
81fc029a03 Use useTranslation hook instead of directly importing the t function (#3893)
* Use useTranslation hook instead of directly importing the t function

* Release notes

* Fix lint
2024-12-11 13:57:45 -08:00
Dany Khalife (MSFT)
9e6a486c90 Dkhalife/ts/categorytransactions (#3959)
* rename

* a bit of hardening

* release notes

* typecheck & lint

* lint
2024-12-11 21:46:55 +00:00
Marian Bäuerle
9af3539b91 Fix iOS mobile navigation tabs disappearing on bouncing top (#3962) 2024-12-11 13:28:03 -08:00
Joel Jeremy Marquez
62d8358f90 Remove use of useActions (#3911)
* Remove use of useActions

* Release notes

* Fix lint
2024-12-10 15:16:56 -08:00
Joel Jeremy Marquez
219e139d55 Consistent accounts terminology (For budget / Budgeted --> On budget) (#3903)
* Change for budget and budgeted terms to on-budget

* Release notes

* Update mobile account header

* Fix release notes

* Fix release note category

* Update VRT

* Rename variables

* Remove hyphens

* Show off budget

* Update VRT

* Dummy commit

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-12-10 15:15:44 -08:00
Joel Jeremy Marquez
298b734539 Optimize useSheetValue (#3879)
* Optimize useSheetValue

* Fix lint

* Fix mock bind

* Reduce re-renders

* Update useSheetValue

* Update

* Make QueryState immutable

* Release notes
2024-12-10 09:35:23 -08:00
Joel Jeremy Marquez
e96b986ad0 Add loading indicator when loading more transactions in mobile transaction list (#3900)
* Add isLoadingMore property to useTransactions hook

* Release notes

* Start loading more earlier
2024-12-10 09:22:28 -08:00
Joel Jeremy Marquez
5104a1a563 Convert BudgetTable.jsx to tsx (#3899)
* Convert BudgetTable to TypeScript

* Release notes
2024-12-10 09:21:25 -08:00
Travis Lesicka
6ea77324ef Duplicate Budget (#3847)
* Initial Commit

* Create 3847.md

* Removed un-needed comment

* Changed error log text

* Moved budget name validation from DuplicateFileModal to loot-core/server

* Added translation

* Fixed linting error

* Changed delete file hack

Changed from loading and closing the budget file to just opening and closing the database to be able to delete it.

* Removed hard coded english from loot-core server

* Updated wording and style of Duplicate File Modal

* Simpler wording for Duplication text and buttons
2024-12-10 08:55:38 -07:00
lelemm
2b908e9263 Filter account with 'on budget' or 'off budget' (#3891)
* Filter account by on budget / off budget

* small fix

* fix eval for new operations

* code review suggestion

* suggestions

* small fix for rules table

* batch loading the accounts

* Update packages/loot-core/src/server/accounts/transaction-rules.ts

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>

* missed this type

---------

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2024-12-10 11:52:38 +00:00
Matiss Janis Aboltins
a2892270d2 🐛 fix condition "notes contains (nothing)" throwing error (#3943) 2024-12-09 22:00:36 +00:00
Matiss Janis Aboltins
d649eec4db 🐛 fix misaligned gocardless credential popover (#3942) 2024-12-09 21:59:55 +00:00
Koen van Staveren
5717d90544 enhance: context menu budget page positioning (#3775)
* enhance: context menu budget page positioning
fix: make popover non selectable

* chore: release note

* Update upcoming-release-notes/3775.md

* chore: improve spelling

* feat: useContextMenu hook for context menus

* fix: linting
2024-12-09 20:32:12 +01:00
Adam Langbert
a35af73023 fix tracking budget docs link (#3944)
* fix tracking budget docs link

* add release notes
2024-12-09 10:00:10 +00:00
Eric Ji
e4b40fb831 Menu Option Disappears Completely On Certain Screen Size (#3880)
* remove use of View component

* created a release note

* rename release note to PR number not issue number

* revert changes to check e2e tests

* redo changes

* indentify exact styling issue

* use style instead of css
2024-12-07 23:20:38 -05:00
Matiss Janis Aboltins
fa8ff79208 (dashboards) piecharts - sorting and label spacing (#3855) 2024-12-07 13:29:40 +00:00
Matt Fiddaman
3ce7ae91d9 Add more logging for GoCardless rate limit information (#3895) 2024-12-06 21:29:37 +00:00
annechoww
1b25235cc7 Category Labels Not Scaling Correctly On Small Screen (#3906)
* Fixed label scaling for smaller screens.

* Added release notes. Minor linting fix added.
2024-12-06 13:53:15 -07:00
Matt Fiddaman
f207803f7a 🔖 (24.12.0) (#3931)
* bump versions

* Remove used release notes

* Remove used release notes

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-12-06 11:03:37 -07:00
Julian Dominguez-Schatz
df7bc5d2f0 Fix a navigation bug and a crash from the account pages (#3932)
* Don't crash when making a txn from the uncat page

* Always navigate consistently from the txn add/edit page

* Add release notes

* Attempt to fix functional tests

* Update VRT

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-12-06 08:34:20 +00:00
lelemm
5e7538fde3 'hasTags' should show only for notes (#3902)
* 'hasTags' should show only for notes

* md

* Update VRT

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-12-05 15:38:10 -08:00
Joel Jeremy Marquez
2c0bd6bafd Use useNavigate instead of accessing window.__navigate (#3904)
* Use useNavigate instead of accessing window.__navigate

* Release notes

* Update packages/desktop-client/src/components/manager/ConfigServer.tsx

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2024-12-05 15:37:52 -08:00
Michael Clark
501c8653ef 🐛 Fix flicker when saving transaction on account page when transactions are scheduled (#3920)
* fix flicker when saving transaction on account page when there are scheduled

* release notes
2024-12-02 08:53:57 +00:00
Joel Jeremy Marquez
22623ce65e Fix mobile transaction edit page's back button behavior (#3905)
* Fix mobile transaction edit page's back button behavior

* Release notes
2024-11-27 08:02:37 -08:00
Michael Clark
c25e3d4163 🐛 Fix performance when navigating between budget/accounts (#3882)
* memo the bindingobj

* release notes

* fix

* a bit heavy handed

* lint
2024-11-24 08:43:01 +00:00
Michael Clark
339fac2806 🔧 Summary Card: Change the font size implementation to be simpler & fix import dashboard (#3871)
* change the font size implementation to be simpler

* release notes

* setting the line height back

* renames

* condtion on the font changed event

* fix type check

* typecheck

* clarifying comment

* remove margin on left and right - not required

* fix import

* fix derp
2024-11-22 15:52:27 +00:00
Joel Jeremy Marquez
2ebaa527be Convert mobile Accounts.jsx to tsx (#3862)
* Convert mobile Accounts.jsx to TS

* Release notes

* Fix lint
2024-11-21 16:01:26 -08:00
Joel Jeremy Marquez
c5411518c4 Use strict typing in useSheetValue and fix bug where query is not being updated when changed (#3864)
* Use strict typing in useSheetValue and fix bug where query is not being updated when changed

* Release notes

* Update VRT

* Fix regression

* Update VRT

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-11-21 16:01:09 -08:00
Joel Jeremy Marquez
36839ff153 Convert ManagePayees components to Typescript (#3867)
* Convert ManagePayees components to Typescript

* Release notes

* Fix lint

* Fix lint

* Fix lint
2024-11-21 15:23:35 -08:00
Joel Jeremy Marquez
9d6db12921 Convert MergeUnusedPayeesModal.jsx to tsx (#3866)
* Convert MergeUnusedPayeesModal.jsx to tsx

* Release notes
2024-11-21 15:23:24 -08:00
Joel Jeremy Marquez
590ac1f95e Convert EditFieldModal.jsx to tsx (#3865)
* Convert EditFieldModal.jsx to tsx

* Release notes

* NoteAmendMode

* Fix lint
2024-11-21 15:23:09 -08:00
Joel Jeremy Marquez
8e76a65e0c Convert SimpleTransactionsTable.jsx to tsx (#3870)
* Convert SimpleTransactionsTable.jsx to tsx

* Release notes
2024-11-21 15:09:23 -08:00
Joel Jeremy Marquez
c3eda4247e Convert PostsOfflineNotification.jsx to tsx (#3868)
* Convert PostsOfflineNotification.jsx to tsx

* Release notes

* Fix lint
2024-11-21 15:09:00 -08:00
Matt Fiddaman
022b9b76b1 Allow the report table columns to grow to fill available space (#3872)
* allow report table columns to grow to fit

* note
2024-11-21 22:36:19 +00:00
Joel Jeremy Marquez
19f0037256 Fix preview transactions not showing on all accounts page and aggregated accounts page (budgeted/offbudget) (#3873)
* Fix preview transactions not showing on all accounts

* Release notes
2024-11-21 14:24:57 -08:00
lelemm
c626fc2f17 Summary report (#3792)
* Summary card report

* Apply suggestions from code rabbit

* Apply suggestions from code review

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* MORE CODE RABBIT SUGGESTIONS

* typecheck fix

* change view form the details page

* added privacy filter

* Apply suggestions from code review

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* debounce

* removed binary search and changed the summary page to not use the card component

* Update packages/desktop-client/src/components/reports/spreadsheets/summary-spreadsheet.ts

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* fix on recommended code rabbit commit

* added some padding to number so it fits the window better for big numbers

* accept infinite

* feedback fixes

* Update packages/desktop-client/src/components/reports/reports/SummaryCard.tsx

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* translations

* fix on the save, linter and changed "include summary date range" to "all time divisor"

* changed MD from enhancements to feature

* typo

* change card

* typecheck

* Update packages/desktop-client/src/components/reports/SummaryNumber.tsx

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* typecheck

* changes to fit the number better

* small fix

* fix on filters

* code review

* revert code to check for height

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2024-11-21 09:25:09 -07:00
Joel Jeremy Marquez
f523d25052 Convert ManagementApp.jsx to tsx (#3860)
* Convert ManagementApp to tsx

* Release notes
2024-11-20 14:53:23 -08:00
Joel Jeremy Marquez
278ac0c730 Strict TS typing for useResizeObserver (#3859)
* Strict type useResizeObserver

* Release notes

* Fix typecheck error
2024-11-20 14:53:11 -08:00
Ryan Bianchi
0696c8113d Fix category is/is not (nothing) filters (#3669)
* filter out transfers when category is none

* add filter for parent id

* fix Category is not (nothing) as well

* lint fixups

* add special case for 'category is not nothing'

* add release notes

* adding tests

* lint fix

* use $and expression for complex condition special cases

* add tests for condition special cases

* Update packages/loot-core/src/server/accounts/rules.ts

rename subExpression to and

Co-authored-by: Koen van Staveren <koenvanstaveren@hotmail.com>

* update uses of subExpression with and

* remove stray debugger rules

* Update VRT

* Revert "Update VRT"

This reverts commit a450fc7b2457bb578e53f62d5f4201e91e9a93c4.

* make and an internal op to avoid exposing it to the UI

* feedback

---------

Co-authored-by: Koen van Staveren <koenvanstaveren@hotmail.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: matt <matt@fiddaman.net>
2024-11-20 11:38:52 +00:00
Matiss Janis Aboltins
688de5f604 (dashboards) release as first party feature (#3856) 2024-11-20 08:31:54 +00:00
Joel Jeremy Marquez
881410bc74 Fix wrong scheduled transfer payment direction on PWA (#3402)
* Fix #3230

* Release notes

* Rename hook function

* [chore] Comment

* Coderabbit feedback

* Fix loading states

* Code rabbit

* No payee text

* Update VRT

* Update release notes

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-11-19 13:57:40 -08:00
Ali Gradina
b4d2d6a884 Marked files for translation (#3548) 2024-11-19 18:52:24 +00:00
youngcw
5cf439883e [Goals] fix limits (#3829)
* fix limits

* cleanup

* fix cases of negative previous balance
2024-11-19 06:53:21 -07:00
Matiss Janis Aboltins
23bb89b96e release tracking budget feature (#3833) 2024-11-18 22:41:50 +00:00
Matt Fiddaman
7010ab1eb6 add simplefin batch sync to api (#3821) 2024-11-18 20:38:45 +00:00
Joel Jeremy Marquez
18f538c54b Convert Mobile Transaction component to TransactionListItem + cleanup (#3761)
* Migration mobile Transaction component to TransactionListItem + cleanup

* Release notes + yarn install

* Fix style

* Padding changes + VRT

* Update useScrollListener

* Code rabbit feedback

* Do not show loading on preview transactions
2024-11-18 06:38:08 -08:00
Joel Jeremy Marquez
e170c0d274 Fix mobile navigation tabs expanding/collapsing when scrolling in modals (#3731)
* Update scroll provider so that it only captures the scroll on div container and not the whole window

* Fix lint + release notes

* Rewrite useScroll to be more performant by being ref based instead of state to avoid re-renders when scrolling

* Check undefined

* Rename to useScrollListener

* Remove small 1px gap under mobile nav tabs when fully open

* Cleanup

* Fix lint

* Coderabbit feedback
2024-11-17 12:23:05 -08:00
Sai Hemanth Beeraka
dad702e5c2 🐛 Fix validation issue for invalid server URLs in /config-server page (#3837)
* Fix breaking /config-server page logic for invalid server URLs

* Handle missing url in 'subscribe-needs-bootstrap' handler
2024-11-15 20:33:29 +00:00
Michael Clark
224d445840 🐛 Fix parameter formatting issues (#3841)
* fix some errors in translation format

* release notes
2024-11-15 12:38:54 +00:00
Awais Alee
670419b087 Added the i18n translation for desktop-client (#3832) 2024-11-14 19:05:15 +00:00
Michael Clark
58baf74992 🐛 Fix translations failing (#3830)
* fix translations failing

* release notes

* blasphemy

* more blasphemy

* putting warning back

* last heretic act

* making the world a better place
2024-11-14 08:58:09 +00:00
Awais Alee
d08be58f95 Marked files for translation (#3827)
* Add translation files for desktop client

* Add backend translation files for i18n integration

* code refactored

* code refactored

* code refactored
2024-11-13 15:08:01 +00:00
Greg Lorenzen
db68170cce Translation: desktop-client/components/payees/PayeeMenu (#3670)
* Translation: desktop-client/components/payees/PayeeMenu

* Add release notes

* Merge master

* Remove dynamic values from selected payee translation
2024-11-12 20:05:35 +01:00
Michael Clark
1e1092e472 :electron: Separate build folders for easier switching between web and electron (#3801)
* seperate build folders for easier switching between web and electron builds

* gitignore

* release notes

* one directory back from electron

* spelling mistake

* Update 3801.md

* test

* making it correct

* huh

* urghh

* again

* account for api bundle which uses electron bundle for some reason

* hu-

* lets go

* remove comment
2024-11-12 18:39:49 +00:00
The-Firexx
d1324408f4 Fixes #2885 - Focus ring getting stuck on last column of /accounts/budgeted (#3571)
* Fixes focus ring getting stuck on last column of /accounts/budgeted screen when creating a new transaction.

* Fix lint problems with the previous commit

* Changed the way the hook is made to the cancel and add button, removing the need to change Button2

* Changed the name of variables as mentioned in PR
2024-11-12 09:13:52 -08:00
Austin Pearce
9e478014c5 fix back button behavior after adding tx on mobile (#3825)
Co-authored-by: Austin Pearce <austin@apearce.dev>
2024-11-12 08:58:43 +00:00
Michael Clark
dd69e539d3 🐛 Fix iphone 13 unable to use regex lookbehinds (#3823)
* fix iphone 13 unable to use regex lookbehinds

* release notes
2024-11-12 08:58:01 +00:00
jotch
2cb668a40c fix: don't clobber server pathname (#3815)
* fix: don't clobber server pathname

The provided server URL may already include a pathname,
so all further segments need to be appended. This also
more closely matches the name `joinURL`.

* add release notes

* use `fs.join` to avoid double slashes
2024-11-12 08:56:44 +00:00
Joel Jeremy Marquez
3cefd98ce9 useTransactions hook to simplify loading of transactions (#3685)
* useTransactions hook to load transactions

* Release notes + lint fix

* Update useQuery

* useTransactions update

* Stabilize tests

* Fx flaky test

* Fix tests

* Fix tests

* Update queries

* Apply coderabbit suggestions

* Fix onlySync

* Update useTransactions

* Code rabbit suggestions

* useTransactionsSearch hook

* Debounce the useTransactionsSearch search method

* usePreviewTransactions debounce fix

* Fix lint

* Coderabbit feedback + make useSchedules consistent with query pattern used in useTransactions

* Code review feedback and improve schedules loading

* Update error handling

* Cancel debounce on unmount

* Fix lint

* set loading state on error

* Fix test

* VRT

* Revert VRT

---------

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2024-11-11 22:41:42 -08:00
youngcw
fa2830a1fd fix remainder goal (#3822) 2024-11-11 15:19:22 -07:00
youngcw
57ac062edc [Goals] fix how goal values are calculated (#3817)
* fix how goals are calculated

* lint, note

* note
2024-11-11 07:46:09 -07:00
Awais Alee
0c94214a8f Marked files for translation (#3752)
* Enhance app with i18n translations

* Code Refactored

* Added translated desktop client files

* Code refactored

* Code refactored

* Fix lint issue

* Removed i18next line from RuleRow.tsx

* Code refactored

* Code refactored

* Code refactored

* Update packages/desktop-client/src/components/settings/Encryption.tsx

Co-authored-by: Michael Clark <5285928+MikesGlitch@users.noreply.github.com>

* Added translation for setting encryption

* Update packages/desktop-client/src/components/settings/Themes.tsx

Co-authored-by: Michael Clark <5285928+MikesGlitch@users.noreply.github.com>

* Added translation in src/components/settings/Encryption.tsx

* Update packages/desktop-client/src/components/settings/Themes.tsx

Co-authored-by: Michael Clark <5285928+MikesGlitch@users.noreply.github.com>

* Update packages/desktop-client/src/components/settings/Themes.tsx

Co-authored-by: Michael Clark <5285928+MikesGlitch@users.noreply.github.com>

---------

Co-authored-by: youngcw <calebyoung94@gmail.com>
Co-authored-by: Michael Clark <5285928+MikesGlitch@users.noreply.github.com>
2024-11-11 14:37:08 +00:00
Koen van Staveren
2b72b2f2f2 Update update-vrt.yml (#3800) 2024-11-07 16:03:15 +00:00
Koen van Staveren
985b653a87 Update update-vrt.yml (#3799) 2024-11-07 15:44:19 +00:00
Koen van Staveren
f14b160e5c [WIP] Update update-vrt.yml (#3798) 2024-11-07 16:29:31 +01:00
A. Schueler
8eafa1e741 fix: check gocardless bank data before setting state (#3793) 2024-11-07 15:01:37 +00:00
Travis Lesicka
aefd9504bf Update Sidebar - Refactor the Budget Name component (#3593)
* Initial Commit

Moved Budget Name to its own component for a cleaner Sidebar component.
Added pencil icon for editing budget name.
Removed Rename Budget from menu.

* Create 3593.md

* Fixed Menu Dropdown Arrow shrinks with long budget name

* Changes recommended by coderabbitai

* Fixed Lint issue

* Remove Help from Menu

* Remove menu from budget name and added Actual logo with menu

* Update VRTs

* Update VRTs

* Fix logo shrinking with long budget name issue

* Update 3593.md

* Removed Logo and pencil icon

* Update VRTs

* Removed unused classnames from SideBar and BudgetName component

* revert to upstream VRTs
2024-11-06 20:53:58 -07:00
Matiss Janis Aboltins
1f6977da81 🐛 (dashboards) remove faulty dashboard widgets (#3785) 2024-11-06 22:14:33 +00:00
Travis Lesicka
290402ee6a Fixes #3729: Typescript and Runtime error after previous merge (#3794) 2024-11-06 20:11:46 +00:00
Koen van Staveren
c3b95886db ci: add reactions to /update-vrt comment (#3789)
* ci: add reactions to /update-vrt comment

* chore: use correct permissions

* chore: don't cancel on non command message

* chore: make workflow not expose github secret

* Update .github/workflows/update-vrt.yml
2024-11-06 09:30:00 +01:00
Joel Jeremy Marquez
e53d444c32 Fix loading of mobile/desktop page on window resize (#3729)
* Fix loading of mobile/desktop page on window resize

* Release notes

* Fix lint

* Use useWindowSize since it matches behavior of documentElement clientWidth and clientHeight

* Debounce so that components are only reloaded when user finishes the resize

* Adjust debounce delay
2024-11-05 15:38:03 -08:00
joel-rich
c0f9073f35 Fixes #3682 - Fix $ne filters incorrectly excluding null values (#3686)
* allow matching null values when not equals query filter is set

* Also fix namedParameter queries with  filter

* improve tests

* release note

---------

Co-authored-by: Joel Rich <joelrich@protonmail.com>
2024-11-05 00:39:43 -08:00
Koen van Staveren
19c6f85f5e Update update-vrt.yml (#3788) 2024-11-04 19:58:22 +01:00
Koen van Staveren
d4f1f703ea fix: /update-vrt (#3787)
fatal: detected dubious ownership in repository at
https://github.com/actions/runner-images/issues/6775
2024-11-04 19:43:49 +01:00
Michael Clark
914f59197f :electron: Removing node-fetch and updating root ca impl for more support (#3782)
* updating root ca impl to use node env variable for more support

* release notes

* removing node-fetch

* clean up

* error message

* Update 3782.md
2024-11-04 18:35:21 +00:00
youngcw
7c24c269e2 ♻️ make templates classy and replace 🍝 code (#3754)
* by check

* minor changes and TS class migration

* good starting point

* very basic testing

* fix

* basic overwrite of simple templates working

* mostly working.  By and schedule don't work

* some cleanup, better async

* add notifications

* add daily weekly limits

* by is working I think

* mostly working

* some fixes, make faster

* lint, note

* note

* cleanup old stuff

* fix paths

* test fixes

* fix test

* fix note

* rabbit, and fix long goal

* lint

* some fixes

* more typing

* fix save error

* last bunny fixes

* fix save, trim schedule names

* lint

* minor fixes

* last fixes

* lint
2024-11-04 11:28:01 -07:00
Matiss Janis Aboltins
c52e5c856d 🐛 (dashboards) save cash flow balance setting (#3745)
Closes #3671
2024-11-04 17:56:29 +00:00
Matiss Janis Aboltins
b08756cc39 ♻️ custom reports - moving to url identifiers (#3744) 2024-11-04 17:56:14 +00:00
Koen van Staveren
29fc22a171 fix: maintain the sort order of the server sync (#3748)
* fix: maintain the sort order of the server sync

* chore: release note

* fix: tests

* chore: release note
2024-11-04 17:56:15 +01:00
Matt Fiddaman
815f69a051 implement SimpleFin batch sync (#3581)
* initial

* remove incorrect automated imports

* fixes

* refactor to mark all transactions new

* clamp latestTransaction to current date

* refactor out temporary placeholder solution

* simplify bank syning logic

* stricter types

* note

* remove debug logging

* better logging

* error handling

* fix handling of SimpleFinBatchSync

* pass errors down

* fix

* another go!

* hopefully the last try...

* fix log

* Update packages/loot-core/src/server/accounts/sync.ts

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* coderabbit: simplify promise construction

* Update packages/loot-core/src/client/actions/account.ts

Co-authored-by: Koen van Staveren <koenvanstaveren@hotmail.com>

* expand types

* month utils

* use aql over sql

* fix types

* fixes

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: Koen van Staveren <koenvanstaveren@hotmail.com>
2024-11-04 16:39:04 +00:00
Koen van Staveren
83ceea4250 fix: /update-vrt on forks (#3773)
* fix: /update-vrt on forks

* chore: add missing container for /update-vrt

---------

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2024-11-04 17:01:55 +01:00
JahJoey
59d685fab6 Fix: #3719: Imported payee overflowing on transaction record (#3753)
* Modified tooltip to have set width to avoid overflow issue on imported payee records

* Added release note

* Fixed release note file name
2024-11-04 16:59:19 +01:00
Dreptschar
a267e3abb5 Apply Template to All Categories in Group for Web (#3666)
* add function to apply template to multiple category and add button to group sidebar

* add function to apply template to multiple category and add button to group sidebar

* add correct month

* clean up code

* clean up code

* clean up code

* clean up code

* add notification and clean up

* add notification and clean up

* add notification and clean up

* add notification and clean up

* add notification and clean up

* add release note

* excluded hidden categories

* removed unused method from api

* adjust template to run on already budgeted categories

* fix typecheck

* add apply multiple as budget action and remove from api

* lint clean up

* fix notification and remove log

---------

Co-authored-by: dreptschar <dreptschar@gmail.com>
2024-11-04 07:22:29 -07:00
Joel Jeremy Marquez
e078ed21ba [Typescript migration] Migrate AccountSyncCheck to ts (#3757)
* Migrate AccountSyncCheck to ts

* Release notes

* Fix lint
2024-11-03 13:04:43 -08:00
Koen van Staveren
41d5922635 Add context menu's (#3381)
* feat: context menu on transactions

* feat: context menu's on budget page

* chore: release note

* fix: losing focus on context menu

* feat: schedules context menu

* feat: payees context menu

* feat: rules context menu

* chore: update release note

* chore: lint

* fix: broken balance movement menu

* fix: placement on context menu to be closer to cursor

* feat: context menu on budget field

* chore: lint

* Update packages/desktop-client/src/components/transactions/TransactionsTable.jsx

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* chore: fix merge

* fix: e2e test

* fix: moving of the popover in the sidebar

* chore: lint

* chore: add feature flag

* chore: fix tsc

* chore: fix test

* Update packages/desktop-client/src/components/settings/Experimental.tsx

Co-authored-by: Julian Dominguez-Schatz <julian.dominguezschatz@gmail.com>

* fix: to budget button

next steps didn't work

* chore: lint

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: Julian Dominguez-Schatz <julian.dominguezschatz@gmail.com>
2024-11-03 14:26:53 -05:00
Julian Dominguez-Schatz
6f07894be7 Auto-reload on app updates (#3693)
* Auto-reload on app updates

* update #1

* test

* wip

* green

* wip

* ux

* green

* red

* cleanup

* Add release notes

* Unique notification name

* Missing awaits

* Try to fix Electron app

* Simplify update checking

* PR feedback
2024-11-03 13:00:12 -05:00
Koen van Staveren
871de93f2d ci: /update-vrt (#3764)
* ci: /update-vrt

* chore: release note

* chore: code rabbit feedback.

* chore: code rabbit feedback.

* chore: code rabbit feedback.
2024-11-03 10:51:34 -07:00
lelemm
15b2ef1591 Fix #2932: Schedule reset amount to ten (10) when amount is zero (0) (#3732)
* Fix #2932

* md

* e2e update

* Update packages/desktop-client/src/components/util/AmountInput.tsx

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2024-11-03 16:46:23 +00:00
Julian Dominguez-Schatz
1c05d7e5fe 🔖 (24.11.0) (#3766)
* 🔖 (24.11.0)

* Remove used release notes

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-11-03 09:43:26 -05:00
Julian Dominguez-Schatz
6666014fe5 Fix bugs in payee table (#3768) 2024-11-02 16:09:17 -04:00
Michael Clark
dc425042ec 🔧 Remove test file (#3756)
* remove unneeded file

* release notes

* release notes
2024-10-31 10:13:24 +00:00
Koen van Staveren
59835a3ac1 fix: date handlebar functions (#3749)
* fix: date handlebar functions

* chore: release note

* chore: tests
2024-10-28 10:40:49 -07:00
adenpun
b349edd9e0 Fix "Name" field being in wrong colour in Schedules page (#3739)
* Fix schedule "Name" field being in wrong colour

* Add release note
2024-10-27 22:29:35 +00:00
joel-rich
f265dd9df0 fix Tag filtering crashing app when tag has regex special character (#3725)
* fix Tag filtering crashing app when tag has regex special character

* release-notes

---------

Co-authored-by: Joel Rich <joelrich@protonmail.com>
2024-10-27 08:10:52 +00:00
Michael Clark
a6da06a8ef 🐛 Extra error handling for if user has incorrect server url (#3736)
* adding some safety for if user has incorrect server url format

* added additional error handling for when incorrect server url has been setup

* good rabbit
2024-10-26 16:16:29 +01:00
Neil
f25dc1f261 Fix Parse for Date Range (#3735)
* fixed

* notes

* simplify
2024-10-25 08:16:36 -07:00
joel-rich
5751d5d107 Fix issue with Monthly Spending report not properly averaging previous three months (#3723)
* Fix issue with Monthly Spending report not properly summing previous three months

* release notes

---------

Co-authored-by: Joel Rich <joelrich@protonmail.com>
2024-10-25 07:06:10 +01:00
youngcw
4b063450a4 [Goals]: fix no messages #1507 (#3721)
* add dispatch

* note

* lint
2024-10-24 17:25:21 -07:00
Tim
fbb0f9bd75 fix modal scrolling performance on mobile (#3343)
This is primarily done by removing the blur effect from the overlay, and
replacing it will a translucent black.

The blur effect performs poorly on mobile devices.
2024-10-24 12:28:59 -07:00
lelemm
6af0dbab56 Fix Issue #3662 - Distribute button calculates splits one at a time (#3728)
* Fix Issue #3662

* added md
2024-10-24 09:31:44 -07:00
Matiss Janis Aboltins
5c94e3878e 🐛 (bank-sync) revert bank-sync status indicator change (#3720) 2024-10-24 08:26:27 +01:00
Koen van Staveren
10ca29e1e9 fix: Custom Report Total Mode not showing offbudget transactions #3627 (#3633)
* fix: Custom Report Total Mode not showing offbudget transactions #3627

* chore: release note

* chore: remove debug logging

* fix: table grouped report
2024-10-23 22:55:54 +01:00
Ahmed Elbohoty
4d89a9b86a Translation: desktop-client/src/components/reports/reports/CustomReport.tsx (#3722) 2024-10-23 21:07:15 +01:00
Matiss Janis Aboltins
34f3ccacf6 ♻️ (synced-prefs) remove no longer necessary migration (#3718)
* ♻️ (synced-prefs) remove no longer necessary migration

Closes #3551

* Release notes
2024-10-23 19:57:02 +01:00
Michael Clark
1b883aa0ab Fix race condition (#3717)
* fix race condition

* release notes
2024-10-23 18:45:01 +01:00
Koen van Staveren
54054736e9 fix: change payee rule not working #3702 (#3704)
* fix: change payee rule not working #3702

* chore: release note
2024-10-23 09:07:05 +01:00
Julian Dominguez-Schatz
5cf170a442 Fix merge race (#3713) 2024-10-23 08:55:30 +01:00
Neil
f9eb017a54 Remove spending report feature flag (#3611)
* Remove feature flag

* notes

* defualt show spending graph

* VRT
2024-10-23 06:59:47 +01:00
Julian Dominguez-Schatz
15351e034e Update Electron help menu to reflect new in-app menu (#3699)
* Update Electron help menu to reflect new in-app menu

* Add release notes

* Attempt to fix build issues

* Try 2 to fix IPC
2024-10-22 21:20:11 -04:00
Michael Clark
1895bc80c2 Handling tunnel errors as network failure (#3697)
* handling tunnel errors as network failure

* add release notes

* rabbit suggestion

* clean
2024-10-22 17:35:30 +01:00
Koen van Staveren
a91a8859ab feat: fix categories being set on offbudget transactions (#3705)
* chore: release note

* feat: fix categories being set on offbudget transactions

* fix: #2266

* fix: small mistake

* chore: update comment
2024-10-21 14:23:09 -07:00
deathblade666
a3256f5686 Adding a help modal for quick reference to goal template syntax (#3691)
* Adding a help modal for qucik reference to goal template syntax

* added release notes

* fixed misspelling of Enhancements

* fix lint errors

* Only show when Goal Template Flag is enabled

* fix lint

* Only show on Budget page

* fix lint

* Added Translation, change text formating to table (styling wip), change headers to use react-aria-component headings

* fix lint, made requested change to HelpMenuItem type

* stylized tables

* fixed type error

* Moved section headers to within Table Headers

* fix lint

* added space between last table and see more statement
2024-10-21 22:05:19 +01:00
joel-rich
715bc00e3b Fix incorrect cumulative totals for Days 28+ on the Spending Report (#3679)
* Fix bug with spending report cumulative totals

* release notes

---------

Co-authored-by: Joel Rich <joelrich@protonmail.com>
2024-10-21 06:59:41 +01:00
Vincenzo Di Biase
4e07357221 Add Reconcile button on the account page. (#3684)
* added reconcile button to account page

* add Reconcile Button in the account page

* added release note

* updated VRT snapshots

* removed Reconcile option from Account menu

* made the button minimal with tooltip and added vrt

* missing unused import

* fixed icon and button size

* fixed merge conflicts

* hide reconcile button on all account and for budget page

* fix lint from merged file

* changed reconcile button order

---------

Co-authored-by: vincenzo <dibiasev@gmail.com>
2024-10-20 13:11:45 -07:00
youngcw
03f2cabc18 clean up accidental push (#3695)
* clean up accidental commit

* move
2024-10-19 17:35:13 -07:00
Julian Dominguez-Schatz
259beb7665 Clarify logic to generate splits from rules (#3641)
* Add tests for bug

* Add tests for unexpected behaviour

* Refactor to consistently generate valid splits with no errors

* Add release notes

* Update test names
2024-10-19 19:35:52 -04:00
youngcw
0f3efde855 rabbit suggestion 2024-10-19 16:00:54 -07:00
Matiss Janis Aboltins
9aac44c58f ♻️ (typescript) migrated account header to TS (#3640)
* ♻️ (typescript) migrated account header to TS

* TS patches

* Patch types

* Update packages/desktop-client/src/components/accounts/Header.tsx

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2024-10-18 20:53:46 +01:00
Joel Jeremy Marquez
0d9528e22c @emotion/css as drop-in replacement for abandoned glamor library (#3471)
* Migrate to @emotion/css

* Remove custom CSSProperties

* Fix errors

* Fix typecheck error

* Fix lint error

* Fix typecheck error

* Fix typecheck error

* Fix typecheck error

* Release notes

* VRT

* VRT

* Revert VRT

* Fix typecheck error

* Fix glamor import

* yarn

* Fix lint error

* Dedupe

* Fix typecheck error

* Update @emotion/css

* Revert vrt screenshots

* Fix toggle content

* Fix content

* Fix lint error

* VRT

* Cleanup unneeded style
2024-10-17 17:35:53 -07:00
Samuel Barnes
3f31d19d8a Add Upcoming length adjustment feature flag (#3651)
* feature flag created

* feature flag implemented

* feature toggle setting added

* added release notes

* Update packages/desktop-client/src/components/settings/Experimental.tsx

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>

* vrt

* vrt

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
2024-10-17 17:09:34 -07:00
youngcw
225c93914c allow 4 decimal places in file imports (#3676)
* allow 4 decimals

* note

* fix comment

* update test
2024-10-17 12:40:35 -07:00
youngcw
c25e97b0f6 [Goals] Add copy template (#3617)
* add copy template

* note, lint

* note
2024-10-17 09:28:09 -07:00
Samuel Barnes
e775306f81 [WIP] Add info text to Upcoming Length control (#3639)
* added info circle and box on click

* hover working

* moved title

* release notes

* updated release notes category

* split info bubble into its own component

* text longer than 500px will be split

* extracted text width into its own file

* wip tests

* wip testing

* removed separate method and tests

* added textWidth option to Info Bubble

* updated shadow
2024-10-17 09:27:49 -07:00
scojo
02824ad240 recalculateSplit one last time to clear any erroneous errors (#3624) 2024-10-15 13:58:52 -07:00
Greggory Rothmeier
1a13e98f49 Explicitly disable 1Password on table inputs (#3674)
* Explicitly disable 1Password on table inputs

* Add release notes

* Update packages/desktop-client/src/components/autocomplete/Autocomplete.tsx

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>

---------

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2024-10-15 13:48:43 -07:00
Koen van Staveren
3d9e90f797 feat: templating on payee_name (#3619)
* feat: templating on payee_name

* chore: release note

* fix: create test budget

* fix: transaction-rules tests

* fix: transaction-rules tests
2024-10-15 12:22:25 -07:00
Greg Lorenzen
b253246fe2 Translation: desktop-client/components/payees/ManagePayees (#3623)
* Translation: desktop-client/components/payees/ManagePayees

* Move react-i18next import before memoize-one

* Add release notes

* Add prettier formatting

* Fix eslint import/order warning

* Add translation support for "No payees" text
2024-10-14 22:20:27 +01:00
Julian Dominguez-Schatz
778fc713f3 Move help-related items under one single menu (#3648)
* Remove previous help-related elements

* Add new 'Help' menu with multiple options

* Fix alignment of popovers

* Better types

* Add release notes

* PR feedback

* Update vrt
2024-10-14 12:25:04 -04:00
Tim
e0f0d8e241 make BudgetTable Budgeted value positive on mobile (#3602)
* make BudgetTable Budgeted value positive on mobile

To match the desktop behaviour.

* add release notes

* update vrt snapshots

* fix tracking budget
2024-10-13 20:05:28 -07:00
Joel Jeremy Marquez
310d299ebd Use a toggle on mobile transaction's Cleared flag (#3622)
* Use a toggle on mobile transaction's Cleared flag

* Release notes

* Cleanup

* VRT

* Cleanup

* Remove glamor import

* Update light theme toggle color
2024-10-13 15:44:22 -07:00
Dreptschar
130f357bab Translation: desktop-client/src/components/common/search.tsx (#3659)
* Translation: desktop-client/src/components/common/search.tsx

* add release note

---------

Co-authored-by: dreptschar <dreptschar@gmail.com>
2024-10-13 20:00:27 +01:00
dependabot[bot]
f89817170a Bump word-wrap from 1.2.3 to 1.2.5 (#3657)
Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.5.
- [Release notes](https://github.com/jonschlinkert/word-wrap/releases)
- [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.5)

---
updated-dependencies:
- dependency-name: word-wrap
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-12 21:11:09 -04:00
dependabot[bot]
ec37b39e34 Bump micromatch from 4.0.7 to 4.0.8 (#3655)
Bumps [micromatch](https://github.com/micromatch/micromatch) from 4.0.7 to 4.0.8.
- [Release notes](https://github.com/micromatch/micromatch/releases)
- [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/micromatch/compare/4.0.7...4.0.8)

---
updated-dependencies:
- dependency-name: micromatch
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-12 20:45:23 -04:00
dependabot[bot]
23f75a6b6a Bump tough-cookie from 4.1.2 to 4.1.4 (#3654)
Bumps [tough-cookie](https://github.com/salesforce/tough-cookie) from 4.1.2 to 4.1.4.
- [Release notes](https://github.com/salesforce/tough-cookie/releases)
- [Changelog](https://github.com/salesforce/tough-cookie/blob/master/CHANGELOG.md)
- [Commits](https://github.com/salesforce/tough-cookie/compare/v4.1.2...v4.1.4)

---
updated-dependencies:
- dependency-name: tough-cookie
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-12 20:33:27 -04:00
dependabot[bot]
f206ba2f0f Bump tar from 6.2.0 to 6.2.1 (#3653)
Bumps [tar](https://github.com/isaacs/node-tar) from 6.2.0 to 6.2.1.
- [Release notes](https://github.com/isaacs/node-tar/releases)
- [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/isaacs/node-tar/compare/v6.2.0...v6.2.1)

---
updated-dependencies:
- dependency-name: tar
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-12 20:32:18 -04:00
dependabot[bot]
bd5c0cb981 Bump webpack from 5.90.0 to 5.95.0 (#3652)
Bumps [webpack](https://github.com/webpack/webpack) from 5.90.0 to 5.95.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.90.0...v5.95.0)

---
updated-dependencies:
- dependency-name: webpack
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-12 20:13:07 -04:00
dependabot[bot]
3635c8c88a Bump webpack from 5.90.0 to 5.94.0 (#3649)
Bumps [webpack](https://github.com/webpack/webpack) from 5.90.0 to 5.94.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.90.0...v5.94.0)

---
updated-dependencies:
- dependency-name: webpack
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-12 20:01:48 -04:00
dependabot[bot]
5cb97d6f2f Bump vite from 5.2.11 to 5.4.8 (#3647)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.2.11 to 5.4.8.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.8/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.8/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-12 19:03:26 -04:00
Julian Dominguez-Schatz
e8af5b9014 Bump yargs to newer version (#3645)
* Bump `yargs` to newer version

* Add release notes
2024-10-12 18:18:36 -04:00
dependabot[bot]
328196c485 Bump vite from 5.2.11 to 5.2.14 (#3646)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.2.11 to 5.2.14.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.2.14/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.2.14/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-12 16:10:42 -04:00
dependabot[bot]
644fe8bdc6 Bump ejs from 3.1.9 to 3.1.10 (#3644)
Bumps [ejs](https://github.com/mde/ejs) from 3.1.9 to 3.1.10.
- [Release notes](https://github.com/mde/ejs/releases)
- [Commits](https://github.com/mde/ejs/compare/v3.1.9...v3.1.10)

---
updated-dependencies:
- dependency-name: ejs
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-12 15:50:16 -04:00
Matiss Janis Aboltins
15b1b73379 polishing report responsitivity (#3636) 2024-10-12 20:39:21 +01:00
dependabot[bot]
8c7e93616f Bump semver from 5.7.1 to 5.7.2 (#3643)
Bumps [semver](https://github.com/npm/node-semver) from 5.7.1 to 5.7.2.
- [Release notes](https://github.com/npm/node-semver/releases)
- [Changelog](https://github.com/npm/node-semver/blob/v5.7.2/CHANGELOG.md)
- [Commits](https://github.com/npm/node-semver/compare/v5.7.1...v5.7.2)

---
updated-dependencies:
- dependency-name: semver
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-12 15:31:09 -04:00
dependabot[bot]
a56d6f9e05 Bump ws from 7.5.9 to 7.5.10 (#3642)
Bumps [ws](https://github.com/websockets/ws) from 7.5.9 to 7.5.10.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/7.5.9...7.5.10)

---
updated-dependencies:
- dependency-name: ws
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-12 15:21:17 -04:00
Koen van Staveren
75acfc79e1 fix: run rules on reconciliation transaction (#3625) 2024-10-12 19:19:47 +01:00
Vincenzo Di Biase
300ddc6311 Fixes #3585 - Fixes Rule Conditions Removal (#3607) 2024-10-12 17:49:01 +01:00
Koen van Staveren
05dda5f9d7 fix: escaping in action rule templating (#3632)
* fix: escaping in action rule templating

* chore: release note
2024-10-11 20:07:57 +01:00
Samuel Barnes
37ad584826 Add option to set how far out the upcoming scheduled transactions are shown in the account view. (#3310)
* initial poking around

* ui changes and setting

* wip

* null check

* removed more than a month

* prettier

* todo

* get status tests

* added prefs to app.ts

* updated to use LocalPrefs bc of limitation of app.ts

* updated schedules component to use localPrefs

* removed console.log

* release notes

* renamed release noted md

* eslint fixes

* import fix

* update useEffect dependencies

* removed a comment

* moved upcoming length setting to schedule page

* removed import

* made setting collapsible and moved to the top

* fixed breaking change

* updated to work with updated synced prefs methodology

* pulled preference from db

* updated tests with mock reset

* update vrt

* per coderabbit: upcoming length null value prevention

* update test to use number inputs rather than string

* aria label added to close button

* moved before/after each blocks per coderabbitai

* fixed default value typo

* updated edit button to use slimmer style

* vrt

* vrt

* vrt

---------

Co-authored-by: youngcw <calebyoung94@gmail.com>
2024-10-11 07:43:37 -07:00
Ryan Bianchi
f9c08a995d Fix ability to have duplicate account names (#3527)
* add duplicate name validation to sidebar, and both narrow/wide Account pages

* unify error messages and styles

* keep state for the current account name on the mobile account modal

* add release notes

* remove extra validation function

* fix typo in AccountSyncSidebar params

* don't set current account name to empty string and prevent further changes on AccountMenuModal

* lint imports

* update error message to Name x already exists

* use proper translation functions

---------

Co-authored-by: youngcw <calebyoung94@gmail.com>
2024-10-10 20:53:17 -07:00
Matt Fiddaman
e37a42faf9 make import button reflect accurate number of transactions to be added (#3613) 2024-10-10 20:19:35 +01:00
Matt Fiddaman
9f279486ce save csv inOutMode settings (#3543) 2024-10-10 20:19:14 +01:00
Michael Clark
0b3155608c :electron: Migrations out of sync modal (#3600)
* add a modal to say client is wrong version, accept the risks to continue using

* user friendly error

* hooking parts up - untested

* changed approach

* release notes

* removing old comments

* cleanup old code

* feedback
2024-10-10 19:39:09 +01:00
Koen van Staveren
3301cfa2fd fix: import meta of non custom report widgets (#3626) 2024-10-10 18:46:25 +01:00
Matiss Janis Aboltins
23de23bd4e ♻️ (typescript) migrate parts of ImportTransactionModal to TS (#3570) 2024-10-09 22:40:38 +01:00
Matiss Janis Aboltins
79f640cbc0 show the 'import transactions' button even if accounts have banksync (#3615) 2024-10-09 22:36:42 +01:00
David Martos
f786bdcec3 Fix rules not checking "category is nothing" when reconciling (#3572)
* Fix rules not checking "category is nothing" when reconciling

* release notes

* Apply suggestions from code review

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>

---------

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2024-10-09 18:18:28 +01:00
Matiss Janis Aboltins
f3ae31055e ♻️ (typescript) migrated ManagePayees and LoadBackupModal files (#3507) 2024-10-09 18:04:36 +01:00
Travis Lesicka
21cb684b26 Update sidebar scrolling (#3554) 2024-10-09 18:03:46 +01:00
Matt Fiddaman
e455369443 Don't consider payees used in rules as orphaned (#3609)
* don't consider payees in rules as orphaned

* release note

* lint

* indentation

* ignore deleted rules
2024-10-09 16:44:37 +01:00
Koen van Staveren
6d122c898d test: csv import e2e tests (#3499)
* test: csv import e2e tests

* chore: release note

* chore: lint

* chore: remove .only

* fix: csv import e2e tests

there was an issue with css precedent which I don't understand why but this fixes this

* chore: release note

* fix: flakiness e2e test

* Update bin/run-vrt

* fix: flakiness e2e test

* chore: lint

* chore: fix merge

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2024-10-09 08:34:59 +01:00
Koen van Staveren
e6024f7a8b fix: csv import with less than 5 columns (#3605)
* fix: csv import with less than 5 columns

* chore: release note

* Apply suggestions from code review

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>

* Update packages/desktop-client/src/components/modals/ImportTransactionsModal/FieldMappings.jsx

---------

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2024-10-09 08:33:47 +01:00
Koen van Staveren
1485d9c871 refactor: fill in basic types in rules.ts (#3365)
* refactor: fill in basic types in rules.ts

* chore: release note

* chore: implement pr feedback

---------

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2024-10-08 22:22:56 +01:00
Matiss Janis Aboltins
85b3c5714e 🔖 (24.10.1) fix synced prefs (#3596) 2024-10-08 18:02:07 +01:00
Koen van Staveren
ce4b80f499 feat(rules): templating actions (#3305)
* feat(rules): templating actions

* chore: update snapshots

* fix: date functions templating

* chore: lint

* fix: put action templating behind feature flag

* fix: template syntax checking

* test: handle bar functions

* chore: pr feedback

* feat: add `{{debug x}}` handler
2024-10-08 17:43:04 +01:00
Michael Clark
464d9878c6 :electron: Remove unneeded logger and add reload functionality (#3599)
* remove unneeded logger and add reload functionality

* release notes
2024-10-08 16:46:09 +01:00
wysinder
71c208e444 Fixes #2703 - Fixes inaccurate running balance when hiding reconciled transactions (#3603)
* Show accurate balances when hiding reconciled transactions.

* Linting

* Add release notes
2024-10-08 07:59:22 -07:00
Joel Jeremy Marquez
1dce3183e5 [Mobile] Allow updating existing transaction's account (#3549)
* [Mobile]  Allow updating existing transaction's account

* Release notes

* Update packages/desktop-client/src/components/mobile/transactions/TransactionEdit.jsx

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Update packages/desktop-client/src/components/mobile/transactions/TransactionEdit.jsx

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Update packages/desktop-client/src/components/mobile/transactions/TransactionEdit.jsx

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2024-10-08 07:57:03 -07:00
Tim
051c8a6ed0 remove package.tgz file (#3601) 2024-10-08 07:54:46 -07:00
Matiss Janis Aboltins
bdeb19424b (dashboards) making "all widget" button always visible (#3588) 2024-10-07 21:07:58 +01:00
Matiss Janis Aboltins
5369494925 (dashboards) ability to quick-edit widget names from inner report pages (#3587) 2024-10-07 21:07:22 +01:00
Vincenzo Di Biase
e653ad33a6 Fixes #3597 first day of week on calendar transaction (#3598)
* fix 3597 first day of week on calendar transactin

* added release note

* fixed release note filename
2024-10-07 12:20:19 -07:00
Michael Clark
a7b8d1251c :electron: Move file settings to the file management area (#3584)
* move settings to the file management area

* more settings

* giving users option to automatically move files when changing dir

* trueee

* updates

* does this fix the type issue

* weird

* translating

* release notes

* release notes

* a bit extra safety

* updating wording

* parameterising backup params

* text update

* parameterise vals

* add a notification to ensure the user knows the dir has changed

* pencil icon to save real estate

* ordering

* Rename 3500.md to 3584.md

* Update packages/desktop-client/src/components/manager/BudgetList.tsx

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2024-10-07 19:34:25 +01:00
Matiss Janis Aboltins
d5e0b7da5d (synced-prefs) preloading in redux state to improve perf (#3544) 2024-10-07 18:07:31 +01:00
Matt Fiddaman
279d545a28 fix size comparison workflow (#3594)
* fix size comparison workflow

* note
2024-10-07 17:37:08 +01:00
Matiss Janis Aboltins
0b6ea52d9b 🐛 (reports) fix reports page having empty blocks (#3566) 2024-10-07 08:33:53 +01:00
Matiss Janis Aboltins
38c5f89c41 ♻️ (typescript) migrated NetWorth component to TS (#3576) 2024-10-06 20:09:11 +01:00
Michael Clark
b774a3b216 :electron: Removing electron-is-dev dependency (#3580)
* removing is-dev dependency

* release notes

* release notes
2024-10-06 17:36:18 +01:00
Matiss Janis Aboltins
dc5d1174c7 ⬆️ upgrade some github actions (#3577) 2024-10-06 07:06:10 +01:00
Joel Jeremy Marquez
33a7524cd7 [Mobile] Fix budget list on mobile auto selecting a budget file under the Switch budget file menu (#3574)
* Fix budget list on mobile

* Releast notes
2024-10-05 08:31:25 -07:00
Joel Jeremy Marquez
0a0e26372b [Mobile] Update to Budgeted to match the column name in mobile budget table (#3573)
* Update to Budgeted to match the column name in mobile budget table

* Release notes

* VRT

* VRT
2024-10-05 08:30:45 -07:00
Joel Jeremy Marquez
a28fb93cec Mobile VRTs (#3506)
* More Mobile VRTs

* Mobile VRTs

* Fix mobile budget page

* Updated VRT

* VRT fix

* Update VRT

* [skip ci] Release notes

* Cleanup tests

* Fix VRT

* VRT

* Extend timeout

* Clean screenshots

* Updated VRT

* Category / group VRTs

* Mobile budget page menu VRT

* Updated VRT

* Prevous and next budget month tests

* Code Rabbit suggestions

* Feedback

* VRT

* Fix getSelectedMonth

* Fix selectedBudgetMonthButton locator

* Fix flaky tests

* Update VRT
2024-10-04 12:09:29 -07:00
Matiss Janis Aboltins
365da79783 ♻️ split ImportTransactionsModal into smaller component files (#3552) 2024-10-04 18:23:25 +01:00
Michael Clark
df92c80c27 :electron: Reduce electron package size (#3553)
* remove unneeded loot core ref and keeping better-sqlite external

* release notes

* putting the package config back

* cleaning up

* add missing db files

* updates

* window state updates
2024-10-04 17:16:24 +01:00
Austin Pearce
d0caf9f521 fix yearly schedule templates (#3511)
Co-authored-by: Austin Pearce <austin@apearce.dev>
2024-10-03 11:49:21 -07:00
Ali Gradina
3f85aedd0b Marked files for translation (#3444)
* marked files for translation

* added release note

* fixed linting warnings

* 🐛 fix account filters being overridden (#3441)

* :electron: Reduce package size  (#3443)

* reduce package size of all packages

* release notes

* Update beforePackHook.ts

* [Maintenance] Cleanup react aria packages and dedupe (#3450)

* Cleanup react aria packages and dedupe

* Release notes

* ♻️ (synced-prefs) moving the prefs from metadata.json to the db (#3423)

* :electron: Restart server silently when adding self signed cert and add some logs (#3431)

* restart server silently on add self signed cert and add some logging

* release notes

* fix name

* updating names to be more specific

* removing setloading

* feedback

* ♻️ (synced-prefs) move budget type to synced prefs (#3427)

* update synced account balance in db if available (#3452)

* 🐛 (synced-prefs) fix bulk-reading not working in import modal (#3460)

* fix: csv import deduplication (#3456)

*  release simplefin as a first-party feature (#3459)

Closes #2272

* Do not allow renaming to an empty category or group name (#3463)

* Do not allow renaming to an emoty category or group name

* Release notes

* [Mobile] Fix #3214 - Pull down to refresh triggering clicks on budget cells (#3374)

* Fix #3214

* Fix rollover indicator

* VRT

* Fix typecheck error

* VRT

* Release notes

* VRT

* Update style

* Fix budgeted

* VRT

* VRT

* Revert VRT

* VRT

* Fix style

* Revert usePreviewTransactions

* Fix error

* Fix reports form submit handlers (#3462)

* Fix form submit handlers

* Release notes

* :electron: Remove some old updater code (#3468)

* remove some old updater code

* remove old updater logic

* CSV import e2e tests (#3467)

* Fix React Aria Button hover styles  (#3453)

* Fiox hover styles and use className instead of inline to prepare for future css migration

* Release notes

* Cleanup

* Update edit rule hover style

* Undoable auto transfer notes + auto notes for cover (#3411)

* Undo auto transfer notes + auto notes for cover

* Release notes

* Fix notes

* Fix notes undo

* Do not show clicked category on transfer or cover menus

* Fix typecheck error

* typecheck

* Fix removeCategoriesFromGroups

* 🐛 (reports) deleting custom report should remove it from the dashboard (#3469)

* Revert "CSV import e2e tests (#3467)" (#3474)

This reverts commit 5e12d4013a.

* ♻️ (synced-prefs) separate metadata and local prefs out (#3458)

* :electron: Replace deprecated file protocol registration (#3475)

* replace deprecated file handler in electron

* release notes

* types eh

* types

* update sql regexp to default to empty string when field is null (#3480)

* ♻️ rename report/rollover budget to tracking/envelope (#3483)

* 🐛 (import) fix csv import checkboxes not working (#3478)

* Update tooltip and themes with better visibility (#3298)

* Update tooltip and themes with better visibility

* Rename merge request # into release notes

* rename release note

* update VRT

* tweak light theme

* dont put border on autocomplete menus

* update VRT

* tweak popover style

* simplify

* update VRT

* update VRT

---------

Co-authored-by: Dustin Conlon <dustin@dustinconlon.com>
Co-authored-by: Dustin Conlon <58367364+VoltaicGRiD@users.noreply.github.com>
Co-authored-by: youngcw <calebyoung94@gmail.com>

* fix modals on mobile BudgetTable (#3487)

* Fix privacy filter (#3472)

* Fix privacy filter

* Release notes

* Coderabbit suggestion

* VRT

* VRT

* Revert VRT

* VRT

* VRT

* VRT

* VRT

* Delete VRT

* VRT

* Revert VRT

* 🐛 fix custom reports crashing when opening table (#3484)

* 🧪 (tests) adding custom report e2e tests (#3493)

*  (dashboards) ability to save filters & timeframes on spending widgets (#3432)

* marked files for translation

* Revert "🐛 fix account filters being overridden (#3441)"

This reverts commit 7336badffd.

* Revert "Revert "🐛 fix account filters being overridden (#3441)""

This reverts commit 5cbadc41bb.

* Revert changes due to failed rebase

* removed import of t

* fixed lint warning

* added PayeeTableRow.tsx

* needed changes

* bugfix: pluralization

* variables adjustments

* removed doubled trans

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
Co-authored-by: Michael Clark <5285928+MikesGlitch@users.noreply.github.com>
Co-authored-by: Joel Jeremy Marquez <joeljeremy.marquez@gmail.com>
Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
Co-authored-by: Koen van Staveren <koenvanstaveren@hotmail.com>
Co-authored-by: Ryan Bianchi <1435081+qedi-r@users.noreply.github.com>
Co-authored-by: Robert Dyer <rdyer@unl.edu>
Co-authored-by: Dustin Conlon <dustin@dustinconlon.com>
Co-authored-by: Dustin Conlon <58367364+VoltaicGRiD@users.noreply.github.com>
Co-authored-by: youngcw <calebyoung94@gmail.com>
Co-authored-by: Tim <hello@timsmart.co>
2024-10-03 18:39:40 +01:00
Matiss Janis Aboltins
9b7a79a01c 🔖 (24.10.0) (#3545) 2024-10-03 18:06:47 +01:00
Michael Clark
125510c981 🐛 Fix balance carryover arrow on Firefox (#3535)
* Update BalanceWithCarryover.tsx

* Create 3535.md
2024-10-02 15:55:01 +01:00
Matiss Janis Aboltins
327887b87d 🐛 (import) fix qfx import crash if input is malformed file (#3541)
Closes #3519
2024-10-02 11:35:07 +01:00
Matiss Janis Aboltins
47ef916873 🐛 (bank-sync) fix initial sync - close modal stack, show loading indicators (#3540) 2024-10-02 11:32:29 +01:00
Matt Fiddaman
5064b06f2c fix creating rule from transaction (#3539)
* fix creating rule from transaction

* note
2024-10-02 10:27:34 +01:00
1262 changed files with 37684 additions and 18714 deletions

View File

@@ -1,28 +0,0 @@
packages/api/app/bundle.api.js
packages/api/dist
packages/api/@types
packages/api/migrations
packages/crdt/dist
packages/desktop-client/bundle.browser.js
packages/desktop-client/build/
packages/desktop-client/build-stats/
packages/desktop-client/public/kcab/
packages/desktop-client/public/data/
packages/desktop-client/**/node_modules/*
packages/desktop-client/node_modules/
packages/desktop-client/src/icons/**/*
packages/desktop-client/test-results/
packages/desktop-client/playwright-report/
packages/desktop-electron/client-build/
packages/desktop-electron/dist/
packages/import-ynab4/**/node_modules/*
packages/import-ynab5/**/node_modules/*
packages/loot-core/**/node_modules/*
packages/loot-core/**/lib-dist/*
packages/loot-core/**/proto/*

View File

@@ -1,603 +0,0 @@
const path = require('path');
const rulesDirPlugin = require('eslint-plugin-rulesdir');
rulesDirPlugin.RULES_DIR = path.join(
__dirname,
'packages',
'eslint-plugin-actual',
'lib',
'rules',
);
const ruleFCMsg =
'Type the props argument and let TS infer or use ComponentType for a component prop';
const restrictedImportPatterns = [
{
group: ['*.api', '*.web', '*.electron'],
message: 'Dont directly reference imports from other platforms',
},
{
group: ['uuid'],
importNames: ['*'],
message: "Use `import { v4 as uuidv4 } from 'uuid'` instead",
},
];
const restrictedImportColors = [
{
group: ['**/style', '**/colors'],
importNames: ['colors'],
message: 'Please use themes instead of colors',
},
];
module.exports = {
root: true,
env: {
browser: true,
commonjs: true,
es6: true,
jest: true,
node: true,
},
plugins: [
'prettier',
'import',
'rulesdir',
'@typescript-eslint',
'jsx-a11y',
'react-hooks',
],
extends: [
'plugin:react/recommended',
'plugin:react/jsx-runtime',
'plugin:prettier/recommended',
'plugin:@typescript-eslint/recommended',
'plugin:import/typescript',
],
parser: '@typescript-eslint/parser',
parserOptions: { project: [path.join(__dirname, './tsconfig.json')] },
reportUnusedDisableDirectives: true,
globals: {
globalThis: false,
vi: true,
},
rules: {
// http://eslint.org/docs/rules/
'array-callback-return': 'warn',
'default-case': ['warn', { commentPattern: '^no default$' }],
'dot-location': ['warn', 'property'],
eqeqeq: ['warn', 'smart'],
'new-parens': 'warn',
'no-array-constructor': 'warn',
'no-caller': 'warn',
'no-cond-assign': ['warn', 'except-parens'],
'no-const-assign': 'warn',
'no-control-regex': 'warn',
'no-delete-var': 'warn',
'no-dupe-args': 'warn',
'no-dupe-class-members': 'warn',
'no-dupe-keys': 'warn',
'no-duplicate-case': 'warn',
'no-empty-character-class': 'warn',
'no-empty-pattern': 'warn',
'no-eval': 'warn',
'no-ex-assign': 'warn',
'no-extend-native': 'warn',
'no-extra-bind': 'warn',
'no-extra-label': 'warn',
'no-fallthrough': 'warn',
'no-func-assign': 'warn',
'no-implied-eval': 'warn',
'no-invalid-regexp': 'warn',
'no-iterator': 'warn',
'no-label-var': 'warn',
'no-labels': ['warn', { allowLoop: true, allowSwitch: false }],
'no-lone-blocks': 'warn',
'no-mixed-operators': [
'warn',
{
groups: [
['&', '|', '^', '~', '<<', '>>', '>>>'],
['==', '!=', '===', '!==', '>', '>=', '<', '<='],
['&&', '||'],
['in', 'instanceof'],
],
allowSamePrecedence: false,
},
],
'no-multi-str': 'warn',
'no-global-assign': 'warn',
'no-unsafe-negation': 'warn',
'no-new-func': 'warn',
'no-new-object': 'warn',
'no-new-symbol': 'warn',
'no-new-wrappers': 'warn',
'no-obj-calls': 'warn',
'no-octal': 'warn',
'no-octal-escape': 'warn',
'no-redeclare': 'warn',
'no-regex-spaces': 'warn',
'no-script-url': 'warn',
'no-self-assign': 'warn',
'no-self-compare': 'warn',
'no-sequences': 'warn',
'no-shadow-restricted-names': 'warn',
'no-sparse-arrays': 'warn',
'no-template-curly-in-string': 'warn',
'no-this-before-super': 'warn',
'no-throw-literal': 'warn',
'no-undef': 'error',
'no-unreachable': 'warn',
'no-unused-expressions': [
'error',
{
allowShortCircuit: true,
allowTernary: true,
allowTaggedTemplates: true,
},
],
'no-unused-labels': 'warn',
'no-use-before-define': [
'warn',
{
functions: false,
classes: false,
variables: false,
},
],
'no-useless-computed-key': 'warn',
'no-useless-concat': 'warn',
'no-useless-constructor': 'warn',
'no-useless-escape': 'warn',
'no-useless-rename': [
'warn',
{
ignoreDestructuring: false,
ignoreImport: false,
ignoreExport: false,
},
],
'no-with': 'warn',
'no-whitespace-before-property': 'warn',
'react-hooks/exhaustive-deps': 'warn',
'require-yield': 'warn',
'rest-spread-spacing': ['warn', 'never'],
strict: ['warn', 'never'],
'unicode-bom': ['warn', 'never'],
'use-isnan': 'warn',
'valid-typeof': 'warn',
'no-restricted-properties': [
'error',
{
object: 'require',
property: 'ensure',
message:
'Please use import() instead. More info: https://facebook.github.io/create-react-app/docs/code-splitting',
},
{
object: 'System',
property: 'import',
message:
'Please use import() instead. More info: https://facebook.github.io/create-react-app/docs/code-splitting',
},
],
'getter-return': 'warn',
// https://github.com/benmosher/eslint-plugin-import/tree/master/docs/rules
'import/first': 'error',
'import/no-amd': 'error',
'import/no-anonymous-default-export': 'warn',
'import/no-webpack-loader-syntax': 'error',
// https://github.com/yannickcr/eslint-plugin-react/tree/master/docs/rules
'react/forbid-foreign-prop-types': ['warn', { allowInPropTypes: true }],
'react/jsx-no-comment-textnodes': 'warn',
'react/jsx-no-duplicate-props': 'warn',
'react/jsx-no-target-blank': 'warn',
'react/jsx-no-undef': 'error',
'react/jsx-pascal-case': [
'warn',
{
allowAllCaps: true,
ignore: [],
},
],
'react/no-danger-with-children': 'warn',
// Disabled because of undesirable warnings
// See https://github.com/facebook/create-react-app/issues/5204 for
// blockers until its re-enabled
// 'react/no-deprecated': 'warn',
'react/no-direct-mutation-state': 'warn',
'react/no-is-mounted': 'warn',
'react/no-typos': 'error',
'react/require-render-return': 'error',
'react/style-prop-object': 'warn',
// https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules
'jsx-a11y/alt-text': 'warn',
'jsx-a11y/anchor-has-content': 'warn',
'jsx-a11y/anchor-is-valid': [
'warn',
{
aspects: ['noHref', 'invalidHref'],
},
],
'jsx-a11y/aria-activedescendant-has-tabindex': 'warn',
'jsx-a11y/aria-props': 'warn',
'jsx-a11y/aria-proptypes': 'warn',
'jsx-a11y/aria-role': ['warn', { ignoreNonDOM: true }],
'jsx-a11y/aria-unsupported-elements': 'warn',
'jsx-a11y/heading-has-content': 'warn',
'jsx-a11y/iframe-has-title': 'warn',
'jsx-a11y/img-redundant-alt': 'warn',
'jsx-a11y/no-access-key': 'warn',
'jsx-a11y/no-distracting-elements': 'warn',
'jsx-a11y/no-redundant-roles': 'warn',
'jsx-a11y/role-has-required-aria-props': 'warn',
'jsx-a11y/role-supports-aria-props': 'warn',
'jsx-a11y/scope': 'warn',
// https://github.com/facebook/react/tree/main/packages/eslint-plugin-react-hooks
'react-hooks/rules-of-hooks': 'error',
'prettier/prettier': 'warn',
// Note: base rule explicitly disabled in favor of the TS one
'no-unused-vars': 'off',
'@typescript-eslint/no-unused-vars': [
'warn',
{
varsIgnorePattern: '^(_|React)',
ignoreRestSiblings: true,
caughtErrors: 'none',
},
],
curly: ['warn', 'multi-line', 'consistent'],
'no-restricted-globals': ['warn'].concat(
require('confusing-browser-globals').filter(g => g !== 'self'),
),
'react/jsx-filename-extension': [
'warn',
{ extensions: ['.jsx', '.tsx'], allow: 'as-needed' },
],
'react/jsx-no-useless-fragment': 'warn',
'react/self-closing-comp': 'warn',
'react/no-unstable-nested-components': [
'warn',
{ allowAsProps: true, customValidators: ['formatter'] },
],
'rulesdir/typography': 'warn',
'rulesdir/prefer-if-statement': 'warn',
// https://github.com/eslint/eslint/issues/16954
// https://github.com/eslint/eslint/issues/16953
'no-loop-func': 'off',
// Do don't need this as we're using TypeScript
'react/prop-types': 'off',
// TODO: re-enable these rules
'react/react-in-jsx-scope': 'off',
'no-var': 'warn',
'react/jsx-curly-brace-presence': 'warn',
'object-shorthand': ['warn', 'properties'],
'import/extensions': [
'warn',
'never',
{
json: 'always',
},
],
'import/no-useless-path-segments': 'warn',
'import/no-duplicates': ['warn', { 'prefer-inline': true }],
'import/no-unused-modules': ['warn', { unusedExports: true }],
'import/order': [
'warn',
{
alphabetize: {
caseInsensitive: true,
order: 'asc',
},
groups: [
'builtin', // Built-in types are first
'external',
'parent',
'sibling',
'index', // Then the index file
],
'newlines-between': 'always',
pathGroups: [
// Enforce that React (and react-related packages) is the first import
{ group: 'builtin', pattern: 'react?(-*)', position: 'before' },
// Separate imports from Actual from "real" external imports
{
group: 'external',
pattern: 'loot-{core,design}/**/*',
position: 'after',
},
],
pathGroupsExcludedImportTypes: ['react'],
},
],
'no-restricted-syntax': [
'warn',
{
// forbid React.* as they are legacy https://twitter.com/dan_abramov/status/1308739731551858689
selector:
":matches(MemberExpression[object.name='React'], TSQualifiedName[left.name='React'])",
message:
'Using default React import is discouraged, please use named exports directly instead.',
},
{
// forbid <a> in favor of <Link>
selector: 'JSXOpeningElement[name.name="a"]',
message: 'Using <a> is discouraged, please use <Link> instead.',
},
],
'no-restricted-imports': [
'warn',
{ patterns: [...restrictedImportPatterns, ...restrictedImportColors] },
],
'@typescript-eslint/ban-ts-comment': [
'error',
{ 'ts-ignore': 'allow-with-description' },
],
// Rules disable during TS migration
'@typescript-eslint/no-var-requires': 'off',
'prefer-const': 'warn',
'prefer-spread': 'off',
'@typescript-eslint/no-empty-function': 'off',
'@typescript-eslint/no-require-imports': 'off',
'import/no-default-export': 'warn',
},
overrides: [
{
files: ['**/*.ts?(x)'],
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaVersion: 2018,
sourceType: 'module',
ecmaFeatures: {
jsx: true,
},
// typescript-eslint specific options
warnOnUnsupportedTypeScriptVersion: true,
},
plugins: ['@typescript-eslint'],
// If adding a typescript-eslint version of an existing ESLint rule,
// make sure to disable the ESLint rule here.
rules: {
// TypeScript's `noFallthroughCasesInSwitch` option is more robust (#6906)
'default-case': 'off',
// 'tsc' already handles this (https://github.com/typescript-eslint/typescript-eslint/issues/291)
'no-dupe-class-members': 'off',
// 'tsc' already handles this (https://github.com/typescript-eslint/typescript-eslint/issues/477)
'no-undef': 'off',
// Add TypeScript specific rules (and turn off ESLint equivalents)
'@typescript-eslint/consistent-type-assertions': 'warn',
'no-array-constructor': 'off',
'@typescript-eslint/no-array-constructor': 'warn',
'no-redeclare': 'off',
'@typescript-eslint/no-redeclare': 'warn',
'no-use-before-define': 'off',
'@typescript-eslint/no-use-before-define': [
'warn',
{
functions: false,
classes: false,
variables: false,
typedefs: false,
},
],
'no-unused-expressions': 'off',
'@typescript-eslint/no-unused-expressions': [
'error',
{
allowShortCircuit: true,
allowTernary: true,
allowTaggedTemplates: true,
},
],
'no-useless-constructor': 'off',
'@typescript-eslint/no-useless-constructor': 'warn',
},
},
{
files: ['.eslintrc.js', './**/.eslintrc.js'],
parserOptions: { project: null },
rules: {
'@typescript-eslint/consistent-type-exports': 'off',
},
},
{
files: [
'./packages/desktop-client/**/*.{ts,tsx}',
'./packages/loot-core/src/client/**/*.{ts,tsx}',
],
rules: {
// enforce type over interface
'@typescript-eslint/consistent-type-definitions': ['warn', 'type'],
// enforce import type
'@typescript-eslint/consistent-type-imports': [
'warn',
{ prefer: 'type-imports', fixStyle: 'inline-type-imports' },
],
'@typescript-eslint/no-restricted-types': [
'warn',
{
types: {
// forbid FC as superflous
FunctionComponent: { message: ruleFCMsg },
FC: { message: ruleFCMsg },
},
},
],
},
},
{
files: ['./packages/desktop-client/**/*'],
excludedFiles: [
'./packages/desktop-client/src/hooks/useNavigate.{ts,tsx}',
],
rules: {
'no-restricted-imports': [
'warn',
{
patterns: [
{
group: ['react-router-dom'],
importNames: ['useNavigate'],
message: 'Please use Actuals useNavigate() hook instead.',
},
],
},
],
},
},
{
files: ['./packages/loot-core/src/**/*'],
rules: {
'no-restricted-imports': [
'warn',
{
patterns: [
...restrictedImportPatterns,
{
group: ['loot-core/**'],
message:
'Please use relative imports in loot-core instead of importing from `loot-core/*`',
},
],
},
],
},
},
{
files: [
'packages/loot-core/src/types/**/*',
'packages/loot-core/src/client/state-types/**/*',
'**/icons/**/*',
'**/{mocks,__mocks__}/**/*',
// can't correctly resolve usages
'**/*.{testing,electron,browser,web,api}.ts',
],
rules: { 'import/no-unused-modules': 'off' },
},
{
files: [
'./packages/desktop-client/src/style/index.*',
'./packages/desktop-client/src/style/palette.*',
],
rules: {
'no-restricted-imports': ['off', { patterns: restrictedImportColors }],
},
},
{
files: [
'./packages/api/migrations/*',
'./packages/loot-core/migrations/*',
],
rules: {
'import/no-default-export': 'off',
},
},
{
// TODO: fix the issues in these files
files: [
'./packages/desktop-client/src/components/accounts/Account.jsx',
'./packages/desktop-client/src/components/accounts/MobileAccount.jsx',
'./packages/desktop-client/src/components/accounts/MobileAccounts.jsx',
'./packages/desktop-client/src/components/App.tsx',
'./packages/desktop-client/src/components/budget/BudgetCategories.jsx',
'./packages/desktop-client/src/components/budget/BudgetSummaries.tsx',
'./packages/desktop-client/src/components/budget/DynamicBudgetTable.tsx',
'./packages/desktop-client/src/components/budget/index.tsx',
'./packages/desktop-client/src/components/budget/MobileBudget.tsx',
'./packages/desktop-client/src/components/budget/envelope/HoldMenu.tsx',
'./packages/desktop-client/src/components/budget/envelope/TransferMenu.tsx',
'./packages/desktop-client/src/components/common/Menu.tsx',
'./packages/desktop-client/src/components/FinancesApp.tsx',
'./packages/desktop-client/src/components/GlobalKeys.ts',
'./packages/desktop-client/src/components/LoggedInUser.tsx',
'./packages/desktop-client/src/components/manager/ManagementApp.jsx',
'./packages/desktop-client/src/components/manager/subscribe/common.tsx',
'./packages/desktop-client/src/components/ManageRules.tsx',
'./packages/desktop-client/src/components/mobile/MobileAmountInput.jsx',
'./packages/desktop-client/src/components/mobile/MobileNavTabs.tsx',
'./packages/desktop-client/src/components/Modals.tsx',
'./packages/desktop-client/src/components/modals/EditRule.jsx',
'./packages/desktop-client/src/components/modals/ImportTransactions.jsx',
'./packages/desktop-client/src/components/modals/MergeUnusedPayees.jsx',
'./packages/desktop-client/src/components/Notifications.tsx',
'./packages/desktop-client/src/components/payees/ManagePayees.jsx',
'./packages/desktop-client/src/components/payees/ManagePayeesWithData.jsx',
'./packages/desktop-client/src/components/payees/PayeeTable.tsx',
'./packages/desktop-client/src/components/reports/graphs/tableGraph/ReportTable.tsx',
'./packages/desktop-client/src/components/reports/graphs/tableGraph/ReportTableTotals.tsx',
'./packages/desktop-client/src/components/reports/reports/CashFlowCard.jsx',
'./packages/desktop-client/src/components/reports/reports/CustomReport.jsx',
'./packages/desktop-client/src/components/reports/reports/NetWorthCard.jsx',
'./packages/desktop-client/src/components/reports/SaveReportName.tsx',
'./packages/desktop-client/src/components/reports/useReport.ts',
'./packages/desktop-client/src/components/schedules/ScheduleDetails.jsx',
'./packages/desktop-client/src/components/schedules/SchedulesTable.tsx',
'./packages/desktop-client/src/components/select/DateSelect.tsx',
'./packages/desktop-client/src/components/sidebar/Tools.tsx',
'./packages/desktop-client/src/components/sort.tsx',
'./packages/desktop-client/src/components/spreadsheet/useSheetValue.ts',
'./packages/desktop-client/src/components/table.tsx',
'./packages/desktop-client/src/components/Titlebar.tsx',
'./packages/desktop-client/src/components/transactions/MobileTransaction.jsx',
'./packages/desktop-client/src/components/transactions/SelectedTransactions.jsx',
'./packages/desktop-client/src/components/transactions/SimpleTransactionsTable.jsx',
'./packages/desktop-client/src/components/transactions/TransactionList.jsx',
'./packages/desktop-client/src/components/transactions/TransactionsTable.jsx',
'./packages/desktop-client/src/components/transactions/TransactionsTable.test.jsx',
'./packages/desktop-client/src/hooks/useAccounts.ts',
'./packages/desktop-client/src/hooks/useCategories.ts',
'./packages/desktop-client/src/hooks/usePayees.ts',
'./packages/desktop-client/src/hooks/useProperFocus.tsx',
'./packages/desktop-client/src/hooks/useSelected.tsx',
'./packages/loot-core/src/client/query-hooks.tsx',
],
rules: {
'react-hooks/exhaustive-deps': 'off',
},
},
{
files: [
'.eslintrc.js',
'*.test.js',
'*.test.ts',
'*.test.jsx',
'*.test.tsx',
],
rules: {
'rulesdir/typography': 'off',
},
},
],
settings: {
react: {
version: 'detect',
},
'import/resolver': {
typescript: {
alwaysTryTypes: true,
},
},
},
};

View File

@@ -12,7 +12,7 @@ body:
id: intro-md
attributes:
value: |
**IMPORTANT:** we use Github Issues only for BUG REPORTS and FEATURE REQUESTS. If you are looking for help/support - please reach out to the [community on Discord](https://discord.gg/pRYNYr4W5A). All non-bug and non-feature-request issues will be closed.
**IMPORTANT:** we use GitHub Issues only for BUG REPORTS and FEATURE REQUESTS. If you are looking for help/support - please reach out to the [community on Discord](https://discord.gg/pRYNYr4W5A). All non-bug and non-feature-request issues will be closed.
**Bank-sync problems (SimpleFin / GoCardless)?** Reach out via the [community Discord](https://discord.gg/pRYNYr4W5A) first and open an issue only if the community deems the issue to be a legitimate bug in Actual.
- type: checkboxes
@@ -23,8 +23,6 @@ body:
options:
- label: 'I have searched and found no existing issue'
required: true
- label: 'I will be providing steps how to reproduce the bug (in most cases this will also mean uploading a demo budget file)'
required: true
validations:
required: true
- type: textarea
@@ -36,6 +34,14 @@ body:
value: 'A bug happened!'
validations:
required: true
- type: textarea
id: reproduction
attributes:
label: How can we reproduce the issue?
description: Please give step-by-step instructions on how to reproduce the issue. In most cases this might also require uploading a sample budget/import file.
value: 'How can we reproduce the issue?'
validations:
required: true
- type: markdown
id: env-info
attributes:

View File

@@ -6,3 +6,6 @@ contact_links:
- name: Support
url: https://discord.gg/pRYNYr4W5A
about: Need help with something? Having troubles setting up? Or perhaps issues using the API? Reach out to the community on Discord.
- name: Translations
url: https://hosted.weblate.org/projects/actualbudget/actual/
about: Found a string that needs a better translation? Add your suggestion or upvote an existing one in Weblate.

View File

@@ -1,5 +1,15 @@
name: Setup
inputs:
working-directory:
description: 'Working directory to run in, default .'
required: false
default: '.'
download-translations:
description: 'Whether to download translations as part of setup, default true'
required: false
default: 'true'
runs:
using: composite
steps:
@@ -7,13 +17,28 @@ runs:
uses: actions/setup-node@v4
with:
node-version: 18.16.0
- name: Install yarn
run: npm install -g yarn
shell: bash
if: ${{ env.ACT }}
- name: Cache
uses: actions/cache@v4
id: cache
with:
path: '**/node_modules'
key: yarn-v1-${{ runner.os }}-${{ hashFiles('.nvmrc') }}-${{ hashFiles('**/yarn.lock') }}
path: ${{ format('{0}/**/node_modules', inputs.working-directory) }}
key: yarn-v1-${{ runner.os }}-${{ hashFiles(format('{0}/.nvmrc', inputs.working-directory)) }}-${{ hashFiles(format('{0}/**/yarn.lock', inputs.working-directory)) }}
- name: Install
working-directory: ${{ inputs.working-directory }}
run: yarn --immutable
shell: bash
if: steps.cache.outputs.cache-hit != 'true'
- name: Download translations
uses: actions/checkout@v4
with:
repository: actualbudget/translations
path: ${{ inputs.working-directory }}/packages/desktop-client/locale
if: ${{ inputs.download-translations == 'true' }}
- name: Remove untranslated languages
run: packages/desktop-client/bin/remove-untranslated-languages
shell: bash
if: ${{ inputs.download-translations == 'true' }}

View File

@@ -80,6 +80,7 @@ jobs:
- name: Add to Release
uses: softprops/action-gh-release@v2
with:
draft: true
files: |
packages/desktop-electron/dist/*.dmg
packages/desktop-electron/dist/*.exe

View File

@@ -0,0 +1,87 @@
name: Extract and upload i18n strings
on:
schedule:
# 4am UTC
- cron: "0 4 * * *"
workflow_dispatch:
jobs:
extract-and-upload-i18n-strings:
runs-on: ubuntu-latest
if: github.repository == 'actualbudget/actual'
steps:
- name: Check out main repository
uses: actions/checkout@v4
with:
path: actual
- name: Set up environment
uses: ./actual/.github/actions/setup
with:
working-directory: actual
download-translations: false # As we'll manually clone instead
- name: Configure Git config
run: |
git config --global user.name "github-actions[bot]"
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
- name: Configure i18n client
run: |
pip install wlc
- name: Lock translations
run: |
wlc \
--url https://hosted.weblate.org/api/ \
--key "${{ secrets.WEBLATE_API_KEY_CI_STRINGS }}" \
lock \
actualbudget/actual
- name: Update VCS with latest translations
run: |
wlc \
--url https://hosted.weblate.org/api/ \
--key "${{ secrets.WEBLATE_API_KEY_CI_STRINGS }}" \
push \
actualbudget/actual
- name: Check out updated translations
uses: actions/checkout@v4
with:
ssh-key: ${{ secrets.STRING_IMPORT_DEPLOY_KEY }}
repository: actualbudget/translations
path: translations
- name: Generate i18n strings
working-directory: actual
run: |
mkdir -p packages/desktop-client/locale/
cp ../translations/en.json packages/desktop-client/locale/
yarn generate:i18n
if [[ ! -f packages/desktop-client/locale/en.json ]]; then
echo "File packages/desktop-client/locale/en.json not found. Ensure the file was generated correctly."
exit 1
fi
- name: Check in new i18n strings
working-directory: translations
run: |
cp ../actual/packages/desktop-client/locale/en.json .
git add .
if git commit -m "Update source strings"; then
git push
else
echo "No changes to commit"
fi
- name: Update Weblate with latest translations
run: |
wlc \
--url https://hosted.weblate.org/api/ \
--key "${{ secrets.WEBLATE_API_KEY_CI_STRINGS }}" \
pull \
actualbudget/actual
- name: Unlock translations
if: always() # Clean up even on failure
run: |
wlc \
--url https://hosted.weblate.org/api/ \
--key "${{ secrets.WEBLATE_API_KEY_CI_STRINGS }}" \
unlock \
actualbudget/actual

View File

@@ -25,7 +25,7 @@ jobs:
pull-requests: write
steps:
- name: Wait for ${{github.base_ref}} build to succeed
uses: fountainhead/action-wait-for-check@v1.1.0
uses: fountainhead/action-wait-for-check@v1.2.0
id: master-build
with:
token: ${{ secrets.GITHUB_TOKEN }}
@@ -33,7 +33,7 @@ jobs:
ref: ${{github.base_ref}}
- name: Wait for PR build to succeed
uses: fountainhead/action-wait-for-check@v1.1.0
uses: fountainhead/action-wait-for-check@v1.2.0
id: wait-for-build
with:
token: ${{ secrets.GITHUB_TOKEN }}
@@ -46,7 +46,7 @@ jobs:
echo "Build failed on PR branch or ${{github.base_ref}}"
exit 1
- name: Download build artifact from ${{github.base_ref}}
uses: dawidd6/action-download-artifact@v3
uses: dawidd6/action-download-artifact@v6
id: pr-build
with:
branch: ${{github.base_ref}}
@@ -55,12 +55,13 @@ jobs:
path: base
- name: Download build artifact from PR
uses: dawidd6/action-download-artifact@v3
uses: dawidd6/action-download-artifact@v6
with:
pr: ${{github.event.pull_request.number}}
workflow: build.yml
name: build-stats
path: head
allow_forks: true
- name: Strip content hashes from stats files
run: |
@@ -70,14 +71,14 @@ jobs:
sed -i -E 's/index\.[0-9a-zA-Z_-]{8,}\./index./g' ./base/web-stats.json
sed -i -E 's/\.[0-9a-zA-Z_-]{8,}\.chunk\././g' ./base/web-stats.json
sed -i -E 's/\.[0-9a-f]{8,}\././g' ./base/*.json
- uses: twk3/rollup-size-compare-action@v1.0.0
- uses: twk3/rollup-size-compare-action@v1.1.1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
current-stats-json-path: ./head/web-stats.json
base-stats-json-path: ./base/web-stats.json
title: desktop-client
- uses: github/webpack-bundlesize-compare-action@v1.8.2
- uses: github/webpack-bundlesize-compare-action@v2.1.0
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
current-stats-json-path: ./head/loot-core-stats.json

115
.github/workflows/update-vrt.yml vendored Normal file
View File

@@ -0,0 +1,115 @@
name: /update-vrt
on:
issue_comment:
types: [ created ]
permissions:
pull-requests: read
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.event.issue.number }}-${{ contains(github.event.comment.body, '/update-vrt') }}
cancel-in-progress: true
jobs:
update-vrt:
name: Update VRT
runs-on: ubuntu-latest
if: |
github.event.issue.pull_request &&
contains(github.event.comment.body, '/update-vrt')
container:
image: mcr.microsoft.com/playwright:v1.41.1-jammy
steps:
- name: Get PR branch
# Until https://github.com/xt0rted/pull-request-comment-branch/issues/322 is resolved we use the forked version
uses: gotson/pull-request-comment-branch@head-repo-owner-dist
id: comment-branch
- uses: actions/checkout@v4
with:
repository: ${{ steps.comment-branch.outputs.head_owner }}/${{ steps.comment-branch.outputs.head_repo }}
ref: ${{ steps.comment-branch.outputs.head_ref }}
- name: Set up environment
uses: ./.github/actions/setup
- name: Wait for Netlify build to finish
id: netlify
env:
COMMIT_SHA: ${{ steps.comment-branch.outputs.head_sha }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: ./.github/actions/netlify-wait-for-build
- name: Run VRT Tests on Netlify URL
run: yarn vrt --update-snapshots
env:
E2E_START_URL: ${{ steps.netlify.outputs.url }}
- name: Create patch
run: |
git config --system --add safe.directory "*"
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
git reset
git add "**/*.png"
if git diff --staged --quiet; then
echo "No changes to commit"
exit 0
fi
git commit -m "Update VRT"
git format-patch -1 HEAD --stdout > Update-VRT.patch
- uses: actions/upload-artifact@v4
with:
name: patch
path: Update-VRT.patch
push-patch:
runs-on: ubuntu-latest
needs: update-vrt
permissions:
contents: write
pull-requests: write
steps:
- name: Get PR branch
# Until https://github.com/xt0rted/pull-request-comment-branch/issues/322 is resolved we use the forked version
uses: gotson/pull-request-comment-branch@head-repo-owner-dist
id: comment-branch
- uses: actions/checkout@v4
with:
repository: ${{ steps.comment-branch.outputs.head_owner }}/${{ steps.comment-branch.outputs.head_repo }}
ref: ${{ steps.comment-branch.outputs.head_ref }}
- uses: actions/download-artifact@v4
continue-on-error: true
with:
name: patch
- name: Apply patch and push
env:
BRANCH_NAME: ${{ steps.comment-branch.outputs.head_ref }}
run: |
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
git apply Update-VRT.patch
git add "**/*.png"
if git diff --staged --quiet; then
echo "No changes to commit"
exit 0
fi
git commit -m "Update VRT"
git push origin HEAD:${BRANCH_NAME}
- name: Add finished reaction
uses: dkershner6/reaction-action@v2
with:
token: ${{ secrets.GITHUB_TOKEN }}
commentId: ${{ github.event.comment.id }}
reaction: "rocket"
add-starting-reaction:
runs-on: ubuntu-latest
if: |
github.event.issue.pull_request &&
contains(github.event.comment.body, '/update-vrt')
permissions:
pull-requests: write
steps:
- name: React to comment
uses: dkershner6/reaction-action@v2
with:
token: ${{ secrets.GITHUB_TOKEN }}
commentId: ${{ github.event.comment.id }}
reaction: "+1"

3
.gitignore vendored
View File

@@ -50,3 +50,6 @@ bundle.mobile.js.map
# Local Netlify folder
.netlify
# build output
package.tgz

View File

@@ -2,6 +2,8 @@ compressionLevel: mixed
enableGlobalCache: false
enableTransparentWorkspaces: false
nodeLinker: node-modules
yarnPath: .yarn/releases/yarn-4.3.1.cjs

View File

@@ -4,6 +4,15 @@ ROOT=`dirname $0`
cd "$ROOT/.."
echo "Updating translations..."
if ! [ -d packages/desktop-client/locale ]; then
git clone https://github.com/actualbudget/translations packages/desktop-client/locale
fi
pushd packages/desktop-client/locale > /dev/null
git pull
popd > /dev/null
packages/desktop-client/bin/remove-untranslated-languages
yarn workspace loot-core build:browser
yarn workspace @actual-app/web build:browser

View File

@@ -36,7 +36,7 @@ fi
yarn workspace loot-core build:node
yarn workspace @actual-app/web build --mode=desktop
yarn workspace @actual-app/web build --mode=desktop # electron specific build
yarn workspace desktop-electron update-client

835
eslint.config.mjs Normal file
View File

@@ -0,0 +1,835 @@
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import globals from 'globals';
import pluginImport from 'eslint-plugin-import';
import pluginJSXA11y from 'eslint-plugin-jsx-a11y';
import pluginPrettier from 'eslint-plugin-prettier/recommended';
import pluginReact from 'eslint-plugin-react';
import pluginReactHooks from 'eslint-plugin-react-hooks';
import pluginRulesDir from 'eslint-plugin-rulesdir';
import pluginTypescript from 'typescript-eslint';
import tsParser from '@typescript-eslint/parser';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
pluginRulesDir.RULES_DIR = path.join(
__dirname,
'packages',
'eslint-plugin-actual',
'lib',
'rules',
);
const confusingBrowserGlobals = [
// https://github.com/facebook/create-react-app/tree/main/packages/confusing-browser-globals
'addEventListener',
'blur',
'close',
'closed',
'confirm',
'defaultStatus',
'defaultstatus',
'event',
'external',
'find',
'focus',
'frameElement',
'frames',
'history',
'innerHeight',
'innerWidth',
'length',
'location',
'locationbar',
'menubar',
'moveBy',
'moveTo',
'name',
'onblur',
'onerror',
'onfocus',
'onload',
'onresize',
'onunload',
'open',
'opener',
'opera',
'outerHeight',
'outerWidth',
'pageXOffset',
'pageYOffset',
'parent',
'print',
'removeEventListener',
'resizeBy',
'resizeTo',
'screen',
'screenLeft',
'screenTop',
'screenX',
'screenY',
'scroll',
'scrollbars',
'scrollBy',
'scrollTo',
'scrollX',
'scrollY',
'status',
'statusbar',
'stop',
'toolbar',
'top',
];
/** @type {import('eslint').Linter.Config[]} */
export default [
{
ignores: [
'packages/api/app/bundle.api.js',
'packages/api/dist',
'packages/api/@types',
'packages/api/migrations',
'packages/crdt/dist',
'packages/desktop-client/bundle.browser.js',
'packages/desktop-client/build/',
'packages/desktop-client/build-electron/',
'packages/desktop-client/build-stats/',
'packages/desktop-client/public/kcab/',
'packages/desktop-client/public/data/',
'packages/desktop-client/**/node_modules/*',
'packages/desktop-client/node_modules/',
'packages/desktop-client/src/icons/**/*',
'packages/desktop-client/test-results/',
'packages/desktop-client/playwright-report/',
'packages/desktop-electron/client-build/',
'packages/desktop-electron/build/',
'packages/desktop-electron/dist/',
'packages/import-ynab4/**/node_modules/*',
'packages/import-ynab5/**/node_modules/*',
'packages/loot-core/**/node_modules/*',
'packages/loot-core/**/lib-dist/*',
'packages/loot-core/**/proto/*',
'packages/sync-server',
'.yarn/*',
'.github/*',
],
},
{
linterOptions: {
reportUnusedDisableDirectives: true,
},
languageOptions: {
globals: {
...globals.browser,
...globals.commonjs,
...globals.jest,
...globals.node,
globalThis: false,
vi: true,
},
},
settings: {
react: {
version: 'detect',
},
'import/resolver': {
typescript: {
alwaysTryTypes: true,
},
},
},
},
pluginReact.configs.flat.recommended,
pluginReact.configs.flat['jsx-runtime'],
pluginPrettier,
...pluginTypescript.configs.recommended,
pluginImport.flatConfigs.recommended,
{
plugins: {
'react-hooks': pluginReactHooks,
'jsx-a11y': pluginJSXA11y,
rulesdir: pluginRulesDir,
},
},
{
files: ['**/*.{js,ts,jsx,tsx}'],
rules: {
// http://eslint.org/docs/rules/
'array-callback-return': 'warn',
'default-case': [
'warn',
{
commentPattern: '^no default$',
},
],
curly: ['warn', 'multi-line', 'consistent'],
'dot-location': ['warn', 'property'],
eqeqeq: ['warn', 'smart'],
'new-parens': 'warn',
'no-array-constructor': 'warn',
'no-caller': 'warn',
'no-cond-assign': ['warn', 'except-parens'],
'no-const-assign': 'warn',
'no-control-regex': 'warn',
'no-delete-var': 'warn',
'no-dupe-args': 'warn',
'no-dupe-class-members': 'warn',
'no-dupe-keys': 'warn',
'no-duplicate-case': 'warn',
'no-empty-character-class': 'warn',
'no-empty-pattern': 'warn',
'no-eval': 'warn',
'no-ex-assign': 'warn',
'no-extend-native': 'warn',
'no-extra-bind': 'warn',
'no-extra-label': 'warn',
'no-fallthrough': 'warn',
'no-func-assign': 'warn',
'no-implied-eval': 'warn',
'no-invalid-regexp': 'warn',
'no-iterator': 'warn',
'no-label-var': 'warn',
'no-labels': [
'warn',
{
allowLoop: true,
allowSwitch: false,
},
],
'no-lone-blocks': 'warn',
'no-mixed-operators': [
'warn',
{
groups: [
['&', '|', '^', '~', '<<', '>>', '>>>'],
['==', '!=', '===', '!==', '>', '>=', '<', '<='],
['&&', '||'],
['in', 'instanceof'],
],
allowSamePrecedence: false,
},
],
'no-multi-str': 'warn',
'no-global-assign': 'warn',
'no-unsafe-negation': 'warn',
'no-new-func': 'warn',
'no-new-object': 'warn',
'no-new-symbol': 'warn',
'no-new-wrappers': 'warn',
'no-obj-calls': 'warn',
'no-octal': 'warn',
'no-octal-escape': 'warn',
'no-redeclare': 'warn',
'no-regex-spaces': 'warn',
'no-script-url': 'warn',
'no-self-assign': 'warn',
'no-self-compare': 'warn',
'no-sequences': 'warn',
'no-shadow-restricted-names': 'warn',
'no-sparse-arrays': 'warn',
'no-template-curly-in-string': 'warn',
'no-this-before-super': 'warn',
'no-throw-literal': 'warn',
'no-undef': 'error',
'no-unreachable': 'warn',
'no-unused-expressions': [
'error',
{
allowShortCircuit: true,
allowTernary: true,
allowTaggedTemplates: true,
},
],
'no-unused-labels': 'warn',
'no-use-before-define': [
'warn',
{
functions: false,
classes: false,
variables: false,
},
],
'no-useless-computed-key': 'warn',
'no-useless-concat': 'warn',
'no-useless-constructor': 'warn',
'no-useless-escape': 'warn',
'no-useless-rename': [
'warn',
{
ignoreDestructuring: false,
ignoreImport: false,
ignoreExport: false,
},
],
'no-with': 'warn',
'no-whitespace-before-property': 'warn',
'require-yield': 'warn',
'rest-spread-spacing': ['warn', 'never'],
strict: ['warn', 'never'],
'unicode-bom': ['warn', 'never'],
'use-isnan': 'warn',
'valid-typeof': 'warn',
'no-restricted-properties': [
'error',
{
object: 'require',
property: 'ensure',
message:
'Please use import() instead. More info: https://facebook.github.io/create-react-app/docs/code-splitting',
},
{
object: 'System',
property: 'import',
message:
'Please use import() instead. More info: https://facebook.github.io/create-react-app/docs/code-splitting',
},
],
'getter-return': 'warn',
// https://github.com/benmosher/eslint-plugin-import/tree/master/docs/rules
'import/first': 'error',
'import/no-amd': 'error',
'import/no-anonymous-default-export': 'warn',
'import/no-webpack-loader-syntax': 'error',
'import/extensions': [
'warn',
'never',
{
json: 'always',
},
],
'import/no-useless-path-segments': 'warn',
'import/no-duplicates': [
'warn',
{
'prefer-inline': true,
},
],
'import/order': [
'warn',
{
alphabetize: {
caseInsensitive: true,
order: 'asc',
},
groups: ['builtin', 'external', 'parent', 'sibling', 'index'],
'newlines-between': 'always',
pathGroups: [
{
// Enforce that React (and react-related packages) is the first import
group: 'builtin',
pattern: 'react?(-*)',
position: 'before',
},
{
// Separate imports from Actual from "real" external imports
group: 'external',
pattern: 'loot-{core,design}/**/*',
position: 'after',
},
],
pathGroupsExcludedImportTypes: ['react'],
},
],
// https://github.com/yannickcr/eslint-plugin-react/tree/master/docs/rules
'react/forbid-foreign-prop-types': [
'warn',
{
allowInPropTypes: true,
},
],
'react/jsx-no-comment-textnodes': 'warn',
'react/jsx-no-duplicate-props': 'warn',
'react/jsx-no-target-blank': 'warn',
'react/jsx-no-undef': 'error',
'react/jsx-pascal-case': [
'warn',
{
allowAllCaps: true,
ignore: [],
},
],
'react/no-danger-with-children': 'warn',
// Disabled because of undesirable warnings
// See https://github.com/facebook/create-react-app/issues/5204 for
// blockers until its re-enabled
// 'react/no-deprecated': 'warn',
'react/no-direct-mutation-state': 'warn',
'react/no-is-mounted': 'warn',
'react/no-typos': 'error',
'react/require-render-return': 'error',
'react/style-prop-object': 'warn',
'react/jsx-no-useless-fragment': 'warn',
'react/self-closing-comp': 'warn',
'react/jsx-filename-extension': [
'warn',
{
extensions: ['.jsx', '.tsx'],
allow: 'as-needed',
},
],
'react/no-unstable-nested-components': [
'warn',
{
allowAsProps: true,
customValidators: ['formatter'],
},
],
// Don't need this as we're using TypeScript
'react/prop-types': 'off',
// https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules
'jsx-a11y/alt-text': 'warn',
'jsx-a11y/anchor-has-content': 'warn',
'jsx-a11y/anchor-is-valid': [
'warn',
{
aspects: ['noHref', 'invalidHref'],
},
],
'jsx-a11y/aria-activedescendant-has-tabindex': 'warn',
'jsx-a11y/aria-props': 'warn',
'jsx-a11y/aria-proptypes': 'warn',
'jsx-a11y/aria-role': [
'warn',
{
ignoreNonDOM: true,
},
],
'jsx-a11y/aria-unsupported-elements': 'warn',
'jsx-a11y/heading-has-content': 'warn',
'jsx-a11y/iframe-has-title': 'warn',
'jsx-a11y/img-redundant-alt': 'warn',
'jsx-a11y/no-access-key': 'warn',
'jsx-a11y/no-distracting-elements': 'warn',
'jsx-a11y/no-redundant-roles': 'warn',
'jsx-a11y/role-has-required-aria-props': 'warn',
'jsx-a11y/role-supports-aria-props': 'warn',
'jsx-a11y/scope': 'warn',
// https://github.com/facebook/react/tree/main/packages/eslint-plugin-react-hooks
'react-hooks/rules-of-hooks': 'error',
'react-hooks/exhaustive-deps': [
'warn',
{
additionalHooks: '(useQuery)',
},
],
'rulesdir/typography': 'warn',
'rulesdir/prefer-if-statement': 'warn',
// Note: base rule explicitly disabled in favor of the TS one
'no-unused-vars': 'off',
'@typescript-eslint/no-unused-vars': [
'warn',
{
varsIgnorePattern: '^(_|React)',
ignoreRestSiblings: true,
caughtErrors: 'none',
},
],
'no-restricted-globals': ['warn', ...confusingBrowserGlobals],
// https://github.com/eslint/eslint/issues/16954
// https://github.com/eslint/eslint/issues/16953
'no-loop-func': 'off',
// TODO: re-enable these rules
'react/react-in-jsx-scope': 'off',
'no-var': 'warn',
'react/jsx-curly-brace-presence': 'warn',
'object-shorthand': ['warn', 'properties'],
'no-restricted-syntax': [
'warn',
{
// forbid React.* as they are legacy https://twitter.com/dan_abramov/status/1308739731551858689
selector:
":matches(MemberExpression[object.name='React'], TSQualifiedName[left.name='React'])",
message:
'Using default React import is discouraged, please use named exports directly instead.',
},
{
// forbid <a> in favor of <Link>
selector: 'JSXOpeningElement[name.name="a"]',
message: 'Using <a> is discouraged, please use <Link> instead.',
},
],
'no-restricted-imports': [
'warn',
{
patterns: [
{
group: ['*.api', '*.web', '*.electron'],
message: "Don't directly reference imports from other platforms",
},
{
group: ['uuid'],
importNames: ['*'],
message: "Use `import { v4 as uuidv4 } from 'uuid'` instead",
},
{
group: ['**/style', '**/colors'],
importNames: ['colors'],
message: 'Please use themes instead of colors',
},
],
},
],
'@typescript-eslint/ban-ts-comment': [
'error',
{
'ts-ignore': 'allow-with-description',
},
],
// Rules disabled during TS migration
'@typescript-eslint/no-var-requires': 'off',
'prefer-const': 'warn',
'prefer-spread': 'off',
'@typescript-eslint/no-empty-function': 'off',
'@typescript-eslint/no-require-imports': 'off',
'import/no-default-export': 'warn',
},
},
{
files: ['**/*.ts?(x)'],
languageOptions: {
parser: tsParser,
ecmaVersion: 2018,
sourceType: 'module',
parserOptions: {
project: [path.join(__dirname, './tsconfig.json')],
ecmaFeatures: {
jsx: true,
},
// typescript-eslint specific options
warnOnUnsupportedTypeScriptVersion: true,
},
},
// If adding a typescript-eslint version of an existing ESLint rule,
// make sure to disable the ESLint rule here.
rules: {
// TypeScript's `noFallthroughCasesInSwitch` option is more robust (#6906)
'default-case': 'off',
// 'tsc' already handles this (https://github.com/typescript-eslint/typescript-eslint/issues/291)
'no-dupe-class-members': 'off',
// 'tsc' already handles this (https://github.com/typescript-eslint/typescript-eslint/issues/477)
'no-undef': 'off',
// Add TypeScript specific rules (and turn off ESLint equivalents)
'@typescript-eslint/consistent-type-assertions': 'warn',
'no-array-constructor': 'off',
'@typescript-eslint/no-array-constructor': 'warn',
'no-redeclare': 'off',
'@typescript-eslint/no-redeclare': 'warn',
'no-use-before-define': 'off',
'@typescript-eslint/no-use-before-define': [
'warn',
{
functions: false,
classes: false,
variables: false,
typedefs: false,
},
],
'no-unused-expressions': 'off',
'@typescript-eslint/no-unused-expressions': [
'error',
{
allowShortCircuit: true,
allowTernary: true,
allowTaggedTemplates: true,
},
],
'no-useless-constructor': 'off',
'@typescript-eslint/no-useless-constructor': 'warn',
},
},
{
files: [
'packages/desktop-client/**/*.{ts,tsx}',
'packages/loot-core/src/client/**/*.{ts,tsx}',
],
rules: {
// enforce import type
'@typescript-eslint/consistent-type-imports': [
'warn',
{
prefer: 'type-imports',
fixStyle: 'inline-type-imports',
},
],
'@typescript-eslint/no-restricted-types': [
'warn',
{
types: {
// forbid FC as superflous
FunctionComponent: {
message:
'Type the props argument and let TS infer or use ComponentType for a component prop',
},
FC: {
message:
'Type the props argument and let TS infer or use ComponentType for a component prop',
},
},
},
],
},
},
{
files: ['packages/desktop-client/**/*'],
ignores: ['packages/desktop-client/src/hooks/useNavigate.{ts,tsx}'],
rules: {
'no-restricted-imports': [
'warn',
{
paths: [
{
name: 'react-router-dom',
importNames: ['useNavigate'],
message:
"Please import Actual's useNavigate() hook from `src/hooks` instead.",
},
],
},
],
},
},
{
files: ['packages/desktop-client/**/*', 'packages/loot-core/**/*'],
ignores: ['packages/desktop-client/src/redux/index.{ts,tsx}'],
rules: {
'no-restricted-imports': [
'warn',
{
paths: [
{
name: 'react-redux',
importNames: ['useDispatch'],
message:
"Please import Actual's useDispatch() hook from `src/redux` instead.",
},
{
name: 'react-redux',
importNames: ['useSelector'],
message:
"Please import Actual's useSelector() hook from `src/redux` instead.",
},
{
name: 'react-redux',
importNames: ['useStore'],
message:
"Please import Actual's useStore() hook from `src/redux` instead.",
},
],
},
],
},
},
{
files: ['packages/loot-core/src/**/*'],
rules: {
'no-restricted-imports': [
'warn',
{
patterns: [
{
group: ['*.api', '*.web', '*.electron'],
message: "Don't directly reference imports from other platforms",
},
{
group: ['uuid'],
importNames: ['*'],
message: "Use `import { v4 as uuidv4 } from 'uuid'` instead",
},
{
group: ['loot-core/**'],
message:
'Please use relative imports in loot-core instead of importing from `loot-core/*`',
},
],
},
],
},
},
{
files: [
'packages/loot-core/src/types/**/*',
'packages/loot-core/src/client/state-types/**/*',
'**/icons/**/*',
'**/{mocks,__mocks__}/**/*',
// can't correctly resolve usages
'**/*.{testing,electron,browser,web,api}.ts',
],
rules: {
'import/no-unused-modules': 'off',
},
},
{
files: [
'packages/desktop-client/src/style/index.*',
'packages/desktop-client/src/style/palette.*',
],
rules: {
'no-restricted-imports': [
'off',
{
patterns: [
{
group: ['**/style', '**/colors'],
importNames: ['colors'],
message: 'Please use themes instead of colors',
},
],
},
],
},
},
{
files: ['packages/api/migrations/*', 'packages/loot-core/migrations/*'],
rules: {
'import/no-default-export': 'off',
},
},
{
files: ['packages/api/index.ts'],
rules: {
'import/no-unresolved': 'off',
},
},
{},
{
// TODO: fix the issues in these files
files: [
'packages/desktop-client/src/components/accounts/Account.jsx',
'packages/desktop-client/src/components/accounts/MobileAccount.jsx',
'packages/desktop-client/src/components/accounts/MobileAccounts.jsx',
'packages/desktop-client/src/components/budget/BudgetCategories.jsx',
'packages/desktop-client/src/components/budget/BudgetSummaries.tsx',
'packages/desktop-client/src/components/budget/DynamicBudgetTable.tsx',
'packages/desktop-client/src/components/budget/index.tsx',
'packages/desktop-client/src/components/budget/MobileBudget.tsx',
'packages/desktop-client/src/components/budget/envelope/HoldMenu.tsx',
'packages/desktop-client/src/components/budget/envelope/TransferMenu.tsx',
'packages/desktop-client/src/components/common/Menu.tsx',
'packages/desktop-client/src/components/FinancesApp.tsx',
'packages/desktop-client/src/components/GlobalKeys.ts',
'packages/desktop-client/src/components/LoggedInUser.tsx',
'packages/desktop-client/src/components/manager/ManagementApp.jsx',
'packages/desktop-client/src/components/manager/subscribe/common.tsx',
'packages/desktop-client/src/components/ManageRules.tsx',
'packages/desktop-client/src/components/mobile/MobileAmountInput.jsx',
'packages/desktop-client/src/components/mobile/MobileNavTabs.tsx',
'packages/desktop-client/src/components/Modals.tsx',
'packages/desktop-client/src/components/modals/EditRule.jsx',
'packages/desktop-client/src/components/modals/ImportTransactions.jsx',
'packages/desktop-client/src/components/modals/MergeUnusedPayees.jsx',
'packages/desktop-client/src/components/Notifications.tsx',
'packages/desktop-client/src/components/payees/ManagePayees.jsx',
'packages/desktop-client/src/components/payees/ManagePayeesWithData.jsx',
'packages/desktop-client/src/components/payees/PayeeTable.tsx',
'packages/desktop-client/src/components/reports/graphs/tableGraph/ReportTable.tsx',
'packages/desktop-client/src/components/reports/graphs/tableGraph/ReportTableTotals.tsx',
'packages/desktop-client/src/components/reports/reports/CashFlowCard.jsx',
'packages/desktop-client/src/components/reports/reports/CustomReport.jsx',
'packages/desktop-client/src/components/reports/reports/NetWorthCard.jsx',
'packages/desktop-client/src/components/reports/SaveReportName.tsx',
'packages/desktop-client/src/components/reports/useReport.ts',
'packages/desktop-client/src/components/schedules/ScheduleDetails.jsx',
'packages/desktop-client/src/components/schedules/SchedulesTable.tsx',
'packages/desktop-client/src/components/select/DateSelect.tsx',
'packages/desktop-client/src/components/sidebar/Tools.tsx',
'packages/desktop-client/src/components/sort.tsx',
'packages/desktop-client/src/components/spreadsheet/useSheetValue.ts',
'packages/desktop-client/src/components/table.tsx',
'packages/desktop-client/src/components/Titlebar.tsx',
'packages/desktop-client/src/components/transactions/MobileTransaction.jsx',
'packages/desktop-client/src/components/transactions/SelectedTransactions.jsx',
'packages/desktop-client/src/components/transactions/SimpleTransactionsTable.jsx',
'packages/desktop-client/src/components/transactions/TransactionList.jsx',
'packages/desktop-client/src/components/transactions/TransactionsTable.jsx',
'packages/desktop-client/src/components/transactions/TransactionsTable.test.jsx',
'packages/desktop-client/src/hooks/useAccounts.ts',
'packages/desktop-client/src/hooks/useCategories.ts',
'packages/desktop-client/src/hooks/usePayees.ts',
'packages/desktop-client/src/hooks/useProperFocus.tsx',
'packages/desktop-client/src/hooks/useSelected.tsx',
'packages/loot-core/src/client/query-hooks.tsx',
],
rules: {
'react-hooks/exhaustive-deps': 'off',
},
},
{
files: [
'eslint.config.mjs',
'**/*.test.js',
'**/*.test.ts',
'**/*.test.jsx',
'**/*.test.tsx',
],
rules: {
'rulesdir/typography': 'off',
},
},
{
files: [
'packages/desktop-client/**/*.{ts,tsx}',
'packages/loot-core/src/client/**/*.{ts,tsx}',
],
ignores: ['**/**/globals.d.ts'],
rules: {
// enforce type over interface
'@typescript-eslint/consistent-type-definitions': ['warn', 'type'],
},
},
];

View File

@@ -38,33 +38,33 @@
"vrt:docker": "./bin/run-vrt",
"rebuild-electron": "./node_modules/.bin/electron-rebuild -f -m ./packages/loot-core",
"rebuild-node": "yarn workspace loot-core rebuild",
"lint": "eslint . --max-warnings 0 --ext .js,.jsx,.ts,.tsx",
"lint": "eslint . --max-warnings 0",
"lint:verbose": "DEBUG=eslint:cli-engine eslint . --max-warnings 0",
"typecheck": "yarn tsc && tsc-strict",
"jq": "./node_modules/node-jq/bin/jq",
"prepare": "husky"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^8.1.0",
"@typescript-eslint/parser": "^8.1.0",
"confusing-browser-globals": "^1.0.11",
"@typescript-eslint/parser": "^8.18.1",
"cross-env": "^7.0.3",
"eslint": "^8.57.0",
"eslint": "^9.17.0",
"eslint-config-prettier": "^9.1.0",
"eslint-import-resolver-typescript": "3.6.1",
"eslint-plugin-import": "2.29.1",
"eslint-plugin-jsx-a11y": "^6.9.0",
"eslint-import-resolver-typescript": "^3.7.0",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-prettier": "5.2.1",
"eslint-plugin-react": "7.35.0",
"eslint-plugin-react-hooks": "^4.6.2",
"eslint-plugin-react": "^7.37.2",
"eslint-plugin-react-hooks": "^5.1.0",
"eslint-plugin-rulesdir": "^0.2.2",
"globals": "^15.13.0",
"husky": "^9.0.11",
"lint-staged": "^15.2.9",
"node-jq": "^4.0.1",
"npm-run-all": "^4.1.5",
"prettier": "3.3.3",
"prettier": "^3.4.2",
"source-map-support": "^0.5.21",
"typescript": "^5.5.4",
"typescript-eslint": "^8.18.1",
"typescript-strict-plugin": "^2.4.4"
},
"resolutions": {

View File

@@ -85,8 +85,22 @@ export function addTransactions(
});
}
export function importTransactions(accountId, transactions) {
return send('api/transactions-import', { accountId, transactions });
export interface ImportTransactionsOpts {
defaultCleared?: boolean;
}
export function importTransactions(
accountId,
transactions,
opts: ImportTransactionsOpts = {
defaultCleared: true,
},
) {
return send('api/transactions-import', {
accountId,
transactions,
opts,
});
}
export function getTransactions(accountId, startDate, endDate) {

View File

@@ -1,6 +1,6 @@
{
"name": "@actual-app/api",
"version": "6.10.0",
"version": "25.1.0",
"license": "MIT",
"description": "An API for Actual",
"engines": {
@@ -23,7 +23,7 @@
},
"dependencies": {
"@actual-app/crdt": "workspace:^",
"better-sqlite3": "^9.6.0",
"better-sqlite3": "^11.7.0",
"compare-versions": "^6.1.0",
"node-fetch": "^3.3.2",
"uuid": "^9.0.1"

View File

@@ -5,13 +5,14 @@
// the latest Node 16.x release supports all of the features
"target": "ES2021",
"module": "CommonJS",
"moduleResolution": "node10",
"noEmit": false,
"declaration": true,
"outDir": "dist",
"declarationDir": "@types",
"paths": {
"loot-core/src/*": ["./loot-core/*"],
"loot-core/*": ["./@types/loot-core/*"],
"loot-core/*": ["./@types/loot-core/*"]
}
},
"include": ["."],

View File

@@ -5,6 +5,7 @@
// the latest Node 16.x release supports all of the features
"target": "ES2021",
"module": "CommonJS",
"moduleResolution": "node10",
"noEmit": false,
"declaration": true,
"strict": true,

View File

@@ -10,6 +10,7 @@ playwright-report
# production
build
build-electron
build-stats
stats.json
@@ -24,3 +25,6 @@ public/kcab
public/data
public/data-file-index.txt
public/*.wasm
# translations
locale/

View File

@@ -0,0 +1,48 @@
#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
// Local path to the cloned translations repository
const localRepoPath = './packages/desktop-client/locale';
// Compare JSON files and delete incomplete ones
const processTranslations = () => {
try {
const files = fs.readdirSync(localRepoPath);
const enJsonPath = path.join(localRepoPath, 'en.json');
if (!fs.existsSync(enJsonPath)) {
throw new Error('en.json not found in the repository.');
}
const enJson = JSON.parse(fs.readFileSync(enJsonPath, 'utf8'));
const enKeysCount = Object.keys(enJson).length;
console.log(`en.json has ${enKeysCount} keys.`);
files.forEach((file) => {
if (file === 'en.json' || path.extname(file) !== '.json') return;
const filePath = path.join(localRepoPath, file);
const jsonData = JSON.parse(fs.readFileSync(filePath, 'utf8'));
const fileKeysCount = Object.keys(jsonData).length;
// Calculate the percentage of keys present compared to en.json
const percentage = (fileKeysCount / enKeysCount) * 100;
console.log(`${file} has ${fileKeysCount} keys (${percentage.toFixed(2)}%).`);
if (percentage < 50) {
fs.unlinkSync(filePath);
console.log(`Deleted ${file} due to insufficient keys.`);
} else {
console.log(`Keeping ${file}.`);
}
});
console.log('Processing completed.');
} catch (error) {
console.error(`Error: ${error.message}`);
}
};
processTranslations();

View File

@@ -0,0 +1,65 @@
import { type Page } from '@playwright/test';
import { expect, test } from './fixtures';
import { ConfigurationPage } from './page-models/configuration-page';
import { MobileNavigation } from './page-models/mobile-navigation';
test.describe('Mobile Accounts', () => {
let page: Page;
let navigation: MobileNavigation;
let configurationPage: ConfigurationPage;
test.beforeEach(async ({ browser }) => {
page = await browser.newPage();
navigation = new MobileNavigation(page);
configurationPage = new ConfigurationPage(page);
await page.setViewportSize({
width: 350,
height: 600,
});
await page.goto('/');
await configurationPage.createTestFile();
});
test.afterEach(async () => {
await page.close();
});
test('opens the accounts page and asserts on balances', async () => {
const accountsPage = await navigation.goToAccountsPage();
await accountsPage.waitFor();
const account = await accountsPage.getNthAccount(1);
await expect(account.name).toHaveText('Ally Savings');
await expect(account.balance).toHaveText('7,653.00');
await expect(page).toMatchThemeScreenshots();
});
test('opens individual account page and checks that filtering is working', async () => {
const accountsPage = await navigation.goToAccountsPage();
await accountsPage.waitFor();
const accountPage = await accountsPage.openNthAccount(0);
await accountPage.waitFor();
await expect(accountPage.heading).toHaveText('Bank of America');
await expect(accountPage.transactionList).toBeVisible();
await expect(await accountPage.getBalance()).toBeGreaterThan(0);
await expect(accountPage.noTransactionsMessage).not.toBeVisible();
await expect(page).toMatchThemeScreenshots();
await accountPage.searchByText('nothing should be found');
await expect(accountPage.noTransactionsMessage).toBeVisible();
await expect(accountPage.transactions).toHaveCount(0);
await expect(page).toMatchThemeScreenshots();
await accountPage.clearSearch();
await expect(accountPage.transactions).not.toHaveCount(0);
await accountPage.searchByText('Kroger');
await expect(accountPage.transactions).not.toHaveCount(0);
await expect(page).toMatchThemeScreenshots();
});
});

View File

@@ -1,15 +1,19 @@
import { test, expect } from '@playwright/test';
import { join } from 'path';
import { type Page } from '@playwright/test';
import { expect, test } from './fixtures';
import { type AccountPage } from './page-models/account-page';
import { ConfigurationPage } from './page-models/configuration-page';
import { Navigation } from './page-models/navigation';
test.describe('Accounts', () => {
let page;
let navigation;
let configurationPage;
let accountPage;
let page: Page;
let navigation: Navigation;
let configurationPage: ConfigurationPage;
let accountPage: AccountPage;
test.beforeAll(async ({ browser }) => {
test.beforeEach(async ({ browser }) => {
page = await browser.newPage();
navigation = new Navigation(page);
configurationPage = new ConfigurationPage(page);
@@ -18,7 +22,7 @@ test.describe('Accounts', () => {
await configurationPage.createTestFile();
});
test.afterAll(async () => {
test.afterEach(async () => {
await page.close();
});
@@ -52,15 +56,17 @@ test.describe('Accounts', () => {
await expect(page).toMatchThemeScreenshots();
});
test.describe('Budgeted Accounts', () => {
test.describe('On Budget Accounts', () => {
// Reset filters
test.afterEach(async () => {
await accountPage.removeFilter(0);
});
test('creates a transfer from two existing transactions', async () => {
accountPage = await navigation.goToAccountPage('For budget');
await expect(accountPage.accountName).toHaveText('Budgeted Accounts');
accountPage = await navigation.goToAccountPage('On budget');
await accountPage.waitFor();
await expect(accountPage.accountName).toHaveText('On Budget Accounts');
await accountPage.filterByNote('Test Acc Transfer');
@@ -99,4 +105,61 @@ test.describe('Accounts', () => {
await expect(transaction.account).toHaveText('Ally Savings');
});
});
test.describe('Import Transactions', () => {
test.beforeEach(async () => {
accountPage = await navigation.createAccount({
name: 'CSV import',
offBudget: false,
balance: 0,
});
await accountPage.waitFor();
});
async function importCsv(screenshot = false) {
const fileChooserPromise = page.waitForEvent('filechooser');
await accountPage.page.getByRole('button', { name: 'Import' }).click();
const fileChooser = await fileChooserPromise;
await fileChooser.setFiles(join(__dirname, 'data/test.csv'));
if (screenshot) await expect(page).toMatchThemeScreenshots();
const importButton = accountPage.page.getByRole('button', {
name: /Import \d+ transactions/,
});
await importButton.click();
await expect(importButton).not.toBeVisible();
}
test('imports transactions from a CSV file', async () => {
await importCsv(true);
});
test('import csv file twice', async () => {
await importCsv(false);
const fileChooserPromise = page.waitForEvent('filechooser');
await accountPage.page.getByRole('button', { name: 'Import' }).click();
const fileChooser = await fileChooserPromise;
await fileChooser.setFiles(join(__dirname, 'data/test.csv'));
await expect(page).toMatchThemeScreenshots();
const importButton = accountPage.page.getByRole('button', {
name: /Import \d+ transactions/,
});
await expect(importButton).toBeDisabled();
await expect(await importButton.innerText()).toMatch(
/Import 0 transactions/,
);
await accountPage.page.getByRole('button', { name: 'Close' }).click();
await expect(importButton).not.toBeVisible();
});
});
});

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

View File

@@ -0,0 +1,404 @@
import { type Page } from '@playwright/test';
import { amountToCurrency, currencyToAmount } from 'loot-core/shared/util';
import * as monthUtils from 'loot-core/src/shared/months';
import { expect, test } from './fixtures';
import { ConfigurationPage } from './page-models/configuration-page';
import { type MobileBudgetPage } from './page-models/mobile-budget-page';
import { MobileNavigation } from './page-models/mobile-navigation';
const copyLastMonthBudget = async (
budgetPage: MobileBudgetPage,
categoryName: string,
) => {
const budgetMenuModal = await budgetPage.openBudgetMenu(categoryName);
await budgetMenuModal.copyLastMonthBudget();
await budgetMenuModal.close();
};
const setTo3MonthAverage = async (
budgetPage: MobileBudgetPage,
categoryName: string,
) => {
const budgetMenuModal = await budgetPage.openBudgetMenu(categoryName);
await budgetMenuModal.setTo3MonthAverage();
await budgetMenuModal.close();
};
const setTo6MonthAverage = async (
budgetPage: MobileBudgetPage,
categoryName: string,
) => {
const budgetMenuModal = await budgetPage.openBudgetMenu(categoryName);
await budgetMenuModal.setTo6MonthAverage();
await budgetMenuModal.close();
};
const setToYearlyAverage = async (
budgetPage: MobileBudgetPage,
categoryName: string,
) => {
const budgetMenuModal = await budgetPage.openBudgetMenu(categoryName);
await budgetMenuModal.setToYearlyAverage();
await budgetMenuModal.close();
};
async function setBudgetAverage(
budgetPage: MobileBudgetPage,
categoryName: string,
numberOfMonths: number,
setBudgetAverageFn: (
budgetPage: MobileBudgetPage,
categoryName: string,
numberOfMonths: number,
) => Promise<void>,
) {
let totalSpent = 0;
for (let i = 0; i < numberOfMonths; i++) {
await budgetPage.goToPreviousMonth();
const spentButton = await budgetPage.getButtonForSpent(categoryName);
const spent = await spentButton.textContent();
totalSpent += currencyToAmount(spent) ?? 0;
}
// Calculate average amount
const averageSpent = totalSpent / numberOfMonths;
// Go back to the current month
for (let i = 0; i < numberOfMonths; i++) {
await budgetPage.goToNextMonth();
}
await setBudgetAverageFn(budgetPage, categoryName, numberOfMonths);
return averageSpent;
}
const budgetTypes = ['Envelope', 'Tracking'] as const;
budgetTypes.forEach(budgetType => {
test.describe(`Mobile Budget [${budgetType}]`, () => {
let page: Page;
let navigation: MobileNavigation;
let configurationPage: ConfigurationPage;
let previousGlobalIsTesting: boolean;
test.beforeAll(() => {
// TODO: Hack, properly mock the currentMonth function
previousGlobalIsTesting = global.IS_TESTING;
global.IS_TESTING = true;
});
test.afterAll(() => {
// TODO: Hack, properly mock the currentMonth function
global.IS_TESTING = previousGlobalIsTesting;
});
test.beforeEach(async ({ browser }) => {
page = await browser.newPage();
navigation = new MobileNavigation(page);
configurationPage = new ConfigurationPage(page);
await page.setViewportSize({
width: 350,
height: 600,
});
await page.goto('/');
await configurationPage.createTestFile();
const settingsPage = await navigation.goToSettingsPage();
await settingsPage.useBudgetType(budgetType);
});
test.afterEach(async () => {
await page.close();
});
test('loads the budget page with budgeted amounts', async () => {
const budgetPage = await navigation.goToBudgetPage();
await expect(budgetPage.categoryNames).toHaveText([
'Food',
'Restaurants',
'Entertainment',
'Clothing',
'General',
'Gift',
'Medical',
'Savings',
'Cell',
'Internet',
'Mortgage',
'Water',
'Power',
'Starting Balances',
'Misc',
'Income',
]);
await expect(page).toMatchThemeScreenshots();
});
// Page Header Tests
test('checks that clicking the Actual logo in the page header opens the budget page menu', async () => {
const budgetPage = await navigation.goToBudgetPage();
await budgetPage.openBudgetPageMenu();
const budgetPageMenuModal = page.getByRole('dialog');
await expect(budgetPageMenuModal).toBeVisible();
await expect(page).toMatchThemeScreenshots();
});
test("checks that clicking the left arrow in the page header shows the previous month's budget", async () => {
const budgetPage = await navigation.goToBudgetPage();
const selectedMonth = await budgetPage.getSelectedMonth();
const displayMonth = monthUtils.format(
selectedMonth,
budgetPage.MONTH_HEADER_DATE_FORMAT,
);
await expect(budgetPage.heading).toHaveText(displayMonth);
const previousMonth = await budgetPage.goToPreviousMonth();
const previousDisplayMonth = monthUtils.format(
previousMonth,
budgetPage.MONTH_HEADER_DATE_FORMAT,
);
await expect(budgetPage.heading).toHaveText(previousDisplayMonth);
await expect(page).toMatchThemeScreenshots();
});
test('checks that clicking the month in the page header opens the month menu modal', async () => {
const budgetPage = await navigation.goToBudgetPage();
const selectedMonth = await budgetPage.getSelectedMonth();
await budgetPage.openMonthMenu();
const monthMenuModal = page.getByRole('dialog');
const monthMenuModalHeading = monthMenuModal.getByRole('heading');
const displayMonth = monthUtils.format(
selectedMonth,
budgetPage.MONTH_HEADER_DATE_FORMAT,
);
await expect(monthMenuModalHeading).toHaveText(displayMonth);
await expect(page).toMatchThemeScreenshots();
});
test("checks that clicking the right arrow in the page header shows the next month's budget", async () => {
const budgetPage = await navigation.goToBudgetPage();
const selectedMonth = await budgetPage.getSelectedMonth();
const displayMonth = monthUtils.format(
selectedMonth,
budgetPage.MONTH_HEADER_DATE_FORMAT,
);
await expect(budgetPage.heading).toHaveText(displayMonth);
const nextMonth = await budgetPage.goToNextMonth();
const nextDisplayMonth = monthUtils.format(
nextMonth,
budgetPage.MONTH_HEADER_DATE_FORMAT,
);
await expect(budgetPage.heading).toHaveText(nextDisplayMonth);
await expect(page).toMatchThemeScreenshots();
});
// Category / Category Group Menu Tests
test('checks that clicking the category group name opens the category group menu modal', async () => {
const budgetPage = await navigation.goToBudgetPage();
const categoryGroupName = await budgetPage.getCategoryGroupNameForRow(0);
await budgetPage.openCategoryGroupMenu(categoryGroupName);
const categoryMenuModalHeading = page
.getByRole('dialog')
.getByRole('heading');
await expect(categoryMenuModalHeading).toHaveText(categoryGroupName);
await expect(page).toMatchThemeScreenshots();
});
test('checks that clicking the category name opens the category menu modal', async () => {
const budgetPage = await navigation.goToBudgetPage();
const categoryName = await budgetPage.getCategoryNameForRow(0);
const categoryMenuModal = await budgetPage.openCategoryMenu(categoryName);
await expect(categoryMenuModal.heading).toHaveText(categoryName);
await expect(page).toMatchThemeScreenshots();
});
// Budgeted Cell Tests
test('checks that clicking the budgeted cell opens the budget menu modal', async () => {
const budgetPage = await navigation.goToBudgetPage();
const categoryName = await budgetPage.getCategoryNameForRow(0);
const budgetMenuModal = await budgetPage.openBudgetMenu(categoryName);
await expect(budgetMenuModal.heading).toHaveText(categoryName);
await expect(page).toMatchThemeScreenshots();
});
test('updates the budgeted amount', async () => {
const budgetPage = await navigation.goToBudgetPage();
const categoryName = await budgetPage.getCategoryNameForRow(0);
const budgetMenuModal = await budgetPage.openBudgetMenu(categoryName);
const budgetAmount = 123;
// Set to 123.00
await budgetMenuModal.setBudgetAmount(`${budgetAmount}00`);
const budgetedButton =
await budgetPage.getButtonForBudgeted(categoryName);
await expect(budgetedButton).toHaveText(amountToCurrency(budgetAmount));
await expect(page).toMatchThemeScreenshots();
});
test(`copies last month's budget`, async () => {
const budgetPage = await navigation.goToBudgetPage();
const categoryName = await budgetPage.getCategoryNameForRow(3);
const budgetedButton =
await budgetPage.getButtonForBudgeted(categoryName);
await budgetPage.goToPreviousMonth();
const lastMonthBudget = await budgetedButton.textContent();
await budgetPage.goToNextMonth();
await copyLastMonthBudget(budgetPage, categoryName);
await expect(budgetedButton).toHaveText(lastMonthBudget);
await expect(page).toMatchThemeScreenshots();
});
(
[
[3, setTo3MonthAverage],
[6, setTo6MonthAverage],
[12, setToYearlyAverage],
] as const
).forEach(([numberOfMonths, setBudgetAverageFn]) => {
test(`set budget to ${numberOfMonths} month average`, async () => {
const budgetPage = await navigation.goToBudgetPage();
const categoryName = await budgetPage.getCategoryNameForRow(3);
const averageSpent = await setBudgetAverage(
budgetPage,
categoryName,
numberOfMonths,
setBudgetAverageFn,
);
const budgetedButton =
await budgetPage.getButtonForBudgeted(categoryName);
await expect(budgetedButton).toHaveText(
amountToCurrency(Math.abs(averageSpent)),
);
await expect(page).toMatchThemeScreenshots();
});
});
test(`applies budget template`, async () => {
const settingsPage = await navigation.goToSettingsPage();
await settingsPage.enableExperimentalFeature('Goal templates');
const budgetPage = await navigation.goToBudgetPage();
const categoryName = await budgetPage.getCategoryNameForRow(1);
const amountToTemplate = 123;
const categoryMenuModal = await budgetPage.openCategoryMenu(categoryName);
const editNotesModal = await categoryMenuModal.editNotes();
const templateNotes = `#template ${amountToTemplate}`;
await editNotesModal.updateNotes(templateNotes);
await editNotesModal.close();
const budgetedButton =
await budgetPage.getButtonForBudgeted(categoryName);
const budgetMenuModal = await budgetPage.openBudgetMenu(categoryName);
await budgetMenuModal.applyBudgetTemplate();
await budgetMenuModal.close();
await expect(budgetedButton).toHaveText(
amountToCurrency(amountToTemplate),
);
const notification = page.getByRole('alert').first();
await expect(notification).toContainText(templateNotes);
await expect(page).toMatchThemeScreenshots();
});
// Spent Cell Tests
test('checks that clicking spent cell redirects to the category transactions page', async () => {
const budgetPage = await navigation.goToBudgetPage();
const categoryName = await budgetPage.getCategoryNameForRow(0);
const accountPage = await budgetPage.openSpentPage(categoryName);
await expect(accountPage.heading).toContainText(categoryName);
await expect(accountPage.transactionList).toBeVisible();
await expect(page).toMatchThemeScreenshots();
});
// Balance Cell Tests
test('checks that clicking the balance cell opens the balance menu modal', async () => {
const budgetPage = await navigation.goToBudgetPage();
const categoryName = await budgetPage.getCategoryNameForRow(0);
const balanceMenuModal = await budgetPage.openBalanceMenu(categoryName);
await expect(balanceMenuModal.heading).toHaveText(categoryName);
await expect(page).toMatchThemeScreenshots();
});
if (budgetType === 'Envelope') {
test('checks that clicking the To Budget/Overbudgeted amount opens the budget summary menu modal', async () => {
const budgetPage = await navigation.goToBudgetPage();
const envelopeBudgetSummaryModal =
await budgetPage.openEnvelopeBudgetSummary();
await expect(envelopeBudgetSummaryModal.heading).toHaveText(
'Budget Summary',
);
await expect(page).toMatchThemeScreenshots();
});
}
if (budgetType === 'Tracking') {
test('checks that clicking the Saved/Projected Savings/Overspent amount opens the budget summary menu modal', async () => {
const budgetPage = await navigation.goToBudgetPage();
const trackingBudgetSummaryModal =
await budgetPage.openTrackingBudgetSummary();
await expect(trackingBudgetSummaryModal.heading).toHaveText(
'Budget Summary',
);
await expect(page).toMatchThemeScreenshots();
});
}
});
});

Some files were not shown because too many files have changed in this diff Show More