mirror of https://github.com/ghostfolio/ghostfolio
15 changed files with 10 additions and 196 deletions
@ -1,45 +0,0 @@ |
|||
<ng-container *ngIf="value || value === 0 || value === null"> |
|||
<div |
|||
class="d-flex" |
|||
[ngClass]="position === 'end' ? 'justify-content-end' : ''" |
|||
> |
|||
<ng-container *ngIf="isNumber || value === null"> |
|||
<div *ngIf="colorizeSign && value > 0" class="mr-1 text-success">+</div> |
|||
<div *ngIf="colorizeSign && value < 0" class="mr-1 text-danger">-</div> |
|||
<div *ngIf="isPercent" [ngClass]="size === 'medium' ? 'h4 mb-0' : ''"> |
|||
{{ formattedValue }}% |
|||
</div> |
|||
<div *ngIf="!isPercent" [ngClass]="size === 'medium' ? 'h4 mb-0' : ''"> |
|||
<ng-container *ngIf="value === null"> |
|||
<span class="text-monospace text-muted">***</span> |
|||
</ng-container> |
|||
<ng-container *ngIf="value !== null"> |
|||
{{ formattedValue }} |
|||
</ng-container> |
|||
</div> |
|||
<small *ngIf="currency && size === 'medium'" class="ml-1"> |
|||
{{ currency }} |
|||
</small> |
|||
<div *ngIf="currency && size !== 'medium'" class="ml-1"> |
|||
{{ currency }} |
|||
</div> |
|||
</ng-container> |
|||
<ng-container *ngIf="isDate"> |
|||
<div [ngClass]="size === 'medium' ? 'h4 mb-0' : ''"> |
|||
{{ formattedDate }} |
|||
</div> |
|||
</ng-container> |
|||
</div> |
|||
<small *ngIf="label"> |
|||
{{ label }} |
|||
</small> |
|||
</ng-container> |
|||
|
|||
<ngx-skeleton-loader |
|||
*ngIf="value === undefined" |
|||
animation="pulse" |
|||
[theme]="{ |
|||
height: '1.5rem', |
|||
width: '5rem' |
|||
}" |
|||
></ngx-skeleton-loader> |
@ -1,5 +0,0 @@ |
|||
:host { |
|||
display: flex; |
|||
flex-direction: column; |
|||
font-variant-numeric: tabular-nums; |
|||
} |
@ -1,111 +0,0 @@ |
|||
import { |
|||
ChangeDetectionStrategy, |
|||
Component, |
|||
Input, |
|||
OnChanges, |
|||
OnInit |
|||
} from '@angular/core'; |
|||
import { DEFAULT_DATE_FORMAT } from '@ghostfolio/common/config'; |
|||
import { format, isDate } from 'date-fns'; |
|||
import { isNumber } from 'lodash'; |
|||
|
|||
@Component({ |
|||
selector: 'gf-value', |
|||
changeDetection: ChangeDetectionStrategy.OnPush, |
|||
templateUrl: './value.component.html', |
|||
styleUrls: ['./value.component.scss'] |
|||
}) |
|||
export class ValueComponent implements OnChanges, OnInit { |
|||
@Input() colorizeSign: boolean; |
|||
@Input() currency: string; |
|||
@Input() isCurrency: boolean; |
|||
@Input() isInteger: boolean; |
|||
@Input() isPercent: boolean; |
|||
@Input() label: string; |
|||
@Input() locale: string; |
|||
@Input() position: string; |
|||
@Input() size: string; |
|||
@Input() value: number | string; |
|||
|
|||
public absoluteValue: number; |
|||
public formattedDate: string; |
|||
public formattedValue: string; |
|||
public isDate: boolean; |
|||
public isNumber: boolean; |
|||
public useAbsoluteValue = false; |
|||
|
|||
public constructor() {} |
|||
|
|||
public ngOnInit() {} |
|||
|
|||
public ngOnChanges() { |
|||
if (this.value || this.value === 0) { |
|||
if (isNumber(this.value)) { |
|||
this.isDate = false; |
|||
this.isNumber = true; |
|||
this.absoluteValue = Math.abs(<number>this.value); |
|||
|
|||
if (this.colorizeSign) { |
|||
this.useAbsoluteValue = true; |
|||
if (this.currency || this.isCurrency) { |
|||
try { |
|||
this.formattedValue = this.absoluteValue.toLocaleString( |
|||
this.locale, |
|||
{ |
|||
maximumFractionDigits: 2, |
|||
minimumFractionDigits: 2 |
|||
} |
|||
); |
|||
} catch {} |
|||
} else if (this.isPercent) { |
|||
try { |
|||
this.formattedValue = (this.absoluteValue * 100).toLocaleString( |
|||
this.locale, |
|||
{ |
|||
maximumFractionDigits: 2, |
|||
minimumFractionDigits: 2 |
|||
} |
|||
); |
|||
} catch {} |
|||
} |
|||
} else if (this.isPercent) { |
|||
try { |
|||
this.formattedValue = (this.value * 100).toLocaleString( |
|||
this.locale, |
|||
{ |
|||
maximumFractionDigits: 2, |
|||
minimumFractionDigits: 2 |
|||
} |
|||
); |
|||
} catch {} |
|||
} else if (this.currency || this.isCurrency) { |
|||
try { |
|||
this.formattedValue = this.value?.toLocaleString(this.locale, { |
|||
maximumFractionDigits: 2, |
|||
minimumFractionDigits: 2 |
|||
}); |
|||
} catch {} |
|||
} else if (this.isInteger) { |
|||
try { |
|||
this.formattedValue = this.value?.toLocaleString(this.locale, { |
|||
maximumFractionDigits: 0, |
|||
minimumFractionDigits: 0 |
|||
}); |
|||
} catch {} |
|||
} |
|||
} else { |
|||
try { |
|||
if (isDate(new Date(this.value))) { |
|||
this.isDate = true; |
|||
this.isNumber = false; |
|||
|
|||
this.formattedDate = format( |
|||
new Date(<string>this.value), |
|||
DEFAULT_DATE_FORMAT |
|||
); |
|||
} |
|||
} catch {} |
|||
} |
|||
} |
|||
} |
|||
} |
@ -1,13 +0,0 @@ |
|||
import { CommonModule } from '@angular/common'; |
|||
import { NgModule } from '@angular/core'; |
|||
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; |
|||
|
|||
import { ValueComponent } from './value.component'; |
|||
|
|||
@NgModule({ |
|||
declarations: [ValueComponent], |
|||
exports: [ValueComponent], |
|||
imports: [CommonModule, NgxSkeletonLoaderModule], |
|||
providers: [] |
|||
}) |
|||
export class GfValueModule {} |
@ -1 +1 @@ |
|||
export * from './lib/ui.module'; |
|||
export * from './lib/value/value.module'; |
|||
|
@ -1,12 +0,0 @@ |
|||
import { CommonModule } from '@angular/common'; |
|||
import { NgModule } from '@angular/core'; |
|||
|
|||
import { ValueComponent } from './value/value.component'; |
|||
// import { GfValueModule } from './value/value.module';
|
|||
|
|||
@NgModule({ |
|||
imports: [CommonModule /*, GfValueModule*/], |
|||
declarations: [ValueComponent], |
|||
exports: [ValueComponent] |
|||
}) |
|||
export class UiModule {} |
Loading…
Reference in new issue