Skip to content
Snippets Groups Projects
image-fullscreen.directive.ts 1.19 KiB
Newer Older
// eslint-disable-next-line max-classes-per-file
import {
  Component, Directive, HostListener, inject, Input
} from '@angular/core';
import {
  MAT_DIALOG_DATA, MatDialog, MatDialogModule, MatDialogRef
} from '@angular/material/dialog';
import { SafeResourceUrl } from '@angular/platform-browser';

@Directive({
  selector: '[imageFullscreen]',
  standalone: true
})
export class ImageFullscreenDirective {
  @Input() imgSrc!: SafeResourceUrl;
  @Input() alt!: string;

  readonly dialog = inject(MatDialog);

  @HostListener('click') onClick() {
    this.openFullScreenDialog(this.imgSrc, this.alt);
  }

  openFullScreenDialog(src: SafeResourceUrl, alt: string): void {
    this.dialog.open(ImageFullscreenDialog, {
      data: { src, alt },
      panelClass: 'image-fullscreen-dialog'
    });
  }
}

@Component({
  standalone: true,
  imports: [MatDialogModule],
  template: `
    <mat-dialog-content (click)="dialogRef.close()">
      <img [style.padding.px]="5" [src]="data.src" [alt]="data.alt">
    </mat-dialog-content>
  `
})
export class ImageFullscreenDialog {
  readonly data = inject<{ src: string, alt: string }>(MAT_DIALOG_DATA);

  constructor(public dialogRef: MatDialogRef<ImageFullscreenDialog>) { }
}