From f2005dcb581f050a5c1724c18f9f1f314e72ffb1 Mon Sep 17 00:00:00 2001 From: Kenta420 Date: Wed, 4 Oct 2023 14:05:20 +0700 Subject: [PATCH] make modal confirm to standalone --- .../features/dashboard/dashboard.component.ts | 2 +- .../modal/confirm/confirm-modal.component.ts | 57 +++++++++++++++++++ .../recipe-modal.component.html | 29 +++++----- .../recipe-modal.component.ts | 53 ++++++++++++----- 4 files changed, 110 insertions(+), 31 deletions(-) create mode 100644 client/src/app/shared/modal/confirm/confirm-modal.component.ts rename client/src/app/shared/modal/{ => recipe-details}/recipe-modal.component.html (86%) rename client/src/app/shared/modal/{ => recipe-details}/recipe-modal.component.ts (70%) diff --git a/client/src/app/features/dashboard/dashboard.component.ts b/client/src/app/features/dashboard/dashboard.component.ts index effe437..21d3af4 100644 --- a/client/src/app/features/dashboard/dashboard.component.ts +++ b/client/src/app/features/dashboard/dashboard.component.ts @@ -5,7 +5,7 @@ import { DatePipe, NgFor, NgIf } from '@angular/common'; import { Recipe, Recipe01 } from 'src/app/core/models/recipe.model'; import { RecipeService } from 'src/app/core/services/recipe.service'; import { environment } from 'src/environments/environment'; -import { RecipeModalComponent } from 'src/app/shared/modal/recipe-modal.component'; +import { RecipeModalComponent } from 'src/app/shared/modal/recipe-details/recipe-modal.component'; import { BehaviorSubject } from 'rxjs'; import * as lodash from 'lodash'; diff --git a/client/src/app/shared/modal/confirm/confirm-modal.component.ts b/client/src/app/shared/modal/confirm/confirm-modal.component.ts new file mode 100644 index 0000000..cd3d570 --- /dev/null +++ b/client/src/app/shared/modal/confirm/confirm-modal.component.ts @@ -0,0 +1,57 @@ +import { + Component, + ElementRef, + EventEmitter, + Input, + OnInit, + Output, + ViewChild, +} from '@angular/core'; + +@Component({ + selector: 'confirm-modal', + template: ` + + `, + standalone: true, +}) +export class ConfirmModal implements OnInit { + @Input() show: EventEmitter = new EventEmitter(); + @Input() title: string = 'Confirm Dialog'; + @Input() message: string = + 'This is Confirm Modal. You can change message by using message input'; + @Input() confirmCallBack: () => void = () => {}; + + private confirmModal: ElementRef | null = null; + + @ViewChild('confirmModal', { static: false }) set setConfirmModal( + modal: ElementRef + ) { + this.confirmModal = modal; + } + + constructor() {} + + ngOnInit() { + this.show.subscribe((show) => { + if (show) { + this.confirmModal?.nativeElement.showModal(); + } else { + this.confirmModal?.nativeElement.close(); + } + }); + } + + close() { + this.confirmModal?.nativeElement.close(); + } +} diff --git a/client/src/app/shared/modal/recipe-modal.component.html b/client/src/app/shared/modal/recipe-details/recipe-modal.component.html similarity index 86% rename from client/src/app/shared/modal/recipe-modal.component.html rename to client/src/app/shared/modal/recipe-details/recipe-modal.component.html index 01e3870..7ef38fb 100644 --- a/client/src/app/shared/modal/recipe-modal.component.html +++ b/client/src/app/shared/modal/recipe-details/recipe-modal.component.html @@ -97,23 +97,22 @@ - - - - + - - diff --git a/client/src/app/shared/modal/recipe-modal.component.ts b/client/src/app/shared/modal/recipe-details/recipe-modal.component.ts similarity index 70% rename from client/src/app/shared/modal/recipe-modal.component.ts rename to client/src/app/shared/modal/recipe-details/recipe-modal.component.ts index ef58e3c..ca7439e 100644 --- a/client/src/app/shared/modal/recipe-modal.component.ts +++ b/client/src/app/shared/modal/recipe-details/recipe-modal.component.ts @@ -1,7 +1,14 @@ -import { Component, ElementRef, Input, ViewChild } from '@angular/core'; +import { + Component, + ElementRef, + EventEmitter, + Input, + ViewChild, +} from '@angular/core'; import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; import { isEqual } from 'lodash'; import { RecipeService } from 'src/app/core/services/recipe.service'; +import { ConfirmModal } from '../confirm/confirm-modal.component'; interface RecipeDetail { productCode: string; @@ -18,7 +25,7 @@ interface RecipeDetail { @Component({ selector: 'recipe-modal', templateUrl: './recipe-modal.component.html', - imports: [ReactiveFormsModule], + imports: [ReactiveFormsModule, ConfirmModal], standalone: true, }) export class RecipeModalComponent { @@ -48,14 +55,6 @@ export class RecipeModalComponent { this.detailModal = modal; } - private confirmModal: ElementRef | null = null; - - @ViewChild('confirmModal', { static: false }) set setConfirmModal( - modal: ElementRef - ) { - this.confirmModal = modal; - } - constructor(private recipeService: RecipeService) {} openModal() { @@ -93,14 +92,38 @@ export class RecipeModalComponent { } } - save() { - console.log(this.recipeDetail.value); - this.detailModal?.nativeElement.close(); + showConfirmSaveModal: EventEmitter = new EventEmitter(); + showConfirmCloseModal: EventEmitter = new EventEmitter(); + + confirmSave = { + title: 'The changes detected!', + message: 'Do you want to save changes?', + confirmCallBack: () => { + console.log('confirm save'); + this.detailModal?.nativeElement.close(); + }, + }; + + confirmClose = { + title: 'The changes will be lost!', + message: 'Do you want to close without saving?', + confirmCallBack: () => { + console.log('confirm close'); + this.detailModal?.nativeElement.close(); + }, + }; + + onConfirmSave() { + if (!isEqual(this.recipeDetail.value, this.originalRecipeDetail)) { + this.showConfirmSaveModal.emit(true); + } else { + this.detailModal?.nativeElement.close(); + } } - close() { + onConfirmClose() { if (!isEqual(this.recipeDetail.value, this.originalRecipeDetail)) { - this.confirmModal?.nativeElement.showModal(); + this.showConfirmCloseModal.emit(true); } else { this.detailModal?.nativeElement.close(); }