diff --git a/common/config.js b/common/config.js index d848b4a..0df4436 100644 --- a/common/config.js +++ b/common/config.js @@ -7,12 +7,13 @@ export const getPageNames = (radar) => { ] } -const mappings = { +const messages = { 'languages-and-frameworks': 'Languages & Frameworks', 'methods-and-patterns': 'Methods & Patterns', 'platforms-and-aoe-services': 'Platforms and AOE Services', 'tools': 'Tools', }; +export const translate = (key) => (messages[key] || '-'); const formatRelease = (release) => moment(release, 'YYYY-MM-DD').format('MMM YYYY'); diff --git a/common/file.js b/common/file.js index 61de168..14e6cfb 100644 --- a/common/file.js +++ b/common/file.js @@ -10,10 +10,6 @@ export const radarPath = (...pathInSrc) => ( relativePath('radar', ...pathInSrc) ); -export const staticPath = (...pathInSrc) => ( - relativePath('static-pages', ...pathInSrc) -); - export const stylesPath = (...pathInSrc) => ( relativePath('styles', ...pathInSrc) ); diff --git a/common/model.js b/common/model.js new file mode 100644 index 0000000..f8678df --- /dev/null +++ b/common/model.js @@ -0,0 +1,43 @@ + +export const groupByQuadrants = (items) => ( + items.reduce((quadrants, item) => ({ + ...quadrants, + [item.quadrant]: addItemToQuadrant(quadrants[item.quadrant], item), + }), {}) +); + +export const groupByRing = (items) => ( + items.reduce((rings, item) => ({ + ...rings, + [item.ring]: addItemToList(rings[item.ring], item), + }), {}) +); + +export const groupByFirstLetter = (items) => { + const index = items.reduce((letterIndex, item) => ({ + ...letterIndex, + [getFirstLetter(item)]: addItemToList(letterIndex[getFirstLetter(item)], item), + }), {}); + + return Object.keys(index).sort().map((letter) => ({ + letter, + items: index[letter], + })); +} + +const addItemToQuadrant = (quadrant = {}, item) => ({ + ...quadrant, + [item.ring]: addItemToRing(quadrant[item.ring], item), +}); + +const addItemToList = (list = [], item) => ([ + ...list, + item, +]); + +const addItemToRing = (ring = [], item) => ([ + ...ring, + item, +]); + +export const getFirstLetter = (item) => item.title.substr(0,1).toUpperCase(); diff --git a/common/radar.js b/common/radar.js index 20bccae..58f7c42 100644 --- a/common/radar.js +++ b/common/radar.js @@ -21,40 +21,6 @@ export const createRadar = async (tree) => { }; }; -export const groupByQuadrants = (items) => ( - items.reduce((quadrants, item) => ({ - ...quadrants, - [item.quadrant]: addItemToQuadrant(quadrants[item.quadrant], item), - }), {}) -); - -const addItemToQuadrant = (quadrant = {}, item) => ({ - ...quadrant, - [item.ring]: addItemToRing(quadrant[item.ring], item), -}); - -export const groupByFirstLetter = (items) => ( - items.reduce((letterIndex, item) => ({ - ...letterIndex, - [getFirstLetter(item)]: addItemToList(letterIndex[getFirstLetter(item)], item), - }), {}) -); - -export const groupByRing = (items) => ( - items.reduce((rings, item) => ({ - ...rings, - [item.ring]: addItemToList(rings[item.ring], item), - }), {}) -); - -const addItemToList = (list = [], item) => ([ - ...list, - item, -]); - -export const getFirstLetter = (item) => item.title.substr(0,1).toUpperCase(); - - const checkAttributes = (fileName, attributes) => { const rings = ['trial', 'assess', 'adopt', 'hold']; if (attributes.ring && !rings.includes(attributes.ring)) { @@ -187,8 +153,3 @@ const flagWithIsNew = (items, allReleases) => ( const isNewItem = (item, allReleases) => { return item.revisions.length > 1 && item.revisions[0].release === allReleases[allReleases.length-1] } - -const addItemToRing = (ring = [], item) => ([ - ...ring, - item, -]); diff --git a/js/components/PageOverview.js b/js/components/PageOverview.js index 146a1bf..7856745 100644 --- a/js/components/PageOverview.js +++ b/js/components/PageOverview.js @@ -2,6 +2,8 @@ import React from 'react'; import classNames from 'classnames'; import HeadlineGroup from './HeadlineGroup'; import HeroHeadline from './HeroHeadline'; +import { groupByFirstLetter } from '../../common/model'; +import { translate } from '../../common/config'; const rings = ['all', 'assess', 'trial', 'hold', 'adopt']; @@ -27,7 +29,19 @@ class PageOverview extends React.Component { return this.state.ring === ringName; } + getFilteredAndGroupedItems() { + const groups = groupByFirstLetter(this.props.items); + const groupsFiltered = groups.map(group => ({ + ...group, + items: group.items.filter(item => this.state.ring === 'all' || item.ring === this.state.ring), + })); + const nonEmptyGroups = groupsFiltered.filter(group => group.items.length > 0); + return nonEmptyGroups; + } + render() { + const groups = this.getFilteredAndGroupedItems(); + return (