Add settings manager pages

This commit is contained in:
Pierre BURGY 2016-09-09 10:45:58 +02:00
parent 4715bf4d6f
commit 481c178cd6
28 changed files with 471 additions and 81 deletions

View File

@ -53,9 +53,8 @@ const rootRoute = {
// import SettingsManagerApp from 'containers/App/index';
// const render = () => (
// {/*<Provider store={store}>*/}
// {/*<SettingsManagerApp></SettingsManagerApp>*/}
// {/*<Router*/}
// {/*{<Provider store={store}>}*/}
// {/*{<Router}*/}
// {/*history={history}*/}
// {/*routes={rootRoute}*/}
// {/*render={*/}
@ -92,8 +91,6 @@ const rootRoute = {
// import { install } from 'offline-plugin/runtime';
// install();
import SettingsManagerHomePage from 'containers/HomePage/index';
// Register the plugin
window.Strapi.registerPlugin({
name: 'Settings Manager',
@ -104,5 +101,4 @@ window.Strapi.registerPlugin({
},
routes: rootRoute,
mainComponent: App,
homePage: SettingsManagerHomePage,
});

View File

@ -0,0 +1,33 @@
/**
*
* Container
*
*/
import React from 'react';
import LeftMenu from 'components/LeftMenu';
import styles from './styles.css';
class Container extends React.Component { // eslint-disable-line react/prefer-stateless-function
render() {
return (
<div className={styles.container}>
<div className={`row row-eq-height ${styles.containerContent}`}>
<div className={`col-lg-3 p-l-0 p-r-0 ${styles.containerLeftContent}`}>
<LeftMenu></LeftMenu>
</div>
<div className={`col-lg-9 ${styles.containerRightContent}`}>
{this.props.children}
</div>
</div>
</div>
);
}
}
Container.propTypes = {
children: React.PropTypes.object,
};
export default Container;

View File

@ -0,0 +1,21 @@
.container { /* stylelint-disable */
}
.containerContent {
position: relative;
border: 1px solid #D7D8D9;
border-radius: 0.4rem;
overflow: hidden;
display: flex;
}
.containerLeftContent {
padding-left: 0;
padding-right: 0;
}
.containerRightContent {
background-color: #FFF;
padding: 2.4rem 3rem 50rem;
}

View File

@ -0,0 +1,11 @@
// import Container from '../index';
import expect from 'expect';
// import { shallow } from 'enzyme';
// import React from 'react';
describe('<Container />', () => {
it('Expect to have unit tests specified', () => {
expect(true).toEqual(true);
});
});

View File

@ -14,24 +14,30 @@ class LeftMenu extends React.Component { // eslint-disable-line react/prefer-sta
const links = [{
label: 'General',
value: 'general',
to: '',
}, {
label: 'Languages',
value: 'languages',
to: 'languages',
}, {
label: 'Databases',
value: 'databases',
to: 'databases',
}, {
label: 'Security',
value: 'security',
to: 'security',
}, {
label: 'Server',
value: 'server',
to: 'server',
}, {
label: 'Advanced',
value: 'advanced',
to: 'advanced',
}];
const linksElems = links.map((link, i) => (<LeftMenuLink key={i} label={link.label} value={link.value}></LeftMenuLink>));
const linksElems = links.map((link, i) => (<LeftMenuLink key={i} link={link}></LeftMenuLink>));
return (
<div className={styles.leftMenu}>

View File

@ -5,13 +5,18 @@
*/
import React from 'react';
import { Link } from 'react-router';
import styles from './styles.css';
class LeftMenuLink extends React.Component { // eslint-disable-line react/prefer-stateless-function
render() {
return (
<li className={styles.leftMenuLink}><a className={styles.leftMenuLinkDestination} href>{this.props.label}</a></li>
<li className={styles.leftMenuLink}>
<Link className={styles.leftMenuLinkDestination} activeClassName={styles.leftMenuLinkDestinationActive} to={`/plugins/settings-manager/${this.props.link.to}`}>{this.props.link.label}
<i className={`ion ion-arrow-right-c ${styles.leftMenuLinkIcon}`}></i>
</Link>
</li>
);
}
}
@ -19,6 +24,5 @@ class LeftMenuLink extends React.Component { // eslint-disable-line react/prefer
export default LeftMenuLink;
LeftMenuLink.propTypes = {
label: React.PropTypes.string,
value: React.PropTypes.string,
link: React.PropTypes.object,
};

View File

@ -4,15 +4,38 @@
.leftMenuLinkDestination {
display: block;
position: relative;
color: #3B3F49;
padding-left: 2rem;
padding-right: 2rem;
line-height: 3.6rem;
font-size: 1.4rem;
border-radius: 2rem;
&:hover {
color: white;
text-decoration: none;
background-color: #1C5DE7;
}
}
.leftMenuLinkDestination:hover {
color: white;
text-decoration: none;
background-color: #1C5DE7;
}
.leftMenuLinkDestinationActive {
color: white;
text-decoration: none;
background-color: #1C5DE7;
}
.leftMenuLinkDestinationActive .leftMenuLinkIcon {
display: block;
}
.leftMenuLinkIcon {
display: none;
float: right;
padding-top: 1.1rem;
z-index: 10;
}
.leftMenuLinkDestination:hover .leftMenuLinkIcon {
display: block;
}

View File

@ -0,0 +1,27 @@
/**
*
* RightContentSectionTitle
*
*/
import React from 'react';
import styles from './styles.css';
class RightContentSectionTitle extends React.Component { // eslint-disable-line react/prefer-stateless-function
render() {
return (
<div>
<h3 className={styles.rightContentSectionTitle}>{this.props.title}</h3>
<p className={styles.rightContentSectionSubTitle}>{this.props.description}</p>
</div>
);
}
}
RightContentSectionTitle.propTypes = {
title: React.PropTypes.string,
description: React.PropTypes.string,
};
export default RightContentSectionTitle;

View File

@ -0,0 +1,11 @@
.rightContentSectionTitle { /* stylelint-disable */
text-transform: uppercase;
font-size: 1.4rem;
margin-top: 2.6rem;
}
.rightContentSectionSubTitle {
color: #8B91A0;
font-size: 1.2rem;
margin-bottom: 1.2rem;
}

View File

@ -0,0 +1,11 @@
// import RightContentSectionTitle from '../index';
import expect from 'expect';
// import { shallow } from 'enzyme';
// import React from 'react';
describe('<RightContentSectionTitle />', () => {
it('Expect to have unit tests specified', () => {
expect(true).toEqual(true);
});
});

View File

@ -12,12 +12,17 @@ class RightContentTitle extends React.Component { // eslint-disable-line react/p
render() {
return (
<div className={styles.rightContentTitle}>
<h2 className={styles.rightContentTitleName}>General</h2>
<p className={styles.rightContentTitleDescription}>Configure your general settings</p>
<h2 className={styles.rightContentTitleName}>{this.props.title}</h2>
<p className={styles.rightContentTitleDescription}>{this.props.description}</p>
<hr className={styles.rigthContentTitleSeparator}></hr>
</div>
);
}
}
RightContentTitle.propTypes = {
title: React.PropTypes.string,
description: React.PropTypes.string,
};
export default RightContentTitle;

View File

@ -0,0 +1,35 @@
/*
*
* AdvancedPage
*
*/
import React from 'react';
import Helmet from 'react-helmet';
import PluginHeader from 'components/PluginHeader';
import Container from 'components/Container';
import RightContentTitle from 'components/RightContentTitle';
import RightContentSectionTitle from 'components/RightContentSectionTitle';
import styles from './styles.css';
export default class AdvancedPage extends React.Component { // eslint-disable-line react/prefer-stateless-function
render() {
return (
<div className={styles.advancedPage}>
<Helmet
title="Settings Manager - Advanced"
meta={[
{ name: 'description', content: 'Configure your Advanced settings.' },
]}
/>
<div className="container">
<PluginHeader></PluginHeader>
<Container>
<RightContentTitle title="Advanced" description="Configure your advanced settings."></RightContentTitle>
<RightContentSectionTitle title="Coming soon" description=""></RightContentSectionTitle>
</Container>
</div>
</div>
);
}
}

View File

@ -0,0 +1,3 @@
.advancedPage { /* stylelint-disable */
}

View File

@ -0,0 +1,11 @@
// import AdvancedPage from '../index';
import expect from 'expect';
// import { shallow } from 'enzyme';
// import React from 'react';
describe('<AdvancedPage />', () => {
it('Expect to have unit tests specified', () => {
expect(true).toEqual(true);
});
});

View File

@ -10,17 +10,31 @@
*/
import React from 'react';
import { FormattedMessage } from 'react-intl';
import messages from './messages';
import Helmet from 'react-helmet';
import PluginHeader from 'components/PluginHeader';
import Container from 'components/Container';
import RightContentTitle from 'components/RightContentTitle';
import RightContentSectionTitle from 'components/RightContentSectionTitle';
import styles from './styles.css';
export default class DatabasesPage extends React.Component { // eslint-disable-line react/prefer-stateless-function
render() {
return (
<div>
<h1>
<FormattedMessage {...messages.header} />
</h1>
<div className={styles.databasesPage}>
<Helmet
title="Settings Manager - Databases"
meta={[
{ name: 'description', content: 'Configure your Databases settings.' },
]}
/>
<div className="container">
<PluginHeader></PluginHeader>
<Container>
<RightContentTitle title="Databases" description="Configure your databases settings."></RightContentTitle>
<RightContentSectionTitle title="Coming soon" description=""></RightContentSectionTitle>
</Container>
</div>
</div>
);
}

View File

@ -0,0 +1,3 @@
.databasesPage { /* stylelint-disable */
}

View File

@ -11,7 +11,8 @@
import React from 'react';
import PluginHeader from 'components/PluginHeader';
import LeftMenu from 'components/LeftMenu';
import RightContentSectionTitle from 'components/RightContentSectionTitle';
import Container from 'components/Container';
import RightContentTitle from 'components/RightContentTitle';
import styles from './styles.css';
@ -22,34 +23,28 @@ export default class HomePage extends React.Component { // eslint-disable-line r
<div>
<div className="container">
<PluginHeader></PluginHeader>
<div className={`row row-eq-height ${styles.homePageContent}`}>
<div className={`col-lg-3 p-l-0 p-r-0 ${styles.homePageLeftContent}`}>
<LeftMenu></LeftMenu>
</div>
<div className={`col-lg-9 ${styles.homePageRightContent}`}>
<RightContentTitle></RightContentTitle>
<h3 className={styles.homePageRightContentTitle}>Application</h3>
<p className={styles.homePageRightContentSubTitle}>The general settings of your Strapi application.</p>
<div className={`form-group row ${styles.homePageRightContentFormGroup}`}>
<label htmlFor="applicationName" className="col-xs-7 col-form-label">Name</label>
<div className="col-xs-5">
<input className="form-control" type="text" placeholder="My Application" id="applicationName"></input>
</div>
</div>
<div className={`form-group row ${styles.homePageRightContentFormGroup}`}>
<label htmlFor="applicationDescription" className="col-xs-7 col-form-label">Description</label>
<div className="col-xs-5">
<input className="form-control" type="text" placeholder="A Strapi application" id="applicationDescription"></input>
</div>
</div>
<div className={`form-group row ${styles.homePageRightContentFormGroup}`}>
<label htmlFor="applicationVersion" className="col-xs-7 col-form-label">Version</label>
<div className="col-xs-5">
<input className="form-control" type="text" placeholder="0.0.1" id="applicationVersion"></input>
</div>
<Container>
<RightContentTitle title="General" description="Configure your general settings."></RightContentTitle>
<RightContentSectionTitle title="Application" description="The general settings of your Strapi application."></RightContentSectionTitle>
<div className={`form-group row ${styles.homePageRightContentFormGroup}`}>
<label htmlFor="applicationName" className="col-xs-7 col-form-label">Name</label>
<div className="col-xs-5">
<input className="form-control" type="text" placeholder="My Application" id="applicationName"></input>
</div>
</div>
</div>
<div className={`form-group row ${styles.homePageRightContentFormGroup}`}>
<label htmlFor="applicationDescription" className="col-xs-7 col-form-label">Description</label>
<div className="col-xs-5">
<input className="form-control" type="text" placeholder="A Strapi application" id="applicationDescription"></input>
</div>
</div>
<div className={`form-group row ${styles.homePageRightContentFormGroup}`}>
<label htmlFor="applicationVersion" className="col-xs-7 col-form-label">Version</label>
<div className="col-xs-5">
<input className="form-control" type="text" placeholder="0.0.1" id="applicationVersion"></input>
</div>
</div>
</Container>
</div>
</div>
);

View File

@ -4,38 +4,8 @@
* Home container styles
*/
.homePage {
display: block;
}
.homePage { /* stylelint-disable */
.homePageContent {
position: relative;
border: 1px solid #D7D8D9;
border-radius: 0.4rem;
overflow: hidden;
display: flex;
}
.homePageLeftContent {
padding-left: 0;
padding-right: 0;
}
.homePageRightContent {
background-color: #FFF;
padding: 2.4rem 3rem 50rem;
}
.homePageRightContentTitle {
text-transform: uppercase;
font-size: 1.4rem;
margin-top: 2.6rem;
}
.homePageRightContentSubTitle {
color: #8B91A0;
font-size: 1.2rem;
margin-bottom: 1.2rem;
}
.homePageRightContentFormGroup {

View File

@ -0,0 +1,35 @@
/*
*
* LanguagesPage
*
*/
import React from 'react';
import Helmet from 'react-helmet';
import PluginHeader from 'components/PluginHeader';
import Container from 'components/Container';
import RightContentTitle from 'components/RightContentTitle';
import RightContentSectionTitle from 'components/RightContentSectionTitle';
import styles from './styles.css';
export default class LanguagesPage extends React.Component { // eslint-disable-line react/prefer-stateless-function
render() {
return (
<div className={styles.languagesPage}>
<Helmet
title="Settings Manager - Languages"
meta={[
{ name: 'description', content: 'Configure your Languages settings.' },
]}
/>
<div className="container">
<PluginHeader></PluginHeader>
<Container>
<RightContentTitle title="Languages" description="Configure your languages settings."></RightContentTitle>
<RightContentSectionTitle title="Coming soon" description=""></RightContentSectionTitle>
</Container>
</div>
</div>
);
}
}

View File

@ -0,0 +1,3 @@
.languagesPage { /* stylelint-disable */
}

View File

@ -0,0 +1,11 @@
// import LanguagesPage from '../index';
import expect from 'expect';
// import { shallow } from 'enzyme';
// import React from 'react';
describe('<LanguagesPage />', () => {
it('Expect to have unit tests specified', () => {
expect(true).toEqual(true);
});
});

View File

@ -0,0 +1,35 @@
/*
*
* SecurityPage
*
*/
import React from 'react';
import Helmet from 'react-helmet';
import PluginHeader from 'components/PluginHeader';
import Container from 'components/Container';
import RightContentTitle from 'components/RightContentTitle';
import RightContentSectionTitle from 'components/RightContentSectionTitle';
import styles from './styles.css';
export default class SecurityPage extends React.Component { // eslint-disable-line react/prefer-stateless-function
render() {
return (
<div className={styles.securityPage}>
<Helmet
title="Settings Manager - Security"
meta={[
{ name: 'description', content: 'Configure your security settings.' },
]}
/>
<div className="container">
<PluginHeader></PluginHeader>
<Container>
<RightContentTitle title="Security" description="Configure your security settings."></RightContentTitle>
<RightContentSectionTitle title="Coming soon" description=""></RightContentSectionTitle>
</Container>
</div>
</div>
);
}
}

View File

@ -0,0 +1,3 @@
.securityPage { /* stylelint-disable */
}

View File

@ -0,0 +1,11 @@
// import SecurityPage from '../index';
import expect from 'expect';
// import { shallow } from 'enzyme';
// import React from 'react';
describe('<SecurityPage />', () => {
it('Expect to have unit tests specified', () => {
expect(true).toEqual(true);
});
});

View File

@ -0,0 +1,35 @@
/*
*
* ServerPage
*
*/
import React from 'react';
import Helmet from 'react-helmet';
import PluginHeader from 'components/PluginHeader';
import Container from 'components/Container';
import RightContentTitle from 'components/RightContentTitle';
import RightContentSectionTitle from 'components/RightContentSectionTitle';
import styles from './styles.css';
export default class ServerPage extends React.Component { // eslint-disable-line react/prefer-stateless-function
render() {
return (
<div className={styles.serverPage}>
<Helmet
title="Settings Manager - Server"
meta={[
{ name: 'description', content: 'Configure your Server settings.' },
]}
/>
<div className="container">
<PluginHeader></PluginHeader>
<Container>
<RightContentTitle title="Server" description="Configure your server settings."></RightContentTitle>
<RightContentSectionTitle title="Coming soon" description=""></RightContentSectionTitle>
</Container>
</div>
</div>
);
}
}

View File

@ -0,0 +1,3 @@
.serverPage { /* stylelint-disable */
}

View File

@ -0,0 +1,11 @@
// import ServerPage from '../index';
import expect from 'expect';
// import { shallow } from 'enzyme';
// import React from 'react';
describe('<ServerPage />', () => {
it('Expect to have unit tests specified', () => {
expect(true).toEqual(true);
});
});

View File

@ -34,6 +34,22 @@ export default function createRoutes(store) {
importModules.catch(errorLoading);
},
}, {
path: '/languages',
name: 'languages',
getComponent(nextState, cb) {
const importModules = Promise.all([
System.import('containers/LanguagesPage'),
]);
const renderRoute = loadModule(cb);
importModules.then(([component]) => {
renderRoute(component);
});
importModules.catch(errorLoading);
},
}, {
path: '/databases',
name: 'databases',
getComponent(nextState, cb) {
@ -50,6 +66,54 @@ export default function createRoutes(store) {
importModules.catch(errorLoading);
},
}, {
path: '/security',
name: 'security',
getComponent(nextState, cb) {
const importModules = Promise.all([
System.import('containers/SecurityPage'),
]);
const renderRoute = loadModule(cb);
importModules.then(([component]) => {
renderRoute(component);
});
importModules.catch(errorLoading);
},
}, {
path: '/server',
name: 'server',
getComponent(nextState, cb) {
const importModules = Promise.all([
System.import('containers/ServerPage'),
]);
const renderRoute = loadModule(cb);
importModules.then(([component]) => {
renderRoute(component);
});
importModules.catch(errorLoading);
},
}, {
path: '/advanced',
name: 'advanced',
getComponent(nextState, cb) {
const importModules = Promise.all([
System.import('containers/AdvancedPage'),
]);
const renderRoute = loadModule(cb);
importModules.then(([component]) => {
renderRoute(component);
});
importModules.catch(errorLoading);
},
}, {
path: '*',
name: 'notfound',
getComponent(nextState, cb) {