mirror of
https://github.com/strapi/strapi.git
synced 2025-09-18 21:08:54 +00:00
Bulk delete
This commit is contained in:
parent
698ece4396
commit
c879a50e95
37
packages/core/upload/admin/src/hooks/useBulkRemoveAsset.js
Normal file
37
packages/core/upload/admin/src/hooks/useBulkRemoveAsset.js
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
import { useMutation, useQueryClient } from 'react-query';
|
||||||
|
import { useNotification } from '@strapi/helper-plugin';
|
||||||
|
import { removeAssetRequest } from '../utils/removeAssetQuery';
|
||||||
|
|
||||||
|
const bulkRemoveQuery = assetIds => {
|
||||||
|
const promises = assetIds.map(assetId => removeAssetRequest(assetId));
|
||||||
|
|
||||||
|
return Promise.all(promises);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const useBulkRemoveAsset = () => {
|
||||||
|
const toggleNotification = useNotification();
|
||||||
|
const queryClient = useQueryClient();
|
||||||
|
|
||||||
|
const mutation = useMutation(bulkRemoveQuery, {
|
||||||
|
onSuccess: () => {
|
||||||
|
// Coupled with the cache of useAssets
|
||||||
|
queryClient.refetchQueries(['assets'], { active: true });
|
||||||
|
queryClient.refetchQueries(['asset-count'], { active: true });
|
||||||
|
|
||||||
|
toggleNotification({
|
||||||
|
type: 'success',
|
||||||
|
message: {
|
||||||
|
id: 'modal.remove.success-label',
|
||||||
|
defaultMessage: 'The asset has been successfully removed.',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
|
onError: error => {
|
||||||
|
toggleNotification({ type: 'warning', message: error.message });
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const removeAssets = assetIds => mutation.mutateAsync(assetIds);
|
||||||
|
|
||||||
|
return { ...mutation, removeAssets };
|
||||||
|
};
|
@ -1,16 +1,6 @@
|
|||||||
import { useMutation, useQueryClient } from 'react-query';
|
import { useMutation, useQueryClient } from 'react-query';
|
||||||
import { useNotification } from '@strapi/helper-plugin';
|
import { useNotification } from '@strapi/helper-plugin';
|
||||||
import { axiosInstance } from '../utils';
|
import { removeAssetRequest } from '../utils/removeAssetQuery';
|
||||||
|
|
||||||
const removeAssetRequest = assetId => {
|
|
||||||
const endpoint = `/upload/files/${assetId}`;
|
|
||||||
|
|
||||||
return axiosInstance({
|
|
||||||
method: 'delete',
|
|
||||||
url: endpoint,
|
|
||||||
headers: {},
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useRemoveAsset = onSuccess => {
|
export const useRemoveAsset = onSuccess => {
|
||||||
const toggleNotification = useNotification();
|
const toggleNotification = useNotification();
|
||||||
|
@ -25,6 +25,7 @@ import { SortPicker } from './components/SortPicker';
|
|||||||
import { PaginationFooter } from '../../components/PaginationFooter';
|
import { PaginationFooter } from '../../components/PaginationFooter';
|
||||||
import { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions';
|
import { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions';
|
||||||
import { useAssetCount } from '../../hooks/useAssetCount';
|
import { useAssetCount } from '../../hooks/useAssetCount';
|
||||||
|
import { BulkDeleteButton } from './components/BulkDeleteButton';
|
||||||
|
|
||||||
const BoxWithHeight = styled(Box)`
|
const BoxWithHeight = styled(Box)`
|
||||||
height: ${32 / 16}rem;
|
height: ${32 / 16}rem;
|
||||||
@ -51,14 +52,35 @@ export const MediaLibrary = () => {
|
|||||||
|
|
||||||
const [showUploadAssetDialog, setShowUploadAssetDialog] = useState(false);
|
const [showUploadAssetDialog, setShowUploadAssetDialog] = useState(false);
|
||||||
const [assetToEdit, setAssetToEdit] = useState(undefined);
|
const [assetToEdit, setAssetToEdit] = useState(undefined);
|
||||||
|
const [selected, setSelected] = useState([]);
|
||||||
const toggleUploadAssetDialog = () => setShowUploadAssetDialog(prev => !prev);
|
const toggleUploadAssetDialog = () => setShowUploadAssetDialog(prev => !prev);
|
||||||
|
|
||||||
useFocusWhenNavigate();
|
useFocusWhenNavigate();
|
||||||
|
|
||||||
const loading = isLoadingPermissions || isLoading || isLoadingCount;
|
const loading = isLoadingPermissions || isLoading || isLoadingCount;
|
||||||
|
|
||||||
const assets = data?.results;
|
const assets = data?.results;
|
||||||
|
|
||||||
|
const selectAllAssets = () => {
|
||||||
|
if (selected.length > 0) {
|
||||||
|
setSelected([]);
|
||||||
|
} else {
|
||||||
|
setSelected((assets || []).map(({ id }) => id));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const selectAsset = asset => {
|
||||||
|
const index = selected.indexOf(asset.id);
|
||||||
|
|
||||||
|
if (index > -1) {
|
||||||
|
setSelected(prevSelected => [
|
||||||
|
...prevSelected.slice(0, index),
|
||||||
|
...prevSelected.slice(index + 1),
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
|
setSelected(prevSelected => [...prevSelected, asset.id]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout>
|
<Layout>
|
||||||
<Main aria-busy={loading}>
|
<Main aria-busy={loading}>
|
||||||
@ -107,6 +129,8 @@ export const MediaLibrary = () => {
|
|||||||
id: getTrad('bulk.select.label'),
|
id: getTrad('bulk.select.label'),
|
||||||
defaultMessage: 'Select all assets',
|
defaultMessage: 'Select all assets',
|
||||||
})}
|
})}
|
||||||
|
value={selected.length === assets?.length}
|
||||||
|
onChange={selectAllAssets}
|
||||||
/>
|
/>
|
||||||
</BoxWithHeight>
|
</BoxWithHeight>
|
||||||
<SortPicker />
|
<SortPicker />
|
||||||
@ -124,6 +148,10 @@ export const MediaLibrary = () => {
|
|||||||
/>
|
/>
|
||||||
|
|
||||||
<ContentLayout>
|
<ContentLayout>
|
||||||
|
{selected.length > 0 && (
|
||||||
|
<BulkDeleteButton assetIds={selected} onSuccess={() => setSelected([])} />
|
||||||
|
)}
|
||||||
|
|
||||||
{loading && <LoadingIndicatorPage />}
|
{loading && <LoadingIndicatorPage />}
|
||||||
{error && <AnErrorOccurred />}
|
{error && <AnErrorOccurred />}
|
||||||
{!canRead && <NoPermissions />}
|
{!canRead && <NoPermissions />}
|
||||||
@ -160,7 +188,12 @@ export const MediaLibrary = () => {
|
|||||||
)}
|
)}
|
||||||
{canRead && assets && assets.length > 0 && (
|
{canRead && assets && assets.length > 0 && (
|
||||||
<>
|
<>
|
||||||
<ListView assets={assets} onEditAsset={setAssetToEdit} />
|
<ListView
|
||||||
|
assets={assets}
|
||||||
|
onEditAsset={setAssetToEdit}
|
||||||
|
onSelectAsset={selectAsset}
|
||||||
|
selectedAssets={selected}
|
||||||
|
/>
|
||||||
{data?.pagination && <PaginationFooter pagination={data.pagination} />}
|
{data?.pagination && <PaginationFooter pagination={data.pagination} />}
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
@ -0,0 +1,60 @@
|
|||||||
|
import React, { useState } from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import { useIntl } from 'react-intl';
|
||||||
|
import { Subtitle } from '@strapi/parts/Text';
|
||||||
|
import { Button } from '@strapi/parts/Button';
|
||||||
|
import { Stack } from '@strapi/parts/Stack';
|
||||||
|
import DeleteIcon from '@strapi/icons/DeleteIcon';
|
||||||
|
import { ConfirmDialog } from '@strapi/helper-plugin';
|
||||||
|
import { useBulkRemoveAsset } from '../../../hooks/useBulkRemoveAsset';
|
||||||
|
import getTrad from '../../../utils/getTrad';
|
||||||
|
|
||||||
|
export const BulkDeleteButton = ({ assetIds, onSuccess }) => {
|
||||||
|
const { formatMessage } = useIntl();
|
||||||
|
const [showConfirmDialog, setShowConfirmDialog] = useState(false);
|
||||||
|
|
||||||
|
const { isLoading, removeAssets } = useBulkRemoveAsset();
|
||||||
|
|
||||||
|
const handleConfirmRemove = async () => {
|
||||||
|
await removeAssets(assetIds);
|
||||||
|
onSuccess();
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Stack horizontal size={2} paddingBottom={5}>
|
||||||
|
<Subtitle textColor="neutral600">
|
||||||
|
{formatMessage(
|
||||||
|
{
|
||||||
|
id: getTrad('list.assets.selected.plural'),
|
||||||
|
defaultMessage: '1 asset selected',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
number: assetIds.length,
|
||||||
|
}
|
||||||
|
)}
|
||||||
|
</Subtitle>
|
||||||
|
<Button
|
||||||
|
variant="danger-light"
|
||||||
|
size="S"
|
||||||
|
startIcon={<DeleteIcon />}
|
||||||
|
onClick={() => setShowConfirmDialog(true)}
|
||||||
|
>
|
||||||
|
{formatMessage({ id: getTrad('control-card.delete'), defaultMessage: 'Delete' })}
|
||||||
|
</Button>
|
||||||
|
</Stack>
|
||||||
|
|
||||||
|
<ConfirmDialog
|
||||||
|
isConfirmButtonLoading={isLoading}
|
||||||
|
isOpen={showConfirmDialog}
|
||||||
|
onToggleDialog={() => setShowConfirmDialog(false)}
|
||||||
|
onConfirm={handleConfirmRemove}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
BulkDeleteButton.propTypes = {
|
||||||
|
assetIds: PropTypes.arrayOf(PropTypes.number).isRequired,
|
||||||
|
onSuccess: PropTypes.func.isRequired,
|
||||||
|
};
|
@ -8,11 +8,13 @@ import { VideoAssetCard } from '../../../components/AssetCard/VideoAssetCard';
|
|||||||
import { DocAssetCard } from '../../../components/AssetCard/DocAssetCard';
|
import { DocAssetCard } from '../../../components/AssetCard/DocAssetCard';
|
||||||
import { AssetType } from '../../../constants';
|
import { AssetType } from '../../../constants';
|
||||||
|
|
||||||
export const ListView = ({ assets, onEditAsset }) => {
|
export const ListView = ({ assets, onEditAsset, onSelectAsset, selectedAssets }) => {
|
||||||
return (
|
return (
|
||||||
<KeyboardNavigable tagName="article">
|
<KeyboardNavigable tagName="article">
|
||||||
<GridLayout>
|
<GridLayout>
|
||||||
{assets.map(asset => {
|
{assets.map(asset => {
|
||||||
|
const isSelected = (selectedAssets || []).indexOf(asset.id) > -1;
|
||||||
|
|
||||||
if (asset.mime.includes(AssetType.Video)) {
|
if (asset.mime.includes(AssetType.Video)) {
|
||||||
return (
|
return (
|
||||||
<VideoAssetCard
|
<VideoAssetCard
|
||||||
@ -23,6 +25,8 @@ export const ListView = ({ assets, onEditAsset }) => {
|
|||||||
url={prefixFileUrlWithBackendUrl(asset.url)}
|
url={prefixFileUrlWithBackendUrl(asset.url)}
|
||||||
mime={asset.mime}
|
mime={asset.mime}
|
||||||
onEdit={() => onEditAsset(asset)}
|
onEdit={() => onEditAsset(asset)}
|
||||||
|
onSelect={() => onSelectAsset(asset)}
|
||||||
|
selected={isSelected}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -38,6 +42,8 @@ export const ListView = ({ assets, onEditAsset }) => {
|
|||||||
width={asset.width}
|
width={asset.width}
|
||||||
thumbnail={prefixFileUrlWithBackendUrl(asset?.formats?.thumbnail?.url || asset.url)}
|
thumbnail={prefixFileUrlWithBackendUrl(asset?.formats?.thumbnail?.url || asset.url)}
|
||||||
onEdit={() => onEditAsset(asset)}
|
onEdit={() => onEditAsset(asset)}
|
||||||
|
onSelect={() => onSelectAsset(asset)}
|
||||||
|
selected={isSelected}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -49,6 +55,8 @@ export const ListView = ({ assets, onEditAsset }) => {
|
|||||||
name={asset.name}
|
name={asset.name}
|
||||||
extension={getFileExtension(asset.ext)}
|
extension={getFileExtension(asset.ext)}
|
||||||
onEdit={() => onEditAsset(asset)}
|
onEdit={() => onEditAsset(asset)}
|
||||||
|
onSelect={() => onSelectAsset(asset)}
|
||||||
|
selected={isSelected}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
@ -60,4 +68,6 @@ export const ListView = ({ assets, onEditAsset }) => {
|
|||||||
ListView.propTypes = {
|
ListView.propTypes = {
|
||||||
assets: PropTypes.arrayOf(PropTypes.shape({})).isRequired,
|
assets: PropTypes.arrayOf(PropTypes.shape({})).isRequired,
|
||||||
onEditAsset: PropTypes.func.isRequired,
|
onEditAsset: PropTypes.func.isRequired,
|
||||||
|
onSelectAsset: PropTypes.func.isRequired,
|
||||||
|
selectedAssets: PropTypes.arrayOf(PropTypes.number).isRequired,
|
||||||
};
|
};
|
||||||
|
@ -130,7 +130,7 @@ describe('MediaLibrary / ListView', () => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
expect(container).toMatchInlineSnapshot(`
|
expect(container).toMatchInlineSnapshot(`
|
||||||
.c30 {
|
.c32 {
|
||||||
border: 0;
|
border: 0;
|
||||||
-webkit-clip: rect(0 0 0 0);
|
-webkit-clip: rect(0 0 0 0);
|
||||||
clip: rect(0 0 0 0);
|
clip: rect(0 0 0 0);
|
||||||
@ -148,7 +148,7 @@ describe('MediaLibrary / ListView', () => {
|
|||||||
grid-gap: 16px;
|
grid-gap: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c5 {
|
.c7 {
|
||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
display: -webkit-flex;
|
display: -webkit-flex;
|
||||||
display: -ms-flexbox;
|
display: -ms-flexbox;
|
||||||
@ -162,21 +162,21 @@ describe('MediaLibrary / ListView', () => {
|
|||||||
outline: none;
|
outline: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c5 svg {
|
.c7 svg {
|
||||||
height: 12px;
|
height: 12px;
|
||||||
width: 12px;
|
width: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c5 svg > g,
|
.c7 svg > g,
|
||||||
.c5 svg path {
|
.c7 svg path {
|
||||||
fill: #ffffff;
|
fill: #ffffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c5[aria-disabled='true'] {
|
.c7[aria-disabled='true'] {
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c5:after {
|
.c7:after {
|
||||||
-webkit-transition-property: all;
|
-webkit-transition-property: all;
|
||||||
transition-property: all;
|
transition-property: all;
|
||||||
-webkit-transition-duration: 0.2s;
|
-webkit-transition-duration: 0.2s;
|
||||||
@ -191,11 +191,11 @@ describe('MediaLibrary / ListView', () => {
|
|||||||
border: 2px solid transparent;
|
border: 2px solid transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c5:focus-visible {
|
.c7:focus-visible {
|
||||||
outline: none;
|
outline: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c5:focus-visible:after {
|
.c7:focus-visible:after {
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
content: '';
|
content: '';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@ -206,7 +206,7 @@ describe('MediaLibrary / ListView', () => {
|
|||||||
border: 2px solid #4945ff;
|
border: 2px solid #4945ff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c6 {
|
.c8 {
|
||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
display: -webkit-flex;
|
display: -webkit-flex;
|
||||||
display: -ms-flexbox;
|
display: -ms-flexbox;
|
||||||
@ -223,26 +223,26 @@ describe('MediaLibrary / ListView', () => {
|
|||||||
width: 2rem;
|
width: 2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c6 svg > g,
|
.c8 svg > g,
|
||||||
.c6 svg path {
|
.c8 svg path {
|
||||||
fill: #8e8ea9;
|
fill: #8e8ea9;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c6:hover svg > g,
|
.c8:hover svg > g,
|
||||||
.c6:hover svg path {
|
.c8:hover svg path {
|
||||||
fill: #666687;
|
fill: #666687;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c6:active svg > g,
|
.c8:active svg > g,
|
||||||
.c6:active svg path {
|
.c8:active svg path {
|
||||||
fill: #a5a5ba;
|
fill: #a5a5ba;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c6[aria-disabled='true'] {
|
.c8[aria-disabled='true'] {
|
||||||
background-color: #eaeaef;
|
background-color: #eaeaef;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c6[aria-disabled='true'] svg path {
|
.c8[aria-disabled='true'] svg path {
|
||||||
fill: #666687;
|
fill: #666687;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -252,21 +252,21 @@ describe('MediaLibrary / ListView', () => {
|
|||||||
box-shadow: 0px 1px 4px rgba(33,33,52,0.1);
|
box-shadow: 0px 1px 4px rgba(33,33,52,0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.c9 {
|
.c11 {
|
||||||
padding-top: 8px;
|
padding-top: 8px;
|
||||||
padding-right: 12px;
|
padding-right: 12px;
|
||||||
padding-bottom: 8px;
|
padding-bottom: 8px;
|
||||||
padding-left: 12px;
|
padding-left: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c16 {
|
.c18 {
|
||||||
background: #f6f6f9;
|
background: #f6f6f9;
|
||||||
color: #666687;
|
color: #666687;
|
||||||
padding: 4px;
|
padding: 4px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c24 {
|
.c26 {
|
||||||
background: #32324d;
|
background: #32324d;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
padding: 4px;
|
padding: 4px;
|
||||||
@ -274,6 +274,12 @@ describe('MediaLibrary / ListView', () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.c4 {
|
.c4 {
|
||||||
|
position: absolute;
|
||||||
|
top: 12px;
|
||||||
|
left: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.c6 {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 12px;
|
top: 12px;
|
||||||
right: 12px;
|
right: 12px;
|
||||||
@ -297,7 +303,7 @@ describe('MediaLibrary / ListView', () => {
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c10 {
|
.c12 {
|
||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
display: -webkit-flex;
|
display: -webkit-flex;
|
||||||
display: -ms-flexbox;
|
display: -ms-flexbox;
|
||||||
@ -311,7 +317,7 @@ describe('MediaLibrary / ListView', () => {
|
|||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c22 {
|
.c24 {
|
||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
display: -webkit-flex;
|
display: -webkit-flex;
|
||||||
display: -ms-flexbox;
|
display: -ms-flexbox;
|
||||||
@ -325,14 +331,14 @@ describe('MediaLibrary / ListView', () => {
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c8 {
|
.c10 {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
max-height: 100%;
|
max-height: 100%;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c7 {
|
.c9 {
|
||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
display: -webkit-flex;
|
display: -webkit-flex;
|
||||||
display: -ms-flexbox;
|
display: -ms-flexbox;
|
||||||
@ -346,62 +352,129 @@ describe('MediaLibrary / ListView', () => {
|
|||||||
background: repeating-conic-gradient(#f6f6f9 0% 25%,transparent 0% 50%) 50% / 20px 20px;
|
background: repeating-conic-gradient(#f6f6f9 0% 25%,transparent 0% 50%) 50% / 20px 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c12 {
|
.c14 {
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
font-size: 0.75rem;
|
font-size: 0.75rem;
|
||||||
line-height: 1.33;
|
line-height: 1.33;
|
||||||
color: #32324d;
|
color: #32324d;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c13 {
|
.c15 {
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-size: 0.75rem;
|
font-size: 0.75rem;
|
||||||
line-height: 1.33;
|
line-height: 1.33;
|
||||||
color: #666687;
|
color: #666687;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c19 {
|
.c21 {
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-size: 0.875rem;
|
font-size: 0.875rem;
|
||||||
line-height: 1.43;
|
line-height: 1.43;
|
||||||
color: #32324d;
|
color: #32324d;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c26 {
|
.c28 {
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-size: 0.75rem;
|
font-size: 0.75rem;
|
||||||
line-height: 1.33;
|
line-height: 1.33;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c20 {
|
.c22 {
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
line-height: 1.14;
|
line-height: 1.14;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c21 {
|
.c23 {
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
font-size: 0.6875rem;
|
font-size: 0.6875rem;
|
||||||
line-height: 1.45;
|
line-height: 1.45;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c17 {
|
.c19 {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c15 {
|
.c17 {
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
-webkit-flex-shrink: 0;
|
-webkit-flex-shrink: 0;
|
||||||
-ms-flex-negative: 0;
|
-ms-flex-negative: 0;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c18 {
|
.c20 {
|
||||||
margin-left: 4px;
|
margin-left: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c11 {
|
.c5 {
|
||||||
|
margin: 0;
|
||||||
|
height: 18px;
|
||||||
|
min-width: 18px;
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 1px solid #c0c0cf;
|
||||||
|
-webkit-appearance: none;
|
||||||
|
background-color: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.c5:checked {
|
||||||
|
background-color: #4945ff;
|
||||||
|
border: 1px solid #4945ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.c5:checked:after {
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
position: relative;
|
||||||
|
background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iOCIgdmlld0JveD0iMCAwIDEwIDgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGgKICAgIGQ9Ik04LjU1MzIzIDAuMzk2OTczQzguNjMxMzUgMC4zMTYzNTUgOC43NjA1MSAwLjMxNTgxMSA4LjgzOTMxIDAuMzk1NzY4TDkuODYyNTYgMS40MzQwN0M5LjkzODkzIDEuNTExNTcgOS45MzkzNSAxLjYzNTkgOS44NjM0OSAxLjcxMzlMNC4wNjQwMSA3LjY3NzI0QzMuOTg1OSA3Ljc1NzU1IDMuODU3MDcgNy43NTgwNSAzLjc3ODM0IDcuNjc4MzRMMC4xMzg2NiAzLjk5MzMzQzAuMDYxNzc5OCAzLjkxNTQ5IDAuMDYxNzEwMiAzLjc5MDMyIDAuMTM4NTA0IDMuNzEyNEwxLjE2MjEzIDIuNjczNzJDMS4yNDAzOCAyLjU5NDMyIDEuMzY4NDMgMi41OTQyMiAxLjQ0NjggMi42NzM0OEwzLjkyMTc0IDUuMTc2NDdMOC41NTMyMyAwLjM5Njk3M1oiCiAgICBmaWxsPSJ3aGl0ZSIKICAvPgo8L3N2Zz4=) no-repeat no-repeat center center;
|
||||||
|
width: 10px;
|
||||||
|
height: 10px;
|
||||||
|
left: 50%;
|
||||||
|
top: 50%;
|
||||||
|
-webkit-transform: translateX(-50%) translateY(-50%);
|
||||||
|
-ms-transform: translateX(-50%) translateY(-50%);
|
||||||
|
transform: translateX(-50%) translateY(-50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.c5:checked:disabled:after {
|
||||||
|
background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iOCIgdmlld0JveD0iMCAwIDEwIDgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGgKICAgIGQ9Ik04LjU1MzIzIDAuMzk2OTczQzguNjMxMzUgMC4zMTYzNTUgOC43NjA1MSAwLjMxNTgxMSA4LjgzOTMxIDAuMzk1NzY4TDkuODYyNTYgMS40MzQwN0M5LjkzODkzIDEuNTExNTcgOS45MzkzNSAxLjYzNTkgOS44NjM0OSAxLjcxMzlMNC4wNjQwMSA3LjY3NzI0QzMuOTg1OSA3Ljc1NzU1IDMuODU3MDcgNy43NTgwNSAzLjc3ODM0IDcuNjc4MzRMMC4xMzg2NiAzLjk5MzMzQzAuMDYxNzc5OCAzLjkxNTQ5IDAuMDYxNzEwMiAzLjc5MDMyIDAuMTM4NTA0IDMuNzEyNEwxLjE2MjEzIDIuNjczNzJDMS4yNDAzOCAyLjU5NDMyIDEuMzY4NDMgMi41OTQyMiAxLjQ0NjggMi42NzM0OEwzLjkyMTc0IDUuMTc2NDdMOC41NTMyMyAwLjM5Njk3M1oiCiAgICBmaWxsPSIjOEU4RUE5IgogIC8+Cjwvc3ZnPg==) no-repeat no-repeat center center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.c5:disabled {
|
||||||
|
background-color: #dcdce4;
|
||||||
|
border: 1px solid #c0c0cf;
|
||||||
|
}
|
||||||
|
|
||||||
|
.c5:indeterminate {
|
||||||
|
background-color: #4945ff;
|
||||||
|
border: 1px solid #4945ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.c5:indeterminate:after {
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
position: relative;
|
||||||
|
color: white;
|
||||||
|
height: 2px;
|
||||||
|
width: 10px;
|
||||||
|
background-color: #ffffff;
|
||||||
|
left: 50%;
|
||||||
|
top: 50%;
|
||||||
|
-webkit-transform: translateX(-50%) translateY(-50%);
|
||||||
|
-ms-transform: translateX(-50%) translateY(-50%);
|
||||||
|
transform: translateX(-50%) translateY(-50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.c5:indeterminate:disabled {
|
||||||
|
background-color: #dcdce4;
|
||||||
|
border: 1px solid #c0c0cf;
|
||||||
|
}
|
||||||
|
|
||||||
|
.c5:indeterminate:disabled:after {
|
||||||
|
background-color: #8e8ea9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.c13 {
|
||||||
word-break: break-all;
|
word-break: break-all;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -410,31 +483,31 @@ describe('MediaLibrary / ListView', () => {
|
|||||||
border-bottom: 1px solid #eaeaef;
|
border-bottom: 1px solid #eaeaef;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c25 {
|
.c27 {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 4px;
|
bottom: 4px;
|
||||||
right: 4px;
|
right: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c14 {
|
.c16 {
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c23 canvas {
|
.c25 canvas {
|
||||||
display: block;
|
display: block;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
max-height: 10.25rem;
|
max-height: 10.25rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c27 {
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
.c29 {
|
.c29 {
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
}
|
}
|
||||||
|
|
||||||
.c28 svg {
|
.c31 {
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
.c30 svg {
|
||||||
font-size: 3rem;
|
font-size: 3rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -455,12 +528,21 @@ describe('MediaLibrary / ListView', () => {
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="c4"
|
class="c4"
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
aria-labelledby="card-1-title"
|
||||||
|
class="c5"
|
||||||
|
type="checkbox"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="c6"
|
||||||
>
|
>
|
||||||
<span>
|
<span>
|
||||||
<button
|
<button
|
||||||
aria-disabled="false"
|
aria-disabled="false"
|
||||||
aria-labelledby="tooltip-1"
|
aria-labelledby="tooltip-1"
|
||||||
class="c5 c6"
|
class="c7 c8"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
@ -482,35 +564,35 @@ describe('MediaLibrary / ListView', () => {
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="c7"
|
class="c9"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
class="c8"
|
class="c10"
|
||||||
src="http://localhost:1337/uploads/thumbnail_strapi_cover_1fabc982ce_5b43615ed5.png?width=1066&height=551"
|
src="http://localhost:1337/uploads/thumbnail_strapi_cover_1fabc982ce_5b43615ed5.png?width=1066&height=551"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="c9"
|
class="c11"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="c10"
|
class="c12"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="c11"
|
class="c13"
|
||||||
>
|
>
|
||||||
<h2
|
<h2
|
||||||
class="c12"
|
class="c14"
|
||||||
id="card-1-title"
|
id="card-1-title"
|
||||||
>
|
>
|
||||||
strapi-cover_1fabc982ce.png
|
strapi-cover_1fabc982ce.png
|
||||||
</h2>
|
</h2>
|
||||||
<div
|
<div
|
||||||
class="c13"
|
class="c15"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="c14"
|
class="c16"
|
||||||
>
|
>
|
||||||
png
|
png
|
||||||
</span>
|
</span>
|
||||||
@ -518,13 +600,13 @@ describe('MediaLibrary / ListView', () => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="c15"
|
class="c17"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="c16 c17 c18"
|
class="c18 c19 c20"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="c19 c20 c21"
|
class="c21 c22 c23"
|
||||||
>
|
>
|
||||||
Image
|
Image
|
||||||
</span>
|
</span>
|
||||||
@ -543,12 +625,21 @@ describe('MediaLibrary / ListView', () => {
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="c4"
|
class="c4"
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
aria-labelledby="card-2-title"
|
||||||
|
class="c5"
|
||||||
|
type="checkbox"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="c6"
|
||||||
>
|
>
|
||||||
<span>
|
<span>
|
||||||
<button
|
<button
|
||||||
aria-disabled="false"
|
aria-disabled="false"
|
||||||
aria-labelledby="tooltip-3"
|
aria-labelledby="tooltip-3"
|
||||||
class="c5 c6"
|
class="c7 c8"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
@ -570,13 +661,13 @@ describe('MediaLibrary / ListView', () => {
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="c7"
|
class="c9"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="c22"
|
class="c24"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="c23"
|
class="c25"
|
||||||
>
|
>
|
||||||
<video
|
<video
|
||||||
src="http://localhost:1337/uploads/mov_bbb_2f3907f7aa.mp4"
|
src="http://localhost:1337/uploads/mov_bbb_2f3907f7aa.mp4"
|
||||||
@ -590,48 +681,48 @@ describe('MediaLibrary / ListView', () => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<time
|
<time
|
||||||
class="c24 c25"
|
class="c26 c27"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="c26"
|
class="c28"
|
||||||
>
|
>
|
||||||
...
|
...
|
||||||
</span>
|
</span>
|
||||||
</time>
|
</time>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="c9"
|
class="c11"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="c10"
|
class="c12"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="c11"
|
class="c13"
|
||||||
>
|
>
|
||||||
<h2
|
<h2
|
||||||
class="c12"
|
class="c14"
|
||||||
id="card-2-title"
|
id="card-2-title"
|
||||||
>
|
>
|
||||||
mov_bbb.mp4
|
mov_bbb.mp4
|
||||||
</h2>
|
</h2>
|
||||||
<div
|
<div
|
||||||
class="c13"
|
class="c15"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="c27"
|
class="c29"
|
||||||
>
|
>
|
||||||
mp4
|
mp4
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="c15"
|
class="c17"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="c16 c17 c18"
|
class="c18 c19 c20"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="c19 c20 c21"
|
class="c21 c22 c23"
|
||||||
>
|
>
|
||||||
Video
|
Video
|
||||||
</span>
|
</span>
|
||||||
@ -650,12 +741,21 @@ describe('MediaLibrary / ListView', () => {
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="c4"
|
class="c4"
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
aria-labelledby="card-3-title"
|
||||||
|
class="c5"
|
||||||
|
type="checkbox"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="c6"
|
||||||
>
|
>
|
||||||
<span>
|
<span>
|
||||||
<button
|
<button
|
||||||
aria-disabled="false"
|
aria-disabled="false"
|
||||||
aria-labelledby="tooltip-5"
|
aria-labelledby="tooltip-5"
|
||||||
class="c5 c6"
|
class="c7 c8"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
@ -677,13 +777,13 @@ describe('MediaLibrary / ListView', () => {
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="c7"
|
class="c9"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="c22"
|
class="c24"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="c28"
|
class="c30"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
aria-label="CARTE MARIAGE AVS - Printemps.pdf"
|
aria-label="CARTE MARIAGE AVS - Printemps.pdf"
|
||||||
@ -703,38 +803,38 @@ describe('MediaLibrary / ListView', () => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="c9"
|
class="c11"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="c10"
|
class="c12"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="c11"
|
class="c13"
|
||||||
>
|
>
|
||||||
<h2
|
<h2
|
||||||
class="c12"
|
class="c14"
|
||||||
id="card-3-title"
|
id="card-3-title"
|
||||||
>
|
>
|
||||||
CARTE MARIAGE AVS - Printemps.pdf
|
CARTE MARIAGE AVS - Printemps.pdf
|
||||||
</h2>
|
</h2>
|
||||||
<div
|
<div
|
||||||
class="c13"
|
class="c15"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="c29"
|
class="c31"
|
||||||
>
|
>
|
||||||
pdf
|
pdf
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="c15"
|
class="c17"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="c16 c17 c18"
|
class="c18 c19 c20"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="c19 c20 c21"
|
class="c21 c22 c23"
|
||||||
>
|
>
|
||||||
Doc
|
Doc
|
||||||
</span>
|
</span>
|
||||||
@ -746,7 +846,7 @@ describe('MediaLibrary / ListView', () => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="c30"
|
class="c32"
|
||||||
>
|
>
|
||||||
<p
|
<p
|
||||||
aria-live="polite"
|
aria-live="polite"
|
||||||
|
11
packages/core/upload/admin/src/utils/removeAssetQuery.js
Normal file
11
packages/core/upload/admin/src/utils/removeAssetQuery.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import axiosInstance from './axiosInstance';
|
||||||
|
|
||||||
|
export const removeAssetRequest = assetId => {
|
||||||
|
const endpoint = `/upload/files/${assetId}`;
|
||||||
|
|
||||||
|
return axiosInstance({
|
||||||
|
method: 'delete',
|
||||||
|
url: endpoint,
|
||||||
|
headers: {},
|
||||||
|
});
|
||||||
|
};
|
Loading…
x
Reference in New Issue
Block a user