]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: migrate to bootstrap 5
authorNizamudeen A <nia@redhat.com>
Thu, 13 Oct 2022 09:18:11 +0000 (14:48 +0530)
committerNizamudeen A <nia@redhat.com>
Tue, 28 Feb 2023 08:15:13 +0000 (13:45 +0530)
Fixes: https://tracker.ceph.com/issues/57867
Signed-off-by: Nizamudeen A <nia@redhat.com>
(cherry picked from commit 8ffb74f7f1d59260901e751f6556996d5f8d60f3)

Conflicts:
   - src/pybind/mgr/dashboard/frontend/cypress/integration/block/mirroring.e2e-spec.ts
  Accept the current change (because the PR that introduced the change
is not in quincy)
   - package-lock.json
  Generate a new package-lock.json

82 files changed:
src/pybind/mgr/dashboard/frontend/cypress/integration/pools/pools.po.ts
src/pybind/mgr/dashboard/frontend/package-lock.json
src/pybind/mgr/dashboard/frontend/package.json
src/pybind/mgr/dashboard/frontend/src/app/ceph/block/iscsi-target-discovery-modal/iscsi-target-discovery-modal.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/block/iscsi-target-form/iscsi-target-form.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/block/iscsi-target-image-settings-modal/iscsi-target-image-settings-modal.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/block/iscsi/iscsi.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/block/mirroring/bootstrap-create-modal/bootstrap-create-modal.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/block/mirroring/overview/overview.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/block/mirroring/pool-edit-mode-modal/pool-edit-mode-modal.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-configuration-form/rbd-configuration-form.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-details/rbd-details.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-form/rbd-form.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-namespace-form/rbd-namespace-form-modal.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-directories/cephfs-directories.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-tabs/cephfs-tabs.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/configuration/configuration-details/configuration-details.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/configuration/configuration-form/configuration-form.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/create-cluster/create-cluster.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/logs/logs.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/mgr-modules/mgr-module-form/mgr-module-form.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/monitor/monitor.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-devices-selection-groups/osd-devices-selection-groups.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-devices-selection-modal/osd-devices-selection-modal.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-flags-indiv-modal/osd-flags-indiv-modal.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-form/osd-form.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-list/osd-list.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-recv-speed-modal/osd-recv-speed-modal.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/active-alert-list/active-alert-list.component.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/prometheus-tabs/prometheus-tabs.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/rules-list/rules-list.component.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/silence-form/silence-form.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/silence-matcher-modal/silence-matcher-modal.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-form/service-form.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/dashboard/info-group/info-group.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/dashboard/info-group/info-group.component.scss
src/pybind/mgr/dashboard/frontend/src/app/ceph/nfs/nfs-form-client/nfs-form-client.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/nfs/nfs-form/nfs-form.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/crush-rule-form-modal/crush-rule-form-modal.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/erasure-code-profile-form/erasure-code-profile-form-modal.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-form/pool-form.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-config-modal/rgw-config-modal.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-capability-modal/rgw-user-capability-modal.component.html
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-s3-key-modal/rgw-user-s3-key-modal.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-subuser-modal/rgw-user-subuser-modal.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-swift-key-modal/rgw-user-swift-key-modal.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/shared/device-list/device-list.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/shared/feedback/feedback.component.html
src/pybind/mgr/dashboard/frontend/src/app/core/auth/login-password-form/login-password-form.component.html
src/pybind/mgr/dashboard/frontend/src/app/core/auth/login/login.component.html
src/pybind/mgr/dashboard/frontend/src/app/core/auth/user-form/user-form.component.html
src/pybind/mgr/dashboard/frontend/src/app/core/auth/user-password-form/user-password-form.component.html
src/pybind/mgr/dashboard/frontend/src/app/core/context/context.component.html
src/pybind/mgr/dashboard/frontend/src/app/core/layouts/login-layout/login-layout.component.scss
src/pybind/mgr/dashboard/frontend/src/app/core/navigation/about/about.component.html
src/pybind/mgr/dashboard/frontend/src/app/core/navigation/dashboard-help/dashboard-help.component.html
src/pybind/mgr/dashboard/frontend/src/app/core/navigation/navigation/navigation.component.html
src/pybind/mgr/dashboard/frontend/src/app/core/navigation/navigation/navigation.component.scss
src/pybind/mgr/dashboard/frontend/src/app/shared/components/config-option/config-option.component.html
src/pybind/mgr/dashboard/frontend/src/app/shared/components/form-modal/form-modal.component.html
src/pybind/mgr/dashboard/frontend/src/app/shared/components/grafana/grafana.component.html
src/pybind/mgr/dashboard/frontend/src/app/shared/components/helper/helper.component.html
src/pybind/mgr/dashboard/frontend/src/app/shared/components/helper/helper.component.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/components/loading-panel/loading-panel.component.html
src/pybind/mgr/dashboard/frontend/src/app/shared/components/modal/modal.component.html
src/pybind/mgr/dashboard/frontend/src/app/shared/components/notifications-sidebar/notifications-sidebar.component.html
src/pybind/mgr/dashboard/frontend/src/app/shared/components/notifications-sidebar/notifications-sidebar.component.scss
src/pybind/mgr/dashboard/frontend/src/app/shared/components/refresh-selector/refresh-selector.component.html
src/pybind/mgr/dashboard/frontend/src/app/shared/components/select-badges/select-badges.component.html
src/pybind/mgr/dashboard/frontend/src/app/shared/components/select/select.component.html
src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table/table.component.html
src/pybind/mgr/dashboard/frontend/src/app/shared/directives/form-loading.directive.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/notification.service.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/notification.service.ts
src/pybind/mgr/dashboard/frontend/src/styles.scss
src/pybind/mgr/dashboard/frontend/src/styles/bootstrap-extends.scss
src/pybind/mgr/dashboard/frontend/src/styles/ceph-custom/_basics.scss
src/pybind/mgr/dashboard/frontend/src/styles/ceph-custom/_buttons.scss
src/pybind/mgr/dashboard/frontend/src/styles/ceph-custom/_forms.scss
src/pybind/mgr/dashboard/frontend/src/styles/defaults/_bootstrap-defaults.scss

index 98cee470eda993bdde355243cbf78e527aa757ae..7cca96aa8f466dc0340b462231173171d7cd8bf5 100644 (file)
@@ -63,7 +63,7 @@ export class PoolPageHelper extends PageHelper {
     if (!apps || apps.length === 0) {
       return;
     }
-    cy.get('.float-left.mr-2.select-menu-edit').click();
+    cy.get('.float-start.me-2.select-menu-edit').click();
     cy.get('.popover-body').should('be.visible');
     apps.forEach((app) => cy.get('.select-menu-item-content').contains(app).click());
   }
index acbb8d3ade7d7c738b3be6ab57a5d935db366a8a..d82ed21bcc2b53459d0f64dea8ece2e6cec17233 100644 (file)
       "dev": true
     },
     "@ng-bootstrap/ng-bootstrap": {
-      "version": "10.0.0",
-      "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-10.0.0.tgz",
-      "integrity": "sha512-Sz+QaxjuyJYJ+zyUbf0TevgcgVesCPQiiFiggEzxKjzY5R+Hvq3YgryLdXf2r/ryePL+C3FXCcmmKpTM5bfczQ==",
+      "version": "12.1.2",
+      "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-12.1.2.tgz",
+      "integrity": "sha512-p27c+mYVdHiJMYrj5hwClVJxLdiZxafAqlbw1sdJh2xJ1rGOe+H/kCf5YDRbhlHqRN+34Gr0RQqIUeD1I2V8hg==",
       "requires": {
-        "tslib": "^2.1.0"
+        "tslib": "^2.3.0"
       }
     },
     "@ngtools/webpack": {
         "read-package-json-fast": "^2.0.1"
       }
     },
+    "@popperjs/core": {
+      "version": "2.10.2",
+      "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.10.2.tgz",
+      "integrity": "sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ=="
+    },
     "@protobufjs/aspromise": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
       "dev": true
     },
     "bootstrap": {
-      "version": "4.6.1",
-      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.1.tgz",
-      "integrity": "sha512-0dj+VgI9Ecom+rvvpNZ4MUZJz8dcX7WCX+eTID9+/8HgOkv3dsRzi8BGeZJCQU6flWQVYxwTQnEZFrmJSEO7og=="
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.0.0.tgz",
+      "integrity": "sha512-tmhPET9B9qCl8dCofvHeiIhi49iBt0EehmIsziZib65k1erBW1rHhj2s/2JsuQh5Pq+xz2E9bEbzp9B7xHG+VA=="
     },
     "brace-expansion": {
       "version": "1.1.11",
           "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
           "dev": true
         },
+        "esbuild-android-arm64": {
+          "version": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.11.tgz",
+          "integrity": "sha512-/hDubOg7BHOhUUsT8KUIU7GfZm5bihqssvqK5PfO4apag7YuObZRZSzViyEKcFn2tPeHx7RKbSBXvAopSHDZJQ=="
+        },
+        "esbuild-darwin-64": {
+          "version": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.11.tgz",
+          "integrity": "sha512-1DqHD0ms3AhiwkKnjRUzmiW7JnaJJr5FKrPiR7xuyMwnjDqvNWDdMq4rKSD9OC0piFNK6n0LghsglNMe2MwJtA=="
+        },
+        "esbuild-darwin-arm64": {
+          "version": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.11.tgz",
+          "integrity": "sha512-OMzhxSbS0lwwrW40HHjRCeVIJTURdXFA8c3GU30MlHKuPCcvWNUIKVucVBtNpJySXmbkQMDJdJNrXzNDyvoqvQ=="
+        },
+        "esbuild-freebsd-64": {
+          "version": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.11.tgz",
+          "integrity": "sha512-8dKP26r0/Qyez8nTCwpq60QbuYKOeBygdgOAWGCRalunyeqWRoSZj9TQjPDnTTI9joxd3QYw3UhVZTKxO9QdRg=="
+        },
+        "esbuild-freebsd-arm64": {
+          "version": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.11.tgz",
+          "integrity": "sha512-aSGiODiukLGGnSg/O9+cGO2QxEacrdCtCawehkWYTt5VX1ni2b9KoxpHCT9h9Y6wGqNHmXFnB47RRJ8BIqZgmQ=="
+        },
+        "esbuild-linux-32": {
+          "version": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.11.tgz",
+          "integrity": "sha512-lsrAfdyJBGx+6aHIQmgqUonEzKYeBnyfJPkT6N2dOf1RoXYYV1BkWB6G02tjsrz1d5wZzaTc3cF+TKmuTo/ZwA=="
+        },
+        "esbuild-linux-arm": {
+          "version": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.11.tgz",
+          "integrity": "sha512-TJllTVk5aSyqPFvvcHTvf6Wu1ZKhWpJ/qNmZO8LL/XeB+LXCclm7HQHNEIz6MT7IX8PmlC1BZYrOiw2sXSB95A=="
+        },
+        "esbuild-linux-arm64": {
+          "version": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.11.tgz",
+          "integrity": "sha512-uhcXiTwTmD4OpxJu3xC5TzAAw6Wzf9O1XGWL448EE9bqGjgV1j+oK3lIHAfsHnuIn8K4nDW8yjX0Sv5S++oRuw=="
+        },
+        "esbuild-linux-mips64le": {
+          "version": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.11.tgz",
+          "integrity": "sha512-WD61y/R1M4BLe4gxXRypoQ0Ci+Vjf714QYzcPNkiYv5I8K8WDz2ZR8Bm6cqKxd6rD+e/rZgPDbhQ9PCf7TMHmA=="
+        },
+        "esbuild-linux-ppc64le": {
+          "version": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.11.tgz",
+          "integrity": "sha512-JVleZS9oPVLTlBhPTWgOwxFWU/wMUdlBwTbGA4GF8c38sLbS13cupj+C8bLq929jU7EMWry4SaL+tKGIaTlqKg=="
+        },
+        "esbuild-linux-riscv64": {
+          "version": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.11.tgz",
+          "integrity": "sha512-9aLIalZ2HFHIOZpmVU11sEAS9F8TnHw49daEjcgMpBXHFF57VuT9f9/9LKJhw781Gda0P9jDkuCWJ0tFbErvJw=="
+        },
+        "esbuild-linux-s390x": {
+          "version": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.11.tgz",
+          "integrity": "sha512-sZHtiXXOKsLI3XGBGoYO4qKBzJlb8xNsWmvFiwFMHFzA4AXgDP1KDp7Dawe9C2pavTRBDvl+Ok4n/DHQ59oaTg=="
+        },
+        "esbuild-netbsd-64": {
+          "version": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.11.tgz",
+          "integrity": "sha512-hUC9yN06K9sg7ju4Vgu9ChAPdsEgtcrcLfyNT5IKwKyfpLvKUwCMZSdF+gRD3WpyZelgTQfJ+pDx5XFbXTlB0A=="
+        },
+        "esbuild-openbsd-64": {
+          "version": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.11.tgz",
+          "integrity": "sha512-0bBo9SQR4t66Wd91LGMAqmWorzO0TTzVjYiifwoFtel8luFeXuPThQnEm5ztN4g0fnvcp7AnUPPzS/Depf17wQ=="
+        },
+        "esbuild-sunos-64": {
+          "version": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.11.tgz",
+          "integrity": "sha512-EuBdTGlsMTjEl1sQnBX2jfygy7iR6CKfvOzi+gEOfhDqbHXsmY1dcpbVtcwHAg9/2yUZSfMJHMAgf1z8M4yyyw=="
+        },
+        "esbuild-windows-32": {
+          "version": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.11.tgz",
+          "integrity": "sha512-O0/Wo1Wk6dc0rZSxkvGpmTNIycEznHmkObTFz2VHBhjPsO4ZpCgfGxNkCpz4AdAIeMczpTXt/8d5vdJNKEGC+Q=="
+        },
+        "esbuild-windows-64": {
+          "version": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.11.tgz",
+          "integrity": "sha512-x977Q4HhNjnHx00b4XLAnTtj5vfbdEvkxaQwC1Zh5AN8g5EX+izgZ6e5QgqJgpzyRNJqh4hkgIJF1pyy1be0mQ=="
+        },
+        "esbuild-windows-arm64": {
+          "version": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.11.tgz",
+          "integrity": "sha512-VwUHFACuBahrvntdcMKZteUZ9HaYrBRODoKe4tIWxguQRvvYoYb7iu5LrcRS/FQx8KPZNaa72zuqwVtHeXsITw=="
+        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
index 33b3e85f506710f2ada8da9a1aab37c0884ef008..9ba1822bae432f8ded68d6fcd714d60e2bd57e09 100644 (file)
     "@angular/platform-browser-dynamic": "13.3.11",
     "@angular/router": "13.3.11",
     "@circlon/angular-tree-component": "10.0.0",
-    "@ng-bootstrap/ng-bootstrap": "10.0.0",
+    "@ng-bootstrap/ng-bootstrap": "12.1.2",
+    "@popperjs/core": "2.10.2",
     "@swimlane/ngx-datatable": "18.0.0",
     "@types/file-saver": "2.0.1",
     "async-mutex": "0.2.4",
-    "bootstrap": "4.6.1",
+    "bootstrap": "5.0.0",
     "chart.js": "2.9.4",
     "detect-browser": "5.2.0",
     "file-saver": "2.0.2",
   },
   "cypress-cucumber-preprocessor": {
     "nonGlobalStepDefinitions": true
+  },
+  "overrides": {
+    "autoprefixer": "10.4.5"
   }
 }
index d84ea787f13963cbb27063630154b33c39175cb3..662ad75407070c714602b2f6ef0c3e1ddc359ed7 100644 (file)
                      type="password"
                      autocomplete="new-password">
 
-              <span class="input-group-append">
-                <button type="button"
-                        class="btn btn-light"
-                        cdPasswordButton="password">
-                </button>
-                <cd-copy-2-clipboard-button source="password">
-                </cd-copy-2-clipboard-button>
-              </span>
+              <button type="button"
+                      class="btn btn-light"
+                      cdPasswordButton="password">
+              </button>
+              <cd-copy-2-clipboard-button source="password">
+              </cd-copy-2-clipboard-button>
             </div>
             <span class="invalid-feedback"
                   *ngIf="discoveryForm.showError('password', formDir, 'required')"
                      type="password"
                      autocomplete="new-password">
 
-              <span class="input-group-append">
-                <button type="button"
-                        class="btn btn-light"
-                        cdPasswordButton="mutual_password">
-                </button>
-                <cd-copy-2-clipboard-button source="mutual_password">
-                </cd-copy-2-clipboard-button>
-              </span>
+              <button type="button"
+                      class="btn btn-light"
+                      cdPasswordButton="mutual_password">
+              </button>
+              <cd-copy-2-clipboard-button source="mutual_password">
+              </cd-copy-2-clipboard-button>
             </div>
             <span class="invalid-feedback"
                   *ngIf="discoveryForm.showError('mutual_password', formDir, 'required')"
index 852866a86db2c4fa0961ae7321081e2cfc5fb6e4..5e641926955adc7e6f11fa84b1a8fb783756b908 100644 (file)
                      name="target_iqn"
                      formControlName="target_iqn"
                      cdTrim />
-              <span class="input-group-append">
-                <button class="btn btn-light"
-                        id="ecp-info-button"
-                        type="button"
-                        (click)="targetSettingsModal()">
-                  <i [ngClass]="[icons.deepCheck]"
-                     aria-hidden="true"></i>
-                </button>
-              </span>
+              <button class="btn btn-light"
+                      id="ecp-info-button"
+                      type="button"
+                      (click)="targetSettingsModal()">
+                <i [ngClass]="[icons.deepCheck]"
+                   aria-hidden="true"></i>
+              </button>
             </div>
 
             <span class="invalid-feedback"
                        type="text"
                        [value]="portal"
                        disabled />
-                <span class="input-group-append">
-                  <button class="btn btn-light"
-                          type="button"
-                          (click)="removePortal(i, portal)">
-                    <i [ngClass]="[icons.destroy]"
-                       aria-hidden="true"></i>
-                  </button>
-                </span>
+                <button class="btn btn-light"
+                        type="button"
+                        (click)="removePortal(i, portal)">
+                  <i [ngClass]="[icons.destroy]"
+                     aria-hidden="true"></i>
+                </button>
               </div>
             </ng-container>
 
@@ -90,7 +86,7 @@
                            [options]="portalsSelections"
                            [messages]="messages.portals"
                            (selection)="onPortalSelection($event)"
-                           elemClass="btn btn-light float-right">
+                           elemClass="btn btn-light float-end">
                   <i [ngClass]="[icons.add]"></i>
                   <ng-container i18n>Add portal</ng-container>
                 </cd-select>
                        type="text"
                        [value]="image"
                        disabled />
-                <span class="input-group-append">
-                  <div class="input-group-text"
-                       *ngIf="api_version >= 1">lun: {{ imagesSettings[image]['lun'] }}</div>
-                  <button class="btn btn-light"
-                          type="button"
-                          (click)="imageSettingsModal(image)">
-                    <i [ngClass]="[icons.deepCheck]"
-                       aria-hidden="true"></i>
-                  </button>
-                  <button class="btn btn-light"
-                          type="button"
-                          (click)="removeImage(i, image)">
-                    <i [ngClass]="[icons.destroy]"
-                       aria-hidden="true"></i>
-                  </button>
-                </span>
+                <div class="input-group-text"
+                     *ngIf="api_version >= 1">lun: {{ imagesSettings[image]['lun'] }}</div>
+                <button class="btn btn-light"
+                        type="button"
+                        (click)="imageSettingsModal(image)">
+                  <i [ngClass]="[icons.deepCheck]"
+                     aria-hidden="true"></i>
+                </button>
+                <button class="btn btn-light"
+                        type="button"
+                        (click)="removeImage(i, image)">
+                  <i [ngClass]="[icons.destroy]"
+                     aria-hidden="true"></i>
+                </button>
 
               </div>
 
                            [options]="imagesSelections"
                            [messages]="messages.images"
                            (selection)="onImageSelection($event)"
-                           elemClass="btn btn-light float-right">
+                           elemClass="btn btn-light float-end">
                   <i [ngClass]="[icons.add]"></i>
                   <ng-container i18n>Add image</ng-container>
                 </cd-select>
                        id="target_password"
                        name="target_password"
                        formControlName="password" />
-                <span class="input-group-append">
-                  <button type="button"
-                          class="btn btn-light"
-                          cdPasswordButton="target_password">
-                  </button>
-                  <cd-copy-2-clipboard-button source="target_password">
-                  </cd-copy-2-clipboard-button>
-                </span>
+                <button type="button"
+                        class="btn btn-light"
+                        cdPasswordButton="target_password">
+                </button>
+                <cd-copy-2-clipboard-button source="target_password">
+                </cd-copy-2-clipboard-button>
               </div>
 
               <span class="invalid-feedback"
                        name="target_mutual_password"
                        formControlName="mutual_password" />
 
-                <span class="input-group-append">
-                  <button type="button"
-                          class="btn btn-light"
-                          cdPasswordButton="target_mutual_password">
-                  </button>
-                  <cd-copy-2-clipboard-button source="target_mutual_password">
-                  </cd-copy-2-clipboard-button>
-                </span>
+                <button type="button"
+                        class="btn btn-light"
+                        cdPasswordButton="target_mutual_password">
+                </button>
+                <cd-copy-2-clipboard-button source="target_mutual_password">
+                </cd-copy-2-clipboard-button>
               </div>
 
               <span class="invalid-feedback"
               <div class="card-header">
                 <ng-container i18n>Initiator</ng-container>: {{ initiator.getValue('client_iqn') }}
                 <button type="button"
-                        class="close"
+                        class="btn-close float-end"
                         (click)="removeInitiator(ii)">
-                  <i [ngClass]="[icons.destroy]"></i>
                 </button>
               </div>
               <div class="card-body">
                                autocomplete="new-password"
                                type="password">
 
-                        <span class="input-group-append">
-                          <button type="button"
-                                  class="btn btn-light"
-                                  [cdPasswordButton]="'password' + ii">
-                          </button>
-                          <cd-copy-2-clipboard-button [source]="'password' + ii">
-                          </cd-copy-2-clipboard-button>
-                        </span>
+                        <button type="button"
+                                class="btn btn-light"
+                                [cdPasswordButton]="'password' + ii">
+                        </button>
+                        <cd-copy-2-clipboard-button [source]="'password' + ii">
+                        </cd-copy-2-clipboard-button>
                       </div>
                       <span class="invalid-feedback"
                             *ngIf="initiator.showError('password', formDir, 'required')"
                                autocomplete="new-password"
                                type="password">
 
-                        <span class="input-group-append">
-                          <button type="button"
-                                  class="btn btn-light"
-                                  [cdPasswordButton]="'mutual_password' + ii">
-                          </button>
-                          <cd-copy-2-clipboard-button [source]="'mutual_password' + ii">
-                          </cd-copy-2-clipboard-button>
-                        </span>
+                        <button type="button"
+                                class="btn btn-light"
+                                [cdPasswordButton]="'mutual_password' + ii">
+                        </button>
+                        <cd-copy-2-clipboard-button [source]="'mutual_password' + ii">
+                        </cd-copy-2-clipboard-button>
                       </div>
                       <span class="invalid-feedback"
                             *ngIf="initiator.showError('mutual_password', formDir, 'required')"
                                type="text"
                                [value]="image"
                                disabled />
-                        <span class="input-group-append">
-                          <button class="btn btn-light"
-                                  type="button"
-                                  (click)="removeInitiatorImage(initiator, li, ii, image)">
-                            <i [ngClass]="[icons.destroy]"
-                               aria-hidden="true"></i>
-                          </button>
-                        </span>
+                        <button class="btn btn-light"
+                                type="button"
+                                (click)="removeInitiatorImage(initiator, li, ii, image)">
+                          <i [ngClass]="[icons.destroy]"
+                             aria-hidden="true"></i>
+                        </button>
                       </div>
                     </ng-container>
 
                         <cd-select [data]="initiator.getValue('luns')"
                                    [options]="imagesInitiatorSelections[ii]"
                                    [messages]="messages.initiatorImage"
-                                   elemClass="btn btn-light float-right">
+                                   elemClass="btn btn-light float-end">
                           <i [ngClass]="[icons.add]"></i>
                           <ng-container i18n>Add image</ng-container>
                         </cd-select>
                       i18n>No items added.</span>
 
                 <button (click)="addInitiator(); false"
-                        class="btn btn-light float-right">
+                        class="btn btn-light float-end">
                   <i [ngClass]="[icons.add]"></i>
                   <ng-container i18n>Add initiator</ng-container>
                 </button>
               <div class="card-header">
                 <ng-container i18n>Group</ng-container>: {{ group.getValue('group_id') }}
                 <button type="button"
-                        class="close"
+                        class="btn-close float-end"
                         (click)="removeGroup(gi)">
-                  <i [ngClass]="[icons.destroy]"></i>
                 </button>
               </div>
               <div class="card-body">
                                type="text"
                                [value]="member"
                                disabled />
-                        <span class="input-group-append">
-                          <button class="btn btn-light"
-                                  type="button"
-                                  (click)="removeGroupInitiator(group, i, gi)">
-                            <i [ngClass]="[icons.destroy]"
-                               aria-hidden="true"></i>
-                          </button>
-                        </span>
+                        <button class="btn btn-light"
+                                type="button"
+                                (click)="removeGroupInitiator(group, i, gi)">
+                          <i [ngClass]="[icons.destroy]"
+                             aria-hidden="true"></i>
+                        </button>
                       </div>
                     </ng-container>
 
                                    [options]="groupMembersSelections[gi]"
                                    [messages]="messages.groupInitiator"
                                    (selection)="onGroupMemberSelection($event, gi)"
-                                   elemClass="btn btn-light float-right">
+                                   elemClass="btn btn-light float-end">
                           <i [ngClass]="[icons.add]"></i>
                           <ng-container i18n>Add initiator</ng-container>
                         </cd-select>
                                type="text"
                                [value]="disk"
                                disabled />
-                        <span class="input-group-append">
-                          <button class="btn btn-light"
-                                  type="button"
-                                  (click)="removeGroupDisk(group, i, gi)">
-                            <i [ngClass]="[icons.destroy]"
-                               aria-hidden="true"></i>
-                          </button>
-                        </span>
+                        <button class="btn btn-light"
+                                type="button"
+                                (click)="removeGroupDisk(group, i, gi)">
+                          <i [ngClass]="[icons.destroy]"
+                             aria-hidden="true"></i>
+                        </button>
                       </div>
                     </ng-container>
 
                         <cd-select [data]="group.getValue('disks')"
                                    [options]="groupDiskSelections[gi]"
                                    [messages]="messages.initiatorImage"
-                                   elemClass="btn btn-light float-right">
+                                   elemClass="btn btn-light float-end">
                           <i [ngClass]="[icons.add]"></i>
                           <ng-container i18n>Add image</ng-container>
                         </cd-select>
                       i18n>No items added.</span>
 
                 <button (click)="addGroup(); false"
-                        class="btn btn-light float-right">
+                        class="btn btn-light float-end">
                   <i [ngClass]="[icons.add]"></i>
                   <ng-container i18n>Add group</ng-container>
                 </button>
index 2452b0bc5721cda153ff4dc43d2a3bfc4c4e4623..9614ac7505f0fdb35be91b0cf9f6c3f46f7179ef 100644 (file)
@@ -58,7 +58,7 @@
                    i18n>Backstore</label>
             <select id="backstore"
                     name="backstore"
-                    class="form-control"
+                    class="form-select"
                     formControlName="backstore">
               <option *ngFor="let bs of backstores"
                       [value]="bs">{{ bs | iscsiBackstore }}</option>
index eccb79514c1bf6ce6dc41a37a0a8d3aeb0eb73ff..ba66271cf7763ed71d99688d7050602c9a11ea71 100644 (file)
@@ -1,15 +1,19 @@
 <cd-iscsi-tabs></cd-iscsi-tabs>
 
 <legend i18n>Gateways</legend>
-<cd-table [data]="gateways"
-          (fetchData)="refresh()"
-          [columns]="gatewaysColumns">
-</cd-table>
+<div>
+  <cd-table [data]="gateways"
+            (fetchData)="refresh()"
+            [columns]="gatewaysColumns">
+  </cd-table>
+</div>
 
 <legend i18n>Images</legend>
-<cd-table [data]="images"
-          [columns]="imagesColumns">
-</cd-table>
+<div>
+  <cd-table [data]="images"
+            [columns]="imagesColumns">
+  </cd-table>
+</div>
 
 <ng-template #iscsiSparklineTpl
              let-row="row"
index a31ab933c7525d7be708ffec87ab65617616f991..22ad25b08bd36de072198e971faf4fa67b9e235f 100755 (executable)
@@ -53,7 +53,7 @@
                 i18n>At least one pool is required.</span>
         </div>
 
-        <cd-submit-button class="mb-4 float-right"
+        <cd-submit-button class="mb-4 float-end"
                           i18n
                           [form]="createBootstrapForm"
                           (submitAction)="generate()">Generate</cd-submit-button>
@@ -71,7 +71,7 @@
                     readonly>
           </textarea>
         </div>
-        <cd-copy-2-clipboard-button class="float-right"
+        <cd-copy-2-clipboard-button class="float-end"
                                     source="token">
         </cd-copy-2-clipboard-button>
       </div>
index 2d2f13c6b9e950994d1901ed65263a89b0bec8ee..a51ea9b069fd0e3f8ddea7686a9d0df56b1805b7 100644 (file)
@@ -1,67 +1,68 @@
-<div class="row">
-  <div class="col-md-12">
-    <form name="rbdmirroringForm"
-          #formDir="ngForm"
-          [formGroup]="rbdmirroringForm"
-          novalidate>
-
-      <div class="d-flex flex-row">
-        <label class="col-form-label"
-               for="siteName"
-               i18n>Site Name</label>
+<form name="rbdmirroringForm"
+      #formDir="ngForm"
+      [formGroup]="rbdmirroringForm"
+      novalidate>
+  <div class="row mb-3">
+    <div class="col-md-auto">
+      <label class="col-form-label"
+             for="siteName"
+             i18n>Site Name</label></div>
 
-        <div class="col-md-4 input-group mb-3 mr-auto">
-          <input type="text"
-                 class="form-control"
-                 id="siteName"
-                 name="siteName"
-                 formControlName="siteName"
-                 [attr.disabled]="!editing ? true : null">
-          <div class="input-group-append">
-            <button class="btn btn-light"
-                    id="editSiteName"
-                    (click)="updateSiteName()"
-                    [attr.title]="editing ? 'Save' : 'Edit'">
-              <i [ngClass]="icons.edit"
-                 *ngIf="!editing"></i>
-              <i [ngClass]="icons.check"
-                 *ngIf="editing"></i>
-            </button>
-            <cd-copy-2-clipboard-button [source]="siteName"
-                                        [byId]="false">
-            </cd-copy-2-clipboard-button>
-          </div>
-        </div>
-        <cd-table-actions class="table-actions"
-                          [permission]="permission"
-                          [selection]="selection"
-                          [tableActions]="tableActions">
-        </cd-table-actions>
-      </div>
-    </form>
+    <div class="col-sm-4 d-flex">
+      <input type="text"
+             class="form-control"
+             id="siteName"
+             name="siteName"
+             formControlName="siteName"
+             [attr.disabled]="!editing ? true : null">
+      <button class="btn btn-light"
+              id="editSiteName"
+              (click)="updateSiteName()"
+              [attr.title]="editing ? 'Save' : 'Edit'">
+        <i [ngClass]="icons.edit"
+           *ngIf="!editing"></i>
+        <i [ngClass]="icons.check"
+           *ngIf="editing"></i>
+      </button>
+      <cd-copy-2-clipboard-button [source]="siteName"
+                                  [byId]="false">
+      </cd-copy-2-clipboard-button>
+    </div>
+    <div class="col">
+      <cd-table-actions class="table-actions float-end"
+                        [permission]="permission"
+                        [selection]="selection"
+                        [tableActions]="tableActions">
+      </cd-table-actions>
+    </div>
   </div>
-</div>
+</form>
 
 <div class="row">
   <div class="col-sm-6">
     <legend i18n>Daemons</legend>
-
-    <cd-mirroring-daemons>
-    </cd-mirroring-daemons>
+    <div>
+      <cd-mirroring-daemons>
+      </cd-mirroring-daemons>
+    </div>
   </div>
 
   <div class="col-sm-6">
     <legend i18n>Pools</legend>
 
-    <cd-mirroring-pools>
-    </cd-mirroring-pools>
+    <div>
+      <cd-mirroring-pools>
+      </cd-mirroring-pools>
+    </div>
   </div>
 </div>
 
 <div class="row">
   <div class="col-md-12">
     <legend i18n>Images</legend>
-    <cd-mirroring-images>
-    </cd-mirroring-images>
+    <div>
+      <cd-mirroring-images>
+      </cd-mirroring-images>
+    </div>
   </div>
 </div>
index 00fe92b32b734ecf507ab2c0080f0b2e169ba577..ed4f7289619ec7f7c2ff2e3150a184273172ba23 100644 (file)
@@ -23,7 +23,7 @@
           </label>
           <select id="mirrorMode"
                   name="mirrorMode"
-                  class="form-control"
+                  class="form-select"
                   formControlName="mirrorMode">
             <option *ngFor="let mirrorMode of mirrorModes"
                     [value]="mirrorMode.id">{{ mirrorMode.name }}</option>
index 130aa32866c146d0431d525ff7c66726e8b53023..62707db349961f17d0bdebe5f034f44f6d169c94 100644 (file)
                        cdIops>
               </ng-container>
             </ng-container>
-            <span class="input-group-append">
-              <button class="btn btn-light"
-                      type="button"
-                      data-toggle="button"
-                      [ngClass]="{'active': isDisabled(option.name)}"
-                      title="Remove the local configuration value. The parent configuration value will be inherited and used instead."
-                      i18n-title
-                      (click)="reset(option.name)">
-                <i [ngClass]="[icons.erase]"
-                   aria-hidden="true"></i>
-              </button>
-            </span>
+            <button class="btn btn-light"
+                    type="button"
+                    data-toggle="button"
+                    [ngClass]="{'active': isDisabled(option.name)}"
+                    title="Remove the local configuration value. The parent configuration value will be inherited and used instead."
+                    i18n-title
+                    (click)="reset(option.name)">
+              <i [ngClass]="[icons.erase]"
+                 aria-hidden="true"></i>
+            </button>
           </div>
           <span i18n
                 class="invalid-feedback"
index 17b466e72f13032fc70c0e2ee306818b593659d8..e12d3772876b3d55cde42f36241651798628a93a 100644 (file)
@@ -53,7 +53,7 @@
                   class="bold">Features</td>
               <td>
                 <span *ngFor="let feature of selection.features_name">
-                  <span class="badge badge-dark mr-2">{{ feature }}</span>
+                  <span class="badge badge-dark me-2">{{ feature }}</span>
                 </span>
               </td>
             </tr>
index fed1956a6033020f8ab68c8163b6a1b2f01c8473..017456cb4d2a6fcd12d965d833ce7f49fed7ba5c 100644 (file)
@@ -66,7 +66,7 @@
                    *ngIf="mode === 'editing' || !poolPermission.read">
             <select id="pool"
                     name="pool"
-                    class="form-control"
+                    class="form-select"
                     formControlName="pool"
                     *ngIf="mode !== 'editing' && poolPermission.read"
                     (change)="setPoolMirrorMode()">
                    *ngIf="mode === 'editing' || !poolPermission.read">
             <select id="namespace"
                     name="namespace"
-                    class="form-control"
+                    class="form-select"
                     formControlName="namespace"
                     *ngIf="mode !== 'editing' && poolPermission.read">
               <option *ngIf="pools === null"
                    *ngIf="mode === 'editing' || !poolPermission.read">
             <select id="dataPool"
                     name="dataPool"
-                    class="form-control"
+                    class="form-select"
                     formControlName="dataPool"
                     (change)="onDataPoolChange($event.target.value)"
                     *ngIf="mode !== 'editing' && poolPermission.read">
               </cd-helper>
             </div>
             <div *ngIf="mirroring">
-              <div class="custom-control custom-radio ml-2"
+              <div class="custom-control custom-radio ms-2"
                    *ngFor="let option of mirroringOptions">
                 <input type="radio"
-                       class="custom-control-input"
+                       class="form-check-input"
                        [id]="option"
                        [value]="option"
                        name="mirroringMode"
                        (change)="setExclusiveLock()"
                        formControlName="mirroringMode"
                        [attr.disabled]="(poolMirrorMode === 'pool' && option === 'snapshot') ? true : null">
-                <label class="custom-control-label"
+                <label class="form-check-label"
                        [for]="option">{{ option | titlecase }}</label>
                 <cd-helper *ngIf="poolMirrorMode === 'pool' && option === 'snapshot'">
                   <span i18n>You need to enable <b>image mirror mode</b> in the selected pool. Please <a [routerLink]="['/block/mirroring', {outlets: {modal: ['edit', currentPoolName]}}]">click here to select a mode and enable it in this pool.</a></span>
         <!-- Advanced -->
         <div class="row">
           <div class="col-sm-12">
-            <a class="float-right margin-right-md"
+            <a class="float-end margin-right-md"
                (click)="advancedEnabled = true; false"
                *ngIf="!advancedEnabled"
                href=""
               <div class="cd-col-form-input">
                 <select id="obj_size"
                         name="obj_size"
-                        class="form-control"
+                        class="form-select"
                         formControlName="obj_size">
                   <option *ngFor="let objectSize of objectSizes"
                           [value]="objectSize">{{ objectSize }}</option>
               <div class="cd-col-form-input">
                 <select id="stripingUnit"
                         name="stripingUnit"
-                        class="form-control"
+                        class="form-select"
                         formControlName="stripingUnit">
                   <option i18n
                           [ngValue]="null">-- Select stripe unit --</option>
index 9d76cba095fe1ab068fdee146b44693053649443..0c7edccc30f86405f7e3e90a9454c0fde364f85d 100644 (file)
@@ -24,7 +24,7 @@
                    *ngIf="!poolPermission.read">
             <select id="pool"
                     name="pool"
-                    class="form-control"
+                    class="form-select"
                     formControlName="pool"
                     *ngIf="poolPermission.read">
               <option *ngIf="pools === null"
index 1d4b2ece85b3affcba16e598c1bcd526ead285c2..ce6cc71c5ea498518bd8f6a7feb02ba3afb815e9 100644 (file)
@@ -1,5 +1,5 @@
 <div class="row">
-  <div class="col-sm-4 pr-0">
+  <div class="col-sm-4 pe-0">
     <div class="card">
       <div class="card-header">
         <button type="button"
index a4f88004435d9f008cae2f2bd0a77024ebb9d23d..b8db2e6b327be19a9908de9da6fb8d3894a24349 100644 (file)
@@ -15,7 +15,7 @@
     <ng-container ngbNavItem="clients">
       <a ngbNavLink>
         <ng-container i18n>Clients</ng-container>
-        <span class="badge badge-pill badge-tab ml-1">{{ clients.data.length }}</span>
+        <span class="badge badge-pill badge-tab ms-1">{{ clients.data.length }}</span>
       </a>
       <ng-template ngbNavContent>
         <cd-cephfs-clients [id]="id"
index 8debf9dc66bc5fb2e5ae487e4db04f139d6998eb..13bb16c9cead6a9a3dcb1ac61e4af615273bf618 100755 (executable)
@@ -56,7 +56,7 @@
         <td>
           <span *ngFor="let flag of selection.flags">
             <span title="{{ flags[flag] }}">
-              <span class="badge badge-dark mr-2">{{ flag | uppercase }}</span>
+              <span class="badge badge-dark me-2">{{ flag | uppercase }}</span>
             </span>
           </span>
         </td>
@@ -66,7 +66,7 @@
             class="bold">Services</td>
         <td>
           <span *ngFor="let service of selection.services">
-            <span class="badge badge-dark mr-2">{{ service }}</span>
+            <span class="badge badge-dark me-2">{{ service }}</span>
           </span>
         </td>
       </tr>
index 72c71794257f008100d7b8399d8979ce7f239432..741c18d52a610e10ae0f6f9cb39871eb99719fe1 100644 (file)
               <div class="cd-col-form-input">
                 <select id="pool"
                         name="pool"
-                        class="form-control"
+                        class="form-select"
                         [formControlName]="section">
                   <option [ngValue]="null"
                           i18n>-- Default --</option>
index 82429e6dda4e27ce96a1236694c379422a4435d1..d738c4f2ca52b4e30ca8a4ebf432397a85fc147c 100644 (file)
@@ -12,7 +12,7 @@
       <div class="m-4">
         <h4 class="text-center"
             i18n>Please expand your cluster first</h4>
-        <div class="offset-md-2">
+        <div class="text-center">
           <button class="btn btn-accent m-2"
                   name="expand-cluster"
                   (click)="createCluster()"
@@ -38,7 +38,7 @@
     <div class="card-body vertical-line">
       <ng-container [ngSwitch]="currentStep?.stepIndex">
         <div *ngSwitchCase="'1'"
-             class="ml-5">
+             class="ms-5">
           <h4 class="title"
               i18n>Add Hosts</h4>
           <br>
@@ -48,7 +48,7 @@
                     [showGeneralActionsOnly]="true"></cd-hosts>
         </div>
         <div *ngSwitchCase="'2'"
-             class="ml-5">
+             class="ms-5">
           <h4 class="title"
               i18n>Create OSDs</h4>
           <div class="alignForm">
@@ -60,7 +60,7 @@
           </div>
         </div>
         <div *ngSwitchCase="'3'"
-             class="ml-5">
+             class="ms-5">
           <h4 class="title"
               i18n>Create Services</h4>
           <br>
                        [routedModal]="false"></cd-services>
         </div>
         <div *ngSwitchCase="'4'"
-             class="ml-5">
+             class="ms-5">
           <cd-create-cluster-review></cd-create-cluster-review>
         </div>
       </ng-container>
     </div>
   </div>
   <div class="card-footer">
-    <button class="btn btn-accent m-2 float-right"
+    <button class="btn btn-accent m-2 float-end"
             (click)="onNextStep()"
             aria-label="Next"
             i18n>{{ showSubmitButtonLabel() }}</button>
-    <cd-back-button class="m-2 float-right"
+    <cd-back-button class="m-2 float-end"
                     aria-label="Close"
                     (backAction)="onPreviousStep()"
                     [name]="showCancelButtonLabel()"></cd-back-button>
index bd4a25e7596c0956c3eca3b02532a0f7a0754266..9f6c86eeacb651d4dfcfdfe55a0e02cbc8b909bb 100644 (file)
 </div>
 
 <ng-template #logFiltersTpl>
-  <div class="form-inline">
-    <div class="form-group">
+  <div class="row mb-3">
+  <div class="col-lg-10 d-flex">
+    <div class="col-sm-1 me-3">
       <label for="logs-priority"
+             class="fw-bold"
              i18n>Priority:</label>
       <select id="logs-priority"
-              class="form-control"
+              class="form-select"
               [(ngModel)]="priority"
               (ngModelChange)="filterLogs()">
         <option *ngFor="let prio of priorities"
       </select>
     </div>
 
-    <div class="form-group">
+    <div class="col-md-3 me-3">
       <label for="logs-keyword"
+             class="fw-bold"
              i18n>Keyword:</label>
       <div class="input-group">
-        <div class="input-group-prepend">
-          <span class="input-group-text">
-            <i [ngClass]="[icons.search]"></i>
-          </span>
-        </div>
+        <span class="input-group-text">
+          <i [ngClass]="[icons.search]"></i>
+        </span>
 
         <input class="form-control"
                id="logs-keyword"
                [(ngModel)]="search"
                (keyup)="filterLogs()">
 
-        <div class="input-group-append">
-          <button type="button"
-                  class="btn btn-light"
-                  (click)="clearSearchKey()"
-                  title="Clear">
-            <i class="icon-prepend {{ icons.destroy }}"></i>
-          </button>
-        </div>
+        <button type="button"
+                class="btn btn-light"
+                (click)="clearSearchKey()"
+                title="Clear">
+          <i class="icon-prepend {{ icons.destroy }}"></i>
+        </button>
       </div>
     </div>
 
-    <div class="form-group">
+    <div class="col-md-3 me-3">
       <label for="logs-date"
+             class="fw-bold"
              i18n>Date:</label>
       <div class="input-group">
         <input class="form-control"
                (click)="d.open()"
                [(ngModel)]="selectedDate"
                (ngModelChange)="filterLogs()">
-        <span class="input-group-append">
-          <button type="button"
-                  class="btn btn-light"
-                  (click)="clearDate()"
-                  title="Clear">
-            <i class="icon-prepend {{ icons.destroy }}"></i>
-          </button>
-        </span>
+        <button type="button"
+                class="btn btn-light"
+                (click)="clearDate()"
+                title="Clear">
+          <i class="icon-prepend {{ icons.destroy }}"></i>
+        </button>
       </div>
     </div>
 
-    <div class="form-group">
-      <label i18n>Time range:</label>
+    <div class="col-md-5">
+      <label i18n
+             class="fw-bold">Time range:</label>
+      <div class="d-flex">
       <ngb-timepicker [spinners]="false"
                       [(ngModel)]="startTime"
                       (ngModelChange)="filterLogs()"></ngb-timepicker>
 
-      <span>&nbsp;&mdash;&nbsp;</span>
+      <span class="mt-2">&nbsp;&mdash;&nbsp;</span>
 
       <ngb-timepicker [spinners]="false"
                       [(ngModel)]="endTime"
                       (ngModelChange)="filterLogs()"></ngb-timepicker>
-    </div>
-  </div>
+    </div></div>
+  </div></div>
 </ng-template>
 
 <ng-template #noEntriesTpl>
index b952ce8d8a7c3bf31dad04639fa36596dc977dd5..693741120c20f08a34e2e8ea1341c3227812fd86 100644 (file)
@@ -43,7 +43,7 @@
                    formControlName="{{ moduleOption.value.name }}"
                    *ngIf="moduleOption.value.enum_allowed.length === 0">
             <select id="{{ moduleOption.value.name }}"
-                    class="form-control"
+                    class="form-select"
                     formControlName="{{ moduleOption.value.name }}"
                     *ngIf="moduleOption.value.enum_allowed.length > 0">
               <option *ngFor="let value of moduleOption.value.enum_allowed"
index ca9ac82212c78cc0b8a6c6955211da245c269d63..c9dbf9cc599122fa7bf0cb42541f78ba1c50a6e5 100644 (file)
@@ -5,41 +5,43 @@
               i18n>Status</legend>
       <table class="table table-striped"
              *ngIf="mon_status">
-        <tr>
-          <td i18n
-              class="bold">Cluster ID</td>
-          <td>{{ mon_status.monmap.fsid }}</td>
-        </tr>
-        <tr>
-          <td i18n
-              class="bold">monmap modified</td>
-          <td>{{ mon_status.monmap.modified | relativeDate }}</td>
-        </tr>
-        <tr>
-          <td i18n
-              class="bold">monmap epoch</td>
-          <td>{{ mon_status.monmap.epoch }}</td>
-        </tr>
-        <tr>
-          <td i18n
-              class="bold">quorum con</td>
-          <td>{{ mon_status.features.quorum_con }}</td>
-        </tr>
-        <tr>
-          <td i18n
-              class="bold">quorum mon</td>
-          <td>{{ mon_status.features.quorum_mon }}</td>
-        </tr>
-        <tr>
-          <td i18n
-              class="bold">required con</td>
-          <td>{{ mon_status.features.required_con }}</td>
-        </tr>
-        <tr>
-          <td i18n
-              class="bold">required mon</td>
-          <td>{{ mon_status.features.required_mon }}</td>
-        </tr>
+        <tbody>
+          <tr>
+            <td i18n
+                class="bold">Cluster ID</td>
+            <td>{{ mon_status.monmap.fsid }}</td>
+          </tr>
+          <tr>
+            <td i18n
+                class="bold">monmap modified</td>
+            <td>{{ mon_status.monmap.modified | relativeDate }}</td>
+          </tr>
+          <tr>
+            <td i18n
+                class="bold">monmap epoch</td>
+            <td>{{ mon_status.monmap.epoch }}</td>
+          </tr>
+          <tr>
+            <td i18n
+                class="bold">quorum con</td>
+            <td>{{ mon_status.features.quorum_con }}</td>
+          </tr>
+          <tr>
+            <td i18n
+                class="bold">quorum mon</td>
+            <td>{{ mon_status.features.quorum_mon }}</td>
+          </tr>
+          <tr>
+            <td i18n
+                class="bold">required con</td>
+            <td>{{ mon_status.features.required_con }}</td>
+          </tr>
+          <tr>
+            <td i18n
+                class="bold">required mon</td>
+            <td>{{ mon_status.features.required_mon }}</td>
+          </tr>
+        </tbody>
       </table>
     </fieldset>
   </div>
   <div class="col-lg-8">
     <legend i18n
             class="in-quorum cd-header">In Quorum</legend>
+    <div>
     <cd-table [data]="inQuorum.data"
               [columns]="inQuorum.columns">
-    </cd-table>
+    </cd-table></div>
 
     <legend i18n
             class="in-quorum cd-header">Not In Quorum</legend>
+    <div>
     <cd-table [data]="notInQuorum.data"
               (fetchData)="refresh()"
               [columns]="notInQuorum.columns">
-    </cd-table>
+    </cd-table></div>
   </div>
 </div>
index 8b1f59eac371c922d991abbe2cac964936dff1f9..95e51662b769f65856958284daec453b5b16749e 100644 (file)
@@ -27,7 +27,7 @@
     <ng-template #blockClearDevices>
       <div class="pb-2 my-2 border-bottom">
         <span *ngFor="let filter of appliedFilters">
-          <span class="badge badge-dark mr-2">{{ filter.name }}: {{ filter.value.formatted }}</span>
+          <span class="badge badge-dark me-2">{{ filter.name }}: {{ filter.value.formatted }}</span>
         </span>
         <a class="tc_clearSelections"
            href=""
@@ -43,7 +43,7 @@
         </cd-inventory-devices>
       </div>
       <div *ngIf="type === 'data'"
-           class="float-right">
+           class="float-end">
         <span i18n>Raw capacity: {{ capacity | dimlessBinary }}</span>
       </div>
     </ng-template>
index 2a4344944c46c7983a4efcfe0c3d6bd00858f6f8..ab967eab4aecd3129bafc292c7a450842cc44bda 100644 (file)
@@ -13,7 +13,7 @@
                         [showTitle]="false">
           <ng-container i18n>At least one of these filters must be applied in order to proceed:</ng-container>
           <span *ngFor="let filter of requiredFilters"
-                class="badge badge-dark ml-2">
+                class="badge badge-dark ms-2">
             {{ filter }}
           </span>
         </cd-alert-panel>
index f8a10ff24de61dbadb65e8db77659cb99f40d215..0aff25409dea7584fd476bc5a0a64a8cdd0d3627 100644 (file)
@@ -21,7 +21,7 @@
                  [for]="flag.code"
                  ng-class="['tc_' + key]">
             <strong>{{ flag.name }}</strong>
-            <span class="badge badge-hdd ml-2"
+            <span class="badge badge-hdd ms-2"
                   [ngbTooltip]="clusterWideTooltip"
                   *ngIf="flag.clusterWide"
                   i18n>Cluster-wide</span>
index 12279246a99eedecf2220bc2e08517f59cda80d9..78ff50d4d51814925a676c08bf0826641645de5a 100644 (file)
@@ -5,31 +5,30 @@
   <div i18n="form title|Example: Create Pool@@formTitle"
        class="card-header"
        *ngIf="!hideTitle">{{ action | titlecase }} {{ resource | upperFirst }}</div>
-  <div class="card-body ml-2">
+  <div class="card-body ms-2">
     <form name="form"
           #formDir="ngForm"
           [formGroup]="form"
           novalidate>
       <div class="accordion">
-        <div class="card">
-          <div class="card-header">
-            <h2 class="mb-0">
-              <button class="btn btn-link btn-block text-left dropdown-toggle"
-                      data-toggle="collapse"
-                      aria-label="toggle deployment options"
-                      [attr.aria-expanded]="simpleDeployment"
-                      (click)="emitDeploymentMode()"
-                      i18n>Deployment Options</button>
-            </h2>
-          </div>
+        <div class="accordion-item">
+          <h2 class="accordion-header">
+            <button class="accordion-button"
+                    type="button"
+                    data-toggle="collapse"
+                    aria-label="toggle deployment options"
+                    [ngClass]="{collapsed: !simpleDeployment}"
+                    (click)="emitDeploymentMode()"
+                    i18n>Deployment Options</button>
+          </h2>
         </div>
-        <div class="collapse"
+        <div class="accordion-collapse collapse"
              [ngClass]="{show: simpleDeployment}">
-          <div class="card-body d-flex flex-column">
+          <div class="accordion-body">
             <div class="pt-3 pb-3"
                  *ngFor="let optionName of optionNames">
-              <div class="custom-control custom-radio custom-control-inline">
-                <input class="custom-control-input"
+              <div class="custom-control form-check custom-control-inline">
+                <input class="form-check-input"
                        type="radio"
                        name="deploymentOption"
                        [id]="optionName"
@@ -37,7 +36,7 @@
                        formControlName="deploymentOption"
                        (change)="emitDeploymentSelection()"
                        [attr.disabled]="!deploymentOptions?.options[optionName].available ? true : null">
-                <label class="custom-control-label"
+                <label class="form-check-label"
                        [id]="'label_' + optionName"
                        [for]="optionName"
                        i18n>{{ deploymentOptions?.options[optionName].title }}
             </div> -->
           </div>
         </div>
-        <div class="card">
-          <div class="card-header">
-            <h2 class="mb-0">
-              <button class="btn btn-link btn-block text-left dropdown-toggle"
-                      data-toggle="collapse"
-                      aria-label="toggle advanced mode"
-                      [attr.aria-expanded]="!simpleDeployment"
-                      (click)="emitDeploymentMode()"
-                      i18n>Advanced Mode</button>
-            </h2>
-          </div>
+        <div class="accordion-item">
+          <h2 class="accordion-header">
+            <button class="accordion-button"
+                    type="button"
+                    aria-label="toggle advanced mode"
+                    [ngClass]="{collapsed: simpleDeployment}"
+                    (click)="emitDeploymentMode()"
+                    i18n>Advanced Mode</button>
+          </h2>
         </div>
-        <div class="collapse"
+        <div class="accordion-collapse collapse"
              [ngClass]="{show: !simpleDeployment}">
-          <div class="card-body">
+          <div class="accordion-body">
             <div class="card-body">
               <fieldset>
                 <cd-osd-devices-selection-groups #dataDeviceSelectionGroups
         </div>
 
         <!-- Features -->
-        <div class="card">
-          <div class="card-header">
-            <h2 class="mb-0">
-              <button class="btn btn-link btn-block text-left dropdown-toggle"
-                      data-toggle="collapse"
-                      aria-label="features"
-                      aria-expanded="true"
-                      i18n>Features</button>
-            </h2>
-          </div>
+        <div class="accordion-item">
+          <h2 class="accordion-header">
+            <button class="accordion-button"
+                    type="button"
+                    data-toggle="collapse"
+                    aria-label="features"
+                    aria-expanded="true"
+                    i18n>Features</button>
+          </h2>
         </div>
-        <div class="collapse show">
-          <div class="card-body d-flex flex-column">
+        <div class="accordion-collapse collapse show">
+          <div class="accordion-body">
             <div class="pt-3 pb-3"
                  formGroupName="features">
               <div class="custom-control custom-checkbox"
index e09bb086c96bc114b1d5c2b88a7a65abd9f476d6..ede9dbb19f271f03fe2caf374a865dc4d2ede865 100644 (file)
@@ -79,7 +79,7 @@
         {{ actionDescription }}!
       </span>
       <br>
-      <ul class="mb-0 pl-4">
+      <ul class="mb-0 ps-4">
         <li *ngIf="active.length > 0"
              i18n>
           {selection.hasSingleSelection, select, true {} other {{{ active | join }} : }}
 <ng-template #flagsTpl
              let-row="row">
   <span *ngFor="let flag of row.cdClusterFlags;"
-        class="badge badge-hdd mr-1">{{ flag }}</span>
+        class="badge badge-hdd me-1">{{ flag }}</span>
   <span *ngFor="let flag of row.cdIndivFlags;"
-        class="badge badge-info mr-1">{{ flag }}</span>
+        class="badge badge-info me-1">{{ flag }}</span>
 </ng-template>
 
 <ng-template #osdUsageTpl
index eb54c82f50d3d16ae97a6fcb7c7ae9ff50c3abbe..ccfc58507aa6a71de8ac2a52d8e20d7a4661a265 100755 (executable)
@@ -14,7 +14,7 @@
                  for="priority"
                  i18n>Priority</label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     formControlName="priority"
                     id="priority"
                     (change)="onPriorityChange($event.target.value)">
index a319aeed6f338cf85b09377b09e4955e3d060382..1a4854327a04069fc2b4fff78547cb3566bb1a22 100644 (file)
@@ -58,7 +58,7 @@ export class ActiveAlertListComponent extends PrometheusListHelper implements On
       {
         name: $localize`Name`,
         prop: 'labels.alertname',
-        cellClass: 'font-weight-bold',
+        cellClass: 'fw-bold',
         flexGrow: 2
       },
       {
index 273982caf26ff58f38b42ec190b7ef6001aae299..73ad9884a550133aecbc53e2165a3207b0506e76 100644 (file)
@@ -7,9 +7,9 @@
        [routerLinkActiveOptions]="{exact: true}"
        i18n>Active Alerts
     <small *ngIf="prometheusAlertService.activeCriticalAlerts > 0"
-        class="badge badge-danger ml-1">{{ prometheusAlertService.activeCriticalAlerts }}</small>
+        class="badge badge-danger ms-1">{{ prometheusAlertService.activeCriticalAlerts }}</small>
     <small *ngIf="prometheusAlertService.activeWarningAlerts > 0"
-        class="badge badge-warning ml-1">{{ prometheusAlertService.activeWarningAlerts }}</small></a>
+        class="badge badge-warning ms-1">{{ prometheusAlertService.activeWarningAlerts }}</small></a>
   </li>
   <li class="nav-item">
     <a class="nav-link"
index cc4ee511156d648978c6e3ab90416f93c785ca2b..e033729da3f3db69227f4b6d873d2873a03feffc 100644 (file)
@@ -38,7 +38,7 @@ export class RulesListComponent extends PrometheusListHelper implements OnInit {
   ngOnInit() {
     super.ngOnInit();
     this.columns = [
-      { prop: 'name', name: $localize`Name`, cellClass: 'font-weight-bold', flexGrow: 2 },
+      { prop: 'name', name: $localize`Name`, cellClass: 'fw-bold', flexGrow: 2 },
       {
         prop: 'labels.severity',
         name: $localize`Severity`,
index 0cfbf08235095ee17b15a9e4bc95f52144682270..cbd3874164feb2ffa300d8ea443fb6496cdb4e15 100644 (file)
@@ -3,14 +3,12 @@
              let-index="index">
   <div class="input-group my-2">
     <ng-container *ngFor="let config of matcherConfig">
-      <div class="input-group-prepend">
-        <span class="input-group-text"
-              *ngIf="config.attribute === 'isRegex'"
-              [ngbTooltip]="config.tooltip">
-          <i *ngIf="matcher[config.attribute]">~</i>
-          <i *ngIf="!matcher[config.attribute]">=</i>
-        </span>
-      </div>
+      <span class="input-group-text"
+            *ngIf="config.attribute === 'isRegex'"
+            [ngbTooltip]="config.tooltip">
+        <i *ngIf="matcher[config.attribute]">~</i>
+        <i *ngIf="!matcher[config.attribute]">=</i>
+      </span>
 
       <ng-container *ngIf="config.attribute !== 'isRegex'">
         <input type="text"
     </ng-container>
 
     <!-- Matcher actions -->
-    <span class="input-group-append">
-      <button type="button"
-              class="btn btn-light"
-              id="matcher-edit-{{index}}"
-              i18n-ngbTooltip
-              ngbTooltip="Edit"
-              (click)="showMatcherModal(index)">
-        <i [ngClass]="[icons.edit]"></i>
-      </button>
-      <button type="button"
-              class="btn btn-light"
-              id="matcher-delete-{{index}}"
-              i18n-ngbTooltip
-              ngbTooltip="Delete"
-              (click)="deleteMatcher(index)">
-        <i [ngClass]="[icons.trash]"></i>
-      </button>
-    </span>
+    <button type="button"
+            class="btn btn-light"
+            id="matcher-edit-{{index}}"
+            i18n-ngbTooltip
+            ngbTooltip="Edit"
+            (click)="showMatcherModal(index)">
+      <i [ngClass]="[icons.edit]"></i>
+    </button>
+    <button type="button"
+            class="btn btn-light"
+            id="matcher-delete-{{index}}"
+            i18n-ngbTooltip
+            ngbTooltip="Delete"
+            (click)="deleteMatcher(index)">
+      <i [ngClass]="[icons.trash]"></i>
+    </button>
   </div>
   <span class="help-block"></span>
 </ng-template>
               <div class="col-12">
                 <button type="button"
                         id="add-matcher"
-                        class="btn btn-light float-right my-3"
+                        class="btn btn-light float-end my-3"
                         [ngClass]="{'btn-warning': formDir.submitted && matchers.length === 0 }"
                         (click)="showMatcherModal()">
                   <i [ngClass]="[icons.add]"></i>
index db89adc53690eff92ea78287b0da21530e871f93..78f05b64607aef545badc1c833df6cd5d5584f53 100644 (file)
@@ -14,7 +14,7 @@
                  for="name"
                  i18n>Name</label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     id="name"
                     formControlName="name"
                     name="name">
             <input id="value"
                    (focus)="valueFocus.next($any($event).target.value)"
                    (click)="valueClick.next($any($event).target.value)"
-                   container="body"
                    class="form-control"
                    type="text"
                    [ngbTypeahead]="search"
-                   formControlName="value">
+                   formControlName="value"
+                   #instance="ngbTypeahead">
             <span *ngIf="form.showError('value', formDir, 'required')"
                   class="help-block"
                   i18n>This field is required!</span>
index 7db0abfcaaf1eef9d7f0a5c6ec19e3bfabe254e9..8f85bf723e4251e7f9d09d2a102960d45d2d473f 100644 (file)
@@ -16,7 +16,7 @@
           <div class="cd-col-form-input">
             <select id="service_type"
                     name="service_type"
-                    class="form-control"
+                    class="form-select"
                     formControlName="service_type"
                     (change)="getServiceIds($event.target.value)">
               <option i18n
@@ -42,7 +42,7 @@
             <div class="cd-col-form-input">
               <select id="backend_service"
                       name="backend_service"
-                      class="form-control"
+                      class="form-select"
                       formControlName="backend_service"
                       (change)="prePopulateId()">
                 <option *ngIf="services === null"
                  i18n>Placement</label>
           <div class="cd-col-form-input">
             <select id="placement"
-                    class="form-control"
+                    class="form-select"
                     formControlName="placement">
               <option i18n
                       value="hosts">Hosts</option>
           <div class="cd-col-form-input">
             <select id="pool"
                     name="pool"
-                    class="form-control"
+                    class="form-select"
                     formControlName="pool">
               <option *ngIf="pools === null"
                       [ngValue]="null"
                        type="password"
                        autocomplete="new-password"
                        formControlName="api_password">
-                <span class="input-group-append">
-                  <button type="button"
-                          class="btn btn-light"
-                          cdPasswordButton="api_password">
-                  </button>
-                  <cd-copy-2-clipboard-button source="api_password">
-                  </cd-copy-2-clipboard-button>
-                </span>
+                <button type="button"
+                        class="btn btn-light"
+                        cdPasswordButton="api_password">
+                </button>
+                <cd-copy-2-clipboard-button source="api_password">
+                </cd-copy-2-clipboard-button>
                 <span class="invalid-feedback"
                       *ngIf="serviceForm.showError('api_password', frm, 'required')"
                       i18n>This field is required.</span>
             <div class="cd-col-form-input">
               <select id="snmp_version"
                       name="snmp_version"
-                      class="form-control"
+                      class="form-select"
                       formControlName="snmp_version"
                       (change)="clearValidations()">
                 <option i18n
             <div class="cd-col-form-input">
               <select id="auth_protocol"
                       name="auth_protocol"
-                      class="form-control"
+                      class="form-select"
                       formControlName="auth_protocol">
                 <option i18n
                         [ngValue]="null">-- Select auth protocol --</option>
             <div class="cd-col-form-input">
               <select id="privacy_protocol"
                       name="privacy_protocol"
-                      class="form-control"
+                      class="form-select"
                       formControlName="privacy_protocol">
                 <option i18n
                         [ngValue]="null">-- Select privacy protocol --</option>
index 25c9c54e9c9f4453f6225323ca1c2d5cd012b276..cce38626539ef853d9cf163bd77a8347e77a94b6 100644 (file)
@@ -1,28 +1,17 @@
 <div class="row">
-  <div class="info-group-title"
-       [ngbPopover]="popInfoTemplate"
-       #popInfo="ngbPopover"
-       triggers="">
+  <div class="info-group-title">
     <span>{{ groupTitle }}</span>
-    <button type="button"
-            class="popover-icon btn btn-link p-0"
-            (click)="popInfo.toggle()"
-            aria-label="learn more"
-            i18n-aria-label>
-      <i [ngClass]="[icons.infoCircle, icons.large]"></i>
-    </button>
+    <cd-helper iconClass="fa fa-info-circle fa-2xs">
+      <div class="text-center"
+           i18n>For an overview of {{ groupTitle|lowercase }} widgets click
+        <cd-doc section="dashboard-landing-page-{{ groupTitle|lowercase }}"
+                docText="here"
+                i18n-docText></cd-doc>
+      </div>
+    </cd-helper>
   </div>
 </div>
 
 <div class="row">
   <ng-content></ng-content>
 </div>
-
-<ng-template #popInfoTemplate>
-  <div class="text-center"
-       i18n>For an overview of {{ groupTitle|lowercase }} widgets click
-    <cd-doc section="dashboard-landing-page-{{ groupTitle|lowercase }}"
-            docText="here"
-            i18n-docText></cd-doc>
-  </div>
-</ng-template>
index 3a417dda0419119aa6bb307ef7d3d98aeda81b2d..ce2057e6a36c12064aadc4d7bcb1b71bc16c90c2 100644 (file)
@@ -2,7 +2,7 @@
 
 .info-group-title {
   font-size: 1.75rem;
-  margin: 0 0 0.5vw 0.5vw;
+  margin: 0 0 0.5vw;
 }
 
 .popover-icon {
index 117ad371d4eedb3cf9875515ce654140804e0e5a..b10244b430d4b82e4ce86824d075dfebc2e578d8 100644 (file)
@@ -17,7 +17,7 @@
              [formGroup]="item">
           <div class="card-header">
             {{ (index + 1) | ordinal }}
-            <span class="float-right clickable"
+            <span class="float-end clickable"
                   name="remove_client"
                   (click)="removeClient(index)"
                   ngbTooltip="Remove">&times;</span>
@@ -55,7 +55,7 @@
                      class="cd-col-form-label"
                      for="access_type">Access Type</label>
               <div class="cd-col-form-input">
-                <select class="form-control"
+                <select class="form-select"
                         name="access_type"
                         id="access_type"
                         formControlName="access_type">
@@ -78,7 +78,7 @@
                 <ng-container *ngTemplateOutlet="squashHelperTpl"></ng-container>
               </label>
               <div class="cd-col-form-input">
-                <select class="form-control"
+                <select class="form-select"
                         name="squash"
                         id="squash"
                         formControlName="squash">
@@ -93,9 +93,9 @@
       </div>
     </ng-container>
 
-    <div class="row">
+    <div class="row my-2">
       <div class="col-12">
-        <div class="float-right">
+        <div class="float-end">
           <button class="btn btn-light "
                   (click)="addClient()"
                   name="add_client">
index 7313ea69b2ecd96d1e1d3adaca92ca6188176a78..82c97e3229584d873956cd711223e9d63d39c8c7 100644 (file)
@@ -20,7 +20,7 @@
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     formControlName="cluster_id"
                     name="cluster_id"
                     id="cluster_id">
@@ -52,7 +52,7 @@
                    for="name"
                    i18n>Storage Backend</label>
             <div class="cd-col-form-input">
-              <select class="form-control"
+              <select class="form-select"
                       formControlName="name"
                       name="name"
                       id="name"
@@ -86,7 +86,7 @@
                    for="fs_name"
                    i18n>Volume</label>
             <div class="cd-col-form-input">
-              <select class="form-control"
+              <select class="form-select"
                       formControlName="fs_name"
                       name="fs_name"
                       id="fs_name"
                  for="access_type"
                  i18n>Access Type</label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     formControlName="access_type"
                     name="access_type"
                     id="access_type"
             <ng-container *ngTemplateOutlet="squashHelper"></ng-container>
           </label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     name="squash"
                     formControlName="squash"
                     id="squash">
index e5906dc4b3e04403b88b6e6ecc82e243b4582132..b3c0089834026c93068aaaf15933b8e9b1ffaeb2 100644 (file)
@@ -43,7 +43,7 @@
             <span class="required"></span>
           </label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     id="root"
                     name="root"
                     formControlName="root">
@@ -71,7 +71,7 @@
             <span class="required"></span>
           </label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     id="failure_domain"
                     name="failure_domain"
                     formControlName="failure_domain">
@@ -98,7 +98,7 @@
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     id="device_class"
                     name="device_class"
                     formControlName="device_class">
index b4b9cd1939099adbfe97fd12e83c28ce47790057..b186677c5c560f8a0f26147b7316f08c027a3af1 100644 (file)
@@ -40,7 +40,7 @@
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     id="plugin"
                     name="plugin"
                     formControlName="plugin">
                      class="form-control"
                      placeholder="Helper chunks..."
                      formControlName="d">
-              <span class="input-group-append">
-                <button class="btn btn-light"
-                        id="d-calc-btn"
-                        ngbTooltip="Set d manually or use the plugin's default calculation that maximizes d."
-                        i18n-ngbTooltip
-                        type="button"
-                        (click)="toggleDCalc()">
-                  <i [ngClass]="dCalc ? icons.unlock : icons.lock"
-                     aria-hidden="true"></i>
-                </button>
-              </span>
+              <button class="btn btn-light"
+                      id="d-calc-btn"
+                      ngbTooltip="Set d manually or use the plugin's default calculation that maximizes d."
+                      i18n-ngbTooltip
+                      type="button"
+                      (click)="toggleDCalc()">
+                <i [ngClass]="dCalc ? icons.unlock : icons.lock"
+                   aria-hidden="true"></i>
+              </button>
             </div>
             <span class="form-text text-muted"
                   *ngIf="dCalc"
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     id="crushFailureDomain"
                     name="crushFailureDomain"
                     formControlName="crushFailureDomain">
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     id="crushLocality"
                     name="crushLocality"
                     formControlName="crushLocality">
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     id="scalar_mds"
                     name="scalar_mds"
                     formControlName="scalar_mds">
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     id="technique"
                     name="technique"
                     formControlName="technique">
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     id="crushRoot"
                     name="crushRoot"
                     formControlName="crushRoot">
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     id="crushDeviceClass"
                     name="crushDeviceClass"
                     formControlName="crushDeviceClass">
index e12e36c6391bce5aaeced1b3098049d6ce63b847..b159f12530d04d28383d7fc82414c03ff0140aad 100644 (file)
@@ -45,7 +45,7 @@
                  for="poolType"
                  i18n>Pool type</label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     id="poolType"
                     formControlName="poolType"
                     name="poolType">
@@ -69,7 +69,7 @@
                    class="cd-col-form-label"
                    for="pgAutoscaleMode">PG Autoscale</label>
             <div class="cd-col-form-input">
-              <select class="form-control"
+              <select class="form-select"
                       id="pgAutoscaleMode"
                       name="pgAutoscaleMode"
                       formControlName="pgAutoscaleMode">
                    class="cd-col-form-label"
                    for="erasureProfile">Erasure code profile</label>
             <div class="cd-col-form-input">
-              <div class="input-group">
-                <select class="form-control"
+              <div class="input-group mb-1">
+                <select class="form-select"
                         id="erasureProfile"
                         name="erasureProfile"
                         formControlName="erasureProfile">
                     {{ ecp.name }}
                   </option>
                 </select>
-                <span class="input-group-append">
-                  <button class="btn btn-light"
-                          [ngClass]="{'active': data.erasureInfo}"
-                          id="ecp-info-button"
-                          type="button"
-                          (click)="data.erasureInfo = !data.erasureInfo">
-                    <i [ngClass]="[icons.questionCircle]"
-                       aria-hidden="true"></i>
-                  </button>
-                  <button class="btn btn-light"
-                          type="button"
-                          *ngIf="!editing"
-                          (click)="addErasureCodeProfile()">
-                    <i [ngClass]="[icons.add]"
-                       aria-hidden="true"></i>
-                  </button>
-                  <button class="btn btn-light"
-                          type="button"
-                          *ngIf="!editing"
-                          ngbTooltip="This profile can't be deleted as it is in use."
-                          i18n-ngbTooltip
-                          triggers="manual"
-                          #ecpDeletionBtn="ngbTooltip"
-                          (click)="deleteErasureCodeProfile()">
-                    <i [ngClass]="[icons.trash]"
-                       aria-hidden="true"></i>
-                  </button>
-                </span>
+                <button class="btn btn-light"
+                        [ngClass]="{'active': data.erasureInfo}"
+                        id="ecp-info-button"
+                        type="button"
+                        (click)="data.erasureInfo = !data.erasureInfo">
+                  <i [ngClass]="[icons.questionCircle]"
+                     aria-hidden="true"></i>
+                </button>
+                <button class="btn btn-light"
+                        type="button"
+                        *ngIf="!editing"
+                        (click)="addErasureCodeProfile()">
+                  <i [ngClass]="[icons.add]"
+                     aria-hidden="true"></i>
+                </button>
+                <button class="btn btn-light"
+                        type="button"
+                        *ngIf="!editing"
+                        ngbTooltip="This profile can't be deleted as it is in use."
+                        i18n-ngbTooltip
+                        triggers="manual"
+                        #ecpDeletionBtn="ngbTooltip"
+                        (click)="deleteErasureCodeProfile()">
+                  <i [ngClass]="[icons.trash]"
+                     aria-hidden="true"></i>
+                </button>
               </div>
               <span class="form-text text-muted"
                     id="ecp-info-block"
               </ng-template>
               <div *ngIf="current.rules.length > 0; else noRules">
                 <div class="input-group">
-                  <select class="form-control"
+                  <select class="form-select"
                           id="crushRule"
                           formControlName="crushRule"
                           name="crushSet">
                       {{ rule.rule_name }}
                     </option>
                   </select>
-                  <span class="input-group-append">
-                    <button class="btn btn-light"
-                            [ngClass]="{'active': data.crushInfo}"
-                            id="crush-info-button"
-                            type="button"
-                            ngbTooltip="Placement and
-                            replication strategies or distribution policies that allow to
-                            specify how CRUSH places data replicas."
-                            i18n-ngbTooltip
-                            (click)="data.crushInfo = !data.crushInfo">
-                      <i [ngClass]="[icons.questionCircle]"
-                         aria-hidden="true"></i>
-                    </button>
-                    <button class="btn btn-light"
-                            type="button"
-                            *ngIf="isReplicated && !editing"
-                            (click)="addCrushRule()">
-                      <i [ngClass]="[icons.add]"
-                         aria-hidden="true"></i>
-                    </button>
-                    <button class="btn btn-light"
-                            *ngIf="isReplicated && !editing"
-                            type="button"
-                            ngbTooltip="This rule can't be deleted as it is in use."
-                            i18n-ngbTooltip
-                            triggers="manual"
-                            #crushDeletionBtn="ngbTooltip"
-                            (click)="deleteCrushRule()">
-                      <i [ngClass]="[icons.trash]"
-                         aria-hidden="true"></i>
-                    </button>
-                  </span>
+                  <button class="btn btn-light"
+                          [ngClass]="{'active': data.crushInfo}"
+                          id="crush-info-button"
+                          type="button"
+                          ngbTooltip="Placement and
+                          replication strategies or distribution policies that allow to
+                          specify how CRUSH places data replicas."
+                          i18n-ngbTooltip
+                          (click)="data.crushInfo = !data.crushInfo">
+                    <i [ngClass]="[icons.questionCircle]"
+                       aria-hidden="true"></i>
+                  </button>
+                  <button class="btn btn-light"
+                          type="button"
+                          *ngIf="isReplicated && !editing"
+                          (click)="addCrushRule()">
+                    <i [ngClass]="[icons.add]"
+                       aria-hidden="true"></i>
+                  </button>
+                  <button class="btn btn-light"
+                          *ngIf="isReplicated && !editing"
+                          type="button"
+                          ngbTooltip="This rule can't be deleted as it is in use."
+                          i18n-ngbTooltip
+                          triggers="manual"
+                          #crushDeletionBtn="ngbTooltip"
+                          (click)="deleteCrushRule()">
+                    <i [ngClass]="[icons.trash]"
+                       aria-hidden="true"></i>
+                  </button>
                 </div>
 
                 <div class="form-text text-muted"
                    class="cd-col-form-label"
                    for="mode">Mode</label>
             <div class="cd-col-form-input">
-              <select class="form-control"
+              <select class="form-select"
                       id="mode"
                       name="mode"
                       formControlName="mode">
                      class="cd-col-form-label"
                      for="algorithm">Algorithm</label>
               <div class="cd-col-form-input">
-                <select class="form-control"
+                <select class="form-select"
                         id="algorithm"
                         name="algorithm"
                         formControlName="algorithm">
index 4d2bc5ff2e12d05f75727d21ab270e9bc67386ac..291a3a628bb3f0c518a594eba6d26df03d4ffbbf 100644 (file)
@@ -76,7 +76,7 @@
           <div class="cd-col-form-input">
             <select id="owner"
                     name="owner"
-                    class="form-control"
+                    class="form-select"
                     formControlName="owner"
                     [autofocus]="editing">
               <option i18n
               <select id="placement-target"
                       name="placement-target"
                       formControlName="placement-target"
-                      class="form-control">
+                      class="form-select">
                 <option i18n
                         *ngIf="placementTargets === null"
                         [ngValue]="null">Loading...</option>
                    for="lock_mode"
                    i18n>Mode</label>
             <div class="cd-col-form-input">
-              <select class="form-control"
+              <select class="form-select"
                       formControlName="lock_mode"
                       name="lock_mode"
                       id="lock_mode">
           <div class="form-group row">
             <div class="cd-col-form-offset">
               <div class="custom-control custom-checkbox">
-                <input class="custom-control-input"
+                <input class="form-check-input"
                        id="encryption_enabled"
                        name="encryption_enabled"
                        formControlName="encryption_enabled"
                        type="checkbox"
                        [attr.disabled]="!kmsVaultConfig && !s3VaultConfig ? true : null">
-                <label class="custom-control-label"
+                <label class="form-check-label"
                        for="encryption_enabled"
                        i18n>Encryption</label>
                 <cd-helper>
           <div *ngIf="bucketForm.getValue('encryption_enabled')">
             <div class="form-group row">
               <div class="cd-col-form-offset">
-                <div class="custom-control custom-radio custom-control-inline pl-5">
-                  <input class="custom-control-input"
+                <div class="custom-control custom-radio custom-control-inline ps-5">
+                  <input class="form-check-input"
                          formControlName="encryption_type"
                          id="sse_S3_enabled"
                          type="radio"
                          name="encryption_type"
                          value="AES256"
                          [attr.disabled]="!s3VaultConfig ? true : null">
-                  <label class="custom-control-label"
+                  <label class="form-control-label"
                          for="sse_S3_enabled"
                          i18n>SSE-S3 Encryption</label>
                 </div>
 
             <div class="form-group row">
               <div class="cd-col-form-offset">
-                <div class="custom-control custom-radio custom-control-inline pl-5">
-                  <input class="custom-control-input"
+                <div class="custom-control custom-radio custom-control-inline ps-5">
+                  <input class="form-check-input"
                          formControlName="encryption_type"
                          id="kms_enabled"
                          name="encryption_type"
                          value="aws:kms"
                          [attr.disabled]="!kmsVaultConfig ? true : null"
                          type="radio">
-                  <label class="custom-control-label"
+                  <label class="form-control-label"
                          for="kms_enabled"
                          i18n>Connect to an external key management service</label>
                 </div>
                 <div class="cd-col-form-input">
                   <select id="kms_provider"
                           name="kms_provider"
-                          class="form-control"
+                          class="form-select"
                           formControlName="kms_provider"
                           [autofocus]="editing">
                     <option i18n
index b991eb0ce34a90d7b0fbb7c2a2befc65211940f7..50d1a6e9e5d8ae9f4a81808126cedd6ad46fd9ac 100644 (file)
@@ -40,7 +40,7 @@
           <div class="cd-col-form-input">
             <select id="kms_provider"
                     name="kms_provider"
-                    class="form-control"
+                    class="form-select"
                     formControlName="kms_provider">
               <option i18n
                       *ngIf="kmsProviders !== null"
@@ -63,7 +63,7 @@
           <div class="cd-col-form-input">
             <select id="auth_method"
                     name="auth_method"
-                    class="form-control"
+                    class="form-select"
                     formControlName="auth_method">
               <option i18n
                       *ngIf="authMethods !== null"
@@ -86,7 +86,7 @@
           <div class="cd-col-form-input">
             <select id="secret_engine"
                     name="secret_engine"
-                    class="form-control"
+                    class="form-select"
                     formControlName="secret_engine">
               <option i18n
                       *ngIf="secretEngines !== null"
index 8276e01e7c4bf30af6c67cc12d385e7665556fcb..d94e2b94497e1b0cdad710c644592fea3c5203a6 100644 (file)
@@ -21,7 +21,7 @@
                    [readonly]="true"
                    formControlName="type">
             <select id="type"
-                    class="form-control"
+                    class="form-select"
                     formControlName="type"
                     *ngIf="!editing"
                     autofocus>
@@ -44,7 +44,7 @@
                  i18n>Permission</label>
           <div class="cd-col-form-input">
             <select id="perm"
-                    class="form-control"
+                    class="form-select"
                     formControlName="perm">
               <option i18n
                       [ngValue]="null">-- Select a permission --</option>
index 6c00f37d42d8387a4c8932a94fa7c25fb0479ed5..a1c72c8481484c9e904be249f9aeda36e65d033d 100644 (file)
                  for="max_buckets_mode"
                  i18n>Max. buckets</label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     formControlName="max_buckets_mode"
                     name="max_buckets_mode"
                     id="max_buckets_mode"
                        class="form-control"
                        type="password"
                        formControlName="access_key">
-                <span class="input-group-append">
-                  <button type="button"
-                          class="btn btn-light"
-                          cdPasswordButton="access_key">
-                  </button>
-                  <cd-copy-2-clipboard-button source="access_key">
-                  </cd-copy-2-clipboard-button>
-                </span>
+                <button type="button"
+                        class="btn btn-light"
+                        cdPasswordButton="access_key">
+                </button>
+                <cd-copy-2-clipboard-button source="access_key">
+                </cd-copy-2-clipboard-button>
               </div>
               <span class="invalid-feedback"
                     *ngIf="userForm.showError('access_key', frm, 'required')"
                        class="form-control"
                        type="password"
                        formControlName="secret_key">
-                <span class="input-group-append">
-                  <button type="button"
-                          class="btn btn-light"
-                          cdPasswordButton="secret_key">
-                  </button>
-                  <cd-copy-2-clipboard-button source="secret_key">
-                  </cd-copy-2-clipboard-button>
-                </span>
+                <button type="button"
+                        class="btn btn-light"
+                        cdPasswordButton="secret_key">
+                </button>
+                <cd-copy-2-clipboard-button source="secret_key">
+                </cd-copy-2-clipboard-button>
               </div>
               <span class="invalid-feedback"
                     *ngIf="userForm.showError('secret_key', frm, 'required')"
 
               <span *ngFor="let subuser of subusers; let i=index;">
                 <div class="input-group">
-                  <div class="input-group-prepend">
-                    <span class="input-group-text">
-                      <i class="{{ icons.user }}"></i>
-                    </span>
-                  </div>
+                  <span class="input-group-text">
+                    <i class="{{ icons.user }}"></i>
+                  </span>
                   <input type="text"
                          class="cd-form-control"
                          value="{{ subuser.id }}"
                          readonly>
-                  <div class="input-group-prepend border-left-0 border-right-0">
-                    <span class="input-group-text">
-                      <i class="{{ icons.share }}"></i>
-                    </span>
-                  </div>
+                  <span class="input-group-text">
+                    <i class="{{ icons.share }}"></i>
+                  </span>
                   <input type="text"
                          class="cd-form-control"
                          value="{{ ('full-control' === subuser.permissions) ? 'full' : subuser.permissions }}"
                          readonly>
-                  <span class="input-group-append">
-                    <button type="button"
-                            class="btn btn-light tc_showSubuserButton"
-                            i18n-ngbTooltip
-                            ngbTooltip="Edit"
-                            (click)="showSubuserModal(i)">
-                      <i [ngClass]="[icons.edit]"></i>
-                    </button>
-                    <button type="button"
-                            class="btn btn-light tc_deleteSubuserButton"
-                            i18n-ngbTooltip
-                            ngbTooltip="Delete"
-                            (click)="deleteSubuser(i)">
-                      <i [ngClass]="[icons.destroy]"></i>
-                    </button>
-                  </span>
+                  <button type="button"
+                          class="btn btn-light tc_showSubuserButton"
+                          i18n-ngbTooltip
+                          ngbTooltip="Edit"
+                          (click)="showSubuserModal(i)">
+                    <i [ngClass]="[icons.edit]"></i>
+                  </button>
+                  <button type="button"
+                          class="btn btn-light tc_deleteSubuserButton"
+                          i18n-ngbTooltip
+                          ngbTooltip="Delete"
+                          (click)="deleteSubuser(i)">
+                    <i [ngClass]="[icons.destroy]"></i>
+                  </button>
                 </div>
                 <span class="form-text text-muted"></span>
               </span>
 
-              <div class="row">
+              <div class="row my-2">
                 <div class="col-12">
                   <button type="button"
-                          class="btn btn-light float-right tc_addSubuserButton"
+                          class="btn btn-light float-end tc_addSubuserButton"
                           (click)="showSubuserModal()">
                     <i [ngClass]="[icons.add]"></i>
                     <ng-container i18n>{{ actionLabels.CREATE | titlecase }}
 
               <span *ngFor="let key of s3Keys; let i=index;">
                 <div class="input-group">
-                  <div class="input-group-prepend">
-                    <div class="input-group-text">
-                      <i class="{{ icons.key }}"></i>
-                    </div>
+                  <div class="input-group-text">
+                    <i class="{{ icons.key }}"></i>
                   </div>
                   <input type="text"
                          class="cd-form-control"
                          value="{{ key.user }}"
                          readonly>
-                  <span class="input-group-append">
-                    <button type="button"
-                            class="btn btn-light tc_showS3KeyButton"
-                            i18n-ngbTooltip
-                            ngbTooltip="Show"
-                            (click)="showS3KeyModal(i)">
-                      <i [ngClass]="[icons.show]"></i>
-                    </button>
-                    <button type="button"
-                            class="btn btn-light tc_deleteS3KeyButton"
-                            i18n-ngbTooltip
-                            ngbTooltip="Delete"
-                            (click)="deleteS3Key(i)">
-                      <i [ngClass]="[icons.destroy]"></i>
-                    </button>
-                  </span>
+                  <button type="button"
+                          class="btn btn-light tc_showS3KeyButton"
+                          i18n-ngbTooltip
+                          ngbTooltip="Show"
+                          (click)="showS3KeyModal(i)">
+                    <i [ngClass]="[icons.show]"></i>
+                  </button>
+                  <button type="button"
+                          class="btn btn-light tc_deleteS3KeyButton"
+                          i18n-ngbTooltip
+                          ngbTooltip="Delete"
+                          (click)="deleteS3Key(i)">
+                    <i [ngClass]="[icons.destroy]"></i>
+                  </button>
                 </div>
                 <span class="form-text text-muted"></span>
               </span>
 
-              <div class="row">
+              <div class="row my-2">
                 <div class="col-12">
                   <button type="button"
-                          class="btn btn-light float-right tc_addS3KeyButton"
+                          class="btn btn-light float-end tc_addS3KeyButton"
                           (click)="showS3KeyModal()">
                     <i [ngClass]="[icons.add]"></i>
                     <ng-container i18n>{{ actionLabels.CREATE | titlecase }}
 
               <span *ngFor="let key of swiftKeys; let i=index;">
                 <div class="input-group">
-                  <div class="input-group-prepend">
-                    <span class="input-group-text">
-                      <i class="{{ icons.key }}"></i>
-                    </span>
-                  </div>
+                  <span class="input-group-text">
+                    <i class="{{ icons.key }}"></i>
+                  </span>
                   <input type="text"
                          class="cd-form-control"
                          value="{{ key.user }}"
                          readonly>
-                  <span class="input-group-append">
-                    <button type="button"
-                            class="btn btn-light tc_showSwiftKeyButton"
-                            i18n-ngbTooltip
-                            ngbTooltip="Show"
-                            (click)="showSwiftKeyModal(i)">
-                      <i [ngClass]="[icons.show]"></i>
-                    </button>
-                  </span>
+                  <button type="button"
+                          class="btn btn-light tc_showSwiftKeyButton"
+                          i18n-ngbTooltip
+                          ngbTooltip="Show"
+                          (click)="showSwiftKeyModal(i)">
+                    <i [ngClass]="[icons.show]"></i>
+                  </button>
                 </div>
                 <span class="form-text text-muted"></span>
               </span>
 
               <span *ngFor="let cap of capabilities; let i=index;">
                 <div class="input-group">
-                  <span class="input-group-prepend">
-                    <div class="input-group-text">
-                      <i class="{{ icons.share }}"></i>
-                    </div>
-                  </span>
+                  <div class="input-group-text">
+                    <i class="{{ icons.share }}"></i>
+                  </div>
                   <input type="text"
                          class="cd-form-control"
                          value="{{ cap.type }}:{{ cap.perm }}"
                          readonly>
-                  <span class="input-group-append">
-                    <button type="button"
-                            class="btn btn-light tc_editCapButton"
-                            i18n-ngbTooltip
-                            ngbTooltip="Edit"
-                            (click)="showCapabilityModal(i)">
-                      <i [ngClass]="[icons.edit]"></i>
-                    </button>
-                    <button type="button"
-                            class="btn btn-light tc_deleteCapButton"
-                            i18n-ngbTooltip
-                            ngbTooltip="Delete"
-                            (click)="deleteCapability(i)">
-                      <i [ngClass]="[icons.destroy]"></i>
-                    </button>
-                  </span>
+                  <button type="button"
+                          class="btn btn-light tc_editCapButton"
+                          i18n-ngbTooltip
+                          ngbTooltip="Edit"
+                          (click)="showCapabilityModal(i)">
+                    <i [ngClass]="[icons.edit]"></i>
+                  </button>
+                  <button type="button"
+                          class="btn btn-light tc_deleteCapButton"
+                          i18n-ngbTooltip
+                          ngbTooltip="Delete"
+                          (click)="deleteCapability(i)">
+                    <i [ngClass]="[icons.destroy]"></i>
+                  </button>
                 </div>
                 <span class="form-text text-muted"></span>
               </span>
 
-              <div class="row">
+              <div class="row my-2">
                 <div class="col-12">
                   <button type="button"
-                          class="btn btn-light float-right tc_addCapButton"
+                          class="btn btn-light float-end tc_addCapButton"
                           [disabled]="capabilities | pipeFunction:hasAllCapabilities"
                           i18n-ngbTooltip
                           ngbTooltip="All capabilities are already added."
index 6ec8978af966a6d4d4852b4dd477a98cb7b08592..3dc7de71aae795b3f1fd272e43a281e63facbe1f 100644 (file)
                      type="password"
                      [readonly]="viewing"
                      formControlName="access_key">
-              <span class="input-group-append">
-                <button type="button"
-                        class="btn btn-light"
-                        cdPasswordButton="access_key">
-                </button>
-                <cd-copy-2-clipboard-button source="access_key">
-                </cd-copy-2-clipboard-button>
-              </span>
+              <button type="button"
+                      class="btn btn-light"
+                      cdPasswordButton="access_key">
+              </button>
+              <cd-copy-2-clipboard-button source="access_key">
+              </cd-copy-2-clipboard-button>
             </div>
             <span class="invalid-feedback"
                   *ngIf="formGroup.showError('access_key', frm, 'required')"
                      type="password"
                      [readonly]="viewing"
                      formControlName="secret_key">
-              <span class="input-group-append">
-                <button type="button"
-                        class="btn btn-light"
-                        cdPasswordButton="secret_key">
-                </button>
-                <cd-copy-2-clipboard-button source="secret_key">
-                </cd-copy-2-clipboard-button>
-              </span>
+              <button type="button"
+                      class="btn btn-light"
+                      cdPasswordButton="secret_key">
+              </button>
+              <cd-copy-2-clipboard-button source="secret_key">
+              </cd-copy-2-clipboard-button>
             </div>
             <span class="invalid-feedback"
                   *ngIf="formGroup.showError('secret_key', frm, 'required')"
index 4fb03f019c6c990ec950a078f33652ed7bd46cbe..e04dc4cd551323f7b440f2edabc63071e13c8c05 100644 (file)
@@ -50,7 +50,7 @@
                  i18n>Permission</label>
           <div class="cd-col-form-input">
             <select id="perm"
-                    class="form-control"
+                    class="form-select"
                     formControlName="perm">
               <option i18n
                       [ngValue]="null">-- Select a permission --</option>
                        class="form-control"
                        type="password"
                        formControlName="secret_key">
-                <span class="input-group-append">
-                  <button type="button"
-                          class="btn btn-light"
-                          cdPasswordButton="secret_key">
-                  </button>
-                  <cd-copy-2-clipboard-button source="secret_key">
-                  </cd-copy-2-clipboard-button>
-                </span>
+                <button type="button"
+                        class="btn btn-light"
+                        cdPasswordButton="secret_key">
+                </button>
+                <cd-copy-2-clipboard-button source="secret_key">
+                </cd-copy-2-clipboard-button>
               </div>
               <span class="invalid-feedback"
                     *ngIf="formGroup.showError('secret_key', frm, 'required')"
index 00f3cf0f249dc2e6586616ad17031a00e252bc4c..ee64fc8a15c2f38f5e6271e4cacd9e4c5dde68b6 100644 (file)
                      type="password"
                      [(ngModel)]="secret_key"
                      [readonly]="true">
-              <span class="input-group-append">
-                <button type="button"
-                        class="btn btn-light"
-                        cdPasswordButton="secret_key">
-                </button>
-                <cd-copy-2-clipboard-button source="secret_key">
-                </cd-copy-2-clipboard-button>
-              </span>
+              <button type="button"
+                      class="btn btn-light"
+                      cdPasswordButton="secret_key">
+              </button>
+              <cd-copy-2-clipboard-button source="secret_key">
+              </cd-copy-2-clipboard-button>
             </div>
           </div>
         </div>
index bee1495931c99287f61f4723a8d613c90235f247..46c825419185d710308717e9d7e9816ebed825ab 100644 (file)
@@ -32,7 +32,7 @@
 <ng-template #readableDaemons
              let-daemons="daemons">
   <ng-container *ngFor="let daemon of daemons">
-    <cd-label class="mr-1"
+    <cd-label class="me-1"
               [value]="daemon"></cd-label>
   </ng-container>
 </ng-template>
index 72e2919814b2ac3412d25566748d8b5a12a88279..88ef32507a452324da969d2d4d318146fd83374c 100644 (file)
@@ -12,7 +12,7 @@
                         i18n>Feedback module is not enabled. Please enable it from <a (click)="redirect()">Cluster-> Manager Modules.</a>
         </cd-alert-panel>
         <!-- api_key -->
-        <div class="form-group row"
+        <div class="form-group row mt-3"
              *ngIf="!isAPIKeySet">
           <label class="cd-col-form-label required"
                  for="api_key"
index 2dc30df52e613dfaae7a951ca3a4b446c3526af2..4974611413728fadf9c0e76429afc737055703f6 100755 (executable)
                formControlName="oldpassword"
                autocomplete="new-password"
                autofocus>
-        <span class="input-group-append">
-          <button class="btn btn-outline-light btn-password"
-                  cdPasswordButton="oldpassword">
-          </button>
-        </span>
+        <button class="btn btn-outline-light btn-password"
+                cdPasswordButton="oldpassword">
+        </button>
       </div>
       <span class="invalid-feedback"
             *ngIf="userForm.showError('oldpassword', frm, 'required')"
                id="newpassword"
                autocomplete="new-password"
                formControlName="newpassword">
-        <span class="input-group-append">
-          <button type="button"
-                  class="btn btn-outline-light btn-password"
-                  cdPasswordButton="newpassword">
-          </button>
-        </span>
+        <button type="button"
+                class="btn btn-outline-light btn-password"
+                cdPasswordButton="newpassword">
+        </button>
       </div>
       <div class="password-strength-level">
         <div class="{{ passwordStrengthLevelClass }}"
                placeholder="Confirm new password..."
                id="confirmnewpassword"
                formControlName="confirmnewpassword">
-        <span class="input-group-append">
-          <button class="btn btn-outline-light btn-password"
-                  cdPasswordButton="confirmnewpassword">
-          </button>
-        </span>
+        <button class="btn btn-outline-light btn-password"
+                cdPasswordButton="confirmnewpassword">
+        </button>
       </div>
       <span class="invalid-feedback"
             *ngIf="userForm.showError('confirmnewpassword', frm, 'required')"
index 5049bd4f4dabe30e2f25e8f4dd6c8231689b5c48..0fafe12f8274973b7ab90bd2e0402ccfcba31407 100644 (file)
@@ -8,7 +8,7 @@
 
     <!-- Username -->
     <div class="form-group has-feedback d-flex flex-column py-3">
-      <label class="placeholder pl-4"
+      <label class="placeholder ps-3"
              for="username"
              i18n>Username</label>
       <input id="username"
              type="text"
              [attr.aria-invalid]="username.invalid"
              aria-labelledby="username"
-             class="form-control pl-4"
+             class="form-control ps-3"
              required
              autofocus>
-      <div class="invalid-feedback pl-4"
+      <div class="invalid-feedback ps-3"
            *ngIf="(loginForm.submitted || username.dirty) && username.invalid"
            i18n>Username is required</div>
     </div>
@@ -31,7 +31,7 @@
          id="password-div">
       <div class="input-group d-flex flex-nowrap">
         <div class="d-flex flex-column flex-grow-1 py-3">
-          <label class="placeholder pl-4"
+          <label class="placeholder ps-3"
                  for="password"
                  i18n>Password</label>
           <input id="password"
@@ -41,9 +41,9 @@
                  type="password"
                  [attr.aria-invalid]="password.invalid"
                  aria-labelledby="password"
-                 class="form-control pl-4"
+                 class="form-control ps-3"
                  required>
-          <div class="invalid-feedback pl-4"
+          <div class="invalid-feedback ps-3"
                *ngIf="(loginForm.submitted || password.dirty) && password.invalid"
                i18n>Password is required</div>
         </div>
index df97face81a3f215f2f02669375975ef2ab6668f..ddb0e6ab8aeb6bb1f22b3eae43283a98c71ab19b 100644 (file)
                      name="password"
                      autocomplete="new-password"
                      formControlName="password">
-              <span class="input-group-append">
-                <button type="button"
-                        class="btn btn-light"
-                        cdPasswordButton="password">
-                </button>
-              </span>
+              <button type="button"
+                      class="btn btn-light"
+                      cdPasswordButton="password">
+              </button>
             </div>
             <div class="password-strength-level">
               <div class="{{ passwordStrengthLevelClass }}"
                      name="confirmpassword"
                      autocomplete="new-password"
                      formControlName="confirmpassword">
-              <span class="input-group-append">
-                <button type="button"
-                        class="btn btn-light"
-                        cdPasswordButton="confirmpassword">
-                </button>
-              </span>
+              <button type="button"
+                      class="btn btn-light"
+                      cdPasswordButton="confirmpassword">
+              </button>
               <span class="invalid-feedback"
                     *ngIf="userForm.showError('confirmpassword', formDir, 'match')"
                     i18n>Password confirmation doesn't match the password.</span>
                      #p="ngbPopover"
                      (click)="p.open()"
                      (keypress)="p.close()">
-              <span class="input-group-append">
-                <button type="button"
-                        class="btn btn-light"
-                        (click)="clearExpirationDate()">
-                  <i class="icon-prepend {{ icons.destroy }}"></i>
-                </button>
-              </span>
+              <button type="button"
+                      class="btn btn-light"
+                      (click)="clearExpirationDate()">
+                <i class="icon-prepend {{ icons.destroy }}"></i>
+              </button>
               <span class="invalid-feedback"
                     *ngIf="userForm.showError('pwdExpirationDate', formDir, 'required')"
                     i18n>This field is required.</span>
index 83eb409446e0c11f6a8b8fce58cd5556f74580b7..e09907aeb85d81865799953b8aae112e217d3a58 100644 (file)
                      formControlName="oldpassword"
                      autocomplete="new-password"
                      autofocus>
-              <span class="input-group-append">
-                <button class="btn btn-light"
-                        cdPasswordButton="oldpassword">
-                </button>
-              </span>
+              <button class="btn btn-light"
+                      cdPasswordButton="oldpassword">
+              </button>
             </div>
             <span class="invalid-feedback"
                   *ngIf="userForm.showError('oldpassword', frm, 'required')"
                      id="newpassword"
                      autocomplete="new-password"
                      formControlName="newpassword">
-              <span class="input-group-append">
-                <button type="button"
-                        class="btn btn-light"
-                        cdPasswordButton="newpassword">
-                </button>
-              </span>
+              <button type="button"
+                      class="btn btn-light"
+                      cdPasswordButton="newpassword">
+              </button>
             </div>
             <div class="password-strength-level">
               <div class="{{ passwordStrengthLevelClass }}"
                      placeholder="Confirm new password..."
                      id="confirmnewpassword"
                      formControlName="confirmnewpassword">
-              <span class="input-group-append">
-                <button class="btn btn-light"
-                        cdPasswordButton="confirmnewpassword">
-                </button>
-              </span>
+              <button class="btn btn-light"
+                      cdPasswordButton="confirmnewpassword">
+              </button>
             </div>
             <span class="invalid-feedback"
                   *ngIf="userForm.showError('confirmnewpassword', frm, 'required')"
index 63af29e13592891a365b9ceace0b6a2d00e76be0..f04a96b88cfdb62e188dc5616ce4419fec487858 100644 (file)
@@ -1,11 +1,11 @@
 <ng-container *ngIf="{ ftMap: featureToggleMap$ | async, daemons: rgwDaemonService.daemons$ | async, selectedDaemon: rgwDaemonService.selectedDaemon$ | async } as data">
   <ng-container *ngIf="data.ftMap && data.ftMap.rgw && permissions.rgw.read && isRgwRoute && data.daemons.length > 1">
     <div class="cd-context-bar pt-3 pb-3">
-      <span class="mr-1"
+      <span class="me-1"
             i18n>Selected Object Gateway:</span>
       <div ngbDropdown
            placement="bottom-left"
-           class="d-inline-block ml-2">
+           class="d-inline-block ms-2">
         <button ngbDropdownToggle
                 class="btn btn-outline-info ctx-bar-selected-rgw-daemon"
                 i18n-title
index d5c9f73ec52f828d5952ba12caf40fa34417721b..aa272ffae55a785245fbe594809e12ed782a4bb5 100644 (file)
@@ -32,7 +32,7 @@
 
   .list-inline {
     margin-bottom: 0;
-    margin-left: 20%;
+    margin-left: 17%;
   }
 
   a {
index fdf4d95cfdd1e62cc69ddd5d19946cc68c49da24..80445be57e3673ad8682054888638616471f01db 100644 (file)
@@ -1,10 +1,9 @@
 <div class="about-container">
   <div class="modal-header">
     <button type="button"
-            class="close float-right"
+            class="btn-close float-end"
             aria-label="Close"
             (click)="activeModal.close()">
-      <span aria-hidden="true">&times;</span>
     </button>
   </div>
   <div class="modal-body">
index 9739c738558671d1595badb36172994ed7d0dafb..aa2903e19d3070a31da6c3b2dddb2ff7ab3838ba 100644 (file)
   </a>
   <div ngbDropdownMenu>
     <a ngbDropdownItem
+       class="nav-link text-capitalize"
        [ngClass]="{'disabled': !docsUrl}"
-       class="text-capitalize"
        href="{{ docsUrl }}"
        target="_blank"
        i18n>documentation</a>
-    <a ngbDropdownItem
-       routerLink="/api-docs"
-       target="_blank"
-       i18n>API</a>
+    <button ngbDropdownItem
+            routerLink="/api-docs"
+            target="_blank"
+            i18n>API</button>
     <button ngbDropdownItem
             (click)="openAboutModal()"
             i18n>About</button>
index 4ba0a2713ecd8b0af8f52436802d83ff65d817b1..47b569fbc06400458a9c72d3741c3a439503090f 100644 (file)
@@ -5,14 +5,14 @@
   <cd-notifications-sidebar></cd-notifications-sidebar>
   <div class="cd-navbar-top">
     <nav class="navbar navbar-expand-md navbar-dark cd-navbar-brand">
-      <button class="btn btn-link py-0"
+      <button class="btn btn-link py-0 ms-3"
               (click)="showMenuSidebar = !showMenuSidebar"
               aria-label="toggle sidebar visibility">
         <i class="fa fa-bars fa-2x"
            aria-hidden="true"></i>
       </button>
 
-      <a class="navbar-brand ml-2"
+      <a class="navbar-brand ms-2"
          href="#">
         <img src="assets/Ceph_Ceph_Logo_with_text_white.svg"
              alt="Ceph" />
             <a routerLink="/monitoring">
               <ng-container i18n>Monitoring</ng-container>
               <small *ngIf="prometheusAlertService.activeCriticalAlerts > 0"
-                     class="badge badge-danger ml-1">{{ prometheusAlertService.activeCriticalAlerts }}</small>
+                     class="badge badge-danger ms-1">{{ prometheusAlertService.activeCriticalAlerts }}</small>
               <small *ngIf="prometheusAlertService.activeWarningAlerts > 0"
-                     class="badge badge-warning ml-1">{{ prometheusAlertService.activeWarningAlerts }}</small>
+                     class="badge badge-warning ms-1">{{ prometheusAlertService.activeWarningAlerts }}</small>
             </a>
           </li>
         </ul>
index 695fddee8358f6d32c598bc9a2435a8b4526cfa8..fc12d8f49a8e7bf6e030a24337a0da391cee9e62 100644 (file)
@@ -221,6 +221,7 @@ $sidebar-width: 200px;
       content: '\f054';
       font-family: 'ForkAwesome';
       font-size: 1rem;
+      margin-top: 2px;
       position: absolute;
       right: 20px;
       transition: transform 0.3s ease-in-out;
index 0b0f87957a93ef4025c56ecf48842817aab38400..9c88b5b713538b4ec315bd7a5762403fda1a58c1 100644 (file)
                  [placeholder]="option.additionalTypeInfo.humanReadable"
                  [formControlName]="option.name"
                  [step]="getStep(option.type, optionsForm.getValue(option.name))">
-          <div class="input-group-append"
-               *ngIf="optionsFormShowReset">
-            <button class="btn btn-light"
-                    type="button"
-                    data-toggle="button"
-                    title="Remove the custom configuration value. The default configuration will be inherited and used instead."
-                    (click)="resetValue(option.name)"
-                    i18n-title>
-              <i [ngClass]="[icons.erase]"
-                 aria-hidden="true"></i>
-            </button>
-          </div>
+          <button class="btn btn-light"
+                  type="button"
+                  data-toggle="button"
+                  title="Remove the custom configuration value. The default configuration will be inherited and used instead."
+                  (click)="resetValue(option.name)"
+                  i18n-title
+                  *ngIf="optionsFormShowReset">
+            <i [ngClass]="[icons.erase]"
+               aria-hidden="true"></i>
+          </button>
         </div>
         <span class="invalid-feedback"
               *ngIf="optionsForm.showError(option.name, optionsFormDir, 'pattern')">
index 47fca49c7e8ade7e0a57656005b83a93448619f4..d24e06ee1a56521d4327cf700633e9eeeb852d3f 100755 (executable)
@@ -32,7 +32,7 @@
                      [formControlName]="field.name"
                      cdDimlessBinary>
               <select *ngIf="field.type === 'select'"
-                      class="form-control"
+                      class="form-select"
                       [id]="field.name"
                       [formControlName]="field.name">
                 <option *ngIf="field?.typeConfig?.placeholder"
index ba5f4c3c70769a1defef272b293be494c086bbd6..6191bac3bcfe289ca6f55365c0d594be890b9fc7 100644 (file)
   <cd-doc section="grafana"></cd-doc> on how to add dashboards to Grafana.</cd-alert-panel>
 
 <ng-container *ngIf="grafanaExist && dashboardExist">
-  <div class="row">
-    <div class="col">
-      <div class="form-inline timepicker">
+  <div class="row mb-3">
+    <div class="col-lg-4 d-flex">
+      <div class="col-md-3 timepicker">
         <label for="timepicker"
-               class="ml-1 my-1"
-               i18n>Grafana Time Picker</label>
-
+               class="mt-2"
+               i18n>Grafana Time Picker</label></div>
+        <div class="col-md-4">
         <select id="timepicker"
                 name="timepicker"
-                class="custom-select my-1 mx-3"
+                class="form-select"
                 [(ngModel)]="time"
                 (ngModelChange)="onTimepickerChange($event)">
           <option *ngFor="let key of grafanaTimes"
                   [ngValue]="key.value">{{ key.name }}
           </option>
-        </select>
+        </select></div>
+        <div class="col-md-3">
 
-        <button class="btn btn-light my-1"
+        <button class="btn btn-light ms-3"
                 i18n-title
                 title="Reset Settings"
                 (click)="reset()">
           <i [ngClass]="[icons.undo]"></i>
         </button>
-        <button class="btn btn-light my-1 ml-3"
+        <button class="btn btn-light ms-3"
                 i18n-title
                 title="Show hidden information"
                 (click)="showMessage = !showMessage">
@@ -47,7 +48,7 @@
   </div>
 
   <div class="row">
-    <div class="col my-3"
+    <div class="col my-2"
          *ngIf="showMessage">
       <cd-alert-panel type="info"
                       class="mb-3"
index f7bc12b5be8b24c478779ac3e1cc6a37351f25a1..20ab7c80a67ed09c539d29a53992254387899cad 100644 (file)
@@ -4,7 +4,7 @@
   </div>
   <ng-content></ng-content>
 </ng-template>
-<i [ngClass]="[icons.questionCircle]"
+<i [ngClass]="iconClass ? iconClass : [icons.questionCircle]"
    aria-hidden="true"
    [ngbPopover]="popoverTpl"
    (click)="$event.preventDefault();">
index 0028945ba6ca0fbbc958d008ce413212b3b8e8e3..84d1639b16f0dfbe4637ffa551b649f02ee08662 100644 (file)
@@ -11,6 +11,9 @@ export class HelperComponent {
   @Input()
   class: string;
 
+  @Input()
+  iconClass = '';
+
   @Input()
   html: any;
 
index 35726cfbd9986aa123c26dc52964139f953e8735..c2a1b8842b59a4960ecb3de19b00611646172023 100644 (file)
@@ -3,7 +3,7 @@
   <strong>
     <i [ngClass]="[icons.spinner, icons.spin]"
        aria-hidden="true"
-       class="mr-2"></i>
+       class="me-2"></i>
   </strong>
   <ng-content></ng-content>
 </ngb-alert>
index 657e0d6053f89fbc5b2bf94dccb26a0746b4cb4d..f9a328666d54eab907e2f83cc52e8b7638f05352 100644 (file)
@@ -2,14 +2,13 @@
   <div [ngClass]="pageURL ? 'modal-dialog' : ''">
     <div class="modal-content">
       <div class="modal-header">
-        <h4 class="modal-title float-left">
+        <h4 class="modal-title float-start">
           <ng-content select=".modal-title"></ng-content>
         </h4>
         <button type="button"
-                class="close float-right"
+                class="btn-close float-end"
                 aria-label="Close"
                 (click)="close()">
-          <span aria-hidden="true">&times;</span>
         </button>
       </div>
 
index 4c42217c23295e2ffccf4569edb8d6b466b68719..1a115e533bc31a5612cb84664a3dff89a5ec85af 100644 (file)
             </div>
 
             <p class="card-text text-muted">
-              <small class="date float-left">
+              <small class="date float-start">
                 {{ executingTask.begin_time | cdDate }}
               </small>
 
-              <span class="float-right">
+              <span class="float-end">
                 {{ executingTask.progress || 0 }} %
               </span>
             </p>
           </div>
           <div class="col-md-10">
             <div class="card-body p-1">
-              <button class="btn btn-link float-right mt-0 pt-0"
+              <button class="btn btn-link float-end mt-0 pt-0"
                       title="Remove notification"
                       i18n-title
                       (click)="remove(i); $event.stopPropagation()">
                 <i [ngClass]="[icons.trash]"></i>
               </button>
               <button *ngIf="notification.application == 'Prometheus' && notification.type != 2 && !notification.alertSilenced"
-                      class="btn btn-link float-right text-muted mute"
+                      class="btn btn-link float-end text-muted mute m-0 p-0"
                       title="Silence Alert"
                       i18n-title
                       (click)="silence(notification)">
                 <i [ngClass]="[icons.mute]"></i>
               </button>
               <button *ngIf="notification.application == 'Prometheus' && notification.type != 2 && notification.alertSilenced"
-                      class="btn btn-link float-right text-muted mute"
+                      class="btn btn-link float-end text-muted mute m-0 p-0"
                       title="Expire Silence"
                       i18n-title
                       (click)="expire(notification)">
@@ -99,7 +99,7 @@
                 </ng-container>
                 <small class="date"
                        [title]="notification.timestamp | cdDate">{{ notification.timestamp | relativeDate }}</small>
-                <i class="float-right custom-icon"
+                <i class="float-end custom-icon"
                    [ngClass]="[notification.applicationClass]"
                    [title]="notification.application"></i>
               </p>
   <div class="card-header">
     <ng-container i18n>Tasks and Notifications</ng-container>
 
-    <button class="close float-right"
+    <button class="btn-close float-end"
             tabindex="-1"
             type="button"
             title="close"
             (click)="closeSidebar()">
-      <span>
-        <i [ngClass]="icons.close"></i>
-      </span>
     </button>
   </div>
 
index d33fc9af806bad6ecfc09acee83a2f3a33e9ed0a..08f00e2a16f7ecd55a3ab9ebd6faa78dd6d92cee 100644 (file)
@@ -1,19 +1,19 @@
 <div class="container-fluid">
   <div class="row">
-    <div class="col d-flex justify-content-end">
-      <form class="form-inline">
+    <form>
+      <div class="col-sm-1 d-flex float-end">
         <label for="refreshInterval"
-               class="col-form-label my-0 mx-2"
+               class="col-form-label my-0 mx-2 float-end"
                i18n>Refresh</label>
         <select id="refreshInterval"
                 name="refreshInterval"
-                class="form-control"
+                class="form-select float-end"
                 (change)="changeRefreshInterval($event.target.value)"
                 [(ngModel)]="selectedInterval">
           <option *ngFor="let key of intervalKeys"
                   [value]="intervalList[key]">{{ key }}</option>
         </select>
-      </form>
-    </div>
+      </div>
+    </form>
   </div>
 </div>
index 0f23aee87aa3fc7680fbbc3992e8f6f7d6a724ec..5351000836f7d16f10fe1787a23ecd3440ae2d3e 100644 (file)
@@ -5,14 +5,14 @@
            [selectionLimit]="selectionLimit"
            [customBadges]="customBadges"
            [customBadgeValidators]="customBadgeValidators"
-           elemClass="mr-2 select-menu-edit"
+           elemClass="me-2 select-menu-edit"
            (selection)="selection.emit($event)">
   <i [ngClass]="[icons.edit]"></i>
 </cd-select>
 
 <span *ngFor="let dataItem of data">
-  <span class="badge badge-dark mr-2">
-    <span class="mr-2">{{ dataItem }}</span>
+  <span class="badge badge-dark me-2">
+    <span class="me-2">{{ dataItem }}</span>
     <a class="badge-remove"
        (click)="cdSelect.removeItem(dataItem)">
       <i [ngClass]="[icons.destroy]"
index 1533b94395eb457a3c112e1335642487585d1202..d93684068fc129877131d9809c405c58d63172ed 100644 (file)
@@ -60,7 +60,7 @@
   </div>
 </ng-template>
 
-<a class="select-menu-edit float-left"
+<a class="select-menu-edit float-start"
    [ngClass]="elemClass"
    [ngbPopover]="popTemplate"
    data-testid="select-menu-edit"
   <ng-content></ng-content>
 </a>
 
-<span class="form-text text-muted float-left"
+<span class="form-text text-muted float-start"
       *ngIf="data.length === 0 && !(!customBadges && options.length === 0)">
   {{ messages.empty }}
 </span>
 
-<span class="form-text text-muted  float-left"
+<span class="form-text text-muted  float-start"
       *ngIf="!customBadges && options.length === 0">
   {{ messages.noOptions }}
 </span>
index b73f0ad3973a6523bd0b3a19add425086fffb126..fc7b9f6e54ea291b86d3410521a8621dc6a6a1a9 100644 (file)
     <!-- search -->
     <div class="input-group search"
          *ngIf="searchField">
-      <span class="input-group-prepend">
-        <span class="input-group-text">
-          <i [ngClass]="[icons.search]"></i>
-        </span>
+      <span class="input-group-text">
+        <i [ngClass]="[icons.search]"></i>
       </span>
       <input aria-label="search"
              class="form-control"
              type="text"
              [(ngModel)]="search"
              (keyup)="updateFilter()">
-      <div class="input-group-append">
-        <button type="button"
-                class="btn btn-light"
-                title="Clear"
-                (click)="onClearSearch()">
-          <i class="icon-prepend {{ icons.destroy }}"></i>
-        </button>
-      </div>
+      <button type="button"
+              class="btn btn-light"
+              title="Clear"
+              (click)="onClearSearch()">
+        <i class="icon-prepend {{ icons.destroy }}"></i>
+      </button>
     </div>
     <!-- end search -->
 
     <div class="filter-chips">
       <span *ngFor="let filter of columnFilters">
         <span *ngIf="filter.value"
-              class="badge badge-info mr-2">
-          <span class="mr-2">{{ filter.column.name }}: {{ filter.value.formatted }}</span>
+              class="badge badge-info me-2">
+          <span class="me-2">{{ filter.column.name }}: {{ filter.value.formatted }}</span>
           <a class="badge-remove"
              (click)="onChangeFilter(filter); false">
             <i [ngClass]="[icons.destroy]"
index e83614b84a5553f5e1431665e28ec4545d536f9f..47decd6a99b031ee8e81525a26b68230fe8b436a 100644 (file)
@@ -1,5 +1,4 @@
 import {
-  ComponentFactoryResolver,
   Directive,
   Input,
   TemplateRef,
@@ -16,29 +15,25 @@ import { LoadingStatus } from '../forms/cd-form';
 export class FormLoadingDirective {
   constructor(
     private templateRef: TemplateRef<any>,
-    private viewContainer: ViewContainerRef,
-    private componentFactoryResolver: ComponentFactoryResolver
+    private viewContainer: ViewContainerRef
   ) {}
 
   @Input('cdFormLoading') set cdFormLoading(condition: LoadingStatus) {
-    let factory: any;
     let content: any;
 
     this.viewContainer.clear();
 
     switch (condition) {
       case LoadingStatus.Loading:
-        factory = this.componentFactoryResolver.resolveComponentFactory(LoadingPanelComponent);
         content = this.resolveNgContent($localize`Loading form data...`);
-        this.viewContainer.createComponent(factory, null, null, content);
+        this.viewContainer.createComponent(LoadingPanelComponent, {projectableNodes: content});
         break;
       case LoadingStatus.Ready:
         this.viewContainer.createEmbeddedView(this.templateRef);
         break;
       case LoadingStatus.Error:
-        factory = this.componentFactoryResolver.resolveComponentFactory(AlertPanelComponent);
         content = this.resolveNgContent($localize`Form data could not be loaded.`);
-        const componentRef = this.viewContainer.createComponent(factory, null, null, content);
+        const componentRef = this.viewContainer.createComponent(AlertPanelComponent, {projectableNodes: content});
         (<AlertPanelComponent>componentRef.instance).type = 'error';
         break;
     }
index 028dd90ea39684f174fd8f6007a48697741691b0..febbec1638fe839956b1185075497a55f9adede0 100644 (file)
@@ -243,7 +243,7 @@ describe('NotificationService', () => {
       service.show(NotificationType.info, 'Some info');
       expect(toastr.info).toHaveBeenCalledWith(
         `<small class="date">${time}</small>` +
-          '<i class="float-right custom-icon ceph-icon" title="Ceph"></i>',
+          '<i class="float-end custom-icon ceph-icon" title="Ceph"></i>',
         'Some info',
         undefined
       );
@@ -257,7 +257,7 @@ describe('NotificationService', () => {
       expect(toastr.error).toHaveBeenCalledWith(
         'Some operation failed<br>' +
           `<small class="date">${time}</small>` +
-          '<i class="float-right custom-icon ceph-icon" title="Ceph"></i>',
+          '<i class="float-end custom-icon ceph-icon" title="Ceph"></i>',
         'Some error',
         undefined
       );
@@ -276,7 +276,7 @@ describe('NotificationService', () => {
       expect(toastr.success).toHaveBeenCalledWith(
         'Some alert resolved<br>' +
           `<small class="date">${time}</small>` +
-          '<i class="float-right custom-icon prometheus-icon" title="Prometheus"></i>',
+          '<i class="float-end custom-icon prometheus-icon" title="Prometheus"></i>',
         'Alert resolved',
         undefined
       );
index c05dbce0f571fb7ea173f64e095c84407a632d8c..52a06e30598d4d226f978571081ee4417e8e804a 100644 (file)
@@ -182,7 +182,7 @@ export class NotificationService {
   renderTimeAndApplicationHtml(notification: CdNotification): string {
     return `<small class="date">${this.cdDatePipe.transform(
       notification.timestamp
-    )}</small><i class="float-right custom-icon ${notification.applicationClass}" title="${
+    )}</small><i class="float-end custom-icon ${notification.applicationClass}" title="${
       notification.application
     }"></i>`;
   }
index 385f2bf07faba42dd8614e47955e4220f0ea9ee4..6253ec6cf46dc1511519c1a6d2831e73c7b802a2 100644 (file)
@@ -163,7 +163,57 @@ tags-input .tags {
   pointer-events: none;
 }
 
+a {
+  &:hover {
+    text-decoration: underline;
+  }
+}
+
 .clickable,
 a {
   cursor: pointer;
+  text-decoration: none;
+}
+
+a.nav-link,
+a.btn-light {
+  text-decoration: none;
+}
+
+// Overrides the badge to rounded-pill
+.badge {
+  @extend .badge, .rounded-pill, .mb-1;
+}
+
+// Overriding badges to match the class name of badges in Bootstrap v5
+.badge-primary {
+  @extend .badge, .bg-primary;
+}
+
+.badge-secondary {
+  @extend .badge, .bg-secondary;
+}
+
+.badge-success {
+  @extend .badge, .bg-success;
+}
+
+.badge-danger {
+  @extend .badge, .bg-danger;
+}
+
+.badge-info {
+  @extend .badge, .bg-primary;
+}
+
+.badge-warning {
+  @extend .badge, .bg-warning, .text-dark;
+}
+
+.badge-light {
+  @extend .badge, .bg-light, .text-dark;
+}
+
+.badge-dark {
+  @extend .badge, .bg-dark;
 }
index be304c9e4e30779cdb58ac51f3c624488e255612..d1410e332b61884c8d386b5ccd5d808d0026ea0a 100644 (file)
@@ -10,7 +10,7 @@ cd-info-card {
 
     .card-body {
       .card-title {
-        @extend .pl-2;
+        @extend .ps-2;
       }
 
       .card-text {
@@ -21,7 +21,7 @@ cd-info-card {
 }
 
 .btn-toolbar cd-table-actions.btn-group {
-  @extend .mr-2;
+  @extend .me-2;
 }
 
 cd-table {
@@ -85,11 +85,11 @@ cd-health {
 
 cd-logs {
   label {
-    @extend .mr-2;
+    @extend .me-2;
   }
 
   .form-inline > .form-group {
-    @extend .mr-3;
+    @extend .me-3;
     @extend .mb-3;
   }
 }
@@ -101,7 +101,7 @@ cd-about {
 
   dt {
     @extend .col-4;
-    @extend .font-weight-bold;
+    @extend .fw-bold;
   }
 
   dd {
@@ -122,8 +122,3 @@ legend {
   @extend .fa-fw;
 }
 
-pre:not(cd-api-docs *) {
-  @extend .card;
-  @extend .bg-light;
-  @extend .p-2;
-}
index ad94ffc6ed59d9b37290ee36134eb003b9f52eab..6ca04c3d8a481cb741add161c38249777a5f4d4a 100644 (file)
@@ -107,41 +107,6 @@ mark {
   border-left: 1px solid vv.$gray-400;
 }
 
-.accordion {
-  .card {
-    border: 0;
-  }
-
-  .card-header {
-    border: 0;
-    border-bottom: 3px solid vv.$white;
-    padding-left: 0;
-
-    .btn:focus,
-    .btn.focus {
-      box-shadow: none;
-    }
-
-    button.dropdown-toggle {
-      position: relative;
-
-      &::after {
-        border: 0;
-        content: '\f054';
-        font-family: 'ForkAwesome';
-        font-size: 1rem;
-        position: absolute;
-        right: 20px;
-        transition: transform 0.3s ease-in-out;
-      }
-
-      &[aria-expanded='true']::after {
-        transform: rotate(90deg);
-      }
-    }
-  }
-}
-
 a.nav-link {
   color: vv.$primary;
 }
index a56bf350664fdc172ea3ffd4b5f8cede980a7127..0503c1d50019ab0dfbf75a22c3b464e986ae09d3 100644 (file)
@@ -1,27 +1,39 @@
 @use './src/styles/vendor/variables' as vv;
 
 /* Reset checkbox success color */
-.was-validated .custom-control-input:valid,
-.custom-control-input.is-valid {
-  ~ .custom-control-label {
+.was-validated .form-check-input:valid,
+.form-check-input.is-valid {
+  border-color: rgba(vv.$primary, 0.8);
+
+  &:checked{
+    background-color: vv.$primary;
+    border-color: rgba(vv.$primary, 0.8);
+    box-shadow: 0 0 3px 2px rgba(vv.$primary, 0.5);
+  }
+
+  &:focus {
+    border-color: rgba(vv.$primary, 0.8);
+    box-shadow: 0 0 3px 2px rgba(vv.$primary, 0.5);
+  }
+
+  ~ .form-check-label {
     color: initial;
   }
 
-  &:checked ~ .custom-control-label::before {
+  &:checked ~ .form-check-label::before {
     background-color: $component-active-bg;
-    border-color: $custom-control-indicator-checked-border-color;
   }
 
-  ~ .custom-control-label::before {
-    border-color: $custom-control-indicator-border-color;
+  ~ .form-check-label::before {
+    border-color: rgba(vv.$primary, 0.8);
   }
 
   &:focus ~ .custom-control-label::before {
-    box-shadow: $custom-control-indicator-focus-box-shadow;
+    box-shadow: 0 0 3px 2px rgba(vv.$primary, 0.5);
   }
 
   &:focus:not(:checked) ~ .custom-control-label::before {
-    border-color: $custom-control-indicator-focus-border-color;
+    border-color: rgba(vv.$primary, 0.8);
   }
 }
 
   }
 }
 
+.btn-primary {
+  @extend .btn-accent;
+}
+
 // We have some inputs that don't have a corresponding formControlName,
 // to be able to get the same styling and no JS errors we need use a different
 // class name
@@ -78,3 +94,9 @@
 .card-footer button.btn:not(:first-child) {
   margin-left: 5px;
 }
+
+button {
+  &.disabled {
+    pointer-events: none !important;
+  }
+}
index 1d84895c0dd75027e1ca324f0e380283bc7c61c7..5ca20012f5b2cba3cc3e869b4045d9dba657d401 100644 (file)
@@ -13,7 +13,8 @@
   width: 100%;
 }
 
-.form-control {
+.form-control,
+.form-select {
   display: table-cell;
 
   &:focus {
 }
 
 .custom-checkbox {
+  @extend .form-check;
   padding-top: 7px;
+
+  .custom-control-input {
+    @extend .form-check-input;
+  }
+
+  .custom-control-label {
+    @extend .form-check-label;
+  }
 }
 
 .custom-radio {
+  @extend .form-check;
   padding-top: 5px;
 }
 
@@ -84,3 +95,11 @@ cd-modal {
 .invalid-feedback {
   display: block;
 }
+
+.form-group{
+  @extend .mb-3;
+}
+
+.custom-control-label {
+  @extend .form-label;
+}
index 25edc11da130bff471bb9599bbc19793dac4dcc8..7dd3974d88f34329a41a7d11a85e3e442b137239 100644 (file)
@@ -32,7 +32,7 @@ $info: $primary !default;
 $warning: $yellow !default;
 $danger: $red !default;
 $light: $gray-100 !default;
-$dark: #777 !default;
+$dark: $gray-800 !default;
 
 //badges colors
 $green-300: #6ec664;
@@ -51,7 +51,15 @@ $fg-hover-color-over-dark-bg: $gray-500 !default;
 
 $theme-colors: (
   'accent': $accent,
-  'warning-dark': $warning-dark
+  'warning-dark': $warning-dark,
+  'primary':    $accent,
+  'secondary':  $secondary,
+  'success':    $success,
+  'info':       $info,
+  'warning':    $warning,
+  'danger':     $danger,
+  'light':      $light,
+  'dark':       $dark
 ) !default;
 
 // Body