diff --git a/src/frontend/app/folder/document-list/folder-document-list.component.html b/src/frontend/app/folder/document-list/folder-document-list.component.html index 0752e1ea218342ba6775db40a7783261eecacfde..ff9c8b81be88cf7b1b1102587512be3075921a5c 100644 --- a/src/frontend/app/folder/document-list/folder-document-list.component.html +++ b/src/frontend/app/folder/document-list/folder-document-list.component.html @@ -124,7 +124,11 @@ [class.undefined]="row.subject == lang.undefined" title="{{row.subject}}">{{row.subject | shorten: 150: '...'}}</span> <span class="main-info-action"> - <button mat-icon-button title="{{lang.notes}}" + <div *ngIf="!row.allowed" color="warn"> + {{lang.documentOutOfPerimeter}} + </div> + <ng-container *ngIf="row.allowed"> + <button mat-icon-button title="{{lang.notes}}" (click)="$event.stopPropagation();togglePanel('note',row)" [class.noData]="row.countNotes == 0"> <mat-icon matBadgeHidden="{{row.countNotes == 0}}" fontSet="fas" @@ -147,14 +151,15 @@ </mat-icon> </button> <button mat-icon-button title="{{row.hasDocument ? lang.viewResource : lang.noDocument}}" (click)="$event.stopPropagation();viewDocument(row)" - (mouseenter)="viewThumbnail(row);" (mouseleave)="closeThumbnail();" - [disabled]="!row.hasDocument"> - <mat-icon class="fa" [ngClass]="[row.hasDocument ? 'fa-eye' : 'fa-eye-slash']"></mat-icon> - </button> - <button mat-icon-button title="{{lang.linkDetails}}" - (click)="$event.stopPropagation();goToDetail(row);"> - <mat-icon fontSet="fas" fontIcon="fa-info-circle fa-2x"></mat-icon> - </button> + (mouseenter)="viewThumbnail(row);" (mouseleave)="closeThumbnail();" + [disabled]="!row.hasDocument"> + <mat-icon class="fa" [ngClass]="[row.hasDocument ? 'fa-eye' : 'fa-eye-slash']"></mat-icon> + </button> + <button mat-icon-button title="{{lang.linkDetails}}" + (click)="$event.stopPropagation();goToDetail(row);"> + <mat-icon fontSet="fas" fontIcon="fa-info-circle fa-2x"></mat-icon> + </button> + </ng-container> </span> </div> <div *ngIf="row.folders !== undefined && row.folders.length > 0" class="folder-info"> @@ -164,7 +169,7 @@ </ng-container> <tr mat-row *matRowDef="let row; columns: displayedColumnsBasket;" (contextmenu)="open($event,row);" (click)="open($event,row);" class="rowData" - style="cursor: pointer;" [class.locked]="row.isLocked == true" cdkDrag + style="cursor: pointer;" [class.locked]="row.isLocked == true" cdkDrag [cdkDragDisabled]="!row.allowed" (cdkDragStarted)="selectSpecificRes(row);" [cdkDragData]="row"> <div class="example-custom-placeholder" *cdkDragPlaceholder></div> <div class="dragPreview" *cdkDragPreview><i class="fas fa-envelope-open-text fa-2x"></i> diff --git a/src/frontend/app/folder/document-list/folder-document-list.component.ts b/src/frontend/app/folder/document-list/folder-document-list.component.ts index d8360c7f3648b21f69b7c7bd491338be079eb164..a04cd55dc8d826644ebc2158f77865f39cf23a75 100644 --- a/src/frontend/app/folder/document-list/folder-document-list.component.ts +++ b/src/frontend/app/folder/document-list/folder-document-list.component.ts @@ -1,18 +1,15 @@ import { Component, OnInit, ViewChild, EventEmitter, ViewContainerRef } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { LANG } from '../../translate.component'; -import { merge, Observable, of as observableOf, Subject, of, Subscription } from 'rxjs'; import { NotificationService } from '../../notification.service'; import { MatDialog, MatDialogRef } from '@angular/material/dialog'; import { MatPaginator } from '@angular/material/paginator'; import { MatSidenav } from '@angular/material/sidenav'; import { MatSort } from '@angular/material/sort'; - import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; import { startWith, switchMap, map, catchError, takeUntil, tap } from 'rxjs/operators'; import { ActivatedRoute, Router } from '@angular/router'; import { HeaderService } from '../../../service/header.service'; - import { Overlay } from '@angular/cdk/overlay'; import { PanelListComponent } from '../../list/panel/panel-list.component'; import { AppService } from '../../../service/app.service'; @@ -21,12 +18,12 @@ import { FolderActionListComponent } from '../folder-action-list/folder-action-l import { FiltersListService } from '../../../service/filtersList.service'; import { FoldersService } from '../folders.service'; import { FunctionsService } from '../../../service/functions.service'; - +import { merge, Observable, Subject, of, Subscription } from 'rxjs'; declare function $j(selector: any): any; @Component({ - templateUrl: "folder-document-list.component.html", + templateUrl: 'folder-document-list.component.html', styleUrls: ['folder-document-list.component.scss'], providers: [NotificationService, AppService] }) @@ -123,7 +120,7 @@ export class FolderDocumentListComponent implements OnInit { this.subscription = this.foldersService.catchEvent().subscribe((result: any) => { if (result.type === 'refreshFolderInformations') { - if(result.content.id == this.folderInfo.id) { + if (result.content.id == this.folderInfo.id) { this.refreshFolderInformations(); } } @@ -146,23 +143,22 @@ export class FolderDocumentListComponent implements OnInit { this.http.get('../../rest/folders/' + params['folderId']) .subscribe((data: any) => { - let keywordEntities = [{ + const keywordEntities = [{ keyword: 'ALL_ENTITIES', text: this.lang.allEntities, }]; - this.folderInfo = - { - 'id': params['folderId'], - 'label': data.folder.label, - 'ownerDisplayName': data.folder.ownerDisplayName, - 'entitiesSharing': data.folder.sharing.entities.map((entity: any) => { - if (!this.functions.empty(entity.label)) { - return entity.label; - } else { - return keywordEntities.filter((element: any) => element.keyword == entity.keyword)[0].text - } - }), - }; + this.folderInfo = { + 'id': params['folderId'], + 'label': data.folder.label, + 'ownerDisplayName': data.folder.ownerDisplayName, + 'entitiesSharing': data.folder.sharing.entities.map((entity: any) => { + if (!this.functions.empty(entity.label)) { + return entity.label; + } else { + return keywordEntities.filter((element: any) => element.keyword === entity.keyword)[0].text; + } + }), + }; this.foldersService.setFolder(this.folderInfo); this.headerService.setHeader(this.folderInfo.label, '', 'fa fa-folder-open'); @@ -207,20 +203,20 @@ export class FolderDocumentListComponent implements OnInit { return this.resultListDatabase!.getRepoIssues( this.sort.active, this.sort.direction, this.paginator.pageIndex, this.basketUrl, this.filtersListService.getUrlFilters(), this.paginator.pageSize); }), - map(data => { + map((data: any) => { // Flip flag to show that loading has finished. this.isLoadingResults = false; data = this.processPostData(data); this.resultsLength = data.countResources; this.allResInBasket = data.allResources; - //this.headerService.setHeader('Dossier : ' + this.folderInfo.label); + // this.headerService.setHeader('Dossier : ' + this.folderInfo.label); return data.resources; }), catchError((err: any) => { this.notify.handleErrors(err); this.router.navigate(['/home']); this.isLoadingResults = false; - return observableOf([]); + return of(false); }) ).subscribe(data => this.data = data); } @@ -233,8 +229,8 @@ export class FolderDocumentListComponent implements OnInit { this.docUrl = '../../rest/resources/' + row.resId + '/content'; this.currentChrono = row.chrono; this.innerHtml = this.sanitizer.bypassSecurityTrustHtml( - "<iframe style='height:100%;width:100%;' src='" + this.docUrl + "' class='embed-responsive-item'>" + - "</iframe>"); + '<iframe style=\'height:100%;width:100%;\' src=\'' + this.docUrl + '\' class=\'embed-responsive-item\'>' + + '</iframe>'); this.sidenavRight.open(); } } @@ -248,13 +244,13 @@ export class FolderDocumentListComponent implements OnInit { } togglePanel(mode: string, row: any) { - let thisSelect = { checked: true }; - let thisDeselect = { checked: false }; + const thisSelect = { checked: true }; + const thisDeselect = { checked: false }; row.checked = true; this.toggleAllRes(thisDeselect); this.toggleRes(thisSelect, row); - if (this.currentResource.resId == row.resId && this.sidenavRight.opened && this.currentMode == mode) { + if (this.currentResource.resId === row.resId && this.sidenavRight.opened && this.currentMode === mode) { this.sidenavRight.close(); } else { this.currentMode = mode; @@ -271,23 +267,22 @@ export class FolderDocumentListComponent implements OnInit { refreshFolderInformations() { this.http.get('../../rest/folders/' + this.folderInfo.id) .subscribe((data: any) => { - let keywordEntities = [{ + const keywordEntities = [{ keyword: 'ALL_ENTITIES', text: this.lang.allEntities, }]; - this.folderInfo = - { - 'id': data.folder.id, - 'label': data.folder.label, - 'ownerDisplayName': data.folder.ownerDisplayName, - 'entitiesSharing': data.folder.sharing.entities.map((entity: any) => { - if (!this.functions.empty(entity.label)) { - return entity.label; - } else { - return keywordEntities.filter((element: any) => element.keyword == entity.keyword)[0].text - } - }), - }; + this.folderInfo = { + 'id': data.folder.id, + 'label': data.folder.label, + 'ownerDisplayName': data.folder.ownerDisplayName, + 'entitiesSharing': data.folder.sharing.entities.map((entity: any) => { + if (!this.functions.empty(entity.label)) { + return entity.label; + } else { + return keywordEntities.filter((element: any) => element.keyword === entity.keyword)[0].text; + } + }), + }; this.headerService.setHeader(this.folderInfo.label, '', 'fa fa-folder-open'); }); } @@ -312,22 +307,22 @@ export class FolderDocumentListComponent implements OnInit { if (row.hasDocument) { this.thumbnailUrl = '../../rest/resources/' + row.resId + '/thumbnail'; $j('#viewThumbnail').show(); - $j('#listContent').css({"overflow": "hidden"}); + $j('#listContent').css({'overflow': 'hidden'}); } } closeThumbnail() { $j('#viewThumbnail').hide(); - $j('#listContent').css({ "overflow": "auto" }); + $j('#listContent').css({ 'overflow': 'auto' }); } processPostData(data: any) { data.resources.forEach((element: any) => { // Process main datas Object.keys(element).forEach((key) => { - if (key == 'statusImage' && element[key] == null) { + if (key === 'statusImage' && element[key] == null) { element[key] = 'fa-question undefined'; - } else if ((element[key] == null || element[key] == '') && ['closingDate', 'countAttachments', 'countNotes', 'display', 'mailTracking', 'hasDocument'].indexOf(key) === -1) { + } else if ((element[key] == null || element[key] === '') && ['closingDate', 'countAttachments', 'countNotes', 'display', 'mailTracking', 'hasDocument'].indexOf(key) === -1) { element[key] = this.lang.undefined; } }); @@ -345,7 +340,7 @@ export class FolderDocumentListComponent implements OnInit { row.checked = true; } } else { - let index = this.selectedRes.indexOf(row.resId); + const index = this.selectedRes.indexOf(row.resId); this.selectedRes.splice(index, 1); row.checked = false; } @@ -366,8 +361,8 @@ export class FolderDocumentListComponent implements OnInit { } selectSpecificRes(row: any) { - let thisSelect = { checked: true }; - let thisDeselect = { checked: false }; + const thisSelect = { checked: true }; + const thisDeselect = { checked: false }; this.toggleAllRes(thisDeselect); this.toggleRes(thisSelect, row); @@ -375,14 +370,14 @@ export class FolderDocumentListComponent implements OnInit { open({ x, y }: MouseEvent, row: any) { - let thisSelect = { checked: true }; - let thisDeselect = { checked: false }; + const thisSelect = { checked: true }; + const thisDeselect = { checked: false }; if (row.checked === false) { row.checked = true; this.toggleAllRes(thisDeselect); this.toggleRes(thisSelect, row); } - this.actionsList.open(x, y, row) + this.actionsList.open(x, y, row); // prevents default return false; @@ -394,23 +389,28 @@ export class FolderDocumentListComponent implements OnInit { toggleMailTracking(row: any) { if (!row.mailTracking) { - this.http.post('../../rest/resources/follow', {resources: [row.resId]}).pipe( - tap(() => this.headerService.nbResourcesFollowed++), + this.http.post('../../rest/resources/follow', { resources: [row.resId] }).pipe( + tap(() => { + this.headerService.nbResourcesFollowed++; + row.mailTracking = !row.mailTracking; + }), catchError((err: any) => { - this.notify.handleErrors(err); + this.notify.handleSoftErrors(err); return of(false); }) ).subscribe(); } else { this.http.request('DELETE', '../../rest/resources/unfollow', { body: { resources: [row.resId] } }).pipe( - tap(() => this.headerService.nbResourcesFollowed--), + tap(() => { + this.headerService.nbResourcesFollowed--; + row.mailTracking = !row.mailTracking; + }), catchError((err: any) => { - this.notify.handleErrors(err); + this.notify.handleSoftErrors(err); return of(false); }) ).subscribe(); } - row.mailTracking = !row.mailTracking; } viewDocument(row: any) { @@ -431,7 +431,7 @@ export class ResultListHttpDao { getRepoIssues(sort: string, order: string, page: number, href: string, filters: string, pageSize: number): Observable<BasketList> { this.filtersListService.updateListsPropertiesPage(page); this.filtersListService.updateListsPropertiesPageSize(pageSize); - let offset = page * pageSize; + const offset = page * pageSize; const requestUrl = `${href}?limit=${pageSize}&offset=${offset}${filters}`; return this.http.get<BasketList>(requestUrl); diff --git a/src/frontend/app/folder/folder-action-list/folder-action-list.component.ts b/src/frontend/app/folder/folder-action-list/folder-action-list.component.ts index c8051b40775e97cfc30db9bf60b1cbc5ef3c81ee..ea2c0abceda35bf7552e13fa301354b501d988b7 100644 --- a/src/frontend/app/folder/folder-action-list/folder-action-list.component.ts +++ b/src/frontend/app/folder/folder-action-list/folder-action-list.component.ts @@ -7,13 +7,14 @@ import { MatMenuTrigger } from '@angular/material/menu'; import { Router } from '@angular/router'; import { ConfirmComponent } from '../../../plugins/modal/confirm.component'; -import { filter, exhaustMap, tap, map } from 'rxjs/operators'; +import { filter, exhaustMap, tap, map, catchError } from 'rxjs/operators'; import { HeaderService } from '../../../service/header.service'; import { FoldersService } from '../folders.service'; +import { of } from 'rxjs/internal/observable/of'; @Component({ selector: 'app-folder-action-list', - templateUrl: "folder-action-list.component.html", + templateUrl: 'folder-action-list.component.html', styleUrls: ['folder-action-list.component.scss'], providers: [NotificationService], }) @@ -39,25 +40,25 @@ export class FolderActionListComponent implements OnInit { list: [] }; - @Input('selectedRes') selectedRes: any; - @Input('totalRes') totalRes: number; - @Input('contextMode') contextMode: boolean; - @Input('currentFolderInfo') currentFolderInfo: any; + @Input() selectedRes: any; + @Input() totalRes: number; + @Input() contextMode: boolean; + @Input() currentFolderInfo: any; - @Output('refreshEvent') refreshEvent = new EventEmitter<string>(); - @Output('refreshPanelFolders') refreshPanelFolders = new EventEmitter<string>(); + @Output() refreshEvent = new EventEmitter<string>(); + @Output() refreshPanelFolders = new EventEmitter<string>(); constructor( - public http: HttpClient, - private notify: NotificationService, - public dialog: MatDialog, + public http: HttpClient, + private notify: NotificationService, + public dialog: MatDialog, private router: Router, private headerService: HeaderService, private foldersService: FoldersService - ) { } + ) { } dialogRef: MatDialogRef<any>; - + ngOnInit(): void { } open(x: number, y: number, row: any) { @@ -77,7 +78,7 @@ export class FolderActionListComponent implements OnInit { } refreshFolders() { - this.refreshPanelFolders.emit(); + this.refreshPanelFolders.emit(); } refreshDaoAfterAction() { @@ -95,6 +96,10 @@ export class FolderActionListComponent implements OnInit { this.refreshFolders(); this.foldersService.getPinnedFolders(); this.refreshDaoAfterAction(); + }), + catchError((err: any) => { + this.notify.handleSoftErrors(err); + return of(false); }) ).subscribe(); } @@ -104,6 +109,10 @@ export class FolderActionListComponent implements OnInit { tap((data: any) => { this.basketList.groups = data.groupsBaskets.filter((x: any, i: any, a: any) => x && a.map((info: any) => info.groupId).indexOf(x.groupId) === i); this.basketList.list = data.groupsBaskets; + }), + catchError((err: any) => { + this.notify.handleSoftErrors(err); + return of(false); }) ).subscribe(); } @@ -127,6 +136,10 @@ export class FolderActionListComponent implements OnInit { this.notify.success(this.lang.removedFromFolder); this.headerService.nbResourcesFollowed -= data.unFollowed; this.refreshDaoAfterAction(); + }), + catchError((err: any) => { + this.notify.handleSoftErrors(err); + return of(false); }) ).subscribe(); } diff --git a/src/frontend/app/folder/folder-menu/folder-menu.component.ts b/src/frontend/app/folder/folder-menu/folder-menu.component.ts index 027deaff281dabb17218ab034f82beb08e771f4a..a5d72017e4b080f301fc4ed221e3463e7219ecb7 100644 --- a/src/frontend/app/folder/folder-menu/folder-menu.component.ts +++ b/src/frontend/app/folder/folder-menu/folder-menu.component.ts @@ -13,7 +13,7 @@ import { FunctionsService } from '../../../service/functions.service'; @Component({ selector: 'folder-menu', - templateUrl: "folder-menu.component.html", + templateUrl: 'folder-menu.component.html', styleUrls: ['folder-menu.component.scss'], providers: [NotificationService], }) @@ -56,8 +56,8 @@ export class FolderMenuComponent implements OnInit { }), filter(value => value.length > 2), tap(() => this.loading = true), - //distinctUntilChanged(), - switchMap(data => this.http.get('../../rest/autocomplete/folders', { params: { "search": data } })), + // distinctUntilChanged(), + switchMap(data => this.http.get('../../rest/autocomplete/folders', { params: { 'search': data } })), tap((data: any) => { this.pinnedFolder = false; this.foldersList = data.map( @@ -86,7 +86,7 @@ export class FolderMenuComponent implements OnInit { getFolders() { this.loading = true; - this.http.get("../../rest/pinnedFolders").pipe( + this.http.get('../../rest/pinnedFolders').pipe( map((data: any) => data.folders), tap((data: any) => { this.foldersList = data; @@ -126,6 +126,10 @@ export class FolderMenuComponent implements OnInit { this.foldersService.getPinnedFolders(); this.refreshList.emit(); this.refreshFolders.emit(); + }), + catchError((err) => { + this.notify.handleSoftErrors(err); + return of(false); }) ).subscribe(); } diff --git a/src/frontend/app/home/followed-action-list/followed-action-list.component.ts b/src/frontend/app/home/followed-action-list/followed-action-list.component.ts index a0987700c55059020812682ab59d985547aadd1c..76f16f8752ef08ac2fa5da2160230ec9fe98f193 100644 --- a/src/frontend/app/home/followed-action-list/followed-action-list.component.ts +++ b/src/frontend/app/home/followed-action-list/followed-action-list.component.ts @@ -7,13 +7,14 @@ import { MatMenuTrigger } from '@angular/material/menu'; import { Router } from '@angular/router'; import { ConfirmComponent } from '../../../plugins/modal/confirm.component'; -import { filter, exhaustMap, tap, map } from 'rxjs/operators'; +import { filter, exhaustMap, tap, map, catchError } from 'rxjs/operators'; import { HeaderService } from '../../../service/header.service'; -import {MenuShortcutComponent} from "../../menu/menu-shortcut.component"; +import { MenuShortcutComponent } from '../../menu/menu-shortcut.component'; +import { of } from 'rxjs/internal/observable/of'; @Component({ selector: 'app-followed-action-list', - templateUrl: "followed-action-list.component.html", + templateUrl: 'followed-action-list.component.html', styleUrls: ['followed-action-list.component.scss'], providers: [NotificationService], }) @@ -40,15 +41,15 @@ export class FollowedActionListComponent implements OnInit { list: [] }; - @Input('selectedRes') selectedRes: any; - @Input('totalRes') totalRes: number; - @Input('contextMode') contextMode: boolean; - @Input('currentFolderInfo') currentFolderInfo: any; + @Input() selectedRes: any; + @Input() totalRes: number; + @Input() contextMode: boolean; + @Input() currentFolderInfo: any; - @Input('menuShortcut') menuShortcut: MenuShortcutComponent; + @Input() menuShortcut: MenuShortcutComponent; - @Output('refreshEvent') refreshEvent = new EventEmitter<string>(); - @Output('refreshPanelFolders') refreshPanelFolders = new EventEmitter<string>(); + @Output() refreshEvent = new EventEmitter<string>(); + @Output() refreshPanelFolders = new EventEmitter<string>(); constructor( public http: HttpClient, @@ -56,7 +57,7 @@ export class FollowedActionListComponent implements OnInit { public dialog: MatDialog, private router: Router, private headerService: HeaderService, - ) { } + ) { } dialogRef: MatDialogRef<any>; @@ -79,7 +80,7 @@ export class FollowedActionListComponent implements OnInit { } refreshFolders() { - this.refreshPanelFolders.emit(); + this.refreshPanelFolders.emit(); } refreshDaoAfterAction() { @@ -91,11 +92,15 @@ export class FollowedActionListComponent implements OnInit { this.dialogRef.afterClosed().pipe( filter((data: string) => data === 'ok'), - exhaustMap(() => this.http.request('DELETE', '../../rest/resources/unfollow' , { body: { resources: this.selectedRes } })), + exhaustMap(() => this.http.request('DELETE', '../../rest/resources/unfollow', { body: { resources: this.selectedRes } })), tap((data: any) => { this.notify.success(this.lang.removedFromFolder); this.headerService.nbResourcesFollowed -= data.unFollowed; this.refreshDaoAfterAction(); + }), + catchError((err: any) => { + this.notify.handleSoftErrors(err); + return of(false); }) ).subscribe(); } @@ -105,6 +110,10 @@ export class FollowedActionListComponent implements OnInit { tap((data: any) => { this.basketList.groups = data.groupsBaskets.filter((x: any, i: any, a: any) => x && a.map((info: any) => info.groupId).indexOf(x.groupId) === i); this.basketList.list = data.groupsBaskets; + }), + catchError((err: any) => { + this.notify.handleSoftErrors(err); + return of(false); }) ).subscribe(); } diff --git a/src/frontend/app/home/followed-list/followed-document-list.component.html b/src/frontend/app/home/followed-list/followed-document-list.component.html index f4fff7ee1b94af4699ec9cee3d5320cca1c00184..8f71ecadcf4f5caf1ec68ab5c3d182bfc35db2c8 100644 --- a/src/frontend/app/home/followed-list/followed-document-list.component.html +++ b/src/frontend/app/home/followed-list/followed-document-list.component.html @@ -99,7 +99,11 @@ [class.undefined]="row.subject == lang.undefined" title="{{row.subject}}">{{row.subject | shorten: 150: '...'}}</span> <span class="main-info-action"> - <button mat-icon-button title="{{lang.notes}}" + <div *ngIf="!row.allowed" color="warn"> + {{lang.documentOutOfPerimeter}} + </div> + <ng-container *ngIf="row.allowed"> + <button mat-icon-button title="{{lang.notes}}" (click)="$event.stopPropagation();togglePanel('note',row)" [class.noData]="row.countNotes == 0"> <mat-icon matBadgeHidden="{{row.countNotes == 0}}" fontSet="fas" @@ -130,6 +134,7 @@ (click)="$event.stopPropagation();goToDetail(row);"> <mat-icon fontSet="fas" fontIcon="fa-info-circle fa-2x"></mat-icon> </button> + </ng-container> </span> </div> <div *ngIf="row.folders !== undefined && row.folders.length > 0" class="folder-info"> @@ -139,7 +144,7 @@ </ng-container> <tr mat-row *matRowDef="let row; columns: displayedColumnsBasket;" (contextmenu)="open($event,row);" (click)="open($event,row);" class="rowData" - style="cursor: pointer;" [class.locked]="row.isLocked == true" cdkDrag + style="cursor: pointer;" [class.locked]="row.isLocked == true" cdkDrag [cdkDragDisabled]="!row.allowed" (cdkDragStarted)="selectSpecificRes(row);" [cdkDragData]="row"> <div class="example-custom-placeholder" *cdkDragPlaceholder></div> <div class="dragPreview" *cdkDragPreview><i class="fas fa-envelope-open-text fa-2x"></i> diff --git a/src/frontend/app/home/followed-list/followed-document-list.component.ts b/src/frontend/app/home/followed-list/followed-document-list.component.ts index 3f28ca3940b7633e5ff90d89c63273e4d30b1ea3..0e07ccf532d838a3b75a558b844cc46de6d6eb8b 100644 --- a/src/frontend/app/home/followed-list/followed-document-list.component.ts +++ b/src/frontend/app/home/followed-list/followed-document-list.component.ts @@ -1,18 +1,15 @@ -import { Component, OnInit, ViewChild, EventEmitter, ViewContainerRef } from '@angular/core'; +import { Component, OnInit, ViewChild, EventEmitter, ViewContainerRef, OnDestroy } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { LANG } from '../../translate.component'; -import {merge, Observable, of as observableOf, Subject, Subscription} from 'rxjs'; import { NotificationService } from '../../notification.service'; import { MatDialog, MatDialogRef } from '@angular/material/dialog'; import { MatPaginator } from '@angular/material/paginator'; import { MatSidenav } from '@angular/material/sidenav'; import { MatSort } from '@angular/material/sort'; - import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; import { startWith, switchMap, map, catchError, takeUntil, tap, exhaustMap, filter } from 'rxjs/operators'; import { ActivatedRoute, Router } from '@angular/router'; import { HeaderService } from '../../../service/header.service'; - import { Overlay } from '@angular/cdk/overlay'; import { PanelListComponent } from '../../list/panel/panel-list.component'; import { AppService } from '../../../service/app.service'; @@ -20,18 +17,18 @@ import { BasketHomeComponent } from '../../basket/basket-home.component'; import { ConfirmComponent } from '../../../plugins/modal/confirm.component'; import { FollowedActionListComponent } from '../followed-action-list/followed-action-list.component'; import { FiltersListService } from '../../../service/filtersList.service'; -import {MenuShortcutComponent} from "../../menu/menu-shortcut.component"; +import { MenuShortcutComponent } from '../../menu/menu-shortcut.component'; import { FoldersService } from '../../folder/folders.service'; - +import {merge, Observable, Subject, Subscription, of} from 'rxjs'; declare function $j(selector: any): any; @Component({ - templateUrl: "followed-document-list.component.html", + templateUrl: 'followed-document-list.component.html', styleUrls: ['followed-document-list.component.scss'], providers: [NotificationService, AppService] }) -export class FollowedDocumentListComponent implements OnInit { +export class FollowedDocumentListComponent implements OnInit, OnDestroy { lang: any = LANG; @@ -182,7 +179,7 @@ export class FollowedDocumentListComponent implements OnInit { return this.resultListDatabase!.getRepoIssues( this.sort.active, this.sort.direction, this.paginator.pageIndex, this.basketUrl, this.filtersListService.getUrlFilters(), this.paginator.pageSize); }), - map(data => { + map((data: any) => { // Flip flag to show that loading has finished. this.isLoadingResults = false; data = this.processPostData(data); @@ -194,21 +191,21 @@ export class FollowedDocumentListComponent implements OnInit { this.notify.handleErrors(err); this.router.navigate(['/home']); this.isLoadingResults = false; - return observableOf([]); + return of(false); }) ).subscribe(data => this.data = data); } goTo(row: any) { this.filtersListService.filterMode = false; - if (this.docUrl == '../../rest/resources/' + row.resId + '/content' && this.sidenavRight.opened) { + if (this.docUrl === '../../rest/resources/' + row.resId + '/content' && this.sidenavRight.opened) { this.sidenavRight.close(); } else { this.docUrl = '../../rest/resources/' + row.resId + '/content'; this.currentChrono = row.chrono; this.innerHtml = this.sanitizer.bypassSecurityTrustHtml( - "<iframe style='height:100%;width:100%;' src='" + this.docUrl + "' class='embed-responsive-item'>" + - "</iframe>"); + '<iframe style=\'height:100%;width:100%;\' src=\'' + this.docUrl + '\' class=\'embed-responsive-item\'>' + + '</iframe>'); this.sidenavRight.open(); } } @@ -222,13 +219,13 @@ export class FollowedDocumentListComponent implements OnInit { } togglePanel(mode: string, row: any) { - let thisSelect = { checked: true }; - let thisDeselect = { checked: false }; + const thisSelect = { checked: true }; + const thisDeselect = { checked: false }; row.checked = true; this.toggleAllRes(thisDeselect); this.toggleRes(thisSelect, row); - if (this.currentResource.resId == row.resId && this.sidenavRight.opened && this.currentMode == mode) { + if (this.currentResource.resId === row.resId && this.sidenavRight.opened && this.currentMode === mode) { this.sidenavRight.close(); } else { this.currentMode = mode; @@ -262,22 +259,22 @@ export class FollowedDocumentListComponent implements OnInit { if (row.hasDocument) { this.thumbnailUrl = '../../rest/resources/' + row.resId + '/thumbnail'; $j('#viewThumbnail').show(); - $j('#listContent').css({"overflow": "hidden"}); + $j('#listContent').css({'overflow': 'hidden'}); } } closeThumbnail() { $j('#viewThumbnail').hide(); - $j('#listContent').css({ "overflow": "auto" }); + $j('#listContent').css({ 'overflow': 'auto' }); } processPostData(data: any) { data.resources.forEach((element: any) => { // Process main datas Object.keys(element).forEach((key) => { - if (key == 'statusImage' && element[key] == null) { + if (key === 'statusImage' && element[key] == null) { element[key] = 'fa-question undefined'; - } else if ((element[key] == null || element[key] == '') && ['closingDate', 'countAttachments', 'countNotes', 'display', 'mailTracking', 'hasDocument', 'folders'].indexOf(key) === -1) { + } else if ((element[key] == null || element[key] === '') && ['closingDate', 'countAttachments', 'countNotes', 'display', 'mailTracking', 'hasDocument', 'folders'].indexOf(key) === -1) { element[key] = this.lang.undefined; } }); @@ -295,7 +292,7 @@ export class FollowedDocumentListComponent implements OnInit { row.checked = true; } } else { - let index = this.selectedRes.indexOf(row.resId); + const index = this.selectedRes.indexOf(row.resId); this.selectedRes.splice(index, 1); row.checked = false; } @@ -316,16 +313,16 @@ export class FollowedDocumentListComponent implements OnInit { } selectSpecificRes(row: any) { - let thisSelect = { checked: true }; - let thisDeselect = { checked: false }; + const thisSelect = { checked: true }; + const thisDeselect = { checked: false }; this.toggleAllRes(thisDeselect); this.toggleRes(thisSelect, row); } open({ x, y }: MouseEvent, row: any) { - let thisSelect = { checked: true }; - let thisDeselect = { checked: false }; + const thisSelect = { checked: true }; + const thisDeselect = { checked: false }; if (row.checked === false) { row.checked = true; this.toggleAllRes(thisDeselect); @@ -346,10 +343,14 @@ export class FollowedDocumentListComponent implements OnInit { this.dialogRef.afterClosed().pipe( filter((data: string) => data === 'ok'), - exhaustMap(() => this.http.request('DELETE', '../../rest/resources/unfollow' , { body: { resources: [row.resId] } })), + exhaustMap(() => this.http.request('DELETE', '../../rest/resources/unfollow', { body: { resources: [row.resId] } })), tap((data: any) => { this.headerService.nbResourcesFollowed--; this.initResultList(); + }), + catchError((err: any) => { + this.notify.handleSoftErrors(err); + return of(false); }) ).subscribe(); } @@ -372,7 +373,7 @@ export class ResultListHttpDao { getRepoIssues(sort: string, order: string, page: number, href: string, filters: string, pageSize: number): Observable<BasketList> { this.filtersListService.updateListsPropertiesPage(page); this.filtersListService.updateListsPropertiesPageSize(pageSize); - let offset = page * pageSize; + const offset = page * pageSize; const requestUrl = `${href}?limit=${pageSize}&offset=${offset}${filters}`; return this.http.get<BasketList>(requestUrl); diff --git a/src/frontend/app/notification.service.ts b/src/frontend/app/notification.service.ts index d0cf400b4cba36dc6b024361178b902ea7e15803..24dcb8512cb42e190ded0f07b10065e0c5a81921 100755 --- a/src/frontend/app/notification.service.ts +++ b/src/frontend/app/notification.service.ts @@ -5,7 +5,7 @@ import { Router } from '@angular/router'; import { LANG } from './translate.component'; @Component({ selector: 'custom-snackbar', - templateUrl: "notification.service.html", + templateUrl: 'notification.service.html', styleUrls: ['notification.service.scss'], }) export class CustomSnackbarComponent { @@ -55,8 +55,10 @@ export class NotificationService { if (err.error.errors !== undefined) { if (err.error.lang !== undefined) { this.error(this.lang[err.error.lang]); - } else if (err.error.errors == 'Document out of perimeter' || err.error.errors == 'Resource out of perimeter' || err.error.errors == 'Resources out of perimeter') { + } else if (err.error.errors === 'Document out of perimeter' || err.error.errors === 'Resource out of perimeter') { this.error(this.lang.documentOutOfPerimeter); + } else if (err.error.errors === 'Resources out of perimeter') { + this.error(this.lang.documentsOutOfPerimeter); } else { this.error(err.error.errors, err.url); } @@ -82,8 +84,10 @@ export class NotificationService { if (err.error.errors !== undefined) { if (err.error.lang !== undefined) { this.error(this.lang[err.error.lang]); - } else if (err.error.errors == 'Document out of perimeter' || err.error.errors == 'Resource out of perimeter' || err.error.errors == 'Resources out of perimeter') { + } else if (err.error.errors === 'Document out of perimeter' || err.error.errors === 'Resource out of perimeter') { this.error(this.lang.documentOutOfPerimeter); + } else if (err.error.errors === 'Resources out of perimeter') { + this.error(this.lang.documentsOutOfPerimeter); } else { this.error(err.error.errors, err.url); } diff --git a/src/frontend/lang/lang-en.ts b/src/frontend/lang/lang-en.ts index 8966207511595f7f7c539273ca73dbe6dfedeae5..152cd2a8adef11e38b64e6ac1462371b208ab33f 100755 --- a/src/frontend/lang/lang-en.ts +++ b/src/frontend/lang/lang-en.ts @@ -538,6 +538,7 @@ export const LANG_EN = { "documentOutOfPerimeter": "This document is out of your perimeter", "documents": "document(s)", "documentSignedMsg": "The document has been signed, you cannot edit this document", + "documentsOutOfPerimeter": "Some documents are out of your perimeter", "documentTypeAdded": "Document type added", "documentTypeDeleted": "Document type deleted", "documentTypeReplacement": "Document type replacement", diff --git a/src/frontend/lang/lang-fr.ts b/src/frontend/lang/lang-fr.ts index 06c0fc8ab2ae761167055042c2ce49ae628a29f5..a332e68392bbeb349336c84fdbd409bfa8974dc3 100755 --- a/src/frontend/lang/lang-fr.ts +++ b/src/frontend/lang/lang-fr.ts @@ -540,6 +540,7 @@ export const LANG_FR = { "documentOutOfPerimeter": "Ce document est en dehors de votre périmètre", "documents": "document(s)", "documentSignedMsg": "Le document a été signé, vous ne pouvez pas editer ce document", + "documentsOutOfPerimeter": "Certains documents sont en dehors de votre périmètre", "documentTypeAdded": "Type de courrier ajouté", "documentTypeDeleted": "Type de courrier supprimé", "documentTypeReplacement": "Remplacement du type de courrier", diff --git a/src/frontend/lang/lang-nl.ts b/src/frontend/lang/lang-nl.ts index 582b36862988fd9f96a850e4011ac149e453bc6b..156c2fb13270c029c1d5d8be17a9e5979bda7d04 100755 --- a/src/frontend/lang/lang-nl.ts +++ b/src/frontend/lang/lang-nl.ts @@ -1702,4 +1702,5 @@ export const LANG_NL = { "targetIdentifier": "Target identifier__TO_TRANSLATE", "canUpdateResourcesInSignatureBook": "Can modify the main document included in the signature book__TO_TRANSLATE", "includeFolderPerimeter": "Consulter les courriers hors périmètre dans les dossiers et courriers suivis__TO_TRANSLATE", + "documentsOutOfPerimeter": "Certains documents sont en dehors de votre périmètre__TO_TRANSLATE", };