Skip to content
Snippets Groups Projects
dialog.directive.ts 1.33 KiB
Newer Older
import { Directive, HostListener, Input, TemplateRef } from "@angular/core";
import { MatDialog, MatDialogConfig, MatDialogRef } from 'src/sharedModules/angularMaterial.exports'
import { DialogFallbackCmp } from "./tmpl/tmpl.component"
type DialogSize = 's' | 'm' | 'l' | 'xl' | 'auto'

const sizeDict: Record<DialogSize, Partial<MatDialogConfig>> = {
  's': {
    width: '25vw',
    height: '25vh'
  },
  'm': {
    width: '50vw',
    height: '50vh'
  },
  'l': {
    width: '75vw',
    height: '75vh'
  },
  'xl': {
    width: '90vw',
    height: '90vh'
Xiao Gui's avatar
Xiao Gui committed

@Directive({
  selector: `[sxplr-dialog]`,
  exportAs: 'sxplrDialog',
Xiao Gui's avatar
Xiao Gui committed
})
Xiao Gui's avatar
Xiao Gui committed

export class DialogDirective{
Xiao Gui's avatar
Xiao Gui committed

  @Input('sxplr-dialog')
Xiao Gui's avatar
Xiao Gui committed
  templateRef: TemplateRef<unknown>|string
Xiao Gui's avatar
Xiao Gui committed

  @Input('sxplr-dialog-size')
  size: DialogSize = 'm'
  @Input('sxplr-dialog-data')
  #dialogRef: MatDialogRef<unknown>

  constructor(private matDialog: MatDialog){}
Xiao Gui's avatar
Xiao Gui committed

  @HostListener('click')
  onClick(data: any={}){
Xiao Gui's avatar
Xiao Gui committed
    const tmpl = this.templateRef instanceof TemplateRef
      ? this.templateRef
      : DialogFallbackCmp

    this.#dialogRef = this.matDialog.open(tmpl, {
      autoFocus: null,
      data: {...this.data, ...data},
Xiao Gui's avatar
Xiao Gui committed
      ...(sizeDict[this.size] || {})
Xiao Gui's avatar
Xiao Gui committed
  }

  close(){
    if (this.#dialogRef) {
      this.#dialogRef.close()
      this.#dialogRef = null
    }
  }