diff --git a/src/app/app.component.html b/src/app/app.component.html index 21b361c5f12827d3f56abdfe305da752a8566450..8d4134e24ae62c00fffc105fedc6a16d1ee6fcb6 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -38,8 +38,13 @@ <li> <a class="dropdown-item cursor-pointer" (click)="startSimulation(planning)">{{planningText}}</a> </li> - <li> - <a class="dropdown-item cursor-pointer" (click)="startSimulation(financing)">{{financingText}}</a> + <li [class.disabled]="!financingSimulationIsEnable"> + <ng-container *ngIf="financingSimulationIsEnable; else elseTemplate"> + <a class="dropdown-item cursor-pointer" (click)="startSimulation(financing)">{{financingText}}</a> + </ng-container> + <ng-template #elseTemplate> + <a>{{financingText}} <sup>Em construção...</sup></a> + </ng-template> </li> </ul> </li> @@ -83,8 +88,13 @@ <li> <a class="cursor-pointer" (click)="startSimulation(planning)">{{planningText}}</a> </li> - <li> - <a class="cursor-pointer" (click)="startSimulation(financing)">{{financingText}}</a> + <li [class.disabled]="!financingSimulationIsEnable"> + <ng-container *ngIf="financingSimulationIsEnable; else elseTemplate"> + <a class="cursor-pointer" (click)="startSimulation(financing)">{{financingText}}</a> + </ng-container> + <ng-template #elseTemplate> + <a>{{financingText}} <sup>Em construção...</sup></a> + </ng-template> </li> </ul> </div> diff --git a/src/app/app.component.ts b/src/app/app.component.ts index a5874c35172bc86bc25e5753f132b606a5695634..867b37d5bb57a1b7438aa43310ea5c0707ee5865 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -7,6 +7,7 @@ import { SessionService } from './shared/services/session/session.service'; import { UtilitiesService } from './shared/services/utilities/utilities.service'; import { SimulationType } from './simulator/simulator/entities/enums/simulation-type.enum'; import { SimulatorService } from './simulator/simulator/services/simulator.service'; +import { AuthService } from './shared/services/auth/auth.service'; @Component({ selector: 'app-root', @@ -20,6 +21,7 @@ export class AppComponent extends BaseUnsubscribe implements OnInit { isQualityPage: boolean; showFooter: boolean; isInverseColor: boolean = false; + financingSimulationIsEnable: boolean = false; readonly caq: SimulationType = SimulationType.caq; readonly caqText: string = UtilitiesService.caqText; @@ -31,7 +33,12 @@ export class AppComponent extends BaseUnsubscribe implements OnInit { @ViewChild('navbarMenuToggle', { static: false }) navbarMenuToggle: ElementRef; @ViewChild('navbarContent', { static: false }) navbarContent: ElementRef; - constructor(private router: Router, private sessionService: SessionService, private utilitiesService: UtilitiesService, private simulatorService: SimulatorService) { + constructor( + private router: Router, + private sessionService: SessionService, + private utilitiesService: UtilitiesService, + private simulatorService: SimulatorService, + private authService: AuthService) { super(); // Clear 'has error' flag. @@ -40,6 +47,18 @@ export class AppComponent extends BaseUnsubscribe implements OnInit { ngOnInit(): void { this.listenRouteEvents(); + + this.verifyFinancingSimulationIsEnable(); + + this.authService.userLoggedObserver.pipe( + takeUntil(this.unsubscribe)) + .subscribe(userIsLoggedIn => { + if (userIsLoggedIn) { + this.verifyFinancingSimulationIsEnable(); + } else { + this.financingSimulationIsEnable = false; + } + }); } startSimulation(simulationType: SimulationType): void { @@ -63,4 +82,10 @@ export class AppComponent extends BaseUnsubscribe implements OnInit { }); } + private verifyFinancingSimulationIsEnable(): void { + this.authService.userIsAdmin().pipe( + takeUntil(this.unsubscribe)) + .subscribe(userIsAdmin => this.financingSimulationIsEnable = userIsAdmin); + } + } diff --git a/src/app/home/home.component.html b/src/app/home/home.component.html index 22c4227c706a3c4e1848f6a478d56ca889b09385..5ff54a159f9337559324d70b4f375273447ebb27 100644 --- a/src/app/home/home.component.html +++ b/src/app/home/home.component.html @@ -33,7 +33,7 @@ Acesse o Custo-aluno Qualidade (CAQ) de cada etapa/modalidade </div> <div class="type-start"> - <button class="btn btn-primary" (click)="startSimulation(1)">Acessar</button> + <button class="btn btn-primary" (click)="startSimulation(caq)">Acessar</button> </div> </div> <div class="simulation-type-container planning"> @@ -44,7 +44,7 @@ Calcule o orçamento necessário para financiar a educação na sua localidade </div> <div class="type-start"> - <button class="btn btn-primary" (click)="startSimulation(2)">Simular</button> + <button class="btn btn-primary" (click)="startSimulation(planning)">Simular</button> </div> </div> <div class="simulation-type-container financing"> @@ -55,7 +55,12 @@ Consulte valores para um fundo de manutenção a partir do CAQ </div> <div class="type-start"> - <button class="btn btn-primary" (click)="startSimulation(3)">Consultar</button> + <ng-container *ngIf="financingSimulationIsEnable; else elseTemplate"> + <button class="btn btn-primary" (click)="startSimulation(financing)">Consultar</button> + </ng-container> + <ng-template #elseTemplate> + <button class="btn btn-primary" disabled="disabled">Em construção...</button> + </ng-template> </div> </div> </div> diff --git a/src/app/home/home.component.ts b/src/app/home/home.component.ts index 98c7578fc0a5f78481a7f0a7744aec657e25d367..b997f0159a7f686c42686eaa4a793f82b810f67e 100644 --- a/src/app/home/home.component.ts +++ b/src/app/home/home.component.ts @@ -1,22 +1,51 @@ import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { takeUntil, map } from 'rxjs/operators'; import { SimulationType } from '../simulator/simulator/entities/enums/simulation-type.enum'; import { SimulatorService } from '../simulator/simulator/services/simulator.service'; +import { AuthService } from '../shared/services/auth/auth.service'; +import { BaseUnsubscribe } from '../shared/entities/base/base-unsubscribe'; @Component({ selector: 'app-home', templateUrl: './home.component.html', styleUrls: ['./home.component.scss'] }) -export class HomeComponent implements OnInit { +export class HomeComponent extends BaseUnsubscribe implements OnInit { - constructor(private simulatorService: SimulatorService) { } + financingSimulationIsEnable: boolean = false; + + readonly caq: SimulationType = SimulationType.caq; + readonly planning: SimulationType = SimulationType.planning; + readonly financing: SimulationType = SimulationType.financing; + + constructor(private simulatorService: SimulatorService, private authService: AuthService) { + super(); + } ngOnInit(): void { + this.verifyFinancingSimulationIsEnable(); + + this.authService.userLoggedObserver.pipe( + takeUntil(this.unsubscribe)) + .subscribe(userIsLoggedIn => { + if (userIsLoggedIn) { + this.verifyFinancingSimulationIsEnable(); + } else { + this.financingSimulationIsEnable = false; + } + }); } startSimulation(simulationType: SimulationType): void { this.simulatorService.startSimulation(simulationType); } + private verifyFinancingSimulationIsEnable(): void { + this.authService.userIsAdmin().pipe( + takeUntil(this.unsubscribe)) + .subscribe(userIsAdmin => this.financingSimulationIsEnable = userIsAdmin); + } + } diff --git a/src/app/shared/guards/auth/financing-simulation-is-enable.guard.spec.ts b/src/app/shared/guards/auth/financing-simulation-is-enable.guard.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..ea919959e2acfd6e4404a426f069ab48a68f8388 --- /dev/null +++ b/src/app/shared/guards/auth/financing-simulation-is-enable.guard.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, async, inject } from '@angular/core/testing'; + +import { FinancingSimulationIsEnableGuard } from './financing-simulation-is-enable.guard'; + +describe('FinancingSimulationIsEnableGuard', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [FinancingSimulationIsEnableGuard] + }); + }); + + it('should ...', inject([FinancingSimulationIsEnableGuard], (guard: FinancingSimulationIsEnableGuard) => { + expect(guard).toBeTruthy(); + })); +}); diff --git a/src/app/shared/guards/auth/financing-simulation-is-enable.guard.ts b/src/app/shared/guards/auth/financing-simulation-is-enable.guard.ts new file mode 100644 index 0000000000000000000000000000000000000000..4013818b54f9d957ff2c32a7d24843d3c3779210 --- /dev/null +++ b/src/app/shared/guards/auth/financing-simulation-is-enable.guard.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@angular/core'; +import { CanActivate, CanActivateChild, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { AuthService } from '../../services/auth/auth.service'; + +@Injectable({ + providedIn: 'root' +}) +export class FinancingSimulationIsEnableGuard implements CanActivate, CanActivateChild { + + constructor(private authService: AuthService) { } + + canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree { + return this.canActivateThis(state); + } + canActivateChild(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree { + return this.canActivateThis(state); + } + + private canActivateThis(state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree { + return this.authService.userIsAdmin().pipe( + map(userIsAdmin => userIsAdmin)); + } +} diff --git a/src/app/simulator/results/results-children.routes.ts b/src/app/simulator/results/results-children.routes.ts index e118230b062c06d5820ca29a7eb1048c4da0cf8a..dff32f864b74b4b129a7578c790c76cca4f9f8d9 100644 --- a/src/app/simulator/results/results-children.routes.ts +++ b/src/app/simulator/results/results-children.routes.ts @@ -6,11 +6,12 @@ import { CaqReportComponent } from './caq-report/caq-report.component'; import { BudgetForecastReportComponent } from './budget-forecast-report/budget-forecast-report.component'; import { FinancingFundsReportComponent } from './financing-funds-report/financing-funds-report.component'; import { ItemCostExpenseReportComponent } from './item-cost-expense-report/item-cost-expense-report.component'; +import { FinancingSimulationIsEnableGuard } from '../../shared/guards/auth/financing-simulation-is-enable.guard'; const routes: Routes = [ { path: 'caqreport', component: CaqReportComponent, canDeactivate: [HasErrorGuard, HasRequiredDataGuard] }, { path: 'budgetforecastreport', component: BudgetForecastReportComponent, canDeactivate: [HasErrorGuard, HasRequiredDataGuard] }, - { path: 'financingfundsreport', component: FinancingFundsReportComponent, canDeactivate: [HasErrorGuard, HasRequiredDataGuard] }, + { path: 'financingfundsreport', component: FinancingFundsReportComponent, canDeactivate: [HasErrorGuard, HasRequiredDataGuard], canActivate: [FinancingSimulationIsEnableGuard] }, { path: 'itemcostexpensereport', component: ItemCostExpenseReportComponent, canDeactivate: [HasErrorGuard, HasRequiredDataGuard] }, ]; diff --git a/src/app/simulator/results/results/results.component.ts b/src/app/simulator/results/results/results.component.ts index 78db5de73002b41c968550615c07e69063051ad8..cd3751266bea07ff384415978342428a53b892f8 100644 --- a/src/app/simulator/results/results/results.component.ts +++ b/src/app/simulator/results/results/results.component.ts @@ -6,7 +6,10 @@ import { BaseUnsubscribe } from '../../../shared/entities/base/base-unsubscribe' import { SimulatorService } from '../../simulator/services/simulator.service'; import { Functionality } from '../../../shared/entities/functionality/functionality'; import { FunctionalityRoute } from '../../../shared/entities/functionality/functionality-route'; +import { SimulationType } from '../../simulator/entities/enums/simulation-type.enum'; import { SessionService } from '../../../shared/services/session/session.service'; +import { UtilitiesService } from '../../../shared/services/utilities/utilities.service'; +import { AuthService } from '../../../shared/services/auth/auth.service'; @Component({ selector: 'app-results', @@ -18,7 +21,7 @@ export class ResultsComponent extends BaseUnsubscribe implements OnInit { homeRoute: Array<string> = [FunctionalityRoute.homeRoute]; isItemCostExpenseReport: boolean; - constructor(private router: Router, private simulatorService: SimulatorService) { + constructor(private router: Router, private simulatorService: SimulatorService, private sessionService: SessionService, private authService: AuthService) { super(); this.router.events.pipe( @@ -27,11 +30,20 @@ export class ResultsComponent extends BaseUnsubscribe implements OnInit { .subscribe((event: NavigationEnd) => { this.isItemCostExpenseReport = event.url.indexOf('itemcostexpensereport') > 0; - if (event.url.indexOf(Functionality.caqReport.key) !== -1 || - event.url.indexOf(Functionality.budgetForecastReport.key) !== -1 || - event.url.indexOf(Functionality.financingFundsReport.key) !== -1 || - event.url.endsWith(FunctionalityRoute.resultsRoute)) { - this.simulatorService.navigateToResultSimulation(); + const simulationType: SimulationType = this.sessionService.getItem(UtilitiesService.simulationTypeSessionKey); + + if (simulationType === SimulationType.financing) { + this.authService.userIsAdmin().pipe( + takeUntil(this.unsubscribe)) + .subscribe(userIsAdmin => { + if (userIsAdmin) { + this.navigateToResultSimulation(event.url); + } else { + this.router.navigate([FunctionalityRoute.homeRoute]); + } + }); + } else { + this.navigateToResultSimulation(event.url); } }); } @@ -39,4 +51,13 @@ export class ResultsComponent extends BaseUnsubscribe implements OnInit { ngOnInit() { } + private navigateToResultSimulation(url: string): void { + if (url.indexOf(Functionality.caqReport.key) !== -1 || + url.indexOf(Functionality.budgetForecastReport.key) !== -1 || + url.indexOf(Functionality.financingFundsReport.key) !== -1 || + url.endsWith(FunctionalityRoute.resultsRoute)) { + this.simulatorService.navigateToResultSimulation(); + } + } + } diff --git a/src/app/simulator/shared/components/processing-simulation/processing-simulation.component.ts b/src/app/simulator/shared/components/processing-simulation/processing-simulation.component.ts index 796b2f36571816672095bf34c8b028d99d351164..aa806ca7d0770206111f6792bfc6bb1b5423c55a 100644 --- a/src/app/simulator/shared/components/processing-simulation/processing-simulation.component.ts +++ b/src/app/simulator/shared/components/processing-simulation/processing-simulation.component.ts @@ -8,6 +8,7 @@ import { SimulationType } from '../../../simulator/entities/enums/simulation-typ import { SessionService } from '../../../../shared/services/session/session.service'; import { FunctionalityRoute } from '../../../../shared/entities/functionality/functionality-route'; import { UtilitiesService } from '../../../../shared/services/utilities/utilities.service'; +import { AuthService } from '../../../../shared/services/auth/auth.service'; @Component({ selector: 'app-processing-simulation', @@ -16,7 +17,7 @@ import { UtilitiesService } from '../../../../shared/services/utilities/utilitie }) export class ProcessingSimulationComponent extends BaseUnsubscribe implements OnInit { - constructor(private router: Router, private simulatorService: SimulatorService, private sessionService: SessionService) { + constructor(private router: Router, private simulatorService: SimulatorService, private sessionService: SessionService, private authService: AuthService) { super(); } @@ -27,6 +28,23 @@ export class ProcessingSimulationComponent extends BaseUnsubscribe implements On processSimulation(): void { const simulationType: SimulationType = this.sessionService.getItem(UtilitiesService.simulationTypeSessionKey); + if (simulationType === SimulationType.financing) { + this.authService.userIsAdmin().pipe( + takeUntil(this.unsubscribe)) + .subscribe(userIsAdmin => { + if (userIsAdmin) { + this.initializeSimulation(simulationType); + } else { + this.router.navigate([FunctionalityRoute.homeRoute]); + } + }); + } else { + this.initializeSimulation(simulationType); + } + + } + + private initializeSimulation(simulationType: SimulationType): void { this.simulatorService.initializeSimulation(simulationType).pipe( takeUntil(this.unsubscribe)) .subscribe(result => {