Browse Source

Merge remote-tracking branch 'upstream/main' into feature/public-access-filter

pull/5848/head
Germán Martín 6 days ago
parent
commit
93fe8d6965
  1. 10
      CHANGELOG.md
  2. 5
      apps/client/src/app/components/admin-users/admin-users.component.ts
  3. 2
      apps/client/src/app/components/rule/rule.component.ts
  4. 1
      apps/client/src/app/components/rules/rules.component.html
  5. 1
      apps/client/src/app/components/rules/rules.component.ts
  6. 1
      apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts
  7. 73
      apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
  8. 2
      apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html

10
CHANGELOG.md

@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## Unreleased
### Added
- Extended the user detail dialog in the users section of the admin control panel
### Fixed
- Ensured the locale is available in the settings dialog to customize the rule thresholds of the _X-ray_ page
## 2.211.0 - 2025-10-25 ## 2.211.0 - 2025-10-25
### Added ### Added

5
apps/client/src/app/components/admin-users/admin-users.component.ts

@ -278,9 +278,9 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit {
}); });
} }
private openUserDetailDialog(userId: string) { private openUserDetailDialog(aUserId: string) {
const userData = this.dataSource.data.find(({ id }) => { const userData = this.dataSource.data.find(({ id }) => {
return id === userId; return id === aUserId;
}); });
if (!userData) { if (!userData) {
@ -293,6 +293,7 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit {
data: { data: {
userData, userData,
deviceType: this.deviceType, deviceType: this.deviceType,
hasPermissionForSubscription: this.hasPermissionForSubscription,
locale: this.user?.settings?.locale locale: this.user?.settings?.locale
} as UserDetailDialogParams, } as UserDetailDialogParams,
height: this.deviceType === 'mobile' ? '98vh' : '60vh', height: this.deviceType === 'mobile' ? '98vh' : '60vh',

2
apps/client/src/app/components/rule/rule.component.ts

@ -51,6 +51,7 @@ export class GfRuleComponent implements OnInit {
@Input() categoryName: string; @Input() categoryName: string;
@Input() hasPermissionToUpdateUserSettings: boolean; @Input() hasPermissionToUpdateUserSettings: boolean;
@Input() isLoading: boolean; @Input() isLoading: boolean;
@Input() locale: string;
@Input() rule: PortfolioReportRule; @Input() rule: PortfolioReportRule;
@Input() settings: XRayRulesSettings['AccountClusterRiskCurrentInvestment']; @Input() settings: XRayRulesSettings['AccountClusterRiskCurrentInvestment'];
@ -82,6 +83,7 @@ export class GfRuleComponent implements OnInit {
data: { data: {
rule, rule,
categoryName: this.categoryName, categoryName: this.categoryName,
locale: this.locale,
settings: this.settings settings: this.settings
} as RuleSettingsDialogParams, } as RuleSettingsDialogParams,
width: this.deviceType === 'mobile' ? '100vw' : '50rem' width: this.deviceType === 'mobile' ? '100vw' : '50rem'

1
apps/client/src/app/components/rules/rules.component.html

@ -12,6 +12,7 @@
[hasPermissionToUpdateUserSettings]=" [hasPermissionToUpdateUserSettings]="
hasPermissionToUpdateUserSettings hasPermissionToUpdateUserSettings
" "
[locale]="locale"
[rule]="rule" [rule]="rule"
[settings]="settings?.[rule.key]" [settings]="settings?.[rule.key]"
(ruleUpdated)="onRuleUpdated($event)" (ruleUpdated)="onRuleUpdated($event)"

1
apps/client/src/app/components/rules/rules.component.ts

@ -26,6 +26,7 @@ export class GfRulesComponent {
@Input() categoryName: string; @Input() categoryName: string;
@Input() hasPermissionToUpdateUserSettings: boolean; @Input() hasPermissionToUpdateUserSettings: boolean;
@Input() isLoading: boolean; @Input() isLoading: boolean;
@Input() locale: string;
@Input() rules: PortfolioReportRule[]; @Input() rules: PortfolioReportRule[];
@Input() settings: XRayRulesSettings; @Input() settings: XRayRulesSettings;

1
apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts

@ -2,6 +2,7 @@ import { AdminUsers } from '@ghostfolio/common/interfaces';
export interface UserDetailDialogParams { export interface UserDetailDialogParams {
deviceType: string; deviceType: string;
hasPermissionForSubscription: boolean;
locale: string; locale: string;
userData: AdminUsers['users'][0]; userData: AdminUsers['users'][0];
} }

73
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html

@ -8,9 +8,9 @@
<div class="container p-0"> <div class="container p-0">
<div class="mb-3 row"> <div class="mb-3 row">
<div class="col-6 mb-3"> <div class="col-6 mb-3">
<gf-value i18n size="medium" [value]="data.userData.id" <gf-value i18n size="medium" [value]="data.userData.id">
>User ID</gf-value User ID
> </gf-value>
</div> </div>
<div class="col-6 mb-3"> <div class="col-6 mb-3">
<gf-value <gf-value
@ -19,10 +19,75 @@
[isDate]="true" [isDate]="true"
[locale]="data.locale" [locale]="data.locale"
[value]="data.userData.createdAt" [value]="data.userData.createdAt"
>Registration Date</gf-value
> >
Registration Date
</gf-value>
</div>
</div>
<div class="mb-3 row">
<div class="col-6 mb-3">
<gf-value i18n size="medium" [value]="data.userData.role">
Role
</gf-value>
</div>
@if (data.hasPermissionForSubscription) {
<div class="col-6 mb-3">
<gf-value i18n size="medium" [value]="data.userData.country">
Country
</gf-value>
</div>
}
</div>
<div class="mb-3 row">
<div class="col-6 mb-3">
<gf-value
i18n
size="medium"
[locale]="data.locale"
[value]="data.userData.accountCount"
>
Accounts
</gf-value>
</div>
<div class="col-6 mb-3">
<gf-value
i18n
size="medium"
[locale]="data.locale"
[value]="data.userData.activityCount"
>
Activities
</gf-value>
</div>
</div>
@if (data.hasPermissionForSubscription) {
<div class="mb-3 row">
<div class="col-6 mb-3">
<gf-value
i18n
size="medium"
[locale]="data.locale"
[precision]="0"
[value]="data.userData.engagement"
>
Engagement per Day
</gf-value>
</div>
<div class="col-6 mb-3">
<gf-value
i18n
size="medium"
[locale]="data.locale"
[value]="data.userData.dailyApiRequests"
>
API Requests Today
</gf-value>
</div> </div>
</div> </div>
}
</div> </div>
</div> </div>

2
apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html

@ -76,6 +76,7 @@
!hasImpersonationId && hasPermissionToUpdateUserSettings !hasImpersonationId && hasPermissionToUpdateUserSettings
" "
[isLoading]="isLoading" [isLoading]="isLoading"
[locale]="user?.settings?.locale"
[rules]="category.rules" [rules]="category.rules"
[settings]="user?.settings?.xRayRules" [settings]="user?.settings?.xRayRules"
(rulesUpdated)="onRulesUpdated($event)" (rulesUpdated)="onRulesUpdated($event)"
@ -90,6 +91,7 @@
!hasImpersonationId && hasPermissionToUpdateUserSettings !hasImpersonationId && hasPermissionToUpdateUserSettings
" "
[isLoading]="isLoading" [isLoading]="isLoading"
[locale]="user?.settings?.locale"
[rules]="inactiveRules" [rules]="inactiveRules"
[settings]="user?.settings?.xRayRules" [settings]="user?.settings?.xRayRules"
(rulesUpdated)="onRulesUpdated($event)" (rulesUpdated)="onRulesUpdated($event)"

Loading…
Cancel
Save