diff --git a/src/frontend/app/administration/group/indexing/indexing-administration.component.html b/src/frontend/app/administration/group/indexing/indexing-administration.component.html index ae1a19f23359000d7e01766bbab9e5e3bd5b6e0f..67a04724d0dd86c353a124dcff7708160963a2f2 100644 --- a/src/frontend/app/administration/group/indexing/indexing-administration.component.html +++ b/src/frontend/app/administration/group/indexing/indexing-administration.component.html @@ -10,21 +10,7 @@ <div class="formType-title"> Action(s) choisie(s) </div> - <mat-form-field appearance="outline"> - <input id="addAction" type="text" placeholder="Associer une nouvelle action" aria-label="Number" - matInput [formControl]="myControl" [matAutocomplete]="auto" (focus)="myControl.setValue('')"> - <mat-autocomplete #auto="matAutocomplete" (optionSelected)="addAction($event)"> - <mat-optgroup *ngIf="actionList.length > 0" label="Action(s) disponible(s)"> - <mat-option *ngFor="let action of filteredActionList | async | sortBy: 'label_action'" - [value]="action.id"> - {{action.label_action}} - </mat-option> - </mat-optgroup> - <mat-option *ngIf="actionList.length === 0" disabled> - Aucune action disponible - </mat-option> - </mat-autocomplete> - </mat-form-field> + <plugin-autocomplete [labelPlaceholder]="'Associer une nouvelle action'" [labelList]="'Action(s) disponible(s)'" [datas]="actionList" [targetSearchKey]="'label_action'" (triggerEvent)="addAction($event)"></plugin-autocomplete> <mat-list class="selectedActionList" role="list"> <mat-list-item class="selectedAction" role="listitem" *ngFor="let action of indexingInfo.actions;let i=index"> diff --git a/src/frontend/app/administration/group/indexing/indexing-administration.component.ts b/src/frontend/app/administration/group/indexing/indexing-administration.component.ts index 468344640b631d855372ae648a520670eac9ded7..ce734fd2571e9ab7b8b8a126cdb35544ea0cb142 100644 --- a/src/frontend/app/administration/group/indexing/indexing-administration.component.ts +++ b/src/frontend/app/administration/group/indexing/indexing-administration.component.ts @@ -1,14 +1,9 @@ import { Component, OnInit, Input } from '@angular/core'; import { HttpClient } from '@angular/common/http'; -import { ActivatedRoute, Router } from '@angular/router'; import { LANG } from '../../../translate.component'; import { NotificationService } from '../../../notification.service'; import { tap } from 'rxjs/internal/operators/tap'; -import { exhaustMap, startWith, map } from 'rxjs/operators'; -import { FormControl } from '@angular/forms'; -import { Observable } from 'rxjs'; -import { MatAutocompleteSelectedEvent } from '@angular/material'; -import { LatinisePipe } from 'ngx-pipes'; +import { map } from 'rxjs/operators'; declare function $j(selector: any): any; @@ -30,19 +25,15 @@ export class IndexingAdministrationComponent implements OnInit { keywordEntities: any[] = []; actionList: any[] = []; - myControl = new FormControl(); - indexingInfo: any = { canIndex: false, actions: [], keywords: [], entities: [] }; - filteredActionList: Observable<any[]>; constructor(public http: HttpClient, private notify: NotificationService, - private latinisePipe: LatinisePipe ) { this.keywordEntities = [{ @@ -105,12 +96,6 @@ export class IndexingAdministrationComponent implements OnInit { } ngOnInit(): void { - this.filteredActionList = this.myControl.valueChanges - .pipe( - startWith(''), - map(value => this._filter(value)) - ); - this.getIndexingInformations().pipe( tap((data: any) => this.indexingInfo.canIndex = data.group.canIndex), tap((data: any) => this.getActions(data.actions)), @@ -119,7 +104,6 @@ export class IndexingAdministrationComponent implements OnInit { map((data: any) => this.getSelectedEntities(data)), tap((data: any) => this.initEntitiesTree(data)) ).subscribe(); - } initEntitiesTree(entities: any) { @@ -165,14 +149,14 @@ export class IndexingAdministrationComponent implements OnInit { getSelectedEntities(data: any) { this.indexingInfo.entities = [...data.group.indexationParameters.entities]; - data.entities.forEach((entity: any) => { + /*data.entities.forEach((entity: any) => { if (this.indexingInfo.entities.indexOf(entity.id) > -1 ) { entity.state = { "opened": true, "selected": true }; } else { entity.state = { "opened": true, "selected": false }; } - }); + });*/ return data.entities; } @@ -217,12 +201,11 @@ export class IndexingAdministrationComponent implements OnInit { console.log(this.indexingInfo.keywords); } - addAction(actionOpt: MatAutocompleteSelectedEvent) { - const index = this.actionList.findIndex(action => action.id === actionOpt.option.value); + addAction(actionOpt: any) { + const index = this.actionList.findIndex(action => action.id === actionOpt.id); const action = {...this.actionList[index]}; this.indexingInfo.actions.push(action); this.actionList.splice(index, 1); - $j('#addAction').blur(); } removeAction(index: number) { @@ -230,13 +213,4 @@ export class IndexingAdministrationComponent implements OnInit { this.actionList.push(action); this.indexingInfo.actions.splice(index, 1); } - - private _filter(value: string): any[] { - if (typeof value === 'string') { - const filterValue = this.latinisePipe.transform(value.toLowerCase()); - return this.actionList.filter(option => this.latinisePipe.transform(option.label_action.toLowerCase()).includes(filterValue)); - } else { - return this.actionList; - } - } } diff --git a/src/frontend/app/app-common.module.ts b/src/frontend/app/app-common.module.ts index c4022c7843850c92a9382de6f1a858e6a9f30f36..c75bf65044f546ab03025646d155410879613dc0 100755 --- a/src/frontend/app/app-common.module.ts +++ b/src/frontend/app/app-common.module.ts @@ -47,6 +47,10 @@ import { BasketHomeComponent } from './basket/basket-home import { AlertComponent } from '../plugins/modal/alert.component'; import { ConfirmComponent } from '../plugins/modal/confirm.component'; +/*PLUGIN COMPONENT*/ +import { PluginAutocomplete } from '../plugins/autocomplete/autocomplete.component'; + + export class MyHammerConfig extends HammerGestureConfig { overrides = <any> { @@ -60,6 +64,7 @@ export class MyHammerConfig extends HammerGestureConfig { BrowserModule, BrowserAnimationsModule, FormsModule, + ReactiveFormsModule, HttpClientModule, RouterModule, PdfViewerModule, @@ -86,7 +91,8 @@ export class MyHammerConfig extends HammerGestureConfig { SmdFabSpeedDialTrigger, SmdFabSpeedDialActions, AlertComponent, - ConfirmComponent + ConfirmComponent, + PluginAutocomplete ], exports: [ CommonModule, @@ -115,7 +121,8 @@ export class MyHammerConfig extends HammerGestureConfig { SmdFabSpeedDialComponent, SmdFabSpeedDialTrigger, SmdFabSpeedDialActions, - DragDropModule + DragDropModule, + PluginAutocomplete ], providers: [ LatinisePipe, diff --git a/src/frontend/plugins/autocomplete/autocomplete.component.html b/src/frontend/plugins/autocomplete/autocomplete.component.html new file mode 100644 index 0000000000000000000000000000000000000000..dba5ab6ffcbf1355715facfadcfffe662f725566 --- /dev/null +++ b/src/frontend/plugins/autocomplete/autocomplete.component.html @@ -0,0 +1,15 @@ +<form> + <mat-form-field appearance="outline"> + <input type="text" #autoCompleteInput [placeholder]="placeholder" aria-label="Number" matInput [formControl]="myControl" [matAutocomplete]="auto" (focus)="myControl.setValue('')"> + <mat-autocomplete #auto="matAutocomplete" (optionSelected)="selectOpt($event)"> + <mat-optgroup [label]="optGroupLabel" *ngIf="options.length > 0"> + <mat-option *ngFor="let option of filteredOptions | async | sortBy: key" [value]="option"> + {{option[key]}} + </mat-option> + </mat-optgroup> + <mat-option *ngIf="options.length === 0" disabled> + Aucun élément disponible + </mat-option> + </mat-autocomplete> + </mat-form-field> +</form> \ No newline at end of file diff --git a/src/frontend/plugins/autocomplete/autocomplete.component.scss b/src/frontend/plugins/autocomplete/autocomplete.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/frontend/plugins/autocomplete/autocomplete.component.ts b/src/frontend/plugins/autocomplete/autocomplete.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..6fe36de0d4a088687dab4dba9713e011573c1857 --- /dev/null +++ b/src/frontend/plugins/autocomplete/autocomplete.component.ts @@ -0,0 +1,54 @@ +import { Component, OnInit } from '@angular/core'; +import { FormControl } from '@angular/forms'; +import { Input, EventEmitter, Output, ViewChild, ElementRef } from '@angular/core'; +import { Observable } from 'rxjs'; +import { map, startWith } from 'rxjs/operators'; +import { LatinisePipe } from 'ngx-pipes'; + +@Component({ + selector: 'plugin-autocomplete', + templateUrl: 'autocomplete.component.html', + styleUrls: ['autocomplete.component.scss'], +}) +export class PluginAutocomplete implements OnInit { + myControl = new FormControl(); + + @Input('datas') options: any; + @Input('labelPlaceholder') placeholder: string; + @Input('labelList') optGroupLabel: string; + @Input('targetSearchKey') key: string; + @Output('triggerEvent') selectedOpt = new EventEmitter(); + + @ViewChild('autoCompleteInput') autoCompleteInput: ElementRef; + + filteredOptions: Observable<string[]>; + + constructor(private latinisePipe: LatinisePipe + ) { } + + ngOnInit() { + this.optGroupLabel = this.optGroupLabel === undefined ? 'Valeurs disponibles' : this.optGroupLabel; + this.placeholder = this.placeholder === undefined ? 'Choisissez une valeur' : this.placeholder; + + this.filteredOptions = this.myControl.valueChanges + .pipe( + startWith(''), + map(value => this._filter(value)) + ); + } + + selectOpt(ev: any) { + this.myControl.setValue(''); + this.autoCompleteInput.nativeElement.blur(); + this.selectedOpt.emit(ev.option.value); + } + + private _filter(value: string): string[] { + if (typeof value === 'string') { + const filterValue = this.latinisePipe.transform(value.toLowerCase()); + return this.options.filter((option: any) => this.latinisePipe.transform(option.label_action.toLowerCase()).includes(filterValue)); + } else { + return this.options; + } + } +} \ No newline at end of file