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'; // import SettingsManagerApp from 'containers/App/index';
// const render = () => ( // const render = () => (
// {/*<Provider store={store}>*/} // {/*{<Provider store={store}>}*/}
// {/*<SettingsManagerApp></SettingsManagerApp>*/} // {/*{<Router}*/}
// {/*<Router*/}
// {/*history={history}*/} // {/*history={history}*/}
// {/*routes={rootRoute}*/} // {/*routes={rootRoute}*/}
// {/*render={*/} // {/*render={*/}
@ -92,8 +91,6 @@ const rootRoute = {
// import { install } from 'offline-plugin/runtime'; // import { install } from 'offline-plugin/runtime';
// install(); // install();
import SettingsManagerHomePage from 'containers/HomePage/index';
// Register the plugin // Register the plugin
window.Strapi.registerPlugin({ window.Strapi.registerPlugin({
name: 'Settings Manager', name: 'Settings Manager',
@ -104,5 +101,4 @@ window.Strapi.registerPlugin({
}, },
routes: rootRoute, routes: rootRoute,
mainComponent: App, 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 = [{ const links = [{
label: 'General', label: 'General',
value: 'general', value: 'general',
to: '',
}, { }, {
label: 'Languages', label: 'Languages',
value: 'languages', value: 'languages',
to: 'languages',
}, { }, {
label: 'Databases', label: 'Databases',
value: 'databases', value: 'databases',
to: 'databases',
}, { }, {
label: 'Security', label: 'Security',
value: 'security', value: 'security',
to: 'security',
}, { }, {
label: 'Server', label: 'Server',
value: 'server', value: 'server',
to: 'server',
}, { }, {
label: 'Advanced', label: 'Advanced',
value: '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 ( return (
<div className={styles.leftMenu}> <div className={styles.leftMenu}>

View File

@ -5,13 +5,18 @@
*/ */
import React from 'react'; import React from 'react';
import { Link } from 'react-router';
import styles from './styles.css'; import styles from './styles.css';
class LeftMenuLink extends React.Component { // eslint-disable-line react/prefer-stateless-function class LeftMenuLink extends React.Component { // eslint-disable-line react/prefer-stateless-function
render() { render() {
return ( 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; export default LeftMenuLink;
LeftMenuLink.propTypes = { LeftMenuLink.propTypes = {
label: React.PropTypes.string, link: React.PropTypes.object,
value: React.PropTypes.string,
}; };

View File

@ -4,15 +4,38 @@
.leftMenuLinkDestination { .leftMenuLinkDestination {
display: block; display: block;
position: relative;
color: #3B3F49; color: #3B3F49;
padding-left: 2rem; padding-left: 2rem;
padding-right: 2rem;
line-height: 3.6rem; line-height: 3.6rem;
font-size: 1.4rem; font-size: 1.4rem;
border-radius: 2rem; border-radius: 2rem;
}
&:hover { .leftMenuLinkDestination:hover {
color: white; color: white;
text-decoration: none; text-decoration: none;
background-color: #1C5DE7; 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() { render() {
return ( return (
<div className={styles.rightContentTitle}> <div className={styles.rightContentTitle}>
<h2 className={styles.rightContentTitleName}>General</h2> <h2 className={styles.rightContentTitleName}>{this.props.title}</h2>
<p className={styles.rightContentTitleDescription}>Configure your general settings</p> <p className={styles.rightContentTitleDescription}>{this.props.description}</p>
<hr className={styles.rigthContentTitleSeparator}></hr> <hr className={styles.rigthContentTitleSeparator}></hr>
</div> </div>
); );
} }
} }
RightContentTitle.propTypes = {
title: React.PropTypes.string,
description: React.PropTypes.string,
};
export default RightContentTitle; 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 React from 'react';
import { FormattedMessage } from 'react-intl'; import Helmet from 'react-helmet';
import messages from './messages'; 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 export default class DatabasesPage extends React.Component { // eslint-disable-line react/prefer-stateless-function
render() { render() {
return ( return (
<div> <div className={styles.databasesPage}>
<h1> <Helmet
<FormattedMessage {...messages.header} /> title="Settings Manager - Databases"
</h1> 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> </div>
); );
} }

View File

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

View File

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

View File

@ -4,38 +4,8 @@
* Home container styles * Home container styles
*/ */
.homePage { .homePage { /* stylelint-disable */
display: block;
}
.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 { .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); 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', path: '/databases',
name: 'databases', name: 'databases',
getComponent(nextState, cb) { getComponent(nextState, cb) {
@ -50,6 +66,54 @@ export default function createRoutes(store) {
importModules.catch(errorLoading); 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: '*', path: '*',
name: 'notfound', name: 'notfound',
getComponent(nextState, cb) { getComponent(nextState, cb) {