Replace the remaining custom dashboard border classes in the overview alerts card and tearsheet with the shared border-subtle utility classes. Update the alerts-card unit test so it checks the shared utility class name used by the template. Stub Prometheus overview requests in the dashboard a11y Cypress test so the test does not fail on missing metrics in CI.
Fixes: http://tracker.ceph.com/issues/75404
Signed-off-by: Annmool <aydv.267@gmail.com>
const overview = new DashboardV3PageHelper();
beforeEach(() => {
+ cy.intercept('GET', '**/api/prometheus/data*', {
+ statusCode: 200,
+ body: {
+ status: 'success',
+ data: {
+ resultType: 'matrix',
+ result: []
+ }
+ }
+ });
+ cy.intercept('GET', '**/api/prometheus/prometheus_query_data*', {
+ statusCode: 200,
+ body: {
+ status: 'success',
+ data: {
+ resultType: 'vector',
+ result: []
+ }
+ }
+ });
cy.login();
overview.navigateTo();
});
<div [cdsStack]="compact? 'horizontal' : 'vertical'">
@for (b of vm.badges; track b.key; let last = $last) {
<span
- class="overview-alerts-card-badge"
- [class.overview-alerts-card-badge-with-border--right]="!last && compact"
- [class.overview-alerts-card-badge-with-border--bottom]="!compact">
+ class="overview-alerts-card-badge cds-pr-4"
+ [class.cds-mr-4]="!last && compact"
+ [class.border-subtle-right]="!last && compact"
+ [class.overview-alerts-card-badge--compact]="!compact"
+ [class.border-subtle-bottom]="!compact">
<a
cdsLink
[routerLink]="['/monitoring/active-alerts']"
&-badge {
display: inline-flex;
align-items: center;
- padding-right: var(--cds-spacing-04);
- }
-
- &-badge-with-border--right {
- border-right: 1px solid var(--cds-border-subtle);
- margin-right: var(--cds-spacing-04);
- }
- &-badge-with-border--bottom {
- border-bottom: 1px solid var(--cds-border-subtle);
- padding: var(--cds-spacing-03) 0;
+ &--compact {
+ padding: var(--cds-spacing-03) 0;
+ }
}
&-need-attention {
expect(vm.badges).toEqual([{ key: 'warning', icon: 'warning', count: 3 }]);
});
- it('template should render border class only on 2nd badge (when both exist)', async () => {
+ it('template should render right border class only on the first badge when both exist', async () => {
mockSvc.emitCounts(10, 1, 2);
fixture.detectChanges();
await fixture.whenStable();
) as HTMLElement[];
expect(badgeEls.length).toBe(2);
- expect(badgeEls[0].classList.contains('overview-alerts-card-badge-with-border--right')).toBe(
- true
- );
- expect(badgeEls[1].classList.contains('overview-alerts-card-badge-with-border--right')).toBe(
- false
- );
+ expect(badgeEls[0].classList.contains('border-subtle-right')).toBe(true);
+ expect(badgeEls[1].classList.contains('border-subtle-right')).toBe(false);
});
});
[gap]="8">
@for (item of healthItems; track item.key; let isLast = $last) {
<div class="cds-pr-8"
- [class.overview-health-card-tab-content-item]="!isLast">
+ [class.overview-health-card-tab-content-item]="!isLast"
+ [class.border-subtle-right]="!isLast">
<span class="overview-health-card-icon-and-text">
<cd-icon [type]="vm?.[item.key]?.severity"></cd-icon>
<span class="cds--type-body-compact-01">
@if (hwEnabled && hwSections) {
<div class="overview-health-card-hardware-sections">
- @for (section of sections; track $index) {
- <div class="overview-health-card-hardware-section">
+ @for (section of sections; track $index; let isLast = $last) {
+ <div class="overview-health-card-hardware-section"
+ [class.border-subtle-right]="!isLast">
@for (row of section; track row.key) {
<div class="overview-health-card-hardware-row">
<span class="overview-health-card-icon-and-text">
}
&-tab-content-item {
- border-right: 1px solid var(--cds-border-subtle);
max-block-size: fit-content;
}
gap: var(--cds-spacing-03);
min-width: 0;
padding-inline-end: var(--cds-spacing-03);
- border-right: 1px solid var(--cds-border-subtle);
box-sizing: border-box;
}
&-hardware-section:last-child {
- border-right: none;
padding-inline-end: 0;
}
[columnNumbers]="{'lg': 16, 'md': 16, 'sm': 16}">
<!-- Tearsheet Header -->
<header
- class="tearsheet-header tearsheet-header--full">
+ class="tearsheet-header tearsheet-header--full border-subtle-block-end">
<h4 class="cds--type-heading-04 tearsheet-header-title">
{{title}}
</h4>
<!-- Tearsheet Influencer-->
<div cdsCol
[columnNumbers]="{'lg': 3, 'md': 3, 'sm': 3}"
- class="tearsheet-left-influencer">
+ class="tearsheet-left-influencer border-subtle-inline-end">
<cds-progress-indicator
orientation="vertical"
[steps]="steps"
</ng-container>
</div>
<!-- Tearsheet Footer -->
- <cds-modal-footer class="tearsheet-footer tearsheet-footer--full">
+ <cds-modal-footer class="tearsheet-footer tearsheet-footer--full border-subtle-top">
<button cdsButton="ghost"
class="tearsheet-footer-cancel"
(click)="closeTearsheet()"
(overlaySelected)="closeTearsheet()">
<!-- Tearsheet Header -->
<header
- class="tearsheet-header">
+ class="tearsheet-header border-subtle-block-end">
<h4 cdsModalHeaderHeading
class="cds--type-heading-04 tearsheet-header-title">
{{title}}
@if (steps.length > 1) {
<div cdsCol
[columnNumbers]="{lg: 3, md: 3, sm: 3}"
- class="tearsheet-left-influencer">
+ class="tearsheet-left-influencer border-subtle-inline-end">
<cds-progress-indicator
orientation="vertical"
[steps]="steps"
</div>
}
<!-- Tearsheet Footer -->
- <cds-modal-footer class="tearsheet-footer">
+ <cds-modal-footer class="tearsheet-footer border-subtle-top">
<button cdsButton="ghost"
(click)="closeTearsheet()"
size="xl"
fill: var(--cds-icon-primary);
background-color: var(--cds-background);
padding: var(--cds-spacing-06) var(--cds-spacing-07);
- border-block-end: 1px solid var(--cds-border-subtle-01);
&-title {
color: var(--cds-text-primary);
padding: var(--cds-spacing-06) var(--cds-spacing-07);
overflow-block: auto;
overflow-y: auto;
- border-inline-end: 1px solid var(--cds-border-subtle-01);
margin: 0;
}
//FOOTER
.tearsheet-footer {
- border-top: 1px solid var(--cds-border-subtle);
background-color: var(--cds-layer-01);
&-submit {
.cds--progress-bar__bar {
background-color: var(--cds-primary);
}
-
+// Carbon borders
.border-subtle {
border: 1px solid var(--cds-border-subtle);
}
+
+.border-subtle-bottom {
+ border-bottom: 1px solid var(--cds-border-subtle);
+}
+
+.border-subtle-top {
+ border-top: 1px solid var(--cds-border-subtle);
+}
+
+.border-subtle-right {
+ border-right: 1px solid var(--cds-border-subtle);
+}
+
+.border-subtle-block-end {
+ border-block-end: 1px solid var(--cds-border-subtle-01);
+}
+
+.border-subtle-inline-end {
+ border-inline-end: 1px solid var(--cds-border-subtle-01);
+}
padding-top: layout.$spacing-03;
}
+.cds-pr-4 {
+ padding-right: layout.$spacing-04;
+}
+
.cds-pr-8 {
padding-right: layout.$spacing-08;
}
margin-right: layout.$spacing-03;
}
+.cds-mr-4 {
+ margin-right: layout.$spacing-04;
+}
+
.cds-mr-5 {
margin-right: layout.$spacing-05;
}