@deephaven/file-explorer 0.19.2-beta.0 → 0.19.2-beta.4
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/FileList.js
CHANGED
|
@@ -150,7 +150,7 @@ export function getItemIcon(item) {
|
|
|
150
150
|
*/
|
|
151
151
|
|
|
152
152
|
export function getMoveOperation(draggedItems, targetItem) {
|
|
153
|
-
if (draggedItems.length === 0 ||
|
|
153
|
+
if (draggedItems.length === 0 || targetItem == null) {
|
|
154
154
|
throw new Error('No items to move');
|
|
155
155
|
}
|
|
156
156
|
|
|
@@ -208,7 +208,7 @@ export var FileList = props => {
|
|
|
208
208
|
var itemList = useRef(null);
|
|
209
209
|
var fileList = useRef(null);
|
|
210
210
|
var getItems = useCallback(ranges => {
|
|
211
|
-
if (ranges.length === 0 ||
|
|
211
|
+
if (ranges.length === 0 || loadedViewport == null) {
|
|
212
212
|
return [];
|
|
213
213
|
}
|
|
214
214
|
|
package/dist/FileList.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileList.js","names":["ItemList","Tooltip","dhPython","vsCode","vsFolder","vsFolderOpened","Log","RangeUtils","FontAwesomeIcon","classNames","React","useCallback","useEffect","useMemo","useRef","useState","isDirectory","FileUtils","MIME_TYPE","log","module","getPathFromItem","file","makePath","filename","getPath","DEFAULT_ROW_HEIGHT","DRAG_HOVER_TIMEOUT","ITEM_LIST_CLASS_NAME","renderFileListItem","props","children","draggedItems","isDragInProgress","isDropTargetValid","isSelected","item","itemIndex","dropTargetItem","onDragStart","onDragOver","onDragEnd","onDrop","isDragged","some","draggedItem","id","itemPath","dropTargetPath","isExactDropTarget","isInDropTarget","isInvalidDropTarget","icon","getItemIcon","depth","getDepth","depthLines","Array","fill","map","value","index","e","basename","modifiers","preventOverflow","boundariesElement","placement","isExpanded","mimeType","getMimeType","PYTHON","getMoveOperation","targetItem","length","Error","targetPath","startsWith","files","FileList","isMultiSelect","table","onFocusChange","undefined","onMove","onSelect","onSelectionChange","renderItem","rowHeight","overscanCount","DEFAULT_OVERSCAN","loadedViewport","setLoadedViewport","items","offset","itemCount","viewport","setViewport","top","bottom","setDropTargetItem","setDraggedItems","dragPlaceholder","setDragPlaceholder","selectedRanges","setSelectedRanges","itemList","fileList","getItems","ranges","i","range","j","push","getItem","getDragPlaceholderText","count","dropItems","debug","current","focusItem","err","error","handleSelect","event","setExpanded","handleItemDragStart","debug2","draggedRanges","resetMouseState","newDragPlaceholder","document","createElement","innerHTML","className","body","appendChild","dataTransfer","setDragImage","effectAllowed","handleItemDragOver","preventDefault","handleItemDragEnd","remove","handleItemDrop","handleItemDragExit","handleListDragOver","target","Element","classList","contains","type","handleListDrop","handleSelectionChange","newSelectedRanges","selectedItems","handleFocusChange","focusIndex","focusedItem","handleViewportChange","focusedPath","collapseAll","updateTableViewport","Math","max","setLoadedViewportAndReturnCleanup","listenerRemover","onUpdate","newViewport","itemName","size","expandFolderOnHover","timeout","setTimeout","clearTimeout","renderWrapper","itemProps","onDragExit"],"sources":["../src/FileList.tsx"],"sourcesContent":["import {\n ItemList,\n Range,\n RenderItemProps,\n Tooltip,\n} from '@deephaven/components';\nimport { dhPython, vsCode, vsFolder, vsFolderOpened } from '@deephaven/icons';\nimport Log from '@deephaven/log';\nimport { RangeUtils } from '@deephaven/utils';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport classNames from 'classnames';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { FileStorageItem, FileStorageTable, isDirectory } from './FileStorage';\nimport './FileList.scss';\nimport FileUtils, { MIME_TYPE } from './FileUtils';\n\nconst log = Log.module('FileList');\n\nexport type LoadedViewport = {\n items: FileStorageItem[];\n offset: number;\n itemCount: number;\n};\n\nexport type ListViewport = {\n top: number;\n bottom: number;\n};\n\nexport type FileListRenderItemProps = RenderItemProps<FileStorageItem> & {\n children?: JSX.Element;\n dropTargetItem?: FileStorageItem;\n draggedItems?: FileStorageItem[];\n isDragInProgress: boolean;\n isDropTargetValid: boolean;\n\n onDragStart(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragOver(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragEnd(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDrop(index: number, e: React.DragEvent<HTMLDivElement>): void;\n};\n\nexport interface FileListProps {\n table: FileStorageTable;\n\n isMultiSelect?: boolean;\n focusedPath?: string;\n\n onFocusChange?: (focusedItem?: FileStorageItem) => void;\n onMove: (files: FileStorageItem[], path: string) => void;\n onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => void;\n onSelectionChange?: (selectedItems: FileStorageItem[]) => void;\n\n renderItem?: (props: FileListRenderItemProps) => JSX.Element;\n\n /** Height of each item in the list */\n rowHeight?: number;\n\n overscanCount?: number;\n}\n\nexport const getPathFromItem = (file: FileStorageItem): string =>\n isDirectory(file)\n ? FileUtils.makePath(file.filename)\n : FileUtils.getPath(file.filename);\n\nexport const DEFAULT_ROW_HEIGHT = 26;\n\n// How long you need to hover over a directory before it expands\nexport const DRAG_HOVER_TIMEOUT = 500;\n\nconst ITEM_LIST_CLASS_NAME = 'item-list-scroll-pane';\n\nexport const renderFileListItem = (\n props: FileListRenderItemProps\n): JSX.Element => {\n const {\n children,\n draggedItems,\n isDragInProgress,\n isDropTargetValid,\n isSelected,\n item,\n itemIndex,\n dropTargetItem,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n } = props;\n\n const isDragged =\n draggedItems?.some(draggedItem => draggedItem.id === item.id) ?? false;\n const itemPath = getPathFromItem(item);\n const dropTargetPath =\n isDragInProgress && dropTargetItem ? getPathFromItem(dropTargetItem) : null;\n\n const isExactDropTarget =\n isDragInProgress &&\n isDropTargetValid &&\n isDirectory(item) &&\n dropTargetPath === itemPath;\n const isInDropTarget =\n isDragInProgress && isDropTargetValid && dropTargetPath === itemPath;\n const isInvalidDropTarget =\n isDragInProgress && !isDropTargetValid && dropTargetPath === itemPath;\n\n const icon = getItemIcon(item);\n const depth = FileUtils.getDepth(item.filename);\n const depthLines = Array(depth)\n .fill(null)\n .map((value, index) => (\n // eslint-disable-next-line react/no-array-index-key\n <span className=\"file-list-depth-line\" key={index} />\n ));\n\n return (\n <div\n className={classNames(\n 'd-flex w-100 align-items-center',\n 'file-list-item',\n {\n 'is-dragged': isDragged,\n 'is-exact-drop-target': isExactDropTarget,\n 'is-in-drop-target': isInDropTarget,\n 'is-invalid-drop-target': isInvalidDropTarget,\n 'is-selected': isSelected,\n }\n )}\n onDragStart={e => onDragStart(itemIndex, e)}\n onDragOver={e => onDragOver(itemIndex, e)}\n onDragEnd={e => onDragEnd(itemIndex, e)}\n onDrop={e => onDrop(itemIndex, e)}\n draggable\n role=\"presentation\"\n aria-label={item.basename}\n >\n {depthLines}{' '}\n <FontAwesomeIcon icon={icon} className=\"item-icon\" fixedWidth />{' '}\n <span className=\"truncation-wrapper\">\n {children ?? item.basename}\n <Tooltip\n options={{\n modifiers: { preventOverflow: { boundariesElement: 'window' } },\n placement: 'left',\n }}\n >\n {children ?? item.basename}\n </Tooltip>\n </span>\n </div>\n );\n};\n\n/**\n * Get the icon definition for a file or folder item\n * @param item Item to get the icon for\n * @returns Icon definition to pass in the FontAwesomeIcon icon prop\n */\nexport function getItemIcon(item: FileStorageItem): IconDefinition {\n if (isDirectory(item)) {\n return item.isExpanded ? vsFolderOpened : vsFolder;\n }\n const mimeType = FileUtils.getMimeType(item.basename);\n switch (mimeType) {\n case MIME_TYPE.PYTHON:\n return dhPython;\n default:\n return vsCode;\n }\n}\n\n/**\n * Get the move operation for the current selection and the given target. Throws if the operation is invalid.\n */\nexport function getMoveOperation(\n draggedItems: FileStorageItem[],\n targetItem: FileStorageItem\n): { files: FileStorageItem[]; targetPath: string } {\n if (draggedItems.length === 0 || !targetItem) {\n throw new Error('No items to move');\n }\n\n const targetPath = getPathFromItem(targetItem);\n if (\n draggedItems.some(\n ({ filename }) => FileUtils.getPath(filename) === targetPath\n )\n ) {\n // Cannot drop if target is one of the dragged items is already in the target folder\n throw new Error('File already in the destination folder');\n }\n if (\n draggedItems.some(\n item =>\n isDirectory(item) &&\n targetPath.startsWith(FileUtils.makePath(item.filename))\n )\n ) {\n // Cannot drop if target is a child of one of the directories being moved\n throw new Error('Destination folder cannot be a child of a dragged folder');\n }\n return { files: draggedItems, targetPath };\n}\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorageTable.\n */\nexport const FileList = (props: FileListProps): JSX.Element => {\n const {\n isMultiSelect = false,\n table,\n onFocusChange = () => undefined,\n onMove,\n onSelect,\n onSelectionChange = () => undefined,\n renderItem = renderFileListItem,\n rowHeight = DEFAULT_ROW_HEIGHT,\n overscanCount = ItemList.DEFAULT_OVERSCAN,\n } = props;\n const [loadedViewport, setLoadedViewport] = useState<LoadedViewport>(() => ({\n items: [],\n offset: 0,\n itemCount: 0,\n }));\n const [viewport, setViewport] = useState<ListViewport>({\n top: 0,\n bottom: 0,\n });\n\n const [dropTargetItem, setDropTargetItem] = useState<FileStorageItem>();\n const [draggedItems, setDraggedItems] = useState<FileStorageItem[]>();\n const [dragPlaceholder, setDragPlaceholder] = useState<HTMLDivElement>();\n const [selectedRanges, setSelectedRanges] = useState([] as Range[]);\n\n const itemList = useRef<ItemList<FileStorageItem>>(null);\n const fileList = useRef<HTMLDivElement>(null);\n\n const getItems = useCallback(\n (ranges: Range[]): FileStorageItem[] => {\n if (ranges.length === 0 || !loadedViewport) {\n return [];\n }\n\n const items = [] as FileStorageItem[];\n for (let i = 0; i < ranges.length; i += 1) {\n const range = ranges[i];\n for (let j = range[0]; j <= range[1]; j += 1) {\n if (\n j >= loadedViewport.offset &&\n j < loadedViewport.offset + loadedViewport.items.length\n ) {\n items.push(loadedViewport.items[j - loadedViewport.offset]);\n }\n }\n }\n return items;\n },\n [loadedViewport]\n );\n\n const getItem = useCallback(\n (itemIndex: number): FileStorageItem | undefined => {\n const items = getItems([[itemIndex, itemIndex]]);\n if (items.length > 0) {\n return items[0];\n }\n },\n [getItems]\n );\n\n /**\n * Get the placeholder text to show when a drag operation is in progress\n */\n const getDragPlaceholderText = useCallback(() => {\n const count = RangeUtils.count(selectedRanges);\n if (count === 0) {\n return null;\n }\n\n if (count === 1) {\n const index = selectedRanges[0][0];\n const item = getItem(index);\n if (item != null) {\n return item.filename;\n }\n }\n return `${count} items`;\n }, [getItem, selectedRanges]);\n\n /**\n * Drop the currently dragged items at the currently set drop target.\n * If an itemIndex is provided, focus that index after the drop.\n */\n const dropItems = useCallback(\n (itemIndex?: number) => {\n if (!draggedItems || !dropTargetItem) {\n return;\n }\n\n log.debug('dropItems', draggedItems, 'to', itemIndex);\n\n try {\n const { files, targetPath } = getMoveOperation(\n draggedItems,\n dropTargetItem\n );\n onMove(files, targetPath);\n if (itemIndex != null) {\n setSelectedRanges([[itemIndex, itemIndex]]);\n itemList.current?.focusItem(itemIndex);\n }\n } catch (err) {\n log.error('Unable to complete move', err);\n }\n },\n [draggedItems, dropTargetItem, onMove]\n );\n\n const handleSelect = useCallback(\n (itemIndex: number, event: React.SyntheticEvent) => {\n const item = loadedViewport.items[itemIndex - loadedViewport.offset];\n if (item !== undefined) {\n log.debug('handleItemClick', item);\n\n onSelect(item, event);\n if (isDirectory(item)) {\n table?.setExpanded(item.filename, !item.isExpanded);\n }\n }\n },\n [loadedViewport, onSelect, table]\n );\n\n const handleItemDragStart = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n log.debug2('handleItemDragStart', itemIndex, selectedRanges);\n\n let draggedRanges = selectedRanges;\n if (!RangeUtils.isSelected(selectedRanges, itemIndex)) {\n draggedRanges = [[itemIndex, itemIndex]];\n setSelectedRanges(draggedRanges);\n }\n\n setDraggedItems(getItems(draggedRanges));\n\n // We need to reset reset the mouse state since we steal the drag\n itemList.current?.resetMouseState();\n\n const newDragPlaceholder = document.createElement('div');\n newDragPlaceholder.innerHTML = `<div class=\"dnd-placeholder-content\">${getDragPlaceholderText()}</div>`;\n newDragPlaceholder.className = 'file-list-dnd-placeholder';\n document.body.appendChild(newDragPlaceholder);\n e.dataTransfer.setDragImage(newDragPlaceholder, 0, 0);\n e.dataTransfer.effectAllowed = 'move';\n setDragPlaceholder(newDragPlaceholder);\n },\n [getDragPlaceholderText, getItems, selectedRanges]\n );\n\n const handleItemDragOver = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n\n log.debug2('handleItemDragOver', e);\n setDropTargetItem(getItem(itemIndex));\n },\n [getItem]\n );\n\n const handleItemDragEnd = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n log.debug('handleItemDragEnd', itemIndex);\n\n dragPlaceholder?.remove();\n\n // Drag end is triggered after drop\n // Also drop isn't triggered if drag end is outside of the list\n setDraggedItems(undefined);\n setDropTargetItem(undefined);\n setDragPlaceholder(undefined);\n },\n [dragPlaceholder]\n );\n\n const handleItemDrop = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n dropItems(itemIndex);\n },\n [dropItems]\n );\n\n const handleItemDragExit = useCallback(() => {\n log.debug2('handleItemDragExit');\n setDropTargetItem(undefined);\n }, []);\n\n const handleListDragOver = useCallback(\n (e: React.DragEvent<HTMLDivElement>) => {\n if (\n e.target instanceof Element &&\n e.target.classList.contains(ITEM_LIST_CLASS_NAME)\n ) {\n // Need to prevent default to enable drop\n // https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#droptargets\n e.preventDefault();\n\n log.debug2('handleListDragOver', e);\n setDropTargetItem({\n type: 'directory',\n filename: '/',\n basename: '/',\n id: '/',\n });\n }\n },\n []\n );\n\n const handleListDrop = useCallback(\n (e: React.DragEvent<HTMLDivElement>) => {\n if (\n e.target instanceof Element &&\n e.target.classList.contains(ITEM_LIST_CLASS_NAME)\n ) {\n log.debug('handleListDrop');\n dropItems();\n }\n },\n [dropItems]\n );\n\n const handleSelectionChange = useCallback(\n newSelectedRanges => {\n log.debug2('handleSelectionChange', newSelectedRanges);\n if (newSelectedRanges !== selectedRanges) {\n setSelectedRanges(newSelectedRanges);\n const selectedItems = getItems(newSelectedRanges);\n onSelectionChange(selectedItems);\n }\n },\n [getItems, onSelectionChange, selectedRanges]\n );\n\n const handleFocusChange = useCallback(\n focusIndex => {\n log.debug2('handleFocusChange', focusIndex);\n if (focusIndex != null) {\n const [focusedItem] = getItems([[focusIndex, focusIndex]]);\n onFocusChange(focusedItem);\n } else {\n onFocusChange();\n }\n },\n [getItems, onFocusChange]\n );\n\n const handleViewportChange = useCallback(\n (top: number, bottom: number) => {\n log.debug('handleViewportChange', top, bottom);\n if (top !== viewport.top || bottom !== viewport.bottom) {\n setViewport({ top, bottom });\n }\n },\n [viewport]\n );\n\n const isDropTargetValid = useMemo(() => {\n if (!draggedItems || !dropTargetItem) {\n return false;\n }\n\n try {\n getMoveOperation(draggedItems, dropTargetItem);\n log.debug('handleValidateDropTarget true');\n return true;\n } catch (e) {\n log.debug('handleValidateDropTarget false');\n return false;\n }\n }, [draggedItems, dropTargetItem]);\n\n const { focusedPath } = props;\n useEffect(() => {\n if (focusedPath !== undefined) {\n if (focusedPath === '/') {\n table.collapseAll();\n } else {\n table.setExpanded(focusedPath, false);\n table.setExpanded(focusedPath, true);\n }\n }\n }, [table, focusedPath]);\n\n useEffect(\n function updateTableViewport() {\n log.debug('updating table viewport', viewport);\n table?.setViewport({\n top: Math.max(0, viewport.top - overscanCount),\n bottom: viewport.bottom + overscanCount,\n });\n },\n [overscanCount, table, viewport]\n );\n\n // Listen for table updates\n useEffect(\n function setLoadedViewportAndReturnCleanup() {\n const listenerRemover = table.onUpdate(newViewport => {\n setLoadedViewport({\n items: newViewport.items.map(item => ({\n ...item,\n itemName: item.basename,\n })),\n offset: newViewport.offset,\n itemCount: table.size,\n });\n });\n return () => {\n listenerRemover();\n };\n },\n [table]\n );\n\n // Expand a folder if hovering over it\n useEffect(\n function expandFolderOnHover() {\n if (\n dropTargetItem != null &&\n isDirectory(dropTargetItem) &&\n dropTargetItem.filename !== '/'\n ) {\n const timeout = setTimeout(() => {\n if (!dropTargetItem.isExpanded) {\n table?.setExpanded(dropTargetItem.filename, true);\n }\n }, DRAG_HOVER_TIMEOUT);\n return () => clearTimeout(timeout);\n }\n },\n [dropTargetItem, table]\n );\n\n const renderWrapper = useCallback(\n itemProps =>\n renderItem({\n ...itemProps,\n isDragInProgress: draggedItems != null,\n dropTargetItem,\n draggedItems,\n isDropTargetValid,\n onDragStart: handleItemDragStart,\n onDragEnd: handleItemDragEnd,\n onDragOver: handleItemDragOver,\n onDragExit: handleItemDragExit,\n onDrop: handleItemDrop,\n }),\n [\n handleItemDragEnd,\n handleItemDragExit,\n handleItemDragOver,\n handleItemDragStart,\n handleItemDrop,\n draggedItems,\n dropTargetItem,\n isDropTargetValid,\n renderItem,\n ]\n );\n\n return (\n <div\n ref={fileList}\n className={classNames('file-list', {\n 'is-dragging': draggedItems != null,\n })}\n onDragOver={handleListDragOver}\n onDrop={handleListDrop}\n >\n <ItemList\n ref={itemList}\n items={loadedViewport.items}\n itemCount={loadedViewport.itemCount}\n offset={loadedViewport.offset}\n onFocusChange={handleFocusChange}\n onSelect={handleSelect}\n onSelectionChange={handleSelectionChange}\n onViewportChange={handleViewportChange}\n selectedRanges={selectedRanges}\n renderItem={renderWrapper}\n rowHeight={rowHeight}\n isMultiSelect={isMultiSelect}\n isDragSelect={false}\n isDeselectOnClick={false}\n />\n </div>\n );\n};\n\nexport default FileList;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FileList.js","names":["ItemList","Tooltip","dhPython","vsCode","vsFolder","vsFolderOpened","Log","RangeUtils","FontAwesomeIcon","classNames","React","useCallback","useEffect","useMemo","useRef","useState","isDirectory","FileUtils","MIME_TYPE","log","module","getPathFromItem","file","makePath","filename","getPath","DEFAULT_ROW_HEIGHT","DRAG_HOVER_TIMEOUT","ITEM_LIST_CLASS_NAME","renderFileListItem","props","children","draggedItems","isDragInProgress","isDropTargetValid","isSelected","item","itemIndex","dropTargetItem","onDragStart","onDragOver","onDragEnd","onDrop","isDragged","some","draggedItem","id","itemPath","dropTargetPath","isExactDropTarget","isInDropTarget","isInvalidDropTarget","icon","getItemIcon","depth","getDepth","depthLines","Array","fill","map","value","index","e","basename","modifiers","preventOverflow","boundariesElement","placement","isExpanded","mimeType","getMimeType","PYTHON","getMoveOperation","targetItem","length","Error","targetPath","startsWith","files","FileList","isMultiSelect","table","onFocusChange","undefined","onMove","onSelect","onSelectionChange","renderItem","rowHeight","overscanCount","DEFAULT_OVERSCAN","loadedViewport","setLoadedViewport","items","offset","itemCount","viewport","setViewport","top","bottom","setDropTargetItem","setDraggedItems","dragPlaceholder","setDragPlaceholder","selectedRanges","setSelectedRanges","itemList","fileList","getItems","ranges","i","range","j","push","getItem","getDragPlaceholderText","count","dropItems","debug","current","focusItem","err","error","handleSelect","event","setExpanded","handleItemDragStart","debug2","draggedRanges","resetMouseState","newDragPlaceholder","document","createElement","innerHTML","className","body","appendChild","dataTransfer","setDragImage","effectAllowed","handleItemDragOver","preventDefault","handleItemDragEnd","remove","handleItemDrop","handleItemDragExit","handleListDragOver","target","Element","classList","contains","type","handleListDrop","handleSelectionChange","newSelectedRanges","selectedItems","handleFocusChange","focusIndex","focusedItem","handleViewportChange","focusedPath","collapseAll","updateTableViewport","Math","max","setLoadedViewportAndReturnCleanup","listenerRemover","onUpdate","newViewport","itemName","size","expandFolderOnHover","timeout","setTimeout","clearTimeout","renderWrapper","itemProps","onDragExit"],"sources":["../src/FileList.tsx"],"sourcesContent":["import {\n ItemList,\n Range,\n RenderItemProps,\n Tooltip,\n} from '@deephaven/components';\nimport { dhPython, vsCode, vsFolder, vsFolderOpened } from '@deephaven/icons';\nimport Log from '@deephaven/log';\nimport { RangeUtils } from '@deephaven/utils';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport classNames from 'classnames';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { FileStorageItem, FileStorageTable, isDirectory } from './FileStorage';\nimport './FileList.scss';\nimport FileUtils, { MIME_TYPE } from './FileUtils';\n\nconst log = Log.module('FileList');\n\nexport type LoadedViewport = {\n items: FileStorageItem[];\n offset: number;\n itemCount: number;\n};\n\nexport type ListViewport = {\n top: number;\n bottom: number;\n};\n\nexport type FileListRenderItemProps = RenderItemProps<FileStorageItem> & {\n children?: JSX.Element;\n dropTargetItem?: FileStorageItem;\n draggedItems?: FileStorageItem[];\n isDragInProgress: boolean;\n isDropTargetValid: boolean;\n\n onDragStart(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragOver(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragEnd(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDrop(index: number, e: React.DragEvent<HTMLDivElement>): void;\n};\n\nexport interface FileListProps {\n table: FileStorageTable;\n\n isMultiSelect?: boolean;\n focusedPath?: string;\n\n onFocusChange?: (focusedItem?: FileStorageItem) => void;\n onMove: (files: FileStorageItem[], path: string) => void;\n onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => void;\n onSelectionChange?: (selectedItems: FileStorageItem[]) => void;\n\n renderItem?: (props: FileListRenderItemProps) => JSX.Element;\n\n /** Height of each item in the list */\n rowHeight?: number;\n\n overscanCount?: number;\n}\n\nexport const getPathFromItem = (file: FileStorageItem): string =>\n isDirectory(file)\n ? FileUtils.makePath(file.filename)\n : FileUtils.getPath(file.filename);\n\nexport const DEFAULT_ROW_HEIGHT = 26;\n\n// How long you need to hover over a directory before it expands\nexport const DRAG_HOVER_TIMEOUT = 500;\n\nconst ITEM_LIST_CLASS_NAME = 'item-list-scroll-pane';\n\nexport const renderFileListItem = (\n props: FileListRenderItemProps\n): JSX.Element => {\n const {\n children,\n draggedItems,\n isDragInProgress,\n isDropTargetValid,\n isSelected,\n item,\n itemIndex,\n dropTargetItem,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n } = props;\n\n const isDragged =\n draggedItems?.some(draggedItem => draggedItem.id === item.id) ?? false;\n const itemPath = getPathFromItem(item);\n const dropTargetPath =\n isDragInProgress && dropTargetItem ? getPathFromItem(dropTargetItem) : null;\n\n const isExactDropTarget =\n isDragInProgress &&\n isDropTargetValid &&\n isDirectory(item) &&\n dropTargetPath === itemPath;\n const isInDropTarget =\n isDragInProgress && isDropTargetValid && dropTargetPath === itemPath;\n const isInvalidDropTarget =\n isDragInProgress && !isDropTargetValid && dropTargetPath === itemPath;\n\n const icon = getItemIcon(item);\n const depth = FileUtils.getDepth(item.filename);\n const depthLines = Array(depth)\n .fill(null)\n .map((value, index) => (\n // eslint-disable-next-line react/no-array-index-key\n <span className=\"file-list-depth-line\" key={index} />\n ));\n\n return (\n <div\n className={classNames(\n 'd-flex w-100 align-items-center',\n 'file-list-item',\n {\n 'is-dragged': isDragged,\n 'is-exact-drop-target': isExactDropTarget,\n 'is-in-drop-target': isInDropTarget,\n 'is-invalid-drop-target': isInvalidDropTarget,\n 'is-selected': isSelected,\n }\n )}\n onDragStart={e => onDragStart(itemIndex, e)}\n onDragOver={e => onDragOver(itemIndex, e)}\n onDragEnd={e => onDragEnd(itemIndex, e)}\n onDrop={e => onDrop(itemIndex, e)}\n draggable\n role=\"presentation\"\n aria-label={item.basename}\n >\n {depthLines}{' '}\n <FontAwesomeIcon icon={icon} className=\"item-icon\" fixedWidth />{' '}\n <span className=\"truncation-wrapper\">\n {children ?? item.basename}\n <Tooltip\n options={{\n modifiers: { preventOverflow: { boundariesElement: 'window' } },\n placement: 'left',\n }}\n >\n {children ?? item.basename}\n </Tooltip>\n </span>\n </div>\n );\n};\n\n/**\n * Get the icon definition for a file or folder item\n * @param item Item to get the icon for\n * @returns Icon definition to pass in the FontAwesomeIcon icon prop\n */\nexport function getItemIcon(item: FileStorageItem): IconDefinition {\n if (isDirectory(item)) {\n return item.isExpanded ? vsFolderOpened : vsFolder;\n }\n const mimeType = FileUtils.getMimeType(item.basename);\n switch (mimeType) {\n case MIME_TYPE.PYTHON:\n return dhPython;\n default:\n return vsCode;\n }\n}\n\n/**\n * Get the move operation for the current selection and the given target. Throws if the operation is invalid.\n */\nexport function getMoveOperation(\n draggedItems: FileStorageItem[],\n targetItem: FileStorageItem\n): { files: FileStorageItem[]; targetPath: string } {\n if (draggedItems.length === 0 || targetItem == null) {\n throw new Error('No items to move');\n }\n\n const targetPath = getPathFromItem(targetItem);\n if (\n draggedItems.some(\n ({ filename }) => FileUtils.getPath(filename) === targetPath\n )\n ) {\n // Cannot drop if target is one of the dragged items is already in the target folder\n throw new Error('File already in the destination folder');\n }\n if (\n draggedItems.some(\n item =>\n isDirectory(item) &&\n targetPath.startsWith(FileUtils.makePath(item.filename))\n )\n ) {\n // Cannot drop if target is a child of one of the directories being moved\n throw new Error('Destination folder cannot be a child of a dragged folder');\n }\n return { files: draggedItems, targetPath };\n}\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorageTable.\n */\nexport const FileList = (props: FileListProps): JSX.Element => {\n const {\n isMultiSelect = false,\n table,\n onFocusChange = () => undefined,\n onMove,\n onSelect,\n onSelectionChange = () => undefined,\n renderItem = renderFileListItem,\n rowHeight = DEFAULT_ROW_HEIGHT,\n overscanCount = ItemList.DEFAULT_OVERSCAN,\n } = props;\n const [loadedViewport, setLoadedViewport] = useState<LoadedViewport>(() => ({\n items: [],\n offset: 0,\n itemCount: 0,\n }));\n const [viewport, setViewport] = useState<ListViewport>({\n top: 0,\n bottom: 0,\n });\n\n const [dropTargetItem, setDropTargetItem] = useState<FileStorageItem>();\n const [draggedItems, setDraggedItems] = useState<FileStorageItem[]>();\n const [dragPlaceholder, setDragPlaceholder] = useState<HTMLDivElement>();\n const [selectedRanges, setSelectedRanges] = useState([] as Range[]);\n\n const itemList = useRef<ItemList<FileStorageItem>>(null);\n const fileList = useRef<HTMLDivElement>(null);\n\n const getItems = useCallback(\n (ranges: Range[]): FileStorageItem[] => {\n if (ranges.length === 0 || loadedViewport == null) {\n return [];\n }\n\n const items = [] as FileStorageItem[];\n for (let i = 0; i < ranges.length; i += 1) {\n const range = ranges[i];\n for (let j = range[0]; j <= range[1]; j += 1) {\n if (\n j >= loadedViewport.offset &&\n j < loadedViewport.offset + loadedViewport.items.length\n ) {\n items.push(loadedViewport.items[j - loadedViewport.offset]);\n }\n }\n }\n return items;\n },\n [loadedViewport]\n );\n\n const getItem = useCallback(\n (itemIndex: number): FileStorageItem | undefined => {\n const items = getItems([[itemIndex, itemIndex]]);\n if (items.length > 0) {\n return items[0];\n }\n },\n [getItems]\n );\n\n /**\n * Get the placeholder text to show when a drag operation is in progress\n */\n const getDragPlaceholderText = useCallback(() => {\n const count = RangeUtils.count(selectedRanges);\n if (count === 0) {\n return null;\n }\n\n if (count === 1) {\n const index = selectedRanges[0][0];\n const item = getItem(index);\n if (item != null) {\n return item.filename;\n }\n }\n return `${count} items`;\n }, [getItem, selectedRanges]);\n\n /**\n * Drop the currently dragged items at the currently set drop target.\n * If an itemIndex is provided, focus that index after the drop.\n */\n const dropItems = useCallback(\n (itemIndex?: number) => {\n if (!draggedItems || !dropTargetItem) {\n return;\n }\n\n log.debug('dropItems', draggedItems, 'to', itemIndex);\n\n try {\n const { files, targetPath } = getMoveOperation(\n draggedItems,\n dropTargetItem\n );\n onMove(files, targetPath);\n if (itemIndex != null) {\n setSelectedRanges([[itemIndex, itemIndex]]);\n itemList.current?.focusItem(itemIndex);\n }\n } catch (err) {\n log.error('Unable to complete move', err);\n }\n },\n [draggedItems, dropTargetItem, onMove]\n );\n\n const handleSelect = useCallback(\n (itemIndex: number, event: React.SyntheticEvent) => {\n const item = loadedViewport.items[itemIndex - loadedViewport.offset];\n if (item !== undefined) {\n log.debug('handleItemClick', item);\n\n onSelect(item, event);\n if (isDirectory(item)) {\n table?.setExpanded(item.filename, !item.isExpanded);\n }\n }\n },\n [loadedViewport, onSelect, table]\n );\n\n const handleItemDragStart = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n log.debug2('handleItemDragStart', itemIndex, selectedRanges);\n\n let draggedRanges = selectedRanges;\n if (!RangeUtils.isSelected(selectedRanges, itemIndex)) {\n draggedRanges = [[itemIndex, itemIndex]];\n setSelectedRanges(draggedRanges);\n }\n\n setDraggedItems(getItems(draggedRanges));\n\n // We need to reset reset the mouse state since we steal the drag\n itemList.current?.resetMouseState();\n\n const newDragPlaceholder = document.createElement('div');\n newDragPlaceholder.innerHTML = `<div class=\"dnd-placeholder-content\">${getDragPlaceholderText()}</div>`;\n newDragPlaceholder.className = 'file-list-dnd-placeholder';\n document.body.appendChild(newDragPlaceholder);\n e.dataTransfer.setDragImage(newDragPlaceholder, 0, 0);\n e.dataTransfer.effectAllowed = 'move';\n setDragPlaceholder(newDragPlaceholder);\n },\n [getDragPlaceholderText, getItems, selectedRanges]\n );\n\n const handleItemDragOver = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n\n log.debug2('handleItemDragOver', e);\n setDropTargetItem(getItem(itemIndex));\n },\n [getItem]\n );\n\n const handleItemDragEnd = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n log.debug('handleItemDragEnd', itemIndex);\n\n dragPlaceholder?.remove();\n\n // Drag end is triggered after drop\n // Also drop isn't triggered if drag end is outside of the list\n setDraggedItems(undefined);\n setDropTargetItem(undefined);\n setDragPlaceholder(undefined);\n },\n [dragPlaceholder]\n );\n\n const handleItemDrop = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n dropItems(itemIndex);\n },\n [dropItems]\n );\n\n const handleItemDragExit = useCallback(() => {\n log.debug2('handleItemDragExit');\n setDropTargetItem(undefined);\n }, []);\n\n const handleListDragOver = useCallback(\n (e: React.DragEvent<HTMLDivElement>) => {\n if (\n e.target instanceof Element &&\n e.target.classList.contains(ITEM_LIST_CLASS_NAME)\n ) {\n // Need to prevent default to enable drop\n // https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#droptargets\n e.preventDefault();\n\n log.debug2('handleListDragOver', e);\n setDropTargetItem({\n type: 'directory',\n filename: '/',\n basename: '/',\n id: '/',\n });\n }\n },\n []\n );\n\n const handleListDrop = useCallback(\n (e: React.DragEvent<HTMLDivElement>) => {\n if (\n e.target instanceof Element &&\n e.target.classList.contains(ITEM_LIST_CLASS_NAME)\n ) {\n log.debug('handleListDrop');\n dropItems();\n }\n },\n [dropItems]\n );\n\n const handleSelectionChange = useCallback(\n newSelectedRanges => {\n log.debug2('handleSelectionChange', newSelectedRanges);\n if (newSelectedRanges !== selectedRanges) {\n setSelectedRanges(newSelectedRanges);\n const selectedItems = getItems(newSelectedRanges);\n onSelectionChange(selectedItems);\n }\n },\n [getItems, onSelectionChange, selectedRanges]\n );\n\n const handleFocusChange = useCallback(\n focusIndex => {\n log.debug2('handleFocusChange', focusIndex);\n if (focusIndex != null) {\n const [focusedItem] = getItems([[focusIndex, focusIndex]]);\n onFocusChange(focusedItem);\n } else {\n onFocusChange();\n }\n },\n [getItems, onFocusChange]\n );\n\n const handleViewportChange = useCallback(\n (top: number, bottom: number) => {\n log.debug('handleViewportChange', top, bottom);\n if (top !== viewport.top || bottom !== viewport.bottom) {\n setViewport({ top, bottom });\n }\n },\n [viewport]\n );\n\n const isDropTargetValid = useMemo(() => {\n if (!draggedItems || !dropTargetItem) {\n return false;\n }\n\n try {\n getMoveOperation(draggedItems, dropTargetItem);\n log.debug('handleValidateDropTarget true');\n return true;\n } catch (e) {\n log.debug('handleValidateDropTarget false');\n return false;\n }\n }, [draggedItems, dropTargetItem]);\n\n const { focusedPath } = props;\n useEffect(() => {\n if (focusedPath !== undefined) {\n if (focusedPath === '/') {\n table.collapseAll();\n } else {\n table.setExpanded(focusedPath, false);\n table.setExpanded(focusedPath, true);\n }\n }\n }, [table, focusedPath]);\n\n useEffect(\n function updateTableViewport() {\n log.debug('updating table viewport', viewport);\n table?.setViewport({\n top: Math.max(0, viewport.top - overscanCount),\n bottom: viewport.bottom + overscanCount,\n });\n },\n [overscanCount, table, viewport]\n );\n\n // Listen for table updates\n useEffect(\n function setLoadedViewportAndReturnCleanup() {\n const listenerRemover = table.onUpdate(newViewport => {\n setLoadedViewport({\n items: newViewport.items.map(item => ({\n ...item,\n itemName: item.basename,\n })),\n offset: newViewport.offset,\n itemCount: table.size,\n });\n });\n return () => {\n listenerRemover();\n };\n },\n [table]\n );\n\n // Expand a folder if hovering over it\n useEffect(\n function expandFolderOnHover() {\n if (\n dropTargetItem != null &&\n isDirectory(dropTargetItem) &&\n dropTargetItem.filename !== '/'\n ) {\n const timeout = setTimeout(() => {\n if (!dropTargetItem.isExpanded) {\n table?.setExpanded(dropTargetItem.filename, true);\n }\n }, DRAG_HOVER_TIMEOUT);\n return () => clearTimeout(timeout);\n }\n },\n [dropTargetItem, table]\n );\n\n const renderWrapper = useCallback(\n itemProps =>\n renderItem({\n ...itemProps,\n isDragInProgress: draggedItems != null,\n dropTargetItem,\n draggedItems,\n isDropTargetValid,\n onDragStart: handleItemDragStart,\n onDragEnd: handleItemDragEnd,\n onDragOver: handleItemDragOver,\n onDragExit: handleItemDragExit,\n onDrop: handleItemDrop,\n }),\n [\n handleItemDragEnd,\n handleItemDragExit,\n handleItemDragOver,\n handleItemDragStart,\n handleItemDrop,\n draggedItems,\n dropTargetItem,\n isDropTargetValid,\n renderItem,\n ]\n );\n\n return (\n <div\n ref={fileList}\n className={classNames('file-list', {\n 'is-dragging': draggedItems != null,\n })}\n onDragOver={handleListDragOver}\n onDrop={handleListDrop}\n >\n <ItemList\n ref={itemList}\n items={loadedViewport.items}\n itemCount={loadedViewport.itemCount}\n offset={loadedViewport.offset}\n onFocusChange={handleFocusChange}\n onSelect={handleSelect}\n onSelectionChange={handleSelectionChange}\n onViewportChange={handleViewportChange}\n selectedRanges={selectedRanges}\n renderItem={renderWrapper}\n rowHeight={rowHeight}\n isMultiSelect={isMultiSelect}\n isDragSelect={false}\n isDeselectOnClick={false}\n />\n </div>\n );\n};\n\nexport default FileList;\n"],"mappings":"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"}
|
|
@@ -161,7 +161,7 @@ export var FileListContainer = props => {
|
|
|
161
161
|
}, [handleRenameCancel, handleRenameSubmit, renameItem, validateRenameItem]);
|
|
162
162
|
return /*#__PURE__*/React.createElement("div", {
|
|
163
163
|
className: "file-list-container"
|
|
164
|
-
}, table && /*#__PURE__*/React.createElement(FileList, {
|
|
164
|
+
}, table != null && /*#__PURE__*/React.createElement(FileList, {
|
|
165
165
|
onMove: onMove,
|
|
166
166
|
onSelect: onSelect,
|
|
167
167
|
onSelectionChange: handleSelectionChange,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileListContainer.js","names":["ContextActions","React","useCallback","useMemo","useState","FileList","renderFileListItem","DEFAULT_ROW_HEIGHT","isDirectory","SHORTCUTS","FileUtils","FileListItemEditor","FileListContainer","props","isMultiSelect","focusedPath","showContextMenu","onCreateFile","onCreateFolder","onCopy","onDelete","onMove","undefined","onRename","onSelect","onSelectionChange","table","rowHeight","validateRename","Promise","resolve","renameItem","setRenameItem","selectedItems","setSelectedItems","focusedItem","setFocusedItem","handleSelectionChange","newSelectedItems","handleFocusChange","newFocusedItem","handleCopyAction","handleDeleteAction","length","handleNewFileAction","handleNewFolderAction","getPath","filename","handleRenameAction","handleRenameCancel","handleRenameSubmit","newName","actions","result","push","title","description","action","group","groups","medium","low","disabled","shortcut","FILE_EXPLORER","DELETE","RENAME","validateRenameItem","reject","Error","renderItem","itemProps","item","children","displayName"],"sources":["../src/FileListContainer.tsx"],"sourcesContent":["import { ContextAction, ContextActions } from '@deephaven/components';\nimport React, { useCallback, useMemo, useState } from 'react';\nimport FileList, {\n renderFileListItem,\n DEFAULT_ROW_HEIGHT,\n FileListRenderItemProps,\n} from './FileList';\nimport { FileStorageItem, FileStorageTable, isDirectory } from './FileStorage';\nimport SHORTCUTS from './FileExplorerShortcuts';\nimport './FileExplorer.scss';\nimport FileUtils from './FileUtils';\nimport FileListItemEditor from './FileListItemEditor';\n\nexport interface FileListContainerProps {\n showContextMenu?: boolean;\n table: FileStorageTable;\n\n isMultiSelect?: boolean;\n focusedPath?: string;\n\n onCreateFile?: (path?: string) => void;\n onCreateFolder?: (path?: string) => void;\n onCopy?: (file: FileStorageItem) => void;\n onDelete?: (files: FileStorageItem[]) => void;\n onMove?: (files: FileStorageItem[], path: string) => void;\n onRename?: (file: FileStorageItem, newName: string) => void;\n onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => void;\n validateRename?: (file: FileStorageItem, newName: string) => Promise<void>;\n onSelectionChange?: (selectedItems: FileStorageItem[]) => void;\n\n /** Height of each item in the list */\n rowHeight?: number;\n}\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorage.\n */\nexport const FileListContainer = (\n props: FileListContainerProps\n): JSX.Element => {\n const {\n isMultiSelect = false,\n focusedPath,\n showContextMenu = false,\n onCreateFile,\n onCreateFolder,\n onCopy,\n onDelete,\n onMove = () => undefined,\n onRename,\n onSelect,\n onSelectionChange,\n table,\n rowHeight = DEFAULT_ROW_HEIGHT,\n validateRename = () => Promise.resolve(),\n } = props;\n const [renameItem, setRenameItem] = useState<FileStorageItem>();\n const [selectedItems, setSelectedItems] = useState([] as FileStorageItem[]);\n const [focusedItem, setFocusedItem] = useState<FileStorageItem>();\n\n const handleSelectionChange = useCallback(\n newSelectedItems => {\n setSelectedItems(newSelectedItems);\n onSelectionChange?.(newSelectedItems);\n },\n [onSelectionChange]\n );\n\n const handleFocusChange = useCallback(newFocusedItem => {\n setFocusedItem(newFocusedItem);\n }, []);\n\n const handleCopyAction = useCallback(() => {\n if (focusedItem) {\n onCopy?.(focusedItem);\n }\n }, [focusedItem, onCopy]);\n\n const handleDeleteAction = useCallback(() => {\n if (selectedItems.length > 0) {\n onDelete?.(selectedItems);\n }\n }, [onDelete, selectedItems]);\n\n const handleNewFileAction = useCallback(() => {\n onCreateFile?.();\n }, [onCreateFile]);\n\n const handleNewFolderAction = useCallback(() => {\n if (focusedItem) {\n onCreateFolder?.(FileUtils.getPath(focusedItem.filename));\n }\n }, [focusedItem, onCreateFolder]);\n\n const handleRenameAction = useCallback(() => {\n if (focusedItem) {\n setRenameItem(focusedItem);\n }\n }, [focusedItem]);\n\n const handleRenameCancel = useCallback((): void => {\n setRenameItem(undefined);\n }, []);\n\n const handleRenameSubmit = useCallback(\n (newName: string): void => {\n if (renameItem) {\n onRename?.(renameItem, newName);\n setRenameItem(undefined);\n }\n },\n [onRename, renameItem]\n );\n\n const actions = useMemo(() => {\n if (renameItem) {\n // While renaming, we don't want to enable any of the context actions or it may interfere with renaming input\n return [];\n }\n\n const result = [] as ContextAction[];\n if (onCreateFile) {\n result.push({\n title: 'New File',\n description: 'Create new file',\n action: handleNewFileAction,\n group: ContextActions.groups.medium,\n });\n }\n if (onCreateFolder) {\n result.push({\n title: 'New Folder',\n description: 'Create new folder',\n action: handleNewFolderAction,\n group: ContextActions.groups.medium,\n });\n }\n if (onCopy) {\n result.push({\n title: 'Copy',\n description: 'Copy',\n action: handleCopyAction,\n group: ContextActions.groups.low,\n disabled: focusedItem == null || isDirectory(focusedItem),\n });\n }\n if (onDelete && selectedItems.length > 0) {\n result.push({\n title: 'Delete',\n description: 'Delete',\n shortcut: SHORTCUTS.FILE_EXPLORER.DELETE,\n action: handleDeleteAction,\n group: ContextActions.groups.low,\n });\n }\n if (onRename) {\n result.push({\n title: 'Rename',\n description: 'Rename',\n shortcut: SHORTCUTS.FILE_EXPLORER.RENAME,\n action: handleRenameAction,\n group: ContextActions.groups.low,\n disabled: focusedItem == null,\n });\n }\n return result;\n }, [\n handleCopyAction,\n handleDeleteAction,\n handleNewFileAction,\n handleNewFolderAction,\n handleRenameAction,\n focusedItem,\n onCopy,\n onCreateFile,\n onCreateFolder,\n onDelete,\n onRename,\n selectedItems,\n renameItem,\n ]);\n\n const validateRenameItem = useCallback(\n (newName: string): Promise<void> => {\n if (renameItem) {\n return validateRename(renameItem, newName);\n }\n return Promise.reject(new Error('No rename item'));\n },\n [renameItem, validateRename]\n );\n\n const renderItem = useCallback(\n (itemProps: FileListRenderItemProps): JSX.Element => {\n const { item } = itemProps;\n if (renameItem && renameItem.filename === item.filename) {\n return renderFileListItem({\n ...itemProps,\n children: (\n <FileListItemEditor\n item={item}\n validate={validateRenameItem}\n onSubmit={handleRenameSubmit}\n onCancel={handleRenameCancel}\n />\n ),\n });\n }\n return renderFileListItem(itemProps);\n },\n [handleRenameCancel, handleRenameSubmit, renameItem, validateRenameItem]\n );\n\n return (\n <div className=\"file-list-container\">\n {table && (\n <FileList\n onMove={onMove}\n onSelect={onSelect}\n onSelectionChange={handleSelectionChange}\n onFocusChange={handleFocusChange}\n renderItem={renderItem}\n rowHeight={rowHeight}\n table={table}\n isMultiSelect={isMultiSelect}\n focusedPath={focusedPath}\n />\n )}\n {showContextMenu && <ContextActions actions={actions} />}\n </div>\n );\n};\n\nFileListContainer.displayName = 'FileListContainer';\n\nexport default FileListContainer;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FileListContainer.js","names":["ContextActions","React","useCallback","useMemo","useState","FileList","renderFileListItem","DEFAULT_ROW_HEIGHT","isDirectory","SHORTCUTS","FileUtils","FileListItemEditor","FileListContainer","props","isMultiSelect","focusedPath","showContextMenu","onCreateFile","onCreateFolder","onCopy","onDelete","onMove","undefined","onRename","onSelect","onSelectionChange","table","rowHeight","validateRename","Promise","resolve","renameItem","setRenameItem","selectedItems","setSelectedItems","focusedItem","setFocusedItem","handleSelectionChange","newSelectedItems","handleFocusChange","newFocusedItem","handleCopyAction","handleDeleteAction","length","handleNewFileAction","handleNewFolderAction","getPath","filename","handleRenameAction","handleRenameCancel","handleRenameSubmit","newName","actions","result","push","title","description","action","group","groups","medium","low","disabled","shortcut","FILE_EXPLORER","DELETE","RENAME","validateRenameItem","reject","Error","renderItem","itemProps","item","children","displayName"],"sources":["../src/FileListContainer.tsx"],"sourcesContent":["import { ContextAction, ContextActions } from '@deephaven/components';\nimport React, { useCallback, useMemo, useState } from 'react';\nimport FileList, {\n renderFileListItem,\n DEFAULT_ROW_HEIGHT,\n FileListRenderItemProps,\n} from './FileList';\nimport { FileStorageItem, FileStorageTable, isDirectory } from './FileStorage';\nimport SHORTCUTS from './FileExplorerShortcuts';\nimport './FileExplorer.scss';\nimport FileUtils from './FileUtils';\nimport FileListItemEditor from './FileListItemEditor';\n\nexport interface FileListContainerProps {\n showContextMenu?: boolean;\n table: FileStorageTable;\n\n isMultiSelect?: boolean;\n focusedPath?: string;\n\n onCreateFile?: (path?: string) => void;\n onCreateFolder?: (path?: string) => void;\n onCopy?: (file: FileStorageItem) => void;\n onDelete?: (files: FileStorageItem[]) => void;\n onMove?: (files: FileStorageItem[], path: string) => void;\n onRename?: (file: FileStorageItem, newName: string) => void;\n onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => void;\n validateRename?: (file: FileStorageItem, newName: string) => Promise<void>;\n onSelectionChange?: (selectedItems: FileStorageItem[]) => void;\n\n /** Height of each item in the list */\n rowHeight?: number;\n}\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorage.\n */\nexport const FileListContainer = (\n props: FileListContainerProps\n): JSX.Element => {\n const {\n isMultiSelect = false,\n focusedPath,\n showContextMenu = false,\n onCreateFile,\n onCreateFolder,\n onCopy,\n onDelete,\n onMove = () => undefined,\n onRename,\n onSelect,\n onSelectionChange,\n table,\n rowHeight = DEFAULT_ROW_HEIGHT,\n validateRename = () => Promise.resolve(),\n } = props;\n const [renameItem, setRenameItem] = useState<FileStorageItem>();\n const [selectedItems, setSelectedItems] = useState([] as FileStorageItem[]);\n const [focusedItem, setFocusedItem] = useState<FileStorageItem>();\n\n const handleSelectionChange = useCallback(\n newSelectedItems => {\n setSelectedItems(newSelectedItems);\n onSelectionChange?.(newSelectedItems);\n },\n [onSelectionChange]\n );\n\n const handleFocusChange = useCallback(newFocusedItem => {\n setFocusedItem(newFocusedItem);\n }, []);\n\n const handleCopyAction = useCallback(() => {\n if (focusedItem) {\n onCopy?.(focusedItem);\n }\n }, [focusedItem, onCopy]);\n\n const handleDeleteAction = useCallback(() => {\n if (selectedItems.length > 0) {\n onDelete?.(selectedItems);\n }\n }, [onDelete, selectedItems]);\n\n const handleNewFileAction = useCallback(() => {\n onCreateFile?.();\n }, [onCreateFile]);\n\n const handleNewFolderAction = useCallback(() => {\n if (focusedItem) {\n onCreateFolder?.(FileUtils.getPath(focusedItem.filename));\n }\n }, [focusedItem, onCreateFolder]);\n\n const handleRenameAction = useCallback(() => {\n if (focusedItem) {\n setRenameItem(focusedItem);\n }\n }, [focusedItem]);\n\n const handleRenameCancel = useCallback((): void => {\n setRenameItem(undefined);\n }, []);\n\n const handleRenameSubmit = useCallback(\n (newName: string): void => {\n if (renameItem) {\n onRename?.(renameItem, newName);\n setRenameItem(undefined);\n }\n },\n [onRename, renameItem]\n );\n\n const actions = useMemo(() => {\n if (renameItem) {\n // While renaming, we don't want to enable any of the context actions or it may interfere with renaming input\n return [];\n }\n\n const result = [] as ContextAction[];\n if (onCreateFile) {\n result.push({\n title: 'New File',\n description: 'Create new file',\n action: handleNewFileAction,\n group: ContextActions.groups.medium,\n });\n }\n if (onCreateFolder) {\n result.push({\n title: 'New Folder',\n description: 'Create new folder',\n action: handleNewFolderAction,\n group: ContextActions.groups.medium,\n });\n }\n if (onCopy) {\n result.push({\n title: 'Copy',\n description: 'Copy',\n action: handleCopyAction,\n group: ContextActions.groups.low,\n disabled: focusedItem == null || isDirectory(focusedItem),\n });\n }\n if (onDelete && selectedItems.length > 0) {\n result.push({\n title: 'Delete',\n description: 'Delete',\n shortcut: SHORTCUTS.FILE_EXPLORER.DELETE,\n action: handleDeleteAction,\n group: ContextActions.groups.low,\n });\n }\n if (onRename) {\n result.push({\n title: 'Rename',\n description: 'Rename',\n shortcut: SHORTCUTS.FILE_EXPLORER.RENAME,\n action: handleRenameAction,\n group: ContextActions.groups.low,\n disabled: focusedItem == null,\n });\n }\n return result;\n }, [\n handleCopyAction,\n handleDeleteAction,\n handleNewFileAction,\n handleNewFolderAction,\n handleRenameAction,\n focusedItem,\n onCopy,\n onCreateFile,\n onCreateFolder,\n onDelete,\n onRename,\n selectedItems,\n renameItem,\n ]);\n\n const validateRenameItem = useCallback(\n (newName: string): Promise<void> => {\n if (renameItem) {\n return validateRename(renameItem, newName);\n }\n return Promise.reject(new Error('No rename item'));\n },\n [renameItem, validateRename]\n );\n\n const renderItem = useCallback(\n (itemProps: FileListRenderItemProps): JSX.Element => {\n const { item } = itemProps;\n if (renameItem && renameItem.filename === item.filename) {\n return renderFileListItem({\n ...itemProps,\n children: (\n <FileListItemEditor\n item={item}\n validate={validateRenameItem}\n onSubmit={handleRenameSubmit}\n onCancel={handleRenameCancel}\n />\n ),\n });\n }\n return renderFileListItem(itemProps);\n },\n [handleRenameCancel, handleRenameSubmit, renameItem, validateRenameItem]\n );\n\n return (\n <div className=\"file-list-container\">\n {table != null && (\n <FileList\n onMove={onMove}\n onSelect={onSelect}\n onSelectionChange={handleSelectionChange}\n onFocusChange={handleFocusChange}\n renderItem={renderItem}\n rowHeight={rowHeight}\n table={table}\n isMultiSelect={isMultiSelect}\n focusedPath={focusedPath}\n />\n )}\n {showContextMenu && <ContextActions actions={actions} />}\n </div>\n );\n};\n\nFileListContainer.displayName = 'FileListContainer';\n\nexport default FileListContainer;\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deephaven/file-explorer",
|
|
3
|
-
"version": "0.19.2-beta.
|
|
3
|
+
"version": "0.19.2-beta.4+e0d6f07",
|
|
4
4
|
"description": "Deephaven File Explorer React component",
|
|
5
5
|
"author": "Deephaven Data Labs LLC",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -30,11 +30,11 @@
|
|
|
30
30
|
"start": "cross-env NODE_ENV=development npm run watch"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@deephaven/components": "^0.19.2-beta.
|
|
34
|
-
"@deephaven/icons": "^0.19.2-beta.
|
|
35
|
-
"@deephaven/log": "^0.19.2-beta.
|
|
36
|
-
"@deephaven/storage": "^0.19.2-beta.
|
|
37
|
-
"@deephaven/utils": "^0.19.2-beta.
|
|
33
|
+
"@deephaven/components": "^0.19.2-beta.4+e0d6f07",
|
|
34
|
+
"@deephaven/icons": "^0.19.2-beta.4+e0d6f07",
|
|
35
|
+
"@deephaven/log": "^0.19.2-beta.4+e0d6f07",
|
|
36
|
+
"@deephaven/storage": "^0.19.2-beta.4+e0d6f07",
|
|
37
|
+
"@deephaven/utils": "^0.19.2-beta.4+e0d6f07",
|
|
38
38
|
"@fortawesome/fontawesome-svg-core": "^6.1.1",
|
|
39
39
|
"@fortawesome/react-fontawesome": "^0.1.18",
|
|
40
40
|
"classnames": "^2.3.1",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"react": "^17.0.0"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"@deephaven/tsconfig": "^0.19.2-beta.
|
|
48
|
+
"@deephaven/tsconfig": "^0.19.2-beta.4+e0d6f07"
|
|
49
49
|
},
|
|
50
50
|
"files": [
|
|
51
51
|
"dist"
|
|
@@ -53,5 +53,5 @@
|
|
|
53
53
|
"publishConfig": {
|
|
54
54
|
"access": "public"
|
|
55
55
|
},
|
|
56
|
-
"gitHead": "
|
|
56
|
+
"gitHead": "e0d6f07bcc9aeebab96cc25589081099aa935413"
|
|
57
57
|
}
|