import { Component, OnInit } from '@angular/core'; import { SpinnerService } from '@core/services/spinner.service'; import { StatusService } from '@core/services/status.service'; import { TranslationService } from '@core/services/translation.service'; import { CyclesService } from '@features/cycles/cycles.service'; import { ProgramService } from '@features/programs/program.service'; import { EmailService } from '@features/system-emails/email.service'; import { ALL_SKIP_FILTER, DebounceFactory, FilterModalTypes, PaginationOptions, TableDataFactory, TopLevelFilter, TopLevelFilterOption, TypeaheadSelectOption } from '@yourcause/common'; import { I18nService } from '@yourcause/common/i18n'; import { ModalFactory } from '@yourcause/common/modals'; import { InvitationService } from '../invitation.service'; import { InvitationRecord } from '../invitation.typing'; import { ResendInvitationModalComponent } from '../resend-invitation-modal/resend-invitation-modal.component'; @Component({ selector: 'gc-invitations-tab', templateUrl: './invitations-tab.component.html', styleUrls: ['./invitations-tab.component.scss'] }) export class InvitationsTabComponent implements OnInit { tableDataFactory: TableDataFactory; topLevelFilters: TopLevelFilter[] = []; statusMapApp = this.statusService.applicationStatusMap; viewTranslations = this.translationService.viewTranslations; programTranslationMap = this.viewTranslations.Grant_Program; cycleTranslationMap = this.viewTranslations.Grant_Program_Cycle; cycleSelects = this.cycleService.allMyCycleSelectOptions; programSelects: TypeaheadSelectOption[] = this.programService.allActiveManagerPrograms .map((prog) => { return { label: prog.grantProgramName, value: prog.grantProgramId }; }); inviteStatusOptions = this.invitationService.inviteStatusOptions; applicationStatusOptions: TopLevelFilterOption[] = [{ label: this.i18n.translate( 'GLOBAL:textAllApplicationStatuses', {}, 'All application statuses' ), value: ALL_SKIP_FILTER }, { label: this.i18n.translate( 'GLOBAL:textNotStarted', {}, 'Not started' ), value: 0, customColumn: 'applicationId', filterTypeOverride: FilterModalTypes.isBlank }, { value: 'Draft', customValue: true, customColumn: 'applicationIsDraft', display: this.i18n.translate('common:textDraft') }, ...this.statusService.get('appStatusOptions') ]; distributionListOptions: TypeaheadSelectOption[] = this.invitationService.distributionLists .filter((item) => { return item.distributionListApplicantCount > 0; }) .map((item) => { return { label: item.name, value: item.id }; }); constructor ( private statusService: StatusService, private translationService: TranslationService, private i18n: I18nService, private invitationService: InvitationService, private modalFactory: ModalFactory, private spinnerService: SpinnerService, private programService: ProgramService, private cycleService: CyclesService, private emailService: EmailService ) { } async ngOnInit () { this.topLevelFilters = [ new TopLevelFilter( 'text', 'applicantName', '', this.i18n.translate( 'GLOBAL:textSearchByApplicantNameOrEmail', {}, 'Search by applicant name or email' ), undefined, undefined, [{ column: 'applicantName', filterType: 'cn' }, { column: 'applicantEmail', filterType: 'cn' }] ), new TopLevelFilter( 'typeaheadSingleEquals', 'applicationStatus', ALL_SKIP_FILTER, '', { selectOptions: this.applicationStatusOptions }, this.i18n.translate( 'GLOBAL:lblApplicationStatus', {}, 'Application status' ) ) ]; this.tableDataFactory = DebounceFactory.createSimple( async (options: PaginationOptions) => { const result = await this.invitationService.getInvitations( options ); return { success: true, data: result }; } ); } async sendReminderOrResend ( invitation: InvitationRecord, isReminder = false ) { const response = await this.modalFactory.open( ResendInvitationModalComponent, { isReminder, invitation } ); if (response) { const attachments = await this.emailService.returnIdsFromMixedAttachments( response.emailOptionsModel.attachments ); const emailOptionsModel = { ...response.emailOptionsModel, attachments }; this.spinnerService.startSpinner(); if (isReminder) { await this.invitationService.handleInvitationReminderModal( invitation.invitationId, response.clientEmailTemplateId, emailOptionsModel ); } else { await this.invitationService.handleResendInvitation( invitation.invitationId, response.emailOptionsModel ); } this.tableDataFactory.reset.emit(); this.spinnerService.stopSpinner(); } } }