This is an automated email from the ASF dual-hosted git repository.

martin_s pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/archiva.git

commit 3012e2f76ff672dccefa306585391b21bfe24f8a
Author: Martin Stockhammer <[email protected]>
AuthorDate: Tue Dec 22 20:27:51 2020 +0100

    Updating role management
---
 .../manage-roles-edit.component.html               | 14 ++++-
 .../manage-roles-edit.component.ts                 | 69 ++++++++++++++++++++--
 .../manage-roles-list.component.ts                 |  2 +-
 .../security/users/manage-users-base.component.ts  |  4 +-
 .../manage-users-delete.component.ts               |  4 +-
 .../manage-users-list.component.ts                 |  2 +-
 .../manage-users-roles.component.html              |  2 +-
 .../users/manage-users/manage-users.component.ts   |  1 -
 .../paginated-entities.component.ts                | 37 ++++++++----
 .../archiva-web/src/app/services/role.service.ts   | 30 ++++++++++
 10 files changed, 141 insertions(+), 24 deletions(-)

diff --git 
a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/roles/manage-roles-edit/manage-roles-edit.component.html
 
b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/roles/manage-roles-edit/manage-roles-edit.component.html
index bf6dd1e..d6fba7e 100644
--- 
a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/roles/manage-roles-edit/manage-roles-edit.component.html
+++ 
b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/roles/manage-roles-edit/manage-roles-edit.component.html
@@ -163,6 +163,7 @@
             <h4>{{'roles.edit.usersParents'|translate}}</h4>
             <app-paginated-entities [service]="roleUserParentService" 
pageSize="5" [(sortField)]="userParentSortField"
                                     [(sortOrder)]="userParentSortOrder" 
[displayControlsIfSinglePage]="false"
+                                    [id]="'userParentSection'"
                                     #userParentSection>
 
                 <ng-container *ngIf="userParentSection.items$ |async as 
itemLoader">
@@ -198,8 +199,10 @@
             <hr/>
             <h4>{{'roles.edit.usersInstance'|translate}}</h4>
             <app-paginated-entities [service]="roleUserService" pageSize="5" 
[(sortField)]="userSortField"
+                                    [id]="'userSection'"
                                     [(sortOrder)]="userSortOrder"
                                     [displayIfEmpty]="false" 
[displayKeyIfEmpty]="'roles.edit.noUsersAssigned'"
+                                    [displayControlsIfSinglePage]="false"
                                     #userSection>
 
                 <ng-container *ngIf="userSection.items$ |async as itemLoader">
@@ -219,6 +222,7 @@
                                            
contentText="users.attributes.user_id"></app-th-sorted>
                             <app-th-sorted [fieldArray]="['full_name']"
                                            
contentText="users.attributes.full_name"></app-th-sorted>
+                            <th>{{'headers.action'|translate}}</th>
                         </tr>
                         </thead>
                         <tbody>
@@ -227,6 +231,8 @@
                                       
ngbTooltip="{{user.id}}">{{user.user_id}}</span>
                             </td>
                             <td>{{user.full_name}}</td>
+                            <td><a href="javascript: void(0)" 
(click)="unassignUser(user.user_id)"><span
+                                    class="fas fa-user-minus"></span></a></td>
                         </tr>
                         </tbody>
                     </table>
@@ -235,7 +241,7 @@
             <hr/>
             <form class="mt-2">
                 <ng-template #userResultTemplate let-r="result" let-t="term">
-                    <ngb-highlight [result]="r.user_id + '-' + r.full_name" 
[term]="t"></ngb-highlight>
+                    <ngb-highlight [result]="r.user_id + ' - ' + r.full_name" 
[term]="t"></ngb-highlight>
                 </ng-template>
                 <div class="form-group">
                     <label 
for="typeahead-http">{{'roles.edit.assignUserSearch'|translate}}</label>
@@ -254,6 +260,12 @@
             </form>
 
         </ng-template>
+        <div *ngIf="success">
+            Success
+        </div>
+        <div *ngIf="error">
+            <div>Error {{errorResult.error_messages}}</div>
+        </div>
     </ngb-panel>
 
 </ngb-accordion>
diff --git 
a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/roles/manage-roles-edit/manage-roles-edit.component.ts
 
b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/roles/manage-roles-edit/manage-roles-edit.component.ts
index 71655fe..321557b 100644
--- 
a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/roles/manage-roles-edit/manage-roles-edit.component.ts
+++ 
b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/roles/manage-roles-edit/manage-roles-edit.component.ts
@@ -16,7 +16,16 @@
  * under the License.
  */
 
-import {AfterContentInit, Component, EventEmitter, OnInit, Output} from 
'@angular/core';
+import {
+    AfterContentInit,
+    ChangeDetectorRef,
+    Component,
+    EventEmitter,
+    OnInit,
+    Output,
+    TemplateRef,
+    ViewChild
+} from '@angular/core';
 import {ActivatedRoute} from "@angular/router";
 import {FormBuilder, Validators} from "@angular/forms";
 import {RoleService} from "@app/services/role.service";
@@ -31,6 +40,8 @@ import {User} from '@app/model/user';
 import {PagedResult} from "@app/model/paged-result";
 import {UserService} from "@app/services/user.service";
 import {UserInfo} from '@app/model/user-info';
+import {HttpResponse} from "@angular/common/http";
+import {PaginatedEntitiesComponent} from 
"@app/modules/shared/paginated-entities/paginated-entities.component";
 
 @Component({
     selector: 'app-manage-roles-edit',
@@ -55,11 +66,14 @@ export class ManageRolesEditComponent extends 
EditBaseComponent<Role> implements
 
     public userSearchModel:any;
 
+    @ViewChild('userSection') roleUserComponent: 
PaginatedEntitiesComponent<UserInfo>;
+    @ViewChild('userParentSection') roleUserParentComponent: 
PaginatedEntitiesComponent<UserInfo>;
 
     @Output()
     roleIdEvent: EventEmitter<string> = new EventEmitter<string>(true);
 
-    constructor(private route: ActivatedRoute, public roleService: 
RoleService, private userService: UserService, public fb: FormBuilder) {
+    constructor(private route: ActivatedRoute, public roleService: 
RoleService, private userService: UserService,
+                public fb: FormBuilder, private changeDetect : 
ChangeDetectorRef) {
         super(fb);
         super.init(fb.group({
             id: [''],
@@ -100,6 +114,12 @@ export class ManageRolesEditComponent extends 
EditBaseComponent<Role> implements
             this.roleUserParentService = function (searchTerm: string, offset: 
number, limit: number, orderBy: string[], order: string): 
Observable<PagedResult<User>> {
                 return fRoleService.queryAssignedParentUsers(roleId, 
searchTerm, offset, limit, orderBy, order, true);
             };
+            if (this.roleUserComponent) {
+                this.roleUserComponent.changeService(this.roleUserService);
+            }
+            if (this.roleUserParentComponent) {
+                
this.roleUserParentComponent.changeService(this.roleUserParentService);
+            }
         }, error => {
             this.editRole = new Role();
         });
@@ -166,7 +186,7 @@ export class ManageRolesEditComponent extends 
EditBaseComponent<Role> implements
         let role = new RoleUpdate();
         role.id=this.userForm.get('id').value;
         role.description = this.userForm.get('description').value;
-        console.log("Submitting changes " + role);
+        // console.log("Submitting changes " + role);
         this.roleService.updateRole(role).pipe(
             catchError((err: ErrorResult) => {
                 this.error = true;
@@ -185,6 +205,7 @@ export class ManageRolesEditComponent extends 
EditBaseComponent<Role> implements
     }
 
     ngAfterContentInit(): void {
+        // console.log("AfterContentInit")
         if (this.originRole) {
             this.editRole = this.originRole;
         }
@@ -196,7 +217,7 @@ export class ManageRolesEditComponent extends 
EditBaseComponent<Role> implements
             distinctUntilChanged(),
             tap(() => this.userSearching = true),
             switchMap(term =>
-                this.userService.query(term, 0, 10).pipe(
+                this.roleService.queryUnAssignedUsers(this.editRole.id, term, 
0, 10).pipe(
                     tap(() => this.userSearchFailed = false),
                     map(pagedResult=>
                     pagedResult.data),
@@ -221,7 +242,45 @@ export class ManageRolesEditComponent extends 
EditBaseComponent<Role> implements
                 userId = this.userSearchModel.user_id;
             }
         }
-        console.log("Assigning user " + userId)
+        if (this.editRole.id!=null && userId!=null && userId.length>0) {
+            this.roleService.assignRole(this.editRole.id, userId).pipe(
+                catchError((err: ErrorResult) => {
+                    this.error = true;
+                    this.success = false;
+                    this.errorResult = err;
+                    return [];
+                })
+            ).subscribe((response : HttpResponse<Role>)  => {
+                this.error = false;
+                this.success = true;
+                this.errorResult = null;
+                this.result = response.body;
+                this.roleUserComponent.changePage(1);
+                this.userSearchModel=''
+            });
+        }
+    }
+
+    unassignUser(user_id:string) {
+        // console.log("Unassigning " + this.editRole.id + " - " + user_id);
+        if (this.editRole.id!=null && user_id!=null && user_id.length>0) {
+            this.roleService.unAssignRole(this.editRole.id, user_id).pipe(
+                catchError((err: ErrorResult) => {
+                    this.error = true;
+                    this.success = false;
+                    this.errorResult = err;
+                    return [];
+                })
+            ).subscribe((response : HttpResponse<Role>)  => {
+                    // console.log("Deleted ");
+                    this.error = false;
+                    this.success = true;
+                    this.errorResult = null;
+                    this.result = response.body;
+                    this.roleUserComponent.changePage(1);
+                }
+            );
+        }
     }
 
 }
diff --git 
a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/roles/manage-roles-list/manage-roles-list.component.ts
 
b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/roles/manage-roles-list/manage-roles-list.component.ts
index 1344b11..982f9f2 100644
--- 
a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/roles/manage-roles-list/manage-roles-list.component.ts
+++ 
b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/roles/manage-roles-list/manage-roles-list.component.ts
@@ -38,7 +38,7 @@ export class ManageRolesListComponent extends 
SortedTableComponent<Role> impleme
 
   constructor(translator: TranslateService, roleService : RoleService, private 
ngbModal:NgbModal) {
     super(translator, function (searchTerm: string, offset: number, limit: 
number, orderBy: string[], order: string): Observable<PagedResult<Role>> {
-      console.log("Retrieving data " + searchTerm + "," + offset + "," + limit 
+ "," + orderBy + "," + order);
+      // console.log("Retrieving data " + searchTerm + "," + offset + "," + 
limit + "," + orderBy + "," + order);
       return roleService.query(searchTerm, offset, limit, orderBy, order);
     });
   }
diff --git 
a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-base.component.ts
 
b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-base.component.ts
index 42a27e8..012d704 100644
--- 
a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-base.component.ts
+++ 
b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-base.component.ts
@@ -68,7 +68,7 @@ export class ManageUsersBaseComponent {
         for (let prop of properties) {
             user[prop] = this.userForm.get(prop).value;
         }
-        console.log("User " + user);
+        // console.log("User " + user);
         return user;
     }
 
@@ -79,7 +79,7 @@ export class ManageUsersBaseComponent {
             propMap[prop] = propValue;
         }
         this.userForm.patchValue(propMap);
-        console.log("User " + user);
+        // console.log("User " + user);
     }
 
 
diff --git 
a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-delete/manage-users-delete.component.ts
 
b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-delete/manage-users-delete.component.ts
index d646e20..005fda8 100644
--- 
a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-delete/manage-users-delete.component.ts
+++ 
b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-delete/manage-users-delete.component.ts
@@ -48,7 +48,7 @@ export class ManageUsersDeleteComponent implements OnInit, 
AfterViewInit {
   private runModal() {
     if (this.user_id!=null && this.user_id!='') {
       let modalInstance = this.modal.open(this.askModal).result.then((result) 
=> {
-        console.log("Result: " + result);
+        // console.log("Result: " + result);
         let userId = this.user_id;
         if (result=='YES' && userId!=null && userId!='') {
           let deleted = this.userService.deleteUser(userId).subscribe();
@@ -59,7 +59,7 @@ export class ManageUsersDeleteComponent implements OnInit, 
AfterViewInit {
           this.router.navigate(['/security','users','list']);
         }
       }, (reason) => {
-        console.log("Reason: " + reason);
+        // console.log("Reason: " + reason);
       });
     }
   }
diff --git 
a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-list/manage-users-list.component.ts
 
b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-list/manage-users-list.component.ts
index b22aeea..abc81a0 100644
--- 
a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-list/manage-users-list.component.ts
+++ 
b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-list/manage-users-list.component.ts
@@ -39,7 +39,7 @@ export class ManageUsersListComponent implements OnInit {
 
   constructor(private translator: TranslateService, private userService : 
UserService) {
     this.service = function (searchTerm: string, offset: number, limit: 
number, orderBy: string[], order: string) : Observable<PagedResult<UserInfo>> {
-      console.log("Retrieving data " + searchTerm + "," + offset + "," + limit 
+ "," + orderBy + "," + order);
+      // console.log("Retrieving data " + searchTerm + "," + offset + "," + 
limit + "," + orderBy + "," + order);
       return userService.query(searchTerm, offset, limit, orderBy, order);
     }
 
diff --git 
a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-roles/manage-users-roles.component.html
 
b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-roles/manage-users-roles.component.html
index 279e552..a0ba87c 100644
--- 
a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-roles/manage-users-roles.component.html
+++ 
b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users-roles/manage-users-roles.component.html
@@ -22,7 +22,7 @@
 
     <div class="row col-md-6">
     <h4 class="col-md-2 mt-3">{{'users.roles.base_roles'|translate}} </h4>
-    <h4 class="col-md-2 offset-md-4 mt-3"><span class="badge 
badge-primary">{{userid}}</span></h4>
+    <h4 class="col-md-2 offset-md-4 mt-3" *ngIf="roles$"><span class="badge 
badge-primary">{{userid}}</span></h4>
     </div>
     <ng-container *ngIf="roles$|async as myRoles">
         <table class="table col-md-12">
diff --git 
a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users/manage-users.component.ts
 
b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users/manage-users.component.ts
index e33bdcd..8ad6c3e 100644
--- 
a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users/manage-users.component.ts
+++ 
b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/security/users/manage-users/manage-users.component.ts
@@ -44,7 +44,6 @@ export class ManageUsersComponent implements OnInit {
     // console.log("Activating "+componentReference+" - 
"+JSON.stringify(componentReference,getCircularReplacer()))
     if (componentReference.userIdEvent!=null) {
       let componentEmit : Observable<string> = 
componentReference.userIdEvent.pipe(
-          tap(userid=>console.log("Event "+componentReference.class+" 
"+userid)),
           map((userid: string) => this.getSubPath(userid)));
       if (this.userId$!=null) {
         this.userId$ = merge(this.userId$, componentEmit)
diff --git 
a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/shared/paginated-entities/paginated-entities.component.ts
 
b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/shared/paginated-entities/paginated-entities.component.ts
index d2157d8..8e2e166 100644
--- 
a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/shared/paginated-entities/paginated-entities.component.ts
+++ 
b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/modules/shared/paginated-entities/paginated-entities.component.ts
@@ -16,7 +16,7 @@
  * under the License.
  */
 
-import {AfterViewInit, Component, EventEmitter, Input, OnInit, Output} from 
'@angular/core';
+import {AfterViewInit, ChangeDetectorRef, Component, EventEmitter, Input, 
OnInit, Output} from '@angular/core';
 import {concat, merge, Observable, of, pipe, Subject} from "rxjs";
 import {
     concatAll,
@@ -29,7 +29,8 @@ import {
     pluck,
     share,
     startWith,
-    switchMap
+    switchMap,
+    tap
 } from "rxjs/operators";
 import {EntityService} from "../../../model/entity-service";
 import {FieldToggle} from "../../../model/field-toggle";
@@ -64,6 +65,8 @@ import {PagedResult} from "@app/model/paged-result";
 })
 export class PaginatedEntitiesComponent<T> implements OnInit, FieldToggle, 
AfterViewInit {
 
+    @Input() id: string;
+
     /**
      * This must be set, if you use the component. This service retrieves the 
entity data.
      */
@@ -138,26 +141,30 @@ export class PaginatedEntitiesComponent<T> implements 
OnInit, FieldToggle, After
     /**
      * The total number of elements available for the given search term
      */
-    total$: Observable<number>;
+    public total$: Observable<number>;
     /**
      * The entity items retrieved from the service
      */
-    items$: Observable<LoadingValue<PagedResult<T>>>;
+    public items$: Observable<LoadingValue<PagedResult<T>>>;
 
     /**
      * true, if the current page result value represents a result with 
multiple pages,
      * otherwise false.
      */
-    multiplePages$:Observable<boolean>;
-
+    public multiplePages$:Observable<boolean>;
 
     private pageStream: Subject<number> = new Subject<number>();
     private searchTermStream: Subject<string> = new Subject<string>();
 
     constructor() {
+        // console.log("Construct " + this.id);
+        this.items$=null;
+        this.total$=null;
+        this.multiplePages$=null;
     }
 
     ngOnInit(): void {
+        // console.log("Pag Init " + this.id);
         // We combine the sources for the page and the search input field to a 
observable 'source'
         const pageSource = this.pageStream.pipe(map(pageNumber => {
             return new PageQuery(this.searchTerm, pageNumber);
@@ -177,10 +184,13 @@ export class PaginatedEntitiesComponent<T> implements 
OnInit, FieldToggle, After
                     this.service(params.search, (params.page - 1) * 
this.pageSize, this.pageSize, this.sortField, this.sortOrder)
                         
.pipe(map(pagedResult=>LoadingValue.finish<PagedResult<T>>(pagedResult)))
                 )
-            ), share());
-        this.total$ = 
source.pipe(filter(val=>val.hasValue()),map(val=>val.value),pluck('pagination', 
'total_count'));
+            )
+            );
+        this.total$ = 
source.pipe(filter(val=>val.hasValue()),map(val=>val.value),
+            pluck('pagination', 'total_count'));
+        this.multiplePages$ = source.pipe(filter(val => val.hasValue()),
+            map(val => val.value.pagination.total_count > 
val.value.pagination.limit));
         this.items$ = source;
-        this.multiplePages$ = source.pipe(filter(val => val.hasValue()), 
map(val => val.value.pagination.total_count >= val.value.pagination.limit));
     }
 
     search(terms: string) {
@@ -189,7 +199,7 @@ export class PaginatedEntitiesComponent<T> implements 
OnInit, FieldToggle, After
         this.searchTermStream.next(terms)
     }
 
-    changePage(pageNumber: number) {
+    public changePage(pageNumber: number) {
         // console.log("Page change " +pageNumber);
         this.pageChange.emit(pageNumber);
         this.pageStream.next(pageNumber);
@@ -242,9 +252,16 @@ export class PaginatedEntitiesComponent<T> implements 
OnInit, FieldToggle, After
     }
 
     ngAfterViewInit(): void {
+        // console.log("Pag afterViewInit " + this.id);
         // We emit the current value to push them to the containing reading 
components
         this.sortOrderChange.emit(this.sortOrder);
         this.sortFieldChange.emit(this.sortField);
     }
 
+
+    public changeService(newService : EntityService<T>): void {
+        this.service = newService;
+        this.changePage(1);
+    }
+
 }
diff --git 
a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/services/role.service.ts
 
b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/services/role.service.ts
index aeabc33..e5b7e39 100644
--- 
a/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/services/role.service.ts
+++ 
b/archiva-modules/archiva-web/archiva-webapp/src/main/archiva-web/src/app/services/role.service.ts
@@ -80,6 +80,17 @@ export class RoleService {
     });
   }
 
+  /**
+   * Query for assigned users, that are part of the parent roles.
+   *
+   * @param roleId
+   * @param searchTerm
+   * @param offset
+   * @param limit
+   * @param orderBy
+   * @param order
+   * @param parentsOnly
+   */
   public queryAssignedParentUsers(roleId: string,
                             searchTerm: string, offset: number = 0, limit: 
number = 5,
                             orderBy: string[] = ['id'], order: string = 'asc', 
parentsOnly:boolean=true): Observable<PagedResult<User>> {
@@ -100,6 +111,25 @@ export class RoleService {
     });
   }
 
+  public queryUnAssignedUsers(roleId: string,
+                            searchTerm: string, offset: number = 0, limit: 
number = 5,
+                            orderBy: string[] = ['id'], order: string = 
'asc'): Observable<PagedResult<User>> {
+    if (searchTerm == null) {
+      searchTerm = ""
+    }
+    if (orderBy == null || orderBy.length == 0) {
+      orderBy = ['id'];
+    }
+    return this.rest.executeRestCall<PagedResult<User>>("get", "redback", 
"roles/" + roleId + "/unassigned", {
+      'q': searchTerm,
+      'offset': offset,
+      'limit': limit,
+      'orderBy': orderBy,
+      'order': order
+    });
+  }
+
+
   public getRole(roleId:string) : Observable<Role> {
     return this.rest.executeRestCall("get", "redback", "roles/" + roleId, 
null);
   }

Reply via email to