Compare commits

..

1 Commits

Author SHA1 Message Date
dependabot[bot]
f9edf633a1 Bump qs, express and body-parser
Bumps [qs](https://github.com/ljharb/qs), [express](https://github.com/expressjs/express) and [body-parser](https://github.com/expressjs/body-parser). These dependencies needed to be updated together.

Updates `qs` from 6.5.2 to 6.5.3
- [Release notes](https://github.com/ljharb/qs/releases)
- [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ljharb/qs/compare/v6.5.2...v6.5.3)

Updates `express` from 4.17.1 to 4.18.2
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/master/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.17.1...4.18.2)

Updates `body-parser` from 1.18.3 to 1.20.1
- [Release notes](https://github.com/expressjs/body-parser/releases)
- [Changelog](https://github.com/expressjs/body-parser/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/body-parser/compare/1.18.3...1.20.1)

---
updated-dependencies:
- dependency-name: qs
  dependency-type: indirect
- dependency-name: express
  dependency-type: indirect
- dependency-name: body-parser
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-08 03:13:24 +00:00
8 changed files with 441 additions and 360 deletions

709
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -20,7 +20,7 @@
<h5>Current spending</h5> <h5>Current spending</h5>
</div> </div>
<div class="col-4 amount"> <div class="col-4 amount">
<h5>{{expenseAmount | currencyFormat:org.precision:org.currency}}</h5> <h5>{{expenseAmount | currencyFormat:org.precision}}</h5>
</div> </div>
</div> </div>
<div class="row" *ngFor="let expense of expenseAccounts" [routerLink]="'/accounts/'+expense.id+'/transactions'" [ngClass]="{hidden: hiddenExpenses[expense.id]}"> <div class="row" *ngFor="let expense of expenseAccounts" [routerLink]="'/accounts/'+expense.id+'/transactions'" [ngClass]="{hidden: hiddenExpenses[expense.id]}">
@@ -28,7 +28,7 @@
{{expense.fullName | accountName:2}} {{expense.fullName | accountName:2}}
</div> </div>
<div class="col-4 amount"> <div class="col-4 amount">
{{expense.nativeBalanceCost | currencyFormat:org.precision:org.currency}} {{expense.nativeBalanceCost | currencyFormat:org.precision}}
</div> </div>
</div> </div>
<div class="row"> <div class="row">
@@ -59,11 +59,10 @@
{{recentTx.tx.date | datetz:"M/D":org.timezone}} {{recentTx.tx.date | datetz:"M/D":org.timezone}}
</div> </div>
<div class="col-5 col-md-6 description"> <div class="col-5 col-md-6 description">
<div class="primary">{{recentTx.tx.description}}</div> {{recentTx.tx.description}}
<div class="additional">{{recentTx.account.fullName}}</div>
</div> </div>
<div class="col-4 col-md-4 amount" [ngClass]="{'negative': recentTx.split.amount > 0}"> <div class="col-4 col-md-4 amount" [ngClass]="{'negative': recentTx.split.amount > 0}">
{{-recentTx.split.amount | currencyFormat:recentTx.account.precision:recentTx.account.currency}} {{-recentTx.split.amount | currencyFormat:recentTx.account.precision}}
</div> </div>
</div> </div>
<div class="row"> <div class="row">

View File

@@ -41,19 +41,6 @@
.expanded .hidden { .expanded .hidden {
display: flex display: flex
} }
.row {
padding-bottom: 1em;
.description {
.primary:empty::after {
content: ".";
visibility: hidden;
}
.additional {
font-size: small;
color: $black;
}
}
}
} }
@media (max-width: 767px) { @media (max-width: 767px) {

View File

@@ -53,7 +53,7 @@
</div> </div>
<div class="form-check"> <div class="form-check">
<input formControlName="createDefaultAccounts" id="createDefaultAccounts3" type="radio" class="form-check-input" value="personal" /> <input formControlName="createDefaultAccounts" id="createDefaultAccounts3" type="radio" class="form-check-input" value="personal" />
<label for="createDefaultAccounts3" class="form-check-label">Personal accounts</label> <label for="createDefaultAccounts2" class="form-check-label">Personal accounts</label>
</div> </div>
</div> </div>
<p *ngIf="error" class="error"> <p *ngIf="error" class="error">
@@ -61,4 +61,4 @@
</p> </p>
<button type="submit" class="btn btn-primary" [disabled]="!form.valid">Submit</button> <button type="submit" class="btn btn-primary" [disabled]="!form.valid">Submit</button>
</form> </form>
</div> </div>

View File

@@ -160,7 +160,7 @@
</div> </div>
<div class="form-check"> <div class="form-check">
<input formControlName="createDefaultAccounts" id="createDefaultAccounts3" type="radio" class="form-check-input" value="personal" /> <input formControlName="createDefaultAccounts" id="createDefaultAccounts3" type="radio" class="form-check-input" value="personal" />
<label for="createDefaultAccounts3" class="form-check-label">Personal accounts</label> <label for="createDefaultAccounts2" class="form-check-label">Personal accounts</label>
</div> </div>
</div> </div>
<p *ngIf="newOrgError" class="error">{{newOrgError.message}}</p> <p *ngIf="newOrgError" class="error">{{newOrgError.message}}</p>

View File

@@ -29,8 +29,8 @@
<h4>Assets</h4> <h4>Assets</h4>
</div> </div>
<div class="col-4 amount"> <div class="col-4 amount">
<h4 *ngIf="priceSource === 'price'">{{+assetAccount.totalNativeBalancePrice | currencyFormat:org.precision:org.currency}}</h4> <h4 *ngIf="priceSource === 'price'">{{+assetAccount.totalNativeBalancePrice | currencyFormat:org.precision}}</h4>
<h4 *ngIf="priceSource === 'cost'">{{+assetAccount.totalNativeBalanceCost | currencyFormat:org.precision:org.currency}}</h4> <h4 *ngIf="priceSource === 'cost'">{{+assetAccount.totalNativeBalanceCost | currencyFormat:org.precision}}</h4>
</div> </div>
</div> </div>
<div class="row" *ngFor="let account of assetAccounts" [attr.depth]="account.depth"> <div class="row" *ngFor="let account of assetAccounts" [attr.depth]="account.depth">
@@ -39,10 +39,10 @@
<span *ngIf="!account.children.length"><a [routerLink]="'/accounts/' + account.id + '/transactions'">{{account.name | slice:0:30}}</a></span> <span *ngIf="!account.children.length"><a [routerLink]="'/accounts/' + account.id + '/transactions'">{{account.name | slice:0:30}}</a></span>
</div> </div>
<div class="col-4 amount" *ngIf="priceSource === 'price' && account.totalNativeBalancePrice"> <div class="col-4 amount" *ngIf="priceSource === 'price' && account.totalNativeBalancePrice">
{{+account.totalNativeBalancePrice | currencyFormat:org.precision:org.currency}} {{+account.totalNativeBalancePrice | currencyFormat:org.precision}}
</div> </div>
<div class="col-4 amount" *ngIf="priceSource === 'cost' && account.totalNativeBalanceCost"> <div class="col-4 amount" *ngIf="priceSource === 'cost' && account.totalNativeBalanceCost">
{{+account.totalNativeBalanceCost | currencyFormat:org.precision:org.currency}} {{+account.totalNativeBalanceCost | currencyFormat:org.precision}}
</div> </div>
</div> </div>
<div class="row"> <div class="row">
@@ -55,8 +55,8 @@
<h4>Liabilities</h4> <h4>Liabilities</h4>
</div> </div>
<div class="col-4 amount"> <div class="col-4 amount">
<h4 *ngIf="priceSource === 'price'">{{-liabilityAccount.totalNativeBalancePrice | currencyFormat:org.precision:org.currency}}</h4> <h4 *ngIf="priceSource === 'price'">{{-liabilityAccount.totalNativeBalancePrice | currencyFormat:org.precision}}</h4>
<h4 *ngIf="priceSource === 'cost'">{{-liabilityAccount.totalNativeBalanceCost | currencyFormat:org.precision:org.currency}}</h4> <h4 *ngIf="priceSource === 'cost'">{{-liabilityAccount.totalNativeBalanceCost | currencyFormat:org.precision}}</h4>
</div> </div>
</div> </div>
<div class="row" *ngFor="let account of liabilityAccounts" [attr.depth]="account.depth"> <div class="row" *ngFor="let account of liabilityAccounts" [attr.depth]="account.depth">
@@ -65,10 +65,10 @@
<span *ngIf="!account.children.length"><a [routerLink]="'/accounts/' + account.id + '/transactions'">{{account.name | slice:0:30}}</a></span> <span *ngIf="!account.children.length"><a [routerLink]="'/accounts/' + account.id + '/transactions'">{{account.name | slice:0:30}}</a></span>
</div> </div>
<div class="col-4 amount" *ngIf="priceSource === 'price' && account.totalNativeBalancePrice"> <div class="col-4 amount" *ngIf="priceSource === 'price' && account.totalNativeBalancePrice">
{{-account.totalNativeBalancePrice | currencyFormat:org.precision:org.currency}} {{-account.totalNativeBalancePrice | currencyFormat:org.precision}}
</div> </div>
<div class="col-4 amount" *ngIf="priceSource === 'cost' && account.totalNativeBalanceCost"> <div class="col-4 amount" *ngIf="priceSource === 'cost' && account.totalNativeBalanceCost">
{{-account.totalNativeBalanceCost | currencyFormat:org.precision:org.currency}} {{-account.totalNativeBalanceCost | currencyFormat:org.precision}}
</div> </div>
</div> </div>
<div class="row" depth="1"> <div class="row" depth="1">
@@ -76,8 +76,8 @@
<h4>Equity</h4> <h4>Equity</h4>
</div> </div>
<div class="col-4 amount"> <div class="col-4 amount">
<h4 *ngIf="priceSource === 'price'">{{-equityAccount.totalNativeBalancePrice | currencyFormat:org.precision:org.currency}}</h4> <h4 *ngIf="priceSource === 'price'">{{-equityAccount.totalNativeBalancePrice | currencyFormat:org.precision}}</h4>
<h4 *ngIf="priceSource === 'cost'">{{-equityAccount.totalNativeBalanceCost | currencyFormat:org.precision:org.currency}}</h4> <h4 *ngIf="priceSource === 'cost'">{{-equityAccount.totalNativeBalanceCost | currencyFormat:org.precision}}</h4>
</div> </div>
</div> </div>
<div class="row" *ngFor="let account of equityAccounts" [attr.depth]="account.depth"> <div class="row" *ngFor="let account of equityAccounts" [attr.depth]="account.depth">
@@ -86,10 +86,10 @@
<span *ngIf="!account.children.length"><a [routerLink]="'/accounts/' + account.id + '/transactions'">{{account.name | slice:0:30}}</a></span> <span *ngIf="!account.children.length"><a [routerLink]="'/accounts/' + account.id + '/transactions'">{{account.name | slice:0:30}}</a></span>
</div> </div>
<div class="col-4 amount" *ngIf="priceSource === 'price' && account.totalNativeBalancePrice"> <div class="col-4 amount" *ngIf="priceSource === 'price' && account.totalNativeBalancePrice">
{{-account.totalNativeBalancePrice | currencyFormat:org.precision:org.currency}} {{-account.totalNativeBalancePrice | currencyFormat:org.precision}}
</div> </div>
<div class="col-4 amount" *ngIf="priceSource === 'cost' && account.totalNativeBalanceCost"> <div class="col-4 amount" *ngIf="priceSource === 'cost' && account.totalNativeBalanceCost">
{{-account.totalNativeBalanceCost | currencyFormat:org.precision:org.currency}} {{-account.totalNativeBalanceCost | currencyFormat:org.precision}}
</div> </div>
</div> </div>
</div> </div>

View File

@@ -24,7 +24,7 @@
<h4>Income</h4> <h4>Income</h4>
</div> </div>
<div class="col-4 amount"> <div class="col-4 amount">
<h4>{{-incomeAccount.totalNativeBalanceCost | currencyFormat:org.precision:org.currency}}</h4> <h4>{{-incomeAccount.totalNativeBalanceCost | currencyFormat:org.precision}}</h4>
</div> </div>
</div> </div>
<div class="row" *ngFor="let account of incomeAccounts" [attr.depth]="account.depth"> <div class="row" *ngFor="let account of incomeAccounts" [attr.depth]="account.depth">
@@ -33,7 +33,7 @@
<span *ngIf="!account.children.length"><a [routerLink]="'/accounts/' + account.id + '/transactions'">{{account.name | slice:0:30}}</a></span> <span *ngIf="!account.children.length"><a [routerLink]="'/accounts/' + account.id + '/transactions'">{{account.name | slice:0:30}}</a></span>
</div> </div>
<div class="col-4 amount" *ngIf="account.totalNativeBalanceCost"> <div class="col-4 amount" *ngIf="account.totalNativeBalanceCost">
{{-account.totalNativeBalanceCost | currencyFormat:org.precision:org.currency}} {{-account.totalNativeBalanceCost | currencyFormat:org.precision}}
</div> </div>
</div> </div>
<div class="row" depth="1"> <div class="row" depth="1">
@@ -41,7 +41,7 @@
<h4>Expenses</h4> <h4>Expenses</h4>
</div> </div>
<div class="col-4 amount"> <div class="col-4 amount">
<h4>{{expenseAccount.totalNativeBalanceCost | currencyFormat:org.precision:org.currency}}</h4> <h4>{{expenseAccount.totalNativeBalanceCost | currencyFormat:org.precision}}</h4>
</div> </div>
</div> </div>
<div class="row" *ngFor="let account of expenseAccounts" [attr.depth]="account.depth"> <div class="row" *ngFor="let account of expenseAccounts" [attr.depth]="account.depth">
@@ -50,7 +50,7 @@
<span *ngIf="!account.children.length"><a [routerLink]="'/accounts/' + account.id + '/transactions'">{{account.name | slice:0:30}}</a></span> <span *ngIf="!account.children.length"><a [routerLink]="'/accounts/' + account.id + '/transactions'">{{account.name | slice:0:30}}</a></span>
</div> </div>
<div class="col-4 amount" *ngIf="account.totalNativeBalanceCost"> <div class="col-4 amount" *ngIf="account.totalNativeBalanceCost">
{{account.totalNativeBalanceCost | currencyFormat:org.precision:org.currency}} {{account.totalNativeBalanceCost | currencyFormat:org.precision}}
</div> </div>
</div> </div>
<div class="row" depth="1"> <div class="row" depth="1">
@@ -58,7 +58,7 @@
<h4>Net Income</h4> <h4>Net Income</h4>
</div> </div>
<div class="col-4 amount"> <div class="col-4 amount">
<h4>{{-incomeAccount.totalNativeBalanceCost - expenseAccount.totalNativeBalanceCost | currencyFormat:org.precision:org.currency}}</h4> <h4>{{-incomeAccount.totalNativeBalanceCost - expenseAccount.totalNativeBalanceCost | currencyFormat:org.precision}}</h4>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -1,16 +1,7 @@
import { Pipe, PipeTransform } from '@angular/core'; import { Pipe, PipeTransform } from '@angular/core';
import { DecimalPipe } from '@angular/common'; import { DecimalPipe } from '@angular/common';
// Format the currency according to the user's browser locale. @Pipe({name: 'currencyFormat'})
//
// Some currencies share the same symbol (e.g. $ is used for USD and CAN).
// Ideally, the user experience should not be confusing if different accounts
// have conflicting symbols. One solution might be to always show the ISO
// currency code for accounts with mixes currencies. Another solution would be
// to let the user configure how the currency is displayed on a per-currency
// or per-account basis.
@Pipe({ name: 'currencyFormat' })
export class CurrencyFormatPipe implements PipeTransform { export class CurrencyFormatPipe implements PipeTransform {
constructor(private decimalPipe: DecimalPipe) { constructor(private decimalPipe: DecimalPipe) {
} }
@@ -20,12 +11,17 @@ export class CurrencyFormatPipe implements PipeTransform {
return ''; return '';
} }
// note: we can drop the cast to any if we change the ts target from es5 to es2020 or newer. let prefix = amount < 0 ? '-' : '';
return Intl.NumberFormat(navigator.language, {
style: "currency", if(currency === 'USD') {
currency, prefix += '$';
minimumFractionDigits: precision, }
signDisplay: "negative",
} as any).format(amount / Math.pow(10, precision)); let minDigits = Math.min(2, precision);
return prefix +
this.decimalPipe.transform(
Math.abs(amount) / Math.pow(10, precision),
'1.' + minDigits + '-' + precision);
} }
} }