107 lines
3.1 KiB
JavaScript
Raw Normal View History

2016-08-24 15:09:42 +02:00
/**
2017-03-15 11:48:56 +01:00
*
* LeftMenuLinkContainer
*
*/
2016-08-24 15:09:42 +02:00
import React from 'react';
import PropTypes from 'prop-types';
2017-08-17 15:39:09 +02:00
import { FormattedMessage } from 'react-intl';
import { get, snakeCase, isEmpty, map, sortBy } from 'lodash';
2016-08-24 15:09:42 +02:00
import LeftMenuLink from 'components/LeftMenuLink';
2017-08-17 15:39:09 +02:00
2016-08-24 15:09:42 +02:00
import styles from './styles.scss';
2017-08-17 15:39:09 +02:00
import messages from './messages.json';
2016-08-24 15:09:42 +02:00
function LeftMenuLinkContainer({ plugins }) {
const pluginsObject = plugins.toJS();
// Generate the list of sections
const pluginsSections = Object.keys(pluginsObject).reduce((acc, current) => {
pluginsObject[current].leftMenuSections.forEach((section = {}) => {
if (!isEmpty(section.links)) {
acc[snakeCase(section.name)] = {
name: section.name,
links: (get(acc[snakeCase(section.name)], 'links') || []).concat(section.links.map(link => {
link.source = current;
link.plugin = !isEmpty(pluginsObject[link.plugin]) ? link.plugin : pluginsObject[current].id;
return link;
})),
};
}
});
return acc;
}, {});
const linkSections = Object.keys(pluginsSections).map((current, j) => (
<div key={j}>
<p className={styles.title}>{pluginsSections[current].name}</p>
<ul className={styles.list}>
{sortBy(pluginsSections[current].links, 'label').map(link =>
2017-11-27 17:27:16 +01:00
<LeftMenuLink key={link.label} icon={link.icon || 'link'} label={link.label} destination={`/plugins/${link.plugin}/${link.destination}`} source={link.source} />
)}
</ul>
</div>
));
2016-08-24 15:09:42 +02:00
// Check if the plugins list is empty or not and display plugins by name
const pluginsLinks = !isEmpty(pluginsObject) ?
2017-12-05 14:44:32 +01:00
map(sortBy(pluginsObject, 'name'), plugin => {
if (plugin.id !== 'email' && plugin.id !== 'content-manager') {
2017-12-05 14:44:32 +01:00
return (
<LeftMenuLink
key={get(plugin, 'id')}
icon={get(plugin, 'icon') || 'plug'}
label={get(plugin, 'name')}
destination={`/plugins/${get(plugin, 'id')}`}
/>
);
}})
: (
<li className={styles.noPluginsInstalled}>
<FormattedMessage {...messages.noPluginsInstalled} />.
</li>
2016-08-24 15:09:42 +02:00
);
return (
<div className={styles.leftMenuLinkContainer}>
{linkSections}
<div>
<p className={styles.title}><FormattedMessage {...messages.plugins} /></p>
<ul className={styles.list}>
{pluginsLinks}
</ul>
</div>
<div>
<p className={styles.title}><FormattedMessage {...messages.general} /></p>
<ul className={styles.list}>
<LeftMenuLink
2017-11-25 14:08:06 +01:00
icon="puzzle-piece"
label={messages.listPlugins.id}
destination="/list-plugins"
/>
<LeftMenuLink
icon="download"
label={messages.installNewPlugin.id}
destination="/install-plugin"
/>
<LeftMenuLink
icon="gear"
label={messages.configuration.id}
destination="/configuration"
/>
</ul>
</div>
</div>
);
2016-08-24 15:09:42 +02:00
}
LeftMenuLinkContainer.propTypes = {
plugins: PropTypes.object.isRequired,
2016-08-24 15:09:42 +02:00
};
export default LeftMenuLinkContainer;