components/disagg-summary/disagg-summary.component.ts
Lists of disaggregation summaries from service response.
| changeDetection | ChangeDetectionStrategy.OnPush |
| host | { |
| selector | app-disagg-summary |
| imports |
MatDivider
MatList
MatListItem
MatIcon
MatButton
|
| templateUrl | ./disagg-summary.component.html |
| styleUrl | ./disagg-summary.component.scss |
Properties |
|
Methods |
|
Inputs |
| showExportButton | |
Default value : true
|
|
| Private dataValue | ||||||||
dataValue(data: number | string)
|
||||||||
|
Format data.
Parameters :
Returns :
number | string
|
| form |
Default value : this.service.formGroup
|
|
Form field state |
| service |
Default value : inject(AppService)
|
| Readonly showExportButton |
Default value : true
|
import {ChangeDetectionStrategy, Component, inject, input} from '@angular/core';
import {MatButton} from '@angular/material/button';
import {MatDivider} from '@angular/material/divider';
import {MatIcon} from '@angular/material/icon';
import {MatList, MatListItem} from '@angular/material/list';
import {
DisaggComponentData,
DisaggSummary,
DisaggSummaryData,
} from '@ghsc/nshmp-utils-ts/libs/nshmp-haz/www/disagg-service';
import {AppService} from '../../services/app.service';
interface ComponentData {
data: DisaggComponentData;
summaries: Summary[];
}
interface Summary {
data: DisaggSummaryData[];
summary: DisaggSummary;
}
/**
* Lists of disaggregation summaries from service response.
*/
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
host: {id: 'hazard-disagg-disagg-summary'},
imports: [MatDivider, MatList, MatListItem, MatIcon, MatButton],
selector: 'app-disagg-summary',
styleUrl: './disagg-summary.component.scss',
templateUrl: './disagg-summary.component.html',
})
export class DisaggSummaryComponent {
service = inject(AppService);
/** Disaggregation component data state */
readonly componentData = input.required<ComponentData, DisaggComponentData>({
transform: componentData => {
return {
data: componentData,
summaries: componentData?.summary.map(summary => ({
data: summary.data.map(data => {
data.value = this.dataValue(data.value);
return data;
}),
summary,
})),
};
},
});
readonly showExportButton = input(true);
/** Form field state */
form = this.service.formGroup;
/**
* Format data.
*
* @param data The data
*/
private dataValue(data: number | string): number | string {
if (typeof data === 'number' && data.toString().includes('.')) {
const split = data.toString().split('.');
if (split[0].length === 1 && split[1].length > 4) {
data = data.toExponential(3);
}
}
return data;
}
}
@if (componentData()) {
<div class="disagg-summaries">
<!-- Summaries -->
<div class="summary-group">
@if (showExportButton()) {
<div class="print-display-none">
<button
matButton="elevated"
class="primary"
(click)="service.saveSummary(componentData().data, form.getRawValue())"
>
<mat-icon>file_save</mat-icon>
Export as Text
</button>
</div>
<mat-divider />
}
<div class="grid-row">
@for (summaryData of componentData()?.summaries; track summaryData) {
<div
class="grid-col-12 mobile:grid-col-6 desktop-lg:grid-col-4 widescreen:grid-col-3 summary-values print-flex-basis-half"
>
<h4>{{ summaryData.summary.name }}</h4>
<mat-divider />
<mat-list>
@for (data of summaryData.data; track data) {
<mat-list-item>
<div class="list-item">
<span class="data-name">{{ data.name }}</span>
: {{ data.value }} {{ data.units }}
</div>
</mat-list-item>
}
</mat-list>
</div>
}
</div>
</div>
</div>
}