});
it('should show the correct text for the tab labels', () => {
- cy.get('#tabset-osd-details > li > a').then(($tabs) => {
+ cy.get('#tabset-osd-details > a').then(($tabs) => {
const tabHeadings = $tabs.map((_i, e) => e.textContent).get();
expect(tabHeadings).to.eql([
}
getTabs() {
- return cy.get('.nav.nav-tabs li');
+ return cy.get('.nav.nav-tabs a');
}
getTab(tabName: string) {
- return cy.contains('.nav.nav-tabs li', tabName);
+ return cy.contains('.nav.nav-tabs a', tabName);
}
getTabText(index: number) {
-<ul ngbNav
- #nav="ngbNav"
- [activeId]="router.url"
- (navChange)="router.navigate([$event.nextId])"
- class="nav-tabs">
- <li ngbNavItem="/block/iscsi/overview">
- <a ngbNavLink
+<ul class="nav nav-tabs">
+ <li class="nav-item">
+ <a class="nav-link"
+ routerLink="/block/iscsi/overview"
+ routerLinkActive="active"
+ ariaCurrentWhenActive="page"
i18n>Overview</a>
</li>
- <li ngbNavItem="/block/iscsi/targets">
- <a ngbNavLink
+ <li class="nav-item">
+ <a class="nav-link"
+ routerLink="/block/iscsi/targets"
+ routerLinkActive="active"
+ ariaCurrentWhenActive="page"
i18n>Targets</a>
</li>
</ul>
import { Component } from '@angular/core';
-import { Router } from '@angular/router';
@Component({
selector: 'cd-iscsi-tabs',
templateUrl: './iscsi-tabs.component.html',
styleUrls: ['./iscsi-tabs.component.scss']
})
-export class IscsiTabsComponent {
- constructor(public router: Router) {}
-}
+export class IscsiTabsComponent {}
-<ul ngbNav
- #nav="ngbNav"
- class="nav-tabs"
- cdStatefulTab="image-list">
- <li ngbNavItem="issues">
+<nav ngbNav
+ #nav="ngbNav"
+ class="nav-tabs"
+ cdStatefulTab="image-list">
+ <ng-container ngbNavItem="issues">
<a ngbNavLink
i18n>Issues ({{ image_error.data.length }})</a>
<ng-template ngbNavContent>
[status]="tableStatus">
</cd-table>
</ng-template>
- </li>
- <li ngbNavItem="syncing">
+ </ng-container>
+ <ng-container ngbNavItem="syncing">
<a ngbNavLink
i18n>Syncing ({{ image_syncing.data.length }})</a>
<ng-template ngbNavContent>
[status]="tableStatus">
</cd-table>
</ng-template>
- </li>
- <li ngbNavItem="ready">
+ </ng-container>
+ <ng-container ngbNavItem="ready">
<a ngbNavLink
i18n>Ready ({{ image_ready.data.length }})</a>
<ng-template ngbNavContent>
[status]="tableStatus">
</cd-table>
</ng-template>
- </li>
-</ul>
+ </ng-container>
+</nav>
<div [ngbNavOutlet]="nav"></div>
</ng-template>
<ng-container *ngIf="selection && selection.source !== 'REMOVING'">
- <ul ngbNav
- #nav="ngbNav"
- class="nav-tabs"
- cdStatefulTab="rbd-details">
- <li ngbNavItem="details">
+ <nav ngbNav
+ #nav="ngbNav"
+ class="nav-tabs"
+ cdStatefulTab="rbd-details">
+ <ng-container ngbNavItem="details">
<a ngbNavLink
i18n>Details</a>
<ng-template ngbNavContent>
</tbody>
</table>
</ng-template>
- </li>
- <li ngbNavItem="snapshots">
+ </ng-container>
+ <ng-container ngbNavItem="snapshots">
<a ngbNavLink
i18n>Snapshots</a>
<ng-template ngbNavContent>
[mirroring]="selection.mirror_mode"
[rbdName]="selection.name"></cd-rbd-snapshot-list>
</ng-template>
- </li>
- <li ngbNavItem="configuration">
+ </ng-container>
+ <ng-container ngbNavItem="configuration">
<a ngbNavLink
i18n>Configuration</a>
<ng-template ngbNavContent>
<cd-rbd-configuration-table [data]="selection['configuration']"></cd-rbd-configuration-table>
</ng-template>
- </li>
+ </ng-container>
- <li ngbNavItem="performance">
+ <ng-container ngbNavItem="performance">
<a ngbNavLink
i18n>Performance</a>
<ng-template ngbNavContent>
grafanaStyle="one">
</cd-grafana>
</ng-template>
- </li>
- </ul>
+ </ng-container>
+ </nav>
<div [ngbNavOutlet]="nav"></div>
</ng-container>
-<ul ngbNav
- #nav="ngbNav"
- [activeId]="router.url"
- (navChange)="router.navigate([$event.nextId])"
- class="nav-tabs">
- <li ngbNavItem="/block/rbd">
- <a ngbNavLink
+<ul class="nav nav-tabs">
+ <li class="nav-item">
+ <a class="nav-link"
+ routerLink="/block/rbd"
+ routerLinkActive="active"
+ ariaCurrentWhenActive="page"
+ [routerLinkActiveOptions]="{exact: true}"
i18n>Images</a>
</li>
- <li ngbNavItem="/block/rbd/namespaces">
- <a ngbNavLink
+ <li class="nav-item">
+ <a class="nav-link"
+ routerLink="/block/rbd/namespaces"
+ routerLinkActive="active"
+ ariaCurrentWhenActive="page"
+ [routerLinkActiveOptions]="{exact: true}"
i18n>Namespaces</a>
</li>
- <li ngbNavItem="/block/rbd/trash">
- <a ngbNavLink
+ <li class="nav-item">
+ <a class="nav-link"
+ routerLink="/block/rbd/trash"
+ routerLinkActive="active"
+ ariaCurrentWhenActive="page"
+ [routerLinkActiveOptions]="{exact: true}"
i18n>Trash</a>
</li>
- <li ngbNavItem="/block/rbd/performance"
+ <li class="nav-item"
*ngIf="grafanaPermission.read">
- <a ngbNavLink
+ <a class="nav-link"
+ routerLink="/block/rbd/performance"
+ routerLinkActive="active"
+ ariaCurrentWhenActive="page"
+ [routerLinkActiveOptions]="{exact: true}"
i18n>Overall Performance</a>
</li>
</ul>
import { Component } from '@angular/core';
-import { Router } from '@angular/router';
import { Permission } from '~/app/shared/models/permissions';
import { AuthStorageService } from '~/app/shared/services/auth-storage.service';
grafanaPermission: Permission;
url: string;
- constructor(private authStorageService: AuthStorageService, public router: Router) {
+ constructor(private authStorageService: AuthStorageService) {
this.grafanaPermission = this.authStorageService.getPermissions().grafana;
}
}
<ng-container *ngIf="selection">
- <ul ngbNav
- #nav="ngbNav"
- (navChange)="softRefresh()"
- class="nav-tabs"
- cdStatefulTab="cephfs-tabs">
- <li ngbNavItem="details">
+ <nav ngbNav
+ #nav="ngbNav"
+ (navChange)="softRefresh()"
+ class="nav-tabs"
+ cdStatefulTab="cephfs-tabs">
+ <ng-container ngbNavItem="details">
<a ngbNavLink
i18n>Details</a>
<ng-template ngbNavContent>
<cd-cephfs-detail [data]="details">
</cd-cephfs-detail>
</ng-template>
- </li>
- <li ngbNavItem="clients">
+ </ng-container>
+ <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>
(triggerApiUpdate)="refresh()">
</cd-cephfs-clients>
</ng-template>
- </li>
- <li ngbNavItem="directories">
+ </ng-container>
+ <ng-container ngbNavItem="directories">
<a ngbNavLink
i18n>Directories</a>
<ng-template ngbNavContent>
<cd-cephfs-directories [id]="id"></cd-cephfs-directories>
</ng-template>
- </li>
- <li ngbNavItem="performance-details">
+ </ng-container>
+ <ng-container ngbNavItem="performance-details">
<a ngbNavLink
i18n>Performance Details</a>
<ng-template ngbNavContent>
grafanaStyle="one">
</cd-grafana>
</ng-template>
- </li>
- </ul>
+ </ng-container>
+ </nav>
<div [ngbNavOutlet]="nav"></div>
</ng-container>
<ng-container *ngIf="selection">
- <ul ngbNav
- #nav="ngbNav"
- class="nav-tabs"
- cdStatefulTab="host-details">
- <li ngbNavItem="devices">
+ <nav ngbNav
+ #nav="ngbNav"
+ class="nav-tabs"
+ cdStatefulTab="host-details">
+ <ng-container ngbNavItem="devices">
<a ngbNavLink
i18n>Devices</a>
<ng-template ngbNavContent>
<cd-device-list [hostname]="selection['hostname']"></cd-device-list>
</ng-template>
- </li>
- <li ngbNavItem="inventory"
- *ngIf="permissions.hosts.read">
+ </ng-container>
+ <ng-container ngbNavItem="inventory"
+ *ngIf="permissions.hosts.read">
<a ngbNavLink
i18n>Physical Disks</a>
<ng-template ngbNavContent>
<cd-inventory [hostname]="selectedHostname"></cd-inventory>
</ng-template>
- </li>
- <li ngbNavItem="daemons"
- *ngIf="permissions.hosts.read">
+ </ng-container>
+ <ng-container ngbNavItem="daemons"
+ *ngIf="permissions.hosts.read">
<a ngbNavLink
i18n>Daemons</a>
<ng-template ngbNavContent>
[hiddenColumns]="['hostname']">
</cd-service-daemon-list>
</ng-template>
- </li>
- <li ngbNavItem="performance-details"
- *ngIf="permissions.grafana.read">
+ </ng-container>
+ <ng-container ngbNavItem="performance-details"
+ *ngIf="permissions.grafana.read">
<a ngbNavLink
i18n>Performance Details</a>
<ng-template ngbNavContent>
grafanaStyle="four">
</cd-grafana>
</ng-template>
- </li>
- <li ngbNavItem="device-health">
+ </ng-container>
+ <ng-container ngbNavItem="device-health">
<a ngbNavLink
i18n>Device health</a>
<ng-template ngbNavContent>
<cd-smart-list *ngIf="selectedHostname; else noHostname"
[hostname]="selectedHostname"></cd-smart-list>
</ng-template>
- </li>
- </ul>
+ </ng-container>
+ </nav>
<div [ngbNavOutlet]="nav"></div>
</ng-container>
-<ul ngbNav
- #nav="ngbNav"
- class="nav-tabs">
- <li ngbNavItem>
+<nav ngbNav
+ #nav="ngbNav"
+ class="nav-tabs">
+ <ng-container ngbNavItem>
<a ngbNavLink
i18n>Hosts List</a>
<ng-template ngbNavContent>
</cd-host-details>
</cd-table>
</ng-template>
- </li>
- <li ngbNavItem
- *ngIf="permissions.grafana.read">
+ </ng-container>
+ <ng-container ngbNavItem
+ *ngIf="permissions.grafana.read">
+ </ng-container>
+ <ng-container ngbNavItem
+ *ngIf="permissions.grafana.read">
<a ngbNavLink
i18n>Overall Performance</a>
<ng-template ngbNavContent>
grafanaStyle="two">
</cd-grafana>
</ng-template>
- </li>
-</ul>
+ </ng-container>
+</nav>
<div [ngbNavOutlet]="nav"></div>
<div *ngIf="contentData">
<ng-container *ngTemplateOutlet="logFiltersTpl"></ng-container>
- <ul ngbNav
- #nav="ngbNav"
- class="nav-tabs"
- cdStatefulTab="logs">
- <li ngbNavItem="cluster-logs">
+ <nav ngbNav
+ #nav="ngbNav"
+ class="nav-tabs"
+ cdStatefulTab="logs">
+ <ng-container ngbNavItem="cluster-logs">
<a ngbNavLink
i18n>Cluster Logs</a>
<ng-template ngbNavContent>
</div>
</div>
</ng-template>
- </li>
- <li ngbNavItem="audit-logs">
+ </ng-container>
+ <ng-container ngbNavItem="audit-logs">
<a ngbNavLink
i18n>Audit Logs</a>
<ng-template ngbNavContent>
</div>
</div>
</ng-template>
- </li>
- <li ngbNavItem="daemon-logs">
+ </ng-container>
+ <ng-container ngbNavItem="daemon-logs">
<a ngbNavLink
i18n>Daemon Logs</a>
<ng-template ngbNavContent>
</div>
</ng-container>
</ng-template>
- </li>
- </ul>
+ </ng-container>
+ </nav>
<div [ngbNavOutlet]="nav"></div>
</div>
<ng-container *ngIf="selection">
- <ul ngbNav
- #nav="ngbNav"
- id="tabset-osd-details"
- class="nav-tabs"
- cdStatefulTab="osd-details">
- <li ngbNavItem="devices">
+ <nav ngbNav
+ #nav="ngbNav"
+ id="tabset-osd-details"
+ class="nav-tabs"
+ cdStatefulTab="osd-details">
+ <ng-container ngbNavItem="devices">
<a ngbNavLink
i18n>Devices</a>
<ng-template ngbNavContent>
[hostname]="selection?.host.name"
[osdList]="true"></cd-device-list>
</ng-template>
- </li>
- <li ngbNavItem="attributes">
+ </ng-container>
+ <ng-container ngbNavItem="attributes">
<a ngbNavLink
i18n>Attributes (OSD map)</a>
<ng-template ngbNavContent>
<cd-table-key-value [data]="osd?.details?.osd_map">
</cd-table-key-value>
</ng-template>
- </li>
- <li ngbNavItem="metadata">
+ </ng-container>
+ <ng-container ngbNavItem="metadata">
<a ngbNavLink
i18n>Metadata</a>
<ng-template ngbNavContent>
i18n>Metadata not available</cd-alert-panel>
</ng-template>
</ng-template>
- </li>
- <li ngbNavItem="device-health">
+ </ng-container>
+ <ng-container ngbNavItem="device-health">
<a ngbNavLink
i18n>Device health</a>
<ng-template ngbNavContent>
<cd-smart-list [osdId]="osd?.id"></cd-smart-list>
</ng-template>
- </li>
- <li ngbNavItem="performance-counter">
+ </ng-container>
+ <ng-container ngbNavItem="performance-counter">
<a ngbNavLink
i18n>Performance counter</a>
<ng-template ngbNavContent>
[serviceId]="osd?.id">
</cd-table-performance-counter>
</ng-template>
- </li>
- <li ngbNavItem="performance-details"
- *ngIf="grafanaPermission.read">
+ </ng-container>
+ <ng-container ngbNavItem="performance-details"
+ *ngIf="grafanaPermission.read">
<a ngbNavLink
i18n>Performance Details</a>
<ng-template ngbNavContent>
grafanaStyle="three">
</cd-grafana>
</ng-template>
- </li>
- </ul>
+ </ng-container>
+ </nav>
<div [ngbNavOutlet]="nav"></div>
</ng-container>
-<ul ngbNav
- #nav="ngbNav"
- class="nav-tabs">
- <li ngbNavItem>
+<nav ngbNav
+ #nav="ngbNav"
+ class="nav-tabs">
+ <ng-container ngbNavItem>
<a ngbNavLink
i18n>OSDs List</a>
<ng-template ngbNavContent>
</cd-osd-details>
</cd-table>
</ng-template>
- </li>
+ </ng-container>
- <li ngbNavItem
- *ngIf="permissions.grafana.read">
+ <ng-container ngbNavItem
+ *ngIf="permissions.grafana.read">
<a ngbNavLink
i18n>Overall Performance</a>
<ng-template ngbNavContent>
grafanaStyle="four">
</cd-grafana>
</ng-template>
- </li>
-</ul>
+ </ng-container>
+</nav>
<div [ngbNavOutlet]="nav"></div>
-<ul ngbNav
- #nav="ngbNav"
- [activeId]="router.url"
- (navChange)="router.navigate([$event.nextId])"
- class="nav-tabs">
- <li ngbNavItem="/monitoring/active-alerts">
- <a ngbNavLink
+<ul class="nav nav-tabs">
+ <li class="nav-item">
+ <a class="nav-link"
+ routerLink="/monitoring/active-alerts"
+ routerLinkActive="active"
+ ariaCurrentWhenActive="page"
+ [routerLinkActiveOptions]="{exact: true}"
i18n>Active Alerts
<small *ngIf="prometheusAlertService.activeCriticalAlerts > 0"
class="badge badge-danger ml-1">{{ prometheusAlertService.activeCriticalAlerts }}</small>
<small *ngIf="prometheusAlertService.activeWarningAlerts > 0"
class="badge badge-warning ml-1">{{ prometheusAlertService.activeWarningAlerts }}</small></a>
</li>
- <li ngbNavItem="/monitoring/alerts">
- <a ngbNavLink
+ <li class="nav-item">
+ <a class="nav-link"
+ routerLink="/monitoring/alerts"
+ routerLinkActive="active"
+ ariaCurrentWhenActive="page"
+ [routerLinkActiveOptions]="{exact: true}"
i18n>Alerts</a>
</li>
- <li ngbNavItem="/monitoring/silences">
- <a ngbNavLink
+ <li class="nav-item">
+ <a class="nav-link"
+ routerLink="/monitoring/silences"
+ routerLinkActive="active"
+ ariaCurrentWhenActive="page"
+ [routerLinkActiveOptions]="{exact: true}"
i18n>Silences</a>
</li>
</ul>
import { Component } from '@angular/core';
-import { Router } from '@angular/router';
import { PrometheusAlertService } from '~/app/shared/services/prometheus-alert.service';
styleUrls: ['./prometheus-tabs.component.scss']
})
export class PrometheusTabsComponent {
- constructor(public router: Router, public prometheusAlertService: PrometheusAlertService) {}
+ constructor(public prometheusAlertService: PrometheusAlertService) {}
}
<ng-template #serviceDetailsTpl>
<ng-container>
- <ul ngbNav
- #nav="ngbNav"
- class="nav-tabs"
- cdStatefulTab="service-details">
- <li ngbNavItem="details">
+ <nav ngbNav
+ #nav="ngbNav"
+ class="nav-tabs"
+ cdStatefulTab="service-details">
+ <ng-container ngbNavItem="details">
<a ngbNavLink
i18n>Details</a>
<ng-template ngbNavContent>
<ng-container *ngTemplateOutlet="serviceDaemonDetailsTpl"></ng-container>
</ng-template>
- </li>
- <li ngbNavItem="service_events">
+ </ng-container>
+ <ng-container ngbNavItem="service_events">
<a ngbNavLink
i18n>Service Events</a>
<ng-template ngbNavContent>
(fetchData)="getServices($event)">
</cd-table>
</ng-template>
- </li>
- </ul>
+ </ng-container>
+ </nav>
<div [ngbNavOutlet]="nav"></div>
</ng-container>
</ng-template>
<cd-refresh-selector></cd-refresh-selector>
<ng-container *ngIf="hasGrafana">
- <ul ngbNav
- #nav="ngbNav"
- class="nav-tabs">
- <li ngbNavItem>
+ <nav ngbNav
+ #nav="ngbNav"
+ class="nav-tabs">
+ <ng-container ngbNavItem>
<a ngbNavLink
i18n>Health</a>
<ng-template ngbNavContent>
<cd-health></cd-health>
</ng-template>
- </li>
- <li ngbNavItem>
+ </ng-container>
+ <ng-container ngbNavItem>
<a ngbNavLink
i18n>Statistics</a>
<ng-template ngbNavContent>
</ng-template>
- </li>
+ </ng-container>
- </ul>
+ </nav>
<div [ngbNavOutlet]="nav"></div>
</ng-container>
<ng-container *ngIf="selection">
- <ul ngbNav
- #nav="ngbNav"
- class="nav-tabs"
- cdStatefulTab="nfs-details">
- <li ngbNavItem="details">
+ <nav ngbNav
+ #nav="ngbNav"
+ class="nav-tabs"
+ cdStatefulTab="nfs-details">
+ <ng-container ngbNavItem="details">
<a ngbNavLink
i18n>Details</a>
<ng-template ngbNavContent>
<cd-table-key-value [data]="data">
</cd-table-key-value>
</ng-template>
- </li>
- <li ngbNavItem="clients">
+ </ng-container>
+ <ng-container ngbNavItem="clients">
<a ngbNavLink
i18n>Clients ({{ clients.length }})</a>
<ng-template ngbNavContent>
selectionType="">
</cd-table>
</ng-template>
- </li>
- </ul>
+ </ng-container>
+ </nav>
<div [ngbNavOutlet]="nav"></div>
</ng-container>
});
it('should have 1 client', () => {
- expect(elem('ul.nav-tabs li:nth-of-type(2) a').nativeElement.textContent).toBe('Clients (1)');
+ expect(elem('nav.nav-tabs a:nth-of-type(2)').nativeElement.textContent).toBe('Clients (1)');
expect(component.clients).toEqual([
{
access_type: 'RW',
<ng-container *ngIf="selection"
cdTableDetail>
- <ul ngbNav
- #nav="ngbNav"
- class="nav-tabs"
- cdStatefulTab="pool-details">
- <li ngbNavItem="details">
+ <nav ngbNav
+ #nav="ngbNav"
+ class="nav-tabs"
+ cdStatefulTab="pool-details">
+ <ng-container ngbNavItem="details">
<a ngbNavLink
i18n>Details</a>
<ng-template ngbNavContent>
[autoReload]="false">
</cd-table-key-value>
</ng-template>
- </li>
- <li ngbNavItem="performance-details"
- *ngIf="permissions.grafana.read">
+ </ng-container>
+ <ng-container ngbNavItem="performance-details"
+ *ngIf="permissions.grafana.read">
<a ngbNavLink
i18n>Performance Details</a>
<ng-template ngbNavContent>
grafanaStyle="three">
</cd-grafana>
</ng-template>
- </li>
- <li ngbNavItem="configuration"
- *ngIf="selection.type === 'replicated'">
+ </ng-container>
+ <ng-container ngbNavItem="configuration"
+ *ngIf="selection.type === 'replicated'">
<a ngbNavLink
i18n>Configuration</a>
<ng-template ngbNavContent>
<cd-rbd-configuration-table [data]="selectedPoolConfiguration"></cd-rbd-configuration-table>
</ng-template>
- </li>
- <li ngbNavItem="cache-tiers-details"
- *ngIf="selection['tiers']?.length > 0">
+ </ng-container>
+ <ng-container ngbNavItem="cache-tiers-details"
+ *ngIf="selection['tiers']?.length > 0">
<a ngbNavLink
i18n>Cache Tiers Details</a>
<ng-template ngbNavContent>
columnMode="flex">
</cd-table>
</ng-template>
- </li>
- </ul>
+ </ng-container>
+ </nav>
<div [ngbNavOutlet]="nav"></div>
</ng-container>
<span class="form-text text-muted"
id="ecp-info-block"
*ngIf="data.erasureInfo && form.getValue('erasureProfile')">
- <ul ngbNav
- #ecpInfoTabs="ngbNav"
- class="nav-tabs">
- <li ngbNavItem="ecp-info">
+ <nav ngbNav
+ #ecpInfoTabs="ngbNav"
+ class="nav-tabs">
+ <ng-container ngbNavItem="ecp-info">
<a ngbNavLink
i18n>Profile</a>
<ng-template ngbNavContent>
[autoReload]="false">
</cd-table-key-value>
</ng-template>
- </li>
- <li ngbNavItem="used-by-pools">
+ </ng-container>
+ <ng-container ngbNavItem="used-by-pools">
<a ngbNavLink
i18n>Used by pools</a>
<ng-template ngbNavContent>
</li>
</ul>
</ng-template>
- </li>
- </ul>
+ </ng-container>
+ </nav>
<div [ngbNavOutlet]="ecpInfoTabs"></div>
</span>
<div class="form-text text-muted"
id="crush-info-block"
*ngIf="data.crushInfo && form.getValue('crushRule')">
- <ul ngbNav
- #crushInfoTabs="ngbNav"
- class="nav-tabs">
- <li ngbNavItem="crush-rule-info">
+ <nav ngbNav
+ #crushInfoTabs="ngbNav"
+ class="nav-tabs">
+ <ng-container ngbNavItem="crush-rule-info">
<a ngbNavLink
i18n>Crush rule</a>
<ng-template ngbNavContent>
[autoReload]="false">
</cd-table-key-value>
</ng-template>
- </li>
- <li ngbNavItem="crush-rule-steps">
+ </ng-container>
+ <ng-container ngbNavItem="crush-rule-steps">
<a ngbNavLink
i18n>Crush steps</a>
<ng-template ngbNavContent>
</li>
</ol>
</ng-template>
- </li>
- <li ngbNavItem="used-by-pools">
+ </ng-container>
+ <ng-container ngbNavItem="used-by-pools">
<a ngbNavLink
i18n>Used by pools</a>
<ng-template ngbNavContent>
</li>
</ul>
</ng-template>
- </li>
- </ul>
+ </ng-container>
+ </nav>
<div [ngbNavOutlet]="crushInfoTabs"></div>
</div>
-<ul ngbNav
- #nav="ngbNav"
- class="nav-tabs">
- <li ngbNavItem>
+<nav ngbNav
+ #nav="ngbNav"
+ class="nav-tabs">
+ <ng-container ngbNavItem>
<a ngbNavLink
i18n>Pools List</a>
<ng-template ngbNavContent>
</cd-pool-details>
</cd-table>
</ng-template>
- </li>
+ </ng-container>
- <li ngbNavItem
- *cdScope="'grafana'">
+ <ng-container ngbNavItem
+ *cdScope="'grafana'">
<a ngbNavLink
i18n>Overall Performance</a>
<ng-template ngbNavContent>
grafanaStyle="two">
</cd-grafana>
</ng-template>
- </li>
-</ul>
+ </ng-container>
+</nav>
<div [ngbNavOutlet]="nav"></div>
<ng-container *ngIf="selection">
- <ul ngbNav
- #nav="ngbNav"
- class="nav-tabs"
- cdStatefulTab="rgw-daemon-details">
- <li ngbNavItem="details">
+ <nav ngbNav
+ #nav="ngbNav"
+ class="nav-tabs"
+ cdStatefulTab="rgw-daemon-details">
+ <ng-container ngbNavItem="details">
<a ngbNavLink
i18n>Details</a>
<ng-template ngbNavContent>
(fetchData)="getMetaData()">
</cd-table-key-value>
</ng-template>
- </li>
- <li ngbNavItem="performance-counters">
+ </ng-container>
+ <ng-container ngbNavItem="performance-counters">
<a ngbNavLink
i18n>Performance Counters</a>
<ng-template ngbNavContent>
[serviceId]="serviceMapId">
</cd-table-performance-counter>
</ng-template>
- </li>
- <li ngbNavItem="performance-details"
- *ngIf="grafanaPermission.read">
+ </ng-container>
+ <ng-container ngbNavItem="performance-details"
+ *ngIf="grafanaPermission.read">
<a ngbNavLink
i18n>Performance Details</a>
<ng-template ngbNavContent>
grafanaStyle="one">
</cd-grafana>
</ng-template>
- </li>
- </ul>
+ </ng-container>
+ </nav>
<div [ngbNavOutlet]="nav"></div>
</ng-container>
-<ul ngbNav
- #nav="ngbNav"
- class="nav-tabs">
- <li ngbNavItem>
+<nav ngbNav
+ #nav="ngbNav"
+ class="nav-tabs">
+ <ng-container ngbNavItem>
<a ngbNavLink
i18n>Daemons List</a>
<ng-template ngbNavContent>
</cd-rgw-daemon-details>
</cd-table>
</ng-template>
- </li>
+ </ng-container>
- <li ngbNavItem
- *ngIf="grafanaPermission.read">
+ <ng-container ngbNavItem
+ *ngIf="grafanaPermission.read">
<a ngbNavLink
i18n>Overall Performance</a>
<ng-template ngbNavContent>
grafanaStyle="two">
</cd-grafana>
</ng-template>
- </li>
+ </ng-container>
- <li ngbNavItem
- *ngIf="grafanaPermission.read && isMultiSite">
+ <ng-container ngbNavItem
+ *ngIf="grafanaPermission.read && isMultiSite">
<a ngbNavLink
i18n>Sync Performance</a>
<ng-template ngbNavContent>
grafanaStyle="two">
</cd-grafana>
</ng-template>
- </li>
-</ul>
+ </ng-container>
+</nav>
<div [ngbNavOutlet]="nav"></div>
<ng-container *ngIf="selection">
- <ul ngbNav
- #nav="ngbNav"
- class="nav-tabs"
- cdStatefulTab="rgw-user-details">
- <li ngbNavItem="details">
+ <nav ngbNav
+ #nav="ngbNav"
+ class="nav-tabs"
+ cdStatefulTab="rgw-user-details">
+ <ng-container ngbNavItem="details">
<a ngbNavLink
i18n>Details</a>
<ng-template ngbNavContent>
</div>
</div>
</ng-template>
- </li>
- <li ngbNavItem="keys"
- *ngIf="keys.length">
+ </ng-container>
+ <ng-container ngbNavItem="keys"
+ *ngIf="keys.length">
<a ngbNavLink
i18n>Keys</a>
<ng-template ngbNavContent>
</div>
</cd-table>
</ng-template>
- </li>
- </ul>
+ </ng-container>
+ </nav>
<div [ngbNavOutlet]="nav"></div>
</ng-container>
i18n>No SMART data available.</cd-alert-panel>
<ng-container *ngIf="!(data | pipeFunction:isEmpty)">
- <ul ngbNav
- #nav="ngbNav"
- class="nav-tabs">
- <li ngbNavItem
- *ngFor="let device of data | keyvalue">
+ <nav ngbNav
+ #nav="ngbNav"
+ class="nav-tabs">
+ <ng-container ngbNavItem
+ *ngFor="let device of data | keyvalue">
<a ngbNavLink>{{ device.value.device }} ({{ device.value.identifier }})</a>
<ng-template ngbNavContent>
<ng-container *ngIf="device.value.error; else noError">
</ng-template>
<ng-container *ngIf="!(device.value.info | pipeFunction:isEmpty) || !(device.value.smart | pipeFunction:isEmpty)">
- <ul ngbNav
- #innerNav="ngbNav"
- class="nav-tabs">
+ <nav ngbNav
+ #innerNav="ngbNav"
+ class="nav-tabs">
<li [ngbNavItem]="1">
<a ngbNavLink
i18n>Device Information</a>
i18n>No SMART data available for this device.</cd-alert-panel>
</ng-template>
</li>
- </ul>
+ </nav>
<div [ngbNavOutlet]="innerNav"></div>
</ng-container>
</ng-template>
- </li>
- </ul>
+ </ng-container>
+ </nav>
<div [ngbNavOutlet]="nav"></div>
</ng-container>
-<ul ngbNav
- #nav="ngbNav"
- [activeId]="router.url"
- (navChange)="router.navigate([$event.nextId])"
- class="nav-tabs">
- <li ngbNavItem="/user-management/users">
- <a ngbNavLink
+<ul class="nav nav-tabs">
+ <li class="nav-item">
+ <a class="nav-link"
+ routerLink="/user-management/users"
+ routerLinkActive="active"
+ ariaCurrentWhenActive="page"
+ [routerLinkActiveOptions]="{exact: true}"
i18n>Users</a>
</li>
- <li ngbNavItem="/user-management/roles">
- <a ngbNavLink
+ <li class="nav-item">
+ <a class="nav-link"
+ routerLink="/user-management/roles"
+ routerLinkActive="active"
+ ariaCurrentWhenActive="page"
+ [routerLinkActiveOptions]="{exact: true}"
i18n>Roles</a>
</li>
</ul>
}
}
}
+
+a.nav-link {
+ color: vv.$primary-wcag-aa-large-text;
+}
import { By } from '@angular/platform-browser';
import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/testing';
-import { NgbModal, NgbNav, NgbNavItem } from '@ng-bootstrap/ng-bootstrap';
+import { NgbModal, NgbNav, NgbNavItem, NgbNavLink } from '@ng-bootstrap/ng-bootstrap';
import _ from 'lodash';
import { configureTestSuite } from 'ng-bullet';
import { of } from 'rxjs';
private static getNgbNavItemsDebugElems(fixture: ComponentFixture<any>) {
const debugElem: DebugElement = fixture.debugElement;
- return debugElem.queryAll(By.directive(NgbNavItem));
+ return debugElem.queryAll(By.directive(NgbNavLink));
}
}