Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
page-menu.component.ts 3.59 KiB
import {
  Component, EventEmitter, Input, OnDestroy, Output
} from '@angular/core';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatDividerModule } from '@angular/material/divider';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatIconModule } from '@angular/material/icon';
import { MatInputModule } from '@angular/material/input';
import { MatMenuModule } from '@angular/material/menu';
import { MatOptionModule } from '@angular/material/core';
import { MatSelectModule } from '@angular/material/select';
import { NgForOf, NgIf } from '@angular/common';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { TranslateModule } from '@ngx-translate/core';
import { Page } from 'common/models/page';
import { SelectionService } from 'editor/src/app/services/selection.service';
import { UnitService } from 'editor/src/app/services/unit-services/unit.service';
import { MessageService } from 'editor/src/app/services/message.service';
import { Subject } from 'rxjs';
import { MatTooltipModule } from '@angular/material/tooltip';
import { PageService } from 'editor/src/app/services/unit-services/page.service';

@Component({
  selector: 'aspect-unit-view-page-menu',
  standalone: true,
  imports: [
    MatCheckboxModule,
    MatDividerModule,
    MatFormFieldModule,
    MatIconModule,
    MatInputModule,
    MatMenuModule,
    MatOptionModule,
    MatSelectModule,
    NgForOf,
    NgIf,
    ReactiveFormsModule,
    TranslateModule,
    FormsModule,
    MatTooltipModule
  ],
  templateUrl: 'page-menu.component.html',
  styles: `
    :host {
      display: flex;
      flex-direction: column;
    }
    mat-divider {
      margin-bottom: 10px;
    }
    .menuItem {
      padding: 0 16px;
    }
    mat-checkbox.menuItem {
      padding: 0 16px 10px 16px;
    }
    :host ::ng-deep .mat-mdc-menu-item .mat-icon {
      margin-right: 0;
    }
    .delete-button {
      justify-content: center;
    }
    .delete-button:hover {background-color: var(--warn)}
  `
})
export class PageMenu implements OnDestroy {
  @Input() page!: Page;
  @Input() pageIndex!: number;
  @Output() pageOrderChanged = new EventEmitter<void>();
  private ngUnsubscribe = new Subject<void>();

  constructor(public unitService: UnitService,
              public pageService: PageService,
              public selectionService: SelectionService,
              private messageService: MessageService) {}

  movePage(direction: 'left' | 'right'): void {
    this.pageService.moveSelectedPage(this.selectionService.selectedPageIndex, direction);
    this.pageOrderChanged.emit();
  }

  deletePage(): void {
    this.pageService.deletePage(this.pageIndex);
  }

  updateModel(page: Page, property: string, value: number | boolean, isInputValid: boolean | null = true): void {
    if (isInputValid && value != null) {
      if (property === 'alwaysVisible' && value === true) {
        this.movePageToFront(page);
        page.alwaysVisible = true;
        this.selectionService.selectedPageIndex = 0;
        this.unitService.updateSectionCounter();
        this.pageOrderChanged.emit();
      }
      page[property] = value;
      this.unitService.updateUnitDefinition(); // TODO
    } else {
      this.messageService.showWarning('Eingabe ungültig');
    }
  }

  private movePageToFront(page: Page): void {
    const pageIndex = this.unitService.unit.pages.indexOf(page);
    if (pageIndex !== 0) {
      this.unitService.unit.pages.splice(pageIndex, 1);
      this.unitService.unit.pages.splice(0, 0, page);
    }
  }

  ngOnDestroy(): void {
    this.ngUnsubscribe.next();
    this.ngUnsubscribe.complete();
  }
}