import { Component, Input, OnInit } from '@angular/core'; import { AbstractControl, Validators } from '@angular/forms'; import { SpinnerService } from '@core/services/spinner.service'; import { RevisionModalResponse } from '@core/typings/application.typing'; import { EmailService } from '@features/system-emails/email.service'; import { EmailNotificationType } from '@features/system-emails/email.typing'; import { DuplicateCheckValidator, EmailValidator, GenericFile, TypeSafeFormBuilder, TypeSafeFormGroup } from '@yourcause/common'; import { AnalyticsService, EventType } from '@yourcause/common/analytics'; import { I18nService } from '@yourcause/common/i18n'; import { YCModalComponent } from '@yourcause/common/modals'; interface RequestRevisionGroup { notes: string; clientEmailTemplateId: number; cc: string[]; bcc: string[]; attachments: GenericFile[]; } @Component({ selector: 'gc-request-revision-modal', templateUrl: './request-revision-modal.component.html', styleUrls: ['./request-revision-modal.component.scss'] }) export class RequestRevisionModalComponent extends YCModalComponent implements OnInit { @Input() programId: number; @Input() isNomination = false; @Input() isReminder = false; @Input() numberOfApplications = 1; @Input() formName: string; formGroup: TypeSafeFormGroup; EmailTypes = EmailNotificationType; modalHeader = this.i18n.translate( 'FORMS:hdrRequestRevision' ); confirmText: string; primaryButtonText = this.i18n.translate( 'FORMS:textRequestRevision', {}, 'Request revision' ); currentEmailActive: boolean; emailModalOpen = false; constructor ( private formBuilder: TypeSafeFormBuilder, private i18n: I18nService, private emailService: EmailService, private spinnerService: SpinnerService, private analyticsService: AnalyticsService ) { super(); } get emailType (): EmailNotificationType { if (this.isReminder) { return this.isNomination ? this.EmailTypes.NomRequestRevisionReminder : this.EmailTypes.AppRequestRevisionReminder; } return this.isNomination ? this.EmailTypes.RequestRevisionNom : this.EmailTypes.RequestRevision; } async ngOnInit () { this.spinnerService.startSpinner(); await this.setCurrentEmailActive(); if (this.isReminder) { this.modalHeader = this.i18n.translate( 'FORMS:hdrSendRevisionReminder', {}, 'Send Revision Reminder' ); this.confirmText = this.i18n.translate( this.isNomination ? 'FORMS:textAreYouSureSendRevisionReminderNominator' : 'FORMS:textAreYouSureSendRevisionReminderApplicant', {}, this.isNomination ? 'Are you sure you want to send an email to remind the nominator to complete their revision?' : 'Are you sure you want to send an email to remind the applicant to complete their revision?' ); this.primaryButtonText = this.i18n.translate( 'GLOBAL:textSend', {}, 'Send' ); } else { this.confirmText = this.isNomination ? this.i18n.translate( 'FORMS:textAreYouSureRequestRevisionNominator', {}, 'Are you sure you want to request a revision from the nominator?' ) : this.i18n.translate( 'FORMS:textAreYouSureRequestRevision', {}, 'Are you sure you want to request a revision from the applicant?' ); } this.formGroup = this.formBuilder.group({ notes: [ '', [ (control: AbstractControl) => { if (!this.isReminder && !control.value) { return { required: true }; } return null; }, Validators.maxLength(2000) ] ], clientEmailTemplateId: 0, cc: [ [], EmailValidator() ], bcc: [ [], EmailValidator() ], attachments: [] }, { validator: [ DuplicateCheckValidator( 'cc', 'bcc' ) ] }); this.spinnerService.stopSpinner(); } async setCurrentEmailActive () { this.currentEmailActive = await this.emailService.isProgramEmailActive( this.emailType, this.programId ); } onCancel () { this.closeModal.emit(); } onSubmit () { this.closeModal.emit({ notes: this.formGroup.value.notes, clientEmailTemplateId: this.formGroup.value.clientEmailTemplateId, emailOptionsRequest: { ccEmails: this.formGroup.value.cc, bccEmails: this.formGroup.value.bcc, attachments: this.formGroup.value.attachments } }); this.analyticsService.emitEvent({ eventName: 'Request revision modal submit', eventType: EventType.Click, extras: null }); } }