Skip to content
Snippets Groups Projects
page-menu.component.ts 3.56 KiB
Newer Older
  • Learn to ignore specific revisions
  • import { Component, EventEmitter, Input, OnDestroy, Output } from '@angular/core';
    
    rhenck's avatar
    rhenck committed
    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';
    
    rhenck's avatar
    rhenck committed
    import { Subject } from 'rxjs';
    
    import { MatTooltipModule } from '@angular/material/tooltip';
    
    import { PageService } from 'editor/src/app/services/unit-services/page.service';
    
    rhenck's avatar
    rhenck committed
    
    @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',
    
    rhenck's avatar
    rhenck committed
      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>();
    
    rhenck's avatar
    rhenck committed
      private ngUnsubscribe = new Subject<void>();
    
      constructor(public unitService: UnitService,
    
                  public pageService: PageService,
    
    rhenck's avatar
    rhenck committed
                  public selectionService: SelectionService,
                  private messageService: MessageService) {}
    
    
      movePage(direction: 'left' | 'right'): void {
    
    rhenck's avatar
    rhenck committed
        this.pageService.moveSelectedPage(this.selectionService.selectedPageIndex, direction);
    
        this.pageOrderChanged.emit();
    
    rhenck's avatar
    rhenck committed
      }
    
      deletePage(): void {
    
        this.pageService.deletePage(this.selectionService.selectedPageIndex);
    
    rhenck's avatar
    rhenck committed
      }
    
      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.pageOrderChanged.emit();
    
    rhenck's avatar
    rhenck committed
          }
          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();
      }
    }