Browse Source

Refactoring

pull/2479/head
Thomas 2 years ago
parent
commit
88fae1d5ae
  1. 1
      apps/api/src/services/data-provider/data-provider.service.ts
  2. 3
      apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.scss
  3. 60
      apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts
  4. 34
      apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
  5. 3
      apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.module.ts

1
apps/api/src/services/data-provider/data-provider.service.ts

@ -15,7 +15,6 @@ import { UniqueAsset } from '@ghostfolio/common/interfaces';
import type { Granularity, UserWithSettings } from '@ghostfolio/common/types'; import type { Granularity, UserWithSettings } from '@ghostfolio/common/types';
import { Inject, Injectable, Logger } from '@nestjs/common'; import { Inject, Injectable, Logger } from '@nestjs/common';
import { DataSource, MarketData, SymbolProfile } from '@prisma/client'; import { DataSource, MarketData, SymbolProfile } from '@prisma/client';
import { data } from 'cheerio/lib/api/attributes';
import { format, isValid } from 'date-fns'; import { format, isValid } from 'date-fns';
import { groupBy, isEmpty, isNumber } from 'lodash'; import { groupBy, isEmpty, isNumber } from 'lodash';

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

@ -0,0 +1,3 @@
:host {
display: block;
}

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

@ -1,8 +1,6 @@
import { import {
ChangeDetectionStrategy, ChangeDetectionStrategy,
ChangeDetectorRef,
Component, Component,
Inject,
OnDestroy, OnDestroy,
OnInit OnInit
} from '@angular/core'; } from '@angular/core';
@ -21,37 +19,15 @@ import { AdminService } from '@ghostfolio/client/services/admin.service';
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
host: { class: 'h-100' }, host: { class: 'h-100' },
selector: 'gf-create-asset-profile-dialog', selector: 'gf-create-asset-profile-dialog',
styleUrls: ['./create-asset-profile-dialog.component.scss'],
templateUrl: 'create-asset-profile-dialog.html' templateUrl: 'create-asset-profile-dialog.html'
}) })
export class CreateAssetProfileDialog implements OnInit, OnDestroy { export class CreateAssetProfileDialog implements OnInit, OnDestroy {
private atLeastOneValid = (
control: AbstractControl
): ValidationErrors | null => {
const addSymbolControl = control.get('addSymbol');
const searchSymbolControl = control.get('searchSymbol');
if (addSymbolControl.valid && searchSymbolControl.valid) {
return { atLeastOneValid: true };
}
if (
!searchSymbolControl ||
!addSymbolControl ||
searchSymbolControl.valid ||
addSymbolControl.valid
) {
return { atLeastOneValid: false };
}
return { atLeastOneValid: true };
};
public createAssetProfileForm: FormGroup; public createAssetProfileForm: FormGroup;
public selectedOption: string; public mode: 'auto' | 'manual' = 'auto';
public constructor( public constructor(
public readonly adminService: AdminService, public readonly adminService: AdminService,
public readonly changeDetectorRef: ChangeDetectorRef,
public readonly dialogRef: MatDialogRef<CreateAssetProfileDialog>, public readonly dialogRef: MatDialogRef<CreateAssetProfileDialog>,
public readonly formBuilder: FormBuilder public readonly formBuilder: FormBuilder
) {} ) {}
@ -59,27 +35,27 @@ export class CreateAssetProfileDialog implements OnInit, OnDestroy {
public ngOnInit() { public ngOnInit() {
this.createAssetProfileForm = this.formBuilder.group( this.createAssetProfileForm = this.formBuilder.group(
{ {
searchSymbol: new FormControl(null, [Validators.required]), addSymbol: new FormControl(null, [Validators.required]),
addSymbol: new FormControl(null, [Validators.required]) searchSymbol: new FormControl(null, [Validators.required])
}, },
{ {
validators: this.atLeastOneValid validators: this.atLeastOneValid
} }
); );
this.selectedOption = 'auto'; this.mode = 'auto';
} }
public onCancel() { public onCancel() {
this.dialogRef.close(); this.dialogRef.close();
} }
public onRadioChange(option: string) { public onRadioChange(mode: 'auto' | 'manual') {
this.selectedOption = option; this.mode = mode;
} }
public onSubmit() { public onSubmit() {
this.selectedOption === 'auto' this.mode === 'auto'
? this.dialogRef.close({ ? this.dialogRef.close({
dataSource: dataSource:
this.createAssetProfileForm.controls['searchSymbol'].value this.createAssetProfileForm.controls['searchSymbol'].value
@ -94,4 +70,24 @@ export class CreateAssetProfileDialog implements OnInit, OnDestroy {
} }
public ngOnDestroy() {} public ngOnDestroy() {}
private atLeastOneValid(control: AbstractControl): ValidationErrors {
const addSymbolControl = control.get('addSymbol');
const searchSymbolControl = control.get('searchSymbol');
if (addSymbolControl.valid && searchSymbolControl.valid) {
return { atLeastOneValid: true };
}
if (
addSymbolControl.valid ||
!addSymbolControl ||
searchSymbolControl.valid ||
!searchSymbolControl
) {
return { atLeastOneValid: false };
}
return { atLeastOneValid: true };
}
} }

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

@ -9,30 +9,18 @@
<div class="my-2"> <div class="my-2">
<mat-radio-group <mat-radio-group
color="primary" color="primary"
formControlName="selectedOption" [value]="mode"
name="radioOptions" (change)="onRadioChange($event.value)"
> >
<mat-radio-button <mat-radio-button name="auto" value="auto"></mat-radio-button>
i18n <label class="m-0" for="auto" i18n>Search</label>
name="auto" <mat-radio-button class="ml-3" name="manual" value="manual">
value="auto"
[checked]="selectedOption==='auto'"
(click)="onRadioChange('auto')"
></mat-radio-button>
<label for="auto"> Search </label>
<mat-radio-button
i18n
name="manual"
style="margin-left: 10px"
value="manual"
(click)="onRadioChange('manual')"
>
</mat-radio-button> </mat-radio-button>
<label for="manual"> Add Manually </label> <label class="m-0" for="manual" i18n>Add Manually</label>
</mat-radio-group> </mat-radio-group>
</div> </div>
<div *ngIf="selectedOption === 'auto'"> <div *ngIf="mode === 'auto'">
<mat-form-field appearance="outline" class="w-100"> <mat-form-field appearance="outline" class="w-100">
<mat-label i18n>Name, symbol or ISIN</mat-label> <mat-label i18n>Name, symbol or ISIN</mat-label>
<gf-symbol-autocomplete <gf-symbol-autocomplete
@ -41,14 +29,10 @@
/> />
</mat-form-field> </mat-form-field>
</div> </div>
<div *ngIf="selectedOption === 'manual'"> <div *ngIf="mode === 'manual'">
<mat-form-field appearance="outline" class="w-100"> <mat-form-field appearance="outline" class="w-100">
<mat-label i18n>Symbol</mat-label> <mat-label i18n>Symbol</mat-label>
<input <input formControlName="addSymbol" matInput />
formControlName="addSymbol"
matInput
placeholder="Enter symbol"
/>
</mat-form-field> </mat-form-field>
</div> </div>
</div> </div>

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

@ -3,10 +3,9 @@ import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { MatDialogModule } from '@angular/material/dialog'; import { MatDialogModule } from '@angular/material/dialog';
import { MatInputModule } from '@angular/material/input';
import { MatFormFieldModule } from '@angular/material/form-field'; import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { MatRadioModule } from '@angular/material/radio'; import { MatRadioModule } from '@angular/material/radio';
import { GfSymbolAutocompleteModule } from '@ghostfolio/ui/symbol-autocomplete'; import { GfSymbolAutocompleteModule } from '@ghostfolio/ui/symbol-autocomplete';
import { CreateAssetProfileDialog } from './create-asset-profile-dialog.component'; import { CreateAssetProfileDialog } from './create-asset-profile-dialog.component';

Loading…
Cancel
Save