feat(docs-infra): add useful links if landed on 404 page by ajitsinghkaler · Pull Request #34978 · angular/angular · GitHub
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions aio/scripts/_payload-limits.json
81 changes: 54 additions & 27 deletions aio/src/app/shared/search-results/search-results.component.html
Original file line number Diff line number Diff line change
@@ -1,30 +1,57 @@
<div class="search-results">
<div *ngIf="searchAreas.length; then searchResults; else notFound"></div>
<div class="search-results" [ngSwitch]="searchState">

<ng-container *ngSwitchCase="'in-progress'">
<p class="no-results">Searching ...</p>
</ng-container>

<ng-container *ngSwitchCase="'results-found'">
<h2 class="visually-hidden">Search Results</h2>
<div class="search-area" *ngFor="let area of searchAreas">
<h3 class="search-section-header">{{area.name}} ({{area.pages.length + area.priorityPages.length}})</h3>
<ul class="priority-pages" >
<li class="search-page" *ngFor="let page of area.priorityPages">
<a class="search-result-item" href="{{ page.path }}" (click)="onResultSelected(page, $event)">
<span class="symbol {{page.type}}" *ngIf="area.name === 'api'"></span>
<span [class.deprecated-api-item]="page.deprecated">{{ page.title }}</span>
</a>
</li>
</ul>
<ul>
<li class="search-page" *ngFor="let page of area.pages">
<a class="search-result-item" href="{{ page.path }}" (click)="onResultSelected(page, $event)">
<span class="symbol {{page.type}}" *ngIf="area.name === 'api'"></span>
<span [class.deprecated-api-item]="page.deprecated">{{ page.title }}</span>
</a>
</li>
</ul>
</div>
</ng-container>

<ng-container *ngSwitchCase="'no-results-found'">
<div class="search-area">
<p class="no-results">
No results found.<br>
Here are a few links that might be helpful in finding what you are looking for:
</p>
<ul class="priority-pages">
<li class="search-page">
<a class="search-result-item" href="api">API reference</a>
</li>
<li class="search-page">
<a class="search-result-item" href="resources">Resources</a>
</li>
<li class="search-page">
<a class="search-result-item" href="guide/glossary">Glossary</a>
</li>
<li class="search-page">
<a class="search-result-item" href="guide/cheatsheet">Cheat-sheet</a>
</li>
<li class="search-page">
<a class="search-result-item" href="https://blog.angular.io/">Angular blog</a>
</li>
Comment thread
gkalpak marked this conversation as resolved.
Outdated
</ul>
</div>
</ng-container>
</div>

<ng-template #searchResults>
<h2 class="visually-hidden">Search Results</h2>
<div class="search-area" *ngFor="let area of searchAreas">
<h3 class="search-section-header">{{area.name}} ({{area.pages.length + area.priorityPages.length}})</h3>
<ul class="priority-pages" >
<li class="search-page" *ngFor="let page of area.priorityPages">
<a class="search-result-item" href="{{ page.path }}" (click)="onResultSelected(page, $event)">
<span class="symbol {{page.type}}" *ngIf="area.name === 'api'"></span>
<span [class.deprecated-api-item]="page.deprecated">{{ page.title }}</span>
</a>
</li>
</ul>
<ul>
<li class="search-page" *ngFor="let page of area.pages">
<a class="search-result-item" href="{{ page.path }}" (click)="onResultSelected(page, $event)">
<span class="symbol {{page.type}}" *ngIf="area.name === 'api'"></span>
<span [class.deprecated-api-item]="page.deprecated">{{ page.title }}</span>
</a>
</li>
</ul>
</div>
</ng-template>

<ng-template #notFound>
<p class="not-found">{{notFoundMessage}}</p>
</ng-template>
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,12 @@ describe('SearchResultsComponent', () => {
expect(getText()).toContain('Searching ...');
});

it('should not display default links while searching', () => {
fixture.detectChanges();
const resultLinks = fixture.debugElement.queryAll(By.css('.search-page a'));
expect(resultLinks.length).toEqual(0);
});

describe('when a search result anchor is clicked', () => {
let searchResult: SearchResult;
let selected: SearchResult|null;
Expand Down Expand Up @@ -214,9 +220,25 @@ describe('SearchResultsComponent', () => {
});

describe('when no query results', () => {
it('should display "not found" message', () => {
beforeEach(() => {
setSearchResults('something', []);
});

it('should display "not found" message', () => {
expect(getText()).toContain('No results');
});

it('should contain reference links', () => {
const resultLinks = fixture.debugElement.queryAll(By.css('.search-page a'));
const resultHrefs = resultLinks.map(a => a.nativeNode.getAttribute('href'));
expect(resultHrefs.length).toEqual(5);
expect(resultHrefs).toEqual([
'api',
'resources',
'guide/glossary',
'guide/cheatsheet',
'https://blog.angular.io/',
]);
});
});
});
16 changes: 14 additions & 2 deletions aio/src/app/shared/search-results/search-results.component.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
import { Component, EventEmitter, Input, OnChanges, Output } from '@angular/core';
import { SearchResult, SearchResults, SearchArea } from 'app/search/interfaces';

enum SearchState {
InProgress = 'in-progress',
ResultsFound = 'results-found',
NoResultsFound = 'no-results-found'
}

/**
* A component to display search results in groups
*/
Expand All @@ -23,11 +29,18 @@ export class SearchResultsComponent implements OnChanges {
resultSelected = new EventEmitter<SearchResult>();

readonly defaultArea = 'other';
notFoundMessage = 'Searching ...';
searchState: SearchState = SearchState.InProgress;
readonly topLevelFolders = ['guide', 'tutorial'];
searchAreas: SearchArea[] = [];

ngOnChanges() {
if (this.searchResults === null) {
this.searchState = SearchState.InProgress;
} else if (this.searchResults.results.length) {
this.searchState = SearchState.ResultsFound;
} else {
this.searchState = SearchState.NoResultsFound;
}
this.searchAreas = this.processSearchResults(this.searchResults);
}

Expand All @@ -43,7 +56,6 @@ export class SearchResultsComponent implements OnChanges {
if (!search) {
return [];
}
this.notFoundMessage = 'No results found.';
const searchAreaMap: { [key: string]: SearchResult[] } = {};
search.results.forEach(result => {
if (!result.title) { return; } // bad data; should fix
Expand Down
11 changes: 10 additions & 1 deletion aio/src/styles/2-modules/_search-results.scss