import { Component, OnChanges, OnInit } from '@angular/core'; import { AdminUsersService } from '@core/services/admin-users.service'; import { SpinnerService } from '@core/services/spinner.service'; import { AdaptedAdminUser, AdminUser, AdminUserPermissions } from '@core/typings/user.typing'; import { UserService } from '@features/users/user.service'; import { DebounceFactory, PaginationOptions, TableDataFactory, TopLevelFilter } from '@yourcause/common'; import { I18nService } from '@yourcause/common/i18n'; import { ConfirmationModalComponent, ModalFactory } from '@yourcause/common/modals'; @Component({ selector: 'gc-internal-admins', templateUrl: './internal-admins.component.html', styleUrls: ['./internal-admins.component.scss'] }) export class InternalAdminsComponent implements OnInit, OnChanges { tableListFilters: TopLevelFilter[] = []; tableListFactory: TableDataFactory; createOrEditAdmin = true; ready = false; canManageAdminUsers = this.userService.adminPermissions.includes(AdminUserPermissions.ViewUsers); paginatedOptions: PaginationOptions; constructor ( private i18n: I18nService, private modalFactory: ModalFactory, private adminUsersService: AdminUsersService, private userService: UserService, private spinnerService: SpinnerService ) { } get activeAdminCountLabel () { const adminCount = this.adminUsersService.get('activeAdminCount'); if (adminCount > 0) { return this.i18n.translate( 'ADMIN:txtActiveAdminCount', { adminCount }, '__adminCount__ active admins' ); } else { return ''; } } async ngOnInit () { this.ready = false; this.tableListFilters = [ new TopLevelFilter( 'text', 'fullName', '', this.i18n.translate( 'GLOBAL:textSearchForAUser', {}, 'Search for a user' ), undefined, undefined, [{ column: 'fullName', filterType: 'cn' }, { column: 'email', filterType: 'cn' }] ) ]; this.tableListFactory = DebounceFactory.createSimple( async (options: PaginationOptions) => { this.paginatedOptions = options; const result = await this.adminUsersService.getPaginatedAdmins(options); return { success: true, data: { recordCount: result.recordCount, records: result.records } }; } ); this.ready = true; } async toggleAdminActiveStatus (row: AdminUser) { // confirm modal for activating/deactivting user. const proceed = await this.modalFactory.open( ConfirmationModalComponent, { confirmText: this.i18n.translate( row.isDeactivated ? 'ADMIN:textActivatingTheAdmin' : 'ADMIN:textDeactivatingTheAdmin', {}, row.isDeactivated ? `Activating the administrator will allow them to have access to GrantsConnect - Platform Admin. Are you sure you want to activate this administrator?` : `Deactivating the administrator will prevent them from accessing GrantsConnect - Platform Admin. Are you sure you want to deactivate this administrator?` ), modalHeader: this.i18n.translate( row.isDeactivated ? 'ADMIN:hrdActivateAdmin' : 'ADMIN:hdrDeactivateAdmin', {}, row.isDeactivated ? 'Activate Admin' : 'Deactivate Admin' ), modalSubHeader: row.fullName, confirmButtonText: this.i18n.translate( row.isDeactivated ? 'GLOBL:textActivate' : 'GLOBAL:btnDeactivate', {}, row.isDeactivated ? 'Activate' : 'Deactivate' ) } ); if (proceed) { this.spinnerService.startSpinner(); await this.adminUsersService.toggleAdminActivation( row.userId, row.isDeactivated = !row.isDeactivated ); await this.adminUsersService.setActiveAdminCount(); this.spinnerService.stopSpinner(); } } async downloadAdminReport () { this.spinnerService.startSpinner(); await this.adminUsersService.downloadAdminReport(this.paginatedOptions); this.spinnerService.stopSpinner(); } ngOnChanges () { if (this.tableListFactory) { this.tableListFactory.reset.emit(); } } }