File

components/control-panel/control-panel.component.ts

Description

Form fields for turning on and off different map layers.

Implements

OnInit

Metadata

Index

Properties
Methods

Methods

ngOnInit
ngOnInit()
Returns : void
Private onHazardTileYear
onHazardTileYear()
Returns : void
Private onHazardToggle
onHazardToggle()
Returns : void
Private onModelChange
onModelChange()
Returns : void

Properties

Private destroyRef
Default value : inject(DestroyRef)
formGroup
Default value : this.service.formGroup

Form field state

imts
Type : Set<Imt>
Default value : new Set()

Available IMTs for hazard map tiles

returnPeriods
Type : Set<ReturnPeriod>
Default value : new Set()

Available return periods for hazard map tiles

service
Default value : inject(AppService)
years
Type : Set<number>
Default value : new Set()

Available years for hazard map tiles

import {Component, DestroyRef, inject, OnInit} from '@angular/core';
import {takeUntilDestroyed} from '@angular/core/rxjs-interop';
import {ReactiveFormsModule} from '@angular/forms';
import {MatOption} from '@angular/material/core';
import {MatFormField, MatLabel} from '@angular/material/form-field';
import {MatIconModule} from '@angular/material/icon';
import {MatSelect, MatSelectModule} from '@angular/material/select';
import {MatSlideToggle} from '@angular/material/slide-toggle';
import {MatSliderModule} from '@angular/material/slider';
import {NshmpHazardModelFormComponent} from '@ghsc/nshmp-lib-ng/hazard';
import {NshmpMapNshmFeaturesComponent} from '@ghsc/nshmp-lib-ng/map';
import {NshmpSectionComponent, ReturnPeriod} from '@ghsc/nshmp-lib-ng/nshmp';
import {Imt} from '@ghsc/nshmp-utils-ts/libs/nshmp-lib/gmm';
import {nshmYear} from '@ghsc/nshmp-utils-ts/libs/nshmp-lib/nshm';

import {AppService} from '../../services/app.service';

/**
 * Form fields for turning on and off different map layers.
 */
@Component({
  imports: [
    NshmpHazardModelFormComponent,
    MatLabel,
    MatSlideToggle,
    MatFormField,
    MatSelect,
    MatOption,
    ReactiveFormsModule,
    MatIconModule,
    MatSelectModule,
    MatSliderModule,
    NshmpSectionComponent,
    NshmpMapNshmFeaturesComponent,
  ],
  selector: 'app-control-panel',
  styleUrl: './control-panel.component.scss',
  templateUrl: './control-panel.component.html',
})
export class ControlPanelComponent implements OnInit {
  service = inject(AppService);
  private destroyRef = inject(DestroyRef);

  /** Form field state */
  formGroup = this.service.formGroup;

  /** Available IMTs for hazard map tiles */
  imts: Set<Imt> = new Set();

  /** Available return periods for hazard map tiles */
  returnPeriods: Set<ReturnPeriod> = new Set();

  /** Available years for hazard map tiles */
  years: Set<number> = new Set();

  ngOnInit(): void {
    const controls = this.formGroup.controls;

    controls.model.valueChanges
      .pipe(takeUntilDestroyed(this.destroyRef))
      .subscribe(() => this.onModelChange());
    controls.hazardTileImt.valueChanges
      .pipe(takeUntilDestroyed(this.destroyRef))
      .subscribe(() => this.service.createHazardLayer());
    controls.hazardTileReturnPeriod.valueChanges
      .pipe(takeUntilDestroyed(this.destroyRef))
      .subscribe(() => this.service.createHazardLayer());
    controls.hazardTileYear.valueChanges
      .pipe(takeUntilDestroyed(this.destroyRef))
      .subscribe(() => this.onHazardTileYear());
    controls.hasHazardTiles.valueChanges
      .pipe(takeUntilDestroyed(this.destroyRef))
      .subscribe(() => this.onHazardToggle());
    controls.overlayOpacity.valueChanges
      .pipe(takeUntilDestroyed(this.destroyRef))
      .subscribe(() => this.service.createHazardLayer());
  }

  private onHazardTileYear(): void {
    this.imts = new Set(
      this.service
        .filterTilesByYear(this.service.hazardTiles(), this.formGroup.getRawValue())
        .map(tile => tile.imt),
    );
    this.returnPeriods = new Set(
      this.service
        .filterTilesByImt(this.service.hazardTiles(), this.formGroup.getRawValue())
        .map(tile => tile.returnPeriod),
    );

    this.service.createHazardLayer();
  }

  private onHazardToggle(): void {
    const layer = this.service.layers().hazardLayer;
    this.service.createHazardLayer(layer);
  }

  private onModelChange(): void {
    this.years = new Set(
      this.service
        .filterTilesByRegion(this.service.hazardTiles(), this.formGroup.getRawValue())
        .map(tile => nshmYear(tile.nshm)),
    );
    this.service.resetState();
  }
}
<form [formGroup]="formGroup" class="height-full overflow-auto">
  <nshmp-section label="Model Layers">
    <nshmp-hazard-model-form
      [modelControl]="formGroup.controls.model"
      [models]="service.availableModels()"
    />

    <nshmp-map-nshm-features
      [formGroup]="service.formGroup"
      [map]="service.map"
      [nshm]="service.nshmService()"
    />

    <!-- Hazard map layer toggle -->
    @if (service.formGroup.controls.hasHazardTiles.enabled) {
      <div>
        <div class="grid-col-12 layer-toggle hazard-layer">
          <mat-slide-toggle [formControl]="formGroup.controls.hasHazardTiles">
            Hazard Map
          </mat-slide-toggle>
        </div>

        <div class="margin-left-4">
          <!-- Hazard map year -->
          <div class="grid-col-12">
            <mat-form-field>
              <mat-label>Year</mat-label>
              <mat-select [formControl]="formGroup.controls.hazardTileYear">
                @for (year of years; track year) {
                  <mat-option [value]="year">
                    {{ year }}
                  </mat-option>
                }
              </mat-select>
            </mat-form-field>
          </div>

          <!-- Hazard map imt -->
          <div class="grid-col-12">
            <mat-form-field>
              <mat-label>IMT</mat-label>
              <mat-select [formControl]="formGroup.controls.hazardTileImt">
                @for (imt of imts; track imt) {
                  <mat-option [value]="imt">
                    {{ imt }}
                  </mat-option>
                }
              </mat-select>
            </mat-form-field>
          </div>

          <!-- Hazard map return period -->
          <div class="grid-col-12">
            <mat-form-field>
              <mat-label>Return Period</mat-label>
              <mat-select [formControl]="formGroup.controls.hazardTileReturnPeriod">
                @for (returnPeriod of returnPeriods; track returnPeriod) {
                  <mat-option [value]="returnPeriod">
                    {{ returnPeriod }}
                  </mat-option>
                }
              </mat-select>
            </mat-form-field>

            <div>
              <mat-label>Hazard Map Opacity</mat-label>
              <mat-slider discrete min="0" max="100">
                <input matSliderThumb [formControl]="formGroup.controls.overlayOpacity" />
              </mat-slider>
            </div>
          </div>
        </div>
      </div>
    }
  </nshmp-section>
</form>
Legend
Html element
Component
Html element with directive

results matching ""

    No results matching ""