import { UpdateUserSettingDto } from '@ghostfolio/common/dtos'; import { PortfolioReportRule, RuleSettings, XRayRulesSettings } from '@ghostfolio/common/interfaces'; import { ChangeDetectionStrategy, Component, computed, DestroyRef, Input, output } from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { MatButtonModule } from '@angular/material/button'; import { MatDialog } from '@angular/material/dialog'; import { MatMenuModule } from '@angular/material/menu'; import { IonIcon } from '@ionic/angular/standalone'; import { addIcons } from 'ionicons'; import { addCircleOutline, checkmarkCircleOutline, ellipsisHorizontal, optionsOutline, removeCircleOutline, warningOutline } from 'ionicons/icons'; import { DeviceDetectorService } from 'ngx-device-detector'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { RuleSettingsDialogParams } from './rule-settings-dialog/interfaces/interfaces'; import { GfRuleSettingsDialogComponent } from './rule-settings-dialog/rule-settings-dialog.component'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, imports: [IonIcon, MatButtonModule, MatMenuModule, NgxSkeletonLoaderModule], selector: 'gf-rule', styleUrls: ['./rule.component.scss'], templateUrl: './rule.component.html' }) export class GfRuleComponent { @Input() categoryName: string; @Input() hasPermissionToUpdateUserSettings: boolean; @Input() isLoading: boolean; @Input() locale?: string; @Input() rule: PortfolioReportRule; @Input() settings: XRayRulesSettings['AccountClusterRiskCurrentInvestment']; public readonly ruleUpdated = output(); private readonly deviceType = computed(() => { return this.deviceDetectorService.deviceInfo().deviceType; }); public constructor( private destroyRef: DestroyRef, private deviceDetectorService: DeviceDetectorService, private dialog: MatDialog ) { addIcons({ addCircleOutline, checkmarkCircleOutline, ellipsisHorizontal, optionsOutline, removeCircleOutline, warningOutline }); } protected onCustomizeRule(rule: PortfolioReportRule) { const dialogRef = this.dialog.open< GfRuleSettingsDialogComponent, RuleSettingsDialogParams >(GfRuleSettingsDialogComponent, { data: { rule, categoryName: this.categoryName, locale: this.locale, settings: this.settings }, width: this.deviceType() === 'mobile' ? '100vw' : '50rem' }); dialogRef .afterClosed() .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe((settings: RuleSettings) => { if (settings) { this.ruleUpdated.emit({ xRayRules: { [rule.key]: settings } }); } }); } protected onUpdateRule(rule: PortfolioReportRule) { const settings: UpdateUserSettingDto = { xRayRules: { [rule.key]: { isActive: !rule.isActive } } }; this.ruleUpdated.emit(settings); } }