import React from 'react'; import classNames from 'classnames'; 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 { 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(...args) { super(...args); this.state = { ring: rings[0], 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;