Compare commits

...

328 Commits

Author SHA1 Message Date
github-actions[bot]
02c59d9a1c 🔖 (25.6.1) (#5099)
* 🔖 (25.6.1)

* Remove used release notes

---------

Co-authored-by: matt-fidd <81489167+matt-fidd@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-06-04 18:13:40 -04:00
Matt Fiddaman
f9f6917fcd update dockerfiles to use node 20 (#5091)
* update dockerfiles to use node 20

* note
2025-06-04 13:31:45 -04:00
Michael Clark
7441b5fa92 🐛 Fix server version on docker (#5093)
* fix server version on docker

* bit more safety

* fix lint

* release notes

* more error handling
2025-06-04 13:31:37 -04:00
Matt Fiddaman
bfb2d61286 fix crash when datepicker deselected with no date set (#5095)
* fix crash when datepicker not set

* note
2025-06-04 13:31:29 -04:00
github-actions[bot]
09b12b8218 🔖 (25.6.0) (#5083)
* 🔖 (25.6.0)

* Empty commit to bump CI

* Remove used release notes

* Empty commit to bump CI

---------

Co-authored-by: jfdoming <9922514+jfdoming@users.noreply.github.com>
Co-authored-by: Julian Dominguez-Schatz <julian.dominguezschatz@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-06-04 00:35:34 -04:00
Matiss Janis Aboltins
1c46655e30 🐛 (mobile) fix - show loading indicator if schedules not yet loaded (#5080) 2025-06-02 22:24:06 +01:00
dependabot[bot]
82329b7de2 Bump formidable from 2.1.2 to 2.1.5 (#5075)
* Bump formidable from 2.1.2 to 2.1.5

Bumps [formidable](https://github.com/node-formidable/formidable) from 2.1.2 to 2.1.5.
- [Release notes](https://github.com/node-formidable/formidable/releases)
- [Changelog](https://github.com/node-formidable/formidable/blob/master/CHANGELOG.md)
- [Commits](https://github.com/node-formidable/formidable/commits)

---
updated-dependencies:
- dependency-name: formidable
  dependency-version: 2.1.5
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* note

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2025-06-01 19:54:47 -04:00
Shimikito
a34c94d9fe Add ING PL (ING_PL_INGBPLPW) to banks with limited history (#5073)
* Update bank-factory.js 90 days bank history

Add ING PL (ING_PL_INGBPLPW) to banks with limited history

* Adding a bank with limited history - alphabetical fix

adding alphabetical sorting

* note

---------

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2025-06-01 19:49:08 -04:00
Normen
ae6eed65f7 Add 'GLS Gemeinschaftsbank' to banks with limited history (#5052)
* chore: add GLS_GEMEINSCHAFTSBANK_GENODEM1GLS to BANKS_WITH_LIMITED_HISTORY

* chore: add release note
2025-06-01 19:48:14 -04:00
Matiss Janis Aboltins
53398624f3 🔧 added needs-triage label to all new bug issues (#5070) 2025-05-30 21:57:16 +01:00
Valentin Lorenzen
47ee6eeb51 enable GoCardless account selection if supported by the target institution (#5031)
* Update gocardless-service.js

* Allow account selection during requisition based on institution support

* lint

* note

---------

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2025-05-27 16:32:25 -04:00
Michael Süssemilch
6e3a337945 fix: save category expansion state when value is 0 (#5069) 2025-05-27 12:33:37 -07:00
Shreyas
d2d8ce2353 Fix: restrict electron-embedded sync server to bind only to configured hostname for security (#5050)
* comment sync server

* Fix: ensure electron-embedded sync server binds to localhost to limit access

* lint and release notes

* rename

* remove hostname config and revert docker yaml
2025-05-27 16:57:06 +01:00
Johnn27
7d38f6934d 🐛 Fix goals tooltip obstructing cover spending context menu (#5051)
* 🐛 Fix goals tooltip obstructing cover spending context menu

* Update release note

* Fix lint format

---------

Co-authored-by: Johnn27 <>
2025-05-24 09:23:34 -07:00
Matt Fiddaman
d4b09ecb27 fix "delete x users" translation string (#5045) 2025-05-22 20:18:47 -04:00
Matt Fiddaman
a508a8705c ⬆️ upgrade express from 4.21.2 -> 5.1.0 (#5042)
* upgrade express from 4.21.2 -> 5.1.0

* fix tests

* note

* fix wildcard route

* fix access of req.body when undefined
2025-05-22 16:21:57 -04:00
Matt Fiddaman
f3b2507516 ⬆️ upgrade date-fns from v2.30.0 -> v4.1.0 (#5041) 2025-05-22 14:37:55 -04:00
Joel Jeremy Marquez
583ddab2ac Use @desktop-client alias in all of desktop-client package (#4960)
* Use @desktop-client alias in all of desktop-client package

* Run yarn lint:fix
2025-05-22 09:01:05 -07:00
Joel Jeremy Marquez
1876ba9fe7 Update @actual-app/components/input to be based on react-aria-components Input component (#4955)
* Update @actual-app/components/input to use react-aria-components Input component

* Cleanup

* Dummy commit

* Remove marginRight being magically added by Stack component

* Update 4955.md

* Update selection background color to match current color

* Update selection background color

* Dummy commit

* Fix ConfigServer styles

* Fix lint error

* re-add accidentally removed placeholder fix

* vrt

---------

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2025-05-21 22:48:05 -07:00
Matt Fiddaman
4c15647f7f ⬆️ upgrade low risk dependencies to their newest minor version (#5025)
* vitest

* types

* eslint

* better-sqlite3

* pluggy-sdk

* globals

* google-protobuf

* fast-check

* chokidar

* i18next

* openid-client

* playwright

* lru-cache

* memfs

* redacted font

* sass

* @vitejs/plugin-basic-ssl

* re-resizable

* rollup-plugin-visualizer

* note

* update vrt screenshots

* vrt
2025-05-21 16:56:07 -04:00
Joel Jeremy Marquez
174e13b3fe Fix category schedule indicators not showing up in budget page (#5036)
* Fix category schedule indicators not showing up in budget page

* Update release notes
2025-05-21 09:30:36 -07:00
Stein Petter Tokvam
2e9a752baa if BankSyncError is caused by rate limit. display that in toast (#5038)
* if BankSyncError is caused by rate limit. display that in toast

* ran prettier
2025-05-21 12:08:22 -04:00
Joel Jeremy Marquez
83f6706020 Add types to budget template files and some cleanup (#4986)
* Add types to budget template files and some cleanup

* Rename test context

* Rename test name

* Rename goal-template to match other files

* Update imports

* Fix lint and typecheck errors

* Release notes

* Update release notes

* Rename templateContext

* Revert rename

* Redo rename

* Fix renamed file

* Fix null error

* Missed to ignore hidden categories

* Revert to forEach

* Fix priorities

* Update 4986.md

* Revert deleted file

* Coderabbit feedback
2025-05-21 08:54:38 -07:00
Matt Fiddaman
4dba95842a ⬆️ upgrade react dependencies to their newest minor version (#5027) 2025-05-20 13:46:20 -04:00
Matt Fiddaman
af499c6503 ⬆️ upgrade babel/webpack dependencies to their newest minor version (#5028) 2025-05-20 13:45:45 -04:00
Julian Dominguez-Schatz
913a2c9a68 Automatically upload to the MS store on release (#5034)
* Update electron-master GitHub action to also submit to the MS store

* Add release notes
2025-05-19 23:23:46 -04:00
Matt Fiddaman
a4b0c4a0be ⬆️ upgrade electron dependencies to their newest minor version (#5029) 2025-05-19 17:34:12 -04:00
Jared Tweed
32a04cbbcb Changed 'close file' to say 'switch file' so it is more clear that the … (#4872)
* Changed 'close file' to say 'exit file' so it is more clear that the file is not being deleted (#4852)

Resolved this issue here:

https://github.com/actualbudget/actual/issues/4852#issue-3006813465

* chore(release): add release note for PR #4872

* Update BudgetName.tsx "Close file" -> "Switch file"

* Update 4872.md

* Changed 'Close budget' to 'Switch file' on mobile

* Update VRT

---------

Co-authored-by: youngcw <calebyoung94@gmail.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-19 10:29:47 -04:00
Matt Fiddaman
e950bbb1df resolve loot-core peer dependency warnings (#5024)
* fix loot-core peer dependency issues

* note

* update @swc/core
2025-05-18 19:37:22 -04:00
Matt Fiddaman
188cd21cf1 ⬆️ bump adm zip to 0.5.16 (#5019)
* bump adm-zip to 0.5.16

* note

* move to native yarn patch
2025-05-18 18:29:56 -04:00
Matt Fiddaman
f7a45d2081 ⬆️ bump dependency patch versions (#5015)
* bump dependency patch versions

* note

* remove unused ts-expect-error directives

* downgrade adm-zip again
2025-05-18 16:50:32 -04:00
Matt Fiddaman
99768a9aae ⬆️ upgrade yarn from v4.7.0 to v4.9.1 (#5014)
* upgrade yarn from v4.7.0 to v4.9.1

* note
2025-05-18 14:22:37 -04:00
Matt Fiddaman
7dbb3404f1 ⬆️ bump jq (#5018)
* bump jq

* note
2025-05-18 14:22:33 -04:00
Matt Fiddaman
ca09bbb858 remove dependency on ip (#5017)
* remove transitive dependency on ip

* note
2025-05-18 14:22:18 -04:00
Roger Goldfinger
0dca8498fe Set yarn engine version (#5011)
* Set yarn engine version

* release notes

* more precise version
2025-05-18 00:34:01 -04:00
Joel Jeremy Marquez
b5ece8e221 Make InitialFocus component generic (#5008)
* Make InitialFocus component generic

* Fix lint error
2025-05-16 15:02:06 -07:00
Samuel Barnes
351e252129 Allow-return-to-trigger-default-actions (#4912)
* button being focused

* working

* tests

* text selection test

* allow for ref injection

* updated some of the usages

* release notes

* rename of prop

* docs

* fixed release note

* remove unnecessary test setup

* updated from comments

* removed selecttext references

* fix type error

* updated children type

* removed comment
2025-05-16 12:28:31 -07:00
Joel Jeremy Marquez
720d0fda6d [Final PR] Move remaining loot-core/client files to desktop-client feature folders (#4830)
* Move loot-core/client/modals code over to desktop-client package

* Fix lint error

* Move loot-core/client/data-hooks over to desktop-client package

* Fix typecheck and lint errors

* Fix lint error

* [Final PR] Move remaining loot-core/client files to desktop-client feature folders

* Fix tests

* Clear server on each run

* Fix lint errors

* Fix imports

* Fix typecheck error

* Fix lint errors

* Fix typecheck error

* Fix test

* Fix tests - unsubscribe test pending fix

* Fix lint errors

* Fix typecheck error

* Fix lint error

* Fix tests

* Fix lint error
2025-05-16 10:42:06 -07:00
Joel Jeremy Marquez
fdf213865d Move loot-core/client/data-hooks over to desktop-client package (#4828)
* Move loot-core/client/modals code over to desktop-client package

* Fix lint error

* Move loot-core/client/data-hooks over to desktop-client package

* Fix lint errors

* Fix typecheck error

* Fix typecheck and lint errors

* Fix typecheck error

* Fix lint error
2025-05-16 08:53:59 -07:00
Alec Bakholdin
b2ffa1d846 [WIP] Qif empty lines (#5002)
* fixed qif failing with empty lines

* release notes

---------

Co-authored-by: Alec Bakholdin <alecbakholdin@Alecs-Mac.local>
2025-05-16 11:45:46 -04:00
Alec Bakholdin
21fb090ddf ⚙️ Moving TransactionsTable and TransactionList over to Typescript (#4930)
* moved over some util functions

* moved over TransactionHeader

* Added the bulk of Transaction typing data

* moved PayeeCell into its own file

* moved StatusCell over

* added NotesCell file

* Moved over NewTransaction

* converted TransactionsTable

* Converted TransactionList to use new typed TransactionsTable

* Converted consumers of TransactionList to use TransactionList

* removed old TransactionsTable

* release notes

* fixed bug vrt found

* fixed one todo

* attempting to debug whatever is going on

* moved TransactionsTable tests up a directory and that fixes it for some reason

* removed type cast

* re-instated onScheduleAction types

* re-added old TransactionsTable.jsx file

* consolidated changes into just TransactionsTable

* deleted split files and finished moving over TransactionList

* typecheck

* typecheck

* yarn lint

* changed type casting to make it more specific

* changed warn to error

* added some todos to clean up type assumptions later

* yarn lint

---------

Co-authored-by: Alec Bakholdin <alecbakholdin@mac.myfiosgateway.com>
Co-authored-by: Alec Bakholdin <alecbakholdin@Alecs-Mac.local>
2025-05-16 06:15:07 -04:00
Joel Jeremy Marquez
c389c6c637 Move loot-core/client/store and loot-core/client/redux code over to desktop-client package (#4827)
* Move loot-core/client/modals code over to desktop-client package

* Fix lint error

* Move loot-core/client/store and loot-core/client/redux to desktop-client package

* Separate redux store into it's own file

* Import types from redux/store instead of redux
2025-05-15 13:09:10 -07:00
Joel Jeremy Marquez
7bb6aff756 Move loot-core/client/users code over to desktop-client package (#4823)
* Move loot-core/client/modals code over to desktop-client package

* Fix lint error

* Move loot-core/client/users code over to desktop-client package

* Fix lint errors
2025-05-15 12:45:20 -07:00
Joel Jeremy Marquez
3f4ddfdfe0 [Mobile] Fix category transactions screen not showing child transactions (#4998) 2025-05-15 11:38:50 -07:00
Joel Jeremy Marquez
7dd98c4f86 Add runningBalances to usePreviewTransactions and an option to set the starting balance to start running balance calculation from (#4994)
* Add runningBalances to usePreviewTransactions and an option to set the starting balance to start running balance calculation from

* Add filter to usePreviewTransactions and set startingBalance to account and category preview transaction hooks
2025-05-15 11:31:38 -07:00
Michael Clark
f3fc4b8d22 Remove duplicate import (#4997) 2025-05-15 19:22:31 +01:00
Joel Jeremy Marquez
644e8df3e1 Move loot-core/client/queries code over to desktop-client package (#4822)
* Move loot-core/client/modals code over to desktop-client package

* Fix lint error

* Move loot-core/client/queries code over to desktop-client package
2025-05-15 11:10:19 -07:00
Joel Jeremy Marquez
9dfbefa1d2 Fix prefsSlice import (#4995) 2025-05-15 11:09:54 -07:00
Michael Clark
516977f666 Fix pipeline build (#4996) 2025-05-15 19:06:59 +01:00
Michael Clark
70362f6801 :electron: Server config ui (#4870)
* server config ui 

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-15 18:52:46 +01:00
Eetu Mäenpää
d225e5d5e1 Update react-spring to v10.0.0 (#4992)
* feat: update react-spring to v10.0.0

* docs: add release notes
2025-05-15 11:34:40 -04:00
Joel Jeremy Marquez
ae00fa2841 Move loot-core/client/prefs code over to desktop-client package (#4821)
* Move loot-core/client/modals code over to desktop-client package

* Fix lint error

* Move loot-core/client/prefs code over to desktop-client package

* Dummy commit
2025-05-14 22:01:02 -07:00
musicaldesigner
b475951075 Update bank-factory.js, add DNB to list of banks with limited history (#4893) 2025-05-14 19:09:06 -07:00
Joel Jeremy Marquez
d9dd96d0de Add option to calculate running balances in useTransactions hook (#4987)
* Add option to calculate running balances in useTransactions hook

* Fix typecheck error

* Fix lint error

* Cleanup

* retrigger checks
2025-05-14 15:27:38 -07:00
Joel Jeremy Marquez
45ff94590b Move loot-core/client/notifications code over to desktop-client package (#4820)
* Move loot-core/client/modals code over to desktop-client package

* Fix lint error

* Move loot-core/client/notifications code over to desktop-client package
2025-05-14 13:25:09 -07:00
Joel Jeremy Marquez
466875a8dd Move loot-core/client/modals code over to desktop-client package (#4819)
* Move loot-core/client/modals code over to desktop-client package

* Fix lint error

* Fix imports

* Fix lint error

* Fix lint error
2025-05-14 12:09:25 -07:00
Alec Bakholdin
0431039eb6 Inconsistent date update mobile new transaction (#4910)
* converted onUpdate to onChange for better mobile ux

* release notes

---------

Co-authored-by: Alec Bakholdin <alecbakholdin@Alecs-Mac.local>
2025-05-13 10:33:05 -04:00
Alec Bakholdin
2215c131a5 Fix new transactions account notes not clearing (#4914)
* added history entry if history entry is null while entering Add Transaction widget

* release notes

* Update TransactionEdit.jsx

* Update TransactionEdit.jsx

* Update TransactionEdit.jsx

---------

Co-authored-by: Alec Bakholdin <alecbakholdin@Alecs-Mac.local>
2025-05-13 10:32:54 -04:00
Matt Fiddaman
4de5fb34b9 increase OpenID timeout (#4980)
* increase openid request timeout

* note
2025-05-13 00:20:59 -04:00
OhNoBigO
4f6b97ae4a [Mobile] 🐛 Fix viewing pie/donut charts on mobile (#4935)
* Fix viewing pie/donut charts on mobile

* Add release note

* Fix onMouseEnter firing on ios devices

* Change isTouchDevice to canDeviceHover

---------

Co-authored-by: Oli-vers <180103373+Oli-vers@users.noreply.github.com>
2025-05-12 13:57:52 -04:00
Matt Fiddaman
6d921a48b6 change minimum version of Node.js to version 20 (#4978)
* update workflows

* update supported engines in package.json

* .nvmrc

* base yarn cache on node version being used rather than .nvmrc

* note
2025-05-12 13:49:09 -04:00
Michael Clark
2d0716233f Replacing Actuator with our own implementation (#4897)
* actuator replacement experiment

* replacing actuator

* release notes

* description added

* version typo

* Update upcoming-release-notes/4897.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-05-12 18:40:15 +01:00
Joel Jeremy Marquez
6f3bfd2ad4 Move loot-core/client/budgets code over to desktop-client package (#4818)
* Move loot-core/client/budgets code over to desktop-client package

* Fix lint error

* Fix lint error
2025-05-12 09:46:33 -07:00
Joel Jeremy Marquez
10a143a3ae Add upcoming/missed/due schedules indicator on budget table (based on category schedule templates) (#4815)
* Add upcoming/missed/due schedules indicator on budget table (based on category schedule templates)

* Rename hook

* Fix typecheck error

* Update packages/desktop-client/src/components/budget/SidebarCategory.tsx

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

* Use category goal_def instead of reparsing notes

* Fix lint and typecheck error

* Fix lint error

* Update type

* Handle doal_def parse errors

* Only show schedule status on month of the schedule's next date

* Mobile - only show category schedule status on month's schedule

* Update tooltip wording

* Disable if goal templates feature is disabled

* Move schedule indicator to spent column

* Update colors

* Mobile - move indicator to spent

* Cleanup

* Cleanup

* Support multiple schedule templates

* Clearer error message

* Memo useCategoryScheduleGoalTemplates

* Fix lint and typecheck errors

* Category preview transactions for mobile

* Fix lint errors

* Fix calls to .some()

* Show most urgent schedules first

* Fix typecheck error

* Fix lint error

* Align all schedule indicators

* List all schedules in schedule indicator tooltip

* Fix typecheck error

* Fix lint errors

* Update SpentCell to show schedule indicator

* Fix lint error

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

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

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2025-05-12 09:46:20 -07:00
Joel Jeremy Marquez
82c469648e Split transactions repair tool to remove categories from parent transactions + prevent adding/updating parent transactions with categories (#4889)
* Add a functionality to split transactions repair tool to remove categories from parent transactions and prevent adding/update parent transactions with categories

* Fix lint error

* Remove console.log
2025-05-12 09:17:22 -07:00
Joel Jeremy Marquez
ab3088b6fa Update budgetType preference in DB from rollover/report to be envelope/tracking (#4879)
* Update budgetType preference from rollover/report to be envelope/tracking

* Release notes

* Fix default budgetType in BalanceCell
2025-05-12 08:27:50 -07:00
Joel Jeremy Marquez
582bb59097 Move loot-core/client/app code over to desktop-client package (#4817)
* Move loot-core/client/app code over to desktop-client package

* Fix lint

* Fix lint error
2025-05-12 08:21:06 -07:00
youngcw
01c68bcfc7 Tests for goal templates (#4882)
* start

* make week tests make sense

* fix

* copy

* average

* no call checks

* add rest.  Still need to vet runSpend, and runBy

* fix average

* tweak spend

* updates

* cleanup

* note

* add more up to tests

* previous percentage

* hitting limit tests

* remainder

* fixes

* more fixes

* fixes, and fix remainder return value

* fix amounts in limit tests

* e2e for a category

* skip checking schedules if not needed

* lost changes

* fix null

* add goal tests

* final fix?

* lint

* lint option 2
2025-05-12 06:25:01 -07:00
Johnn27
dd749483f5 [Mobile] 🐛 Fix widget order (#4949)
* Fix Dashboard Widgets Not Ordered on Mobile

* Update Release Notes

* Update formatting and comment

---------

Co-authored-by: Johnn27 <>
2025-05-12 08:56:35 -04:00
sergio10
11b86fc33c Add Abanca to the list of banks with limited history (#4970)
* Add Abanca to the list of banks with limited history

* add release notes

* change category release notes
2025-05-12 08:42:50 -04:00
Guillaume Taquet Gasperini
6e5f4bfb18 Add BoursoBank GoCardless Integration (#4958)
* Add BoursoBank GoCardless Integration

The default normalization was creating new payees for each
transaction per day, as there was no specific integration
for this bank.

e.g. `Carte dd/mm/yy Payee Name Cb*1234` was taken as payee
name.

There doesn't seem to be an easy catch-all syntax for
the BoursoBank transactions, but I have put all the
ones I could find from my transactions.

* Fix comment typo

---------

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2025-05-12 08:42:30 -04:00
Vincent Giorgi
d87b78c02a invert most of seb kort credit card transactions (#4869)
* invert most of seb kort credit card transactions

* add release-notes

* revert package.json

---------

Co-authored-by: Vincent Giorgi <8283278+vincegio@users.noreply.github.com>
2025-05-12 07:55:19 -04:00
Alec Bakholdin
3cab9a374b 🐛 fixed scrollbar being impossible to grab (#4923)
* adjusted scrollbar width

* added icons to release note generator

* release notes
2025-05-11 13:23:29 -04:00
Julian Dominguez-Schatz
96949b701e Stabilize electron build directory paths (#4864)
* Stabilize electron build directory paths

* Add release notes
2025-05-11 07:39:05 -04:00
Michael Clark
0f55c67d3e 🐛 Fix sync server build not copying sql files over (#4968)
* fix sync server build not copying sql files over

* release notes

* copy-static-assets script
2025-05-10 13:17:34 +01:00
Michael Clark
b0adcb1333 🐛 Sync server - resolving the user-files and server-files to an absolute dir (#4954)
* resolving the user-files and server-files to an absolute dir

* safety

* release notes
2025-05-09 19:39:57 +01:00
Alec Bakholdin
04da20e34c Fix title first null undefined (#4908)
* added more null checks to titleFirst

* release notes

* fixed lint and typecheck

* Update packages/loot-core/src/shared/util.ts

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

* removed ts-ignore after changing titleFirst

---------

Co-authored-by: Alec Bakholdin <alecbakholdin@Alecs-Mac.local>
Co-authored-by: Julian Dominguez-Schatz <julian.dominguezschatz@gmail.com>
Co-authored-by: Alec Bakholdin <alecbakholdin@mac.myfiosgateway.com>
2025-05-08 12:11:27 -04:00
Alec Bakholdin
48715bf6b4 Ofx parsing dates incorrectly (#4911)
* added trim to ofx parsing

* release notes

* removed console.log
2025-05-08 12:11:19 -04:00
Alec Bakholdin
6c278a72a5 Fixed graphical bug in report (#4917)
Co-authored-by: Alec Bakholdin <alecbakholdin@Alecs-Mac.local>
2025-05-08 12:11:11 -04:00
Alec Bakholdin
17173d3ff0 New transaction text deselection on alt tab (#4921)
* changed default amount to come from amountToCurrency to handle localized values and maintain focus

* release notes

---------

Co-authored-by: Alec Bakholdin <alecbakholdin@Alecs-Mac.local>
2025-05-08 12:11:02 -04:00
Alec Bakholdin
64caf0f28b Last reconciled date not visible mobile (#4922)
* added last reconciled note to the reconciliation popup

* release notes

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

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

* bumped up padding

* yarn lint

---------

Co-authored-by: Julian Dominguez-Schatz <julian.dominguezschatz@gmail.com>
Co-authored-by: Alec Bakholdin <alecbakholdin@mac.myfiosgateway.com>
2025-05-08 11:42:27 -04:00
Joel Jeremy Marquez
0a8f820652 Use cx in Button className merging (#4956) 2025-05-07 08:12:57 -07:00
Michael Clark
e30735104e 🐛 Fix cli package json after ts build change (#4957)
* fix cli package json after ts build change

* release ntoes
2025-05-07 09:06:09 +01:00
Julian Dominguez-Schatz
8878f36eaf Add basic modal for budget automations (#4810)
* Add basic modal for budget automations

* Add release notes

* Exclude TODOs from this PR for now

* Fix some rebase errors

* CodeRabbit feedback

* PR feedback: reduce nesting in automation editor

* PR feedback: reduce nesting in automation read-only state

* PR feedback: make editors feel more like part of the read-only entry
2025-05-06 20:51:08 -04:00
Julian Dominguez-Schatz
9531a57f1c Deduplicate vite versions (#4943)
* Deduplicate vite versions

* Add release notes

* Ensure plugins are compatible with the latest vite

* yarn dedupe
2025-05-06 18:10:51 -04:00
Michael Clark
9d99fe2838 🐛 Fixing docker edge (#4953)
* instead of referencing the build dir directly reference using relative path

* release notes
2025-05-06 22:56:32 +01:00
Joel Jeremy Marquez
3a18718fa0 [Mobile] Show transactions upon clicking income categories (#4940)
* [Mobile] Show transactions upon clicking income categories

* Fix lint error
2025-05-06 14:09:40 -07:00
Roger Goldfinger
090345bd95 Enable Typescript in sync-server (#4887)
* attempt at running with typescript

* release notes

* working jest tests for TS files

* working docker image build

* remaining docker images

* cleanup

* ensure vitest is working

* get tests passing in ci

* less strict

* update release notes

* use tsc compiled assets in the published package

* scripts

* update yarn.lock

* Use build path for electron app

* PR feedback: move sync-server build out of bin/build-browser

* PR feedback: undo moduleResolution change

* extend main tsconfig and fix types

* PR feedback on scripts and when the sync-server build runs

* fix lint (unrelated change)

---------

Co-authored-by: alecbakholdin <alecbakholdin@gmail.com>
2025-05-05 23:45:49 -04:00
dependabot[bot]
4a7439da5e Bump vite from 5.4.18 to 5.4.19 (#4904)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.18 to 5.4.19.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.19/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.19/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-05 20:29:16 -04:00
Joel Jeremy Marquez
a3c9525c83 Fix lint error accidentally pushed to master (#4942) 2025-05-05 14:28:30 -07:00
Alvaro Crespo
0d60da5ba9 Payees functional tests (#4766)
* add PayeesPage model for searching payees in e2e tests

* add navigation method to go to PayeesPage in e2e tests

* add e2e tests for Payees page

* update release notes

* Run prettier to fix lint

* clean imports

* fix imports

* Add snapshots for visual tests

* Remove unused import in payees test

* Update VRT

* Update 4766.md

Dummy commit

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Joel Jeremy Marquez <joeljeremy.marquez@gmail.com>
2025-05-05 09:26:17 -07:00
Julian Dominguez-Schatz
388a9f6c86 Automatically generate GitHub release text (#4932)
* Automatically generate GitHub release text

* [TEMPORARY] Revert Electron signing changes to make this change testable

* Revert "[TEMPORARY] Revert Electron signing changes to make this change testable"

This reverts commit eeb5680b1a.

* Add release notes
2025-05-05 08:45:09 -04:00
Julian Dominguez-Schatz
cabb7149f0 Use the latest release tag instead of the latest tag for version checks (#4933)
* Use the latest release tag instead of the latest tag for version checks

* Add release notes
2025-05-05 08:44:31 -04:00
lelemm
3c47c1ca27 Promoting OpenId as default feature (#4903)
* Removed OpenId feature flag

* linter

* md

* wrong author
2025-05-05 08:21:47 -03:00
Joel Jeremy Marquez
cc204ba70e Use @desktop-client/hooks alias for cleaner imports (#4789)
* Use @hooks path alias for cleaner imports

* Fix line errors

* Update to @desktop-client
2025-05-04 22:30:10 -07:00
Joel Jeremy Marquez
7074b4dd82 Rename AQL module's runQuery function to aqlQuery to disambiguate with DB module's runQuery function + AQL types (#4787)
* Rename AQL module's runQuery function to aqlQuery to disambiguate with DB module runQuery function

* Release notes

* Update SqlPieces

* Fix lint

* Update SqlPieces.from

* Add types

* Type result as any for now

* Fix lint

* Add types

* Fix typo

* PR feedback

* Update comment

* Fix lint error

* Fix import
2025-05-04 22:29:23 -07:00
github-actions[bot]
c23cbb4b0e 🔖 (25.5.0) (#4916)
* 🔖 (25.5.0)

* Bump CI

* Remove used release notes

* Bump CI

---------

Co-authored-by: jfdoming <9922514+jfdoming@users.noreply.github.com>
Co-authored-by: Julian Dominguez-Schatz <julian.dominguezschatz@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-05-03 13:44:50 -04:00
lelemm
8da1c59362 🐛 Bug FIX: OpenID first login is not working properly when using config.json or ENV VARS (#4902)
* First login was not working properly

* md
2025-05-01 10:26:03 -03:00
youngcw
916a27a89a 🐛 fix schedule preview running balance of split schedules (#4881)
* fix blance math

* clean

* note

* lint

* typecheck
2025-04-25 13:11:49 -07:00
Joel Jeremy Marquez
97b99d1f16 [Mobile] Fix hidden category groups not being hidden (#4880)
* Fix hidden category groups not being hidden

* Update release note
2025-04-23 12:24:52 -07:00
Joel Jeremy Marquez
cf114ef69e [Mobile] Fix uncategorized banner + overspent banner showing previously active month's overspent categories (#4875)
* [Mobile] Fix overspent banner showing previously active month's overspent categories

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

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

* Fix typecheck error

* Enable uncategorized banner and overspent banner for tracking budgets

* Fix lint error

* Update VRT

* Dummy commit

---------

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-04-23 08:15:18 -07:00
Joel Jeremy Marquez
7064106748 Move loot-core/client codes over to desktop-client package (#4816) 2025-04-22 08:21:01 -07:00
Michael Süssemilch
b92a1cacf7 fix: commerzbank escape payee (#4845) 2025-04-21 13:28:27 +01:00
Michael Clark
f5c1879de1 :electron: Fix some menu links (#4860)
* fix some menu references not working

* release notes
2025-04-21 09:38:12 +01:00
Julian Dominguez-Schatz
92f444f548 Move some .d.ts files to .ts (#4862)
* Move loot-core types to `.ts`

* Add release notes

* PR feedback
2025-04-20 22:40:53 -04:00
Julian Dominguez-Schatz
94600731d9 Move loot-core to vitest (#4859)
* Update build + dependencies to work with vitest

* Update tests to use vitest

* Update snapshots to vitest format

* Update sql.js loading in tests to work with vitest

* Update crdt package loading to work with vitest

* Add release notes
2025-04-20 15:52:59 -04:00
Julian Dominguez-Schatz
5d59ecd72c Move remaining non-loot-core packages to latest vitest (#4856)
* Move remaining non-loot-core packages to vitest

* Add release notes
2025-04-20 15:17:07 -04:00
Michael Clark
54d9f0ff41 :electron: Fix Load Backup backup modal (#4853)
* fix backup screen

* release notes
2025-04-20 17:15:24 +01:00
Vincent Giorgi
eebdbdf34e invert Strawberry credit card transaction amounts (#4857)
* add Strawberry (nordic choice club) credit cards to SEB balance inversion

* add release-notes

---------

Co-authored-by: Vincent Giorgi <8283278+vincegio@users.noreply.github.com>
2025-04-20 11:54:13 -04:00
Julian Dominguez-Schatz
bddc372650 Move crdt to vitest (#4851)
* Move crdt to vitest

* Add release notes
2025-04-20 09:00:39 -04:00
Julian Dominguez-Schatz
d027adc734 Move sync-server to vitest (#4840)
* Move sync-server to vitest

* Add release notes

* Add comment

* Remove extraneous console.log

* Empty commit to bump CI
2025-04-19 23:43:25 -04:00
Michael Clark
e67c064d1f :electron: Prep for configure server page (#4847)
* prep work for configure server page

* release notes

* better log message
2025-04-19 18:34:13 +01:00
Roger Goldfinger
2f1ccad25a Restore"Reload on all redirects to handle Cloudflare Access auth expiration" (#4844) 2025-04-18 23:11:11 -04:00
Bhautik Savaliya
a2b9153d02 Fixes #4705: Scheduled transaction date when posting early. (#4719) 2025-04-18 10:33:39 -07:00
Julian Dominguez-Schatz
f1594e5bca Fix bug in ofx2json logic (#4838)
* Fix double unescape bug in ofx2json

* Add test

* Add release notes

* Update snapshot
2025-04-18 13:29:38 -04:00
dependabot[bot]
fed426d704 Bump nanoid from 3.3.7 to 3.3.11 (#4834)
* Bump nanoid from 3.3.7 to 3.3.11

Bumps [nanoid](https://github.com/ai/nanoid) from 3.3.7 to 3.3.11.
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.3.7...3.3.11)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-version: 3.3.11
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* Add release notes

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Julian Dominguez-Schatz <julian.dominguezschatz@gmail.com>
2025-04-18 13:25:24 -04:00
dependabot[bot]
aeb26b75af Bump vite from 5.4.8 to 5.4.18 (#4833)
* Bump vite from 5.4.8 to 5.4.18

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.8 to 5.4.18.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.18/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.18/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>

* Add release notes

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Julian Dominguez-Schatz <julian.dominguezschatz@gmail.com>
2025-04-18 13:23:50 -04:00
Michael Süssemilch
4b58335780 feat: expandable budget categories (#4807) 2025-04-18 05:35:08 -04:00
Michael Clark
153eaeecc5 🐛 CLI: Fix ACTUAL_DATA_DIR env variable not respected in some cases (#4825)
* fix issue with default data directory not respecting env variables
2025-04-18 10:11:34 +01:00
Margarida Reis
e28db52c70 fix: persist filters in custom report on interval or date range change (#4724)
ensure that modified filters are reapplied to the Custom Report when changing its interval or date range, rather than reverting to the last saved state, which could overwrite unsaved changes to the filters or their conditional operand
2025-04-17 22:13:04 -04:00
Grant
83f7a79c76 4571: Fix UI lockout when using In/Out mode with existing split columns (#4715)
* Fix catch 22 problem when using In/Out with split columns already enabled
- Also changed UI and transaction amount parsing behavior to accept all options combined
- Repositioned some amount options
- Adjusted the labels of a few options

* Fix amount options triggering state resets

* Update VRT

* Revert "Update VRT"

This reverts commit 0a4b70afad.

* 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-04-17 22:03:09 -04:00
Alec Bakholdin
7e3ebb7e5f Global prefs undefined change (#4837)
* updated saveGlobalPrefs to handle falsy values better

* updated link which was no longer valid

* release notes

* Removed errant log

---------

Co-authored-by: Alec Bakholdin <alecbakholdin@Alecs-Mac.local>
2025-04-17 12:38:03 -07:00
lelemm
a8d41e88a5 🐛 Fix for returnUrl in OpenID auth (#4836)
* Fix for `returnUrl` in OpenID auth

* md

* change md number
2025-04-17 13:03:21 -03:00
Roger Goldfinger
62ab6a12e8 Revert "Reload on all redirects to handle Cloudflare Access auth expiration (…" (#4835) 2025-04-17 11:02:21 -04:00
Julian Dominguez-Schatz
d91fd2fb0e Slow improvements to Account.tsx (1/many) (#4824)
* Move Account EmptyMessage to a separate file

* Move a tiny bit of state out of Account.tsx

* Add release notes
2025-04-17 09:13:27 -04:00
Alec Bakholdin
4e9d51be1f [Feature] Manually merge transactions (#4739)
* added transactions-merge action

* mergeTransactions now returns kept id

* merge option only shows up when amount matches

* merge now handles more errors and merges from the dropped transaction if values are present

* modified merge logic slightly to avoid duplicating imported_id

* added reconciled and cleared to merge logic

* modified canMerge logic in SelectedTransactionsButton

* made merge undoable

* added onMerge to mobile menu

* release notes

* modified testing suite slightly

* added logic for detecting bank sync vs file import

* typecheck problem

* linting errors

* attempt to clean up tests better

---------

Co-authored-by: Alec Bakholdin <abakho@icims.com>
2025-04-16 20:11:36 -07:00
dependabot[bot]
1bc87fb35a Bump http-proxy-middleware from 3.0.3 to 3.0.5 (#4832)
* Bump http-proxy-middleware from 3.0.3 to 3.0.5

Bumps [http-proxy-middleware](https://github.com/chimurai/http-proxy-middleware) from 3.0.3 to 3.0.5.
- [Release notes](https://github.com/chimurai/http-proxy-middleware/releases)
- [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/master/CHANGELOG.md)
- [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v3.0.3...v3.0.5)

---
updated-dependencies:
- dependency-name: http-proxy-middleware
  dependency-version: 3.0.5
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>

* Add release notes

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Julian Dominguez-Schatz <julian.dominguezschatz@gmail.com>
2025-04-16 23:00:12 -04:00
Roger Goldfinger
2f5464c735 Reload on all redirects to handle Cloudflare Access auth expiration (#4706)
* Reload on all redirects

* Update index.ts

* Create release notes

* Update index.ts

* Update index.ts

* Update 4706.md

---------

Co-authored-by: Roger Goldfinger <roger@remind101.com>
Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2025-04-16 20:26:29 -04:00
Matt Fiddaman
c85769eb82 add support for longer running SimpleFIN transaction requests (#4780)
* SimpleFIN follow redirects

* release note
2025-04-16 19:17:27 -04:00
lelemm
a657021303 Do not count hidden categories in tracking budgets + cleanup table math (#4567)
* Alternative solution

* tests

* a bit better, but now categories can be weird

* working, I think

* almost there

* I was making it harder than it needed to be

* Update VRT

* note

* note

* Separating logic from envelope and report to keep envelope as it was

* Update VRT

* Removed checks for budgetType inside `envelope.ts` and `report.ts`

* changed code position in file

* linter

* handle initially hidden

* Fix for when tracking but is enabled

* total up everything

* Add tests for handling hidden categories and groups in budget totals

---------

Co-authored-by: youngcw <calebyoung94@gmail.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Kevin Gatera <kevin@deployitwith.me>
2025-04-16 18:43:21 -03:00
Julian Dominguez-Schatz
523a62c8a0 Fix crash on transactions table with new transaction popup open (#4812)
* Fix crash on transactions table with new transaction popup open

* Add release notes
2025-04-15 18:27:37 -04:00
Joel Jeremy Marquez
925efc4cb6 [Mobile] Drag and drop expense category groups to re-order (#4599)
* Update to GridList

* VRT - minimal diff between 2 rows

* Implement a hidden drag button

* Revert VRT

* VRT

* [Mobile] Drag and drop income categories to re-order

* Update drag preview

* Release notes

* Fix drag preview

* Fix typecheck errors

* Fix group header margins

* Coderabbit suggestion

* Fix group

* Yarn lint fix
2025-04-15 14:13:44 -07:00
Michael Clark
31fe766a2b 🆕 Sync server as npm package (#4798)
* sync server as npm package

* yarn lock

* workflow

* fix yml

* fix script

* named job better

* imagine trusting an ai

* pack and publish separately

* v4 instead of v3 upload

* dependencies

* identifying the right package for uplaod

* updating references

* what

* i see

* here comes the glory

* aaaand here it comes

* perms

* hmm

* try changing scope

* owner is invalid for git so have to go to npm instead

* better names on workflow

* package the api too

* updates

* rename to play better with gitignore

* yarn

* better

* dont ignore me

* yarn

* readme

* readme

* release note

* typo

* updating to read package.json from fs rather than import to support more node versions

* more ai autocomplete more problems
2025-04-15 20:51:17 +01:00
Joel Jeremy Marquez
b9e7d7e9c2 [Mobile] Drag and drop expense categories to re-order (#4484)
* ExpenseGroup component

* Release notes

* Fix imports

* Fix typecheck errors

* Fix drag and drop indicator

* Fix drop indicator

* Update imports

* Cleanup

* Update to GridList

* Cleanup

* VRT - minimal diff between 2 rows

* Implement a hidden drag button

* Fix budgeted/spent toggle

* Update VRT

* Dummy commit

* Revert VRT

* VRT

* Update dependency props

* Update VRT

* CodeRabbit suggestions

* Fix rebase error

* Update VRT

* Dummy commit to re-run vrt

* Fix typecheck errors

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-14 13:55:17 -07:00
Josh Woodward
04aa086c9e Unlink account via bank sync page (#4714)
* adding unlink and account name to modal

* fixing dispatch and some style updates

* release notes

* catching a few missed "bank-sync" phrases

* linting

* Addressing comments

* Addressing comments

* Linting

---------

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2025-04-13 09:41:25 -04:00
Matiss Janis Aboltins
cc02970a16 ⬆️ upgrade to React v19 (#4700) 2025-04-10 08:49:38 +01:00
Matiss Janis Aboltins
9489e2f3b4 🔧 added eslint auto-fix to the lint-staged step (#4757)
small DX improvement
2025-04-10 08:19:44 +01:00
Ian
608b4be765 Add option to control note imports during transaction import (#4593)
* Make note imports optional. Adds tests too

* add release notes

* Update VRT

* type getTransactions to resolve TS error

* remove CSV note import - already supported

* type and lint to make coderabbit happy

* conditional rendering of importNotes

* Update VRT

* update snapshot to account for serialization change

* use <Trans>

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

* Fix closing Trans

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

* address missing import

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: youngcw <calebyoung94@gmail.com>
Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2025-04-09 15:29:34 -07:00
Joel Jeremy Marquez
01f45d5072 Extract auth related server handlers from main.ts to server/auth/app.ts (#4660)
* Extract auth related server handlers from main.ts to server/auth/app.ts

* Release notes

* Update get-openid-config

* Fix typecheck error

* Fix lint and typecheck errors
2025-04-09 08:34:44 -07:00
alcroito
1b5be7f9d2 Show closed accounts on mobile UI (#4581) (#4584)
Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2025-04-09 11:20:45 -04:00
Julian Dominguez-Schatz
e5d301c66b Fix bump versions script (#4740)
* Include sync-server in auto-bumped versions

* Fix version bump logic to work if the month has rolled over

* Add release notes
2025-04-08 18:34:31 -04:00
Matiss Janis Aboltins
fe3fe47b67 🐛 (bank-sync) improved error handling for initial gocardless account linking (#4756) 2025-04-08 18:50:02 +01:00
Joel Jeremy Marquez
b4ad639bb5 [Mobile] Fix income categories not changing colors based on active month (#4774)
* [Mobile] Fix income categories not changing colors based on active month

* Release notes
2025-04-08 09:30:40 -07:00
Joel Jeremy Marquez
c77168fa18 Extract encryption related server handlers from main.ts to server/encryption/app.ts (#4662)
* Extract encryption related server handlers from main.ts to server/encryption/app.ts

* Release notes
2025-04-08 09:12:11 -07:00
Joel Jeremy Marquez
6fb7fe1343 Replace category DB queries in server handlers with AQL queries + implement category_groups AQL executor (#4544)
* Implement category_groups AQL executor

* Fix category_groups table name

* Release notes

* Update category-update
2025-04-08 09:11:47 -07:00
Joel Jeremy Marquez
490ec22b8a Extract budget file related server handlers from main.ts to server/budgetfiles/app.ts (#4547)
* Extract budget file related server handlers from main.ts to server/budgetfiles/app.ts

* Fix lint error

* Release notes

* Fix typo

* Move backups to budgetfiles folder

* Move backup snapshot

* Fix lint

* Fix lint
2025-04-08 08:21:35 -07:00
ADRROE
0d420ab4d9 Add functionality to download custom reports as an image. (#4219)
* Add functionality to download custom reports as an image.

* Add functionality to download custom reports as an image.

* Switched from html2canvas to html-to-image due to size considerations.

* Snapshot filename

* Add functionality to download custom reports as an image.

* Add functionality to download custom reports as an image.

* Update ReportTopbar.tsx

Fixed mistake

* Use existing date function

* fix imports

* Update VRT

* move component out of common in aid of components lib migration

---------

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-08 11:20:22 -04:00
youngcw
6b22e7422b [Goals]: fix remove goals bug (#4749)
* fix remove goals bug

* note

* Update upcoming-release-notes/4749.md

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

---------

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2025-04-08 08:16:28 -07:00
lelemm
35a833ecba New OpenID first login UX (#4446)
* Fix for openid review parameters

* Refactor and bug fix of OpenId parameters on first login

* md

* change some design

* adjustments

* responsive login

* linter

* removed debugger

* Merge fixes

* removed debugger

* Merge fixes

* missing stuff

* linter

* linter after merge
2025-04-08 12:01:38 -03:00
Michael Clark
140039ea1f :electron: Fix loot-core resolution (#4767)
* fix loot-core resolution

* fix loot core resolution in dev mode for electron
2025-04-08 15:54:43 +01:00
lelemm
afab6ee773 OPENID: Added option to create users on login (#4421)
* Added option to create users on login (openid)

* md

* added default value

* linter

* added validation to ACTUAL_USER_CREATION_MODE

* Merge

* linter

* fixes

* removed enchancement

* linter
2025-04-08 11:18:47 -03:00
lelemm
cefc8da7bc 📚 Missing translations [rules and to budget] (#4770)
* Missing translations

* md

* wrong md name
2025-04-08 11:04:04 -03:00
Alec Bakholdin
91aa2ae47b 🐛 [Bug] Pinning sidebar doesn't persist on reload (#4733)
* Fixed pinning issue

* asyncStorage typing updates

* re-added awaits to savePreferences

* release notes

---------

Co-authored-by: Alec Bakholdin <abakho@icims.com>
2025-04-08 10:01:55 -04:00
Michael Süssemilch
a2878ff2a2 feat: add previous/next month navigation to the MonthPicker (#4692)
* feat: add previous/next month navigation to MonthPicker

* doc: add release note

* chore: update formatting

* test: update vrt snapshots
2025-04-08 09:59:17 -04:00
Alec Bakholdin
0dfa2910c7 🐛 [Bug]: Focused console warning (#4735)
* removed focused from getInputProps

* release notes

---------

Co-authored-by: Alec Bakholdin <abakho@icims.com>
2025-04-08 09:58:07 -04:00
Alec Bakholdin
4e0ab44e2f Fixed bug where closing account did not properly validate transfer or category (#4769)
Co-authored-by: Alec Bakholdin <abakho@icims.com>
2025-04-08 09:52:54 -04:00
Michael Clark
aba97e8b74 :electron: Remove ngrok from electron server embed (#4768)
* remove ngrok

* lock

* release notes
2025-04-07 22:19:10 +01:00
Michael Clark
1d6b70d160 :electron: Playwright test fixture (#4752)
* playwright test fixture

* release notes

* update snapshots

* test

* again

* same timeout as web client

* faster

* srsly

* Update VRT

* update test

* get rid of this test for now

* updating update-vrt

* speed it up a bit

* same timeout as desktop-client

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-06 18:56:08 +01:00
bddvlpr
a9047bfcd6 Add KBCBE (KBC_KREDBEBB) to banks with limited history (#4743) 2025-04-06 18:54:25 +01:00
Matiss Janis Aboltins
af03477d3a ♻️ (typescript) converted indexeddb to strict TS (#4672) 2025-04-06 15:09:37 +01:00
Matiss Janis Aboltins
c4b4108eca 🔧 improving typechecker and lint local performance (#4710) 2025-04-06 14:47:49 +01:00
Michael Clark
26ee3179e1 :electron: Playwright testing for electron (#4674)
* playwright testing for electron

* pipeline updates

* fix normal e2e scripts

* fix path to artifact

* listing out whats there

* attempt to fix ci

* umm

* again

* setting a viewport

* window size to be consistent across machine for tests

* now it work... Righhttt?

* hmm

* do it

* worflow

* will this work

* oops

* dont skip

* trust in the pipeline gods

* remove update snapshots, just do it in the pipeline

* change name of snapshot to account for os

* lint

* fix package script
2025-04-05 09:19:06 +01:00
github-actions[bot]
82b6589c37 🔖 (25.4.0) (#4728)
* 🔖 (25.4.0)

* Remove used release notes

* Remove used release notes

---------

Co-authored-by: matt-fidd <81489167+matt-fidd@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2025-04-04 23:49:46 -04:00
Matt Fiddaman
56f509dcda fix balance menu alignment (#4729)
* fix alignment

* note

* fix mobile

* Fix for width

---------

Co-authored-by: Leandro Menezes <lelemm@gmail.com>
2025-04-03 23:47:10 -04:00
dependabot[bot]
bbfa0093cd bump tar-fs from 2.1.1 to 2.1.2 (#4717) 2025-03-31 16:44:40 -04:00
Matiss Janis Aboltins
aef38f1679 🐛 fix menu not closing when menu item is clicked (#4716) 2025-03-31 18:15:17 +01:00
lelemm
e04ca554e2 🐛 Fix pluggy.ai foreigner currency transaction (#4712)
* Fix pluggy.ai foreigner currency transaction

* Trigger actions

* removed folder
2025-03-31 06:36:36 -03:00
lelemm
77949ad276 🐛 Fix Make Transfer closing the Popover when clicked (#4697)
* Fix `Make Transfer` closing the Popover

* MD

* MD

* linter

* trigger actions

* removed junk from PR

* changed solution

* using focused state
2025-03-28 10:40:56 -03:00
Saahil Jaffer
45f9cc3c1d Fix for iss parameter missing from openid response (#4626)
* fix: iss missing from the response

* add release notes

* add parameter validation check

* remove additional validation

---------

Co-authored-by: lelemm <lelemm@gmail.com>
2025-03-26 16:50:13 -03:00
Mario Lamacchia
31ed12832c Fix error spread in non-batch bank sync (#4689) 2025-03-26 09:12:54 -04:00
Margarida Reis
0f8a1aeb2b fix: apply filters in Reports dashboard for cash flow widget (#4683)
fix issue where filters set in the widget editor for the cash flow widget were not applied in the Reports dashboard
2025-03-26 00:16:23 -04:00
lelemm
161c0625b1 🐛 Fix for objects in config files (#4688)
* fix for objects in config

* md

* linter
2025-03-25 20:54:04 +00:00
Joel Jeremy Marquez
009a3dff4e Show hidden overspent categories (#4680) 2025-03-24 16:25:17 -07:00
Alec Bakholdin
5d01e109e6 🐛 [Bug] Cant edit template rules (#4686)
* Can now save template rules

* added release notes

---------

Co-authored-by: Alec Bakholdin <abakho@icims.com>
2025-03-24 17:54:39 -04:00
Michael Clark
b2287cded3 Local docker build fix (#4677)
* local docker build fix

* Create 4677

* Update sync-server.Dockerfile

* Rename 4677 to 4677.md
2025-03-22 16:25:50 +00:00
Alec Bakholdin
19dbfd0673 fixed can't rename notes (#4675) 2025-03-22 08:20:04 -07:00
Joel Jeremy Marquez
36c40d90d2 [Mobile] Add banners to alert users of recommended budget actions (#4643)
* Add banners to alert users of recommended budget actions

* Update wording for consistency

* Release notes

* Fix release notes

* Code review feedback

* Cleanup

* Extend playwright timeout

* Update Categorize button locator in test

* Update VRT

* Dummy commit

* Streamline cover spending flow

* VRT

* Remove category from modal when covered and close modal when all categories are covered

* Coderabbit suggestions

* Update translations

* VRT

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-03-21 17:19:09 -07:00
Alec Bakholdin
00ff2e2522 🐛 [Bug] fixed bug in Accounts.tsx for applying rules that split transactions (#4623)
* fixed bug in Accounts.tsx for applying rules that split transactions

* added release notes

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

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

---------

Co-authored-by: Alec Bakholdin <abakho@icims.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-03-21 16:12:29 -04:00
dependabot[bot]
1d074730f4 Bump axios from 1.7.9 to 1.8.3 (#4654)
* Bump axios from 1.7.9 to 1.8.3

Bumps [axios](https://github.com/axios/axios) from 1.7.9 to 1.8.3.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.7.9...v1.8.3)

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

Signed-off-by: dependabot[bot] <support@github.com>

* note

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2025-03-21 13:11:29 -04:00
Joel Jeremy Marquez
1e685b993b Extract sync related server handlers from main.ts to server/sync/app.ts (#4661)
* Extract sync related server handlers from main.ts to server/sync/app.ts

* Release notes

* Revert async
2025-03-21 08:04:07 -07:00
Alec Bakholdin
6b2d2420a5 🐛 Fixed GoCardless SelectLinkedAccounts institution bug (#4667)
* Fixed GoCardless SelectLinkedAccounts institution bug

* Modified to guarantee string return type

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

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

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

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

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

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

* Formatting

* Fixed spread syntax

* consistency in method (probably redundant)

---------

Co-authored-by: Alec Bakholdin <abakho@icims.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-03-21 07:56:25 -07:00
Joel Jeremy Marquez
af09e5b1d5 Fix error on budget file selection page when using server (#4670)
* Fix error on budget file selection page when using server

* Release notes
2025-03-21 06:29:07 -07:00
Michael Clark
8f12893ff0 :electron: Fix electron loot core resolutions (#4668)
* fix electron resolutions

* temp fix

* dont include build-electron in the web bundle assuming its built

* lowering size of build

* removing exports

* release notes

* adding bits back

* remove bad config
2025-03-21 09:01:20 +00:00
Joel Jeremy Marquez
a85dc890e5 Fix nested button error in budget file selection page (#4625)
* Resolve nested button error by converting to GridList

* Release notes
2025-03-20 13:12:43 -07:00
Joel Jeremy Marquez
8180476531 Fix embedded autocomplete unexpectedly closing when an item is clicked (#4645)
* Fix autocomplete unexpectedly closing when an item is clicked on embedded setting

* Release notes
2025-03-20 13:11:13 -07:00
Matt Fiddaman
ad1df689d7 bump various dependencies (#4656) 2025-03-20 13:27:17 -04:00
Alec Bakholdin
d9716caf5d 🔧 Added release-notes-generator.ts under generate:release-notes (#4664) 2025-03-20 10:19:04 -04:00
Michael Clark
b2cca2337c 🐛 Allowing service worker to cache files up to 5mb - fixes edge & offline mode (#4665)
* allowing sw to cache files up to 5mb

* release notes
2025-03-19 23:14:58 +00:00
Joel Jeremy Marquez
e0bddaeb99 Extract spreadsheet related server handlers from main.ts to server/spreadsheet/app.ts (#4649)
* Extract spreadsheet related server handlers from main.ts to server/spreadsheet/app.ts

* Release notes

* Fix get-cell

* Update type of initServer
2025-03-19 11:14:46 -07:00
Alec Bakholdin
2c4c5014ea 🐛 fixed current month upcoming calculation (#4629)
* fixed current month upcoming calculation

* added release notes

* updated test to validate the new behavior of getUpcoming

* modified one month and added more tests for leap years and months with different dates

* Fixed odd error

---------

Co-authored-by: Alec Bakholdin <abakho@icims.com>
2025-03-19 08:20:42 -07:00
Matiss Janis Aboltins
c7f3dadc07 🐛 (mobile) fix for iOS - keyboard focus when editing budget (#4651) 2025-03-19 04:50:04 +00:00
Matiss Janis Aboltins
999010cca6 🐛 (reports) fix conditionsOp not applying for saved reports (#4652) 2025-03-19 04:49:29 +00:00
Martin Sebek
b9603d0e54 Added CZ AirBank to banks with only 90 days of history (#4595)
* Added CZ AirBank to banks with only 90 days of history

* Added release notes
2025-03-19 00:01:52 -04:00
Alec Bakholdin
0c85523037 Add org name to bank sync UI (#4646)
* Added institution name to the LinkModal

* Added release notes

* removed a stray import I did not mean to leave in

* updated release note number

* Separated institution into its own column and updated sorting to sort by institution -> name

* Added tooltips to allow users to hover over institution name and account name when linking bank accounts

---------

Co-authored-by: Alec Bakholdin <abakho@icims.com>
2025-03-18 19:55:53 -07:00
Alec Bakholdin
eb5944b353 Bank sync avoid reimporting deleted transactions (#4644)
* matchTransactions imported_id query checks for deleted transactions

* added release notes

* removed stray import

* Added configuration option to control reimporting deleted transactions

* Updated release notes

* Unused import

* Typo

* Linting errors

* Fixed Checkbox id to match what it's for

* Added tooltip for the checkbox

---------

Co-authored-by: Alec Bakholdin <abakho@icims.com>
2025-03-18 16:21:59 -07:00
Matiss Janis Aboltins
f35a850e3d ♻️ moved loot-core import resolution from TS to yarn workspaces (#4592) 2025-03-18 17:38:57 +00:00
Matt Fiddaman
3ca9f6ecbc Update README.md (#4648) 2025-03-18 14:44:32 +00:00
Joel Jeremy Marquez
602b84342b Update server handlers to use the implementation function type instead of duplicating the function arguments/return types (#4650)
* Update server handlers types to be more strict

* Release notes
2025-03-18 06:43:15 -07:00
Joel Jeremy Marquez
b5cbaa52b2 Simplify Modals component by destructuring modal.options instead of passing options one by one (#4647)
* Simplify Modals component

* Release notes
2025-03-18 06:43:01 -07:00
Matiss Janis Aboltins
5fdaa98249 ♻️ removal of '.testing.ts' file extensions in favour of mocks (#4632) 2025-03-18 06:13:11 +00:00
Joel Jeremy Marquez
c8813e9953 Extract budget category related server handlers from main.ts to server/budget/app.ts (#4442)
* Extract category related server handlers from main.ts to server/budget/app.ts

* Release notes

* On DB layer, replace Entity model usage with DB models

* Fix typecheck errors

* Fix type error

* Fix types

* Fix typecheck error

* Fix lint errors

* Fix test errors

* Fix model mapping
2025-03-17 21:39:10 -07:00
Matiss Janis Aboltins
074d5b76cf ⬆️ upgrade yarn from v4.3.1 to v4.7.0 (#4641) 2025-03-17 17:21:28 +00:00
Matiss Janis Aboltins
9f9f349cbf ♻️ (api) do not bundle test files in package output (#4640) 2025-03-17 17:21:09 +00:00
lelemm
78e763659e 📚 More translations for rules and fields (#4635)
* More translations

* md

* more places
2025-03-17 10:43:45 -03:00
Joel Jeremy Marquez
0cc817f2ef [Redux Toolkit Migration] usersSlice [Final PR] (#4128)
* 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

* Budgets slice

* Fix lint errors

* Undo auto removal of import/no-unresolved

* Update index.ts

* Release notes

* usersSlice

* Delete actions folder

* Remove action imports

* Fix lint

* Delete constants

* Fix lint error

* Update thunk name

* Replace CLOSE_BUDGET with resetApp
2025-03-16 21:51:58 -07:00
Alec Bakholdin
f00484b17c 🐛 added null/undefined check for scheduleIsRecurring (#4627) 2025-03-15 20:23:31 +00:00
lelemm
0cdaac6944 🐛 Pluggy.ai credit card transactions were inverted (#4628)
* bugfix

* md
2025-03-15 00:08:40 -03:00
Matiss Janis Aboltins
864aaacd11 ♻️ (loot-core) unify some electron/web/api logic (#4610)
* ♻️ (loot-core) unify some electron/web/api logic

* Add missing mock
2025-03-14 22:46:11 +00:00
Michael Clark
bdf76f6c63 :electron: Embed the sync-server (experimental) (#4526)
* sync server embedded

* cleanup

* remove comment

* remove comment

* changing settings names

* release notes

* release notes

* making dev easier (and slower)

* updating reference to webroot

* using the workspace package yo

* coderabbit
2025-03-14 22:22:17 +00:00
Joel Jeremy Marquez
47c0d394ee [Redux Toolkit Migration] prefsSlice (#4127)
* 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

* Budgets slice

* Fix lint errors

* Undo auto removal of import/no-unresolved

* Update index.ts

* Prefs slice

* Remove old prefs types

* Fix import

* Fix typecheck errors

* Release notes

* Add checks on prefs saving

* Update prefs checking

* Fix set-theme
2025-03-14 06:35:43 -07:00
lelemm
fdac2839c9 🔨 OPENID: Refactor mixed stuff (#4428)
* Refactor

* changed the variable name back to loginMethod

* md

* Update packages/sync-server/src/app.js

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

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-03-14 08:38:33 -03:00
Michael Clark
379a84d2e2 🐳 @actual-app/web workspace in sync-server (#4569)
* Workspace ref web client (#9)
---------

Co-authored-by: lelemm <lelemm@gmail.com>
2025-03-14 09:07:59 +00:00
Joel Jeremy Marquez
d16d022b50 Remove height transition animation from modals when adjusting to viewport height for smoother experience (#4620)
* Use dvh to determine height of modal based on dynamic visual viewport

* Apply to dialog instead of another div

* Remove modal transition

* Release notes
2025-03-13 10:49:58 -07:00
Joel Jeremy Marquez
606e39252f [Mobile] Click on income category balance to show transactions (#4621)
* [Mobile] Click on income category balance to show transactions

* Release notes
2025-03-13 10:49:14 -07:00
Margarida Reis
2523c091c3 improvement: enable collapse split transactions with searches or filters (#4600)
* improvement: enable collapse split transactions with searches or filters

enable the "Collapse|Expand split transactions" button with searches or filters

* Update VRT

* chore: trigger GitHub actions

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-03-13 10:36:01 -07:00
tempiz
d4b37baa4d Modified transaction edit button on mobile to display "Add New Split" (#4536)
* Created Add Split Button

* Create 4536.md

* Fix Lint Check Error

* Fix Release Note Category

* Added add split text to amount left/save button

Removed my add split button and instead added functionality for the button save/amount left button to display "Add New Split" when all amounts are entered.

* Fix Lint

* Update release notes

* Show remaining on add split button

* Fix lint

* Added requested changes

* Fix lint
2025-03-12 17:05:20 -07:00
Matiss Janis Aboltins
ed4ef5b30e ♻️ solve most peer dependency issues reported on install (#4613)
* ♻️ solve most peer dependency issues reported on install

* Release notes

* Patch unit tests
2025-03-12 17:13:35 +00:00
Matiss Janis Aboltins
baadafb15e ♻️ (loot-core) updated all data model imports to use barrel file (#4609) 2025-03-12 17:05:46 +00:00
James Skinner
346727a539 Mobile budget file switching logical error fix (#4596)
* Fix logical error to filter out just the current file from list of files, rather than excluding remote files.

* Add release note and update comment
2025-03-12 07:45:30 -07:00
Matiss Janis Aboltins
ddcd771488 ♻️ (sync-server) align dependency versions; cleanup lint & typecheck (#4605) 2025-03-12 14:03:23 +00:00
Joel Jeremy Marquez
3ecfb4be7e Swipe to dismiss notifications (#4606)
* Swipe to dismiss notifications

* Release notes

* Update VRT

* Dummy commit

* Make notification swipe a bit snappier

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-03-11 14:35:01 -07:00
Margarida Reis
bf154db3d6 fix: align action buttons in modal for confirming transaction edit (#4604)
align the "Cancel" and "Confirm" buttons in the modal for confirming a transaction edit to the right-hand side for consistency
2025-03-11 14:15:49 -07:00
Joel Jeremy Marquez
4b48f09112 [TypeScript] Make db.all generic to make it easy to type DB query results (#4542)
* [TypeScript] Make db.all generic to make it easy to type DB query results

* Release notes

* Fix type

* Update return type
2025-03-10 12:14:13 -07:00
Matiss Janis Aboltins
6c7df7c1f9 ♻️ (components) updated old import paths to use the new paths (#4591) 2025-03-10 18:11:30 +00:00
Matiss Janis Aboltins
0b9b440a7a ♻️ (components) remove InputWithContent component (#4566) 2025-03-10 17:21:00 +00:00
Matiss Janis Aboltins
ebb83aca51 ♻️ (components) refactor useResponsive and move to comp. lib (#4568) 2025-03-10 15:32:17 +00:00
Joel Jeremy Marquez
e5c2ef47ac [Mobile] Drag and drop income categories to re-order (#4482)
* [Mobile] Drag and drop income categories to re-order

* Fix category group ID

* Update borders

* Use list item value prop

* Cleanup

* useCallback

* Remvoe usage of useListData

* Fix typecheck error

* Release notes

* Fix import

* Update DropIndicator

* Update DropIndicator

* Fix drop indicator
2025-03-10 08:14:33 -07:00
Matiss Janis Aboltins
af068d1f89 🐛 fix rules page table incorrect row heights (#4586) 2025-03-10 12:11:09 +00:00
James Skinner
35fe969b1b Typo fix in OutOfSyncMigrationsModal (#4585)
* Fix typo in OutOfSyncMigrationsModal.tsx

* Add release note

* Rename release note file to be id of PR rather than issue
2025-03-09 22:50:37 +00:00
Matiss Janis Aboltins
cc44fad62e ♻️ (components) rename SimpleTable to InfiniteScrollWrapper and cleanup (#4578) 2025-03-08 23:22:39 +00:00
lelemm
42294d4a53 🐛 Fix for var ACTUAL_OPENID_ENFORCE (#4533)
* Fix for var `ACTUAL_OPENID_ENFORCE`

* md
2025-03-08 13:34:56 -03:00
Joel Jeremy Marquez
d8fcd43324 Upgrade React Aria packages and address deprecated Section component warnings (#4572)
* Update react-aria packages and replace deprecated RAC Section component

* Release notes
2025-03-08 02:18:37 -08:00
Joel Jeremy Marquez
ccb07e12db Delete no longer used deprecated Button component (#4564)
* Delete no longer used deprecated Button component

* Release notes

* Release notes

* Delete upcoming-release-notes/4127.md
2025-03-07 10:15:05 -08:00
Matiss Janis Aboltins
f2267587c8 ♻️ (components) moving Input component to comp. library (#4563) 2025-03-07 16:56:17 +00:00
Joel Jeremy Marquez
4bc34776fb Replace usage of deprecated Button in Autocomplete with new Button component (#4561)
* Replace usage of deprecated Button in Autocomplete with new Button component

* Release notes

* Remove console.log
2025-03-07 08:47:46 -08:00
Joel Jeremy Marquez
63657a8496 Replace usage of deprecated Button component in MobileForms with new Button component (#4559)
* Update mobile forms TapField to use the new Button component

* Release notes

* Fix typecheck error

* Cleanup

* Update VRT

* Dummy commit

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-03-07 08:44:11 -08:00
Joel Jeremy Marquez
b3e82c55f6 [Mobile] Drag and drop on accounts to re-order (#4476)
* Drag and drop on mobile accounts page

* Fix width

* Move account in DB

* Update onReorder

* Use ID as key

* Fix typecheck error

* Rename prop

* Alert for debugging

* Fix retrieval of keys

* Update after logic

* Fix retrieval of nextToTargetAccount

* More debug

* Remove alert

* Cleanup

* Fix typecheck error

* Drop indicator

* Use DropIndicator component

* Update drop indicator style

* Release notes

* Remove useListData

* Upgrade react aria components in case bug fixes were introduced

* Dummy commit

* Updat e react aria packages

* Revert react aria versions

* Update AccountListItem

* Dummy commit

* Pass ListBoxItem render props to child Button

* Update release notes
2025-03-07 07:59:07 -08:00
Matiss Janis Aboltins
9a45d6707d ♻️ (components) moving select component to component library (#4556) 2025-03-07 14:48:30 +00:00
Matiss Janis Aboltins
46138997d1 ♻️ removing 'focused' prop from generic Input component (#4557) 2025-03-07 09:14:18 +00:00
Joel Jeremy Marquez
c19d5a5722 Replace usage of deprecated Button in TransactionEdit with new Button component (#4560)
* Replace usage of deprecated Button in TransactionEdit with new Button component

* Release notes
2025-03-06 19:59:45 -08:00
Joel Jeremy Marquez
c2cb61eb70 [Redux Toolkit Migration] notificationsSlice (#4126)
* 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

* Budgets slice

* Fix lint errors

* Undo auto removal of import/no-unresolved

* Update index.ts

* Release notes

* Notifications slice

* Update payloads

* Fix addNotification import

* Fix addNotification import

* Fix typecheck error

* Fix build error

* Fix lint and typecheck error

* Coderabbit feedback

* Fix lint error
2025-03-06 19:59:19 -08:00
tempiz
ca5cd55585 Display Goal/Target Information on Mobile (#4546)
* Display Goal/Target Information on Mobile

* Create 4546.md

* Fix lint issues

* change hr and div to View and modified styling

* Fix lint errors again

---------

Co-authored-by: lelemm <lelemm@gmail.com>
2025-03-06 22:53:20 -03:00
Matiss Janis Aboltins
6fd5164987 ♻️ removing usages of MenuButton (#4555) 2025-03-06 18:48:23 +00:00
lelemm
60a864a790 📚 Translate calendar related strings (#4211)
* Translate dates POC

* more dynamic loading of locales

* added locale

* linter

* linter and typecheck

* added md

* translated DateSelect component

* more translations and fixes

* removed redux state for locale

* linter

* typecheck fix

* fix test for schedules.ts

* linter

* fixed System Default language

* loading all locales at once

* added some fallback cases

* bugfix, linter and typecheck

* schedule description rework to have better translation labels

* fixes

* test fix

* Trigger actions

* merge of #4459

---------

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2025-03-06 15:17:38 -03:00
Matiss Janis Aboltins
c510f722ef ♻️ (components) moving icons to the component lib (#4554) 2025-03-06 18:16:59 +00:00
lelemm
1fed3ebbd7 Memoize external accounts for bank sync (#4540)
* Memoize external accounts

* md
2025-03-05 12:23:08 -03:00
Joel Jeremy Marquez
84e4cda6ad [TypeScript] Make db.firstSync generic to make it easy to type DB query results (#4249)
* [TypeScript] Make db.first generic

* Release notes

* Fix typecheck error

* Cleanup type

* Update db.first calls

* Fix strict type

* [TypeScript] Make db.firstSync generic

* Release notes

* Coderabbit review
2025-03-04 15:00:44 -08:00
Joel Jeremy Marquez
4fb5bbca34 Extract payees related server handlers from main.ts to server/payees/app.ts (#4443)
* Extract payees related server handlers from main.ts to server/payees/app.ts

* Release notes

* Payee model mapping methods

* Re-arrange methods

* Update types

* Remove undoable because there is withUndo already

* Support meta in undoable

* Fix types

* Fix typo on test
2025-03-04 15:00:27 -08:00
lelemm
e0805c125f 🐛 Fix for ACTUAL_PORT and PORT vars (#4537)
* Fix for ACTUAL_PORT and PORT vars

* md
2025-03-04 20:26:45 +00:00
Matt Fiddaman
a2fc6bdd31 Add "payee is nothing" condition to rule if there is no payee set in a schedule (#4267)
* if no payee set in schedule, add payee = nothing to rule

* note
2025-03-04 19:13:00 +00:00
Joel Jeremy Marquez
866f4891ce [TypeScript] More specific types on budget table components (#4524)
* [TypeScript] More specific types on budget table components

* Release notes

* Wrong PR number
2025-03-04 11:00:34 -08:00
Joel Jeremy Marquez
0f7a1e6b97 [Redux Toolkit Migration] modalsSlice (#4119)
* 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

* Budgets slice

* Fix lint errors

* Undo auto removal of import/no-unresolved

* Update index.ts

* Modal slice

* Use loot-core Modal type in all modals

* Fix typecheck error

* Fix errors

* Remove ModalsState

* Fix typecheck error

* Update payload

* Fix typecheck error

* Update new modals

* Fix typecheck errors

* Fix lint error

* Fix typecheck error

* Fix typecheck error

* Update packages/desktop-client/src/components/modals/PluggyAiInitialiseModal.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>
2025-03-04 10:38:33 -08:00
Matt Fiddaman
0b15ba18a0 disable mangling when building (#4532)
* disable mangling

* note
2025-03-04 18:09:08 +00:00
lelemm
cfc8186da1 🐛 Fix config for default data dir (#4535)
* Fix config for default data dir

* md

* Fix for testing

* linter
2025-03-04 18:06:13 +00:00
lelemm
47ad1492dc 🐛 Fix production builds missing convict and pluggy-sdk (#4534)
* Fix production builds

* md
2025-03-04 14:33:44 -03:00
lelemm
90af0466f4 🐛 Fixes for OpenID with the new config (#4530)
* Fixes for openid with the new config

* md
2025-03-04 13:57:18 -03:00
Luke
98e4ece50a Allow marking transactions as Transfers on mobile devices (#4511)
* Extract existing "Make Transfer" functionality

* Add "Make Transfer" functionality to mobile menu

* Don't just blindly allow setting as transfer

* Update disabled colour and missing translations

* Fix import warnings

* Add release note

* Use correct translation function

* Determine whether to show the "Make Transfer" option or not based on the presence of an account

* Build list of menu options nicer

* Fix types

* Fix translations

* Use Trans component instead of t function

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

---------

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2025-03-04 13:37:58 +00:00
Szymon Romanko
9e82032595 Fixed transaction dates in bank sync with MBANK_RETAIL_BREXPLPW (#4493)
* fixed transaction date for MBANK_RETAIL_BREXPLPW

* cleared up imports after previous commit (9251d3e1)

* added release notes

* linted code

* Update packages/sync-server/src/app-gocardless/banks/mbank_retail_brexplpw.js

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

---------

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2025-03-04 12:34:01 +00:00
lelemm
abb6e86f35 🐛 Fix on typed select (#4529)
* Fix on typed select

* md

* merge fix

* linter
2025-03-04 09:06:37 -03:00
Matt Fiddaman
c8d14cae09 improve summary report monthly average calculation (#4302) 2025-03-04 11:33:29 +00:00
lelemm
d815a22f6b Refactoring load-config.js (#4440) 2025-03-04 08:15:46 -03:00
lelemm
d5e2030d23 Pluggy.ai bank sync (#4049)
* added Pluggy.ai bank sync

* added md

* code review nits

* small fixes

* fix syncs

* refactory after redux changes

* changed trunc to round

* removed debugger

* linter

* linter again

* sync-server changes

* types

* code review

* typecheck

* fixes

* removed old sync server file

* code review

* added more fields to mapping

* linter

* code review

* Update packages/sync-server/src/app-pluggyai/app-pluggyai.js

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

* code review

---------

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2025-03-04 08:07:58 -03:00
Matiss Janis Aboltins
f9b8dde199 🐛 make custom report side nav bar responsive (#4522) 2025-03-04 04:14:45 +00:00
Matt Fiddaman
c17cd28525 Show the last bank sync in plain language instead of timestamp (#4523)
* use relative time strings for last bank sync

* note
2025-03-03 21:58:53 +00:00
Margarida Reis
5ebbff4f87 feat: add "last reconciled" timestamp to accounts (#4459)
* feat: add "last reconciled" timestamp to accounts

add a `last_reconciled` column to the `accounts` table, which stores a UNIX timestamp indicating when each account was last reconciled
upon initial release, all accounts will display "Not yet reconciled"; however, after completing reconciliation and pressing the "Done reconciling" button, the timestamp will be updated accordingly

* test: generate mock accounts with `last_reconciled` as `null`

generate mock accounts with the `last_reconciled` value set to `null`, to match the expected behaviour that new accounts will start with a "Not yet reconciled" status

* improvement: display "last reconciled" timestamp in tooltip

relocate the "last reconciled" timestamp from the account balances header to a tooltip displayed when hovering over the "Reconcile" button
2025-03-03 12:27:57 -07:00
Matt Fiddaman
ca2a930bd5 bump versions to v25.3.1 (#4521)
* bump versions

* remove release notes from patch release
2025-03-03 19:13:29 +00:00
Margarida Reis
7346198360 fix: filtering of transfer transactions (#4519)
fix issue where transactions for transfers between accounts (i.e., transactions where the payee is another account) were not properly filtered during searches
2025-03-03 18:49:50 +00:00
Michael Clark
17c4d168fa 🐛 Fix error modal not showing when in non-secure context (#4499)
* init when not ssl

* bringing it all back

* huh

* race conditions....

* release notes

* remove unneeded console log
2025-03-03 18:47:27 +00:00
Michael Clark
b74175e660 :electron: Copy budget files to succeed even if cleanup fails & adding retries (#4507)
* allowing copy budget files to succeed even if cleanup fails

* release notes

* updating fs-extra

* retries in for removing dir

* better retry defaults

* defaults
2025-03-03 18:46:22 +00:00
youngcw
3628deee95 [Goals] Better processing for by templates (#4486)
* upgrade the by templates

* note

* lint
2025-03-03 09:37:20 -07:00
Matt Fiddaman
7650eed644 increase timeout for SimpleFIN batch sync and add debug logging (#4515)
* increase timeout for SimpleFIN batch sync, add logging

* note

* ensure errors bubble up to the UI
2025-03-03 15:49:10 +00:00
Mahmoud Hanafy
eeeb1d3bcd Ignore user's fly.toml (#4508)
* Ignore user's fly.toml

* Add release notes
2025-03-03 14:17:42 +00:00
Gianluca Trombetta
3863ce369d Fix typo (#4506)
* Fix typo

* Release notes
2025-03-03 10:30:58 +00:00
Julian Dominguez-Schatz
e10b105756 Fix number input on mobile with hidden decimals (#4503)
* Fix number input on mobile with hidden decimals

* Add release notes
2025-03-02 12:18:27 -05:00
Joel Jeremy Marquez
89006275a0 [TypeScript] Make db.first generic to make it easy to type DB query results (#4248)
* [TypeScript] Make db.first generic

* Release notes

* Fix typecheck error

* Cleanup type

* Update db.first calls

* Fix strict type

* Code review

* Fix typo
2025-03-01 09:33:45 -08:00
Joel Jeremy Marquez
b4f423eac0 [Mobile] Add support for searching child transactions (#4471)
* [Mobile] Add support for searching child transactions

* Release notes
2025-02-28 23:31:54 -08:00
Joel Jeremy Marquez
d5f55cee80 Fix react-hooks/exhaustive-deps error on useSheetValue.ts (#4278)
* Fix react-hooks/exhaustive-deps error on useSheetValue.ts

* Release notes

* Add comments

* Fix typecheck error
2025-02-28 23:20:25 -08:00
Joel Jeremy Marquez
fcf110749d [Redux Toolkit Migration] budgetsSlice (#4114)
* 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

* Budgets slice

* Fix lint errors

* Fix import

* Release notes

* Undo auto removal of import/no-unresolved

* Move backup actions to budgetSlice

* Fix lint error

* Fix loadBudget

* Update index.ts
2025-02-28 22:59:51 -08:00
Matt Fiddaman
6db52ca7a8 fix negative amount parsing (#4489)
* fix negative amount parsing

* note
2025-03-01 03:50:16 +00:00
Th3Heavy
e91f8e7e06 Update bank-factory.js add bank to BANKS_WITH_LIMITED_HISTORY (#4416)
* Update bank-factory.js

add bank  90 days limit history:
INDUSTRIEL_CMCIFRPAXXX
QONTO_QNTOFRP1

* Create 4416

* Rename 4416 to 4416.md
2025-03-01 02:54:54 +00:00
Matt Fiddaman
1425671d16 prevent subsequent builds from failing when fetching translations (#4485)
* bring back deleted files for subsequent builds

* note
2025-03-01 02:49:41 +00:00
Tim
61364fb846 align month picker years to the month text (#4474)
* align month picker years to the month text

* update vrt

* add upcoming-release-notes
2025-02-28 21:23:24 -05:00
Julian Dominguez-Schatz
1a5f83d78c Update transaction repair tool to remove erroneous transaction errors (#4464)
* Update transaction fix tool to remove errors from regular transactions

* Add release notes

* Update 4464.md
2025-02-28 21:21:27 -05:00
github-actions[bot]
b0deedb411 🔖 (25.3.0) (#4478)
* 🔖 (25.3.0)

* Empty commit to bump ci

* Remove used release notes

* Empty commit to bump ci

* Bump sync-server for web release

* Remove used release notes

* Empty commit to bump ci

---------

Co-authored-by: jfdoming <9922514+jfdoming@users.noreply.github.com>
Co-authored-by: Julian Dominguez-Schatz <julian.dominguezschatz@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-02-28 20:19:57 -05:00
Michael Clark
103d95bbc8 🐳 Docker images to be published under the actual repo (#4483)
* docker images to be published to the main repo

* release notes
2025-02-28 19:38:34 -05:00
Julian Dominguez-Schatz
d11fc59ec9 Update bump-package-versions script to handle no input version (#4477) 2025-02-27 19:15:15 -05:00
Matt Fiddaman
1c931cf01c add last bank sync tracking back in (#4472)
* add last sync tracking back in

* note

* type

* db.update
2025-02-27 19:41:24 +00:00
Matt Fiddaman
7f50c73866 fix category group deletion on mobile (#4469)
* fix deleting category groups on mobile

* note
2025-02-27 17:17:07 +00:00
youngcw
a7cde1f90d fix #4445 (#4468)
* change condition

* new message

* fix

* lint
2025-02-27 10:06:08 -07:00
Julian Dominguez-Schatz
398ada0afd Fix crash when deleting child transactions from an errored split (#4465)
* Fix crash when deleting child transactions from an errored split

* Add tests

* Add release notes

* Add graceful fallback

Fallback: don't try to show errors on a transaction if it's not actually
a split.
2025-02-27 09:16:52 -05:00
Julian Dominguez-Schatz
8b928b3b21 Fix missing space in bank sync strings (#4463)
* Fix missing space in string

* Add release notes
2025-02-26 20:17:02 -05:00
Matt Fiddaman
3897a5a51c fix row spacing on bank sync page (#4458)
* fix bank sync row heights

* note
2025-02-27 01:05:46 +00:00
Alec Bakholdin
94f94497af resets transaction search even if search text is not empty (#4461)
* resets transaction search even if search text is not empty

* added release notes

---------

Co-authored-by: Alec Bakholdin <abakho@icims.com>
2025-02-27 00:03:50 +00:00
Alec Bakholdin
a72fd74c5e Resolves #4429 crash where clicking "manage payees" with an empty payee then clicking dropdown (#4462)
* added release notes

* only set payee in state on page navigation if payee id is present

---------

Co-authored-by: Alec Bakholdin <abakho@icims.com>
2025-02-27 00:02:23 +00:00
Joel Jeremy Marquez
5214549ed3 [Mobile] Change budget table colors when on non-current month (#4448)
* Change budget table colors when on non-current month

* Release notes

* Update VRT

* Dummy commit

* Revert calendar icon

* Update VRT

* Update schedule icons

* Update VRT

* Dummy commit

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-02-25 08:41:40 -08:00
Matt Fiddaman
3c8212e130 change i18n errors to info (#4453) 2025-02-25 16:02:45 +00:00
Matt Fiddaman
eface19216 sort schedule previews by date, then amount (#4452)
* sort schedule previews by date, then amount

* note
2025-02-25 15:10:38 +00:00
lelemm
f413fa03ae 🐛 Fix the default language init for electron (#4439)
* Fix for the default language for electron

* md
2025-02-24 00:03:12 -03:00
Matt Fiddaman
81b30d74e4 prevent docker-edge workflow from running on pushes to forks (#4430) 2025-02-22 22:48:18 +00:00
lelemm
0fddcac76d 📚 Start the application with the browser default language (#4415)
* Start the application with browser default language

* md
2025-02-22 12:21:06 -03:00
Andrey Romanov
1511587e88 Mobile: adjust modals height to visual viewport (#4427)
* Mobile: adapt autocomplete modals to visual viewport

* Fix modal max-height, animate height changes

* Update VRT

* Update max-height to be 90% of visual viewport

* Update VRT

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-02-22 00:18:18 +00:00
Michael Clark
ff7c358b83 :electron: Improving electron logs (#4407)
* enhancing electron logs to send messages to client window about logs send before client window startup

* release notes

* typing the logs

* ts
2025-02-21 19:58:18 +00:00
Joel Jeremy Marquez
f88b00ae77 Extract preferences related server handlers from main.ts to server/preferences/app.ts (#4420)
* Extract preferences related server handlers from main.ts to server/preferences/app.ts

* Release notes

* Fix types

* FIx typecheck errors

* Code review
2025-02-21 09:43:30 -08:00
lelemm
f5a1293e3c Enforce OPENID login (#4423)
* Enforce OPENID login

* Added `ACTUAL_OPENID_ENFORCE=true` enviroment variable to enforce only OpenID auth.

* Apply suggestions from code review

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

* code review

---------

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2025-02-20 23:20:30 -03:00
Joel Jeremy Marquez
5a79beadfa Fix react-hooks/exhaustive-deps error on TransactionList.jsx (#4272)
* Fix react-hooks/exhaustive-deps error on TransactionList.jsx

* Release notes

* Remove useLayoutEffect

* Add back the useLayoutEffect
2025-02-20 16:38:03 -08:00
Joel Jeremy Marquez
6e934e46a8 Extract accounts related server handlers from main.ts to server/accounts/app.ts (#4227)
* Move transaction related handlers to server/transactions folder and use the new convention

* Fix lint and typecheck

* Move server account handlers from main.ts to accounts/app.ts

* Add accounts app to main.ts

* Release notes

* Fix types

* Fix typecheck error

* Fix types

* Fix build error

* Use main app
2025-02-20 16:36:27 -08:00
dependabot[bot]
18423a3167 Bump vitest from 1.6.0 to 1.6.1 (#4410)
* Bump vitest from 1.6.0 to 1.6.1

Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 1.6.0 to 1.6.1.
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v1.6.1/packages/vitest)

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

Signed-off-by: dependabot[bot] <support@github.com>

* note

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
2025-02-20 21:56:37 +00:00
Matt Fiddaman
c1a70377b9 prevent bank sync from crashing when payee not found (#4413) 2025-02-20 20:33:20 +00:00
Matt Fiddaman
dd4b891fd9 bump express dependencies (#4411) 2025-02-20 19:20:39 +00:00
Joel Jeremy Marquez
89a92ecbbe [TypeScript] Add types to SpreadsheetProvider (#4409)
* [TypeScript] SpreadsheetProvider

* Cleanup

* Release notes

* Update upcoming-release-notes/4409.md

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

---------

Co-authored-by: Michael Clark <5285928+MikesGlitch@users.noreply.github.com>
2025-02-20 11:05:34 -08:00
lelemm
bde99b75ae 🐛 Fix On budget / Off budget underline with translated languages (#4417)
* Fix `On budget` / `Off budget` underline

* md
2025-02-20 11:47:40 -07:00
Joel Jeremy Marquez
8d3b046bef Extract transaction related server handlers from main.ts to server/transactions/app.ts (#4221)
* Move transaction related handlers to server/transactions folder and use the new convention

* Fix lint and typecheck

* Release notes

* Update handler names

* Move get-earliest-transaction

* Update release notes

* Fix tests

* Fix types

* Fix lint

* Update snapshot

* Remove duplicate parse-file.ts

* Fix lint
2025-02-19 15:57:18 -08:00
Joel Jeremy Marquez
f7f58847dc useDisplayPayee hook to unify payee names in mobile and desktop. (#4213)
* useDisplayPayee hook to unify payee logic in mobile and desktop

* Release notes

* Fix typecheck errors

* Fix test

* Update test

* Revert (No payee) color

* Fix tests

* VRT

* Fix category transactions

* Fix lint and VRT

* Update VRT

* Translate

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-02-19 15:57:01 -08:00
Antoine Taillard
23752f1da9 Fix currencyToAmount incorrectly converting input (#4383)
* fix: ensure currencyToAmount works regardless of the configured number format

* chore: linting

* docs: add release note

* test: ensure correct amount is entered for debit when adding split transactions

* chore: rename variable thousandsSep to thousandsSeparator

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

* chore: rename variable decimalSep to decimalSeparator

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

* chore: rename decimalSep and thousandsSep variables to decimalSeparator and thousandsSeparator

---------

Co-authored-by: Joel Jeremy Marquez <joeljeremy.marquez@gmail.com>
2025-02-19 15:31:48 -08:00
lelemm
1cc2da1de3 📚 Translation batch #1 (#4408)
* Translation batch

* md

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

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

* fix code review from coderabbit

* code review

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-02-19 18:24:15 -05:00
Michael Clark
04b5bdc62f 👷 Typescript: Improving typing of asyncStorage (global-store.json) (#4369)
* typing globalprefs

* adding release notes

* unneeded partial

* removing prop that crept in
2025-02-19 18:40:12 +00:00
Joel Jeremy Marquez
fc78d5b546 Fix react-hooks/exhaustive-deps error on useCategories.ts (#4261)
* Fix react-hooks/exhaustive-deps error on useCategories.ts

* Release notes
2025-02-19 08:40:02 -08:00
Joel Jeremy Marquez
f5586501bf Fix react-hooks/exhaustive-deps error on table.tsx (#4274)
* Fix react-hooks/exhaustive-deps error on table.tsx

* Release notes
2025-02-19 07:06:59 -08:00
Joel Jeremy Marquez
d902c38253 Fix react-hooks/exhaustive-deps error on TransactionsTable.jsx (#4268)
* Fix react-hooks/exhaustive-deps error on TransactionsTable.jsx

* Release notes

* Fix lint
2025-02-19 07:06:41 -08:00
Joel Jeremy Marquez
a085945898 Fix react-hooks/exhaustive-deps error on useProperFocus.tsx (#4259)
* Fix react-hooks/exhaustive-deps error on useProperFocus.tsx

* Remove comment in eslint config

* Release notes
2025-02-19 07:06:17 -08:00
Michał Gołąb
def06693ab [WIP] BANKS_WITH_LIMITED_HISTORY constant update (#4388) 2025-02-19 12:57:42 +00:00
Joel Jeremy Marquez
bf72a26e5c Fix react-hooks/exhaustive-deps error on Titlebar.tsx (#4273)
* Fix react-hooks/exhaustive-deps error on Titlebar.tsx

* Release notes
2025-02-18 22:36:19 -08:00
Joel Jeremy Marquez
10c35e18d3 Fix react-hooks/exhaustive-deps error on useAccounts.ts (#4262)
* Fix react-hooks/exhaustive-deps error on useAccounts.ts

* Release notes
2025-02-18 22:35:34 -08:00
Joel Jeremy Marquez
aea6e79402 Fix react-hooks/exhaustive-deps error on usePayees.ts (#4260)
* Fix react-hooks/exhaustive-deps error on usePayees.ts

* Rename

* Release notes
2025-02-18 22:32:30 -08:00
Joel Jeremy Marquez
81db7399da Fix react-hooks/exhaustive-deps error on useSelected.tsx (#4258)
* Fix react-hooks/exhaustive-deps error on useSelected.tsx

* Release notes
2025-02-18 22:18:02 -08:00
Julian Dominguez-Schatz
7c9a499f91 Foundations for the budget automations UI (#4308)
* Foundations for the budget automations UI

* Coderabbit
2025-02-18 20:06:54 -05:00
Julian Dominguez-Schatz
df9e6ec66d Fix top-level types of send function (#4145)
* Add release notes

* Fix types of `send` function

* Fix `send` types in a number of places

* PR feedback
2025-02-18 19:59:09 -05:00
Matt Fiddaman
a4d3f277ea update mapping data for existing synced transactions and always show direction dropdown (#4403)
* update sync mapping data for existing transactions on sync

* show payment direction dropdown regardless of sample data

* note

* ignore changes in raw_synced_data
2025-02-18 23:06:00 +00:00
1945 changed files with 41226 additions and 29010 deletions

View File

@@ -1,14 +1,11 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/docker-existing-docker-compose
{
"name": "Actual development",
"dockerComposeFile": [
"../docker-compose.yml",
"docker-compose.yml"
],
// Alternatively:
// "image": "mcr.microsoft.com/devcontainers/typescript-node:0-16",
"service": "actual-development",
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
"postCreateCommand": "yarn install"
"name": "Actual development",
"dockerComposeFile": ["../docker-compose.yml", "docker-compose.yml"],
// Alternatively:
// "image": "mcr.microsoft.com/devcontainers/typescript-node:0-16",
"service": "actual-development",
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
"postCreateCommand": "yarn install"
}

View File

@@ -1,7 +1,7 @@
name: Bug Report
description: File a bug report also known as an issue or problem.
title: '[Bug]: '
labels: ['bug']
labels: ['needs triage', 'bug']
body:
- type: markdown
id: intro-md

View File

@@ -1 +1 @@
<!-- Thank you for submitting a pull request! Make sure to follow the instructions to write release notes for your PR — it should only take a minute or two: https://github.com/actualbudget/docs#writing-good-release-notes -->
<!-- Thank you for submitting a pull request! Make sure to follow the instructions to write release notes for your PR — it should only take a minute or two: https://github.com/actualbudget/docs#writing-good-release-notes. Try running yarn generate:release-notes *before* pushing your PR for an interactive experience. -->

View File

@@ -1,19 +1,46 @@
#!/bin/bash
set -euo pipefail
version="${1#v}"
if [ "$#" -gt 0 ]; then
version="${1#v}"
else
version=""
fi
files_to_bump=(
packages/api/package.json
packages/desktop-client/package.json
packages/desktop-electron/package.json
packages/sync-server/package.json
)
for file in "${files_to_bump[@]}"; do
if [ -z "$version" ]; then
# version format: YY.MM.patch
# logic: if before the 25th, bump patch, else set minor/major to next month
version="$(jq -r .version "$file" | perl -e '($y,$m,$p)=split/\./,<>;$d=(localtime)[3];$d>25?($p=0,++$m,$m>12&&($m=1,++$y)):$p++;print"$y.$m.$p\n"')"
version="$(jq -r .version "$file" | perl -e '
($y,$m,$p)=split(/\./,<>);
($sec,$min,$hour,$day,$mon,$year)=localtime();
$year -= 100; # Perl year starts at 1900
$mon++; # Adjust 0-indexed month to 1-indexed
if ($y == $year && $m == $mon) {
if ($day <= 25) {
# Patch release for the current month
$p++;
} else {
# Use next month for a new release period
$p = 0;
$m++;
$m > 12 && ($m=1, $y++);
}
} else {
# Use the current date for a new release period
$y = $year;
$m = $mon;
$p = 0;
}
print "$y.$m.$p\n";
')"
if [ -z "$version" ]; then
echo "Error: Failed to calculate new version" >&2
exit 1

View File

@@ -16,17 +16,21 @@ runs:
- name: Install node
uses: actions/setup-node@v4
with:
node-version: 18.16.0
node-version: 20
- name: Install yarn
run: npm install -g yarn
shell: bash
if: ${{ env.ACT }}
- name: Get Node version
id: get-node
run: echo "version=$(node -v)" >> "$GITHUB_OUTPUT"
shell: bash
- name: Cache
uses: actions/cache@v4
id: cache
with:
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)) }}
key: yarn-v1-${{ runner.os }}-${{ steps.get-node.outputs.version }}-${{ hashFiles(format('{0}/**/yarn.lock', inputs.working-directory)) }}
- name: Install
working-directory: ${{ inputs.working-directory }}
run: yarn --immutable

View File

@@ -57,7 +57,7 @@ jobs:
- name: Set up environment
uses: ./.github/actions/setup
- name: Build Web
run: ./bin/package-browser
run: yarn build:browser
- name: Upload Build
uses: actions/upload-artifact@v4
with:
@@ -76,7 +76,7 @@ jobs:
- name: Set up environment
uses: ./.github/actions/setup
- name: Build Server
run: cd packages/sync-server && yarn build
run: yarn workspace @actual-app/sync-server build
- name: Upload Build
uses: actions/upload-artifact@v4
with:

View File

@@ -43,6 +43,6 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '19'
node-version: 20
- name: Check migrations
run: node ./.github/actions/check-migrations.js

View File

@@ -24,6 +24,7 @@ env:
IMAGES: |
actualbudget/actual-server
ghcr.io/actualbudget/actual-server
ghcr.io/actualbudget/actual
# Creates the following tags:
# - actual-server:edge
@@ -33,6 +34,7 @@ env:
jobs:
build:
if: ${{ github.event.repository.fork == false }}
name: Build Docker image
runs-on: ubuntu-latest
strategy:
@@ -71,17 +73,19 @@ jobs:
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Download artifacts
run: ./packages/sync-server/docker/download-artifacts.sh
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# Building outside of the docker image allows us to build once and push to multiple platforms
# This is faster and avoids yarn memory issues
- name: Set up environment
uses: ./.github/actions/setup
- name: Build Web
run: yarn build:server
- name: Build and push image
uses: docker/build-push-action@v5
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
file: packages/sync-server/docker/edge-${{ matrix.os }}.Dockerfile
file: packages/sync-server/docker/${{ matrix.os }}.Dockerfile
platforms: linux/amd64,linux/arm64,linux/arm/v7${{ matrix.os == 'alpine' && ',linux/arm/v6' || '' }}
tags: ${{ steps.meta.outputs.tags }}
build-args: |

View File

@@ -13,6 +13,7 @@ env:
IMAGES: |
actualbudget/actual-server
ghcr.io/actualbudget/actual-server
ghcr.io/actualbudget/actual
# Creates the following tags:
# - actual-server:latest (see docker/metadata-action flavor inputs, below)
@@ -69,12 +70,19 @@ jobs:
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
# Building outside of the docker image allows us to build once and push to multiple platforms
# This is faster and avoids yarn memory issues
- name: Set up environment
uses: ./.github/actions/setup
- name: Build Web
run: yarn build:server
- name: Build and push ubuntu image
uses: docker/build-push-action@v5
with:
context: .
push: true
file: packages/sync-server/docker/stable-ubuntu.Dockerfile
file: packages/sync-server/docker/ubuntu.Dockerfile
platforms: linux/amd64,linux/arm64,linux/arm/v7
tags: ${{ steps.meta.outputs.tags }}
@@ -83,6 +91,6 @@ jobs:
with:
context: .
push: true
file: packages/sync-server/docker/stable-alpine.Dockerfile
file: packages/sync-server/docker/alpine.Dockerfile
platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v6
tags: ${{ steps.alpine-meta.outputs.tags }}

View File

@@ -32,7 +32,7 @@ jobs:
needs: netlify
runs-on: ubuntu-latest
container:
image: mcr.microsoft.com/playwright:v1.41.1-jammy
image: mcr.microsoft.com/playwright:v1.52.0-jammy
steps:
- uses: actions/checkout@v4
- name: Set up environment
@@ -48,12 +48,33 @@ jobs:
path: packages/desktop-client/test-results/
retention-days: 30
overwrite: true
functional-desktop-app:
name: Functional Desktop App
runs-on: ubuntu-latest
container:
image: mcr.microsoft.com/playwright:v1.52.0-jammy
steps:
- uses: actions/checkout@v4
- name: Set up environment
uses: ./.github/actions/setup
- name: Run Desktop app E2E Tests
run: |
xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24" -- yarn e2e:desktop
- uses: actions/upload-artifact@v4
if: always()
with:
name: desktop-app-test-results
path: packages/desktop-electron/e2e/test-results/
retention-days: 30
overwrite: true
vrt:
name: Visual regression
needs: netlify
runs-on: ubuntu-latest
container:
image: mcr.microsoft.com/playwright:v1.41.1-jammy
image: mcr.microsoft.com/playwright:v1.52.0-jammy
steps:
- uses: actions/checkout@v4
- name: Set up environment

View File

@@ -77,13 +77,68 @@ jobs:
name: actual-electron-${{ matrix.os }}-appx
path: |
packages/desktop-electron/dist/*.appx
- name: Add to Release
- name: Process release version
id: process_version
run: |
echo "version=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
- name: Add to new release
uses: softprops/action-gh-release@v2
with:
draft: true
body: |
:link: [View release notes](https://actualbudget.org/blog/release-${{ steps.process_version.outputs.version }})
## Desktop releases
Please note: Microsoft store updates can sometimes lag behind the main release by a couple of days while they verify the new version.
<a href="https://apps.microsoft.com/detail/9p2hmlhsdbrm?cid=Github+Releases&mode=direct">
<img src="https://get.microsoft.com/images/en-us%20dark.svg" width="200"/>
</a>
files: |
packages/desktop-electron/dist/*.dmg
packages/desktop-electron/dist/*.exe
!packages/desktop-electron/dist/Actual-windows.exe
packages/desktop-electron/dist/*.AppImage
packages/desktop-electron/dist/*.flatpak
publish-microsoft-store:
needs: build
runs-on: windows-latest
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') }}
steps:
- name: Install StoreBroker
shell: powershell
run: |
Install-Module -Name StoreBroker -AcceptLicense -Force -Scope CurrentUser -Verbose
- name: Download Microsoft Store artifacts
uses: actions/download-artifact@v4
with:
name: actual-electron-windows-latest-appx
- name: Submit to Microsoft Store
shell: powershell
run: |
# Disable telemetry
$global:SBDisableTelemetry = $true
# Authenticate against the store
$pass = ConvertTo-SecureString -String '${{ secrets.MICROSOFT_STORE_CLIENT_SECRET }}' -AsPlainText -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ${{ secrets.MICROSOFT_STORE_CLIENT_ID }},$pass
Set-StoreBrokerAuthentication -TenantId '${{ secrets.MICROSOFT_STORE_TENANT_ID }}' -Credential $cred
# Zip and create metadata files
$artifacts = Get-ChildItem -Path . -Filter *.appx | Select-Object -ExpandProperty FullName
New-StoreBrokerConfigFile -Path "$PWD/config.json" -AppId ${{ secrets.MICROSOFT_STORE_PRODUCT_ID }}
New-SubmissionPackage -ConfigPath "$PWD/config.json" -DisableAutoPackageNameFormatting -AppxPath $artifacts -OutPath "$PWD" -OutName submission
# Submit the app
# See https://github.com/microsoft/StoreBroker/blob/master/Documentation/USAGE.md#the-easy-way
Update-ApplicationSubmission `
-AppId ${{ secrets.MICROSOFT_STORE_PRODUCT_ID }} `
-SubmissionDataPath "submission.json" `
-PackagePath "submission.zip" `
-ReplacePackages `
-NoStatus `
-AutoCommit `
-Force

View File

@@ -27,7 +27,7 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '19'
node-version: 20
- name: Handle feature requests
run: node .github/actions/handle-feature-requests.js
env:

View File

@@ -30,7 +30,7 @@ jobs:
run: npm install netlify-cli@17.10.1 -g
- name: Build Actual
run: ./bin/package-browser
run: yarn build:browser
- name: Deploy to Netlify
id: netlify_deploy

View File

@@ -0,0 +1,78 @@
name: Publish npm packages
# # Npm packages are published for every new tag
on:
push:
tags:
- 'v*.*.*'
jobs:
build-and-pack:
runs-on: ubuntu-latest
name: Build and pack npm packages
steps:
- uses: actions/checkout@v4
- name: Set up environment
uses: ./.github/actions/setup
- name: Build Web
run: yarn build:server
- name: Pack the web and server packages
run: |
yarn workspace @actual-app/web pack --filename @actual-app/web.tgz
yarn workspace @actual-app/sync-server pack --filename @actual-app/sync-server.tgz
- name: Build API
run: yarn build:api
- name: Pack the api package
run: |
yarn workspace @actual-app/api pack --filename @actual-app/api.tgz
- name: Upload package artifacts
uses: actions/upload-artifact@v4
with:
name: npm-packages
path: |
packages/desktop-client/@actual-app/web.tgz
packages/sync-server/@actual-app/sync-server.tgz
packages/api/@actual-app/api.tgz
publish:
runs-on: ubuntu-latest
name: Publish npm packages
needs: build-and-pack
permissions:
contents: read
packages: write
steps:
- name: Download the artifacts
uses: actions/download-artifact@v4
with:
name: npm-packages
- name: Setup node and npm registry
uses: actions/setup-node@v4
with:
node-version: 20
registry-url: 'https://registry.npmjs.org'
- name: Publish Web
run: |
npm publish desktop-client/@actual-app/web.tgz --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Publish Sync-Server
run: |
npm publish sync-server/@actual-app/sync-server.tgz --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Publish API
run: |
npm publish api/@actual-app/api.tgz --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

View File

@@ -1,7 +1,7 @@
name: /update-vrt
on:
issue_comment:
types: [ created ]
types: [created]
permissions:
pull-requests: read
@@ -19,10 +19,10 @@ jobs:
github.event.issue.pull_request &&
contains(github.event.comment.body, '/update-vrt')
container:
image: mcr.microsoft.com/playwright:v1.41.1-jammy
image: mcr.microsoft.com/playwright:v1.52.0-jammy
steps:
- name: Get PR branch
# Until https://github.com/xt0rted/pull-request-comment-branch/issues/322 is resolved we use the forked version
# 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
@@ -31,6 +31,10 @@ jobs:
ref: ${{ steps.comment-branch.outputs.head_ref }}
- name: Set up environment
uses: ./.github/actions/setup
- name: Run VRT Tests on Desktop app
continue-on-error: true
run: |
xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24" -- yarn e2e:desktop --update-snapshots
- name: Wait for Netlify build to finish
id: netlify
env:
@@ -97,7 +101,7 @@ jobs:
with:
token: ${{ secrets.GITHUB_TOKEN }}
commentId: ${{ github.event.comment.id }}
reaction: "rocket"
reaction: 'rocket'
add-starting-reaction:
runs-on: ubuntu-latest
@@ -112,4 +116,4 @@ jobs:
with:
token: ${{ secrets.GITHUB_TOKEN }}
commentId: ${{ github.event.comment.id }}
reaction: "+1"
reaction: '+1'

7
.gitignore vendored
View File

@@ -3,6 +3,7 @@
!data/.gitkeep
/data2
Actual-*
!actual-server.js
**/xcuserdata/*
export-2020-01-10.csv
@@ -53,3 +54,9 @@ bundle.mobile.js.map
# build output
package.tgz
# Fly.io configuration
fly.toml
# TypeScript cache
build/

2
.nvmrc
View File

@@ -1 +1 @@
v18.16.0
v20/*

View File

@@ -1 +1,30 @@
sync_pb.*
packages/api/app/bundle.api.js
packages/api/app/stats.json
packages/api/dist
packages/api/@types
packages/api/migrations
packages/crdt/dist
packages/component-library/src/icons/**/*
packages/desktop-client/bundle.browser.js
packages/desktop-client/build/
packages/desktop-client/locale/
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/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/*
.yarn/*
.github/*
upcoming-release-notes/*

View File

@@ -0,0 +1,10 @@
diff --git a/methods/inflater.js b/methods/inflater.js
index 8769e66e82b25541aba80b1ac6429199c9a8179f..1d4402402f0e1aaf64062c1f004c3d6e6fe93e76 100644
--- a/methods/inflater.js
+++ b/methods/inflater.js
@@ -1,4 +1,4 @@
-const version = +(process.versions ? process.versions.node : "").split(".")[0] || 0;
+const version = +(process?.versions?.node ?? "").split(".")[0] || 0;
module.exports = function (/*Buffer*/ inbuf, /*number*/ expectedLength) {
var zlib = require("zlib");

File diff suppressed because one or more lines are too long

948
.yarn/releases/yarn-4.9.1.cjs vendored Executable file

File diff suppressed because one or more lines are too long

View File

@@ -6,4 +6,4 @@ enableTransparentWorkspaces: false
nodeLinker: node-modules
yarnPath: .yarn/releases/yarn-4.3.1.cjs
yarnPath: .yarn/releases/yarn-4.9.1.cjs

View File

@@ -5,7 +5,7 @@
# you are doing.
###################################################
FROM node:18-bullseye as dev
FROM node:20-bullseye as dev
RUN apt-get update -y && apt-get upgrade -y && apt-get install -y openssl
WORKDIR /app
CMD ["sh", "./bin/docker-start"]

View File

@@ -66,7 +66,11 @@ To add new feature requests, open a new Issue of the "Feature Request" type.
### Translation
Make Actual Budget accessible to more people by helping with the [Internationalization](https://actualbudget.org/docs/contributing/i18n/) of Actual. We are using a crowd sourcing tool to manage the translations, see our [Weblate Project](https://hosted.weblate.org/projects/actualbudget/). Weblate proudly supports open-source software projects through their [Libre plan](https://weblate.org/en/hosting/#libre).
Make Actual Budget accessible to more people by helping with the [Internationalization](https://actualbudget.org/docs/contributing/i18n/) of Actual. We are using a crowd sourcing tool to manage the translations, see our [Weblate Project](https://hosted.weblate.org/projects/actualbudget/). Weblate proudly supports open-source software projects through their [Libre plan](https://weblate.org/en/hosting/#libre).
<a href="https://hosted.weblate.org/engage/actualbudget/">
<img src="https://hosted.weblate.org/widget/actualbudget/actual/287x66-grey.png" alt="Translation status" />
</a>
## Repo Activity

View File

@@ -9,6 +9,7 @@ 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 checkout .
git pull
popd > /dev/null
packages/desktop-client/bin/remove-untranslated-languages

View File

@@ -6,8 +6,8 @@ RELEASE=""
CI=${CI:-false}
cd "$ROOT/.."
POSITIONAL=()
SKIP_EXE_BUILD=false
while [[ $# -gt 0 ]]; do
key="$1"
@@ -16,26 +16,19 @@ while [[ $# -gt 0 ]]; do
RELEASE="production"
shift
;;
--skip-exe-build)
SKIP_EXE_BUILD=true
shift
;;
*)
POSITIONAL+=("$1")
shift
;;
esac
done
set -- "${POSITIONAL[@]}"
if [ "$OSTYPE" == "msys" ]; then
if [ $CI != true ]; then
read -s -p "Windows certificate password: " -r CSC_KEY_PASSWORD
export CSC_KEY_PASSWORD
elif [ -n "$CIRCLE_TAG" ]; then
# We only want to run this on CircleCI as Github doesn't have the CSC_KEY_PASSWORD secret set.
certutil -f -p ${CSC_KEY_PASSWORD} -importPfx ~/windows-shift-reset-llc.p12
fi
fi
yarn workspace loot-core build:node
# Get translations
echo "Updating translations..."
if ! [ -d packages/desktop-client/locale ]; then
@@ -46,22 +39,34 @@ git pull
popd > /dev/null
packages/desktop-client/bin/remove-untranslated-languages
yarn workspace loot-core build:node
yarn workspace @actual-app/web build --mode=desktop # electron specific build
# required for running the sync-server server
yarn workspace loot-core build:browser
yarn workspace @actual-app/web build:browser
yarn workspace @actual-app/sync-server build
yarn workspace desktop-electron update-client
(
cd packages/desktop-electron;
yarn clean;
if [ "$RELEASE" == "production" ]; then
if [ -f ../../.secret-tokens ]; then
source ../../.secret-tokens
fi
yarn build
echo "\nCreated release"
if [ $SKIP_EXE_BUILD == true ]; then
echo "Building the dist"
yarn build:dist
echo "Skipping exe build"
else
SKIP_NOTARIZATION=true yarn build
if [ "$RELEASE" == "production" ]; then
if [ -f ../../.secret-tokens ]; then
source ../../.secret-tokens
fi
yarn build
echo "Created release"
else
SKIP_NOTARIZATION=true yarn build
fi
fi
)

View File

@@ -0,0 +1,182 @@
import { exec } from 'node:child_process';
import { existsSync, writeFile } from 'node:fs';
import { exit } from 'node:process';
import prompts from 'prompts';
async function run() {
const username = await execAsync(
// eslint-disable-next-line rulesdir/typography
"gh api user --jq '.login'",
'To avoid having to enter your username, consider installing the official GitHub CLI (https://github.com/cli/cli) and logging in with `gh auth login`.',
);
const activePr = await getActivePr(username);
if (activePr) {
console.log(
`Found potentially matching PR ${activePr.number}: ${activePr.title}`,
);
}
const prNumber = activePr?.number ?? (await getNextPrNumber());
const result = await prompts([
{
name: 'githubUsername',
message: 'Comma-separated GitHub username(s)',
type: 'text',
initial: username,
},
{
name: 'pullRequestNumber',
message: 'PR Number',
type: 'number',
initial: prNumber,
},
{
name: 'releaseNoteType',
message: 'Release Note Type',
type: 'select',
choices: [
{ title: '✨ Features', value: 'Features' },
{ title: '👍 Enhancements', value: 'Enhancements' },
{ title: '🐛 Bugfix', value: 'Bugfix' },
{ title: '⚙️ Maintenance', value: 'Maintenance' },
],
},
{
name: 'oneLineSummary',
message: 'Brief Summary',
type: 'text',
initial: activePr?.title,
},
]);
if (
!result.githubUsername ||
!result.oneLineSummary ||
!result.releaseNoteType
) {
console.log('All questions must be answered. Exiting');
exit(1);
}
const fileContents = getFileContents(
result.releaseNoteType,
result.githubUsername,
result.oneLineSummary,
);
const filepath = `./upcoming-release-notes/${prNumber}.md`;
if (existsSync(filepath)) {
const { confirm } = await prompts({
name: 'confirm',
type: 'confirm',
message: `This will overwrite the existing release note ${filepath} Are you sure?`,
});
if (!confirm) {
console.log('Exiting');
exit(1);
}
}
writeFile(filepath, fileContents, err => {
if (err) {
console.error('Failed to write release note file:', err);
exit(1);
} else {
console.log(
`Release note generated successfully: ./upcoming-release-notes/${prNumber}.md`,
);
}
});
}
// makes an attempt to find an existing open PR from <username>:<branch>
async function getActivePr(
username: string,
): Promise<{ number: number; title: string } | undefined> {
if (!username) {
return undefined;
}
const branchName = await execAsync('git rev-parse --abbrev-ref HEAD');
if (!branchName) {
return undefined;
}
const forkHead = `${username}:${branchName}`;
return getPrNumberFromHead(forkHead);
}
async function getPrNumberFromHead(
head: string,
): Promise<{ number: number; title: string } | undefined> {
try {
// head is a weird query parameter in this API call. If nothing matches, it
// will return as if the head query parameter doesn't exist. To get around
// this, we make the page size 2 and only return the number if the length.
const resp = await fetch(
'https://api.github.com/repos/actualbudget/actual/pulls?state=open&per_page=2&head=' +
head,
);
if (!resp.ok) {
console.warn('error fetching from github pulls api:', resp.status);
return undefined;
}
const ghResponse = await resp.json();
if (ghResponse?.length === 1) {
return ghResponse[0];
} else {
return undefined;
}
} catch (e) {
console.warn('error fetching from github pulls api:', e);
}
}
async function getNextPrNumber(): Promise<number> {
try {
const resp = await fetch(
'https://api.github.com/repos/actualbudget/actual/issues?state=all&per_page=1',
);
if (!resp.ok) {
throw new Error(`API responded with status: ${resp.status}`);
}
const ghResponse = await resp.json();
const latestPrNumber = ghResponse?.[0]?.number;
if (!latestPrNumber) {
console.error(
'Could not find latest issue number in GitHub API response',
ghResponse,
);
exit(1);
}
return latestPrNumber + 1;
} catch (error) {
console.error('Failed to fetch next PR number:', error);
exit(1);
}
}
function getFileContents(type: string, username: string, summary: string) {
return `---
category: ${type}
authors: [${username}]
---
${summary}
`;
}
// simple exec that fails silently and returns an empty string on failure
async function execAsync(cmd: string, errorLog?: string): Promise<string> {
return new Promise<string>(res => {
exec(cmd, (error, stdout) => {
if (error) {
console.log(errorLog);
res('');
} else {
res(stdout.trim());
}
});
});
}
run();

View File

@@ -28,5 +28,5 @@ echo "Running VRT tests with the following parameters:"
echo "E2E_START_URL: $E2E_START_URL"
echo "VRT_ARGS: $VRT_ARGS"
MSYS_NO_PATHCONV=1 docker run --rm --network host -v "$(pwd)":/work/ -w /work/ -it mcr.microsoft.com/playwright:v1.41.1-jammy /bin/bash \
MSYS_NO_PATHCONV=1 docker run --rm --network host -v "$(pwd)":/work/ -w /work/ -it mcr.microsoft.com/playwright:v1.52.0-jammy /bin/bash \
-c "E2E_START_URL=$E2E_START_URL yarn vrt $VRT_ARGS"

View File

@@ -15,4 +15,3 @@ services:
volumes:
- '.:/app'
restart: 'no'

View File

@@ -5,11 +5,11 @@ 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 pluginTypescriptPaths from 'eslint-plugin-typescript-paths';
import tsParser from '@typescript-eslint/parser';
@@ -85,15 +85,16 @@ const confusingBrowserGlobals = [
'top',
];
/** @type {import('eslint').Linter.Config[]} */
export default [
export default pluginTypescript.config(
{
ignores: [
'packages/api/app/bundle.api.js',
'packages/api/app/stats.json',
'packages/api/dist',
'packages/api/@types',
'packages/api/migrations',
'packages/crdt/dist',
'packages/component-library/src/icons/**/*',
'packages/desktop-client/bundle.browser.js',
'packages/desktop-client/build/',
'packages/desktop-client/build-electron/',
@@ -102,7 +103,6 @@ export default [
'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/',
@@ -117,6 +117,26 @@ export default [
'.github/*',
],
},
{
// Temporary until the sync-server is migrated to TypeScript
files: [
'packages/sync-server/**/*.spec.{js,jsx}',
'packages/sync-server/**/*.test.{js,jsx}',
],
languageOptions: {
globals: {
vi: true,
describe: true,
expect: true,
it: true,
beforeAll: true,
beforeEach: true,
afterAll: true,
afterEach: true,
test: true,
},
},
},
{
linterOptions: {
reportUnusedDisableDirectives: true,
@@ -125,7 +145,6 @@ export default [
globals: {
...globals.browser,
...globals.commonjs,
...globals.jest,
...globals.node,
globalThis: false,
vi: true,
@@ -145,14 +164,14 @@ export default [
},
pluginReact.configs.flat.recommended,
pluginReact.configs.flat['jsx-runtime'],
pluginPrettier,
...pluginTypescript.configs.recommended,
pluginTypescript.configs.recommended,
pluginImport.flatConfigs.recommended,
{
plugins: {
'react-hooks': pluginReactHooks,
'jsx-a11y': pluginJSXA11y,
rulesdir: pluginRulesDir,
'typescript-paths': pluginTypescriptPaths,
},
},
{
@@ -521,7 +540,7 @@ export default [
},
},
{
files: ['**/*.ts?(x)'],
files: ['**/*.{ts,tsx}'],
languageOptions: {
parser: tsParser,
@@ -529,7 +548,7 @@ export default [
sourceType: 'module',
parserOptions: {
project: [path.join(__dirname, './tsconfig.json')],
projectService: true,
ecmaFeatures: {
jsx: true,
},
@@ -549,6 +568,13 @@ export default [
// 'tsc' already handles this (https://github.com/typescript-eslint/typescript-eslint/issues/477)
'no-undef': 'off',
// TypeScript already handles these (https://typescript-eslint.io/troubleshooting/typed-linting/performance/#eslint-plugin-import)
'import/named': 'off',
'import/namespace': 'off',
'import/default': 'off',
'import/no-named-as-default-member': 'off',
'import/no-unresolved': 'off',
// Add TypeScript specific rules (and turn off ESLint equivalents)
'@typescript-eslint/consistent-type-assertions': 'warn',
'no-array-constructor': 'off',
@@ -582,6 +608,16 @@ export default [
'@typescript-eslint/no-useless-constructor': 'warn',
},
},
{
files: ['packages/desktop-client/**/*.{js,ts,jsx,tsx}'],
rules: {
'typescript-paths/absolute-parent-import': [
'error',
{ preferPathOverBaseUrl: true },
],
'typescript-paths/absolute-import': ['error', { enableAlias: false }],
},
},
{
files: [
'packages/desktop-client/**/*.{ts,tsx}',
@@ -746,6 +782,16 @@ export default [
'import/no-unresolved': 'off',
},
},
// Allow configuring vitest with default exports (recommended as per vitest docs)
{
files: ['**/vitest.config.ts', '**/vitest.web.config.ts'],
rules: {
'import/no-anonymous-default-export': 'off',
'import/no-default-export': 'off',
},
},
{},
{
// TODO: fix the issues in these files
@@ -789,21 +835,6 @@ export default [
'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: {
@@ -852,4 +883,4 @@ export default [
'@typescript-eslint/no-unused-vars': 'off',
},
},
];
);

View File

@@ -22,65 +22,79 @@
"start:server": "yarn workspace @actual-app/sync-server start",
"start:server-monitor": "yarn workspace @actual-app/sync-server start-monitor",
"start:server-dev": "NODE_ENV=development BROWSER_OPEN=localhost:5006 yarn npm-run-all --parallel 'start:server-monitor' 'start'",
"start:desktop": "yarn rebuild-electron && npm-run-all --parallel 'start:desktop-*'",
"start:desktop": "yarn desktop-dependencies && npm-run-all --parallel 'start:desktop-*'",
"desktop-dependencies": "yarn rebuild-electron && yarn workspace loot-core build:browser",
"start:desktop-node": "yarn workspace loot-core watch:node",
"start:desktop-client": "yarn workspace @actual-app/web watch",
"start:desktop-server-client": "yarn workspace @actual-app/web build:browser",
"start:desktop-electron": "yarn workspace desktop-electron watch",
"start:electron": "yarn start:desktop",
"start:browser": "npm-run-all --parallel 'start:browser-*'",
"start:browser-backend": "yarn workspace loot-core watch:browser",
"start:browser-frontend": "yarn workspace @actual-app/web start:browser",
"build:server": "yarn build:browser && yarn workspace @actual-app/sync-server build",
"build:browser": "./bin/package-browser",
"build:desktop": "./bin/package-electron",
"build:api": "yarn workspace @actual-app/api build",
"generate:i18n": "yarn workspace @actual-app/web generate:i18n",
"generate:release-notes": "ts-node ./bin/release-note-generator.ts",
"test": "yarn workspaces foreach --all --parallel --verbose run test",
"test:debug": "yarn workspaces foreach --all --verbose run test",
"e2e": "yarn workspaces foreach --all --parallel --verbose run e2e",
"e2e": "yarn workspaces foreach --all --exclude desktop-electron --parallel --verbose run e2e",
"e2e:desktop": "yarn build:desktop --skip-exe-build && yarn workspace desktop-electron e2e",
"vrt": "yarn workspaces foreach --all --parallel --verbose run vrt",
"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",
"lint:verbose": "DEBUG=eslint:cli-engine eslint . --max-warnings 0",
"lint": "prettier --check . && eslint . --max-warnings 0",
"lint:fix": "prettier --check --write . && eslint . --max-warnings 0 --fix",
"install:server": "yarn workspaces focus @actual-app/sync-server --production",
"typecheck": "yarn tsc && tsc-strict",
"typecheck": "yarn tsc --incremental && tsc-strict",
"jq": "./node_modules/node-jq/bin/jq",
"prepare": "husky"
},
"devDependencies": {
"@typescript-eslint/parser": "^8.18.1",
"@types/node": "^22.15.18",
"@types/prompts": "^2.4.9",
"@typescript-eslint/parser": "^8.32.1",
"cross-env": "^7.0.3",
"eslint": "^9.17.0",
"eslint-config-prettier": "^9.1.0",
"eslint-import-resolver-typescript": "^3.7.0",
"eslint": "^9.27.0",
"eslint-config-prettier": "^10.1.5",
"eslint-import-resolver-typescript": "^4.3.5",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-prettier": "5.2.1",
"eslint-plugin-react": "^7.37.2",
"eslint-plugin-react-hooks": "^5.1.0",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^5.2.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",
"eslint-plugin-typescript-paths": "^0.0.33",
"globals": "^15.15.0",
"html-to-image": "^1.11.13",
"husky": "^9.1.7",
"lint-staged": "^15.5.2",
"node-jq": "^6.0.1",
"npm-run-all": "^4.1.5",
"prettier": "^3.4.2",
"prettier": "^3.5.3",
"prompts": "^2.4.2",
"source-map-support": "^0.5.21",
"typescript": "^5.5.4",
"typescript-eslint": "^8.18.1",
"ts-node": "^10.9.2",
"typescript": "^5.8.3",
"typescript-eslint": "^8.32.1",
"typescript-strict-plugin": "^2.4.4"
},
"resolutions": {
"rollup": "4.9.4"
"rollup": "4.40.1",
"socks": ">=2.8.3"
},
"engines": {
"node": ">=18.0.0"
"node": ">=20",
"yarn": "^4.9.1"
},
"lint-staged": {
"*.{js,jsx,ts,tsx,md,json}": "prettier --write"
"*.{js,jsx,ts,tsx,md,json,yml}": [
"eslint --fix",
"prettier --write"
]
},
"packageManager": "yarn@4.3.1",
"packageManager": "yarn@4.9.1",
"browserslist": [
"electron 24.0",
"defaults"

View File

@@ -1,7 +1,7 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
exports[`API setup and teardown successfully loads budget 1`] = `
Array [
exports[`API setup and teardown > successfully loads budget 1`] = `
[
"2016-10",
"2016-11",
"2016-12",

View File

@@ -1,24 +0,0 @@
module.exports = {
moduleFileExtensions: [
'testing.js',
'testing.ts',
'api.js',
'api.ts',
'api.tsx',
'electron.js',
'electron.ts',
'mjs',
'js',
'ts',
'tsx',
'json',
],
testEnvironment: 'node',
testPathIgnorePatterns: ['/node_modules/'],
watchPathIgnorePatterns: ['<rootDir>/mocks/budgets/'],
setupFilesAfterEnv: ['<rootDir>/../loot-core/src/mocks/setup.ts'],
transformIgnorePatterns: ['/node_modules/'],
transform: {
'^.+\\.(t|j)sx?$': '@swc/jest',
},
};

View File

@@ -6,10 +6,9 @@ import * as api from './index';
const budgetName = 'test-budget';
beforeEach(async () => {
// we need real datetime if we are going to mix new timestamps with our mock data
global.restoreDateNow();
global.IS_TESTING = true;
beforeEach(async () => {
const budgetPath = path.join(__dirname, '/mocks/budgets/', budgetName);
await fs.rm(budgetPath, { force: true, recursive: true });
@@ -654,4 +653,60 @@ describe('API CRUD operations', () => {
);
expect(transactions).toHaveLength(1);
});
test('Transactions: import notes are preserved when importing', async () => {
const accountId = await api.createAccount({ name: 'test-account' }, 0);
// Test with notes
const transactionsWithNotes = [
{
date: '2023-11-03',
imported_id: '11',
amount: 100,
notes: 'test note',
},
];
const addResultWithNotes = await api.addTransactions(
accountId,
transactionsWithNotes,
{
learnCategories: true,
runTransfers: true,
},
);
expect(addResultWithNotes).toBe('ok');
let transactions = await api.getTransactions(
accountId,
'2023-11-01',
'2023-11-30',
);
expect(transactions[0].notes).toBe('test note');
// Clear transactions
await api.deleteTransaction(transactions[0].id);
// Test without notes
const transactionsWithoutNotes = [
{ date: '2023-11-03', imported_id: '11', amount: 100, notes: null },
];
const addResultWithoutNotes = await api.addTransactions(
accountId,
transactionsWithoutNotes,
{
learnCategories: true,
runTransfers: true,
},
);
expect(addResultWithoutNotes).toBe('ok');
transactions = await api.getTransactions(
accountId,
'2023-11-01',
'2023-11-30',
);
expect(transactions[0].notes).toBeNull();
});
});

View File

@@ -52,10 +52,18 @@ export async function batchBudgetUpdates(func) {
}
}
/**
* @deprecated Please use `aqlQuery` instead.
* This function will be removed in a future release.
*/
export function runQuery(query) {
return send('api/query', { query: query.serialize() });
}
export function aqlQuery(query) {
return send('api/query', { query: query.serialize() });
}
export function getBudgetMonths() {
return send('api/budget-months');
}

View File

@@ -1,10 +1,10 @@
{
"name": "@actual-app/api",
"version": "25.2.1",
"version": "25.6.1",
"license": "MIT",
"description": "An API for Actual",
"engines": {
"node": ">=18.12.0"
"node": ">=20"
},
"main": "dist/index.js",
"types": "@types/index.d.ts",
@@ -14,27 +14,25 @@
],
"scripts": {
"build:app": "yarn workspace loot-core build:api",
"build:crdt": "yarn workspace @actual-app/crdt build",
"build:node": "tsc --p tsconfig.dist.json && tsc-alias -p tsconfig.dist.json",
"build:migrations": "cp migrations/*.sql dist/migrations",
"build:default-db": "cp default-db.sqlite dist/",
"build": "yarn run clean && yarn run build:app && yarn run build:node && yarn run build:migrations && yarn run build:default-db",
"test": "yarn run build:app && jest -c jest.config.js",
"test": "yarn run build:app && yarn run build:crdt && vitest",
"clean": "rm -rf dist @types"
},
"dependencies": {
"@actual-app/crdt": "workspace:^",
"better-sqlite3": "^11.7.0",
"compare-versions": "^6.1.0",
"better-sqlite3": "^11.10.0",
"compare-versions": "^6.1.1",
"node-fetch": "^3.3.2",
"uuid": "^9.0.1"
},
"devDependencies": {
"@swc/core": "^1.5.3",
"@swc/jest": "^0.2.36",
"@types/jest": "^27.5.2",
"@types/uuid": "^9.0.2",
"jest": "^27.5.1",
"tsc-alias": "^1.8.8",
"typescript": "^5.5.4"
"@types/uuid": "^9.0.8",
"tsc-alias": "^1.8.16",
"typescript": "^5.8.3",
"vitest": "^3.1.3"
}
}

View File

@@ -15,5 +15,5 @@
}
},
"include": ["."],
"exclude": ["**/node_modules/*", "dist", "@types"]
"exclude": ["**/node_modules/*", "dist", "@types", "*.test.ts"]
}

View File

@@ -0,0 +1,9 @@
export default {
test: {
globals: true,
onConsoleLog(log: string, type: 'stdout' | 'stderr'): boolean | void {
// print only console.error
return type === 'stderr';
},
},
};

View File

@@ -3,18 +3,29 @@
"version": "0.0.1",
"license": "MIT",
"peerDependencies": {
"react": ">=18.2"
"react": ">=18.2",
"react-dom": ">=18.2"
},
"dependencies": {
"@emotion/css": "^11.13.4",
"react-aria-components": "^1.4.1"
"@emotion/css": "^11.13.5",
"react-aria-components": "^1.8.0",
"usehooks-ts": "^3.1.1"
},
"devDependencies": {
"@types/react": "^18.2.0",
"react": "18.2.0"
"@svgr/cli": "^8.1.0",
"@types/react": "^19.1.4",
"react": "19.1.0",
"react-dom": "19.1.0",
"vitest": "^3.1.3"
},
"exports": {
"./icons/*": "./src/icons/*.tsx",
"./hooks/*": "./src/hooks/*.ts",
"./icons/logo": "./src/icons/logo/index.ts",
"./icons/v0": "./src/icons/v0/index.ts",
"./icons/v1": "./src/icons/v1/index.ts",
"./icons/v2": "./src/icons/v2/index.ts",
"./icons/AnimatedLoading": "./src/icons/AnimatedLoading.tsx",
"./icons/Loading": "./src/icons/Loading.tsx",
"./aligned-text": "./src/AlignedText.tsx",
"./block": "./src/Block.tsx",
"./button": "./src/Button.tsx",
@@ -22,10 +33,12 @@
"./form-error": "./src/FormError.tsx",
"./initial-focus": "./src/InitialFocus.ts",
"./inline-field": "./src/InlineField.tsx",
"./input": "./src/Input.tsx",
"./label": "./src/Label.tsx",
"./menu": "./src/Menu.tsx",
"./paragraph": "./src/Paragraph.tsx",
"./popover": "./src/Popover.tsx",
"./select": "./src/Select.tsx",
"./space-between": "./src/SpaceBetween.tsx",
"./stack": "./src/Stack.tsx",
"./styles": "./src/styles.ts",
@@ -36,5 +49,10 @@
"./toggle": "./src/Toggle.tsx",
"./tooltip": "./src/Tooltip.tsx",
"./view": "./src/View.tsx"
},
"scripts": {
"generate:icons": "rm src/icons/*/*.tsx; cd src/icons && svgr --template template.ts --index-template index-template.ts --typescript --expand-props start -d . .",
"test": "npm-run-all -cp 'test:*'",
"test:web": "ENV=web vitest -c vitest.web.config.ts"
}
}

View File

@@ -7,7 +7,7 @@ import React, {
} from 'react';
import { Button as ReactAriaButton } from 'react-aria-components';
import { css } from '@emotion/css';
import { css, cx } from '@emotion/css';
import { AnimatedLoading } from './icons/AnimatedLoading';
import { styles } from './styles';
@@ -145,26 +145,24 @@ export const Button = forwardRef<HTMLButtonElement, ButtonProps>(
const defaultButtonClassName: string = useMemo(
() =>
String(
css({
alignItems: 'center',
justifyContent: 'center',
flexShrink: 0,
padding: _getPadding(variant),
margin: 0,
overflow: 'hidden',
display: 'flex',
borderRadius: 4,
backgroundColor: backgroundColor[variantWithDisabled],
border: _getBorder(variant, variantWithDisabled),
color: textColor[variantWithDisabled],
transition: 'box-shadow .25s',
WebkitAppRegion: 'no-drag',
...styles.smallText,
'&[data-hovered]': _getHoveredStyles(variant),
'&[data-pressed]': _getActiveStyles(variant, bounce),
}),
),
css({
alignItems: 'center',
justifyContent: 'center',
flexShrink: 0,
padding: _getPadding(variant),
margin: 0,
overflow: 'hidden',
display: 'flex',
borderRadius: 4,
backgroundColor: backgroundColor[variantWithDisabled],
border: _getBorder(variant, variantWithDisabled),
color: textColor[variantWithDisabled],
transition: 'box-shadow .25s',
WebkitAppRegion: 'no-drag',
...styles.smallText,
'&[data-hovered]': _getHoveredStyles(variant),
'&[data-pressed]': _getActiveStyles(variant, bounce),
}),
[bounce, variant, variantWithDisabled],
);
@@ -176,9 +174,8 @@ export const Button = forwardRef<HTMLButtonElement, ButtonProps>(
{...restProps}
className={
typeof className === 'function'
? renderProps =>
`${defaultButtonClassName} ${className(renderProps)}`
: `${defaultButtonClassName} ${className || ''}`
? renderProps => cx(defaultButtonClassName, className(renderProps))
: cx(defaultButtonClassName, className)
}
>
{children}

View File

@@ -1,36 +1,59 @@
import {
type ReactElement,
type Ref,
Children,
cloneElement,
isValidElement,
type ReactElement,
Ref,
useEffect,
useRef,
} from 'react';
type InitialFocusProps = {
children:
| ReactElement<{ inputRef: Ref<HTMLInputElement> }>
| ((node: Ref<HTMLInputElement>) => ReactElement);
type InitialFocusProps<T extends HTMLElement> = {
/**
* The child element to focus when the component mounts. This can be either a single React element or a function that returns a React element.
*/
children: ReactElement<{ ref: Ref<T> }> | ((ref: Ref<T>) => ReactElement);
};
export function InitialFocus({ children }: InitialFocusProps) {
const node = useRef<HTMLInputElement>(null);
/**
* InitialFocus sets focus on its child element
* when it mounts.
* @param {Object} props - The component props.
* @param {ReactElement | function} props.children - A single React element or a function that returns a React element.
*/
export function InitialFocus<T extends HTMLElement = HTMLElement>({
children,
}: InitialFocusProps<T>) {
const ref = useRef<T | null>(null);
useEffect(() => {
if (node.current) {
if (ref.current) {
// This is needed to avoid a strange interaction with
// `ScopeTab`, which doesn't allow it to be focused at first for
// some reason. Need to look into it.
setTimeout(() => {
if (node.current) {
node.current.focus();
node.current.setSelectionRange(0, 10000);
if (ref.current) {
ref.current.focus();
if (
ref.current instanceof HTMLInputElement ||
ref.current instanceof HTMLTextAreaElement
) {
ref.current.setSelectionRange(0, 10000);
}
}
}, 0);
}
}, []);
if (typeof children === 'function') {
return children(node);
return children(ref);
}
return cloneElement(children, { inputRef: node });
const child = Children.only(children);
if (isValidElement(child)) {
return cloneElement(child, { ref });
}
throw new Error(
'InitialFocus expects a single valid React element as its child.',
);
}

View File

@@ -0,0 +1,117 @@
import * as React from 'react';
import { forwardRef, Ref } from 'react';
import { render } from '@testing-library/react';
import { InitialFocus } from './InitialFocus';
import { View } from './View';
describe('InitialFocus', () => {
it('should focus a text input', async () => {
const component = render(
<View>
<InitialFocus>
<input type="text" title="focused" />
</InitialFocus>
<input type="text" title="unfocused" />
</View>,
);
// This is needed bc of the `setTimeout` in the `InitialFocus` component.
await new Promise(resolve => setTimeout(resolve, 0));
const input = component.getByTitle('focused') as HTMLInputElement;
const unfocusedInput = component.getByTitle(
'unfocused',
) as HTMLInputElement;
expect(document.activeElement).toBe(input);
expect(document.activeElement).not.toBe(unfocusedInput);
});
it('should focus a textarea', async () => {
const component = render(
<View>
<InitialFocus>
<textarea title="focused" />
</InitialFocus>
<textarea title="unfocused" />
</View>,
);
// This is needed bc of the `setTimeout` in the `InitialFocus` component.
await new Promise(resolve => setTimeout(resolve, 0));
const textarea = component.getByTitle('focused') as HTMLTextAreaElement;
const unfocusedTextarea = component.getByTitle(
'unfocused',
) as HTMLTextAreaElement;
expect(document.activeElement).toBe(textarea);
expect(document.activeElement).not.toBe(unfocusedTextarea);
});
it('should select text in an input', async () => {
const component = render(
<View>
<InitialFocus>
<input type="text" title="focused" defaultValue="Hello World" />
</InitialFocus>
<input type="text" title="unfocused" />
</View>,
);
// This is needed bc of the `setTimeout` in the `InitialFocus` component.
await new Promise(resolve => setTimeout(resolve, 0));
const input = component.getByTitle('focused') as HTMLInputElement;
expect(document.activeElement).toBe(input);
expect(input.selectionStart).toBe(0);
expect(input.selectionEnd).toBe(11); // Length of "Hello World"
});
it('should focus a button', async () => {
const component = render(
<View>
<InitialFocus>
<button title="focused">Click me</button>
</InitialFocus>
<button title="unfocused">Do not click me</button>
</View>,
);
// This is needed bc of the `setTimeout` in the `InitialFocus` component.
await new Promise(resolve => setTimeout(resolve, 0));
const button = component.getByTitle('focused') as HTMLButtonElement;
const unfocusedButton = component.getByTitle(
'unfocused',
) as HTMLButtonElement;
expect(document.activeElement).toBe(button);
expect(document.activeElement).not.toBe(unfocusedButton);
});
it('should focus a custom component with ref forwarding', async () => {
const CustomInput = forwardRef<HTMLInputElement>((props, ref) => (
<input type="text" ref={ref} {...props} title="focused" />
));
CustomInput.displayName = 'CustomInput';
const component = render(
<View>
<InitialFocus>
{node => <CustomInput ref={node as Ref<HTMLInputElement>} />}
</InitialFocus>
<input type="text" title="unfocused" />
</View>,
);
// This is needed bc of the `setTimeout` in the `InitialFocus` component.
await new Promise(resolve => setTimeout(resolve, 0));
const input = component.getByTitle('focused') as HTMLInputElement;
const unfocusedInput = component.getByTitle(
'unfocused',
) as HTMLInputElement;
expect(document.activeElement).toBe(input);
expect(document.activeElement).not.toBe(unfocusedInput);
});
});

View File

@@ -0,0 +1,118 @@
import React, {
ChangeEvent,
ComponentPropsWithRef,
type KeyboardEvent,
type FocusEvent,
} from 'react';
import { Input as ReactAriaInput } from 'react-aria-components';
import { css, cx } from '@emotion/css';
import { useResponsive } from './hooks/useResponsive';
import { styles } from './styles';
import { theme } from './theme';
export const baseInputStyle = {
outline: 0,
backgroundColor: theme.tableBackground,
color: theme.formInputText,
margin: 0,
padding: 5,
borderRadius: 4,
border: '1px solid ' + theme.formInputBorder,
};
const defaultInputClassName = css({
...baseInputStyle,
color: theme.formInputText,
whiteSpace: 'nowrap',
overflow: 'hidden',
flexShrink: 0,
'&[data-focused]': {
border: '1px solid ' + theme.formInputBorderSelected,
boxShadow: '0 1px 1px ' + theme.formInputShadowSelected,
},
'&[data-disabled]': {
color: theme.formInputTextPlaceholder,
},
'::placeholder': { color: theme.formInputTextPlaceholder },
...styles.smallText,
});
export type InputProps = ComponentPropsWithRef<typeof ReactAriaInput> & {
onEnter?: (value: string, event: KeyboardEvent<HTMLInputElement>) => void;
onEscape?: (value: string, event: KeyboardEvent<HTMLInputElement>) => void;
onChangeValue?: (
newValue: string,
event: ChangeEvent<HTMLInputElement>,
) => void;
onUpdate?: (newValue: string, event: FocusEvent<HTMLInputElement>) => void;
};
export function Input({
ref,
onEnter,
onEscape,
onChangeValue,
onUpdate,
className,
...props
}: InputProps) {
return (
<ReactAriaInput
ref={ref}
className={
typeof className === 'function'
? renderProps => cx(defaultInputClassName, className(renderProps))
: cx(defaultInputClassName, className)
}
{...props}
onKeyUp={e => {
props.onKeyUp?.(e);
if (e.key === 'Enter' && onEnter) {
onEnter(e.currentTarget.value, e);
}
if (e.key === 'Escape' && onEscape) {
onEscape(e.currentTarget.value, e);
}
}}
onBlur={e => {
onUpdate?.(e.currentTarget.value, e);
props.onBlur?.(e);
}}
onChange={e => {
onChangeValue?.(e.currentTarget.value, e);
props.onChange?.(e);
}}
/>
);
}
const defaultBigInputClassName = css({
padding: 10,
fontSize: 15,
border: 'none',
...styles.shadow,
'&[data-focused]': { border: 'none', ...styles.shadow },
});
export function BigInput({ className, ...props }: InputProps) {
return (
<Input
{...props}
className={
typeof className === 'function'
? renderProps => cx(defaultBigInputClassName, className(renderProps))
: cx(defaultBigInputClassName, className)
}
/>
);
}
export function ResponsiveInput(props: InputProps) {
const { isNarrowWidth } = useResponsive();
return isNarrowWidth ? <BigInput {...props} /> : <Input {...props} />;
}

View File

@@ -3,11 +3,13 @@ import {
useEffect,
useRef,
useState,
type ComponentProps,
type ComponentType,
type SVGProps,
type CSSProperties,
} from 'react';
import { Button } from './Button';
import { Text } from './Text';
import { theme } from './theme';
import { Toggle } from './Toggle';
@@ -61,6 +63,7 @@ type MenuProps<NameType> = {
style?: CSSProperties;
className?: string;
getItemStyle?: (item: MenuItemObject<NameType>) => CSSProperties;
slot?: ComponentProps<typeof Button>['slot'];
};
export function Menu<const NameType = string>({
@@ -71,6 +74,7 @@ export function Menu<const NameType = string>({
style,
className,
getItemStyle,
slot,
}: MenuProps<NameType>) {
const elRef = useRef<HTMLDivElement>(null);
const items = allItems.filter(x => x);
@@ -161,9 +165,10 @@ export function Menu<const NameType = string>({
const Icon = item.icon;
return (
<View
role="button"
<Button
key={String(item.name)}
variant="bare"
slot={slot}
style={{
cursor: 'default',
padding: 10,
@@ -179,11 +184,9 @@ export function Menu<const NameType = string>({
}),
...(!isLabel(item) && getItemStyle?.(item)),
}}
onPointerEnter={() => setHoveredIndex(idx)}
onPointerLeave={() => setHoveredIndex(null)}
onPointerUp={e => {
e.stopPropagation();
onHoverStart={() => setHoveredIndex(idx)}
onHoverEnd={() => setHoveredIndex(null)}
onPress={() => {
if (
!item.disabled &&
item.toggle === undefined &&
@@ -232,7 +235,7 @@ export function Menu<const NameType = string>({
</View>
)}
{item.key && <Keybinding keyName={item.key} />}
</View>
</Button>
);
})}
{footer}

View File

@@ -1,11 +1,10 @@
import { useRef, useState, type CSSProperties } from 'react';
import { Button } from '@actual-app/components/button';
import { Menu } from '@actual-app/components/menu';
import { Popover } from '@actual-app/components/popover';
import { View } from '@actual-app/components/view';
import { SvgExpandArrow } from '../../icons/v0';
import { Button } from './Button';
import { SvgExpandArrow } from './icons/v0';
import { Menu } from './Menu';
import { Popover } from './Popover';
import { View } from './View';
function isValueOption<Value>(
option: readonly [Value, string] | typeof Menu.line,

View File

@@ -21,7 +21,14 @@ function getChildren(key, children) {
'type' in child &&
child.type === Fragment
) {
return list.concat(getChildren(child.key, child.props.children));
return list.concat(
getChildren(
child.key,
typeof child.props === 'object' && 'children' in child.props
? child.props.children
: [],
),
);
}
list.push({ key: key + child['key'], child });
return list;

View File

@@ -26,7 +26,7 @@ export const Tooltip = ({
const triggerRef = useRef(null);
const [isHovered, setIsHover] = useState(false);
const hoverTimeoutRef = useRef<ReturnType<typeof setTimeout>>();
const hoverTimeoutRef = useRef<ReturnType<typeof setTimeout>>(null);
const handlePointerEnter = useCallback(() => {
const timeout = setTimeout(() => {

View File

@@ -0,0 +1,23 @@
import { useWindowSize } from 'usehooks-ts';
import { breakpoints } from '../tokens';
export function useResponsive() {
const { height, width } = useWindowSize({
debounceDelay: 250,
});
// Possible view modes: narrow, small, medium, wide
// To check if we're at least small width, check !isNarrowWidth
return {
// atLeastMediumWidth is provided to avoid checking (isMediumWidth || isWideWidth)
atLeastMediumWidth: width >= breakpoints.medium,
isNarrowWidth: width < breakpoints.small,
isSmallWidth: width >= breakpoints.small && width < breakpoints.medium,
isMediumWidth: width >= breakpoints.medium && width < breakpoints.wide,
// No atLeastWideWidth because that's identical to isWideWidth
isWideWidth: width >= breakpoints.wide,
height,
width,
};
}

View File

@@ -6,8 +6,8 @@ function indexTemplate(filePaths) {
const basename = path.basename(filePath, path.extname(filePath));
const exportName = `Svg${basename}`;
return `export { ${exportName} } from './${basename}'`;
})
});
return exportEntries.join('\n');
}
module.exports = indexTemplate
module.exports = indexTemplate;

View File

Before

Width:  |  Height:  |  Size: 1006 B

After

Width:  |  Height:  |  Size: 1006 B

View File

@@ -1,5 +1,5 @@
// @ts-strict-ignore
const template = ({ imports, interfaces, componentName, props, jsx }, { tpl }) => {
const tmpl = ({ imports, interfaces, componentName, props, jsx }, { tpl }) => {
return tpl`
${imports};
@@ -8,7 +8,7 @@ ${interfaces};
export const ${componentName} = (${props}) => (
${jsx}
);
`
}
`;
};
module.exports = template
module.exports = tmpl;

View File

Before

Width:  |  Height:  |  Size: 601 B

After

Width:  |  Height:  |  Size: 601 B

View File

Before

Width:  |  Height:  |  Size: 462 B

After

Width:  |  Height:  |  Size: 462 B

View File

Before

Width:  |  Height:  |  Size: 817 B

After

Width:  |  Height:  |  Size: 817 B

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 379 B

After

Width:  |  Height:  |  Size: 379 B

View File

Before

Width:  |  Height:  |  Size: 1005 B

After

Width:  |  Height:  |  Size: 1005 B

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

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