Skip to content

Commit f8011d2

Browse files
authored
fix: add search to documentation website (#404)
* navsearch component created * swap parent to child * added case insensitivity to navsearch * navsearch demoted to stateless component, added jennas merge-fix of change and search handler * searchbar now sandwiched between Getting Started and Components sections * sfix for search: it now does real-time filtering when backspacing as well * items with sortorder 1 no longer disappear during search * navsearch replaced with fundamental-react inputgroup search - includes icon * finished search, refactored - cleaner * search feature functionality -- extraneous additions removed. * removed white diffs * fixed: no results found notice is no longer a header. * fixed: removed routedItems since everything is going through state * fixed css on input group so that it works on chrome and ff per greg * in-progress: map function for futureproofing map for navItems -- hardcode and splice removed * fixed: error where adding a category would remove another category from navbar * resolved hard-coded search results check * switched from sandwich search to top search * search bar moved to under title, above all headers * Added RouteNotFound back * Removed omitSearch from sections * Removed 'no results found' logic
1 parent 9f2e6da commit f8011d2

File tree

2 files changed

+88
-56
lines changed

2 files changed

+88
-56
lines changed

src/_playground/App.scss

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ $fd-fonts-path: '../../node_modules/fiori-fundamentals/dist/fonts/';
2929
color: inherit;
3030
}
3131
}
32-
3332
.frDocs-Nav {
3433
border-top: 2px solid #dbe7f3;
3534
height: 90%;
@@ -66,6 +65,9 @@ $fd-fonts-path: '../../node_modules/fiori-fundamentals/dist/fonts/';
6665
padding-left: 34px;
6766
}
6867
}
68+
.frDocs-Nav__inputGroup {
69+
padding: 5px 20px;
70+
}
6971
}
7072

7173
.frDocs-Content {

src/_playground/Routes.js

Lines changed: 85 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { IconComponent } from '../Icon/Icon.Component';
1616
import { IdentifierComponent } from '../Identifier/Identifier.Component';
1717
import { ImageComponent } from '../Image/Image.Component';
1818
import { InlineHelpComponent } from '../InlineHelp/InlineHelp.Component';
19+
import { InputGroup } from '../InputGroup/InputGroup';
1920
import { InputGroupComponent } from '../InputGroup/InputGroup.Component';
2021
import { ListGroupComponent } from '../ListGroup/ListGroup.Component';
2122
import { LocalizationEditorComponent } from '../LocalizationEditor/LocalizationEditor.Component';
@@ -25,7 +26,6 @@ import { MultiInputComponent } from '../MultiInput/MultiInput.Component';
2526
import { PaginationComponent } from '../Pagination/Pagination.Component';
2627
import { PanelComponent } from '../Panel/Panel.Component';
2728
import { PopoverComponent } from '../Popover/Popover.Component';
28-
import React from 'react';
2929
import { SearchInputComponent } from '../SearchInput/SearchInput.Component';
3030
import { ShellbarComponent } from '../Shellbar/Shellbar.Component';
3131
import { SideNavigationComponent } from '../SideNavigation/SideNavigation.Component';
@@ -39,6 +39,7 @@ import { ToggleComponent } from '../Toggle/Toggle.Component';
3939
import { TokenComponent } from '../Token/Token.Component';
4040
import { TreeViewComponent } from '../TreeView/TreeView.Component';
4141
import { BrowserRouter, Link, NavLink, Redirect, Route, Switch } from 'react-router-dom';
42+
import React, { Component } from 'react';
4243

4344
const sections = [
4445
{
@@ -57,7 +58,8 @@ const routes = [
5758
name: 'Home',
5859
component: Home,
5960
section: 'Getting Started',
60-
sortOrder: 1 // this one should always come first
61+
sortOrder: 1, // this one should always come first
62+
omitSearch: true //should not be filtered for search
6163
},
6264
{
6365
url: '/actionBar',
@@ -278,60 +280,88 @@ const RouteNotFound = () => (
278280
</div>
279281
);
280282

281-
export const Routes = () => {
282-
let sectionRoutes;
283-
const groupedRoutes = groupArray(routes, 'section');
283+
export class Routes extends Component {
284+
constructor(props) {
285+
super(props);
286+
this.state = {
287+
query: '',
288+
filteredItems: routes
289+
};
290+
}
284291

285-
const navItems = sections.sort(sortBy('sortOrder', 'name')).map(section => {
286-
if (!groupedRoutes[section.name]) {
287-
return;
288-
}
292+
onChangeHandler = (event) => {
293+
let searchResults = routes.filter((navItem) => {
294+
return navItem.omitSearch ? navItem : navItem.name.toLowerCase().includes(event.target.value.toLowerCase());
295+
});
296+
this.setState({
297+
query: event.target.value,
298+
filteredItems: [...searchResults]
299+
});
300+
};
289301

290-
sectionRoutes = groupedRoutes[section.name].sort(sortBy('sortOrder', 'name'));
291-
return (
292-
<ul className='frDocs-Nav__list' key={section.name}>
293-
<li className='frDocs-Nav__headers'>{section.name}</li>
294-
{sectionRoutes.map(route => (
295-
<li key={route.name}>
296-
<NavLink
297-
activeClassName='frDocs-Nav__item--active'
298-
className='frDocs-Nav__item'
299-
key={route.url}
300-
to={{ pathname: route.url }}>
301-
{route.name}
302-
</NavLink>
303-
</li>
304-
))}
305-
</ul>
306-
);
307-
});
302+
render() {
303+
let sectionRoutes;
304+
const groupedRoutes = groupArray(this.state.filteredItems, 'section');
308305

309-
return (
310-
<BrowserRouter basename={process.env.PUBLIC_URL}>
311-
<div className='frDocs-Container'>
312-
<div className='frDocs-Sidebar'>
313-
<h1 className='frDocs-Logo'>FUNDAMENTAL REACT</h1>
314-
<nav className='frDocs-Nav'>
315-
{navItems}
316-
</nav>
317-
</div>
318-
<div className='frDocs-Content'>
319-
<Switch>
320-
{routes.map(route => {
321-
return (
322-
<Route
323-
component={route.component}
324-
exact
325-
key={route.url}
326-
path={route.url} />
327-
);
328-
})}
329-
<Redirect exact from=''
330-
to='/home' />
331-
<Route component={RouteNotFound} />
332-
</Switch>
306+
let navItems = sections.sort(sortBy('sortOrder', 'name')).map(section => {
307+
if (!groupedRoutes[section.name]) {
308+
return;
309+
}
310+
311+
sectionRoutes = groupedRoutes[section.name].sort(sortBy('sortOrder', 'name'));
312+
return (
313+
<ul className='frDocs-Nav__list' key={section.name}>
314+
<li className='frDocs-Nav__headers'>{section.name}</li>
315+
{sectionRoutes.map(route => (
316+
<li key={route.name}>
317+
<NavLink
318+
activeClassName='frDocs-Nav__item--active'
319+
className='frDocs-Nav__item'
320+
key={route.url}
321+
to={{ pathname: route.url }}>
322+
{route.name}
323+
</NavLink>
324+
</li>
325+
))}
326+
</ul>
327+
);
328+
});
329+
330+
return (
331+
<BrowserRouter basename={process.env.PUBLIC_URL}>
332+
<div className='frDocs-Container'>
333+
<div className='frDocs-Sidebar'>
334+
<h1 className='frDocs-Logo'>FUNDAMENTAL REACT</h1>
335+
<nav className='frDocs-Nav'>
336+
<div className='frDocs-Nav__inputGroup'>
337+
<InputGroup
338+
inputId='frDocs-Nav__search'
339+
inputPlaceholder='Search'
340+
inputType='search'
341+
inputValue={this.state.query}
342+
onChange={this.onChangeHandler} />
343+
</div>
344+
{navItems}
345+
</nav>
346+
</div>
347+
<div className='frDocs-Content'>
348+
<Switch>
349+
{routes.map(route => {
350+
return (
351+
<Route
352+
component={route.component}
353+
exact
354+
key={route.url}
355+
path={route.url} />
356+
);
357+
})}
358+
<Redirect exact from=''
359+
to='/home' />
360+
<Route component={RouteNotFound} />
361+
</Switch>
362+
</div>
333363
</div>
334-
</div>
335-
</BrowserRouter>
336-
);
337-
};
364+
</BrowserRouter>
365+
);
366+
}
367+
}

0 commit comments

Comments
 (0)