@deephaven/file-explorer 0.15.5 → 0.15.6-beta.0

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.
@@ -41,8 +41,8 @@ export declare const DRAG_HOVER_TIMEOUT = 500;
41
41
  export declare const renderFileListItem: (props: FileListRenderItemProps) => JSX.Element;
42
42
  /**
43
43
  * Get the icon definition for a file or folder item
44
- * @param {FileStorageItem} item Item to get the icon for
45
- * @returns {IconDefinition} Icon definition to pass in the FontAwesomeIcon icon prop
44
+ * @param item Item to get the icon for
45
+ * @returns Icon definition to pass in the FontAwesomeIcon icon prop
46
46
  */
47
47
  export declare function getItemIcon(item: FileStorageItem): IconDefinition;
48
48
  /**
package/dist/FileList.js CHANGED
@@ -125,8 +125,8 @@ export var renderFileListItem = props => {
125
125
  };
126
126
  /**
127
127
  * Get the icon definition for a file or folder item
128
- * @param {FileStorageItem} item Item to get the icon for
129
- * @returns {IconDefinition} Icon definition to pass in the FontAwesomeIcon icon prop
128
+ * @param item Item to get the icon for
129
+ * @returns Icon definition to pass in the FontAwesomeIcon icon prop
130
130
  */
131
131
 
132
132
  export function getItemIcon(item) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/FileList.tsx"],"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","updateTableViewport","Math","max","setLoadedViewportAndReturnCleanup","listenerRemover","onUpdate","newViewport","itemName","size","expandFolderOnHover","timeout","setTimeout","clearTimeout","renderWrapper","itemProps","onDragExit"],"mappings":"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","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\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 >\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 {FileStorageItem} item Item to get the icon for\n * @returns {IconDefinition} 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 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 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"],"file":"FileList.js"}
1
+ {"version":3,"sources":["../src/FileList.tsx"],"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","updateTableViewport","Math","max","setLoadedViewportAndReturnCleanup","listenerRemover","onUpdate","newViewport","itemName","size","expandFolderOnHover","timeout","setTimeout","clearTimeout","renderWrapper","itemProps","onDragExit"],"mappings":"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","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\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 >\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 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 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"],"file":"FileList.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deephaven/file-explorer",
3
- "version": "0.15.5",
3
+ "version": "0.15.6-beta.0+743f253",
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.15.5",
34
- "@deephaven/icons": "^0.15.0",
35
- "@deephaven/log": "^0.15.5",
36
- "@deephaven/storage": "^0.15.5",
37
- "@deephaven/utils": "^0.15.0",
33
+ "@deephaven/components": "^0.15.6-beta.0+743f253",
34
+ "@deephaven/icons": "^0.15.6-beta.0+743f253",
35
+ "@deephaven/log": "^0.15.6-beta.0+743f253",
36
+ "@deephaven/storage": "^0.15.6-beta.0+743f253",
37
+ "@deephaven/utils": "^0.15.6-beta.0+743f253",
38
38
  "@fortawesome/fontawesome-svg-core": "^6.1.1",
39
39
  "@fortawesome/react-fontawesome": "^0.1.18",
40
40
  "classnames": "^2.3.1",
@@ -47,7 +47,7 @@
47
47
  "react": "^17.0.0"
48
48
  },
49
49
  "devDependencies": {
50
- "@deephaven/tsconfig": "^0.15.2"
50
+ "@deephaven/tsconfig": "^0.15.6-beta.0+743f253"
51
51
  },
52
52
  "files": [
53
53
  "dist"
@@ -55,5 +55,5 @@
55
55
  "publishConfig": {
56
56
  "access": "public"
57
57
  },
58
- "gitHead": "0556c0fe73d2cabf66682a955950defd6130bbfa"
58
+ "gitHead": "743f253dd40b4f0dcca921ecf4f578d64202cd53"
59
59
  }