Merge pull request #9912 from strapi/i18n/display-locale-rbac

Only display allowed locales with rbac
This commit is contained in:
cyril lopez 2021-03-31 14:35:24 +02:00 committed by GitHub
commit 4d88ff27f3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 76 additions and 20 deletions

View File

@ -33,11 +33,19 @@ const InjectionZoneList = ({ area, ...props }) => {
return ( return (
<List> <List>
{compos.map(compo => ( {compos.map(compo => {
<ListItem key={compo.name}> const component = compo.Component(props);
<compo.Component {...props} />
</ListItem> if (component) {
))} return (
<ListItem key={compo.name}>
<compo.Component {...props} />
</ListItem>
);
}
return null;
})}
</List> </List>
); );
}; };

View File

@ -4,12 +4,12 @@ import { useSelector } from 'react-redux';
import { useParams } from 'react-router-dom'; import { useParams } from 'react-router-dom';
import { useContentManagerEditViewDataManager, useQueryParams } from 'strapi-helper-plugin'; import { useContentManagerEditViewDataManager, useQueryParams } from 'strapi-helper-plugin';
import selectI18NLocales from '../../selectors/selectI18nLocales'; import selectI18NLocales from '../../selectors/selectI18nLocales';
import useContentTypePermissions from '../../hooks/useContentTypePermissions';
import CMEditViewLocalePicker from '../CMEditViewLocalePicker'; import CMEditViewLocalePicker from '../CMEditViewLocalePicker';
import selectCollectionTypesRelatedPermissions from './selectors';
const CMEditViewInjectedComponents = () => { const CMEditViewInjectedComponents = () => {
const { layout, modifiedData, slug, isSingleType } = useContentManagerEditViewDataManager(); const { layout, modifiedData, slug, isSingleType } = useContentManagerEditViewDataManager();
const colllectionTypesRelatedPermissions = useSelector(selectCollectionTypesRelatedPermissions); const { createPermissions, readPermissions } = useContentTypePermissions(slug);
const locales = useSelector(selectI18NLocales); const locales = useSelector(selectI18NLocales);
const params = useParams(); const params = useParams();
const [{ query }, setQuery] = useQueryParams(); const [{ query }, setQuery] = useQueryParams();
@ -37,10 +37,6 @@ const CMEditViewInjectedComponents = () => {
return null; return null;
} }
const currentCTRelatedPermissions = colllectionTypesRelatedPermissions[slug];
const readPermissions = currentCTRelatedPermissions['plugins::content-manager.explorer.read'];
const createPermissions = currentCTRelatedPermissions['plugins::content-manager.explorer.create'];
const localizations = get(modifiedData, 'localizations', []); const localizations = get(modifiedData, 'localizations', []);
return ( return (

View File

@ -1,8 +1,15 @@
import * as React from 'react'; import * as React from 'react';
import { FormattedMessage } from 'react-intl'; import { FormattedMessage } from 'react-intl';
import { getTrad } from '../../utils'; import { getTrad } from '../../utils';
import useHasI18n from '../../hooks/useHasI18n';
const DeleteModalAdditionalInfos = () => { const DeleteModalAdditionalInfos = () => {
const hasI18nEnabled = useHasI18n();
if (!hasI18nEnabled) {
return null;
}
return ( return (
<span> <span>
<FormattedMessage <FormattedMessage

View File

@ -1,9 +1,14 @@
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { Tooltip } from '@buffetjs/styles'; import { Tooltip } from '@buffetjs/styles';
import get from 'lodash/get';
const mapToLocaleName = (locales, localeCode) => const mapToLocaleName = (locales, localeCode) =>
locales.find(({ code }) => code === localeCode).name; get(
locales.find(({ code }) => code === localeCode),
'name',
localeCode
);
const LocaleListCell = ({ locales, localizations, locale: currentLocaleCode, id }) => { const LocaleListCell = ({ locales, localizations, locale: currentLocaleCode, id }) => {
const allLocalizations = [{ locale: currentLocaleCode }, ...localizations]; const allLocalizations = [{ locale: currentLocaleCode }, ...localizations];

View File

@ -2,8 +2,11 @@ import React, { useState } from 'react';
import { useSelector, useDispatch } from 'react-redux'; import { useSelector, useDispatch } from 'react-redux';
import { Picker, Padded, Text, Flex } from '@buffetjs/core'; import { Picker, Padded, Text, Flex } from '@buffetjs/core';
import { Carret, useQueryParams } from 'strapi-helper-plugin'; import { Carret, useQueryParams } from 'strapi-helper-plugin';
import { useRouteMatch } from 'react-router-dom';
import styled from 'styled-components'; import styled from 'styled-components';
import get from 'lodash/get'; import get from 'lodash/get';
import useContentTypePermissions from '../../hooks/useContentTypePermissions';
import useHasI18n from '../../hooks/useHasI18n';
import selectI18NLocales from '../../selectors/selectI18nLocales'; import selectI18NLocales from '../../selectors/selectI18nLocales';
import getInitialLocale from '../../utils/getInitialLocale'; import getInitialLocale from '../../utils/getInitialLocale';
@ -37,20 +40,19 @@ const EllipsisParagraph = styled(Text)`
text-align: left; text-align: left;
`; `;
const selectContentManagerListViewPluginOptions = state =>
state.get('content-manager_listView').contentType.pluginOptions;
const LocalePicker = () => { const LocalePicker = () => {
const dispatch = useDispatch(); const dispatch = useDispatch();
const pluginOptions = useSelector(selectContentManagerListViewPluginOptions);
const locales = useSelector(selectI18NLocales); const locales = useSelector(selectI18NLocales);
const [{ query }, setQuery] = useQueryParams(); const [{ query }, setQuery] = useQueryParams();
const {
params: { slug },
} = useRouteMatch('/plugins/content-manager/collectionType/:slug');
const isFieldLocalized = useHasI18n();
const { createPermissions, readPermissions } = useContentTypePermissions(slug);
const initialLocale = getInitialLocale(query, locales); const initialLocale = getInitialLocale(query, locales);
const [selected, setSelected] = useState(initialLocale); const [selected, setSelected] = useState(initialLocale);
const isFieldLocalized = get(pluginOptions, 'i18n.localized', false);
if (!isFieldLocalized) { if (!isFieldLocalized) {
return null; return null;
} }
@ -59,6 +61,17 @@ const LocalePicker = () => {
return null; return null;
} }
const displayedLocales = locales.filter(locale => {
const canCreate = createPermissions.find(({ properties }) => {
return get(properties, 'locales', []).includes(locale.code);
});
const canRead = readPermissions.find(({ properties }) =>
get(properties, 'locales', []).includes(locale.code)
);
return canCreate || canRead;
});
return ( return (
<Picker <Picker
position="right" position="right"
@ -82,12 +95,12 @@ const LocalePicker = () => {
onToggle(); onToggle();
}; };
const hasMultipleLocales = locales.length > 1; const hasMultipleLocales = displayedLocales.length > 1;
return hasMultipleLocales ? ( return hasMultipleLocales ? (
<Padded left right> <Padded left right>
<List> <List>
{locales.map(locale => { {displayedLocales.map(locale => {
if (locale.id === selected.id) { if (locale.id === selected.id) {
return null; return null;
} }

View File

@ -0,0 +1,14 @@
import { useSelector } from 'react-redux';
import selectCollectionTypesRelatedPermissions from '../../selectors/selectCollectionTypesRelatedPermissions';
const useContentTypePermissions = slug => {
const collectionTypesRelatedPermissions = useSelector(selectCollectionTypesRelatedPermissions);
const currentCTRelatedPermissions = collectionTypesRelatedPermissions[slug];
const readPermissions = currentCTRelatedPermissions['plugins::content-manager.explorer.read'];
const createPermissions = currentCTRelatedPermissions['plugins::content-manager.explorer.create'];
return { createPermissions, readPermissions };
};
export default useContentTypePermissions;

View File

@ -0,0 +1,13 @@
import { useSelector } from 'react-redux';
import get from 'lodash/get';
const selectContentManagerListViewPluginOptions = state =>
state.get('content-manager_listView').contentType.pluginOptions;
const useHasI18n = () => {
const pluginOptions = useSelector(selectContentManagerListViewPluginOptions);
return get(pluginOptions, 'i18n.localized', false);
};
export default useHasI18n;