]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: rename expand-cluster to add-storage
authorAashish Sharma <aashish@li-e9bf2ecc-2ad7-11b2-a85c-baf05c5182ab.ibm.com>
Thu, 5 Mar 2026 06:33:00 +0000 (12:03 +0530)
committerAfreen Misbah <afreen@ibm.com>
Wed, 18 Mar 2026 09:57:49 +0000 (15:27 +0530)
Signed-off-by: Aashish Sharma <aasharma@redhat.com>
(cherry picked from commit 374e76e06846397a6d9d30a1c74abf429a5ffc90)

 Conflicts:
src/pybind/mgr/dashboard/frontend/src/app/app-routing.module.ts
src/pybind/mgr/dashboard/frontend/src/app/core/navigation/notification-panel/notifications-page/notifications-page.component.scss
src/pybind/mgr/dashboard/frontend/src/styles.scss
src/pybind/mgr/dashboard/frontend/src/styles/ceph-custom/_spacings.scss

17 files changed:
src/pybind/mgr/dashboard/frontend/cypress/e2e/cluster/create-cluster.po.ts
src/pybind/mgr/dashboard/frontend/cypress/e2e/common/urls.po.ts
src/pybind/mgr/dashboard/frontend/cypress/e2e/orchestrator/workflow/01-create-cluster-welcome.feature
src/pybind/mgr/dashboard/frontend/cypress/e2e/orchestrator/workflow/02-create-cluster-add-host.feature
src/pybind/mgr/dashboard/frontend/src/app/app-routing.module.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/cluster.module.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/create-cluster/create-cluster.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/create-cluster/create-cluster.component.scss
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/create-cluster/create-cluster.component.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/create-cluster/create-cluster.component.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/hosts/hosts.component.ts
src/pybind/mgr/dashboard/frontend/src/app/core/auth/login/login.component.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/core/auth/login/login.component.ts
src/pybind/mgr/dashboard/frontend/src/app/core/navigation/notification-panel/notifications-page/notifications-page.component.scss [new file with mode: 0644]
src/pybind/mgr/dashboard/frontend/src/app/shared/constants/app.constants.ts
src/pybind/mgr/dashboard/frontend/src/styles.scss
src/pybind/mgr/dashboard/frontend/src/styles/ceph-custom/_spacings.scss

index 97554ce1d7ed66873fd8c5717bb599c1435c9ec4..85a983f945f5e3f1e6b994aeea77840ec7f2a1bb 100644 (file)
@@ -4,14 +4,14 @@ import { HostsPageHelper } from './hosts.po';
 import { ServicesPageHelper } from './services.po';
 
 const pages = {
-  index: { url: '#/expand-cluster?welcome=true', id: 'cd-create-cluster' }
+  index: { url: '#/add-storage?welcome=true', id: 'cd-create-cluster' }
 };
 export class CreateClusterWizardHelper extends PageHelper {
   pages = pages;
 
   createCluster() {
     cy.get('cd-create-cluster').should('contain.text', 'Please expand your cluster first');
-    cy.get('[name=expand-cluster]').click();
+    cy.get('[name=add-storage]').click();
     cy.get('cd-wizard').should('exist');
   }
 
@@ -22,13 +22,13 @@ export class CreateClusterWizardHelper extends PageHelper {
     cy.get('cd-dashboard').should('exist');
     const notification = new NotificationSidebarPageHelper();
     notification.open();
-    notification.getNotifications().should('contain', 'Cluster expansion skipped by user');
+    notification.getNotifications().should('contain', 'Storage setup skipped by user');
   }
 }
 
 export class CreateClusterHostPageHelper extends HostsPageHelper {
   pages = {
-    index: { url: '#/expand-cluster?welcome=true', id: 'cd-wizard' },
+    index: { url: '#/add-storage?welcome=true', id: 'cd-wizard' },
     add: { url: '', id: 'cd-host-form' }
   };
 
@@ -42,7 +42,7 @@ export class CreateClusterHostPageHelper extends HostsPageHelper {
 
 export class CreateClusterServicePageHelper extends ServicesPageHelper {
   pages = {
-    index: { url: '#/expand-cluster?welcome=true', id: 'cd-wizard' },
+    index: { url: '#/add-storage?welcome=true', id: 'cd-wizard' },
     create: { url: '', id: 'cd-service-form' }
   };
 
index fc56fe7a9a1e21ada186b1d0e8a38b2f70a2591b..853b120745244fbd3e1fddc8aa3997546a50045e 100644 (file)
@@ -3,7 +3,7 @@ import { PageHelper } from '../page-helper.po';
 export class UrlsCollection extends PageHelper {
   pages = {
     // Cluster expansion
-    welcome: { url: '#/expand-cluster?welcome=true', id: 'cd-create-cluster' },
+    welcome: { url: '#/add-storage?welcome=true', id: 'cd-create-cluster' },
 
     // Landing page
     overview: { url: '#/overview', id: 'cd-dashboard' },
index a5809537fc6c399bf0f3b6e1606febdec1abf67c..21cb81698c56f26d64220aa38d3d52aabc1e750f 100644 (file)
@@ -8,14 +8,14 @@ Feature: Cluster expansion welcome screen
 
     Scenario: Cluster expansion welcome screen
         Given I am on the "welcome" page
-        And I should see a button to "Expand Cluster"
+        And I should see a button to "Add Storage"
         And I should see a button to "Skip"
         And I should see a message "Please expand your cluster first"
 
     Scenario: Go to the Cluster expansion wizard
         Given I am on the "welcome" page
-        And I should see a button to "Expand Cluster"
-        When I click on "Expand Cluster" button
+        And I should see a button to "Add Storage"
+        When I click on "Add Storage" button
         Then I am on the "Add Hosts" section
 
     Scenario: Skips the process and go to the landing page
index ba9acdc40b074a57b5c9a01206e29f20b1106d79..4709f36e9c49dbc879450e3b51082717a8acebf4 100644 (file)
@@ -7,7 +7,7 @@ Feature: Cluster expansion host addition
     Background: Cluster expansion wizard
         Given I am logged in
         And I am on the "welcome" page
-        And I click on "Expand Cluster" button
+        And I click on "Add Storage" button
 
     Scenario Outline: Add hosts
         Given I am on the "Add Hosts" section
index ea8714b90c2bd53fde3a136d99bd34a53edd263a..3c4026cb0627638c239e58b24df78dee90a6ef9a 100644 (file)
@@ -107,7 +107,7 @@ const routes: Routes = [
 
       // Cluster
       {
-        path: 'expand-cluster',
+        path: 'add-storage',
         component: CreateClusterComponent,
         canActivate: [ModuleStatusGuardService],
         data: {
@@ -115,8 +115,7 @@ const routes: Routes = [
             uiApiPath: 'orchestrator',
             redirectTo: 'overview',
             backend: 'cephadm'
-          },
-          breadcrumbs: 'Cluster/Expand Cluster'
+          }
         }
       },
       {
index 89387835c0064ba943f81314cd1c2bc3b35fa1a5..734a0d7ad303686e2fb3a3e7156b5994783c73c5 100644 (file)
@@ -21,7 +21,6 @@ import {
   LayoutModule,
   NumberModule,
   FileUploaderModule,
-  TabsModule,
   RadioModule,
   TilesModule,
   LayerModule
index f9ae6adb4a57335d0610c8b881c8ffa29d665e10..cc2b15ad27158c7850b46aa80fc923ff9d536562 100644 (file)
@@ -1,17 +1,17 @@
+@if (startClusterCreation) {
 <div class="container-fluid">
-  @if (startClusterCreation) {
   <div cdsRow
-       class="cds-ml-5 cds-mt-5">
+       class="cds-ml-5 cds-mt-6">
     <div cdsCol
          [columnNumbers]="{'lg': 13, 'md': 8, 'sm': 8}">
-      <div class="mb-5">
+      <div class="mb-4">
         <!-- htmllint img-req-src="false" -->
         <img [src]="projectConstants.cephLogo"
              alt="Ceph"
-             class="img-fluid">
+             class="ceph-logo">
       </div>
 
-      <div class="mb-5">
+      <div class="mb-4">
         <span class="cds--type-fluid-heading-05"
               i18n>Welcome to {{ projectConstants.projectName }}
         </span>
@@ -48,7 +48,7 @@
               i18n>Set up storage for your cluster to run workloads and store data. You can configure storage and data services now, or skip and configure them later.</span>
       </div>
 
-      <cds-tile class="storage-requirements-header"
+      <cds-tile class="border-subtle no-border-bottom"
                 [cdsLayer]="1">
         <div cdsStack="horizontal"
              gap="3">
@@ -62,7 +62,7 @@
         </div>
       </cds-tile>
 
-      <cds-tile class="storage-requirements-body mb-3"
+      <cds-tile class="border-subtle mb-3"
                 [cdsLayer]="2">
         <div cdsStack="horizontal"
              gap="4">
 
         <hr/>
 
-        <div cdsStack="horizontal" gap="4">
+        <div cdsStack="horizontal"
+             gap="4">
           <cd-icon type="vmdkDisk"
                    [size]="icons.size20">
           </cd-icon>
 
-          <div cdsStack="vertical" gap="1">
+          <div cdsStack="vertical"
+               gap="1">
             <span class="cds--type-heading-compact-01"
                   i18n>
               Disks
         <div cdsStack="horizontal"
              gap="4">
           <cd-icon type="clusterIcon"
-                  [size]="icons.size20">
+                   [size]="icons.size20">
           </cd-icon>
 
-          <div cdsStack="vertical" gap="1">
+          <div cdsStack="vertical"
+               gap="1">
             <span class="cds--type-heading-compact-01"
                   i18n>
               Data services (optional)
         </cd-alert-panel>
       </div>
 
-      <div class="mb-4">
+      <div class="mb-5">
         <button cdsButton="primary"
                 class="me-3"
                 (click)="createCluster()"
       </div>
     </div>
   </div>
- }
 </div>
+}
 
+@else {
 <div cdsRow
-     class="form"
-     *ngIf="!startClusterCreation">
+     class="form cds-mt-6">
   <div cdsCol
        [columnNumbers]="{'lg': 2, 'md': 2, 'sm': 2}"
        class="indicator-wrapper">
 
     <div class="form-header"
-         i18n>Expand Cluster</div>
+         i18n>Add Storage</div>
     <cd-wizard [stepsTitle]="stepTitles"></cd-wizard>
   </div>
 
     </ng-container>
     <div cdsRow
          class="m-5">
+      @if (stepTitles[currentStep?.stepIndex]?.label === 'Create OSDs') {
       <button cdsButton="secondary"
               class="me-3"
               id="skipStepBtn"
               (click)="onSkip()"
               aria-label="Skip this step"
-              *ngIf="stepTitles[currentStep?.stepIndex]?.label === 'Create OSDs'"
               i18n>Skip</button>
+      }
       <cd-back-button buttonType="secondary"
                       aria-label="Close"
                       (backAction)="onPreviousStep()"
     </div>
   </div>
 </div>
+}
 
 <ng-template #skipConfirmTpl>
-  <span i18n>You are about to skip the cluster expansion process.
-             Youll need to <strong>navigate through the menu to add hosts and services.</strong></span>
+  <span i18n>You are about to skip the storage setup process.
+             You'll need to <strong>navigate through the menu to add hosts and services.</strong></span>
 
-  <div class="mt-4"
+  <div class="cds-mt-4"
        i18n>Are you sure you want to continue?</div>
 </ng-template>
index 45e0c3bda734c6ab0f504dbcaef4ad34a02ca37f..3fb39ceef7885e57aff7eca77b4df4a2cd218e37 100644 (file)
@@ -1,3 +1,5 @@
+@use '@carbon/layout';
+
 .container-fluid {
   align-items: flex-start;
   display: flex;
@@ -21,11 +23,10 @@ cd-osd-form {
   }
 }
 
-.storage-requirements-body {
-  border: 1px solid var(--cds-border-subtle);
-}
-
 .storage-requirements-header {
-  border: 1px solid var(--cds-border-subtle);
   border-bottom: 0;
 }
+
+.ceph-logo {
+  width: 7%;
+}
index 08711c4ff5a024d2768d29641d45e1f7642137f7..e5797c827d9f89bd786908825ae6862d6d07bf61 100644 (file)
@@ -126,7 +126,7 @@ describe('CreateClusterComponent', () => {
     component.onNextStep();
     fixture.detectChanges();
     submitBtnLabel = component.showSubmitButtonLabel();
-    expect(submitBtnLabel).toEqual('Expand Cluster');
+    expect(submitBtnLabel).toEqual('Add Storage');
     cancelBtnLabel = component.showCancelButtonLabel();
     expect(cancelBtnLabel).toEqual('Back');
   });
index 68576609cf5b2f1076e4b2870f4c015f0e0cd0a9..c82ef053b978efa9c39bb4c1e727c714c35551e9 100644 (file)
@@ -112,7 +112,7 @@ export class CreateClusterComponent implements OnInit, OnDestroy, AfterViewInit
       steps.onClick = () => (this.currentStep.stepIndex = index);
     });
     this.route.queryParams.subscribe((params) => {
-      // reading 'welcome' value true/false to toggle expand-cluster wizand view and welcome view
+      // reading 'welcome' value true/false to toggle add-storage wizand view and welcome view
       const showWelcomeScreen = params['welcome'];
       if (showWelcomeScreen) {
         this.startClusterCreation = showWelcomeScreen;
@@ -150,7 +150,7 @@ export class CreateClusterComponent implements OnInit, OnDestroy, AfterViewInit
           complete: () => {
             this.notificationService.show(
               NotificationType.info,
-              $localize`Cluster expansion skipped by user`
+              $localize`Storage setup skipped by user`
             );
             this.router.navigate(['/overview']);
             this.modalService.dismissAll();
@@ -274,9 +274,7 @@ export class CreateClusterComponent implements OnInit, OnDestroy, AfterViewInit
   }
 
   showSubmitButtonLabel() {
-    return !this.wizardStepsService.isLastStep()
-      ? this.actionLabels.NEXT
-      : $localize`Expand Cluster`;
+    return !this.wizardStepsService.isLastStep() ? this.actionLabels.NEXT : $localize`Add Storage`;
   }
 
   showCancelButtonLabel() {
index 194b591f579a24fd9b8762925ed34848712cad6a..716c044f74340e260139f1beb407b2f6eb277ae4 100644 (file)
@@ -135,11 +135,11 @@ export class HostsComponent extends ListWithDetails implements OnDestroy, OnInit
     this.permissions = this.authStorageService.getPermissions();
     this.expandClusterActions = [
       {
-        name: this.actionLabels.EXPAND_CLUSTER,
+        name: this.actionLabels.ADD_STORAGE,
         permission: 'create',
         buttonKind: 'secondary',
         icon: Icons.expand,
-        routerLink: '/expand-cluster',
+        routerLink: '/add-storage',
         disable: (selection: CdTableSelection) => this.getDisable('add', selection),
         visible: () => this.showExpandClusterBtn
       }
index 3b9e62c48299846ea49d546eadcc0a50bdd1df4d..a1c3b4ca5142ec825c777bc7c1f0d17d09b2a2d2 100644 (file)
@@ -53,7 +53,7 @@ describe('LoginComponent', () => {
     component.login();
 
     expect(routerNavigateSpy).toHaveBeenCalledTimes(1);
-    expect(routerNavigateSpy).toHaveBeenCalledWith(['/expand-cluster'], {
+    expect(routerNavigateSpy).toHaveBeenCalledWith(['/add-storage'], {
       queryParams: { welcome: true }
     });
   });
index 8524f53c2f7728bcb8e4a3e78090b1ea59057df2..2fded3b479a2f80ab835bf09b338c4acf3632579 100644 (file)
@@ -66,12 +66,12 @@ export class LoginComponent implements OnInit {
   login() {
     localStorage.setItem('cluster_api_url', window.location.origin);
     this.authService.login(this.model).subscribe(() => {
-      const urlPath = this.postInstalled ? '/' : '/expand-cluster';
+      const urlPath = this.postInstalled ? '/' : '/add-storage';
       let url = _.get(this.route.snapshot.queryParams, 'returnUrl', urlPath);
       if (!this.postInstalled && this.route.snapshot.queryParams['returnUrl'] === '/overview') {
-        url = '/expand-cluster';
+        url = '/add-storage';
       }
-      if (url == '/expand-cluster') {
+      if (url === '/add-storage') {
         this.router.navigate([url], { queryParams: { welcome: true } });
       } else {
         this.router.navigate([url]);
diff --git a/src/pybind/mgr/dashboard/frontend/src/app/core/navigation/notification-panel/notifications-page/notifications-page.component.scss b/src/pybind/mgr/dashboard/frontend/src/app/core/navigation/notification-panel/notifications-page/notifications-page.component.scss
new file mode 100644 (file)
index 0000000..33a8a08
--- /dev/null
@@ -0,0 +1,170 @@
+// Main container
+.notifications-page__container {
+  padding-top: var(--cds-spacing-05);
+  background-color: var(--cds-layer-01);
+  column-gap: 1rem;
+}
+
+// Notifications list
+.notifications-list {
+  cds-list-row {
+    cursor: pointer;
+    transition: background-color 0.2s ease;
+
+    &:hover {
+      background-color: var(--cds-layer-hover);
+    }
+
+    &.active {
+      background-color: var(--cds-layer-selected);
+
+      .notification-title {
+        color: var(--cds-text-primary);
+        font-weight: var(--cds-font-weight-semibold);
+      }
+    }
+  }
+}
+
+// Notification item content
+.notification-item-content {
+  .notification-title {
+    margin: 0 0 var(--cds-spacing-02) 0;
+    font-size: var(--cds-productive-heading-compact-01-font-size);
+    line-height: var(--cds-productive-heading-compact-01-line-height);
+    font-weight: var(--cds-productive-heading-compact-01-font-weight);
+    color: var(--cds-text-primary);
+  }
+
+  .notification-meta {
+    color: var(--cds-text-secondary);
+    font-size: var(--cds-label-01-font-size);
+    line-height: var(--cds-label-01-line-height);
+  }
+}
+
+.notification-date {
+  color: var(--cds-text-secondary);
+  font-size: var(--cds-label-01-font-size);
+  white-space: nowrap;
+}
+
+// Empty state
+.empty-state {
+  text-align: center;
+  color: var(--cds-text-secondary);
+  margin-top: var(--cds-spacing-05);
+
+  p {
+    margin: var(--cds-spacing-03) 0 0 0;
+    font-size: var(--cds-body-01-font-size);
+    line-height: var(--cds-body-01-line-height);
+  }
+}
+
+// No selection state
+.no-selection-state {
+  text-align: center;
+  color: var(--cds-text-secondary);
+  margin-top: var(--cds-spacing-06);
+
+  p {
+    margin: var(--cds-spacing-03) 0 0 0;
+    font-size: var(--cds-body-01-font-size);
+    line-height: var(--cds-body-01-line-height);
+  }
+}
+
+// Notification details
+.notification-details {
+  padding: var(--cds-spacing-05);
+  border-radius: var(--cds-border-radius);
+  background-color: var(--cds-layer-01);
+}
+
+// Details list
+.details-list {
+  cds-list-row {
+    border-bottom: 1px solid var(--cds-border-subtle);
+
+    &:last-child {
+      border-bottom: none;
+    }
+
+    &:hover {
+      background-color: transparent;
+    }
+  }
+
+  .detail-label {
+    color: var(--cds-text-secondary);
+    font-weight: var(--cds-font-weight-semibold);
+    font-size: var(--cds-body-compact-01-font-size);
+  }
+
+  cds-list-column:last-child {
+    color: var(--cds-text-primary);
+    font-size: var(--cds-body-compact-01-font-size);
+    line-height: var(--cds-body-compact-01-line-height);
+  }
+}
+
+// Message content
+.message-content {
+  margin: 0;
+  padding: var(--cds-spacing-04);
+  background-color: var(--cds-layer-02);
+  border-radius: var(--cds-border-radius);
+  border-left: 3px solid var(--cds-support-info);
+  font-size: var(--cds-body-compact-01-font-size);
+  line-height: var(--cds-body-compact-01-line-height);
+  color: var(--cds-text-primary);
+}
+
+// Timestamp
+.timestamp {
+  color: var(--cds-text-secondary);
+  font-family: var(--cds-font-mono);
+  font-size: var(--cds-code-01-font-size);
+}
+
+// Icons
+.empty-icon,
+.no-selection-icon {
+  fill: var(--cds-icon-secondary);
+  margin-bottom: var(--cds-spacing-05);
+}
+
+// Text utilities
+.text-muted {
+  color: var(--cds-text-secondary);
+}
+
+// Typography
+
+h3 {
+  font-size: var(--cds-productive-heading-03-font-size);
+  line-height: var(--cds-productive-heading-03-line-height);
+  font-weight: var(--cds-productive-heading-03-font-weight);
+  color: var(--cds-text-primary);
+  margin-bottom: var(--cds-spacing-05);
+}
+
+p {
+  font-size: var(--cds-body-01-font-size);
+  line-height: var(--cds-body-01-line-height);
+  color: var(--cds-text-primary);
+}
+
+// Spacing utilities
+.mb-4 {
+  margin-bottom: var(--cds-spacing-05);
+}
+
+.mt-4 {
+  margin-top: var(--cds-spacing-05);
+}
+
+.mt-5 {
+  margin-top: var(--cds-spacing-06);
+}
index 2514f1f87cd632da8a6d727bdb5be530b2e0f375..9028c05a60fe51c6c253c2754cc805c349d2734a 100644 (file)
@@ -150,7 +150,7 @@ export class ActionLabelsI18n {
   DISCONNECT: string;
   RECONNECT: string;
   AUTHORIZE: string;
-  EXPAND_CLUSTER: string;
+  ADD_STORAGE: string;
   SETUP_MULTISITE_REPLICATION: string;
   NFS_EXPORT: string;
 
@@ -242,7 +242,7 @@ export class ActionLabelsI18n {
     this.CONNECT = $localize`Connect`;
     this.DISCONNECT = $localize`Disconnect`;
     this.RECONNECT = $localize`Reconnect`;
-    this.EXPAND_CLUSTER = $localize`Expand Cluster`;
+    this.ADD_STORAGE = $localize`Add Storage`;
 
     this.NFS_EXPORT = $localize`Create NFS Export`;
   }
index 1f2f994467bca2a343762e4ebfe445ef10aed84e..85fecc6447321c5e682d2f915daf2cd56a528f05 100644 (file)
@@ -212,3 +212,15 @@ input:-webkit-autofill:active {
   -webkit-text-fill-color: inherit;
   transition: background-color 5000s ease-in-out 0s;
 }
+
+.cds--progress-bar__track {
+  background-color: colors.$gray-30;
+}
+
+.cds--progress-bar__bar {
+  background-color: var(--cds-primary);
+}
+
+.border-subtle {
+  border: 1px solid var(--cds-border-subtle);
+}
index a03c56fb3887c305948c93c58eba1cfebfce400e..7a3082c0e2e752cf8e4367fc0ba8baeac5203fbc 100644 (file)
   margin-top: layout.$spacing-03;
 }
 
+.cds-mt-1 {
+  margin-top: layout.$spacing-01;
+}
+
+.cds-mt-4 {
+  margin-top: layout.$spacing-04;
+}
+
 .cds-mt-5 {
   margin-top: layout.$spacing-05;
 }