@strapi/upload 5.51.0 → 5.51.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.
- package/dist/admin/future/pages/Assets/AssetsPage.js +198 -129
- package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
- package/dist/admin/future/pages/Assets/AssetsPage.mjs +199 -130
- package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js +158 -19
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +159 -20
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsTable.js +212 -37
- package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +213 -38
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +252 -0
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +250 -0
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js +209 -0
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs +207 -0
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js +111 -36
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +113 -38
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js +120 -13
- package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs +120 -13
- package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js +71 -0
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs +69 -0
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.js +34 -0
- package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.mjs +32 -0
- package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/dndIds.js +15 -0
- package/dist/admin/future/pages/Assets/components/Dnd/dndIds.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/dndIds.mjs +13 -1
- package/dist/admin/future/pages/Assets/components/Dnd/dndIds.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js +19 -25
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs +19 -25
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.js +35 -0
- package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.mjs +33 -0
- package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js +120 -22
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +121 -23
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.js +22 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.mjs +19 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/SortMenu.js +165 -0
- package/dist/admin/future/pages/Assets/components/SortMenu.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/SortMenu.mjs +163 -0
- package/dist/admin/future/pages/Assets/components/SortMenu.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js +59 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs +55 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useListSort.js +124 -0
- package/dist/admin/future/pages/Assets/hooks/useListSort.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useListSort.mjs +120 -0
- package/dist/admin/future/pages/Assets/hooks/useListSort.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/utils/listQueryKey.js +29 -0
- package/dist/admin/future/pages/Assets/utils/listQueryKey.js.map +1 -0
- package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs +27 -0
- package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/utils/mergeMixedList.js +84 -0
- package/dist/admin/future/pages/Assets/utils/mergeMixedList.js.map +1 -0
- package/dist/admin/future/pages/Assets/utils/mergeMixedList.mjs +81 -0
- package/dist/admin/future/pages/Assets/utils/mergeMixedList.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/utils/selection.js +104 -0
- package/dist/admin/future/pages/Assets/utils/selection.js.map +1 -0
- package/dist/admin/future/pages/Assets/utils/selection.mjs +94 -0
- package/dist/admin/future/pages/Assets/utils/selection.mjs.map +1 -0
- package/dist/admin/future/services/assets.js +33 -1
- package/dist/admin/future/services/assets.js.map +1 -1
- package/dist/admin/future/services/assets.mjs +33 -2
- package/dist/admin/future/services/assets.mjs.map +1 -1
- package/dist/admin/future/services/folders.js +3 -3
- package/dist/admin/future/services/folders.js.map +1 -1
- package/dist/admin/future/services/folders.mjs +3 -3
- package/dist/admin/future/services/folders.mjs.map +1 -1
- package/dist/admin/future/utils/buildDragSetFromSelection.js +33 -0
- package/dist/admin/future/utils/buildDragSetFromSelection.js.map +1 -0
- package/dist/admin/future/utils/buildDragSetFromSelection.mjs +31 -0
- package/dist/admin/future/utils/buildDragSetFromSelection.mjs.map +1 -0
- package/dist/admin/future/utils/canDropItemOnFolder.js +4 -0
- package/dist/admin/future/utils/canDropItemOnFolder.js.map +1 -1
- package/dist/admin/future/utils/canDropItemOnFolder.mjs +4 -0
- package/dist/admin/future/utils/canDropItemOnFolder.mjs.map +1 -1
- package/dist/admin/future/utils/flattenFolderStructure.js +28 -0
- package/dist/admin/future/utils/flattenFolderStructure.js.map +1 -0
- package/dist/admin/future/utils/flattenFolderStructure.mjs +26 -0
- package/dist/admin/future/utils/flattenFolderStructure.mjs.map +1 -0
- package/dist/admin/future/utils/formatMoveSuccessMessage.js +19 -0
- package/dist/admin/future/utils/formatMoveSuccessMessage.js.map +1 -0
- package/dist/admin/future/utils/formatMoveSuccessMessage.mjs +17 -0
- package/dist/admin/future/utils/formatMoveSuccessMessage.mjs.map +1 -0
- package/dist/admin/future/utils/getFolderLabel.js +31 -0
- package/dist/admin/future/utils/getFolderLabel.js.map +1 -0
- package/dist/admin/future/utils/getFolderLabel.mjs +29 -0
- package/dist/admin/future/utils/getFolderLabel.mjs.map +1 -0
- package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +7 -1
- package/dist/admin/src/future/pages/Assets/components/BulkActionsBar.d.ts +1 -0
- package/dist/admin/src/future/pages/Assets/components/BulkMoveDialog.d.ts +13 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/AssetsDndProvider.d.ts +2 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/DragOverlayChip.d.ts +2 -2
- package/dist/admin/src/future/pages/Assets/components/Dnd/buildDragSet.d.ts +17 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/computeValidDropTargets.d.ts +7 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/dndIds.d.ts +3 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/useAssetDnd.d.ts +3 -1
- package/dist/admin/src/future/pages/Assets/components/Dnd/useFolderTreeDroppable.d.ts +19 -0
- package/dist/admin/src/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.d.ts +6 -0
- package/dist/admin/src/future/pages/Assets/components/SortMenu.d.ts +17 -0
- package/dist/admin/src/future/pages/Assets/hooks/useAssetSelection.d.ts +39 -0
- package/dist/admin/src/future/pages/Assets/hooks/useListSort.d.ts +47 -0
- package/dist/admin/src/future/pages/Assets/utils/listQueryKey.d.ts +30 -0
- package/dist/admin/src/future/pages/Assets/utils/mergeMixedList.d.ts +40 -0
- package/dist/admin/src/future/pages/Assets/utils/selection.d.ts +50 -0
- package/dist/admin/src/future/services/assets.d.ts +4 -1
- package/dist/admin/src/future/services/folders.d.ts +4 -1
- package/dist/admin/src/future/types/dnd.d.ts +5 -0
- package/dist/admin/src/future/utils/buildDragSetFromSelection.d.ts +11 -0
- package/dist/admin/src/future/utils/canDropItemOnFolder.d.ts +1 -1
- package/dist/admin/src/future/utils/flattenFolderStructure.d.ts +18 -0
- package/dist/admin/src/future/utils/formatMoveSuccessMessage.d.ts +14 -0
- package/dist/admin/src/future/utils/getFolderLabel.d.ts +11 -0
- package/dist/admin/translations/en.json.js +33 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +33 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/shared/contracts/folders.d.ts +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetsDndProvider.mjs","sources":["../../../../../../../admin/src/future/pages/Assets/components/Dnd/AssetsDndProvider.tsx"],"sourcesContent":["import { createContext, useCallback, useContext, useMemo, useState, type ReactNode } from 'react';\n\nimport {\n DndContext,\n DragOverlay,\n PointerSensor,\n pointerWithin,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragStartEvent,\n} from '@dnd-kit/core';\nimport { useNotification } from '@strapi/admin/strapi-admin';\nimport { Box, VisuallyHidden } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { useBulkMoveMutation, useGetFolderStructureQuery } from '../../../../services/folders';\nimport { buildBulkMovePayload } from '../../../../utils/buildBulkMovePayload';\nimport { canDropItemOnFolder } from '../../../../utils/canDropItemOnFolder';\nimport { getBulkMoveErrorMessage } from '../../../../utils/getBulkMoveErrorMessage';\nimport { getTranslationKey } from '../../../../utils/translations';\n\nimport { parseFolderTargetId } from './dndIds';\nimport { DragOverlayChip } from './DragOverlayChip';\n\nimport type { DragItemData } from '../../../../types/dnd';\n\n/* -------------------------------------------------------------------------------------------------\n * Context — shared with UploadDropZoneProvider for bidirectional drag guard.\n * See UploadDropZoneContext.tsx TODO linking both providers.\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetsDndContextValue {\n isInternalDragActive: boolean;\n isMovePending: boolean;\n}\n\nconst AssetsDndContext = createContext<AssetsDndContextValue | null>(null);\n\nexport const useAssetsDnd = () => {\n const context = useContext(AssetsDndContext);\n\n if (!context) {\n throw new Error('useAssetsDnd must be used within AssetsDndProvider');\n }\n\n return context;\n};\n\nexport const useAssetsDndOptional = () => useContext(AssetsDndContext);\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetsDndProviderProps {\n children: ReactNode;\n}\n\nconst getDragItems = (activeData: DragItemData | undefined): DragItemData[] => {\n if (!activeData) {\n return [];\n }\n\n // TODO(CMS-433): include selectedItems from active data for multi-drag payload members.\n return [activeData];\n};\n\nexport const AssetsDndProvider = ({ children }: AssetsDndProviderProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { data: folderStructure = [] } = useGetFolderStructureQuery();\n const [bulkMove, { isLoading: isMovePending }] = useBulkMoveMutation();\n const [activeItem, setActiveItem] = useState<DragItemData | null>(null);\n const [liveAnnouncement, setLiveAnnouncement] = useState('');\n\n const announceToLiveRegion = useCallback((message: string) => {\n setLiveAnnouncement('');\n requestAnimationFrame(() => setLiveAnnouncement(message));\n }, []);\n\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: { distance: 8 },\n })\n );\n\n const contextValue = useMemo<AssetsDndContextValue>(\n () => ({\n isInternalDragActive: activeItem !== null,\n isMovePending,\n }),\n [activeItem, isMovePending]\n );\n\n const handleDragStart = useCallback((event: DragStartEvent) => {\n const data = event.active.data.current as DragItemData | undefined;\n setActiveItem(data ?? null);\n }, []);\n\n const handleDragEnd = useCallback(\n async (event: DragEndEvent) => {\n const { active, over } = event;\n setActiveItem(null);\n\n if (isMovePending || !over) {\n return;\n }\n\n const targetFolderId = parseFolderTargetId(over.id);\n const activeData = active.data.current as DragItemData | undefined;\n\n if (targetFolderId == null || !activeData) {\n return;\n }\n\n const items = getDragItems(activeData);\n\n if (\n !canDropItemOnFolder({\n items,\n targetFolderId,\n folderStructure,\n })\n ) {\n return;\n }\n\n const payload = buildBulkMovePayload(items);\n const successMessage = formatMessage({\n id: getTranslationKey('modal.move.success-label'),\n defaultMessage: 'Elements have been moved successfully.',\n });\n const errorFallback = formatMessage({\n id: getTranslationKey('modal.move.error-label'),\n defaultMessage: 'An error occurred while moving the elements.',\n });\n\n try {\n await bulkMove({ ...payload, destinationFolderId: targetFolderId }).unwrap();\n\n announceToLiveRegion(successMessage);\n\n toggleNotification({\n type: 'success',\n message: successMessage,\n });\n } catch (error) {\n const errorMessage = getBulkMoveErrorMessage(error, errorFallback);\n\n announceToLiveRegion(\n formatMessage(\n {\n id: getTranslationKey('dnd.announce.move-failure'),\n defaultMessage: 'Move failed. {message}',\n },\n { message: errorMessage }\n )\n );\n\n toggleNotification({\n type: 'danger',\n message: errorMessage,\n });\n }\n },\n [\n announceToLiveRegion,\n bulkMove,\n folderStructure,\n formatMessage,\n isMovePending,\n toggleNotification,\n ]\n );\n\n const handleDragCancel = useCallback(() => {\n setActiveItem(null);\n }, []);\n\n const announcements = useMemo(\n () => ({\n onDragStart: ({ active }: DragStartEvent) => {\n const data = active.data.current as DragItemData | undefined;\n return data\n ? formatMessage(\n {\n id: getTranslationKey('dnd.announce.drag-start'),\n defaultMessage: 'Picked up {name}. Drop on a folder to move.',\n },\n { name: data.name }\n )\n : '';\n },\n onDragOver: () => '',\n onDragEnd: ({ active, over }: DragEndEvent) => {\n if (!over) {\n return formatMessage({\n id: getTranslationKey('dnd.announce.cancel'),\n defaultMessage: 'Drag cancelled.',\n });\n }\n\n const targetFolderId = parseFolderTargetId(over.id);\n const activeData = active.data.current as DragItemData | undefined;\n\n if (targetFolderId == null || !activeData) {\n return '';\n }\n\n const items = getDragItems(activeData);\n\n if (\n !canDropItemOnFolder({\n items,\n targetFolderId,\n folderStructure,\n })\n ) {\n return formatMessage({\n id: getTranslationKey('dnd.announce.invalid-drop'),\n defaultMessage: 'Cannot move item to this folder.',\n });\n }\n\n return '';\n },\n onDragCancel: () =>\n formatMessage({\n id: getTranslationKey('dnd.announce.cancel'),\n defaultMessage: 'Drag cancelled.',\n }),\n }),\n [folderStructure, formatMessage]\n );\n\n return (\n <AssetsDndContext.Provider value={contextValue}>\n <DndContext\n sensors={sensors}\n collisionDetection={pointerWithin}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n accessibility={{ announcements }}\n >\n <VisuallyHidden aria-live=\"polite\" aria-atomic=\"true\">\n {liveAnnouncement}\n </VisuallyHidden>\n <Box position=\"relative\">{children}</Box>\n <DragOverlay dropAnimation={null}>\n {activeItem ? <DragOverlayChip item={activeItem} /> : null}\n </DragOverlay>\n </DndContext>\n </AssetsDndContext.Provider>\n );\n};\n\n// TODO(CMS-229): FolderTree droppables + keyboard move path.\n"],"names":["AssetsDndContext","createContext","useAssetsDndOptional","useContext","getDragItems","activeData","AssetsDndProvider","children","formatMessage","useIntl","toggleNotification","useNotification","data","folderStructure","useGetFolderStructureQuery","bulkMove","isLoading","isMovePending","useBulkMoveMutation","activeItem","setActiveItem","useState","liveAnnouncement","setLiveAnnouncement","announceToLiveRegion","useCallback","message","requestAnimationFrame","sensors","useSensors","useSensor","PointerSensor","activationConstraint","distance","contextValue","useMemo","isInternalDragActive","handleDragStart","event","active","current","handleDragEnd","over","targetFolderId","parseFolderTargetId","id","items","canDropItemOnFolder","payload","buildBulkMovePayload","successMessage","getTranslationKey","defaultMessage","errorFallback","destinationFolderId","unwrap","type","error","errorMessage","getBulkMoveErrorMessage","handleDragCancel","announcements","onDragStart","name","onDragOver","onDragEnd","onDragCancel","_jsx","Provider","value","_jsxs","DndContext","collisionDetection","pointerWithin","accessibility","VisuallyHidden","aria-live","aria-atomic","Box","position","DragOverlay","dropAnimation","DragOverlayChip","item"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AssetsDndProvider.mjs","sources":["../../../../../../../admin/src/future/pages/Assets/components/Dnd/AssetsDndProvider.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\n\nimport {\n DndContext,\n DragOverlay,\n PointerSensor,\n pointerWithin,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragStartEvent,\n} from '@dnd-kit/core';\nimport { useNotification } from '@strapi/admin/strapi-admin';\nimport { Box, VisuallyHidden } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { useBulkMoveMutation, useGetFolderStructureQuery } from '../../../../services/folders';\nimport { buildBulkMovePayload } from '../../../../utils/buildBulkMovePayload';\nimport { canDropItemOnFolder } from '../../../../utils/canDropItemOnFolder';\nimport { formatMoveSuccessMessage } from '../../../../utils/formatMoveSuccessMessage';\nimport { getBulkMoveErrorMessage } from '../../../../utils/getBulkMoveErrorMessage';\nimport { getFolderLabel } from '../../../../utils/getFolderLabel';\nimport { getTranslationKey } from '../../../../utils/translations';\nimport { useAssetSelectionOptional } from '../../hooks/useAssetSelection';\nimport { useFolderNavigation } from '../../hooks/useFolderNavigation';\n\nimport { buildDragSet } from './buildDragSet';\nimport { computeValidDropTargets } from './computeValidDropTargets';\nimport { parseFolderTargetId, parseFolderTreeTargetId } from './dndIds';\nimport { DragOverlayChip } from './DragOverlayChip';\n\nimport type { DragItemData } from '../../../../types/dnd';\n\n/* -------------------------------------------------------------------------------------------------\n * Context — shared with UploadDropZoneProvider for bidirectional drag guard.\n * See UploadDropZoneContext.tsx TODO linking both providers.\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetsDndContextValue {\n isInternalDragActive: boolean;\n isMovePending: boolean;\n /** O(1) lookup of whether the current drag set may drop on this destination. */\n isValidDropTarget: (targetFolderId: number | null) => boolean;\n}\n\nconst AssetsDndContext = createContext<AssetsDndContextValue | null>(null);\n\nexport const useAssetsDnd = () => {\n const context = useContext(AssetsDndContext);\n\n if (!context) {\n throw new Error('useAssetsDnd must be used within AssetsDndProvider');\n }\n\n return context;\n};\n\nexport const useAssetsDndOptional = () => useContext(AssetsDndContext);\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetsDndProviderProps {\n children: ReactNode;\n}\n\ninterface DragSession {\n items: DragItemData[];\n fromSelection: boolean;\n}\n\nconst resolveDestination = (\n overId: string | number\n): { destinationFolderId: number | null } | null => {\n const inView = parseFolderTargetId(overId);\n\n if (inView != null) {\n return { destinationFolderId: inView };\n }\n\n const tree = parseFolderTreeTargetId(overId);\n\n if (tree === 'root') {\n return { destinationFolderId: null };\n }\n\n if (typeof tree === 'number') {\n return { destinationFolderId: tree };\n }\n\n return null;\n};\n\nexport const AssetsDndProvider = ({ children }: AssetsDndProviderProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const selection = useAssetSelectionOptional();\n const { currentFolderId } = useFolderNavigation();\n const { data: folderStructure = [] } = useGetFolderStructureQuery();\n const rootLabel = formatMessage({\n id: getTranslationKey('plugin.name'),\n defaultMessage: 'Media Library',\n });\n const [bulkMove, { isLoading: isMovePending }] = useBulkMoveMutation();\n const [dragItems, setDragItems] = useState<DragItemData[]>([]);\n const [liveAnnouncement, setLiveAnnouncement] = useState('');\n // Sync session for drag-end — state alone can lag one render behind dragStart.\n const dragSessionRef = useRef<DragSession>({ items: [], fromSelection: false });\n\n const announceToLiveRegion = useCallback((message: string) => {\n setLiveAnnouncement('');\n requestAnimationFrame(() => setLiveAnnouncement(message));\n }, []);\n\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: { distance: 8 },\n })\n );\n\n const validDropTargets = useMemo(\n () => computeValidDropTargets(dragItems, folderStructure),\n [dragItems, folderStructure]\n );\n\n const isValidDropTarget = useCallback(\n (targetFolderId: number | null) => validDropTargets.has(targetFolderId),\n [validDropTargets]\n );\n\n const contextValue = useMemo<AssetsDndContextValue>(\n () => ({\n isInternalDragActive: dragItems.length > 0,\n isMovePending,\n isValidDropTarget,\n }),\n [dragItems.length, isMovePending, isValidDropTarget]\n );\n\n const clearDragState = useCallback(() => {\n dragSessionRef.current = { items: [], fromSelection: false };\n setDragItems([]);\n }, []);\n\n const handleDragStart = useCallback(\n (event: DragStartEvent) => {\n const data = event.active.data.current as DragItemData | undefined;\n\n if (!data) {\n clearDragState();\n return;\n }\n\n const { items, fromSelection } = buildDragSet(data, selection?.selectedKeys, currentFolderId);\n dragSessionRef.current = { items, fromSelection };\n setDragItems(items);\n },\n [clearDragState, currentFolderId, selection?.selectedKeys]\n );\n\n const handleDragEnd = useCallback(\n async (event: DragEndEvent) => {\n const { over } = event;\n const { items, fromSelection } = dragSessionRef.current;\n clearDragState();\n\n if (isMovePending || !over || items.length === 0) {\n return;\n }\n\n const destination = resolveDestination(over.id);\n\n if (!destination) {\n return;\n }\n\n const { destinationFolderId: targetFolderId } = destination;\n\n if (\n !canDropItemOnFolder({\n items,\n targetFolderId,\n folderStructure,\n })\n ) {\n return;\n }\n\n const payload = buildBulkMovePayload(items);\n // Source is always the current folder — dragged items are, by definition,\n // visible in the current view. Destination is the drop target. Both use\n // leaf names so the DnD toast reads identically to the dialog's.\n const successMessage = formatMoveSuccessMessage({\n formatMessage,\n count: items.length,\n source: getFolderLabel(folderStructure, currentFolderId, rootLabel),\n destination: getFolderLabel(folderStructure, targetFolderId, rootLabel),\n });\n const errorFallback = formatMessage({\n id: getTranslationKey('list.bulk-actions.move.error'),\n defaultMessage: 'An error occurred while moving the items.',\n });\n\n try {\n await bulkMove({ ...payload, destinationFolderId: targetFolderId }).unwrap();\n\n if (fromSelection) {\n selection?.clear();\n }\n\n announceToLiveRegion(successMessage);\n\n toggleNotification({\n type: 'success',\n message: successMessage,\n });\n } catch (error) {\n const errorMessage = getBulkMoveErrorMessage(error, errorFallback);\n\n announceToLiveRegion(\n formatMessage(\n {\n id: getTranslationKey('dnd.announce.move-failure'),\n defaultMessage: 'Move failed. {message}',\n },\n { message: errorMessage }\n )\n );\n\n toggleNotification({\n type: 'danger',\n message: errorMessage,\n });\n }\n },\n [\n announceToLiveRegion,\n bulkMove,\n clearDragState,\n currentFolderId,\n folderStructure,\n formatMessage,\n isMovePending,\n rootLabel,\n selection,\n toggleNotification,\n ]\n );\n\n const handleDragCancel = useCallback(() => {\n clearDragState();\n }, [clearDragState]);\n\n const announcements = useMemo(\n () => ({\n onDragStart: ({ active }: DragStartEvent) => {\n const data = active.data.current as DragItemData | undefined;\n return data\n ? formatMessage(\n {\n id: getTranslationKey('dnd.announce.drag-start'),\n defaultMessage: 'Picked up {name}. Drop on a folder to move.',\n },\n { name: data.name }\n )\n : '';\n },\n onDragOver: () => '',\n onDragEnd: ({ active, over }: DragEndEvent) => {\n if (!over) {\n return formatMessage({\n id: getTranslationKey('dnd.announce.cancel'),\n defaultMessage: 'Drag cancelled.',\n });\n }\n\n const destination = resolveDestination(over.id);\n const activeData = active.data.current as DragItemData | undefined;\n\n if (!destination || !activeData) {\n return '';\n }\n\n const { items } = buildDragSet(activeData, selection?.selectedKeys, currentFolderId);\n\n if (\n !canDropItemOnFolder({\n items,\n targetFolderId: destination.destinationFolderId,\n folderStructure,\n })\n ) {\n return formatMessage({\n id: getTranslationKey('dnd.announce.invalid-drop'),\n defaultMessage: 'Cannot move item to this folder.',\n });\n }\n\n return '';\n },\n onDragCancel: () =>\n formatMessage({\n id: getTranslationKey('dnd.announce.cancel'),\n defaultMessage: 'Drag cancelled.',\n }),\n }),\n [currentFolderId, folderStructure, formatMessage, selection?.selectedKeys]\n );\n\n return (\n <AssetsDndContext.Provider value={contextValue}>\n <DndContext\n sensors={sensors}\n collisionDetection={pointerWithin}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n accessibility={{ announcements }}\n >\n <VisuallyHidden aria-live=\"polite\" aria-atomic=\"true\">\n {liveAnnouncement}\n </VisuallyHidden>\n <Box position=\"relative\">{children}</Box>\n <DragOverlay dropAnimation={null}>\n {dragItems.length > 0 ? <DragOverlayChip items={dragItems} /> : null}\n </DragOverlay>\n </DndContext>\n </AssetsDndContext.Provider>\n );\n};\n\n// Keyboard-accessible moves are handled by `BulkMoveDialog` (reachable from the\n// bulk-actions bar): pointer drag is a mouse-only enhancement, the dialog is the\n// a11y path. No `KeyboardSensor` by design.\n"],"names":["AssetsDndContext","createContext","useAssetsDndOptional","useContext","resolveDestination","overId","inView","parseFolderTargetId","destinationFolderId","tree","parseFolderTreeTargetId","AssetsDndProvider","children","formatMessage","useIntl","toggleNotification","useNotification","selection","useAssetSelectionOptional","currentFolderId","useFolderNavigation","data","folderStructure","useGetFolderStructureQuery","rootLabel","id","getTranslationKey","defaultMessage","bulkMove","isLoading","isMovePending","useBulkMoveMutation","dragItems","setDragItems","useState","liveAnnouncement","setLiveAnnouncement","dragSessionRef","useRef","items","fromSelection","announceToLiveRegion","useCallback","message","requestAnimationFrame","sensors","useSensors","useSensor","PointerSensor","activationConstraint","distance","validDropTargets","useMemo","computeValidDropTargets","isValidDropTarget","targetFolderId","has","contextValue","isInternalDragActive","length","clearDragState","current","handleDragStart","event","active","buildDragSet","selectedKeys","handleDragEnd","over","destination","canDropItemOnFolder","payload","buildBulkMovePayload","successMessage","formatMoveSuccessMessage","count","source","getFolderLabel","errorFallback","unwrap","clear","type","error","errorMessage","getBulkMoveErrorMessage","handleDragCancel","announcements","onDragStart","name","onDragOver","onDragEnd","activeData","onDragCancel","_jsx","Provider","value","_jsxs","DndContext","collisionDetection","pointerWithin","accessibility","VisuallyHidden","aria-live","aria-atomic","Box","position","DragOverlay","dropAnimation","DragOverlayChip"],"mappings":"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"}
|
|
@@ -3,9 +3,18 @@
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
4
|
var designSystem = require('@strapi/design-system');
|
|
5
5
|
var icons = require('@strapi/icons');
|
|
6
|
+
var reactIntl = require('react-intl');
|
|
6
7
|
var styledComponents = require('styled-components');
|
|
8
|
+
var translations = require('../../../../utils/translations.js');
|
|
7
9
|
|
|
10
|
+
// Folder & File (@strapi/icons) share viewBox 0 0 32 32 but File's glyph is
|
|
11
|
+
// narrower/lighter. Rendering File a few px larger inside a fixed square box makes
|
|
12
|
+
// the two previews read at the same visual size without shifting the chip layout.
|
|
13
|
+
const FOLDER_ICON_SIZE = 20;
|
|
14
|
+
const FILE_ICON_SIZE = 24;
|
|
15
|
+
const ICON_BOX = 24;
|
|
8
16
|
const Chip = styledComponents.styled(designSystem.Flex)`
|
|
17
|
+
position: relative;
|
|
9
18
|
align-items: center;
|
|
10
19
|
gap: ${({ theme })=>theme.spaces[2]};
|
|
11
20
|
padding: ${({ theme })=>`${theme.spaces[2]} ${theme.spaces[3]}`};
|
|
@@ -15,23 +24,121 @@ const Chip = styledComponents.styled(designSystem.Flex)`
|
|
|
15
24
|
cursor: grabbing;
|
|
16
25
|
max-width: 24rem;
|
|
17
26
|
`;
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
27
|
+
const CompositeChip = styledComponents.styled(Chip)`
|
|
28
|
+
box-shadow:
|
|
29
|
+
${({ theme })=>theme.shadows.tableShadow},
|
|
30
|
+
0 4px 0 -1px ${({ theme })=>theme.colors.primary100},
|
|
31
|
+
0 4px 0 0 ${({ theme })=>theme.colors.primary200},
|
|
32
|
+
0 7px 0 -1px ${({ theme })=>theme.colors.primary100},
|
|
33
|
+
0 7px 0 0 ${({ theme })=>theme.colors.primary200};
|
|
34
|
+
`;
|
|
35
|
+
const CountGroup = styledComponents.styled(designSystem.Flex)`
|
|
36
|
+
align-items: center;
|
|
37
|
+
gap: ${({ theme })=>theme.spaces[1]};
|
|
38
|
+
`;
|
|
39
|
+
const IconBox = styledComponents.styled(designSystem.Flex)`
|
|
40
|
+
flex-shrink: 0;
|
|
41
|
+
width: ${ICON_BOX}px;
|
|
42
|
+
height: ${ICON_BOX}px;
|
|
43
|
+
align-items: center;
|
|
44
|
+
justify-content: center;
|
|
45
|
+
`;
|
|
46
|
+
const TotalBadge = styledComponents.styled(designSystem.Flex)`
|
|
47
|
+
position: absolute;
|
|
48
|
+
top: -${({ theme })=>theme.spaces[2]};
|
|
49
|
+
right: -${({ theme })=>theme.spaces[2]};
|
|
50
|
+
align-items: center;
|
|
51
|
+
justify-content: center;
|
|
52
|
+
min-width: ${({ theme })=>theme.spaces[5]};
|
|
53
|
+
height: ${({ theme })=>theme.spaces[5]};
|
|
54
|
+
padding: 0 ${({ theme })=>theme.spaces[1]};
|
|
55
|
+
border-radius: ${({ theme })=>theme.borderRadius};
|
|
56
|
+
background: ${({ theme })=>theme.colors.primary600};
|
|
57
|
+
`;
|
|
58
|
+
const DragOverlayChip = ({ items })=>{
|
|
59
|
+
const { formatMessage } = reactIntl.useIntl();
|
|
60
|
+
if (items.length === 0) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
if (items.length === 1) {
|
|
64
|
+
const item = items[0];
|
|
65
|
+
const isFolder = item.kind === 'folder';
|
|
66
|
+
const Icon = isFolder ? icons.Folder : icons.File;
|
|
67
|
+
const size = isFolder ? FOLDER_ICON_SIZE : FILE_ICON_SIZE;
|
|
68
|
+
return /*#__PURE__*/ jsxRuntime.jsxs(Chip, {
|
|
69
|
+
children: [
|
|
70
|
+
/*#__PURE__*/ jsxRuntime.jsx(IconBox, {
|
|
71
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(Icon, {
|
|
72
|
+
width: size,
|
|
73
|
+
height: size
|
|
74
|
+
})
|
|
75
|
+
}),
|
|
76
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
|
|
77
|
+
textColor: "neutral800",
|
|
78
|
+
fontWeight: "semiBold",
|
|
79
|
+
ellipsis: true,
|
|
80
|
+
children: item.name
|
|
81
|
+
})
|
|
82
|
+
]
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
const folderCount = items.filter((item)=>item.kind === 'folder').length;
|
|
86
|
+
const fileCount = items.filter((item)=>item.kind === 'file').length;
|
|
87
|
+
const total = folderCount + fileCount;
|
|
88
|
+
return /*#__PURE__*/ jsxRuntime.jsxs(CompositeChip, {
|
|
89
|
+
gap: 3,
|
|
21
90
|
children: [
|
|
22
|
-
/*#__PURE__*/ jsxRuntime.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
91
|
+
folderCount > 0 ? /*#__PURE__*/ jsxRuntime.jsxs(CountGroup, {
|
|
92
|
+
children: [
|
|
93
|
+
/*#__PURE__*/ jsxRuntime.jsx(IconBox, {
|
|
94
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(icons.Folder, {
|
|
95
|
+
width: FOLDER_ICON_SIZE,
|
|
96
|
+
height: FOLDER_ICON_SIZE
|
|
97
|
+
})
|
|
98
|
+
}),
|
|
99
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
|
|
100
|
+
textColor: "neutral800",
|
|
101
|
+
fontWeight: "semiBold",
|
|
102
|
+
children: formatMessage({
|
|
103
|
+
id: translations.getTranslationKey('dnd.overlay.folders'),
|
|
104
|
+
defaultMessage: '{count, plural, one {# folder} other {# folders}}'
|
|
105
|
+
}, {
|
|
106
|
+
count: folderCount
|
|
107
|
+
})
|
|
108
|
+
})
|
|
109
|
+
]
|
|
110
|
+
}) : null,
|
|
111
|
+
fileCount > 0 ? /*#__PURE__*/ jsxRuntime.jsxs(CountGroup, {
|
|
112
|
+
children: [
|
|
113
|
+
/*#__PURE__*/ jsxRuntime.jsx(IconBox, {
|
|
114
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(icons.File, {
|
|
115
|
+
width: FILE_ICON_SIZE,
|
|
116
|
+
height: FILE_ICON_SIZE
|
|
117
|
+
})
|
|
118
|
+
}),
|
|
119
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
|
|
120
|
+
textColor: "neutral800",
|
|
121
|
+
fontWeight: "semiBold",
|
|
122
|
+
children: formatMessage({
|
|
123
|
+
id: translations.getTranslationKey('dnd.overlay.files'),
|
|
124
|
+
defaultMessage: '{count, plural, one {# file} other {# files}}'
|
|
125
|
+
}, {
|
|
126
|
+
count: fileCount
|
|
127
|
+
})
|
|
128
|
+
})
|
|
129
|
+
]
|
|
130
|
+
}) : null,
|
|
131
|
+
/*#__PURE__*/ jsxRuntime.jsx(TotalBadge, {
|
|
132
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
|
|
133
|
+
textColor: "neutral0",
|
|
134
|
+
fontWeight: "bold",
|
|
135
|
+
variant: "pi",
|
|
136
|
+
children: total
|
|
137
|
+
})
|
|
31
138
|
})
|
|
32
139
|
]
|
|
33
140
|
});
|
|
34
|
-
};
|
|
141
|
+
};
|
|
35
142
|
|
|
36
143
|
exports.DragOverlayChip = DragOverlayChip;
|
|
37
144
|
//# sourceMappingURL=DragOverlayChip.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DragOverlayChip.js","sources":["../../../../../../../admin/src/future/pages/Assets/components/Dnd/DragOverlayChip.tsx"],"sourcesContent":["import { Flex, Typography } from '@strapi/design-system';\nimport { File as FileIcon, Folder as FolderIcon } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\nimport type { DragItemData } from '../../../../types/dnd';\n\nconst Chip = styled(Flex)`\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[3]}`};\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => theme.colors.primary100};\n box-shadow: ${({ theme }) => theme.shadows.tableShadow};\n cursor: grabbing;\n max-width: 24rem;\n`;\n\ninterface DragOverlayChipProps {\n
|
|
1
|
+
{"version":3,"file":"DragOverlayChip.js","sources":["../../../../../../../admin/src/future/pages/Assets/components/Dnd/DragOverlayChip.tsx"],"sourcesContent":["import { Flex, Typography } from '@strapi/design-system';\nimport { File as FileIcon, Folder as FolderIcon } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslationKey } from '../../../../utils/translations';\n\nimport type { DragItemData } from '../../../../types/dnd';\n\n// Folder & File (@strapi/icons) share viewBox 0 0 32 32 but File's glyph is\n// narrower/lighter. Rendering File a few px larger inside a fixed square box makes\n// the two previews read at the same visual size without shifting the chip layout.\nconst FOLDER_ICON_SIZE = 20;\nconst FILE_ICON_SIZE = 24;\nconst ICON_BOX = 24;\n\nconst Chip = styled(Flex)`\n position: relative;\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[3]}`};\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => theme.colors.primary100};\n box-shadow: ${({ theme }) => theme.shadows.tableShadow};\n cursor: grabbing;\n max-width: 24rem;\n`;\n\nconst CompositeChip = styled(Chip)`\n box-shadow:\n ${({ theme }) => theme.shadows.tableShadow},\n 0 4px 0 -1px ${({ theme }) => theme.colors.primary100},\n 0 4px 0 0 ${({ theme }) => theme.colors.primary200},\n 0 7px 0 -1px ${({ theme }) => theme.colors.primary100},\n 0 7px 0 0 ${({ theme }) => theme.colors.primary200};\n`;\n\nconst CountGroup = styled(Flex)`\n align-items: center;\n gap: ${({ theme }) => theme.spaces[1]};\n`;\n\nconst IconBox = styled(Flex)`\n flex-shrink: 0;\n width: ${ICON_BOX}px;\n height: ${ICON_BOX}px;\n align-items: center;\n justify-content: center;\n`;\n\nconst TotalBadge = styled(Flex)`\n position: absolute;\n top: -${({ theme }) => theme.spaces[2]};\n right: -${({ theme }) => theme.spaces[2]};\n align-items: center;\n justify-content: center;\n min-width: ${({ theme }) => theme.spaces[5]};\n height: ${({ theme }) => theme.spaces[5]};\n padding: 0 ${({ theme }) => theme.spaces[1]};\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => theme.colors.primary600};\n`;\n\ninterface DragOverlayChipProps {\n items: DragItemData[];\n}\n\nexport const DragOverlayChip = ({ items }: DragOverlayChipProps) => {\n const { formatMessage } = useIntl();\n\n if (items.length === 0) {\n return null;\n }\n\n if (items.length === 1) {\n const item = items[0];\n const isFolder = item.kind === 'folder';\n const Icon = isFolder ? FolderIcon : FileIcon;\n const size = isFolder ? FOLDER_ICON_SIZE : FILE_ICON_SIZE;\n\n return (\n <Chip>\n <IconBox>\n <Icon width={size} height={size} />\n </IconBox>\n <Typography textColor=\"neutral800\" fontWeight=\"semiBold\" ellipsis>\n {item.name}\n </Typography>\n </Chip>\n );\n }\n\n const folderCount = items.filter((item) => item.kind === 'folder').length;\n const fileCount = items.filter((item) => item.kind === 'file').length;\n const total = folderCount + fileCount;\n\n return (\n <CompositeChip gap={3}>\n {folderCount > 0 ? (\n <CountGroup>\n <IconBox>\n <FolderIcon width={FOLDER_ICON_SIZE} height={FOLDER_ICON_SIZE} />\n </IconBox>\n <Typography textColor=\"neutral800\" fontWeight=\"semiBold\">\n {formatMessage(\n {\n id: getTranslationKey('dnd.overlay.folders'),\n defaultMessage: '{count, plural, one {# folder} other {# folders}}',\n },\n { count: folderCount }\n )}\n </Typography>\n </CountGroup>\n ) : null}\n {fileCount > 0 ? (\n <CountGroup>\n <IconBox>\n <FileIcon width={FILE_ICON_SIZE} height={FILE_ICON_SIZE} />\n </IconBox>\n <Typography textColor=\"neutral800\" fontWeight=\"semiBold\">\n {formatMessage(\n {\n id: getTranslationKey('dnd.overlay.files'),\n defaultMessage: '{count, plural, one {# file} other {# files}}',\n },\n { count: fileCount }\n )}\n </Typography>\n </CountGroup>\n ) : null}\n <TotalBadge>\n <Typography textColor=\"neutral0\" fontWeight=\"bold\" variant=\"pi\">\n {total}\n </Typography>\n </TotalBadge>\n </CompositeChip>\n );\n};\n"],"names":["FOLDER_ICON_SIZE","FILE_ICON_SIZE","ICON_BOX","Chip","styled","Flex","theme","spaces","borderRadius","colors","primary100","shadows","tableShadow","CompositeChip","primary200","CountGroup","IconBox","TotalBadge","primary600","DragOverlayChip","items","formatMessage","useIntl","length","item","isFolder","kind","Icon","FolderIcon","FileIcon","size","_jsxs","_jsx","width","height","Typography","textColor","fontWeight","ellipsis","name","folderCount","filter","fileCount","total","gap","id","getTranslationKey","defaultMessage","count","variant"],"mappings":"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"}
|
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { Typography, Flex } from '@strapi/design-system';
|
|
3
3
|
import { Folder, File } from '@strapi/icons';
|
|
4
|
+
import { useIntl } from 'react-intl';
|
|
4
5
|
import { styled } from 'styled-components';
|
|
6
|
+
import { getTranslationKey } from '../../../../utils/translations.mjs';
|
|
5
7
|
|
|
8
|
+
// Folder & File (@strapi/icons) share viewBox 0 0 32 32 but File's glyph is
|
|
9
|
+
// narrower/lighter. Rendering File a few px larger inside a fixed square box makes
|
|
10
|
+
// the two previews read at the same visual size without shifting the chip layout.
|
|
11
|
+
const FOLDER_ICON_SIZE = 20;
|
|
12
|
+
const FILE_ICON_SIZE = 24;
|
|
13
|
+
const ICON_BOX = 24;
|
|
6
14
|
const Chip = styled(Flex)`
|
|
15
|
+
position: relative;
|
|
7
16
|
align-items: center;
|
|
8
17
|
gap: ${({ theme })=>theme.spaces[2]};
|
|
9
18
|
padding: ${({ theme })=>`${theme.spaces[2]} ${theme.spaces[3]}`};
|
|
@@ -13,23 +22,121 @@ const Chip = styled(Flex)`
|
|
|
13
22
|
cursor: grabbing;
|
|
14
23
|
max-width: 24rem;
|
|
15
24
|
`;
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
25
|
+
const CompositeChip = styled(Chip)`
|
|
26
|
+
box-shadow:
|
|
27
|
+
${({ theme })=>theme.shadows.tableShadow},
|
|
28
|
+
0 4px 0 -1px ${({ theme })=>theme.colors.primary100},
|
|
29
|
+
0 4px 0 0 ${({ theme })=>theme.colors.primary200},
|
|
30
|
+
0 7px 0 -1px ${({ theme })=>theme.colors.primary100},
|
|
31
|
+
0 7px 0 0 ${({ theme })=>theme.colors.primary200};
|
|
32
|
+
`;
|
|
33
|
+
const CountGroup = styled(Flex)`
|
|
34
|
+
align-items: center;
|
|
35
|
+
gap: ${({ theme })=>theme.spaces[1]};
|
|
36
|
+
`;
|
|
37
|
+
const IconBox = styled(Flex)`
|
|
38
|
+
flex-shrink: 0;
|
|
39
|
+
width: ${ICON_BOX}px;
|
|
40
|
+
height: ${ICON_BOX}px;
|
|
41
|
+
align-items: center;
|
|
42
|
+
justify-content: center;
|
|
43
|
+
`;
|
|
44
|
+
const TotalBadge = styled(Flex)`
|
|
45
|
+
position: absolute;
|
|
46
|
+
top: -${({ theme })=>theme.spaces[2]};
|
|
47
|
+
right: -${({ theme })=>theme.spaces[2]};
|
|
48
|
+
align-items: center;
|
|
49
|
+
justify-content: center;
|
|
50
|
+
min-width: ${({ theme })=>theme.spaces[5]};
|
|
51
|
+
height: ${({ theme })=>theme.spaces[5]};
|
|
52
|
+
padding: 0 ${({ theme })=>theme.spaces[1]};
|
|
53
|
+
border-radius: ${({ theme })=>theme.borderRadius};
|
|
54
|
+
background: ${({ theme })=>theme.colors.primary600};
|
|
55
|
+
`;
|
|
56
|
+
const DragOverlayChip = ({ items })=>{
|
|
57
|
+
const { formatMessage } = useIntl();
|
|
58
|
+
if (items.length === 0) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
if (items.length === 1) {
|
|
62
|
+
const item = items[0];
|
|
63
|
+
const isFolder = item.kind === 'folder';
|
|
64
|
+
const Icon = isFolder ? Folder : File;
|
|
65
|
+
const size = isFolder ? FOLDER_ICON_SIZE : FILE_ICON_SIZE;
|
|
66
|
+
return /*#__PURE__*/ jsxs(Chip, {
|
|
67
|
+
children: [
|
|
68
|
+
/*#__PURE__*/ jsx(IconBox, {
|
|
69
|
+
children: /*#__PURE__*/ jsx(Icon, {
|
|
70
|
+
width: size,
|
|
71
|
+
height: size
|
|
72
|
+
})
|
|
73
|
+
}),
|
|
74
|
+
/*#__PURE__*/ jsx(Typography, {
|
|
75
|
+
textColor: "neutral800",
|
|
76
|
+
fontWeight: "semiBold",
|
|
77
|
+
ellipsis: true,
|
|
78
|
+
children: item.name
|
|
79
|
+
})
|
|
80
|
+
]
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
const folderCount = items.filter((item)=>item.kind === 'folder').length;
|
|
84
|
+
const fileCount = items.filter((item)=>item.kind === 'file').length;
|
|
85
|
+
const total = folderCount + fileCount;
|
|
86
|
+
return /*#__PURE__*/ jsxs(CompositeChip, {
|
|
87
|
+
gap: 3,
|
|
19
88
|
children: [
|
|
20
|
-
/*#__PURE__*/
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
89
|
+
folderCount > 0 ? /*#__PURE__*/ jsxs(CountGroup, {
|
|
90
|
+
children: [
|
|
91
|
+
/*#__PURE__*/ jsx(IconBox, {
|
|
92
|
+
children: /*#__PURE__*/ jsx(Folder, {
|
|
93
|
+
width: FOLDER_ICON_SIZE,
|
|
94
|
+
height: FOLDER_ICON_SIZE
|
|
95
|
+
})
|
|
96
|
+
}),
|
|
97
|
+
/*#__PURE__*/ jsx(Typography, {
|
|
98
|
+
textColor: "neutral800",
|
|
99
|
+
fontWeight: "semiBold",
|
|
100
|
+
children: formatMessage({
|
|
101
|
+
id: getTranslationKey('dnd.overlay.folders'),
|
|
102
|
+
defaultMessage: '{count, plural, one {# folder} other {# folders}}'
|
|
103
|
+
}, {
|
|
104
|
+
count: folderCount
|
|
105
|
+
})
|
|
106
|
+
})
|
|
107
|
+
]
|
|
108
|
+
}) : null,
|
|
109
|
+
fileCount > 0 ? /*#__PURE__*/ jsxs(CountGroup, {
|
|
110
|
+
children: [
|
|
111
|
+
/*#__PURE__*/ jsx(IconBox, {
|
|
112
|
+
children: /*#__PURE__*/ jsx(File, {
|
|
113
|
+
width: FILE_ICON_SIZE,
|
|
114
|
+
height: FILE_ICON_SIZE
|
|
115
|
+
})
|
|
116
|
+
}),
|
|
117
|
+
/*#__PURE__*/ jsx(Typography, {
|
|
118
|
+
textColor: "neutral800",
|
|
119
|
+
fontWeight: "semiBold",
|
|
120
|
+
children: formatMessage({
|
|
121
|
+
id: getTranslationKey('dnd.overlay.files'),
|
|
122
|
+
defaultMessage: '{count, plural, one {# file} other {# files}}'
|
|
123
|
+
}, {
|
|
124
|
+
count: fileCount
|
|
125
|
+
})
|
|
126
|
+
})
|
|
127
|
+
]
|
|
128
|
+
}) : null,
|
|
129
|
+
/*#__PURE__*/ jsx(TotalBadge, {
|
|
130
|
+
children: /*#__PURE__*/ jsx(Typography, {
|
|
131
|
+
textColor: "neutral0",
|
|
132
|
+
fontWeight: "bold",
|
|
133
|
+
variant: "pi",
|
|
134
|
+
children: total
|
|
135
|
+
})
|
|
29
136
|
})
|
|
30
137
|
]
|
|
31
138
|
});
|
|
32
|
-
};
|
|
139
|
+
};
|
|
33
140
|
|
|
34
141
|
export { DragOverlayChip };
|
|
35
142
|
//# sourceMappingURL=DragOverlayChip.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DragOverlayChip.mjs","sources":["../../../../../../../admin/src/future/pages/Assets/components/Dnd/DragOverlayChip.tsx"],"sourcesContent":["import { Flex, Typography } from '@strapi/design-system';\nimport { File as FileIcon, Folder as FolderIcon } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\nimport type { DragItemData } from '../../../../types/dnd';\n\nconst Chip = styled(Flex)`\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[3]}`};\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => theme.colors.primary100};\n box-shadow: ${({ theme }) => theme.shadows.tableShadow};\n cursor: grabbing;\n max-width: 24rem;\n`;\n\ninterface DragOverlayChipProps {\n
|
|
1
|
+
{"version":3,"file":"DragOverlayChip.mjs","sources":["../../../../../../../admin/src/future/pages/Assets/components/Dnd/DragOverlayChip.tsx"],"sourcesContent":["import { Flex, Typography } from '@strapi/design-system';\nimport { File as FileIcon, Folder as FolderIcon } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslationKey } from '../../../../utils/translations';\n\nimport type { DragItemData } from '../../../../types/dnd';\n\n// Folder & File (@strapi/icons) share viewBox 0 0 32 32 but File's glyph is\n// narrower/lighter. Rendering File a few px larger inside a fixed square box makes\n// the two previews read at the same visual size without shifting the chip layout.\nconst FOLDER_ICON_SIZE = 20;\nconst FILE_ICON_SIZE = 24;\nconst ICON_BOX = 24;\n\nconst Chip = styled(Flex)`\n position: relative;\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[3]}`};\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => theme.colors.primary100};\n box-shadow: ${({ theme }) => theme.shadows.tableShadow};\n cursor: grabbing;\n max-width: 24rem;\n`;\n\nconst CompositeChip = styled(Chip)`\n box-shadow:\n ${({ theme }) => theme.shadows.tableShadow},\n 0 4px 0 -1px ${({ theme }) => theme.colors.primary100},\n 0 4px 0 0 ${({ theme }) => theme.colors.primary200},\n 0 7px 0 -1px ${({ theme }) => theme.colors.primary100},\n 0 7px 0 0 ${({ theme }) => theme.colors.primary200};\n`;\n\nconst CountGroup = styled(Flex)`\n align-items: center;\n gap: ${({ theme }) => theme.spaces[1]};\n`;\n\nconst IconBox = styled(Flex)`\n flex-shrink: 0;\n width: ${ICON_BOX}px;\n height: ${ICON_BOX}px;\n align-items: center;\n justify-content: center;\n`;\n\nconst TotalBadge = styled(Flex)`\n position: absolute;\n top: -${({ theme }) => theme.spaces[2]};\n right: -${({ theme }) => theme.spaces[2]};\n align-items: center;\n justify-content: center;\n min-width: ${({ theme }) => theme.spaces[5]};\n height: ${({ theme }) => theme.spaces[5]};\n padding: 0 ${({ theme }) => theme.spaces[1]};\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => theme.colors.primary600};\n`;\n\ninterface DragOverlayChipProps {\n items: DragItemData[];\n}\n\nexport const DragOverlayChip = ({ items }: DragOverlayChipProps) => {\n const { formatMessage } = useIntl();\n\n if (items.length === 0) {\n return null;\n }\n\n if (items.length === 1) {\n const item = items[0];\n const isFolder = item.kind === 'folder';\n const Icon = isFolder ? FolderIcon : FileIcon;\n const size = isFolder ? FOLDER_ICON_SIZE : FILE_ICON_SIZE;\n\n return (\n <Chip>\n <IconBox>\n <Icon width={size} height={size} />\n </IconBox>\n <Typography textColor=\"neutral800\" fontWeight=\"semiBold\" ellipsis>\n {item.name}\n </Typography>\n </Chip>\n );\n }\n\n const folderCount = items.filter((item) => item.kind === 'folder').length;\n const fileCount = items.filter((item) => item.kind === 'file').length;\n const total = folderCount + fileCount;\n\n return (\n <CompositeChip gap={3}>\n {folderCount > 0 ? (\n <CountGroup>\n <IconBox>\n <FolderIcon width={FOLDER_ICON_SIZE} height={FOLDER_ICON_SIZE} />\n </IconBox>\n <Typography textColor=\"neutral800\" fontWeight=\"semiBold\">\n {formatMessage(\n {\n id: getTranslationKey('dnd.overlay.folders'),\n defaultMessage: '{count, plural, one {# folder} other {# folders}}',\n },\n { count: folderCount }\n )}\n </Typography>\n </CountGroup>\n ) : null}\n {fileCount > 0 ? (\n <CountGroup>\n <IconBox>\n <FileIcon width={FILE_ICON_SIZE} height={FILE_ICON_SIZE} />\n </IconBox>\n <Typography textColor=\"neutral800\" fontWeight=\"semiBold\">\n {formatMessage(\n {\n id: getTranslationKey('dnd.overlay.files'),\n defaultMessage: '{count, plural, one {# file} other {# files}}',\n },\n { count: fileCount }\n )}\n </Typography>\n </CountGroup>\n ) : null}\n <TotalBadge>\n <Typography textColor=\"neutral0\" fontWeight=\"bold\" variant=\"pi\">\n {total}\n </Typography>\n </TotalBadge>\n </CompositeChip>\n );\n};\n"],"names":["FOLDER_ICON_SIZE","FILE_ICON_SIZE","ICON_BOX","Chip","styled","Flex","theme","spaces","borderRadius","colors","primary100","shadows","tableShadow","CompositeChip","primary200","CountGroup","IconBox","TotalBadge","primary600","DragOverlayChip","items","formatMessage","useIntl","length","item","isFolder","kind","Icon","FolderIcon","FileIcon","size","_jsxs","_jsx","width","height","Typography","textColor","fontWeight","ellipsis","name","folderCount","filter","fileCount","total","gap","id","getTranslationKey","defaultMessage","count","variant"],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var selection = require('../../utils/selection.js');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Stamp an item with the authoritative current-folder location. Drag/selection is
|
|
7
|
+
* page-scoped to the current folder, so this is more reliable than the item's own
|
|
8
|
+
* `folderId`/`parentId` — a dragged folder's `parent` is not populated by the
|
|
9
|
+
* folders query, so its `parentId` would otherwise collapse to `null`.
|
|
10
|
+
*/ const locateItem = (item, currentFolderId)=>item.kind === 'file' ? {
|
|
11
|
+
...item,
|
|
12
|
+
folderId: currentFolderId
|
|
13
|
+
} : {
|
|
14
|
+
...item,
|
|
15
|
+
parentId: currentFolderId
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Derive the drag payload once at drag start.
|
|
19
|
+
*
|
|
20
|
+
* - Dragging a selected item moves the complete current selection.
|
|
21
|
+
* - Dragging an unselected item moves only that item.
|
|
22
|
+
*
|
|
23
|
+
* Selection is page-scoped to the current folder, so every item is stamped with
|
|
24
|
+
* `currentFolderId` as its location for move validation.
|
|
25
|
+
*/ const buildDragSet = (activeData, selectedKeys, currentFolderId)=>{
|
|
26
|
+
if (!selectedKeys || selectedKeys.size === 0) {
|
|
27
|
+
return {
|
|
28
|
+
items: [
|
|
29
|
+
locateItem(activeData, currentFolderId)
|
|
30
|
+
],
|
|
31
|
+
fromSelection: false
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const activeKey = activeData.kind === 'file' ? selection.assetKey(activeData.id) : selection.folderKey(activeData.id);
|
|
35
|
+
if (!selectedKeys.has(activeKey)) {
|
|
36
|
+
return {
|
|
37
|
+
items: [
|
|
38
|
+
locateItem(activeData, currentFolderId)
|
|
39
|
+
],
|
|
40
|
+
fromSelection: false
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const items = [];
|
|
44
|
+
selectedKeys.forEach((key)=>{
|
|
45
|
+
const separator = key.indexOf(':');
|
|
46
|
+
const kind = key.slice(0, separator);
|
|
47
|
+
const id = Number(key.slice(separator + 1));
|
|
48
|
+
if (kind === 'asset') {
|
|
49
|
+
items.push({
|
|
50
|
+
kind: 'file',
|
|
51
|
+
id,
|
|
52
|
+
name: activeData.kind === 'file' && activeData.id === id ? activeData.name : '',
|
|
53
|
+
folderId: currentFolderId
|
|
54
|
+
});
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
items.push({
|
|
58
|
+
kind: 'folder',
|
|
59
|
+
id,
|
|
60
|
+
name: activeData.kind === 'folder' && activeData.id === id ? activeData.name : '',
|
|
61
|
+
parentId: currentFolderId
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
return {
|
|
65
|
+
items,
|
|
66
|
+
fromSelection: true
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
exports.buildDragSet = buildDragSet;
|
|
71
|
+
//# sourceMappingURL=buildDragSet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildDragSet.js","sources":["../../../../../../../admin/src/future/pages/Assets/components/Dnd/buildDragSet.ts"],"sourcesContent":["import { assetKey, folderKey, type ItemKey } from '../../utils/selection';\n\nimport type { DragItemData } from '../../../../types/dnd';\n\nexport interface DragSet {\n items: DragItemData[];\n /** True when the active item was already selected — membership is the full selection. */\n fromSelection: boolean;\n}\n\n/**\n * Stamp an item with the authoritative current-folder location. Drag/selection is\n * page-scoped to the current folder, so this is more reliable than the item's own\n * `folderId`/`parentId` — a dragged folder's `parent` is not populated by the\n * folders query, so its `parentId` would otherwise collapse to `null`.\n */\nconst locateItem = (item: DragItemData, currentFolderId: number | null): DragItemData =>\n item.kind === 'file'\n ? { ...item, folderId: currentFolderId }\n : { ...item, parentId: currentFolderId };\n\n/**\n * Derive the drag payload once at drag start.\n *\n * - Dragging a selected item moves the complete current selection.\n * - Dragging an unselected item moves only that item.\n *\n * Selection is page-scoped to the current folder, so every item is stamped with\n * `currentFolderId` as its location for move validation.\n */\nexport const buildDragSet = (\n activeData: DragItemData,\n selectedKeys: Set<ItemKey> | undefined,\n currentFolderId: number | null\n): DragSet => {\n if (!selectedKeys || selectedKeys.size === 0) {\n return { items: [locateItem(activeData, currentFolderId)], fromSelection: false };\n }\n\n const activeKey: ItemKey =\n activeData.kind === 'file' ? assetKey(activeData.id) : folderKey(activeData.id);\n\n if (!selectedKeys.has(activeKey)) {\n return { items: [locateItem(activeData, currentFolderId)], fromSelection: false };\n }\n\n const items: DragItemData[] = [];\n\n selectedKeys.forEach((key) => {\n const separator = key.indexOf(':');\n const kind = key.slice(0, separator);\n const id = Number(key.slice(separator + 1));\n\n if (kind === 'asset') {\n items.push({\n kind: 'file',\n id,\n name: activeData.kind === 'file' && activeData.id === id ? activeData.name : '',\n folderId: currentFolderId,\n });\n return;\n }\n\n items.push({\n kind: 'folder',\n id,\n name: activeData.kind === 'folder' && activeData.id === id ? activeData.name : '',\n parentId: currentFolderId,\n });\n });\n\n return { items, fromSelection: true };\n};\n"],"names":["locateItem","item","currentFolderId","kind","folderId","parentId","buildDragSet","activeData","selectedKeys","size","items","fromSelection","activeKey","assetKey","id","folderKey","has","forEach","key","separator","indexOf","slice","Number","push","name"],"mappings":";;;;AAUA;;;;;IAMA,MAAMA,aAAa,CAACC,IAAAA,EAAoBC,kBACtCD,IAAAA,CAAKE,IAAI,KAAK,MAAA,GACV;AAAE,QAAA,GAAGF,IAAI;QAAEG,QAAAA,EAAUF;KAAgB,GACrC;AAAE,QAAA,GAAGD,IAAI;QAAEI,QAAAA,EAAUH;AAAgB,KAAA;AAE3C;;;;;;;;AAQC,IACM,MAAMI,YAAAA,GAAe,CAC1BC,YACAC,YAAAA,EACAN,eAAAA,GAAAA;AAEA,IAAA,IAAI,CAACM,YAAAA,IAAgBA,YAAAA,CAAaC,IAAI,KAAK,CAAA,EAAG;QAC5C,OAAO;YAAEC,KAAAA,EAAO;AAACV,gBAAAA,UAAAA,CAAWO,UAAAA,EAAYL,eAAAA;AAAiB,aAAA;YAAES,aAAAA,EAAe;AAAM,SAAA;AAClF,IAAA;IAEA,MAAMC,SAAAA,GACJL,UAAAA,CAAWJ,IAAI,KAAK,MAAA,GAASU,kBAAAA,CAASN,UAAAA,CAAWO,EAAE,CAAA,GAAIC,mBAAAA,CAAUR,UAAAA,CAAWO,EAAE,CAAA;AAEhF,IAAA,IAAI,CAACN,YAAAA,CAAaQ,GAAG,CAACJ,SAAAA,CAAAA,EAAY;QAChC,OAAO;YAAEF,KAAAA,EAAO;AAACV,gBAAAA,UAAAA,CAAWO,UAAAA,EAAYL,eAAAA;AAAiB,aAAA;YAAES,aAAAA,EAAe;AAAM,SAAA;AAClF,IAAA;AAEA,IAAA,MAAMD,QAAwB,EAAE;IAEhCF,YAAAA,CAAaS,OAAO,CAAC,CAACC,GAAAA,GAAAA;QACpB,MAAMC,SAAAA,GAAYD,GAAAA,CAAIE,OAAO,CAAC,GAAA,CAAA;AAC9B,QAAA,MAAMjB,IAAAA,GAAOe,GAAAA,CAAIG,KAAK,CAAC,CAAA,EAAGF,SAAAA,CAAAA;AAC1B,QAAA,MAAML,EAAAA,GAAKQ,MAAAA,CAAOJ,GAAAA,CAAIG,KAAK,CAACF,SAAAA,GAAY,CAAA,CAAA,CAAA;AAExC,QAAA,IAAIhB,SAAS,OAAA,EAAS;AACpBO,YAAAA,KAAAA,CAAMa,IAAI,CAAC;gBACTpB,IAAAA,EAAM,MAAA;AACNW,gBAAAA,EAAAA;gBACAU,IAAAA,EAAMjB,UAAAA,CAAWJ,IAAI,KAAK,MAAA,IAAUI,UAAAA,CAAWO,EAAE,KAAKA,EAAAA,GAAKP,UAAAA,CAAWiB,IAAI,GAAG,EAAA;gBAC7EpB,QAAAA,EAAUF;AACZ,aAAA,CAAA;AACA,YAAA;AACF,QAAA;AAEAQ,QAAAA,KAAAA,CAAMa,IAAI,CAAC;YACTpB,IAAAA,EAAM,QAAA;AACNW,YAAAA,EAAAA;YACAU,IAAAA,EAAMjB,UAAAA,CAAWJ,IAAI,KAAK,QAAA,IAAYI,UAAAA,CAAWO,EAAE,KAAKA,EAAAA,GAAKP,UAAAA,CAAWiB,IAAI,GAAG,EAAA;YAC/EnB,QAAAA,EAAUH;AACZ,SAAA,CAAA;AACF,IAAA,CAAA,CAAA;IAEA,OAAO;AAAEQ,QAAAA,KAAAA;QAAOC,aAAAA,EAAe;AAAK,KAAA;AACtC;;;;"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { assetKey, folderKey } from '../../utils/selection.mjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Stamp an item with the authoritative current-folder location. Drag/selection is
|
|
5
|
+
* page-scoped to the current folder, so this is more reliable than the item's own
|
|
6
|
+
* `folderId`/`parentId` — a dragged folder's `parent` is not populated by the
|
|
7
|
+
* folders query, so its `parentId` would otherwise collapse to `null`.
|
|
8
|
+
*/ const locateItem = (item, currentFolderId)=>item.kind === 'file' ? {
|
|
9
|
+
...item,
|
|
10
|
+
folderId: currentFolderId
|
|
11
|
+
} : {
|
|
12
|
+
...item,
|
|
13
|
+
parentId: currentFolderId
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Derive the drag payload once at drag start.
|
|
17
|
+
*
|
|
18
|
+
* - Dragging a selected item moves the complete current selection.
|
|
19
|
+
* - Dragging an unselected item moves only that item.
|
|
20
|
+
*
|
|
21
|
+
* Selection is page-scoped to the current folder, so every item is stamped with
|
|
22
|
+
* `currentFolderId` as its location for move validation.
|
|
23
|
+
*/ const buildDragSet = (activeData, selectedKeys, currentFolderId)=>{
|
|
24
|
+
if (!selectedKeys || selectedKeys.size === 0) {
|
|
25
|
+
return {
|
|
26
|
+
items: [
|
|
27
|
+
locateItem(activeData, currentFolderId)
|
|
28
|
+
],
|
|
29
|
+
fromSelection: false
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const activeKey = activeData.kind === 'file' ? assetKey(activeData.id) : folderKey(activeData.id);
|
|
33
|
+
if (!selectedKeys.has(activeKey)) {
|
|
34
|
+
return {
|
|
35
|
+
items: [
|
|
36
|
+
locateItem(activeData, currentFolderId)
|
|
37
|
+
],
|
|
38
|
+
fromSelection: false
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
const items = [];
|
|
42
|
+
selectedKeys.forEach((key)=>{
|
|
43
|
+
const separator = key.indexOf(':');
|
|
44
|
+
const kind = key.slice(0, separator);
|
|
45
|
+
const id = Number(key.slice(separator + 1));
|
|
46
|
+
if (kind === 'asset') {
|
|
47
|
+
items.push({
|
|
48
|
+
kind: 'file',
|
|
49
|
+
id,
|
|
50
|
+
name: activeData.kind === 'file' && activeData.id === id ? activeData.name : '',
|
|
51
|
+
folderId: currentFolderId
|
|
52
|
+
});
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
items.push({
|
|
56
|
+
kind: 'folder',
|
|
57
|
+
id,
|
|
58
|
+
name: activeData.kind === 'folder' && activeData.id === id ? activeData.name : '',
|
|
59
|
+
parentId: currentFolderId
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
return {
|
|
63
|
+
items,
|
|
64
|
+
fromSelection: true
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export { buildDragSet };
|
|
69
|
+
//# sourceMappingURL=buildDragSet.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildDragSet.mjs","sources":["../../../../../../../admin/src/future/pages/Assets/components/Dnd/buildDragSet.ts"],"sourcesContent":["import { assetKey, folderKey, type ItemKey } from '../../utils/selection';\n\nimport type { DragItemData } from '../../../../types/dnd';\n\nexport interface DragSet {\n items: DragItemData[];\n /** True when the active item was already selected — membership is the full selection. */\n fromSelection: boolean;\n}\n\n/**\n * Stamp an item with the authoritative current-folder location. Drag/selection is\n * page-scoped to the current folder, so this is more reliable than the item's own\n * `folderId`/`parentId` — a dragged folder's `parent` is not populated by the\n * folders query, so its `parentId` would otherwise collapse to `null`.\n */\nconst locateItem = (item: DragItemData, currentFolderId: number | null): DragItemData =>\n item.kind === 'file'\n ? { ...item, folderId: currentFolderId }\n : { ...item, parentId: currentFolderId };\n\n/**\n * Derive the drag payload once at drag start.\n *\n * - Dragging a selected item moves the complete current selection.\n * - Dragging an unselected item moves only that item.\n *\n * Selection is page-scoped to the current folder, so every item is stamped with\n * `currentFolderId` as its location for move validation.\n */\nexport const buildDragSet = (\n activeData: DragItemData,\n selectedKeys: Set<ItemKey> | undefined,\n currentFolderId: number | null\n): DragSet => {\n if (!selectedKeys || selectedKeys.size === 0) {\n return { items: [locateItem(activeData, currentFolderId)], fromSelection: false };\n }\n\n const activeKey: ItemKey =\n activeData.kind === 'file' ? assetKey(activeData.id) : folderKey(activeData.id);\n\n if (!selectedKeys.has(activeKey)) {\n return { items: [locateItem(activeData, currentFolderId)], fromSelection: false };\n }\n\n const items: DragItemData[] = [];\n\n selectedKeys.forEach((key) => {\n const separator = key.indexOf(':');\n const kind = key.slice(0, separator);\n const id = Number(key.slice(separator + 1));\n\n if (kind === 'asset') {\n items.push({\n kind: 'file',\n id,\n name: activeData.kind === 'file' && activeData.id === id ? activeData.name : '',\n folderId: currentFolderId,\n });\n return;\n }\n\n items.push({\n kind: 'folder',\n id,\n name: activeData.kind === 'folder' && activeData.id === id ? activeData.name : '',\n parentId: currentFolderId,\n });\n });\n\n return { items, fromSelection: true };\n};\n"],"names":["locateItem","item","currentFolderId","kind","folderId","parentId","buildDragSet","activeData","selectedKeys","size","items","fromSelection","activeKey","assetKey","id","folderKey","has","forEach","key","separator","indexOf","slice","Number","push","name"],"mappings":";;AAUA;;;;;IAMA,MAAMA,aAAa,CAACC,IAAAA,EAAoBC,kBACtCD,IAAAA,CAAKE,IAAI,KAAK,MAAA,GACV;AAAE,QAAA,GAAGF,IAAI;QAAEG,QAAAA,EAAUF;KAAgB,GACrC;AAAE,QAAA,GAAGD,IAAI;QAAEI,QAAAA,EAAUH;AAAgB,KAAA;AAE3C;;;;;;;;AAQC,IACM,MAAMI,YAAAA,GAAe,CAC1BC,YACAC,YAAAA,EACAN,eAAAA,GAAAA;AAEA,IAAA,IAAI,CAACM,YAAAA,IAAgBA,YAAAA,CAAaC,IAAI,KAAK,CAAA,EAAG;QAC5C,OAAO;YAAEC,KAAAA,EAAO;AAACV,gBAAAA,UAAAA,CAAWO,UAAAA,EAAYL,eAAAA;AAAiB,aAAA;YAAES,aAAAA,EAAe;AAAM,SAAA;AAClF,IAAA;IAEA,MAAMC,SAAAA,GACJL,UAAAA,CAAWJ,IAAI,KAAK,MAAA,GAASU,QAAAA,CAASN,UAAAA,CAAWO,EAAE,CAAA,GAAIC,SAAAA,CAAUR,UAAAA,CAAWO,EAAE,CAAA;AAEhF,IAAA,IAAI,CAACN,YAAAA,CAAaQ,GAAG,CAACJ,SAAAA,CAAAA,EAAY;QAChC,OAAO;YAAEF,KAAAA,EAAO;AAACV,gBAAAA,UAAAA,CAAWO,UAAAA,EAAYL,eAAAA;AAAiB,aAAA;YAAES,aAAAA,EAAe;AAAM,SAAA;AAClF,IAAA;AAEA,IAAA,MAAMD,QAAwB,EAAE;IAEhCF,YAAAA,CAAaS,OAAO,CAAC,CAACC,GAAAA,GAAAA;QACpB,MAAMC,SAAAA,GAAYD,GAAAA,CAAIE,OAAO,CAAC,GAAA,CAAA;AAC9B,QAAA,MAAMjB,IAAAA,GAAOe,GAAAA,CAAIG,KAAK,CAAC,CAAA,EAAGF,SAAAA,CAAAA;AAC1B,QAAA,MAAML,EAAAA,GAAKQ,MAAAA,CAAOJ,GAAAA,CAAIG,KAAK,CAACF,SAAAA,GAAY,CAAA,CAAA,CAAA;AAExC,QAAA,IAAIhB,SAAS,OAAA,EAAS;AACpBO,YAAAA,KAAAA,CAAMa,IAAI,CAAC;gBACTpB,IAAAA,EAAM,MAAA;AACNW,gBAAAA,EAAAA;gBACAU,IAAAA,EAAMjB,UAAAA,CAAWJ,IAAI,KAAK,MAAA,IAAUI,UAAAA,CAAWO,EAAE,KAAKA,EAAAA,GAAKP,UAAAA,CAAWiB,IAAI,GAAG,EAAA;gBAC7EpB,QAAAA,EAAUF;AACZ,aAAA,CAAA;AACA,YAAA;AACF,QAAA;AAEAQ,QAAAA,KAAAA,CAAMa,IAAI,CAAC;YACTpB,IAAAA,EAAM,QAAA;AACNW,YAAAA,EAAAA;YACAU,IAAAA,EAAMjB,UAAAA,CAAWJ,IAAI,KAAK,QAAA,IAAYI,UAAAA,CAAWO,EAAE,KAAKA,EAAAA,GAAKP,UAAAA,CAAWiB,IAAI,GAAG,EAAA;YAC/EnB,QAAAA,EAAUH;AACZ,SAAA,CAAA;AACF,IAAA,CAAA,CAAA;IAEA,OAAO;AAAEQ,QAAAA,KAAAA;QAAOC,aAAAA,EAAe;AAAK,KAAA;AACtC;;;;"}
|