@strapi/upload 5.8.0 → 5.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"App-mYN9RY7N.js","sources":["../../admin/src/utils/getBreadcrumbDataML.ts","../../admin/src/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.tsx","../../admin/src/pages/App/MediaLibrary/components/BulkDeleteButton.tsx","../../admin/src/hooks/useBulkMove.ts","../../admin/src/components/BulkMoveDialog/BulkMoveDialog.tsx","../../admin/src/pages/App/MediaLibrary/components/BulkMoveButton.tsx","../../admin/src/pages/App/MediaLibrary/components/BulkActions.tsx","../../admin/src/pages/App/MediaLibrary/components/EmptyOrNoPermissions.tsx","../../admin/src/pages/App/MediaLibrary/components/Filters.tsx","../../admin/src/pages/App/MediaLibrary/components/Header.tsx","../../admin/src/pages/App/MediaLibrary/MediaLibrary.tsx","../../admin/src/pages/App/App.tsx"],"sourcesContent":["import { getFolderURL } from './getFolderURL';\nimport { getTrad } from './getTrad';\n\nimport type { Query } from '../../../shared/contracts/files';\nimport type { Folder } from '../../../shared/contracts/folders';\nimport type { MessageDescriptor } from 'react-intl';\n\ninterface GetBreadcrumbDataMLProps {\n folder: Folder;\n options: {\n pathname: string;\n query?: Query;\n };\n}\n\ninterface GetBreadcrumbDataMLReturn {\n id: number | null;\n label: string | MessageDescriptor;\n href?: string;\n}\n\ntype BreadcrumbData = GetBreadcrumbDataMLReturn | [];\n\nexport const getBreadcrumbDataML = (\n folder: GetBreadcrumbDataMLProps['folder'] | null,\n { pathname, query }: GetBreadcrumbDataMLProps['options']\n) => {\n const data: BreadcrumbData[] = [\n {\n id: null,\n label: { id: getTrad('plugin.name'), defaultMessage: 'Media Library' },\n href: folder ? getFolderURL(pathname, query || {}) : undefined,\n },\n ];\n\n if (folder?.parent && typeof folder?.parent !== 'number' && folder?.parent?.parent) {\n data.push([]);\n }\n\n if (folder?.parent && typeof folder.parent !== 'number') {\n data.push({\n id: folder.parent.id,\n label: folder.parent.name,\n href: getFolderURL(pathname, query || {}, {\n folder: folder.parent.id?.toString(),\n folderPath: folder.parent.path,\n }),\n });\n }\n\n if (folder) {\n data.push({\n id: folder.id,\n label: folder.name,\n });\n }\n\n return data;\n};\n","import { Checkbox, Box, CheckboxProps } from '@strapi/design-system';\n\nimport { useFolderCard } from '../contexts/FolderCard';\n\nexport const FolderCardCheckbox = (props: CheckboxProps) => {\n const { id } = useFolderCard();\n\n return (\n <Box position=\"relative\" zIndex={2}>\n <Checkbox aria-labelledby={`${id}-title`} {...props} />\n </Box>\n );\n};\n","import { ConfirmDialog } from '@strapi/admin/strapi-admin';\nimport { Button, Dialog } from '@strapi/design-system';\nimport { Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useBulkRemove } from '../../../../hooks/useBulkRemove';\n\nimport type { FolderDefinition } from '../../../../../../shared/contracts/folders';\nimport type { FileWithType } from '../../../../hooks/useBulkRemove';\n\nexport interface BulkDeleteButtonProps {\n selected: Array<FileWithType | FolderDefinition>;\n onSuccess: () => void;\n}\n\nexport const BulkDeleteButton = ({ selected, onSuccess }: BulkDeleteButtonProps) => {\n const { formatMessage } = useIntl();\n const { remove } = useBulkRemove();\n\n const handleConfirmRemove = async () => {\n await remove(selected);\n onSuccess();\n };\n\n return (\n <Dialog.Root>\n <Dialog.Trigger>\n <Button variant=\"danger-light\" size=\"S\" startIcon={<Trash />}>\n {formatMessage({ id: 'global.delete', defaultMessage: 'Delete' })}\n </Button>\n </Dialog.Trigger>\n <ConfirmDialog onConfirm={handleConfirmRemove} />\n </Dialog.Root>\n );\n};\n","import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQueryClient } from 'react-query';\n\nimport { File, BulkMoveFiles } from '../../../shared/contracts/files';\nimport { Folder, BulkMoveFolders } from '../../../shared/contracts/folders';\nimport { pluginId } from '../pluginId';\nimport { getTrad } from '../utils';\n\nexport interface FolderWithType extends Folder {\n type: string;\n}\n\nexport interface FileWithType extends File {\n type: string;\n}\n\ninterface BulkMoveParams {\n destinationFolderId: number | string;\n filesAndFolders: Array<FolderWithType | FileWithType>;\n}\n\n// Define the shape of the accumulator object\ntype Payload = {\n fileIds?: number[];\n folderIds?: number[];\n};\n\nexport const useBulkMove = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const queryClient = useQueryClient();\n const { post } = useFetchClient();\n\n const bulkMoveQuery = ({ destinationFolderId, filesAndFolders }: BulkMoveParams) => {\n const payload = filesAndFolders.reduce<Payload>((acc, selected) => {\n const { id, type } = selected;\n const key = type === 'asset' ? 'fileIds' : 'folderIds';\n\n if (!acc[key]) {\n acc[key] = [];\n }\n\n acc[key]!.push(id);\n\n return acc;\n }, {});\n\n return post('/upload/actions/bulk-move', { ...payload, destinationFolderId });\n };\n\n const mutation = useMutation<\n BulkMoveFolders.Response | BulkMoveFiles.Response,\n BulkMoveFolders.Response['error'] | BulkMoveFiles.Response['error'],\n BulkMoveParams\n >(bulkMoveQuery, {\n onSuccess(res) {\n const {\n data: { data },\n } = res;\n\n if (data?.files?.length > 0) {\n queryClient.refetchQueries([pluginId, 'assets'], { active: true });\n queryClient.refetchQueries([pluginId, 'asset-count'], { active: true });\n }\n\n // folders need to be re-fetched in any case, because assets might have been\n // moved into a sub-folder and therefore the count needs to be updated\n queryClient.refetchQueries([pluginId, 'folders'], { active: true });\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('modal.move.success-label'),\n defaultMessage: 'Elements have been moved successfully.',\n }),\n });\n },\n });\n\n const move = (\n destinationFolderId: number | string,\n filesAndFolders: Array<FolderWithType | FileWithType>\n ) => mutation.mutateAsync({ destinationFolderId, filesAndFolders });\n\n return { ...mutation, move };\n};\n","import { Button, Flex, Grid, Field, Loader, Modal, Typography } from '@strapi/design-system';\nimport { Form, Formik, FormikErrors } from 'formik';\nimport isEmpty from 'lodash/isEmpty';\nimport { useIntl } from 'react-intl';\n\nimport { File } from '../../../../shared/contracts/files';\nimport { useBulkMove } from '../../hooks/useBulkMove';\nimport { useFolderStructure } from '../../hooks/useFolderStructure';\nimport { getTrad, normalizeAPIError } from '../../utils';\nimport { SelectTree } from '../SelectTree/SelectTree';\n\nimport type { Folder } from '../../../../shared/contracts/folders';\nimport type { OptionSelectTree } from '../SelectTree/SelectTree';\nimport type { FetchError } from '@strapi/admin/strapi-admin';\n\ntype InitialFormData = {\n destination:\n | {\n value: string | number;\n label: string;\n }\n | string;\n};\n\ninterface FolderWithType extends Folder {\n type: string;\n}\n\ninterface FileWithType extends File {\n type: string;\n}\n\nexport interface BulkMoveDialogProps {\n onClose: () => void;\n selected?: Array<FolderWithType | FileWithType>;\n currentFolder?: FolderWithType;\n}\n\nexport const BulkMoveDialog = ({ onClose, selected = [], currentFolder }: BulkMoveDialogProps) => {\n const { formatMessage } = useIntl();\n const { data: folderStructure, isLoading } = useFolderStructure();\n const { move } = useBulkMove();\n\n if (!folderStructure) {\n return null;\n }\n\n const handleSubmit = async (\n values: InitialFormData,\n { setErrors }: { setErrors: (errors: FormikErrors<InitialFormData>) => void }\n ) => {\n try {\n if (typeof values.destination !== 'string') {\n const destinationValue = values.destination.value;\n await move(destinationValue, selected);\n onClose();\n }\n } catch (error) {\n const normalizedError = normalizeAPIError(error as FetchError)!;\n\n if (normalizedError && 'errors' in normalizedError) {\n const formikErrors = normalizedError.errors?.reduce<Record<string, string>>(\n (acc, error) => {\n acc[error.values?.path?.length || 'destination'] = error.defaultMessage;\n\n return acc;\n },\n {}\n );\n\n if (!isEmpty(formikErrors)) {\n setErrors(formikErrors);\n }\n }\n }\n };\n\n if (isLoading) {\n return (\n <Modal.Content>\n <Modal.Body>\n <Flex justifyContent=\"center\" paddingTop={4} paddingBottom={4}>\n <Loader>\n {formatMessage({\n id: getTrad('content.isLoading'),\n defaultMessage: 'Content is loading.',\n })}\n </Loader>\n </Flex>\n </Modal.Body>\n </Modal.Content>\n );\n }\n\n const initialFormData: InitialFormData = {\n destination: {\n value: currentFolder?.id || '',\n label: currentFolder?.name || folderStructure[0].label,\n },\n };\n\n return (\n <Modal.Content>\n <Formik validateOnChange={false} onSubmit={handleSubmit} initialValues={initialFormData}>\n {({ values, errors, setFieldValue }) => (\n <Form noValidate>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('modal.folder.move.title'),\n defaultMessage: 'Move elements to',\n })}\n </Modal.Title>\n </Modal.Header>\n\n <Modal.Body>\n <Grid.Root gap={4}>\n <Grid.Item xs={12} col={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root id=\"folder-destination\">\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.folder-location'),\n defaultMessage: 'Location',\n })}\n </Field.Label>\n\n <SelectTree\n options={folderStructure as OptionSelectTree[]}\n onChange={(value: Record<string, string | number>) => {\n setFieldValue('destination', value);\n }}\n defaultValue={\n typeof values.destination !== 'string' ? values.destination : undefined\n }\n name=\"destination\"\n menuPortalTarget={document.querySelector('body')}\n inputId=\"folder-destination\"\n error={errors?.destination}\n ariaErrorMessage=\"destination-error\"\n />\n\n {errors.destination && (\n <Typography variant=\"pi\" tag=\"p\" textColor=\"danger600\">\n {errors.destination}\n </Typography>\n )}\n </Field.Root>\n </Grid.Item>\n </Grid.Root>\n </Modal.Body>\n\n <Modal.Footer>\n <Modal.Close>\n <Button variant=\"tertiary\" name=\"cancel\">\n {formatMessage({ id: 'cancel', defaultMessage: 'Cancel' })}\n </Button>\n </Modal.Close>\n <Button type=\"submit\" loading={isLoading}>\n {formatMessage({ id: 'modal.folder.move.submit', defaultMessage: 'Move' })}\n </Button>\n </Modal.Footer>\n </Form>\n )}\n </Formik>\n </Modal.Content>\n );\n};\n","import * as React from 'react';\n\nimport { Button, Modal } from '@strapi/design-system';\nimport { Folder } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { BulkMoveDialog } from '../../../../components/BulkMoveDialog/BulkMoveDialog';\n\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type { Folder as FolderDefinition } from '../../../../../../shared/contracts/folders';\n\ninterface FolderWithType extends FolderDefinition {\n type: string;\n}\n\ninterface FileWithType extends File {\n type: string;\n}\n\nexport interface BulkMoveButtonProps {\n onSuccess: () => void;\n currentFolder?: FolderWithType;\n selected?: Array<FolderWithType | FileWithType>;\n}\n\nexport const BulkMoveButton = ({\n selected = [],\n onSuccess,\n currentFolder,\n}: BulkMoveButtonProps) => {\n const { formatMessage } = useIntl();\n const [showConfirmDialog, setShowConfirmDialog] = React.useState(false);\n\n const handleConfirmMove = () => {\n setShowConfirmDialog(false);\n onSuccess();\n };\n\n return (\n <Modal.Root open={showConfirmDialog} onOpenChange={setShowConfirmDialog}>\n <Modal.Trigger>\n <Button variant=\"secondary\" size=\"S\" startIcon={<Folder />}>\n {formatMessage({ id: 'global.move', defaultMessage: 'Move' })}\n </Button>\n </Modal.Trigger>\n <BulkMoveDialog\n currentFolder={currentFolder}\n onClose={handleConfirmMove}\n selected={selected}\n />\n </Modal.Root>\n );\n};\n","import { Flex, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../../utils';\n\nimport { BulkDeleteButton } from './BulkDeleteButton';\nimport { BulkMoveButton } from './BulkMoveButton';\n\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type {\n FolderDefinition,\n Folder as FolderInitial,\n} from '../../../../../../shared/contracts/folders';\n\ninterface FolderWithType extends FolderInitial {\n type: string;\n}\n\nexport interface FileWithType extends File {\n type: string;\n}\n\nexport interface BulkActionsProps {\n selected: Array<FileWithType | FolderDefinition> | Array<FolderWithType | FileWithType>;\n onSuccess: () => void;\n currentFolder?: FolderWithType;\n}\n\nexport const BulkActions = ({ selected = [], onSuccess, currentFolder }: BulkActionsProps) => {\n const { formatMessage } = useIntl();\n const numberAssets = selected?.reduce(function (_this, val) {\n return val?.type === 'folder' && 'files' in val && val?.files && 'count' in val.files\n ? _this + val?.files?.count\n : _this + 1;\n }, 0);\n\n return (\n <Flex gap={2} paddingBottom={5}>\n <Typography variant=\"epsilon\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: getTrad('list.assets.selected'),\n defaultMessage:\n '{numberFolders, plural, one {1 folder} other {# folders}} - {numberAssets, plural, one {1 asset} other {# assets}} selected',\n },\n {\n numberFolders: selected?.filter(({ type }) => type === 'folder').length,\n numberAssets,\n }\n )}\n </Typography>\n\n <BulkDeleteButton\n selected={selected as Array<FileWithType | FolderDefinition>}\n onSuccess={onSuccess}\n />\n <BulkMoveButton\n currentFolder={currentFolder}\n selected={selected as Array<FolderWithType | FileWithType>}\n onSuccess={onSuccess}\n />\n </Flex>\n );\n};\n","import { Button } from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { EmptyPermissions } from '@strapi/icons/symbols';\nimport { useIntl } from 'react-intl';\n\nimport { EmptyAssets } from '../../../../components/EmptyAssets/EmptyAssets';\nimport { getTrad } from '../../../../utils';\n\nexport interface EmptyOrNoPermissionsProps {\n canCreate: boolean;\n canRead: boolean;\n isFiltering: boolean;\n onActionClick: () => void;\n}\n\nconst getContentIntlMessage = ({\n isFiltering,\n canCreate,\n canRead,\n}: Omit<EmptyOrNoPermissionsProps, 'onActionClick'>) => {\n if (isFiltering) {\n return {\n id: 'list.assets-empty.title-withSearch',\n defaultMessage: 'There are no elements with the applied filters',\n };\n }\n\n if (canRead) {\n if (canCreate) {\n return {\n id: 'list.assets.empty-upload',\n defaultMessage: 'Upload your first assets...',\n };\n }\n\n return {\n id: 'list.assets.empty',\n defaultMessage: 'Media Library is empty',\n };\n }\n\n return {\n id: 'header.actions.no-permissions',\n defaultMessage: 'No permissions to view',\n };\n};\n\nexport const EmptyOrNoPermissions = ({\n canCreate,\n isFiltering,\n canRead,\n onActionClick,\n}: EmptyOrNoPermissionsProps) => {\n const { formatMessage } = useIntl();\n const content = getContentIntlMessage({ isFiltering, canCreate, canRead });\n\n return (\n <EmptyAssets\n icon={!canRead ? EmptyPermissions : undefined}\n action={\n canCreate &&\n !isFiltering && (\n <Button variant=\"secondary\" startIcon={<Plus />} onClick={onActionClick}>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Button>\n )\n }\n content={formatMessage({\n ...content,\n id: getTrad(content.id),\n })}\n />\n );\n};\n","import * as React from 'react';\n\nimport { useTracking, useQueryParams } from '@strapi/admin/strapi-admin';\nimport { Button, Popover } from '@strapi/design-system';\nimport { Filter } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { FilterList } from '../../../../components/FilterList/FilterList';\nimport { FilterPopover } from '../../../../components/FilterPopover/FilterPopover';\nimport { displayedFilters } from '../../../../utils';\n\nimport type { Query } from '../../../../../../shared/contracts/files';\nimport type { FilterListProps } from '../../../../components/FilterList/FilterList';\nimport type { FilterPopoverProps } from '../../../../components/FilterPopover/FilterPopover';\n\nexport const Filters = () => {\n const [open, setOpen] = React.useState(false);\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const [{ query }, setQuery] = useQueryParams<Query>();\n const filters = query?.filters?.$and || [];\n\n const handleRemoveFilter: FilterListProps['onRemoveFilter'] = (nextFilters) => {\n setQuery({ filters: { $and: nextFilters }, page: 1 } as Query);\n };\n\n const handleSubmit: FilterPopoverProps['onSubmit'] = (filters) => {\n trackUsage('didFilterMediaLibraryElements', {\n location: 'content-manager',\n filter: Object.keys(filters[filters.length - 1])[0],\n });\n setQuery({ filters: { $and: filters }, page: 1 } as Query);\n };\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.Trigger>\n <Button variant=\"tertiary\" startIcon={<Filter />} size=\"S\">\n {formatMessage({ id: 'app.utils.filters', defaultMessage: 'Filters' })}\n </Button>\n </Popover.Trigger>\n <FilterPopover\n displayedFilters={displayedFilters}\n filters={filters}\n onSubmit={handleSubmit}\n onToggle={setOpen as FilterPopoverProps['onToggle']}\n />\n <FilterList\n appliedFilters={filters as FilterListProps['appliedFilters']}\n filtersSchema={displayedFilters}\n onRemoveFilter={handleRemoveFilter}\n />\n </Popover.Root>\n );\n};\n","import { useQueryParams, Layouts } from '@strapi/admin/strapi-admin';\nimport { Button, Flex, Link } from '@strapi/design-system';\nimport { ArrowLeft, Plus } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { useLocation, NavLink } from 'react-router-dom';\n\nimport { Breadcrumbs } from '../../../../components/Breadcrumbs/Breadcrumbs';\nimport { getTrad } from '../../../../utils';\n\nimport type { Folder } from '../../../../../../shared/contracts/folders';\nimport type { CrumbDefinition } from '../../../../components/Breadcrumbs/Breadcrumbs';\n\ninterface FolderDefinition extends Omit<Folder, 'children' | 'files' | 'parent'> {\n children: {\n count: number;\n };\n files: {\n count: number;\n };\n parent?: FolderDefinition;\n}\n\nexport interface HeaderProps {\n breadcrumbs?: Array<CrumbDefinition> | null;\n canCreate: boolean;\n folder?: FolderDefinition | null;\n onToggleEditFolderDialog: ({ created }?: { created?: boolean }) => void;\n onToggleUploadAssetDialog: () => void;\n}\n\nexport const Header = ({\n breadcrumbs = null,\n canCreate,\n folder = null,\n onToggleEditFolderDialog,\n onToggleUploadAssetDialog,\n}: HeaderProps) => {\n const { formatMessage } = useIntl();\n const { pathname } = useLocation();\n const [{ query }] = useQueryParams();\n const backQuery = {\n ...query,\n folder:\n folder?.parent && typeof folder.parent !== 'number' && folder.parent.id\n ? folder.parent.id\n : undefined,\n folderPath:\n folder?.parent && typeof folder.parent !== 'number' && folder.parent.path\n ? folder.parent.path\n : undefined,\n };\n\n return (\n <Layouts.Header\n title={formatMessage({\n id: getTrad('plugin.name'),\n defaultMessage: `Media Library`,\n })}\n subtitle={\n breadcrumbs &&\n typeof breadcrumbs !== 'boolean' &&\n folder && (\n <Breadcrumbs\n label={formatMessage({\n id: getTrad('header.breadcrumbs.nav.label'),\n defaultMessage: 'Folders navigation',\n })}\n breadcrumbs={breadcrumbs}\n currentFolderId={folder?.id}\n />\n )\n }\n navigationAction={\n folder && (\n <Link\n tag={NavLink}\n startIcon={<ArrowLeft />}\n to={`${pathname}?${stringify(backQuery, { encode: false })}`}\n >\n {formatMessage({\n id: getTrad('header.actions.folder-level-up'),\n defaultMessage: 'Back',\n })}\n </Link>\n )\n }\n primaryAction={\n canCreate && (\n <Flex gap={2}>\n <Button startIcon={<Plus />} variant=\"secondary\" onClick={onToggleEditFolderDialog}>\n {formatMessage({\n id: getTrad('header.actions.add-folder'),\n defaultMessage: 'Add new folder',\n })}\n </Button>\n\n <Button startIcon={<Plus />} onClick={onToggleUploadAssetDialog}>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Button>\n </Flex>\n )\n }\n />\n );\n};\n","// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport {\n Page,\n SearchInput,\n Pagination,\n useTracking,\n useQueryParams,\n Layouts,\n} from '@strapi/admin/strapi-admin';\nimport {\n Checkbox,\n Box,\n Divider,\n Flex,\n IconButton,\n Typography,\n VisuallyHidden,\n Grid,\n} from '@strapi/design-system';\nimport { Cog, GridFour as GridIcon, List, Pencil } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link as ReactRouterLink, useNavigate, useLocation } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { AssetGridList } from '../../../components/AssetGridList/AssetGridList';\nimport { EditAssetDialog } from '../../../components/EditAssetDialog/EditAssetContent';\nimport { EditFolderDialog } from '../../../components/EditFolderDialog/EditFolderDialog';\nimport { FolderCard } from '../../../components/FolderCard/FolderCard/FolderCard';\nimport { FolderCardBody } from '../../../components/FolderCard/FolderCardBody/FolderCardBody';\nimport { FolderCardBodyAction } from '../../../components/FolderCard/FolderCardBodyAction/FolderCardBodyAction';\nimport { FolderCardCheckbox } from '../../../components/FolderCard/FolderCardCheckbox/FolderCardCheckbox';\nimport { FolderGridList } from '../../../components/FolderGridList/FolderGridList';\nimport { SortPicker } from '../../../components/SortPicker/SortPicker';\nimport { TableList } from '../../../components/TableList/TableList';\nimport { UploadAssetDialog } from '../../../components/UploadAssetDialog/UploadAssetDialog';\nimport { localStorageKeys, viewOptions } from '../../../constants';\nimport { useAssets } from '../../../hooks/useAssets';\nimport { useFolder } from '../../../hooks/useFolder';\nimport { useFolders } from '../../../hooks/useFolders';\nimport { useMediaLibraryPermissions } from '../../../hooks/useMediaLibraryPermissions';\nimport { usePersistentState } from '../../../hooks/usePersistentState';\nimport { useSelectionState } from '../../../hooks/useSelectionState';\nimport { containsAssetFilter, getBreadcrumbDataML, getFolderURL, getTrad } from '../../../utils';\n\nimport { BulkActions } from './components/BulkActions';\nimport { EmptyOrNoPermissions } from './components/EmptyOrNoPermissions';\nimport { Filters } from './components/Filters';\nimport { Header } from './components/Header';\n\nimport type { BulkActionsProps } from './components/BulkActions';\nimport type { HeaderProps } from './components/Header';\nimport type { Query } from '../../../../../shared/contracts/files';\nimport type { FolderDefinition } from '../../../../../shared/contracts/folders';\nimport type { AssetGridListProps } from '../../../components/AssetGridList/AssetGridList';\nimport type { Asset } from '../../../components/EditAssetDialog/EditAssetContent';\nimport type { FolderRow, FileRow, TableListProps } from '../../../components/TableList/TableList';\n\nconst BoxWithHeight = styled(Box)`\n height: 3.2rem;\n display: flex;\n align-items: center;\n`;\n\nconst TypographyMaxWidth = styled(Typography)`\n max-width: 100%;\n`;\n\nconst ActionContainer = styled(Box)`\n svg {\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n`;\n\nexport const MediaLibrary = () => {\n const navigate = useNavigate();\n const {\n canRead,\n canCreate,\n canUpdate,\n canCopyLink,\n canDownload,\n canConfigureView,\n isLoading: permissionsLoading,\n } = useMediaLibraryPermissions();\n const currentFolderToEditRef = React.useRef<HTMLDivElement>();\n const { formatMessage } = useIntl();\n const { pathname } = useLocation();\n const { trackUsage } = useTracking();\n const [{ query }, setQuery] = useQueryParams<Query>();\n const isFiltering = Boolean(query._q || query.filters);\n const [view, setView] = usePersistentState(localStorageKeys.view, viewOptions.GRID);\n const isGridView = view === viewOptions.GRID;\n\n const {\n data: assetsData,\n isLoading: assetsLoading,\n error: assetsError,\n } = useAssets({\n skipWhen: !canRead,\n query,\n });\n\n const {\n data: foldersData,\n isLoading: foldersLoading,\n error: foldersError,\n } = useFolders({\n enabled: canRead && assetsData?.pagination?.page === 1 && !containsAssetFilter(query),\n query,\n });\n\n const {\n data: currentFolder,\n isLoading: isCurrentFolderLoading,\n error: currentFolderError,\n } = useFolder(query?.folder as number | null | undefined, {\n enabled: canRead && !!query?.folder,\n });\n\n // Folder was not found: redirect to the media library root\n if (currentFolderError?.name === 'NotFoundError') {\n navigate(pathname);\n }\n\n const folders =\n foldersData?.map((folder) => ({\n ...folder,\n type: 'folder',\n folderURL: getFolderURL(pathname, query, {\n folder: folder.id.toString(),\n folderPath: folder.path,\n }),\n isSelectable: canUpdate,\n })) ?? [];\n const folderCount = folders?.length || 0;\n const assets =\n assetsData?.results?.map((asset) => ({ ...asset, type: 'asset', isSelectable: canUpdate })) ||\n [];\n const assetCount = assets?.length ?? 0;\n const totalAssetCount = assetsData?.pagination?.total;\n\n const isLoading = isCurrentFolderLoading || foldersLoading || permissionsLoading || assetsLoading;\n const [showUploadAssetDialog, setShowUploadAssetDialog] = React.useState(false);\n const [showEditFolderDialog, setShowEditFolderDialog] = React.useState(false);\n const [assetToEdit, setAssetToEdit] = React.useState<Asset | undefined>(undefined);\n const [folderToEdit, setFolderToEdit] = React.useState<FolderRow | undefined | null>(undefined);\n const [selected, { selectOne, selectAll }] = useSelectionState<FolderRow | FileRow>(\n ['type', 'id'],\n []\n );\n const indeterminateBulkSelect =\n selected?.length > 0 && selected?.length !== assetCount + folderCount;\n const toggleUploadAssetDialog = () => setShowUploadAssetDialog((prev) => !prev);\n const toggleEditFolderDialog = ({ created = false } = {}) => {\n // folders are only displayed on the first page, therefore\n // we have to navigate the user to that page, in case a folder\n // was created successfully in order for them to see it\n if (created && query?.page !== '1') {\n setQuery({\n ...query,\n page: 1,\n });\n }\n\n setShowEditFolderDialog((prev) => !prev);\n };\n\n const handleBulkSelect = (\n checked: boolean | 'indeterminate',\n elements?: FolderRow[] | FileRow[]\n ) => {\n if (checked) {\n trackUsage('didSelectAllMediaLibraryElements');\n }\n\n selectAll(elements as (FolderRow | FileRow)[]);\n };\n\n const handleChangeSort = (value: Query['sort'] | string) => {\n trackUsage('didSortMediaLibraryElements', {\n location: 'upload',\n sort: value,\n });\n setQuery({ sort: value as Query['sort'] });\n };\n\n const handleEditFolder = (folder: FolderRow) => {\n setFolderToEdit(folder);\n setShowEditFolderDialog(true);\n };\n\n const handleEditFolderClose = (payload?: { created?: boolean | undefined }) => {\n setFolderToEdit(null);\n toggleEditFolderDialog(payload);\n\n if (currentFolderToEditRef.current) {\n currentFolderToEditRef.current.focus();\n }\n };\n\n const handleAssetDeleted = (numberOfAssets: number) => {\n if (\n numberOfAssets === assetCount &&\n assetsData?.pagination?.page === assetsData?.pagination?.pageCount &&\n assetsData?.pagination?.page &&\n assetsData.pagination.page > 1\n ) {\n setQuery({\n ...query,\n page: assetsData.pagination.page - 1,\n });\n }\n };\n\n const handleBulkActionSuccess = () => {\n selectAll();\n\n handleAssetDeleted(selected.length);\n };\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (assetsError || foldersError) {\n return <Page.Error />;\n }\n\n return (\n <Layouts.Root>\n <Page.Main>\n <Header\n breadcrumbs={\n !isCurrentFolderLoading\n ? (getBreadcrumbDataML(currentFolder!, {\n pathname,\n query,\n }) as HeaderProps['breadcrumbs'])\n : null\n }\n canCreate={canCreate}\n onToggleEditFolderDialog={toggleEditFolderDialog}\n onToggleUploadAssetDialog={toggleUploadAssetDialog}\n folder={currentFolder as HeaderProps['folder']}\n />\n <Layouts.Action\n startActions={\n <>\n {canUpdate && isGridView && (assetCount > 0 || folderCount > 0) && (\n <BoxWithHeight\n paddingLeft={2}\n paddingRight={2}\n background=\"neutral0\"\n hasRadius\n borderColor=\"neutral200\"\n >\n <Checkbox\n aria-label={formatMessage({\n id: getTrad('bulk.select.label'),\n defaultMessage: 'Select all folders & assets',\n })}\n checked={\n indeterminateBulkSelect\n ? 'indeterminate'\n : (assetCount > 0 || folderCount > 0) &&\n selected.length === assetCount + folderCount\n }\n onCheckedChange={(e) =>\n handleBulkSelect(e, [...assets, ...folders] as FolderRow[] | FileRow[])\n }\n />\n </BoxWithHeight>\n )}\n {canRead && isGridView && (\n <SortPicker value={query?.sort} onChangeSort={handleChangeSort} />\n )}\n {canRead && <Filters />}\n </>\n }\n endActions={\n <>\n {canConfigureView ? (\n <ActionContainer paddingTop={1} paddingBottom={1}>\n <IconButton\n tag={ReactRouterLink}\n to={{\n pathname: `${pathname}/configuration`,\n search: stringify(query, { encode: false }),\n }}\n label={formatMessage({\n id: 'app.links.configure-view',\n defaultMessage: 'Configure the view',\n })}\n >\n <Cog />\n </IconButton>\n </ActionContainer>\n ) : null}\n <ActionContainer paddingTop={1} paddingBottom={1}>\n <IconButton\n label={\n isGridView\n ? formatMessage({\n id: getTrad('view-switch.list'),\n defaultMessage: 'List View',\n })\n : formatMessage({\n id: getTrad('view-switch.grid'),\n defaultMessage: 'Grid View',\n })\n }\n onClick={() => setView(isGridView ? viewOptions.LIST : viewOptions.GRID)}\n >\n {isGridView ? <List /> : <GridIcon />}\n </IconButton>\n </ActionContainer>\n <SearchInput\n label={formatMessage({\n id: getTrad('search.label'),\n defaultMessage: 'Search for an asset',\n })}\n trackedEvent=\"didSearchMediaLibraryElements\"\n trackedEventDetails={{ location: 'upload' }}\n />\n </>\n }\n />\n\n <Layouts.Content>\n {selected.length > 0 && (\n <BulkActions\n currentFolder={currentFolder as BulkActionsProps['currentFolder']}\n selected={selected as BulkActionsProps['selected']}\n onSuccess={handleBulkActionSuccess}\n />\n )}\n\n {folderCount === 0 && assetCount === 0 && (\n <EmptyOrNoPermissions\n canCreate={canCreate}\n canRead={canRead}\n isFiltering={isFiltering}\n onActionClick={toggleUploadAssetDialog}\n />\n )}\n\n {/* TODO: fix AssetListTable should handle no assets views (loading) */}\n {canRead && !isGridView && (assetCount > 0 || folderCount > 0) && (\n <TableList\n assetCount={assetCount}\n folderCount={folderCount}\n indeterminate={indeterminateBulkSelect}\n onChangeSort={handleChangeSort}\n onChangeFolder={(folderID, folderPath) =>\n navigate(getFolderURL(pathname, query, { folder: folderID.toString(), folderPath }))\n }\n onEditAsset={setAssetToEdit as TableListProps['onEditAsset']}\n onEditFolder={handleEditFolder}\n onSelectOne={selectOne}\n onSelectAll={handleBulkSelect as TableListProps['onSelectAll']}\n rows={[...folders, ...assets] as TableListProps['rows']}\n selected={selected as TableListProps['selected']}\n shouldDisableBulkSelect={!canUpdate}\n sortQuery={query?.sort ?? ''}\n />\n )}\n\n {canRead && isGridView && (\n <>\n {folderCount > 0 && (\n <FolderGridList\n title={\n // Folders title should only appear if:\n // user is filtering and there are assets to display, to divide both type of elements\n // user is not filtering\n (((isFiltering && assetCount > 0) || !isFiltering) &&\n formatMessage(\n {\n id: getTrad('list.folders.title'),\n defaultMessage: 'Folders ({count})',\n },\n { count: folderCount }\n )) ||\n ''\n }\n >\n {folders.map((folder) => {\n const selectedFolders = selected.filter(({ type }) => type === 'folder');\n const isSelected = !!selectedFolders.find(\n (currentFolder) => currentFolder.id === folder.id\n );\n\n const url = getFolderURL(pathname, query, {\n folder: folder?.id.toString(),\n folderPath: folder?.path,\n });\n\n return (\n <Grid.Item\n col={3}\n key={`folder-${folder.id}`}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <FolderCard\n ref={\n folderToEdit && folder.id === folderToEdit.id\n ? currentFolderToEditRef\n : undefined\n }\n ariaLabel={folder.name}\n id={`folder-${folder.id}`}\n to={url}\n startAction={\n folder.isSelectable ? (\n <FolderCardCheckbox\n data-testid={`folder-checkbox-${folder.id}`}\n checked={isSelected}\n onCheckedChange={() => selectOne(folder)}\n />\n ) : null\n }\n cardActions={\n <IconButton\n label={formatMessage({\n id: getTrad('list.folder.edit'),\n defaultMessage: 'Edit folder',\n })}\n onClick={() => handleEditFolder(folder)}\n >\n <Pencil />\n </IconButton>\n }\n >\n <FolderCardBody>\n <FolderCardBodyAction to={url}>\n <Flex tag=\"h2\" direction=\"column\" alignItems=\"start\" maxWidth=\"100%\">\n <TypographyMaxWidth\n fontWeight=\"semiBold\"\n textColor=\"neutral800\"\n ellipsis\n >\n {folder.name}\n <VisuallyHidden>:</VisuallyHidden>\n </TypographyMaxWidth>\n\n <TypographyMaxWidth\n tag=\"span\"\n textColor=\"neutral600\"\n variant=\"pi\"\n ellipsis\n >\n {formatMessage(\n {\n id: getTrad('list.folder.subtitle'),\n defaultMessage:\n '{folderCount, plural, =0 {# folder} one {# folder} other {# folders}}, {filesCount, plural, =0 {# asset} one {# asset} other {# assets}}',\n },\n {\n folderCount: (folder as FolderDefinition).children?.count,\n filesCount: (folder as FolderDefinition).files?.count,\n }\n )}\n </TypographyMaxWidth>\n </Flex>\n </FolderCardBodyAction>\n </FolderCardBody>\n </FolderCard>\n </Grid.Item>\n );\n })}\n </FolderGridList>\n )}\n\n {assetCount > 0 && folderCount > 0 && (\n <Box paddingTop={6} paddingBottom={4}>\n <Divider />\n </Box>\n )}\n\n {assetCount > 0 && (\n <AssetGridList\n assets={assets}\n onEditAsset={setAssetToEdit as AssetGridListProps['onEditAsset']}\n onSelectAsset={selectOne}\n selectedAssets={\n selected.filter(\n ({ type }) => type === 'asset'\n ) as AssetGridListProps['selectedAssets']\n }\n title={\n // Assets title should only appear if:\n // - user is not filtering\n // - user is filtering and there are folders to display, to separate them\n // - user is on page 1 since folders won't appear on any other page than the first one (no need to visually separate them)\n ((!isFiltering || (isFiltering && folderCount > 0)) &&\n assetsData?.pagination?.page === 1 &&\n formatMessage(\n {\n id: getTrad('list.assets.title'),\n defaultMessage: 'Assets ({count})',\n },\n { count: totalAssetCount }\n )) ||\n ''\n }\n />\n )}\n </>\n )}\n <Pagination.Root {...assetsData?.pagination}>\n <Pagination.PageSize />\n <Pagination.Links />\n </Pagination.Root>\n </Layouts.Content>\n </Page.Main>\n {showUploadAssetDialog && (\n <UploadAssetDialog\n open={showUploadAssetDialog}\n onClose={toggleUploadAssetDialog}\n trackedLocation=\"upload\"\n folderId={query?.folder as string | number | null | undefined}\n />\n )}\n {showEditFolderDialog && (\n <EditFolderDialog\n open={showEditFolderDialog}\n onClose={() => handleEditFolderClose()}\n folder={folderToEdit as FolderDefinition}\n parentFolderId={query?.folder as string | number | null | undefined}\n location=\"upload\"\n />\n )}\n {assetToEdit && (\n <EditAssetDialog\n onClose={(editedAsset) => {\n // The asset has been deleted\n if (editedAsset === null) {\n handleAssetDeleted(1);\n }\n\n setAssetToEdit(undefined);\n }}\n open={!!assetToEdit}\n asset={assetToEdit}\n canUpdate={canUpdate}\n canCopyLink={canCopyLink}\n canDownload={canDownload}\n trackedLocation=\"upload\"\n />\n )}\n </Layouts.Root>\n );\n};\n","// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport { Page, useQueryParams } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { Route, Routes } from 'react-router-dom';\n\nimport { useConfig } from '../../hooks/useConfig';\nimport { getTrad } from '../../utils';\n\nimport { MediaLibrary } from './MediaLibrary/MediaLibrary';\n\nimport type { Configuration } from '../../../../shared/contracts/configuration';\n\nconst ConfigureTheView = React.lazy(async () =>\n import('./ConfigureTheView/ConfigureTheView').then((mod) => ({ default: mod.ConfigureTheView }))\n);\n\nexport const Upload = () => {\n const {\n config: { isLoading, isError, data: config },\n } = useConfig() as { config: { isLoading: boolean; isError: boolean; data: Configuration } };\n\n const [{ rawQuery }, setQuery] = useQueryParams();\n const { formatMessage } = useIntl();\n const title = formatMessage({ id: getTrad('plugin.name'), defaultMessage: 'Media Library' });\n\n React.useEffect(() => {\n if (isLoading || isError || rawQuery) {\n return;\n }\n setQuery({\n sort: config.sort,\n page: 1,\n pageSize: config.pageSize,\n });\n }, [isLoading, isError, config, rawQuery, setQuery]);\n\n if (isLoading) {\n return (\n <>\n <Page.Title>{title}</Page.Title>\n <Page.Loading />\n </>\n );\n }\n\n return (\n <Page.Main>\n {rawQuery ? (\n <React.Suspense fallback={<Page.Loading />}>\n <Routes>\n <Route index element={<MediaLibrary />} />\n <Route\n path=\"configuration\"\n element={<ConfigureTheView config={config as Configuration} />}\n />\n </Routes>\n </React.Suspense>\n ) : null}\n </Page.Main>\n );\n};\n"],"names":["getTrad","getFolderURL","useFolderCard","jsx","Box","Checkbox","useIntl","useBulkRemove","jsxs","Dialog","Button","Trash","ConfirmDialog","useNotification","useQueryClient","useFetchClient","useMutation","pluginId","useFolderStructure","normalizeAPIError","error","isEmpty","Modal","Flex","Loader","Formik","Form","Grid","Field","SelectTree","Typography","React","Folder","EmptyAssets","EmptyPermissions","Plus","useTracking","useQueryParams","filters","Popover","Filter","FilterPopover","displayedFilters","FilterList","useLocation","Layouts","Breadcrumbs","Link","NavLink","ArrowLeft","stringify","styled","useNavigate","useMediaLibraryPermissions","usePersistentState","localStorageKeys","viewOptions","useAssets","useFolders","containsAssetFilter","useFolder","useSelectionState","Page","Fragment","SortPicker","IconButton","ReactRouterLink","Cog","List","GridIcon","SearchInput","TableList","FolderGridList","currentFolder","FolderCard","Pencil","FolderCardBody","FolderCardBodyAction","VisuallyHidden","Divider","AssetGridList","Pagination","UploadAssetDialog","EditFolderDialog","EditAssetDialog","useConfig","Routes","Route"],"mappings":"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"}
1
+ {"version":3,"file":"App-CppSIIEZ.js","sources":["../../admin/src/utils/getBreadcrumbDataML.ts","../../admin/src/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.tsx","../../admin/src/pages/App/MediaLibrary/components/BulkDeleteButton.tsx","../../admin/src/hooks/useBulkMove.ts","../../admin/src/components/BulkMoveDialog/BulkMoveDialog.tsx","../../admin/src/pages/App/MediaLibrary/components/BulkMoveButton.tsx","../../admin/src/pages/App/MediaLibrary/components/BulkActions.tsx","../../admin/src/pages/App/MediaLibrary/components/EmptyOrNoPermissions.tsx","../../admin/src/pages/App/MediaLibrary/components/Filters.tsx","../../admin/src/pages/App/MediaLibrary/components/Header.tsx","../../admin/src/pages/App/MediaLibrary/MediaLibrary.tsx","../../admin/src/pages/App/App.tsx"],"sourcesContent":["import { getFolderURL } from './getFolderURL';\nimport { getTrad } from './getTrad';\n\nimport type { Query } from '../../../shared/contracts/files';\nimport type { Folder } from '../../../shared/contracts/folders';\nimport type { MessageDescriptor } from 'react-intl';\n\ninterface GetBreadcrumbDataMLProps {\n folder: Folder;\n options: {\n pathname: string;\n query?: Query;\n };\n}\n\ninterface GetBreadcrumbDataMLReturn {\n id: number | null;\n label: string | MessageDescriptor;\n href?: string;\n}\n\ntype BreadcrumbData = GetBreadcrumbDataMLReturn | [];\n\nexport const getBreadcrumbDataML = (\n folder: GetBreadcrumbDataMLProps['folder'] | null,\n { pathname, query }: GetBreadcrumbDataMLProps['options']\n) => {\n const data: BreadcrumbData[] = [\n {\n id: null,\n label: { id: getTrad('plugin.name'), defaultMessage: 'Media Library' },\n href: folder ? getFolderURL(pathname, query || {}) : undefined,\n },\n ];\n\n if (folder?.parent && typeof folder?.parent !== 'number' && folder?.parent?.parent) {\n data.push([]);\n }\n\n if (folder?.parent && typeof folder.parent !== 'number') {\n data.push({\n id: folder.parent.id,\n label: folder.parent.name,\n href: getFolderURL(pathname, query || {}, {\n folder: folder.parent.id?.toString(),\n folderPath: folder.parent.path,\n }),\n });\n }\n\n if (folder) {\n data.push({\n id: folder.id,\n label: folder.name,\n });\n }\n\n return data;\n};\n","import { Checkbox, Box, CheckboxProps } from '@strapi/design-system';\n\nimport { useFolderCard } from '../contexts/FolderCard';\n\nexport const FolderCardCheckbox = (props: CheckboxProps) => {\n const { id } = useFolderCard();\n\n return (\n <Box position=\"relative\" zIndex={2}>\n <Checkbox aria-labelledby={`${id}-title`} {...props} />\n </Box>\n );\n};\n","import { ConfirmDialog } from '@strapi/admin/strapi-admin';\nimport { Button, Dialog } from '@strapi/design-system';\nimport { Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useBulkRemove } from '../../../../hooks/useBulkRemove';\n\nimport type { FolderDefinition } from '../../../../../../shared/contracts/folders';\nimport type { FileWithType } from '../../../../hooks/useBulkRemove';\n\nexport interface BulkDeleteButtonProps {\n selected: Array<FileWithType | FolderDefinition>;\n onSuccess: () => void;\n}\n\nexport const BulkDeleteButton = ({ selected, onSuccess }: BulkDeleteButtonProps) => {\n const { formatMessage } = useIntl();\n const { remove } = useBulkRemove();\n\n const handleConfirmRemove = async () => {\n await remove(selected);\n onSuccess();\n };\n\n return (\n <Dialog.Root>\n <Dialog.Trigger>\n <Button variant=\"danger-light\" size=\"S\" startIcon={<Trash />}>\n {formatMessage({ id: 'global.delete', defaultMessage: 'Delete' })}\n </Button>\n </Dialog.Trigger>\n <ConfirmDialog onConfirm={handleConfirmRemove} />\n </Dialog.Root>\n );\n};\n","import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQueryClient } from 'react-query';\n\nimport { File, BulkMoveFiles } from '../../../shared/contracts/files';\nimport { Folder, BulkMoveFolders } from '../../../shared/contracts/folders';\nimport { pluginId } from '../pluginId';\nimport { getTrad } from '../utils';\n\nexport interface FolderWithType extends Folder {\n type: string;\n}\n\nexport interface FileWithType extends File {\n type: string;\n}\n\ninterface BulkMoveParams {\n destinationFolderId: number | string;\n filesAndFolders: Array<FolderWithType | FileWithType>;\n}\n\n// Define the shape of the accumulator object\ntype Payload = {\n fileIds?: number[];\n folderIds?: number[];\n};\n\nexport const useBulkMove = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const queryClient = useQueryClient();\n const { post } = useFetchClient();\n\n const bulkMoveQuery = ({ destinationFolderId, filesAndFolders }: BulkMoveParams) => {\n const payload = filesAndFolders.reduce<Payload>((acc, selected) => {\n const { id, type } = selected;\n const key = type === 'asset' ? 'fileIds' : 'folderIds';\n\n if (!acc[key]) {\n acc[key] = [];\n }\n\n acc[key]!.push(id);\n\n return acc;\n }, {});\n\n return post('/upload/actions/bulk-move', { ...payload, destinationFolderId });\n };\n\n const mutation = useMutation<\n BulkMoveFolders.Response | BulkMoveFiles.Response,\n BulkMoveFolders.Response['error'] | BulkMoveFiles.Response['error'],\n BulkMoveParams\n >(bulkMoveQuery, {\n onSuccess(res) {\n const {\n data: { data },\n } = res;\n\n if (data?.files?.length > 0) {\n queryClient.refetchQueries([pluginId, 'assets'], { active: true });\n queryClient.refetchQueries([pluginId, 'asset-count'], { active: true });\n }\n\n // folders need to be re-fetched in any case, because assets might have been\n // moved into a sub-folder and therefore the count needs to be updated\n queryClient.refetchQueries([pluginId, 'folders'], { active: true });\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('modal.move.success-label'),\n defaultMessage: 'Elements have been moved successfully.',\n }),\n });\n },\n });\n\n const move = (\n destinationFolderId: number | string,\n filesAndFolders: Array<FolderWithType | FileWithType>\n ) => mutation.mutateAsync({ destinationFolderId, filesAndFolders });\n\n return { ...mutation, move };\n};\n","import { Button, Flex, Grid, Field, Loader, Modal, Typography } from '@strapi/design-system';\nimport { Form, Formik, FormikErrors } from 'formik';\nimport isEmpty from 'lodash/isEmpty';\nimport { useIntl } from 'react-intl';\n\nimport { File } from '../../../../shared/contracts/files';\nimport { useBulkMove } from '../../hooks/useBulkMove';\nimport { useFolderStructure } from '../../hooks/useFolderStructure';\nimport { getTrad, normalizeAPIError } from '../../utils';\nimport { SelectTree } from '../SelectTree/SelectTree';\n\nimport type { Folder } from '../../../../shared/contracts/folders';\nimport type { OptionSelectTree } from '../SelectTree/SelectTree';\nimport type { FetchError } from '@strapi/admin/strapi-admin';\n\ntype InitialFormData = {\n destination:\n | {\n value: string | number;\n label: string;\n }\n | string;\n};\n\ninterface FolderWithType extends Folder {\n type: string;\n}\n\ninterface FileWithType extends File {\n type: string;\n}\n\nexport interface BulkMoveDialogProps {\n onClose: () => void;\n selected?: Array<FolderWithType | FileWithType>;\n currentFolder?: FolderWithType;\n}\n\nexport const BulkMoveDialog = ({ onClose, selected = [], currentFolder }: BulkMoveDialogProps) => {\n const { formatMessage } = useIntl();\n const { data: folderStructure, isLoading } = useFolderStructure();\n const { move } = useBulkMove();\n\n if (!folderStructure) {\n return null;\n }\n\n const handleSubmit = async (\n values: InitialFormData,\n { setErrors }: { setErrors: (errors: FormikErrors<InitialFormData>) => void }\n ) => {\n try {\n if (typeof values.destination !== 'string') {\n const destinationValue = values.destination.value;\n await move(destinationValue, selected);\n onClose();\n }\n } catch (error) {\n const normalizedError = normalizeAPIError(error as FetchError)!;\n\n if (normalizedError && 'errors' in normalizedError) {\n const formikErrors = normalizedError.errors?.reduce<Record<string, string>>(\n (acc, error) => {\n acc[error.values?.path?.length || 'destination'] = error.defaultMessage;\n\n return acc;\n },\n {}\n );\n\n if (!isEmpty(formikErrors)) {\n setErrors(formikErrors);\n }\n }\n }\n };\n\n if (isLoading) {\n return (\n <Modal.Content>\n <Modal.Body>\n <Flex justifyContent=\"center\" paddingTop={4} paddingBottom={4}>\n <Loader>\n {formatMessage({\n id: getTrad('content.isLoading'),\n defaultMessage: 'Content is loading.',\n })}\n </Loader>\n </Flex>\n </Modal.Body>\n </Modal.Content>\n );\n }\n\n const initialFormData: InitialFormData = {\n destination: {\n value: currentFolder?.id || '',\n label: currentFolder?.name || folderStructure[0].label,\n },\n };\n\n return (\n <Modal.Content>\n <Formik validateOnChange={false} onSubmit={handleSubmit} initialValues={initialFormData}>\n {({ values, errors, setFieldValue }) => (\n <Form noValidate>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('modal.folder.move.title'),\n defaultMessage: 'Move elements to',\n })}\n </Modal.Title>\n </Modal.Header>\n\n <Modal.Body>\n <Grid.Root gap={4}>\n <Grid.Item xs={12} col={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root id=\"folder-destination\">\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.folder-location'),\n defaultMessage: 'Location',\n })}\n </Field.Label>\n\n <SelectTree\n options={folderStructure as OptionSelectTree[]}\n onChange={(value: Record<string, string | number>) => {\n setFieldValue('destination', value);\n }}\n defaultValue={\n typeof values.destination !== 'string' ? values.destination : undefined\n }\n name=\"destination\"\n menuPortalTarget={document.querySelector('body')}\n inputId=\"folder-destination\"\n error={errors?.destination}\n ariaErrorMessage=\"destination-error\"\n />\n\n {errors.destination && (\n <Typography variant=\"pi\" tag=\"p\" textColor=\"danger600\">\n {errors.destination}\n </Typography>\n )}\n </Field.Root>\n </Grid.Item>\n </Grid.Root>\n </Modal.Body>\n\n <Modal.Footer>\n <Modal.Close>\n <Button variant=\"tertiary\" name=\"cancel\">\n {formatMessage({ id: 'cancel', defaultMessage: 'Cancel' })}\n </Button>\n </Modal.Close>\n <Button type=\"submit\" loading={isLoading}>\n {formatMessage({ id: 'modal.folder.move.submit', defaultMessage: 'Move' })}\n </Button>\n </Modal.Footer>\n </Form>\n )}\n </Formik>\n </Modal.Content>\n );\n};\n","import * as React from 'react';\n\nimport { Button, Modal } from '@strapi/design-system';\nimport { Folder } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { BulkMoveDialog } from '../../../../components/BulkMoveDialog/BulkMoveDialog';\n\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type { Folder as FolderDefinition } from '../../../../../../shared/contracts/folders';\n\ninterface FolderWithType extends FolderDefinition {\n type: string;\n}\n\ninterface FileWithType extends File {\n type: string;\n}\n\nexport interface BulkMoveButtonProps {\n onSuccess: () => void;\n currentFolder?: FolderWithType;\n selected?: Array<FolderWithType | FileWithType>;\n}\n\nexport const BulkMoveButton = ({\n selected = [],\n onSuccess,\n currentFolder,\n}: BulkMoveButtonProps) => {\n const { formatMessage } = useIntl();\n const [showConfirmDialog, setShowConfirmDialog] = React.useState(false);\n\n const handleConfirmMove = () => {\n setShowConfirmDialog(false);\n onSuccess();\n };\n\n return (\n <Modal.Root open={showConfirmDialog} onOpenChange={setShowConfirmDialog}>\n <Modal.Trigger>\n <Button variant=\"secondary\" size=\"S\" startIcon={<Folder />}>\n {formatMessage({ id: 'global.move', defaultMessage: 'Move' })}\n </Button>\n </Modal.Trigger>\n <BulkMoveDialog\n currentFolder={currentFolder}\n onClose={handleConfirmMove}\n selected={selected}\n />\n </Modal.Root>\n );\n};\n","import { Flex, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../../utils';\n\nimport { BulkDeleteButton } from './BulkDeleteButton';\nimport { BulkMoveButton } from './BulkMoveButton';\n\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type {\n FolderDefinition,\n Folder as FolderInitial,\n} from '../../../../../../shared/contracts/folders';\n\ninterface FolderWithType extends FolderInitial {\n type: string;\n}\n\nexport interface FileWithType extends File {\n type: string;\n}\n\nexport interface BulkActionsProps {\n selected: Array<FileWithType | FolderDefinition> | Array<FolderWithType | FileWithType>;\n onSuccess: () => void;\n currentFolder?: FolderWithType;\n}\n\nexport const BulkActions = ({ selected = [], onSuccess, currentFolder }: BulkActionsProps) => {\n const { formatMessage } = useIntl();\n const numberAssets = selected?.reduce(function (_this, val) {\n return val?.type === 'folder' && 'files' in val && val?.files && 'count' in val.files\n ? _this + val?.files?.count\n : _this + 1;\n }, 0);\n\n return (\n <Flex gap={2} paddingBottom={5}>\n <Typography variant=\"epsilon\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: getTrad('list.assets.selected'),\n defaultMessage:\n '{numberFolders, plural, one {1 folder} other {# folders}} - {numberAssets, plural, one {1 asset} other {# assets}} selected',\n },\n {\n numberFolders: selected?.filter(({ type }) => type === 'folder').length,\n numberAssets,\n }\n )}\n </Typography>\n\n <BulkDeleteButton\n selected={selected as Array<FileWithType | FolderDefinition>}\n onSuccess={onSuccess}\n />\n <BulkMoveButton\n currentFolder={currentFolder}\n selected={selected as Array<FolderWithType | FileWithType>}\n onSuccess={onSuccess}\n />\n </Flex>\n );\n};\n","import { Button } from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { EmptyPermissions } from '@strapi/icons/symbols';\nimport { useIntl } from 'react-intl';\n\nimport { EmptyAssets } from '../../../../components/EmptyAssets/EmptyAssets';\nimport { getTrad } from '../../../../utils';\n\nexport interface EmptyOrNoPermissionsProps {\n canCreate: boolean;\n canRead: boolean;\n isFiltering: boolean;\n onActionClick: () => void;\n}\n\nconst getContentIntlMessage = ({\n isFiltering,\n canCreate,\n canRead,\n}: Omit<EmptyOrNoPermissionsProps, 'onActionClick'>) => {\n if (isFiltering) {\n return {\n id: 'list.assets-empty.title-withSearch',\n defaultMessage: 'There are no elements with the applied filters',\n };\n }\n\n if (canRead) {\n if (canCreate) {\n return {\n id: 'list.assets.empty-upload',\n defaultMessage: 'Upload your first assets...',\n };\n }\n\n return {\n id: 'list.assets.empty',\n defaultMessage: 'Media Library is empty',\n };\n }\n\n return {\n id: 'header.actions.no-permissions',\n defaultMessage: 'No permissions to view',\n };\n};\n\nexport const EmptyOrNoPermissions = ({\n canCreate,\n isFiltering,\n canRead,\n onActionClick,\n}: EmptyOrNoPermissionsProps) => {\n const { formatMessage } = useIntl();\n const content = getContentIntlMessage({ isFiltering, canCreate, canRead });\n\n return (\n <EmptyAssets\n icon={!canRead ? EmptyPermissions : undefined}\n action={\n canCreate &&\n !isFiltering && (\n <Button variant=\"secondary\" startIcon={<Plus />} onClick={onActionClick}>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Button>\n )\n }\n content={formatMessage({\n ...content,\n id: getTrad(content.id),\n })}\n />\n );\n};\n","import * as React from 'react';\n\nimport { useTracking, useQueryParams } from '@strapi/admin/strapi-admin';\nimport { Button, Popover } from '@strapi/design-system';\nimport { Filter } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { FilterList } from '../../../../components/FilterList/FilterList';\nimport { FilterPopover } from '../../../../components/FilterPopover/FilterPopover';\nimport { displayedFilters } from '../../../../utils';\n\nimport type { Query } from '../../../../../../shared/contracts/files';\nimport type { FilterListProps } from '../../../../components/FilterList/FilterList';\nimport type { FilterPopoverProps } from '../../../../components/FilterPopover/FilterPopover';\n\nexport const Filters = () => {\n const [open, setOpen] = React.useState(false);\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const [{ query }, setQuery] = useQueryParams<Query>();\n const filters = query?.filters?.$and || [];\n\n const handleRemoveFilter: FilterListProps['onRemoveFilter'] = (nextFilters) => {\n setQuery({ filters: { $and: nextFilters }, page: 1 } as Query);\n };\n\n const handleSubmit: FilterPopoverProps['onSubmit'] = (filters) => {\n trackUsage('didFilterMediaLibraryElements', {\n location: 'content-manager',\n filter: Object.keys(filters[filters.length - 1])[0],\n });\n setQuery({ filters: { $and: filters }, page: 1 } as Query);\n };\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.Trigger>\n <Button variant=\"tertiary\" startIcon={<Filter />} size=\"S\">\n {formatMessage({ id: 'app.utils.filters', defaultMessage: 'Filters' })}\n </Button>\n </Popover.Trigger>\n <FilterPopover\n displayedFilters={displayedFilters}\n filters={filters}\n onSubmit={handleSubmit}\n onToggle={setOpen as FilterPopoverProps['onToggle']}\n />\n <FilterList\n appliedFilters={filters as FilterListProps['appliedFilters']}\n filtersSchema={displayedFilters}\n onRemoveFilter={handleRemoveFilter}\n />\n </Popover.Root>\n );\n};\n","import { useQueryParams, Layouts } from '@strapi/admin/strapi-admin';\nimport { Button, Flex, Link } from '@strapi/design-system';\nimport { ArrowLeft, Plus } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { useLocation, NavLink } from 'react-router-dom';\n\nimport { Breadcrumbs } from '../../../../components/Breadcrumbs/Breadcrumbs';\nimport { getTrad } from '../../../../utils';\n\nimport type { Folder } from '../../../../../../shared/contracts/folders';\nimport type { CrumbDefinition } from '../../../../components/Breadcrumbs/Breadcrumbs';\n\ninterface FolderDefinition extends Omit<Folder, 'children' | 'files' | 'parent'> {\n children: {\n count: number;\n };\n files: {\n count: number;\n };\n parent?: FolderDefinition;\n}\n\nexport interface HeaderProps {\n breadcrumbs?: Array<CrumbDefinition> | null;\n canCreate: boolean;\n folder?: FolderDefinition | null;\n onToggleEditFolderDialog: ({ created }?: { created?: boolean }) => void;\n onToggleUploadAssetDialog: () => void;\n}\n\nexport const Header = ({\n breadcrumbs = null,\n canCreate,\n folder = null,\n onToggleEditFolderDialog,\n onToggleUploadAssetDialog,\n}: HeaderProps) => {\n const { formatMessage } = useIntl();\n const { pathname } = useLocation();\n const [{ query }] = useQueryParams();\n const backQuery = {\n ...query,\n folder:\n folder?.parent && typeof folder.parent !== 'number' && folder.parent.id\n ? folder.parent.id\n : undefined,\n folderPath:\n folder?.parent && typeof folder.parent !== 'number' && folder.parent.path\n ? folder.parent.path\n : undefined,\n };\n\n return (\n <Layouts.Header\n title={formatMessage({\n id: getTrad('plugin.name'),\n defaultMessage: `Media Library`,\n })}\n subtitle={\n breadcrumbs &&\n typeof breadcrumbs !== 'boolean' &&\n folder && (\n <Breadcrumbs\n label={formatMessage({\n id: getTrad('header.breadcrumbs.nav.label'),\n defaultMessage: 'Folders navigation',\n })}\n breadcrumbs={breadcrumbs}\n currentFolderId={folder?.id}\n />\n )\n }\n navigationAction={\n folder && (\n <Link\n tag={NavLink}\n startIcon={<ArrowLeft />}\n to={`${pathname}?${stringify(backQuery, { encode: false })}`}\n >\n {formatMessage({\n id: getTrad('header.actions.folder-level-up'),\n defaultMessage: 'Back',\n })}\n </Link>\n )\n }\n primaryAction={\n canCreate && (\n <Flex gap={2}>\n <Button startIcon={<Plus />} variant=\"secondary\" onClick={onToggleEditFolderDialog}>\n {formatMessage({\n id: getTrad('header.actions.add-folder'),\n defaultMessage: 'Add new folder',\n })}\n </Button>\n\n <Button startIcon={<Plus />} onClick={onToggleUploadAssetDialog}>\n {formatMessage({\n id: getTrad('header.actions.add-assets'),\n defaultMessage: 'Add new assets',\n })}\n </Button>\n </Flex>\n )\n }\n />\n );\n};\n","// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport {\n Page,\n SearchInput,\n Pagination,\n useTracking,\n useQueryParams,\n Layouts,\n} from '@strapi/admin/strapi-admin';\nimport {\n Checkbox,\n Box,\n Divider,\n Flex,\n IconButton,\n Typography,\n VisuallyHidden,\n Grid,\n} from '@strapi/design-system';\nimport { Cog, GridFour as GridIcon, List, Pencil } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link as ReactRouterLink, useNavigate, useLocation } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { AssetGridList } from '../../../components/AssetGridList/AssetGridList';\nimport { EditAssetDialog } from '../../../components/EditAssetDialog/EditAssetContent';\nimport { EditFolderDialog } from '../../../components/EditFolderDialog/EditFolderDialog';\nimport { FolderCard } from '../../../components/FolderCard/FolderCard/FolderCard';\nimport { FolderCardBody } from '../../../components/FolderCard/FolderCardBody/FolderCardBody';\nimport { FolderCardBodyAction } from '../../../components/FolderCard/FolderCardBodyAction/FolderCardBodyAction';\nimport { FolderCardCheckbox } from '../../../components/FolderCard/FolderCardCheckbox/FolderCardCheckbox';\nimport { FolderGridList } from '../../../components/FolderGridList/FolderGridList';\nimport { SortPicker } from '../../../components/SortPicker/SortPicker';\nimport { TableList } from '../../../components/TableList/TableList';\nimport { UploadAssetDialog } from '../../../components/UploadAssetDialog/UploadAssetDialog';\nimport { localStorageKeys, viewOptions } from '../../../constants';\nimport { useAssets } from '../../../hooks/useAssets';\nimport { useFolder } from '../../../hooks/useFolder';\nimport { useFolders } from '../../../hooks/useFolders';\nimport { useMediaLibraryPermissions } from '../../../hooks/useMediaLibraryPermissions';\nimport { usePersistentState } from '../../../hooks/usePersistentState';\nimport { useSelectionState } from '../../../hooks/useSelectionState';\nimport { containsAssetFilter, getBreadcrumbDataML, getFolderURL, getTrad } from '../../../utils';\n\nimport { BulkActions } from './components/BulkActions';\nimport { EmptyOrNoPermissions } from './components/EmptyOrNoPermissions';\nimport { Filters } from './components/Filters';\nimport { Header } from './components/Header';\n\nimport type { BulkActionsProps } from './components/BulkActions';\nimport type { HeaderProps } from './components/Header';\nimport type { Query } from '../../../../../shared/contracts/files';\nimport type { FolderDefinition } from '../../../../../shared/contracts/folders';\nimport type { AssetGridListProps } from '../../../components/AssetGridList/AssetGridList';\nimport type { Asset } from '../../../components/EditAssetDialog/EditAssetContent';\nimport type { FolderRow, FileRow, TableListProps } from '../../../components/TableList/TableList';\n\nconst BoxWithHeight = styled(Box)`\n height: 3.2rem;\n display: flex;\n align-items: center;\n`;\n\nconst TypographyMaxWidth = styled(Typography)`\n max-width: 100%;\n`;\n\nconst ActionContainer = styled(Box)`\n svg {\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n`;\n\nexport const MediaLibrary = () => {\n const navigate = useNavigate();\n const {\n canRead,\n canCreate,\n canUpdate,\n canCopyLink,\n canDownload,\n canConfigureView,\n isLoading: permissionsLoading,\n } = useMediaLibraryPermissions();\n const currentFolderToEditRef = React.useRef<HTMLDivElement>();\n const { formatMessage } = useIntl();\n const { pathname } = useLocation();\n const { trackUsage } = useTracking();\n const [{ query }, setQuery] = useQueryParams<Query>();\n const isFiltering = Boolean(query._q || query.filters);\n const [view, setView] = usePersistentState(localStorageKeys.view, viewOptions.GRID);\n const isGridView = view === viewOptions.GRID;\n\n const {\n data: assetsData,\n isLoading: assetsLoading,\n error: assetsError,\n } = useAssets({\n skipWhen: !canRead,\n query,\n });\n\n const {\n data: foldersData,\n isLoading: foldersLoading,\n error: foldersError,\n } = useFolders({\n enabled: canRead && assetsData?.pagination?.page === 1 && !containsAssetFilter(query),\n query,\n });\n\n const {\n data: currentFolder,\n isLoading: isCurrentFolderLoading,\n error: currentFolderError,\n } = useFolder(query?.folder as number | null | undefined, {\n enabled: canRead && !!query?.folder,\n });\n\n // Folder was not found: redirect to the media library root\n if (currentFolderError?.name === 'NotFoundError') {\n navigate(pathname);\n }\n\n const folders =\n foldersData?.map((folder) => ({\n ...folder,\n type: 'folder',\n folderURL: getFolderURL(pathname, query, {\n folder: folder.id.toString(),\n folderPath: folder.path,\n }),\n isSelectable: canUpdate,\n })) ?? [];\n const folderCount = folders?.length || 0;\n const assets =\n assetsData?.results?.map((asset) => ({ ...asset, type: 'asset', isSelectable: canUpdate })) ||\n [];\n const assetCount = assets?.length ?? 0;\n const totalAssetCount = assetsData?.pagination?.total;\n\n const isLoading = isCurrentFolderLoading || foldersLoading || permissionsLoading || assetsLoading;\n const [showUploadAssetDialog, setShowUploadAssetDialog] = React.useState(false);\n const [showEditFolderDialog, setShowEditFolderDialog] = React.useState(false);\n const [assetToEdit, setAssetToEdit] = React.useState<Asset | undefined>(undefined);\n const [folderToEdit, setFolderToEdit] = React.useState<FolderRow | undefined | null>(undefined);\n const [selected, { selectOne, selectAll }] = useSelectionState<FolderRow | FileRow>(\n ['type', 'id'],\n []\n );\n const indeterminateBulkSelect =\n selected?.length > 0 && selected?.length !== assetCount + folderCount;\n const toggleUploadAssetDialog = () => setShowUploadAssetDialog((prev) => !prev);\n const toggleEditFolderDialog = ({ created = false } = {}) => {\n // folders are only displayed on the first page, therefore\n // we have to navigate the user to that page, in case a folder\n // was created successfully in order for them to see it\n if (created && query?.page !== '1') {\n setQuery({\n ...query,\n page: 1,\n });\n }\n\n setShowEditFolderDialog((prev) => !prev);\n };\n\n const handleBulkSelect = (\n checked: boolean | 'indeterminate',\n elements?: FolderRow[] | FileRow[]\n ) => {\n if (checked) {\n trackUsage('didSelectAllMediaLibraryElements');\n }\n\n selectAll(elements as (FolderRow | FileRow)[]);\n };\n\n const handleChangeSort = (value: Query['sort'] | string) => {\n trackUsage('didSortMediaLibraryElements', {\n location: 'upload',\n sort: value,\n });\n setQuery({ sort: value as Query['sort'] });\n };\n\n const handleEditFolder = (folder: FolderRow) => {\n setFolderToEdit(folder);\n setShowEditFolderDialog(true);\n };\n\n const handleEditFolderClose = (payload?: { created?: boolean | undefined }) => {\n setFolderToEdit(null);\n toggleEditFolderDialog(payload);\n\n if (currentFolderToEditRef.current) {\n currentFolderToEditRef.current.focus();\n }\n };\n\n const handleAssetDeleted = (numberOfAssets: number) => {\n if (\n numberOfAssets === assetCount &&\n assetsData?.pagination?.page === assetsData?.pagination?.pageCount &&\n assetsData?.pagination?.page &&\n assetsData.pagination.page > 1\n ) {\n setQuery({\n ...query,\n page: assetsData.pagination.page - 1,\n });\n }\n };\n\n const handleBulkActionSuccess = () => {\n selectAll();\n\n handleAssetDeleted(selected.length);\n };\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (assetsError || foldersError) {\n return <Page.Error />;\n }\n\n return (\n <Layouts.Root>\n <Page.Main>\n <Header\n breadcrumbs={\n !isCurrentFolderLoading\n ? (getBreadcrumbDataML(currentFolder!, {\n pathname,\n query,\n }) as HeaderProps['breadcrumbs'])\n : null\n }\n canCreate={canCreate}\n onToggleEditFolderDialog={toggleEditFolderDialog}\n onToggleUploadAssetDialog={toggleUploadAssetDialog}\n folder={currentFolder as HeaderProps['folder']}\n />\n <Layouts.Action\n startActions={\n <>\n {canUpdate && isGridView && (assetCount > 0 || folderCount > 0) && (\n <BoxWithHeight\n paddingLeft={2}\n paddingRight={2}\n background=\"neutral0\"\n hasRadius\n borderColor=\"neutral200\"\n >\n <Checkbox\n aria-label={formatMessage({\n id: getTrad('bulk.select.label'),\n defaultMessage: 'Select all folders & assets',\n })}\n checked={\n indeterminateBulkSelect\n ? 'indeterminate'\n : (assetCount > 0 || folderCount > 0) &&\n selected.length === assetCount + folderCount\n }\n onCheckedChange={(e) =>\n handleBulkSelect(e, [...assets, ...folders] as FolderRow[] | FileRow[])\n }\n />\n </BoxWithHeight>\n )}\n {canRead && isGridView && (\n <SortPicker value={query?.sort} onChangeSort={handleChangeSort} />\n )}\n {canRead && <Filters />}\n </>\n }\n endActions={\n <>\n {canConfigureView ? (\n <ActionContainer paddingTop={1} paddingBottom={1}>\n <IconButton\n tag={ReactRouterLink}\n to={{\n pathname: `${pathname}/configuration`,\n search: stringify(query, { encode: false }),\n }}\n label={formatMessage({\n id: 'app.links.configure-view',\n defaultMessage: 'Configure the view',\n })}\n >\n <Cog />\n </IconButton>\n </ActionContainer>\n ) : null}\n <ActionContainer paddingTop={1} paddingBottom={1}>\n <IconButton\n label={\n isGridView\n ? formatMessage({\n id: getTrad('view-switch.list'),\n defaultMessage: 'List View',\n })\n : formatMessage({\n id: getTrad('view-switch.grid'),\n defaultMessage: 'Grid View',\n })\n }\n onClick={() => setView(isGridView ? viewOptions.LIST : viewOptions.GRID)}\n >\n {isGridView ? <List /> : <GridIcon />}\n </IconButton>\n </ActionContainer>\n <SearchInput\n label={formatMessage({\n id: getTrad('search.label'),\n defaultMessage: 'Search for an asset',\n })}\n trackedEvent=\"didSearchMediaLibraryElements\"\n trackedEventDetails={{ location: 'upload' }}\n />\n </>\n }\n />\n\n <Layouts.Content>\n {selected.length > 0 && (\n <BulkActions\n currentFolder={currentFolder as BulkActionsProps['currentFolder']}\n selected={selected as BulkActionsProps['selected']}\n onSuccess={handleBulkActionSuccess}\n />\n )}\n\n {folderCount === 0 && assetCount === 0 && (\n <EmptyOrNoPermissions\n canCreate={canCreate}\n canRead={canRead}\n isFiltering={isFiltering}\n onActionClick={toggleUploadAssetDialog}\n />\n )}\n\n {/* TODO: fix AssetListTable should handle no assets views (loading) */}\n {canRead && !isGridView && (assetCount > 0 || folderCount > 0) && (\n <TableList\n assetCount={assetCount}\n folderCount={folderCount}\n indeterminate={indeterminateBulkSelect}\n onChangeSort={handleChangeSort}\n onChangeFolder={(folderID, folderPath) =>\n navigate(getFolderURL(pathname, query, { folder: folderID.toString(), folderPath }))\n }\n onEditAsset={setAssetToEdit as TableListProps['onEditAsset']}\n onEditFolder={handleEditFolder}\n onSelectOne={selectOne}\n onSelectAll={handleBulkSelect as TableListProps['onSelectAll']}\n rows={[...folders, ...assets] as TableListProps['rows']}\n selected={selected as TableListProps['selected']}\n shouldDisableBulkSelect={!canUpdate}\n sortQuery={query?.sort ?? ''}\n />\n )}\n\n {canRead && isGridView && (\n <>\n {folderCount > 0 && (\n <FolderGridList\n title={\n // Folders title should only appear if:\n // user is filtering and there are assets to display, to divide both type of elements\n // user is not filtering\n (((isFiltering && assetCount > 0) || !isFiltering) &&\n formatMessage(\n {\n id: getTrad('list.folders.title'),\n defaultMessage: 'Folders ({count})',\n },\n { count: folderCount }\n )) ||\n ''\n }\n >\n {folders.map((folder) => {\n const selectedFolders = selected.filter(({ type }) => type === 'folder');\n const isSelected = !!selectedFolders.find(\n (currentFolder) => currentFolder.id === folder.id\n );\n\n const url = getFolderURL(pathname, query, {\n folder: folder?.id.toString(),\n folderPath: folder?.path,\n });\n\n return (\n <Grid.Item\n col={3}\n key={`folder-${folder.id}`}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <FolderCard\n ref={\n folderToEdit && folder.id === folderToEdit.id\n ? currentFolderToEditRef\n : undefined\n }\n ariaLabel={folder.name}\n id={`folder-${folder.id}`}\n to={url}\n startAction={\n folder.isSelectable ? (\n <FolderCardCheckbox\n data-testid={`folder-checkbox-${folder.id}`}\n checked={isSelected}\n onCheckedChange={() => selectOne(folder)}\n />\n ) : null\n }\n cardActions={\n <IconButton\n label={formatMessage({\n id: getTrad('list.folder.edit'),\n defaultMessage: 'Edit folder',\n })}\n onClick={() => handleEditFolder(folder)}\n >\n <Pencil />\n </IconButton>\n }\n >\n <FolderCardBody>\n <FolderCardBodyAction to={url}>\n <Flex tag=\"h2\" direction=\"column\" alignItems=\"start\" maxWidth=\"100%\">\n <TypographyMaxWidth\n fontWeight=\"semiBold\"\n textColor=\"neutral800\"\n ellipsis\n >\n {folder.name}\n <VisuallyHidden>:</VisuallyHidden>\n </TypographyMaxWidth>\n\n <TypographyMaxWidth\n tag=\"span\"\n textColor=\"neutral600\"\n variant=\"pi\"\n ellipsis\n >\n {formatMessage(\n {\n id: getTrad('list.folder.subtitle'),\n defaultMessage:\n '{folderCount, plural, =0 {# folder} one {# folder} other {# folders}}, {filesCount, plural, =0 {# asset} one {# asset} other {# assets}}',\n },\n {\n folderCount: (folder as FolderDefinition).children?.count,\n filesCount: (folder as FolderDefinition).files?.count,\n }\n )}\n </TypographyMaxWidth>\n </Flex>\n </FolderCardBodyAction>\n </FolderCardBody>\n </FolderCard>\n </Grid.Item>\n );\n })}\n </FolderGridList>\n )}\n\n {assetCount > 0 && folderCount > 0 && (\n <Box paddingTop={6} paddingBottom={4}>\n <Divider />\n </Box>\n )}\n\n {assetCount > 0 && (\n <AssetGridList\n assets={assets}\n onEditAsset={setAssetToEdit as AssetGridListProps['onEditAsset']}\n onSelectAsset={selectOne}\n selectedAssets={\n selected.filter(\n ({ type }) => type === 'asset'\n ) as AssetGridListProps['selectedAssets']\n }\n title={\n // Assets title should only appear if:\n // - user is not filtering\n // - user is filtering and there are folders to display, to separate them\n // - user is on page 1 since folders won't appear on any other page than the first one (no need to visually separate them)\n ((!isFiltering || (isFiltering && folderCount > 0)) &&\n assetsData?.pagination?.page === 1 &&\n formatMessage(\n {\n id: getTrad('list.assets.title'),\n defaultMessage: 'Assets ({count})',\n },\n { count: totalAssetCount }\n )) ||\n ''\n }\n />\n )}\n </>\n )}\n <Pagination.Root {...assetsData?.pagination}>\n <Pagination.PageSize />\n <Pagination.Links />\n </Pagination.Root>\n </Layouts.Content>\n </Page.Main>\n {showUploadAssetDialog && (\n <UploadAssetDialog\n open={showUploadAssetDialog}\n onClose={toggleUploadAssetDialog}\n trackedLocation=\"upload\"\n folderId={query?.folder as string | number | null | undefined}\n />\n )}\n {showEditFolderDialog && (\n <EditFolderDialog\n open={showEditFolderDialog}\n onClose={() => handleEditFolderClose()}\n folder={folderToEdit as FolderDefinition}\n parentFolderId={query?.folder as string | number | null | undefined}\n location=\"upload\"\n />\n )}\n {assetToEdit && (\n <EditAssetDialog\n onClose={(editedAsset) => {\n // The asset has been deleted\n if (editedAsset === null) {\n handleAssetDeleted(1);\n }\n\n setAssetToEdit(undefined);\n }}\n open={!!assetToEdit}\n asset={assetToEdit}\n canUpdate={canUpdate}\n canCopyLink={canCopyLink}\n canDownload={canDownload}\n trackedLocation=\"upload\"\n />\n )}\n </Layouts.Root>\n );\n};\n","// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport { Page, useQueryParams } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { Route, Routes } from 'react-router-dom';\n\nimport { useConfig } from '../../hooks/useConfig';\nimport { getTrad } from '../../utils';\n\nimport { MediaLibrary } from './MediaLibrary/MediaLibrary';\n\nimport type { Configuration } from '../../../../shared/contracts/configuration';\n\nconst ConfigureTheView = React.lazy(async () =>\n import('./ConfigureTheView/ConfigureTheView').then((mod) => ({ default: mod.ConfigureTheView }))\n);\n\nexport const Upload = () => {\n const {\n config: { isLoading, isError, data: config },\n } = useConfig() as { config: { isLoading: boolean; isError: boolean; data: Configuration } };\n\n const [{ rawQuery }, setQuery] = useQueryParams();\n const { formatMessage } = useIntl();\n const title = formatMessage({ id: getTrad('plugin.name'), defaultMessage: 'Media Library' });\n\n React.useEffect(() => {\n if (isLoading || isError || rawQuery) {\n return;\n }\n setQuery({\n sort: config.sort,\n page: 1,\n pageSize: config.pageSize,\n });\n }, [isLoading, isError, config, rawQuery, setQuery]);\n\n if (isLoading) {\n return (\n <>\n <Page.Title>{title}</Page.Title>\n <Page.Loading />\n </>\n );\n }\n\n return (\n <Page.Main>\n {rawQuery ? (\n <React.Suspense fallback={<Page.Loading />}>\n <Routes>\n <Route index element={<MediaLibrary />} />\n <Route\n path=\"configuration\"\n element={<ConfigureTheView config={config as Configuration} />}\n />\n </Routes>\n </React.Suspense>\n ) : null}\n </Page.Main>\n );\n};\n"],"names":["getTrad","getFolderURL","useFolderCard","jsx","Box","Checkbox","useIntl","useBulkRemove","jsxs","Dialog","Button","Trash","ConfirmDialog","useNotification","useQueryClient","useFetchClient","useMutation","pluginId","useFolderStructure","normalizeAPIError","error","isEmpty","Modal","Flex","Loader","Formik","Form","Grid","Field","SelectTree","Typography","React","Folder","EmptyAssets","EmptyPermissions","Plus","useTracking","useQueryParams","filters","Popover","Filter","FilterPopover","displayedFilters","FilterList","useLocation","Layouts","Breadcrumbs","Link","NavLink","ArrowLeft","stringify","styled","useNavigate","useMediaLibraryPermissions","usePersistentState","localStorageKeys","viewOptions","useAssets","useFolders","containsAssetFilter","useFolder","useSelectionState","Page","Fragment","SortPicker","IconButton","ReactRouterLink","Cog","List","GridIcon","SearchInput","TableList","FolderGridList","currentFolder","FolderCard","Pencil","FolderCardBody","FolderCardBodyAction","VisuallyHidden","Divider","AssetGridList","Pagination","UploadAssetDialog","EditFolderDialog","EditAssetDialog","useConfig","Routes","Route"],"mappings":"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"}
@@ -6,7 +6,7 @@ import { ArrowLeft, Check } from "@strapi/icons";
6
6
  import isEqual from "lodash/isEqual";
7
7
  import { useIntl } from "react-intl";
8
8
  import { NavLink } from "react-router-dom";
9
- import { g as getTrad, C as pageSizes, D as sortOptions, p as pluginId, z as useConfig } from "./index-_hnlyE9J.mjs";
9
+ import { g as getTrad, C as pageSizes, D as sortOptions, p as pluginId, z as useConfig } from "./index-CHxEceRJ.mjs";
10
10
  import "byte-size";
11
11
  import "date-fns";
12
12
  import "qs";
@@ -227,4 +227,4 @@ const ConfigureTheView = ({ config }) => {
227
227
  export {
228
228
  ConfigureTheView
229
229
  };
230
- //# sourceMappingURL=ConfigureTheView-BTt0-7Ac.mjs.map
230
+ //# sourceMappingURL=ConfigureTheView-BNDKMkvq.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConfigureTheView-BTt0-7Ac.mjs","sources":["../../admin/src/pages/App/ConfigureTheView/components/Settings.tsx","../../admin/src/pages/App/ConfigureTheView/state/actionTypes.ts","../../admin/src/pages/App/ConfigureTheView/state/actions.ts","../../admin/src/pages/App/ConfigureTheView/state/init.ts","../../admin/src/pages/App/ConfigureTheView/state/reducer.ts","../../admin/src/pages/App/ConfigureTheView/ConfigureTheView.tsx"],"sourcesContent":["import { Box, Grid, SingleSelectOption, SingleSelect, Field } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { pageSizes, sortOptions } from '../../../../constants';\nimport { getTrad } from '../../../../utils';\n\nimport type { Configuration } from '../../../../../../shared/contracts/configuration';\n\ninterface SettingsProps {\n sort: string;\n pageSize: string | number;\n onChange: ({\n target: { name, value },\n }: {\n target: { name: keyof Configuration; value: string | number };\n }) => void;\n}\n\nconst Settings = ({ sort = '', pageSize = 10, onChange }: SettingsProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"tableShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n >\n <Grid.Root gap={4}>\n <Grid.Item s={12} col={6} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n hint={formatMessage({\n id: getTrad('config.entries.note'),\n defaultMessage: 'Number of assets displayed by default in the Media Library',\n })}\n name=\"pageSize\"\n >\n <Field.Label>\n {formatMessage({\n id: getTrad('config.entries.title'),\n defaultMessage: 'Entries per page',\n })}\n </Field.Label>\n <SingleSelect\n onChange={(value) => onChange({ target: { name: 'pageSize', value } })}\n value={pageSize}\n >\n {pageSizes.map((pageSize) => (\n <SingleSelectOption key={pageSize} value={pageSize}>\n {pageSize}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n <Field.Hint />\n </Field.Root>\n </Grid.Item>\n <Grid.Item s={12} col={6} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n hint={formatMessage({\n id: getTrad('config.note'),\n defaultMessage: 'Note: You can override this value in the media library.',\n })}\n name=\"sort\"\n >\n <Field.Label>\n {formatMessage({\n id: getTrad('config.sort.title'),\n defaultMessage: 'Default sort order',\n })}\n </Field.Label>\n <SingleSelect\n onChange={(value) => onChange({ target: { name: 'sort', value } })}\n value={sort}\n test-sort={sort}\n data-testid=\"sort-select\"\n >\n {sortOptions.map((filter) => (\n <SingleSelectOption\n data-testid={`sort-option-${filter.value}`}\n key={filter.key}\n value={filter.value}\n >\n {formatMessage({ id: getTrad(filter.key), defaultMessage: `${filter.value}` })}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n <Field.Hint />\n </Field.Root>\n </Grid.Item>\n </Grid.Root>\n </Box>\n );\n};\n\nexport { Settings };\n","import { pluginId } from '../../../../pluginId';\n\nexport const ON_CHANGE = `${pluginId}/ON_CHANGE`;\nexport const SET_LOADED = `${pluginId}/SET_LOADED`;\n","import { ON_CHANGE, SET_LOADED } from './actionTypes';\n\nimport type { InitialState } from './init';\n\nexport const onChange = ({\n name,\n value,\n}: {\n name: keyof NonNullable<InitialState['initialData']>;\n value: number | string;\n}) => ({\n type: ON_CHANGE,\n keys: name,\n value,\n});\n\nexport const setLoaded = () => ({\n type: SET_LOADED,\n});\n","import type { Configuration } from '../../../../../../shared/contracts/configuration';\n\nexport type InitialState = {\n initialData: Partial<Configuration>;\n modifiedData: Partial<Configuration>;\n};\n\nconst initialState: InitialState = {\n initialData: {},\n modifiedData: {},\n};\n\nconst init = (configData: InitialState['initialData']): InitialState => {\n return {\n ...initialState,\n initialData: configData,\n modifiedData: configData,\n };\n};\nexport { init, initialState };\n","import { produce } from 'immer'; // current\nimport get from 'lodash/get';\nimport set from 'lodash/set';\n\nimport { ON_CHANGE, SET_LOADED } from './actionTypes';\nimport { init, initialState } from './init';\n\nimport type { InitialState } from './init';\n\nexport interface ActionOnChange {\n type: string;\n keys?: string;\n value: string | number;\n}\n\nexport interface ActionSetLoaded {\n type: string;\n}\n\ninterface ActionInitialValue {\n type: string;\n}\n\nexport type Action = ActionSetLoaded | ActionOnChange | ActionInitialValue;\n\nexport const reducer = (\n state: InitialState = initialState,\n action: Action = {\n type: '',\n }\n) =>\n // eslint-disable-next-line consistent-return\n produce(state, (draftState) => {\n switch (action.type) {\n case ON_CHANGE: {\n if ('keys' in action && 'value' in action && action.keys) {\n set(draftState, ['modifiedData', ...action.keys.split('.')], action.value);\n }\n break;\n }\n case SET_LOADED: {\n // This action re-initialises the state using the current modifiedData.\n const reInitialise = init(get(draftState, ['modifiedData'], {}));\n draftState.initialData = reInitialise.initialData;\n draftState.modifiedData = reInitialise.modifiedData;\n break;\n }\n default:\n return draftState;\n }\n });\n","// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport {\n ConfirmDialog,\n useTracking,\n useNotification,\n Page,\n Layouts,\n} from '@strapi/admin/strapi-admin';\nimport { Button, Dialog, Link } from '@strapi/design-system';\nimport { ArrowLeft, Check } from '@strapi/icons';\nimport isEqual from 'lodash/isEqual';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\n\nimport { useConfig } from '../../../hooks/useConfig';\nimport { pluginId } from '../../../pluginId';\nimport { getTrad } from '../../../utils';\n\nimport { Settings } from './components/Settings';\nimport { onChange, setLoaded } from './state/actions';\nimport { init, initialState } from './state/init';\nimport { reducer } from './state/reducer';\n\nimport type { InitialState } from './state/init';\nimport type { Action } from './state/reducer';\nimport type { Configuration } from '../../../../../shared/contracts/configuration';\n\ninterface ConfigureTheViewProps {\n config: Configuration;\n}\n\nexport const ConfigureTheView = ({ config }: ConfigureTheViewProps) => {\n const { trackUsage } = useTracking();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { mutateConfig } = useConfig();\n const { isLoading: isSubmittingForm } = mutateConfig;\n\n const [showWarningSubmit, setWarningSubmit] = React.useState(false);\n const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);\n\n const [reducerState, dispatch] = React.useReducer(\n reducer,\n initialState,\n (): InitialState => init(config)\n );\n const typedDispatch: React.Dispatch<Action> = dispatch;\n const { initialData, modifiedData } = reducerState;\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n toggleWarningSubmit();\n };\n\n const handleConfirm = async () => {\n trackUsage('willEditMediaLibraryConfig');\n await mutateConfig.mutateAsync(modifiedData as Configuration);\n setWarningSubmit(false);\n typedDispatch(setLoaded());\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'notification.form.success.fields',\n defaultMessage: 'Changes saved',\n }),\n });\n };\n\n const handleChange = ({\n target: { name, value },\n }: {\n target: { name: keyof Configuration; value: string | number };\n }) => {\n typedDispatch(onChange({ name, value }));\n };\n\n return (\n <Layouts.Root>\n <Page.Main aria-busy={isSubmittingForm}>\n <form onSubmit={handleSubmit}>\n <Layouts.Header\n navigationAction={\n <Link\n tag={NavLink}\n startIcon={<ArrowLeft />}\n to={`/plugins/${pluginId}`}\n id=\"go-back\"\n >\n {formatMessage({ id: getTrad('config.back'), defaultMessage: 'Back' })}\n </Link>\n }\n primaryAction={\n <Button\n size=\"S\"\n startIcon={<Check />}\n disabled={isEqual(modifiedData, initialData)}\n type=\"submit\"\n >\n {formatMessage({ id: 'global.save', defaultMessage: 'Save' })}\n </Button>\n }\n subtitle={formatMessage({\n id: getTrad('config.subtitle'),\n defaultMessage: 'Define the view settings of the media library.',\n })}\n title={formatMessage({\n id: getTrad('config.title'),\n defaultMessage: 'Configure the view - Media Library',\n })}\n />\n <Layouts.Content>\n <Settings\n data-testid=\"settings\"\n pageSize={modifiedData.pageSize || ''}\n sort={modifiedData.sort || ''}\n onChange={handleChange}\n />\n </Layouts.Content>\n x\n <Dialog.Root open={showWarningSubmit} onOpenChange={toggleWarningSubmit}>\n <ConfirmDialog onConfirm={handleConfirm} variant=\"default\">\n {formatMessage({\n id: getTrad('config.popUpWarning.warning.updateAllSettings'),\n defaultMessage: 'This will modify all your settings',\n })}\n </ConfirmDialog>\n </Dialog.Root>\n </form>\n </Page.Main>\n </Layouts.Root>\n );\n};\n"],"names":["onChange","pageSize"],"mappings":"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"}
1
+ {"version":3,"file":"ConfigureTheView-BNDKMkvq.mjs","sources":["../../admin/src/pages/App/ConfigureTheView/components/Settings.tsx","../../admin/src/pages/App/ConfigureTheView/state/actionTypes.ts","../../admin/src/pages/App/ConfigureTheView/state/actions.ts","../../admin/src/pages/App/ConfigureTheView/state/init.ts","../../admin/src/pages/App/ConfigureTheView/state/reducer.ts","../../admin/src/pages/App/ConfigureTheView/ConfigureTheView.tsx"],"sourcesContent":["import { Box, Grid, SingleSelectOption, SingleSelect, Field } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { pageSizes, sortOptions } from '../../../../constants';\nimport { getTrad } from '../../../../utils';\n\nimport type { Configuration } from '../../../../../../shared/contracts/configuration';\n\ninterface SettingsProps {\n sort: string;\n pageSize: string | number;\n onChange: ({\n target: { name, value },\n }: {\n target: { name: keyof Configuration; value: string | number };\n }) => void;\n}\n\nconst Settings = ({ sort = '', pageSize = 10, onChange }: SettingsProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"tableShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n >\n <Grid.Root gap={4}>\n <Grid.Item s={12} col={6} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n hint={formatMessage({\n id: getTrad('config.entries.note'),\n defaultMessage: 'Number of assets displayed by default in the Media Library',\n })}\n name=\"pageSize\"\n >\n <Field.Label>\n {formatMessage({\n id: getTrad('config.entries.title'),\n defaultMessage: 'Entries per page',\n })}\n </Field.Label>\n <SingleSelect\n onChange={(value) => onChange({ target: { name: 'pageSize', value } })}\n value={pageSize}\n >\n {pageSizes.map((pageSize) => (\n <SingleSelectOption key={pageSize} value={pageSize}>\n {pageSize}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n <Field.Hint />\n </Field.Root>\n </Grid.Item>\n <Grid.Item s={12} col={6} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n hint={formatMessage({\n id: getTrad('config.note'),\n defaultMessage: 'Note: You can override this value in the media library.',\n })}\n name=\"sort\"\n >\n <Field.Label>\n {formatMessage({\n id: getTrad('config.sort.title'),\n defaultMessage: 'Default sort order',\n })}\n </Field.Label>\n <SingleSelect\n onChange={(value) => onChange({ target: { name: 'sort', value } })}\n value={sort}\n test-sort={sort}\n data-testid=\"sort-select\"\n >\n {sortOptions.map((filter) => (\n <SingleSelectOption\n data-testid={`sort-option-${filter.value}`}\n key={filter.key}\n value={filter.value}\n >\n {formatMessage({ id: getTrad(filter.key), defaultMessage: `${filter.value}` })}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n <Field.Hint />\n </Field.Root>\n </Grid.Item>\n </Grid.Root>\n </Box>\n );\n};\n\nexport { Settings };\n","import { pluginId } from '../../../../pluginId';\n\nexport const ON_CHANGE = `${pluginId}/ON_CHANGE`;\nexport const SET_LOADED = `${pluginId}/SET_LOADED`;\n","import { ON_CHANGE, SET_LOADED } from './actionTypes';\n\nimport type { InitialState } from './init';\n\nexport const onChange = ({\n name,\n value,\n}: {\n name: keyof NonNullable<InitialState['initialData']>;\n value: number | string;\n}) => ({\n type: ON_CHANGE,\n keys: name,\n value,\n});\n\nexport const setLoaded = () => ({\n type: SET_LOADED,\n});\n","import type { Configuration } from '../../../../../../shared/contracts/configuration';\n\nexport type InitialState = {\n initialData: Partial<Configuration>;\n modifiedData: Partial<Configuration>;\n};\n\nconst initialState: InitialState = {\n initialData: {},\n modifiedData: {},\n};\n\nconst init = (configData: InitialState['initialData']): InitialState => {\n return {\n ...initialState,\n initialData: configData,\n modifiedData: configData,\n };\n};\nexport { init, initialState };\n","import { produce } from 'immer'; // current\nimport get from 'lodash/get';\nimport set from 'lodash/set';\n\nimport { ON_CHANGE, SET_LOADED } from './actionTypes';\nimport { init, initialState } from './init';\n\nimport type { InitialState } from './init';\n\nexport interface ActionOnChange {\n type: string;\n keys?: string;\n value: string | number;\n}\n\nexport interface ActionSetLoaded {\n type: string;\n}\n\ninterface ActionInitialValue {\n type: string;\n}\n\nexport type Action = ActionSetLoaded | ActionOnChange | ActionInitialValue;\n\nexport const reducer = (\n state: InitialState = initialState,\n action: Action = {\n type: '',\n }\n) =>\n // eslint-disable-next-line consistent-return\n produce(state, (draftState) => {\n switch (action.type) {\n case ON_CHANGE: {\n if ('keys' in action && 'value' in action && action.keys) {\n set(draftState, ['modifiedData', ...action.keys.split('.')], action.value);\n }\n break;\n }\n case SET_LOADED: {\n // This action re-initialises the state using the current modifiedData.\n const reInitialise = init(get(draftState, ['modifiedData'], {}));\n draftState.initialData = reInitialise.initialData;\n draftState.modifiedData = reInitialise.modifiedData;\n break;\n }\n default:\n return draftState;\n }\n });\n","// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport {\n ConfirmDialog,\n useTracking,\n useNotification,\n Page,\n Layouts,\n} from '@strapi/admin/strapi-admin';\nimport { Button, Dialog, Link } from '@strapi/design-system';\nimport { ArrowLeft, Check } from '@strapi/icons';\nimport isEqual from 'lodash/isEqual';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\n\nimport { useConfig } from '../../../hooks/useConfig';\nimport { pluginId } from '../../../pluginId';\nimport { getTrad } from '../../../utils';\n\nimport { Settings } from './components/Settings';\nimport { onChange, setLoaded } from './state/actions';\nimport { init, initialState } from './state/init';\nimport { reducer } from './state/reducer';\n\nimport type { InitialState } from './state/init';\nimport type { Action } from './state/reducer';\nimport type { Configuration } from '../../../../../shared/contracts/configuration';\n\ninterface ConfigureTheViewProps {\n config: Configuration;\n}\n\nexport const ConfigureTheView = ({ config }: ConfigureTheViewProps) => {\n const { trackUsage } = useTracking();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { mutateConfig } = useConfig();\n const { isLoading: isSubmittingForm } = mutateConfig;\n\n const [showWarningSubmit, setWarningSubmit] = React.useState(false);\n const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);\n\n const [reducerState, dispatch] = React.useReducer(\n reducer,\n initialState,\n (): InitialState => init(config)\n );\n const typedDispatch: React.Dispatch<Action> = dispatch;\n const { initialData, modifiedData } = reducerState;\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n toggleWarningSubmit();\n };\n\n const handleConfirm = async () => {\n trackUsage('willEditMediaLibraryConfig');\n await mutateConfig.mutateAsync(modifiedData as Configuration);\n setWarningSubmit(false);\n typedDispatch(setLoaded());\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'notification.form.success.fields',\n defaultMessage: 'Changes saved',\n }),\n });\n };\n\n const handleChange = ({\n target: { name, value },\n }: {\n target: { name: keyof Configuration; value: string | number };\n }) => {\n typedDispatch(onChange({ name, value }));\n };\n\n return (\n <Layouts.Root>\n <Page.Main aria-busy={isSubmittingForm}>\n <form onSubmit={handleSubmit}>\n <Layouts.Header\n navigationAction={\n <Link\n tag={NavLink}\n startIcon={<ArrowLeft />}\n to={`/plugins/${pluginId}`}\n id=\"go-back\"\n >\n {formatMessage({ id: getTrad('config.back'), defaultMessage: 'Back' })}\n </Link>\n }\n primaryAction={\n <Button\n size=\"S\"\n startIcon={<Check />}\n disabled={isEqual(modifiedData, initialData)}\n type=\"submit\"\n >\n {formatMessage({ id: 'global.save', defaultMessage: 'Save' })}\n </Button>\n }\n subtitle={formatMessage({\n id: getTrad('config.subtitle'),\n defaultMessage: 'Define the view settings of the media library.',\n })}\n title={formatMessage({\n id: getTrad('config.title'),\n defaultMessage: 'Configure the view - Media Library',\n })}\n />\n <Layouts.Content>\n <Settings\n data-testid=\"settings\"\n pageSize={modifiedData.pageSize || ''}\n sort={modifiedData.sort || ''}\n onChange={handleChange}\n />\n </Layouts.Content>\n x\n <Dialog.Root open={showWarningSubmit} onOpenChange={toggleWarningSubmit}>\n <ConfirmDialog onConfirm={handleConfirm} variant=\"default\">\n {formatMessage({\n id: getTrad('config.popUpWarning.warning.updateAllSettings'),\n defaultMessage: 'This will modify all your settings',\n })}\n </ConfirmDialog>\n </Dialog.Root>\n </form>\n </Page.Main>\n </Layouts.Root>\n );\n};\n"],"names":["onChange","pageSize"],"mappings":"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"}
@@ -8,7 +8,7 @@ const icons = require("@strapi/icons");
8
8
  const isEqual = require("lodash/isEqual");
9
9
  const reactIntl = require("react-intl");
10
10
  const reactRouterDom = require("react-router-dom");
11
- const index = require("./index-DAyGguoD.js");
11
+ const index = require("./index-DGBFKgxl.js");
12
12
  require("byte-size");
13
13
  require("date-fns");
14
14
  require("qs");
@@ -249,4 +249,4 @@ const ConfigureTheView = ({ config }) => {
249
249
  ] }) }) });
250
250
  };
251
251
  exports.ConfigureTheView = ConfigureTheView;
252
- //# sourceMappingURL=ConfigureTheView-DVyAWFMA.js.map
252
+ //# sourceMappingURL=ConfigureTheView-DtkJsGUi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConfigureTheView-DVyAWFMA.js","sources":["../../admin/src/pages/App/ConfigureTheView/components/Settings.tsx","../../admin/src/pages/App/ConfigureTheView/state/actionTypes.ts","../../admin/src/pages/App/ConfigureTheView/state/actions.ts","../../admin/src/pages/App/ConfigureTheView/state/init.ts","../../admin/src/pages/App/ConfigureTheView/state/reducer.ts","../../admin/src/pages/App/ConfigureTheView/ConfigureTheView.tsx"],"sourcesContent":["import { Box, Grid, SingleSelectOption, SingleSelect, Field } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { pageSizes, sortOptions } from '../../../../constants';\nimport { getTrad } from '../../../../utils';\n\nimport type { Configuration } from '../../../../../../shared/contracts/configuration';\n\ninterface SettingsProps {\n sort: string;\n pageSize: string | number;\n onChange: ({\n target: { name, value },\n }: {\n target: { name: keyof Configuration; value: string | number };\n }) => void;\n}\n\nconst Settings = ({ sort = '', pageSize = 10, onChange }: SettingsProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"tableShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n >\n <Grid.Root gap={4}>\n <Grid.Item s={12} col={6} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n hint={formatMessage({\n id: getTrad('config.entries.note'),\n defaultMessage: 'Number of assets displayed by default in the Media Library',\n })}\n name=\"pageSize\"\n >\n <Field.Label>\n {formatMessage({\n id: getTrad('config.entries.title'),\n defaultMessage: 'Entries per page',\n })}\n </Field.Label>\n <SingleSelect\n onChange={(value) => onChange({ target: { name: 'pageSize', value } })}\n value={pageSize}\n >\n {pageSizes.map((pageSize) => (\n <SingleSelectOption key={pageSize} value={pageSize}>\n {pageSize}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n <Field.Hint />\n </Field.Root>\n </Grid.Item>\n <Grid.Item s={12} col={6} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n hint={formatMessage({\n id: getTrad('config.note'),\n defaultMessage: 'Note: You can override this value in the media library.',\n })}\n name=\"sort\"\n >\n <Field.Label>\n {formatMessage({\n id: getTrad('config.sort.title'),\n defaultMessage: 'Default sort order',\n })}\n </Field.Label>\n <SingleSelect\n onChange={(value) => onChange({ target: { name: 'sort', value } })}\n value={sort}\n test-sort={sort}\n data-testid=\"sort-select\"\n >\n {sortOptions.map((filter) => (\n <SingleSelectOption\n data-testid={`sort-option-${filter.value}`}\n key={filter.key}\n value={filter.value}\n >\n {formatMessage({ id: getTrad(filter.key), defaultMessage: `${filter.value}` })}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n <Field.Hint />\n </Field.Root>\n </Grid.Item>\n </Grid.Root>\n </Box>\n );\n};\n\nexport { Settings };\n","import { pluginId } from '../../../../pluginId';\n\nexport const ON_CHANGE = `${pluginId}/ON_CHANGE`;\nexport const SET_LOADED = `${pluginId}/SET_LOADED`;\n","import { ON_CHANGE, SET_LOADED } from './actionTypes';\n\nimport type { InitialState } from './init';\n\nexport const onChange = ({\n name,\n value,\n}: {\n name: keyof NonNullable<InitialState['initialData']>;\n value: number | string;\n}) => ({\n type: ON_CHANGE,\n keys: name,\n value,\n});\n\nexport const setLoaded = () => ({\n type: SET_LOADED,\n});\n","import type { Configuration } from '../../../../../../shared/contracts/configuration';\n\nexport type InitialState = {\n initialData: Partial<Configuration>;\n modifiedData: Partial<Configuration>;\n};\n\nconst initialState: InitialState = {\n initialData: {},\n modifiedData: {},\n};\n\nconst init = (configData: InitialState['initialData']): InitialState => {\n return {\n ...initialState,\n initialData: configData,\n modifiedData: configData,\n };\n};\nexport { init, initialState };\n","import { produce } from 'immer'; // current\nimport get from 'lodash/get';\nimport set from 'lodash/set';\n\nimport { ON_CHANGE, SET_LOADED } from './actionTypes';\nimport { init, initialState } from './init';\n\nimport type { InitialState } from './init';\n\nexport interface ActionOnChange {\n type: string;\n keys?: string;\n value: string | number;\n}\n\nexport interface ActionSetLoaded {\n type: string;\n}\n\ninterface ActionInitialValue {\n type: string;\n}\n\nexport type Action = ActionSetLoaded | ActionOnChange | ActionInitialValue;\n\nexport const reducer = (\n state: InitialState = initialState,\n action: Action = {\n type: '',\n }\n) =>\n // eslint-disable-next-line consistent-return\n produce(state, (draftState) => {\n switch (action.type) {\n case ON_CHANGE: {\n if ('keys' in action && 'value' in action && action.keys) {\n set(draftState, ['modifiedData', ...action.keys.split('.')], action.value);\n }\n break;\n }\n case SET_LOADED: {\n // This action re-initialises the state using the current modifiedData.\n const reInitialise = init(get(draftState, ['modifiedData'], {}));\n draftState.initialData = reInitialise.initialData;\n draftState.modifiedData = reInitialise.modifiedData;\n break;\n }\n default:\n return draftState;\n }\n });\n","// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport {\n ConfirmDialog,\n useTracking,\n useNotification,\n Page,\n Layouts,\n} from '@strapi/admin/strapi-admin';\nimport { Button, Dialog, Link } from '@strapi/design-system';\nimport { ArrowLeft, Check } from '@strapi/icons';\nimport isEqual from 'lodash/isEqual';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\n\nimport { useConfig } from '../../../hooks/useConfig';\nimport { pluginId } from '../../../pluginId';\nimport { getTrad } from '../../../utils';\n\nimport { Settings } from './components/Settings';\nimport { onChange, setLoaded } from './state/actions';\nimport { init, initialState } from './state/init';\nimport { reducer } from './state/reducer';\n\nimport type { InitialState } from './state/init';\nimport type { Action } from './state/reducer';\nimport type { Configuration } from '../../../../../shared/contracts/configuration';\n\ninterface ConfigureTheViewProps {\n config: Configuration;\n}\n\nexport const ConfigureTheView = ({ config }: ConfigureTheViewProps) => {\n const { trackUsage } = useTracking();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { mutateConfig } = useConfig();\n const { isLoading: isSubmittingForm } = mutateConfig;\n\n const [showWarningSubmit, setWarningSubmit] = React.useState(false);\n const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);\n\n const [reducerState, dispatch] = React.useReducer(\n reducer,\n initialState,\n (): InitialState => init(config)\n );\n const typedDispatch: React.Dispatch<Action> = dispatch;\n const { initialData, modifiedData } = reducerState;\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n toggleWarningSubmit();\n };\n\n const handleConfirm = async () => {\n trackUsage('willEditMediaLibraryConfig');\n await mutateConfig.mutateAsync(modifiedData as Configuration);\n setWarningSubmit(false);\n typedDispatch(setLoaded());\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'notification.form.success.fields',\n defaultMessage: 'Changes saved',\n }),\n });\n };\n\n const handleChange = ({\n target: { name, value },\n }: {\n target: { name: keyof Configuration; value: string | number };\n }) => {\n typedDispatch(onChange({ name, value }));\n };\n\n return (\n <Layouts.Root>\n <Page.Main aria-busy={isSubmittingForm}>\n <form onSubmit={handleSubmit}>\n <Layouts.Header\n navigationAction={\n <Link\n tag={NavLink}\n startIcon={<ArrowLeft />}\n to={`/plugins/${pluginId}`}\n id=\"go-back\"\n >\n {formatMessage({ id: getTrad('config.back'), defaultMessage: 'Back' })}\n </Link>\n }\n primaryAction={\n <Button\n size=\"S\"\n startIcon={<Check />}\n disabled={isEqual(modifiedData, initialData)}\n type=\"submit\"\n >\n {formatMessage({ id: 'global.save', defaultMessage: 'Save' })}\n </Button>\n }\n subtitle={formatMessage({\n id: getTrad('config.subtitle'),\n defaultMessage: 'Define the view settings of the media library.',\n })}\n title={formatMessage({\n id: getTrad('config.title'),\n defaultMessage: 'Configure the view - Media Library',\n })}\n />\n <Layouts.Content>\n <Settings\n data-testid=\"settings\"\n pageSize={modifiedData.pageSize || ''}\n sort={modifiedData.sort || ''}\n onChange={handleChange}\n />\n </Layouts.Content>\n x\n <Dialog.Root open={showWarningSubmit} onOpenChange={toggleWarningSubmit}>\n <ConfirmDialog onConfirm={handleConfirm} variant=\"default\">\n {formatMessage({\n id: getTrad('config.popUpWarning.warning.updateAllSettings'),\n defaultMessage: 'This will modify all your settings',\n })}\n </ConfirmDialog>\n </Dialog.Root>\n </form>\n </Page.Main>\n </Layouts.Root>\n );\n};\n"],"names":["onChange","useIntl","jsx","Box","jsxs","Grid","Field","getTrad","SingleSelect","pageSizes","pageSize","SingleSelectOption","sortOptions","pluginId","produce","set","get","useTracking","useNotification","useConfig","React","Layouts","Page","Link","NavLink","ArrowLeft","Button","Check","isEqual","Dialog","ConfirmDialog"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,MAAM,WAAW,CAAC,EAAE,OAAO,IAAI,WAAW,IAAI,UAAAA,gBAA8B;AACpE,QAAA,EAAE,cAAc,IAAIC,kBAAQ;AAGhC,SAAAC,2BAAA;AAAA,IAACC,aAAA;AAAA,IAAA;AAAA,MACC,YAAW;AAAA,MACX,WAAS;AAAA,MACT,QAAO;AAAA,MACP,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,aAAa;AAAA,MACb,cAAc;AAAA,MAEd,UAACC,2BAAA,KAAAC,kBAAK,MAAL,EAAU,KAAK,GACd,UAAA;AAAA,QAACH,2BAAAA,IAAAG,aAAAA,KAAK,MAAL,EAAU,GAAG,IAAI,KAAK,GAAG,WAAU,UAAS,YAAW,WACtD,UAAAD,2BAAA;AAAA,UAACE,aAAAA,MAAM;AAAA,UAAN;AAAA,YACC,MAAM,cAAc;AAAA,cAClB,IAAIC,cAAQ,qBAAqB;AAAA,cACjC,gBAAgB;AAAA,YAAA,CACjB;AAAA,YACD,MAAK;AAAA,YAEL,UAAA;AAAA,cAACL,2BAAAA,IAAAI,aAAAA,MAAM,OAAN,EACE,UAAc,cAAA;AAAA,gBACb,IAAIC,cAAQ,sBAAsB;AAAA,gBAClC,gBAAgB;AAAA,cACjB,CAAA,GACH;AAAA,cACAL,2BAAA;AAAA,gBAACM,aAAA;AAAA,gBAAA;AAAA,kBACC,UAAU,CAAC,UAAUR,UAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,MAAM,GAAG;AAAA,kBACrE,OAAO;AAAA,kBAEN,UAAAS,MAAAA,UAAU,IAAI,CAACC,cACdR,2BAAAA,IAACS,aAAAA,oBAAkC,EAAA,OAAOD,WACvC,UAAAA,UADsBA,GAAAA,SAEzB,CACD;AAAA,gBAAA;AAAA,cACH;AAAA,cACAR,+BAACI,aAAAA,MAAM,MAAN,CAAW,CAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA,GAEhB;AAAA,QACAJ,2BAAAA,IAACG,aAAAA,KAAK,MAAL,EAAU,GAAG,IAAI,KAAK,GAAG,WAAU,UAAS,YAAW,WACtD,UAAAD,2BAAA;AAAA,UAACE,aAAAA,MAAM;AAAA,UAAN;AAAA,YACC,MAAM,cAAc;AAAA,cAClB,IAAIC,cAAQ,aAAa;AAAA,cACzB,gBAAgB;AAAA,YAAA,CACjB;AAAA,YACD,MAAK;AAAA,YAEL,UAAA;AAAA,cAACL,2BAAAA,IAAAI,aAAAA,MAAM,OAAN,EACE,UAAc,cAAA;AAAA,gBACb,IAAIC,cAAQ,mBAAmB;AAAA,gBAC/B,gBAAgB;AAAA,cACjB,CAAA,GACH;AAAA,cACAL,2BAAA;AAAA,gBAACM,aAAA;AAAA,gBAAA;AAAA,kBACC,UAAU,CAAC,UAAUR,UAAS,EAAE,QAAQ,EAAE,MAAM,QAAQ,MAAM,GAAG;AAAA,kBACjE,OAAO;AAAA,kBACP,aAAW;AAAA,kBACX,eAAY;AAAA,kBAEX,UAAAY,MAAA,YAAY,IAAI,CAAC,WAChBV,2BAAA;AAAA,oBAACS,aAAA;AAAA,oBAAA;AAAA,sBACC,eAAa,eAAe,OAAO,KAAK;AAAA,sBAExC,OAAO,OAAO;AAAA,sBAEb,UAAc,cAAA,EAAE,IAAIJ,MAAA,QAAQ,OAAO,GAAG,GAAG,gBAAgB,GAAG,OAAO,KAAK,GAAI,CAAA;AAAA,oBAAA;AAAA,oBAHxE,OAAO;AAAA,kBAKf,CAAA;AAAA,gBAAA;AAAA,cACH;AAAA,cACAL,+BAACI,aAAAA,MAAM,MAAN,CAAW,CAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA,EAEhB,CAAA;AAAA,MAAA,EACF,CAAA;AAAA,IAAA;AAAA,EACF;AAEJ;AC7Fa,MAAA,YAAY,GAAGO,MAAQ,QAAA;AACvB,MAAA,aAAa,GAAGA,MAAQ,QAAA;ACC9B,MAAM,WAAW,CAAC;AAAA,EACvB;AAAA,EACA;AACF,OAGO;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN;AACF;AAEO,MAAM,YAAY,OAAO;AAAA,EAC9B,MAAM;AACR;ACXA,MAAM,eAA6B;AAAA,EACjC,aAAa,CAAC;AAAA,EACd,cAAc,CAAA;AAChB;AAEA,MAAM,OAAO,CAAC,eAA0D;AAC/D,SAAA;AAAA,IACL,GAAG;AAAA,IACH,aAAa;AAAA,IACb,cAAc;AAAA,EAChB;AACF;ACOO,MAAM,UAAU,CACrB,QAAsB,cACtB,SAAiB;AAAA,EACf,MAAM;AACR;AAAA;AAAA,EAGAC,cAAQ,OAAO,CAAC,eAAe;AAC7B,YAAQ,OAAO,MAAM;AAAA,MACnB,KAAK,WAAW;AACd,YAAI,UAAU,UAAU,WAAW,UAAU,OAAO,MAAM;AACpDC,uBAAAA,QAAA,YAAY,CAAC,gBAAgB,GAAG,OAAO,KAAK,MAAM,GAAG,CAAC,GAAG,OAAO,KAAK;AAAA,QAAA;AAE3E;AAAA,MAAA;AAAA,MAEF,KAAK,YAAY;AAET,cAAA,eAAe,KAAKC,aAAI,QAAA,YAAY,CAAC,cAAc,GAAG,CAAA,CAAE,CAAC;AAC/D,mBAAW,cAAc,aAAa;AACtC,mBAAW,eAAe,aAAa;AACvC;AAAA,MAAA;AAAA,MAEF;AACS,eAAA;AAAA,IAAA;AAAA,EAEZ,CAAA;AAAA;ACjBI,MAAM,mBAAmB,CAAC,EAAE,aAAoC;AAC/D,QAAA,EAAE,WAAW,IAAIC,wBAAY;AAC7B,QAAA,EAAE,cAAc,IAAIhB,kBAAQ;AAC5B,QAAA,EAAE,mBAAmB,IAAIiB,4BAAgB;AACzC,QAAA,EAAE,aAAa,IAAIC,gBAAU;AAC7B,QAAA,EAAE,WAAW,iBAAA,IAAqB;AAExC,QAAM,CAAC,mBAAmB,gBAAgB,IAAIC,iBAAM,SAAS,KAAK;AAClE,QAAM,sBAAsB,MAAM,iBAAiB,CAAC,cAAc,CAAC,SAAS;AAE5E,QAAM,CAAC,cAAc,QAAQ,IAAIA,iBAAM;AAAA,IACrC;AAAA,IACA;AAAA,IACA,MAAoB,KAAK,MAAM;AAAA,EACjC;AACA,QAAM,gBAAwC;AACxC,QAAA,EAAE,aAAa,aAAA,IAAiB;AAEhC,QAAA,eAAe,CAAC,MAAwC;AAC5D,MAAE,eAAe;AACG,wBAAA;AAAA,EACtB;AAEA,QAAM,gBAAgB,YAAY;AAChC,eAAW,4BAA4B;AACjC,UAAA,aAAa,YAAY,YAA6B;AAC5D,qBAAiB,KAAK;AACtB,kBAAc,WAAW;AACN,uBAAA;AAAA,MACjB,MAAM;AAAA,MACN,SAAS,cAAc;AAAA,QACrB,IAAI;AAAA,QACJ,gBAAgB;AAAA,MACjB,CAAA;AAAA,IAAA,CACF;AAAA,EACH;AAEA,QAAM,eAAe,CAAC;AAAA,IACpB,QAAQ,EAAE,MAAM,MAAM;AAAA,EAAA,MAGlB;AACJ,kBAAc,SAAS,EAAE,MAAM,MAAO,CAAA,CAAC;AAAA,EACzC;AAEA,SACGlB,2BAAAA,IAAAmB,YAAAA,QAAQ,MAAR,EACC,UAACnB,2BAAAA,IAAAoB,YAAAA,KAAK,MAAL,EAAU,aAAW,kBACpB,UAAClB,2BAAA,KAAA,QAAA,EAAK,UAAU,cACd,UAAA;AAAA,IAAAF,2BAAA;AAAA,MAACmB,YAAAA,QAAQ;AAAA,MAAR;AAAA,QACC,kBACEnB,2BAAA;AAAA,UAACqB,aAAA;AAAA,UAAA;AAAA,YACC,KAAKC,eAAA;AAAA,YACL,0CAAYC,MAAU,WAAA,EAAA;AAAA,YACtB,IAAI,YAAYZ,MAAAA,QAAQ;AAAA,YACxB,IAAG;AAAA,YAEF,UAAA,cAAc,EAAE,IAAIN,MAAA,QAAQ,aAAa,GAAG,gBAAgB,OAAQ,CAAA;AAAA,UAAA;AAAA,QACvE;AAAA,QAEF,eACEL,2BAAA;AAAA,UAACwB,aAAA;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,0CAAYC,MAAM,OAAA,EAAA;AAAA,YAClB,UAAUC,iBAAAA,QAAQ,cAAc,WAAW;AAAA,YAC3C,MAAK;AAAA,YAEJ,wBAAc,EAAE,IAAI,eAAe,gBAAgB,OAAQ,CAAA;AAAA,UAAA;AAAA,QAC9D;AAAA,QAEF,UAAU,cAAc;AAAA,UACtB,IAAIrB,cAAQ,iBAAiB;AAAA,UAC7B,gBAAgB;AAAA,QAAA,CACjB;AAAA,QACD,OAAO,cAAc;AAAA,UACnB,IAAIA,cAAQ,cAAc;AAAA,UAC1B,gBAAgB;AAAA,QACjB,CAAA;AAAA,MAAA;AAAA,IACH;AAAA,IACAL,2BAAAA,IAACmB,YAAQ,QAAA,SAAR,EACC,UAAAnB,2BAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,eAAY;AAAA,QACZ,UAAU,aAAa,YAAY;AAAA,QACnC,MAAM,aAAa,QAAQ;AAAA,QAC3B,UAAU;AAAA,MAAA;AAAA,IAAA,GAEd;AAAA,IAAkB;AAAA,IAEjBA,2BAAA,IAAA2B,aAAA,OAAO,MAAP,EAAY,MAAM,mBAAmB,cAAc,qBAClD,UAAA3B,2BAAAA,IAAC4B,YAAAA,eAAc,EAAA,WAAW,eAAe,SAAQ,WAC9C,UAAc,cAAA;AAAA,MACb,IAAIvB,cAAQ,+CAA+C;AAAA,MAC3D,gBAAgB;AAAA,IACjB,CAAA,EACH,CAAA,EACF,CAAA;AAAA,EAAA,EACF,CAAA,EACF,CAAA,GACF;AAEJ;;"}
1
+ {"version":3,"file":"ConfigureTheView-DtkJsGUi.js","sources":["../../admin/src/pages/App/ConfigureTheView/components/Settings.tsx","../../admin/src/pages/App/ConfigureTheView/state/actionTypes.ts","../../admin/src/pages/App/ConfigureTheView/state/actions.ts","../../admin/src/pages/App/ConfigureTheView/state/init.ts","../../admin/src/pages/App/ConfigureTheView/state/reducer.ts","../../admin/src/pages/App/ConfigureTheView/ConfigureTheView.tsx"],"sourcesContent":["import { Box, Grid, SingleSelectOption, SingleSelect, Field } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { pageSizes, sortOptions } from '../../../../constants';\nimport { getTrad } from '../../../../utils';\n\nimport type { Configuration } from '../../../../../../shared/contracts/configuration';\n\ninterface SettingsProps {\n sort: string;\n pageSize: string | number;\n onChange: ({\n target: { name, value },\n }: {\n target: { name: keyof Configuration; value: string | number };\n }) => void;\n}\n\nconst Settings = ({ sort = '', pageSize = 10, onChange }: SettingsProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"tableShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n >\n <Grid.Root gap={4}>\n <Grid.Item s={12} col={6} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n hint={formatMessage({\n id: getTrad('config.entries.note'),\n defaultMessage: 'Number of assets displayed by default in the Media Library',\n })}\n name=\"pageSize\"\n >\n <Field.Label>\n {formatMessage({\n id: getTrad('config.entries.title'),\n defaultMessage: 'Entries per page',\n })}\n </Field.Label>\n <SingleSelect\n onChange={(value) => onChange({ target: { name: 'pageSize', value } })}\n value={pageSize}\n >\n {pageSizes.map((pageSize) => (\n <SingleSelectOption key={pageSize} value={pageSize}>\n {pageSize}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n <Field.Hint />\n </Field.Root>\n </Grid.Item>\n <Grid.Item s={12} col={6} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n hint={formatMessage({\n id: getTrad('config.note'),\n defaultMessage: 'Note: You can override this value in the media library.',\n })}\n name=\"sort\"\n >\n <Field.Label>\n {formatMessage({\n id: getTrad('config.sort.title'),\n defaultMessage: 'Default sort order',\n })}\n </Field.Label>\n <SingleSelect\n onChange={(value) => onChange({ target: { name: 'sort', value } })}\n value={sort}\n test-sort={sort}\n data-testid=\"sort-select\"\n >\n {sortOptions.map((filter) => (\n <SingleSelectOption\n data-testid={`sort-option-${filter.value}`}\n key={filter.key}\n value={filter.value}\n >\n {formatMessage({ id: getTrad(filter.key), defaultMessage: `${filter.value}` })}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n <Field.Hint />\n </Field.Root>\n </Grid.Item>\n </Grid.Root>\n </Box>\n );\n};\n\nexport { Settings };\n","import { pluginId } from '../../../../pluginId';\n\nexport const ON_CHANGE = `${pluginId}/ON_CHANGE`;\nexport const SET_LOADED = `${pluginId}/SET_LOADED`;\n","import { ON_CHANGE, SET_LOADED } from './actionTypes';\n\nimport type { InitialState } from './init';\n\nexport const onChange = ({\n name,\n value,\n}: {\n name: keyof NonNullable<InitialState['initialData']>;\n value: number | string;\n}) => ({\n type: ON_CHANGE,\n keys: name,\n value,\n});\n\nexport const setLoaded = () => ({\n type: SET_LOADED,\n});\n","import type { Configuration } from '../../../../../../shared/contracts/configuration';\n\nexport type InitialState = {\n initialData: Partial<Configuration>;\n modifiedData: Partial<Configuration>;\n};\n\nconst initialState: InitialState = {\n initialData: {},\n modifiedData: {},\n};\n\nconst init = (configData: InitialState['initialData']): InitialState => {\n return {\n ...initialState,\n initialData: configData,\n modifiedData: configData,\n };\n};\nexport { init, initialState };\n","import { produce } from 'immer'; // current\nimport get from 'lodash/get';\nimport set from 'lodash/set';\n\nimport { ON_CHANGE, SET_LOADED } from './actionTypes';\nimport { init, initialState } from './init';\n\nimport type { InitialState } from './init';\n\nexport interface ActionOnChange {\n type: string;\n keys?: string;\n value: string | number;\n}\n\nexport interface ActionSetLoaded {\n type: string;\n}\n\ninterface ActionInitialValue {\n type: string;\n}\n\nexport type Action = ActionSetLoaded | ActionOnChange | ActionInitialValue;\n\nexport const reducer = (\n state: InitialState = initialState,\n action: Action = {\n type: '',\n }\n) =>\n // eslint-disable-next-line consistent-return\n produce(state, (draftState) => {\n switch (action.type) {\n case ON_CHANGE: {\n if ('keys' in action && 'value' in action && action.keys) {\n set(draftState, ['modifiedData', ...action.keys.split('.')], action.value);\n }\n break;\n }\n case SET_LOADED: {\n // This action re-initialises the state using the current modifiedData.\n const reInitialise = init(get(draftState, ['modifiedData'], {}));\n draftState.initialData = reInitialise.initialData;\n draftState.modifiedData = reInitialise.modifiedData;\n break;\n }\n default:\n return draftState;\n }\n });\n","// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport {\n ConfirmDialog,\n useTracking,\n useNotification,\n Page,\n Layouts,\n} from '@strapi/admin/strapi-admin';\nimport { Button, Dialog, Link } from '@strapi/design-system';\nimport { ArrowLeft, Check } from '@strapi/icons';\nimport isEqual from 'lodash/isEqual';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\n\nimport { useConfig } from '../../../hooks/useConfig';\nimport { pluginId } from '../../../pluginId';\nimport { getTrad } from '../../../utils';\n\nimport { Settings } from './components/Settings';\nimport { onChange, setLoaded } from './state/actions';\nimport { init, initialState } from './state/init';\nimport { reducer } from './state/reducer';\n\nimport type { InitialState } from './state/init';\nimport type { Action } from './state/reducer';\nimport type { Configuration } from '../../../../../shared/contracts/configuration';\n\ninterface ConfigureTheViewProps {\n config: Configuration;\n}\n\nexport const ConfigureTheView = ({ config }: ConfigureTheViewProps) => {\n const { trackUsage } = useTracking();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { mutateConfig } = useConfig();\n const { isLoading: isSubmittingForm } = mutateConfig;\n\n const [showWarningSubmit, setWarningSubmit] = React.useState(false);\n const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);\n\n const [reducerState, dispatch] = React.useReducer(\n reducer,\n initialState,\n (): InitialState => init(config)\n );\n const typedDispatch: React.Dispatch<Action> = dispatch;\n const { initialData, modifiedData } = reducerState;\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n toggleWarningSubmit();\n };\n\n const handleConfirm = async () => {\n trackUsage('willEditMediaLibraryConfig');\n await mutateConfig.mutateAsync(modifiedData as Configuration);\n setWarningSubmit(false);\n typedDispatch(setLoaded());\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'notification.form.success.fields',\n defaultMessage: 'Changes saved',\n }),\n });\n };\n\n const handleChange = ({\n target: { name, value },\n }: {\n target: { name: keyof Configuration; value: string | number };\n }) => {\n typedDispatch(onChange({ name, value }));\n };\n\n return (\n <Layouts.Root>\n <Page.Main aria-busy={isSubmittingForm}>\n <form onSubmit={handleSubmit}>\n <Layouts.Header\n navigationAction={\n <Link\n tag={NavLink}\n startIcon={<ArrowLeft />}\n to={`/plugins/${pluginId}`}\n id=\"go-back\"\n >\n {formatMessage({ id: getTrad('config.back'), defaultMessage: 'Back' })}\n </Link>\n }\n primaryAction={\n <Button\n size=\"S\"\n startIcon={<Check />}\n disabled={isEqual(modifiedData, initialData)}\n type=\"submit\"\n >\n {formatMessage({ id: 'global.save', defaultMessage: 'Save' })}\n </Button>\n }\n subtitle={formatMessage({\n id: getTrad('config.subtitle'),\n defaultMessage: 'Define the view settings of the media library.',\n })}\n title={formatMessage({\n id: getTrad('config.title'),\n defaultMessage: 'Configure the view - Media Library',\n })}\n />\n <Layouts.Content>\n <Settings\n data-testid=\"settings\"\n pageSize={modifiedData.pageSize || ''}\n sort={modifiedData.sort || ''}\n onChange={handleChange}\n />\n </Layouts.Content>\n x\n <Dialog.Root open={showWarningSubmit} onOpenChange={toggleWarningSubmit}>\n <ConfirmDialog onConfirm={handleConfirm} variant=\"default\">\n {formatMessage({\n id: getTrad('config.popUpWarning.warning.updateAllSettings'),\n defaultMessage: 'This will modify all your settings',\n })}\n </ConfirmDialog>\n </Dialog.Root>\n </form>\n </Page.Main>\n </Layouts.Root>\n );\n};\n"],"names":["onChange","useIntl","jsx","Box","jsxs","Grid","Field","getTrad","SingleSelect","pageSizes","pageSize","SingleSelectOption","sortOptions","pluginId","produce","set","get","useTracking","useNotification","useConfig","React","Layouts","Page","Link","NavLink","ArrowLeft","Button","Check","isEqual","Dialog","ConfirmDialog"],"mappings":"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"}
@@ -8,7 +8,7 @@ const icons = require("@strapi/icons");
8
8
  const isEqual = require("lodash/isEqual");
9
9
  const reactIntl = require("react-intl");
10
10
  const reactQuery = require("react-query");
11
- const index = require("./index-DAyGguoD.js");
11
+ const index = require("./index-DGBFKgxl.js");
12
12
  require("byte-size");
13
13
  require("date-fns");
14
14
  require("qs");
@@ -282,4 +282,4 @@ const SettingsPage = () => {
282
282
  const ProtectedSettingsPage = () => /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Protect, { permissions: index.PERMISSIONS.settings, children: /* @__PURE__ */ jsxRuntime.jsx(SettingsPage, {}) });
283
283
  exports.ProtectedSettingsPage = ProtectedSettingsPage;
284
284
  exports.SettingsPage = SettingsPage;
285
- //# sourceMappingURL=SettingsPage-RMoqCzdS.js.map
285
+ //# sourceMappingURL=SettingsPage-DdN_brUU.js.map