import { Component, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { SpinnerService } from '@core/services/spinner.service'; import { UsersAndRoutesLevel, WorkflowDetail, WorkflowLevel } from '@core/typings/workflow.typing'; import { UserService } from '@features/users/user.service'; import { AutoTableRepository, AutoTableRepositoryFactory, PanelTypes, TopLevelFilter, ValueComparisonService } from '@yourcause/common'; import { I18nService } from '@yourcause/common/i18n'; import { ModalFactory } from '@yourcause/common/modals'; import { NotifierService } from '@yourcause/common/notifier'; import { ManageWorkflowLevelUsersModalComponent } from '../manage-workflow-level-users-modal/manage-workflow-level-users-modal.component'; import { RoutingModalComponent } from '../routing-modal/routing-modal.component'; import { WorkflowService } from '../workflow.service'; @Component({ selector: 'gc-users-and-routes', templateUrl: './users-and-routes.component.html', styleUrls: ['./users-and-routes.component.scss'] }) export class UsersAndRoutesComponent implements OnInit { id = this.activatedRoute.snapshot.parent.params.id; PanelTypes = PanelTypes; title = ''; allLevels: UsersAndRoutesLevel[] = []; deactivatedUsers: number[] = []; workflow: WorkflowDetail; repository: AutoTableRepository; topLevelFilters: TopLevelFilter[] = [ new TopLevelFilter( 'text', 'name', '', this.i18n.translate( 'common:textSearchByName', {}, 'Search by name' ), undefined ) ]; constructor ( private activatedRoute: ActivatedRoute, private i18n: I18nService, private modalFactory: ModalFactory, private spinnerService: SpinnerService, private workflowService: WorkflowService, private userService: UserService, private autoTableFactory: AutoTableRepositoryFactory, private valueComparisonService: ValueComparisonService, private notifierService: NotifierService ) { } get workflowMap () { return this.workflowService.get('workflowMap'); } ngOnInit () { this.deactivatedUsers = this.userService.allUsers.filter((user) => { return user.isDeactivated; }).map((user) => user.id); this.setWorkflowAndLevels(); this.title = `${this.i18n.translate( 'WORKFLOW:hdrEditUsersAndRoutes', {}, 'Edit Users and Routes' )}: ${this.workflow.name}`; } setWorkflowAndLevels () { this.workflow = this.workflowService.getWorkflowForEdit(this.id); const allLevels: UsersAndRoutesLevel[] = []; this.workflow.levels.forEach((level) => { this.filterOutDeactivatedUsers(level); allLevels.push(level); level.subLevels.forEach((sub) => { this.filterOutDeactivatedUsers(sub); allLevels.push({ ...sub, parentName: level.name }); }); }); this.allLevels = allLevels; if (!this.repository) { this.repository = this.autoTableFactory.create({ key: 'USER_AND_ROUTES' + this.id, columns: [], notifier: this.notifierService, valueComparisonService: this.valueComparisonService, rowsPerPage: 10000, rows: this.allLevels }); } else { this.repository.rows = allLevels; } } filterOutDeactivatedUsers (level: WorkflowLevel) { level.workflowLevelUsers = level.workflowLevelUsers.filter((user) => { return !this.deactivatedUsers.includes(user.clientUserId); }); } async usersModal (level: UsersAndRoutesLevel) { const response = await this.modalFactory.open( ManageWorkflowLevelUsersModalComponent, { level } ); if (response) { this.spinnerService.startSpinner(); await this.workflowService.updateWorkflowLevelUsers( this.id, level.id, response.users ); this.setWorkflowAndLevels(); this.spinnerService.stopSpinner(); if (response.goToRouteModal) { this.routingModal(level); } } } async routingModal (level: UsersAndRoutesLevel) { const deps = { allLevels: this.allLevels, routesForLevel: level.routes, levelName: level.name, levelId: level.id }; const response = await this.modalFactory.open( RoutingModalComponent, deps ); if (response) { this.spinnerService.startSpinner(); await this.workflowService.handleRouteChanges( this.id, level, response.levels ); this.setWorkflowAndLevels(); this.spinnerService.stopSpinner(); if (response.goToUsersModal) { this.usersModal(level); } } } }