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')}