Switch page title for different pages

This commit is contained in:
Tom Raithel
2017-03-21 21:30:03 +01:00
parent 3fedd01d42
commit 169bfc74ec
9 changed files with 42 additions and 9 deletions

View File

@@ -47,6 +47,7 @@ If an item is overwritten in a new release, the attributes from the new item are
- [x] Implement search - [x] Implement search
- [ ] Finalize CSS - [ ] Finalize CSS
- [ ] Get contents for how-to-use page - [ ] Get contents for how-to-use page
- [ ] Show item history on details - [ ] Show item history on details (relevant with 2nd release)
- [ ] Better semantic and SEO - [ ] Better semantic and SEO
- [ ] Make mobile friendly - [ ] Make mobile friendly
- [ ] Create more react components for already existing CSS comps

View File

@@ -44,9 +44,13 @@ delete window.__TECHRADAR__;
// Create Redux store with initial state // Create Redux store with initial state
const store = createStore(appReducer, preloadedState, applyMiddleware(historyManager)) const store = createStore(appReducer, preloadedState, applyMiddleware(historyManager))
const handleSetTitle = (title) => {
document.title = `${title} | AOE Technology Radar`;
};
render( render(
<Provider store={store}> <Provider store={store}>
<App /> <App onSetTitle={handleSetTitle} />
</Provider>, </Provider>,
document.getElementById('root') document.getElementById('root')
) )

View File

@@ -1,10 +1,12 @@
import React from 'react'; import React from 'react';
import HeroHeadline from './HeroHeadline'; import HeroHeadline from './HeroHeadline';
import Fadeable from './Fadeable'; import Fadeable from './Fadeable';
import SetTitle from './SetTitle';
export default function PageHelp({ leaving, onLeave }) { export default function PageHelp({ leaving, onLeave, ...props }) {
return ( return (
<Fadeable leaving={leaving} onLeave={onLeave}> <Fadeable leaving={leaving} onLeave={onLeave}>
<SetTitle {...props} title="How to use AOE Technology Radar" />
<HeroHeadline>How to use AOE Technology Radar</HeroHeadline> <HeroHeadline>How to use AOE Technology Radar</HeroHeadline>
</Fadeable> </Fadeable>
); );

View File

@@ -2,10 +2,12 @@ import React from 'react';
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';
export default function PageIndex({ leaving, onLeave, items, navigate }) { export default function PageIndex({ leaving, onLeave, items, navigate, ...props }) {
return ( return (
<Fadeable leaving={leaving} onLeave={onLeave}> <Fadeable leaving={leaving} onLeave={onLeave}>
<SetTitle {...props} title="Technology Radar" />
<div className="headline-group"> <div className="headline-group">
<HeroHeadline alt="Mar 2017">AOE Technology Radar (beta)</HeroHeadline> <HeroHeadline alt="Mar 2017">AOE Technology Radar (beta)</HeroHeadline>
</div> </div>

View File

@@ -4,6 +4,7 @@ import Badge from './Badge';
import ItemList from './ItemList'; 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 { createAnimation, createAnimationRunner } from '../animation'; import { createAnimation, createAnimationRunner } from '../animation';
import { translate } from '../../common/config'; import { translate } from '../../common/config';
@@ -150,6 +151,7 @@ class PageItem extends React.Component {
const itemsInRing = this.getItemsInRing(this.props); const itemsInRing = this.getItemsInRing(this.props);
return ( return (
<div> <div>
<SetTitle {...this.props} title={item.title} />
<div className="item-page"> <div className="item-page">
<div className="item-page__nav"> <div className="item-page__nav">
<div className="item-page__nav__inner"> <div className="item-page__nav__inner">

View File

@@ -6,6 +6,7 @@ import Badge from './Badge';
import Link from './Link'; 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 { groupByFirstLetter } from '../../common/model'; import { groupByFirstLetter } from '../../common/model';
import { translate } from '../../common/config'; import { translate } from '../../common/config';
@@ -83,6 +84,7 @@ class PageOverview extends React.Component {
return ( return (
<Fadeable leaving={this.props.leaving} onLeave={this.props.onLeave}> <Fadeable leaving={this.props.leaving} onLeave={this.props.onLeave}>
<SetTitle {...this.props} title="Technologies Overview" />
<HeadlineGroup> <HeadlineGroup>
<HeroHeadline>Technologies Overview</HeroHeadline> <HeroHeadline>Technologies Overview</HeroHeadline>
</HeadlineGroup> </HeadlineGroup>

View File

@@ -3,14 +3,16 @@ import HeroHeadline from './HeroHeadline';
import HeadlineGroup from './HeadlineGroup'; import HeadlineGroup from './HeadlineGroup';
import QuadrantSection from './QuadrantSection'; import QuadrantSection from './QuadrantSection';
import Fadeable from './Fadeable'; import Fadeable from './Fadeable';
import SetTitle from './SetTitle';
import { translate } from '../../common/config'; import { translate } from '../../common/config';
import { groupByQuadrants } from '../../common/model'; import { groupByQuadrants } from '../../common/model';
export default function PageQuadrant({ leaving, onLeave, pageName, items }) { export default function PageQuadrant({ leaving, onLeave, pageName, items, ...props }) {
const groups = groupByQuadrants(items); const groups = groupByQuadrants(items);
return ( return (
<Fadeable leaving={leaving} onLeave={onLeave}> <Fadeable leaving={leaving} onLeave={onLeave}>
<SetTitle {...props} title={translate(pageName)} />
<HeadlineGroup> <HeadlineGroup>
<HeroHeadline>{translate(pageName)}</HeroHeadline> <HeroHeadline>{translate(pageName)}</HeroHeadline>
</HeadlineGroup> </HeadlineGroup>

16
js/components/SetTitle.js Normal file
View File

@@ -0,0 +1,16 @@
import React from 'react';
class SetTitle extends React.Component {
constructor(props) {
super(props);
if (typeof props.onSetTitle === 'function' && props.title) {
props.onSetTitle(props.title);
}
}
render() {
return null;
}
}
export default SetTitle;

View File

@@ -14,10 +14,12 @@ export const renderPage = (radar, pageName) => {
pageState: {}, pageState: {},
}); });
let pageTitle;
// Render the component to a string // Render the component to a string
const html = renderToString( const html = renderToString(
<Provider store={store}> <Provider store={store}>
<App /> <App onSetTitle={(title) => { pageTitle = title; }} />
</Provider> </Provider>
) )
@@ -25,14 +27,14 @@ export const renderPage = (radar, pageName) => {
const preloadedState = store.getState() const preloadedState = store.getState()
// Send the rendered page back to the client // Send the rendered page back to the client
return renderFullPage(html, preloadedState); return renderFullPage(html, pageTitle, preloadedState);
} }
const renderFullPage = (html, preloadedState) => { const renderFullPage = (html, pageTitle, preloadedState) => {
return ` return `
<html> <html>
<head> <head>
<title>AOE Technology Radar</title> <title>${pageTitle} | AOE Technology Radar</title>
<link rel="stylesheet" href="/styles.css"/> <link rel="stylesheet" href="/styles.css"/>
</head> </head>
<body> <body>