Add ability to display revisions

This commit is contained in:
Tom Raithel
2017-08-22 22:31:50 +02:00
parent 33e66cb6fe
commit 113858c170
17 changed files with 97 additions and 8 deletions

View File

@@ -1,8 +1,10 @@
import React from 'react'; import React from 'react';
import classNames from 'classnames';
export default function({ children }) { export default function({ children, secondary = false }) {
return ( return (
<div className="headline-group"> <div
className={classNames('headline-group', {'headline-group--secondary': secondary})}>
{children} {children}
</div> </div>
); );

8
js/components/IsNew.js Normal file
View File

@@ -0,0 +1,8 @@
import React from 'react';
export default function IsNew({ item }) {
if (item.isNew) {
return <span className="is-new">NEW</span>;
}
return null;
}

View File

@@ -1,6 +1,7 @@
import React from 'react'; import React from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import Link from './Link'; import Link from './Link';
import IsNew from './IsNew';
export default function Item({ item, noLeadingBorder = false, active = false, style = {}}) { export default function Item({ item, noLeadingBorder = false, active = false, style = {}}) {
return ( return (
@@ -12,7 +13,10 @@ export default function Item({ item, noLeadingBorder = false, active = false, st
pageName={`${item.quadrant}/${item.name}`} pageName={`${item.quadrant}/${item.name}`}
style={style} style={style}
> >
<div className="item__title">{item.title}</div> <div className="item__title">
{item.title}
<IsNew item={item} />
</div>
{ {
item.info && ( item.info && (
<div className="item__info">{item.info}</div> <div className="item__info">{item.info}</div>

View File

@@ -0,0 +1,14 @@
import React from 'react';
import Badge from './Badge';
import { formatRelease } from '../date';
export default function ItemRevision({ revision }) {
return (
<div className="item-revision">
<div>
<Badge type={revision.ring}>{revision.ring} | {formatRelease(revision.release)}</Badge>
</div>
<div className="markdown" dangerouslySetInnerHTML={{__html: revision.body}} />
</div>
);
}

View File

@@ -0,0 +1,17 @@
import React from 'react';
import HeadlineGroup from './HeadlineGroup';
import ItemRevision from './ItemRevision';
export default function ItemRevisions({ revisions }) {
return (
<div>
<HeadlineGroup secondary>
<h4 className="headline headline--dark">
Revisions:
</h4>
</HeadlineGroup>
{revisions.map((revision) => <ItemRevision key={revision.release} revision={revision} />)}
</div>
);
}

View File

@@ -1,15 +1,18 @@
import React from 'react'; import React from 'react';
import { formatRelease } from '../date';
import HeroHeadline from './HeroHeadline'; import HeroHeadline from './HeroHeadline';
import QuadrantGrid from './QuadrantGrid'; import QuadrantGrid from './QuadrantGrid';
import Fadeable from './Fadeable'; import Fadeable from './Fadeable';
import SetTitle from './SetTitle'; import SetTitle from './SetTitle';
export default function PageIndex({ leaving, onLeave, items, navigate, ...props }) { export default function PageIndex({ leaving, onLeave, items, navigate, ...props }) {
const newestRelease = props.releases.slice(-1)[0];
return ( return (
<Fadeable leaving={leaving} onLeave={onLeave}> <Fadeable leaving={leaving} onLeave={onLeave}>
<SetTitle {...props} title="Technology Radar" /> <SetTitle {...props} title="Technology Radar" />
<div className="headline-group"> <div className="headline-group">
<HeroHeadline alt="March 2017">AOE Technology Radar</HeroHeadline> <HeroHeadline alt={formatRelease(newestRelease)}>AOE Technology Radar</HeroHeadline>
</div> </div>
<QuadrantGrid items={items} /> <QuadrantGrid items={items} />
</Fadeable> </Fadeable>

View File

@@ -4,6 +4,8 @@ import ItemList from './ItemList';
import Link from './Link'; import Link from './Link';
import FooterEnd from './FooterEnd'; import FooterEnd from './FooterEnd';
import SetTitle from './SetTitle'; import SetTitle from './SetTitle';
import ItemRevisions from './ItemRevisions';
import IsNew from './IsNew';
import { createAnimation, createAnimationRunner } from '../animation'; import { createAnimation, createAnimationRunner } from '../animation';
import { translate } from '../../common/config'; import { translate } from '../../common/config';
@@ -207,6 +209,7 @@ class PageItem extends React.Component {
</div> </div>
</div> </div>
<div className="markdown" dangerouslySetInnerHTML={{__html: item.body}} /> <div className="markdown" dangerouslySetInnerHTML={{__html: item.body}} />
{item.revisions.length > 1 && <ItemRevisions revisions={item.revisions.slice(1)} />}
</div> </div>
</div> </div>
</div> </div>

View File

@@ -4,6 +4,7 @@ import ItemList from './ItemList';
import Link from './Link'; import Link from './Link';
import Fadeable from './Fadeable'; import Fadeable from './Fadeable';
import SetTitle from './SetTitle'; import SetTitle from './SetTitle';
import ItemRevisions from './ItemRevisions';
import { translate } from '../../common/config'; import { translate } from '../../common/config';
import { groupByQuadrants } from '../../common/model'; import { groupByQuadrants } from '../../common/model';
@@ -43,6 +44,7 @@ class PageItem extends React.Component {
</div> </div>
</div> </div>
<div className="markdown" dangerouslySetInnerHTML={{__html: item.body}} /> <div className="markdown" dangerouslySetInnerHTML={{__html: item.body}} />
{item.revisions.length > 1 && <ItemRevisions revisions={item.revisions.slice(1)} />}
</div> </div>
</div> </div>
</div> </div>

View File

@@ -7,6 +7,7 @@ import Link from './Link';
import Search from './Search'; import Search from './Search';
import Fadeable from './Fadeable'; import Fadeable from './Fadeable';
import SetTitle from './SetTitle'; import SetTitle from './SetTitle';
import IsNew from './IsNew';
import { groupByFirstLetter } from '../../common/model'; import { groupByFirstLetter } from '../../common/model';
import { translate } from '../../common/config'; import { translate } from '../../common/config';
@@ -130,7 +131,10 @@ class PageOverview extends React.Component {
> >
<div className="split split--overview"> <div className="split split--overview">
<div className="split__left"> <div className="split__left">
<div className="item__title">{item.title}</div> <div className="item__title">
{item.title}
<IsNew item={item} />
</div>
</div> </div>
<div className="split__right"> <div className="split__right">
<div className="nav nav--relations"> <div className="nav nav--relations">

View File

@@ -3,6 +3,7 @@ import { translate, rings } from '../../common/config';
import Badge from './Badge'; import Badge from './Badge';
import Link from './Link'; import Link from './Link';
import ItemList from './ItemList'; import ItemList from './ItemList';
import IsNew from './IsNew';
const renderList = (ringName, quadrantName, groups, big) => { const renderList = (ringName, quadrantName, groups, big) => {
const itemsInRing = groups[quadrantName][ringName]; const itemsInRing = groups[quadrantName][ringName];
@@ -26,7 +27,10 @@ const renderList = (ringName, quadrantName, groups, big) => {
key={item.name} key={item.name}
className="ring-list__item" className="ring-list__item"
> >
<Link className="link" pageName={`${item.quadrant}/${item.name}`}>{item.title}</Link> <Link className="link" pageName={`${item.quadrant}/${item.name}`}>
{item.title}
<IsNew item={item} />
</Link>
</span> </span>
)) ))
} }

6
js/date.js Normal file
View File

@@ -0,0 +1,6 @@
import moment from 'moment';
const isoDateToMoment = isoDate => moment(isoDate, 'YYYY-MM-DD');
export const formatRelease = isoDate =>
isoDateToMoment(isoDate).format('MMMM YYYY');

View File

@@ -0,0 +1,5 @@
---
ring: adopt
---
TODO: Updated text here!

View File

@@ -3,4 +3,11 @@
@media (--until-sm) { @media (--until-sm) {
margin: 30px 0; margin: 30px 0;
} }
&--secondary {
margin: 10px 0;
@media (--until-sm) {
margin: 5px 0;
}
}
} }

View File

@@ -4,4 +4,8 @@
color: var(--color-white); color: var(--color-white);
font-size: 20px; font-size: 20px;
font-weight: normal; font-weight: normal;
&--dark {
color: var(--color-gray-light);
}
} }

View File

@@ -7,4 +7,5 @@
position: relative; position: relative;
vertical-align: top; vertical-align: top;
margin-top: -2px; margin-top: -2px;
left: 5px;
} }

View File

@@ -0,0 +1,5 @@
.item-revision {
&+.item-revision {
margin-top: 40px;
}
}

View File

@@ -37,8 +37,8 @@ watch(jsPath(), options, watchBuild('pages'));
watch(assetsPath(), options, watchBuild('assets')); watch(assetsPath(), options, watchBuild('assets'));
watch(radarPath(), options, watchBuild('pages')); watch(radarPath(), options, watchBuild('pages'));
var params = { const params = {
root: relativePath('dist'), root: relativePath('dist'),
logLevel: 2, // 0 = errors only, 1 = some, 2 = lots logLevel: 0, // 0 = errors only, 1 = some, 2 = lots
}; };
liveServer.start(params); liveServer.start(params);