]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: Carbonize Administration module > Create Realm/Zone group/Zone 65972/head
authorDnyaneshwari <dnyaneshwari@li-9c9fbecc-2d5c-11b2-a85c-e2a7cc8a424f.ibm.com>
Thu, 16 Oct 2025 04:16:16 +0000 (09:46 +0530)
committerDnyaneshwari <dnyaneshwari@li-9c9fbecc-2d5c-11b2-a85c-e2a7cc8a424f.ibm.com>
Wed, 5 Nov 2025 06:45:34 +0000 (12:15 +0530)
Fixes: https://tracker.ceph.com/issues/73544
Signed-off-by: Dnyaneshwari Talwekar <dtalweka@redhat.com>
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-form/service-form.component.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/create-rgw-service-entities/create-rgw-service-entities.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/create-rgw-service-entities/create-rgw-service-entities.component.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/models/rgw-multisite.ts

index e1228f5ef90ac98921620c62b892577e0a57621b..185a9a99e5244dec7df869d5cc46bddd22f39536 100644 (file)
@@ -3,14 +3,14 @@ import { Component, Input, OnInit, ViewChild } from '@angular/core';
 import { AbstractControl, UntypedFormControl, Validators } from '@angular/forms';
 import { ActivatedRoute, Router } from '@angular/router';
 
-import { NgbActiveModal, NgbModalRef, NgbTypeahead } from '@ng-bootstrap/ng-bootstrap';
+import { NgbActiveModal, NgbTypeahead } from '@ng-bootstrap/ng-bootstrap';
 import { ListItem } from 'carbon-components-angular';
 import _ from 'lodash';
 import { forkJoin, merge, Observable, Subject, Subscription } from 'rxjs';
 import { debounceTime, distinctUntilChanged, filter, map } from 'rxjs/operators';
 import { Pool } from '~/app/ceph/pool/pool';
 import { CreateRgwServiceEntitiesComponent } from '~/app/ceph/rgw/create-rgw-service-entities/create-rgw-service-entities.component';
-import { RgwRealm, RgwZonegroup, RgwZone } from '~/app/ceph/rgw/models/rgw-multisite';
+import { RgwRealm, RgwZonegroup, RgwZone, RgwEntities } from '~/app/ceph/rgw/models/rgw-multisite';
 
 import { CephServiceService } from '~/app/shared/api/ceph-service.service';
 import { HostService } from '~/app/shared/api/host.service';
@@ -36,7 +36,7 @@ import { CdValidators } from '~/app/shared/forms/cd-validators';
 import { FinishedTask } from '~/app/shared/models/finished-task';
 import { Host } from '~/app/shared/models/host.interface';
 import { CephServiceSpec } from '~/app/shared/models/service.interface';
-import { ModalService } from '~/app/shared/services/modal.service';
+import { ModalCdsService } from '~/app/shared/services/modal-cds.service';
 import { TaskWrapperService } from '~/app/shared/services/task-wrapper.service';
 import { TimerService } from '~/app/shared/services/timer.service';
 
@@ -88,7 +88,6 @@ export class ServiceFormComponent extends CdForm implements OnInit {
   realmList: RgwRealm[] = [];
   zonegroupList: RgwZonegroup[] = [];
   zoneList: RgwZone[] = [];
-  bsModalRef: NgbModalRef;
   defaultZonegroup: RgwZonegroup;
   showRealmCreationForm = false;
   defaultsInfo: { defaultRealmName: string; defaultZonegroupName: string; defaultZoneName: string };
@@ -125,7 +124,7 @@ export class ServiceFormComponent extends CdForm implements OnInit {
     public rgwMultisiteService: RgwMultisiteService,
     private route: ActivatedRoute,
     public activeModal: NgbActiveModal,
-    public modalService: ModalService
+    public modalService: ModalCdsService
   ) {
     super();
     this.resource = $localize`service`;
@@ -1364,11 +1363,10 @@ export class ServiceFormComponent extends CdForm implements OnInit {
   }
 
   createMultisiteSetup() {
-    this.bsModalRef = this.modalService.show(CreateRgwServiceEntitiesComponent, {
-      size: 'lg'
-    });
-    this.bsModalRef.componentInstance.submitAction.subscribe(() => {
-      this.setRgwFields();
+    const modalRef = this.modalService.show(CreateRgwServiceEntitiesComponent);
+    const modalComponent = modalRef as CreateRgwServiceEntitiesComponent;
+    modalComponent.submitAction.subscribe((item: RgwEntities) => {
+      this.setRgwFields(item.realm_name, item.zonegroup_name, item.zone_name);
     });
   }
 }
index 140f314ce537958b0ccb39d872d1e1ce923e42c8..36c31b4a93ec7cd448a654ffc23ca1d62b091fb9 100644 (file)
-<cd-modal [modalRef]="activeModal">
-  <ng-container i18n="form title"
-                class="modal-title">Create Realm/Zone Group/Zone
-  </ng-container>
-
-  <ng-container class="modal-content">
-    <form name="createMultisiteEntitiesForm"
-          #formDir="ngForm"
-          [formGroup]="createMultisiteEntitiesForm"
-          novalidate>
-    <div class="modal-body">
+<cds-modal size="sm"
+           [open]="open"
+           [hasScrollingContent]="false"
+           (overlaySelected)="closeModal()">
+  <cds-modal-header (closeSelect)="closeModal()">
+    <h3 cdsModalHeaderHeading
+        i18n>Create Realm/Zone Group/Zone</h3>
+    <cd-help-text [formAllFieldsRequired]="true"></cd-help-text>
+  </cds-modal-header>
+  <form
+    name="createMultisiteEntitiesForm"
+    #formDir="ngForm"
+    [formGroup]="createMultisiteEntitiesForm"
+    novalidate
+  >
+    <div cdsModalContent>
       <cd-alert-panel type="info"
-                      spacingClass="mb-3">The realm/zone group/zone created will be set as default and master.
+                      spacingClass="mt-3"
+                      i18n>The realm/zone group/zone created will be set as default and master.
       </cd-alert-panel>
-      <div class="form-group row">
-        <label class="cd-col-form-label required"
-               for="realmName"
-               i18n>Realm Name</label>
-        <div class="cd-col-form-input">
-          <input class="form-control"
-                 type="text"
-                 placeholder="Realm name..."
-                 id="realmName"
-                 name="realmName"
-                 formControlName="realmName">
-          <span class="invalid-feedback"
-                *ngIf="createMultisiteEntitiesForm.showError('realmName', formDir, 'required')"
-                i18n>This field is required.</span>
-        </div>
+      <div class="form-item">
+        <cds-text-label
+          labelInputID="realmName"
+          [invalid]="createMultisiteEntitiesForm.controls.realmName.invalid &&
+                     createMultisiteEntitiesForm.controls.realmName.dirty"
+          [invalidText]="realmNameError"
+          i18n
+          >Realm Name
+          <input
+            cdsText
+            type="text"
+            id="realmName"
+            formControlName="realmName"
+            [invalid]="
+              createMultisiteEntitiesForm.controls.realmName.invalid &&
+              createMultisiteEntitiesForm.controls.realmName.dirty"
+            [autofocus]="true"
+            modal-primary-focus
+          />
+        </cds-text-label>
+        <ng-template #realmNameError>
+          <span
+            class="invalid-feedback"
+            *ngIf="createMultisiteEntitiesForm.showError('realmName', formDir, 'required')"
+            i18n
+            >This field is required.</span
+          >
+        </ng-template>
       </div>
-      <div class="form-group row">
-        <label class="cd-col-form-label required"
-               for="zonegroupName"
-               i18n>Zone Group Name</label>
-        <div class="cd-col-form-input">
-          <input class="form-control"
-                 type="text"
-                 placeholder="Zone group name..."
-                 id="zonegroupName"
-                 name="zonegroupName"
-                 formControlName="zonegroupName">
-          <span class="invalid-feedback"
-                *ngIf="createMultisiteEntitiesForm.showError('zonegroupName', formDir, 'required')"
-                i18n>This field is required.</span>
-        </div>
+
+      <div class="form-item">
+        <cds-text-label
+          labelInputID="zonegroupName"
+          [invalid]="createMultisiteEntitiesForm.controls.zonegroupName.invalid &&
+                     createMultisiteEntitiesForm.controls.zonegroupName.dirty"
+          [invalidText]="zoneGroupNameError"
+          i18n
+          >Zone Group Name
+          <input
+            cdsText
+            type="text"
+            placeholder="Zone group name..."
+            id="zonegroupName"
+            name="zonegroupName"
+            formControlName="zonegroupName"
+            [invalid]="createMultisiteEntitiesForm.controls.zonegroupName.invalid &&
+                       createMultisiteEntitiesForm.controls.zonegroupName.dirty"
+          />
+        </cds-text-label>
+        <ng-template #zoneGroupNameError>
+          <span
+            class="invalid-feedback"
+            *ngIf="createMultisiteEntitiesForm.showError('zonegroupName', formDir, 'required')"
+            i18n
+            >This field is required.</span
+          >
+        </ng-template>
       </div>
-      <div class="form-group row">
-        <label class="cd-col-form-label required"
-               for="zoneName"
-               i18n>Zone Name</label>
-        <div class="cd-col-form-input">
-          <input class="form-control"
-                 type="text"
-                 placeholder="Zone name..."
-                 id="zoneName"
-                 name="zoneName"
-                 formControlName="zoneName">
-          <span class="invalid-feedback"
-                *ngIf="createMultisiteEntitiesForm.showError('zoneName', formDir, 'required')"
-                i18n>This field is required.</span>
-        </div>
+
+      <div class="form-item">
+        <cds-text-label
+          labelInputID="zoneName"
+          [invalid]="createMultisiteEntitiesForm.controls.zoneName.invalid &&
+                     createMultisiteEntitiesForm.controls.zoneName.dirty"
+          [invalidText]="zoneNameError"
+          i18n
+          >Zone Name
+          <input
+            cdsText
+            type="text"
+            placeholder="Zone name..."
+            id="zoneName"
+            name="zoneName"
+            formControlName="zoneName"
+            [invalid]="createMultisiteEntitiesForm.controls.zoneName.invalid &&
+                       createMultisiteEntitiesForm.controls.zoneName.dirty"
+          />
+        </cds-text-label>
+        <ng-template #zoneNameError>
+          <span
+            class="invalid-feedback"
+            *ngIf="createMultisiteEntitiesForm.showError('zoneName', formDir, 'required')"
+            i18n
+            >This field is required.</span
+          >
+        </ng-template>
       </div>
     </div>
-    <div class="modal-footer">
-      <cd-form-button-panel (submitActionEvent)="submit()"
-                            [form]="createMultisiteEntitiesForm"></cd-form-button-panel>
-    </div>
-    </form>
-  </ng-container>
-</cd-modal>
+
+    <cd-form-button-panel
+      (submitActionEvent)="submit()"
+      [form]="createMultisiteEntitiesForm"
+      [modalForm]="true"
+    >
+    </cd-form-button-panel>
+  </form>
+</cds-modal>
index 041915186c05ed928d41b6c8941b8b4ce3fd2029..5f517c33233a78cffe5923ad335049337406d480 100644 (file)
@@ -1,4 +1,4 @@
-import { Component, EventEmitter, Output } from '@angular/core';
+import { Component, EventEmitter, OnInit, Output } from '@angular/core';
 import { FormControl, Validators } from '@angular/forms';
 import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
 import { RgwMultisiteService } from '~/app/shared/api/rgw-multisite.service';
@@ -7,18 +7,19 @@ import { RgwZoneService } from '~/app/shared/api/rgw-zone.service';
 import { RgwZonegroupService } from '~/app/shared/api/rgw-zonegroup.service';
 import { ActionLabelsI18n } from '~/app/shared/constants/app.constants';
 import { CdFormGroup } from '~/app/shared/forms/cd-form-group';
-import { ModalService } from '~/app/shared/services/modal.service';
 import { NotificationService } from '~/app/shared/services/notification.service';
 import { RgwRealm, RgwZonegroup, RgwZone, SystemKey } from '../models/rgw-multisite';
 import { NotificationType } from '~/app/shared/enum/notification-type.enum';
 import { Subscription } from 'rxjs';
+import { ModalCdsService } from '~/app/shared/services/modal-cds.service';
+import { CdForm } from '~/app/shared/forms/cd-form';
 
 @Component({
   selector: 'cd-create-rgw-service-entities',
   templateUrl: './create-rgw-service-entities.component.html',
   styleUrls: ['./create-rgw-service-entities.component.scss']
 })
-export class CreateRgwServiceEntitiesComponent {
+export class CreateRgwServiceEntitiesComponent extends CdForm implements OnInit {
   public sub = new Subscription();
   createMultisiteEntitiesForm: CdFormGroup;
   realm: RgwRealm;
@@ -36,9 +37,14 @@ export class CreateRgwServiceEntitiesComponent {
     public notificationService: NotificationService,
     public rgwZonegroupService: RgwZonegroupService,
     public rgwRealmService: RgwRealmService,
-    public modalService: ModalService
+    public modalService: ModalCdsService
   ) {
+    super();
+  }
+
+  ngOnInit() {
     this.createForm();
+    this.loadingReady();
   }
 
   createForm() {
@@ -84,8 +90,12 @@ export class CreateRgwServiceEntitiesComponent {
                   NotificationType.success,
                   $localize`Realm/Zonegroup/Zone created successfully`
                 );
-                this.submitAction.emit();
-                this.activeModal.close();
+                this.submitAction.emit({
+                  realm: this.realm,
+                  zonegroup: this.zonegroup,
+                  zone: this.zone
+                });
+                this.closeModal();
               })
               .catch(() => {
                 this.notificationService.show(
index e385ecd5ada2e79e1774c9426b7edf4f3d37cf59..4d3ab1442b684699539cd74381b1d65cfc3a9fd6 100644 (file)
@@ -51,6 +51,12 @@ export class SystemKey {
   secret_key: string;
 }
 
+export interface RgwEntities {
+  realm_name: string;
+  zonegroup_name: string;
+  zone_name: string;
+}
+
 export enum RgwMultisiteSyncPolicyStatus {
   ENABLED = 'enabled',
   FORBIDDEN = 'forbidden',