import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { Router } from '@angular/router'; import { CurrencyService } from '@core/services/currency.service'; import { SpinnerService } from '@core/services/spinner.service'; import { StatusService } from '@core/services/status.service'; import { TranslationService } from '@core/services/translation.service'; import { ApplicationApplicantFile, MyApplicationFromApi } from '@core/typings/application.typing'; import { ApplicationStatuses } from '@core/typings/status.typing'; import { CancelApplicationPayload } from '@core/typings/ui/cancel-application.typing'; import { ApplicationEligibilityService } from '@features/application-eligibility/application-eligibility.service'; import { ApplicationAttachmentService } from '@features/application-view/application-attachments/application-attachments.service'; import { ApplicationApplicantService } from '@features/apply/application-applicant.service'; import { CancelApplicationModalComponent } from '@features/cancel-application/cancel-application-modal/cancel-application-modal.component'; import { FormStatuses, MyApplicationForm } from '@features/configure-forms/form.typing'; import { I18nService } from '@yourcause/common/i18n'; import { ModalFactory } from '@yourcause/common/modals'; @Component({ selector: 'gc-application-slat', templateUrl: './application-slat.component.html', styleUrls: ['./application-slat.component.scss'] }) export class ApplicationSlatComponent implements OnInit { @Input() application: MyApplicationFromApi; @Input() simpleSlat = false; @Input() canEdit = true; @Input() isCopy = false; @Output() onSelectApplication = new EventEmitter(); statusMap = this.statusService.applicationStatusMap; formStatusMap = this.statusService.formStatusMap; isNomination = false; applicantString = ''; nominatedString = ''; FormStatuses = FormStatuses; portalTranslations = this.translationService.viewTranslations; programTranslationMap = this.portalTranslations.Grant_Program; formTranslationMap = this.portalTranslations.FormTranslation; AppStatuses = ApplicationStatuses; constructor ( private i18n: I18nService, private router: Router, private modalFactory: ModalFactory, private statusService: StatusService, private spinnerService: SpinnerService, private applicationApplicantService: ApplicationApplicantService, private currencyService: CurrencyService, private translationService: TranslationService, private applicationAttachmentService: ApplicationAttachmentService, private applicationEligibilityService: ApplicationEligibilityService ) { } ngOnInit () { this.isNomination = !!this.application.nominee; this.applicantString = this.getApplicantString(); this.nominatedString = this.getInvitedString(); } async deleteModal (app: MyApplicationFromApi) { await this.applicationApplicantService.handleDeleteApplication( app.applicationId, this.isNomination ); } async cancelModal (application: MyApplicationFromApi) { const cancelModalResponse = await this.modalFactory.open( CancelApplicationModalComponent, { applicationId: application.applicationId, programId: application.grantProgramId, isNomination: this.isNomination, isManager: false, emailActive: false, emailType: null, programName: application.grantProgramName } ); if (cancelModalResponse) { const payload: CancelApplicationPayload = { ...cancelModalResponse, emailOptions: { attachments: [], ccEmails: null, bccEmails: null } }; await this.applicationApplicantService.cancelApplication(payload); } } getApplicantString () { const applicant = this.application.applicant; const applicantName = applicant.firstName + ' ' + applicant.lastName; const onBehalfOfOrg = this.application.organizationId; const isNomination = !!this.application.nominee; const nominee = isNomination ? this.application.nominee : null; const nomineeName = nominee && nominee.firstName && nominee.lastName ? nominee.firstName + ' ' + nominee.lastName : null; if ( !!this.application.amountRequested || !!this.application.inKindAmountRequested ) { const amountCash = this.application.amountRequested > 0 ? this.currencyService.formatMoney( this.application.currencyRequestedAmountEquivalent, this.application.currencyRequested ) : null; const amountInKind = (this.application.inKindItems || []).reduce((acc, item) => { return +acc + +item.count; }, 0); if (onBehalfOfOrg) { if (isNomination) { return this.i18n.translate( 'APPLY:textApplicantNominatingRequesting', { applicantName, organizationName: this.application.organizationName, amount: amountCash }, '__applicantName__ nominating __organizationName__ for __amount__' ); } if (amountInKind && amountCash) { return this.i18n.translate( 'APPLY:textApplicantOnBehalfOfOrgRequestingCashInKind', { applicantName, organizationName: this.application.organizationName, amount: amountCash, numberOfUnits: amountInKind }, '__applicantName__ requesting __amount__ and __numberOfUnits__ units on behalf of __organizationName__' ); } else if (amountInKind) { return this.i18n.translate( 'APPLY:textApplicantOnBehalfOfOrgRequestingInKind', { applicantName, organizationName: this.application.organizationName, numberOfUnits: amountInKind }, '__applicantName__ requesting __numberOfUnits__ units on behalf of __organizationName__' ); } else { return this.i18n.translate( 'APPLY:textApplicantOnBehalfOfOrgRequesting', { applicantName, organizationName: this.application.organizationName, amount: amountCash }, '__applicantName__ requesting __amount__ on behalf of __organizationName__' ); } } else { if (amountInKind && amountCash) { return this.i18n.translate( 'APPLY:textApplicantRequestingCashInKind', { applicantName, amount: amountCash, numberOfUnits: amountInKind }, '__applicantName__ requesting __amount__ and __numberOfUnits__ units' ); } else if (amountInKind) { return this.i18n.translate( 'APPLY:textApplicantRequestingInKind', { applicantName, numberOfUnits: amountInKind }, '__applicantName__ requesting __numberOfUnits__ units' ); } else { return this.i18n.translate( 'APPLY:textApplicantRequesting', { applicantName, amount: amountCash }, '__applicantName__ requesting __amount__' ); } } } else if (onBehalfOfOrg) { return this.i18n.translate( this.isNomination ? 'APPLY:textApplicantNominatingOrg' : 'APPLY:textApplicantOnBehalfOfOrg', { applicantName, organizationName: this.application.organizationName }, `__applicantName__ ${ isNomination ? 'nominating' : 'on behalf of' } __organizationName__` ); } else { if (this.isNomination && nomineeName) { return this.i18n.translate( 'APPLY:textApplicantNominatingIndividual', { applicantName, nominee: nomineeName }, '__applicantName__ nominating __nominee__' ); } return applicantName; } } getInvitedString () { if (this.isNomination && this.application.status === 3) { const nominee = this.application.nominee; const nomineeName = nominee.firstName + ' ' + nominee.lastName; return this.i18n.translate( 'APPLY:textNomineeHasBeenInvitedToApply', { name: nomineeName }, '__name__ has been invited to apply' ); } else if (this.application.nominatedBy) { return this.i18n.translate( 'APPLY:textNominatedBy', { name: this.application.nominatedBy.firstName + ' ' + this.application.nominatedBy.lastName }, 'Nominated by __name__' ); } return ''; } goToApplication (form: MyApplicationForm) { this.router.navigateByUrl( `/apply/application/${this.application.applicationId}/forms/${form.formId}` ); } selectApplication () { this.onSelectApplication.emit(); } async copyApplication ( application: MyApplicationFromApi ) { this.spinnerService.startSpinner(); const valid = await this.applicationEligibilityService.checkEligibilityForApplicantView(application); this.spinnerService.stopSpinner(); if (valid) { this.router.navigate([ `/apply/programs/${application.grantProgramGuid}/apply` ], { queryParams: { copyOf: application.applicationId } }); } } async openFile (file: ApplicationApplicantFile) { this.spinnerService.startSpinner(); await this.applicationAttachmentService.downloadFileForApplicant( file.fileUploadId, file.fileName ); this.spinnerService.stopSpinner(); } }