import { HttpErrorResponse } from '@angular/common/http'; import { Component } from '@angular/core'; import { Router } from '@angular/router'; import { SpinnerService } from '@core/services/spinner.service'; import { FundingSource, FundingSourceDrilldownInfo, FundingSourceTypes } from '@core/typings/budget.typing'; import { ProcessingTypes } from '@core/typings/payment.typing'; import { BudgetService } from '@features/budgets/budget.service'; import { ClientSettingsService } from '@features/client-settings/client-settings.service'; import { PaymentProcessingService } from '@features/payment-processing/payment-processing.service'; import { TopLevelFilter, TypeaheadSelectOption } from '@yourcause/common'; import { I18nService } from '@yourcause/common/i18n'; import { LogService } from '@yourcause/common/logging'; import { ConfirmationModalComponent, ModalFactory } from '@yourcause/common/modals'; import { NotifierService } from '@yourcause/common/notifier'; import { AddEditFundingSourceModalComponent } from '../add-edit-funding-source-modal/add-edit-funding-source-modal.component'; import { OpenCloseFSModalComponent } from '../open-close-fs-modal/open-close-fs-modal.component'; @Component({ selector: 'gc-base-funding-source-page', templateUrl: './base-funding-source-page.component.html', styleUrls: ['./base-funding-source-page.component.scss'] }) export class BaseFundingSourcePageComponent { ProcessingTypes = ProcessingTypes; FundingSourceTypes = FundingSourceTypes; fundingSources: FundingSource[]; notApplicable = this.i18n.translate( 'GLOBAL:textNA', {}, 'N/A' ); processorOptions: TypeaheadSelectOption[] = [{ label: 'YourCause', value: ProcessingTypes.YourCause }, { label: this.clientSettingsService.clientBranding.name, value: ProcessingTypes.Client }]; topLevelFilters = [ new TopLevelFilter( 'text', 'name', '', this.i18n.translate( 'common:textSearchByName', {}, 'Search by name' ) ) ]; drilldownInfo: FundingSourceDrilldownInfo; sources$ = this.router.url.includes('open') ? this.budgetService.changesTo$('openFundingSources') : this.budgetService.changesTo$('closedFundingSources'); constructor ( private logger: LogService, private i18n: I18nService, private budgetService: BudgetService, private modalFactory: ModalFactory, private notifier: NotifierService, private spinnerService: SpinnerService, private clientSettingsService: ClientSettingsService, private paymentProcessingService: PaymentProcessingService, private router: Router ) { } get branding () { return this.clientSettingsService.get('clientBranding'); } get canReserveFunds () { return this.clientSettingsService.get('clientSettings').reserveFunds; } get processorType () { return this.paymentProcessingService.processorType; } async onDrilldown (row: FundingSource) { this.drilldownInfo = null; const drilldownInfo = await this.budgetService.getFundingSourceDrilldownInfo(row.id); this.drilldownInfo = drilldownInfo; } async editModal (row: FundingSource) { const response = await this.modalFactory.open( AddEditFundingSourceModalComponent, { fundingSource: row } ); if (response) { this.spinnerService.startSpinner(); await this.budgetService.saveFundingSource(response); await this.budgetService.resetFundingSources(); this.spinnerService.stopSpinner(); } } async openCloseFSModal (context: 'open'|'close', fundingSource: FundingSource) { const fundingSourceDetails = await this.budgetService.getFundingSourceDrilldownInfo( fundingSource.id ); const response = await this.modalFactory.open( OpenCloseFSModalComponent, { fundingSourceDetails, context, fundingSource } ); if (response) { switch (context) { case 'open': await this.budgetService.openFundingSource(response); break; case 'close': await this.budgetService.closeFundingSource(response); break; } } } async deleteModal (row: FundingSource) { const deps = { confirmButtonText: this.i18n.translate( 'common:btnDelete', {}, 'Delete' ), confirmText: this.i18n.translate( 'BUDGET:textAreYouSureDeleteFundingSource', {}, 'Are you sure you want to delete this funding source? This action cannot be undone.' ), modalHeader: this.i18n.translate( 'BUDGET:hdrDeleteFundingSourceDynamic', { name: row.name }, 'Delete - __name__' ) }; const proceed = await this.modalFactory.open(ConfirmationModalComponent, deps); if (proceed) { this.spinnerService.startSpinner(); try { await this.budgetService.deleteFundingSource(row.id); await this.budgetService.resetFundingSources(); this.notifier.success(this.i18n.translate( 'BUDGET:textSuccessDeleteFundingSource', {}, 'Successfully deleted the funding source' )); this.spinnerService.stopSpinner(); } catch (err) { const e = err as HttpErrorResponse; this.logger.error(e); if ( e.error && e.error.message.includes( 'This Funding Source is already linked to the following active budget' ) ) { this.notifier.error(this.i18n.translate( 'BUDGET:textErrorDeleteFundingSourceLinkedToActiveBudget', {}, 'Cannot delete funding source because it is linked to an active budget' )); } else { this.notifier.error(this.i18n.translate( 'BUDGET:textErrorDeletingFundingSource', {}, 'There was an error deleting the funding source' )); } this.spinnerService.stopSpinner(); } } } }