diff --git a/src/frontend/app/administration/group/group-administration.component.html b/src/frontend/app/administration/group/group-administration.component.html index 6a11eedae5d67aa5103a2cdf276b4e92d461172e..887a8b64cd4ef4017e2c71792d970f32338b7274 100755 --- a/src/frontend/app/administration/group/group-administration.component.html +++ b/src/frontend/app/administration/group/group-administration.component.html @@ -77,6 +77,11 @@ </mat-tab> </mat-tab-group> </mat-tab> + <mat-tab label="{{lang.indexation}}" *ngIf="!creationMode"> + <ng-template matTabContent> + <app-indexing-administration [groupId]="group.id"></app-indexing-administration> + </ng-template> + </mat-tab> <mat-tab label="{{lang.relatedUsers}}" *ngIf="!creationMode"> <div class="row" style="margin:0px;"> <div class="col-md-12" *ngIf="group.canAdminUsers" style="padding:5px;"> @@ -132,11 +137,6 @@ <mat-row *matRowDef="let row; columns: basketsDisplayedColumns;" routerLink="/administration/baskets/{{row.basket_id}}" matTooltip="{{lang.view}}" style="cursor:pointer;"></mat-row> </mat-table> </mat-tab> - <mat-tab label="Indexation" *ngIf="!creationMode"> - <ng-template matTabContent> - <app-indexing-administration [groupId]="group.id"></app-indexing-administration> - </ng-template> - </mat-tab> </mat-tab-group> </mat-card> </mat-sidenav-content> 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 753eb8f4b1429450ad5d82779fc6a93731cab2dc..186f67734465b3c554ee32506be4bd32f4ce88c9 100644 --- a/src/frontend/app/administration/group/indexing/indexing-administration.component.html +++ b/src/frontend/app/administration/group/indexing/indexing-administration.component.html @@ -1,15 +1,17 @@ +<div *ngIf="loading" class="loading"> + <mat-spinner style="margin:auto;"></mat-spinner> +</div> <div class="row" style="margin:0px;"> <div class="col-md-12"> - <div *ngIf="!indexingInfo.canIndex" class="alert-message alert-message-danger" role="alert" style="margin-top: 30px;">Le - groupe ne peut pas enregistrer de document. <a (click)="indexingInfo.canIndex=true">Activer l'indexation - pour ce groupe</a></div> - <button *ngIf="indexingInfo.canIndex" color="warn" mat-raised-button (click)="indexingInfo.canIndex=false">Désactiver - l'indexation pour ce groupe</button> + <div *ngIf="!indexingInfo.canIndex" class="alert-message alert-message-danger" role="alert" style="margin-top: 30px;">{{lang.warnIndex}} + <button mat-raised-button (click)="toggleIndex(!indexingInfo.canIndex)">{{lang.enableIndex}}</button> + </div> + <button *ngIf="indexingInfo.canIndex" color="warn" mat-raised-button (click)="toggleIndex(!indexingInfo.canIndex)">{{lang.disableIndex}}</button> </div> <div class="col-md-8"> <div class="formType"> <div class="formType-title"> - Action(s) choisie(s) + {{lang.actionChosen}} </div> <plugin-autocomplete [labelPlaceholder]="'Associer une nouvelle action'" [labelList]="'Action(s) disponible(s)'" [datas]="actionList" [targetSearchKey]="'label_action'" (triggerEvent)="addAction($event)"></plugin-autocomplete> @@ -29,7 +31,7 @@ <div class="col-md-4"> <div class="formType"> <div class="formType-title"> - Service de destination autorisé + {{lang.authorizedEntities}} </div> <div #jstree id="jstree"></div> </div> diff --git a/src/frontend/app/administration/group/indexing/indexing-administration.component.scss b/src/frontend/app/administration/group/indexing/indexing-administration.component.scss index 08db799bed293ccfc7f1c2e0f9d8ba62b2c3e366..c48ad500a5d79b82e23324b71f61a47594e32615 100644 --- a/src/frontend/app/administration/group/indexing/indexing-administration.component.scss +++ b/src/frontend/app/administration/group/indexing/indexing-administration.component.scss @@ -1,3 +1,11 @@ +.loading { + display: flex; + height: 100%; + position: absolute; + width: 100%; + background: white; + z-index: 2; +} .selectedActionList { width: 100%; } 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 ce734fd2571e9ab7b8b8a126cdb35544ea0cb142..731f7ab551d9dac89f81080033f25e70dbc76542 100644 --- a/src/frontend/app/administration/group/indexing/indexing-administration.component.ts +++ b/src/frontend/app/administration/group/indexing/indexing-administration.component.ts @@ -3,7 +3,10 @@ import { HttpClient } from '@angular/common/http'; import { LANG } from '../../../translate.component'; import { NotificationService } from '../../../notification.service'; import { tap } from 'rxjs/internal/operators/tap'; -import { map } from 'rxjs/operators'; +import { map, catchError, filter, exhaustMap, finalize } from 'rxjs/operators'; +import { of } from 'rxjs'; +import { MatDialogRef, MatDialog } from '@angular/material'; +import { ConfirmComponent } from '../../../../plugins/modal/confirm.component'; declare function $j(selector: any): any; @@ -18,7 +21,7 @@ export class IndexingAdministrationComponent implements OnInit { mobileQuery: MediaQueryList; lang: any = LANG; - loading: boolean = false; + loading: boolean = true; @Input('groupId') groupId: number; @@ -31,9 +34,11 @@ export class IndexingAdministrationComponent implements OnInit { keywords: [], entities: [] }; + dialogRef: MatDialogRef<any>; constructor(public http: HttpClient, private notify: NotificationService, + private dialog: MatDialog, ) { this.keywordEntities = [{ @@ -102,12 +107,12 @@ export class IndexingAdministrationComponent implements OnInit { tap((data: any) => this.getSelectedActions(data.group.indexationParameters.actions)), map((data: any) => this.getEntities(data)), map((data: any) => this.getSelectedEntities(data)), - tap((data: any) => this.initEntitiesTree(data)) + tap((data: any) => this.initEntitiesTree(data)), + finalize(() => this.loading = false) ).subscribe(); } initEntitiesTree(entities: any) { - $j('#jstree').jstree({ "checkbox": { "three_state": false //no cascade selection @@ -143,20 +148,20 @@ export class IndexingAdministrationComponent implements OnInit { } getEntities(data: any) { + this.keywordEntities.forEach((entity: any) => { + if (data.group.indexationParameters.keywords.indexOf(entity.id) > -1) { + entity.state = { "opened": true, "selected": true }; + } else { + entity.state = { "opened": true, "selected": false }; + } + }); data.entities = this.keywordEntities.concat(data.entities); return data; } getSelectedEntities(data: any) { this.indexingInfo.entities = [...data.group.indexationParameters.entities]; - /*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 }; - } - - });*/ + this.indexingInfo.keywords = [...data.group.indexationParameters.keywords]; return data.entities; } @@ -180,37 +185,141 @@ export class IndexingAdministrationComponent implements OnInit { } addEntity(entityId: number) { - this.indexingInfo.entities.push(entityId); - console.log(this.indexingInfo.entities); + const newEntityList = this.indexingInfo.entities.concat([entityId]); + + this.http.put('../../rest/groups/' + this.groupId + '/indexing', { entities : newEntityList }).pipe( + tap(() => { + this.indexingInfo.entities.push(entityId); + }), + tap(() => { + this.notify.success(this.lang.entityAdded); + }), + catchError((err: any) => { + this.notify.handleErrors(err); + return of(false); + }) + ).subscribe(); } removeEntity(entityId: number) { const index = this.indexingInfo.entities.indexOf(entityId); - this.indexingInfo.entities.splice(index, 1); - console.log(this.indexingInfo.entities); + let newEntityList = [...this.indexingInfo.entities]; + newEntityList.splice(index, 1); + + this.http.put('../../rest/groups/' + this.groupId + '/indexing', { entities : newEntityList }).pipe( + tap(() => { + this.indexingInfo.entities.splice(index, 1); + }), + tap(() => { + this.notify.success(this.lang.entityDeleted); + }), + catchError((err: any) => { + this.notify.handleErrors(err); + return of(false); + }) + ).subscribe(); } addKeyword(keyword: string) { - this.indexingInfo.keywords.push(keyword); - console.log(this.indexingInfo.keywords); + const newKeywordList = this.indexingInfo.keywords.concat([keyword]); + + this.http.put('../../rest/groups/' + this.groupId + '/indexing', { keywords : newKeywordList }).pipe( + tap(() => { + this.indexingInfo.keywords.push(keyword); + }), + tap(() => { + this.notify.success(this.lang.keywordAdded); + }), + catchError((err: any) => { + this.notify.handleErrors(err); + return of(false); + }) + ).subscribe(); } removeKeyword(keyword: string) { const index = this.indexingInfo.keywords.indexOf(keyword); - this.indexingInfo.keywords.splice(index, 1); - console.log(this.indexingInfo.keywords); + let newKeywordList = [...this.indexingInfo.keywords]; + newKeywordList.splice(index, 1); + + this.http.put('../../rest/groups/' + this.groupId + '/indexing', { keywords : newKeywordList }).pipe( + tap(() => { + this.indexingInfo.keywords.splice(index, 1); + }), + tap(() => { + this.notify.success(this.lang.keywordDeleted); + }), + catchError((err: any) => { + this.notify.handleErrors(err); + return of(false); + }) + ).subscribe(); } 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); + const newActionListIds = this.indexingInfo.actions.map((action: any) => action.id).concat([actionOpt].map((action: any) => action.id)); + + this.http.put('../../rest/groups/' + this.groupId + '/indexing', { actions : newActionListIds }).pipe( + tap(() => { + 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); + }), + tap(() => { + this.notify.success(this.lang.actionAdded); + }), + catchError((err: any) => { + this.notify.handleErrors(err); + return of(false); + }) + ).subscribe(); } removeAction(index: number) { - const action = {...this.indexingInfo.actions[index]}; - this.actionList.push(action); - this.indexingInfo.actions.splice(index, 1); + this.dialogRef = this.dialog.open(ConfirmComponent, { autoFocus: false, disableClose: true, data: { title: this.lang.delete, msg: this.lang.confirmAction } }); + + this.dialogRef.afterClosed().pipe( + filter((data: string) => data === 'ok'), + map(() => { + this.dialogRef = null; + let newActionList = [...this.indexingInfo.actions]; + newActionList.splice(index, 1); + return newActionList.map((action: any) => action.id); + }), + exhaustMap((data) => this.http.put('../../rest/groups/' + this.groupId + '/indexing', { actions : data})), + tap(() => { + this.actionList.push(this.indexingInfo.actions[index]); + this.indexingInfo.actions.splice(index, 1); + }), + tap(() => { + this.notify.success(this.lang.actionDeleted); + }), + catchError((err: any) => { + this.notify.handleErrors(err); + return of(false); + }) + ).subscribe(); } + + toggleIndex(canIndex: boolean) { + + this.http.put('../../rest/groups/' + this.groupId + '/indexing', { canIndex : canIndex }).pipe( + tap(() => { + this.indexingInfo.canIndex = canIndex; + }), + tap(() => { + if (this.indexingInfo.canIndex) { + this.notify.success(this.lang.indexEnabled); + } else { + this.notify.success(this.lang.indexDisabled); + } + }), + catchError((err: any) => { + this.notify.handleErrors(err); + return of(false); + }) + ).subscribe(); + } + } diff --git a/src/frontend/lang/lang-en.ts b/src/frontend/lang/lang-en.ts index 73a0a0ab81ff3b5b1debaf92c52531e757e5f3ea..72f51334dded1df5437d1996dd30c42cefd4bf23 100755 --- a/src/frontend/lang/lang-en.ts +++ b/src/frontend/lang/lang-en.ts @@ -1037,4 +1037,13 @@ export const LANG_EN = { "autocompleteInfo" : "The criteria must contain at least <b>3 letters</b>", "availableUsers" : "Available users", "userUnauthorized" : "User Unauthorized", + "authorizedEntities" : "Authorized entities destination", + "warnIndex" : "This group can not index document.", + "enableIndex" : "Enable document indexation for this group", + "disableIndex" : "Disable document indexation for this group", + "indexEnabled" : "Document indexation enabled", + "indexDisabled" : "Document indexation disabled", + "indexation" : "Document indexation", + "keywordAdded" : "Keyword added", + "keywordDeleted" : "Keyword deleted", }; diff --git a/src/frontend/lang/lang-fr.ts b/src/frontend/lang/lang-fr.ts index ee50a7d79998ea0ca4efd17e27309085bd3fc166..cff881d5a00d1707aa62c6a6c82c198b081f6557 100755 --- a/src/frontend/lang/lang-fr.ts +++ b/src/frontend/lang/lang-fr.ts @@ -1070,5 +1070,13 @@ export const LANG_FR = { "autocompleteInfo" : "La recherche doit contenir au minimum <b>3 caractères</b>", "availableUsers" : "Utilisateur(s) disponible(s)", "userUnauthorized" : "Utilisateur non autorisé", - + "authorizedEntities" : "Entité(s) traitante(s) authorisée(s)", + "warnIndex" : "Le groupe ne peut pas enregistrer de document.", + "enableIndex" : "Activer l'enregistrement de document pour ce groupe", + "disableIndex" : "Désactiver l'enregistrement de document pour ce groupe", + "indexEnabled" : "Enregistrement de document activé", + "indexDisabled" : "Enregistrement de document désactivé", + "indexation" : "Enregistrement de document", + "keywordAdded" : "Mot-clé ajouté", + "keywordDeleted" : "Mot-clé supprimé", }; \ No newline at end of file diff --git a/src/frontend/lang/lang-nl.ts b/src/frontend/lang/lang-nl.ts index 732c5204905008a3f4abce76bbaae73c81ecab0e..734284137b173b3e9d19bda0cf96698591931279 100755 --- a/src/frontend/lang/lang-nl.ts +++ b/src/frontend/lang/lang-nl.ts @@ -1063,4 +1063,13 @@ export const LANG_NL = { "autocompleteInfo" : "The criteria must contain at least <b>3 letters</b>", //_TO_TRANSLATE "availableUsers" : "Available users", //_TO_TRANSLATE "userUnauthorized" : "User Unauthorized", //_TO_TRANSLATE + "warnIndex" : "This group can not index document.", //_TO_TRANSLATE + "authorizedEntities" : "Authorized entities destination", //_TO_TRANSLATE + "enableIndex" : "Activate document indexation for this group", //_TO_TRANSLATE + "disableIndex" : "Disable document indexation for this group", //_TO_TRANSLATE + "indexEnabled" : "Document indexation enabled", //_TO_TRANSLATE + "indexDisabled" : "Document indexation disabled", //_TO_TRANSLATE + "indexation" : "Document indexation", //_TO_TRANSLATE + "keywordAdded" : "Keyword added", //_TO_TRANSLATE + "keywordDeleted" : "Keyword deleted", //_TO_TRANSLATE };