File
|
binData
|
binData: string[]
|
Type : string[]
|
import {ChangeDetectionStrategy, Component, computed, inject, input, Signal} from '@angular/core';
import {MatButton} from '@angular/material/button';
import {MatDivider} from '@angular/material/divider';
import {MatIcon} from '@angular/material/icon';
import {
DisaggComponentData,
DisaggData,
DisaggSummary,
} from '@ghsc/nshmp-utils-ts/libs/nshmp-haz/www/disagg-service';
import {AppService} from '../../services/app.service';
interface ComponentData {
data: Data[];
summary: DisaggSummary[];
}
interface Data {
binData: string[];
data: DisaggData;
}
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
host: {id: 'hazard-disagg-disagg-data'},
imports: [MatDivider, MatButton, MatIcon],
selector: 'app-disagg-data',
styleUrl: './disagg-data.component.scss',
templateUrl: './disagg-data.component.html',
})
export class DisaggDataComponent {
service = inject(AppService);
/** Disaggregation component data state */
readonly componentData = input.required<ComponentData, DisaggComponentData>({
transform: componentData => {
if (componentData) {
return {
data: componentData.data.map(data => ({
binData: this.toBinData(data),
data,
})),
summary: componentData.summary,
};
} else {
return undefined;
}
},
});
readonly showExportButton = input(true);
metadata = computed(() => this.service.serviceResponse().response.metadata);
readonly epsilonKeys: Signal<string[]> = computed(() => {
const componentData = this.componentData();
if (componentData) {
const keys = componentData.summary.find(data => data.name.toLowerCase() === 'epsilon keys');
return ['ALL_ε', ...keys.data.map(data => `${data.name}=${data.value}`)];
} else {
return [];
}
});
private toBinData(data: DisaggData): string[] {
const bins = this.service.serviceResponse().response.metadata.εbins;
const binData = bins.map(bin => data.εdata.find(data => data.εbin === bin.id)?.value ?? 0);
const total = binData.reduce((a, b) => a + b, 0);
return [total, ...binData].map(num => num.toExponential(2));
}
}