Skip to content

Phenopacket Loader Component ​

The PhenopacketLoaderComponent provides a clean, standalone drop-and-load file interface designed to handle drag-and-drop actions or native browse selections of GA4GH Phenopacket JSON profiles.

Basic Implementation ​

To maintain clean separation of concerns and avoid coupling your component library to explicit system wrappers, this widget delegates processing logic to a callback handler passed into an explicit Angular signal input.

Component Controller Configuration ​

typescript
import { Component, signal } from '@angular/core';
import { PhenopacketLoaderComponent } from 'ng-hpo-uikit';
import { invoke } from '@tauri-apps/api/core';

@Component({
  selector: 'app-new-case-workspace',
  standalone: true,
  imports: [PhenopacketLoaderComponent],
  templateUrl: './new-case-workspace.component.html'
})
export class NewCaseWorkspaceComponent {
  public statusMessage = signal<string | null>(null);
  public isProcessing = signal<boolean>(false);

  /**
   * Agnostic callback pipeline passed into the library component.
   * Defined as an arrow function to preserve class contextual execution bounds safely.
   */
  public handleBackendIngest = async (payload: string): Promise<void> => {
    try {
      this.isProcessing.set(true);
      this.statusMessage.set('Forwarding schema text payload to native Rust engine...');
      
      // IPC invocation bridging data to the serde deserializer
      const response = await invoke<string>('ingest_phenopacket', { payload });
      
      this.statusMessage.set(`Success: ${response}`);
    } catch (error) {
      this.statusMessage.set(`Backend parsing validation failure: ${error}`);
    } finally {
      this.isProcessing.set(false);
    }
  };
}

Template Layout ​

html
<div class="workspace-panel">
  <h2>Import Case Data</h2>
  
  <hpo-phenopacket-loader 
    [onIngest]="handleBackendIngest">
  </hpo-phenopacket-loader>

  @if (statusMessage()) {
    <div class="feedback-toast" [class.loading]="isProcessing()">
      {{ statusMessage() }}
    </div>
  }
</div>

Component API Reference ​

Inputs ​

The component uses explicit modern Angular input signal properties. The callback is required to guarantee platform-agnostic portability.

InputType DefinitionDescription
onIngest(payload: string) => Promise<void> | voidRequired. A handler function executed automatically whenever a valid JSON profile is extracted by the template file reader. Passes the raw text payload string as its primary argument.

Internal Reactive State Table Markdown ​

The structural block applies a matching helper class context depending on active layout tracking parameters. You can style these overrides via local host pipelines.

Signal TokenTypeUI Representation
isDraggingbooleanFlips to true when a file asset hovers over the active drop target boundary, applying the selector class variant .drop-container--active.
fileNamestring | nullStores the normalized lower-case filename string value upon safe ingestion initialization.
errorMessagestring | nullTracks and holds native structural processing exceptions (e.g., uploading non-JSON files or picking files that fail raw JSON.parse evaluations).