1
0
Fork 0
mirror of https://github.com/maybe-finance/maybe.git synced 2025-08-02 20:15:22 +02:00

Account Activity View + Account Forms (#1406)
Some checks are pending
Publish Docker image / ci (push) Waiting to run
Publish Docker image / Build docker image (push) Blocked by required conditions

* Remove balance mode, sketch out refactor

* Activity view checkpoint

* Entry partials, checkpoint

* Finish txn partial

* Give entries context when editing for different turbo responses

* Calculate change of balance for each entry

* Account tabs consolidation

* Translations, linting, brakeman updates

* Account actions concern

* Finalize forms, get account system tests passing

* Get tests passing

* Lint, rubocop, schema updates

* Improve routing and stream responses

* Fix broken routes

* Add import option for adding accounts

* Fix system test

* Fix test specificity

* Fix sparklines

* Improve account redirects
This commit is contained in:
Zach Gollwitzer 2024-11-04 20:27:31 -05:00 committed by GitHub
parent 12e4f1067d
commit 65db49273c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
216 changed files with 2043 additions and 1620 deletions

View file

@ -23,74 +23,6 @@
],
"note": ""
},
{
"warning_type": "Dynamic Render Path",
"warning_code": 15,
"fingerprint": "42595161ffdc9ce9a10c4ba2a75fd2bb668e273bc4e683880b0ea906d0bd28f8",
"check_name": "Render",
"message": "Render path contains parameter value",
"file": "app/views/accounts/show.html.erb",
"line": 8,
"link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
"code": "render(action => permitted_accountable_partial(Current.family.accounts.find(params[:id]), \"header\"), { :account => Current.family.accounts.find(params[:id]) })",
"render_path": [
{
"type": "controller",
"class": "AccountsController",
"method": "show",
"line": 36,
"file": "app/controllers/accounts_controller.rb",
"rendered": {
"name": "accounts/show",
"file": "app/views/accounts/show.html.erb"
}
}
],
"location": {
"type": "template",
"template": "accounts/show"
},
"user_input": "params[:id]",
"confidence": "Weak",
"cwe_id": [
22
],
"note": ""
},
{
"warning_type": "Dynamic Render Path",
"warning_code": 15,
"fingerprint": "a35b18785608dbdf35607501363573576ed8c304039f8387997acd1408ca1025",
"check_name": "Render",
"message": "Render path contains parameter value",
"file": "app/views/accounts/show.html.erb",
"line": 35,
"link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
"code": "render(action => permitted_accountable_partial(Current.family.accounts.find(params[:id]), \"tooltip\"), { :account => Current.family.accounts.find(params[:id]) })",
"render_path": [
{
"type": "controller",
"class": "AccountsController",
"method": "show",
"line": 36,
"file": "app/controllers/accounts_controller.rb",
"rendered": {
"name": "accounts/show",
"file": "app/views/accounts/show.html.erb"
}
}
],
"location": {
"type": "template",
"template": "accounts/show"
},
"user_input": "params[:id]",
"confidence": "Weak",
"cwe_id": [
22
],
"note": ""
},
{
"warning_type": "Mass Assignment",
"warning_code": 105,
@ -98,7 +30,7 @@
"check_name": "PermitAttributes",
"message": "Potentially dangerous key allowed for mass assignment",
"file": "app/controllers/invitations_controller.rb",
"line": 34,
"line": 40,
"link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/",
"code": "params.require(:invitation).permit(:email, :role)",
"render_path": null,
@ -129,7 +61,7 @@
"type": "controller",
"class": "PagesController",
"method": "changelog",
"line": 36,
"line": 35,
"file": "app/controllers/pages_controller.rb",
"rendered": {
"name": "pages/changelog",
@ -148,40 +80,6 @@
],
"note": ""
},
{
"warning_type": "Dynamic Render Path",
"warning_code": 15,
"fingerprint": "c5c512a13c34c9696024bd4e2367a657a5c140b5b6a0f5c352e9b69965f63e1b",
"check_name": "Render",
"message": "Render path contains parameter value",
"file": "app/views/accounts/show.html.erb",
"line": 63,
"link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
"code": "render(action => permitted_accountable_partial(Current.family.accounts.find(params[:id]), \"tabs\"), { :account => Current.family.accounts.find(params[:id]), :selected_tab => params[:tab] })",
"render_path": [
{
"type": "controller",
"class": "AccountsController",
"method": "show",
"line": 36,
"file": "app/controllers/accounts_controller.rb",
"rendered": {
"name": "accounts/show",
"file": "app/views/accounts/show.html.erb"
}
}
],
"location": {
"type": "template",
"template": "accounts/show"
},
"user_input": "params[:id]",
"confidence": "Weak",
"cwe_id": [
22
],
"note": ""
},
{
"warning_type": "Dynamic Render Path",
"warning_code": 15,
@ -217,6 +115,6 @@
"note": ""
}
],
"updated": "2024-11-01 09:36:40 -0500",
"updated": "2024-11-02 15:02:28 -0400",
"brakeman_version": "6.2.2"
}

View file

@ -12,6 +12,7 @@ search:
- app/
relative_roots:
- app/controllers
- app/controllers/concerns
- app/helpers
- app/mailers
- app/presenters
@ -25,6 +26,8 @@ search:
- app/assets/fonts
- app/assets/videos
- app/assets/builds
ignore_missing:
- 'accountable_resource.{create,update,destroy}.success'
ignore_unused:
- 'activerecord.attributes.*' # i18n-tasks does not detect these on forms, forms validations (https://github.com/glebm/i18n-tasks/blob/0b4b483c82664f26c5696fb0f6aa1297356e4683/templates/config/i18n-tasks.yml#L146)
- 'activerecord.models.*' # i18n-tasks does not detect use in dynamic model names (e.g. object.model_name.human)
@ -40,4 +43,5 @@ ignore_unused:
- 'number.*'
- 'errors.*'
- 'helpers.*'
- 'support.*'
- 'support.*'
- '{credit_cards,cryptos,depositories,other_assets,other_liabilities,loans,vehicles,properties,investments}.{create,update,destroy}.success'

View file

@ -7,6 +7,17 @@ en:
empty:
description: Try adding an entry, editing filters or refining your search
title: No entries found
index:
amount: Amount
balance: Balance
date: Date
entries: entries
entry: entry
new: New
new_balance: New balance
new_transaction: New transaction
no_entries: No entries yet
title: Activity
loading:
loading: Loading entries...
update:

View file

@ -35,9 +35,5 @@ en:
overview: Overview
settings: Settings
tags_label: Tags
transaction:
remove_transfer: Remove transfer
remove_transfer_body: This will remove the transfer from this transaction
remove_transfer_confirm: Confirm
update:
success: Transaction updated successfully.

View file

@ -18,8 +18,21 @@ en:
transfer: Transfer
new:
title: New transfer
transfer:
remove_body: This will NOT delete the underlying transactions. It will just
remove the transfer.
remove_confirm: Confirm
remove_title: Remove transfer?
show:
delete: Delete
delete_subtitle: This permanently deletes both of the transactions related
to the transfer. This cannot be undone.
delete_title: Delete transfer?
details: Details
exclude_subtitle: This excludes the transfer from any in-app features or analytics.
exclude_title: Exclude transfer
note_label: Notes
note_placeholder: Add a note to this transfer
overview: Overview
settings: Settings
transfer_toggle:
remove_transfer: Remove transfer
remove_transfer_body: This will remove the transfer from this transaction
remove_transfer_confirm: Confirm
update:
success: Transfer updated

View file

@ -5,7 +5,8 @@ en:
create:
success: Valuation created successfully.
form:
cancel: Cancel
amount: Amount
submit: Add balance update
index:
change: change
date: date
@ -13,15 +14,19 @@ en:
no_valuations: No valuations for this account yet
valuations: Value
value: value
valuation:
confirm_accept: Delete entry
confirm_body_html: "<p>Deleting this entry will remove it from the accounts
history which will impact different parts of your account. This includes
the net worth and account graphs.</p></br><p>The only way youll be able
to add this entry back is by re-entering it manually via a new entry.</p>"
confirm_title: Delete Entry?
delete_entry: Delete entry
edit_entry: Edit entry
no_change: No change
start_balance: Starting balance
value_update: Value update
new:
title: New balance
show:
amount: Amount
balance: Balance
date_label: Date
delete: Delete
delete_subtitle: This action cannot be undone
delete_title: Delete Entry
details: Details
name_label: Name
name_placeholder: Enter a name for this entry
note_label: Notes
note_placeholder: Add any additional details about this entry
overview: Overview
settings: Settings

View file

@ -6,165 +6,64 @@ en:
troubleshoot: Troubleshoot
account_list:
new_account: New %{type}
accountables:
credit_card:
form:
annual_fee: Annual fee
annual_fee_placeholder: '99'
apr: APR
apr_placeholder: '15.99'
available_credit: Available credit
available_credit_placeholder: '10000'
expiration_date: Expiration date
minimum_payment: Minimum payment
minimum_payment_placeholder: '100'
overview:
amount_owed: Amount Owed
annual_fee: Annual Fee
apr: APR
available_credit: Available Credit
expiration_date: Expiration Date
minimum_payment: Minimum Payment
unknown: Unknown
depository:
form:
none: None
prompt: Select a subtype
investment:
form:
none: None
prompt: Select a subtype
tooltip:
cash: Cash
holdings: Holdings
total_value_tooltip: The total value is the sum of cash balance and your
holdings value, minus margin loans.
loan:
form:
interest_rate: Interest rate
interest_rate_placeholder: '5.25'
rate_type: Rate type
term_months: Term (months)
term_months_placeholder: '360'
overview:
interest_rate: Interest Rate
monthly_payment: Monthly Payment
not_applicable: N/A
original_principal: Original Principal
remaining_principal: Remaining Principal
term: Term
type: Type
unknown: Unknown
property:
form:
additional_info: Additional info
area_unit: Area unit
area_value: Area value
city: City
country: Country
line1: Address line 1
line2: Address line 2
optional: optional
postal_code: Postal code
state: State
year_built: Year built
overview:
living_area: Living Area
market_value: Market Value
purchase_price: Purchase Price
trend: Trend
unknown: Unknown
year_built: Year Built
vehicle:
form:
make: Make
make_placeholder: Toyota
mileage: Mileage
mileage_placeholder: '15000'
mileage_unit: Unit
model: Model
model_placeholder: Camry
year: Year
year_placeholder: '2023'
overview:
current_price: Current Price
make_model: Make & Model
mileage: Mileage
purchase_price: Purchase Price
trend: Trend
unknown: Unknown
year: Year
create:
success: New account created successfully
destroy:
success: Account deleted successfully
edit:
edit: Edit %{account}
empty:
empty_message: Add an account either via connection, importing or entering manually.
new_account: New account
no_accounts: No accounts yet
form:
accountable_type: Account type
balance: Today's balance
balance: Current balance
institution: Financial institution
mode: Value tracking mode
mode_prompt: Select a mode
name_label: Account name
name_placeholder: Example account name
type_prompt: Select a type
ungrouped: "(none)"
header:
accounts: Accounts
manage: Manage accounts
new: New account
index:
accounts: Accounts
add_institution: Add institution
institution_accounts:
add_account_to_institution: Add new account
confirm_accept: Delete institution
confirm_body: Don't worry, none of the accounts within this institution will
be affected by this deletion. Accounts will be ungrouped and all historical
data will remain intact.
confirm_title: Delete financial institution?
delete: Delete institution
edit: Edit institution
has_issues: Issue detected, see accounts
new_account: Add account
status: Last synced %{last_synced_at} ago
status_never: Requires data sync
syncing: Syncing...
institutionless_accounts:
other_accounts: Other accounts
new_account: New account
institution_accounts:
add_account_to_institution: Add new account
confirm_accept: Delete institution
confirm_body: Don't worry, none of the accounts within this institution will
be affected by this deletion. Accounts will be ungrouped and all historical
data will remain intact.
confirm_title: Delete financial institution?
delete: Delete institution
edit: Edit institution
has_issues: Issue detected, see accounts
new_account: Add account
status: Last synced %{last_synced_at} ago
status_never: Requires data sync
syncing: Syncing...
institutionless_accounts:
other_accounts: Other accounts
menu:
confirm_accept: Delete "%{name}"
confirm_body_html: "<p>By deleting this account, you will erase its value history,
affecting various aspects of your overall account. This action will have a
direct impact on your net worth calculations and the account graphs.</p><br
/> <p>After deletion, there is no way you'll be able to restore the account
information because you'll need to add it as a new account.</p>"
confirm_title: Delete account?
edit: Edit
import: Import transactions
new:
connected_entry: Securely link account with Plaid (coming soon)
csv_entry: Import accounts CSV
manual_entry: Enter account manually
title: Add an account
new:
method_selector:
connected_entry: Link account (coming soon)
manual_entry: Enter account balance
title: How would you like to add it?
import_accounts: Import accounts
title: What would you like to add?
show:
cash: Cash
holdings: Holdings
no_change: No change
overview: Overview
total_owed: Total Owed
total_value: Total Value
trades: Transactions
transactions: Transactions
value: Value
chart:
balance: Balance
no_change: no change
owed: Amount owed
menu:
confirm_accept: Delete "%{name}"
confirm_body_html: "<p>By deleting this account, you will erase its value
history, affecting various aspects of your overall account. This action
will have a direct impact on your net worth calculations and the account
graphs.</p><br /> <p>After deletion, there is no way you'll be able to restore
the account information because you'll need to add it as a new account.</p>"
confirm_title: Delete account?
edit: Edit
import: Import transactions
summary:
new: New
header:
accounts: Accounts
manage: Manage accounts
new: New account
new: New account
no_assets: No assets found
no_assets_description: Add an asset either via connection, importing or entering
manually.
@ -174,16 +73,4 @@ en:
sync_all:
success: Successfully queued accounts for syncing.
sync_all_button:
sync: Sync all
update:
success: Account updated
credit_cards:
create:
success: Credit card created successfully
update:
success: Credit card updated successfully
loans:
create:
success: Loan created successfully
update:
success: Loan updated successfully
sync: Sync all

View file

@ -0,0 +1,31 @@
---
en:
credit_cards:
create:
success: Credit card account created
edit:
edit: Edit %{account}
destroy:
success: Credit card account deleted
form:
annual_fee: Annual fee
annual_fee_placeholder: '99'
apr: APR
apr_placeholder: '15.99'
available_credit: Available credit
available_credit_placeholder: '10000'
expiration_date: Expiration date
minimum_payment: Minimum payment
minimum_payment_placeholder: '100'
new:
title: Enter credit card details
overview:
amount_owed: Amount Owed
annual_fee: Annual Fee
apr: APR
available_credit: Available Credit
expiration_date: Expiration Date
minimum_payment: Minimum Payment
unknown: Unknown
update:
success: Credit card account updated

View file

@ -0,0 +1,13 @@
---
en:
cryptos:
create:
success: Crypto account created
edit:
edit: Edit %{account}
new:
title: Enter account balance
update:
success: Crypto account updated
destroy:
success: Crypto account deleted

View file

@ -0,0 +1,16 @@
---
en:
depositories:
create:
success: Depository account created
edit:
edit: Edit %{account}
form:
none: None
subtype_prompt: Select account type
new:
title: Enter account balance
update:
success: Depository account updated
destroy:
success: Depository account deleted

View file

@ -0,0 +1,23 @@
---
en:
investments:
create:
success: Investment account created
edit:
edit: Edit %{account}
form:
none: None
subtype_prompt: Select investment type
new:
title: Enter account balance
show:
chart_title: Total value
update:
success: Investment account updated
destroy:
success: Investment account deleted
value_tooltip:
cash: Cash
holdings: Holdings
total_value_tooltip: The total value is the sum of cash balance and your holdings
value, minus margin loans.

View file

@ -0,0 +1,28 @@
---
en:
loans:
create:
success: Loan account created
edit:
edit: Edit %{account}
destroy:
success: Loan account deleted
form:
interest_rate: Interest rate
interest_rate_placeholder: '5.25'
rate_type: Rate type
term_months: Term (months)
term_months_placeholder: '360'
new:
title: Enter loan details
overview:
interest_rate: Interest Rate
monthly_payment: Monthly Payment
not_applicable: N/A
original_principal: Original Principal
remaining_principal: Remaining Principal
term: Term
type: Type
unknown: Unknown
update:
success: Loan account updated

View file

@ -0,0 +1,13 @@
---
en:
other_assets:
create:
success: Other asset account created
edit:
edit: Edit %{account}
destroy:
success: Other asset account deleted
new:
title: Enter asset details
update:
success: Other asset account updated

View file

@ -0,0 +1,13 @@
---
en:
other_liabilities:
create:
success: Other liability account created
edit:
edit: Edit %{account}
destroy:
success: Other liability account deleted
new:
title: Enter liability details
update:
success: Other liability account updated

View file

@ -2,6 +2,37 @@
en:
properties:
create:
success: Property created successfully
success: Property account created
edit:
edit: Edit %{account}
destroy:
success: Property account deleted
form:
address_line1: Street address
address_line1_placeholder: 123 Main St
area: Living area
area_placeholder: '2000'
area_unit: Unit of measurement
country: Country
country_placeholder: US
locality: City
locality_placeholder: San Francisco
none: None
postal_code: ZIP/Postal code
postal_code_placeholder: '94105'
region: State/Province
region_placeholder: CA
subtype_prompt: Select property type
year_built: Year built
year_built_placeholder: '2000'
new:
title: Enter property details
overview:
living_area: Living Area
market_value: Market Value
purchase_price: Purchase Price
trend: Trend
unknown: Unknown
year_built: Year Built
update:
success: Property updated successfully
success: Property account updated

View file

@ -40,6 +40,7 @@ en:
import: Import
index:
transaction: transaction
transactions: transactions
mark_transfers:
success: Marked as transfer
new:

View file

@ -2,6 +2,30 @@
en:
vehicles:
create:
success: Vehicle created successfully
success: Vehicle account created
edit:
edit: Edit %{account}
destroy:
success: Vehicle account deleted
form:
make: Make
make_placeholder: Toyota
mileage: Mileage
mileage_placeholder: '15000'
mileage_unit: Unit
model: Model
model_placeholder: Camry
year: Year
year_placeholder: '2023'
new:
title: Enter vehicle details
overview:
current_price: Current Price
make_model: Make & Model
mileage: Mileage
purchase_price: Purchase Price
trend: Trend
unknown: Unknown
year: Year
update:
success: Vehicle updated successfully
success: Vehicle account updated

View file

@ -45,7 +45,7 @@ Rails.application.routes.draw do
resources :merchants, only: %i[index new create edit update destroy]
namespace :account do
resources :transfers, only: %i[new create destroy]
resources :transfers, only: %i[new create destroy show update]
end
resources :imports, only: %i[index new show create destroy] do
@ -60,7 +60,7 @@ Rails.application.routes.draw do
resources :mappings, only: :update, module: :import
end
resources :accounts do
resources :accounts, only: %i[index new] do
collection do
get :summary
get :list
@ -81,14 +81,28 @@ Rails.application.routes.draw do
get :securities, on: :collection
end
resources :entries, only: %i[edit update show destroy]
resources :entries, only: %i[index edit update show destroy]
end
end
resources :properties, only: %i[create update]
resources :vehicles, only: %i[create update]
resources :credit_cards, only: %i[create update]
resources :loans, only: %i[create update]
# Convenience routes for polymorphic paths
# Example: account_path(Account.new(accountable: Depository.new)) => /depositories/123
direct :account do |model, options|
route_for model.accountable_name, model, options
end
direct :edit_account do |model, options|
route_for "edit_#{model.accountable_name}", model, options
end
resources :depositories, except: :index
resources :investments, except: :index
resources :properties, except: :index
resources :vehicles, except: :index
resources :credit_cards, except: :index
resources :loans, except: :index
resources :cryptos, except: :index
resources :other_assets, except: :index
resources :other_liabilities, except: :index
resources :transactions, only: %i[index new create] do
collection do