File

/home/workflows/workspace/libs/design-system/data-viewer/src/lib/data-viewer.component.ts

Description

Data viewer component

Metadata

Index

Properties
Methods
Inputs
Outputs

Constructor

constructor()

constructor to set the release version and organ from the model from effect

Inputs

githubIconsUrl
Type : string
Required :  true

Link to the HRA Organ Icons GitHub repository

organ
Type : string

model signal for the organ

releaseVersion
Type : string

model signal for the release version

releaseVersionData
Type : ReleaseVersionData[]
Required :  true

Release versions to include in the data viewer

variant
Type : DataViewerVariant
Required :  true

Data viewer variant

Outputs

organ
Type : string

model signal for the organ

releaseVersion
Type : string

model signal for the release version

Methods

getCardFeatureId
getCardFeatureId(card: ViewerCard)

Get a feature name for a card

Parameters :
Name Type Optional Description
card ViewerCard No

Card data

Returns : string

A feature name

Properties

Protected Readonly organ_
Type : unknown
Default value : computed(() => { const releaseVersion = this.releaseVersion_(); const organ = this.organ() ?? releaseVersion.organData[0].label; return releaseVersion.organData.find((item) => item.label === organ) ?? undefined; })

Current organ selected

Protected Readonly releaseVersion_
Type : unknown
Default value : computed(() => { const releaseVersion = this.releaseVersion(); const data = this.releaseVersionData(); return data.find((item) => item.version === releaseVersion) ?? data[0]; })

Current selected release version

import { ChangeDetectionStrategy, Component, computed, effect, input, model } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { MatDividerModule } from '@angular/material/divider';
import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu';
import { MatSelectModule } from '@angular/material/select';
import { HraCommonModule } from '@hra-ui/common';
import { ButtonsModule } from '@hra-ui/design-system/buttons';
import { ExpansionPanelModule } from '@hra-ui/design-system/expansion-panel';
import { IconsModule } from '@hra-ui/design-system/icons';
import { PlainTooltipDirective } from '@hra-ui/design-system/tooltips/plain-tooltip';
import { DataViewerVariant, ReleaseVersionData, ViewerCard } from './types/data-viewer.schema';
import { ViewerCardComponent } from './viewer-card/viewer-card.component';
import { ViewerMenuComponent } from './viewer-menu/viewer-menu.component';

/**
 * Data viewer component
 */
@Component({
  selector: 'hra-data-viewer',
  imports: [
    HraCommonModule,
    ButtonsModule,
    ExpansionPanelModule,
    FormsModule,
    IconsModule,
    MatDividerModule,
    MatIconModule,
    MatMenuModule,
    MatSelectModule,
    PlainTooltipDirective,
    ViewerCardComponent,
    ViewerMenuComponent,
  ],
  templateUrl: './data-viewer.component.html',
  styleUrl: './data-viewer.component.scss',
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class DataViewerComponent {
  /** Release versions to include in the data viewer*/
  readonly releaseVersionData = input.required<ReleaseVersionData[]>();

  /** Data viewer variant */
  readonly variant = input.required<DataViewerVariant>();

  /** Link to the HRA Organ Icons GitHub repository */
  readonly githubIconsUrl = input.required<string>();

  /** model signal for the release version */
  readonly releaseVersion = model<string>();

  /** model signal for the organ */
  readonly organ = model<string>();

  /** Current selected release version */
  protected readonly releaseVersion_ = computed(() => {
    const releaseVersion = this.releaseVersion();
    const data = this.releaseVersionData();
    return data.find((item) => item.version === releaseVersion) ?? data[0];
  });

  /** Current organ selected */
  protected readonly organ_ = computed(() => {
    const releaseVersion = this.releaseVersion_();
    const organ = this.organ() ?? releaseVersion.organData[0].label;
    return releaseVersion.organData.find((item) => item.label === organ) ?? undefined;
  });

  /** constructor to set the release version and organ from the model from effect*/
  constructor() {
    effect(() => {
      const releaseVersion = this.releaseVersion_();
      this.releaseVersion.set(releaseVersion.version);
    });

    effect(() => {
      const organ = this.organ_();
      this.organ.set(organ?.label ?? '');
    });
  }

  /**
   * Get a feature name for a card
   *
   * @param card Card data
   * @returns A feature name
   */
  getCardFeatureId(card: ViewerCard): string {
    const url = card.sourceDataUrl;
    const endIndex = url.lastIndexOf('/');
    const startIndex = url.lastIndexOf('/', endIndex - 1) + 1;
    return url.slice(startIndex, endIndex);
  }
}
<ng-container hraFeature="data-viewer">
  <div class="header" hraFeature="header">
    <div class="logos">
      @let productIcon = variant() === 'ftu' ? 'product:ftu' : 'product:3d-organ';
      <hra-icon [svgIcon]="productIcon" />
      <hra-icon [svgIcon]="organ_()?.icon" />
    </div>
    <span class="header-label">
      @if (variant() === 'ftu') {
        Functional Tissue Units
      } @else {
        3D Organs
      }
    </span>
    <button
      mat-icon-button
      hraFeature="menu"
      hraClickEvent
      hraIconButtonSize="large"
      aria-label="Open the data viewer's menu"
      hraPlainTooltip="More"
      [matMenuTriggerFor]="viewermenu.menu()"
    >
      <mat-icon>more_vert</mat-icon>
    </button>

    <hra-viewer-menu
      hraFeature="menu"
      [currentVersion]="releaseVersion_()"
      [githubIconsUrl]="githubIconsUrl()"
      #viewermenu
    />
  </div>
  <div class="content">
    <div class="text-fields" hraFeature="data-selectors">
      <mat-form-field class="select" hraFeature="release-version" subscriptSizing="dynamic">
        <mat-icon matPrefix class="search-icon">search</mat-icon>
        <mat-label>Release version</mat-label>
        <mat-select
          panelClass="options-container"
          disableRipple
          [hraModelChangeEvent]="['version']"
          [ngModel]="releaseVersion_()"
          (ngModelChange)="releaseVersion.set($event.version)"
        >
          <mat-select-trigger>{{ releaseVersion_().label }}</mat-select-trigger>
          @for (dataset of releaseVersionData(); track dataset) {
            <mat-option [value]="dataset">
              <div class="release-label">
                <span class="release-name">{{ dataset.label }}</span>
                <span class="release-date">{{ dataset.date }}</span>
              </div>
            </mat-option>
          }
        </mat-select>
      </mat-form-field>

      <mat-form-field class="select" hraFeature="organ" subscriptSizing="dynamic">
        <mat-icon matPrefix class="search-icon">search</mat-icon>
        <mat-label>Organ</mat-label>
        <mat-select
          class="organ-selector"
          panelClass="options-container"
          disableRipple
          [hraModelChangeEvent]="['label']"
          [ngModel]="organ_()"
          (ngModelChange)="organ.set($event.label)"
        >
          @for (organ of releaseVersion_().organData; track organ) {
            <mat-option [value]="organ">{{ organ.label }}</mat-option>
          }
        </mat-select>
        @if (organ_() === undefined) {
          <mat-hint>Please select an organ from this release</mat-hint>
        }
      </mat-form-field>
    </div>

    <div class="viewer-cards" hraFeature="cards">
      @for (viewerCard of organ_()?.cards; track viewerCard) {
        <hra-viewer-card
          [hraFeature]="getCardFeatureId(viewerCard)"
          [variant]="variant()"
          [viewerCardData]="viewerCard"
        />
      }
    </div>
  </div>
</ng-container>
Legend
Html element
Component
Html element with directive

results matching ""

    No results matching ""