]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: Handle pool permissions
authorStephan Müller <smueller@suse.com>
Mon, 2 Jul 2018 17:33:13 +0000 (19:33 +0200)
committerStephan Müller <smueller@suse.com>
Tue, 9 Oct 2018 13:56:21 +0000 (15:56 +0200)
Handles pool action permissions in pool listing.

Fixes: https://tracker.ceph.com/issues/36355
Signed-off-by: Stephan Müller <smueller@suse.com>
src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-list/pool-list.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-list/pool-list.component.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-list/pool-list.component.ts

index 8037c1748099dbd69e7cfbbe42195542c87a53b8..ea84ca0d036aa11a029c3d1ceb35787b9e9a1bd6 100644 (file)
@@ -5,55 +5,17 @@
               [columns]="columns"
               selectionType="single"
               (updateSelection)="updateSelection($event)">
-      <div class="table-actions">
-        <div class="btn-group"
-             dropdown>
-          <button type="button"
-                  class="btn btn-sm btn-primary"
-                  *ngIf="!selection.hasSingleSelection"
-                  routerLink="/pool/add">
-            <i class="fa fa-fw fa-plus"></i><span i18n>Add</span>
-          </button>
-          <button type="button"
-                  class="btn btn-sm btn-primary"
-                  *ngIf="selection.hasSingleSelection"
-                  [ngClass]="{'disabled': selection.first()?.executing}"
-                  routerLink="/pool/edit/{{ selection.first()?.pool_name }}">
-            <i class="fa fa-fw fa-pencil"></i><span i18n>Edit</span>
-          </button>
-          <button type="button"
-                  dropdownToggle
-                  class="btn btn-sm btn-primary dropdown-toggle dropdown-toggle-split">
-            <span class="caret"></span>
-            <span class="sr-only"></span>
-          </button>
-          <ul *dropdownMenu class="dropdown-menu" role="menu">
-            <li role="menuitem">
-              <a class="dropdown-item"
-                 routerLink="/pool/add">
-                <i class="fa fa-fw fa-plus"></i><span i18n>Add</span>
-              </a>
-            </li>
-            <li role="menuitem"
-                [ngClass]="{'disabled': !selection.hasSingleSelection || selection.first()?.executing}">
-              <a class="dropdown-item"
-                 routerLink="/pool/edit/{{ selection.first()?.pool_name }}">
-                <i class="fa fa-fw fa-pencil"></i><span i18n>Edit</span></a>
-            </li>
-            <li role="menuitem"
-                [ngClass]="{'disabled': !selection.hasSingleSelection || selection.first()?.executing}">
-              <a class="dropdown-item"
-                 (click)="deletePoolModal()">
-                <i class="fa fa-fw fa-trash-o"></i><span i18n>Delete</span>
-              </a>
-            </li>
-          </ul>
-        </div>
-      </div>
+      <cd-table-actions class="table-actions"
+                        [permission]="permission"
+                        [selection]="selection"
+                        [tableActions]="tableActions">
+      </cd-table-actions>
       <tabset cdTableDetail *ngIf="selection.hasSingleSelection">
         <tab i18n-heading
              heading="Details">
-          <cd-table-key-value [renderObjects]="true" [data]="selection.first()" [autoReload]="false">
+          <cd-table-key-value [renderObjects]="true"
+                              [data]="selection.first()"
+                              [autoReload]="false">
           </cd-table-key-value>
         </tab>
         <tab i18n-heading
index 94c0f51750d9d51df825454f4aad5becfa31f300..318aea0f99ee71fbc3fce4337b59fd7300b27e68 100644 (file)
@@ -31,6 +31,7 @@ describe('PoolListComponent', () => {
     fixture = TestBed.createComponent(PoolListComponent);
     component = fixture.componentInstance;
     fixture.detectChanges();
+    component.permission.read = true;
   });
 
   it('should create', () => {
index 0e2562c2f44431eb03af9dcde9a5cac58061d62b..887b74dcf7e612cb0fafb0ba5e3b858e40ff0c24 100644 (file)
@@ -3,14 +3,15 @@ import { Component } from '@angular/core';
 import { BsModalRef, BsModalService } from 'ngx-bootstrap';
 
 import { PoolService } from '../../../shared/api/pool.service';
-import {
-  DeletionModalComponent
-} from '../../../shared/components/deletion-modal/deletion-modal.component';
+import { DeletionModalComponent } from '../../../shared/components/deletion-modal/deletion-modal.component';
+import { CdTableAction } from '../../../shared/models/cd-table-action';
 import { CdTableColumn } from '../../../shared/models/cd-table-column';
 import { CdTableFetchDataContext } from '../../../shared/models/cd-table-fetch-data-context';
 import { CdTableSelection } from '../../../shared/models/cd-table-selection';
 import { ExecutingTask } from '../../../shared/models/executing-task';
 import { FinishedTask } from '../../../shared/models/finished-task';
+import { Permission } from '../../../shared/models/permissions';
+import { AuthStorageService } from '../../../shared/services/auth-storage.service';
 import { TaskWrapperService } from '../../../shared/services/task-wrapper.service';
 import { Pool } from '../pool';
 
@@ -25,12 +26,31 @@ export class PoolListComponent {
   selection = new CdTableSelection();
   modalRef: BsModalRef;
   executingTasks: ExecutingTask[] = [];
+  permission: Permission;
+  tableActions: CdTableAction[];
 
   constructor(
     private poolService: PoolService,
     private taskWrapper: TaskWrapperService,
+    private authStorageService: AuthStorageService,
     private modalService: BsModalService
   ) {
+    this.permission = this.authStorageService.getPermissions().pool;
+    this.tableActions = [
+      { permission: 'create', icon: 'fa-plus', routerLink: () => '/pool/add', name: 'Add' },
+      {
+        permission: 'update',
+        icon: 'fa-pencil',
+        routerLink: () => '/pool/edit/' + this.selection.first().pool_name,
+        name: 'Edit'
+      },
+      {
+        permission: 'delete',
+        icon: 'fa-trash-o',
+        click: () => this.deletePoolModal(),
+        name: 'Delete'
+      }
+    ];
     this.columns = [
       {
         prop: 'pool_name',