@deephaven/file-explorer 0.5.1 → 0.5.2-allpackages.16
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/FileExistsError.js +7 -35
- package/dist/FileExistsError.js.map +1 -1
- package/dist/FileExplorer.js +62 -139
- package/dist/FileExplorer.js.map +1 -1
- package/dist/FileExplorerShortcuts.js +1 -1
- package/dist/FileExplorerShortcuts.js.map +1 -1
- package/dist/FileExplorerToolbar.js +7 -6
- package/dist/FileExplorerToolbar.js.map +1 -1
- package/dist/FileList.js +103 -172
- package/dist/FileList.js.map +1 -1
- package/dist/FileListContainer.js +38 -68
- package/dist/FileListContainer.js.map +1 -1
- package/dist/FileListItemEditor.js +28 -58
- package/dist/FileListItemEditor.js.map +1 -1
- package/dist/FileNotFoundError.js +5 -40
- package/dist/FileNotFoundError.js.map +1 -1
- package/dist/FileUtils.js +208 -258
- package/dist/FileUtils.js.map +1 -1
- package/dist/NewItemModal.js +397 -464
- package/dist/NewItemModal.js.map +1 -1
- package/dist/WebdavFileStorage.js +97 -250
- package/dist/WebdavFileStorage.js.map +1 -1
- package/dist/WebdavFileStorageTable.js +196 -346
- package/dist/WebdavFileStorageTable.js.map +1 -1
- package/dist/index.js +10 -10
- package/dist/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +14 -13
package/dist/FileList.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/FileList.tsx"],"names":["ItemList","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","isExpanded","mimeType","getMimeType","PYTHON","getMoveOperation","targetItem","length","Error","targetPath","startsWith","files","FileList","isMultiSelect","table","onFocusChange","undefined","onMove","onSelect","onSelectionChange","renderItem","rowHeight","overscanCount","DEFAULT_OVERSCAN","items","offset","itemCount","loadedViewport","setLoadedViewport","top","bottom","viewport","setViewport","setDropTargetItem","setDraggedItems","dragPlaceholder","setDragPlaceholder","selectedRanges","setSelectedRanges","itemList","fileList","getItems","ranges","i","range","j","push","getItem","getDragPlaceholderText","count","dropItems","debug","current","focusItem","err","error","handleSelect","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","Math","max","listenerRemover","onUpdate","newViewport","itemName","size","timeout","setTimeout","clearTimeout","renderWrapper","itemProps","onDragExit"],"mappings":"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","sourcesContent":["import { ItemList, Range, RenderItemProps } 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) => 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 {children ?? item.basename}\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) => {\n const item = loadedViewport.items[itemIndex - loadedViewport.offset];\n if (item !== undefined) {\n log.debug('handleItemClick', item);\n\n onSelect(item);\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 log.debug('updating table viewport', viewport);\n table?.setViewport({\n top: Math.max(0, viewport.top - overscanCount),\n bottom: viewport.bottom + overscanCount,\n });\n }, [overscanCount, table, viewport]);\n\n // Listen for table updates\n useEffect(() => {\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 }, [table]);\n\n // Expand a folder if hovering over it\n useEffect(() => {\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 }, [dropTargetItem, table]);\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 />\n </div>\n );\n};\n\nexport default FileList;\n"],"file":"FileList.js"}
|
|
1
|
+
{"version":3,"sources":["../src/FileList.tsx"],"names":["ItemList","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","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","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","Math","max","listenerRemover","onUpdate","newViewport","itemName","size","timeout","setTimeout","clearTimeout","renderWrapper","itemProps","onDragExit"],"mappings":"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","sourcesContent":["import { ItemList, Range, RenderItemProps } 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) => 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 {children ?? item.basename}\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) => {\n const item = loadedViewport.items[itemIndex - loadedViewport.offset];\n if (item !== undefined) {\n log.debug('handleItemClick', item);\n\n onSelect(item);\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 log.debug('updating table viewport', viewport);\n table?.setViewport({\n top: Math.max(0, viewport.top - overscanCount),\n bottom: viewport.bottom + overscanCount,\n });\n }, [overscanCount, table, viewport]);\n\n // Listen for table updates\n useEffect(() => {\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 }, [table]);\n\n // Expand a folder if hovering over it\n useEffect(() => {\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 }, [dropTargetItem, table]);\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 />\n </div>\n );\n};\n\nexport default FileList;\n"],"file":"FileList.js"}
|
|
@@ -4,107 +4,75 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
|
|
|
4
4
|
|
|
5
5
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
6
6
|
|
|
7
|
-
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
8
|
-
|
|
9
|
-
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
10
|
-
|
|
11
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
12
|
-
|
|
13
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
14
|
-
|
|
15
|
-
function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
16
|
-
|
|
17
|
-
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
18
|
-
|
|
19
7
|
import { ContextActions } from '@deephaven/components';
|
|
20
8
|
import React, { useCallback, useMemo, useState } from 'react';
|
|
21
|
-
import FileList, { renderFileListItem, DEFAULT_ROW_HEIGHT } from
|
|
22
|
-
import { isDirectory } from
|
|
23
|
-
import SHORTCUTS from
|
|
9
|
+
import FileList, { renderFileListItem, DEFAULT_ROW_HEIGHT } from "./FileList.js";
|
|
10
|
+
import { isDirectory } from "./FileStorage.js";
|
|
11
|
+
import SHORTCUTS from "./FileExplorerShortcuts.js";
|
|
24
12
|
import "./FileExplorer.css";
|
|
25
|
-
import FileUtils from
|
|
26
|
-
import FileListItemEditor from
|
|
13
|
+
import FileUtils from "./FileUtils.js";
|
|
14
|
+
import FileListItemEditor from "./FileListItemEditor.js";
|
|
27
15
|
|
|
28
16
|
/**
|
|
29
17
|
* Component that displays and allows interaction with the file system in the provided FileStorage.
|
|
30
18
|
*/
|
|
31
|
-
export var FileListContainer =
|
|
32
|
-
var
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
validateRename = _props$validateRename === void 0 ? function () {
|
|
51
|
-
return Promise.resolve();
|
|
52
|
-
} : _props$validateRename;
|
|
53
|
-
|
|
54
|
-
var _useState = useState(),
|
|
55
|
-
_useState2 = _slicedToArray(_useState, 2),
|
|
56
|
-
renameItem = _useState2[0],
|
|
57
|
-
setRenameItem = _useState2[1];
|
|
58
|
-
|
|
59
|
-
var _useState3 = useState([]),
|
|
60
|
-
_useState4 = _slicedToArray(_useState3, 2),
|
|
61
|
-
selectedItems = _useState4[0],
|
|
62
|
-
setSelectedItems = _useState4[1];
|
|
63
|
-
|
|
64
|
-
var _useState5 = useState(),
|
|
65
|
-
_useState6 = _slicedToArray(_useState5, 2),
|
|
66
|
-
focusedItem = _useState6[0],
|
|
67
|
-
setFocusedItem = _useState6[1];
|
|
68
|
-
|
|
69
|
-
var handleSelectionChange = useCallback(function (newSelectedItems) {
|
|
19
|
+
export var FileListContainer = props => {
|
|
20
|
+
var {
|
|
21
|
+
isMultiSelect = false,
|
|
22
|
+
showContextMenu = false,
|
|
23
|
+
onCreateFile,
|
|
24
|
+
onCreateFolder,
|
|
25
|
+
onCopy,
|
|
26
|
+
onDelete,
|
|
27
|
+
onMove = () => undefined,
|
|
28
|
+
onRename,
|
|
29
|
+
onSelect,
|
|
30
|
+
table,
|
|
31
|
+
rowHeight = DEFAULT_ROW_HEIGHT,
|
|
32
|
+
validateRename = () => Promise.resolve()
|
|
33
|
+
} = props;
|
|
34
|
+
var [renameItem, setRenameItem] = useState();
|
|
35
|
+
var [selectedItems, setSelectedItems] = useState([]);
|
|
36
|
+
var [focusedItem, setFocusedItem] = useState();
|
|
37
|
+
var handleSelectionChange = useCallback(newSelectedItems => {
|
|
70
38
|
setSelectedItems(newSelectedItems);
|
|
71
39
|
}, []);
|
|
72
|
-
var handleFocusChange = useCallback(
|
|
40
|
+
var handleFocusChange = useCallback(newFocusedItem => {
|
|
73
41
|
setFocusedItem(newFocusedItem);
|
|
74
42
|
}, []);
|
|
75
|
-
var handleCopyAction = useCallback(
|
|
43
|
+
var handleCopyAction = useCallback(() => {
|
|
76
44
|
if (focusedItem) {
|
|
77
45
|
onCopy === null || onCopy === void 0 ? void 0 : onCopy(focusedItem);
|
|
78
46
|
}
|
|
79
47
|
}, [focusedItem, onCopy]);
|
|
80
|
-
var handleDeleteAction = useCallback(
|
|
48
|
+
var handleDeleteAction = useCallback(() => {
|
|
81
49
|
if (selectedItems.length > 0) {
|
|
82
50
|
onDelete === null || onDelete === void 0 ? void 0 : onDelete(selectedItems);
|
|
83
51
|
}
|
|
84
52
|
}, [onDelete, selectedItems]);
|
|
85
|
-
var handleNewFileAction = useCallback(
|
|
53
|
+
var handleNewFileAction = useCallback(() => {
|
|
86
54
|
onCreateFile === null || onCreateFile === void 0 ? void 0 : onCreateFile();
|
|
87
55
|
}, [onCreateFile]);
|
|
88
|
-
var handleNewFolderAction = useCallback(
|
|
56
|
+
var handleNewFolderAction = useCallback(() => {
|
|
89
57
|
if (focusedItem) {
|
|
90
58
|
onCreateFolder === null || onCreateFolder === void 0 ? void 0 : onCreateFolder(FileUtils.getPath(focusedItem.filename));
|
|
91
59
|
}
|
|
92
60
|
}, [focusedItem, onCreateFolder]);
|
|
93
|
-
var handleRenameAction = useCallback(
|
|
61
|
+
var handleRenameAction = useCallback(() => {
|
|
94
62
|
if (focusedItem) {
|
|
95
63
|
setRenameItem(focusedItem);
|
|
96
64
|
}
|
|
97
65
|
}, [focusedItem]);
|
|
98
|
-
var handleRenameCancel = useCallback(
|
|
66
|
+
var handleRenameCancel = useCallback(() => {
|
|
99
67
|
setRenameItem(undefined);
|
|
100
68
|
}, []);
|
|
101
|
-
var handleRenameSubmit = useCallback(
|
|
69
|
+
var handleRenameSubmit = useCallback(newName => {
|
|
102
70
|
if (renameItem) {
|
|
103
71
|
onRename === null || onRename === void 0 ? void 0 : onRename(renameItem, newName);
|
|
104
72
|
setRenameItem(undefined);
|
|
105
73
|
}
|
|
106
74
|
}, [onRename, renameItem]);
|
|
107
|
-
var actions = useMemo(
|
|
75
|
+
var actions = useMemo(() => {
|
|
108
76
|
if (renameItem) {
|
|
109
77
|
// While renaming, we don't want to enable any of the context actions or it may interfere with renaming input
|
|
110
78
|
return [];
|
|
@@ -163,15 +131,17 @@ export var FileListContainer = function FileListContainer(props) {
|
|
|
163
131
|
|
|
164
132
|
return result;
|
|
165
133
|
}, [handleCopyAction, handleDeleteAction, handleNewFileAction, handleNewFolderAction, handleRenameAction, focusedItem, onCopy, onCreateFile, onCreateFolder, onDelete, onRename, selectedItems, renameItem]);
|
|
166
|
-
var validateRenameItem = useCallback(
|
|
134
|
+
var validateRenameItem = useCallback(newName => {
|
|
167
135
|
if (renameItem) {
|
|
168
136
|
return validateRename(renameItem, newName);
|
|
169
137
|
}
|
|
170
138
|
|
|
171
139
|
return Promise.reject(new Error('No rename item'));
|
|
172
140
|
}, [renameItem, validateRename]);
|
|
173
|
-
var renderItem = useCallback(
|
|
174
|
-
var
|
|
141
|
+
var renderItem = useCallback(itemProps => {
|
|
142
|
+
var {
|
|
143
|
+
item
|
|
144
|
+
} = itemProps;
|
|
175
145
|
|
|
176
146
|
if (renameItem && renameItem.filename === item.filename) {
|
|
177
147
|
return renderFileListItem(_objectSpread(_objectSpread({}, itemProps), {}, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/FileListContainer.tsx"],"names":["ContextActions","React","useCallback","useMemo","useState","FileList","renderFileListItem","DEFAULT_ROW_HEIGHT","isDirectory","SHORTCUTS","FileUtils","FileListItemEditor","FileListContainer","props","isMultiSelect","showContextMenu","onCreateFile","onCreateFolder","onCopy","onDelete","onMove","undefined","onRename","onSelect","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"],"mappings":"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","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\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) => void;\n validateRename?: (file: FileStorageItem, newName: string) => Promise<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 showContextMenu = false,\n onCreateFile,\n onCreateFolder,\n onCopy,\n onDelete,\n onMove = () => undefined,\n onRename,\n onSelect,\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(newSelectedItems => {\n setSelectedItems(newSelectedItems);\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 />\n )}\n {showContextMenu && <ContextActions actions={actions} />}\n </div>\n );\n};\n\nFileListContainer.displayName = 'FileListContainer';\n\nexport default FileListContainer;\n"],"file":"FileListContainer.js"}
|
|
1
|
+
{"version":3,"sources":["../src/FileListContainer.tsx"],"names":["ContextActions","React","useCallback","useMemo","useState","FileList","renderFileListItem","DEFAULT_ROW_HEIGHT","isDirectory","SHORTCUTS","FileUtils","FileListItemEditor","FileListContainer","props","isMultiSelect","showContextMenu","onCreateFile","onCreateFolder","onCopy","onDelete","onMove","undefined","onRename","onSelect","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"],"mappings":"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","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\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) => void;\n validateRename?: (file: FileStorageItem, newName: string) => Promise<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 showContextMenu = false,\n onCreateFile,\n onCreateFolder,\n onCopy,\n onDelete,\n onMove = () => undefined,\n onRename,\n onSelect,\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(newSelectedItems => {\n setSelectedItems(newSelectedItems);\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 />\n )}\n {showContextMenu && <ContextActions actions={actions} />}\n </div>\n );\n};\n\nFileListContainer.displayName = 'FileListContainer';\n\nexport default FileListContainer;\n"],"file":"FileListContainer.js"}
|
|
@@ -1,89 +1,59 @@
|
|
|
1
|
-
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
2
|
-
|
|
3
|
-
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
4
|
-
|
|
5
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
6
|
-
|
|
7
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
8
|
-
|
|
9
|
-
function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
10
|
-
|
|
11
|
-
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
12
|
-
|
|
13
1
|
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
14
2
|
import classNames from 'classnames';
|
|
15
3
|
import Log from '@deephaven/log';
|
|
16
4
|
import { PromiseUtils } from '@deephaven/utils';
|
|
17
5
|
import "./FileListItemEditor.css";
|
|
18
6
|
var log = Log.module('FileListItemEditor');
|
|
19
|
-
export var FileListItemEditor =
|
|
20
|
-
var
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
} : _ref$validate;
|
|
7
|
+
export var FileListItemEditor = (_ref) => {
|
|
8
|
+
var {
|
|
9
|
+
item,
|
|
10
|
+
onCancel,
|
|
11
|
+
onSubmit,
|
|
12
|
+
validate = () => Promise.resolve()
|
|
13
|
+
} = _ref;
|
|
27
14
|
var input = useRef(null);
|
|
28
|
-
|
|
29
|
-
var
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
setValue = _useState2[1];
|
|
33
|
-
|
|
34
|
-
var _useState3 = useState(),
|
|
35
|
-
_useState4 = _slicedToArray(_useState3, 2),
|
|
36
|
-
validationError = _useState4[0],
|
|
37
|
-
setValidationError = _useState4[1];
|
|
38
|
-
|
|
39
|
-
var _useState5 = useState(Promise.resolve()),
|
|
40
|
-
_useState6 = _slicedToArray(_useState5, 2),
|
|
41
|
-
validationPromise = _useState6[0],
|
|
42
|
-
setValidationPromise = _useState6[1];
|
|
43
|
-
|
|
44
|
-
var focus = useCallback(function () {
|
|
15
|
+
var [value, setValue] = useState(item.basename);
|
|
16
|
+
var [validationError, setValidationError] = useState();
|
|
17
|
+
var [validationPromise, setValidationPromise] = useState(Promise.resolve());
|
|
18
|
+
var focus = useCallback(() => {
|
|
45
19
|
var _input$current;
|
|
46
20
|
|
|
47
21
|
(_input$current = input.current) === null || _input$current === void 0 ? void 0 : _input$current.focus(); // Select the proper range based on the type...
|
|
48
22
|
}, [input]);
|
|
49
|
-
var stopPropagation = useCallback(
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
var validateAndSubmit = useCallback(function () {
|
|
53
|
-
validationPromise.then(function () {
|
|
23
|
+
var stopPropagation = useCallback(e => e.stopPropagation(), []);
|
|
24
|
+
var validateAndSubmit = useCallback(() => {
|
|
25
|
+
validationPromise.then(() => {
|
|
54
26
|
onSubmit(value);
|
|
55
|
-
})
|
|
56
|
-
return log.info('Unable to validate name', e);
|
|
57
|
-
});
|
|
27
|
+
}).catch(e => log.info('Unable to validate name', e));
|
|
58
28
|
}, [onSubmit, value, validationPromise]);
|
|
59
|
-
useEffect(
|
|
29
|
+
useEffect(() => {
|
|
60
30
|
var validatePromise = PromiseUtils.makeCancelable(validate(value));
|
|
61
|
-
validatePromise.then(
|
|
62
|
-
return setValidationError(undefined);
|
|
63
|
-
})["catch"](function (e) {
|
|
31
|
+
validatePromise.then(() => setValidationError(undefined)).catch(e => {
|
|
64
32
|
if (!PromiseUtils.isCanceled(e)) {
|
|
65
33
|
setValidationError(e);
|
|
66
34
|
}
|
|
67
35
|
});
|
|
68
36
|
setValidationPromise(validatePromise);
|
|
69
|
-
return
|
|
70
|
-
return validatePromise.cancel();
|
|
71
|
-
};
|
|
37
|
+
return () => validatePromise.cancel();
|
|
72
38
|
}, [validate, value]);
|
|
73
|
-
useEffect(
|
|
39
|
+
useEffect(() => {
|
|
74
40
|
focus();
|
|
75
41
|
}, [focus]);
|
|
76
|
-
var handleBlur = useCallback(
|
|
42
|
+
var handleBlur = useCallback(() => {
|
|
77
43
|
log.debug2('handleBlur');
|
|
78
44
|
validateAndSubmit();
|
|
79
45
|
}, [validateAndSubmit]);
|
|
80
|
-
var handleChange = useCallback(
|
|
81
|
-
var
|
|
46
|
+
var handleChange = useCallback(e => {
|
|
47
|
+
var {
|
|
48
|
+
value: newValue
|
|
49
|
+
} = e.target;
|
|
82
50
|
setValue(newValue);
|
|
83
51
|
}, []);
|
|
84
|
-
var handleKeyDown = useCallback(
|
|
52
|
+
var handleKeyDown = useCallback(e => {
|
|
85
53
|
e.stopPropagation();
|
|
86
|
-
var
|
|
54
|
+
var {
|
|
55
|
+
key
|
|
56
|
+
} = e;
|
|
87
57
|
|
|
88
58
|
switch (key) {
|
|
89
59
|
case 'Enter':
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/FileListItemEditor.tsx"],"names":["React","useCallback","useEffect","useRef","useState","classNames","Log","PromiseUtils","log","module","FileListItemEditor","item","onCancel","onSubmit","validate","Promise","resolve","input","
|
|
1
|
+
{"version":3,"sources":["../src/FileListItemEditor.tsx"],"names":["React","useCallback","useEffect","useRef","useState","classNames","Log","PromiseUtils","log","module","FileListItemEditor","item","onCancel","onSubmit","validate","Promise","resolve","input","value","setValue","basename","validationError","setValidationError","validationPromise","setValidationPromise","focus","current","stopPropagation","e","validateAndSubmit","then","catch","info","validatePromise","makeCancelable","undefined","isCanceled","cancel","handleBlur","debug2","handleChange","newValue","target","handleKeyDown","key"],"mappings":"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","sourcesContent":["import React, {\n ChangeEvent,\n KeyboardEvent,\n MouseEvent,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport { PromiseUtils } from '@deephaven/utils';\nimport './FileListItemEditor.scss';\nimport { FileStorageItem } from './FileStorage';\n\nconst log = Log.module('FileListItemEditor');\n\nexport interface FileListItemEditorProps {\n item: FileStorageItem;\n onCancel: () => void;\n onSubmit: (newName: string) => void;\n validate?: (newName: string) => Promise<void>;\n}\n\nexport const FileListItemEditor = ({\n item,\n onCancel,\n onSubmit,\n validate = () => Promise.resolve(),\n}: FileListItemEditorProps): JSX.Element => {\n const input = useRef<HTMLInputElement>(null);\n const [value, setValue] = useState(item.basename);\n const [validationError, setValidationError] = useState<Error>();\n const [validationPromise, setValidationPromise] = useState<Promise<void>>(\n Promise.resolve()\n );\n\n const focus = useCallback(() => {\n input.current?.focus();\n // Select the proper range based on the type...\n }, [input]);\n\n const stopPropagation = useCallback(\n (e: MouseEvent) => e.stopPropagation(),\n []\n );\n\n const validateAndSubmit = useCallback(() => {\n validationPromise\n .then(() => {\n onSubmit(value);\n })\n .catch(e => log.info('Unable to validate name', e));\n }, [onSubmit, value, validationPromise]);\n\n useEffect(() => {\n const validatePromise = PromiseUtils.makeCancelable(validate(value));\n validatePromise\n .then(() => setValidationError(undefined))\n .catch(e => {\n if (!PromiseUtils.isCanceled(e)) {\n setValidationError(e);\n }\n });\n setValidationPromise(validatePromise);\n return () => validatePromise.cancel();\n }, [validate, value]);\n\n useEffect(() => {\n focus();\n }, [focus]);\n\n const handleBlur = useCallback(() => {\n log.debug2('handleBlur');\n validateAndSubmit();\n }, [validateAndSubmit]);\n\n const handleChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n const { value: newValue } = e.target;\n setValue(newValue);\n }, []);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n e.stopPropagation();\n\n const { key } = e;\n switch (key) {\n case 'Enter': {\n validateAndSubmit();\n break;\n }\n case 'Escape': {\n onCancel();\n break;\n }\n default:\n }\n },\n [onCancel, validateAndSubmit]\n );\n\n return (\n <div className=\"file-list-item-editor\">\n <input\n type=\"text\"\n className={classNames('form-control file-list-item-editor-input', {\n 'is-invalid': validationError,\n })}\n value={value}\n ref={input}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onChange={handleChange}\n onClick={stopPropagation}\n onDoubleClick={stopPropagation}\n onMouseDown={stopPropagation}\n />\n\n {validationError && (\n <div className=\"invalid-feedback\">{`${validationError}`}</div>\n )}\n </div>\n );\n};\n\nexport default FileListItemEditor;\n"],"file":"FileListItemEditor.js"}
|
|
@@ -1,48 +1,13 @@
|
|
|
1
|
-
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|
2
|
-
|
|
3
|
-
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
4
|
-
|
|
5
|
-
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
|
|
6
|
-
|
|
7
|
-
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
|
|
8
|
-
|
|
9
|
-
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
|
|
10
|
-
|
|
11
|
-
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
|
12
|
-
|
|
13
|
-
function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); }
|
|
14
|
-
|
|
15
|
-
function _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); }
|
|
16
|
-
|
|
17
|
-
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
18
|
-
|
|
19
|
-
function _isNativeFunction(fn) { return Function.toString.call(fn).indexOf("[native code]") !== -1; }
|
|
20
|
-
|
|
21
|
-
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
22
|
-
|
|
23
|
-
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
|
|
24
|
-
|
|
25
1
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
26
2
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
var _super = _createSuper(FileNotFoundError);
|
|
31
|
-
|
|
32
|
-
function FileNotFoundError() {
|
|
33
|
-
var _this;
|
|
34
|
-
|
|
35
|
-
_classCallCheck(this, FileNotFoundError);
|
|
36
|
-
|
|
37
|
-
_this = _super.call(this, 'No file exists at the path specified');
|
|
38
|
-
|
|
39
|
-
_defineProperty(_assertThisInitialized(_this), "isFileNotFound", true);
|
|
3
|
+
class FileNotFoundError extends Error {
|
|
4
|
+
constructor() {
|
|
5
|
+
super('No file exists at the path specified');
|
|
40
6
|
|
|
41
|
-
|
|
7
|
+
_defineProperty(this, "isFileNotFound", true);
|
|
42
8
|
}
|
|
43
9
|
|
|
44
|
-
|
|
45
|
-
}( /*#__PURE__*/_wrapNativeSuper(Error));
|
|
10
|
+
}
|
|
46
11
|
|
|
47
12
|
export default FileNotFoundError;
|
|
48
13
|
//# sourceMappingURL=FileNotFoundError.js.map
|