File

components/disagg-data/disagg-data.component.ts

Index

Properties

Properties

binData
binData: string[]
Type : string[]
data
data: DisaggData
Type : DisaggData
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));
  }
}

results matching ""

    No results matching ""