import React from 'react'; import HeadlineGroup from './HeadlineGroup'; import HeroHeadline from './HeroHeadline'; import Badge from './Badge'; import Link from './Link'; import Search from './Search'; import Fadeable from './Fadeable'; import SetTitle from './SetTitle'; import Flag from './Flag'; import { groupByFirstLetter } from '../../common/model'; import { translate } from '../../common/config'; const rings = ['all', 'assess', 'trial', 'hold', 'adopt']; const containsSearchTerm = (text = '', term = '') => { // TODO search refinement return ( text .trim() .toLocaleLowerCase() .indexOf(term.trim().toLocaleLowerCase()) !== -1 ); }; class PageOverview extends React.Component { constructor(props, ...args) { super(props, ...args); this.state = { ring: rings[0], search: props.pageState.search || '', }; } componentWillReceiveProps(nextProps) { if (this.search !== nextProps.pageState.search) { this.setState({ ring: rings[0], search: nextProps.pageState.search, }); } } handleRingClick = ring => e => { e.preventDefault(); this.setState({ ring, }); }; isRingActive(ringName) { return this.state.ring === ringName; } itemMatchesRing = item => { return this.state.ring === 'all' || item.ring === this.state.ring; }; itemMatchesSearch = item => { return ( this.state.search.trim() === '' || containsSearchTerm(item.title, this.state.search) || containsSearchTerm(item.body, this.state.search) || containsSearchTerm(item.info, this.state.search) ); }; isItemVisible = item => { return this.itemMatchesRing(item) && this.itemMatchesSearch(item); }; getFilteredAndGroupedItems() { const groups = groupByFirstLetter(this.props.items); const groupsFiltered = groups.map(group => ({ ...group, items: group.items.filter(this.isItemVisible), })); const nonEmptyGroups = groupsFiltered.filter( group => group.items.length > 0, ); return nonEmptyGroups; } handleSearchTermChange = value => { this.setState({ search: value, }); }; render() { const groups = this.getFilteredAndGroupedItems(); return ( Technologies Overview
{rings.map(ringName => (
{ringName}
))}
{groups.map(({ letter, items }) => (
{letter}
{items.map(item => (
{item.title}
{translate(item.quadrant)}
{item.ring}
))}
))}
); } } export default PageOverview;