Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
table-edit-dialog.component.ts 3.05 KiB
import { Component, Inject, ViewChild } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
import { TableElement } from 'common/models/elements/compound-elements/table/table';
import { TranslateModule } from '@ngx-translate/core';
import { MatButtonModule } from '@angular/material/button';
import { TableComponent } from 'common/components/compound-elements/table/table.component';
import { ElementFactory } from 'common/util/element.factory';
import { PositionedUIElement, UIElementProperties, UIElementType } from 'common/models/elements/element';
import {
  PositionProperties,
  PropertyGroupGenerators
} from 'common/models/elements/property-group-interfaces';
import { FileService } from 'common/services/file.service';
import { AudioProperties } from 'common/models/elements/media-elements/audio';
import { ImageProperties } from 'common/models/elements/media-elements/image';

@Component({
  selector: 'aspect-editor-table-edit-dialog',
  standalone: true,
  imports: [
    MatDialogModule,
    TranslateModule,
    MatButtonModule,
    TableComponent
  ],
  template: `
    <div mat-dialog-title>Tabellenelemente</div>
    <mat-dialog-content>
      <aspect-table [elementModel]="newTable" [editorMode]="true"
                    (elementAdded)="addElement($event)"
                    (elementRemoved)="removeElement($event)"></aspect-table>
    </mat-dialog-content>
    <mat-dialog-actions>
      <button mat-button [mat-dialog-close]="newTable.elements">{{'save' | translate }}</button>
      <button mat-button mat-dialog-close>{{'cancel' | translate }}</button>
    </mat-dialog-actions>
  `
})
export class TableEditDialogComponent {
  @ViewChild(TableComponent) tableComp!: TableComponent;
  newTable: TableElement;

  constructor(@Inject(MAT_DIALOG_DATA) public data: { table: TableElement }) {
    this.newTable = new TableElement(data.table);
  }

  async addElement(el: { elementType: UIElementType, row: number, col: number }): Promise<void> {
    const extraProps: Partial<UIElementProperties> = {};
    if (el.elementType === 'image') (extraProps as ImageProperties).src = await FileService.loadImage();
    if (el.elementType === 'audio') {
      (extraProps as AudioProperties).src = await FileService.loadAudio();
      (extraProps as AudioProperties).player =
        PropertyGroupGenerators.generatePlayerProps({
          progressBar: false,
          interactiveProgressbar: false,
          volumeControl: false,
          muteControl: false,
          showRestTime: false
        });
    }
    this.newTable.elements.push(ElementFactory.createElement({
      type: el.elementType,
      position: {
        gridRow: el.row + 1,
        gridColumn: el.col + 1
      } as PositionProperties,
      ...extraProps
    }) as PositionedUIElement);
    this.tableComp.refresh();
  }

  removeElement(coords: { row: number, col: number }): void {
    const index = this.newTable.elements
      .findIndex(el => el.position.gridRow === (coords.row + 1) && el.position.gridColumn === (coords.col + 1));
    this.newTable.elements.splice(index, 1);
  }
}