Compare commits

...

536 Commits

Author SHA1 Message Date
Joel Jeremy Marquez
2044580642 Notes tag autocomplete 2024-05-01 14:45:29 -07:00
Joel Jeremy Marquez
01a2f0665e VRT 2024-04-30 07:23:09 -07:00
Joel Jeremy Marquez
12b5e0ac7c Revert pill colors 2024-04-29 15:42:38 -07:00
Joel Jeremy Marquez
060716b53c Fix overlapping UI 2024-04-29 15:17:50 -07:00
Joel Jeremy Marquez
6f1b66f9dc Append note tag filters 2024-04-29 15:12:11 -07:00
Joel Jeremy Marquez
eea961a20d Cleanup style 2024-04-27 14:23:04 -07:00
Joel Jeremy Marquez
5da0f86384 Remove font weight 2024-04-27 14:23:04 -07:00
Joel Jeremy Marquez
176a4782a1 Rename variables 2024-04-27 14:23:04 -07:00
Joel Jeremy Marquez
2ece4d35a7 Fix filtering 2024-04-27 14:23:04 -07:00
Joel Jeremy Marquez
fe2166207b Update colors 2024-04-27 14:23:04 -07:00
Joel Jeremy Marquez
849a43d9ce Fix tests - extract the handler to higher level component 2024-04-27 14:23:04 -07:00
Joel Jeremy Marquez
30d4ca9ac6 Release notes 2024-04-27 14:23:04 -07:00
Joel Jeremy Marquez
f49c7f516e Format notes as clickable tags 2024-04-27 14:23:03 -07:00
kyangk
176c8466a4 Ignore transactions with empty date & amount (#2653) 2024-04-27 21:26:12 +01:00
Matiss Janis Aboltins
703c319f7f ♻️ hide theme selector in prod (#2671) 2024-04-27 21:25:45 +01:00
Matt Fiddaman
ca8a8174c4 Fix menuItemTextHeader contrast in dark mode (#2638)
* Fix menuItemTextHeader contrast in dark mode

* release note

* darken menu background and change accent colour to purple in dark theme

* change menu keybind accept colour to purple in midnight theme

* update release note

* fix menuBorder colour
2024-04-27 09:29:47 -07:00
Joel Jeremy Marquez
f8af8f95ac Fix loading screen not showing when opening a budget file (#2663)
* Fix app loading screen

* Release note

* Code review feedback
2024-04-26 14:03:01 -07:00
youngcw
98a7aac736 add schedule name check to check templates (#2667)
* check schedule name

* note
2024-04-26 06:57:52 -07:00
Neil
d49f907f53 Custom Reports Adjustments (#2659)
* monthly Spending

* Add Average

* notes

* title

* date filter

* TS fixes and hide average when no data

* fix average tooltip and relabel x-axis

* Wording/verbiage

* remove spending files

* adjustments

* reports.d revert

* revert filter changes

* adjust update filters

* notes

* remove old notes

* adjust style

* lint fixes
2024-04-26 08:59:16 +01:00
Joel Jeremy Marquez
164dd399b0 [Mobile] Add amount colors to mobile accounts and transaction list (#2665)
* Add amount colors to mobile transaction list

* Release notes

* Fix lint error

* Add amount colors to mobile accounts page

* VRT updates
2024-04-25 19:30:26 -07:00
Matiss Janis Aboltins
f41d3f22c7 improving error handling for lazy-loading (#2657) 2024-04-25 19:31:04 +01:00
Neil
469c789c14 Mobile reports (#2624)
* mobile reports

* notes

* header updates

* hide tooltip in mobile view

* visual updates

* padding changes

* VRT

* bottom padding

* merge fixes

* VRT

* unselectable

* merge fixes
2024-04-24 16:08:02 +01:00
Wizmaster
6ec3728280 Fix reconciling split translations from nYNAB import creates orphan transfers (#2502)
* Reconciling split translations from nYNAB import creates orphan transfers
- Fixed link between subtransaction transfers and transaction transfers
- Reworked payee transaction and subtransaction import

* Reconciling split translations from nYNAB import creates orphan transfers
- Added release note

* Reconciling split translations from nYNAB import creates orphan transfers
- Reworkd data.transactions and data.subtransactions loops

* Reconciling split translations from nYNAB import creates orphan transfers
- Added comments

---------

Co-authored-by: DJ Mountney <david@twkie.net>
2024-04-23 18:16:33 -07:00
DJ Mountney
c8cc479358 Fix for electron builds (#2658)
* Test a fix for electron builds

* Add release note
2024-04-23 17:50:41 -07:00
Matt Fiddaman
51ad488ce2 Make /login show descriptive error when an incorrect password is submitted (#2641) 2024-04-23 17:21:10 +01:00
Neil
985411d48f Custom Reports: Line show activity (#2636)
* StackedBar Activity

* LineGraph and some session updates

* notes

* table graphs

* Revert "table graphs"

This reverts commit 69b5a44126.

* Revert stackedBar

* add filters

* revert

* notes

* lint fix

* visual updates
2024-04-22 20:28:00 +01:00
Joel Jeremy Marquez
53b5f3a0fc Consistent modal paddings (#2571)
* Update autocomplete types

* Remote optional type

* Improve SingleInputModal

* Fix lint error

* Update modal paddings

* Release notes

* Update release notes

* Update default Modal padding and style

* VRT update

* VRT

* VRT
2024-04-22 10:50:29 -07:00
Joel Jeremy Marquez
3ec4ef71c6 [Mobile] Update mobile labels to be sentence case + add labels to mobile budget and balance modals (#2627)
* Mobile UI updates

* Release notes

* VRT updates

* Midnight VRT
2024-04-22 08:41:16 -07:00
Joel Jeremy Marquez
5df02c19dc [Mobile] Add To Be Budgeted category to cover and transfer modal (#2635)
* Add To Be Budgeted category to cover and transfer modal

* Release notes

* Fix To Be Budgeted input selection

* Fix typecheck error

* Fix duplicate modals in firefox

* Fix lint error
2024-04-22 08:39:01 -07:00
Stefan Hall
464c9de6fb Add VRT test for validating that split transaction rules work as expected (#2604)
* Add UI test for validating that split transaction rules work as expected

* Apply suggestions from code review

Renames split-transactions-add to add-split-transactions

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

* Define id for finding splitactions on the page wher its used

---------

Co-authored-by: Joel Jeremy Marquez <joeljeremy.marquez@gmail.com>
2024-04-22 08:15:43 -07:00
Matiss Janis Aboltins
aad609f427 added loading descriptions and lazy-loaded module retries (#2639) 2024-04-22 08:05:27 +01:00
Joel Jeremy Marquez
7313cf722d [Maintenance] Add midnight theme VRT screenshots (#2619)
* Add midnight theme VRT screenshots

* Release notes

* Midnight VRT screenshots

* Update packages/desktop-client/playwright.config.js

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

* VRT

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
2024-04-21 21:49:03 -07:00
Joel Jeremy Marquez
978a658c1e [Mobile] Fix encryption modals for mobile (#2633)
* Fix encryption modals for mobile

* Release notes
2024-04-21 21:48:44 -07:00
Julian Dominguez-Schatz
cdad43ff32 Improve 'Before split' section in rule splits (#2651)
* Copy category from parent transaction when splitting

* Rename 'Before split' -> 'Apply to all'

* Add release notes

* Update tests to reflect change
2024-04-21 15:00:19 -07:00
Neil
4c29afd424 Custom Reports update TS issues (#2637)
* update TS issues

* notes

* review fixes

* revert

* add parseInt

* fix getLiveRange
2024-04-21 20:46:25 +01:00
Neil
c98a21b030 Custom Reports StackedBar show activity (#2606)
* StackedBar Activity

* LineGraph and some session updates

* notes

* table graphs

* Revert "table graphs"

This reverts commit 69b5a44126.

* revert Line

* notes update

* adust session code and add filters

* review fixes
2024-04-21 18:26:32 +01:00
Matiss Janis Aboltins
f5fde34952 🐛 fix budget-type identification when deleting files (#2649) 2024-04-20 22:36:22 +01:00
youngcw
59f854c075 fix superfluous tooltip scrollbars fixes #2621 (#2650)
* fix tooltips with scrollbars

* note
2024-04-20 14:32:43 -07:00
Joel Jeremy Marquez
85affae70f [Maintenance] Fix slow/flaky VRT test (#2634)
* Reduce iterations on schedule test

* Release notes

* Set longer timeout
2024-04-19 14:06:21 -07:00
Adam
57d4cc57cd [Maintenance] Organize .gitignore (#2623)
* Organize .gitignore

* Rename section in .gitignore

* Create 2623.md
2024-04-19 12:56:02 -07:00
youngcw
7d892d8164 Add assets to release (#2632)
* add flatpack to electron build

* note

* add to workflow

* try to fix workflow

* typos

* workflow

* work

* update

* add repo

* update other electron workflow

* stable doesn't work

* fix version

* add step

* note

* fix
2024-04-19 12:54:45 -07:00
youngcw
84fbc7e464 add flatpak to electron build list (#2617)
* add flatpack to electron build

* note

* add to workflow

* try to fix workflow

* typos

* workflow

* work

* update

* add repo

* update other electron workflow

* stable doesn't work

* fix version
2024-04-19 12:45:34 -07:00
Joel Jeremy Marquez
5f77b87b07 [Mobile] Add negative/positive colors to mobile transaction amount input (#2628)
* Add colors to mobile transaction amount input

* VRT updates

* Release notes
2024-04-18 21:03:38 -07:00
Neil
97ec8f8d3a Custom Reports: Add filters to sessionStorage (#2612)
* Add filters to sessionStorage

* notes

* setSessionReports util
2024-04-18 20:38:25 +01:00
Joel Jeremy Marquez
407ad4deee [Mobile] Budget month notes and budget action menu (#2610)
* Budget month menus

* Release notes

* Update vrt and fix lint

* Merge budget month modals into one modal

* Fix typecheck error

* VRT updates

* Update modal triggers

* VRT updates

* Adjust budget month modals size

* Fix lint error

* Remove excess padding

* Use modal padding prop
2024-04-18 10:36:23 -07:00
Matiss Janis Aboltins
1c04aeae39 🔥 stripping out plaid integration (#2616) 2024-04-18 18:31:28 +01:00
youngcw
02e7d036d5 rename electron master workflow (#2620)
* rename

* note
2024-04-17 13:18:21 -07:00
Joel Jeremy Marquez
16ef674910 [Mobile] Use decimal input mode for mobile modal amount fields (#2607)
* Use decimal input mode for mobile modal amount fields

* Release notes
2024-04-17 06:34:47 -07:00
Joel Jeremy Marquez
19bcfbe6e9 [Mobile] Collapsible budget groups (#2611)
* Mobile collapsible budget groups

* Release notes

* VRT updates

* No tap highlight when clicking collapse/uncollapse button

* Income group no tap highlight

* No highlight on hover
2024-04-16 13:26:23 -07:00
Adam
a2c1c2dea6 Change default theme from light to the system's default theme (#2544)
* Change Actual default theme to System Default

* Add release notes

* Update release notes

* update vrt

---------

Co-authored-by: youngcw <calebyoung94@gmail.com>
2024-04-16 13:14:20 -07:00
Joel Jeremy Marquez
e9b5bfcc53 [Mobile] Use budget start month pref on mobile to match desktop behavior (#2613)
* Use budget start month pref on mobile to match desktop behavior

* Release notes

* Fix failing tests
2024-04-16 13:06:53 -07:00
Joel Jeremy Marquez
672dd5ea4b [Mobile] Fix account notes not retrieving correctly in mobile (#2599)
* Fix account notes not retrieving correctly

* Release notes

* Update release notes

* Fix type errors
2024-04-16 13:06:26 -07:00
Joel Jeremy Marquez
b101f9989b Display balances in category autocomplete (#2551)
* Display balances in category autocomplete

* Release notes

* Fix typecheck error

* Update balance colors

* Show category balances in mobile

* Patch unit tests

* Darket midnight theme autocomplete hover color

* Category autocomplete split transaction highlight

* Update 2551.md

* Extract modals from EditField

* Fix failing tests

* Update variable names

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
2024-04-16 12:14:20 -07:00
Matiss Janis Aboltins
cf9b8c357e 🐛 (tooltip) add scrollbars to tooltips that go out of bounds (#2614) 2024-04-16 19:43:00 +01:00
Joel Jeremy Marquez
c71e1d2e8a [Maintenance] Add missing key prop to all modals (#2609)
* Add key prop to all modals

* Release notes
2024-04-16 10:36:07 -07:00
Mohamed El Mahdali
1e462714e4 fix(#2575): Stop cash flow card labels from getting cutting off if bar height is too low (#2597) 2024-04-16 18:27:13 +01:00
Neil
d9f55460dd Add daily and weekly to custom reports interval list (#2483)
* Button changes and time filters

* rename on dashboard

* notes

* fix time filters

* Sort Categories

* Page title

* category sort order

* move button

* featureflag

* Highlight report name

* sankey fix

* VRT

* remove doubled element

* adjust to match master

* add Year

* notes

* lint fix

* update names

* IntervalsUpdates

* fixing bugs

* ts updates

* lint fix

* merge fixes

* notes

* simplify lookups

* Add Daily and Weekly

* notes

* notes

* merge fix

* TS fix

* Change week start date based on user prefs

* fix weeks

* fix averages

* remove $week

* remove date-week

* TS fixes
2024-04-16 16:19:05 +01:00
Joel Jeremy Marquez
77a670bbc3 [Mobile] Scheduled transaction menu modal (#2608)
* Mobile scheduled transaction menu modal

* Release notes
2024-04-15 11:51:09 -07:00
Matiss Janis Aboltins
1a1fe9ac9d extra error handling in case backend failed loading (#2601)
*  extra error handling in case backend failed loading

* Release notes

* Rename some error vars
2024-04-15 07:39:57 +01:00
Matiss Janis Aboltins
16df116d1d ♻️ (tooltip) migration to react-aria (vol 2) (#2593) 2024-04-14 11:30:57 +02:00
Joel Jeremy Marquez
d7075ae551 Balance menu modal enhancement (#2598)
* Balance menu modal enhancement

* Release notes

* Fix typecheck error
2024-04-13 20:51:56 -07:00
Joel Jeremy Marquez
e500cba7e9 [Mobile] Category budget actions modal (#2501)
* Update autocomplete types

* Remote optional type

* Improve SingleInputModal

* Fix lint error

* Category budget modals

* Cleanup + release notes

* Cleanup

* Fix typecheck errors

* Update useMergedRefs

* Fix lint error

* Fix typecheck error

* VRT updates

* Focus amount on mount

* Fix errors

* Open modal on budget amount click

* Updates

* Remove unused props + updates

* Fix lint error

* Close budget menu modal on enter

* Delete comment

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

* Update release notes

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
2024-04-13 13:49:09 -07:00
Joel Jeremy Marquez
2d188b3941 [Mobile] Category activity/transactions page (#2531)
* Mobile category transactions

* Release notes

* Fix typo

* Fix typecheck error

* Handle null location state

* VRT

* Fix account search

* Update test

* Search placeholder

* vrt

* Add month to page title

* Cleanup

* Fix AccountName component

* Replace ButtonLink with Link

* Fix typecheck

* Code review update
2024-04-13 11:45:43 -07:00
Matt Fiddaman
e88ea69801 Force transaction cleared checkboxes to show on reconcile view (#2589)
* Force transaction cleared checkboxes on reconcile view

* Add release notes
2024-04-13 09:44:54 -07:00
Mohamed El Mahdali
9aeab0ff5b Hide Y axis values of net worth graph when privacy mode i… (#2594) 2024-04-13 12:50:35 +01:00
Neil
36c700d92d Custom Reports: Show Activity for donutGraph (#2583)
* Activate Click for donut

* notse
2024-04-13 10:30:38 +01:00
Michael Clark
eed6105222 Electron: Fix load backup functionality (#2580) 2024-04-12 21:28:55 +01:00
youngcw
291e3a8d14 Allow 5 decimal places in file import parser (#2588)
* allow specifically 5 decimal places in parser

* note

* update tests

* lint
2024-04-12 11:13:21 -07:00
Robert Dyer
edd34b7903 Dim categories hidden by their groups (#2582)
* Dim categories hidden by their groups

* Dim hidden cats on mobile view

* Do not show hide/show menu on mobile for categories in hidden groups

* Rename catGroup to categoryGroup

* Fix lint issue

* Hide menu line

* Pass in categoryGroup instead of isHidden

* avoid need for extra local

* fix lint issues
2024-04-12 10:56:46 -07:00
Attila Kerekes
345ea71eed Add option to disable reconciliation when importing CSV and files. (#2585) 2024-04-12 07:54:55 -07:00
Robert Dyer
d89a016ab1 Do not allow hiding income category group (#2581)
* Do not allow hiding income category group

* add release note

* rename file

* Migrate DB so income groups are not hidden

* Update migration to explicitly match on is_income = 1
2024-04-12 07:40:01 -07:00
Joel Jeremy Marquez
b87951855b [Maintenance] Remove left behind editableTitle prop (#2586)
* Remove left behind editableTitle prop

* Release notes
2024-04-11 14:53:49 -07:00
Joel Jeremy Marquez
70e37c0119 Use desktop colors for mobile autocomplete modals (#2577)
* Use desktop colors for mobile autocomplete modals

* Release notes

* Color updates

* Color updates

* Update close button

* Fix typecheck

* Rename to ModalCloseButton

* Update ModalTitle
2024-04-11 14:33:03 -07:00
Joel Jeremy Marquez
f55bd860ba [Mobile] Budget menu modals (#2491)
* Update autocomplete types

* Remote optional type

* Improve SingleInputModal

* Fix lint error

* Mobile budget page modals

* Release notes

* Fix typecheck / lint errors

* Fix typecheck errors

* Fix typecheck error

* Modal logo

* Fix typecheck error

* VRT updates

* Modal header margins

* Update 2491.md

* ModalTitle shrinkOnOverflow + VRT
2024-04-11 12:41:06 -07:00
DJ Mountney
0f960df8cf Improve api output types (#2567)
* Improve api output types

- Fixes some missing models
- Fixes some output path aliasing

* Add changelog
2024-04-11 07:36:48 -07:00
Attila Kerekes
915c562545 Add option to disable reconciliation when importing OFX files. (#2564) 2024-04-10 20:12:59 -07:00
Julian Dominguez-Schatz
770d86258f Support splits in create-rule option on account page (#2569)
* Support splits in create-rule option on account page

* Add release notes
2024-04-10 20:11:54 -07:00
Joshua Harris
a955fe2474 When starting input with operator, append to existing value instead of replacing (#2523)
Co-authored-by: Joshua Harris <2312397+JazzyJosh@users.noreply.github.com>
2024-04-10 08:05:20 -07:00
Joel Jeremy Marquez
4e9130ac29 [Mobile] Fix report budget income budgeted input (#2573)
* Fix mobile report budget income budgeted input

* Release notes
2024-04-09 13:08:02 -07:00
Joel Jeremy Marquez
e94a5505d8 [Mobile] Close modal after transferring / covering balance in mobile budget page (#2572)
* [Mobile] Close modals after performing a balance actions e.g. transfer / cover

* Release notes
2024-04-09 13:07:47 -07:00
Neil
1ee2cbec1c Custom Reports: Show Activity onClick (#2522)
* barGraph

* notes

* sessionStorage

* sessionStorage Complete

* Click for details

* mode click graphType

* compact

* hidden and offbudget working

* add pointer

* typecheck fix
2024-04-09 18:37:07 +01:00
Jenna
da6b039f10 Bugfix:Midnight theme button contrast (#2538)
* added green700 (g3) to highlight text in PayeeAutocomplete and CategoryAutocomplete

* added upcoming release note doc for Isuee 2488

* modified background and text to meet WCAG AA compliance for contrast

* updated code for autocomplete highlight on menu items

* fixed linting errors and renamed release note

* updated release note category from 'bug' to 'bugfix'

* fixing the light theme

---------

Co-authored-by: Jenn Cox <jenncox@Jenns-MacBook-Air.local>
2024-04-09 07:47:38 -07:00
Matiss Janis Aboltins
310cc04a2b ♻️ (bank-sync) unify the sync/reconciliation logic for internal & external sync (#2534) 2024-04-09 07:06:04 +01:00
shall0pass
6fce10aea0 [Bugfix] Remove menu from income group on mobile view (#2570)
* remove menu option from Income group

* note
2024-04-08 19:51:59 -05:00
Matiss Janis Aboltins
97a664159b ♻️ (tooltip) refactored tooltip to react-aria (#2493) 2024-04-08 17:51:38 +01:00
Robert Dyer
c2291d4b5d Show sync indicator in account header (#2560) 2024-04-07 22:03:59 +01:00
Neil
d6de90a296 Consolidate Link props (#2558)
* Remove Link Button

* remove AnchorLink

* remove ButtonLink

* notes

* merge fix

* clickLink

* typecheck fix

* remove link option from button

* remove ExternalLink

* VRT
2024-04-07 20:07:42 +01:00
shall0pass
90305965ba Cleanup tool group enhancement (#2480)
* add group enhancement

* warnings

* note

* add more group functions

* add Global: to differentiate warning from group warnings

* weights not properly recorded for sinking groups, safeNumber error
2024-04-06 19:12:02 -05:00
Neil
b655009477 Custom Reports: Fix live range (#2557)
* fix live range

* card updates

* type fix

* notes
2024-04-06 22:46:58 +01:00
Joel Jeremy Marquez
2e600e52c7 [Maintenance] Update TransactionEdit conponent onEdit function to use serialized transactions (#2555)
* [Maintenance] Update onEdit to use serialized transactions

* Release notes
2024-04-06 15:19:12 -06:00
Neil
b5f617dbe5 Custom Reports bug fix (#2556)
* fix bug

* notes
2024-04-05 22:04:04 +01:00
Neil
b3fc23201e Fix toggle bug (#2553)
* fix toggle bug

* notes
2024-04-05 00:38:49 +01:00
Joel Jeremy Marquez
6f251e6024 [Mobile]: More functionalities (#2472)
* Balance modals

* Release notes

* Fix typecheck errors

* Fix errors

* Mobile scheduled transaction modal

* Cleanup

* Fix props

* Fix typecheck errors

* Updates

* Fix autocomplete typings

* Update autocomplete types

* Fix typecheck errors

* Fix typecheck errors

* Remote optional type

* Pass this to apply

* Use bind

* Fix typecheck error

* Ignore typecheck error for now

* Add onClose in Autocomplete

* open category modal on enter in transfer modal

* Budget summary modals

* Accounts update

* Add paddingBottom

* Fix typecheck error

* Revert navigate

* Disable esline

* Close account and Reopen account

* Improve SingleInputModal

* Fix lint error

* Fix category autocomplete modal header

* Rebase updates

* Cleanup

* Clearer error message

* Close report balance tooltip on selection

* Updated based on review
2024-04-04 13:53:55 -07:00
Matiss Janis Aboltins
b356004f68 🔧 updated github issue template to hopefully reduce the amount of support (#2548)
* 🔧 updated github issue template to hopefully reduce the amount of support

* Release notes
2024-04-04 19:34:09 +01:00
David Kus
66dc593fa5 Show/hide reconciled transactions in the account view (#2542)
* Show/hide reconciled transactions

* Adding release note

* Fixing lint issues

* Filters should still apply after hiding/showing reconciled

* Using fetch transactions with filter parameter
2024-04-04 08:04:19 -07:00
David Kus
8b34ba3958 Fixing import of reconciled split transactions (#2543)
* Fixing import of reconciled split transactions

* Adding release note
2024-04-04 08:03:52 -07:00
ilar
2df774d9f5 Mobile auto decimal (#2536)
* Format the input field when entering transaction value, automatically populate decimal position.

* Add note.

* Fix linting issues.

* Turn off autoDecimal if we're hiding decimals anyway.

* Shorten changelog.
2024-04-04 08:03:26 -07:00
Ryan Bianchi
c96c957a34 modify existing LineGraph to track budget items over time (#2506)
* modify exiting LineGraph to track budget items over time

* linter pass 1

* increase line weight, add sorting and colour to tooltip

* second lint pass

* add release note

* use new disabledLists, format tooltip, other nits from review

* add margins to LineGraph

* adding missed linting

* remove new line icon, add disable options for split, legend, label

* Update ReportTopbar.jsx

Remove unneeded lines

* lint fix

* SVGChart

---------

Co-authored-by: Neil <55785687+carkom@users.noreply.github.com>
2024-04-04 15:38:30 +01:00
Joel Jeremy Marquez
f3d7641ba9 [Maintenance] Extract menus to separate files (changes split from #2472) (#2511)
* Extract menus to separate files (change split from #2472)

* Release notes

* Fix lint error

* Code review feedback
2024-04-02 14:06:42 -07:00
Neil
83fd85f059 Custom Reports: Confirm delete report (#2521)
* confirm delete report

* notes

* card confirm
2024-04-02 20:30:12 +01:00
Neil
308f8339ae Add yearly to custom reports (#2466)
* Button changes and time filters

* rename on dashboard

* notes

* fix time filters

* Sort Categories

* Page title

* category sort order

* move button

* featureflag

* Highlight report name

* sankey fix

* VRT

* remove doubled element

* adjust to match master

* add Year

* notes

* lint fix

* update names

* IntervalsUpdates

* fixing bugs

* ts updates

* lint fix

* merge fixes

* notes

* simplify lookups
2024-04-02 20:29:20 +01:00
Joel Jeremy Marquez
9697795279 [Maintenance] Replace react-merge-refs with useMergedRefs (#2509)
* Uninstall react-merge-refs

* Fix import

* Update useMergedRefs
2024-04-02 11:14:23 -07:00
Johannes Löthberg
9b40610f26 Bump GoCardless access validity from 30 to 90 days (#2518)
All banks are supposed to provide at least 90 days of access.

As of July 2023 EEA banks are required to allow access for up to 180
days[0], but this does not apply to UK banks, and apparently there might
still be EEA banks which don't comply with the new regulations.

We should consider eventually defaulting to 180 days and allowing
per-bank and maybe per-country overrides, but bumping it to 90 days
immediately provides a better user experience.

  [0]: https://nordigen.zendesk.com/hc/en-gb/articles/13239212055581-EEA-180-day-access

Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2024-04-02 18:31:44 +01:00
shall0pass
2a1c452aac Append, Prepend, or Replace notes in bulk actions (#2468)
* sort of working

* fix null condition, move buttons up

* visual and workflow updates

* update colors on hover

* release note

* fix another condition that inserted null
2024-04-02 10:37:49 -05:00
shall0pass
1dd1c188d6 Goals: Up To Template calculation with negative category balance (#2535)
* 'up to' calculation

* note

* update to last months balance
2024-04-02 10:35:55 -05:00
Matiss Janis Aboltins
8f634099e2 🔖 (24.4.0) custom reports improvements, stability enhancements (#2537) 2024-04-02 07:07:16 +01:00
Joel Jeremy Marquez
7ee48e4c1d Fix mobile autocomplete colors (#2530)
* Fix mobile autocomplete colors

* Release notes

* Remove narrow specific autocomplete colors

* Update upcoming-release-notes/2530.md

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

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
2024-04-01 05:43:30 -07:00
Matiss Janis Aboltins
270705b3cd 📈 adding extra console.log lines for bank-sync to help with troubleshooting (#2529)
* 📈 adding extra console.log lines for bank-sync to help with troubleshooting

* Release notes
2024-03-31 13:28:45 +01:00
Neil
9588a76109 Add Area Icon (#2526)
* Add Area Icon

* notes
2024-03-30 20:14:49 +00:00
Ryan Bianchi
ada9e7da31 [WIP] Fix custom reports cold-reload crash (#2528)
* when custom reports were cold-reloaded, the selections would be null crashing the page

* add release notes for PR

* fix typo in release note file name
2024-03-30 20:03:20 +00:00
Neil
38ffccb903 Custom Reports live data (#2505)
* Live card data

* Live Data

* notes

* Patch strict TS issues

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
2024-03-26 09:04:26 +00:00
Robert Dyer
f5023a7c07 feature: Show account sync indicators when viewing accounts on mobile (#2476)
* cleanup: Move account sync indicators to the left on mobile

* cleanup: account sync indicators on mobile should show pending/failed syncs

* feature: show account sync indicator when viewing account on mobile

* fix lint issues

* add release note
2024-03-25 22:11:50 -07:00
Joel Jeremy Marquez
bc6a0f8e60 Fix mobile transactions load more (#2504)
* Fix mobile transaction load more

* Release notes
2024-03-25 08:24:07 -07:00
Joel Jeremy Marquez
5ee7d336ef Autocomplete changes related to mobile modals PR (#2500)
* Autocomplete changes related to mobile modals PR

* Release notes

* Fix lint error

* AccountDetails

* Code review updates
2024-03-25 08:23:29 -07:00
Matiss Janis Aboltins
24e42daa51 🐛 fix hotkeys sometimes not working (#2489) 2024-03-24 07:08:07 +00:00
Matiss Janis Aboltins
4bafd13c55 🐛 (import) disallow importing transactions with too large or small amounts (#2494) 2024-03-24 07:06:34 +00:00
Matiss Janis Aboltins
afaee6bc16 ♻️ (typescript) port some common components to strict TS (#2481) 2024-03-23 09:35:20 +00:00
Neil
e44fbb3847 Create wip (#2443)
* Create wip.yml

Adding WIP to new PRs

* Create 2443.md

notes

* Update .github/workflows/wip.yml

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

* Update .github/workflows/wip.yml

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

* Update upcoming-release-notes/2443.md

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

* Update wip.yml

* Update 2443.md

* Update wip.yml

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
2024-03-22 20:53:12 +00:00
Neil
ff70c654a2 Custom Reports Error Catch (#2492)
* Error Catch

* notes

* fixes
2024-03-22 16:03:47 +00:00
Joel Jeremy Marquez
586a26968c Force async onRefresh on PullToRefresh component (#2487)
* Force async onRefresh

* Release notes
2024-03-21 13:36:59 -07:00
Matiss Janis Aboltins
107acdb36b 🐛 (report) do not include offbudget transfers in cash-flow card expenses (#2485) 2024-03-21 19:13:59 +00:00
Matiss Janis Aboltins
5343030800 🐛 (import) patch phantom transactions getting created (#2464) 2024-03-21 18:16:37 +00:00
Robert Dyer
d7635755f2 Fix error when viewing uncategorized transactions when there are upcoming scheduled transactions. (#2475)
* fix: Error when opening uncategorized transactions page

* add release note

* fix linter warning
2024-03-21 07:45:58 -07:00
Wizmaster
501c6a02cc Import locked transactions from nYNAB (#2474)
* Import locked transactions from nYNAB

* Import locked transactions from nYNAB
- Adding PR release note
2024-03-20 08:13:01 -07:00
Neil
6281cc751e Custom Reports: Intervals Updates (#2479)
* IntervalsUpdates

* notes

* updates

* add Ranges

* calc Leg strict

* ts updates

* review updates
2024-03-20 09:01:44 +00:00
Ikko Eltociear Ashimine
dc7cab501e Update sync.ts (#2478) 2024-03-19 19:35:52 +00:00
Daniel Gale-Rosen
f51376a4a5 Increase minimum cleared column width (Fix #2341) (#2462)
* increase minimum cleared column width

* add release notes

* update snapshots
2024-03-17 21:25:14 -07:00
Joel Jeremy Marquez
6f600a4fee Convert BudgetTable to a functional component (#2459)
* Convert BudgetTable to a functional component

* Release notes

* Fix lint errors

* Remove undo-event listener
2024-03-15 07:25:07 -07:00
Neil
c82a6dc5ef Custom Reports disabled list (#2410)
* Add interval split and menu items

* notes

* disabledList work

* notes

* fix

* fix balanceType

* rework constants

* review fixes
2024-03-14 19:35:59 +00:00
youngcw
ab97a3fbcd import locked transactions ynab4 (#2455)
* import locked transactions

* note, lint
2024-03-12 17:06:52 -07:00
shall0pass
8b15c8cc17 [Theme] Bugfix: Bulk edit background color for Midnight theme (#2460)
* bulk edit background color

* change

* NOTE
2024-03-12 19:01:28 -05:00
Matiss Janis Aboltins
02ec279a64 ♻️ (typescript) make rollover budget components strict TS compliant (#2453) 2024-03-12 22:04:25 +00:00
Joel Jeremy Marquez
ab8c3c018a [Maintenance] Reorganize mobile components (#2425)
* Reorganize mobile components

* Fix lint error

* Cleanup

* Fix lint error

* Release notes

* Cleanup

* Cleanup useActions

* useDebounceCallback
2024-03-12 15:01:38 -07:00
Joel Jeremy Marquez
8356640e45 Fix midnight theme autocomplete hover (#2461)
* Fix midnight theme autocomplete hover and make ItemHeader not depend on category groups

* Update

* Release notes

* Fix typecheck error
2024-03-12 12:54:16 -07:00
Joel Jeremy Marquez
1767a32b3d [Maintenance] Input onChangeValue and onUpdate prop naming (#2381)
* Differentiate Input onUpdate to onChangeValue

* Release notes

* Fix lint error

* Remove onChange
2024-03-12 08:54:47 -07:00
Neil
5bcfc71be6 Hide hidden categories in auto-complete (#2429)
* the work

* notes

* add to elements
2024-03-11 16:23:37 +00:00
DJ Mountney
998efb9447 Fix budget key tab navigation (#2452)
* Fix budget key tab navigation

- restore the collapsed property

* Add release note
2024-03-09 14:19:30 -07:00
Robert Dyer
dc159d71a2 Show a modal to confirm unlinking accounts (#2441) 2024-03-09 18:40:16 +00:00
Robert Dyer
7db7b5c400 Provide "api/category-groups-get" API endpoint (#2446) 2024-03-09 17:29:20 +00:00
Robert Dyer
823b426952 Show scheduled transactions when viewing "All accounts" (#2447) 2024-03-09 17:17:15 +00:00
DJ Mountney
8827169bfa Fix flaky transfer e2e test (#2434)
* Fix flaky transfer e2e test

- If tests ran too fast, the transactions wouldn't finish rendering
  before the select of the transactions was attempted.

* Add release note
2024-03-07 13:02:42 -08:00
CampaniaGuy
90eaf2ba17 [WIP] Implement "pill gesture" icon in navigation bar on Mobile view for better UX (#2419)
* Fix mobile UX, issue #2079

* upcoming-release-notes

* Fix navigation bar buttons not fully displayed

* pill size changed, exported nav bar height

* Edit navigation bar const
Edit nav bar pill color

* Removed export

* Fixes release notes

* Fixed formatting

* Fix mobile UX, issue #2079

* upcoming-release-notes

* Fix navigation bar buttons not fully displayed

* pill size changed, exported nav bar height

* Edit navigation bar const
Edit nav bar pill color

* Removed export

* Fixes release notes

* Fixed formatting

* Test schedules and mobile images created

* Reverted schedules checks test images
2024-03-06 15:41:05 -07:00
Neil
a5fa0f3bb6 Show activity updates (#2408)
* Show activity changes

* notes

* adjust filter loading

* switch back

* adjust test

* lint fix

* budget test

* lint fix

* Filtered Balance

* flicker fix

* VRT updates

* remove test variables

* default category

* categoryId separated
2024-03-06 22:37:28 +00:00
Matiss Janis Aboltins
4570459d85 🔥 delete abandoned sankey feature (#2417)
Closes #1919
2024-03-06 17:28:08 +00:00
Attila Kerekes
76cbd44c75 fix ofx amount parsing for longer decimal places (#2421) 2024-03-06 09:42:41 -07:00
shall0pass
0e0d960cd4 [Bugfix] Midnight theme - Budget Name color, Mobile category color in account view (#2422)
* budget name / mobile account category color

* note

* color of plus on account page
2024-03-05 13:50:41 -06:00
shall0pass
98c17bd5e0 [Goals] Schedule top off amount (#2404)
* add log messages to schedule templates

* log the included schedules

* more log output

* use a negate filter for sinking funds

* carve out a top out exception if no sinking funds

* note
2024-03-04 14:46:08 -06:00
shall0pass
601c9aa7df [End of Month Cleanup] Remove automatic funding of rollover categories (#2409)
* remove automatic funding of rollover categories

* note
2024-03-04 14:45:15 -06:00
Matiss Janis Aboltins
3b77609159 (bank-sync) quality of life improvements for sync (#2416) 2024-03-04 18:42:34 +00:00
DJ Mountney
66261641a0 Add option to make a transfer from two selected transactions (#2398)
* Adds option to make a transfer from two selected transactions

- Transactions amount must match
- Transactions must be from different accounts
- Split transactions not eligible
2024-03-03 13:34:08 -08:00
DJ Mountney
4b034468e3 Update shared transaction module to strict typescript (#2388)
* Update shared transaction module to strict typescript
2024-03-03 13:18:03 -08:00
Matiss Janis Aboltins
b700aee87d ♻️ (typescript) move some files to strict mode (#2403) 2024-03-03 17:50:13 +00:00
Matiss Janis Aboltins
9fca85209f 🔖 (24.3.0) (#2413)
* 🔖 (24.3.0)

* Remove used release notes

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-03-03 17:05:39 +00:00
Neil
a9362cc6f9 BarGraph crash (#2411)
* Fix crash

* notes
2024-03-02 07:35:05 +00:00
Neil
40296dc876 Custom reports updates (#2386)
* Button changes and time filters

* rename on dashboard

* notes

* fix time filters

* Sort Categories

* Page title

* category sort order

* move button

* featureflag

* Highlight report name

* sankey fix

* VRT

* remove doubled element

* update

* fixes

* fixes

* create button fix and rename card fix

* Title change
2024-03-01 18:41:32 +00:00
Neil
ed1e0ceb30 Custom Reports AutoComplete (#2350)
* updated saved work

* merge fixes

* Disable CREATE TABLE

* notes

* turn on db table

* Fix TableGraph recall crash

* table format changes

* type fixes

* fixing some card displays

* merge fixes

* revert table change

* cardMenu width

* Add Saved Reports Autocomplete

* notes

* fix invalid values crash

* Title and auto-focus and esc

* notes

* fix filtering logic

* reload saved filters

* lint fix

* visual graph changes

* merge fixes

* fix

* review updates
2024-02-28 21:50:23 +00:00
Neil
55817b0e70 Add interval split and menu items to custom reports (#2389)
* Add interval split and menu items

* notes
2024-02-28 19:47:42 +00:00
youngcw
6d7d12138c Update csv amount parser. Fix #2374 (#2399)
* specify 2 decimal places in the csv amount parser

* note

* update tests

* cleanup
2024-02-28 11:39:23 -07:00
youngcw
52f1f79c01 fix #2363 broken create schedule from transaction (#2401)
* fix missing name

* note

* update how payees is created

* lint
2024-02-27 10:44:20 -07:00
shall0pass
991fc4f450 [Theme] Midnight updates (#2394)
* color updates

* release note
2024-02-26 14:21:54 -06:00
shall0pass
4a8c692d06 [Theme] Midnight updates (#2385)
* update colors

* remove comments
2024-02-21 13:50:00 -06:00
Neil
0609f47cc3 AutoComplete clean-up (#2349)
* AutoComplete clean-up

* notes

* lint fix

* fix tests

* review fix

* type
2024-02-21 18:59:05 +00:00
Julian Dominguez-Schatz
0d1e6f2ee7 Display rules with splits on rules page (#2368)
* Show splits on rules page

* Add `ActionExpression` for 'allocate'-type actions

* Add release notes

* Fix type errors
2024-02-21 11:47:23 -07:00
Neil
8568aebdbb Custom Reports: save reports (*new SQL table creation*) (#2335)
* updated saved work

* merge fixes

* Disable CREATE TABLE

* notes

* turn on db table

* Fix TableGraph recall crash

* table format changes

* type fixes

* fixing some card displays

* merge fixes

* revert table change

* cardMenu width

* notes

* fix filtering logic

* reload saved filters

* lint fix

* visual graph changes

* slice fixes

* typescript update
2024-02-21 18:12:26 +00:00
Julian Dominguez-Schatz
bfb7c1d213 Add plugin for offline PWA support (#2369)
* Add plugin for offline PWA support

* Add release notes

* Attempt to fix kcab fetch issue

* Fix type errors

* Cache more file types

* Empty commit to try to bump action

* Attempt to fix fonts
2024-02-20 18:23:27 -07:00
Joel Jeremy Marquez
e526555748 [Maintenance] Add tsconfig excludes (#2380)
* Add tsconfig excludes

* Release notes
2024-02-20 13:11:14 -08:00
DJ Mountney
45c4b262a2 Fix ability to rename budget in the UI (#2383) 2024-02-20 11:04:54 -08:00
youngcw
e1f805b9c9 schedule default amount (#2360)
* schedule default amount

* note

* vrt
2024-02-20 10:07:18 -07:00
DJ Mountney
d0c11cd3af Converts html special characters in ofx values to plaintext (#2364)
* Converts html special characters in ofx values to plaintext

- Apply during ofx/qfx import
2024-02-17 10:49:02 -08:00
shall0pass
0c5bce8baf [Enhancement] Theme: Midnight (#2312)
* midnight updates

* updates

* updates

* background one shade darker

* change highlights to match other accents

* release note

* link color

* variable spelling

* Upcoming pill color

* theme switch bug

* remove development, type error

* toggle background, disabled background+text

* account pillboxes and icons

* typecheck error
2024-02-16 09:43:24 -06:00
Matiss Janis Aboltins
e650e00cb8 ♻️ (eslint) enable some rules to enforce better code quality (#2357) 2024-02-16 07:34:55 +00:00
DHRUV RAMDEV
422996f8a7 fix: Margin when editing account on desktop (#2286)
* fix: Margin when editing account on desktop

* add release notes

* increase margin

* Update regression tests

* fix: Reduce padding in other areas

* update snapshots
2024-02-15 10:34:23 -08:00
Tristan Radisson
9cad57c607 #1383 Allow early post transaction of schedules (#2358)
* Allow early schedule post transaction

* Added release notes file
2024-02-15 07:33:00 -07:00
Neil
2a0f8335ed Convert SavedFilters to Typescript (#2320)
* move saved filters

* MenuButton

* fixes

* update

* FiltersStack

* notes

* merge fixes

* review fixes

* error catch
2024-02-13 11:16:54 -08:00
Joel Jeremy Marquez
08cbdab2a1 Hooks for frequently made operations (#2293)
* Hooks for frequently made operations

* Release notes

* Fix typecheck errors

* Remove useGlobalPrefs

* Add null checks

* Fix showCleared pref

* Add loaded flag for categories, accounts and payees state

* Refactor to reduce unnecessary states

* Fix eslint errors

* Fix hooks deps

* Add useEffect

* Fix typecheck error

* Set local and global pref hooks

* Fix lint error

* VRT

* Fix typecheck error

* Remove eager loading

* Fix typecheck error

* Fix typo

* Fix typecheck error

* Update useTheme

* Typecheck errors

* Typecheck error

* defaultValue

* Explicitly check undefined

* Remove useGlobalPref and useLocalPref defaults

* Fix default prefs

* Default value

* Fix lint error

* Set default theme

* Default date format in Account

* Update packages/desktop-client/src/style/theme.tsx

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

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
2024-02-12 07:07:44 -08:00
Matiss Janis Aboltins
ec2de3b387 🔥 (remove victory dependency) (#2356) 2024-02-11 21:50:18 +00:00
Johannes Löthberg
65372e86a5 Remove category spending report (#2344)
It has been superseded by the new custom reports feature.

Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2024-02-11 17:06:41 +00:00
Hinerangi Courtenay
53a61000a4 fix: Mobile menu blocks items #2040 (#2352)
* Fix Mobile menu blocks items (#2040)

* Only set bottom padding on pages the mobile nav bar is used (#2040)

* Add release note for PR
2024-02-10 18:13:13 -08:00
Neil
485902af6b Update Custom Report styles (#2345)
* updated saved work

* merge fixes

* Disable CREATE TABLE

* notes

* turn on db table

* Fix TableGraph recall crash

* table format changes

* type fixes

* fixing some card displays

* merge fixes

* revert table change

* Revert Changes

* notes

* merge fixes

* notes

* notes

* revert notes

* Area changes
2024-02-10 21:54:47 +00:00
Neil
5a67b7e822 Dynamic graph margins (#2346)
* dynamic graph margins

* notes
2024-02-08 16:31:54 -08:00
DJ Mountney
b994a6a74a Fix parse errors with OFX data with no transactions (#2342)
* Fix parse errors with OFX data with no transactions

- Return an empty array instead of an array of undefined
2024-02-08 13:15:21 -08:00
Matiss Janis Aboltins
b1b266e83c 🐛 (typescript) patching sendCatch type (#2343)
* 🐛 (typescript) patching sendCatch type

* Release notes
2024-02-08 20:53:05 +00:00
youngcw
58626c0026 update manifest (#2285)
* update manifest

* note

* note

* typo

* theme color

* add maskable icons

* fix icon color
2024-02-08 10:41:55 -07:00
DJ Mountney
45094daf2f Typescript: pass 2 at updating api-handlers to match server handlers (#2334)
* Typescript: pass 2 at updating api-handlers to match server handlers
2024-02-08 09:06:43 -08:00
Julian Dominguez-Schatz
2bb7b3c2ee Add rules with splits (#2059)
* Add split creation UI to rule creation modal

* Support applying splits when rules execute

* fix: deserialize transaction before running rules

According to how rules are run in other places in the app, we should be
supplying a "deserialized" (i.e., integer-for-amount and ISO date)
transaction rather than a "serialized" (amount-plus-formatted-date) one.
This fixes a crash in how split transactions are applied, as well as
date-based rules not applying correctly previously (any rule with a date
condition would never match on mobile).

* Add release notes

* Fix missing types pulled in from master

* PR feedback: use `getActions`

* PR feedback: use `flatMap`

* Fix action deletion

* Don't flicker upon split deletion

* Let users specify parent transaction actions (e.g. linking schedules)

* Support empty splits

* Revert adding `no-op` action type

* Support splits by percent

* Fix types

* Fix crash on transactions page when posting a transaction

The crash would probably have occurred in other places too with
auto-posting schedules :/

* Fix a bug where schedules wouldn't be marked as completed

This was because the query that we previously used didn't select parent
transactions, so no transaction was marked as being scheduled (since
only parent transactions have schedule IDs).

* Add feature flag

* Limit set actions within splits to fewer fields

* Fix merge conflict

* Don't run split rules if feature is disabled

* Fix percent-based splits not applying

* Fix crash when editing parent transaction amount

* Auto-format

* Attempt to fix failing tests

* More test/bug fixes

* Add an extra split at the end if there is a remaining amount

* Make sure split has correct values for dynamic remainder

* Remove extraneous console.log
2024-02-08 07:56:30 -07:00
Matiss Janis Aboltins
d6f610a326 added 'show/hide balance' button to cash flow report (#2322) 2024-02-08 08:12:36 +00:00
Joel Jeremy Marquez
8a8113a648 Update loot-core deps (#2280)
* Upgrade desktop-client depenencies

* yarn dedupe

* Update useSelectors

* Update loot-core deps

* yarn dedupe

* Move deps to devDependencies

* yarn dedupe
2024-02-07 18:40:59 -08:00
Joel Jeremy Marquez
029e2f09bf Update desktop client package versions (#2270)
* Upgrade desktop-client depenencies

* Release notes

* yarn dedupe

* yarn dedupe

* Fix typecheck error

* Update sass

* Update useSelectors
2024-02-06 17:43:09 -08:00
jaarasys-henria
86007e392f [Enhancement] Make transaction list sortable by cleared status (#1994) 2024-02-06 15:07:36 -07:00
Neil
4c4f2fd426 Custom Reports: add save reports menu (#2257)
* Add schema work

* notes

* merge fixes

* Add Reports Save Menu

* merge fixes

* updates

* notes

* updates

* updates

* save updates fix

* typecheck fixes

* merge fixes

* saveReport strict Typescript

* fix sidebar

* lint fix

* fixing functionality plus clean up

* clean up
2024-02-05 22:40:46 +00:00
Matiss Janis Aboltins
7a18827b1d allow running AQL against local database (#2326) 2024-02-05 19:16:02 +00:00
shall0pass
77fd65b2e7 [Bugfix] Cleanup tool: Add balance check (#2295)
* add balance check

* lint

* fill rollover categories after non-rollover

* allow partial fills of non-rollover

* update

* release note and youngcw suggestion

* warnings

* remove commented coded
2024-02-05 06:21:42 -06:00
Julian Dominguez-Schatz
30f03e8079 Save name fields on unfocus (#2327) 2024-02-04 16:50:36 +00:00
Matiss Janis Aboltins
6e16262b63 🔥 removing unused/dead code (#2328) 2024-02-04 16:05:11 +00:00
xentara1
29a515f3fe [Feature] Add ability to create schedules from existing transactions (#2222) 2024-02-03 19:00:27 +00:00
Julian Dominguez-Schatz
a5ab1a8fae Re-open autocomplete dropdown on change (#2325)
* Re-open autocomplete dropdown on change

* Add release notes with new PR ID
2024-02-03 11:16:15 -07:00
yoyotogblo
d37622162a Change lookback and look forward time range when fuzzy matching (#2300)
Change to 7 days prior and after for imported transactions when fuzzy matching
2024-02-03 11:08:45 -07:00
Neil
e3a8366dd7 Update and organize reports (#2274)
* Add schema work

* notes

* merge fixes

* Add Reports Save Menu

* merge fixes

* updates

* notes

* updates

* updates

* save updates fix

* typecheck fixes

* revert changes

* notes

* error fixes

* update

* fix

* merge fixes

* review changes

* reportChange and savedStatus

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

Co-authored-by: DJ Mountney <david.mountney@twkie.net>

* merge fixes

---------

Co-authored-by: DJ Mountney <david.mountney@twkie.net>
2024-02-02 23:52:35 -08:00
Joel Jeremy Marquez
d5e49dde59 Update yarn to 4.0.2 (#2283)
* Update yarn

* Release notes
2024-02-02 18:11:07 -08:00
Joel Jeremy Marquez
f5258e6ebe Consider child transactions when fuzzy matching imported transactions (#2309)
* Consider child transaction when fuzzy matching

* Release notes
2024-02-02 18:03:57 -08:00
Joel Jeremy Marquez
f4d80fad92 [Maintenance] Remove modals.d.ts (#2298)
* Remove modals.d.ts

* Release notes

* Fix typecheck

* Fix lint error
2024-02-02 17:56:23 -08:00
DJ Mountney
3324dd5fa0 Fix docker start browser error (#2304)
* Fix docker start browser error

Don't launch browser when in docker
2024-02-02 17:18:27 -08:00
shall0pass
14509d15df [Bugfix] Dark Theme variable name misspelled (#2317)
* misspelling of variable name

* release note
2024-02-02 15:51:06 -06:00
Ifeoluwa Odubela
9b461c48c9 Bugfix: Add Primary Button hover background colors for light and dark theme #1971 (#2123)
* Bugfix: Add Primary Button hover background colors

* Add release notes

* Rename 1971.md to 2123.md

* Update release note 2123.md typo

* Update packages/desktop-client/src/style/themes/dark.ts

* Update packages/desktop-client/src/style/themes/light.ts

---------

Co-authored-by: Neil <55785687+carkom@users.noreply.github.com>
2024-02-02 21:26:13 +00:00
jaarasys-henria
55f2d126b3 [Maintenance] Pass HTTPS flag to dev container to enable HTTPS (#2316) 2024-02-02 21:14:45 +00:00
Matiss Janis Aboltins
6ae2047ab8 🔧 upgrade deprecated github actions (#2319) 2024-02-02 20:38:57 +00:00
Pedro Primor
9fdffcc8e9 Change month picker hover background color (#2121)
* Change month picker hover background color

* Add release notes

* Add updated screenshots from visual regression tests

* Revert "Add updated screenshots from visual regression tests"

This reverts commit d9d83b4789.

* Update failing visual regression tests screenshots

* Revert "Update failing visual regression tests screenshots"

This reverts commit aaef019191.
2024-02-02 13:11:16 -07:00
DHRUV RAMDEV
3daff4381f feat: Don't allow duplicate cat-groups in budget (#2262)
* feat: Don't allow duplicate cat-groups in budget

* Add release notes

* fix: error message

* pass group instead of name for accurate error message

* improve error message
2024-02-02 13:10:36 -07:00
Neil
5914469b11 Convert FiltersMenu to Typescript (part 1) (#2231)
* migration work

* notes

* typecheck

* typecheck fixes

* fixes

* merge fixes

* typecheck updates

* review fixes
2024-02-02 20:10:24 +00:00
youngcw
39e7f2598b fix budget header collapsed colors (#2313)
* fix budget header collapsed colors

* note
2024-02-02 13:09:53 -07:00
Neil
c8d326d24b Custom Reports - split out hidden categories from offbudget (#2302)
* Add Toggles

* budget table

* testing

* updates

* updates

* fixes

* updates

* fix Menu

* lint fixes

* fix keybindings

* revert budget menu changes

* notes

* remove default exports

* fixes

* disabled fix

* add style option

* lint fix

* remove css

* lint fixes

* color updates

* merge menu with togglemenu

* host

* menu fixes

* fix regression

* remove host

* adjustments

* work

* fix hidden filters

* merge fixes

* adjustments

* updates

* fix uncat table values

* fixes

* notes

* title change

* Adjust showHide selector
2024-02-02 20:09:27 +00:00
Matiss Janis Aboltins
d8639a2a71 🔖 (24.2.0) cleared transaction improvements; experimental simplefin bank-sync (#2311) 2024-02-02 19:20:53 +00:00
Matiss Janis Aboltins
734191424b 🐛 (goCardless) patch incomplete migration (#2308) 2024-02-01 16:40:12 +00:00
shall0pass
5d4fcfde00 [Enhancement] Goal Target with cleanup template (#2282)
* update goal target after montly cleanup

* release note
2024-01-31 13:42:05 -06:00
Joel Jeremy Marquez
54d7e5460a [Cleanup] useSingleActiveEditForm hook on mobile budget table (#2263)
* useSingleActiveEditForm on mobile budget table

* Release notes

* Remove unused variables
2024-01-30 14:37:06 -08:00
youngcw
43ebe9e0fd fix bad account sort order in demo (#2279)
* fix bad sort order in demo

* note

* add async back

* fix tests

* fix2

* fix3

* update vrt

* fix image
2024-01-26 09:12:54 -07:00
youngcw
515bdf5a74 update vrt instructions (#2287)
* update

* note

* revise
2024-01-26 09:06:12 -07:00
Ed
018714610a Updating link for GoCardless Bank Account Sync (#2276)
* Updating link for GoCardless Bank Account Sync

* Adding release notes

* Update URL to point to docs

* Fixing lint
2024-01-26 07:11:18 -08:00
Joel Jeremy Marquez
00ee165f8e Mobile Off Budget category label (#2284)
* Mobile Off Budget category label

* Release notes

* Fix error

* Fix release notes
2024-01-26 07:09:29 -08:00
Neil
68442ae9e6 Custom reports: hide "show ..." checkboxes in menu (#2174)
* Add Toggles

* budget table

* testing

* updates

* updates

* fixes

* updates

* fix Menu

* lint fixes

* fix keybindings

* revert budget menu changes

* notes

* remove default exports

* fixes

* disabled fix

* add style option

* lint fix

* remove css

* lint fixes

* color updates

* merge menu with togglemenu

* host

* menu fixes

* fix regression

* remove host

* adjustments

* onToggle

* vrt fix

* typecheck

* merge fixes

* colors

* lint fix
2024-01-24 21:49:12 +00:00
shall0pass
b937bfae04 [Bugfix] Goals: Database entry (#2281)
* fix database insertion

* dbMonth format

* release note
2024-01-24 14:51:38 -06:00
DJ Mountney
317e7f135e 🐛 Avoid passing a boolean to the import trans category title (#2278)
* Avoid passing a boolean to the import trans category title

- Fixes an error regading passing false to title
  when category is not available
2024-01-24 11:23:02 -08:00
DJ Mountney
5adb083575 🐛 Fix a missing ref param warning for forwardRef (#2277)
* Fix a missing ref param warning for forwardRef

- Drop unused usage of forwardRef on TableWithNavigator
2024-01-24 11:13:43 -08:00
Joel Jeremy Marquez
524bd4e9eb Update vite / swc / ts versions (#2268)
* Update vite / swc / ts versions

* Release notes

* Revert root tsconfig module changes

* yarn dedupe

* Dummy update to run pipeline

* Update webpack and playwright

* Update playwright docker images
2024-01-24 10:49:12 -08:00
Matiss Janis Aboltins
9dfd6ce34c 🐛 fix uncategorized transaction banner flashing on load (#2273) 2024-01-23 08:23:32 +00:00
Matiss Janis Aboltins
5d28bc0e3b 🏷️ making some files comply with strict TS (#2247) 2024-01-22 19:01:05 +00:00
Matiss Janis Aboltins
a4e97e0070 ♻️ refactored cash-flow report from victory to recharts (#2260) 2024-01-22 08:34:51 +00:00
Matiss Janis Aboltins
a6e38ad2ae allow un-reconciling (unlocking) transactions (#2252) 2024-01-22 08:34:40 +00:00
Matiss Janis Aboltins
bb0ae4ebc3 🔥 removing unused variables (batch 2) (#2256) 2024-01-21 14:55:24 +00:00
youngcw
dd29e02c5c fix color of schedule before/after weekend box (#2261)
* fix color of schedule after box

* note
2024-01-20 15:37:34 -07:00
Zach Whelchel
75186183eb SimpleFin (#2188)
* Some initial UI work for adding SimpleFin.

* SimpleFin proof of concept working.

* Adds linking & unlinking to existing accounts through the account menu UI.

* Added loading and lint fixes.

* Lint changes.

* Added release notes.

* Typecheck cleanup.

* Import, lint, typecheck cleanups.

* More typecheck cleanup.

* Refactored language for consistency.

* Added default institution name.

* Lint cleanup.

* Addressed change requests.

* Added a default to migration, made variables consistent, added feature flag.

* Added account_sync_source to server schema.

* Adds account_sync_source to test.

* Fix for typecheck.

* Attempt to make typecheck happy.

* Added strict ignore.

* Moved account_sync_source to the right model (face palm).

* Hotfix for institution format.

* Lint cleanup.

* Removed unnecessary promise.all.

* Lint cleanup.
2024-01-20 14:35:52 -08:00
Neil
83f13cbdc8 add compact to custom reports (#2258)
* add compact

* notes
2024-01-20 21:18:15 +00:00
DJ Mountney
0045d9212e Bundle loot-core types into the API (#2053)
* Bundle loot-core types into the API

So we can have loot-core be the source of truth
for some types that get passed through

- Improves downstream development with API by including types
- Use path aliases for dist vs dev tsconfigs
- Convert api index to typescript as example
- Permit ts-ignore for issues with our version of typescript

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
2024-01-20 10:30:23 -08:00
Matiss Janis Aboltins
dd254c6c23 🔧 add link to community discord for support (#2250) 2024-01-20 10:40:52 +00:00
Neil
c66d6e00f5 Custom Reports - add schema (#2246)
* Add schema work

* notes

* merge fixes

* add to handlers

* notes update

* Update packages/loot-core/src/server/reports/app.ts

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

* review changes

* type updates

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
2024-01-20 10:22:28 +00:00
Matiss Janis Aboltins
ae3be13aa8 🔥 removing unused variables (batch 1) (#2255) 2024-01-19 23:02:21 +00:00
Neil
cd9d1fb674 Clean-up some custom reports code (#2254)
* work

* missed

* notes

* change element name

* update

* update changes

* merge fixes
2024-01-19 22:39:09 +00:00
Matiss Janis Aboltins
edba670d3a ⬆️ (prettier) upgrade, fix issues and enable for jsx files (#2253) 2024-01-19 21:48:30 +00:00
Matiss Janis Aboltins
fbb1a9647d 🐛 fix 'delete budget' button always deleting cloud file (#2251)
Closes #2216
2024-01-19 20:04:00 +00:00
Neil
06cf65497f Custom Reports: fix broken table (#2249)
* fix broken table

* notes

* error fixes
2024-01-19 19:37:14 +00:00
Neil
62a0a0fedc Custom Reports compact additions (#2245)
* compact additions

* notes

* vrt fix

* revert AnchorLink

* Update upcoming-release-notes/2245.md

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

* merge fixes

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
2024-01-19 08:59:47 +00:00
Neil
106dce25dd Custom Reports update entites (#2244)
* work

* notes

* missing entity

* lint
2024-01-18 22:39:42 +00:00
Matiss Janis Aboltins
ff11399180 ♻️ (typescript) fixing strictNullChecks=true issues (#2228)
* ♻️ (typescript) fixing strictNullChecks=true issues

* Patch test-helpers

* Strict patch
2024-01-18 08:23:50 +00:00
Matiss Janis Aboltins
363c9e4afb 🐛 (gocardless) fix sync when additionalInformation field is null (#2238) 2024-01-18 08:23:29 +00:00
Neil
e745a4073b Custom Reports: fix table rendering (#2192)
* reorg

* notes

* Add render

* privacy Filter additions

* merge fixes

* notes

* merge fixes

* Apply patches for strict mode

* review fixes

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
2024-01-16 20:14:38 +00:00
DJ Mountney
7d1a895b48 Restore ability to use console.log in vite (#2233)
Restore ability to use console.log in vite

- Swap our swc plugin to remove-react-properties
- Configure remove-react-properties to preserve our testids
2024-01-16 09:40:44 -08:00
DJ Mountney
a8b42bcd50 Change the vite chunk filename hash usage (#2224)
* Change the vite chunk filename hash usage

- Change to more closely match the . syntax we use with webpack
- This should fix some issues with our size compare as well
* Account for chunks being base64
2024-01-15 09:47:09 -08:00
Matiss Janis Aboltins
f33bce41ea ♻️ (typescript) enable strict mode everywhere (#2230) 2024-01-15 08:24:33 +00:00
Ikko Eltociear Ashimine
cdefe6133f chore: Update actions.ts (#2227)
non-existant -> non-existent
2024-01-14 16:13:48 +00:00
Nik
44a5199a31 Add split distribution (#2151)
* Add split distribution feature

* Add upcoming release notes

* Fix tests

* Fix remaining test

* Disable distribute button when all transactions are filled

* Add canDistributeRemainder

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
2024-01-13 15:43:13 -08:00
Neil
dccad902d6 vite host regression fix (#2217)
add host to vite config
2024-01-12 17:45:20 -08:00
Neil
b477f7c2f1 Custom Reports: Enable Show Labels (#2124)
* work

* updates

* merge fixes

* syntax fix

* Add Label element

* updates

* notes

* normalize customLabel

* fix

* range adjustments

* margin update

* merge fixes

* review Updates

* labelFix

* Fix adjustTextSize
2024-01-12 21:46:22 +00:00
Stefan Hall
540c410957 fixed:issue->#1968 Import from nYNAB fails with unknown error (#2191)
* Allow case insensitive ynab5 import for special 'starting balance' payee

* set upcoming release number to related github issue

* extract string comparison into separate function

and reuse when checking starting balance/s on ynab4 import

* make all category group checks case insensitive

when importing from ynab5 to make the check strategy consistent when importing from ynab5

* extract findById into sreusable function

to 'simplify' usage

* Add null check

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

---------

Co-authored-by: Joel Jeremy Marquez <joeljeremy.marquez@gmail.com>
2024-01-12 12:59:31 -08:00
Matiss Janis Aboltins
e205344867 ♻️ (typescript) fixing strictNullChecks=true issues (#2212) 2024-01-12 17:49:54 +00:00
HansiWursti
8b968579b1 Proposal - Disable Save Button in Mobile Transaction View if field is edited (#2214)
* Disable SaveButton if field is edited

* Add Release Notes and fix VRT
2024-01-12 08:57:22 -08:00
Matiss Janis Aboltins
6ce794ffcc 🔥 (ofx) removing old parser (#2215)
* 🔥 (ofx) removing old parser

* Release notes

* Patch unit test
2024-01-12 07:27:18 -08:00
DJ Mountney
d5359a96ca Proposal for switching desktop-client to vite (#2084)
* Proof of concept for switching desktop-client to vite

* Fix other packages ts tests issues

* Update jsx tests to use vitest instead of jest

* Inject our global shims properly

* Add comment regarding new plugin

* Cleanup unnessary change after rebase

* Fix inter fonts pathing

* Remove manual chunks sizes for now

Just set the limit higher

* Bring back size compare

* Suppress victory warnings

* Remove craco config now that it's not used

* Add vite basic ssl plugin

- This autogenerates self-signed certs in dev mode when HTTPS env is set
- Made to match the CRA behaviour

* Add release note

* Remove warning suppression for victory

- Updated to a rollup version that includes the fix
2024-01-11 10:18:49 -08:00
Matiss Janis Aboltins
3eee0b11d2 🐛 (autocomplete) fix multi-autocomplete causing crashes (#2207) 2024-01-10 17:15:34 +00:00
HansiWursti
e792afb1fd ReAdd Mobile Account Error Page (#2204)
* Add "error" Page for special accounts in Mobile
2024-01-09 15:06:24 -08:00
HansiWursti
4fb55d0d70 Mobile - Add cleared and uncleared Balances in Account Details (#2056)
* - Added Mobile Account Cleared and Uncleared
  Balanced

* Changed font size

* Add release notes

* Changed Visibility

* Centered the different Values

* Updated VRT

* Fix merge Conflict?!
2024-01-09 15:06:01 -06:00
DJ Mountney
b330991855 Add proper types to runHandler (#2136)
* Add proper types to runHandler

- Args and return values from runHandler should now work within loot core
- Updated some of the handler types to be more accurate
2024-01-09 13:05:15 -08:00
shall0pass
165ad45822 [Enhancement] Add crossorigin field to manifest line (#2206)
* add crossorigin

* release note

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
2024-01-09 15:04:22 -06:00
Joel Jeremy Marquez
295917036b ESLint to enforce Actual's useNavigate hook (#2208)
* ESLint to enforce Actual's useNavigate hook

* Release notes

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
2024-01-09 13:03:09 -08:00
Matiss Janis Aboltins
ef9a7cfe85 🔧 (ci) fork the electron build job - master and PR (#2209) 2024-01-09 20:06:50 +00:00
Matiss Janis Aboltins
4ece4a7ff6 ♻️ (gocardless) rename nordigen_* secrets to gocardless_* (#2181) 2024-01-09 19:21:16 +00:00
DJ Mountney
761b3c6a16 Tests: Add api tests for payees and transactions (#2168)
* Tests: Add api CRUD tests for payees and transactions
2024-01-09 11:20:06 -08:00
Matiss Janis Aboltins
7ace8c52dd 🔧 (electron) release electron app to app store (osx) (#2182) 2024-01-09 18:54:57 +00:00
Subhaditya Nath
f6dd0ecdb9 Fix site.webmanifest to enable Actual to be installed as Chromium PWA (#2202) 2024-01-09 10:21:34 -06:00
rjwonder
97a4296d7c Update sync.ts with additionalInformation as fallback (#2176) 2024-01-09 08:53:15 +00:00
Matiss Janis Aboltins
89698480a5 🐛 (rules) add 'no rules' message & always show rule table (#2199) 2024-01-09 08:32:12 +00:00
Matiss Janis Aboltins
1a6db82cfb Revert "👷 (ci) adding helper comments for failed CI jobs (#2074)" (#2183)
This reverts commit e11b65719e.
2024-01-08 18:38:46 +00:00
Matiss Janis Aboltins
6ce502ea24 ♻️ refactor(electron): moving back from websockets to IPC (#2190) 2024-01-08 18:34:19 +00:00
youngcw
fd962a97b0 fix missing borders in single category drop down in report budget (#2195)
* fix missing borders in single category drop down in report budget

* note
2024-01-08 11:20:52 -07:00
youngcw
300ed824f0 change the pie chart background color in the report status (#2196)
* change the pie chart background color in the report status

* note
2024-01-08 11:20:29 -07:00
Neil
caca2497ea Add ability to import categories from CSV (#2163)
* update transaction table

* notes

* adjust parser
2024-01-08 17:51:51 +00:00
shall0pass
33e778fe9f [Maintenence] Refactor Goals Schedule file (#2102)
* refactor pass 1

* refactor pass 2

* refactor pass 3

* commented out startDate

* remove console logging

* release note

* non-repeating error

* add daily

* move else

* Fix compounding to_budget

* lint

* reapply 2125
2024-01-07 16:19:19 -06:00
Neil
8c43c78fc7 Custom reports reorganize table graph files (#2153)
* reorg

* notes

* Update upcoming-release-notes/2153.md

Co-authored-by: DJ Mountney <david.mountney@twkie.net>

* merge fixes

* fix

* another

* f

---------

Co-authored-by: DJ Mountney <david.mountney@twkie.net>
2024-01-07 21:55:21 +00:00
DJ Mountney
e0d82fd4f9 Revert "Add "error" Page for special accounts in Mobile" (#2186)
* Revert "Add "error" Page for special accounts in Mobile (#2114)"

This reverts commit b6462347a9.
2024-01-06 15:20:19 -08:00
HansiWursti
b6462347a9 Add "error" Page for special accounts in Mobile (#2114)
* Add "error" Page for special accounts in Mobile
2024-01-06 14:33:59 -08:00
Joel Jeremy Marquez
8bf0f8e5bf [TS migration] MobileBudget tsx (#2081)
* MobileBudget tsx

* Release notes

* Fix type error

* Update upcoming-release-notes/2081.md

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

* SyncRefresh.tsx

* Remove loadCategories

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
2024-01-06 14:32:16 -08:00
Joel Jeremy Marquez
bc07235017 ESLint no-default-export 13 - final (#2185)
* ESLint no-default-export 13 - final

* Release notes

* Fix lint error

* Add api/migrations to override

* Fix lint error
2024-01-06 14:00:13 -08:00
Joel Jeremy Marquez
794476ac51 ESLint no-default-exports 12 - all loot-core folders except server (#2184)
* ESLint no-default-exports 12 - All loot-core folders except server

* Release notes

* Fix imports
2024-01-06 13:49:02 -08:00
Joel Jeremy Marquez
30bc216142 ESLint no-default-exports 11 - icons (last one for desktop-client package) (#2173)
* ESLint no-default-exports 10 - icons

* Fix icon imports + lint errors

* Release notes

* Fix typecheck error

* Fix icon import

* Fix lint error
2024-01-06 13:38:54 -08:00
Joel Jeremy Marquez
6f8d2574ab ESLint no-default-exports 10 - all desktop-client src folders except icons (#2172)
* ESLint no-default-exports 10 - all desktop-client src folders except icons

* Release notes
2024-01-06 12:57:45 -08:00
Joel Jeremy Marquez
9262b46428 ESLint no-default-exports 9 - all components folder (#2171)
* ESLint no default exports 9 - components folder

* ESLint no default exports 9 - components folder 2

* Release notes
2024-01-06 12:35:50 -08:00
Joel Jeremy Marquez
8e1c11e18e ESLint no-default-exports 8 (#2170)
* Fix default imports

* Fix manager Modals import

* ESLint no default exports 8

* Release notes

* Schedules
2024-01-06 12:14:52 -08:00
Joel Jeremy Marquez
6b5ee3f774 ESLint no-default-exports 7 (#2169)
* Fix default imports

* Fix manager Modals import

* ESLint no default exports 7

* Release notes
2024-01-06 11:54:52 -08:00
Joel Jeremy Marquez
02d3f96c20 ESLint no-default-exports 6 - View.tsx (#2120)
* Fix default imports

* Fix manager Modals import

* ESLint no default export part 6 - View.tsx

* Fix default imports

* Fix imports

* Release notes
2024-01-06 11:40:09 -08:00
Joel Jeremy Marquez
829c83afb2 ESLint no-default-exports 5 - Text.tsx (#2119)
* Fix default imports

* Fix manager Modals import

* ESLint no-default-exports part 5 - Text.tsx

* Fix default import

* Release notes
2024-01-06 11:21:25 -08:00
Joel Jeremy Marquez
5d29585fb7 ESLint no default exports 4 (#2118)
* ESLint no-default-exports part 4

* Fix default imports

* Fix default imports

* Fix manager Modals import

* Release notes
2024-01-06 11:06:39 -08:00
Joel Jeremy Marquez
882fd9f5cd ESLint no-default-exports 3 (#2117)
* ESLint no default exports - part 3

* Fix default imports

* Release notes

* Fix Menu
2024-01-06 10:57:19 -08:00
Jason
d203def230 Fix when pressing Enter adds an extra split transaction when no split remains (#2144)
* Fix pressing enter adds split transaction when no split remains

* Added release notes

* Refactor to use find indstead of findIndex
2024-01-06 09:43:06 -08:00
Joel Jeremy Marquez
4d7cfab8bc ESLint no-default-exports 2 - Button.tsx (#2116)
* ESLint no default imports - Button

* Fix

* Release notes

* Fix Button imports
2024-01-06 09:32:06 -08:00
Joel Jeremy Marquez
84a9269ae4 ESLint no-default-exports 1 (#2115)
* ESLint no-default-imports part 1

* Release notes

* Remove Notes.tsx default export

* Fix Notes imports
2024-01-06 09:06:26 -08:00
Jakub Kuczys
83d2472a55 Ask for confirmation when editing date of a locked transaction (#2134)
* Ask for confirmation when editing date of a locked transaction

* Add release note
2024-01-06 08:14:00 -07:00
Khanh Nguyen
458d556e51 added cleared column in csv export (#2138)
* added cleared column in csv export

* added release note
2024-01-06 08:09:48 -07:00
Jason
d9aeb8db1e Change net worth graph to show more detail in compact card view (#2132)
* Change net worth graph to show more detail in compact card view

* Added release notes

* Update release notes

* Update VRT images
2024-01-06 08:06:24 -07:00
David Kus
85c0352abb Adding filter for reconciled transactions (#2108)
* Adding filter for reconciled transactions

* Adding release note
2024-01-06 08:05:49 -07:00
Matiss Janis Aboltins
7a40a645e6 ♻️ (TypeScript) fix strictFunctionTypes violations (pt 5) (#2072) 2024-01-06 12:58:08 +00:00
Matiss Janis Aboltins
7e9921e9e5 ♻️ (TypeScript) fix strictFunctionTypes violations (pt 4) (#2142) 2024-01-06 12:48:45 +00:00
Matiss Janis Aboltins
02aff1acbe 🔖 (24.1.0) Mobile split transactions (#2177) 2024-01-06 09:56:10 +00:00
Matiss Janis Aboltins
e0d66d3083 🐛 (rules) fix filtering in the rules page (#2141) 2024-01-05 19:06:32 +00:00
Joel Jeremy Marquez
d999e466b7 Fix mobile transaction page amount input (#2166)
* Request active edit on focus

* Release notes

* Track previous focus state

* use inputRef to focus

* Focus total amount effect

* Run active edit action synchronously

* Revert unneeded changes

* Run cleanup synchronously

* Cleanup

* runAction

* Space
2024-01-05 07:05:07 -08:00
Martin French
e589163bb7 [Goals] Negate schedule amount to budget if income (#2125)
* Negate schedule amount to budget if income

* Release notes

* Determine sign at initial calc

To ensure no unintended impact to remainder calcs etc.

* Lint fixes
2024-01-03 08:02:07 -06:00
Matiss Janis Aboltins
d2b86d100c 🐛 (import) fix reconciled transactions getting overriden on import (#2140) 2024-01-01 12:44:57 +00:00
Matiss Janis Aboltins
d8996405c4 revert: ♻️ (TypeScript) fix strictFunctionTypes violations (pt 4) (#2128) 2023-12-29 18:32:10 +00:00
Martin French
e548125907 [Bugfix] Fix update transaction API bug (#2127) 2023-12-27 17:20:58 +00:00
Neil
edbcaba89b Custom reports header fix (#2085)
* tablechanges

* notes

* trigger rerun

* fixes

* lint fixes
2023-12-26 17:55:41 +00:00
Joel Jeremy Marquez
b39d106c04 Mobile category modal menu (#1964)
* Mobile category modal menu

* Release notes

* Apply category and group modals

* Category modal updates + notes

* Reduce notes modal view height

* Update CategoryGroupMenu modal view height

* Update CategoryMenu modal view height

* Fix lint error

* No notes text

* Add budget-table testid on edit mode

* Fix lint error

* Fix lint error

* Remove edit mode tooltip

* Update modals

* Updates + Simplify code by removing edit mode

* Optional closeModal arg

* Fix mobile budget table category divider

* Cleanup + close modal on click outside

* collapseModals action

* Fix lint errors

* Category modal hidden menus + Lift edit state to MobileBudget component

* Hide category / group actions when editing title

* Add margins between buttons

* Fix lint errors
2023-12-22 14:35:46 -08:00
Joel Jeremy Marquez
4894118809 Mobile split transactions (#2068)
* Mobile split transactions

* Release notes

* Fix colors

* Update test ids

* AmountInput component on split transactions

* Add notes to mobile split transaction

* Ease of use improvements + functional components

* Ease of use updates

* VRT updates

* Fix AmountInput blur

* Remove negative state in AmountInput + fix vrt
2023-12-22 13:53:39 -08:00
Matiss Janis Aboltins
c6723da780 ♻️ (TypeScript) fix strictFunctionTypes violations (pt 4) (#2071) 2023-12-22 21:20:29 +00:00
Neil
7a8c320560 Custom Reports Donut Graph refactor (#2098)
* donut refactor

* notes

* fixes
2023-12-22 20:31:36 +00:00
Joel Jeremy Marquez
6fbf0fdc10 [ESLint] Enable prefer-const project-wide (#2113)
* Enable prefer-const project-wide

* Release notes

* Fix remaining lint errors
2023-12-22 11:42:40 -08:00
Matiss Janis Aboltins
efaefcfaa9 ♻️ (typescript) moving DeleteFile modal to TS (#2112) 2023-12-22 19:13:49 +00:00
Matiss Janis Aboltins
73d281b6ee ♻️ (eslint) disallow unnecessary curly braces (#2111) 2023-12-22 09:30:05 +00:00
Matiss Janis Aboltins
03e943f383 ♻️ (TypeScript) fix strictFunctionTypes violations (pt 3) (#2070) 2023-12-22 09:29:48 +00:00
Matiss Janis Aboltins
5854dffd50 🐛 fix category spending report (#2096) 2023-12-19 18:40:08 +00:00
Matiss Janis Aboltins
c727e3e980 ♻️ (TypeScript) fix strictFunctionTypes violations (pt 2) (#2066) 2023-12-19 18:01:06 +00:00
youngcw
b385c715ef [Goals]: don't run templates in hidden groups (#2100)
* don't run templates in hidden groups

* note

* lint
2023-12-18 08:00:30 -07:00
youngcw
77e550f028 [Goals]: fully skip budgeted categories when only applying (#2099)
* remove budgeted categories from list when only applying

* cleanup

* speed up the category removal

* note
2023-12-18 07:58:49 -07:00
DJ Mountney
9ea8e86bb3 (ESLint) Enforce filename extensions for jsx (#2101) 2023-12-18 11:00:47 +00:00
Neil
273fa8cd59 Custom reports: make views global (#2094)
* make views global

* notes and lint fixes

* fixes

* lint fix

* fix

* fix
2023-12-17 22:18:57 +00:00
IzStriker
d4c8b5fa16 [TS migration] Reafactor tooltips.js to use typescript (#2073) 2023-12-17 20:55:16 +00:00
Neil
e62e8ca24e Custom Reports Enable Legend (#2078)
* enable Legend

* notes

* adding type

* overhaul

* calculateLegend
2023-12-16 21:38:45 +00:00
Neil
4497fbcb10 Custom Reports date paused (#2080)
* work

* fixes

* updates

* update table layout

* revert changes

* notes

* updae names and improve flow
2023-12-15 15:05:06 -08:00
Matiss Janis Aboltins
8a15caf42d ♻️ (TypeScript) fix strictFunctionTypes violations (pt 1) (#2065) 2023-12-15 18:09:36 +00:00
iOSLife
af9efa09f0 API – Return Hidden for Category and CategoryGroup (#2062) 2023-12-15 18:09:14 +00:00
HansiWursti
a5557ca032 Fix issue 1878 (#2093)
* Fix issue 1878

* Add release notes
2023-12-15 10:38:47 -07:00
HansiWursti
0bf587bcf5 Added BG Color to view to fix Issue 2089 (#2092)
* Added BG Color to view to fix Issue 2289

* add release notes
2023-12-15 08:46:52 -07:00
Matiss Janis Aboltins
e11b65719e 👷 (ci) adding helper comments for failed CI jobs (#2074) 2023-12-14 19:02:05 +00:00
Julian Dominguez-Schatz
c09a85f340 Add schedule end date/count field (#1899)
* Add "end" field with date/count options

* Use "end" field to generate schedule

* Show "end" field in recurring description

* Disable weekend before/after picker when not enabled

* Add release notes

* Fix failing typechecks

* Add some description tests

* PR feedback

* 'Features', not 'Feature'

* Fix goal templates infinite loop

* Empty commit to bump ci

* Fix bug where schedule templates in the past would apply incorrectly

For example, if you had a schedule which started in November 2023 for
1.00, and you applied the schedule in October 2023, then you would end
up with a value of 0.50 applied in October.

* Fix handling of schedules with an end date

This commit also includes a refactor of the skip-weekend logic: rather
than referring only to dates with skipped weekends (which requires
checking whether the "next date" request worked correctly), we track a
"base date" which is the previous value of the schedule according to the
rrule, excluding any weekend-skipping. This lets us use `addDays(baseDate, 1)`
to get the next occurrence, regardless of the weekend behaviour.

Doing things this way ensures that the loop will always make progress.

* Only compute skipped weekend if weekend skips were requested

* Fix typo in iterate-schedule-occurrences code

We should be using `nextBaseDate` to derive the next base date, not
`nextDate`; this is because we want the base date to be guaranteed to
make progress in each loop iteration, so we can finish in at most 30
iterations without duplicate base dates.

* Use const

* Revert const -> let for one mutable variable
2023-12-14 05:43:16 -06:00
Joel Jeremy Marquez
f90fe04b2b Add left and right margins to modals (#2082)
* Add left and right margins to modals

* Release notes
2023-12-13 19:47:47 -08:00
spezzino
ca55d9c85e add support for auto theme (#1906)
* add support for system theme

* add release notes

* Rename auto theme

* add theme selector

* update visual snapshots

* update snapshots

* update snapshots
2023-12-13 15:10:14 -07:00
Neil
4ada92071e Custom Reports typescript updates and small functional changes (#2046)
* work

* notes

* error fixes

* updates

* card fix

* fix filters

* fixes
2023-12-12 11:34:58 -08:00
DJ Mountney
e848946898 Remove older version of react-router (#2064) 2023-12-12 17:58:22 +00:00
Neil
9da05543c3 Dark Theme color fixes (#2048)
* subdued fix

* notes

* fixes

* upcoming

* autocomplete menu

* make notes consistenet on budget page

* VRT updates
2023-12-12 06:40:52 -08:00
Neil
8a721bf2e0 Renaming variables for reports files (#2069)
* work

* notes

* error fixes

* updates

* card fix

* fix filters

* splitting PR work

* notes

* fixes

* lint fix

* Update upcoming-release-notes/2069.md

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

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
2023-12-12 05:06:05 -08:00
Lucas
36914abcd4 Cashflow.js -> Cashflow.tsx (#2005) 2023-12-12 10:21:48 +00:00
Neil
cd2d186599 Add new types for reports files (#2067)
* work

* notes

* error fixes

* updates

* card fix

* fix filters

* splitting PR work

* notes
2023-12-11 16:31:25 -08:00
Joel Jeremy Marquez
b3bcff094d [Maintenance] ESLint - prefer-const on loot-core server (#2032)
* Another round of prefer-const rule updates

* Release notes

* Fix test error

* Fix sync.ts
2023-12-09 13:22:16 -08:00
Matiss Janis Aboltins
7955fe7aed ♻️ (typescript) refactor FixedSizeList to TS (#2022) 2023-12-07 19:30:29 +00:00
Neil
2741422c0a Custom Reports optimization (#1988)
* Range fix and payee fix

* bug fixes and UI tweaks

* range options, hover UI

* Select - UnSelect All Buttons

* fix hidden group bug

* YAxis PrivacyFilter

* notes

* more privacyFilter graphs

* overflowY fix

* Loading Indicator

* Fix Filter button hover

* data revamp

* review fixes

* LoadingIndicator fixes

* remove a loop

* filterbuttontype

* lint fixes

* review fixes

* filtersbutton

* updates

* Split out functions to separate files

* uncategorized optimization

* rename ambiguous variables

* notes

* remove indexStack

* renaming variables

* Improve scrolling of tableGraph

* revert renaming variables

* code fixes

* lint fixes

* review fixes

* fix

* review fixes

* variable name changes

* const eslint fixes

* remove indexStack
2023-12-06 09:33:19 -08:00
Tuhin Ghose
cde4551eb7 [Maintenance] Migrating util.js and chartTheme.js to typescript (#2009) 2023-12-06 08:26:17 +00:00
Matiss Janis Aboltins
7174fccfe4 ♻️ (typescript) adding strict typings to utils.ts (#2023) 2023-12-06 08:22:33 +00:00
Joel Jeremy Marquez
0303292a28 [Maintenance] ESLint: prefer-const components folder part 2 (#2034)
* ESLint prefer-const components folder part 2

* Release notes
2023-12-05 13:36:29 -08:00
Joel Jeremy Marquez
f95df06800 [Maintenance] ESLint: prefer-const components folder part 1 (#2033)
* ESLint prefer-const components folder part 1

* Release notes
2023-12-05 13:14:37 -08:00
DJ Mountney
3680d45814 Add API category tests (#2036) 2023-12-05 20:08:48 +00:00
Joel Jeremy Marquez
dc872647a9 [Maintenance] Use Page component for mobile pages (#1993)
* Use Page component for mobile pages

* Release notes

* Use Button instead of Link in MobileBackButton

* Update mobile budget table to use Page component

* Settings page cleanup

* Fix lint error

* Updates + small font size increase in  page headings

* Fix rebase error

* Button height

* Revert payees navtab
2023-12-05 11:18:35 -08:00
Matiss Janis Aboltins
7a45d467b7 ♻️ (eslint) enable 'react/no-children-prop' rule and fix issues (#2029) 2023-12-05 18:58:22 +00:00
Joel Jeremy Marquez
79aa07ff1a Fix bulk edit field modal in desktop (#2031)
* Fix bulk edit field modal in desktop

* Release notes
2023-12-05 09:44:30 -08:00
Kyle Mckay
c4ff099f26 Fix failure to create category with deleted name (#2002)
* Fix failure to create category with deleted name

I'm not 100% familiar with the design of the data model so may have
misinterpreted what's going on here, but how I read this:

- The tombstone flag is used to soft delete categories.
- When creating a new category, duplicate names within a group are
  prevented.
- When checking for duplicate names, the tombstone flag was unchecked
  which meant deleted categories were falsely blocking creation.

I had a look at category deleteion logic to verify that simply including
the tombstone flag in this check is sane and see that there's a category
mapping being maintained to redirect one category to another on
deletion. So from what I can tell the correct behaviour here is to allow
a new category with the previously deleted name, rather than to revive
the old category (to preserve that old mapping lineage).

* Add release note

* Add regression test
2023-12-05 08:48:16 -07:00
Vishnu Kaushik
ad2b577515 Fix #1977: Filter Amount formatting issue (#2008)
* Fix #1977: Filter Amount formatting issue

* Fix linting and add release notes
2023-12-05 08:42:54 -07:00
Michael Clark
5f52801869 [Maintenance] Adding Aria labels for accessibility (#2025) 2023-12-04 19:31:38 +00:00
Ameek Singh
6bfd9586e0 [Maintenance] Converting dateRange and useReport to tsx (#2007) 2023-12-02 22:43:56 +00:00
Michael Clark
f36713e0be [Maintenance] BudgetTotals, GoCardlessLink, Import, WelcomeScreen components to Typescript. (#2004) 2023-12-02 22:43:29 +00:00
DJ Mountney
8b20169b59 Add some initial api tests for budgets and accounts (#1991) 2023-12-02 20:42:53 +00:00
Matiss Janis Aboltins
da03acc394 🔖 (23.12.0) darkmode, transaction locking, mobile updates and more (#2003) 2023-12-02 19:26:02 +00:00
Joel Jeremy Marquez
5d1f2d48ae Larger mobile autocomplete fonts and paddings (#1900)
* Larger mobile autocomplete fonts and paddings

* Release notes

* VRT + update tests

* Update tests

* Update data-highlighted and tests

* Use styles text

* Fix tests

* Fix tests

* Fix tests

* Fix tests

* Fix tests

* Fix tests

* Adjust Add Transaction padding + VRT updates

* Larger autocomplete text and divider

* Fix rebase

* Fix rebase

* Fix icons

* Adjust fonts

* Fix lint errors

* PR feedback

* VRT

* Update embedded autocomplete highlight hover color

* Refactor create payee button

* Embedded create payee button color

* Dummy change to re-run CI
2023-12-01 13:10:01 -08:00
youngcw
c96782d7c1 [Goals]: Sort the priorities properly (#2000)
* sort properly

* note
2023-12-01 08:40:35 -07:00
Neil
5d61dfce68 Update rules API (#1987)
* Update rules.ts

* notes

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

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

* Entity update

* fix

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
2023-11-30 10:27:51 -08:00
youngcw
5a81a25b7e fix broken schedule amount sign in firefox (#1992)
* fix broken schedule amount sign in firefox

* note

* delete line
2023-11-30 09:50:31 -07:00
Stefan Hall
29f323e721 Validates minimum node version to 18.12.0 for @actual-app/api npm package (#1980) 2023-11-28 19:19:18 +00:00
shall0pass
c462604833 [Bugfix] Goals: Schedule overbudget condition (#1984)
* fix overbudget in schedules template

* release note
2023-11-27 18:18:26 -06:00
Neil
e48f36cd20 Custom Reports Bug Fixes (#1930)
* Range fix and payee fix

* bug fixes and UI tweaks

* range options, hover UI

* Select - UnSelect All Buttons

* fix hidden group bug

* YAxis PrivacyFilter

* notes

* more privacyFilter graphs

* overflowY fix

* Loading Indicator

* Fix Filter button hover

* review fixes

* LoadingIndicator fixes

* remove a loop

* filterbuttontype

* review fixes

* filtersbutton

* updates
2023-11-26 12:19:58 -08:00
Michael Clark
1ed84059d7 [Maintenance] Update ConfirmCategoryDelete, GoCardlessExternalMsg, ManageRulesModal to tsx (#1972) 2023-11-26 19:49:26 +00:00
William Kurniawan
5d8b96a749 Fix cancel add category group (#1975) 2023-11-26 16:38:05 +00:00
Julian Dominguez-Schatz
0920bdc3fa Fix bug in rule transaction apply preventing amount overrides (#1976) 2023-11-26 16:35:09 +00:00
Mohamed Muhsin
c3a9b4dda3 [refactor] Migrate Discover schedules to tsx (#1946) 2023-11-26 15:51:18 +00:00
Matiss Janis Aboltins
eab0068428 🎨 (fix) gocardless success button color (#1970) 2023-11-26 15:50:28 +00:00
Joel Jeremy Marquez
0d1b962b2f Fix budget amount not saved when clicking on another budget cell (#1965)
* Fix budget amount not saved when clicking on another budget cell

* Release notes
2023-11-25 16:52:38 -08:00
Joel Jeremy Marquez
67b9143dfc Transfer and Off Budget category in mobile (#1955)
* Transfer and Off Budget category in mobile

* Release notes

* Fix typo

* Update lookupName callers
2023-11-25 16:52:05 -08:00
Zach Whelchel
e7f298e32a [Bugfix] Fixed modal error and transactions now unlock when moved across accounts. (#1962) 2023-11-25 14:52:01 +00:00
Matiss Janis Aboltins
516f0c259f 🔧 (vrt) make screenshot comparisons more strict (#1960) 2023-11-25 14:34:24 +00:00
Neil
2c87c60328 Dark Theme Live (#1925)
* Remove Featureflag

* notes

* VRT updates

* Dark Theme fixes

* VRT updates

* VRT updates

* Revert "VRT updates"

This reverts commit 7d669f2df2.

* Revert VRT

Reverting VRT

* VRT updates

* pillbackground

* VRT updates

* Theme Selector

* VRT Updates

* notes

* VRT updates
2023-11-24 13:20:03 -08:00
DJ Mountney
b4fd6e86ed Create category rules for ynab imports (#1944) 2023-11-23 08:36:15 +00:00
Matiss Janis Aboltins
a3e71a8b49 🔧 (eslint) enable object-shorthand:properties rule (#1959) 2023-11-22 22:52:53 +00:00
Joel Jeremy Marquez
aa9c992f2e Part 2 of eslint prefer-const (#1958)
* Part 2 of eslint prefer-const

* Release notes

* Update
2023-11-22 14:28:09 -08:00
Zach Whelchel
ca498b19cc Lock transactions after reconcilliation (#1789) 2023-11-22 22:14:34 +00:00
Matiss Janis Aboltins
8be2389fd9 ♻️ (typescript) ported gocardless auth file to TS (#1941) 2023-11-22 21:54:43 +00:00
Matiss Janis Aboltins
46988800ef ♻️ (typescript) refactor global-events to TS (#1942) 2023-11-22 19:35:30 +00:00
Joel Jeremy Marquez
881999bcfe ESLint prefer-const (#1956) 2023-11-22 11:12:22 -08:00
Joel Jeremy Marquez
9c124e8e44 Consistent button size in budget title bar + use zondicon eye icon (#1951)
* Consistent button size in budget title bar + use zondicon eye icon

* Release notes

* VRT
2023-11-22 11:02:02 -08:00
Kyle Mckay
3306963c54 [Maintenance] Refactor payee table to typescript (#1948) 2023-11-22 17:58:07 +00:00
Kyle Mckay
baa474843a [Maintenance] Split up large payee management components file (#1950) 2023-11-21 19:27:20 +00:00
Matiss Janis Aboltins
6ed1b58321 🔧 (eslint) disallow using 'var': no-var rule (#1949) 2023-11-21 19:18:13 +00:00
Paul Sukow
28266ed9a2 Fix switching budget from rollover budget to report budget and immediately back does not work (#1933)
* Fix switching budget from rollover budget to report budget and immediately back does not work

* Pr Changes
2023-11-21 08:15:18 -08:00
Julian Dominguez-Schatz
cd6bd9ece8 Fix crash when undoing a rule application (#1885)
* Undo shouldn't open modal if it wasn't open before

* Add release notes
2023-11-21 00:19:31 -08:00
Michael Huynh
fb2f712c16 Fix flickering scroll bar on mobile transaction input (#1782) (#1929) 2023-11-20 12:46:47 -08:00
Joel Jeremy Marquez
f58fae8d16 Support multiple months in experimental ofx parser (#1921)
* Support multiple months in experimental ofx parser

* Release notes

* Fix lint error
2023-11-20 12:44:28 -08:00
Joel Jeremy Marquez
a10b10a87b [regression] Remove extra padding in mobile accounts page (#1916)
* [regression] Remove extra padding in mobile accounts page

* Release notes

* VRT
2023-11-20 12:44:12 -08:00
DJ Mountney
47007232b8 Switch from en-ZA to en-SE for space-comma NumberFormat (#1938) 2023-11-20 20:28:55 +00:00
Stefan Hall
4761e9ce2f Specify minimum node version for @actual-app/api nom package (#1934) 2023-11-20 18:37:38 +00:00
Kyle Mckay
849262c95e [Maintenance] Refactor amount input to typescript (#1936) 2023-11-20 18:29:19 +00:00
Shazib Hussain
e6e184c412 Fix Electron Build (#1926) 2023-11-20 18:16:25 +00:00
Shazib Hussain
9c6d9ecf0a Don't allow duplicate category names (per group) (#1833)
* Remove author from electron package.json

* Don't allow dupes in cat names (per group)

* Release Notes

* Handle reorders and moves

* Fix linter warnings

* Fix typecheck

* Show the name of the duplicate category

* missed func call

* Upper case before compare

* lint fixes

---------

Co-authored-by: Shazib Hussain <contact@shazib.com>
2023-11-20 09:41:13 -07:00
Joel Jeremy Marquez
65273127f5 Mobile report budget (#1880)
* Mobile report budget

* Release notes

* Update bindings

* Cleanup

* Mobile report budget summary + reuse desktop components
2023-11-18 20:22:05 -08:00
Joel Jeremy Marquez
b5530085bb Mobile create account (#1853)
* Mobile create account

* Release notes

* Update add button style

* Add back desktop page header padding

* Empty accounts handling

* decimal keyboard on CreateLocalAccount balance input

* VRT updates
2023-11-18 20:21:41 -08:00
Michael Clark
9ec82d52c9 [Maintenance] Update CloseAccount, AccountAutocomplete, SavedFilterAutocomplete, PayeeAutocomplete components to Typescript. (#1923) 2023-11-18 13:21:21 +00:00
shall0pass
93922567fc [Bugfix] Goals: Fix Schedule Infinite loop (#1917)
* logic

* release note
2023-11-17 11:09:13 -06:00
Neil
7c0b7a2f17 Duplicate color removal (#1911)
* duplicate color removal

* notes
2023-11-16 02:17:51 -08:00
Neil
e8055bbc35 Mobile pages standardized (Colors/UI) (#1874)
* Mobile Color Consistency

* VRT updates

* color updates

* notes

* Sync Text

* Adjust header font smaller

* color and format adjustments

* tidying header buttons

* color and button adjustments

* Header Text color

* VRT updates

* back button changes

* VRT changes

* adjust buttons

* lint fix

* darkTheme header background

* VRT updates

* VRT updates
2023-11-16 00:08:46 -08:00
Neil
7fdd9767ba sideBar Dark Color changes (#1887)
* sideBar Dark Color changes

* notes

* VRT updates

* test fixes

* color fixes

* Revert "test fixes"

This reverts commit 3c6131b2c4.

* Revert "VRT updates"

This reverts commit b84d7659a4.

* color update

* VRT updates

* calendar changes

* VRT update

* notes update

* color change

* Revert "VRT update"

This reverts commit 4c5aba4247.

* Revert "VRT updates"

This reverts commit ba142b0653.

* VRT updates
2023-11-16 00:05:58 -08:00
Neil
1f105999af Customizeable Reports (#1791)
* Reorganize and add graphs

* Create Customizable Chart

* Notes

* Hide Menu update Donut

* lint fixes

* Organize Menus

* Change Title

* UI changes

* UI updates

* Add Data Table

* Functionality additions and Privacy Filters

* Date filters working and formatting changes

* Fix default spreadsheet and add tableGraph

* Integrate Summary Data and Split Legend

* started adding functionality on charts

* list fix

* Enabling more graphs, fixing errors

* Legend, interactions, Empty Rows Filter

* fixes for EmptyRows/interactions/legends

* formatting UI and filtering data

* format date

* fix errors

* Fix Legend Order

* lint fixes

* Add tooltips

* Feature Flag

* fix overview card, fix offbudget checkbox

* Revamped dataType, added scrollBars

* data display adjustments

* data spreadsheet updates/groups added to matrix

* Add Category Selector

* Add Labels Button

* formatting fixes

* Add Averages to dataTable

* data bug fix

* Added all type back in with exceptions

* formatting

* split assets/debts, add Uncategorized

* bug fixes and UI updates

* add scrollbars to table

* formatting dataTable

* tooltips, navigation and graph labels

* Code clean-up and re-org

* revert color change

* Change labels name

* organize files

* code cleanup

* Tooltip Colors

* Descoping legend for future PR

* descope legend & rename split

* rename type variable to be more descriptive

* adjustments for sankey and eslint merges

* notes update

* code review fixes

* code fixes

* fix date selections
2023-11-16 00:04:29 -08:00
Stefan Hall
f970263c72 Add typings condition operators for Action class (#1909) 2023-11-15 17:18:06 +00:00
Neil
fecc9178b3 Color Consolidations (#1868)
* Color normalization

* color updates

* VRT updates

* update colors table

* VRT updates

* more VRT updates

* pillborder

* VRT updates

* Revert "VRT updates"

This reverts commit ae58317b00.

* Revert "more VRT updates"

This reverts commit a316745efd.

* Revert "VRT updates"

This reverts commit 03797af362.

* Revert "VRT updates"

This reverts commit 454adac251.

* VRT refresh

* border color

* Checkbox Border

* VRT updates
2023-11-15 01:18:46 -08:00
Matiss Janis Aboltins
08c80b6f58 ⬆️ (yarn) upgrade to v4 and better-sqlite3 to v9.1.1 (#1902) 2023-11-14 08:34:12 +00:00
Joel Jeremy Marquez
a3995582c4 Swipe up mobile navbar (#1758)
* Swipe up mobile navbar to reveal more menus

* Release notes

* Revert navbar button height to 70

* Reduce debounce value

* More tabs coming soon

* VRT update

* VRT update

* Fix: e2e tests

* Smoother mobile navtabs

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
2023-11-13 14:14:16 -08:00
Shaan Khosla
5008eb022f Sankey with Recharts (#1739)
* added sankey plot

* fix sankey

* formatting

* formatting

* lint

* reduce margin

* experimental flag

* update location of recharts install

* truncate tooltip

* add titles to node and sizing

* better filtering

* comments, types, and check if data exists

* don't log

* clean up extra views

* responsive container, and fix label in graph

* change back

* fix bug and font

* static tooltip

* update overview to fit both sankey and category spending

* overview sankey

* increase iterations, fix right text, and release notes

* remove is out

* lint

* fix tooltip space

* fix margins

* format and efficient sql payees query

* restructure category sum value

* add tooltip names...again

* conditionally use container

* use useCategories
2023-11-12 16:01:12 -05:00
Joel Jeremy Marquez
353e7be31f Support ofx INVSTMTMSGSRSV1 (#1876)
* Support ofx INVSTMTMSGSRSV1

* Release notes
2023-11-11 13:28:48 -08:00
Michael Clark
30c7024663 [Maintenance] Convert ExpenseGroup, ExpenseCategory, IncomeCategory components to Typescript. (#1897) 2023-11-11 21:05:45 +00:00
youngcw
22efe74ec8 add budget tables to the aql schema (#1895)
* add budget tables to the schema

* note

* note fix

* lint
2023-11-11 13:08:14 -07:00
Matiss Janis Aboltins
5792b15cb5 🔧 (eslint) enabling 'react/no-unstable-nested-components' rule (#1893) 2023-11-11 18:46:28 +00:00
shall0pass
168b79a178 [Maintenance] Goals break out goal target calculations to individual files (#1888)
* move goal calculations to separate files by type

* bug squashing

* release note
2023-11-11 10:48:33 -06:00
Michael Clark
7062f2a7d9 Maintenance: BudgetSummaries, MonthPicker, SidebarCategory components to tsx. (#1879) 2023-11-10 21:38:18 +00:00
Matiss Janis Aboltins
af666458d3 (VRT) darkmode visual regression tests (#1860) 2023-11-10 21:17:07 +00:00
Neil
184b302273 Remove Static Colors (#1875)
* Color Changes

* notes
2023-11-09 15:51:58 -08:00
Neil
3004f336da Final Colors Consolidation (#1871)
* Color Updates

* color change

* notes

* fix preview background
2023-11-09 15:45:59 -08:00
James Costian
45bb7696c3 Support full month names when importing CSV transactions (#1862)
Support dates like "Dec 24, 2020" and "december 24, 2020"
2023-11-09 10:16:23 -07:00
James Costian
199a9f838d Make Select All respect filters and splits (#1864) 2023-11-09 07:11:51 -08:00
youngcw
df5aa3186c Goals: Save full goal value and add an indicator of goal status (#1780)
* first pass at progress bar

* db migration / enter goal in db

* add getGoal function

* stabilize

* whoops

* TS

* reset goal in db if no template found

* reconfirm

* release note

* typo

* rename migration

* to ms

* move priority logic, consistent variable names,

* fixup

* clear goal if template removed

* Visual goals (#40)

* 🔥 removing privacyMode feature flag (#1688)

* 🎨  fix multiline label in schedules modal (#1687)

* Update Visual Regression README File (#1689)

* Fix typo in GoCardlessLink.js (#1684)

happend -> happened

* queried cleared balance for tooltip (#1678)

* Dark Theme Reports/Settings (#1512)

* 🐛 Mobile account transaction list: Fix sticky date section headers (#1698)

* 👷  do not cancel github ci jobs on master branch (#1692)

* Sidebar Account Fix (#1703)

* Dark Theme Final (#1513)

* Category autocomplete should only search selectable categories  (#1681)

* set colors based on a goal value

* extra comment

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
Co-authored-by: Crazypkr1099 <nicholas.lacasse430@gmail.com>
Co-authored-by: Ikko Eltociear Ashimine <eltociear@gmail.com>
Co-authored-by: Shaan Khosla <35707672+shaankhosla@users.noreply.github.com>
Co-authored-by: Neil <55785687+carkom@users.noreply.github.com>
Co-authored-by: Trevor Farlow <trevdor@users.noreply.github.com>

* update release note

* lint

* use null as cleared state

* show goal status via colors (#41)

* cleanup

* I think its working

* lint

* fix report budget, by adding in the goal coloring

* fix the error by adding colors to the report side (#42)

* [refactor] Migrate Schedules Table to typescript (#1691)

* 🔧  removing unnecessary manual module resolution (#1707)

* 🐛 (mobile) scrolling in lists with pull-to-refresh (#1706)

* 💄 (mobile) updating apple home-screen icon (#1705)

* Enhance Y-Axis Scaling on Net Worth Graph (#1709)

* fix report budget, by adding in the goal coloring

---------

Co-authored-by: Mohamed Muhsin <62111075+muhsinkamil@users.noreply.github.com>
Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
Co-authored-by: Crazypkr1099 <nicholas.lacasse430@gmail.com>

* report budget database updates

* Goal progress bar (#1734)

* first pass at progress bar

* db migration / enter goal in db

* add getGoal function

* stabilize

* whoops

* TS

* reset goal in db if no template found

* reconfirm

* release note

* typo

* rename migration

* to ms

* move priority logic, consistent variable names,

* fixup

* clear goal if template removed

* Visual goals (#40)

* 🔥 removing privacyMode feature flag (#1688)

* 🎨  fix multiline label in schedules modal (#1687)

* Update Visual Regression README File (#1689)

* Fix typo in GoCardlessLink.js (#1684)

happend -> happened

* queried cleared balance for tooltip (#1678)

* Dark Theme Reports/Settings (#1512)

* 🐛 Mobile account transaction list: Fix sticky date section headers (#1698)

* 👷  do not cancel github ci jobs on master branch (#1692)

* Sidebar Account Fix (#1703)

* Dark Theme Final (#1513)

* Category autocomplete should only search selectable categories  (#1681)

* set colors based on a goal value

* extra comment

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
Co-authored-by: Crazypkr1099 <nicholas.lacasse430@gmail.com>
Co-authored-by: Ikko Eltociear Ashimine <eltociear@gmail.com>
Co-authored-by: Shaan Khosla <35707672+shaankhosla@users.noreply.github.com>
Co-authored-by: Neil <55785687+carkom@users.noreply.github.com>
Co-authored-by: Trevor Farlow <trevdor@users.noreply.github.com>

* update release note

* lint

* use null as cleared state

* show goal status via colors (#41)

* cleanup

* I think its working

* lint

* fix the error by adding colors to the report side (#42)

* [refactor] Migrate Schedules Table to typescript (#1691)

* 🔧  removing unnecessary manual module resolution (#1707)

* 🐛 (mobile) scrolling in lists with pull-to-refresh (#1706)

* 💄 (mobile) updating apple home-screen icon (#1705)

* Enhance Y-Axis Scaling on Net Worth Graph (#1709)

* fix report budget, by adding in the goal coloring

---------

Co-authored-by: Mohamed Muhsin <62111075+muhsinkamil@users.noreply.github.com>
Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
Co-authored-by: Crazypkr1099 <nicholas.lacasse430@gmail.com>

* report budget database updates

* Fix schedule searchbar (#1729)

---------

Co-authored-by: youngcw <calebyoung94@gmail.com>
Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
Co-authored-by: Crazypkr1099 <nicholas.lacasse430@gmail.com>
Co-authored-by: Ikko Eltociear Ashimine <eltociear@gmail.com>
Co-authored-by: Shaan Khosla <35707672+shaankhosla@users.noreply.github.com>
Co-authored-by: Neil <55785687+carkom@users.noreply.github.com>
Co-authored-by: Trevor Farlow <trevdor@users.noreply.github.com>
Co-authored-by: Mohamed Muhsin <62111075+muhsinkamil@users.noreply.github.com>

* working dynamic colors.  Need to figure out what changes are actually needed

* cleanup

* more cleanup

* lint

* reset the goal when applying a single template

* make getCategory function

* remove some unneeded changes

* actually remove the changes, not just comment

* cleanup some unneeded code that was causing some bugs. Works for me, but should be vetted more

* lint

* add json definitions to database

* use template feature flag to enable colors

* some fixes

* don't set goals for remainders, remove unneeded change

* lint

* release note

* lint again

* fix mobile crash

* undo changes in CellValue.tsx

* lint

* use getStyle

* move status calc to helper

* lint

* recommendations

* suggestion

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

---------

Co-authored-by: shall0pass <20625555+shall0pass@users.noreply.github.com>
Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
Co-authored-by: Crazypkr1099 <nicholas.lacasse430@gmail.com>
Co-authored-by: Ikko Eltociear Ashimine <eltociear@gmail.com>
Co-authored-by: Shaan Khosla <35707672+shaankhosla@users.noreply.github.com>
Co-authored-by: Neil <55785687+carkom@users.noreply.github.com>
Co-authored-by: Trevor Farlow <trevdor@users.noreply.github.com>
Co-authored-by: Mohamed Muhsin <62111075+muhsinkamil@users.noreply.github.com>
Co-authored-by: Joel Jeremy Marquez <joeljeremy.marquez@gmail.com>
2023-11-08 12:44:45 -07:00
Sreetam Das
1c68c3f964 [Bugfix]: Account filter for budgeted and offbudget accounts (#1867)
* Update AQL filter for budgeted and offbudget accounts

* Add release note
2023-11-07 11:52:32 -08:00
Neil
a15f80e771 Warning Color Consolidations (#1798) 2023-11-05 17:29:55 +00:00
Jesse Visser
be18891957 Enhancement: Add option to select in/out field during import (#1788) 2023-11-05 14:49:00 +00:00
Stefan Hall
a6dae398da fixed:issue->#1835 Support NYNAB import of transactions that contain subtransactions tha… (#1836) 2023-11-05 14:42:23 +00:00
Joel Jeremy Marquez
d8c885bf4e Mobile budget pull down to sync (#1858)
* Mobile budget pull down to sync

* Release notes
2023-11-04 16:45:16 -07:00
Evan Trujillo
f94d8aff9f [Bugfix]: Dark mode - darker tint for pageTextLink (#1765) 2023-11-04 21:47:02 +00:00
Seth Gillett
a549cdf0e7 fixed:issue->#1762 Schedule creation modal notify user of weekend skip option (#1840) 2023-11-04 15:58:26 +00:00
凯 - kǎi
b7a2f16246 fix styling of transaction page on mobile (#1820) 2023-11-04 15:31:35 +00:00
Michael Clark
0ec88ecc24 Maintenance: Moving some components to Typescript (#1834) 2023-11-04 15:23:09 +00:00
Matiss Janis Aboltins
39fa9f2097 🔖 (23.11.0) (#1859) 2023-11-04 09:27:13 +00:00
Matiss Janis Aboltins
9040cab600 🐛 fix: bring back rollover arrow in budget page (#1856)
Closes #1845
2023-11-03 18:44:05 +00:00
Matiss Janis Aboltins
e56cb4bc85 🐛 fix: add missing top border for budget menu icon (#1855)
* 🐛  fix: add missing top border for budget menu icon

* Release notes
2023-11-03 18:33:12 +00:00
Joel Jeremy Marquez
fc08baf7ae Fix mobile budget click handlers (#1844)
* Fix mobile budget click handlers

* Release notes
2023-10-31 07:48:32 -07:00
Joel Jeremy Marquez
7325153da1 Mobile balance cover/transfer/rollover overspending (#1802)
* Mobile balance cover/transfer

* Release notes

* Fix errors

* Cleanup

* Fix hit boxes and add line clamp

* Fix styling

* Prevent simultaneous field edits

* Use onPointerDown

* Remove balanceTooltip close effect
2023-10-29 20:26:12 -07:00
Joel Jeremy Marquez
e12793e7eb Inline mobile category and group edit (#1781)
* Inline mobile category and group edit

* Release notes

* Allow one edit at any time

* Mobile: long press to edit category/group

* Mobile: set userSelect: 'none'

* Move getLongPressEvents

* Add role to prevent tap-to-search

* Add role to text

* Prevent default on longpress

* Add tabIndex to disable tap-to-search

* Add back userSelect

* Role updates

* Remove userSelect

* Revert long press category name

* Remove unused import

* Fix lint error

* Edit mode

* Do not allow to start an edit when another  field is currenty being edited

* Fix blur event not firing

* Grey out zero spent or balance values

* VRT update

* Fix budget cell being zero on click

* Delete useLongPress
2023-10-28 09:42:47 -07:00
Kit PANG
5fe146ee0a Allow categorise transfer to off budget accounts on mobile (#1824)
* Allow categorise transfer to off budget accounts

* Add release notes
2023-10-27 09:48:01 -07:00
Joel Jeremy Marquez
0af2987cef Hide mobile nav tabs on scroll (#1745)
* Hide mobile nav tabs on scroll

* Release notes

* Reduced navbar bottom padding

* Make hide transition a bit faster

* Update scroll defaults

* VRT snapshots

* Fix: safari scroll bounce effect disrupting the show/hide of bottom nav

* Update release notes

* No tap highlight on MobileNavTabs

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
2023-10-22 19:12:39 -07:00
Joel Jeremy Marquez
e266093a4a Custom useNavigate which tracks previous location (#1808)
* Custom useNavigate which tracks previous location

* Release notes

* Fix lint errors
2023-10-22 11:41:07 -07:00
Michael Clark
19f0efb654 Maintenance: Converting Utils and Sort to typescript (#1823) 2023-10-22 16:18:59 +01:00
Neil
e0b2eab475 Error Color Consolidation (#1756)
* Error Color Consolidation

* notes

* color changes
2023-10-21 14:33:30 -07:00
Neil
25f4e2a8b5 Page color updates (#1799)
* page color updates

* notes
2023-10-21 14:23:02 -07:00
Shaan Khosla
d338a73794 add styling back to cash flow graph (#1819)
* add styling back

* release notes

* vrt
2023-10-21 10:21:16 -07:00
Shaan Khosla
75f2bf8b1b 2 new vrt tests for reports (#1814) 2023-10-19 17:33:31 +01:00
Michael Clark
eb54487d8e Maintenance: Convert FixEncryptionKey, Loading, AnimatedLoading components to TypeScript (#1784) 2023-10-19 08:14:50 +01:00
Michael Clark
5cc6bad34b Maintenance: Updating icons generator to output typescript (#1785) 2023-10-19 08:13:04 +01:00
Neil
acf4456077 darkMode Fixes (#1800)
* darkMode Fixes

* notes

* AutoComplete Colors

* Sync button fix

* dark color changes
2023-10-16 07:18:33 -07:00
youngcw
b45615e6fc Darkmode: fix theming on budget table (#1795)
* fix darkmode for budget table

* note

* lint

* fix totals line, fix group colot
2023-10-16 07:13:32 -07:00
Michael Huynh
38609ee25a Add user-friendly theme option labels (#1796) (#1797) 2023-10-16 07:05:01 -07:00
Joel Jeremy Marquez
cae2b9cd5a Allow linked child transactions (#1759)
* Allow linked child transactions

* Release notes
2023-10-13 21:19:42 -07:00
Joel Jeremy Marquez
4cacc845c0 Fix mobile budget header sync button (#1783)
* Fix mobile budget header sync button

* Release notes
2023-10-11 00:21:29 -07:00
Shaan Khosla
3dfbd23f96 POC Recharts charting library (#1740) 2023-10-11 08:02:01 +01:00
youngcw
21effa654d Goal speedup2 (#1720)
* only use needed priorities

* cleanup

* cleanup

* cleanup

* maybe better?

* note

* note fix

* suggestion

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

---------

Co-authored-by: Joel Jeremy Marquez <joeljeremy.marquez@gmail.com>
2023-10-10 14:39:37 -07:00
Joel Jeremy Marquez
c33dc6fbad Mobile category and group functionalities (#1737)
* More mobile functionalities

* Cleanup

* Remove close button on mobile budget summary modal

* Release notes

* Close mobile inputs on enter

* Fix mobile budget row header color

* Fix income group hidden

* Add validation + close button on category tooltip

* Add mobile budget visual cues

* More mobile visual cues

* Error message fix

* Update blank category name behavior

* Cleanup

* Cleanup

* Fix mobile group deletion and category tooltip behavior

* Zero sign for AmountInput

* VRT snapshot updates

* Handle null values in must-category-transfer
2023-10-10 13:02:33 -07:00
Michael Clark
057caf127a Maintenance: DateSelect component to tsx & server-handlers get-categories type (#1776) 2023-10-10 20:38:15 +01:00
Matiss Janis Aboltins
767bc8ecb6 Update FUNDING.yml - add github sponsors (#1772) 2023-10-10 20:19:53 +01:00
Compositr
bdf5c45cda Sync on ctrl+s (#1770) 2023-10-10 20:19:23 +01:00
凯 - kǎi
3dfe633428 fix: csv parser delimiter (#1774) 2023-10-09 20:49:54 +01:00
Michael Clark
efba86a72d Maintenance: BudgetSummary & CreateLocalAccount to tsx (#1768) 2023-10-09 18:46:29 +01:00
shall0pass
316da144e1 [Bug] End of month cleanup error (#1750)
* check for null carryover

* release note

* simplify logic
2023-10-06 17:12:13 -05:00
shall0pass
d3ab8f9812 [Bug] Goals: Fix schedules 'in between' calculation (#1753)
* fix in between calculation

* release note
2023-10-06 17:11:52 -05:00
Joel Jeremy Marquez
0ea7f1852b Prevent parent transaction from being added to transfer account (#1751)
* Prevent parent transaction from being added to transfer account

* Release notes
2023-10-06 15:06:55 -07:00
Josh Krebs
3c341fc583 Budget tsx refactor (#1743) 2023-10-06 21:51:29 +01:00
Matiss Janis Aboltins
de90504a6d 🐛 (electron) reconnect to sockets if connection lost (#1694) 2023-10-05 08:40:41 +01:00
Michael Clark
f6e2d3b1f3 Maintenance: CreateAccount and CreateEncryptionKey to tsx (#1755) 2023-10-04 22:33:05 +01:00
Joel Jeremy Marquez
f1973d55c0 Editable mobile budget (#1662)
* Editable mobile budget

* Fix error on empty amount

* Fix typo

* Decimal keyboard + select input on click

* Remove scrollIntoView

* Fix focus

* Focus input on negative/positive

* Use CellValue

* Functional mobile components

* Blur fix c/o dmlazaro

* Use pointer event

* Remove useFireChangeOnUnmount

* Release notes

* Prevent default on pointerdown

* Add dmlazaro to release notes

* Disable amount input button when not focused

* Remove input refocus
2023-10-04 14:19:12 -07:00
Neil
476070b0a7 Consolidate Notice Colors (#1724) 2023-10-04 20:47:14 +01:00
Matiss Janis Aboltins
510f635bbc 🔖 (23.10.0) (#1757)
* 🔖 (23.10.0)

* Remove used release notes

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2023-10-04 17:33:51 +01:00
Neil
d1e57340b8 Regression fixes (#1752)
* regression fixes

* notes

* VRT updates
2023-10-02 11:46:28 -05:00
Matiss Janis Aboltins
9ca36f3eeb ♻️ (typescript) hardening data entity types (#1680) 2023-09-27 20:56:53 +01:00
shall0pass
05f0df4917 [Bugfix]: Goals - Fixed an overbudgeting condition (#1738)
* fix

* release note
2023-09-26 09:50:47 -05:00
Michael Clark
5f347bbe40 Maintenance: Consolidate useMergedRef and convert to typescript (#1733) 2023-09-24 17:40:44 +01:00
Shaan Khosla
3c4f62bd51 keep name after schedule completion or recreation (#1728) 2023-09-24 17:37:49 +01:00
Shaan Khosla
abd2d424a6 Fix schedule searchbar (#1729) 2023-09-24 17:34:49 +01:00
Jainam Desai
89c5f15c1f Add link type to Button Component (#1725) 2023-09-23 10:38:50 +01:00
Syukron Rifa'il Muttaqi
2a597fb3b8 fix: filter empty note (#1708) 2023-09-22 20:11:21 +01:00
Shaan Khosla
2f97c3a1e2 changed default months to 5 in cash flow report (#1723) 2023-09-22 20:03:10 +01:00
Matiss Janis Aboltins
ba5174ddfa 🐛 (mobile) redirect to budget page for all 404 (#1721) 2023-09-22 08:37:16 +01:00
Matiss Janis Aboltins
9a900f9ff1 ♻️ moving rule server actions to separate file (#1677) 2023-09-22 08:36:56 +01:00
Joshua Krebs
2081e25cf5 refactor BudgetMonthCountContext to tsx (#1722)
* refactor BudgetMonthCountContext to tsx

* add release notes
2023-09-21 16:25:40 -07:00
youngcw
49ab358cf2 Goals: speed up and a bugfix (#1718)
* speed up and a bug fix

* cleanup

* note

* lint
2023-09-21 09:08:26 -05:00
Jainam Desai
efb72af1b8 Add common component for AnchorLink and ButtonLink (#1701) 2023-09-20 17:19:09 +01:00
Crazypkr1099
16334f67a5 Enhance Y-Axis Scaling on Net Worth Graph (#1709) 2023-09-19 18:40:33 +01:00
Matiss Janis Aboltins
ddb78af57d 💄 (mobile) updating apple home-screen icon (#1705) 2023-09-18 18:43:34 +01:00
Matiss Janis Aboltins
9e2226e384 🐛 (mobile) scrolling in lists with pull-to-refresh (#1706) 2023-09-18 18:43:13 +01:00
Matiss Janis Aboltins
a1dd6cf3dc 🔧 removing unnecessary manual module resolution (#1707) 2023-09-18 18:42:57 +01:00
Mohamed Muhsin
2ee023ac22 [refactor] Migrate Schedules Table to typescript (#1691) 2023-09-17 19:05:32 +01:00
Shaan Khosla
3496ac28f3 Category autocomplete should only search selectable categories (#1681) 2023-09-16 09:58:59 +01:00
Neil
f6f496f656 Dark Theme Final (#1513) 2023-09-16 09:56:19 +01:00
Neil
68147d654f Sidebar Account Fix (#1703) 2023-09-15 21:39:58 +01:00
Matiss Janis Aboltins
3d29cfbed5 👷 do not cancel github ci jobs on master branch (#1692) 2023-09-15 17:10:31 +01:00
Trevor Farlow
fbd1097a0c 🐛 Mobile account transaction list: Fix sticky date section headers (#1698) 2023-09-15 07:25:19 -06:00
Neil
0cc34798fb Dark Theme Reports/Settings (#1512) 2023-09-13 18:40:16 +01:00
Shaan Khosla
b6100cfecd queried cleared balance for tooltip (#1678) 2023-09-13 17:58:48 +01:00
Ikko Eltociear Ashimine
d835b113f8 Fix typo in GoCardlessLink.js (#1684)
happend -> happened
2023-09-12 17:25:18 +01:00
Crazypkr1099
4e4d20ad31 Update Visual Regression README File (#1689) 2023-09-12 17:15:04 +01:00
Matiss Janis Aboltins
8167ea8a83 🎨 fix multiline label in schedules modal (#1687) 2023-09-12 17:11:00 +01:00
Matiss Janis Aboltins
42e1b5ca7e 🔥 removing privacyMode feature flag (#1688) 2023-09-12 17:10:46 +01:00
Neil
55285f4c5f Dark Theme Manager and Modals (#1503) 2023-09-11 20:11:58 +01:00
Crazypkr1099
5565116c34 Add spent column to mobile view (#1651) 2023-09-11 18:06:19 +01:00
Matiss Janis Aboltins
addd8e0f5f (e2e) adding sample schedules to test budget (#1672) 2023-09-11 08:42:22 +01:00
Matiss Janis Aboltins
0e66ebfeef ⬆️ (electron) upgrading electron-based dependencies (#1674) 2023-09-10 16:15:27 +01:00
youngcw
05f2e2af1a Mobile: Show proper name of income group (#1679)
* Show right name for income group on mobile

* release note
2023-09-09 17:59:05 -04:00
Neil
8ff89a5ab4 DarkTheme Schedules/Payees (#1487) 2023-09-09 18:21:17 +01:00
Matiss Janis Aboltins
faa4a7c0e2 🔧 (eslint) convert rules from ERROR to WARN to improve devX (#1599) 2023-09-09 17:54:06 +01:00
Joshua Krebs
ba4885cb85 refactor budget/IncomeHeader to tsx (#1670) 2023-09-08 19:39:48 +01:00
Matiss Janis Aboltins
a8a0f777e2 🐛 (mobile) fix schedule status positioning (#1669)
* 🐛 (mobile) fix schedule status positioning

* Release notes
2023-09-08 07:56:00 +01:00
Matiss Janis Aboltins
852b5373bc 🐛 (signup) fix setting up for the first time with missing protocol (#1657) 2023-09-07 17:40:58 +01:00
Joel Jeremy Marquez
bca09023e2 Left over glamor style cleanup (#1668)
* #1666 - left over glamor style cleanup

* vrt

* Release notes
2023-09-06 23:04:47 -07:00
Matiss Janis Aboltins
4d8efccc73 🔧 (electron) improved OS detection (#1658)
* 🔧 (electron) improved OS detection

* Release notes
2023-09-07 06:56:15 +01:00
Matiss Janis Aboltins
0e539d91fe (mobile) pull down to trigger bank-sync (#1663)
*  (mobile) pull down to trigger bank-sync

* Release notes

* Remove canSync checks
2023-09-07 06:56:02 +01:00
Matiss Janis Aboltins
2ff1e67e8a 🐛 (mobile) fix sync button design (#1665)
* 🐛 (mobile) fix sync button design

* Release notes
2023-09-07 06:55:47 +01:00
youngcw
35c3d54688 Mobile: Dont show hidden groups (#1654)
* fix percent goals in the same priority level not compounding but overwritting

* release note

* don't show hidden groups on mobile view

* cleanup

* cleanup2

* cleanup3

* release note
2023-09-06 21:33:44 -07:00
Joel Jeremy Marquez
50f60b18e7 Enable swc sourcemap (#1659)
* Enable swc sourcemap

* Release notes
2023-09-06 18:48:37 -07:00
youngcw
bc5c2ce059 Mobile: don't show hidden income categories (#1656) 2023-09-06 19:42:38 +01:00
Shyam Guthikonda
21d5f117ee TypeScript migration (partial). (#1660) 2023-09-06 17:27:16 +01:00
Joel Jeremy Marquez
319d196e93 Webpack + SWC Loader (#1650)
* desktopc-client swc-loader

* More swc

* Jest swc + upgrades

* Revert @swc/jest usage for now

* SWC minify

* Remove setupFilesAfterEnv in package.json as per warning message in CI

* Release notes

* Minify on CI

* swc helpers in loot-core

* @swc/jest

* Upgrade webpack

* Add @swc/core to crdt

* Use yarn cache in github actions

* Cleanup

* Fix electron

* Revert "Fix electron"

This reverts commit 787af1980648fa30788a1d1678dcda534716f31d.

* Revert action.yml cache changes

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
2023-09-05 13:42:44 -07:00
Joel Jeremy Marquez
96863b3196 Change Accounts page BUDGET label to FOR BUDGET in mobile (#1639)
* Change BUDGET to FOR BUDGET in mobile accounts page

* Release notes

* Updated screenshot
2023-09-05 10:48:29 -07:00
Joel Jeremy Marquez
9fde36dca1 Fix ofx/qfx import options (#1649)
* Fix ofx/qfx import options

* Release notes
2023-09-05 09:54:04 -07:00
Syukron Rifa'il Muttaqi
108daedff5 Fix submit form on enter key pressed (#1634) 2023-09-05 08:34:34 +01:00
Joel Jeremy Marquez
bf786e8872 Break apart budget/misc.js (#1584)
* Break apart budget/misc.js

* Release notes

* Rename release notes

* UI bolder "No server" text
2023-09-05 00:27:52 -07:00
Joel Jeremy Marquez
3eb09b66ec Fix blur performance issue in Safari (#1646)
* Fix blur performance issue in Safari

* Release notes
2023-09-04 23:17:16 -07:00
Joel Jeremy Marquez
cb00826f51 Fix mobile page "back" behaviors (#1648)
* Fix mobile page "back" behaviors

* Release notes
2023-09-04 23:17:03 -07:00
Joel Jeremy Marquez
15ab80a475 Remove glamor css (#1637)
* Remove glamor css syntax

* Release notes

* Remove fallback value

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

* Remove fallback value

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

* Remove fallback value

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

---------

Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
2023-09-04 23:16:41 -07:00
Joel Jeremy Marquez
3e32db74cc Fix onNavigateToSchedule prop (#1645)
* Fix onNavigateToSchedule prop

* Release notes
2023-09-04 11:51:59 -07:00
Mohamed Muhsin
db07d7a73d refactor: make Schedules component to tsx (#1644) 2023-09-04 17:41:02 +01:00
Oleh
65899b0ef0 Add support for markdown in notes (#1587) 2023-09-04 08:28:07 +01:00
Joel Jeremy Marquez
63c3d07cb9 Replace usage of glamor CSSProperties with React CSSProperties (#1542)
* Remove usages of glamor CSSProperties

* Cleanup

* Re-add CellButton className prop

* More removal of glamor CSSProperties

* Release notes

* Fix vrt test failures

* Use React CSSProperties in View

* Custom CSSProperties type

* Settings UI regression fix

* Fix type check errors

* Address PR comments

* CategorySpendingGraph style

* Fix rebase mistake
2023-09-03 16:15:44 -07:00
Matiss Janis Aboltins
246e0d76c1 ⬆️ (better-sqlite3) upgrade to 8.6.0 to fix electron export crash (#1643) 2023-09-03 21:57:12 +01:00
Matiss Janis Aboltins
1a15d2c039 ♻️ use useCategories everywhere (#1597) 2023-09-03 21:56:58 +01:00
Matiss Janis Aboltins
90e32df3fb 🐛 (vrt) set static version (#1641) 2023-09-03 21:44:24 +01:00
Joel Jeremy Marquez
8ef2c4013a Experimental OFX parser (#1600)
* Experimental OFX parser

* Release notes

* Enable enableExperimentalOfxParser in tests

* Move experimental ofx parser to ofx2json

* Enable experimental ofx parser by default

* Address PR comments
2023-09-03 10:33:06 -07:00
Matiss Janis Aboltins
a460bc25d6 ♻️ convert budget component from class to hook component (#1566) 2023-09-03 17:43:10 +01:00
Joel Jeremy Marquez
59de6b0035 Replace format with useFormat (#1630)
* Replace format with useFormat

* [chore] Release notes
2023-09-03 09:34:24 -07:00
Joel Jeremy Marquez
3931625133 Rename CategorySelect file to CategoryAutocomplete (#1614)
* Rename CategorySelect file to CategoryAutocomplete

* Release notes
2023-09-03 09:32:53 -07:00
Oleh
6a0b7d6b7d Make reports more responsive (#1592) 2023-09-03 17:28:13 +01:00
Matiss Janis Aboltins
6817c45ddc ⬆️ upgrade absurd-sql and remove patch-package (#1632) 2023-09-03 17:26:01 +01:00
2799 changed files with 77035 additions and 364816 deletions

View File

@@ -1,5 +1,6 @@
packages/api/app/bundle.api.js
packages/api/dist
packages/api/@types
packages/api/migrations
packages/crdt/dist
@@ -24,7 +25,3 @@ packages/import-ynab5/**/node_modules/*
packages/loot-core/**/node_modules/*
packages/loot-core/**/lib-dist/*
packages/loot-core/**/proto/*
packages/node-libofx/libofx.*.js
packages/node-libofx/libofx/
packages/node-libofx/OpenSP-*/

View File

@@ -38,34 +38,50 @@ module.exports = {
extends: [
'react-app',
'plugin:react/recommended',
'plugin:react/jsx-runtime',
'plugin:prettier/recommended',
'plugin:@typescript-eslint/recommended',
'plugin:import/typescript',
],
parser: '@typescript-eslint/parser',
parserOptions: { project: [path.join(__dirname, './tsconfig.json')] },
reportUnusedDisableDirectives: true,
globals: {
globalThis: false,
vi: true,
},
rules: {
'prettier/prettier': 'error',
'prettier/prettier': 'warn',
// Note: base rule explicitly disabled in favor of the TS one
'no-unused-vars': 'off',
'@typescript-eslint/no-unused-vars': [
'error',
'warn',
{
args: 'none',
varsIgnorePattern: '^_',
varsIgnorePattern: '^(_|React)',
ignoreRestSiblings: true,
},
],
curly: ['error', 'multi-line', 'consistent'],
curly: ['warn', 'multi-line', 'consistent'],
'no-restricted-globals': ['error'].concat(
'no-restricted-globals': ['warn'].concat(
require('confusing-browser-globals').filter(g => g !== 'self'),
),
'react/jsx-no-useless-fragment': 'error',
'react/self-closing-comp': 'error',
'react/jsx-filename-extension': [
'warn',
{ extensions: ['.jsx', '.tsx'], allow: 'as-needed' },
],
'react/jsx-no-useless-fragment': 'warn',
'react/self-closing-comp': 'warn',
'react/no-unstable-nested-components': [
'warn',
{ allowAsProps: true, customValidators: ['formatter'] },
],
'rulesdir/typography': 'error',
'rulesdir/prefer-if-statement': 'error',
'rulesdir/typography': 'warn',
'rulesdir/prefer-if-statement': 'warn',
// https://github.com/eslint/eslint/issues/16954
// https://github.com/eslint/eslint/issues/16953
@@ -75,29 +91,24 @@ module.exports = {
'react/prop-types': 'off',
// TODO: re-enable these rules
'react-hooks/exhaustive-deps': 'off',
'react/no-children-prop': 'off',
'react/display-name': 'off',
'react/react-in-jsx-scope': 'off',
// 'react-hooks/exhaustive-deps': [
// 'error',
// {
// additionalHooks: 'useLiveQuery',
// },
// ],
'no-var': 'warn',
'react/jsx-curly-brace-presence': 'warn',
'object-shorthand': ['warn', 'properties'],
'import/extensions': [
'error',
'warn',
'never',
{
json: 'always',
},
],
'import/no-useless-path-segments': 'error',
'import/no-duplicates': ['error', { 'prefer-inline': true }],
'import/no-unused-modules': ['error', { unusedExports: true }],
'import/no-useless-path-segments': 'warn',
'import/no-duplicates': ['warn', { 'prefer-inline': true }],
'import/no-unused-modules': ['warn', { unusedExports: true }],
'import/order': [
'error',
'warn',
{
alphabetize: {
caseInsensitive: true,
@@ -126,7 +137,7 @@ module.exports = {
],
'no-restricted-syntax': [
'error',
'warn',
{
// forbid React.* as they are legacy https://twitter.com/dan_abramov/status/1308739731551858689
selector:
@@ -135,22 +146,27 @@ module.exports = {
'Using default React import is discouraged, please use named exports directly instead.',
},
{
// forbid <a> in favor of <LinkButton> or <ExternalLink>
// forbid <a> in favor of <Link>
selector: 'JSXOpeningElement[name.name="a"]',
message:
'Using <a> is discouraged, please use <LinkButton> or <ExternalLink> instead.',
message: 'Using <a> is discouraged, please use <Link> instead.',
},
],
'no-restricted-imports': [
'error',
'warn',
{ patterns: [...restrictedImportPatterns, ...restrictedImportColors] },
],
'@typescript-eslint/ban-ts-comment': [
'error',
{ 'ts-ignore': 'allow-with-description' },
],
// Rules disable during TS migration
'@typescript-eslint/no-var-requires': 'off',
'prefer-const': 'off',
'prefer-const': 'warn',
'prefer-spread': 'off',
'@typescript-eslint/no-empty-function': 'off',
'import/no-default-export': 'warn',
},
overrides: [
{
@@ -167,14 +183,14 @@ module.exports = {
],
rules: {
// enforce type over interface
'@typescript-eslint/consistent-type-definitions': ['error', 'type'],
'@typescript-eslint/consistent-type-definitions': ['warn', 'type'],
// enforce import type
'@typescript-eslint/consistent-type-imports': [
'error',
'warn',
{ prefer: 'type-imports', fixStyle: 'inline-type-imports' },
],
'@typescript-eslint/ban-types': [
'error',
'warn',
{
types: {
// forbid FC as superflous
@@ -186,11 +202,31 @@ module.exports = {
],
},
},
{
files: ['./packages/desktop-client/**/*'],
excludedFiles: [
'./packages/desktop-client/src/hooks/useNavigate.{ts,tsx}',
],
rules: {
'no-restricted-imports': [
'warn',
{
patterns: [
{
group: ['react-router-dom'],
importNames: ['useNavigate'],
message: 'Please use Actuals useNavigate() hook instead.',
},
],
},
],
},
},
{
files: ['./packages/loot-core/src/**/*'],
rules: {
'no-restricted-imports': [
'error',
'warn',
{
patterns: [
...restrictedImportPatterns,
@@ -216,104 +252,88 @@ module.exports = {
rules: { 'import/no-unused-modules': 'off' },
},
{
//This is temporary. We will remove these as dark theme gets ported
files: [
'./packages/desktop-client/public/index.html',
'./packages/desktop-client/src/components/BankSyncStatus.*',
'./packages/desktop-client/src/components/LoggedInUser.*',
'./packages/desktop-client/src/components/MobileWebMessage.*',
'./packages/desktop-client/src/components/NotesButton.*',
'./packages/desktop-client/src/components/Notifications.*',
'./packages/desktop-client/src/components/Page.*',
'./packages/desktop-client/src/components/SidebarWithData.*',
'./packages/desktop-client/src/components/Titlebar.*',
'./packages/desktop-client/src/components/UpdateNotification.*',
'./packages/desktop-client/src/components/accounts/Header.*',
'./packages/desktop-client/src/components/alerts.*',
'./packages/desktop-client/src/components/budget/MobileBudget.*',
'./packages/desktop-client/src/components/budget/MobileBudgetTable.*',
'./packages/desktop-client/src/components/budget/MobileTable.*',
'./packages/desktop-client/src/components/budget/MonthCountSelector.*',
'./packages/desktop-client/src/components/budget/MonthPicker.*',
'./packages/desktop-client/src/components/budget/constants.*',
'./packages/desktop-client/src/components/budget/misc.*',
'./packages/desktop-client/src/components/budget/report/BudgetSummary.*',
'./packages/desktop-client/src/components/budget/report/components.*',
'./packages/desktop-client/src/components/budget/rollover/BudgetSummary.*',
'./packages/desktop-client/src/components/budget/rollover/rollover-components.*',
'./packages/desktop-client/src/components/budget/util.*',
'./packages/desktop-client/src/components/common.*',
'./packages/desktop-client/src/components/common/Card.*',
'./packages/desktop-client/src/components/common/Label.*',
'./packages/desktop-client/src/components/common/View.*',
'./packages/desktop-client/src/components/common/ExternalLink.*',
'./packages/desktop-client/src/components/manager/BudgetList.*',
'./packages/desktop-client/src/components/manager/ConfigServer.*',
'./packages/desktop-client/src/components/manager/DeleteFile.*',
'./packages/desktop-client/src/components/manager/Import.*',
'./packages/desktop-client/src/components/manager/ImportActual.*',
'./packages/desktop-client/src/components/manager/ImportYNAB4.*',
'./packages/desktop-client/src/components/manager/ImportYNAB5.*',
'./packages/desktop-client/src/components/manager/WelcomeScreen.*',
'./packages/desktop-client/src/components/manager/subscribe/Bootstrap.*',
'./packages/desktop-client/src/components/manager/subscribe/ChangePassword.*',
'./packages/desktop-client/src/components/manager/subscribe/Error.*',
'./packages/desktop-client/src/components/manager/subscribe/Login.*',
'./packages/desktop-client/src/components/manager/subscribe/common.*',
'./packages/desktop-client/src/components/modals/BudgetSummary.*',
'./packages/desktop-client/src/components/modals/ConfirmCategoryDelete.*',
'./packages/desktop-client/src/components/modals/CreateEncryptionKey.*',
'./packages/desktop-client/src/components/modals/EditField.*',
'./packages/desktop-client/src/components/modals/FixEncryptionKey.*',
'./packages/desktop-client/src/components/modals/GoCardlessExternalMsg.*',
'./packages/desktop-client/src/components/modals/ImportTransactions.*',
'./packages/desktop-client/src/components/modals/LoadBackup.*',
'./packages/desktop-client/src/components/modals/MergeUnusedPayees.*',
'./packages/desktop-client/src/components/modals/PlaidExternalMsg.*',
'./packages/desktop-client/src/components/payees/index.*',
'./packages/desktop-client/src/components/reports/CashFlow.*',
'./packages/desktop-client/src/components/reports/Change.*',
'./packages/desktop-client/src/components/reports/DateRange.*',
'./packages/desktop-client/src/components/reports/Header.*',
'./packages/desktop-client/src/components/reports/NetWorth.*',
'./packages/desktop-client/src/components/reports/Overview.*',
'./packages/desktop-client/src/components/reports/Tooltip.*',
'./packages/desktop-client/src/components/reports/chart-theme.*',
'./packages/desktop-client/src/components/reports/graphs/CashFlowGraph.*',
'./packages/desktop-client/src/components/reports/graphs/NetWorthGraph.*',
'./packages/desktop-client/src/components/schedules/DiscoverSchedules.*',
'./packages/desktop-client/src/components/schedules/EditSchedule.*',
'./packages/desktop-client/src/components/schedules/LinkSchedule.*',
'./packages/desktop-client/src/components/schedules/PostsOfflineNotification.*',
'./packages/desktop-client/src/components/schedules/SchedulesTable.*',
'./packages/desktop-client/src/components/schedules/StatusBadge.*',
'./packages/desktop-client/src/components/schedules/index.*',
'./packages/desktop-client/src/components/select/DateSelect.*',
'./packages/desktop-client/src/components/select/RecurringSchedulePicker.*',
'./packages/desktop-client/src/components/settings/Encryption.*',
'./packages/desktop-client/src/components/settings/Experimental.*',
'./packages/desktop-client/src/components/settings/FixSplits.*',
'./packages/desktop-client/src/components/settings/Format.*',
'./packages/desktop-client/src/components/settings/Global.*',
'./packages/desktop-client/src/components/settings/UI.*',
'./packages/desktop-client/src/components/settings/index.*',
'./packages/desktop-client/src/components/sidebar.*',
'./packages/desktop-client/src/components/transactions/MobileTransaction.*',
'./packages/desktop-client/src/components/transactions/TransactionsTable.*',
'./packages/desktop-client/src/components/util/AmountInput.*',
'./packages/desktop-client/src/components/util/DisplayId.*',
'./packages/desktop-client/src/components/util/LoadComponent.*',
'./packages/desktop-client/src/style/*',
'./packages/desktop-client/src/style/index.*',
'./packages/desktop-client/src/style/palette.*',
],
rules: {
'no-restricted-imports': ['off', { patterns: restrictedImportColors }],
},
},
{
files: [
'./packages/api/migrations/*',
'./packages/loot-core/migrations/*',
],
rules: {
'import/no-default-export': 'off',
},
},
{
// TODO: fix the issues in these files
files: [
'./packages/desktop-client/src/components/accounts/Account.jsx',
'./packages/desktop-client/src/components/accounts/MobileAccount.jsx',
'./packages/desktop-client/src/components/accounts/MobileAccounts.jsx',
'./packages/desktop-client/src/components/App.tsx',
'./packages/desktop-client/src/components/budget/BudgetCategories.jsx',
'./packages/desktop-client/src/components/budget/BudgetSummaries.tsx',
'./packages/desktop-client/src/components/budget/DynamicBudgetTable.tsx',
'./packages/desktop-client/src/components/budget/index.tsx',
'./packages/desktop-client/src/components/budget/MobileBudget.tsx',
'./packages/desktop-client/src/components/budget/rollover/HoldTooltip.tsx',
'./packages/desktop-client/src/components/budget/rollover/TransferTooltip.tsx',
'./packages/desktop-client/src/components/common/Menu.tsx',
'./packages/desktop-client/src/components/FinancesApp.tsx',
'./packages/desktop-client/src/components/GlobalKeys.ts',
'./packages/desktop-client/src/components/LoggedInUser.tsx',
'./packages/desktop-client/src/components/manager/ManagementApp.jsx',
'./packages/desktop-client/src/components/manager/subscribe/common.tsx',
'./packages/desktop-client/src/components/ManageRules.tsx',
'./packages/desktop-client/src/components/mobile/MobileAmountInput.jsx',
'./packages/desktop-client/src/components/mobile/MobileNavTabs.tsx',
'./packages/desktop-client/src/components/Modals.tsx',
'./packages/desktop-client/src/components/modals/EditRule.jsx',
'./packages/desktop-client/src/components/modals/ImportTransactions.jsx',
'./packages/desktop-client/src/components/modals/MergeUnusedPayees.jsx',
'./packages/desktop-client/src/components/Notifications.tsx',
'./packages/desktop-client/src/components/payees/ManagePayees.jsx',
'./packages/desktop-client/src/components/payees/ManagePayeesWithData.jsx',
'./packages/desktop-client/src/components/payees/PayeeTable.tsx',
'./packages/desktop-client/src/components/reports/graphs/tableGraph/ReportTable.tsx',
'./packages/desktop-client/src/components/reports/graphs/tableGraph/ReportTableTotals.tsx',
'./packages/desktop-client/src/components/reports/reports/CashFlowCard.jsx',
'./packages/desktop-client/src/components/reports/reports/CustomReport.jsx',
'./packages/desktop-client/src/components/reports/reports/NetWorthCard.jsx',
'./packages/desktop-client/src/components/reports/SaveReportName.tsx',
'./packages/desktop-client/src/components/reports/useReport.ts',
'./packages/desktop-client/src/components/schedules/ScheduleDetails.jsx',
'./packages/desktop-client/src/components/schedules/SchedulesTable.tsx',
'./packages/desktop-client/src/components/select/DateSelect.tsx',
'./packages/desktop-client/src/components/sidebar/Tools.tsx',
'./packages/desktop-client/src/components/sort.tsx',
'./packages/desktop-client/src/components/spreadsheet/useSheetValue.ts',
'./packages/desktop-client/src/components/table.tsx',
'./packages/desktop-client/src/components/Titlebar.tsx',
'./packages/desktop-client/src/components/transactions/MobileTransaction.jsx',
'./packages/desktop-client/src/components/transactions/SelectedTransactions.jsx',
'./packages/desktop-client/src/components/transactions/SimpleTransactionsTable.jsx',
'./packages/desktop-client/src/components/transactions/TransactionList.jsx',
'./packages/desktop-client/src/components/transactions/TransactionsTable.jsx',
'./packages/desktop-client/src/components/transactions/TransactionsTable.test.jsx',
'./packages/desktop-client/src/hooks/useAccounts.ts',
'./packages/desktop-client/src/hooks/useCategories.ts',
'./packages/desktop-client/src/hooks/usePayees.ts',
'./packages/desktop-client/src/hooks/useProperFocus.tsx',
'./packages/desktop-client/src/hooks/useSelected.tsx',
'./packages/loot-core/src/client/query-hooks.tsx',
],
rules: {
'react-hooks/exhaustive-deps': 'off',
},
},
],
settings: {
'import/parsers': {
'@typescript-eslint/parser': ['.ts', '.tsx'],
},
'import/resolver': {
typescript: {
alwaysTryTypes: true,

2
.gitattributes vendored
View File

@@ -16,4 +16,4 @@ yarn.lock text eol=lf
# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
*.jpg binary

1
.github/FUNDING.yml vendored
View File

@@ -1,2 +1,3 @@
# Funding policies: https://actualbudget.org/docs/contributing/leadership/funding
open_collective: actual
github: actualbudget

View File

@@ -8,6 +8,13 @@ body:
attributes:
value: |
Thanks for taking the time to fill out this bug report! Please ensure you provide as much information as possible to better assist in confirming and identifying a fix for the bug.
- type: markdown
id: intro-md
attributes:
value: |
**IMPORTANT:** we use Github Issues only for BUG REPORTS and FEATURE REQUESTS. If you are looking for help/support - please reach out to the [community on Discord](https://discord.gg/pRYNYr4W5A). All non-bug and non-feature-request issues will be closed.
**Bank-sync problems (SimpleFin / GoCardless)?** Reach out via the [community Discord](https://discord.gg/pRYNYr4W5A) first and open an issue only if the community deems the issue to be a legitimate bug in Actual.
- type: checkboxes
id: existing-issue
attributes:
@@ -16,6 +23,8 @@ body:
options:
- label: 'I have searched and found no existing issue'
required: true
- label: 'I will be providing steps how to reproduce the bug (in most cases this will also mean uploading a demo budget file)'
required: true
validations:
required: true
- type: textarea
@@ -27,13 +36,6 @@ body:
value: 'A bug happened!'
validations:
required: true
- type: textarea
id: errors-received
attributes:
label: 'What error did you receive?'
description: 'If you received an error or a message on the screen, please provide that here.'
validations:
required: false
- type: markdown
id: env-info
attributes:
@@ -47,6 +49,7 @@ body:
- Locally via Yarn
- Docker
- Fly.io
- Pikapods
- NAS
- Desktop App (Electron)
- Other

View File

@@ -1 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Bank-sync issues
url: https://discord.gg/pRYNYr4W5A
about: Is bank-sync not working? Returning too much or too few information? Reach out to the community on Discord.
- name: Support
url: https://discord.gg/pRYNYr4W5A
about: Need help with something? Having troubles setting up? Or perhaps issues using the API? Reach out to the community on Discord.

View File

@@ -4,11 +4,11 @@ runs:
using: composite
steps:
- name: Install node
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: 18.16.0
- name: Cache
uses: actions/cache@v3
uses: actions/cache@v4
id: cache
with:
path: '**/node_modules'

View File

@@ -15,13 +15,13 @@ on:
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
jobs:
api:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Set up environment
uses: ./.github/actions/setup
- name: Build API
@@ -29,7 +29,7 @@ jobs:
- name: Create package tgz
run: cd packages/api && yarn pack && mv package.tgz actual-api.tgz
- name: Upload Build
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: actual-api
path: packages/api/actual-api.tgz
@@ -37,7 +37,7 @@ jobs:
crdt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Set up environment
uses: ./.github/actions/setup
- name: Build CRDT
@@ -45,7 +45,7 @@ jobs:
- name: Create package tgz
run: cd packages/crdt && yarn pack && mv package.tgz actual-crdt.tgz
- name: Upload Build
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: actual-crdt
path: packages/crdt/actual-crdt.tgz
@@ -53,18 +53,18 @@ jobs:
web:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Set up environment
uses: ./.github/actions/setup
- name: Build Web
run: ./bin/package-browser
- name: Upload Build
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: actual-web
path: packages/desktop-client/build
- name: Upload Build Stats
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: build-stats
path: packages/desktop-client/build-stats

View File

@@ -8,13 +8,13 @@ on:
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Set up environment
uses: ./.github/actions/setup
- name: Lint
@@ -22,7 +22,7 @@ jobs:
typecheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Set up environment
uses: ./.github/actions/setup
- name: Typecheck
@@ -30,7 +30,7 @@ jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Set up environment
uses: ./.github/actions/setup
- name: Test
@@ -40,8 +40,8 @@ jobs:
if: github.event_name == 'pull_request'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '19'
- name: Check migrations

View File

@@ -9,7 +9,7 @@ on:
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
jobs:
analyze:
@@ -22,14 +22,14 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
uses: github/codeql-action/init@v3
with:
languages: javascript
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
uses: github/codeql-action/analyze@v3
with:
category: '/language:javascript'

View File

@@ -16,7 +16,7 @@ jobs:
outputs:
netlify_url: ${{ steps.netlify.outputs.url }}
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Set up environment
uses: ./.github/actions/setup
- name: Wait for Netlify build to finish
@@ -31,38 +31,40 @@ jobs:
needs: netlify
runs-on: ubuntu-latest
container:
image: mcr.microsoft.com/playwright:v1.37.0-jammy
image: mcr.microsoft.com/playwright:v1.41.1-jammy
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Set up environment
uses: ./.github/actions/setup
- name: Run E2E Tests on Netlify URL
run: yarn e2e
env:
E2E_START_URL: ${{ needs.netlify.outputs.netlify_url }}
- uses: actions/upload-artifact@v3
- uses: actions/upload-artifact@v4
if: always()
with:
name: desktop-client-test-results
path: packages/desktop-client/test-results/
retention-days: 30
overwrite: true
vrt:
name: Visual regression
needs: netlify
runs-on: ubuntu-latest
container:
image: mcr.microsoft.com/playwright:v1.37.0-jammy
image: mcr.microsoft.com/playwright:v1.41.1-jammy
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Set up environment
uses: ./.github/actions/setup
- name: Run VRT Tests on Netlify URL
run: yarn vrt
env:
E2E_START_URL: ${{ needs.netlify.outputs.netlify_url }}
- uses: actions/upload-artifact@v3
- uses: actions/upload-artifact@v4
if: always()
with:
name: desktop-client-test-results
path: packages/desktop-client/test-results/
retention-days: 30
overwrite: true

74
.github/workflows/electron-master.yml vendored Normal file
View File

@@ -0,0 +1,74 @@
name: Electron Master
defaults:
run:
shell: bash
env:
CI: true
on:
push:
tags:
- v**
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: false
jobs:
build:
# this is so the assets can be added to the release
permissions:
contents: write
strategy:
matrix:
os:
- ubuntu-latest
- windows-latest
- macos-latest
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- if: ${{ startsWith(matrix.os, 'windows') }}
run: pip.exe install setuptools
- if: ${{ ! startsWith(matrix.os, 'windows') }}
run: |
mkdir .venv
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install setuptools
- if: ${{ startsWith(matrix.os, 'ubuntu') }}
run: |
sudo apt-get install flatpak -y
sudo apt-get install flatpak-builder -y
sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
sudo flatpak install org.freedesktop.Sdk/x86_64/23.08 -y
sudo flatpak install org.freedesktop.Platform/x86_64/23.08 -y
sudo flatpak install org.electronjs.Electron2.BaseApp/x86_64/23.08 -y
- name: Set up environment
uses: ./.github/actions/setup
- name: Build Electron
run: ./bin/package-electron
env:
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
CSC_LINK: ${{ secrets.CSC_LINK }}
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
- name: Upload Build
uses: actions/upload-artifact@v4
with:
name: actual-electron-${{ matrix.os }}
path: |
packages/desktop-electron/dist/*.dmg
packages/desktop-electron/dist/*.exe
packages/desktop-electron/dist/*.AppImage
packages/desktop-electron/dist/*.flatpak
- name: Add to Release
uses: softprops/action-gh-release@v2
with:
files: |
packages/desktop-electron/dist/*.dmg
packages/desktop-electron/dist/*.exe
packages/desktop-electron/dist/*.AppImage
packages/desktop-electron/dist/*.flatpak

56
.github/workflows/electron-pr.yml vendored Normal file
View File

@@ -0,0 +1,56 @@
name: Electron
defaults:
run:
shell: bash
env:
CI: true
on:
pull_request:
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
cancel-in-progress: true
jobs:
build:
strategy:
matrix:
os:
- ubuntu-latest
- windows-latest
- macos-latest
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- if: ${{ startsWith(matrix.os, 'windows') }}
run: pip.exe install setuptools
- if: ${{ ! startsWith(matrix.os, 'windows') }}
run: |
mkdir .venv
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install setuptools
- if: ${{ startsWith(matrix.os, 'ubuntu') }}
run: |
sudo apt-get install flatpak -y
sudo apt-get install flatpak-builder -y
sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
sudo flatpak install org.freedesktop.Sdk/x86_64/23.08 -y
sudo flatpak install org.freedesktop.Platform/x86_64/23.08 -y
sudo flatpak install org.electronjs.Electron2.BaseApp/x86_64/23.08 -y
- name: Set up environment
uses: ./.github/actions/setup
- name: Build Electron
run: ./bin/package-electron
- name: Upload Build
uses: actions/upload-artifact@v4
with:
name: actual-electron-${{ matrix.os }}
path: |
packages/desktop-electron/dist/*.dmg
packages/desktop-electron/dist/*.exe
packages/desktop-electron/dist/*.AppImage
packages/desktop-electron/dist/*.flatpak

View File

@@ -1,42 +0,0 @@
name: Electron
defaults:
run:
shell: bash
env:
CI: true
on:
push:
branches:
- master
pull_request:
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
build:
strategy:
matrix:
os:
- ubuntu-latest
- windows-latest
- macos-latest
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v3
- name: Set up environment
uses: ./.github/actions/setup
- name: Build Electron
run: ./bin/package-electron
- name: Upload Build
uses: actions/upload-artifact@v3
with:
name: actual-electron-${{ matrix.os }}
path: |
packages/desktop-electron/dist/*.dmg
packages/desktop-electron/dist/*.exe
packages/desktop-electron/dist/*.AppImage

View File

@@ -24,8 +24,8 @@ jobs:
runs-on: ubuntu-latest
steps:
# This is not a security concern because we have approved & merged the PR
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '19'
- name: Handle feature requests

View File

@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Check release notes
if: startsWith(github.head_ref, 'release/') == false
uses: actualbudget/actions/release-notes/check@main

View File

@@ -46,7 +46,7 @@ jobs:
echo "Build failed on PR branch or ${{github.base_ref}}"
exit 1
- name: Download build artifact from ${{github.base_ref}}
uses: dawidd6/action-download-artifact@v2
uses: dawidd6/action-download-artifact@v3
id: pr-build
with:
branch: ${{github.base_ref}}
@@ -55,7 +55,7 @@ jobs:
path: base
- name: Download build artifact from PR
uses: dawidd6/action-download-artifact@v2
uses: dawidd6/action-download-artifact@v3
with:
pr: ${{github.event.pull_request.number}}
workflow: build.yml
@@ -64,13 +64,17 @@ jobs:
- name: Strip content hashes from stats files
run: |
sed -i -E 's/index\.[0-9a-zA-Z_-]{8,}\./index./g' ./head/web-stats.json
sed -i -E 's/\.[0-9a-zA-Z_-]{8,}\.chunk\././g' ./head/web-stats.json
sed -i -E 's/\.[0-9a-f]{8,}\././g' ./head/*.json
sed -i -E 's/index\.[0-9a-zA-Z_-]{8,}\./index./g' ./base/web-stats.json
sed -i -E 's/\.[0-9a-zA-Z_-]{8,}\.chunk\././g' ./base/web-stats.json
sed -i -E 's/\.[0-9a-f]{8,}\././g' ./base/*.json
- uses: github/webpack-bundlesize-compare-action@v1.8.2
- uses: twk3/rollup-size-compare-action@v1.0.0
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
current-stats-json-path: ./head/desktop-client-stats.json
base-stats-json-path: ./base/desktop-client-stats.json
current-stats-json-path: ./head/web-stats.json
base-stats-json-path: ./base/web-stats.json
title: desktop-client
- uses: github/webpack-bundlesize-compare-action@v1.8.2

27
.github/workflows/wip.yml vendored Normal file
View File

@@ -0,0 +1,27 @@
name: Add WIP
on:
pull_request_target:
types:
- opened
jobs:
add_wip_prefix:
if: |
join(github.event.pull_request.requested_reviewers) == ''
&& !contains(github.event.pull_request.title, 'WIP')
&& !contains(github.event.pull_request.labels.*.name, 'WIP')
&& github.event.pull_request.draft != true
runs-on: ubuntu-latest
permissions:
pull-requests: write
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Add WIP
env:
TITLE: ${{ github.event.pull_request.title }}
shell: bash
run: |
echo ${{ secrets.GITHUB_TOKEN }} | gh auth login --with-token
gh pr edit ${{ github.event.pull_request.number }} -t "[WIP] ${TITLE}"

35
.gitignore vendored
View File

@@ -1,28 +1,33 @@
# Sample Data
/data/*
!data/.gitkeep
/data2
Actual-*
**/xcuserdata/*
export-2020-01-10.csv
# Secrets
.secret-tokens
# MacOS
.DS_Store
# Logs
**/*.log
# JavaScript
node_modules
packages/api/dist
packages/api/@types
packages/crdt/dist
packages/desktop-electron/client-build
packages/desktop-electron/.electron-symbols
packages/desktop-electron/dist
packages/desktop-electron/loot-core
node_modules
.DS_Store
lerna-debug.log
Actual-*
.#*
**/xcuserdata/*
.secret-tokens
bundle.desktop.js
bundle.desktop.js.map
bundle.mobile.js
bundle.mobile.js.map
export-2020-01-10.csv
.idea
.vscode
**/*.log
# Yarn
.pnp.*
@@ -35,3 +40,9 @@ export-2020-01-10.csv
# VSCode
.vscode
# IntelliJ IDEA
.idea
# Misc
.#*

2
.secret-tokens.example Normal file
View File

@@ -0,0 +1,2 @@
export APPLE_ID=example@email.com
export APPLE_APP_SPECIFIC_PASSWORD=password

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

893
.yarn/releases/yarn-4.0.2.cjs vendored Executable file

File diff suppressed because one or more lines are too long

View File

@@ -1,9 +1,7 @@
compressionLevel: mixed
enableGlobalCache: false
nodeLinker: node-modules
plugins:
- path: .yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs
spec: "@yarnpkg/plugin-workspace-tools"
- path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
spec: "@yarnpkg/plugin-interactive-tools"
yarnPath: .yarn/releases/yarn-3.5.1.cjs
yarnPath: .yarn/releases/yarn-4.0.2.cjs

View File

@@ -10,4 +10,4 @@ if [ ! -d "node_modules" ] || [ "$(ls -A node_modules)" = "" ]; then
yarn
fi
yarn start:browser
BROWSER=0 yarn start:browser

View File

@@ -3,7 +3,6 @@
ROOT=`dirname $0`
RELEASE=""
RELEASE_NOTES="" # TODO: figure out automation for release notes when we start publishing electron versions
CI=${CI:-false}
cd "$ROOT/.."
@@ -35,8 +34,6 @@ if [ "$OSTYPE" == "msys" ]; then
fi
fi
yarn patch-package
yarn rebuild-electron
yarn workspace loot-core build:node
@@ -49,15 +46,13 @@ yarn workspace desktop-electron update-client
cd packages/desktop-electron;
yarn clean;
export npm_config_better_sqlite3_binary_host="https://static.actualbudget.com/prebuild/better-sqlite3"
if [ "$RELEASE" == "production" ]; then
if [ -f ../../.secret-tokens ]; then
source ../../.secret-tokens
fi
yarn build --publish always -c.releaseInfo.releaseNotes="$RELEASE_NOTES" --arm64 --x64
yarn build --publish never --arm64 --x64
echo "\nCreated release with release notes \"$RELEASE_NOTES\""
echo "\nCreated release"
else
SKIP_NOTARIZATION=true yarn build --publish never --x64
fi

View File

@@ -8,6 +8,8 @@ services:
actual-development:
build: .
image: actual-development
environment:
- HTTPS
ports:
- '3001:3001'
volumes:

View File

@@ -19,7 +19,7 @@
},
"scripts": {
"start": "yarn start:browser",
"start:desktop": "npm-run-all --parallel 'start:desktop-*'",
"start:desktop": "yarn rebuild-electron && npm-run-all --parallel 'start:desktop-*'",
"start:desktop-node": "yarn workspace loot-core watch:node",
"start:desktop-client": "yarn workspace @actual-app/web watch",
"start:desktop-electron": "yarn workspace desktop-electron watch",
@@ -30,42 +30,41 @@
"build:browser": "./bin/package-browser",
"build:desktop": "./bin/package-electron",
"build:api": "yarn workspace @actual-app/api build",
"test": "yarn workspaces foreach --parallel --verbose run test",
"test:debug": "yarn workspaces foreach --verbose run test",
"e2e": "yarn workspaces foreach --parallel --verbose run e2e",
"vrt": "yarn workspaces foreach --parallel --verbose run vrt",
"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",
"vrt": "yarn workspaces foreach --all --parallel --verbose 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": "eslint . --max-warnings 0 --ext .js,.jsx,.ts,.tsx",
"lint:verbose": "DEBUG=eslint:cli-engine eslint . --max-warnings 0",
"typecheck": "yarn tsc",
"jq": "./node_modules/node-jq/bin/jq",
"postinstall": "patch-package"
"typecheck": "yarn tsc && tsc-strict",
"jq": "./node_modules/node-jq/bin/jq"
},
"devDependencies": {
"cross-env": "^7.0.3",
"eslint": "^8.37.0",
"eslint-config-prettier": "^9.1.0",
"eslint-config-react-app": "7.0.1",
"eslint-import-resolver-typescript": "3.5.5",
"eslint-plugin-import": "2.27.5",
"eslint-plugin-prettier": "4.2.1",
"eslint-plugin-prettier": "5.1.3",
"eslint-plugin-react": "7.32.2",
"eslint-plugin-rulesdir": "^0.2.2",
"node-jq": "^4.0.1",
"npm-run-all": "^4.1.3",
"patch-package": "^6.1.2",
"prettier": "2.8.2",
"react-refresh": "^0.14.0",
"npm-run-all": "^4.1.5",
"prettier": "3.2.4",
"source-map-support": "^0.5.21",
"typescript": "^5.0.2"
"typescript": "^5.0.2",
"typescript-strict-plugin": "^2.2.2-beta.2"
},
"resolutions": {
"react-error-overlay": "6.0.9"
"rollup": "4.9.4"
},
"engines": {
"node": ">=18.0.0"
},
"packageManager": "yarn@3.5.1",
"packageManager": "yarn@4.0.2",
"browserslist": [
"electron 24.0",
"defaults"

View File

@@ -2,3 +2,4 @@ app/bundle.api.js*
app/stats.json
migrations
default-db.sqlite
mocks/budgets/**/*

View File

@@ -0,0 +1,21 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`API setup and teardown successfully loads budget 1`] = `
Array [
"2016-10",
"2016-11",
"2016-12",
"2017-01",
"2017-02",
"2017-03",
"2017-04",
"2017-05",
"2017-06",
"2017-07",
"2017-08",
"2017-09",
"2017-10",
"2017-11",
"2017-12",
]
`;

View File

@@ -23,7 +23,7 @@ class Query {
}
unfilter(exprs) {
let exprSet = new Set(exprs);
const exprSet = new Set(exprs);
return new Query({
...this.state,
filterExpressions: this.state.filterExpressions.filter(
@@ -37,13 +37,13 @@ class Query {
exprs = [exprs];
}
let query = new Query({ ...this.state, selectExpressions: exprs });
const query = new Query({ ...this.state, selectExpressions: exprs });
query.state.calculation = false;
return query;
}
calculate(expr) {
let query = this.select({ result: expr });
const query = this.select({ result: expr });
query.state.calculation = true;
return query;
}
@@ -99,6 +99,6 @@ class Query {
}
}
export default function q(table) {
export function q(table) {
return new Query({ table });
}

View File

@@ -1,37 +0,0 @@
/* eslint-disable import/no-unused-modules */
// eslint-disable-next-line import/extensions
import * as bundle from './app/bundle.api.js';
import * as injected from './injected';
let actualApp;
export const internal = bundle.lib;
// DEPRECATED: remove the next line in @actual-app/api v7
export * as methods from './methods';
export * from './methods';
export * as utils from './utils';
export async function init(config = {}) {
if (actualApp) {
return;
}
global.fetch = (...args) =>
import('node-fetch').then(({ default: fetch }) => fetch(...args));
await bundle.init(config);
actualApp = bundle.lib;
injected.override(bundle.lib.send);
return bundle.lib;
}
export async function shutdown() {
if (actualApp) {
await actualApp.send('sync');
await actualApp.send('close-budget');
actualApp = null;
}
}

53
packages/api/index.ts Normal file
View File

@@ -0,0 +1,53 @@
import type {
RequestInfo as FetchInfo,
RequestInit as FetchInit,
// @ts-ignore: false-positive commonjs module error on build until typescript 5.3
} from 'node-fetch'; // with { 'resolution-mode': 'import' };
// loot-core types
import type { InitConfig } from 'loot-core/server/main';
// @ts-ignore: bundle not available until we build it
// eslint-disable-next-line import/extensions
import * as bundle from './app/bundle.api.js';
import * as injected from './injected';
import { validateNodeVersion } from './validateNodeVersion';
let actualApp: null | typeof bundle.lib;
export const internal = bundle.lib;
// DEPRECATED: remove the next line in @actual-app/api v7
export * as methods from './methods';
export * from './methods';
export * as utils from './utils';
export async function init(config: InitConfig = {}) {
if (actualApp) {
return;
}
validateNodeVersion();
if (!globalThis.fetch) {
globalThis.fetch = (url: URL | RequestInfo, init?: RequestInit) => {
return import('node-fetch').then(({ default: fetch }) =>
fetch(url as unknown as FetchInfo, init as unknown as FetchInit),
) as unknown as Promise<Response>;
};
}
await bundle.init(config);
actualApp = bundle.lib;
injected.override(bundle.lib.send);
return bundle.lib;
}
export async function shutdown() {
if (actualApp) {
await actualApp.send('sync');
await actualApp.send('close-budget');
actualApp = null;
}
}

View File

@@ -0,0 +1,24 @@
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

@@ -1,155 +0,0 @@
import * as injected from './injected';
export { default as q } from './app/query';
function send(name, args) {
return injected.send(name, args);
}
export async function runImport(name, func) {
await send('api/start-import', { budgetName: name });
try {
await func();
} catch (e) {
await send('api/abort-import');
throw e;
}
await send('api/finish-import');
}
export async function loadBudget(budgetId) {
return send('api/load-budget', { id: budgetId });
}
export async function downloadBudget(syncId, { password } = {}) {
return send('api/download-budget', { syncId, password });
}
export async function sync() {
return send('api/sync');
}
export async function batchBudgetUpdates(func) {
await send('api/batch-budget-start');
try {
await func();
} finally {
await send('api/batch-budget-end');
}
}
export function runQuery(query) {
return send('api/query', { query: query.serialize() });
}
export function getBudgetMonths() {
return send('api/budget-months');
}
export function getBudgetMonth(month) {
return send('api/budget-month', { month });
}
export function setBudgetAmount(month, categoryId, value) {
return send('api/budget-set-amount', { month, categoryId, amount: value });
}
export function setBudgetCarryover(month, categoryId, flag) {
return send('api/budget-set-carryover', { month, categoryId, flag });
}
export function addTransactions(accountId, transactions) {
return send('api/transactions-add', { accountId, transactions });
}
export function importTransactions(accountId, transactions) {
return send('api/transactions-import', { accountId, transactions });
}
export function getTransactions(accountId, startDate, endDate) {
return send('api/transactions-get', { accountId, startDate, endDate });
}
export function filterTransactions(accountId, text) {
return send('api/transactions-filter', { accountId, text });
}
export function updateTransaction(id, fields) {
return send('api/transaction-update', { id, fields });
}
export function deleteTransaction(id) {
return send('api/transaction-delete', { id });
}
export function getAccounts() {
return send('api/accounts-get');
}
export function createAccount(account, initialBalance) {
return send('api/account-create', { account, initialBalance });
}
export function updateAccount(id, fields) {
return send('api/account-update', { id, fields });
}
export function closeAccount(id, transferAccountId, transferCategoryId) {
return send('api/account-close', {
id,
transferAccountId,
transferCategoryId,
});
}
export function reopenAccount(id) {
return send('api/account-reopen', { id });
}
export function deleteAccount(id) {
return send('api/account-delete', { id });
}
export function createCategoryGroup(group) {
return send('api/category-group-create', { group });
}
export function updateCategoryGroup(id, fields) {
return send('api/category-group-update', { id, fields });
}
export function deleteCategoryGroup(id, transferCategoryId) {
return send('api/category-group-delete', { id, transferCategoryId });
}
export function getCategories() {
return send('api/categories-get', { grouped: false });
}
export function createCategory(category) {
return send('api/category-create', { category });
}
export function updateCategory(id, fields) {
return send('api/category-update', { id, fields });
}
export function deleteCategory(id, transferCategoryId) {
return send('api/category-delete', { id, transferCategoryId });
}
export function getPayees() {
return send('api/payees-get');
}
export function createPayee(payee) {
return send('api/payee-create', { payee });
}
export function updatePayee(id, fields) {
return send('api/payee-update', { id, fields });
}
export function deletePayee(id) {
return send('api/payee-delete', { id });
}

View File

@@ -0,0 +1,420 @@
// @ts-strict-ignore
import * as fs from 'fs/promises';
import * as path from 'path';
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();
const budgetPath = path.join(__dirname, '/mocks/budgets/', budgetName);
await fs.rm(budgetPath, { force: true, recursive: true });
await createTestBudget('default-budget-template', budgetName);
await api.init({
dataDir: path.join(__dirname, '/mocks/budgets/'),
});
});
afterEach(async () => {
global.currentMonth = null;
await api.shutdown();
});
async function createTestBudget(templateName: string, name: string) {
const templatePath = path.join(
__dirname,
'/../loot-core/src/mocks/files',
templateName,
);
const budgetPath = path.join(__dirname, '/mocks/budgets/', name);
await fs.mkdir(budgetPath);
await fs.copyFile(
path.join(templatePath, 'metadata.json'),
path.join(budgetPath, 'metadata.json'),
);
await fs.copyFile(
path.join(templatePath, 'db.sqlite'),
path.join(budgetPath, 'db.sqlite'),
);
}
describe('API setup and teardown', () => {
// apis: loadBudget, getBudgetMonths
test('successfully loads budget', async () => {
await expect(api.loadBudget(budgetName)).resolves.toBeUndefined();
await expect(api.getBudgetMonths()).resolves.toMatchSnapshot();
});
});
describe('API CRUD operations', () => {
beforeEach(async () => {
// load test budget
await api.loadBudget(budgetName);
});
// apis: getCategoryGroups, createCategoryGroup, updateCategoryGroup, deleteCategoryGroup
test('CategoryGroups: successfully update category groups', async () => {
const month = '2023-10';
global.currentMonth = month;
// get existing category groups
const groups = await api.getCategoryGroups();
expect(groups).toEqual(
expect.arrayContaining([
expect.objectContaining({
hidden: 0,
id: 'fc3825fd-b982-4b72-b768-5b30844cf832',
is_income: 0,
name: 'Usual Expenses',
sort_order: 16384,
tombstone: 0,
}),
expect.objectContaining({
hidden: 0,
id: 'a137772f-cf2f-4089-9432-822d2ddc1466',
is_income: 0,
name: 'Investments and Savings',
sort_order: 32768,
tombstone: 0,
}),
expect.objectContaining({
hidden: 0,
id: '2E1F5BDB-209B-43F9-AF2C-3CE28E380C00',
is_income: 1,
name: 'Income',
sort_order: 32768,
tombstone: 0,
}),
]),
);
// create our test category group
const mainGroupId = await api.createCategoryGroup({
name: 'test-group',
});
let budgetMonth = await api.getBudgetMonth(month);
expect(budgetMonth.categoryGroups).toEqual(
expect.arrayContaining([
expect.objectContaining({
id: mainGroupId,
}),
]),
);
// update group
await api.updateCategoryGroup(mainGroupId, {
name: 'update-tests',
});
budgetMonth = await api.getBudgetMonth(month);
expect(budgetMonth.categoryGroups).toEqual(
expect.arrayContaining([
expect.objectContaining({
id: mainGroupId,
}),
]),
);
// delete group
await api.deleteCategoryGroup(mainGroupId);
budgetMonth = await api.getBudgetMonth(month);
expect(budgetMonth.categoryGroups).toEqual(
expect.arrayContaining([
expect.not.objectContaining({
id: mainGroupId,
}),
]),
);
});
// apis: createCategory, getCategories, updateCategory, deleteCategory
test('Categories: successfully update categories', async () => {
const month = '2023-10';
global.currentMonth = month;
// create our test category group
const mainGroupId = await api.createCategoryGroup({
name: 'test-group',
});
const secondaryGroupId = await api.createCategoryGroup({
name: 'test-secondary-group',
});
const categoryId = await api.createCategory({
name: 'test-budget',
group_id: mainGroupId,
});
const categoryIdHidden = await api.createCategory({
name: 'test-budget-hidden',
group_id: mainGroupId,
hidden: true,
});
let categories = await api.getCategories();
expect(categories).toEqual(
expect.arrayContaining([
expect.objectContaining({
id: categoryId,
name: 'test-budget',
hidden: false,
group_id: mainGroupId,
}),
expect.objectContaining({
id: categoryIdHidden,
name: 'test-budget-hidden',
hidden: true,
group_id: mainGroupId,
}),
]),
);
// update/move category
await api.updateCategory(categoryId, {
name: 'updated-budget',
group_id: secondaryGroupId,
});
await api.updateCategory(categoryIdHidden, {
name: 'updated-budget-hidden',
group_id: secondaryGroupId,
hidden: false,
});
categories = await api.getCategories();
expect(categories).toEqual(
expect.arrayContaining([
expect.objectContaining({
id: categoryId,
name: 'updated-budget',
hidden: false,
group_id: secondaryGroupId,
}),
expect.objectContaining({
id: categoryIdHidden,
name: 'updated-budget-hidden',
hidden: false,
group_id: secondaryGroupId,
}),
]),
);
// delete categories
await api.deleteCategory(categoryId);
expect(categories).toEqual(
expect.arrayContaining([
expect.not.objectContaining({
id: categoryId,
}),
]),
);
});
// apis: setBudgetAmount, setBudgetCarryover, getBudgetMonth
test('Budgets: successfully update budgets', async () => {
const month = '2023-10';
global.currentMonth = month;
// create some new categories to test with
const groupId = await api.createCategoryGroup({
name: 'tests',
});
const categoryId = await api.createCategory({
name: 'test-budget',
group_id: groupId,
});
await api.setBudgetAmount(month, categoryId, 100);
await api.setBudgetCarryover(month, categoryId, true);
const budgetMonth = await api.getBudgetMonth(month);
expect(budgetMonth.categoryGroups).toEqual(
expect.arrayContaining([
expect.objectContaining({
id: groupId,
categories: expect.arrayContaining([
expect.objectContaining({
id: categoryId,
budgeted: 100,
carryover: true,
}),
]),
}),
]),
);
});
//apis: createAccount, getAccounts, updateAccount, closeAccount, deleteAccount, reopenAccount
test('Accounts: successfully complete account operators', async () => {
const accountId1 = await api.createAccount(
{ name: 'test-account1', offbudget: true },
1000,
);
const accountId2 = await api.createAccount({ name: 'test-account2' }, 0);
let accounts = await api.getAccounts();
// accounts successfully created
expect(accounts).toEqual(
expect.arrayContaining([
expect.objectContaining({
id: accountId1,
name: 'test-account1',
offbudget: true,
}),
expect.objectContaining({ id: accountId2, name: 'test-account2' }),
]),
);
await api.updateAccount(accountId1, { offbudget: false });
await api.closeAccount(accountId1, accountId2, null);
await api.deleteAccount(accountId2);
// accounts successfully updated, and one of them deleted
accounts = await api.getAccounts();
expect(accounts).toEqual(
expect.arrayContaining([
expect.objectContaining({
id: accountId1,
name: 'test-account1',
closed: true,
offbudget: false,
}),
expect.not.objectContaining({ id: accountId2 }),
]),
);
await api.reopenAccount(accountId1);
// the non-deleted account is reopened
accounts = await api.getAccounts();
expect(accounts).toEqual(
expect.arrayContaining([
expect.objectContaining({
id: accountId1,
name: 'test-account1',
closed: false,
}),
]),
);
});
// apis: createPayee, getPayees, updatePayee, deletePayee
test('Payees: successfully update payees', async () => {
const payeeId1 = await api.createPayee({ name: 'test-payee1' });
const payeeId2 = await api.createPayee({ name: 'test-payee2' });
let payees = await api.getPayees();
// payees successfully created
expect(payees).toEqual(
expect.arrayContaining([
expect.objectContaining({
id: payeeId1,
name: 'test-payee1',
}),
expect.objectContaining({
id: payeeId2,
name: 'test-payee2',
}),
]),
);
await api.updatePayee(payeeId1, { name: 'test-updated-payee' });
await api.deletePayee(payeeId2);
// confirm update and delete were successful
payees = await api.getPayees();
expect(payees).toEqual(
expect.arrayContaining([
expect.objectContaining({
id: payeeId1,
name: 'test-updated-payee',
}),
expect.not.objectContaining({
name: 'test-payee1',
}),
expect.not.objectContaining({
id: payeeId2,
}),
]),
);
});
// apis: addTransactions, getTransactions, importTransactions, updateTransaction, deleteTransaction
test('Transactions: successfully update transactions', async () => {
const accountId = await api.createAccount({ name: 'test-account' }, 0);
let newTransaction = [
{ date: '2023-11-03', imported_id: '11', amount: 100 },
{ date: '2023-11-03', imported_id: '11', amount: 100 },
];
const addResult = await api.addTransactions(accountId, newTransaction, {
learnCategories: true,
runTransfers: true,
});
expect(addResult).toBe('ok');
// confirm added transactions exist
let transactions = await api.getTransactions(
accountId,
'2023-11-01',
'2023-11-30',
);
expect(transactions).toEqual(
expect.arrayContaining(
newTransaction.map(trans => expect.objectContaining(trans)),
),
);
expect(transactions).toHaveLength(2);
newTransaction = [
{ date: '2023-12-03', imported_id: '11', amount: 100 },
{ date: '2023-12-03', imported_id: '22', amount: 200 },
];
const reconciled = await api.importTransactions(accountId, newTransaction);
// Expect it to reconcile and to have updated one of the previous transactions
expect(reconciled.added).toHaveLength(1);
expect(reconciled.updated).toHaveLength(1);
// confirm imported transactions exist
transactions = await api.getTransactions(
accountId,
'2023-12-01',
'2023-12-31',
);
expect(transactions).toEqual(
expect.arrayContaining(
newTransaction.map(trans => expect.objectContaining(trans)),
),
);
expect(transactions).toHaveLength(2);
const idToUpdate = reconciled.added[0];
const idToDelete = reconciled.updated[0];
await api.updateTransaction(idToUpdate, { amount: 500 });
await api.deleteTransaction(idToDelete);
// confirm updates and deletions work
transactions = await api.getTransactions(
accountId,
'2023-12-01',
'2023-12-31',
);
expect(transactions).toEqual(
expect.arrayContaining([
expect.objectContaining({ id: idToUpdate, amount: 500 }),
expect.not.objectContaining({ id: idToDelete }),
]),
);
expect(transactions).toHaveLength(1);
});
});

170
packages/api/methods.ts Normal file
View File

@@ -0,0 +1,170 @@
// @ts-strict-ignore
import type { Handlers } from 'loot-core/src/types/handlers';
import * as injected from './injected';
export { q } from './app/query';
function send<K extends keyof Handlers, T extends Handlers[K]>(
name: K,
args?: Parameters<T>[0],
): Promise<Awaited<ReturnType<T>>> {
return injected.send(name, args);
}
export async function runImport(name, func) {
await send('api/start-import', { budgetName: name });
try {
await func();
} catch (e) {
await send('api/abort-import');
throw e;
}
await send('api/finish-import');
}
export async function loadBudget(budgetId) {
return send('api/load-budget', { id: budgetId });
}
export async function downloadBudget(syncId, { password }: { password? } = {}) {
return send('api/download-budget', { syncId, password });
}
export async function sync() {
return send('api/sync');
}
export async function batchBudgetUpdates(func) {
await send('api/batch-budget-start');
try {
await func();
} finally {
await send('api/batch-budget-end');
}
}
export function runQuery(query) {
return send('api/query', { query: query.serialize() });
}
export function getBudgetMonths() {
return send('api/budget-months');
}
export function getBudgetMonth(month) {
return send('api/budget-month', { month });
}
export function setBudgetAmount(month, categoryId, value) {
return send('api/budget-set-amount', { month, categoryId, amount: value });
}
export function setBudgetCarryover(month, categoryId, flag) {
return send('api/budget-set-carryover', { month, categoryId, flag });
}
export function addTransactions(
accountId,
transactions,
{ learnCategories = false, runTransfers = false } = {},
) {
return send('api/transactions-add', {
accountId,
transactions,
learnCategories,
runTransfers,
});
}
export function importTransactions(accountId, transactions) {
return send('api/transactions-import', { accountId, transactions });
}
export function getTransactions(accountId, startDate, endDate) {
return send('api/transactions-get', { accountId, startDate, endDate });
}
export function updateTransaction(id, fields) {
return send('api/transaction-update', { id, fields });
}
export function deleteTransaction(id) {
return send('api/transaction-delete', { id });
}
export function getAccounts() {
return send('api/accounts-get');
}
export function createAccount(account, initialBalance?) {
return send('api/account-create', { account, initialBalance });
}
export function updateAccount(id, fields) {
return send('api/account-update', { id, fields });
}
export function closeAccount(id, transferAccountId?, transferCategoryId?) {
return send('api/account-close', {
id,
transferAccountId,
transferCategoryId,
});
}
export function reopenAccount(id) {
return send('api/account-reopen', { id });
}
export function deleteAccount(id) {
return send('api/account-delete', { id });
}
export function getCategoryGroups() {
return send('api/category-groups-get');
}
export function createCategoryGroup(group) {
return send('api/category-group-create', { group });
}
export function updateCategoryGroup(id, fields) {
return send('api/category-group-update', { id, fields });
}
export function deleteCategoryGroup(id, transferCategoryId?) {
return send('api/category-group-delete', { id, transferCategoryId });
}
export function getCategories() {
return send('api/categories-get', { grouped: false });
}
export function createCategory(category) {
return send('api/category-create', { category });
}
export function updateCategory(id, fields) {
return send('api/category-update', { id, fields });
}
export function deleteCategory(id, transferCategoryId?) {
return send('api/category-delete', { id, transferCategoryId });
}
export function getPayees() {
return send('api/payees-get');
}
export function createPayee(payee) {
return send('api/payee-create', { payee });
}
export function updatePayee(id, fields) {
return send('api/payee-update', { id, fields });
}
export function deletePayee(id) {
return send('api/payee-delete', { id });
}

View File

View File

@@ -1,27 +1,38 @@
{
"name": "@actual-app/api",
"version": "6.2.1",
"version": "6.7.0",
"license": "MIT",
"description": "An API for Actual",
"engines": {
"node": ">=18.12.0"
},
"main": "dist/index.js",
"types": "dist/index.d.ts",
"types": "@types/index.d.ts",
"files": [
"dist"
],
"scripts": {
"build:app": "yarn workspace loot-core build:api",
"build:node": "tsc --p tsconfig.dist.json",
"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": "rm -rf dist && yarn run build:app && yarn run build:node && yarn run build:migrations && yarn run build:default-db"
"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",
"clean": "rm -rf dist @types"
},
"dependencies": {
"better-sqlite3": "^8.2.0",
"better-sqlite3": "^9.3.0",
"compare-versions": "^6.1.0",
"node-fetch": "^3.3.2",
"uuid": "^9.0.0"
"uuid": "^9.0.1"
},
"devDependencies": {
"@swc/core": "^1.3.105",
"@swc/jest": "^0.2.31",
"@types/jest": "^27.5.2",
"@types/uuid": "^9.0.2",
"jest": "^27.5.1",
"tsc-alias": "^1.8.8",
"typescript": "^5.0.2"
}
}

View File

@@ -3,13 +3,17 @@
"compilerOptions": {
// Using ES2021 because thats the newest version where
// the latest Node 16.x release supports all of the features
"target": "es2021",
"target": "ES2021",
"module": "CommonJS",
"moduleResolution": "Node16",
"noEmit": false,
"declaration": true,
"outDir": "dist"
"outDir": "dist",
"declarationDir": "@types",
"paths": {
"loot-core/src/*": ["./loot-core/*"],
"loot-core/*": ["./@types/loot-core/*"],
}
},
"include": ["."],
"exclude": ["dist"]
"exclude": ["**/node_modules/*", "dist", "@types"]
}

View File

@@ -0,0 +1,16 @@
import { satisfies } from 'compare-versions';
import * as packageJson from './package.json';
export function validateNodeVersion() {
if (process?.versions?.node) {
const nodeVersion = process?.versions?.node;
const minimumNodeVersion = packageJson.engines.node;
if (!satisfies(nodeVersion, minimumNodeVersion)) {
throw new Error(
`@actual-app/api requires a node version ${minimumNodeVersion}. Found that you are using: ${nodeVersion}. Please upgrade to a higher version`,
);
}
}
}

View File

@@ -1,4 +1,6 @@
module.exports = {
preset: 'ts-jest/presets/js-with-ts-esm',
testEnvironment: 'node',
transform: {
'^.+\\.(t|j)sx?$': '@swc/jest',
},
};

View File

@@ -17,13 +17,14 @@
"dependencies": {
"google-protobuf": "^3.12.0-rc.1",
"murmurhash": "^2.0.1",
"uuid": "^9.0.0"
"uuid": "^9.0.1"
},
"devDependencies": {
"@types/jest": "^27.5.0",
"@swc/core": "^1.3.105",
"@swc/jest": "^0.2.31",
"@types/jest": "^27.5.2",
"@types/uuid": "^9.0.2",
"jest": "^27.0.0",
"ts-jest": "^27.0.0",
"jest": "^27.5.1",
"ts-protoc-gen": "^0.15.0",
"typescript": "^5.0.2"
}

View File

@@ -69,8 +69,8 @@ describe('merkle trie', () => {
});
test('diffing works with empty tries', () => {
let trie1 = merkle.emptyTrie();
let trie2 = merkle.insert(
const trie1 = merkle.emptyTrie();
const trie2 = merkle.insert(
merkle.emptyTrie(),
Timestamp.parse('2009-01-02T10:17:37.789Z-0000-0000testinguuid1')!,
);
@@ -79,7 +79,7 @@ describe('merkle trie', () => {
});
test('pruning works and keeps correct hashes', () => {
let messages = [
const messages = [
message('2018-11-01T01:00:00.000Z-0000-0123456789ABCDEF', 1000),
message('2018-11-01T01:09:00.000Z-0000-0123456789ABCDEF', 1100),
message('2018-11-01T01:18:00.000Z-0000-0123456789ABCDEF', 1200),
@@ -101,13 +101,13 @@ describe('merkle trie', () => {
expect(trie.hash).toBe(2496);
expect(trie).toMatchSnapshot();
let pruned = merkle.prune(trie);
const pruned = merkle.prune(trie);
expect(pruned.hash).toBe(2496);
expect(pruned).toMatchSnapshot();
});
test('diffing differently shaped tries returns correct time', () => {
let messages = [
const messages = [
message('2018-11-01T01:00:00.000Z-0000-0123456789ABCDEF', 1000),
message('2018-11-01T01:09:00.000Z-0000-0123456789ABCDEF', 1100),
message('2018-11-01T01:18:00.000Z-0000-0123456789ABCDEF', 1200),
@@ -122,7 +122,7 @@ describe('merkle trie', () => {
message('2018-11-01T02:37:00.000Z-0000-0123456789ABCDEF', 2100),
];
let trie = insertMessages({}, messages);
const trie = insertMessages({}, messages);
// Case 0: It always returns a base time when comparing with an
// empty trie
@@ -136,7 +136,7 @@ describe('merkle trie', () => {
// Case 1: Add an older message that modifies the trie in such a
// way that it modifies the 1st out of 3 branches (so it will be
// pruned away)
let trie1 = insertMessages(trie, [
const trie1 = insertMessages(trie, [
message('2018-11-01T00:59:00.000Z-0000-0123456789ABCDEF', 900),
]);
@@ -167,7 +167,7 @@ describe('merkle trie', () => {
// Case 2: Add two messages similar to the above case, but the
// second message modifies the 2nd key at the same level as the
// first message modifying the 1st key
let trie2 = insertMessages(trie, [
const trie2 = insertMessages(trie, [
message('2018-11-01T00:59:00.000Z-0000-0123456789ABCDEF', 900),
message('2018-11-01T01:15:00.000Z-0000-0123456789ABCDEF', 1422),
]);

View File

@@ -36,7 +36,7 @@ export function getKeys(trie: TrieNode): NumberTrieNodeKey[] {
export function keyToTimestamp(key: string): number {
// 16 is the length of the base 3 value of the current time in
// minutes. Ensure it's padded to create the full value
let fullkey = key + '0'.repeat(16 - key.length);
const fullkey = key + '0'.repeat(16 - key.length);
// Parse the base 3 representation
return parseInt(fullkey, 3) * 1000 * 60;
@@ -46,8 +46,8 @@ export function keyToTimestamp(key: string): number {
* Mutates `trie` to insert a node at `timestamp`
*/
export function insert(trie: TrieNode, timestamp: Timestamp) {
let hash = timestamp.hash();
let key = Number(Math.floor(timestamp.millis() / 1000 / 60)).toString(3);
const hash = timestamp.hash();
const key = Number(Math.floor(timestamp.millis() / 1000 / 60)).toString(3);
trie = Object.assign({}, trie, { hash: (trie.hash || 0) ^ hash });
return insertKey(trie, key, hash);
@@ -68,8 +68,8 @@ function insertKey(trie: TrieNode, key: string, hash: number): TrieNode {
}
export function build(timestamps: Timestamp[]) {
let trie = emptyTrie();
for (let timestamp of timestamps) {
const trie = emptyTrie();
for (const timestamp of timestamps) {
insert(trie, timestamp);
}
return trie;
@@ -89,11 +89,11 @@ export function diff(trie1: TrieNode, trie2: TrieNode): number | null {
// left (this shouldn't happen, if that's the case the hash check at
// the top of this function should pass)
while (1) {
let keyset = new Set([...getKeys(node1), ...getKeys(node2)]);
let keys = [...keyset.values()];
const keyset = new Set([...getKeys(node1), ...getKeys(node2)]);
const keys = [...keyset.values()];
keys.sort();
let diffkey = null;
let diffkey: null | '0' | '1' | '2' = null;
// Traverse down the trie through keys that aren't the same. We
// traverse down the keys in order. Stop in two cases: either one
@@ -110,10 +110,10 @@ export function diff(trie1: TrieNode, trie2: TrieNode): number | null {
// changed time that we know of, because of pruning it might take
// multiple passes to sync up a trie.
for (let i = 0; i < keys.length; i++) {
let key = keys[i];
const key = keys[i];
let next1 = node1[key];
let next2 = node2[key];
const next1 = node1[key];
const next2 = node2[key];
if (!next1 || !next2) {
break;
@@ -143,13 +143,13 @@ export function prune(trie: TrieNode, n = 2): TrieNode {
return trie;
}
let keys = getKeys(trie);
const keys = getKeys(trie);
keys.sort();
let next: TrieNode = { hash: trie.hash };
const next: TrieNode = { hash: trie.hash };
// Prune child nodes.
for (let k of keys.slice(-n)) {
for (const k of keys.slice(-n)) {
const node = trie[k];
if (!node) {

View File

@@ -28,7 +28,7 @@ describe('Timestamp', function () {
describe('parsing', function () {
it('should not parse', function () {
let invalidInputs = [
const invalidInputs = [
null,
undefined,
{},
@@ -44,19 +44,19 @@ describe('Timestamp', function () {
'9999-12-31T23:59:59.999Z-10000-FFFFFFFFFFFFFFFF',
'9999-12-31T23:59:59.999Z-FFFF-10000000000000000',
];
for (let invalidInput of invalidInputs) {
for (const invalidInput of invalidInputs) {
expect(Timestamp.parse(invalidInput as string)).toBe(null);
}
});
it('should parse', function () {
let validInputs = [
const validInputs = [
'1970-01-01T00:00:00.000Z-0000-0000000000000000',
'2015-04-24T22:23:42.123Z-1000-0123456789ABCDEF',
'9999-12-31T23:59:59.999Z-FFFF-FFFFFFFFFFFFFFFF',
];
for (let validInput of validInputs) {
let parsed = Timestamp.parse(validInput)!;
for (const validInput of validInputs) {
const parsed = Timestamp.parse(validInput)!;
expect(typeof parsed).toBe('object');
expect(parsed.millis() >= 0).toBeTruthy();
expect(parsed.millis() < 253402300800000).toBeTruthy();

View File

@@ -80,7 +80,7 @@ export function makeClientId() {
return uuidv4().replace(/-/g, '').slice(-16);
}
let config = {
const config = {
// Allow 5 minutes of clock drift
maxDrift: 5 * 60 * 1000,
};
@@ -96,9 +96,9 @@ export class Timestamp {
constructor(millis: number, counter: number, node: string) {
this._state = {
millis: millis,
counter: counter,
node: node,
millis,
counter,
node,
};
}
@@ -168,11 +168,11 @@ export class Timestamp {
return timestamp;
}
if (typeof timestamp === 'string') {
let parts = timestamp.split('-');
const parts = timestamp.split('-');
if (parts && parts.length === 5) {
let millis = Date.parse(parts.slice(0, 3).join('-')).valueOf();
let counter = parseInt(parts[3], 16);
let node = parts[4];
const millis = Date.parse(parts.slice(0, 3).join('-')).valueOf();
const counter = parseInt(parts[3], 16);
const node = parts[4];
if (
!isNaN(millis) &&
millis >= 0 &&
@@ -198,17 +198,17 @@ export class Timestamp {
}
// retrieve the local wall time
let phys = Date.now();
const phys = Date.now();
// unpack the clock.timestamp logical time and counter
let lOld = clock.timestamp.millis();
let cOld = clock.timestamp.counter();
const lOld = clock.timestamp.millis();
const cOld = clock.timestamp.counter();
// calculate the next logical time and counter
// * ensure that the logical time never goes backward
// * increment the counter if phys time does not advance
let lNew = Math.max(lOld, phys);
let cNew = lOld === lNew ? cOld + 1 : 0;
const lNew = Math.max(lOld, phys);
const cNew = lOld === lNew ? cOld + 1 : 0;
// check the result for drift and counter overflow
if (lNew - phys > config.maxDrift) {
@@ -238,11 +238,11 @@ export class Timestamp {
}
// retrieve the local wall time
let phys = Date.now();
const phys = Date.now();
// unpack the message wall time/counter
let lMsg = msg.millis();
let cMsg = msg.counter();
const lMsg = msg.millis();
const cMsg = msg.counter();
// assert the node id and remote clock drift
// if (msg.node() === clock.timestamp.node()) {
@@ -253,8 +253,8 @@ export class Timestamp {
}
// unpack the clock.timestamp logical time and counter
let lOld = clock.timestamp.millis();
let cOld = clock.timestamp.counter();
const lOld = clock.timestamp.millis();
const cOld = clock.timestamp.counter();
// calculate the next logical time and counter
// . ensure that the logical time never goes backward
@@ -262,15 +262,15 @@ export class Timestamp {
// . if max = old > message, increment local counter
// . if max = messsage > old, increment message counter
// . otherwise, clocks are monotonic, reset counter
let lNew = Math.max(Math.max(lOld, phys), lMsg);
let cNew =
const lNew = Math.max(Math.max(lOld, phys), lMsg);
const cNew =
lNew === lOld && lNew === lMsg
? Math.max(cOld, cMsg) + 1
: lNew === lOld
? cOld + 1
: lNew === lMsg
? cMsg + 1
: 0;
? cOld + 1
: lNew === lMsg
? cMsg + 1
: 0;
// check the result for drift and counter overflow
if (lNew - phys > config.maxDrift) {

View File

@@ -3,7 +3,7 @@
"compilerOptions": {
// Using ES2021 because thats the newest version where
// the latest Node 16.x release supports all of the features
"target": "es2021",
"target": "ES2021",
"module": "CommonJS",
"noEmit": false,
"declaration": true,

View File

@@ -10,11 +10,13 @@ test-results
# production
build
build-stats
stats.json
# misc
.DS_Store
.env
npm-debug.log
.swc
*kcab.*
public/kcab

View File

@@ -0,0 +1,16 @@
{
"jsc": {
"target": "es2022",
"transform": {
"react": {
"runtime": "automatic"
}
},
"externalHelpers": true,
"parser": {
"syntax": "typescript",
"tsx": true
}
},
"sourceMaps": true
}

View File

@@ -32,20 +32,33 @@ Prerequisites:
#### Running against the local server
First start the dev server:
First start a dev instance:
```sh
HTTPS=true yarn start
```
Next, run the standartised docker container and launch the visual regression tests from within it.
or using the dev container:
```
HTTPS=true docker compose up --build
```
Note the network IP address and port the dev instance is listening on.
Next, navigate to the root of your project folder, run the standartised docker container, and launch the visual regression tests from within it.
```sh
# Run docker container
docker run --rm --network host -v $(pwd):/work/ -w /work/ -it mcr.microsoft.com/playwright:v1.37.0-jammy /bin/bash
docker run --rm --network host -v $(pwd):/work/ -w /work/ -it mcr.microsoft.com/playwright:v1.41.1-jammy /bin/bash
# Run the VRT tests: important - they MUST be ran against a HTTPS server
E2E_START_URL=https://192.168.0.178:3001 yarn vrt
# If you receive an error such as "docker: invalid reference format", please instead use the following command:
docker run --rm --network host -v ${pwd}:/work/ -w /work/ -it mcr.microsoft.com/playwright:v1.41.1-jammy /bin/bash
# Run the VRT tests: important - they MUST be ran against a HTTPS server. Use the ip and port noted earlier
E2E_START_URL=https://ip:port yarn vrt
# To update snapshots, use the following command:
E2E_START_URL=https://ip:port yarn vrt --update-snapshots
```
#### Running against a remote server

View File

@@ -8,7 +8,6 @@ echo "Building the browser..."
rm -fr build
export IS_GENERIC_BROWSER=1
export INLINE_RUNTIME_CHUNK=false
export REACT_APP_BACKEND_WORKER_HASH=`ls "$ROOT"/../public/kcab/kcab.worker.*.js | sed 's/.*kcab\.worker\.\(.*\)\.js/\1/'`
yarn build
@@ -16,4 +15,4 @@ yarn build
rm -fr build-stats
mkdir build-stats
mv build/kcab/stats.json build-stats/loot-core-stats.json
mv build/stats.json build-stats/desktop-client-stats.json
mv ./stats.json build-stats/web-stats.json

View File

@@ -1,77 +0,0 @@
const path = require('path');
const chokidar = require('chokidar');
const {
addWebpackPlugin,
addWebpackResolve,
babelInclude,
override,
overrideDevServer,
} = require('customize-cra');
const { IgnorePlugin } = require('webpack');
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');
if (process.env.CI) {
process.env.DISABLE_ESLINT_PLUGIN = 'true';
}
// Forward Netlify env variables
if (process.env.REVIEW_ID) {
process.env.REACT_APP_REVIEW_ID = process.env.REVIEW_ID;
}
module.exports = {
webpack: override(
babelInclude([path.resolve('src'), path.resolve('../loot-core')]),
addWebpackResolve({
extensions: [
...(process.env.IS_GENERIC_BROWSER
? ['.browser.js', '.browser.ts', '.browser.tsx']
: []),
'.web.js',
'.web.ts',
'.web.tsx',
'.js',
'.ts',
'.tsx',
],
}),
addWebpackPlugin(
new BundleAnalyzerPlugin({
analyzerMode: 'disabled',
generateStatsFile: true,
}),
),
// Pikaday throws a warning if Moment.js is not installed however it doesn't
// actually require it to be installed. As we don't use Moment.js ourselves
// then we can just silence this warning.
addWebpackPlugin(
new IgnorePlugin({
contextRegExp: /pikaday$/,
resourceRegExp: /moment$/,
}),
),
),
devServer: overrideDevServer(config => {
return {
...config,
onBeforeSetupMiddleware(server) {
chokidar
.watch([
path.resolve('../loot-core/lib-dist/*.js'),
path.resolve('../loot-core/lib-dist/browser/*.js'),
])
.on('all', function () {
for (const ws of server.webSocketServer.clients) {
ws.send(JSON.stringify({ type: 'static-changed' }));
}
});
},
headers: {
...config.headers,
'Cross-Origin-Opener-Policy': 'same-origin',
'Cross-Origin-Embedder-Policy': 'require-corp',
},
};
}),
};

View File

@@ -2,12 +2,12 @@ import { test, expect } from '@playwright/test';
import { ConfigurationPage } from './page-models/configuration-page';
import { Navigation } from './page-models/navigation';
import screenshotConfig from './screenshot.config';
test.describe('Accounts', () => {
let page;
let navigation;
let configurationPage;
let accountPage;
test.beforeAll(async ({ browser }) => {
page = await browser.newPage();
@@ -23,7 +23,7 @@ test.describe('Accounts', () => {
});
test('creates a new account and views the initial balance transaction', async () => {
const accountPage = await navigation.createAccount({
accountPage = await navigation.createAccount({
name: 'New Account',
offBudget: false,
balance: 100,
@@ -35,20 +35,68 @@ test.describe('Accounts', () => {
await expect(transaction.category).toHaveText('Starting Balances');
await expect(transaction.debit).toHaveText('');
await expect(transaction.credit).toHaveText('100.00');
await expect(page).toHaveScreenshot(screenshotConfig(page));
await expect(page).toMatchThemeScreenshots();
});
test('closes an account', async () => {
const accountPage = await navigation.goToAccountPage('Roth IRA');
accountPage = await navigation.goToAccountPage('Roth IRA');
await expect(accountPage.accountName).toHaveText('Roth IRA');
const modal = await accountPage.clickCloseAccount();
await modal.selectTransferAccount('Vanguard 401k');
await expect(page).toHaveScreenshot(screenshotConfig(page));
await expect(page).toMatchThemeScreenshots();
await modal.closeAccount();
await expect(accountPage.accountName).toHaveText('Closed: Roth IRA');
await expect(page).toHaveScreenshot(screenshotConfig(page));
await expect(page).toMatchThemeScreenshots();
});
test.describe('Budgeted Accounts', () => {
// Reset filters
test.afterEach(async () => {
await accountPage.removeFilter(0);
});
test('creates a transfer from two existing transactions', async () => {
accountPage = await navigation.goToAccountPage('For budget');
await expect(accountPage.accountName).toHaveText('Budgeted Accounts');
await accountPage.filterByNote('Test Acc Transfer');
await accountPage.createSingleTransaction({
account: 'Ally Savings',
payee: '',
notes: 'Test Acc Transfer',
category: 'Food',
debit: '34.56',
});
await accountPage.createSingleTransaction({
account: 'HSBC',
payee: '',
notes: 'Test Acc Transfer',
category: 'Food',
credit: '34.56',
});
await page.waitForTimeout(100); // Give time for the previous transaction to be rendered
await accountPage.selectNthTransaction(0);
await accountPage.selectNthTransaction(1);
await accountPage.clickSelectAction('Make transfer');
let transaction = accountPage.getNthTransaction(0);
await expect(transaction.payee).toHaveText('Ally Savings');
await expect(transaction.category).toHaveText('Transfer');
await expect(transaction.credit).toHaveText('34.56');
await expect(transaction.account).toHaveText('HSBC');
transaction = accountPage.getNthTransaction(1);
await expect(transaction.payee).toHaveText('HSBC');
await expect(transaction.category).toHaveText('Transfer');
await expect(transaction.debit).toHaveText('34.56');
await expect(transaction.account).toHaveText('Ally Savings');
});
});
});

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 55 KiB

View File

@@ -1,7 +1,6 @@
import { test, expect } from '@playwright/test';
import { ConfigurationPage } from './page-models/configuration-page';
import screenshotConfig from './screenshot.config';
test.describe('Budget', () => {
let page;
@@ -34,7 +33,7 @@ test.describe('Budget', () => {
await expect(summary.getByText(/^Overspent in /)).toBeVisible();
await expect(summary.getByText('Budgeted')).toBeVisible();
await expect(summary.getByText('For Next Month')).toBeVisible();
await expect(page).toHaveScreenshot(screenshotConfig(page));
await expect(page).toMatchThemeScreenshots();
});
test('transfer funds to another category', async () => {
@@ -47,7 +46,7 @@ test.describe('Budget', () => {
expect(await budgetPage.getBalanceForRow(2)).toEqual(
currentFundsA + currentFundsB,
);
await expect(page).toHaveScreenshot(screenshotConfig(page));
await expect(page).toMatchThemeScreenshots();
});
test('budget table is rendered', async () => {
@@ -60,12 +59,9 @@ test.describe('Budget', () => {
});
test('clicking on spent amounts opens a transaction page', async () => {
let categoryName = await budgetPage.getCategoryNameForRow(1);
let accountPage = await budgetPage.clickOnSpentAmountForRow(1);
const accountPage = await budgetPage.clickOnSpentAmountForRow(1);
expect(page.url()).toContain('/accounts');
expect(await accountPage.accountName.textContent()).toMatch(
new RegExp(String.raw`${categoryName} \(\w+ \d+\)`),
);
expect(await accountPage.accountName.textContent()).toMatch('All Accounts');
await page.getByRole('button', { name: 'Back' }).click();
});
});

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 83 KiB

View File

@@ -1597,7 +1597,7 @@
"date": "2023-08-04",
"amount": 0,
"memo": "getting paid",
"cleared": "cleared",
"cleared": "reconciled",
"approved": true,
"flag_color": null,
"account_id": "bc1d862f-bab0-41c3-bd1e-6cee8c688e32",
@@ -1657,7 +1657,7 @@
"date": "2023-08-04",
"amount": 1000000,
"memo": "",
"cleared": "cleared",
"cleared": "reconciled",
"approved": true,
"flag_color": null,
"account_id": "bc1d862f-bab0-41c3-bd1e-6cee8c688e32",
@@ -1671,9 +1671,70 @@
"import_payee_name_original": null,
"debt_transaction_type": null,
"deleted": false
},
{
"id": "213526fc-ba49-4790-8a96-cc2a50182728",
"date": "2023-09-04",
"amount": -100000,
"memo": "Test transaction",
"cleared": "cleared",
"approved": true,
"flag_color": null,
"account_id": "bc1d862f-bab0-41c3-bd1e-6cee8c688e32",
"payee_id": "2a20470a-634f-4efa-a7f6-f1c0b0bdda41",
"category_id": "36120d44-6c61-4402-985a-891a8d267858",
"transfer_account_id": null,
"transfer_transaction_id": null,
"matched_transaction_id": null,
"import_id": null,
"import_payee_name": null,
"import_payee_name_original": null,
"debt_transaction_type": null,
"deleted": false
},
{
"id": "024494a1-f1e0-4667-9fc0-91e4a4262193",
"date": "2023-09-04",
"amount": 50000,
"memo": "split part b",
"cleared": "cleared",
"approved": true,
"flag_color": null,
"account_id": "125f339b-2a63-481e-84c0-f04d898905d2",
"payee_id": "",
"category_id": null,
"transfer_account_id": "bc1d862f-bab0-41c3-bd1e-6cee8c688e32",
"transfer_transaction_id": null,
"matched_transaction_id": null,
"import_id": null,
"import_payee_name": null,
"import_payee_name_original": null,
"debt_transaction_type": null,
"deleted": false
}
],
"subtransactions": [
{
"id": "d8ec8c84-5033-4f7e-8485-66bfe19a70d6",
"transaction_id": "213526fc-ba49-4790-8a96-cc2a50182728",
"amount": -50000,
"memo": "split part a",
"payee_id": "2a20470a-634f-4efa-a7f6-f1c0b0bdda41",
"category_id": "36120d44-6c61-4402-985a-891a8d267858",
"transfer_account_id": null,
"deleted": false
},
{
"id": "870d8780-79cf-4197-a341-47d24b2b5a59",
"transaction_id": "213526fc-ba49-4790-8a96-cc2a50182728",
"amount": -50000,
"memo": "split part b",
"payee_id": "8d3017e0-2aa6-4fe2-b011-c53c9f147eb6",
"category_id": null,
"transfer_account_id": "125f339b-2a63-481e-84c0-f04d898905d2",
"deleted": false
}
],
"subtransactions": [],
"scheduled_transactions": [],
"scheduled_subtransactions": []
},

View File

@@ -2,7 +2,6 @@ import { test, expect } from '@playwright/test';
import { ConfigurationPage } from './page-models/configuration-page';
import { MobileNavigation } from './page-models/mobile-navigation';
import screenshotConfig from './screenshot.config';
test.describe('Mobile', () => {
let page;
@@ -44,46 +43,48 @@ test.describe('Mobile', () => {
'Water',
'Power',
]);
await expect(page).toHaveScreenshot(screenshotConfig(page));
await expect(page).toMatchThemeScreenshots();
});
test('opens the accounts page and asserts on balances', async () => {
const accountsPage = await navigation.goToAccountsPage();
const account = await accountsPage.getNthAccount(0);
const account = await accountsPage.getNthAccount(1);
await expect(account.name).toHaveText('Ally Savings');
await expect(account.balance).toHaveText('7,653.00');
await expect(page).toHaveScreenshot(screenshotConfig(page));
await expect(page).toMatchThemeScreenshots();
});
test('opens individual account page and checks that filtering is working', async () => {
const accountsPage = await navigation.goToAccountsPage();
const accountPage = await accountsPage.openNthAccount(1);
const accountPage = await accountsPage.openNthAccount(0);
await expect(accountPage.heading).toHaveText('Bank of America');
expect(await accountPage.getBalance()).toBeGreaterThan(0);
await expect(accountPage.noTransactionsFoundError).not.toBeVisible();
await expect(page).toHaveScreenshot(screenshotConfig(page));
await expect(page).toMatchThemeScreenshots();
await accountPage.searchByText('nothing should be found');
await expect(accountPage.noTransactionsFoundError).toBeVisible();
await expect(accountPage.transactions).toHaveCount(0);
await expect(page).toHaveScreenshot(screenshotConfig(page));
await expect(page).toMatchThemeScreenshots();
await accountPage.searchByText('Kroger');
await expect(accountPage.transactions).not.toHaveCount(0);
await expect(page).toHaveScreenshot(screenshotConfig(page));
await expect(page).toMatchThemeScreenshots();
});
test('creates a transaction via footer button', async () => {
const transactionEntryPage = await navigation.goToTransactionEntryPage();
await expect(page).toHaveScreenshot(screenshotConfig(page));
await expect(page).toMatchThemeScreenshots();
await expect(transactionEntryPage.header).toHaveText('New Transaction');
await transactionEntryPage.amountField.fill('12.34');
// Click anywhere to cancel active edit.
await transactionEntryPage.header.click();
await transactionEntryPage.fillField(
page.getByTestId('payee-field'),
'Kroger',
@@ -96,25 +97,27 @@ test.describe('Mobile', () => {
page.getByTestId('account-field'),
'Ally Savings',
);
await expect(page).toHaveScreenshot(screenshotConfig(page));
await expect(page).toMatchThemeScreenshots();
const accountPage = await transactionEntryPage.createTransaction();
await expect(accountPage.transactions.nth(0)).toHaveText(
'KrogerClothing-12.34',
);
await expect(page).toHaveScreenshot(screenshotConfig(page));
await expect(page).toMatchThemeScreenshots();
});
test('creates a transaction from `/accounts/:id` page', async () => {
const accountsPage = await navigation.goToAccountsPage();
const accountPage = await accountsPage.openNthAccount(1);
const accountPage = await accountsPage.openNthAccount(2);
const transactionEntryPage = await accountPage.clickCreateTransaction();
await expect(transactionEntryPage.header).toHaveText('New Transaction');
await expect(page).toHaveScreenshot(screenshotConfig(page));
await expect(page).toMatchThemeScreenshots();
await transactionEntryPage.amountField.fill('12.34');
// Click anywhere to cancel active edit.
await transactionEntryPage.header.click();
await transactionEntryPage.fillField(
page.getByTestId('payee-field'),
'Kroger',
@@ -133,7 +136,7 @@ test.describe('Mobile', () => {
test('checks that settings page can be opened', async () => {
const settingsPage = await navigation.goToSettingsPage();
await expect(page).toHaveScreenshot(screenshotConfig(page));
await expect(page).toMatchThemeScreenshots();
const downloadPromise = page.waitForEvent('download');
@@ -144,6 +147,6 @@ test.describe('Mobile', () => {
expect(await download.suggestedFilename()).toMatch(
/^\d{4}-\d{2}-\d{2}-.*.zip$/,
);
await expect(page).toHaveScreenshot(screenshotConfig(page));
await expect(page).toMatchThemeScreenshots();
});
});

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 32 KiB

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