From c71a4995a63e4886bc23a8a8cea7d02d7560c2aa Mon Sep 17 00:00:00 2001 From: Nicoleta Panaghiu Date: Thu, 19 Sep 2024 14:52:04 +0300 Subject: [PATCH] RED-9578: added support for custom component and reversing buttons. --- .../confirmation-dialog.component.html | 36 ++++++++---- .../confirmation-dialog.component.scss | 9 +++ .../confirmation-dialog.component.ts | 57 ++++++++++++++----- 3 files changed, 76 insertions(+), 26 deletions(-) diff --git a/src/lib/dialog/confirmation-dialog/confirmation-dialog.component.html b/src/lib/dialog/confirmation-dialog/confirmation-dialog.component.html index 6a1ff38..543c92a 100644 --- a/src/lib/dialog/confirmation-dialog/confirmation-dialog.component.html +++ b/src/lib/dialog/confirmation-dialog/confirmation-dialog.component.html @@ -16,6 +16,10 @@

} + @if (config.component) { + + } + @if (config.requireInput) {
@@ -35,14 +39,20 @@ }
-
- +
+ @if (!config.cancelButtonPrimary) { + + } @else { +
+ {{ config.confirmationText }} +
+ } @if (config.alternativeConfirmationText) { - {{ config.denyText }} -
+ @if (config.cancelButtonPrimary) { + + } @else { +
+ {{ config.denyText }} +
+ } }
diff --git a/src/lib/dialog/confirmation-dialog/confirmation-dialog.component.scss b/src/lib/dialog/confirmation-dialog/confirmation-dialog.component.scss index 21c8eab..3269ccc 100644 --- a/src/lib/dialog/confirmation-dialog/confirmation-dialog.component.scss +++ b/src/lib/dialog/confirmation-dialog/confirmation-dialog.component.scss @@ -6,3 +6,12 @@ display: flex; flex-direction: column; } + +.reverse { + flex-direction: row-reverse; + justify-content: flex-end; +} + +.no-uppercase { + text-transform: unset; +} diff --git a/src/lib/dialog/confirmation-dialog/confirmation-dialog.component.ts b/src/lib/dialog/confirmation-dialog/confirmation-dialog.component.ts index 67cc5c5..54dd7f9 100644 --- a/src/lib/dialog/confirmation-dialog/confirmation-dialog.component.ts +++ b/src/lib/dialog/confirmation-dialog/confirmation-dialog.component.ts @@ -1,15 +1,24 @@ -import { NgTemplateOutlet } from '@angular/common'; -import { ChangeDetectionStrategy, Component, HostListener, inject, TemplateRef } from '@angular/core'; +import { NgClass, NgTemplateOutlet } from '@angular/common'; +import { + AfterViewInit, + ChangeDetectionStrategy, + Component, + HostListener, + inject, + TemplateRef, + Type, + viewChild, + ViewContainerRef, +} from '@angular/core'; import { FormsModule } from '@angular/forms'; import { MatCheckboxModule } from '@angular/material/checkbox'; import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog'; import { MatIconModule } from '@angular/material/icon'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; -import { CircleButtonComponent } from '../../buttons/circle-button/circle-button.component'; -import { IconButtonComponent } from '../../buttons/icon-button/icon-button.component'; -import { IconButtonTypes } from '../../buttons/types/icon-button.type'; -import { ValuesOf } from '../../utils/types/utility-types'; +import { CircleButtonComponent, IconButtonTypes } from '../../buttons'; +import { IconButtonComponent } from '../../buttons'; +import { ValuesOf } from '../../utils'; export const TitleColors = { DEFAULT: 'default', @@ -48,6 +57,9 @@ interface InternalConfirmationDialogData { readonly checkboxes: CheckBox[]; readonly checkboxesValidation: boolean; readonly toastMessage?: string; + readonly component?: Type; + readonly componentInputs?: { [key: string]: unknown }; + readonly cancelButtonPrimary?: boolean; } export type IConfirmationDialogData = Partial; @@ -65,6 +77,9 @@ function getConfig(options?: IConfirmationDialogData): InternalConfirmationDialo denyText: options?.denyText ?? _('common.confirmation-dialog.deny'), checkboxes: options?.checkboxes ?? [], checkboxesValidation: typeof options?.checkboxesValidation === 'boolean' ? options.checkboxesValidation : true, + component: options?.component, + componentInputs: options?.componentInputs, + cancelButtonPrimary: options?.cancelButtonPrimary ?? false, }; } @@ -82,15 +97,17 @@ function getConfig(options?: IConfirmationDialogData): InternalConfirmationDialo IconButtonComponent, CircleButtonComponent, MatDialogModule, + NgClass, ], }) -export class ConfirmationDialogComponent { +export class ConfirmationDialogComponent implements AfterViewInit { readonly config = getConfig(inject(MAT_DIALOG_DATA)); inputValue = ''; showToast = false; readonly inputLabel: string; readonly confirmOptions = ConfirmOptions; readonly iconButtonTypes = IconButtonTypes; + readonly detailsComponentRef = viewChild.required('detailsComponent', { read: ViewContainerRef }); constructor( private readonly _dialogRef: MatDialogRef, @@ -115,13 +132,19 @@ export class ConfirmationDialogComponent { return ConfirmOptions.CONFIRM; } - @HostListener('window:keyup.enter') - onKeyupEnter(): void { - if (this.config.requireInput && !this.confirmationDoesNotMatch()) { - this.confirm(ConfirmOptions.CONFIRM); + @HostListener('window:keyup.enter', ['$event']) + onKeyupEnter(event: KeyboardEvent): void { + event?.stopImmediatePropagation(); + if (!this.config.requireInput || !this.confirmationDoesNotMatch()) { + if (!this.config.cancelButtonPrimary) this.confirm(ConfirmOptions.CONFIRM); + else this.deny(); } } + ngAfterViewInit() { + this.#initializeDetailsComponent(); + } + confirmationDoesNotMatch(): boolean { return this.inputValue.toLowerCase() !== this.config.confirmationText.toLowerCase(); } @@ -156,9 +179,13 @@ export class ConfirmationDialogComponent { }); } - @HostListener('window:keydown.Enter', ['$event']) - onEnter(event: KeyboardEvent): void { - event?.stopImmediatePropagation(); - this.confirm(ConfirmOptions.CONFIRM); + #initializeDetailsComponent() { + if (!this.config.component) return; + const component = this.detailsComponentRef().createComponent(this.config.component); + if (this.config.componentInputs) { + for (const [key, value] of Object.entries(this.config.componentInputs)) { + (component.instance as any)[key] = value; + } + } } }