diff --git a/src/frontend/app/administration/basket/basket-administration.component.ts b/src/frontend/app/administration/basket/basket-administration.component.ts index e84db6c585d625267f80fc727449ce8444d1989e..bd062c2c0910dcd08ceca9f823097762bf092667 100755 --- a/src/frontend/app/administration/basket/basket-administration.component.ts +++ b/src/frontend/app/administration/basket/basket-administration.component.ts @@ -354,7 +354,7 @@ export class BasketAdministrationSettingsModalComponent extends AutoCompletePlug statusCtrl = new FormControl(); constructor(public http: HttpClient, @Inject(MAT_DIALOG_DATA) public data: any, public dialogRef: MatDialogRef<BasketAdministrationSettingsModalComponent>) { - super(http, ['users', 'statuses']); + super(http, ['statuses']); } @ViewChild('statusInput') statusInput: ElementRef; diff --git a/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.html b/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.html index 4a62807522091cf3d6dfb65e2356bc31df31c833..dfb0eb58dfeb111e164040f70c5595cb54dc2f6c 100755 --- a/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.html +++ b/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.html @@ -51,22 +51,7 @@ <mat-tab label="{{lang.diffusionList}}"> <div class="row" style="margin:0px;" id="visaCircuitContent"> <div class="col-md-12"> - <mat-form-field> - <input #autocompleteFilter type="text" class="autocompleteSearch" placeholder="{{lang.addUser}}" matInput [matAutocomplete]="auto" [formControl]="userCtrl"> - <mat-autocomplete #auto="matAutocomplete"> - <mat-option *ngFor="let elem of filteredUsers | async" [value]="elem.id" (click)="addElemListModelVisa(elem);autocompleteFilter.isOpen=true"> - <p mat-line *ngIf="elem.type == 'user'" style="margin:0;"> - <span class="col-xm-1" style="padding-right:5px;"> - <mat-icon color="primary" class="fa fa-user fa-2x" style="margin-right:0px;"></mat-icon> - </span> - <span class="col-xm-11"> - {{ elem.idToDisplay }} - <small>{{ elem.otherInfo }}</small> - </span> - </p> - </mat-option> - </mat-autocomplete> - </mat-form-field> + <plugin-autocomplete [labelPlaceholder]="lang.addUser" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/users']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="addElemListModelVisa($event)"></plugin-autocomplete> <mat-list> <span dnd-sortable-container [dropZones]="['boxers-zone']" [sortableData]="diffusionModel.diffusionList"> <mat-list-item disableRipple="true" *ngFor="let template of diffusionModel.diffusionList; let i = index" title="{{lang.move}}" diff --git a/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.ts b/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.ts index d9677d0afa11ab7769a1b71a6ff772543a026db3..72c3e8349cc384d85c1ddc5f1465ac44bfd83942 100755 --- a/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.ts +++ b/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.ts @@ -5,8 +5,6 @@ import { ActivatedRoute, Router } from '@angular/router'; import { LANG } from '../../translate.component'; import { NotificationService } from '../../notification.service'; import { HeaderService } from '../../../service/header.service'; - -import { AutoCompletePlugin } from '../../../plugins/autocomplete.plugin'; import { MatSidenav } from '@angular/material'; declare function $j(selector: any): any; @@ -19,7 +17,7 @@ declare const angularGlobals: any; styleUrls: ['diffusionModel-administration.component.css'], providers: [NotificationService] }) -export class DiffusionModelAdministrationComponent extends AutoCompletePlugin implements OnInit { +export class DiffusionModelAdministrationComponent implements OnInit { @ViewChild('snav') public sidenavLeft : MatSidenav; @ViewChild('snav2') public sidenavRight : MatSidenav; @@ -42,7 +40,6 @@ export class DiffusionModelAdministrationComponent extends AutoCompletePlugin im dataSource : any; constructor(changeDetectorRef: ChangeDetectorRef, media: MediaMatcher, public http: HttpClient, private route: ActivatedRoute, private router: Router, private notify: NotificationService, private headerService: HeaderService) { - super(http, ['users']); $j("link[href='merged_css.php']").remove(); this.mobileQuery = media.matchMedia('(max-width: 768px)'); this._mobileQueryListener = () => changeDetectorRef.detectChanges(); @@ -109,15 +106,13 @@ export class DiffusionModelAdministrationComponent extends AutoCompletePlugin im "item_id": element.id, "sequence": this.diffusionModel.diffusionList.length, "idToDisplay": element.idToDisplay, - "descriptionToDisplay": element.otherInfo + "descriptionToDisplay": element.descriptionToDisplay }; this.diffusionModel.diffusionList.push(newElemListModel); if (this.diffusionModel.diffusionList.length > 1) { this.diffusionModel.diffusionList[this.diffusionModel.diffusionList.length-2].item_mode = item_mode2; } - this.userCtrl.setValue(''); - $j('.autocompleteSearch').blur(); } updateDiffListVisa(template: any): any { diff --git a/src/frontend/app/administration/entity/entities-administration-redirect-modal.component.html b/src/frontend/app/administration/entity/entities-administration-redirect-modal.component.html index e37d5d2a84ba9eef2557c30cc930ed0ddb78cdd8..d8e55dded09caa1397408d59f78d399fe40d02de 100755 --- a/src/frontend/app/administration/entity/entities-administration-redirect-modal.component.html +++ b/src/frontend/app/administration/entity/entities-administration-redirect-modal.component.html @@ -1,49 +1,38 @@ <h2 mat-dialog-title>{{lang.entityReplacement}}</h2> -<form #changeEntityForm="ngForm"> - <mat-dialog-content> - <div class="alert alert-info" role="alert"> - <mat-list> - <mat-list-item *ngIf="data.entity.documents > 0"> - <mat-icon color="primary" mat-list-icon class="fa fa-file fa-2x"></mat-icon> - <p mat-line> - <b>{{data.entity.entity_label}}</b> {{lang.isDestTo}} - <b>{{data.entity.documents}}</b> {{lang.documents}}</p> - </mat-list-item> - <mat-list-item *ngIf="data.entity.instances > 0"> - <mat-icon color="primary" mat-list-icon class="fa fa-sitemap fa-2x"></mat-icon> - <p mat-line> - <b>{{data.entity.entity_label}}</b> {{lang.isCopyTo}} - <b>{{data.entity.instances}}</b> {{lang.documents}}</p> - </mat-list-item> - <mat-list-item *ngIf="data.entity.users.length > 0"> - <mat-icon color="primary" mat-list-icon class="fa fa-user fa-2x"></mat-icon> - <p mat-line> - <b>{{data.entity.entity_label}}</b> {{lang.isLinkedTo | lowercase}} - <b>{{data.entity.users.length}}</b> {{lang.users | lowercase}}</p> - </mat-list-item> - <mat-list-item *ngIf="data.entity.templates.length > 0"> - <mat-icon color="primary" mat-list-icon class="fa fa-file-alt fa-2x"></mat-icon> - <p mat-line> - <b>{{data.entity.entity_label}}</b> {{lang.isLinkedTo | lowercase}} - <b>{{data.entity.templates.length}}</b> {{lang.templates | lowercase}}</p> - </mat-list-item> - </mat-list> - </div> - <mat-form-field> - <input type="text" placeholder="{{lang.chooseEntity}}" matInput [matAutocomplete]="auto" [formControl]="elementCtrl" - [(ngModel)]="data.entity.redirectEntity"> - <mat-autocomplete #auto="matAutocomplete"> - <mat-option *ngFor="let elem of filteredElements | async" [value]="elem.id"> - <p mat-line> - <mat-icon [class]="elem.type == 'entity' ? 'fa fa-sitemap' : 'fa fa-user'" style="margin-right:0px;"></mat-icon> {{ elem.idToDisplay }} - <small>{{ elem.otherInfo }}</small> - </p> - </mat-option> - </mat-autocomplete> - </mat-form-field> - </mat-dialog-content> - <mat-dialog-actions> - <button style="margin:auto;" mat-raised-button color="warn" type="submit" class="btn btn-danger" (click)="dialogRef.close(data.entity)" - [disabled]="!changeEntityForm.form.valid || data.entity.redirectEntity == data.entity.entity_id">{{lang.delete}}</button> - </mat-dialog-actions> -</form> \ No newline at end of file +<mat-dialog-content> + <div class="alert alert-info" role="alert"> + <mat-list> + <mat-list-item *ngIf="data.entity.documents > 0"> + <mat-icon color="primary" mat-list-icon class="fa fa-file fa-2x"></mat-icon> + <p mat-line> + <b>{{data.entity.entity_label}}</b> {{lang.isDestTo}} + <b>{{data.entity.documents}}</b> {{lang.documents}}</p> + </mat-list-item> + <mat-list-item *ngIf="data.entity.instances > 0"> + <mat-icon color="primary" mat-list-icon class="fa fa-sitemap fa-2x"></mat-icon> + <p mat-line> + <b>{{data.entity.entity_label}}</b> {{lang.isCopyTo}} + <b>{{data.entity.instances}}</b> {{lang.documents}}</p> + </mat-list-item> + <mat-list-item *ngIf="data.entity.users.length > 0"> + <mat-icon color="primary" mat-list-icon class="fa fa-user fa-2x"></mat-icon> + <p mat-line> + <b>{{data.entity.entity_label}}</b> {{lang.isLinkedTo | lowercase}} + <b>{{data.entity.users.length}}</b> {{lang.users | lowercase}}</p> + </mat-list-item> + <mat-list-item *ngIf="data.entity.templates.length > 0"> + <mat-icon color="primary" mat-list-icon class="fa fa-file-alt fa-2x"></mat-icon> + <p mat-line> + <b>{{data.entity.entity_label}}</b> {{lang.isLinkedTo | lowercase}} + <b>{{data.entity.templates.length}}</b> {{lang.templates | lowercase}}</p> + </mat-list-item> + </mat-list> + </div> + <plugin-autocomplete [labelPlaceholder]="lang.chooseEntity" [labelList]="lang.availableEntities" [routeDatas]="['/rest/autocomplete/entities']" + [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="setRedirectEntity($event)" + singleMode required></plugin-autocomplete> +</mat-dialog-content> +<mat-dialog-actions> + <button style="margin:auto;" mat-raised-button color="warn" type="submit" class="btn btn-danger" (click)="dialogRef.close(data.entity)" + [disabled]="data.entity.redirectEntity === undefined || data.entity.redirectEntity == data.entity.entity_id">{{lang.delete}}</button> +</mat-dialog-actions> \ No newline at end of file diff --git a/src/frontend/app/administration/entity/entities-administration.component.html b/src/frontend/app/administration/entity/entities-administration.component.html index 45a34b27036299bcfce8d874666162311c05d999..8179f53accfbe126e35d880578e2305fb8f9b50e 100755 --- a/src/frontend/app/administration/entity/entities-administration.component.html +++ b/src/frontend/app/administration/entity/entities-administration.component.html @@ -201,23 +201,7 @@ <mat-tab label="{{lang.diffusionList}}" *ngIf="!creationMode"> <div class="row" style="margin:0px;"> <div class="col-md-12"> - <mat-form-field> - <input class="autocompleteSearch" #autocompleteFilter type="text" placeholder="{{lang.addUserOrEntity}}" matInput [matAutocomplete]="auto" - [formControl]="elementCtrl"> - <mat-autocomplete #auto="matAutocomplete"> - <mat-option *ngFor="let elem of filteredElements | async" [value]="elem.id" (click)="addElemListModel(elem)"> - <p mat-line style="margin:0;"> - <span class="col-xm-1" style="padding-right:5px;"> - <mat-icon color="primary" [class]="elem.type == 'entity' ? 'fa fa-sitemap fa-2x' : 'fa fa-user fa-2x'" style="margin-right:0px;"></mat-icon> - </span> - <span class="col-xm-11"> - {{ elem.idToDisplay }} - <small>{{ elem.otherInfo }}</small> - </span> - </p> - </mat-option> - </mat-autocomplete> - </mat-form-field> + <plugin-autocomplete [labelPlaceholder]="lang.addUserOrEntity" [routeDatas]="['/rest/autocomplete/users','/rest/autocomplete/entities']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="addElemListModel($event)"></plugin-autocomplete> <mat-list *ngIf="currentEntity.entity_id"> <span *ngFor="let role of listTemplateRoles; let i = index"> <h3 *ngIf="role.available" mat-subheader style="font-weight:bold;" color="primary">{{role.label}}</h3> @@ -250,23 +234,7 @@ <mat-tab label="{{lang.visaWorkflow}}" *ngIf="!creationMode"> <div class="row" style="margin:0px;" id="visaCircuitContent"> <div class="col-md-12"> - <mat-form-field> - <input #autocompleteFilter class="autocompleteSearch" type="text" placeholder="{{lang.addVisaSignUser}}" matInput [matAutocomplete]="auto" - [formControl]="visaUserCtrl"> - <mat-autocomplete #auto="matAutocomplete"> - <mat-option *ngFor="let elem of filteredVisaUsers | async" [value]="elem.id" (click)="addElemListModelVisa(elem);autocompleteFilter.isOpen=true"> - <p mat-line *ngIf="elem.type == 'user'" style="margin:0;"> - <span class="col-xm-1" style="padding-right:5px;"> - <mat-icon color="primary" class="fa fa-user fa-2x" style="margin-right:0px;"></mat-icon> - </span> - <span class="col-xm-11"> - {{ elem.idToDisplay }} - <small>{{ elem.otherInfo }}</small> - </span> - </p> - </mat-option> - </mat-autocomplete> - </mat-form-field> + <plugin-autocomplete [labelPlaceholder]="lang.addVisaSignUser" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/users/visa']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="addElemListModelVisa($event)"></plugin-autocomplete> <mat-list> <span dnd-sortable-container [dropZones]="['boxers-zone']" [sortableData]="currentEntity.visaTemplate"> <mat-list-item disableRipple="true" *ngFor="let template of currentEntity.visaTemplate; let i = index" title="{{lang.move}}" @@ -293,23 +261,7 @@ <mat-tab label="{{lang.users}}" *ngIf="!creationMode"> <div class="row" style="margin:0px;"> <div class="col-md-12" *ngIf="currentEntity.canAdminUsers" style="padding:5px;"> - <mat-form-field> - <span matPrefix><mat-icon class="fa fa-user-plus" color="primary"></mat-icon> </span> - <input class="autocompleteSearch" #autocompleteFilter type="text" placeholder="{{lang.linkUser}}" matInput [matAutocomplete]="auto" [formControl]="userCtrl"> - <mat-autocomplete #auto="matAutocomplete"> - <mat-option *ngFor="let user of filteredUsers | async" [value]="user.idToDisplay" (click)="linkUser(user)"> - <p mat-line style="margin:0;"> - <span class="col-xm-1" style="padding-right:5px;"> - <mat-icon color="primary" [class]="user.type == 'entity' ? 'fa fa-sitemap fa-2x' : 'fa fa-user fa-2x'" style="margin-right:0px;"></mat-icon> - </span> - <span class="col-xm-11"> - {{ user.idToDisplay }} - <small>{{ user.otherInfo }}</small> - </span> - </p> - </mat-option> - </mat-autocomplete> - </mat-form-field> + <plugin-autocomplete [labelPlaceholder]="lang.linkUser" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/users/administration']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="linkUser($event)"></plugin-autocomplete> <hr/> </div> <div class="col-md-6 col-xs-6"> diff --git a/src/frontend/app/administration/entity/entities-administration.component.ts b/src/frontend/app/administration/entity/entities-administration.component.ts index b3afb89a82987d4b902e3257e1a01126ed27af10..f0b2668260ae895c71f6728b117d5fb2b9c1ba3a 100755 --- a/src/frontend/app/administration/entity/entities-administration.component.ts +++ b/src/frontend/app/administration/entity/entities-administration.component.ts @@ -8,8 +8,6 @@ import { NotificationService } from '../../notification.service'; import { HeaderService } from '../../../service/header.service'; import { Router } from '@angular/router'; -import { AutoCompletePlugin } from '../../../plugins/autocomplete.plugin'; - declare function $j(selector: any): any; declare var angularGlobals: any; @@ -19,7 +17,7 @@ declare var angularGlobals: any; styleUrls: ['entities-administration.component.css'], providers: [NotificationService] }) -export class EntitiesAdministrationComponent extends AutoCompletePlugin implements OnInit { +export class EntitiesAdministrationComponent implements OnInit { /*HEADER*/ titleHeader : string; @ViewChild('snav') public sidenavLeft : MatSidenav; @@ -67,7 +65,6 @@ export class EntitiesAdministrationComponent extends AutoCompletePlugin implemen } constructor(changeDetectorRef: ChangeDetectorRef, media: MediaMatcher, public http: HttpClient, private notify: NotificationService, public dialog: MatDialog, private headerService: HeaderService, private router: Router) { - super(http, ['adminUsers', 'usersAndEntities', 'visaUsers']); $j("link[href='merged_css.php']").remove(); this.mobileQuery = media.matchMedia('(max-width: 768px)'); this._mobileQueryListener = () => changeDetectorRef.detectChanges(); @@ -264,8 +261,6 @@ export class EntitiesAdministrationComponent extends AutoCompletePlugin implemen this.currentEntity.listTemplate.cc.unshift(newElemListModel); } } - this.elementCtrl.setValue(''); - $j('.autocompleteSearch').blur(); } addElemListModelVisa(element: any) { @@ -284,8 +279,6 @@ export class EntitiesAdministrationComponent extends AutoCompletePlugin implemen if (this.currentEntity.visaTemplate.length > 1) { this.currentEntity.visaTemplate[this.currentEntity.visaTemplate.length-2].item_mode = 'visa'; } - this.visaUserCtrl.setValue(''); - $j('.autocompleteSearch').blur(); } saveEntity() { @@ -704,8 +697,6 @@ export class EntitiesAdministrationComponent extends AutoCompletePlugin implemen } linkUser(newUser:any) { - this.userCtrl.setValue(''); - $j('.autocompleteSearch').blur(); let entity = { "entityId" : this.currentEntity.entity_id, "role" : '' @@ -739,10 +730,14 @@ export class EntitiesAdministrationComponent extends AutoCompletePlugin implemen @Component({ templateUrl: "entities-administration-redirect-modal.component.html" }) -export class EntitiesAdministrationRedirectModalComponent extends AutoCompletePlugin { +export class EntitiesAdministrationRedirectModalComponent { lang: any = LANG; constructor(public http: HttpClient, @Inject(MAT_DIALOG_DATA) public data: any, public dialogRef: MatDialogRef<EntitiesAdministrationRedirectModalComponent>) { - super(http, ['entities']); + console.log(this.data.entity.redirectEntity); + } + + setRedirectEntity(entity: any) { + this.data.entity.redirectEntity = entity.id; } } diff --git a/src/frontend/app/administration/group/group-administration.component.html b/src/frontend/app/administration/group/group-administration.component.html index 6325c66399c7418136a2db0a9ff0f50ca8b3a587..6b0c166bc7806710ef4ac247134d18bd47f82f56 100755 --- a/src/frontend/app/administration/group/group-administration.component.html +++ b/src/frontend/app/administration/group/group-administration.component.html @@ -80,7 +80,7 @@ <mat-tab label="{{lang.relatedUsers}}" *ngIf="!creationMode"> <div class="row" style="margin:0px;"> <div class="col-md-12" *ngIf="group.canAdminUsers" style="padding:5px;"> - <plugin-autocomplete [labelPlaceholder]="lang.linkUser" [labelList]="lang.availableUsers" [routeDatas]="'/rest/autocomplete/users'" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'id'" (triggerEvent)="linkUser($event)"></plugin-autocomplete> + <plugin-autocomplete [labelPlaceholder]="lang.linkUser" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/users']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'id'" (triggerEvent)="linkUser($event)"></plugin-autocomplete> <hr/> </div> <div class="col-md-6 col-xs-6"> diff --git a/src/frontend/app/administration/updateStatus/update-status-administration.component.html b/src/frontend/app/administration/updateStatus/update-status-administration.component.html index 49afcd80e25b74f8c642720181bc279f83bf6f30..4f3c5b2e186053f55fc3afed3a4a159b9c036bcf 100755 --- a/src/frontend/app/administration/updateStatus/update-status-administration.component.html +++ b/src/frontend/app/administration/updateStatus/update-status-administration.component.html @@ -57,16 +57,7 @@ <mat-divider></mat-divider> </mat-tab> </mat-tab-group> - <mat-form-field> - <input matInput [formControl]="statusCtrl" name="statusesList" placeholder="{{lang.availableStatuses}}" [(ngModel)]="this.statusId" - [matAutocomplete]="auto" required> - <mat-autocomplete #auto="matAutocomplete"> - <mat-option *ngFor="let status of filteredStatuses | async" [value]="status.id"> - {{status.idToDisplay}} - <small style="opacity:0.3;">{{status.id}}</small> - </mat-option> - </mat-autocomplete> - </mat-form-field> + <plugin-autocomplete [labelPlaceholder]="lang.availableStatuses" [labelList]="lang.availableStatuses" [datas]="statuses" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'id'" (triggerEvent)="setStatus($event)" singleMode required></plugin-autocomplete> <div class="form-group"> <div class="col-md-12 text-center" style="padding:10px;"> <button mat-raised-button [disabled]="(resIdList.length == 0 && chronoList.length == 0) || (resIdList.length > 0 && chronoList.length > 0) || !statusId" color="primary">{{lang.save}}</button> diff --git a/src/frontend/app/administration/updateStatus/update-status-administration.component.ts b/src/frontend/app/administration/updateStatus/update-status-administration.component.ts index b2e38e040191207e94a2bc8bcd3dd53450c9499f..e13243341c07e389aa598e9a332ac6e213afde95 100755 --- a/src/frontend/app/administration/updateStatus/update-status-administration.component.ts +++ b/src/frontend/app/administration/updateStatus/update-status-administration.component.ts @@ -5,8 +5,7 @@ import { LANG } from '../../translate.component'; import { MatSidenav } from '@angular/material'; import { NotificationService } from '../../notification.service'; import { HeaderService } from '../../../service/header.service'; - -import { AutoCompletePlugin } from '../../../plugins/autocomplete.plugin'; +import { tap } from 'rxjs/internal/operators/tap'; declare function $j(selector: any): any; declare var angularGlobals: any; @@ -17,7 +16,7 @@ declare var angularGlobals: any; styleUrls: ['update-status-administration.component.css'], providers: [NotificationService] }) -export class UpdateStatusAdministrationComponent extends AutoCompletePlugin implements OnInit { +export class UpdateStatusAdministrationComponent implements OnInit { @ViewChild('snav') public sidenavLeft : MatSidenav; @ViewChild('snav2') public sidenavRight : MatSidenav; @@ -37,7 +36,6 @@ export class UpdateStatusAdministrationComponent extends AutoCompletePlugin impl chronoList : string[] = []; constructor(changeDetectorRef: ChangeDetectorRef, media: MediaMatcher, public http: HttpClient, private notify: NotificationService, private headerService: HeaderService) { - super(http, ['statuses']); $j("link[href='merged_css.php']").remove(); this.mobileQuery = media.matchMedia('(max-width: 768px)'); this._mobileQueryListener = () => changeDetectorRef.detectChanges(); @@ -55,7 +53,11 @@ export class UpdateStatusAdministrationComponent extends AutoCompletePlugin impl this.loading = true; this.coreUrl = angularGlobals.coreUrl; - this.loading = false; + + this.http.get(this.coreUrl + 'rest/autocomplete/statuses').pipe( + tap((data : any) => this.statuses = data), + tap(() => this.loading = false) + ).subscribe(); } onSubmit() { @@ -95,6 +97,10 @@ export class UpdateStatusAdministrationComponent extends AutoCompletePlugin impl this.chrono = ""; } + setStatus(status: any) { + this.statusId = status.id; + } + removeResId(resId: string) :void { var resIdIndex = this.resIdList.indexOf(resId); this.resIdList.splice(resIdIndex,1); diff --git a/src/frontend/app/administration/user/account-link/account-link.component.html b/src/frontend/app/administration/user/account-link/account-link.component.html index c28c0c2e3810461ca21820ab89afff71826a9d87..f5388f5001f5140a1794b8e18ee9bc778aaf1e77 100644 --- a/src/frontend/app/administration/user/account-link/account-link.component.html +++ b/src/frontend/app/administration/user/account-link/account-link.component.html @@ -1,14 +1,6 @@ <h1 mat-dialog-title>{{lang.linkAccount}}</h1> <mat-dialog-content class="modal-container"> - <mat-form-field appearance="outline" floatLabel="never" [style.fontSize.px]="10"> - <input id="availableUsers" type="text" matInput placeholder="{{lang.searchUserInMaarchParapheur}}" - [matAutocomplete]="auto" [formControl]="userCtrl"> - <mat-autocomplete #auto="matAutocomplete" (optionSelected)="selectUser($event)" isOpen="true"> - <mat-option *ngFor="let user of filteredUsers | async" [value]="user"> - {{user.idToDisplay}} - </mat-option> - </mat-autocomplete> - </mat-form-field> + <plugin-autocomplete [labelPlaceholder]="lang.searchUserInMaarchParapheur" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/maarchParapheurUsers']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'email'" (triggerEvent)="selectUser($event)"></plugin-autocomplete> <mat-list *ngIf="externalUser.inMaarchParapheur"> <mat-list-item > <mat-icon class="avatarAccount" color="primary" mat-list-icon diff --git a/src/frontend/app/administration/user/account-link/account-link.component.ts b/src/frontend/app/administration/user/account-link/account-link.component.ts index 54ff6205fe8433fb594039719e152a715c1f388c..eadac752f8c58c4fd136a077a9f15328d7d7c451 100644 --- a/src/frontend/app/administration/user/account-link/account-link.component.ts +++ b/src/frontend/app/administration/user/account-link/account-link.component.ts @@ -1,7 +1,6 @@ import { Component, Inject } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; import { LANG } from '../../../translate.component'; -import { AutoCompletePlugin } from '../../../../plugins/autocomplete.plugin'; import { HttpClient } from '@angular/common/http'; import { NotificationService } from '../../../notification.service'; @@ -12,7 +11,7 @@ declare function $j(selector: any): any; styleUrls: ['account-link.component.scss'], providers: [NotificationService] }) -export class AccountLinkComponent extends AutoCompletePlugin { +export class AccountLinkComponent { lang: any = LANG; externalUser: any = { inMaarchParapheur: false, @@ -24,11 +23,10 @@ export class AccountLinkComponent extends AutoCompletePlugin { }; constructor(public http: HttpClient, @Inject(MAT_DIALOG_DATA) public data: any, public dialogRef: MatDialogRef<AccountLinkComponent>, private notify: NotificationService) { - super(http, ['signatureBookUsersNotLinked']); } ngOnInit(): void { - this.http.get(this.coreUrl + 'rest/autocomplete/maarchParapheurUsers', { params: { "search": this.data.user.mail, "exludeAlreadyConnected": 'true' } }) + this.http.get('../../rest/autocomplete/maarchParapheurUsers', { params: { "search": this.data.user.mail, "exludeAlreadyConnected": 'true' } }) .subscribe((dataUsers: any) => { if ( dataUsers.length > 0) { this.externalUser = dataUsers[0]; @@ -51,10 +49,8 @@ export class AccountLinkComponent extends AutoCompletePlugin { } - selectUser(event: any) { - $j('#availableUsers').blur(); - this.userCtrl.setValue(''); - this.externalUser = event.option.value; + selectUser(user: any) { + this.externalUser = user; this.externalUser.inMaarchParapheur = true; this.http.get("../../rest/maarchParapheur/user/" + this.externalUser.id + "/picture") .subscribe((data: any) => { diff --git a/src/frontend/app/administration/user/user-administration-redirect-modal.component.html b/src/frontend/app/administration/user/user-administration-redirect-modal.component.html index b5e2c896b254760ba6a8a154bfb81e9f39d9059b..157cd4156b9d4a8e0957e7fd15a88790c0db2644 100755 --- a/src/frontend/app/administration/user/user-administration-redirect-modal.component.html +++ b/src/frontend/app/administration/user/user-administration-redirect-modal.component.html @@ -19,28 +19,7 @@ {{lang.reaffectUserRedirect}} </mat-radio-button> </mat-radio-group> - <mat-form-field *ngIf="this.processMode == 'reaffect'"> - <input name="userDestRedirectModel" id="userDestRedirectModel" type="text" placeholder="{{lang.userReplacement}}" matInput - [matAutocomplete]="auto" [formControl]="userCtrl" [(ngModel)]="this.redirectUser" tabindex="-1" required> - <mat-autocomplete #auto="matAutocomplete"> - <mat-option value="NO_USER" style="text-align:center;"> - <i>- {{lang.noUserReplacement}} -</i> - </mat-option> - <ng-container *ngFor="let user of filteredUsers | async"> - <mat-option [value]="user.id"> - <div class="container-fluid"> - <span class="col-xm-1"> - <mat-icon color="primary" class="fa fa-user fa-2x" style="margin-right:0px;"></mat-icon> - </span> - <span class="col-xm-11"> - {{ user.idToDisplay }} - <small>{{ user.otherInfo }}</small> - </span> - </div> - </mat-option> - </ng-container> - </mat-autocomplete> - </mat-form-field> + <plugin-autocomplete *ngIf="this.processMode == 'reaffect'" [labelPlaceholder]="lang.userReplacement" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/users']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="setRedirectUser($event)" singleMode required></plugin-autocomplete> <div class="alert-message alert-message-info" role="alert" style="max-width: inherit;"> <span *ngIf="this.processMode == ''"><em>{{lang.doNothingRedirectInformations}}</em></span> diff --git a/src/frontend/app/administration/user/user-administration.component.html b/src/frontend/app/administration/user/user-administration.component.html index c5f4bb2a61a00ddfb4f4b68044db73ba837168a9..1a53580033dc6cc918662bf0cd3b8eccdfe9b5c5 100755 --- a/src/frontend/app/administration/user/user-administration.component.html +++ b/src/frontend/app/administration/user/user-administration.component.html @@ -265,27 +265,8 @@ (click)="toggleBasket(true)"> <mat-icon class="fa fa-check"></mat-icon> </button> - <mat-menu #menu="matMenu"> - <mat-form-field style="padding:10px;width:200px !important;"> - <input (click)="$event.stopPropagation()" type="text" - placeholder="{{ lang.users }}" matInput [matAutocomplete]="auto" - [formControl]="userCtrl"> - <mat-autocomplete #auto="matAutocomplete"> - <mat-option *ngFor="let user of filteredUsers | async" - [value]="user.id" (click)="addBasketRedirection(user)"> - <p mat-line matTooltip="{{ user.otherInfo }}"> - <span class="col-xm-1"> - <mat-icon color="primary" class="fa fa-user fa-2x" - style="margin-right:0px;"></mat-icon> - </span> - <span class="col-xm-11"> - {{ user.idToDisplay }} - <small>{{ user.otherInfo }}</small> - </span> - </p> - </mat-option> - </mat-autocomplete> - </mat-form-field> + <mat-menu #menu="matMenu" style="width:200px !important;"> + <plugin-autocomplete [labelPlaceholder]="lang.redirectBaskets" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/users']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="addBasketRedirection($event)"></plugin-autocomplete> </mat-menu> </p> </mat-list-item> @@ -356,30 +337,7 @@ style="font-weight:normal">{{basket.group_desc}}</span> </h4> <p mat-line> - <mat-form-field *ngIf="basket.userToDisplay == null" - floatLabel="never"> - <input matTooltip="{{lang.redirectBasket}}" - matTooltipPosition="above" type="text" - placeholder="{{lang.redirectBasket}}" matInput - [matAutocomplete]="auto" [formControl]="userCtrl"> - <mat-autocomplete #auto="matAutocomplete"> - <mat-option *ngFor="let user of filteredUsers | async" - [value]="user.id" - (click)="reassignBasketRedirection(user.id,basket,i)"> - <p mat-line matTooltip="{{ user.otherInfo }}"> - <span class="col-xm-1"> - <mat-icon color="primary" - class="fa fa-user fa-2x" - style="margin-right:0px;"></mat-icon> - </span> - <span class="col-xm-11"> - {{ user.idToDisplay }} - <small>{{ user.otherInfo }}</small> - </span> - </p> - </mat-option> - </mat-autocomplete> - </mat-form-field> + <plugin-autocomplete *ngIf="basket.userToDisplay == null" [labelPlaceholder]="lang.redirectBaskets" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/users']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="reassignBasketRedirection($event,basket,i)"></plugin-autocomplete> <mat-form-field> <input type="text" color="warn" matInput disabled value="{{lang.assignBy}} {{basket.userToDisplay}}"> diff --git a/src/frontend/app/administration/user/user-administration.component.ts b/src/frontend/app/administration/user/user-administration.component.ts index 635b41b8354646a856d3424cbceffac5847e26c9..93cc7ca026b85a5a5782b138594907645c6c7de2 100755 --- a/src/frontend/app/administration/user/user-administration.component.ts +++ b/src/frontend/app/administration/user/user-administration.component.ts @@ -4,11 +4,10 @@ import { HttpClient } from '@angular/common/http'; import { ActivatedRoute, Router } from '@angular/router'; import { LANG } from '../../translate.component'; import { MatSidenav, MatPaginator, MatTableDataSource, MatSort, MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material'; -import { FormControl, FormGroup, Validators, AbstractControl, ValidationErrors, ValidatorFn, FormBuilder } from '@angular/forms'; +import { FormGroup, Validators, AbstractControl, ValidationErrors, ValidatorFn, FormBuilder } from '@angular/forms'; import { NotificationService } from '../../notification.service'; import { HeaderService } from '../../../service/header.service'; -import { AutoCompletePlugin } from '../../../plugins/autocomplete.plugin'; import { SelectionModel } from '@angular/cdk/collections'; import { AccountLinkComponent } from './account-link/account-link.component'; @@ -21,7 +20,7 @@ declare const angularGlobals: any; styleUrls: ['user-administration.component.scss'], providers: [NotificationService] }) -export class UserAdministrationComponent extends AutoCompletePlugin implements OnInit { +export class UserAdministrationComponent implements OnInit { @ViewChild('snav') public sidenavLeft: MatSidenav; @ViewChild('snav2') public sidenavRight: MatSidenav; @@ -111,7 +110,6 @@ export class UserAdministrationComponent extends AutoCompletePlugin implements O constructor(changeDetectorRef: ChangeDetectorRef, media: MediaMatcher, public http: HttpClient, private route: ActivatedRoute, private router: Router, private zone: NgZone, private notify: NotificationService, public dialog: MatDialog, private headerService: HeaderService, private _formBuilder: FormBuilder) { - super(http, ['users']); $j("link[href='merged_css.php']").remove(); this.mobileQuery = media.matchMedia('(max-width: 768px)'); this._mobileQueryListener = () => changeDetectorRef.detectChanges(); @@ -560,7 +558,6 @@ export class UserAdministrationComponent extends AutoCompletePlugin implements O if (r) { this.http.post(this.coreUrl + "rest/users/" + this.serialId + "/redirectedBaskets", basketsRedirect) .subscribe((data: any) => { - this.userCtrl.setValue(''); this.user.baskets = data["baskets"]; this.user.redirectedBaskets = data["redirectedBaskets"]; this.selectionBaskets.clear(); @@ -584,7 +581,6 @@ export class UserAdministrationComponent extends AutoCompletePlugin implements O } ]) .subscribe((data: any) => { - this.userCtrl.setValue(''); this.user.baskets = data["baskets"]; this.user.assignedBaskets.splice(i, 1); this.notify.success(this.lang.basketUpdated); @@ -600,7 +596,6 @@ export class UserAdministrationComponent extends AutoCompletePlugin implements O if (r) { this.http.delete(this.coreUrl + "rest/users/" + this.serialId + "/redirectedBaskets?redirectedBasketIds[]=" + basket.id) .subscribe((data: any) => { - this.userCtrl.setValue(''); this.user.baskets = data["baskets"]; this.user.redirectedBaskets.splice(i, 1); this.notify.success(this.lang.basketUpdated); @@ -616,7 +611,6 @@ export class UserAdministrationComponent extends AutoCompletePlugin implements O if (r) { this.http.delete(this.coreUrl + "rest/users/" + this.serialId + "/redirectedBaskets?redirectedBasketIds[]=" + basket.id) .subscribe((data: any) => { - this.userCtrl.setValue(''); this.user.baskets = data["baskets"]; this.user.assignedBaskets.splice(i, 1); this.notify.success(this.lang.basketUpdated); @@ -904,13 +898,16 @@ export class UserAdministrationComponent extends AutoCompletePlugin implements O templateUrl: "user-administration-redirect-modal.component.html", styles: [".mat-dialog-content{max-height: 65vh;width:600px;}"] }) -export class UserAdministrationRedirectModalComponent extends AutoCompletePlugin { +export class UserAdministrationRedirectModalComponent { lang: any = LANG; redirectUser: String = ''; processMode: String = ''; constructor(public http: HttpClient, @Inject(MAT_DIALOG_DATA) public data: any, public dialogRef: MatDialogRef<UserAdministrationRedirectModalComponent>) { - super(http, ['users']); + } + + setRedirectUser(user: any) { + this.redirectUser = user; } } diff --git a/src/frontend/app/administration/user/users-administration-redirect-modal.component.html b/src/frontend/app/administration/user/users-administration-redirect-modal.component.html index 4ad6a1e8fdc200717d01c979ed08f2714dff34aa..3efed8e4d5afd9a2d4f76eb96d6586656dea4e97 100755 --- a/src/frontend/app/administration/user/users-administration-redirect-modal.component.html +++ b/src/frontend/app/administration/user/users-administration-redirect-modal.component.html @@ -13,26 +13,7 @@ <div *ngFor="let redirectModel of data.redirectListModels; index as i" id="{{redirectModel.object_id}}" class="form-group"> - <mat-form-field class="example-full-width"> - <input name="redirectModel_{{i}}" id="redirectModel_{{i}}" [(ngModel)]="redirectModel.redirectUserId" - type="text" placeholder="{{lang.newDest}} : {{redirectModel.title}}" matInput - [matAutocomplete]="auto" [formControl]="userCtrl" required> - <mat-autocomplete #auto="matAutocomplete"> - <ng-container *ngFor="let user of filteredUsers | async"> - <mat-option [value]="user.id" *ngIf="this.data.userDestRedirect.user_id != user.id"> - <div class="container-fluid"> - <span class="col-xm-1"> - <mat-icon color="primary" class="fa fa-user fa-2x" style="margin-right:0px;"></mat-icon> - </span> - <span class="col-xm-11"> - {{ user.idToDisplay }} - <small>{{ user.otherInfo }}</small> - </span> - </div> - </mat-option> - </ng-container> - </mat-autocomplete> - </mat-form-field> + <plugin-autocomplete [labelPlaceholder]="lang.newDest + ' : ' + redirectModel.title" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/users']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="setRedirectUserListModels(i, $event)" singleMode required></plugin-autocomplete> </div> </div> @@ -44,26 +25,7 @@ </div> <div id="{{this.data.userDestRedirect.user_id}}" class="form-group"> - <mat-form-field class="example-full-width"> - <input name="redirectModel_resDest" id="redirectModel_resDest" [(ngModel)]="this.data.redirectDestResUserId" - type="text" placeholder="{{lang.newDestRes}} : " matInput [matAutocomplete]="auto" - [formControl]="userCtrl" required> - <mat-autocomplete #auto="matAutocomplete"> - <ng-container *ngFor="let user of filteredUsers | async"> - <mat-option [value]="user.id" *ngIf="this.data.userDestRedirect.user_id != user.id"> - <div class="container-fluid"> - <span class="col-xm-1"> - <mat-icon color="primary" class="fa fa-user fa-2x" style="margin-right:0px;"></mat-icon> - </span> - <span class="col-xm-11"> - {{ user.idToDisplay }} - <small>{{ user.otherInfo }}</small> - </span> - </div> - </mat-option> - </ng-container> - </mat-autocomplete> - </mat-form-field> + <plugin-autocomplete [labelPlaceholder]="lang.newDestRes" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/users']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="setRedirectUserRes($event)" singleMode required></plugin-autocomplete> </div> </div> diff --git a/src/frontend/app/administration/user/users-administration.component.ts b/src/frontend/app/administration/user/users-administration.component.ts index afc92dc49cde84c036b5f827d6074ee961fdfffd..c1c0c8becec8ea26fc8de7baa8c3e720634e12f6 100755 --- a/src/frontend/app/administration/user/users-administration.component.ts +++ b/src/frontend/app/administration/user/users-administration.component.ts @@ -16,7 +16,7 @@ declare var angularGlobals: any; styleUrls: ['users-administration.component.scss'], providers: [NotificationService] }) -export class UsersAdministrationComponent extends AutoCompletePlugin implements OnInit { +export class UsersAdministrationComponent implements OnInit { /*RESPONSIVE*/ private _mobileQueryListener : () => void; @@ -54,7 +54,6 @@ export class UsersAdministrationComponent extends AutoCompletePlugin implements } constructor(changeDetectorRef: ChangeDetectorRef, media: MediaMatcher, public http: HttpClient, private notify: NotificationService, public dialog: MatDialog, private headerService: HeaderService) { - super(http, ['users']); $j("link[href='merged_css.php']").remove(); this.mobileQuery = media.matchMedia('(max-width: 768px)'); this._mobileQueryListener = () => changeDetectorRef.detectChanges(); @@ -411,16 +410,20 @@ export class UsersAdministrationComponent extends AutoCompletePlugin implements } @Component({ templateUrl: "users-administration-redirect-modal.component.html", - styleUrls: ['users-administration-redirect-modal.scss'] + styleUrls: ['users-administration-redirect-modal.scss'], + providers: [NotificationService] }) -export class UsersAdministrationRedirectModalComponent extends AutoCompletePlugin { +export class UsersAdministrationRedirectModalComponent { lang: any = LANG; loadModel: boolean = false; loadInstance: boolean = false; modalTitle: string = this.lang.confirmAction; - constructor(public http: HttpClient, @Inject(MAT_DIALOG_DATA) public data: any, public dialogRef: MatDialogRef<UsersAdministrationRedirectModalComponent>) { - super(http, ['users']); + constructor( + public http: HttpClient, + @Inject(MAT_DIALOG_DATA) public data: any, + public dialogRef: MatDialogRef<UsersAdministrationRedirectModalComponent>, + private notify: NotificationService) { } ngOnInit(): void { @@ -451,7 +454,26 @@ export class UsersAdministrationRedirectModalComponent extends AutoCompletePlugi this.data.inInstanceList = true; } } + } + + setRedirectUserListModels(index:number, user: any) { + if(this.data.userDestRedirect.user_id != user.id) { + this.data.redirectListModels[index].redirectUserId = user.id; + } else { + this.data.redirectListModels[index].redirectUserId = null; + this.notify.error(this.lang.userUnauthorized); + } + + } + setRedirectUserRes(user: any) { + if(this.data.userDestRedirect.user_id != user.id) { + this.data.redirectDestResUserId = user.id; + } else { + this.data.redirectDestResUserId = null; + this.notify.error(this.lang.userUnauthorized); + } + } sendFunction() { diff --git a/src/frontend/app/diffusions/diffusions-list.component.html b/src/frontend/app/diffusions/diffusions-list.component.html index 6503c99e5b238e43c4ba2d61834003f30b7acb2c..89da05c22345ec618a980ffaaf9f65a764557523 100644 --- a/src/frontend/app/diffusions/diffusions-list.component.html +++ b/src/frontend/app/diffusions/diffusions-list.component.html @@ -6,25 +6,7 @@ <div *ngIf="diffList.length == 0" style="text-align:center;font-size:24px;font-weight:bold;opacity:0.3;"> {{lang.noDiffusionList}} </div> - <mat-form-field *ngIf="injectDatas.editable" appearance="outline" floatLabel="never" [style.fontSize.px]="10"> - <input class="userDiffList" #autocompleteFilter type="text" placeholder="{{lang.addUserOrEntity}}" matInput - [matAutocomplete]="auto" [formControl]="elementCtrl"> - <mat-autocomplete #auto="matAutocomplete"> - <mat-option *ngFor="let elem of filteredElements | async" [value]="elem.id" (click)="addElem(elem)"> - <p mat-line style="margin:0;"> - <span class="col-xm-1" style="padding-right:5px;"> - <mat-icon color="primary" - [class]="elem.type == 'entity' ? 'fa fa-sitemap fa-2x' : 'fa fa-user fa-2x'" - style="margin-right:0px;"></mat-icon> - </span> - <span class="col-xm-11"> - {{ elem.idToDisplay }} - <small>{{ elem.descriptionToDisplay }}</small> - </span> - </p> - </mat-option> - </mat-autocomplete> - </mat-form-field> + <plugin-autocomplete *ngIf="injectDatas.editable" [labelPlaceholder]="lang.addUserOrEntity" [routeDatas]="['/rest/autocomplete/users','/rest/autocomplete/entities']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="addElem($event)"></plugin-autocomplete> <div cdkDropListGroup class="roleList"> <ng-container *ngFor="let role of availableRoles"> <h3 mat-subheader>{{role.label}}</h3> diff --git a/src/frontend/app/diffusions/diffusions-list.component.ts b/src/frontend/app/diffusions/diffusions-list.component.ts index 0e192cf6cf4460147d6319914a1ddfacbbc9ce16..8f4e1aac5c1e3785bbc51dd3c0f7dd935a3dcf82 100644 --- a/src/frontend/app/diffusions/diffusions-list.component.ts +++ b/src/frontend/app/diffusions/diffusions-list.component.ts @@ -3,7 +3,6 @@ import { HttpClient } from '@angular/common/http'; import { LANG } from '../translate.component'; import { NotificationService } from '../notification.service'; import { CdkDragDrop, transferArrayItem } from '@angular/cdk/drag-drop'; -import { AutoCompletePlugin } from '../../plugins/autocomplete.plugin'; declare function $j(selector: any): any; @@ -13,7 +12,7 @@ declare function $j(selector: any): any; styleUrls: ['diffusions-list.component.scss'], providers: [NotificationService] }) -export class DiffusionsListComponent extends AutoCompletePlugin implements OnInit { +export class DiffusionsListComponent implements OnInit { lang: any = LANG; listinstance: any = []; @@ -29,9 +28,7 @@ export class DiffusionsListComponent extends AutoCompletePlugin implements OnIni @Input('injectDatas') injectDatas: any; - constructor(public http: HttpClient, private notify: NotificationService) { - super(http, ['usersAndEntities']); - } + constructor(public http: HttpClient, private notify: NotificationService) { } ngOnInit(): void { } @@ -249,9 +246,5 @@ export class DiffusionsListComponent extends AutoCompletePlugin implements OnIni }; this.diffList['copy'].items.unshift(newElemListModel); } - - $j('.userDiffList').val(''); - $j('.userDiffList').blur(); - } } \ No newline at end of file diff --git a/src/frontend/app/home/home.component.ts b/src/frontend/app/home/home.component.ts index 7a201c7152798e9ecf8d472365139a392a409405..9d6bc80874753c7b3bb04c62a804dc924be945fc 100644 --- a/src/frontend/app/home/home.component.ts +++ b/src/frontend/app/home/home.component.ts @@ -5,9 +5,6 @@ import { LANG } from '../translate.component'; import { MatDialog, MatSidenav, MatExpansionPanel, MatTableDataSource } from '@angular/material'; import { NotificationService } from '../notification.service'; import { HeaderService } from '../../service/header.service'; - - -import { AutoCompletePlugin } from '../../plugins/autocomplete.plugin'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; declare function $j(selector: any): any; @@ -19,7 +16,7 @@ declare var angularGlobals: any; styleUrls: ['home.component.scss'], providers: [NotificationService] }) -export class HomeComponent extends AutoCompletePlugin implements OnInit { +export class HomeComponent implements OnInit { private _mobileQueryListener : () => void; mobileQuery : MediaQueryList; @@ -46,7 +43,6 @@ export class HomeComponent extends AutoCompletePlugin implements OnInit { @ViewChildren(MatExpansionPanel) viewPanels: QueryList<MatExpansionPanel>; constructor(changeDetectorRef: ChangeDetectorRef, media: MediaMatcher, public http: HttpClient, public dialog: MatDialog, private sanitizer: DomSanitizer, private notify: NotificationService, private headerService: HeaderService) { - super(http, ['users']); this.mobileMode = angularGlobals.mobileMode; $j("link[href='merged_css.php']").remove(); this.mobileQuery = media.matchMedia('(max-width: 768px)'); diff --git a/src/frontend/app/profile.component.html b/src/frontend/app/profile.component.html index 0968bd463510119871b9fcef6d69a7e9fc7bee6f..d2e0990aecd539a42abf9a788b8e4ef82e8aef3a 100755 --- a/src/frontend/app/profile.component.html +++ b/src/frontend/app/profile.component.html @@ -221,27 +221,7 @@ style="opacity: 0.5;font-style: italic;font-size: 80%;"> {{lang.selectAll}} </span> - <mat-form-field *ngIf="selectionBaskets.hasValue()"> - <input matTooltip="{{lang.redirectWhenAbscence}}" - matTooltipPosition="above" type="text" - placeholder="{{ lang.redirectBaskets }}" matInput - [matAutocomplete]="auto" [formControl]="userCtrl"> - <mat-autocomplete #auto="matAutocomplete"> - <mat-option *ngFor="let user of filteredUsers | async" - [value]="user.id" (click)="addBasketRedirection(user)"> - <p mat-line matTooltip="{{ user.otherInfo }}"> - <span class="col-xm-1"> - <mat-icon color="primary" class="fa fa-user fa-2x" - style="margin-right:0px;"></mat-icon> - </span> - <span class="col-xm-11"> - {{ user.idToDisplay }} - <small>{{ user.otherInfo }}</small> - </span> - </p> - </mat-option> - </mat-autocomplete> - </mat-form-field> + <plugin-autocomplete *ngIf="selectionBaskets.hasValue()" [labelPlaceholder]="lang.redirectBaskets" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/users']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="addBasketRedirection($event)"></plugin-autocomplete> </p> </mat-list-item> <mat-divider></mat-divider> @@ -314,32 +294,7 @@ style="font-weight:normal">{{basket.group_desc}}</span> </h4> <p mat-line> - <mat-form-field *ngIf="basket.userToDisplay == null" - floatLabel="never"> - <input matTooltip="{{lang.redirectBasket}}" - matTooltipPosition="above" type="text" - placeholder="{{lang.redirectBasket}}" matInput - [matAutocomplete]="auto" [formControl]="userCtrl"> - <mat-autocomplete #auto="matAutocomplete"> - <mat-option - *ngFor="let user of filteredUsers | async" - [value]="user.id" - (click)="reassignBasketRedirection(user,basket,i)"> - <p mat-line matTooltip="{{ user.otherInfo }}"> - <span class="col-xm-1"> - <mat-icon color="primary" - class="fa fa-user fa-2x" - style="margin-right:0px;"> - </mat-icon> - </span> - <span class="col-xm-11"> - {{ user.idToDisplay }} - <small>{{ user.otherInfo }}</small> - </span> - </p> - </mat-option> - </mat-autocomplete> - </mat-form-field> + <plugin-autocomplete *ngIf="basket.userToDisplay == null" [labelPlaceholder]="lang.redirectBaskets" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/users']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="reassignBasketRedirection($event,basket,i)"></plugin-autocomplete> <mat-form-field> <input type="text" color="warn" matInput disabled value="{{lang.assignBy}} {{basket.userToDisplay}}"> diff --git a/src/frontend/app/profile.component.ts b/src/frontend/app/profile.component.ts index cbff836e40d75b8d56301e9e512e7c7015dc0377..cc2d1ad3c17e37eb55d3eba499642d49a51b50d0 100755 --- a/src/frontend/app/profile.component.ts +++ b/src/frontend/app/profile.component.ts @@ -7,7 +7,6 @@ import { HeaderService } from '../service/header.service'; import { debounceTime, switchMap, distinctUntilChanged, filter } from 'rxjs/operators'; import { MatPaginator, MatTableDataSource, MatSort, MatDialog, MatDialogRef, MatSidenav, MatExpansionPanel } from '@angular/material'; -import { AutoCompletePlugin } from '../plugins/autocomplete.plugin'; import { SelectionModel } from '@angular/cdk/collections'; import { FormControl, FormGroup, Validators, AbstractControl, ValidationErrors, ValidatorFn, FormBuilder } from '@angular/forms'; @@ -22,7 +21,7 @@ declare var angularGlobals: any; styleUrls: ['profile.component.css'], providers: [NotificationService] }) -export class ProfileComponent extends AutoCompletePlugin implements OnInit { +export class ProfileComponent implements OnInit { private _mobileQueryListener: () => void; mobileQuery: MediaQueryList; @@ -163,7 +162,6 @@ export class ProfileComponent extends AutoCompletePlugin implements OnInit { constructor(changeDetectorRef: ChangeDetectorRef, media: MediaMatcher, public http: HttpClient, private zone: NgZone, private notify: NotificationService, public dialog: MatDialog, private _formBuilder: FormBuilder, private headerService: HeaderService) { - super(http, ['users']); this.mobileMode = angularGlobals.mobileMode; $j("link[href='merged_css.php']").remove(); this.mobileQuery = media.matchMedia('(max-width: 768px)'); @@ -528,7 +526,6 @@ export class ProfileComponent extends AutoCompletePlugin implements OnInit { if (r) { this.http.post(this.coreUrl + "rest/users/" + this.user.id + "/redirectedBaskets", basketsRedirect) .subscribe((data: any) => { - this.userCtrl.setValue(''); this.user.baskets = data["baskets"]; this.user.redirectedBaskets = data["redirectedBaskets"]; this.selectionBaskets.clear(); @@ -545,7 +542,6 @@ export class ProfileComponent extends AutoCompletePlugin implements OnInit { if (r) { this.http.delete(this.coreUrl + "rest/users/" + this.user.id + "/redirectedBaskets?redirectedBasketIds[]=" + basket.id) .subscribe((data: any) => { - this.userCtrl.setValue(''); this.user.baskets = data["baskets"]; this.user.redirectedBaskets.splice(i, 1); this.notify.success(this.lang.basketUpdated); @@ -561,7 +557,6 @@ export class ProfileComponent extends AutoCompletePlugin implements OnInit { if (r) { this.http.delete(this.coreUrl + "rest/users/" + this.user.id + "/redirectedBaskets?redirectedBasketIds[]=" + basket.id) .subscribe((data: any) => { - this.userCtrl.setValue(''); this.user.baskets = data["baskets"]; this.user.assignedBaskets.splice(i, 1); this.notify.success(this.lang.basketUpdated); @@ -584,7 +579,6 @@ export class ProfileComponent extends AutoCompletePlugin implements OnInit { } ]) .subscribe((data: any) => { - this.userCtrl.setValue(''); this.user.baskets = data["baskets"]; this.user.assignedBaskets.splice(i, 1); this.notify.success(this.lang.basketUpdated); diff --git a/src/frontend/app/visa/visa-workflow.component.html b/src/frontend/app/visa/visa-workflow.component.html index 7ef776405204b4dfcdfabee23beb2ea558472f77..bea953a2ced15cb4f9697d7b166890a411b836cc 100644 --- a/src/frontend/app/visa/visa-workflow.component.html +++ b/src/frontend/app/visa/visa-workflow.component.html @@ -1,13 +1,5 @@ <mat-list *ngIf="!loading"> - <mat-form-field *ngIf="injectDatas.editable" appearance="outline" floatLabel="never" [style.fontSize.px]="10"> - <input id="availableUsers" type="text" matInput placeholder="{{lang.addPerson}}" [matAutocomplete]="auto" - [formControl]="userCtrl"> - <mat-autocomplete #auto="matAutocomplete" (optionSelected)="addItem($event)" isOpen="true"> - <mat-option *ngFor="let user of filteredUsers | async" [value]="user"> - {{user.idToDisplay}} - </mat-option> - </mat-autocomplete> - </mat-form-field> + <plugin-autocomplete *ngIf="injectDatas.editable" [labelPlaceholder]="lang.addPerson" [routeDatas]="['/rest/autocomplete/maarchParapheurUsers']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="addItem($event)"></plugin-autocomplete> <div cdkDropList #dataAvailableList="cdkDropList" [cdkDropListData]="visaWorkflow.items" class="cdk-list" (cdkDropListDropped)="drop($event)" [cdkDropListDisabled]="!injectDatas.editable"> <div class="emptyContent" *ngIf="visaWorkflow.items.length === 0"> diff --git a/src/frontend/app/visa/visa-workflow.component.ts b/src/frontend/app/visa/visa-workflow.component.ts index 3b3c60c4c663b2d814e76af744a1937e98afdcac..a5b7686223648bcde2f9c6815f45e175e8816947 100644 --- a/src/frontend/app/visa/visa-workflow.component.ts +++ b/src/frontend/app/visa/visa-workflow.component.ts @@ -1,9 +1,8 @@ -import { Component, Input, OnInit, ElementRef, ViewChild } from '@angular/core'; +import { Component, Input, OnInit } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { LANG } from '../translate.component'; import { NotificationService } from '../notification.service'; import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; -import { AutoCompletePlugin } from '../../plugins/autocomplete.plugin'; declare function $j(selector: any): any; @@ -13,7 +12,7 @@ declare function $j(selector: any): any; styleUrls: ['visa-workflow.component.scss'], providers: [NotificationService] }) -export class VisaWorkflowComponent extends AutoCompletePlugin implements OnInit { +export class VisaWorkflowComponent implements OnInit { lang: any = LANG; visaWorkflow: any = { @@ -25,9 +24,7 @@ export class VisaWorkflowComponent extends AutoCompletePlugin implements OnInit @Input('injectDatas') injectDatas: any; - constructor(public http: HttpClient, private notify: NotificationService) { - super(http, ['signatureBookUsers']); - } + constructor(public http: HttpClient, private notify: NotificationService) { } ngOnInit(): void { } @@ -105,16 +102,14 @@ export class VisaWorkflowComponent extends AutoCompletePlugin implements OnInit return usersMissing; } - addItem(event: any) { + addItem(userRest: any) { const user = { - 'externalId': event.option.value.externalId, - 'labelToDisplay': event.option.value.idToDisplay, + 'externalId': userRest.externalId, + 'labelToDisplay': userRest.idToDisplay, 'requested_signature': false, 'picture': '' } this.visaWorkflow.items.push(user); - $j('#availableUsers').blur(); - this.userCtrl.setValue(''); this.http.get("../../rest/maarchParapheur/user/" + user.externalId.maarchParapheur + "/picture") .subscribe((data: any) => { this.visaWorkflow.items[this.visaWorkflow.items.length - 1].picture = data.picture; diff --git a/src/frontend/lang/lang-en.ts b/src/frontend/lang/lang-en.ts index c4a25a3943359189e810ca88aa7e20d5104f0163..73a0a0ab81ff3b5b1debaf92c52531e757e5f3ea 100755 --- a/src/frontend/lang/lang-en.ts +++ b/src/frontend/lang/lang-en.ts @@ -1036,4 +1036,5 @@ export const LANG_EN = { "noAvailableValue" : "No available value", "autocompleteInfo" : "The criteria must contain at least <b>3 letters</b>", "availableUsers" : "Available users", + "userUnauthorized" : "User Unauthorized", }; diff --git a/src/frontend/lang/lang-fr.ts b/src/frontend/lang/lang-fr.ts index 6a2327244eda0695f5dc89f98fbc6f516ac6f76d..ee50a7d79998ea0ca4efd17e27309085bd3fc166 100755 --- a/src/frontend/lang/lang-fr.ts +++ b/src/frontend/lang/lang-fr.ts @@ -1069,4 +1069,6 @@ export const LANG_FR = { "noAvailableValue" : "Aucun élément disponible", "autocompleteInfo" : "La recherche doit contenir au minimum <b>3 caractères</b>", "availableUsers" : "Utilisateur(s) disponible(s)", + "userUnauthorized" : "Utilisateur non autorisé", + }; \ No newline at end of file diff --git a/src/frontend/lang/lang-nl.ts b/src/frontend/lang/lang-nl.ts index 40866eb569a7955985373b56dfe28511c2bcc13e..732c5204905008a3f4abce76bbaae73c81ecab0e 100755 --- a/src/frontend/lang/lang-nl.ts +++ b/src/frontend/lang/lang-nl.ts @@ -1062,4 +1062,5 @@ export const LANG_NL = { "noAvailableValue" : "No available value", //_TO_TRANSLATE "autocompleteInfo" : "The criteria must contain at least <b>3 letters</b>", //_TO_TRANSLATE "availableUsers" : "Available users", //_TO_TRANSLATE + "userUnauthorized" : "User Unauthorized", //_TO_TRANSLATE }; diff --git a/src/frontend/plugins/autocomplete/autocomplete.component.html b/src/frontend/plugins/autocomplete/autocomplete.component.html index e78b74f5d003da028fcd09a25c968f215da06c4d..3a55bf219eba8d31e2d38086df2eb10f4f4fcab6 100644 --- a/src/frontend/plugins/autocomplete/autocomplete.component.html +++ b/src/frontend/plugins/autocomplete/autocomplete.component.html @@ -1,12 +1,13 @@ <form> - <mat-form-field appearance="outline"> + <mat-form-field [appearance]="singleMode !== undefined ? 'standard' : 'outline'"> + <mat-label *ngIf="singleMode !== undefined">{{placeholder}}</mat-label> <mat-icon color="primary" class="fa fa-search" matPrefix></mat-icon> - <input type="text" #autoCompleteInput [placeholder]="placeholder" aria-label="Number" matInput [formControl]="myControl" - [matAutocomplete]="auto" (focus)="resetAutocomplete()"> + <input type="text" #autoCompleteInput [placeholder]="singleMode !== undefined ? '' : placeholder" aria-label="Number" matInput [formControl]="myControl" + [matAutocomplete]="auto" (click)="$event.stopPropagation()" (focus)="resetAutocomplete()" [required]="required"> <mat-autocomplete #auto="matAutocomplete" (optionSelected)="selectOpt($event)"> <mat-optgroup [label]="optGroupLabel" *ngIf="options.length > 0 && !loading"> <mat-option *ngFor="let option of filteredOptions | async | sortBy: key" [value]="option"> - <span color="primary">{{option[key]}}</span> <small>{{option[subInfoKey]}}</small> + <mat-icon *ngIf="type[option['type']]" class="autcompleteIcon fas {{type[option['type']]}}" color="primary"></mat-icon> <span color="primary">{{option[key]}}</span> <small>{{option[subInfoKey]}}</small> </mat-option> </mat-optgroup> <mat-option *ngIf="options.length === 0 && !loading" disabled [innerHTML]="listInfo"> diff --git a/src/frontend/plugins/autocomplete/autocomplete.component.scss b/src/frontend/plugins/autocomplete/autocomplete.component.scss index c1033720f9b990664abe011d7593b0f0e2803b71..cb76a4545eda2d53aaa72b7cdcba4c4e1623d76b 100644 --- a/src/frontend/plugins/autocomplete/autocomplete.component.scss +++ b/src/frontend/plugins/autocomplete/autocomplete.component.scss @@ -1,5 +1,8 @@ @import '../../css/vars.scss'; +.mat-form-field-appearance-outline { + font-size: 11px; +} /deep/.mat-form-field-appearance-outline .mat-form-field-outline-thick { color: $primary; } @@ -8,8 +11,17 @@ top: 0px !important; } .mat-option { + ::ng-deep.mat-option-text { + display: flex; + } span { font-size: 110%; font-weight: bold; } +} + +.autcompleteIcon { + width: 20px; + display: flex; + align-items: center; } \ No newline at end of file diff --git a/src/frontend/plugins/autocomplete/autocomplete.component.ts b/src/frontend/plugins/autocomplete/autocomplete.component.ts index 85a8611599e481f54b6308ddf12ef351f860ef12..6b2bfe2584f749abe8b218f2a495537365b0d879 100644 --- a/src/frontend/plugins/autocomplete/autocomplete.component.ts +++ b/src/frontend/plugins/autocomplete/autocomplete.component.ts @@ -1,7 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { FormControl } from '@angular/forms'; import { Input, EventEmitter, Output, ViewChild, ElementRef } from '@angular/core'; -import { Observable, of } from 'rxjs'; +import { Observable, of, forkJoin } from 'rxjs'; import { map, startWith, debounceTime, filter, distinctUntilChanged, switchMap, tap } from 'rxjs/operators'; import { LatinisePipe } from 'ngx-pipes'; import { LANG } from '../../app/translate.component'; @@ -19,8 +19,15 @@ export class PluginAutocomplete implements OnInit { listInfo: string; + type = { + user : 'fa-user', + entity : 'fa-sitemap' + } + + @Input('singleMode') singleMode: boolean; + @Input('required') required: boolean; @Input('datas') options: any; - @Input('routeDatas') routeDatas: string; + @Input('routeDatas') routeDatas: string[]; @Input('labelPlaceholder') placeholder: string; @Input('labelList') optGroupLabel: string; @Input('targetSearchKey') key: string; @@ -65,7 +72,7 @@ export class PluginAutocomplete implements OnInit { filter(value => value.length > 2), distinctUntilChanged(), tap(() => this.loading = true), - switchMap((data: any) => this.http.get('../..' + this.routeDatas, { params: { "search": data } })), + switchMap((data: any) => this.getDatas(data)), tap((data: any) => { this.listInfo = data.length === 0 ? this.lang.noAvailableValue : ''; this.options = data; @@ -75,14 +82,38 @@ export class PluginAutocomplete implements OnInit { ).subscribe(); } + getDatas(data: string) { + let arrayObs:any = []; + let test: any = []; + this.routeDatas.forEach(element => { + arrayObs.push(this.http.get('../..' + element, { params: { "search": data } })); + }); + + return forkJoin(arrayObs).pipe( + map(data => { + data.forEach((element: any) => { + element.forEach((element2: any) => { + test.push(element2); + }); + }); + return test; + }) + ); + } + selectOpt(ev: any) { + if (this.singleMode !== undefined) { + this.myControl.setValue(ev.option.value[this.key]); + } this.resetAutocomplete(); this.autoCompleteInput.nativeElement.blur(); this.selectedOpt.emit(ev.option.value); } resetAutocomplete() { - this.myControl.setValue(''); + if (this.singleMode === undefined) { + this.myControl.setValue(''); + } if (this.routeDatas !== undefined) { this.options = []; this.listInfo = this.lang.autocompleteInfo; @@ -92,7 +123,7 @@ export class PluginAutocomplete implements OnInit { 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)); + return this.options.filter((option: any) => this.latinisePipe.transform(option[this.key].toLowerCase()).includes(filterValue)); } else { return this.options; }