diff --git a/packages/strapi-admin/admin/src/components/LeftMenuLinkContainer/index.js b/packages/strapi-admin/admin/src/components/LeftMenuLinkContainer/index.js
index 80d5fd4f79..c3e8684cdf 100644
--- a/packages/strapi-admin/admin/src/components/LeftMenuLinkContainer/index.js
+++ b/packages/strapi-admin/admin/src/components/LeftMenuLinkContainer/index.js
@@ -37,7 +37,7 @@ const LeftMenuLinkContainer = ({ plugins }) => {
return acc;
}, {});
- // Generate the list of plugin links
+ // Generate the list of plugin links (plugins without a mainComponent should not appear in the left menu)
const pluginsLinks = Object.values(plugins)
.filter(
plugin =>
diff --git a/packages/strapi-admin/admin/src/components/LeftMenuLinkContainer/messages.json b/packages/strapi-admin/admin/src/components/LeftMenuLinkContainer/messages.json
index ff97b58916..57d344a2e5 100644
--- a/packages/strapi-admin/admin/src/components/LeftMenuLinkContainer/messages.json
+++ b/packages/strapi-admin/admin/src/components/LeftMenuLinkContainer/messages.json
@@ -1,9 +1,9 @@
{
- "contentTypes": {
- "id": "app.components.LeftMenuLinkContainer.contentTypes",
+ "collectionType": {
+ "id": "app.components.LeftMenuLinkContainer.collectionTypes",
"defaultMessage": "Collection Types"
},
- "singleTypes": {
+ "singleType": {
"id": "app.components.LeftMenuLinkContainer.singleTypes",
"defaultMessage": "Single Types"
},
diff --git a/packages/strapi-admin/admin/src/components/LeftMenuLinkHeader/SearchButton.js b/packages/strapi-admin/admin/src/components/LeftMenuLinkHeader/SearchButton.js
new file mode 100644
index 0000000000..8b6d3cadac
--- /dev/null
+++ b/packages/strapi-admin/admin/src/components/LeftMenuLinkHeader/SearchButton.js
@@ -0,0 +1,7 @@
+import styled from 'styled-components';
+
+const SearchButton = styled.button`
+ padding: 0 10px;
+`;
+
+export default SearchButton;
diff --git a/packages/strapi-admin/admin/src/components/LeftMenuLinkHeader/Title.js b/packages/strapi-admin/admin/src/components/LeftMenuLinkHeader/Title.js
new file mode 100644
index 0000000000..c52f648943
--- /dev/null
+++ b/packages/strapi-admin/admin/src/components/LeftMenuLinkHeader/Title.js
@@ -0,0 +1,29 @@
+import styled from 'styled-components';
+
+const Title = styled.div`
+ display: flex;
+ justify-content: space-between;
+ padding-left: 2rem;
+ padding-right: 1.6rem;
+ padding-top: 0.7rem;
+ margin-bottom: 0.8rem;
+ color: ${props => props.theme.main.colors.leftMenu['title-color']};
+ text-transform: uppercase;
+ font-size: 1.1rem;
+ letter-spacing: 0.1rem;
+ font-weight: 800;
+`;
+
+Title.defaultProps = {
+ theme: {
+ main: {
+ colors: {
+ leftMenu: {
+ 'title-color': '#5b626f',
+ },
+ },
+ },
+ },
+};
+
+export default Title;
diff --git a/packages/strapi-admin/admin/src/components/LeftMenuLinkHeader/index.js b/packages/strapi-admin/admin/src/components/LeftMenuLinkHeader/index.js
index bc4ca1c46f..3180931d38 100644
--- a/packages/strapi-admin/admin/src/components/LeftMenuLinkHeader/index.js
+++ b/packages/strapi-admin/admin/src/components/LeftMenuLinkHeader/index.js
@@ -2,28 +2,12 @@ import React, { useState, createRef, useEffect } from 'react';
import { camelCase } from 'lodash';
import PropTypes from 'prop-types';
import { FormattedMessage } from 'react-intl';
-import styled from 'styled-components';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import messages from '../LeftMenuLinkContainer/messages.json';
import Search from './Search';
-
-const Title = styled.div`
- display: flex;
- justify-content: space-between;
- padding-left: 2rem;
- padding-right: 1.6rem;
- padding-top: 0.7rem;
- margin-bottom: 0.8rem;
- color: ${props => props.theme.main.colors.leftMenu['title-color']};
- text-transform: uppercase;
- font-size: 1.1rem;
- letter-spacing: 0.1rem;
- font-weight: 800;
-`;
-const SearchButton = styled.button`
- padding: 0 10px;
-`;
+import Title from './Title';
+import SearchButton from './SearchButton';
const LeftMenuLinkHeader = ({ section, searchable, setSearch, search }) => {
const [showSearch, setShowSearch] = useState(false);
@@ -63,12 +47,16 @@ const LeftMenuLinkHeader = ({ section, searchable, setSearch, search }) => {
-
+
+ {message => (
+
+ )}
+
diff --git a/packages/strapi-admin/admin/src/components/LeftMenuLinkSection/EmptyLinksList.js b/packages/strapi-admin/admin/src/components/LeftMenuLinkSection/EmptyLinksList.js
new file mode 100644
index 0000000000..9d50131fb2
--- /dev/null
+++ b/packages/strapi-admin/admin/src/components/LeftMenuLinkSection/EmptyLinksList.js
@@ -0,0 +1,22 @@
+import styled from 'styled-components';
+
+const EmptyLinksList = styled.div`
+ color: ${props => props.theme.main.colors.white};
+ padding-left: 1.6rem;
+ padding-right: 1.6rem;
+ font-weight: 300;
+ min-height: 3.6rem;
+ padding-top: 0.2rem;
+`;
+
+EmptyLinksList.defaultProps = {
+ theme: {
+ main: {
+ colors: {
+ white: '#ffffff',
+ },
+ },
+ },
+};
+
+export default EmptyLinksList;
diff --git a/packages/strapi-admin/admin/src/components/LeftMenuLinkSection/LeftMenuListLink.js b/packages/strapi-admin/admin/src/components/LeftMenuLinkSection/LeftMenuListLink.js
new file mode 100644
index 0000000000..7b24b9cfca
--- /dev/null
+++ b/packages/strapi-admin/admin/src/components/LeftMenuLinkSection/LeftMenuListLink.js
@@ -0,0 +1,8 @@
+import styled from 'styled-components';
+
+const LeftMenuListLink = styled.div`
+ max-height: 180px;
+ overflow: auto;
+`;
+
+export default LeftMenuListLink;
diff --git a/packages/strapi-admin/admin/src/components/LeftMenuLinkSection/index.js b/packages/strapi-admin/admin/src/components/LeftMenuLinkSection/index.js
index fc5bda113d..39c41483e0 100644
--- a/packages/strapi-admin/admin/src/components/LeftMenuLinkSection/index.js
+++ b/packages/strapi-admin/admin/src/components/LeftMenuLinkSection/index.js
@@ -1,25 +1,13 @@
import React, { useState } from 'react';
import PropTypes from 'prop-types';
import matchSorter from 'match-sorter';
-import styled from 'styled-components';
import { sortBy } from 'lodash';
import { FormattedMessage } from 'react-intl';
import LeftMenuLink from '../LeftMenuLink';
import LeftMenuLinkHeader from '../LeftMenuLinkHeader';
-
-const LeftMenuListLink = styled.div`
- max-height: 180px;
- overflow: auto;
-`;
-const EmptyLinksList = styled.div`
- color: ${props => props.theme.main.colors.white};
- padding-left: 1.6rem;
- padding-right: 1.6rem;
- font-weight: 300;
- min-height: 3.6rem;
- padding-top: 0.2rem;
-`;
+import EmptyLinksList from './EmptyLinksList';
+import LeftMenuListLink from './LeftMenuListLink';
const LeftMenuLinksSection = ({
section,
diff --git a/packages/strapi-admin/admin/src/translations/en.json b/packages/strapi-admin/admin/src/translations/en.json
index 3ce50c4e62..bf5a5adf2d 100644
--- a/packages/strapi-admin/admin/src/translations/en.json
+++ b/packages/strapi-admin/admin/src/translations/en.json
@@ -76,7 +76,7 @@
"app.components.LeftMenuLinkContainer.general": "General",
"app.components.LeftMenuLinkContainer.installNewPlugin": "Marketplace",
"app.components.LeftMenuLinkContainer.listPlugins": "Plugins",
- "app.components.LeftMenuLinkContainer.contentTypes": "Collection Types",
+ "app.components.LeftMenuLinkContainer.collectionTypes": "Collection Types",
"app.components.LeftMenuLinkContainer.singleTypes": "Single Types",
"app.components.LeftMenuLinkContainer.noPluginsInstalled": "No plugins installed yet",
"app.components.LeftMenuLinkContainer.plugins": "Plugins",
@@ -143,6 +143,7 @@
"components.PageFooter.select": "entries per page",
"components.ProductionBlocker.description": "For safety purposes we have to disable this plugin in other environments.",
"components.ProductionBlocker.header": "This plugin is only available in development.",
+ "components.Search.placeholder": "Search...",
"components.Wysiwyg.ToggleMode.markdown": "Switch to markdown",
"components.Wysiwyg.ToggleMode.preview": "Switch to preview",
"components.Wysiwyg.collapse": "Collapse",
diff --git a/packages/strapi-admin/admin/src/translations/fr.json b/packages/strapi-admin/admin/src/translations/fr.json
index 1e6106f721..aa224f8097 100644
--- a/packages/strapi-admin/admin/src/translations/fr.json
+++ b/packages/strapi-admin/admin/src/translations/fr.json
@@ -139,6 +139,7 @@
"components.PageFooter.select": "entrées par page",
"components.ProductionBlocker.description": "Pour des raisons de sécurité il est désactivé dans les autres environnements.",
"components.ProductionBlocker.header": "Ce plugin est disponible uniquement en développement.",
+ "components.Search.placeholder": "Rechercher...",
"components.Wysiwyg.ToggleMode.markdown": "Retour au markdown",
"components.Wysiwyg.ToggleMode.preview": "Voir une prévisualisation",
"components.Wysiwyg.collapse": "Fermer",
diff --git a/packages/strapi-admin/admin/src/translations/pl.json b/packages/strapi-admin/admin/src/translations/pl.json
index 420f932ba1..720d984709 100644
--- a/packages/strapi-admin/admin/src/translations/pl.json
+++ b/packages/strapi-admin/admin/src/translations/pl.json
@@ -74,7 +74,6 @@
"app.components.LeftMenuLinkContainer.general": "Ogólne",
"app.components.LeftMenuLinkContainer.installNewPlugin": "Sklep",
"app.components.LeftMenuLinkContainer.listPlugins": "Wtyczki",
- "app.components.LeftMenuLinkContainer.contentTypes": "Modele",
"app.components.LeftMenuLinkContainer.noPluginsInstalled": "Brak zainstalowanych wtyczek",
"app.components.LeftMenuLinkContainer.plugins": "Wtyczki",
"app.components.LeftMenuLinkContainer.settings": "Ustawienia",
diff --git a/packages/strapi-admin/admin/src/translations/tr.json b/packages/strapi-admin/admin/src/translations/tr.json
index e720c08395..51a1c50364 100644
--- a/packages/strapi-admin/admin/src/translations/tr.json
+++ b/packages/strapi-admin/admin/src/translations/tr.json
@@ -73,7 +73,6 @@
"app.components.LeftMenuLinkContainer.general": "Genel",
"app.components.LeftMenuLinkContainer.installNewPlugin": "Mağaza",
"app.components.LeftMenuLinkContainer.listPlugins": "Eklentiler",
- "app.components.LeftMenuLinkContainer.contentTypes": "İçerik Tipi",
"app.components.LeftMenuLinkContainer.noPluginsInstalled": "Yüklenen eklenti bulunmamaktadır.",
"app.components.LeftMenuLinkContainer.plugins": "Eklentiler",
"app.components.LeftMenuLinkContainer.settings": "Ayarlar",
diff --git a/packages/strapi-admin/admin/src/translations/zh-Hans.json b/packages/strapi-admin/admin/src/translations/zh-Hans.json
index 6bd3d73bcb..51229e450c 100644
--- a/packages/strapi-admin/admin/src/translations/zh-Hans.json
+++ b/packages/strapi-admin/admin/src/translations/zh-Hans.json
@@ -76,7 +76,7 @@
"app.components.LeftMenuLinkContainer.general": "常规",
"app.components.LeftMenuLinkContainer.installNewPlugin": "市场",
"app.components.LeftMenuLinkContainer.listPlugins": "插件",
- "app.components.LeftMenuLinkContainer.contentTypes": "Content Types",
+ "app.components.LeftMenuLinkContainer.collectionTypes": "Collection Types",
"app.components.LeftMenuLinkContainer.noPluginsInstalled": "还没有安装插件",
"app.components.LeftMenuLinkContainer.plugins": "插件",
"app.components.LeftMenuLinkContainer.settings": "设置",
diff --git a/packages/strapi-plugin-content-manager/admin/src/containers/Initializer/index.js b/packages/strapi-plugin-content-manager/admin/src/containers/Initializer/index.js
index bae10b3ec9..251e20a149 100644
--- a/packages/strapi-plugin-content-manager/admin/src/containers/Initializer/index.js
+++ b/packages/strapi-plugin-content-manager/admin/src/containers/Initializer/index.js
@@ -6,6 +6,7 @@
import { useEffect, useRef } from 'react';
import PropTypes from 'prop-types';
+import { chain } from 'lodash';
import { request } from 'strapi-helper-plugin';
import pluginId from '../../pluginId';
@@ -21,22 +22,15 @@ const Initializer = ({ updatePlugin }) => {
try {
const { data } = await request(requestURL, { method: 'GET' });
- const menu = [
- {
- name: 'Content Types',
- links: data.filter(
- contentType => contentType.schema.kind === 'collectionType'
- ),
- },
- {
- name: 'Single Types',
- links: data.filter(
- contentType => contentType.schema.kind === 'singleType'
- ),
- },
- ];
- ref.current(pluginId, 'leftMenuSections', menu);
+ ref.current(
+ pluginId,
+ 'leftMenuSections',
+ chain(data)
+ .groupBy('schema.kind')
+ .map((value, key) => ({ name: key, links: value }))
+ .value()
+ );
ref.current(pluginId, 'isReady', true);
} catch (err) {
strapi.notification.error('content-manager.error.model.fetch');