From fc42a110becf408462186565f06977c31d0dc963 Mon Sep 17 00:00:00 2001 From: Gustav Hansen Date: Wed, 18 May 2022 14:34:58 +0200 Subject: [PATCH] useModalQueryParams: Pass down query into useAssets and useFolders --- .../AssetDialog/BrowseStep/index.js | 21 +++++++- .../admin/src/components/AssetDialog/index.js | 9 ++-- .../src/components/FolderList/FolderList.js | 50 +++++++++++-------- .../core/upload/admin/src/hooks/useAssets.js | 26 +++++----- .../core/upload/admin/src/hooks/useFolders.js | 47 +++++++++-------- .../admin/src/hooks/useModalQueryParams.js | 2 +- .../admin/src/pages/App/MediaLibrary.js | 10 ++++ 7 files changed, 103 insertions(+), 62 deletions(-) diff --git a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/index.js b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/index.js index 737108df61..8933bf9fd2 100644 --- a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/index.js +++ b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/index.js @@ -10,6 +10,7 @@ import styled from 'styled-components'; import getTrad from '../../../utils/getTrad'; import getAllowedFiles from '../../../utils/getAllowedFiles'; import { AssetList } from '../../AssetList'; +import { FolderList } from '../../FolderList'; import { EmptyAssets } from '../../EmptyAssets'; import { Filters } from './Filters'; import PaginationFooter from './PaginationFooter'; @@ -39,6 +40,7 @@ export const BrowseStep = ({ onChangePageSize, onChangeSearch, onChangeSort, + onChangeFolder, onEditAsset, onSelectAllAsset, onSelectAsset, @@ -98,7 +100,19 @@ export const BrowseStep = ({ )} - {folders.length > 0 && <>} + {folders.length > 0 && ( + + )} {assets.length > 0 ? ( ) : ( @@ -154,6 +172,7 @@ BrowseStep.propTypes = { multiple: PropTypes.bool, onChangeFilters: PropTypes.func.isRequired, + onChangeFolder: PropTypes.func.isRequired, onChangePage: PropTypes.func.isRequired, onChangePageSize: PropTypes.func.isRequired, onChangeSort: PropTypes.func.isRequired, diff --git a/packages/core/upload/admin/src/components/AssetDialog/index.js b/packages/core/upload/admin/src/components/AssetDialog/index.js index 7b04749be5..51a45a5f8f 100644 --- a/packages/core/upload/admin/src/components/AssetDialog/index.js +++ b/packages/core/upload/admin/src/components/AssetDialog/index.js @@ -12,6 +12,7 @@ import { Badge } from '@strapi/design-system/Badge'; import { Loader } from '@strapi/design-system/Loader'; import { Stack } from '@strapi/design-system/Stack'; import { NoPermissions, AnErrorOccurred, useSelectionState } from '@strapi/helper-plugin'; + import getTrad from '../../utils/getTrad'; import { SelectedStep } from './SelectedStep'; import { BrowseStep } from './BrowseStep'; @@ -48,7 +49,7 @@ export const AssetDialog = ({ canDownload, } = useMediaLibraryPermissions(); const [ - { rawQuery, queryObject }, + { queryObject }, { onChangeFilters, onChangePage, @@ -62,12 +63,12 @@ export const AssetDialog = ({ data: { pagination, results: assets } = {}, isLoading: isLoadingAssets, error: errorAssets, - } = useAssets({ skipWhen: !canRead, rawQuery }); + } = useAssets({ skipWhen: !canRead, query: queryObject }); const { data: { results: folders } = {}, isLoading: isLoadingFolders, error: errorFolders, - } = useFolders(); + } = useFolders({ query: queryObject }); const [selectedAssets, { selectOne, selectAll, selectOnly, setSelections }] = useSelectionState( ['id'], @@ -246,7 +247,7 @@ export const AssetDialog = ({ { - const history = useHistory(); - const { pathname } = useLocation(); - const [{ query }] = useQueryParams(); - return ( {title && ( @@ -52,35 +46,46 @@ export const FolderList = ({ const isSelected = !!selectedFolders.find( currentFolder => currentFolder.id === folder.id ); - const url = `${pathname}?${stringify( - { ...query, folder: folder.id }, - { encode: false } - )}`; return ( history.push(url)} + onDoubleClick={event => { + event.preventDefault(); + onClickFolder(folder); + }} startAction={ - onSelectFolder({ ...folder, type: 'folder' })} - /> + onSelectFolder && ( + onSelectFolder({ ...folder, type: 'folder' })} + /> + ) + } + cardActions={ + onEditFolder && ( + } onClick={() => onEditFolder(folder)} /> + ) } - cardActions={} onClick={() => onEditFolder(folder)} />} size={size} > - + { + event.preventDefault(); + onClickFolder(folder); + }} + > {folder.name} : - + {folder.children.count} folder, {folder.files.count} assets @@ -96,6 +101,8 @@ export const FolderList = ({ }; FolderList.defaultProps = { + onEditFolder: null, + onSelectFolder: null, size: 'M', selectedFolders: [], title: null, @@ -105,7 +112,8 @@ FolderList.propTypes = { folders: PropTypes.arrayOf(FolderDefinition).isRequired, size: PropTypes.oneOf(['S', 'M']), selectedFolders: PropTypes.array, - onEditFolder: PropTypes.func.isRequired, - onSelectFolder: PropTypes.func.isRequired, + onClickFolder: PropTypes.func.isRequired, + onEditFolder: PropTypes.func, + onSelectFolder: PropTypes.func, title: PropTypes.string, }; diff --git a/packages/core/upload/admin/src/hooks/useAssets.js b/packages/core/upload/admin/src/hooks/useAssets.js index bb5c3e5e1c..f45083c6f7 100644 --- a/packages/core/upload/admin/src/hooks/useAssets.js +++ b/packages/core/upload/admin/src/hooks/useAssets.js @@ -7,25 +7,25 @@ import { useIntl } from 'react-intl'; import pluginId from '../pluginId'; import { axiosInstance, getRequestUrl } from '../utils'; -export const useAssets = ({ skipWhen, query, rawQuery }) => { +export const useAssets = ({ skipWhen, query = {} }) => { const { formatMessage } = useIntl(); const toggleNotification = useNotification(); const { notifyStatus } = useNotifyAT(); const dataRequestURL = getRequestUrl('files'); + const { folder, ...paramsExceptFolder } = query; + const params = { + ...paramsExceptFolder, + filters: { + folder: { + id: query?.folder ?? { + $null: true, + }, + }, + }, + }; const getAssets = async () => { try { - const { folder, ...paramsExceptFolder } = query; - const params = { - ...paramsExceptFolder, - filters: { - folder: { - id: query?.folder ?? { - $null: true, - }, - }, - }, - }; const { data } = await axiosInstance.get(`${dataRequestURL}?${stringify(params)}`); notifyStatus( @@ -46,7 +46,7 @@ export const useAssets = ({ skipWhen, query, rawQuery }) => { } }; - const { data, error, isLoading } = useQuery([pluginId, 'assets', rawQuery], getAssets, { + const { data, error, isLoading } = useQuery([pluginId, 'assets', stringify(params)], getAssets, { enabled: !skipWhen, staleTime: 0, cacheTime: 0, diff --git a/packages/core/upload/admin/src/hooks/useFolders.js b/packages/core/upload/admin/src/hooks/useFolders.js index 97623b536f..dd330a7512 100644 --- a/packages/core/upload/admin/src/hooks/useFolders.js +++ b/packages/core/upload/admin/src/hooks/useFolders.js @@ -1,35 +1,34 @@ import { stringify } from 'qs'; import { useQuery } from 'react-query'; import { useNotifyAT } from '@strapi/design-system/LiveRegions'; -import { useNotification, useQueryParams } from '@strapi/helper-plugin'; +import { useNotification } from '@strapi/helper-plugin'; import { useIntl } from 'react-intl'; import pluginId from '../pluginId'; import { axiosInstance, getRequestUrl } from '../utils'; -export const useFolders = ({ enabled = true }) => { +export const useFolders = ({ enabled = true, query = {} }) => { const { formatMessage } = useIntl(); const toggleNotification = useNotification(); const { notifyStatus } = useNotifyAT(); - const [{ rawQuery, query }] = useQueryParams(); const dataRequestURL = getRequestUrl('folders'); + const { folder, ...paramsExceptFolder } = query; + const params = { + ...paramsExceptFolder, + pagination: { + pageSize: -1, + }, + filters: { + parent: { + id: query?.folder ?? { + $null: true, + }, + }, + }, + }; const fetchFolders = async () => { try { - const { folder, ...paramsExceptFolder } = query; - const params = { - ...paramsExceptFolder, - pagination: { - pageSize: -1, - }, - filters: { - parent: { - id: query?.folder ?? { - $null: true, - }, - }, - }, - }; const { data } = await axiosInstance.get(`${dataRequestURL}?${stringify(params)}`); notifyStatus( @@ -50,11 +49,15 @@ export const useFolders = ({ enabled = true }) => { } }; - const { data, error, isLoading } = useQuery([pluginId, 'folders', rawQuery], fetchFolders, { - enabled, - staleTime: 0, - cacheTime: 0, - }); + const { data, error, isLoading } = useQuery( + [pluginId, 'folders', stringify(params)], + fetchFolders, + { + enabled, + staleTime: 0, + cacheTime: 0, + } + ); return { data, error, isLoading }; }; diff --git a/packages/core/upload/admin/src/hooks/useModalQueryParams.js b/packages/core/upload/admin/src/hooks/useModalQueryParams.js index 909f2863f3..685171daab 100644 --- a/packages/core/upload/admin/src/hooks/useModalQueryParams.js +++ b/packages/core/upload/admin/src/hooks/useModalQueryParams.js @@ -45,7 +45,7 @@ const useModalQueryParams = () => { }; const handleChangeFolder = folder => { - setQueryObject(prev => ({ ...prev, folder })); + setQueryObject(prev => ({ ...prev, folder: folder.id ?? null })); }; return [ diff --git a/packages/core/upload/admin/src/pages/App/MediaLibrary.js b/packages/core/upload/admin/src/pages/App/MediaLibrary.js index 7b6a8a3472..c78865d890 100644 --- a/packages/core/upload/admin/src/pages/App/MediaLibrary.js +++ b/packages/core/upload/admin/src/pages/App/MediaLibrary.js @@ -56,10 +56,12 @@ export const MediaLibrary = () => { const { data: assetsData, isLoading: assetsLoading, errors: assetsError } = useAssets({ skipWhen: !canRead, + query, }); const { data: foldersData, isLoading: foldersLoading, errors: foldersError } = useFolders({ enabled: assetsData?.pagination?.page === 1 && !isFiltering, + query, }); const { data: folderStructure, isLoading: folderStructureIsLoading } = useFolderStructure(); @@ -98,6 +100,13 @@ export const MediaLibrary = () => { toggleEditFolderDialog(payload); }; + const handleClickFolder = folder => { + setQuery({ + ...query, + folder: folder.id, + }); + }; + useFocusWhenNavigate(); const folders = foldersData?.results; @@ -213,6 +222,7 @@ export const MediaLibrary = () => { {folders?.length > 0 && !isFiltering && ( type === 'folder')}