كيفية إنشاء مربع حوّار MatDialog

الخطوة الأولى:  محتوى صفحة فتح مربع الحوار:

<button mat-raised-button color="primary" (click)="openDialog(item)">Open dialog</button>


محتوى الـ ts :

import { Component, Input, OnInit } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { DialogContentComponent } from '../dialog-content/dialog-content.component';

@Component({
  selector: 'app-bootstrap-carsousel',
  templateUrl: './bootstrap-carsousel.component.html',
  styleUrls: ['./bootstrap-carsousel.component.scss']
})
export class BootstrapCarsouselComponent implements OnInit {
  @Input('items') items: any = [];

  constructor(public dialog: MatDialog) { }

  openDialog(item:any) {
    const dialogRef = this.dialog.open(DialogContentComponent, {
      data: {item: item},
    });

    dialogRef.afterClosed().subscribe(result => {
      console.log(`Dialog result: ${result}`);
    });
  }

  ngOnInit(): void {

  }
}


الخطوة الثانية: نقوم بإنشاء مكوّن جديد لصفحة الحوّار كالتالي:



<h2 mat-dialog-title>{{data.item.NAME_AR}}</h2>
<mat-dialog-content
class="mat-typography mat-dialog-full-width mat-dialog-full-height"
style="overflow: auto;">
    <mat-tab-group>
        <mat-tab>
            <ng-template mat-tab-label>
                <mat-icon class="example-tab-icon">video_library</mat-icon>
                قائمة التشغيل
            </ng-template>
            <ul class="list-group mt-3 mb-2">
                <li class="list-group-item d-flex justify-content-between align-items-center">
                    تاريخ آخر تحديث
                    <span class="badge bg-primary rounded-pill">{{data.item.UPDATED | date}}</span>
                </li>
                <li class="list-group-item d-flex justify-content-between align-items-center">
                    اسم مدرب المقرر
                    <span class="badge bg-primary rounded-pill">{{data.item.TEACHER_AR}}</span>
                </li>
                <li class="list-group-item d-flex justify-content-between align-items-center">
                    رابط قائمة التشغيل
                    <span class="badge"> <a [href]="data.item.LINK" target="_blank" mat-raised-button color="warn">
                            الاطلاع على كافة المحاضرات</a>
                    </span>
                </li>
            </ul>
        </mat-tab>

        <mat-tab>
            <ng-template mat-tab-label>
                <mat-icon class="example-tab-icon">file_copy</mat-icon>
                الملفات المساعدة
            </ng-template>
            <table class="table">
                <thead>
                    <tr>
                        <th scope="col">#</th>
                        <th scope="col">محتوى الملف المساعد</th>
                        <th scope="col">الأيقونة</th>
                    </tr>
                </thead>
                <tbody>
                    <tr *ngFor="let item of data.item.HELP;let i=index">
                        <th scope="row">{{i+1}}</th>
                        <td><a [matTooltip]="item.DESC_AR" target="_blank" [href]="item.LINK">{{item.NAME_AR}}</a>
                        </td>
                        <td><i [class]="item.ICON"></i>
                        </td>

                </tbody>
            </table>

        </mat-tab>

        <mat-tab>
            <ng-template mat-tab-label>
                <mat-icon class="example-tab-icon">thumb_up</mat-icon>
                الاختبارات المتوقعة
            </ng-template>

            <table class="table" *ngIf="data.item.EXAMS.length != 0; else elseBlock">
                <thead>
                    <tr>
                        <th scope="col">#</th>
                        <th scope="col">محتوى الملف المساعد</th>
                        <th scope="col">الأيقونة</th>
                    </tr>
                </thead>
                <tbody>
                    <tr *ngFor="let item of data.item.EXAMS;let i=index">
                        <th scope="row">{{i+1}}</th>
                        <td><a [matTooltip]="item.DESC_AR" target="_blank" [href]="item.LINK">{{item.NAME_AR}}</a>
                        </td>
                        <td><i [class]="item.ICON"></i>
                        </td>

                </tbody>
            </table>
            <ng-template #elseBlock>


                <mat-card class="example-card mx-auto d-block mt-3 mb-2 pt-3">
                    <!-- <mat-card-header>
                        <div mat-card-avatar class="example-header-image"></div>
                        <mat-card-title>Shiba Inu</mat-card-title>
                        <mat-card-subtitle>Dog Breed</mat-card-subtitle>
                    </mat-card-header> -->
                    <!-- <mat-icon class="sad-face mx-auto d-block">sentiment_very_dissatisfied</mat-icon> -->
                    <!-- <i class="mdi mdi-emoticon-sad-outline sad-face text-center"></i> -->
                    <br>
                    <svg mat-card-image class="mt-2 mb-2" xmlns="http://www.w3.org/2000/svg" width="90" height="90"
                        fill="currentColor" class="bi bi-emoji-frown" viewBox="0 0 16 16">
                        <path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z" />
                        <path
                            d="M4.285 12.433a.5.5 0 0 0 .683-.183A3.498 3.498 0 0 1 8 10.5c1.295 0 2.426.703 3.032 1.75a.5.5 0 0 0 .866-.5A4.498 4.498 0 0 0 8 9.5a4.5 4.5 0 0 0-3.898 2.25.5.5 0 0 0 .183.683zM7 6.5C7 7.328 6.552 8 6 8s-1-.672-1-1.5S5.448 5 6 5s1 .672 1 1.5zm4 0c0 .828-.448 1.5-1 1.5s-1-.672-1-1.5S9.448 5 10 5s1 .672 1 1.5z" />
                    </svg>

                    <!-- <img mat-card-image src="https://material.angular.io/assets/img/examples/shiba2.jpg" alt="Photo of a Shiba Inu"> -->
                    <mat-card-content>
                        <h4 class="text-justify lh-lg">
                            نأسف ما من اختبارات محتملة، راسلنا إن كنت تمتلك إحداها!
                            <!-- من المؤسف أنه لا توجد اختبارات محتملة لهذا المقرر ولكن يمكنك مراسلتنا لتزويدنا باختبار متوقع من قِبلك! -->
                        </h4>
                    </mat-card-content>
                    <mat-card-actions>
                        <a href="http://wa.me/966508532127" target="_blank" mat-raised-button color="accent">مراستنا</a>
                        <a href="https://abdullah-alsalem-cv.netlify.app/" target="_blank" mat-raised-button
                            color="accent">زيارة موقع مهندس الموقع</a>
                    </mat-card-actions>
                </mat-card>
            </ng-template>
        </mat-tab>
    </mat-tab-group>







</mat-dialog-content>
<mat-dialog-actions align="end">
    <button mat-stroked-button mat-dialog-close cdkFocusInitial>إغلاق</button>
</mat-dialog-actions>


محتوى الـ ts:

import { Component, Inject, Input, OnInit } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';


export interface DialogData {
  item: any;
}

@Component({
  selector: 'app-dialog-content',
  templateUrl: './dialog-content.component.html',
  styleUrls: ['./dialog-content.component.scss']
})
export class DialogContentComponent implements OnInit {
  constructor(
    public dialogRef: MatDialogRef<DialogContentComponent>,
    @Inject(MAT_DIALOG_DATA) public data: DialogData,
  ) {}

  ngOnInit(): void {
  }

}

محتوى الـ css:

.example-tab-icon {
    margin-left: 8px;
  }

  .example-card {
    max-width: 400px;
  }
 
  .example-header-image {
    background-image: url('https://material.angular.io/assets/img/examples/shiba1.jpg');
    background-size: cover;
  }

  .sad-face{
    width: auto !important;
    height: 50px !important;
  }


//-------------------------------------------------------------------------------------------------------------------------//

مربع الحوار الداخلي:
ملف الـ HTML

<ng-template #leaveDialog class="card cardchild">
    <div class="warn-border" [dir]="(translateService.currentLang === 'ar')?'rtl' : 'ltr'">
        <h1 class="back-primary text-white" mat-dialog-title>{{'LABELS.CONFIRM_LEAVING_PAGE' | translate}}</h1>
        <p mat-dialog-content class="mt-4">{{'WARNING.UNSAVED_CHANGES' | translate}}</p>
        <div mat-dialog-actions class="text-center">
            <button [mat-dialog-close]="true" class="back-accent mx-auto d-block text-white" mat-button mat-dialog-close
                [routerLink]="'/maintenance_tickets'"><span class="text-white">{{'BUTTONS.LEAVE_PAGE' |
                    translate}}</span></button>
            <button [mat-dialog-close]="false" class="back-primary mx-auto d-block text-white" mat-button
                mat-dialog-close (click)="closeDialog()"><span class="text-white">{{'BUTTONS.CANCELE' |
                    translate}}</span></button>
        </div>
    </div>
</ng-template>

ملف الـ ts:

@Component({
  selector: 'app-add-new-maintenance-ticket',
  templateUrl: './add-new-maintenance-ticket.component.html',
  styleUrls: ['./add-new-maintenance-ticket.component.scss']
})
export class AddNewMaintenanceTicketComponent {
  @ViewChild('leaveDialog', { static: true }) leaveDialog: TemplateRef<any>;
  leaveDialogRef: MatDialogRef<any>;

  constructor(

    public dialog: MatDialog,
    public translateService: TranslateService,

  ) { }


  onLeave() {
    this.leaveDialogRef = this.dialog.open(this.leaveDialog);
  }

}


//-------------------------------------------------------------- العرض الكامل:

  _notHasTelegramChat() {
    const dialogRef = this.dialog.open(NotHasTelegramChatComponent, {
      width: '100%',
      height: '80%'
    });
    dialogRef.afterClosed().subscribe(result => {
    this.refresh();
    });
  }
في MyDialogComponent، قم بتعيين فئات mat-dialog-full-width وmat-dialog-full-height للتأكد من أنها تمتد على إطار العرض بالكامل:

<mat-dialog-content class="mat-dialog-full-width mat-dialog-full-height">
  </mat-dialog-content>



ملء الشاشة مع Dialog:

تجربة ممتازة.
 deleteItem(item: Ingredient) {
    let config = {
      data: item,
      disableClose: true,
      height: '98%',
      width: '98%',
      panelClass: 'full-screen-modal',
    };

    if (this.crudPermission('DELETE')) {
      this.current = item;
      const dialogRef = this.dialog.open(this.deleteDialog, config);

      dialogRef.afterClosed().subscribe(result => {
        if (result) {
          this._deleteItem(item);
          setTimeout(() => {
            this.getItems();
          }, 500);
        }
      });
    } else {
      this.snackBarService.warning(this.translateService.instant('ERRORS._ACCESS_DENIED'));
    }
  }

محتوى css:

.full-screen-modal {
  max-width: unset !important;
  width: 100%;
  height: 100%;
  .mat-dialog-container {
    max-width: 100vw;
    max-height: 100vh;
    height: 100%;
    width: 100%;
    .mat-dialog-content {
      max-height: unset !important;
    }
  }
}


المصدر:
https://g.co/gemini/share/08e5d9a4e759





تعليقات

المشاركات الشائعة من هذه المدونة

ngx-extended-pdf-viewer

how to getting access token for https://fcm.googleapis.com/v1/projects/al-ayahya-co/messages:send for angular and backend nestjs

طريقة تفعيل زر Inline Keyboard في Telegram Bot