Browse Source

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

pull/5848/head
Germán Martín 5 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/),
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
### 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 }) => {
return id === userId;
return id === aUserId;
});
if (!userData) {
@ -293,6 +293,7 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit {
data: {
userData,
deviceType: this.deviceType,
hasPermissionForSubscription: this.hasPermissionForSubscription,
locale: this.user?.settings?.locale
} as UserDetailDialogParams,
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() hasPermissionToUpdateUserSettings: boolean;
@Input() isLoading: boolean;
@Input() locale: string;
@Input() rule: PortfolioReportRule;
@Input() settings: XRayRulesSettings['AccountClusterRiskCurrentInvestment'];
@ -82,6 +83,7 @@ export class GfRuleComponent implements OnInit {
data: {
rule,
categoryName: this.categoryName,
locale: this.locale,
settings: this.settings
} as RuleSettingsDialogParams,
width: this.deviceType === 'mobile' ? '100vw' : '50rem'

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

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

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

@ -26,6 +26,7 @@ export class GfRulesComponent {
@Input() categoryName: string;
@Input() hasPermissionToUpdateUserSettings: boolean;
@Input() isLoading: boolean;
@Input() locale: string;
@Input() rules: PortfolioReportRule[];
@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 {
deviceType: string;
hasPermissionForSubscription: boolean;
locale: string;
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="mb-3 row">
<div class="col-6 mb-3">
<gf-value i18n size="medium" [value]="data.userData.id"
>User ID</gf-value
>
<gf-value i18n size="medium" [value]="data.userData.id">
User ID
</gf-value>
</div>
<div class="col-6 mb-3">
<gf-value
@ -19,10 +19,75 @@
[isDate]="true"
[locale]="data.locale"
[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>

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

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

Loading…
Cancel
Save