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 (
@@ -55,28 +69,37 @@ class PageOverview extends React.Component {
-
-
B
-
-
-
- - -
+ )) + } +
); diff --git a/tasks/watch.js b/tasks/watch.js index 64640c7..e53de63 100644 --- a/tasks/watch.js +++ b/tasks/watch.js @@ -8,9 +8,8 @@ import { jsPath, radarPath, staticPath, - templatesPath, distPath, -} from './file'; +} from '../common/file'; const runBuild = (name) => ( @@ -36,8 +35,6 @@ watch(stylesPath(), options, watchBuild('css')); watch(jsPath(), options, watchBuild('js')); watch(assetsPath(), options, watchBuild('assets')); watch(radarPath(), options, watchBuild('pages')); -watch(staticPath(), options, watchBuild('pages')); -watch(templatesPath(), options, watchBuild('pages')); var params = { root: distPath(), diff --git a/webpack.config.js b/webpack.config.js index 60a252a..d33d311 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -14,6 +14,7 @@ module.exports = { test: /\.js?$/, include: [ path.resolve(__dirname, "js"), + path.resolve(__dirname, "common"), ], loader: "babel-loader",