diff --git a/packages/strapi-admin/admin/src/utils/fakePermissionsData.js b/packages/strapi-admin/admin/src/utils/fakePermissionsData.js index 98eb977654..f1b9788a00 100644 --- a/packages/strapi-admin/admin/src/utils/fakePermissionsData.js +++ b/packages/strapi-admin/admin/src/utils/fakePermissionsData.js @@ -386,36 +386,36 @@ const data = { }, // Upload plugin - { - action: 'plugins::upload.read', - subject: null, - fields: null, - conditions: [], - }, - { - action: 'plugins::upload.assets.create', - subject: null, - fields: null, - conditions: [], - }, // { - // action: 'plugins::upload.assets.update', + // action: 'plugins::upload.read', + // subject: null, + // fields: null, + // conditions: [], + // }, + // { + // action: 'plugins::upload.assets.create', // subject: null, // fields: null, // conditions: [], // }, { - action: 'plugins::upload.assets.dowload', - subject: null, - fields: null, - conditions: [], - }, - { - action: 'plugins::upload.assets.copy-link', + action: 'plugins::upload.assets.update', subject: null, fields: null, conditions: [], }, + // { + // action: 'plugins::upload.assets.dowload', + // subject: null, + // fields: null, + // conditions: [], + // }, + // { + // action: 'plugins::upload.assets.copy-link', + // subject: null, + // fields: null, + // conditions: [], + // }, { action: 'plugins::upload.settings.read', subject: null, diff --git a/packages/strapi-plugin-upload/admin/src/components/BrowseAssets/index.js b/packages/strapi-plugin-upload/admin/src/components/BrowseAssets/index.js index 50c1d14fa5..29cd48ec41 100644 --- a/packages/strapi-plugin-upload/admin/src/components/BrowseAssets/index.js +++ b/packages/strapi-plugin-upload/admin/src/components/BrowseAssets/index.js @@ -15,6 +15,7 @@ import CardControl from '../CardControl'; const BrowseAssets = () => { const { + allowedActions, allowedTypes, count, files, @@ -80,18 +81,24 @@ const BrowseAssets = () => { /* eslint-disable react/jsx-indent */ const renderCardControl = noNavigation ? null - : id => ( - { - e.stopPropagation(); - handleGoToEditFile(id); - }} - /> - ); + : id => { + if (!allowedActions.canUpdate) { + return null; + } + + return ( + { + e.stopPropagation(); + handleGoToEditFile(id); + }} + /> + ); + }; /* eslint-enable indent */ /* eslint-enable react/jsx-indent */ @@ -113,57 +120,62 @@ const BrowseAssets = () => { const areResultsEmptyWithSearchOrFilters = isEmpty(files) && (hasSearch || hasFilters); return ( - - - - {multiple && ( - - + + + {allowedActions.canRead && ( + + {multiple && ( + + + + )} + + + - + )} - - - + {!files || files.length === 0 ? ( + - - - {!files || files.length === 0 ? ( - - ) : ( - <> - - - - {} }} - count={count} - onChangeParams={handleChangeListParams} - params={paginationParams} - /> + ) : ( + <> + + + + {} }} + count={count} + onChangeParams={handleChangeListParams} + params={paginationParams} + /> + - - - )} - + + )} + + ); }; diff --git a/packages/strapi-plugin-upload/admin/src/components/EditForm/index.js b/packages/strapi-plugin-upload/admin/src/components/EditForm/index.js index 6133a04047..aa91b98955 100644 --- a/packages/strapi-plugin-upload/admin/src/components/EditForm/index.js +++ b/packages/strapi-plugin-upload/admin/src/components/EditForm/index.js @@ -38,6 +38,8 @@ import isVideoType from './utils/isVideoType'; const EditForm = forwardRef( ( { + canCopyLink, + canDownload, components, fileToEdit, isEditingUploadedFile, @@ -236,12 +238,14 @@ const EditForm = forwardRef( /> {fileURL && ( <> - + {canDownload && ( + + )} hidden - - - - + {canCopyLink && ( + + + + )} )} {canCrop && ( @@ -377,6 +382,8 @@ const EditForm = forwardRef( ); EditForm.defaultProps = { + canCopyLink: true, + canDownload: true, components: { CheckControl: CardControl, }, @@ -392,6 +399,8 @@ EditForm.defaultProps = { }; EditForm.propTypes = { + canCopyLink: PropTypes.bool, + canDownload: PropTypes.bool, onAbortUpload: PropTypes.func, components: PropTypes.object, fileToEdit: PropTypes.object, diff --git a/packages/strapi-plugin-upload/admin/src/components/List/index.js b/packages/strapi-plugin-upload/admin/src/components/List/index.js index fab4e621d3..2db70e31ab 100644 --- a/packages/strapi-plugin-upload/admin/src/components/List/index.js +++ b/packages/strapi-plugin-upload/admin/src/components/List/index.js @@ -20,6 +20,7 @@ const List = ({ smallCards, canSelect, renderCardControl, + showCheckbox, }) => { const selectedAssets = selectedItems.length; @@ -57,7 +58,7 @@ const List = ({ > {(checked || canSelect) && ( <> - {(checked || isAllowed) && ( + {(checked || isAllowed) && showCheckbox && ( { +const ListEmpty = ({ canCreate, hasSearchApplied, onClick, numberOfRows }) => { const rows = generateRows(numberOfRows); const titleId = hasSearchApplied ? 'list.assets-empty.title-withSearch' @@ -34,30 +34,34 @@ const ListEmpty = ({ hasSearchApplied, onClick, numberOfRows }) => { ); })} -
- + {canCreate && ( +
+ - {!hasSearchApplied && ( - <> - -
- - - )} -
+ {!hasSearchApplied && ( + <> + +
+ + + )} +
+ )} ); }; ListEmpty.defaultProps = { + canCreate: true, hasSearchApplied: false, onClick: () => {}, numberOfRows: 3, }; ListEmpty.propTypes = { + canCreate: PropTypes.bool, hasSearchApplied: PropTypes.bool, onClick: PropTypes.func, numberOfRows: PropTypes.number, diff --git a/packages/strapi-plugin-upload/admin/src/components/ListModal/index.js b/packages/strapi-plugin-upload/admin/src/components/ListModal/index.js index f93facc00e..abccc30568 100644 --- a/packages/strapi-plugin-upload/admin/src/components/ListModal/index.js +++ b/packages/strapi-plugin-upload/admin/src/components/ListModal/index.js @@ -1,8 +1,10 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Button } from '@buffetjs/core'; +import { CheckPermissions } from 'strapi-helper-plugin'; import useModalContext from '../../hooks/useModalContext'; import { getTrad } from '../../utils'; +import pluginPermissions from '../../permissions'; import BrowseAssets from '../BrowseAssets'; import ModalNavWrapper from '../ModalNavWrapper'; import ModalSection from '../ModalSection'; @@ -23,13 +25,15 @@ const ListModal = ({ noNavigation }) => { const renderUploadModalButton = () => ( - + + + ); diff --git a/packages/strapi-plugin-upload/admin/src/containers/HomePage/HomePageContent/HomePageList.js b/packages/strapi-plugin-upload/admin/src/containers/HomePage/HomePageContent/HomePageList.js index 884400795f..d9f590e587 100644 --- a/packages/strapi-plugin-upload/admin/src/containers/HomePage/HomePageContent/HomePageList.js +++ b/packages/strapi-plugin-upload/admin/src/containers/HomePage/HomePageContent/HomePageList.js @@ -2,8 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { PageFooter, useQuery } from 'strapi-helper-plugin'; import { generatePageFromStart, generateStartFromPage } from '../../../utils'; -// TODO -// import { useAppContext } from '../../../hooks'; +import { useAppContext } from '../../../hooks'; import List from '../../../components/List'; import ListEmpty from '../../../components/ListEmpty'; import Padded from '../../../components/Padded'; @@ -19,8 +18,9 @@ const HomePageList = ({ onClick, }) => { const query = useQuery(); - // TODO - // const { allowedActions } = useAppContext(); + const { + allowedActions: { canCreate, canUpdate }, + } = useAppContext(); const limit = parseInt(query.get('_limit'), 10) || 10; const start = parseInt(query.get('_start'), 10) || 0; @@ -48,8 +48,7 @@ const HomePageList = ({ onChange={onCardCheck} onCardClick={onCardClick} selectedItems={dataToDelete} - // TODO - // showCheckbox={allowedActions.canUpdate} + showCheckbox={canUpdate} /> @@ -65,7 +64,13 @@ const HomePageList = ({ ); } - return ; + return ( + + ); }; HomePageList.defaultProps = { diff --git a/packages/strapi-plugin-upload/admin/src/containers/HomePage/index.js b/packages/strapi-plugin-upload/admin/src/containers/HomePage/index.js index d84a8b1e7a..ae21b0c0dc 100644 --- a/packages/strapi-plugin-upload/admin/src/containers/HomePage/index.js +++ b/packages/strapi-plugin-upload/admin/src/containers/HomePage/index.js @@ -27,7 +27,6 @@ import reducer, { initialState } from './reducer'; const HomePage = () => { const { allowedActions } = useAppContext(); const { canRead } = allowedActions; - console.log({ allowedActions }); const { formatMessage, plugins } = useGlobalContext(); const [, updated_at] = getFileModelTimestamps(plugins); const [reducerState, dispatch] = useReducer(reducer, initialState, () => diff --git a/packages/strapi-plugin-upload/admin/src/containers/InputModalStepper/InputModalStepper.js b/packages/strapi-plugin-upload/admin/src/containers/InputModalStepper/InputModalStepper.js index 14b9e5dda3..bcb1e896cd 100644 --- a/packages/strapi-plugin-upload/admin/src/containers/InputModalStepper/InputModalStepper.js +++ b/packages/strapi-plugin-upload/admin/src/containers/InputModalStepper/InputModalStepper.js @@ -9,7 +9,13 @@ import pluginId from '../../pluginId'; import stepper from './stepper'; import useModalContext from '../../hooks/useModalContext'; -const InputModalStepper = ({ isOpen, onToggle, noNavigation, onInputMediaChange }) => { +const InputModalStepper = ({ + allowedActions, + isOpen, + onToggle, + noNavigation, + onInputMediaChange, +}) => { const { emitEvent, formatMessage } = useGlobalContext(); const [shouldDeleteFile, setShouldDeleteFile] = useState(false); const [displayNextButton, setDisplayNextButton] = useState(false); @@ -308,6 +314,7 @@ const InputModalStepper = ({ isOpen, onToggle, noNavigation, onInputMediaChange {/* body of the modal */} {Component && ( {}, }; InputModalStepper.propTypes = { + allowedActions: { + canCopyLink: true, + canCreate: true, + canDownload: true, + canMain: true, + canRead: true, + canSettings: true, + canUpdate: true, + }, isOpen: PropTypes.bool.isRequired, noNavigation: PropTypes.bool, onInputMediaChange: PropTypes.func.isRequired, diff --git a/packages/strapi-plugin-upload/admin/src/containers/InputModalStepper/index.js b/packages/strapi-plugin-upload/admin/src/containers/InputModalStepper/index.js index 8d70b21ff1..5465081377 100644 --- a/packages/strapi-plugin-upload/admin/src/containers/InputModalStepper/index.js +++ b/packages/strapi-plugin-upload/admin/src/containers/InputModalStepper/index.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import { DndProvider } from 'react-dnd'; import HTML5Backend from 'react-dnd-html5-backend'; import DragLayer from '../../components/DragLayer'; +import { useUserPermissions } from '../../hooks'; import InputModalStepper from './InputModalStepper'; import InputModalStepperProvider from '../InputModalStepperProvider'; @@ -20,11 +21,17 @@ const InputModal = ({ step, }) => { const singularTypes = allowedTypes.map(type => type.substring(0, type.length - 1)); + const { allowedActions, isLoading } = useUserPermissions(); + + if (isLoading) { + return null; + } return ( { const [formErrors, setFormErrors] = useState(null); + const { emitEvent, plugins } = useGlobalContext(); const [, updated_at] = getFileModelTimestamps(plugins); const [reducerState, dispatch] = useReducer(reducer, initialState, state => @@ -335,12 +338,14 @@ const InputModalStepperProvider = ({ }; const fetchMediaLib = async () => { - const [files, count] = await Promise.all([fetchMediaLibFiles(), fetchMediaLibFilesCount()]); - dispatch({ - type: 'GET_DATA_SUCCEEDED', - files, - countData: count, - }); + if (allowedActions.canRead) { + const [files, count] = await Promise.all([fetchMediaLibFiles(), fetchMediaLibFilesCount()]); + dispatch({ + type: 'GET_DATA_SUCCEEDED', + files, + countData: count, + }); + } }; const fetchMediaLibFiles = async () => { @@ -455,6 +460,7 @@ const InputModalStepperProvider = ({ { + const { allowedActions } = useAppContext(); const { emitEvent, formatMessage } = useGlobalContext(); const [isWarningDeleteOpen, setIsWarningDeleteOpen] = useState(false); const [shouldDeleteFile, setShouldDeleteFile] = useState(false); @@ -479,6 +481,7 @@ const ModalStepper = ({ {/* body of the modal */} {Component && (