2017-07-06 14:03:20 +02:00
|
|
|
/*
|
|
|
|
|
*
|
|
|
|
|
* Home
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
import React from 'react';
|
|
|
|
|
import { connect } from 'react-redux';
|
2017-07-13 16:55:59 +02:00
|
|
|
import { bindActionCreators } from 'redux';
|
2017-07-17 18:40:11 +02:00
|
|
|
import { createStructuredSelector } from 'reselect';
|
2017-07-20 16:59:47 +02:00
|
|
|
import { findKey, includes, get, toNumber, isObject, find } from 'lodash';
|
|
|
|
|
import { FormattedMessage } from 'react-intl';
|
2017-07-06 14:03:20 +02:00
|
|
|
import Helmet from 'react-helmet';
|
2017-07-17 18:40:11 +02:00
|
|
|
import { router } from 'app';
|
2017-07-18 14:07:48 +02:00
|
|
|
|
2017-07-17 19:19:54 +02:00
|
|
|
// design
|
|
|
|
|
import ContentHeader from 'components/ContentHeader';
|
2017-07-18 15:53:56 +02:00
|
|
|
import EditForm from 'components/EditForm';
|
2017-07-19 13:10:53 +02:00
|
|
|
import HeaderNav from 'components/HeaderNav';
|
2017-07-20 16:59:47 +02:00
|
|
|
import List from 'components/List';
|
2017-07-17 19:19:54 +02:00
|
|
|
|
2017-07-19 13:10:53 +02:00
|
|
|
import { makeSelectSections, makeSelectEnvironments } from 'containers/App/selectors';
|
2017-07-06 14:03:20 +02:00
|
|
|
import selectHome from './selectors';
|
2017-07-20 15:27:05 +02:00
|
|
|
import { configFetch, changeInput, cancelChanges, submitChanges, languagesFetch } from './actions'
|
2017-07-06 14:03:20 +02:00
|
|
|
import styles from './styles.scss';
|
2017-07-17 18:53:42 +02:00
|
|
|
import config from './config.json';
|
2017-07-06 14:03:20 +02:00
|
|
|
|
|
|
|
|
export class Home extends React.Component { // eslint-disable-line react/prefer-stateless-function
|
2017-07-17 12:36:04 +02:00
|
|
|
|
2017-07-18 15:53:56 +02:00
|
|
|
constructor(props) {
|
|
|
|
|
super(props);
|
|
|
|
|
this.customComponents = config.customComponents;
|
|
|
|
|
this.components = {
|
|
|
|
|
editForm: EditForm,
|
2017-07-20 16:59:47 +02:00
|
|
|
list: List,
|
2017-07-19 13:10:53 +02:00
|
|
|
defaultComponent: HeaderNav, // TODO change to default
|
2017-07-18 15:53:56 +02:00
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2017-07-13 18:50:51 +02:00
|
|
|
componentDidMount() {
|
|
|
|
|
if (this.props.params.slug) {
|
2017-07-21 16:37:12 +02:00
|
|
|
this.handleFetch(this.props);
|
2017-07-17 18:40:11 +02:00
|
|
|
} else {
|
2017-07-19 13:10:53 +02:00
|
|
|
router.push(`/plugins/settings-manager/${get(this.props.menuSections, ['0', 'items', '0', 'slug'])}`);
|
2017-07-13 18:50:51 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-07-17 12:36:04 +02:00
|
|
|
|
2017-07-13 16:55:59 +02:00
|
|
|
componentWillReceiveProps(nextProps) {
|
2017-07-17 12:36:04 +02:00
|
|
|
// check if params slug updated
|
2017-07-20 15:27:05 +02:00
|
|
|
if (this.props.params.slug !== nextProps.params.slug && nextProps.params.slug) {
|
2017-07-17 18:40:11 +02:00
|
|
|
if (nextProps.params.slug) {
|
|
|
|
|
// get data from api if params slug updated
|
2017-07-21 16:37:12 +02:00
|
|
|
this.handleFetch(nextProps);
|
2017-07-17 18:40:11 +02:00
|
|
|
} else {
|
|
|
|
|
// redirect user if no params slug provided
|
2017-07-19 13:10:53 +02:00
|
|
|
router.push(`/plugins/settings-manager/${get(this.props.menuSections, ['0', 'items', '0', 'slug'])}`);
|
2017-07-17 18:40:11 +02:00
|
|
|
}
|
2017-07-19 13:10:53 +02:00
|
|
|
} else if (this.props.params.env !== nextProps.params.env && nextProps.params.env && this.props.params.env) {
|
2017-07-17 12:36:04 +02:00
|
|
|
// get data if params env updated
|
|
|
|
|
this.props.configFetch(`${this.props.params.slug}/${nextProps.params.env}`);
|
2017-07-13 16:55:59 +02:00
|
|
|
}
|
2017-07-21 16:37:12 +02:00
|
|
|
}
|
2017-07-17 18:40:11 +02:00
|
|
|
|
2017-07-21 16:37:12 +02:00
|
|
|
handleFetch(props) {
|
|
|
|
|
if (props.params.slug !== 'languages') {
|
|
|
|
|
const apiUrl = props.params.env ? `${props.params.slug}/${props.params.env}` : props.params.slug;
|
|
|
|
|
this.props.configFetch(apiUrl);
|
|
|
|
|
} else {
|
|
|
|
|
this.props.languagesFetch();
|
|
|
|
|
}
|
2017-07-13 16:55:59 +02:00
|
|
|
}
|
|
|
|
|
|
2017-07-18 17:52:39 +02:00
|
|
|
handleChange = ({ target }) => {
|
2017-07-19 14:52:59 +02:00
|
|
|
const value = target.type === 'number' ? toNumber(target.value) : target.value;
|
|
|
|
|
this.props.changeInput(target.name, value);
|
2017-07-18 17:52:39 +02:00
|
|
|
}
|
|
|
|
|
|
2017-07-19 10:49:23 +02:00
|
|
|
handleCancel = () => {
|
|
|
|
|
this.props.cancelChanges();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
handleSubmit = () => {
|
2017-07-21 17:22:51 +02:00
|
|
|
console.log('submit');
|
2017-07-19 10:49:23 +02:00
|
|
|
this.props.submitChanges();
|
|
|
|
|
}
|
|
|
|
|
|
2017-07-20 18:27:38 +02:00
|
|
|
|
|
|
|
|
addLanguage = () => {
|
2017-07-21 16:37:12 +02:00
|
|
|
console.log('click Add Language');
|
2017-07-20 18:27:38 +02:00
|
|
|
}
|
|
|
|
|
|
2017-07-20 17:05:11 +02:00
|
|
|
// custom Row rendering for the component List with params slug === languages
|
2017-07-20 16:59:47 +02:00
|
|
|
renderRowLanguage = (props, key) => {
|
2017-07-20 18:27:38 +02:00
|
|
|
// custom style
|
|
|
|
|
const rowStyle = {
|
|
|
|
|
defaultSpanStyle: {
|
|
|
|
|
color: '#49515A',
|
|
|
|
|
fontStyle: 'italic',
|
|
|
|
|
},
|
|
|
|
|
normalSpanStyle: {
|
|
|
|
|
color: '#1C5DE7',
|
|
|
|
|
},
|
|
|
|
|
tdNameStyle: {
|
|
|
|
|
color: '#333740',
|
|
|
|
|
},
|
|
|
|
|
tdLangDisplayStyle: {
|
|
|
|
|
color: '#333740',
|
|
|
|
|
fontWeight: '600',
|
|
|
|
|
},
|
|
|
|
|
};
|
2017-07-20 16:59:47 +02:00
|
|
|
const deleteIcon = props.active ? '' : <i className="fa fa-trash" />;
|
2017-07-20 18:27:38 +02:00
|
|
|
const languageLabel = props.active ?
|
|
|
|
|
<span style={rowStyle.defaultSpanStyle}>
|
|
|
|
|
<FormattedMessage {...{id: 'list.languages.default.languages'}} />
|
|
|
|
|
</span> :
|
2017-07-21 16:37:12 +02:00
|
|
|
<span style={rowStyle.normalSpanStyle}>
|
|
|
|
|
<FormattedMessage {...{id: 'list.languages.set.languages'}} />
|
|
|
|
|
</span>;
|
2017-07-20 18:27:38 +02:00
|
|
|
|
|
|
|
|
// retrieve language name from i18n translation
|
2017-07-21 16:37:12 +02:00
|
|
|
const languageObject = find(get(this.props.home.listLanguages, ['sections', '0', 'items', '0', 'items']), ['value', props.name]);
|
2017-07-20 18:27:38 +02:00
|
|
|
// apply i18n
|
2017-07-20 16:59:47 +02:00
|
|
|
const languageDisplay = isObject(languageObject) ? <FormattedMessage {...{ id: languageObject.name }} /> : '';
|
|
|
|
|
return (
|
|
|
|
|
<tr key={key}>
|
|
|
|
|
<th>{key}</th>
|
2017-07-20 18:27:38 +02:00
|
|
|
<td style={rowStyle.tdLangDisplayStyle}>{languageDisplay}</td>
|
|
|
|
|
<td style={rowStyle.tdNameStyle}>{props.name}</td>
|
2017-07-20 16:59:47 +02:00
|
|
|
<td>{languageLabel}</td>
|
|
|
|
|
<td>{deleteIcon}</td>
|
|
|
|
|
</tr>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
renderListTitle = () => {
|
|
|
|
|
const availableContentNumber = this.props.home.configsDisplay.sections.length;
|
|
|
|
|
const title = availableContentNumber > 1 ? `list.${this.props.params.slug}.title.plural` : `list.${this.props.params.slug}.title.singular`;
|
|
|
|
|
const titleDisplay = title ? <FormattedMessage {...{id: title}} /> : '';
|
|
|
|
|
return <span>{availableContentNumber} {titleDisplay}</span>
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
renderListButtonLabel = () => `list.${this.props.params.slug}.button.label`;
|
|
|
|
|
|
2017-07-19 13:10:53 +02:00
|
|
|
renderComponent = () => {
|
|
|
|
|
// check if settingName (params.slug) has a custom view display
|
|
|
|
|
const specificComponent = findKey(this.customComponents, (value) => includes(value, this.props.params.slug)) ?
|
|
|
|
|
findKey(this.customComponents, (value) => includes(value, this.props.params.slug)) : 'defaultComponent';
|
|
|
|
|
// if custom view display render specificComponent
|
|
|
|
|
const Component = this.components[specificComponent];
|
2017-07-20 16:59:47 +02:00
|
|
|
const renderRow = this.props.params.slug === 'languages' ? this.renderRowLanguage : false;
|
|
|
|
|
const listTitle = this.props.params.slug === 'languages' ? this.renderListTitle() : '';
|
|
|
|
|
const listButtonLabel = this.props.params.slug === 'languages' ? this.renderListButtonLabel() : '';
|
|
|
|
|
|
2017-07-19 13:10:53 +02:00
|
|
|
return (
|
|
|
|
|
<Component
|
|
|
|
|
sections={this.props.home.configsDisplay.sections}
|
|
|
|
|
values={this.props.home.modifiedData}
|
|
|
|
|
handleChange={this.handleChange}
|
|
|
|
|
handleCancel={this.handleCancel}
|
|
|
|
|
handleSubmit={this.handleSubmit}
|
|
|
|
|
links={this.props.environments}
|
|
|
|
|
path={this.props.location.pathname}
|
2017-07-20 15:27:05 +02:00
|
|
|
slug={this.props.params.slug}
|
2017-07-20 16:59:47 +02:00
|
|
|
renderRow={renderRow}
|
|
|
|
|
listTitle={listTitle}
|
|
|
|
|
listButtonLabel={listButtonLabel}
|
|
|
|
|
handlei18n
|
2017-07-21 16:37:12 +02:00
|
|
|
handleListPopUpSubmit={this.addLanguage}
|
2017-07-19 13:10:53 +02:00
|
|
|
/>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2017-07-06 14:03:20 +02:00
|
|
|
render() {
|
2017-07-17 19:19:54 +02:00
|
|
|
if (this.props.home.loading) {
|
|
|
|
|
return <div />;
|
|
|
|
|
}
|
2017-07-21 16:37:12 +02:00
|
|
|
|
2017-07-06 14:03:20 +02:00
|
|
|
return (
|
2017-07-18 14:07:48 +02:00
|
|
|
<div className={`${styles.home} col-md-9`}>
|
2017-07-06 16:18:43 +02:00
|
|
|
<Helmet
|
2017-07-21 16:37:12 +02:00
|
|
|
title="Settings Manager"
|
2017-07-06 16:18:43 +02:00
|
|
|
meta={[
|
2017-07-21 16:37:12 +02:00
|
|
|
{ name: 'Settings Manager Plugin', content: 'Modify your app settings' },
|
2017-07-06 16:18:43 +02:00
|
|
|
]}
|
|
|
|
|
/>
|
2017-07-18 14:07:48 +02:00
|
|
|
<ContentHeader
|
|
|
|
|
name={this.props.home.configsDisplay.name}
|
|
|
|
|
description={this.props.home.configsDisplay.description}
|
|
|
|
|
/>
|
2017-07-19 14:52:59 +02:00
|
|
|
{this.renderComponent()}
|
2017-07-06 14:03:20 +02:00
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-07-18 12:39:03 +02:00
|
|
|
|
2017-07-17 18:40:11 +02:00
|
|
|
const mapStateToProps = createStructuredSelector({
|
2017-07-19 13:10:53 +02:00
|
|
|
environments: makeSelectEnvironments(),
|
2017-07-17 18:40:11 +02:00
|
|
|
home: selectHome(),
|
2017-07-19 13:10:53 +02:00
|
|
|
menuSections: makeSelectSections(),
|
2017-07-17 18:40:11 +02:00
|
|
|
})
|
2017-07-06 14:03:20 +02:00
|
|
|
|
|
|
|
|
function mapDispatchToProps(dispatch) {
|
2017-07-13 16:55:59 +02:00
|
|
|
return bindActionCreators(
|
|
|
|
|
{
|
2017-07-19 10:49:23 +02:00
|
|
|
cancelChanges,
|
2017-07-18 18:32:32 +02:00
|
|
|
changeInput,
|
2017-07-13 16:55:59 +02:00
|
|
|
configFetch,
|
2017-07-20 15:27:05 +02:00
|
|
|
languagesFetch,
|
2017-07-19 10:49:23 +02:00
|
|
|
submitChanges,
|
2017-07-13 16:55:59 +02:00
|
|
|
},
|
|
|
|
|
dispatch
|
|
|
|
|
)
|
2017-07-06 14:03:20 +02:00
|
|
|
}
|
|
|
|
|
|
2017-07-17 12:36:04 +02:00
|
|
|
Home.propTypes = {
|
2017-07-19 10:49:23 +02:00
|
|
|
cancelChanges: React.PropTypes.func,
|
2017-07-18 18:32:32 +02:00
|
|
|
changeInput: React.PropTypes.func,
|
2017-07-17 12:36:04 +02:00
|
|
|
configFetch: React.PropTypes.func.isRequired,
|
2017-07-19 13:10:53 +02:00
|
|
|
environments: React.PropTypes.array,
|
2017-07-18 18:06:15 +02:00
|
|
|
home: React.PropTypes.object,
|
2017-07-20 15:27:05 +02:00
|
|
|
languagesFetch: React.PropTypes.func,
|
2017-07-19 14:52:59 +02:00
|
|
|
location: React.PropTypes.object,
|
2017-07-19 13:10:53 +02:00
|
|
|
menuSections: React.PropTypes.array,
|
2017-07-19 14:52:59 +02:00
|
|
|
params: React.PropTypes.object.isRequired,
|
2017-07-19 10:49:23 +02:00
|
|
|
submitChanges: React.PropTypes.func,
|
2017-07-17 12:36:04 +02:00
|
|
|
};
|
|
|
|
|
|
2017-07-06 14:03:20 +02:00
|
|
|
export default connect(mapStateToProps, mapDispatchToProps)(Home);
|