Browse Source

Merge branch 'main' into feature/migrate-ui-components-to-control-flow

pull/3324/head
Thomas Kaul 1 year ago
committed by GitHub
parent
commit
57666f1b49
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 1
      CHANGELOG.md
  2. 29
      apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
  3. 6
      apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
  4. 8
      apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts
  5. 6
      apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts
  6. 2
      apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
  7. 18
      apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts
  8. 2
      apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html
  9. 6
      apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts
  10. 314
      apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts
  11. 69
      apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
  12. 10
      apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
  13. 2
      apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
  14. 5
      libs/ui/src/lib/fire-calculator/fire-calculator.component.html
  15. 4
      package.json
  16. 90
      yarn.lock

1
CHANGELOG.md

@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed ### Changed
- Migrated the `@ghostfolio/ui` components to control flow - Migrated the `@ghostfolio/ui` components to control flow
- Upgraded `prisma` from version `5.12.1` to `5.13.0`
## 2.76.0 - 2024-04-23 ## 2.76.0 - 2024-04-23

29
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts

@ -265,22 +265,22 @@ export class AssetProfileDialog implements OnDestroy, OnInit {
let symbolMapping = {}; let symbolMapping = {};
try { try {
countries = JSON.parse(this.assetProfileForm.controls['countries'].value); countries = JSON.parse(this.assetProfileForm.get('countries').value);
} catch {} } catch {}
try { try {
scraperConfiguration = JSON.parse( scraperConfiguration = JSON.parse(
this.assetProfileForm.controls['scraperConfiguration'].value this.assetProfileForm.get('scraperConfiguration').value
); );
} catch {} } catch {}
try { try {
sectors = JSON.parse(this.assetProfileForm.controls['sectors'].value); sectors = JSON.parse(this.assetProfileForm.get('sectors').value);
} catch {} } catch {}
try { try {
symbolMapping = JSON.parse( symbolMapping = JSON.parse(
this.assetProfileForm.controls['symbolMapping'].value this.assetProfileForm.get('symbolMapping').value
); );
} catch {} } catch {}
@ -289,14 +289,14 @@ export class AssetProfileDialog implements OnDestroy, OnInit {
scraperConfiguration, scraperConfiguration,
sectors, sectors,
symbolMapping, symbolMapping,
assetClass: this.assetProfileForm.controls['assetClass'].value, assetClass: this.assetProfileForm.get('assetClass').value,
assetSubClass: this.assetProfileForm.controls['assetSubClass'].value, assetSubClass: this.assetProfileForm.get('assetSubClass').value,
comment: this.assetProfileForm.controls['comment'].value ?? null, comment: this.assetProfileForm.get('comment').value ?? null,
currency: (<Currency>( currency: (<Currency>(
(<unknown>this.assetProfileForm.controls['currency'].value) (<unknown>this.assetProfileForm.get('currency').value)
))?.value, ))?.value,
name: this.assetProfileForm.controls['name'].value, name: this.assetProfileForm.get('name').value,
url: this.assetProfileForm.controls['url'].value url: this.assetProfileForm.get('url').value
}; };
this.adminService this.adminService
@ -314,8 +314,8 @@ export class AssetProfileDialog implements OnDestroy, OnInit {
this.adminService this.adminService
.testMarketData({ .testMarketData({
dataSource: this.data.dataSource, dataSource: this.data.dataSource,
scraperConfiguration: scraperConfiguration: this.assetProfileForm.get('scraperConfiguration')
this.assetProfileForm.controls['scraperConfiguration'].value, .value,
symbol: this.data.symbol symbol: this.data.symbol
}) })
.pipe( .pipe(
@ -331,9 +331,8 @@ export class AssetProfileDialog implements OnDestroy, OnInit {
' ' + ' ' +
price + price +
' ' + ' ' +
(<Currency>( (<Currency>(<unknown>this.assetProfileForm.get('currency').value))
(<unknown>this.assetProfileForm.controls['currency'].value) ?.value
))?.value
); );
}); });
} }

6
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html

@ -302,7 +302,7 @@
mat-flat-button mat-flat-button
type="button" type="button"
[disabled]=" [disabled]="
assetProfileForm.controls['scraperConfiguration'].value === '{}' assetProfileForm.get('scraperConfiguration').value === '{}'
" "
(click)="onTestMarketData()" (click)="onTestMarketData()"
> >
@ -338,11 +338,11 @@
<mat-form-field appearance="outline" class="w-100 without-hint"> <mat-form-field appearance="outline" class="w-100 without-hint">
<mat-label i18n>Url</mat-label> <mat-label i18n>Url</mat-label>
<input formControlName="url" matInput type="text" /> <input formControlName="url" matInput type="text" />
@if (assetProfileForm.controls['url'].value) { @if (assetProfileForm.get('url').value) {
<gf-asset-profile-icon <gf-asset-profile-icon
class="mr-3" class="mr-3"
matSuffix matSuffix
[url]="assetProfileForm.controls['url'].value" [url]="assetProfileForm.get('url').value"
/> />
} }
</mat-form-field> </mat-form-field>

8
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts

@ -59,14 +59,12 @@ export class CreateAssetProfileDialog implements OnInit, OnDestroy {
this.mode === 'auto' this.mode === 'auto'
? this.dialogRef.close({ ? this.dialogRef.close({
dataSource: dataSource:
this.createAssetProfileForm.controls['searchSymbol'].value this.createAssetProfileForm.get('searchSymbol').value.dataSource,
.dataSource, symbol: this.createAssetProfileForm.get('searchSymbol').value.symbol
symbol:
this.createAssetProfileForm.controls['searchSymbol'].value.symbol
}) })
: this.dialogRef.close({ : this.dialogRef.close({
dataSource: 'MANUAL', dataSource: 'MANUAL',
symbol: this.createAssetProfileForm.controls['addSymbol'].value symbol: this.createAssetProfileForm.get('addSymbol').value
}); });
} }

6
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts

@ -67,9 +67,9 @@ export class CreateOrUpdateAccessDialog implements OnDestroy {
public onSubmit() { public onSubmit() {
const access: CreateAccessDto = { const access: CreateAccessDto = {
alias: this.accessForm.controls['alias'].value, alias: this.accessForm.get('alias').value,
granteeUserId: this.accessForm.controls['userId'].value, granteeUserId: this.accessForm.get('userId').value,
permissions: [this.accessForm.controls['permissions'].value] permissions: [this.accessForm.get('permissions').value]
}; };
this.dataService this.dataService

2
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html

@ -27,7 +27,7 @@
</mat-form-field> </mat-form-field>
</div> </div>
@if (accessForm.controls['type'].value === 'PRIVATE') { @if (accessForm.get('type').value === 'PRIVATE') {
<div> <div>
<mat-form-field appearance="outline" class="w-100"> <mat-form-field appearance="outline" class="w-100">
<mat-label i18n>Permission</mat-label> <mat-label i18n>Permission</mat-label>

18
apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts

@ -82,7 +82,7 @@ export class CreateOrUpdateAccountDialog implements OnDestroy {
} }
public autoCompleteCheck() { public autoCompleteCheck() {
const inputValue = this.accountForm.controls['platformId'].value; const inputValue = this.accountForm.get('platformId').value;
if (typeof inputValue === 'string') { if (typeof inputValue === 'string') {
const matchingEntry = this.platforms.find(({ name }) => { const matchingEntry = this.platforms.find(({ name }) => {
@ -90,7 +90,7 @@ export class CreateOrUpdateAccountDialog implements OnDestroy {
}); });
if (matchingEntry) { if (matchingEntry) {
this.accountForm.controls['platformId'].setValue(matchingEntry); this.accountForm.get('platformId').setValue(matchingEntry);
} }
} }
} }
@ -105,13 +105,13 @@ export class CreateOrUpdateAccountDialog implements OnDestroy {
public async onSubmit() { public async onSubmit() {
const account: CreateAccountDto | UpdateAccountDto = { const account: CreateAccountDto | UpdateAccountDto = {
balance: this.accountForm.controls['balance'].value, balance: this.accountForm.get('balance').value,
comment: this.accountForm.controls['comment'].value, comment: this.accountForm.get('comment').value,
currency: this.accountForm.controls['currency'].value?.value, currency: this.accountForm.get('currency').value?.value,
id: this.accountForm.controls['accountId'].value, id: this.accountForm.get('accountId').value,
isExcluded: this.accountForm.controls['isExcluded'].value, isExcluded: this.accountForm.get('isExcluded').value,
name: this.accountForm.controls['name'].value, name: this.accountForm.get('name').value,
platformId: this.accountForm.controls['platformId'].value?.id ?? null platformId: this.accountForm.get('platformId').value?.id ?? null
}; };
try { try {

2
apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html

@ -39,7 +39,7 @@
(keydown.enter)="$event.stopPropagation()" (keydown.enter)="$event.stopPropagation()"
/> />
<span class="ml-2" matTextSuffix>{{ <span class="ml-2" matTextSuffix>{{
accountForm.controls['currency']?.value?.value accountForm.get('currency')?.value?.value
}}</span> }}</span>
</mat-form-field> </mat-form-field>
</div> </div>

6
apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts

@ -66,9 +66,9 @@ export class TransferBalanceDialog implements OnDestroy {
public onSubmit() { public onSubmit() {
const account: TransferBalanceDto = { const account: TransferBalanceDto = {
accountIdFrom: this.transferBalanceForm.controls['fromAccount'].value, accountIdFrom: this.transferBalanceForm.get('fromAccount').value,
accountIdTo: this.transferBalanceForm.controls['toAccount'].value, accountIdTo: this.transferBalanceForm.get('toAccount').value,
balance: this.transferBalanceForm.controls['balance'].value balance: this.transferBalanceForm.get('balance').value
}; };
this.dialogRef.close({ account }); this.dialogRef.close({ account });

314
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts

@ -148,13 +148,14 @@ export class CreateOrUpdateActivityDialog implements OnDestroy {
.subscribe(async () => { .subscribe(async () => {
let exchangeRateOfUnitPrice = 1; let exchangeRateOfUnitPrice = 1;
this.activityForm.controls['feeInCustomCurrency'].setErrors(null); this.activityForm.get('feeInCustomCurrency').setErrors(null);
this.activityForm.controls['unitPriceInCustomCurrency'].setErrors(null); this.activityForm.get('unitPriceInCustomCurrency').setErrors(null);
const currency = this.activityForm.controls['currency'].value; const currency = this.activityForm.get('currency').value;
const currencyOfUnitPrice = const currencyOfUnitPrice = this.activityForm.get(
this.activityForm.controls['currencyOfUnitPrice'].value; 'currencyOfUnitPrice'
const date = this.activityForm.controls['date'].value; ).value;
const date = this.activityForm.get('date').value;
if ( if (
currency && currency &&
@ -174,104 +175,97 @@ export class CreateOrUpdateActivityDialog implements OnDestroy {
exchangeRateOfUnitPrice = marketPrice; exchangeRateOfUnitPrice = marketPrice;
} catch { } catch {
this.activityForm.controls['unitPriceInCustomCurrency'].setErrors({ this.activityForm.get('unitPriceInCustomCurrency').setErrors({
invalid: true invalid: true
}); });
} }
} }
const feeInCustomCurrency = const feeInCustomCurrency =
this.activityForm.controls['feeInCustomCurrency'].value * this.activityForm.get('feeInCustomCurrency').value *
exchangeRateOfUnitPrice; exchangeRateOfUnitPrice;
const unitPriceInCustomCurrency = const unitPriceInCustomCurrency =
this.activityForm.controls['unitPriceInCustomCurrency'].value * this.activityForm.get('unitPriceInCustomCurrency').value *
exchangeRateOfUnitPrice; exchangeRateOfUnitPrice;
this.activityForm.controls['fee'].setValue(feeInCustomCurrency, { this.activityForm.get('fee').setValue(feeInCustomCurrency, {
emitEvent: false emitEvent: false
}); });
this.activityForm.controls['unitPrice'].setValue( this.activityForm.get('unitPrice').setValue(unitPriceInCustomCurrency, {
unitPriceInCustomCurrency, emitEvent: false
{ });
emitEvent: false
}
);
if ( if (
this.activityForm.controls['type'].value === 'BUY' || this.activityForm.get('type').value === 'BUY' ||
this.activityForm.controls['type'].value === 'FEE' || this.activityForm.get('type').value === 'FEE' ||
this.activityForm.controls['type'].value === 'ITEM' this.activityForm.get('type').value === 'ITEM'
) { ) {
this.total = this.total =
this.activityForm.controls['quantity'].value * this.activityForm.get('quantity').value *
this.activityForm.controls['unitPrice'].value + this.activityForm.get('unitPrice').value +
this.activityForm.controls['fee'].value ?? 0; this.activityForm.get('fee').value ?? 0;
} else { } else {
this.total = this.total =
this.activityForm.controls['quantity'].value * this.activityForm.get('quantity').value *
this.activityForm.controls['unitPrice'].value - this.activityForm.get('unitPrice').value -
this.activityForm.controls['fee'].value ?? 0; this.activityForm.get('fee').value ?? 0;
} }
this.changeDetectorRef.markForCheck(); this.changeDetectorRef.markForCheck();
}); });
this.activityForm.controls['accountId'].valueChanges.subscribe( this.activityForm.get('accountId').valueChanges.subscribe((accountId) => {
(accountId) => { const type = this.activityForm.get('type').value;
const type = this.activityForm.controls['type'].value;
if ( if (
type === 'FEE' || type === 'FEE' ||
type === 'INTEREST' || type === 'INTEREST' ||
type === 'ITEM' || type === 'ITEM' ||
type === 'LIABILITY' type === 'LIABILITY'
) { ) {
const currency = const currency =
this.data.accounts.find(({ id }) => { this.data.accounts.find(({ id }) => {
return id === accountId; return id === accountId;
})?.currency ?? this.data.user.settings.baseCurrency; })?.currency ?? this.data.user.settings.baseCurrency;
this.activityForm.controls['currency'].setValue(currency); this.activityForm.get('currency').setValue(currency);
this.activityForm.controls['currencyOfUnitPrice'].setValue(currency); this.activityForm.get('currencyOfUnitPrice').setValue(currency);
if (['FEE', 'INTEREST'].includes(type)) { if (['FEE', 'INTEREST'].includes(type)) {
if (this.activityForm.controls['accountId'].value) { if (this.activityForm.get('accountId').value) {
this.activityForm.controls['updateAccountBalance'].enable(); this.activityForm.get('updateAccountBalance').enable();
} else { } else {
this.activityForm.controls['updateAccountBalance'].disable(); this.activityForm.get('updateAccountBalance').disable();
this.activityForm.controls['updateAccountBalance'].setValue( this.activityForm.get('updateAccountBalance').setValue(false);
false
);
}
} }
} }
} }
); });
this.activityForm.controls['date'].valueChanges.subscribe(() => { this.activityForm.get('date').valueChanges.subscribe(() => {
if (isToday(this.activityForm.controls['date'].value)) { if (isToday(this.activityForm.get('date').value)) {
this.activityForm.controls['updateAccountBalance'].enable(); this.activityForm.get('updateAccountBalance').enable();
} else { } else {
this.activityForm.controls['updateAccountBalance'].disable(); this.activityForm.get('updateAccountBalance').disable();
this.activityForm.controls['updateAccountBalance'].setValue(false); this.activityForm.get('updateAccountBalance').setValue(false);
} }
this.changeDetectorRef.markForCheck(); this.changeDetectorRef.markForCheck();
}); });
this.activityForm.controls['searchSymbol'].valueChanges.subscribe(() => { this.activityForm.get('searchSymbol').valueChanges.subscribe(() => {
if (this.activityForm.controls['searchSymbol'].invalid) { if (this.activityForm.get('searchSymbol').invalid) {
this.data.activity.SymbolProfile = null; this.data.activity.SymbolProfile = null;
} else if ( } else if (
['BUY', 'DIVIDEND', 'SELL'].includes( ['BUY', 'DIVIDEND', 'SELL'].includes(
this.activityForm.controls['type'].value this.activityForm.get('type').value
) )
) { ) {
this.activityForm.controls['dataSource'].setValue( this.activityForm
this.activityForm.controls['searchSymbol'].value.dataSource .get('dataSource')
); .setValue(this.activityForm.get('searchSymbol').value.dataSource);
this.updateSymbol(); this.updateSymbol();
} }
@ -282,130 +276,127 @@ export class CreateOrUpdateActivityDialog implements OnDestroy {
this.filteredTagsObservable = this.activityForm.controls[ this.filteredTagsObservable = this.activityForm.controls[
'tags' 'tags'
].valueChanges.pipe( ].valueChanges.pipe(
startWith(this.activityForm.controls['tags'].value), startWith(this.activityForm.get('tags').value),
map((aTags: Tag[] | null) => { map((aTags: Tag[] | null) => {
return aTags ? this.filterTags(aTags) : this.tags.slice(); return aTags ? this.filterTags(aTags) : this.tags.slice();
}) })
); );
this.activityForm.controls['type'].valueChanges this.activityForm
.pipe(takeUntil(this.unsubscribeSubject)) .get('type')
.valueChanges.pipe(takeUntil(this.unsubscribeSubject))
.subscribe((type: Type) => { .subscribe((type: Type) => {
if (type === 'ITEM') { if (type === 'ITEM') {
this.activityForm.controls['accountId'].removeValidators( this.activityForm
Validators.required .get('accountId')
); .removeValidators(Validators.required);
this.activityForm.controls['accountId'].updateValueAndValidity(); this.activityForm.get('accountId').updateValueAndValidity();
const currency = const currency =
this.data.accounts.find(({ id }) => { this.data.accounts.find(({ id }) => {
return id === this.activityForm.controls['accountId'].value; return id === this.activityForm.get('accountId').value;
})?.currency ?? this.data.user.settings.baseCurrency; })?.currency ?? this.data.user.settings.baseCurrency;
this.activityForm.controls['currency'].setValue(currency); this.activityForm.get('currency').setValue(currency);
this.activityForm.controls['currencyOfUnitPrice'].setValue(currency); this.activityForm.get('currencyOfUnitPrice').setValue(currency);
this.activityForm.controls['dataSource'].removeValidators( this.activityForm
Validators.required .get('dataSource')
); .removeValidators(Validators.required);
this.activityForm.controls['dataSource'].updateValueAndValidity(); this.activityForm.get('dataSource').updateValueAndValidity();
this.activityForm.controls['feeInCustomCurrency'].reset(); this.activityForm.get('feeInCustomCurrency').reset();
this.activityForm.controls['name'].setValidators(Validators.required); this.activityForm.get('name').setValidators(Validators.required);
this.activityForm.controls['name'].updateValueAndValidity(); this.activityForm.get('name').updateValueAndValidity();
this.activityForm.controls['quantity'].setValue(1); this.activityForm.get('quantity').setValue(1);
this.activityForm.controls['searchSymbol'].removeValidators( this.activityForm
Validators.required .get('searchSymbol')
); .removeValidators(Validators.required);
this.activityForm.controls['searchSymbol'].updateValueAndValidity(); this.activityForm.get('searchSymbol').updateValueAndValidity();
this.activityForm.controls['updateAccountBalance'].disable(); this.activityForm.get('updateAccountBalance').disable();
this.activityForm.controls['updateAccountBalance'].setValue(false); this.activityForm.get('updateAccountBalance').setValue(false);
} else if ( } else if (
type === 'FEE' || type === 'FEE' ||
type === 'INTEREST' || type === 'INTEREST' ||
type === 'LIABILITY' type === 'LIABILITY'
) { ) {
this.activityForm.controls['accountId'].removeValidators( this.activityForm
Validators.required .get('accountId')
); .removeValidators(Validators.required);
this.activityForm.controls['accountId'].updateValueAndValidity(); this.activityForm.get('accountId').updateValueAndValidity();
const currency = const currency =
this.data.accounts.find(({ id }) => { this.data.accounts.find(({ id }) => {
return id === this.activityForm.controls['accountId'].value; return id === this.activityForm.get('accountId').value;
})?.currency ?? this.data.user.settings.baseCurrency; })?.currency ?? this.data.user.settings.baseCurrency;
this.activityForm.controls['currency'].setValue(currency); this.activityForm.get('currency').setValue(currency);
this.activityForm.controls['currencyOfUnitPrice'].setValue(currency); this.activityForm.get('currencyOfUnitPrice').setValue(currency);
this.activityForm.controls['dataSource'].removeValidators( this.activityForm
Validators.required .get('dataSource')
); .removeValidators(Validators.required);
this.activityForm.controls['dataSource'].updateValueAndValidity(); this.activityForm.get('dataSource').updateValueAndValidity();
if ( if (
(type === 'FEE' && (type === 'FEE' &&
this.activityForm.controls['feeInCustomCurrency'].value === 0) || this.activityForm.get('feeInCustomCurrency').value === 0) ||
type === 'INTEREST' || type === 'INTEREST' ||
type === 'LIABILITY' type === 'LIABILITY'
) { ) {
this.activityForm.controls['feeInCustomCurrency'].reset(); this.activityForm.get('feeInCustomCurrency').reset();
} }
this.activityForm.controls['name'].setValidators(Validators.required); this.activityForm.get('name').setValidators(Validators.required);
this.activityForm.controls['name'].updateValueAndValidity(); this.activityForm.get('name').updateValueAndValidity();
if (type === 'FEE') { if (type === 'FEE') {
this.activityForm.controls['quantity'].setValue(0); this.activityForm.get('quantity').setValue(0);
} else if (type === 'INTEREST' || type === 'LIABILITY') { } else if (type === 'INTEREST' || type === 'LIABILITY') {
this.activityForm.controls['quantity'].setValue(1); this.activityForm.get('quantity').setValue(1);
} }
this.activityForm.controls['searchSymbol'].removeValidators( this.activityForm
Validators.required .get('searchSymbol')
); .removeValidators(Validators.required);
this.activityForm.controls['searchSymbol'].updateValueAndValidity(); this.activityForm.get('searchSymbol').updateValueAndValidity();
if (type === 'FEE') { if (type === 'FEE') {
this.activityForm.controls['unitPriceInCustomCurrency'].setValue(0); this.activityForm.get('unitPriceInCustomCurrency').setValue(0);
} }
if ( if (
['FEE', 'INTEREST'].includes(type) && ['FEE', 'INTEREST'].includes(type) &&
this.activityForm.controls['accountId'].value this.activityForm.get('accountId').value
) { ) {
this.activityForm.controls['updateAccountBalance'].enable(); this.activityForm.get('updateAccountBalance').enable();
} else { } else {
this.activityForm.controls['updateAccountBalance'].disable(); this.activityForm.get('updateAccountBalance').disable();
this.activityForm.controls['updateAccountBalance'].setValue(false); this.activityForm.get('updateAccountBalance').setValue(false);
} }
} else { } else {
this.activityForm.controls['accountId'].setValidators( this.activityForm.get('accountId').setValidators(Validators.required);
Validators.required this.activityForm.get('accountId').updateValueAndValidity();
); this.activityForm
this.activityForm.controls['accountId'].updateValueAndValidity(); .get('dataSource')
this.activityForm.controls['dataSource'].setValidators( .setValidators(Validators.required);
Validators.required this.activityForm.get('dataSource').updateValueAndValidity();
); this.activityForm.get('name').removeValidators(Validators.required);
this.activityForm.controls['dataSource'].updateValueAndValidity(); this.activityForm.get('name').updateValueAndValidity();
this.activityForm.controls['name'].removeValidators( this.activityForm
Validators.required .get('searchSymbol')
); .setValidators(Validators.required);
this.activityForm.controls['name'].updateValueAndValidity(); this.activityForm.get('searchSymbol').updateValueAndValidity();
this.activityForm.controls['searchSymbol'].setValidators( this.activityForm.get('updateAccountBalance').enable();
Validators.required
);
this.activityForm.controls['searchSymbol'].updateValueAndValidity();
this.activityForm.controls['updateAccountBalance'].enable();
} }
this.changeDetectorRef.markForCheck(); this.changeDetectorRef.markForCheck();
}); });
this.activityForm.controls['type'].setValue(this.data.activity?.type); this.activityForm.get('type').setValue(this.data.activity?.type);
if (this.data.activity?.id) { if (this.data.activity?.id) {
this.activityForm.controls['searchSymbol'].disable(); this.activityForm.get('searchSymbol').disable();
this.activityForm.controls['type'].disable(); this.activityForm.get('type').disable();
} }
if (this.data.activity?.SymbolProfile?.symbol) { if (this.data.activity?.SymbolProfile?.symbol) {
@ -425,14 +416,14 @@ export class CreateOrUpdateActivityDialog implements OnDestroy {
public applyCurrentMarketPrice() { public applyCurrentMarketPrice() {
this.activityForm.patchValue({ this.activityForm.patchValue({
currencyOfUnitPrice: this.activityForm.controls['currency'].value, currencyOfUnitPrice: this.activityForm.get('currency').value,
unitPriceInCustomCurrency: this.currentMarketPrice unitPriceInCustomCurrency: this.currentMarketPrice
}); });
} }
public onAddTag(event: MatAutocompleteSelectedEvent) { public onAddTag(event: MatAutocompleteSelectedEvent) {
this.activityForm.controls['tags'].setValue([ this.activityForm.get('tags').setValue([
...(this.activityForm.controls['tags'].value ?? []), ...(this.activityForm.get('tags').value ?? []),
this.tags.find(({ id }) => { this.tags.find(({ id }) => {
return id === event.option.value; return id === event.option.value;
}) })
@ -445,8 +436,8 @@ export class CreateOrUpdateActivityDialog implements OnDestroy {
} }
public onRemoveTag(aTag: Tag) { public onRemoveTag(aTag: Tag) {
this.activityForm.controls['tags'].setValue( this.activityForm.get('tags').setValue(
this.activityForm.controls['tags'].value.filter(({ id }) => { this.activityForm.get('tags').value.filter(({ id }) => {
return id !== aTag.id; return id !== aTag.id;
}) })
); );
@ -454,25 +445,24 @@ export class CreateOrUpdateActivityDialog implements OnDestroy {
public async onSubmit() { public async onSubmit() {
const activity: CreateOrderDto | UpdateOrderDto = { const activity: CreateOrderDto | UpdateOrderDto = {
accountId: this.activityForm.controls['accountId'].value, accountId: this.activityForm.get('accountId').value,
assetClass: this.activityForm.controls['assetClass'].value, assetClass: this.activityForm.get('assetClass').value,
assetSubClass: this.activityForm.controls['assetSubClass'].value, assetSubClass: this.activityForm.get('assetSubClass').value,
comment: this.activityForm.controls['comment'].value, comment: this.activityForm.get('comment').value,
currency: this.activityForm.controls['currency'].value, currency: this.activityForm.get('currency').value,
customCurrency: this.activityForm.controls['currencyOfUnitPrice'].value, customCurrency: this.activityForm.get('currencyOfUnitPrice').value,
date: this.activityForm.controls['date'].value, date: this.activityForm.get('date').value,
dataSource: this.activityForm.controls['dataSource'].value, dataSource: this.activityForm.get('dataSource').value,
fee: this.activityForm.controls['fee'].value, fee: this.activityForm.get('fee').value,
quantity: this.activityForm.controls['quantity'].value, quantity: this.activityForm.get('quantity').value,
symbol: symbol:
this.activityForm.controls['searchSymbol'].value?.symbol === this.activityForm.get('searchSymbol').value?.symbol === undefined ||
undefined || isUUID(this.activityForm.get('searchSymbol').value?.symbol)
isUUID(this.activityForm.controls['searchSymbol'].value?.symbol) ? this.activityForm.get('name').value
? this.activityForm.controls['name'].value : this.activityForm.get('searchSymbol').value.symbol,
: this.activityForm.controls['searchSymbol'].value.symbol, tags: this.activityForm.get('tags').value,
tags: this.activityForm.controls['tags'].value, type: this.activityForm.get('type').value,
type: this.activityForm.controls['type'].value, unitPrice: this.activityForm.get('unitPrice').value
unitPrice: this.activityForm.controls['unitPrice'].value
}; };
try { try {
@ -487,7 +477,7 @@ export class CreateOrUpdateActivityDialog implements OnDestroy {
}); });
} else { } else {
(activity as CreateOrderDto).updateAccountBalance = (activity as CreateOrderDto).updateAccountBalance =
this.activityForm.controls['updateAccountBalance'].value; this.activityForm.get('updateAccountBalance').value;
await validateObjectForForm({ await validateObjectForForm({
classDto: CreateOrderDto, classDto: CreateOrderDto,
@ -524,8 +514,8 @@ export class CreateOrUpdateActivityDialog implements OnDestroy {
this.dataService this.dataService
.fetchSymbolItem({ .fetchSymbolItem({
dataSource: this.activityForm.controls['dataSource'].value, dataSource: this.activityForm.get('dataSource').value,
symbol: this.activityForm.controls['searchSymbol'].value.symbol symbol: this.activityForm.get('searchSymbol').value.symbol
}) })
.pipe( .pipe(
catchError(() => { catchError(() => {
@ -540,9 +530,9 @@ export class CreateOrUpdateActivityDialog implements OnDestroy {
takeUntil(this.unsubscribeSubject) takeUntil(this.unsubscribeSubject)
) )
.subscribe(({ currency, dataSource, marketPrice }) => { .subscribe(({ currency, dataSource, marketPrice }) => {
this.activityForm.controls['currency'].setValue(currency); this.activityForm.get('currency').setValue(currency);
this.activityForm.controls['currencyOfUnitPrice'].setValue(currency); this.activityForm.get('currencyOfUnitPrice').setValue(currency);
this.activityForm.controls['dataSource'].setValue(dataSource); this.activityForm.get('dataSource').setValue(dataSource);
this.currentMarketPrice = marketPrice; this.currentMarketPrice = marketPrice;

69
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html

@ -12,7 +12,7 @@
<mat-label i18n>Type</mat-label> <mat-label i18n>Type</mat-label>
<mat-select formControlName="type"> <mat-select formControlName="type">
<mat-select-trigger>{{ <mat-select-trigger>{{
typesTranslationMap[activityForm.controls['type'].value] typesTranslationMap[activityForm.get('type').value]
}}</mat-select-trigger> }}</mat-select-trigger>
<mat-option value="BUY"> <mat-option value="BUY">
<span <span
@ -83,9 +83,7 @@
<mat-select formControlName="accountId"> <mat-select formControlName="accountId">
<mat-option <mat-option
*ngIf=" *ngIf="
!activityForm.controls['accountId'].hasValidator( !activityForm.get('accountId').hasValidator(Validators.required)
Validators.required
)
" "
[value]="null" [value]="null"
/> />
@ -113,9 +111,9 @@
<div <div
class="mb-3" class="mb-3"
[ngClass]="{ [ngClass]="{
'd-none': !activityForm.controls['searchSymbol'].hasValidator( 'd-none': !activityForm
Validators.required .get('searchSymbol')
) .hasValidator(Validators.required)
}" }"
> >
<mat-form-field appearance="outline" class="w-100"> <mat-form-field appearance="outline" class="w-100">
@ -129,9 +127,7 @@
<div <div
class="mb-3" class="mb-3"
[ngClass]="{ [ngClass]="{
'd-none': !activityForm.controls['name'].hasValidator( 'd-none': !activityForm.get('name').hasValidator(Validators.required)
Validators.required
)
}" }"
> >
<mat-form-field appearance="outline" class="w-100"> <mat-form-field appearance="outline" class="w-100">
@ -173,10 +169,10 @@
class="mb-3" class="mb-3"
[ngClass]="{ [ngClass]="{
'd-none': 'd-none':
activityForm.controls['type']?.value === 'FEE' || activityForm.get('type')?.value === 'FEE' ||
activityForm.controls['type']?.value === 'INTEREST' || activityForm.get('type')?.value === 'INTEREST' ||
activityForm.controls['type']?.value === 'ITEM' || activityForm.get('type')?.value === 'ITEM' ||
activityForm.controls['type']?.value === 'LIABILITY' activityForm.get('type')?.value === 'LIABILITY'
}" }"
> >
<mat-form-field appearance="outline" class="w-100"> <mat-form-field appearance="outline" class="w-100">
@ -186,12 +182,12 @@
</div> </div>
<div <div
class="mb-3" class="mb-3"
[ngClass]="{ 'd-none': activityForm.controls['type']?.value === 'FEE' }" [ngClass]="{ 'd-none': activityForm.get('type')?.value === 'FEE' }"
> >
<div class="align-items-start d-flex"> <div class="align-items-start d-flex">
<mat-form-field appearance="outline" class="w-100"> <mat-form-field appearance="outline" class="w-100">
<mat-label <mat-label
><ng-container [ngSwitch]="activityForm.controls['type']?.value"> ><ng-container [ngSwitch]="activityForm.get('type')?.value">
<ng-container *ngSwitchCase="'DIVIDEND'" i18n <ng-container *ngSwitchCase="'DIVIDEND'" i18n
>Dividend</ng-container >Dividend</ng-container
> >
@ -211,7 +207,7 @@
<div <div
class="ml-2" class="ml-2"
matTextSuffix matTextSuffix
[ngClass]="{ 'd-none': !activityForm.controls['currency']?.value }" [ngClass]="{ 'd-none': !activityForm.get('currency')?.value }"
> >
<mat-select formControlName="currencyOfUnitPrice"> <mat-select formControlName="currencyOfUnitPrice">
<mat-option <mat-option
@ -224,16 +220,14 @@
</div> </div>
<mat-error <mat-error
*ngIf=" *ngIf="
activityForm.controls['unitPriceInCustomCurrency'].hasError( activityForm.get('unitPriceInCustomCurrency').hasError('invalid')
'invalid'
)
" "
><ng-container i18n ><ng-container i18n
>Oops! Could not get the historical exchange rate >Oops! Could not get the historical exchange rate
from</ng-container from</ng-container
> >
{{ {{
activityForm.controls['date']?.value | date: defaultDateFormat activityForm.get('date')?.value | date: defaultDateFormat
}}</mat-error }}</mat-error
> >
</mat-form-field> </mat-form-field>
@ -241,7 +235,7 @@
*ngIf=" *ngIf="
currentMarketPrice && currentMarketPrice &&
(data.activity.type === 'BUY' || data.activity.type === 'SELL') && (data.activity.type === 'BUY' || data.activity.type === 'SELL') &&
isToday(activityForm.controls['date']?.value) isToday(activityForm.get('date')?.value)
" "
class="ml-2 mt-1 no-min-width" class="ml-2 mt-1 no-min-width"
mat-button mat-button
@ -256,7 +250,7 @@
<div class="d-none"> <div class="d-none">
<mat-form-field appearance="outline" class="w-100"> <mat-form-field appearance="outline" class="w-100">
<mat-label <mat-label
><ng-container [ngSwitch]="activityForm.controls['type']?.value"> ><ng-container [ngSwitch]="activityForm.get('type')?.value">
<ng-container *ngSwitchCase="'DIVIDEND'" i18n <ng-container *ngSwitchCase="'DIVIDEND'" i18n
>Dividend</ng-container >Dividend</ng-container
> >
@ -269,7 +263,7 @@
</mat-label> </mat-label>
<input formControlName="unitPrice" matInput type="number" /> <input formControlName="unitPrice" matInput type="number" />
<span class="ml-2" matTextSuffix>{{ <span class="ml-2" matTextSuffix>{{
activityForm.controls['currency'].value activityForm.get('currency').value
}}</span> }}</span>
</mat-form-field> </mat-form-field>
</div> </div>
@ -277,9 +271,9 @@
class="mb-3" class="mb-3"
[ngClass]="{ [ngClass]="{
'd-none': 'd-none':
activityForm.controls['type']?.value === 'INTEREST' || activityForm.get('type')?.value === 'INTEREST' ||
activityForm.controls['type']?.value === 'ITEM' || activityForm.get('type')?.value === 'ITEM' ||
activityForm.controls['type']?.value === 'LIABILITY' activityForm.get('type')?.value === 'LIABILITY'
}" }"
> >
<mat-form-field appearance="outline" class="w-100"> <mat-form-field appearance="outline" class="w-100">
@ -288,19 +282,17 @@
<div <div
class="ml-2" class="ml-2"
matTextSuffix matTextSuffix
[ngClass]="{ 'd-none': !activityForm.controls['currency']?.value }" [ngClass]="{ 'd-none': !activityForm.get('currency')?.value }"
> >
{{ activityForm.controls['currencyOfUnitPrice'].value }} {{ activityForm.get('currencyOfUnitPrice').value }}
</div> </div>
<mat-error <mat-error
*ngIf=" *ngIf="activityForm.get('feeInCustomCurrency').hasError('invalid')"
activityForm.controls['feeInCustomCurrency'].hasError('invalid')
"
><ng-container i18n ><ng-container i18n
>Oops! Could not get the historical exchange rate from</ng-container >Oops! Could not get the historical exchange rate from</ng-container
> >
{{ {{
activityForm.controls['date']?.value | date: defaultDateFormat activityForm.get('date')?.value | date: defaultDateFormat
}}</mat-error }}</mat-error
> >
</mat-form-field> </mat-form-field>
@ -310,7 +302,7 @@
<mat-label i18n>Fee</mat-label> <mat-label i18n>Fee</mat-label>
<input formControlName="fee" matInput type="number" /> <input formControlName="fee" matInput type="number" />
<span class="ml-2" matTextSuffix>{{ <span class="ml-2" matTextSuffix>{{
activityForm.controls['currency'].value activityForm.get('currency').value
}}</span> }}</span>
</mat-form-field> </mat-form-field>
</div> </div>
@ -328,7 +320,7 @@
</div> </div>
<div <div
class="mb-3" class="mb-3"
[ngClass]="{ 'd-none': activityForm.controls['type']?.value !== 'ITEM' }" [ngClass]="{ 'd-none': activityForm.get('type')?.value !== 'ITEM' }"
> >
<mat-form-field appearance="outline" class="w-100"> <mat-form-field appearance="outline" class="w-100">
<mat-label i18n>Asset Class</mat-label> <mat-label i18n>Asset Class</mat-label>
@ -344,7 +336,7 @@
</div> </div>
<div <div
class="mb-3" class="mb-3"
[ngClass]="{ 'd-none': activityForm.controls['type']?.value !== 'ITEM' }" [ngClass]="{ 'd-none': activityForm.get('type')?.value !== 'ITEM' }"
> >
<mat-form-field appearance="outline" class="w-100"> <mat-form-field appearance="outline" class="w-100">
<mat-label i18n>Asset Sub Class</mat-label> <mat-label i18n>Asset Sub Class</mat-label>
@ -363,7 +355,7 @@
<mat-label i18n>Tags</mat-label> <mat-label i18n>Tags</mat-label>
<mat-chip-grid #tagsChipList> <mat-chip-grid #tagsChipList>
<mat-chip-row <mat-chip-row
*ngFor="let tag of activityForm.controls['tags']?.value" *ngFor="let tag of activityForm.get('tags')?.value"
matChipRemove matChipRemove
[removable]="true" [removable]="true"
(removed)="onRemoveTag(tag)" (removed)="onRemoveTag(tag)"
@ -399,8 +391,7 @@
[isCurrency]="true" [isCurrency]="true"
[locale]="data.user?.settings?.locale" [locale]="data.user?.settings?.locale"
[unit]=" [unit]="
activityForm.controls['currency']?.value ?? activityForm.get('currency')?.value ?? data.user?.settings?.baseCurrency
data.user?.settings?.baseCurrency
" "
[value]="total" [value]="total"
/> />

10
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts

@ -85,7 +85,7 @@ export class ImportActivitiesDialog implements OnDestroy {
this.dialogTitle = $localize`Import Dividends`; this.dialogTitle = $localize`Import Dividends`;
this.mode = 'DIVIDEND'; this.mode = 'DIVIDEND';
this.uniqueAssetForm.controls['uniqueAsset'].disable(); this.uniqueAssetForm.get('uniqueAsset').disable();
this.dataService this.dataService
.fetchPositions({ .fetchPositions({
@ -102,7 +102,7 @@ export class ImportActivitiesDialog implements OnDestroy {
this.holdings = sortBy(positions, ({ name }) => { this.holdings = sortBy(positions, ({ name }) => {
return name.toLowerCase(); return name.toLowerCase();
}); });
this.uniqueAssetForm.controls['uniqueAsset'].enable(); this.uniqueAssetForm.get('uniqueAsset').enable();
this.isLoading = false; this.isLoading = false;
@ -167,10 +167,10 @@ export class ImportActivitiesDialog implements OnDestroy {
} }
public onLoadDividends(aStepper: MatStepper) { public onLoadDividends(aStepper: MatStepper) {
this.uniqueAssetForm.controls['uniqueAsset'].disable(); this.uniqueAssetForm.get('uniqueAsset').disable();
const { dataSource, symbol } = const { dataSource, symbol } =
this.uniqueAssetForm.controls['uniqueAsset'].value; this.uniqueAssetForm.get('uniqueAsset').value;
this.dataService this.dataService
.fetchDividendsImport({ .fetchDividendsImport({
@ -193,7 +193,7 @@ export class ImportActivitiesDialog implements OnDestroy {
this.details = []; this.details = [];
this.errorMessages = []; this.errorMessages = [];
this.importStep = ImportStep.SELECT_ACTIVITIES; this.importStep = ImportStep.SELECT_ACTIVITIES;
this.uniqueAssetForm.controls['uniqueAsset'].enable(); this.uniqueAssetForm.get('uniqueAsset').enable();
aStepper.reset(); aStepper.reset();
} }

2
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html

@ -33,7 +33,7 @@
<mat-label i18n>Holding</mat-label> <mat-label i18n>Holding</mat-label>
<mat-select formControlName="uniqueAsset"> <mat-select formControlName="uniqueAsset">
<mat-select-trigger>{{ <mat-select-trigger>{{
uniqueAssetForm.controls['uniqueAsset']?.value?.name uniqueAssetForm.get('uniqueAsset')?.value?.name
}}</mat-select-trigger> }}</mat-select-trigger>
<mat-option <mat-option
*ngFor="let holding of holdings" *ngFor="let holding of holdings"

5
libs/ui/src/lib/fire-calculator/fire-calculator.component.html

@ -31,10 +31,7 @@
<mat-form-field appearance="outline" class="w-100"> <mat-form-field appearance="outline" class="w-100">
<mat-label i18n>Retirement Date</mat-label> <mat-label i18n>Retirement Date</mat-label>
<div> <div>
{{ {{ calculatorForm.get('retirementDate').value | date: 'MMMM YYYY' }}
calculatorForm.controls['retirementDate'].value
| date: 'MMMM YYYY'
}}
</div> </div>
<input <input
class="d-none" class="d-none"

4
package.json

@ -83,7 +83,7 @@
"@nestjs/platform-express": "10.1.3", "@nestjs/platform-express": "10.1.3",
"@nestjs/schedule": "3.0.2", "@nestjs/schedule": "3.0.2",
"@nestjs/serve-static": "4.0.0", "@nestjs/serve-static": "4.0.0",
"@prisma/client": "5.12.1", "@prisma/client": "5.13.0",
"@simplewebauthn/browser": "9.0.1", "@simplewebauthn/browser": "9.0.1",
"@simplewebauthn/server": "9.0.3", "@simplewebauthn/server": "9.0.3",
"@stripe/stripe-js": "1.47.0", "@stripe/stripe-js": "1.47.0",
@ -125,7 +125,7 @@
"passport": "0.6.0", "passport": "0.6.0",
"passport-google-oauth20": "2.0.0", "passport-google-oauth20": "2.0.0",
"passport-jwt": "4.0.0", "passport-jwt": "4.0.0",
"prisma": "5.12.1", "prisma": "5.13.0",
"reflect-metadata": "0.1.13", "reflect-metadata": "0.1.13",
"rxjs": "7.5.6", "rxjs": "7.5.6",
"stripe": "11.12.0", "stripe": "11.12.0",

90
yarn.lock

@ -5442,46 +5442,46 @@
resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.25.tgz#f077fdc0b5d0078d30893396ff4827a13f99e817" resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.25.tgz#f077fdc0b5d0078d30893396ff4827a13f99e817"
integrity sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ== integrity sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==
"@prisma/client@5.12.1": "@prisma/client@5.13.0":
version "5.12.1" version "5.13.0"
resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.12.1.tgz#c26a674fea76754b3a9e8b90a11e617f90212f76" resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.13.0.tgz#b9f1d0983d714e982675201d8222a9ecb4bdad4a"
integrity sha512-6/JnizEdlSBxDIdiLbrBdMW5NqDxOmhXAJaNXiPpgzAPr/nLZResT6MMpbOHLo5yAbQ1Vv5UU8PTPRzb0WIxdA== integrity sha512-uYdfpPncbZ/syJyiYBwGZS8Gt1PTNoErNYMuqHDa2r30rNSFtgTA/LXsSk55R7pdRTMi5pHkeP9B14K6nHmwkg==
"@prisma/debug@5.12.1": "@prisma/debug@5.13.0":
version "5.12.1" version "5.13.0"
resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-5.12.1.tgz#007c8ad2e466d565bcd0671b8846c27f8700c722" resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-5.13.0.tgz#d88b0f6fafa0c216e20e284ed9fc30f1cbe45786"
integrity sha512-kd/wNsR0klrv79o1ITsbWxYyh4QWuBidvxsXSParPsYSu0ircUmNk3q4ojsgNc3/81b0ozg76iastOG43tbf8A== integrity sha512-699iqlEvzyCj9ETrXhs8o8wQc/eVW+FigSsHpiskSFydhjVuwTJEfj/nIYqTaWFYuxiWQRfm3r01meuW97SZaQ==
"@prisma/engines-version@5.12.0-21.473ed3124229e22d881cb7addf559799debae1ab": "@prisma/engines-version@5.13.0-23.b9a39a7ee606c28e3455d0fd60e78c3ba82b1a2b":
version "5.12.0-21.473ed3124229e22d881cb7addf559799debae1ab" version "5.13.0-23.b9a39a7ee606c28e3455d0fd60e78c3ba82b1a2b"
resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.12.0-21.473ed3124229e22d881cb7addf559799debae1ab.tgz#c78d099a3fe86d446db7442e64e56987e39e7f32" resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.13.0-23.b9a39a7ee606c28e3455d0fd60e78c3ba82b1a2b.tgz#a72a4fb83ba1fd01ad45f795aa55168f60d34723"
integrity sha512-6yvO8s80Tym61aB4QNtYZfWVmE3pwqe807jEtzm8C5VDe7nw8O1FGX3TXUaXmWV0fQTIAfRbeL2Gwrndabp/0g== integrity sha512-AyUuhahTINGn8auyqYdmxsN+qn0mw3eg+uhkp8zwknXYIqoT3bChG4RqNY/nfDkPvzWAPBa9mrDyBeOnWSgO6A==
"@prisma/engines@5.12.1": "@prisma/engines@5.13.0":
version "5.12.1" version "5.13.0"
resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.12.1.tgz#a50649427d627a9af962a188a84c65d61c6e2b3f" resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.13.0.tgz#8994ebf7b4e35aee7746a8465ec22738379bcab6"
integrity sha512-HQDdglLw2bZR/TXD2Y+YfDMvi5Q8H+acbswqOsWyq9pPjBLYJ6gzM+ptlTU/AV6tl0XSZLU1/7F4qaWa8bqpJA== integrity sha512-hIFLm4H1boj6CBZx55P4xKby9jgDTeDG0Jj3iXtwaaHmlD5JmiDkZhh8+DYWkTGchu+rRF36AVROLnk0oaqhHw==
dependencies: dependencies:
"@prisma/debug" "5.12.1" "@prisma/debug" "5.13.0"
"@prisma/engines-version" "5.12.0-21.473ed3124229e22d881cb7addf559799debae1ab" "@prisma/engines-version" "5.13.0-23.b9a39a7ee606c28e3455d0fd60e78c3ba82b1a2b"
"@prisma/fetch-engine" "5.12.1" "@prisma/fetch-engine" "5.13.0"
"@prisma/get-platform" "5.12.1" "@prisma/get-platform" "5.13.0"
"@prisma/fetch-engine@5.12.1": "@prisma/fetch-engine@5.13.0":
version "5.12.1" version "5.13.0"
resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-5.12.1.tgz#c38e9fa17fdc535b4c83cbb7645569ad0a511fa9" resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-5.13.0.tgz#9b6945c7b38bb59e840f8905b20ea7a3d059ca55"
integrity sha512-qSs3KcX1HKcea1A+hlJVK/ljj0PNIUHDxAayGMvgJBqmaN32P9tCidlKz1EGv6WoRFICYnk3Dd/YFLBwnFIozA== integrity sha512-Yh4W+t6YKyqgcSEB3odBXt7QyVSm0OQlBSldQF2SNXtmOgMX8D7PF/fvH6E6qBCpjB/yeJLy/FfwfFijoHI6sA==
dependencies: dependencies:
"@prisma/debug" "5.12.1" "@prisma/debug" "5.13.0"
"@prisma/engines-version" "5.12.0-21.473ed3124229e22d881cb7addf559799debae1ab" "@prisma/engines-version" "5.13.0-23.b9a39a7ee606c28e3455d0fd60e78c3ba82b1a2b"
"@prisma/get-platform" "5.12.1" "@prisma/get-platform" "5.13.0"
"@prisma/get-platform@5.12.1": "@prisma/get-platform@5.13.0":
version "5.12.1" version "5.13.0"
resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-5.12.1.tgz#33f427f6d744dee62a9e06858889691d78b50804" resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-5.13.0.tgz#99ef909a52b9d79b64d72d2d3d8210c4892b6572"
integrity sha512-pgIR+pSvhYHiUcqXVEZS31NrFOTENC9yFUdEAcx7cdQBoZPmHVjtjN4Ss6NzVDMYPrKJJ51U14EhEoeuBlMioQ== integrity sha512-B/WrQwYTzwr7qCLifQzYOmQhZcFmIFhR81xC45gweInSUn2hTEbfKUPd2keAog+y5WI5xLAFNJ3wkXplvSVkSw==
dependencies: dependencies:
"@prisma/debug" "5.12.1" "@prisma/debug" "5.13.0"
"@radix-ui/number@1.0.1": "@radix-ui/number@1.0.1":
version "1.0.1" version "1.0.1"
@ -16706,12 +16706,12 @@ pretty-hrtime@^1.0.3:
resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"
integrity sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A== integrity sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==
prisma@5.12.1: prisma@5.13.0:
version "5.12.1" version "5.13.0"
resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.12.1.tgz#db4596253bb066afc9f08744642f200a398d8d51" resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.13.0.tgz#1f06e20ccfb6038ad68869e6eacd3b346f9d0851"
integrity sha512-SkMnb6wyIxTv9ACqiHBI2u9gD6y98qXRoCoLEnZsF6yee5Qg828G+ARrESN+lQHdw4maSZFFSBPPDpvSiVTo0Q== integrity sha512-kGtcJaElNRAdAGsCNykFSZ7dBKpL14Cbs+VaQ8cECxQlRPDjBlMHNFYeYt0SKovAVy2Y65JXQwB3A5+zIQwnTg==
dependencies: dependencies:
"@prisma/engines" "5.12.1" "@prisma/engines" "5.13.0"
prismjs@^1.28.0: prismjs@^1.28.0:
version "1.29.0" version "1.29.0"

Loading…
Cancel
Save