]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: Add advanced fieldset component 56692/head
authorAfreen <afreen23.git@gmail.com>
Fri, 1 Mar 2024 07:26:25 +0000 (12:56 +0530)
committerAfreen <afreen23.git@gmail.com>
Thu, 4 Apr 2024 07:13:52 +0000 (12:43 +0530)
Fixes https://tracker.ceph.com/issues/65024

- adds a new shared component for displaying advanced fields in /shared
- utilizes that component in bucket form
- placement targets are under advanced fieldset
- minor help text changes in object locking help text
- updated e2e tests

Signed-off-by: Afreen <afreen23.git@gmail.com>
(cherry picked from commit d0979e9c5223231a0fd3ef6408323d2fd5cd2ac5)

Conflicts:
src/pybind/mgr/dashboard/frontend/src/app/shared/components/components.module.ts

src/pybind/mgr/dashboard/frontend/cypress/e2e/orchestrator/workflow/10-nfs-exports.e2e-spec.ts
src/pybind/mgr/dashboard/frontend/cypress/e2e/rgw/buckets.e2e-spec.ts
src/pybind/mgr/dashboard/frontend/cypress/e2e/rgw/buckets.po.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.html
src/pybind/mgr/dashboard/frontend/src/app/shared/components/components.module.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/components/form-advanced-fieldset/form-advanced-fieldset.component.html [new file with mode: 0644]
src/pybind/mgr/dashboard/frontend/src/app/shared/components/form-advanced-fieldset/form-advanced-fieldset.component.scss [new file with mode: 0644]
src/pybind/mgr/dashboard/frontend/src/app/shared/components/form-advanced-fieldset/form-advanced-fieldset.component.spec.ts [new file with mode: 0644]
src/pybind/mgr/dashboard/frontend/src/app/shared/components/form-advanced-fieldset/form-advanced-fieldset.component.ts [new file with mode: 0644]

index 6380e5a13e6eb40a6af8bd9d5177194d67ff5cc0..fdd96d7e975ea7da5446da84b88a43429a398096 100644 (file)
@@ -41,7 +41,7 @@ describe('nfsExport page', () => {
 
     it('should create a nfs-export with RGW backend', () => {
       buckets.navigateTo('create');
-      buckets.create(bucketName, 'dashboard', 'default-placement');
+      buckets.create(bucketName, 'dashboard');
 
       nfsExport.navigateTo();
       nfsExport.existTableCell(rgwPseudo, false);
index 99c0732fc6e69a1de0e540aa007ac1a2210a931f..8b05c309f695a5928dbc33fb05c6677ed2a7d1c9 100644 (file)
@@ -18,7 +18,7 @@ describe('RGW buckets page', () => {
   describe('create, edit & delete bucket tests', () => {
     it('should create bucket', () => {
       buckets.navigateTo('create');
-      buckets.create(bucket_name, BucketsPageHelper.USERS[0], 'default-placement');
+      buckets.create(bucket_name, BucketsPageHelper.USERS[0]);
       buckets.getFirstTableCell(bucket_name).should('exist');
     });
 
@@ -38,7 +38,7 @@ describe('RGW buckets page', () => {
 
     it('should create bucket with object locking enabled', () => {
       buckets.navigateTo('create');
-      buckets.create(bucket_name, BucketsPageHelper.USERS[0], 'default-placement', true);
+      buckets.create(bucket_name, BucketsPageHelper.USERS[0], true);
       buckets.getFirstTableCell(bucket_name).should('exist');
     });
 
@@ -57,7 +57,7 @@ describe('RGW buckets page', () => {
 
     it('should test invalid input in edit owner field', () => {
       buckets.navigateTo('create');
-      buckets.create(bucket_name, BucketsPageHelper.USERS[0], 'default-placement');
+      buckets.create(bucket_name, BucketsPageHelper.USERS[0]);
       buckets.testInvalidEdit(bucket_name);
       buckets.navigateTo();
       buckets.delete(bucket_name);
index 53756f0a2569a8a0d82f6deff346d52be67c4f70..8d87826da77987275254f14b1e912902d7ad8e91 100644 (file)
@@ -22,16 +22,12 @@ export class BucketsPageHelper extends PageHelper {
     return this.selectOption('owner', owner);
   }
 
-  private selectPlacementTarget(placementTarget: string) {
-    return this.selectOption('placement-target', placementTarget);
-  }
-
   private selectLockMode(lockMode: string) {
     return this.selectOption('lock_mode', lockMode);
   }
 
   @PageHelper.restrictTo(pages.create.url)
-  create(name: string, owner: string, placementTarget: string, isLocking = false) {
+  create(name: string, owner: string, isLocking = false) {
     // Enter in bucket name
     cy.get('#bid').type(name);
 
@@ -39,9 +35,6 @@ export class BucketsPageHelper extends PageHelper {
     this.selectOwner(owner);
     cy.get('#owner').should('have.class', 'ng-valid');
 
-    // Select bucket placement target:
-    this.selectPlacementTarget(placementTarget);
-
     if (isLocking) {
       cy.get('#lock_enabled').click({ force: true });
       // Select lock mode:
@@ -71,6 +64,7 @@ export class BucketsPageHelper extends PageHelper {
 
     // Placement target is not allowed to be edited and should be hidden
     cy.get('input[name=placement-target]').should('not.exist');
+
     this.selectOwner(new_owner);
 
     // If object locking is enabled versioning shouldn't be visible
index 108b1ba6ce56911e1555b512440931efda6ca361..74b4915cd9c92c84c311df7eb52bb852d04da9a7 100644 (file)
           </div>
         </div>
 
-        <!-- Placement target -->
-        <div class="form-group row"
-             *ngIf="!editing">
-          <label class="cd-col-form-label"
-                 for="placement-target"
-                 i18n>Placement target</label>
-          <div class="cd-col-form-input">
-            <select id="placement-target"
-                    name="placement-target"
-                    formControlName="placement-target"
-                    class="form-select">
-              <option i18n
-                      *ngIf="placementTargets === null"
-                      [ngValue]="null">Loading...</option>
-              <option i18n
-                      *ngIf="placementTargets !== null"
-                      [ngValue]="null">-- Select a placement target --</option>
-              <option *ngFor="let placementTarget of placementTargets"
-                      [value]="placementTarget.name">{{ placementTarget.description }}</option>
-            </select>
-            <cd-help-text>
-              <span i18n>
-                When creating a bucket, a placement target can be provided as part of the LocationConstraint to override the default placement targets from the user and zonegroup.
-              </span>
-            </cd-help-text>
-          </div>
-        </div>
-
         <!-- Versioning -->
         <fieldset *ngIf="editing">
           <legend class="cd-header"
             </div>
           </div>
         </fieldset>
+
+        <!--Advanced-->
+        <cd-form-advanced-fieldset *ngIf="!editing">
+          <!-- Placement target -->
+          <div class="form-group row">
+            <label class="cd-col-form-label"
+                   for="placement-target"
+                   i18n>Placement target</label>
+            <div class="cd-col-form-input">
+              <select id="placement-target"
+                      name="placement-target"
+                      formControlName="placement-target"
+                      class="form-select">
+                <option i18n
+                        *ngIf="placementTargets === null"
+                        [ngValue]="null">Loading...</option>
+                <option i18n
+                        *ngIf="placementTargets !== null"
+                        [ngValue]="null">-- Select a placement target --</option>
+                <option *ngFor="let placementTarget of placementTargets"
+                        [value]="placementTarget.name">{{ placementTarget.description }}</option>
+              </select>
+              <cd-help-text>
+                <span i18n>
+                  When creating a bucket, a placement target can be provided as part of the LocationConstraint to override the default placement targets from the user and zonegroup.
+                </span>
+              </cd-help-text>
+            </div>
+          </div>
+        </cd-form-advanced-fieldset>
       </div>
 
       <div class="card-footer">
index d5180f5db9dac3798207ee17b07a14d31c212507..c3baa9c13f59c1d8fef350c9324a74bc1a2869b2 100644 (file)
@@ -54,6 +54,7 @@ import { CardRowComponent } from './card-row/card-row.component';
 import { CodeBlockComponent } from './code-block/code-block.component';
 import { VerticalNavigationComponent } from './vertical-navigation/vertical-navigation.component';
 import { HelpTextComponent } from './help-text/help-text.component';
+import { FormAdvancedFieldsetComponent } from './form-advanced-fieldset/form-advanced-fieldset.component';
 
 @NgModule({
   imports: [
@@ -111,7 +112,8 @@ import { HelpTextComponent } from './help-text/help-text.component';
     CardRowComponent,
     CodeBlockComponent,
     VerticalNavigationComponent,
-    HelpTextComponent
+    HelpTextComponent,
+    FormAdvancedFieldsetComponent
   ],
   providers: [],
   exports: [
@@ -146,7 +148,8 @@ import { HelpTextComponent } from './help-text/help-text.component';
     CardRowComponent,
     CodeBlockComponent,
     VerticalNavigationComponent,
-    HelpTextComponent
+    HelpTextComponent,
+    FormAdvancedFieldsetComponent
   ]
 })
 export class ComponentsModule {}
diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/components/form-advanced-fieldset/form-advanced-fieldset.component.html b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/form-advanced-fieldset/form-advanced-fieldset.component.html
new file mode 100644 (file)
index 0000000..133bc84
--- /dev/null
@@ -0,0 +1,22 @@
+<fieldset>
+  <legend class="cd-header">
+    <div class="accordion accordion-flush">
+      <button class="accordion-button cd-form-advanced-fieldset-buttton p-0"
+              type="button"
+              id="advanced-fieldset"
+              aria-label="toggle advanced mode"
+              [ngClass]="{collapsed: !showAdvanced}"
+              (click)="showAdvanced = !showAdvanced"
+              i18n>Advanced
+      </button>
+    </div>
+  </legend>
+  <div class="accordion-collapse collapse"
+       [ngClass]="{show: showAdvanced}">
+    <div class="accordion-body">
+      <div class="card-body">
+        <ng-content></ng-content>
+      </div>
+    </div>
+  </div>
+</fieldset>
diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/components/form-advanced-fieldset/form-advanced-fieldset.component.scss b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/form-advanced-fieldset/form-advanced-fieldset.component.scss
new file mode 100644 (file)
index 0000000..e3bc7aa
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+  Overrides the active and focus states of bootstrap accordion,
+  in order to align the accordion css with rest of the form.
+
+  Summary of overrides:
+  - font-size was 1 rem
+  - color was blue when higlighted
+  - border,outlines and box-shadow were set
+  - accordion down button in active form was a blue svg icon
+
+ */
+.cd-form-advanced-fieldset-buttton {
+  --bs-accordion-btn-active-icon: var(--bs-accordion-btn-icon);
+  background-color: inherit;
+  border: hidden;
+  border-color: inherit;
+  box-shadow: none;
+  color: inherit;
+  font-size: inherit;
+  outline: 0;
+  text-decoration: none;
+}
diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/components/form-advanced-fieldset/form-advanced-fieldset.component.spec.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/form-advanced-fieldset/form-advanced-fieldset.component.spec.ts
new file mode 100644 (file)
index 0000000..de2c48c
--- /dev/null
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { FormAdvancedFieldsetComponent } from './form-advanced-fieldset.component';
+
+describe('FormAdvancedFieldsetComponent', () => {
+  let component: FormAdvancedFieldsetComponent;
+  let fixture: ComponentFixture<FormAdvancedFieldsetComponent>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      declarations: [FormAdvancedFieldsetComponent]
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(FormAdvancedFieldsetComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/components/form-advanced-fieldset/form-advanced-fieldset.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/form-advanced-fieldset/form-advanced-fieldset.component.ts
new file mode 100644 (file)
index 0000000..e4b71d1
--- /dev/null
@@ -0,0 +1,10 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'cd-form-advanced-fieldset',
+  templateUrl: './form-advanced-fieldset.component.html',
+  styleUrls: ['./form-advanced-fieldset.component.scss']
+})
+export class FormAdvancedFieldsetComponent {
+  showAdvanced: boolean = false;
+}