Skip to content

Commit

Permalink
Feature/accreditation request (#18)
Browse files Browse the repository at this point in the history
* Show norms names
* Add accreditation request support
* Refactoring, delete duplicated code
  • Loading branch information
dtrouillet authored Dec 31, 2019
1 parent 36f49ca commit 3e4e5ca
Show file tree
Hide file tree
Showing 21 changed files with 352 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import {AccreditationRequestComponent} from './accreditation-request.component';
import {AuthGuard} from '../core/services';

const routes: Routes = [
{
path: '',
component: AccreditationRequestComponent,
canActivate: [AuthGuard]
}
];

@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class AccreditationRequestRoutingModule {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<form (ngSubmit)="newForm.form.valid && sendRequest()" #newForm="ngForm">
<div class="form-group">
<label for="application">Nom de l'application</label>
<input id="application" name="application" type="text" class="form-control" [class.is-invalid]="searchFailed"
[resultFormatter]="formatter" [inputFormatter]="formatter" [(ngModel)]="model" [ngbTypeahead]="search"
placeholder="nom de l'application"/>
<span *ngIf="searching">recherche en cours...</span>
<div class="invalid-feedback" *ngIf="searchFailed">Désolé, les suggestions ne peuvent être chargées.</div>
</div>
<div class="form-group">
<label for="wantManage">Droit de gestion</label>
<div class="input-group">
<input type="checkbox" id="wantManage" class="form-control" name="wantManage" [(ngModel)]="request.wantManage">
</div>
</div>
<div class="form-group">
<label for="wantUse">Droit lancement</label>
<div class="input-group">
<input type="checkbox" id="wantUse" class="form-control" name="wantUse" [(ngModel)]="request.wantUse">
</div>
</div>
<button type="submit" class="btn btn-outline-dark">Envoyer</button>
</form>
56 changes: 56 additions & 0 deletions src/app/accreditation-requests/accreditation-request.component.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import {Component, OnInit} from '@angular/core';
import {AccreditationRequestsService, ApplicationsService} from '../core/services';
import {Observable, of} from "rxjs";
import {catchError, debounceTime, distinctUntilChanged, map, switchMap, tap} from "rxjs/operators";
import {Application, CreationAccreditationRequest} from "../core/models";
import {Pageable} from "../core/models/pageable.model";
import {NotifierService} from "angular-notifier";

@Component({
selector: 'app-accreditation-request',
templateUrl: './accreditation-request.component.html'
})
export class AccreditationRequestComponent implements OnInit {
model: Application;
searching = false;
searchFailed = false;
request: CreationAccreditationRequest = {applicationId: undefined, wantManage: false, wantUse: false};

constructor(private accreditationRequestsService: AccreditationRequestsService,
private applicationsService: ApplicationsService,
private notifierService: NotifierService) {
}

formatter = (result: Application) => result.name;


search = (text$: Observable<string>) =>
text$.pipe(
debounceTime(300),
distinctUntilChanged(),
tap(() => this.searching = true),
switchMap(term =>
this.applicationsService.search(new Pageable(0,10, 'name,asc'), term)
.pipe(
map(value => value.content),
tap(() => this.searchFailed = false),
catchError(() => {
this.searchFailed = true;
return of([]);
}))
),
tap(() => this.searching = false)
);

ngOnInit(): void {
}

sendRequest(){
this.request.applicationId = this.model.id;
this.accreditationRequestsService.sendAccreditation(this.request).subscribe(
() => this.notifierService.notify('success', `Votre demande d'accréditation a bien été envoyée`),
(error) => this.notifierService.notify('error', `Votre demande d'accréditation n'a pas pu être envoyée : ${error}`)
);
}
}

27 changes: 27 additions & 0 deletions src/app/accreditation-requests/accreditation-request.module.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import {NgModule} from '@angular/core';
import {SharedModule} from '../shared';
import {IconsModule} from '../icons';
import {NgbPaginationModule, NgbTypeaheadModule} from "@ng-bootstrap/ng-bootstrap";
import {AccreditationRequestComponent} from "./accreditation-request.component";
import {AccreditationRequestRoutingModule} from "./accreditation-request-routing.module";
import {ListAccreditationRequestComponent} from "./list-accreditation-request.component";

;

@NgModule({
declarations: [AccreditationRequestComponent, ListAccreditationRequestComponent],
imports: [
AccreditationRequestRoutingModule,
SharedModule,
IconsModule,
NgbPaginationModule,
NgbTypeaheadModule
],
exports: [
AccreditationRequestComponent,
ListAccreditationRequestComponent
],
entryComponents: []
})
export class AccreditationRequestModule {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<app-table [title]="title" [table]="table" (actionClicked)="onActionClicked($event)">
<ngb-pagination footer class="d-flex justify-content-center" [maxSize]="5" [collectionSize]="totalSize" [pageSize]="size" [(page)]="page" (pageChange)="onPageChange($event)" aria-label="Default pagination"></ngb-pagination>
</app-table>
120 changes: 120 additions & 0 deletions src/app/accreditation-requests/list-accreditation-request.component.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
import {Component, Input, OnInit} from '@angular/core';
import {AccreditationRequestsService} from '../core/services';
import {Pageable} from "../core/models/pageable.model";
import {Action, ColumnsDefinition, Table} from "../shared/table/table.model";
import {Constants} from "../shared/Constants";
import {Observable} from "rxjs";
import {AccreditationRequest} from "../core/models";
import {Page} from "../core/models/page.model";
import {ActionClickEvent} from "../shared/table/action-click-event.model";
import {NotifierService} from "angular-notifier";

@Component({
selector: 'app-list-accreditation-request',
templateUrl: './list-accreditation-request.component.html'
})
export class ListAccreditationRequestComponent implements OnInit {
@Input() userOnly: boolean;
title = 'Liste des demandes d\'accréditation à traiter';

private idActionAccept = 'accept';
private idActionReject = 'reject';

size = this.constants.numberByPage;
page = 0;
totalSize = 0;
table: Table;


constructor(private accreditationRequestsService: AccreditationRequestsService,
private notifierService: NotifierService,
private constants: Constants) {
}

ngOnInit(): void {
if(this.userOnly){
this.title = 'Liste des demandes d\'accréditation';
}
this.showAccreditationRequest();
}

listRequest(pageable: Pageable) : Observable<Page<AccreditationRequest>> {
if(this.userOnly) {
return this.accreditationRequestsService.getAllMyRequests(pageable);
}
return this.accreditationRequestsService.getAllNeedAnswer(pageable);
}

refreshAccreditationRequests(pageable: Pageable = new Pageable(0, this.constants.numberByPage, 'id,desc')) {
this.listRequest(pageable).subscribe(
accreditationRequests => {
this.table.items = accreditationRequests.content;
for (let request of this.table.items) {
request.application = request.application.name;
}
this.totalSize = accreditationRequests.totalElements;
}
);
}

showAccreditationRequest() {
this.table = new Table();
this.table.showHeader = true;
this.table.showFooter = true;

this.table.settings.columnsDefinition.id = new ColumnsDefinition();
this.table.settings.columnsDefinition.id.title = 'Id';
this.table.settings.columnsDefinition.id.order = 1;
this.table.settings.columnsDefinition.application = new ColumnsDefinition();
this.table.settings.columnsDefinition.application.title = 'Nom de l\'application';
this.table.settings.columnsDefinition.application.order = 2;
this.table.settings.columnsDefinition.wantUse = new ColumnsDefinition();
this.table.settings.columnsDefinition.wantUse.title = 'Droit d\'utilisation';
this.table.settings.columnsDefinition.wantUse.order = 3;
this.table.settings.columnsDefinition.wantManage = new ColumnsDefinition();
this.table.settings.columnsDefinition.wantManage.title = 'Droit de gestion';
this.table.settings.columnsDefinition.wantManage.order = 4;
this.table.settings.columnsDefinition.state = new ColumnsDefinition();
this.table.settings.columnsDefinition.state.title = 'Etat';
this.table.settings.columnsDefinition.state.order = 5;
if(!this.userOnly){
this.table.settings.actionsDefinition.title = 'Action';
this.table.settings.actionsDefinition.actions.push(new Action('Accepter', this.idActionAccept));
this.table.settings.actionsDefinition.actions.push(new Action('Refuser', this.idActionReject));
}
this.refreshAccreditationRequests();
}

onActionClicked(event: ActionClickEvent) {
if (event.id === this.idActionAccept) {
this.accreditationRequestsService.sendResponse({accepted: true, id: event.item.id}).subscribe(
() => {
this.notifierService.notify('success', `Demande acceptée avec succès`);
this.refreshAccreditationRequests();
},
(error) => {
this.notifierService.notify('error', `Une erreur est survenue lors de l'acceptation : ${error}`);
this.refreshAccreditationRequests();
}
)
}

if (event.id === this.idActionReject) {
this.accreditationRequestsService.sendResponse({accepted: false, id: event.item.id}).subscribe(
() => {
this.notifierService.notify('success', `Demande rejetée avec succès`);
this.refreshAccreditationRequests();
},
(error) => {
this.notifierService.notify('error', `Une erreur est survenue lors du rejet : ${error}`);
this.refreshAccreditationRequests();
}
);
}
}

onPageChange(event) {
this.refreshAccreditationRequests(new Pageable(this.page - 1, this.size, 'id,desc'))
}
}

8 changes: 6 additions & 2 deletions src/app/app.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,11 @@ export class AppComponent implements OnInit {
);
}
this.userService.populate();
this.userService.isAuthenticated.subscribe((result) => this.isAuthenticated = result);
this.globalSettingsService.populateGlobalSetting();
this.userService.isAuthenticated.subscribe((result) => {
this.isAuthenticated = result;
if(result){
this.globalSettingsService.populateGlobalSetting();
}
});
}
}
2 changes: 2 additions & 0 deletions src/app/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import {TranslateLoader, TranslateModule} from "@ngx-translate/core";
import {HttpClient} from "@angular/common/http";
import {TranslateHttpLoader} from "@ngx-translate/http-loader";
import { AnonymousComponent } from './anonymous/anonymous.component';
import {AccreditationRequestModule} from "./accreditation-requests/accreditation-request.module";

export function HttpLoaderFactory(http: HttpClient) {
return new TranslateHttpLoader(http, "./assets/i18n/", ".json");
Expand All @@ -32,6 +33,7 @@ registerLocaleData(localeFr);
BrowserAnimationsModule,
CoreModule,
SharedModule,
AccreditationRequestModule,
AuthModule,
IconsModule,
NgbModule,
Expand Down
4 changes: 1 addition & 3 deletions src/app/batchs/batchs.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@ import {Pageable} from "../core/models/pageable.model";
styleUrls: ['./batchs.component.scss']
})
export class BatchsComponent implements OnInit {


private idActionRun = 'run';
private idActionRunWithParameter = 'runWithParameter';
environmentSelected: Environment;
Expand Down Expand Up @@ -51,7 +49,7 @@ export class BatchsComponent implements OnInit {
this.showBatch();
}
refreshBatchs(pageable?: Pageable) {
this.batchsService.getAllFromEnvironment(this.environmentSelected.id).subscribe(
this.batchsService.getAllFromEnvironment(this.environmentSelected.id, pageable).subscribe(
batchs => {
this.table.items = batchs.content;
this.totalSize = batchs.totalElements;
Expand Down
4 changes: 3 additions & 1 deletion src/app/core/core.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { HTTP_INTERCEPTORS } from '@angular/common/http';
import { HttpTokenInterceptor } from './interceptors';

import {
AccreditationRequestsService,
ApiService,
ApplicationsService,
AuthGuard, BatchsService, ChainsService,
Expand Down Expand Up @@ -40,7 +41,8 @@ import {FileKindsService} from './services/file-kinds.service';
UsersService,
NewsService,
NotificationsService,
GlobalSettingsService
GlobalSettingsService,
AccreditationRequestsService
],
declarations: []
})
Expand Down
13 changes: 13 additions & 0 deletions src/app/core/models/accreditation-request.model.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import {Environment} from './environment.model';
import {Audit} from './audit.model';
import {User} from "./user.model";
import {Application} from "./application.model";

export interface AccreditationRequest extends Audit {
id: number;
user: User;
wantManage: boolean;
wantUse: boolean;
application: Application;
state: string;
}
5 changes: 5 additions & 0 deletions src/app/core/models/creation-accreditation-request.model.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export interface CreationAccreditationRequest {
applicationId: number;
wantManage: boolean;
wantUse: boolean;
}
3 changes: 3 additions & 0 deletions src/app/core/models/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,6 @@ export * from './usage-application.model'
export * from './notification.model'
export * from './roles.model'
export * from './global-setting.model'
export * from './creation-accreditation-request.model'
export * from './accreditation-request.model'
export * from './response-accreditation-request.model'
4 changes: 4 additions & 0 deletions src/app/core/models/response-accreditation-request.model.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export interface ResponseAccreditationRequest {
id: number;
accepted: boolean;
}
37 changes: 37 additions & 0 deletions src/app/core/services/accreditation-requests.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import {Injectable} from '@angular/core';
import {Observable} from 'rxjs';

import {ApiService} from './api.service';
import {
AccreditationRequest,
CreationAccreditationRequest, ResponseAccreditationRequest
} from '../models';
import {Page} from "../models/page.model";
import {Pageable} from "../models/pageable.model";

@Injectable()
export class AccreditationRequestsService {
private apiName = '/accreditation-requests';
constructor(
private apiService: ApiService
) {
}

getAllNeedAnswer(pageable: Pageable = new Pageable(0,20)): Observable<Page<AccreditationRequest>> {
return this.apiService.get(`${this.apiName}/need-answer`, pageable);
}

getAllMyRequests(pageable: Pageable = new Pageable(0,20)): Observable<Page<AccreditationRequest>> {
return this.apiService.get(`${this.apiName}`, pageable);
}

sendAccreditation(creationAccreditationRequest: CreationAccreditationRequest): Observable<AccreditationRequest> {
return this.apiService.put(`${this.apiName}`, creationAccreditationRequest);
}

sendResponse(responseAccreditationRequest: ResponseAccreditationRequest): Observable<void> {
return this.apiService.post(`${this.apiName}/response`, responseAccreditationRequest);
}


}
4 changes: 4 additions & 0 deletions src/app/core/services/applications.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@ export class ApplicationsService {
return this.apiService.get(`${this.apiName}`, pageable);
}

search(pageable: Pageable = new Pageable(0,20), name: string): Observable<Page<Application>> {
return this.apiService.get(`${this.apiName}/search?name=${name}`, pageable);
}

getAllModerable(pageable: Pageable = new Pageable(0,20)): Observable<Page<Application>> {
return this.apiService.get(`${this.apiName}/write`, pageable);
}
Expand Down
Loading

0 comments on commit 3e4e5ca

Please sign in to comment.