]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mgr/dashboard: disable 'Add Capability' button when all the capabilities are added
authorAlfonso Martínez <almartin@redhat.com>
Wed, 22 Jan 2020 15:05:12 +0000 (16:05 +0100)
committerAlfonso Martínez <almartin@redhat.com>
Wed, 22 Jan 2020 15:05:12 +0000 (16:05 +0100)
Fixes: https://tracker.ceph.com/issues/43564
Signed-off-by: Alfonso Martínez <almartin@redhat.com>
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/models/rgw-user-capabilities.ts [new file with mode: 0644]
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-capability-modal/rgw-user-capability-modal.component.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-form/rgw-user-form.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-form/rgw-user-form.component.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-form/rgw-user-form.component.ts

diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/models/rgw-user-capabilities.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/models/rgw-user-capabilities.ts
new file mode 100644 (file)
index 0000000..dac6986
--- /dev/null
@@ -0,0 +1,15 @@
+export enum RgwUserAvailableCapability {
+  USERS = 'users',
+  BUCKETS = 'buckets',
+  METADATA = 'metadata',
+  USAGE = 'usage',
+  ZONE = 'zone'
+}
+
+export class RgwUserCapabilities {
+  static readonly capabilities = RgwUserAvailableCapability;
+
+  static getAll(): string[] {
+    return Object.values(RgwUserCapabilities.capabilities);
+  }
+}
index f6d9d30ad528323c36f577f5f1a37243dc1af751..d890aa902eeffd2b359a03452037411420a8dd81 100644 (file)
@@ -8,6 +8,7 @@ import { I18n } from '@ngx-translate/i18n-polyfill';
 import { ActionLabelsI18n } from '../../../shared/constants/app.constants';
 import { CdFormBuilder } from '../../../shared/forms/cd-form-builder';
 import { CdFormGroup } from '../../../shared/forms/cd-form-group';
+import { RgwUserCapabilities } from '../models/rgw-user-capabilities';
 import { RgwUserCapability } from '../models/rgw-user-capability';
 
 @Component({
@@ -78,7 +79,7 @@ export class RgwUserCapabilityModalComponent {
       usedTypes.push(capability.type);
     });
     this.types = [];
-    ['users', 'buckets', 'metadata', 'usage', 'zone'].forEach((type) => {
+    RgwUserCapabilities.getAll().forEach((type) => {
       if (_.indexOf(usedTypes, type) === -1) {
         this.types.push(type);
       }
index f676c677dbd88ecadd0ac2ea0111ae52e3cdbc2f..e6e08703108864881b4ef411c9318936d3c19d91 100644 (file)
                 <div class="col-12">
                   <button type="button"
                           class="btn btn-light float-right tc_addCapButton"
+                          [disabled]="hasAllCapabilities()"
+                          i18n-tooltip
+                          tooltip="All capabilities are already added."
+                          [isDisabled]="!hasAllCapabilities()"
+                          triggers="pointerenter pointerleave"
                           (click)="showCapabilityModal()">
                     <i [ngClass]="[icons.add]"></i>
                     <ng-container i18n>{{ actionLabels.ADD | titlecase }}
index 3ae9ca145aad5752996f9bf9061770e2306c94fb..e73319c4ec0367cd821a7c499f0cbd3fb278e166 100644 (file)
@@ -5,6 +5,7 @@ import { Router } from '@angular/router';
 import { RouterTestingModule } from '@angular/router/testing';
 
 import { BsModalService } from 'ngx-bootstrap/modal';
+import { TooltipModule } from 'ngx-bootstrap/tooltip';
 import { ToastrModule } from 'ngx-toastr';
 import { of as observableOf } from 'rxjs';
 
@@ -13,6 +14,8 @@ import { RgwUserService } from '../../../shared/api/rgw-user.service';
 import { NotificationType } from '../../../shared/enum/notification-type.enum';
 import { NotificationService } from '../../../shared/services/notification.service';
 import { SharedModule } from '../../../shared/shared.module';
+import { RgwUserCapabilities } from '../models/rgw-user-capabilities';
+import { RgwUserCapability } from '../models/rgw-user-capability';
 import { RgwUserS3Key } from '../models/rgw-user-s3-key';
 import { RgwUserFormComponent } from './rgw-user-form.component';
 
@@ -29,7 +32,8 @@ describe('RgwUserFormComponent', () => {
       ReactiveFormsModule,
       RouterTestingModule,
       SharedModule,
-      ToastrModule.forRoot()
+      ToastrModule.forRoot(),
+      TooltipModule.forRoot()
     ],
     providers: [BsModalService, i18nProviders]
   });
@@ -216,4 +220,31 @@ describe('RgwUserFormComponent', () => {
       );
     });
   });
+
+  describe('RgwUserCapabilities', () => {
+    it('capability button disabled when all capabilities are added', () => {
+      component.editing = true;
+      for (const capabilityType of RgwUserCapabilities.getAll()) {
+        const capability = new RgwUserCapability();
+        capability.type = capabilityType;
+        capability.perm = 'read';
+        component.setCapability(capability);
+      }
+
+      fixture.detectChanges();
+
+      expect(component.hasAllCapabilities()).toBeTruthy();
+      const capabilityButton = fixture.debugElement.nativeElement.querySelector('.tc_addCapButton');
+      expect(capabilityButton.disabled).toBeTruthy();
+    });
+
+    it('capability button not disabled when not all capabilities are added', () => {
+      component.editing = true;
+
+      fixture.detectChanges();
+
+      const capabilityButton = fixture.debugElement.nativeElement.querySelector('.tc_addCapButton');
+      expect(capabilityButton.disabled).toBeFalsy();
+    });
+  });
 });
index 6868efd8d1b47f6af0cbde106d60ebc80c060c7c..9fc911669cfba21cccdeeac21d354df13938d525 100644 (file)
@@ -16,6 +16,7 @@ import { CdFormGroup } from '../../../shared/forms/cd-form-group';
 import { CdValidators, isEmptyInputValue } from '../../../shared/forms/cd-validators';
 import { FormatterService } from '../../../shared/services/formatter.service';
 import { NotificationService } from '../../../shared/services/notification.service';
+import { RgwUserCapabilities } from '../models/rgw-user-capabilities';
 import { RgwUserCapability } from '../models/rgw-user-capability';
 import { RgwUserS3Key } from '../models/rgw-user-s3-key';
 import { RgwUserSubuser } from '../models/rgw-user-subuser';
@@ -380,6 +381,10 @@ export class RgwUserFormComponent implements OnInit {
     this.userForm.markAsDirty();
   }
 
+  hasAllCapabilities() {
+    return !_.difference(RgwUserCapabilities.getAll(), _.map(this.capabilities, 'type')).length;
+  }
+
   /**
    * Add/Update a S3 key.
    */