import { Component, Input, OnInit } from '@angular/core'; import { PortalDeterminationService } from '@core/services/portal-determination.service'; import { SpinnerService } from '@core/services/spinner.service'; import { StatusService } from '@core/services/status.service'; import { CancelApplicationFormGroup, CancelApplicationModalResponse, CancelReasons } from '@core/typings/ui/cancel-application.typing'; import { AwardService } from '@features/awards/award.service'; import { EmailNotificationType } from '@features/system-emails/email.typing'; import { TypeaheadSelectOption, TypeSafeFormBuilder, TypeSafeFormGroup } from '@yourcause/common'; import { AnalyticsService, EventType } from '@yourcause/common/analytics'; import { I18nService } from '@yourcause/common/i18n'; import { YCModalComponent } from '@yourcause/common/modals'; @Component({ selector: 'gc-cancel-application-moodal', templateUrl: './cancel-application-modal.component.html', styleUrls: ['./cancel-application-modal.component.scss'] }) export class CancelApplicationModalComponent extends YCModalComponent implements OnInit { @Input() applicationId: number; @Input() programId: number; @Input() isNomination: boolean; @Input() emailType: EmailNotificationType; @Input() emailActive = false; @Input() programName: string; modalHeader: string; modalSubheader: string; primaryButtonText: string; isManager = false; customMessageLabel: string; reasonSelectOptions: TypeaheadSelectOption[]; formGroup: TypeSafeFormGroup; hasAwards: boolean; // Cannot cancel application if has awards is true constructor ( private formBuilder: TypeSafeFormBuilder, private i18n: I18nService, private statusService: StatusService, private analyticsService: AnalyticsService, private awardService: AwardService, private spinnerService: SpinnerService, private portal: PortalDeterminationService ) { super(); } async ngOnInit () { let hasAwards = false; // We only need to check this in manager portal. In applicant, we don't show action if awards exist if (this.portal.isManager) { this.spinnerService.startSpinner(); const numberOfNonVoidedPayments = await this.awardService.getNumberOfNonVoidedPaymentsByAppId( this.applicationId ); hasAwards = numberOfNonVoidedPayments > 0; this.spinnerService.stopSpinner(); } if (hasAwards) { this.hasAwards = true; } else { this.formGroup = this.formBuilder.group({ reason: CancelReasons.Other, comment: '', notifyApplicant: true, customMessage: '', clientEmailTemplateId: 0, attachments: null }); this.reasonSelectOptions = this.statusService.getCancelApplicationTypeaheadOptions(); } this.setModalText(); } setModalText () { this.modalHeader = this.i18n.translate( this.isNomination ? 'common:hdrCancelNomination' : 'common:hdrCancelApplication', {}, this.isNomination ? 'Cancel Nomination' : 'Cancel Application' ); this.modalSubheader = this.i18n.translate( this.isNomination ? 'GLOBAL:textNominationID' : 'common:textApplicationId', {}, this.isNomination ? 'Nomination ID' : 'Application ID' ) + `: ${this.applicationId}`; this.primaryButtonText = this.i18n.translate( this.isNomination ? 'common:textCancelNomination' : 'common:textCancelApplication', {}, this.isNomination ? 'Cancel nomination' : 'Cancel application' ); this.customMessageLabel = this.i18n.translate( this.isNomination ? 'common:textCustomMessageToNominator' : 'common:textCustomMessageToApplicant', {}, this.isNomination ? 'Custom message to nominator' : 'Custom message to applicant' ); } onPrimaryClick () { if (this.hasAwards) { this.closeModal.emit(); } else { const formData = this.formGroup.value; this.closeModal.emit({ applicationId: this.applicationId, reason: formData.reason, comment: formData.comment, sendEmailToApplicants: formData.notifyApplicant, customMessage: formData.customMessage, attachments: formData.attachments }); this.analyticsService.emitEvent({ eventName: 'Cancel application modal submit', eventType: EventType.Click, extras: null }); } } }