mirror of
https://github.com/angular/angular
synced 2026-05-24 09:28:37 +00:00
The navigation list component was using `routerLinkActive` with
`{ exact: true }`, which required an exact URL match including query
parameters. When visiting `/update-guide?v=19.0-20.0&l=1`, the link
`/update-guide` didn't match, so the active class wasn't applied.
Updated `routerLinkActiveOptions` to ignore query parameters while
maintaining exact path matching so the navigation item stays highlighted
when interacting with the update guide form.
130 lines
5.2 KiB
HTML
130 lines
5.2 KiB
HTML
<ng-template #navigationList let-navigationItems>
|
|
<ul
|
|
class="docs-navigation-list docs-faceted-list"
|
|
[class.docs-navigation-list-dropdown]="isDropdownView()"
|
|
>
|
|
@for (itemGroup of groupItems(navigationItems); track $index) {
|
|
@let groupLabel = itemGroup[0];
|
|
@let items = itemGroup[1];
|
|
@if (groupLabel) {
|
|
<li class="docs-navigation-group">{{groupLabel | titlecase}}</li>
|
|
}
|
|
@for (item of items; track $index) {
|
|
<li class="docs-faceted-list-item">
|
|
@let itemLabel = item.label!;
|
|
@if (item.path) {
|
|
@if (item.isExternal) {
|
|
<a
|
|
[href]="item.path"
|
|
target="_blank"
|
|
[matTooltip]="item.label"
|
|
[matTooltipDisabled]="itemLabel.length < 27"
|
|
matTooltipPosition="after"
|
|
[attr.aria-label]="item.label"
|
|
[matTooltipClass]="'API-tooltip'"
|
|
>
|
|
<span
|
|
[class.docs-external-link]="item.isExternal"
|
|
class="docs-faceted-list-item-text"
|
|
>
|
|
{{ item.label }}
|
|
<ng-container *ngTemplateOutlet="itemStatus; context: {$implicit: item}" />
|
|
</span>
|
|
|
|
@if (item.children && item.level! > 1 && !item.isExpanded) {
|
|
<docs-icon>chevron_right</docs-icon>
|
|
}
|
|
</a>
|
|
} @else {
|
|
<a
|
|
[routerLink]="'/' + item.path"
|
|
routerLinkActive="docs-faceted-list-item-active"
|
|
[routerLinkActiveOptions]="{ paths: 'exact', queryParams: 'ignored', matrixParams: 'ignored', fragment: 'ignored' }"
|
|
(click)="emitClickOnLink()"
|
|
[matTooltip]="item.label"
|
|
[matTooltipDisabled]="itemLabel.length < 27"
|
|
matTooltipPosition="after"
|
|
[attr.aria-label]="item.label"
|
|
[matTooltipClass]="'API-tooltip'"
|
|
>
|
|
<span class="docs-faceted-list-item-text">
|
|
{{item.label}}
|
|
<ng-container *ngTemplateOutlet="itemStatus; context: {$implicit: item}" />
|
|
</span>
|
|
|
|
@if (item.children && !item.isExpanded) {
|
|
<docs-icon>chevron_right</docs-icon>
|
|
}
|
|
</a>
|
|
}
|
|
} @else {
|
|
<!-- Nav Section Header -->
|
|
@if (item.level !== collapsableLevel() && item.level !== expandableLevel()) {
|
|
<div
|
|
class="docs-secondary-nav-header"
|
|
[matTooltip]="item.label"
|
|
[matTooltipDisabled]="itemLabel.length < 27"
|
|
matTooltipPosition="after"
|
|
[attr.aria-label]="item.label"
|
|
[matTooltipClass]="'API-tooltip'"
|
|
>
|
|
<span class="docs-faceted-list-item-text">
|
|
{{item.label}}
|
|
<ng-container *ngTemplateOutlet="itemStatus; context: {$implicit: item}" />
|
|
</span>
|
|
</div>
|
|
}
|
|
|
|
<!-- Nav Button Expand/Collapse -->
|
|
@if (
|
|
(item.children && item.level === expandableLevel()) || item.level === collapsableLevel()
|
|
) {
|
|
<button
|
|
type="button"
|
|
(click)="toggle(item)"
|
|
[attr.aria-label]="(item.isExpanded ? 'Collapse' : 'Expand') + ' ' + item.label"
|
|
[attr.aria-expanded]="item.isExpanded"
|
|
class="docs-secondary-nav-button"
|
|
[class.docs-faceted-list-item-active]="item | isActiveNavigationItem: activeItem()"
|
|
[class.docs-expanded-button]="item.children && item.level == collapsableLevel()"
|
|
[class.docs-not-expanded-button]="item.children && item.level === expandableLevel()"
|
|
[class.docs-nav-item-has-icon]="
|
|
item.children && item.level === expandableLevel() && !item.isExpanded"
|
|
[matTooltip]="item.label"
|
|
[matTooltipDisabled]="itemLabel.length < 27"
|
|
matTooltipPosition="after"
|
|
[attr.aria-label]="item.label"
|
|
[matTooltipClass]="'API-tooltip'"
|
|
>
|
|
@if (item.children && item.level === collapsableLevel()) {
|
|
<docs-icon>arrow_back</docs-icon>
|
|
}
|
|
<span class="docs-faceted-list-item-text">
|
|
{{ item.label }}
|
|
<ng-container *ngTemplateOutlet="itemStatus; context: {$implicit: item}" />
|
|
</span>
|
|
</button>
|
|
}
|
|
}
|
|
@if (
|
|
item.level && displayItemsToLevel() > item.level && item.children && item.children.length > 0
|
|
) {
|
|
<ng-container
|
|
*ngTemplateOutlet="navigationList; context: {$implicit: item.children, level: item.level}"
|
|
/>
|
|
}
|
|
</li>
|
|
}
|
|
}
|
|
</ul>
|
|
</ng-template>
|
|
|
|
<ng-container *ngTemplateOutlet="navigationList; context: {$implicit: navigationItems()}" />
|
|
|
|
<ng-template let-item #itemStatus>
|
|
@if (item.status === 'new') {
|
|
<span class="tag docs-new-item">New</span>
|
|
} @else if (item.status === 'updated') {
|
|
<span class="tag docs-updated-item">Updated</span>
|
|
}
|
|
</ng-template>
|