diff --git a/src/app/appmarket/users/list/userslist.component.html b/src/app/appmarket/users/list/userslist.component.html index 584f7d70b5af31f0bd7683200a745de19349d0b0..98178461d93d9e7ecbb06ae696066ef6f74b71d0 100644 --- a/src/app/appmarket/users/list/userslist.component.html +++ b/src/app/appmarket/users/list/userslist.component.html @@ -1,8 +1,18 @@ -<div class="col-sm-12" *roles="['ROLE_DOMAIN_ADMIN', 'ROLE_SYSTEM_ADMIN']"> - <nmaas-userslist *ngIf="!isInAddToDomainMode" [users]="allUsers" [allowedModes]="[ComponentMode.VIEW, ComponentMode.DELETE]" +<div class="col-sm-12" *roles="['ROLE_SYSTEM_ADMIN']"> + <nmaas-userslist *ngIf="!isInAddToDomainMode" [users]="allUsers" [allowedModes]="[ComponentMode.VIEW, ComponentMode.DELETE]" (onUserRoleChange)="onUserRoleChange($event)" (onView)="onUserView($event)" (onModeChange)="onModeChange($event)" (onDelete)="onUserDelete($event)" (onRemoveFromDomain)="onRemoveRole($event)"> </nmaas-userslist> - <nmaas-userslist *ngIf="isInAddToDomainMode" [users]="usersToAdd" [allowedModes]="[ComponentMode.VIEW, ComponentMode.EDIT]" + <nmaas-userslist *ngIf="isInAddToDomainMode" [users]="usersToAdd" [allowedModes]="[ComponentMode.VIEW, ComponentMode.EDIT]" (onUserRoleChange)="onUserRoleChange($event)" (onView)="onUserView($event)" (onModeChange)="onModeChange($event)" (onAddToDomain)="onUserAddToDomain($event)"> </nmaas-userslist> </div> + + +<div class="col-sm-12" *roles="['ROLE_DOMAIN_ADMIN']"> + <nmaas-userslist *ngIf="!isInAddToDomainMode" [users]="allUsers" [allowedModes]="[ComponentMode.VIEW, ComponentMode.DELETE]" [domainMode]="true" (onUserRoleChange)="onUserRoleChange($event)" + (onView)="onUserView($event)" (onModeChange)="onModeChange($event)" (onDelete)="onUserDelete($event)" (onRemoveFromDomain)="onRemoveRole($event)"> + </nmaas-userslist> + <nmaas-userslist *ngIf="isInAddToDomainMode" [users]="usersToAdd" [allowedModes]="[ComponentMode.VIEW, ComponentMode.EDIT]" [domainMode]="true" + (onView)="onUserView($event)" (onModeChange)="onModeChange($event)" (onAddToDomain)="onUserAddToDomain($event)" (onUserRoleChange)="onUserRoleChange($event)"> + </nmaas-userslist> +</div> diff --git a/src/app/appmarket/users/list/userslist.component.spec.ts b/src/app/appmarket/users/list/userslist.component.spec.ts index 36a0b1de0f40cc309072f1bed9630ad0bfede7a9..e4b085517efaf0ca47742ea3727e96daed679d80 100644 --- a/src/app/appmarket/users/list/userslist.component.spec.ts +++ b/src/app/appmarket/users/list/userslist.component.spec.ts @@ -17,8 +17,9 @@ describe('UsersListComponent', () => { const authServiceSpy = createSpyObj('AuthService', ['hasRole']); authServiceSpy.hasRole.and.returnValue(true) - const userServiceSpy = createSpyObj('UserService', ['getAll']) + const userServiceSpy = createSpyObj('UserService', ['getAll', 'getDomainUsersAsAdmin']) userServiceSpy.getAll.and.returnValue(of([])) + userServiceSpy.getDomainUsersAsAdmin.and.returnValue(of([])) const domainServiceSpy = createSpyObj('DomainService', ['getGlobalDomainId']) domainServiceSpy.getGlobalDomainId.and.returnValue(1) diff --git a/src/app/appmarket/users/list/userslist.component.ts b/src/app/appmarket/users/list/userslist.component.ts index 5aded415ee25b357a1f2ce95b0c785ea1b8ae96a..9f578ac07781afb1df96f2012013233fa58bce04 100644 --- a/src/app/appmarket/users/list/userslist.component.ts +++ b/src/app/appmarket/users/list/userslist.component.ts @@ -12,124 +12,116 @@ import {Observable, of} from 'rxjs'; import {map} from 'rxjs/operators'; @Component({ - selector: 'app-userslist', - templateUrl: './userslist.component.html', - styleUrls: ['./userslist.component.css'] + selector: 'app-userslist', + templateUrl: './userslist.component.html', + styleUrls: ['./userslist.component.css'] }) export class UsersListComponent implements OnInit { - public ComponentMode = ComponentMode; + public ComponentMode = ComponentMode; - private domainId: number; + private domainId: number; - public allUsers: User[] = []; - public usersToAdd: User[] = []; - // private domainUsers: Map<number, User[]> = new Map<number, User[]>(); + public allUsers: User[] = []; + public usersToAdd: User[] = []; - public isInAddToDomainMode = false; + public isInAddToDomainMode = false; - constructor(protected authService: AuthService, - protected userService: UserService, - protected domainService: DomainService, - protected userDataService: UserDataService, - private router: Router, - private route: ActivatedRoute, - private location: Location) {} - - - ngOnInit() { - this.userDataService.selectedDomainId.subscribe((domainId) => this.update(domainId)); - } - - public update(domainId: number): void { - console.log('Update users for domainId=' + domainId); - if (domainId == null || domainId === 0) { - this.domainId = undefined; - } else { - this.domainId = domainId; + constructor(protected authService: AuthService, + protected userService: UserService, + protected domainService: DomainService, + protected userDataService: UserDataService, + private router: Router, + private route: ActivatedRoute, + private location: Location) { } - let users: Observable<User[]> = null; - if (this.authService.hasRole(Role[Role.ROLE_SYSTEM_ADMIN])) { - users = this.userService.getAll(this.domainId); - } else if (this.domainId != null && this.authService.hasDomainRole(this.domainId, Role[Role.ROLE_DOMAIN_ADMIN])) { - users = this.userService.getAll(this.domainId); - } else { - users = of<User[]>([]); + ngOnInit() { + this.userDataService.selectedDomainId.subscribe((domainId) => this.update(domainId)); } - // sort default user list by username - users = users.pipe( - map(userList => { - userList.sort((a, b) => a.username.localeCompare(b.username)); - return userList; - }) - ) - - users.subscribe((all) => { - this.allUsers = all; - /* parse date strings to date objects */ - for (const u of this.allUsers) { - if (u.firstLoginDate) { - u.firstLoginDate = new Date(u.firstLoginDate) + + public update(domainId: number): void { + console.log('Update users for domainId= ' + domainId); + if (domainId == null || domainId === 0) { + this.domainId = undefined; + } else { + this.domainId = domainId; } - if (u.lastSuccessfulLoginDate) { - u.lastSuccessfulLoginDate = new Date(u.lastSuccessfulLoginDate) + + let users: Observable<User[]> = null; + + if (this.authService.hasRole(Role[Role.ROLE_SYSTEM_ADMIN]) && this.domainId != null) { + users = this.userService.getDomainUsersAsAdmin(this.domainId); + } else if (this.authService.hasRole(Role[Role.ROLE_SYSTEM_ADMIN])) { + users = this.userService.getAll(this.domainId); + } else if (this.domainId != null && this.authService.hasDomainRole(this.domainId, Role[Role.ROLE_DOMAIN_ADMIN])) { + users = this.userService.getAll(this.domainId); + } else { + users = of<User[]>([]); } - } - }); - - if (this.domainId !== this.domainService.getGlobalDomainId()) { - this.userService.getAll().subscribe( - all => { - this.usersToAdd = all.filter( - u => u.roles.filter(r => r.domainId === this.domainId).length === 0 && // user has no roles in current domain - u.roles.filter(r => this.userRoleAsEnum(r.role) === Role.ROLE_GUEST && // user has role guest in global domain - r.domainId === this.domainService.getGlobalDomainId()).length === 1); - for (const u of this.usersToAdd) { - if (u.firstLoginDate) { - u.firstLoginDate = new Date(u.firstLoginDate) - } - if (u.lastSuccessfulLoginDate) { - u.lastSuccessfulLoginDate = new Date(u.lastSuccessfulLoginDate) - } + // sort default user list by username + users = users.pipe( + map(userList => { + userList.sort((a, b) => a.username.localeCompare(b.username)); + return userList; + }) + ) + + users.subscribe((all) => { + this.allUsers = all; + /* parse date strings to date objects */ + for (const u of this.allUsers) { + if (u.firstLoginDate) { + u.firstLoginDate = new Date(u.firstLoginDate) + } + if (u.lastSuccessfulLoginDate) { + u.lastSuccessfulLoginDate = new Date(u.lastSuccessfulLoginDate) + } } - } - ); + }); } - } - - public onUserView($event): void { - this.router.navigate(['/admin/users/view/', $event]); - } + public onUserView($event): void { + this.router.navigate(['/admin/users/view/', $event]); + } - public onRemoveRole($event): void { - this.userService.removeRole( - $event.id, $event.roles.find(value => value.domainId === this.domainId).role, this.domainId).subscribe( + public onRemoveRole($event): void { + this.userService.removeRole( + $event.id, $event.roles.find(value => value.domainId === this.domainId).role, this.domainId).subscribe( () => this.update(this.domainId) ) - } + } - public onUserDelete($event): void { - this.userService.deleteOne($event.id).subscribe( - () => this.update(this.domainId) - ) - } + public onUserDelete($event): void { + this.userService.deleteOne($event.id).subscribe( + () => this.update(this.domainId) + ) + } - public onUserAddToDomain($event): void { - this.userService.addRole($event.id, Role.ROLE_USER, this.domainId).subscribe(() => this.update(this.domainId)) - } + public onUserAddToDomain($event): void { + this.userService.addRole($event.id, Role.ROLE_USER, this.domainId).subscribe(() => this.update(this.domainId)) + } - public onModeChange($event): void { - this.isInAddToDomainMode = !this.isInAddToDomainMode; - } + public onModeChange($event): void { + this.isInAddToDomainMode = !this.isInAddToDomainMode; + } - public userRoleAsEnum(role: string | Role): Role { - if (typeof role === 'string') { - return Role[role]; + public userRoleAsEnum(role: string | Role): Role { + if (typeof role === 'string') { + return Role[role]; + } + return role; } - return role; - } + public onUserRoleChange(event: any) { + console.warn(event) + if (event.role !== null) { + this.userService.addRole(event.userId, event.role, event.domainId).subscribe(() => this.update(this.domainId)) + } else { + const foundUser = this.allUsers.find(user => user.id === event.userId); + this.onRemoveRole({id: event.userId, roles: foundUser.roles}) + } + + } } diff --git a/src/app/appmarket/users/users.routes.ts b/src/app/appmarket/users/users.routes.ts index 5dd90b9fe98be4fa398f260341fe6cc633b1743e..c947b8a23ae70e0d7f44042515f4fee73b36484d 100644 --- a/src/app/appmarket/users/users.routes.ts +++ b/src/app/appmarket/users/users.routes.ts @@ -6,7 +6,9 @@ import { ComponentMode } from '../../shared/common/componentmode'; export const UsersRoutes: Route[] = [ { path: 'admin/users', component: UsersListComponent, canActivate: [AuthGuard, RoleGuard], - data: {roles: ['ROLE_SYSTEM_ADMIN', 'ROLE_DOMAIN_ADMIN']}}, + data: {roles: ['ROLE_SYSTEM_ADMIN']}}, { path: 'admin/users/view/:id', component: UserDetailsComponent, canActivate: [AuthGuard, RoleGuard], - data: {mode: ComponentMode.VIEW, roles: ['ROLE_SYSTEM_ADMIN', 'ROLE_DOMAIN_ADMIN']} } + data: {mode: ComponentMode.VIEW, roles: ['ROLE_SYSTEM_ADMIN']} }, + { path: 'domain/users', component: UsersListComponent, canActivate: [AuthGuard, RoleGuard], + data: {roles: ['ROLE_DOMAIN_ADMIN']}}, ]; diff --git a/src/app/model/userrole.ts b/src/app/model/userrole.ts index 22962d0fddf5320586fa4eb487f78e208b236e21..a558619c8b096882afe35b6cb23d8db460b0adf3 100644 --- a/src/app/model/userrole.ts +++ b/src/app/model/userrole.ts @@ -1,7 +1,7 @@ export enum Role { ROLE_SYSTEM_ADMIN, - ROLE_OPERATOR, ROLE_DOMAIN_ADMIN, + ROLE_OPERATOR, ROLE_TOOL_MANAGER, ROLE_USER, ROLE_GUEST, diff --git a/src/app/service/user.service.ts b/src/app/service/user.service.ts index e56969e91da3ec55197bbc5f52ae85ae3f4df303..b298a5785ccfa972942a5b3d9d8dd6e4557bbab2 100644 --- a/src/app/service/user.service.ts +++ b/src/app/service/user.service.ts @@ -2,7 +2,7 @@ import {Injectable} from '@angular/core'; import {Observable} from 'rxjs'; import {GenericDataService} from './genericdata.service'; -import {HttpClient} from '@angular/common/http'; +import {HttpClient, HttpParams} from '@angular/common/http'; import {AppConfigService} from './appconfig.service'; import {Password} from '../model'; @@ -92,6 +92,10 @@ export class UserService extends GenericDataService { return this.appConfig.getApiUrl() + '/domains/' + domainId + '/users/'; } + public getDomainUsersAsAdmin(domainId: number): Observable<User[]> { + return this.get<User[]>(this.appConfig.getApiUrl() + '/domains/' + domainId + '/users/admin'); + } + protected getUserAcceptanceUrl(): string { return this.appConfig.getApiUrl() + '/users/terms/'; } @@ -99,4 +103,11 @@ export class UserService extends GenericDataService { protected getEnableOrDisableUsersUrl(userId: number, enabled: boolean): string { return this.appConfig.getApiUrl() + '/users/status/' + userId + '?enabled=' + enabled; } + + public getUserBySearch(search: string, domainId: number): Observable<User[]> { + let params = new HttpParams(); + params = params.append('searchPart', search); + params = params.append('domainId', domainId.toString()) + return this.http.get<User[]>(`${this.appConfig.getApiUrl()}/users/search`, {params}) + } } diff --git a/src/app/shared/navbar/navbar.component.html b/src/app/shared/navbar/navbar.component.html index 5db9cc9dee633f435d1530ebea7b88c9ad084f3e..4871a003bf0fba4cb8af966803b0bf65649083cf 100644 --- a/src/app/shared/navbar/navbar.component.html +++ b/src/app/shared/navbar/navbar.component.html @@ -52,9 +52,12 @@ <li *roles="['ROLE_DOMAIN_ADMIN', 'ROLE_SYSTEM_ADMIN', 'ROLE_OPERATOR']"><a [routerLink]="['/admin/domains']">{{ 'NAVBAR.DOMAINS' | translate }}</a> </li> - <li *roles="['ROLE_DOMAIN_ADMIN', 'ROLE_SYSTEM_ADMIN']"><a + <li *roles="['ROLE_SYSTEM_ADMIN']"><a [routerLink]="['/admin/users']">{{ 'NAVBAR.USERS' | translate }}</a> </li> + <li *roles="['ROLE_DOMAIN_ADMIN']"><a + [routerLink]="['/domain/users']">{{ 'NAVBAR.USERS' | translate }}</a> + </li> <li *roles="['ROLE_SYSTEM_ADMIN', 'ROLE_TOOL_MANAGER']"><a [routerLink]="['/admin/apps']">{{ 'NAVBAR.MARKET' | translate }}</a> </li> diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 88523d2664521117e44dc7004988317b37a3cd2c..207a294932eaa16c95fc2e485b3c27b06969a0c1 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -55,6 +55,7 @@ import { ContactComponent } from './contact/contact.component'; import {FormioModule} from 'angular-formio'; import { PreferencesComponent } from './users/preferences/preferences.component'; import {TooltipModule} from 'primeng/tooltip'; +import {DropdownModule} from 'primeng/dropdown'; @NgModule({ imports: [ @@ -69,7 +70,8 @@ import {TooltipModule} from 'primeng/tooltip'; TranslateModule.forChild(), NgxPaginationModule, FormioModule, - TooltipModule + TooltipModule, + DropdownModule ], declarations: [ RateComponent, diff --git a/src/app/shared/users/list/userslist.component.css b/src/app/shared/users/list/userslist.component.css index 16a3ba2780518c72710b5a5cc54e196d56aaf53d..867c8dc6d8bf3e3e92b8a99896dd1041e61055ab 100644 --- a/src/app/shared/users/list/userslist.component.css +++ b/src/app/shared/users/list/userslist.component.css @@ -22,3 +22,7 @@ tr.clickable { flex-direction: row; align-items: center; } + +:host ::ng-deep .p-dropdown { + width: 170px; +} diff --git a/src/app/shared/users/list/userslist.component.html b/src/app/shared/users/list/userslist.component.html index 3019915e248db17ab9f614013d9d5b8003b415f6..ed1de739632d322727169dd9acf14abbc8f255aa 100644 --- a/src/app/shared/users/list/userslist.component.html +++ b/src/app/shared/users/list/userslist.component.html @@ -25,7 +25,7 @@ <div class="form-group row col-sm-4 align-vertically"> <label for="searchText" class="col-form-label col-sm-3">Search:</label> <div class="col-sm-9"> - <input id="searchText" type="text" [formControl]="searchText" class="form-control"> + <input id="searchText" type="text" [formControl]="searchText" class="form-control" (keyup)="searchUsers($event.target.value)"> </div> </div> @@ -36,27 +36,28 @@ <tr> <th scope="col" class="column-sortable" sortable-column="username">{{ 'USERS.USER_NAME' | translate }}</th> <th scope="col" class="column-sortable" sortable-column="lastname">{{'USERS.NAME' | translate}}</th> - <th scope="col" class="column-sortable" sortable-column="email">{{'USERS.EMAIL' | translate}}</th> + <th *ngIf="!domainMode" scope="col" class="column-sortable" sortable-column="email">{{'USERS.EMAIL' | translate}}</th> <th scope="col" class="column-sortable" sortable-column="domains" *ngIf="domainId === domainService.getGlobalDomainId()">{{ 'USERS.DOMAINS' | translate }}</th> <th scope="col" class="column-sortable" sortable-column="globalRole" *ngIf="domainId === domainService.getGlobalDomainId()">{{ 'USERS.GLOBAL_ROLE' | translate }}</th> <th scope="col" class="column-sortable" sortable-column="roles" - *ngIf="domainId !== domainService.getGlobalDomainId()">{{ 'USERS.ROLES' | translate }}</th> - <th scope="col" class="column-sortable" *ngIf="!isModeAllowed(ComponentMode.EDIT)" + *ngIf="domainId !== domainService.getGlobalDomainId() && !isModeAllowed(ComponentMode.EDIT)">{{ 'USERS.ROLES' | translate }}</th> + <th scope="col" class="column-sortable" *ngIf="!isModeAllowed(ComponentMode.EDIT) && !domainMode" sortable-column="firstLoginDate">{{ 'USERS.FIRST_LOGIN' | translate }}</th> - <th scope="col" class="column-sortable" *ngIf="!isModeAllowed(ComponentMode.EDIT)" + <th scope="col" class="column-sortable" *ngIf="!isModeAllowed(ComponentMode.EDIT) && !domainMode" sortable-column="lastSuccessfulLoginDate">{{ 'USERS.LAST_SUCCESSFUL_LOGIN' | translate }}</th> <th scope="col" class="column-sortable" sortable-column="enabled">{{ 'USERS.ENABLED' | translate }}</th> - <th scope="col"> </th> + <th *ngIf="!isModeAllowed(ComponentMode.EDIT)" scope="col"> </th> + <th *ngIf="isModeAllowed(ComponentMode.EDIT)" scope="col"> </th> </tr> </thead> <tbody> - <tr *ngFor="let user of displayUsers | paginate: {itemsPerPage: maxItemsOnPage, currentPage: pageNumber, id: paginatorName}" class="clickable" (click)="view(user.id)"> + <tr *ngFor="let user of displayUsers | paginate: {itemsPerPage: maxItemsOnPage, currentPage: pageNumber, id: paginatorName}" [ngClass]="{'clickable!' : domainMode}" (click)="view(user.id)"> <td>{{user.username}}</td> <td>{{(user.firstname || '') + ' ' + (user.lastname || '')}}</td> - <td>{{user.email}}</td> + <td *ngIf="!domainMode">{{user.email}}</td> <td *ngIf="domainId === domainService.getGlobalDomainId()"> <div *ngFor="let role of filterDomainNames(user); last as isLast"> <span *ngIf="!isLast" style="float:left;padding-right: 3px"> @@ -71,18 +72,41 @@ <td *ngIf="domainId === domainService.getGlobalDomainId()"> <span>{{"ENUM.USER_ROLES." + getGlobalRole(user).toUpperCase() | translate}}</span> </td> - <td *ngIf="domainId !== domainService.getGlobalDomainId()"> - <span *ngFor="let role of getOnlyDomainRoles(user)"> - {{"ENUM.USER_ROLES." + role.role.toUpperCase() | translate}} - </span> + <td *ngIf="domainId !== domainService.getGlobalDomainId() && !isModeAllowed(ComponentMode.EDIT)"> + <div *roles="['ROLE_DOMAIN_ADMIN']"> + <div *ngIf="!checkUserIfIsCurrentUser(user.username)"> + <p-dropdown [options]="getAllowedRoles()" (onChange)="changeUserRole(user,domainId, $event)"> + <ng-template pTemplate="selectedItem"> + <span *ngFor="let roles of getOnlyDomainRoles(user)"> + {{"ENUM.USER_ROLES." + roles.role.toUpperCase() | translate}} + </span> + </ng-template> + <ng-template let-role pTemplate="item"> + {{"ENUM.USER_ROLES." + Role[role].toUpperCase() | translate}} + </ng-template> + </p-dropdown> + </div> + </div> + <div *roles="['ROLE_SYSTEM_ADMIN']"> + <span *ngFor="let roles of getOnlyDomainRoles(user)"> + {{"ENUM.USER_ROLES." + roles.role.toUpperCase() | translate}} + </span> + </div> + <div *roles="['ROLE_DOMAIN_ADMIN']"> + <div *ngIf="checkUserIfIsCurrentUser(user.username)"> + <span *ngFor="let roles of getOnlyDomainRoles(user)"> + {{"ENUM.USER_ROLES." + roles.role.toUpperCase() | translate}} + </span> + </div> + </div> </td> - <td *ngIf="!isModeAllowed(ComponentMode.EDIT)">{{user.firstLoginDate | date:'dd-MM-yyyy HH:mm'}}</td> - <td *ngIf="!isModeAllowed(ComponentMode.EDIT)">{{user.lastSuccessfulLoginDate | date:'dd-MM-yyyy HH:mm'}}</td> + <td *ngIf="!isModeAllowed(ComponentMode.EDIT) && !domainMode">{{user.firstLoginDate | date:'dd-MM-yyyy HH:mm'}}</td> + <td *ngIf="!isModeAllowed(ComponentMode.EDIT) && !domainMode">{{user.lastSuccessfulLoginDate | date:'dd-MM-yyyy HH:mm'}}</td> <td> <span class="glyphicon glyphicon-ok" *ngIf="user?.enabled"></span> <span class="glyphicon glyphicon-remove" *ngIf="!(user?.enabled)"></span> </td> - <td> + <td *ngIf="!domainMode && !isModeAllowed(ComponentMode.EDIT)"> <span class="dropdown"> <a style="display: inline-block" class="dropdown-toggle " aria-expanded="false" aria-haspopup="true" @@ -122,6 +146,17 @@ </ul> </span> </td> + <td *ngIf="domainMode && !isModeAllowed(ComponentMode.EDIT)"> + <span *ngIf="!checkUserIfIsCurrentUser(user.username)"> + <a style="display: inline-block" class="" aria-expanded="false" + aria-haspopup="true" role="button" (click)="onRemoveFromDomain.emit(user);$event.stopPropagation()"> + <em class="fas fa-trash icon-black "></em> + </a> + </span> + </td> + <td *ngIf="isModeAllowed(ComponentMode.EDIT)" style="width: 170px"> + <button class="btn btn-success" role="button" (click)="addToCurrentDomain(user)" > {{'USERS.ADD_TO_DOMAIN_BUTTON' | translate}}</button> + </td> </tr> </tbody> </table> diff --git a/src/app/shared/users/list/userslist.component.ts b/src/app/shared/users/list/userslist.component.ts index ee4c51d8d3d4beff299658fccfbfe126df418735..e09722385ed21841dfc567899de5b2c39c054a30 100644 --- a/src/app/shared/users/list/userslist.component.ts +++ b/src/app/shared/users/list/userslist.component.ts @@ -10,6 +10,8 @@ import {UserDataService} from '../../../service/userdata.service'; import {AuthService} from '../../../auth/auth.service'; import {map, shareReplay, take} from 'rxjs/operators'; import {FormControl} from '@angular/forms'; +import {ComponentMode} from '../../common/componentmode'; +import {Router} from '@angular/router'; function userMatches(u: User, term: string): boolean { const t = term || '' @@ -31,6 +33,9 @@ export class UsersListComponent extends BaseComponent implements OnInit, OnChang @Input() public users: User[] = []; // provided list of users + @Input() + public domainMode = false; + public displayUsers: User[] = []; // list of users after transformations public domainId: number; @@ -50,21 +55,28 @@ export class UsersListComponent extends BaseComponent implements OnInit, OnChang @Output() public onModeChange: EventEmitter<number> = new EventEmitter<number>(); + @Output() + public onUserRoleChange: EventEmitter<any> = new EventEmitter<any>(); + public domainCache: CacheService<number, Domain> = new CacheService<number, Domain>(); private lastSearchCriteria: CustomerSearchCriteria = undefined; public pageNumber = 1; public paginatorName = 'paginator-identifier'; - public itemsPerPage: number[] = [15, 20, 25, 30, 50 ]; + public itemsPerPage: number[] = [15, 20, 25, 30, 50]; public maxItemsOnPage = 15; + public filteredUsers: User[] = []; + public searchText = new FormControl(''); + public Role = Role; constructor(private userService: UserService, public domainService: DomainService, private userDataService: UserDataService, - public authService: AuthService) { + public authService: AuthService, + private router: Router) { super(); userDataService.selectedDomainId.subscribe(domain => this.domainId = domain); } @@ -72,7 +84,9 @@ export class UsersListComponent extends BaseComponent implements OnInit, OnChang ngOnInit() { // set stored value of maxElementsPerPage const i = sessionStorage.getItem(this.users_item_number_key); - if (i) { this.maxItemsOnPage = +i; } + if (i) { + this.maxItemsOnPage = +i; + } this.searchText.valueChanges.subscribe( term => this.onSearch(term) @@ -90,7 +104,10 @@ export class UsersListComponent extends BaseComponent implements OnInit, OnChang return of(this.domainCache.getData(domainId).name); } else { return this.domainService.getOne(domainId).pipe( - map((domain) => {this.domainCache.setData(domainId, domain); return domain.name}), + map((domain) => { + this.domainCache.setData(domainId, domain); + return domain.name + }), shareReplay(1), take(1)); } @@ -122,14 +139,18 @@ export class UsersListComponent extends BaseComponent implements OnInit, OnChang } public view(userId: number): void { - this.onView.emit(userId); + if (!this.domainMode) { + this.onView.emit(userId); + } } public changeUserStatus(user: User, enabled: boolean): void { this.userService.changeUserStatus(user.id, enabled).subscribe(); user.enabled = enabled; // sort after changing params - if (this.lastSearchCriteria) { this.handleSortEvent(this.lastSearchCriteria); } + if (this.lastSearchCriteria) { + this.handleSortEvent(this.lastSearchCriteria); + } } onSorted($event) { @@ -147,6 +168,9 @@ export class UsersListComponent extends BaseComponent implements OnInit, OnChang } handleSearchEvent(term: string) { + console.warn(this.displayUsers.filter( + u => userMatches(u, term) + )) this.displayUsers = this.displayUsers.filter( u => userMatches(u, term) ) @@ -155,8 +179,12 @@ export class UsersListComponent extends BaseComponent implements OnInit, OnChang handleSortEvent(criteria: CustomerSearchCriteria) { this.lastSearchCriteria = criteria; const baseSortFunc = (a: any, b: any): number => { - if (a < b) { return -1; } - if (a > b) { return 1; } + if (a < b) { + return -1; + } + if (a > b) { + return 1; + } return 0; }; @@ -174,11 +202,16 @@ export class UsersListComponent extends BaseComponent implements OnInit, OnChang if (criteria.sortColumn === 'domains') { const ad = this.filterDomainNames(a); const bd = this.filterDomainNames(b); - if (!ad) { console.log(ad); } - if (!bd) { console.log(bd); } + if (!ad) { + console.log(ad); + } + if (!bd) { + console.log(bd); + } const ar = ad.length > 0 ? ad[0].domainId : 0; const br = bd.length > 0 ? bd[0].domainId : 0; - p1 = ar; p2 = br; + p1 = ar; + p2 = br; } else if (criteria.sortColumn === 'globalRole') { p1 = this.getGlobalRole(a); p2 = this.getGlobalRole(b); @@ -187,7 +220,8 @@ export class UsersListComponent extends BaseComponent implements OnInit, OnChang const bd = this.getOnlyDomainRoles(b); const ar = ad.length > 0 ? ad[0].role.toString() : ''; const br = bd.length > 0 ? bd[0].role.toString() : ''; - p1 = ar; p2 = br; + p1 = ar; + p2 = br; } else { p1 = a[criteria.sortColumn]; p2 = b[criteria.sortColumn]; @@ -222,6 +256,7 @@ export class UsersListComponent extends BaseComponent implements OnInit, OnChang public addToCurrentDomain(user: User) { this.onAddToDomain.emit(user); + this.changeMode(); } public changeMode() { @@ -241,6 +276,48 @@ export class UsersListComponent extends BaseComponent implements OnInit, OnChang return !result; } + public searchUsers(search: string) { + if (search === '') { + this.filteredUsers = []; + } else { + if (this.allowedModes.find(v => v === ComponentMode.EDIT) !== undefined) { + this.userService.getUserBySearch(search, this.domainId).subscribe(data => { + this.filteredUsers = data; + this.displayUsers = this.filteredUsers; + }) + } else { + // this.displayUsers = this.users; + } + } + } + + + public getAllowedRoles(): Role[] { + let roles: Role[]; + if (this.authService.hasRole(Role[Role.ROLE_SYSTEM_ADMIN]) && + Number(this.domainId === this.domainService.getGlobalDomainId())) { + // admin (global) role set + roles = [Role.ROLE_OPERATOR, Role.ROLE_TOOL_MANAGER, Role.ROLE_SYSTEM_ADMIN]; + // roles = this.filterRoles(roles, this.domainId); + } else if (this.domainId != null) { + // default (domain) role set + roles = [Role.ROLE_GUEST, Role.ROLE_USER, Role.ROLE_DOMAIN_ADMIN]; + } else { + // no roles + roles = []; + } + return roles; + } + + + public changeUserRole(user: User, domainId: number, event: any) { + console.warn(event); + this.onUserRoleChange.emit({userId: user.id, domainId: domainId, role: event.value}) + } + + public checkUserIfIsCurrentUser(userName: string) { + return this.authService.getUsername() === userName + } } function roleConvert(role: string | Role ): Role { diff --git a/src/styles.css b/src/styles.css index 2680ba65af5ac5710ef15882d63941a879269f01..c110a6bc21c49b1d708da99f6cae895ba3d1534c 100644 --- a/src/styles.css +++ b/src/styles.css @@ -44,3 +44,13 @@ flex: 1 1 auto; padding: 1.25rem; } + +.p-inputtext { + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + font-size: 14px; +} + +.p-component { + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + font-size: 14px; +}