Better AppHeader component. WIP.

This commit is contained in:
Andrey Okonetchnikov 2016-09-15 18:56:08 +02:00
parent 15d7043f9d
commit f6ab5e3d47
4 changed files with 120 additions and 32 deletions

View File

@ -0,0 +1,17 @@
:root {
--foregroundColor: #fff;
--backgroundColor: #272e30;
--textFieldBorderColor: #e7e7e7;
--highlightFGColor: #fff;
--highlightBGColor: #3ab7a5;
}
.appBar {
background-color: var(--backgroundColor);
}
.createBtn {
position: fixed;
right: 2rem;
top: 3.5rem;
}

View File

@ -0,0 +1,83 @@
import React from 'react';
import pluralize from 'pluralize';
import { IndexLink } from 'react-router';
import { Menu, MenuItem, Button } from 'react-toolbox';
import AppBar from 'react-toolbox/lib/app_bar';
import FindBar from '../../../containers/FindBar';
import styles from './AppHeader.css';
export default class AppHeader extends React.Component {
// props: {
// // collections: React.,
// // commands,
// // defaultCommands
// }
state = {
createMenuActive: false
}
handleCreatePostClick = collectionName => {
const { onCreateEntryClick } = this.props;
if (onCreateEntryClick) {
onCreateEntryClick(collectionName);
}
}
onCreateButtonClick = () => {
this.setState({
createMenuActive: true
});
}
onCreateMenuHide = () => {
this.setState({
createMenuActive: false
});
}
render() {
const { collections, commands, defaultCommands } = this.props;
const { createMenuActive } = this.state;
return (
<AppBar
fixed
theme={styles}
>
<IndexLink to="/">
Dashboard
</IndexLink>
<FindBar
commands={commands}
defaultCommands={defaultCommands}
/>
<Button
className={styles.createBtn}
icon='add'
floating
accent
onClick={this.onCreateButtonClick}
>
<Menu
active={createMenuActive}
position="topRight"
onHide={this.onCreateMenuHide}
>
{
collections.map(collection =>
<MenuItem
key={collection.get('name')}
value={collection.get('name')}
onClick={this.handleCreatePostClick.bind(this, collection.get('name'))}
caption={pluralize(collection.get('label'), 1)}
/>
)
}
</Menu>
</Button>
</AppBar>
);
}
}

View File

@ -2,3 +2,4 @@ export { default as Card } from './card/Card';
export { default as Loader } from './loader/Loader'; export { default as Loader } from './loader/Loader';
export { default as Icon } from './icon/Icon'; export { default as Icon } from './icon/Icon';
export { default as Toast } from './toast/Toast'; export { default as Toast } from './toast/Toast';
export { default as AppHeader } from './AppHeader/AppHeader';

View File

@ -1,21 +1,21 @@
import React from 'react'; import React from 'react';
import { connect } from 'react-redux';
import { IndexLink } from 'react-router';
import pluralize from 'pluralize'; import pluralize from 'pluralize';
import { connect } from 'react-redux';
import { Layout, Panel } from 'react-toolbox';
import { loadConfig } from '../actions/config'; import { loadConfig } from '../actions/config';
import { loginUser } from '../actions/auth'; import { loginUser } from '../actions/auth';
import { currentBackend } from '../backends/backend'; import { currentBackend } from '../backends/backend';
import { Loader } from '../components/UI';
import { import {
SHOW_COLLECTION, SHOW_COLLECTION,
CREATE_COLLECTION, CREATE_COLLECTION,
HELP, HELP,
createNewEntryInCollection createNewEntryInCollection
} from '../actions/findbar'; } from '../actions/findbar';
import FindBar from './FindBar'; import { AppHeader, Loader } from '../components/UI';
import styles from './App.css'; import styles from './App.css';
class App extends React.Component { class App extends React.Component {
componentDidMount() { componentDidMount() {
this.props.dispatch(loadConfig()); this.props.dispatch(loadConfig());
} }
@ -68,7 +68,7 @@ class App extends React.Component {
id: `show_${collection.get('name')}`, id: `show_${collection.get('name')}`,
pattern: `Show ${pluralize(collection.get('label'))}`, pattern: `Show ${pluralize(collection.get('label'))}`,
type: SHOW_COLLECTION, type: SHOW_COLLECTION,
payload: { collectionName:collection.get('name') } payload: { collectionName: collection.get('name') }
}); });
if (defaultCommands.length < 5) defaultCommands.push(`show_${collection.get('name')}`); if (defaultCommands.length < 5) defaultCommands.push(`show_${collection.get('name')}`);
@ -78,7 +78,7 @@ class App extends React.Component {
id: `create_${collection.get('name')}`, id: `create_${collection.get('name')}`,
pattern: `Create new ${pluralize(collection.get('label'), 1)}(:itemName as ${pluralize(collection.get('label'), 1)} Name)`, pattern: `Create new ${pluralize(collection.get('label'), 1)}(:itemName as ${pluralize(collection.get('label'), 1)} Name)`,
type: CREATE_COLLECTION, type: CREATE_COLLECTION,
payload: { collectionName:collection.get('name') } payload: { collectionName: collection.get('name') }
}); });
} }
}); });
@ -89,7 +89,7 @@ class App extends React.Component {
return { commands, defaultCommands }; return { commands, defaultCommands };
} }
handleCreatePostClick = collectionName => { onCreateEntryClick = collectionName => {
this.props.dispatch( this.props.dispatch(
createNewEntryInCollection(collectionName) createNewEntryInCollection(collectionName)
); );
@ -117,32 +117,19 @@ class App extends React.Component {
const { commands, defaultCommands } = this.generateFindBarCommands(); const { commands, defaultCommands } = this.generateFindBarCommands();
return ( return (
<div> <Layout>
<header className={styles.header}> <Panel scrollY>
<IndexLink to="/" className={styles.homeLink}> <AppHeader
Dashboard collections={collections}
</IndexLink>
<div className={styles.findBar}>
<FindBar
commands={commands} commands={commands}
defaultCommands={defaultCommands} defaultCommands={defaultCommands}
onCreateEntryClick={this.onCreateEntryClick}
/> />
</div> <div className={`${styles.alignable} ${styles.main}`}>
<div className={styles.actions}>
{
collections.map(collection =>
<button
onClick={this.handleCreatePostClick.bind(this, collection.get('name'))}
>
+ {pluralize(collection.get('label'), 1)}
</button>)
}
</div>
</header>
<div className={styles.main}>
{children} {children}
</div> </div>
</div> </Panel>
</Layout>
); );
} }
} }