Browse Source

Merge branch 'main' into task/improve-storybook-stories-of-value-component

pull/6496/head
Thomas Kaul 3 weeks ago
committed by GitHub
parent
commit
09d601c1ce
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 1
      CHANGELOG.md
  2. 8
      apps/api/src/app/activities/activities.controller.ts
  3. 2
      apps/api/src/app/import/import.controller.ts
  4. 2
      apps/api/src/app/portfolio/portfolio.controller.ts
  5. 2
      apps/api/src/app/portfolio/portfolio.service.ts
  6. 12
      apps/client/src/app/app.component.ts
  7. 2
      apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
  8. 2
      apps/client/src/app/components/holding-detail-dialog/interfaces/interfaces.ts
  9. 2
      apps/client/src/app/components/home-holdings/home-holdings.component.ts
  10. 2
      apps/client/src/app/components/home-overview/home-overview.component.ts
  11. 2
      apps/client/src/app/pages/accounts/accounts-page.component.ts
  12. 4
      apps/client/src/app/pages/portfolio/activities/activities-page.component.ts
  13. 2
      apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts
  14. 2
      apps/client/src/locales/messages.nl.xlf
  15. 2
      libs/common/src/lib/interfaces/portfolio-position.interface.ts
  16. 18
      libs/common/src/lib/permissions.ts
  17. 7
      libs/ui/src/lib/mocks/holdings.ts
  18. 9
      libs/ui/src/lib/services/data.service.ts

1
CHANGELOG.md

@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed ### Changed
- Improved the _Storybook_ stories of the value component - Improved the _Storybook_ stories of the value component
- Improved the language localization for Dutch (`nl`)
## 2.248.0 - 2026-03-07 ## 2.248.0 - 2026-03-07

8
apps/api/src/app/activities/activities.controller.ts

@ -59,7 +59,7 @@ export class ActivitiesController {
) {} ) {}
@Delete() @Delete()
@HasPermission(permissions.deleteOrder) @HasPermission(permissions.deleteActivity)
@UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseGuards(AuthGuard('jwt'), HasPermissionGuard)
@UseInterceptors(TransformDataSourceInRequestInterceptor) @UseInterceptors(TransformDataSourceInRequestInterceptor)
public async deleteActivities( public async deleteActivities(
@ -84,7 +84,7 @@ export class ActivitiesController {
} }
@Delete(':id') @Delete(':id')
@HasPermission(permissions.deleteOrder) @HasPermission(permissions.deleteActivity)
@UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseGuards(AuthGuard('jwt'), HasPermissionGuard)
public async deleteActivity(@Param('id') id: string): Promise<Order> { public async deleteActivity(@Param('id') id: string): Promise<Order> {
const activity = await this.activitiesService.order({ const activity = await this.activitiesService.order({
@ -191,7 +191,7 @@ export class ActivitiesController {
return activity; return activity;
} }
@HasPermission(permissions.createOrder) @HasPermission(permissions.createActivity)
@Post() @Post()
@UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseGuards(AuthGuard('jwt'), HasPermissionGuard)
@UseInterceptors(TransformDataSourceInRequestInterceptor) @UseInterceptors(TransformDataSourceInRequestInterceptor)
@ -274,7 +274,7 @@ export class ActivitiesController {
return activity; return activity;
} }
@HasPermission(permissions.updateOrder) @HasPermission(permissions.updateActivity)
@Put(':id') @Put(':id')
@UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseGuards(AuthGuard('jwt'), HasPermissionGuard)
@UseInterceptors(TransformDataSourceInRequestInterceptor) @UseInterceptors(TransformDataSourceInRequestInterceptor)

2
apps/api/src/app/import/import.controller.ts

@ -38,7 +38,7 @@ export class ImportController {
@Post() @Post()
@UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseGuards(AuthGuard('jwt'), HasPermissionGuard)
@HasPermission(permissions.createOrder) @HasPermission(permissions.createActivity)
@UseInterceptors(TransformDataSourceInRequestInterceptor) @UseInterceptors(TransformDataSourceInRequestInterceptor)
@UseInterceptors(TransformDataSourceInResponseInterceptor) @UseInterceptors(TransformDataSourceInResponseInterceptor)
public async import( public async import(

2
apps/api/src/app/portfolio/portfolio.controller.ts

@ -639,7 +639,7 @@ export class PortfolioController {
return report; return report;
} }
@HasPermission(permissions.updateOrder) @HasPermission(permissions.updateActivity)
@Put('holding/:dataSource/:symbol/tags') @Put('holding/:dataSource/:symbol/tags')
@UseInterceptors(TransformDataSourceInRequestInterceptor) @UseInterceptors(TransformDataSourceInRequestInterceptor)
@UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseGuards(AuthGuard('jwt'), HasPermissionGuard)

2
apps/api/src/app/portfolio/portfolio.service.ts

@ -627,6 +627,7 @@ export class PortfolioService {
assetClass: assetProfile.assetClass, assetClass: assetProfile.assetClass,
assetSubClass: assetProfile.assetSubClass, assetSubClass: assetProfile.assetSubClass,
countries: assetProfile.countries, countries: assetProfile.countries,
currency: assetProfile.currency,
dataSource: assetProfile.dataSource, dataSource: assetProfile.dataSource,
holdings: assetProfile.holdings.map( holdings: assetProfile.holdings.map(
({ allocationInPercentage, name }) => { ({ allocationInPercentage, name }) => {
@ -1699,6 +1700,7 @@ export class PortfolioService {
assetClass: AssetClass.LIQUIDITY, assetClass: AssetClass.LIQUIDITY,
assetSubClass: AssetSubClass.CASH, assetSubClass: AssetSubClass.CASH,
assetProfile: { assetProfile: {
currency,
assetClass: AssetClass.LIQUIDITY, assetClass: AssetClass.LIQUIDITY,
assetSubClass: AssetSubClass.CASH, assetSubClass: AssetSubClass.CASH,
countries: [], countries: [],

12
apps/client/src/app/app.component.ts

@ -296,15 +296,21 @@ export class GfAppComponent implements OnDestroy, OnInit {
), ),
hasPermissionToCreateActivity: hasPermissionToCreateActivity:
!this.hasImpersonationId && !this.hasImpersonationId &&
hasPermission(this.user?.permissions, permissions.createOrder) && hasPermission(
this.user?.permissions,
permissions.createActivity
) &&
!this.user?.settings?.isRestrictedView, !this.user?.settings?.isRestrictedView,
hasPermissionToReportDataGlitch: hasPermission( hasPermissionToReportDataGlitch: hasPermission(
this.user?.permissions, this.user?.permissions,
permissions.reportDataGlitch permissions.reportDataGlitch
), ),
hasPermissionToUpdateOrder: hasPermissionToUpdateActivity:
!this.hasImpersonationId && !this.hasImpersonationId &&
hasPermission(this.user?.permissions, permissions.updateOrder) && hasPermission(
this.user?.permissions,
permissions.updateActivity
) &&
!this.user?.settings?.isRestrictedView, !this.user?.settings?.isRestrictedView,
locale: this.user?.settings?.locale locale: this.user?.settings?.locale
}, },

2
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html

@ -414,7 +414,7 @@
<gf-tags-selector <gf-tags-selector
formControlName="tags" formControlName="tags"
[hasPermissionToCreateTag]="hasPermissionToCreateOwnTag" [hasPermissionToCreateTag]="hasPermissionToCreateOwnTag"
[readonly]="!data.hasPermissionToUpdateOrder" [readonly]="!data.hasPermissionToUpdateActivity"
[tagsAvailable]="tagsAvailable" [tagsAvailable]="tagsAvailable"
/> />
</form> </form>

2
apps/client/src/app/components/holding-detail-dialog/interfaces/interfaces.ts

@ -11,7 +11,7 @@ export interface HoldingDetailDialogParams {
hasPermissionToAccessAdminControl: boolean; hasPermissionToAccessAdminControl: boolean;
hasPermissionToCreateActivity: boolean; hasPermissionToCreateActivity: boolean;
hasPermissionToReportDataGlitch: boolean; hasPermissionToReportDataGlitch: boolean;
hasPermissionToUpdateOrder: boolean; hasPermissionToUpdateActivity: boolean;
locale: string; locale: string;
symbol: string; symbol: string;
} }

2
apps/client/src/app/components/home-holdings/home-holdings.component.ts

@ -107,7 +107,7 @@ export class GfHomeHoldingsComponent implements OnDestroy, OnInit {
this.hasPermissionToCreateActivity = hasPermission( this.hasPermissionToCreateActivity = hasPermission(
this.user.permissions, this.user.permissions,
permissions.createOrder permissions.createActivity
); );
this.initialize(); this.initialize();

2
apps/client/src/app/components/home-overview/home-overview.component.ts

@ -80,7 +80,7 @@ export class GfHomeOverviewComponent implements OnDestroy, OnInit {
this.hasPermissionToCreateActivity = hasPermission( this.hasPermissionToCreateActivity = hasPermission(
this.user.permissions, this.user.permissions,
permissions.createOrder permissions.createActivity
); );
this.update(); this.update();

2
apps/client/src/app/pages/accounts/accounts-page.component.ts

@ -245,7 +245,7 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit {
hasImpersonationId: this.hasImpersonationId, hasImpersonationId: this.hasImpersonationId,
hasPermissionToCreateActivity: hasPermissionToCreateActivity:
!this.hasImpersonationId && !this.hasImpersonationId &&
hasPermission(this.user?.permissions, permissions.createOrder) && hasPermission(this.user?.permissions, permissions.createActivity) &&
!this.user?.settings?.isRestrictedView !this.user?.settings?.isRestrictedView
}, },
height: this.deviceType === 'mobile' ? '98vh' : '80vh', height: this.deviceType === 'mobile' ? '98vh' : '80vh',

4
apps/client/src/app/pages/portfolio/activities/activities-page.component.ts

@ -407,9 +407,9 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit {
this.hasPermissionToCreateActivity = this.hasPermissionToCreateActivity =
!this.hasImpersonationId && !this.hasImpersonationId &&
hasPermission(this.user.permissions, permissions.createOrder); hasPermission(this.user.permissions, permissions.createActivity);
this.hasPermissionToDeleteActivity = this.hasPermissionToDeleteActivity =
!this.hasImpersonationId && !this.hasImpersonationId &&
hasPermission(this.user.permissions, permissions.deleteOrder); hasPermission(this.user.permissions, permissions.deleteActivity);
} }
} }

2
apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts

@ -567,7 +567,7 @@ export class GfAllocationsPageComponent implements OnInit {
hasImpersonationId: this.hasImpersonationId, hasImpersonationId: this.hasImpersonationId,
hasPermissionToCreateActivity: hasPermissionToCreateActivity:
!this.hasImpersonationId && !this.hasImpersonationId &&
hasPermission(this.user?.permissions, permissions.createOrder) && hasPermission(this.user?.permissions, permissions.createActivity) &&
!this.user?.settings?.isRestrictedView !this.user?.settings?.isRestrictedView
}, },
height: this.deviceType === 'mobile' ? '98vh' : '80vh', height: this.deviceType === 'mobile' ? '98vh' : '80vh',

2
apps/client/src/locales/messages.nl.xlf

@ -3823,7 +3823,7 @@
</trans-unit> </trans-unit>
<trans-unit id="7702646444963497962" datatype="html"> <trans-unit id="7702646444963497962" datatype="html">
<source>By</source> <source>By</source>
<target state="translated">Door</target> <target state="translated">Tegen</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">139</context> <context context-type="linenumber">139</context>

2
libs/common/src/lib/interfaces/portfolio-position.interface.ts

@ -22,6 +22,7 @@ export interface PortfolioPosition {
| 'assetClass' | 'assetClass'
| 'assetSubClass' | 'assetSubClass'
| 'countries' | 'countries'
| 'currency'
| 'dataSource' | 'dataSource'
| 'holdings' | 'holdings'
| 'name' | 'name'
@ -42,6 +43,7 @@ export interface PortfolioPosition {
/** @deprecated */ /** @deprecated */
countries: Country[]; countries: Country[];
/** @deprecated */
currency: string; currency: string;
/** @deprecated */ /** @deprecated */

18
libs/common/src/lib/permissions.ts

@ -9,10 +9,10 @@ export const permissions = {
createAccess: 'createAccess', createAccess: 'createAccess',
createAccount: 'createAccount', createAccount: 'createAccount',
createAccountBalance: 'createAccountBalance', createAccountBalance: 'createAccountBalance',
createActivity: 'createActivity',
createApiKey: 'createApiKey', createApiKey: 'createApiKey',
createMarketData: 'createMarketData', createMarketData: 'createMarketData',
createMarketDataOfOwnAssetProfile: 'createMarketDataOfOwnAssetProfile', createMarketDataOfOwnAssetProfile: 'createMarketDataOfOwnAssetProfile',
createOrder: 'createOrder',
createOwnTag: 'createOwnTag', createOwnTag: 'createOwnTag',
createPlatform: 'createPlatform', createPlatform: 'createPlatform',
createTag: 'createTag', createTag: 'createTag',
@ -21,8 +21,8 @@ export const permissions = {
deleteAccess: 'deleteAccess', deleteAccess: 'deleteAccess',
deleteAccount: 'deleteAccount', deleteAccount: 'deleteAccount',
deleteAccountBalance: 'deleteAccountBalance', deleteAccountBalance: 'deleteAccountBalance',
deleteActivity: 'deleteActivity',
deleteAuthDevice: 'deleteAuthDevice', deleteAuthDevice: 'deleteAuthDevice',
deleteOrder: 'deleteOrder',
deleteOwnUser: 'deleteOwnUser', deleteOwnUser: 'deleteOwnUser',
deletePlatform: 'deletePlatform', deletePlatform: 'deletePlatform',
deleteTag: 'deleteTag', deleteTag: 'deleteTag',
@ -53,10 +53,10 @@ export const permissions = {
toggleReadOnlyMode: 'toggleReadOnlyMode', toggleReadOnlyMode: 'toggleReadOnlyMode',
updateAccount: 'updateAccount', updateAccount: 'updateAccount',
updateAccess: 'updateAccess', updateAccess: 'updateAccess',
updateActivity: 'updateActivity',
updateAuthDevice: 'updateAuthDevice', updateAuthDevice: 'updateAuthDevice',
updateMarketData: 'updateMarketData', updateMarketData: 'updateMarketData',
updateMarketDataOfOwnAssetProfile: 'updateMarketDataOfOwnAssetProfile', updateMarketDataOfOwnAssetProfile: 'updateMarketDataOfOwnAssetProfile',
updateOrder: 'updateOrder',
updateOwnAccessToken: 'updateOwnAccessToken', updateOwnAccessToken: 'updateOwnAccessToken',
updatePlatform: 'updatePlatform', updatePlatform: 'updatePlatform',
updateTag: 'updateTag', updateTag: 'updateTag',
@ -74,19 +74,19 @@ export function getPermissions(aRole: Role): string[] {
permissions.createAccess, permissions.createAccess,
permissions.createAccount, permissions.createAccount,
permissions.createAccountBalance, permissions.createAccountBalance,
permissions.createActivity,
permissions.createWatchlistItem, permissions.createWatchlistItem,
permissions.deleteAccountBalance, permissions.deleteAccountBalance,
permissions.deleteWatchlistItem, permissions.deleteWatchlistItem,
permissions.createMarketData, permissions.createMarketData,
permissions.createMarketDataOfOwnAssetProfile, permissions.createMarketDataOfOwnAssetProfile,
permissions.createOrder,
permissions.createOwnTag, permissions.createOwnTag,
permissions.createPlatform, permissions.createPlatform,
permissions.createTag, permissions.createTag,
permissions.deleteAccess, permissions.deleteAccess,
permissions.deleteAccount, permissions.deleteAccount,
permissions.deleteActivity,
permissions.deleteAuthDevice, permissions.deleteAuthDevice,
permissions.deleteOrder,
permissions.deletePlatform, permissions.deletePlatform,
permissions.deleteTag, permissions.deleteTag,
permissions.deleteUser, permissions.deleteUser,
@ -99,10 +99,10 @@ export function getPermissions(aRole: Role): string[] {
permissions.readWatchlist, permissions.readWatchlist,
permissions.updateAccount, permissions.updateAccount,
permissions.updateAccess, permissions.updateAccess,
permissions.updateActivity,
permissions.updateAuthDevice, permissions.updateAuthDevice,
permissions.updateMarketData, permissions.updateMarketData,
permissions.updateMarketDataOfOwnAssetProfile, permissions.updateMarketDataOfOwnAssetProfile,
permissions.updateOrder,
permissions.updatePlatform, permissions.updatePlatform,
permissions.updateTag, permissions.updateTag,
permissions.updateUserSettings, permissions.updateUserSettings,
@ -125,15 +125,15 @@ export function getPermissions(aRole: Role): string[] {
permissions.createAccess, permissions.createAccess,
permissions.createAccount, permissions.createAccount,
permissions.createAccountBalance, permissions.createAccountBalance,
permissions.createActivity,
permissions.createMarketDataOfOwnAssetProfile, permissions.createMarketDataOfOwnAssetProfile,
permissions.createOrder,
permissions.createOwnTag, permissions.createOwnTag,
permissions.createWatchlistItem, permissions.createWatchlistItem,
permissions.deleteAccess, permissions.deleteAccess,
permissions.deleteAccount, permissions.deleteAccount,
permissions.deleteAccountBalance, permissions.deleteAccountBalance,
permissions.deleteActivity,
permissions.deleteAuthDevice, permissions.deleteAuthDevice,
permissions.deleteOrder,
permissions.deleteWatchlistItem, permissions.deleteWatchlistItem,
permissions.readAiPrompt, permissions.readAiPrompt,
permissions.readMarketDataOfOwnAssetProfile, permissions.readMarketDataOfOwnAssetProfile,
@ -141,9 +141,9 @@ export function getPermissions(aRole: Role): string[] {
permissions.readWatchlist, permissions.readWatchlist,
permissions.updateAccount, permissions.updateAccount,
permissions.updateAccess, permissions.updateAccess,
permissions.updateActivity,
permissions.updateAuthDevice, permissions.updateAuthDevice,
permissions.updateMarketDataOfOwnAssetProfile, permissions.updateMarketDataOfOwnAssetProfile,
permissions.updateOrder,
permissions.updateUserSettings, permissions.updateUserSettings,
permissions.updateViewMode permissions.updateViewMode
]; ];

7
libs/ui/src/lib/mocks/holdings.ts

@ -17,6 +17,7 @@ export const holdings: PortfolioPosition[] = [
weight: 1 weight: 1
} }
], ],
currency: 'USD',
dataSource: 'YAHOO', dataSource: 'YAHOO',
holdings: [], holdings: [],
sectors: [ sectors: [
@ -81,6 +82,7 @@ export const holdings: PortfolioPosition[] = [
weight: 1 weight: 1
} }
], ],
currency: 'EUR',
dataSource: 'YAHOO', dataSource: 'YAHOO',
holdings: [], holdings: [],
sectors: [ sectors: [
@ -145,6 +147,7 @@ export const holdings: PortfolioPosition[] = [
weight: 1 weight: 1
} }
], ],
currency: 'USD',
dataSource: 'YAHOO', dataSource: 'YAHOO',
holdings: [], holdings: [],
sectors: [ sectors: [
@ -202,6 +205,7 @@ export const holdings: PortfolioPosition[] = [
assetClass: 'LIQUIDITY', assetClass: 'LIQUIDITY',
assetSubClass: 'CASH', assetSubClass: 'CASH',
countries: [], countries: [],
currency: 'USD',
dataSource: 'COINGECKO', dataSource: 'COINGECKO',
holdings: [], holdings: [],
sectors: [], sectors: [],
@ -249,6 +253,7 @@ export const holdings: PortfolioPosition[] = [
weight: 1 weight: 1
} }
], ],
currency: 'USD',
dataSource: 'YAHOO', dataSource: 'YAHOO',
holdings: [], holdings: [],
sectors: [ sectors: [
@ -313,6 +318,7 @@ export const holdings: PortfolioPosition[] = [
weight: 1 weight: 1
} }
], ],
currency: 'USD',
dataSource: 'YAHOO', dataSource: 'YAHOO',
holdings: [], holdings: [],
sectors: [ sectors: [
@ -377,6 +383,7 @@ export const holdings: PortfolioPosition[] = [
weight: 1 weight: 1
} }
], ],
currency: 'USD',
dataSource: 'YAHOO', dataSource: 'YAHOO',
holdings: [], holdings: [],
sectors: [ sectors: [

9
libs/ui/src/lib/services/data.service.ts

@ -69,10 +69,11 @@ import { Injectable } from '@angular/core';
import { SortDirection } from '@angular/material/sort'; import { SortDirection } from '@angular/material/sort';
import { utc } from '@date-fns/utc'; import { utc } from '@date-fns/utc';
import { import {
Account,
AccountBalance, AccountBalance,
DataSource, DataSource,
MarketData, MarketData,
Order as OrderModel, Order,
Tag Tag
} from '@prisma/client'; } from '@prisma/client';
import { format, parseISO } from 'date-fns'; import { format, parseISO } from 'date-fns';
@ -751,11 +752,11 @@ export class DataService {
} }
public postAccess(aAccess: CreateAccessDto) { public postAccess(aAccess: CreateAccessDto) {
return this.http.post<OrderModel>('/api/v1/access', aAccess); return this.http.post<Access>('/api/v1/access', aAccess);
} }
public postAccount(aAccount: CreateAccountDto) { public postAccount(aAccount: CreateAccountDto) {
return this.http.post<OrderModel>('/api/v1/account', aAccount); return this.http.post<Account>('/api/v1/account', aAccount);
} }
public postAccountBalance(aAccountBalance: CreateAccountBalanceDto) { public postAccountBalance(aAccountBalance: CreateAccountBalanceDto) {
@ -766,7 +767,7 @@ export class DataService {
} }
public postActivity(aOrder: CreateOrderDto) { public postActivity(aOrder: CreateOrderDto) {
return this.http.post<OrderModel>('/api/v1/activities', aOrder); return this.http.post<Order>('/api/v1/activities', aOrder);
} }
public postApiKey() { public postApiKey() {

Loading…
Cancel
Save