@deephaven/file-explorer 0.19.1-beta.0 → 0.19.2-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/FileList.js +2 -2
- package/dist/FileList.js.map +1 -1
- package/dist/FileListContainer.js +1 -1
- package/dist/FileListContainer.js.map +1 -1
- package/dist/FileStorage.d.ts +2 -2
- package/dist/FileStorage.d.ts.map +1 -1
- package/dist/FileStorage.js.map +1 -1
- package/dist/NewItemModal.d.ts.map +1 -1
- package/dist/NewItemModal.js +13 -10
- package/dist/NewItemModal.js.map +1 -1
- package/package.json +8 -8
package/dist/FileList.js
CHANGED
|
@@ -150,7 +150,7 @@ export function getItemIcon(item) {
|
|
|
150
150
|
*/
|
|
151
151
|
|
|
152
152
|
export function getMoveOperation(draggedItems, targetItem) {
|
|
153
|
-
if (draggedItems.length === 0 ||
|
|
153
|
+
if (draggedItems.length === 0 || targetItem == null) {
|
|
154
154
|
throw new Error('No items to move');
|
|
155
155
|
}
|
|
156
156
|
|
|
@@ -208,7 +208,7 @@ export var FileList = props => {
|
|
|
208
208
|
var itemList = useRef(null);
|
|
209
209
|
var fileList = useRef(null);
|
|
210
210
|
var getItems = useCallback(ranges => {
|
|
211
|
-
if (ranges.length === 0 ||
|
|
211
|
+
if (ranges.length === 0 || loadedViewport == null) {
|
|
212
212
|
return [];
|
|
213
213
|
}
|
|
214
214
|
|
package/dist/FileList.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileList.js","names":["ItemList","Tooltip","dhPython","vsCode","vsFolder","vsFolderOpened","Log","RangeUtils","FontAwesomeIcon","classNames","React","useCallback","useEffect","useMemo","useRef","useState","isDirectory","FileUtils","MIME_TYPE","log","module","getPathFromItem","file","makePath","filename","getPath","DEFAULT_ROW_HEIGHT","DRAG_HOVER_TIMEOUT","ITEM_LIST_CLASS_NAME","renderFileListItem","props","children","draggedItems","isDragInProgress","isDropTargetValid","isSelected","item","itemIndex","dropTargetItem","onDragStart","onDragOver","onDragEnd","onDrop","isDragged","some","draggedItem","id","itemPath","dropTargetPath","isExactDropTarget","isInDropTarget","isInvalidDropTarget","icon","getItemIcon","depth","getDepth","depthLines","Array","fill","map","value","index","e","basename","modifiers","preventOverflow","boundariesElement","placement","isExpanded","mimeType","getMimeType","PYTHON","getMoveOperation","targetItem","length","Error","targetPath","startsWith","files","FileList","isMultiSelect","table","onFocusChange","undefined","onMove","onSelect","onSelectionChange","renderItem","rowHeight","overscanCount","DEFAULT_OVERSCAN","loadedViewport","setLoadedViewport","items","offset","itemCount","viewport","setViewport","top","bottom","setDropTargetItem","setDraggedItems","dragPlaceholder","setDragPlaceholder","selectedRanges","setSelectedRanges","itemList","fileList","getItems","ranges","i","range","j","push","getItem","getDragPlaceholderText","count","dropItems","debug","current","focusItem","err","error","handleSelect","event","setExpanded","handleItemDragStart","debug2","draggedRanges","resetMouseState","newDragPlaceholder","document","createElement","innerHTML","className","body","appendChild","dataTransfer","setDragImage","effectAllowed","handleItemDragOver","preventDefault","handleItemDragEnd","remove","handleItemDrop","handleItemDragExit","handleListDragOver","target","Element","classList","contains","type","handleListDrop","handleSelectionChange","newSelectedRanges","selectedItems","handleFocusChange","focusIndex","focusedItem","handleViewportChange","focusedPath","collapseAll","updateTableViewport","Math","max","setLoadedViewportAndReturnCleanup","listenerRemover","onUpdate","newViewport","itemName","size","expandFolderOnHover","timeout","setTimeout","clearTimeout","renderWrapper","itemProps","onDragExit"],"sources":["../src/FileList.tsx"],"sourcesContent":["import {\n ItemList,\n Range,\n RenderItemProps,\n Tooltip,\n} from '@deephaven/components';\nimport { dhPython, vsCode, vsFolder, vsFolderOpened } from '@deephaven/icons';\nimport Log from '@deephaven/log';\nimport { RangeUtils } from '@deephaven/utils';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport classNames from 'classnames';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { FileStorageItem, FileStorageTable, isDirectory } from './FileStorage';\nimport './FileList.scss';\nimport FileUtils, { MIME_TYPE } from './FileUtils';\n\nconst log = Log.module('FileList');\n\nexport type LoadedViewport = {\n items: FileStorageItem[];\n offset: number;\n itemCount: number;\n};\n\nexport type ListViewport = {\n top: number;\n bottom: number;\n};\n\nexport type FileListRenderItemProps = RenderItemProps<FileStorageItem> & {\n children?: JSX.Element;\n dropTargetItem?: FileStorageItem;\n draggedItems?: FileStorageItem[];\n isDragInProgress: boolean;\n isDropTargetValid: boolean;\n\n onDragStart(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragOver(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragEnd(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDrop(index: number, e: React.DragEvent<HTMLDivElement>): void;\n};\n\nexport interface FileListProps {\n table: FileStorageTable;\n\n isMultiSelect?: boolean;\n focusedPath?: string;\n\n onFocusChange?: (focusedItem?: FileStorageItem) => void;\n onMove: (files: FileStorageItem[], path: string) => void;\n onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => void;\n onSelectionChange?: (selectedItems: FileStorageItem[]) => void;\n\n renderItem?: (props: FileListRenderItemProps) => JSX.Element;\n\n /** Height of each item in the list */\n rowHeight?: number;\n\n overscanCount?: number;\n}\n\nexport const getPathFromItem = (file: FileStorageItem): string =>\n isDirectory(file)\n ? FileUtils.makePath(file.filename)\n : FileUtils.getPath(file.filename);\n\nexport const DEFAULT_ROW_HEIGHT = 26;\n\n// How long you need to hover over a directory before it expands\nexport const DRAG_HOVER_TIMEOUT = 500;\n\nconst ITEM_LIST_CLASS_NAME = 'item-list-scroll-pane';\n\nexport const renderFileListItem = (\n props: FileListRenderItemProps\n): JSX.Element => {\n const {\n children,\n draggedItems,\n isDragInProgress,\n isDropTargetValid,\n isSelected,\n item,\n itemIndex,\n dropTargetItem,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n } = props;\n\n const isDragged =\n draggedItems?.some(draggedItem => draggedItem.id === item.id) ?? false;\n const itemPath = getPathFromItem(item);\n const dropTargetPath =\n isDragInProgress && dropTargetItem ? getPathFromItem(dropTargetItem) : null;\n\n const isExactDropTarget =\n isDragInProgress &&\n isDropTargetValid &&\n isDirectory(item) &&\n dropTargetPath === itemPath;\n const isInDropTarget =\n isDragInProgress && isDropTargetValid && dropTargetPath === itemPath;\n const isInvalidDropTarget =\n isDragInProgress && !isDropTargetValid && dropTargetPath === itemPath;\n\n const icon = getItemIcon(item);\n const depth = FileUtils.getDepth(item.filename);\n const depthLines = Array(depth)\n .fill(null)\n .map((value, index) => (\n // eslint-disable-next-line react/no-array-index-key\n <span className=\"file-list-depth-line\" key={index} />\n ));\n\n return (\n <div\n className={classNames(\n 'd-flex w-100 align-items-center',\n 'file-list-item',\n {\n 'is-dragged': isDragged,\n 'is-exact-drop-target': isExactDropTarget,\n 'is-in-drop-target': isInDropTarget,\n 'is-invalid-drop-target': isInvalidDropTarget,\n 'is-selected': isSelected,\n }\n )}\n onDragStart={e => onDragStart(itemIndex, e)}\n onDragOver={e => onDragOver(itemIndex, e)}\n onDragEnd={e => onDragEnd(itemIndex, e)}\n onDrop={e => onDrop(itemIndex, e)}\n draggable\n role=\"presentation\"\n aria-label={item.basename}\n >\n {depthLines}{' '}\n <FontAwesomeIcon icon={icon} className=\"item-icon\" fixedWidth />{' '}\n <span className=\"truncation-wrapper\">\n {children ?? item.basename}\n <Tooltip\n options={{\n modifiers: { preventOverflow: { boundariesElement: 'window' } },\n placement: 'left',\n }}\n >\n {children ?? item.basename}\n </Tooltip>\n </span>\n </div>\n );\n};\n\n/**\n * Get the icon definition for a file or folder item\n * @param item Item to get the icon for\n * @returns Icon definition to pass in the FontAwesomeIcon icon prop\n */\nexport function getItemIcon(item: FileStorageItem): IconDefinition {\n if (isDirectory(item)) {\n return item.isExpanded ? vsFolderOpened : vsFolder;\n }\n const mimeType = FileUtils.getMimeType(item.basename);\n switch (mimeType) {\n case MIME_TYPE.PYTHON:\n return dhPython;\n default:\n return vsCode;\n }\n}\n\n/**\n * Get the move operation for the current selection and the given target. Throws if the operation is invalid.\n */\nexport function getMoveOperation(\n draggedItems: FileStorageItem[],\n targetItem: FileStorageItem\n): { files: FileStorageItem[]; targetPath: string } {\n if (draggedItems.length === 0 || !targetItem) {\n throw new Error('No items to move');\n }\n\n const targetPath = getPathFromItem(targetItem);\n if (\n draggedItems.some(\n ({ filename }) => FileUtils.getPath(filename) === targetPath\n )\n ) {\n // Cannot drop if target is one of the dragged items is already in the target folder\n throw new Error('File already in the destination folder');\n }\n if (\n draggedItems.some(\n item =>\n isDirectory(item) &&\n targetPath.startsWith(FileUtils.makePath(item.filename))\n )\n ) {\n // Cannot drop if target is a child of one of the directories being moved\n throw new Error('Destination folder cannot be a child of a dragged folder');\n }\n return { files: draggedItems, targetPath };\n}\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorageTable.\n */\nexport const FileList = (props: FileListProps): JSX.Element => {\n const {\n isMultiSelect = false,\n table,\n onFocusChange = () => undefined,\n onMove,\n onSelect,\n onSelectionChange = () => undefined,\n renderItem = renderFileListItem,\n rowHeight = DEFAULT_ROW_HEIGHT,\n overscanCount = ItemList.DEFAULT_OVERSCAN,\n } = props;\n const [loadedViewport, setLoadedViewport] = useState<LoadedViewport>(() => ({\n items: [],\n offset: 0,\n itemCount: 0,\n }));\n const [viewport, setViewport] = useState<ListViewport>({\n top: 0,\n bottom: 0,\n });\n\n const [dropTargetItem, setDropTargetItem] = useState<FileStorageItem>();\n const [draggedItems, setDraggedItems] = useState<FileStorageItem[]>();\n const [dragPlaceholder, setDragPlaceholder] = useState<HTMLDivElement>();\n const [selectedRanges, setSelectedRanges] = useState([] as Range[]);\n\n const itemList = useRef<ItemList<FileStorageItem>>(null);\n const fileList = useRef<HTMLDivElement>(null);\n\n const getItems = useCallback(\n (ranges: Range[]): FileStorageItem[] => {\n if (ranges.length === 0 || !loadedViewport) {\n return [];\n }\n\n const items = [] as FileStorageItem[];\n for (let i = 0; i < ranges.length; i += 1) {\n const range = ranges[i];\n for (let j = range[0]; j <= range[1]; j += 1) {\n if (\n j >= loadedViewport.offset &&\n j < loadedViewport.offset + loadedViewport.items.length\n ) {\n items.push(loadedViewport.items[j - loadedViewport.offset]);\n }\n }\n }\n return items;\n },\n [loadedViewport]\n );\n\n const getItem = useCallback(\n (itemIndex: number): FileStorageItem | undefined => {\n const items = getItems([[itemIndex, itemIndex]]);\n if (items.length > 0) {\n return items[0];\n }\n },\n [getItems]\n );\n\n /**\n * Get the placeholder text to show when a drag operation is in progress\n */\n const getDragPlaceholderText = useCallback(() => {\n const count = RangeUtils.count(selectedRanges);\n if (count === 0) {\n return null;\n }\n\n if (count === 1) {\n const index = selectedRanges[0][0];\n const item = getItem(index);\n if (item != null) {\n return item.filename;\n }\n }\n return `${count} items`;\n }, [getItem, selectedRanges]);\n\n /**\n * Drop the currently dragged items at the currently set drop target.\n * If an itemIndex is provided, focus that index after the drop.\n */\n const dropItems = useCallback(\n (itemIndex?: number) => {\n if (!draggedItems || !dropTargetItem) {\n return;\n }\n\n log.debug('dropItems', draggedItems, 'to', itemIndex);\n\n try {\n const { files, targetPath } = getMoveOperation(\n draggedItems,\n dropTargetItem\n );\n onMove(files, targetPath);\n if (itemIndex != null) {\n setSelectedRanges([[itemIndex, itemIndex]]);\n itemList.current?.focusItem(itemIndex);\n }\n } catch (err) {\n log.error('Unable to complete move', err);\n }\n },\n [draggedItems, dropTargetItem, onMove]\n );\n\n const handleSelect = useCallback(\n (itemIndex: number, event: React.SyntheticEvent) => {\n const item = loadedViewport.items[itemIndex - loadedViewport.offset];\n if (item !== undefined) {\n log.debug('handleItemClick', item);\n\n onSelect(item, event);\n if (isDirectory(item)) {\n table?.setExpanded(item.filename, !item.isExpanded);\n }\n }\n },\n [loadedViewport, onSelect, table]\n );\n\n const handleItemDragStart = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n log.debug2('handleItemDragStart', itemIndex, selectedRanges);\n\n let draggedRanges = selectedRanges;\n if (!RangeUtils.isSelected(selectedRanges, itemIndex)) {\n draggedRanges = [[itemIndex, itemIndex]];\n setSelectedRanges(draggedRanges);\n }\n\n setDraggedItems(getItems(draggedRanges));\n\n // We need to reset reset the mouse state since we steal the drag\n itemList.current?.resetMouseState();\n\n const newDragPlaceholder = document.createElement('div');\n newDragPlaceholder.innerHTML = `<div class=\"dnd-placeholder-content\">${getDragPlaceholderText()}</div>`;\n newDragPlaceholder.className = 'file-list-dnd-placeholder';\n document.body.appendChild(newDragPlaceholder);\n e.dataTransfer.setDragImage(newDragPlaceholder, 0, 0);\n e.dataTransfer.effectAllowed = 'move';\n setDragPlaceholder(newDragPlaceholder);\n },\n [getDragPlaceholderText, getItems, selectedRanges]\n );\n\n const handleItemDragOver = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n\n log.debug2('handleItemDragOver', e);\n setDropTargetItem(getItem(itemIndex));\n },\n [getItem]\n );\n\n const handleItemDragEnd = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n log.debug('handleItemDragEnd', itemIndex);\n\n dragPlaceholder?.remove();\n\n // Drag end is triggered after drop\n // Also drop isn't triggered if drag end is outside of the list\n setDraggedItems(undefined);\n setDropTargetItem(undefined);\n setDragPlaceholder(undefined);\n },\n [dragPlaceholder]\n );\n\n const handleItemDrop = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n dropItems(itemIndex);\n },\n [dropItems]\n );\n\n const handleItemDragExit = useCallback(() => {\n log.debug2('handleItemDragExit');\n setDropTargetItem(undefined);\n }, []);\n\n const handleListDragOver = useCallback(\n (e: React.DragEvent<HTMLDivElement>) => {\n if (\n e.target instanceof Element &&\n e.target.classList.contains(ITEM_LIST_CLASS_NAME)\n ) {\n // Need to prevent default to enable drop\n // https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#droptargets\n e.preventDefault();\n\n log.debug2('handleListDragOver', e);\n setDropTargetItem({\n type: 'directory',\n filename: '/',\n basename: '/',\n id: '/',\n });\n }\n },\n []\n );\n\n const handleListDrop = useCallback(\n (e: React.DragEvent<HTMLDivElement>) => {\n if (\n e.target instanceof Element &&\n e.target.classList.contains(ITEM_LIST_CLASS_NAME)\n ) {\n log.debug('handleListDrop');\n dropItems();\n }\n },\n [dropItems]\n );\n\n const handleSelectionChange = useCallback(\n newSelectedRanges => {\n log.debug2('handleSelectionChange', newSelectedRanges);\n if (newSelectedRanges !== selectedRanges) {\n setSelectedRanges(newSelectedRanges);\n const selectedItems = getItems(newSelectedRanges);\n onSelectionChange(selectedItems);\n }\n },\n [getItems, onSelectionChange, selectedRanges]\n );\n\n const handleFocusChange = useCallback(\n focusIndex => {\n log.debug2('handleFocusChange', focusIndex);\n if (focusIndex != null) {\n const [focusedItem] = getItems([[focusIndex, focusIndex]]);\n onFocusChange(focusedItem);\n } else {\n onFocusChange();\n }\n },\n [getItems, onFocusChange]\n );\n\n const handleViewportChange = useCallback(\n (top: number, bottom: number) => {\n log.debug('handleViewportChange', top, bottom);\n if (top !== viewport.top || bottom !== viewport.bottom) {\n setViewport({ top, bottom });\n }\n },\n [viewport]\n );\n\n const isDropTargetValid = useMemo(() => {\n if (!draggedItems || !dropTargetItem) {\n return false;\n }\n\n try {\n getMoveOperation(draggedItems, dropTargetItem);\n log.debug('handleValidateDropTarget true');\n return true;\n } catch (e) {\n log.debug('handleValidateDropTarget false');\n return false;\n }\n }, [draggedItems, dropTargetItem]);\n\n const { focusedPath } = props;\n useEffect(() => {\n if (focusedPath !== undefined) {\n if (focusedPath === '/') {\n table.collapseAll();\n } else {\n table.setExpanded(focusedPath, false);\n table.setExpanded(focusedPath, true);\n }\n }\n }, [table, focusedPath]);\n\n useEffect(\n function updateTableViewport() {\n log.debug('updating table viewport', viewport);\n table?.setViewport({\n top: Math.max(0, viewport.top - overscanCount),\n bottom: viewport.bottom + overscanCount,\n });\n },\n [overscanCount, table, viewport]\n );\n\n // Listen for table updates\n useEffect(\n function setLoadedViewportAndReturnCleanup() {\n const listenerRemover = table.onUpdate(newViewport => {\n setLoadedViewport({\n items: newViewport.items.map(item => ({\n ...item,\n itemName: item.basename,\n })),\n offset: newViewport.offset,\n itemCount: table.size,\n });\n });\n return () => {\n listenerRemover();\n };\n },\n [table]\n );\n\n // Expand a folder if hovering over it\n useEffect(\n function expandFolderOnHover() {\n if (\n dropTargetItem != null &&\n isDirectory(dropTargetItem) &&\n dropTargetItem.filename !== '/'\n ) {\n const timeout = setTimeout(() => {\n if (!dropTargetItem.isExpanded) {\n table?.setExpanded(dropTargetItem.filename, true);\n }\n }, DRAG_HOVER_TIMEOUT);\n return () => clearTimeout(timeout);\n }\n },\n [dropTargetItem, table]\n );\n\n const renderWrapper = useCallback(\n itemProps =>\n renderItem({\n ...itemProps,\n isDragInProgress: draggedItems != null,\n dropTargetItem,\n draggedItems,\n isDropTargetValid,\n onDragStart: handleItemDragStart,\n onDragEnd: handleItemDragEnd,\n onDragOver: handleItemDragOver,\n onDragExit: handleItemDragExit,\n onDrop: handleItemDrop,\n }),\n [\n handleItemDragEnd,\n handleItemDragExit,\n handleItemDragOver,\n handleItemDragStart,\n handleItemDrop,\n draggedItems,\n dropTargetItem,\n isDropTargetValid,\n renderItem,\n ]\n );\n\n return (\n <div\n ref={fileList}\n className={classNames('file-list', {\n 'is-dragging': draggedItems != null,\n })}\n onDragOver={handleListDragOver}\n onDrop={handleListDrop}\n >\n <ItemList\n ref={itemList}\n items={loadedViewport.items}\n itemCount={loadedViewport.itemCount}\n offset={loadedViewport.offset}\n onFocusChange={handleFocusChange}\n onSelect={handleSelect}\n onSelectionChange={handleSelectionChange}\n onViewportChange={handleViewportChange}\n selectedRanges={selectedRanges}\n renderItem={renderWrapper}\n rowHeight={rowHeight}\n isMultiSelect={isMultiSelect}\n isDragSelect={false}\n isDeselectOnClick={false}\n />\n </div>\n );\n};\n\nexport default FileList;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FileList.js","names":["ItemList","Tooltip","dhPython","vsCode","vsFolder","vsFolderOpened","Log","RangeUtils","FontAwesomeIcon","classNames","React","useCallback","useEffect","useMemo","useRef","useState","isDirectory","FileUtils","MIME_TYPE","log","module","getPathFromItem","file","makePath","filename","getPath","DEFAULT_ROW_HEIGHT","DRAG_HOVER_TIMEOUT","ITEM_LIST_CLASS_NAME","renderFileListItem","props","children","draggedItems","isDragInProgress","isDropTargetValid","isSelected","item","itemIndex","dropTargetItem","onDragStart","onDragOver","onDragEnd","onDrop","isDragged","some","draggedItem","id","itemPath","dropTargetPath","isExactDropTarget","isInDropTarget","isInvalidDropTarget","icon","getItemIcon","depth","getDepth","depthLines","Array","fill","map","value","index","e","basename","modifiers","preventOverflow","boundariesElement","placement","isExpanded","mimeType","getMimeType","PYTHON","getMoveOperation","targetItem","length","Error","targetPath","startsWith","files","FileList","isMultiSelect","table","onFocusChange","undefined","onMove","onSelect","onSelectionChange","renderItem","rowHeight","overscanCount","DEFAULT_OVERSCAN","loadedViewport","setLoadedViewport","items","offset","itemCount","viewport","setViewport","top","bottom","setDropTargetItem","setDraggedItems","dragPlaceholder","setDragPlaceholder","selectedRanges","setSelectedRanges","itemList","fileList","getItems","ranges","i","range","j","push","getItem","getDragPlaceholderText","count","dropItems","debug","current","focusItem","err","error","handleSelect","event","setExpanded","handleItemDragStart","debug2","draggedRanges","resetMouseState","newDragPlaceholder","document","createElement","innerHTML","className","body","appendChild","dataTransfer","setDragImage","effectAllowed","handleItemDragOver","preventDefault","handleItemDragEnd","remove","handleItemDrop","handleItemDragExit","handleListDragOver","target","Element","classList","contains","type","handleListDrop","handleSelectionChange","newSelectedRanges","selectedItems","handleFocusChange","focusIndex","focusedItem","handleViewportChange","focusedPath","collapseAll","updateTableViewport","Math","max","setLoadedViewportAndReturnCleanup","listenerRemover","onUpdate","newViewport","itemName","size","expandFolderOnHover","timeout","setTimeout","clearTimeout","renderWrapper","itemProps","onDragExit"],"sources":["../src/FileList.tsx"],"sourcesContent":["import {\n ItemList,\n Range,\n RenderItemProps,\n Tooltip,\n} from '@deephaven/components';\nimport { dhPython, vsCode, vsFolder, vsFolderOpened } from '@deephaven/icons';\nimport Log from '@deephaven/log';\nimport { RangeUtils } from '@deephaven/utils';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport classNames from 'classnames';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { FileStorageItem, FileStorageTable, isDirectory } from './FileStorage';\nimport './FileList.scss';\nimport FileUtils, { MIME_TYPE } from './FileUtils';\n\nconst log = Log.module('FileList');\n\nexport type LoadedViewport = {\n items: FileStorageItem[];\n offset: number;\n itemCount: number;\n};\n\nexport type ListViewport = {\n top: number;\n bottom: number;\n};\n\nexport type FileListRenderItemProps = RenderItemProps<FileStorageItem> & {\n children?: JSX.Element;\n dropTargetItem?: FileStorageItem;\n draggedItems?: FileStorageItem[];\n isDragInProgress: boolean;\n isDropTargetValid: boolean;\n\n onDragStart(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragOver(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragEnd(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDrop(index: number, e: React.DragEvent<HTMLDivElement>): void;\n};\n\nexport interface FileListProps {\n table: FileStorageTable;\n\n isMultiSelect?: boolean;\n focusedPath?: string;\n\n onFocusChange?: (focusedItem?: FileStorageItem) => void;\n onMove: (files: FileStorageItem[], path: string) => void;\n onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => void;\n onSelectionChange?: (selectedItems: FileStorageItem[]) => void;\n\n renderItem?: (props: FileListRenderItemProps) => JSX.Element;\n\n /** Height of each item in the list */\n rowHeight?: number;\n\n overscanCount?: number;\n}\n\nexport const getPathFromItem = (file: FileStorageItem): string =>\n isDirectory(file)\n ? FileUtils.makePath(file.filename)\n : FileUtils.getPath(file.filename);\n\nexport const DEFAULT_ROW_HEIGHT = 26;\n\n// How long you need to hover over a directory before it expands\nexport const DRAG_HOVER_TIMEOUT = 500;\n\nconst ITEM_LIST_CLASS_NAME = 'item-list-scroll-pane';\n\nexport const renderFileListItem = (\n props: FileListRenderItemProps\n): JSX.Element => {\n const {\n children,\n draggedItems,\n isDragInProgress,\n isDropTargetValid,\n isSelected,\n item,\n itemIndex,\n dropTargetItem,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n } = props;\n\n const isDragged =\n draggedItems?.some(draggedItem => draggedItem.id === item.id) ?? false;\n const itemPath = getPathFromItem(item);\n const dropTargetPath =\n isDragInProgress && dropTargetItem ? getPathFromItem(dropTargetItem) : null;\n\n const isExactDropTarget =\n isDragInProgress &&\n isDropTargetValid &&\n isDirectory(item) &&\n dropTargetPath === itemPath;\n const isInDropTarget =\n isDragInProgress && isDropTargetValid && dropTargetPath === itemPath;\n const isInvalidDropTarget =\n isDragInProgress && !isDropTargetValid && dropTargetPath === itemPath;\n\n const icon = getItemIcon(item);\n const depth = FileUtils.getDepth(item.filename);\n const depthLines = Array(depth)\n .fill(null)\n .map((value, index) => (\n // eslint-disable-next-line react/no-array-index-key\n <span className=\"file-list-depth-line\" key={index} />\n ));\n\n return (\n <div\n className={classNames(\n 'd-flex w-100 align-items-center',\n 'file-list-item',\n {\n 'is-dragged': isDragged,\n 'is-exact-drop-target': isExactDropTarget,\n 'is-in-drop-target': isInDropTarget,\n 'is-invalid-drop-target': isInvalidDropTarget,\n 'is-selected': isSelected,\n }\n )}\n onDragStart={e => onDragStart(itemIndex, e)}\n onDragOver={e => onDragOver(itemIndex, e)}\n onDragEnd={e => onDragEnd(itemIndex, e)}\n onDrop={e => onDrop(itemIndex, e)}\n draggable\n role=\"presentation\"\n aria-label={item.basename}\n >\n {depthLines}{' '}\n <FontAwesomeIcon icon={icon} className=\"item-icon\" fixedWidth />{' '}\n <span className=\"truncation-wrapper\">\n {children ?? item.basename}\n <Tooltip\n options={{\n modifiers: { preventOverflow: { boundariesElement: 'window' } },\n placement: 'left',\n }}\n >\n {children ?? item.basename}\n </Tooltip>\n </span>\n </div>\n );\n};\n\n/**\n * Get the icon definition for a file or folder item\n * @param item Item to get the icon for\n * @returns Icon definition to pass in the FontAwesomeIcon icon prop\n */\nexport function getItemIcon(item: FileStorageItem): IconDefinition {\n if (isDirectory(item)) {\n return item.isExpanded ? vsFolderOpened : vsFolder;\n }\n const mimeType = FileUtils.getMimeType(item.basename);\n switch (mimeType) {\n case MIME_TYPE.PYTHON:\n return dhPython;\n default:\n return vsCode;\n }\n}\n\n/**\n * Get the move operation for the current selection and the given target. Throws if the operation is invalid.\n */\nexport function getMoveOperation(\n draggedItems: FileStorageItem[],\n targetItem: FileStorageItem\n): { files: FileStorageItem[]; targetPath: string } {\n if (draggedItems.length === 0 || targetItem == null) {\n throw new Error('No items to move');\n }\n\n const targetPath = getPathFromItem(targetItem);\n if (\n draggedItems.some(\n ({ filename }) => FileUtils.getPath(filename) === targetPath\n )\n ) {\n // Cannot drop if target is one of the dragged items is already in the target folder\n throw new Error('File already in the destination folder');\n }\n if (\n draggedItems.some(\n item =>\n isDirectory(item) &&\n targetPath.startsWith(FileUtils.makePath(item.filename))\n )\n ) {\n // Cannot drop if target is a child of one of the directories being moved\n throw new Error('Destination folder cannot be a child of a dragged folder');\n }\n return { files: draggedItems, targetPath };\n}\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorageTable.\n */\nexport const FileList = (props: FileListProps): JSX.Element => {\n const {\n isMultiSelect = false,\n table,\n onFocusChange = () => undefined,\n onMove,\n onSelect,\n onSelectionChange = () => undefined,\n renderItem = renderFileListItem,\n rowHeight = DEFAULT_ROW_HEIGHT,\n overscanCount = ItemList.DEFAULT_OVERSCAN,\n } = props;\n const [loadedViewport, setLoadedViewport] = useState<LoadedViewport>(() => ({\n items: [],\n offset: 0,\n itemCount: 0,\n }));\n const [viewport, setViewport] = useState<ListViewport>({\n top: 0,\n bottom: 0,\n });\n\n const [dropTargetItem, setDropTargetItem] = useState<FileStorageItem>();\n const [draggedItems, setDraggedItems] = useState<FileStorageItem[]>();\n const [dragPlaceholder, setDragPlaceholder] = useState<HTMLDivElement>();\n const [selectedRanges, setSelectedRanges] = useState([] as Range[]);\n\n const itemList = useRef<ItemList<FileStorageItem>>(null);\n const fileList = useRef<HTMLDivElement>(null);\n\n const getItems = useCallback(\n (ranges: Range[]): FileStorageItem[] => {\n if (ranges.length === 0 || loadedViewport == null) {\n return [];\n }\n\n const items = [] as FileStorageItem[];\n for (let i = 0; i < ranges.length; i += 1) {\n const range = ranges[i];\n for (let j = range[0]; j <= range[1]; j += 1) {\n if (\n j >= loadedViewport.offset &&\n j < loadedViewport.offset + loadedViewport.items.length\n ) {\n items.push(loadedViewport.items[j - loadedViewport.offset]);\n }\n }\n }\n return items;\n },\n [loadedViewport]\n );\n\n const getItem = useCallback(\n (itemIndex: number): FileStorageItem | undefined => {\n const items = getItems([[itemIndex, itemIndex]]);\n if (items.length > 0) {\n return items[0];\n }\n },\n [getItems]\n );\n\n /**\n * Get the placeholder text to show when a drag operation is in progress\n */\n const getDragPlaceholderText = useCallback(() => {\n const count = RangeUtils.count(selectedRanges);\n if (count === 0) {\n return null;\n }\n\n if (count === 1) {\n const index = selectedRanges[0][0];\n const item = getItem(index);\n if (item != null) {\n return item.filename;\n }\n }\n return `${count} items`;\n }, [getItem, selectedRanges]);\n\n /**\n * Drop the currently dragged items at the currently set drop target.\n * If an itemIndex is provided, focus that index after the drop.\n */\n const dropItems = useCallback(\n (itemIndex?: number) => {\n if (!draggedItems || !dropTargetItem) {\n return;\n }\n\n log.debug('dropItems', draggedItems, 'to', itemIndex);\n\n try {\n const { files, targetPath } = getMoveOperation(\n draggedItems,\n dropTargetItem\n );\n onMove(files, targetPath);\n if (itemIndex != null) {\n setSelectedRanges([[itemIndex, itemIndex]]);\n itemList.current?.focusItem(itemIndex);\n }\n } catch (err) {\n log.error('Unable to complete move', err);\n }\n },\n [draggedItems, dropTargetItem, onMove]\n );\n\n const handleSelect = useCallback(\n (itemIndex: number, event: React.SyntheticEvent) => {\n const item = loadedViewport.items[itemIndex - loadedViewport.offset];\n if (item !== undefined) {\n log.debug('handleItemClick', item);\n\n onSelect(item, event);\n if (isDirectory(item)) {\n table?.setExpanded(item.filename, !item.isExpanded);\n }\n }\n },\n [loadedViewport, onSelect, table]\n );\n\n const handleItemDragStart = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n log.debug2('handleItemDragStart', itemIndex, selectedRanges);\n\n let draggedRanges = selectedRanges;\n if (!RangeUtils.isSelected(selectedRanges, itemIndex)) {\n draggedRanges = [[itemIndex, itemIndex]];\n setSelectedRanges(draggedRanges);\n }\n\n setDraggedItems(getItems(draggedRanges));\n\n // We need to reset reset the mouse state since we steal the drag\n itemList.current?.resetMouseState();\n\n const newDragPlaceholder = document.createElement('div');\n newDragPlaceholder.innerHTML = `<div class=\"dnd-placeholder-content\">${getDragPlaceholderText()}</div>`;\n newDragPlaceholder.className = 'file-list-dnd-placeholder';\n document.body.appendChild(newDragPlaceholder);\n e.dataTransfer.setDragImage(newDragPlaceholder, 0, 0);\n e.dataTransfer.effectAllowed = 'move';\n setDragPlaceholder(newDragPlaceholder);\n },\n [getDragPlaceholderText, getItems, selectedRanges]\n );\n\n const handleItemDragOver = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n\n log.debug2('handleItemDragOver', e);\n setDropTargetItem(getItem(itemIndex));\n },\n [getItem]\n );\n\n const handleItemDragEnd = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n log.debug('handleItemDragEnd', itemIndex);\n\n dragPlaceholder?.remove();\n\n // Drag end is triggered after drop\n // Also drop isn't triggered if drag end is outside of the list\n setDraggedItems(undefined);\n setDropTargetItem(undefined);\n setDragPlaceholder(undefined);\n },\n [dragPlaceholder]\n );\n\n const handleItemDrop = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n dropItems(itemIndex);\n },\n [dropItems]\n );\n\n const handleItemDragExit = useCallback(() => {\n log.debug2('handleItemDragExit');\n setDropTargetItem(undefined);\n }, []);\n\n const handleListDragOver = useCallback(\n (e: React.DragEvent<HTMLDivElement>) => {\n if (\n e.target instanceof Element &&\n e.target.classList.contains(ITEM_LIST_CLASS_NAME)\n ) {\n // Need to prevent default to enable drop\n // https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#droptargets\n e.preventDefault();\n\n log.debug2('handleListDragOver', e);\n setDropTargetItem({\n type: 'directory',\n filename: '/',\n basename: '/',\n id: '/',\n });\n }\n },\n []\n );\n\n const handleListDrop = useCallback(\n (e: React.DragEvent<HTMLDivElement>) => {\n if (\n e.target instanceof Element &&\n e.target.classList.contains(ITEM_LIST_CLASS_NAME)\n ) {\n log.debug('handleListDrop');\n dropItems();\n }\n },\n [dropItems]\n );\n\n const handleSelectionChange = useCallback(\n newSelectedRanges => {\n log.debug2('handleSelectionChange', newSelectedRanges);\n if (newSelectedRanges !== selectedRanges) {\n setSelectedRanges(newSelectedRanges);\n const selectedItems = getItems(newSelectedRanges);\n onSelectionChange(selectedItems);\n }\n },\n [getItems, onSelectionChange, selectedRanges]\n );\n\n const handleFocusChange = useCallback(\n focusIndex => {\n log.debug2('handleFocusChange', focusIndex);\n if (focusIndex != null) {\n const [focusedItem] = getItems([[focusIndex, focusIndex]]);\n onFocusChange(focusedItem);\n } else {\n onFocusChange();\n }\n },\n [getItems, onFocusChange]\n );\n\n const handleViewportChange = useCallback(\n (top: number, bottom: number) => {\n log.debug('handleViewportChange', top, bottom);\n if (top !== viewport.top || bottom !== viewport.bottom) {\n setViewport({ top, bottom });\n }\n },\n [viewport]\n );\n\n const isDropTargetValid = useMemo(() => {\n if (!draggedItems || !dropTargetItem) {\n return false;\n }\n\n try {\n getMoveOperation(draggedItems, dropTargetItem);\n log.debug('handleValidateDropTarget true');\n return true;\n } catch (e) {\n log.debug('handleValidateDropTarget false');\n return false;\n }\n }, [draggedItems, dropTargetItem]);\n\n const { focusedPath } = props;\n useEffect(() => {\n if (focusedPath !== undefined) {\n if (focusedPath === '/') {\n table.collapseAll();\n } else {\n table.setExpanded(focusedPath, false);\n table.setExpanded(focusedPath, true);\n }\n }\n }, [table, focusedPath]);\n\n useEffect(\n function updateTableViewport() {\n log.debug('updating table viewport', viewport);\n table?.setViewport({\n top: Math.max(0, viewport.top - overscanCount),\n bottom: viewport.bottom + overscanCount,\n });\n },\n [overscanCount, table, viewport]\n );\n\n // Listen for table updates\n useEffect(\n function setLoadedViewportAndReturnCleanup() {\n const listenerRemover = table.onUpdate(newViewport => {\n setLoadedViewport({\n items: newViewport.items.map(item => ({\n ...item,\n itemName: item.basename,\n })),\n offset: newViewport.offset,\n itemCount: table.size,\n });\n });\n return () => {\n listenerRemover();\n };\n },\n [table]\n );\n\n // Expand a folder if hovering over it\n useEffect(\n function expandFolderOnHover() {\n if (\n dropTargetItem != null &&\n isDirectory(dropTargetItem) &&\n dropTargetItem.filename !== '/'\n ) {\n const timeout = setTimeout(() => {\n if (!dropTargetItem.isExpanded) {\n table?.setExpanded(dropTargetItem.filename, true);\n }\n }, DRAG_HOVER_TIMEOUT);\n return () => clearTimeout(timeout);\n }\n },\n [dropTargetItem, table]\n );\n\n const renderWrapper = useCallback(\n itemProps =>\n renderItem({\n ...itemProps,\n isDragInProgress: draggedItems != null,\n dropTargetItem,\n draggedItems,\n isDropTargetValid,\n onDragStart: handleItemDragStart,\n onDragEnd: handleItemDragEnd,\n onDragOver: handleItemDragOver,\n onDragExit: handleItemDragExit,\n onDrop: handleItemDrop,\n }),\n [\n handleItemDragEnd,\n handleItemDragExit,\n handleItemDragOver,\n handleItemDragStart,\n handleItemDrop,\n draggedItems,\n dropTargetItem,\n isDropTargetValid,\n renderItem,\n ]\n );\n\n return (\n <div\n ref={fileList}\n className={classNames('file-list', {\n 'is-dragging': draggedItems != null,\n })}\n onDragOver={handleListDragOver}\n onDrop={handleListDrop}\n >\n <ItemList\n ref={itemList}\n items={loadedViewport.items}\n itemCount={loadedViewport.itemCount}\n offset={loadedViewport.offset}\n onFocusChange={handleFocusChange}\n onSelect={handleSelect}\n onSelectionChange={handleSelectionChange}\n onViewportChange={handleViewportChange}\n selectedRanges={selectedRanges}\n renderItem={renderWrapper}\n rowHeight={rowHeight}\n isMultiSelect={isMultiSelect}\n isDragSelect={false}\n isDeselectOnClick={false}\n />\n </div>\n );\n};\n\nexport default FileList;\n"],"mappings":"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"}
|
|
@@ -161,7 +161,7 @@ export var FileListContainer = props => {
|
|
|
161
161
|
}, [handleRenameCancel, handleRenameSubmit, renameItem, validateRenameItem]);
|
|
162
162
|
return /*#__PURE__*/React.createElement("div", {
|
|
163
163
|
className: "file-list-container"
|
|
164
|
-
}, table && /*#__PURE__*/React.createElement(FileList, {
|
|
164
|
+
}, table != null && /*#__PURE__*/React.createElement(FileList, {
|
|
165
165
|
onMove: onMove,
|
|
166
166
|
onSelect: onSelect,
|
|
167
167
|
onSelectionChange: handleSelectionChange,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileListContainer.js","names":["ContextActions","React","useCallback","useMemo","useState","FileList","renderFileListItem","DEFAULT_ROW_HEIGHT","isDirectory","SHORTCUTS","FileUtils","FileListItemEditor","FileListContainer","props","isMultiSelect","focusedPath","showContextMenu","onCreateFile","onCreateFolder","onCopy","onDelete","onMove","undefined","onRename","onSelect","onSelectionChange","table","rowHeight","validateRename","Promise","resolve","renameItem","setRenameItem","selectedItems","setSelectedItems","focusedItem","setFocusedItem","handleSelectionChange","newSelectedItems","handleFocusChange","newFocusedItem","handleCopyAction","handleDeleteAction","length","handleNewFileAction","handleNewFolderAction","getPath","filename","handleRenameAction","handleRenameCancel","handleRenameSubmit","newName","actions","result","push","title","description","action","group","groups","medium","low","disabled","shortcut","FILE_EXPLORER","DELETE","RENAME","validateRenameItem","reject","Error","renderItem","itemProps","item","children","displayName"],"sources":["../src/FileListContainer.tsx"],"sourcesContent":["import { ContextAction, ContextActions } from '@deephaven/components';\nimport React, { useCallback, useMemo, useState } from 'react';\nimport FileList, {\n renderFileListItem,\n DEFAULT_ROW_HEIGHT,\n FileListRenderItemProps,\n} from './FileList';\nimport { FileStorageItem, FileStorageTable, isDirectory } from './FileStorage';\nimport SHORTCUTS from './FileExplorerShortcuts';\nimport './FileExplorer.scss';\nimport FileUtils from './FileUtils';\nimport FileListItemEditor from './FileListItemEditor';\n\nexport interface FileListContainerProps {\n showContextMenu?: boolean;\n table: FileStorageTable;\n\n isMultiSelect?: boolean;\n focusedPath?: string;\n\n onCreateFile?: (path?: string) => void;\n onCreateFolder?: (path?: string) => void;\n onCopy?: (file: FileStorageItem) => void;\n onDelete?: (files: FileStorageItem[]) => void;\n onMove?: (files: FileStorageItem[], path: string) => void;\n onRename?: (file: FileStorageItem, newName: string) => void;\n onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => void;\n validateRename?: (file: FileStorageItem, newName: string) => Promise<void>;\n onSelectionChange?: (selectedItems: FileStorageItem[]) => void;\n\n /** Height of each item in the list */\n rowHeight?: number;\n}\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorage.\n */\nexport const FileListContainer = (\n props: FileListContainerProps\n): JSX.Element => {\n const {\n isMultiSelect = false,\n focusedPath,\n showContextMenu = false,\n onCreateFile,\n onCreateFolder,\n onCopy,\n onDelete,\n onMove = () => undefined,\n onRename,\n onSelect,\n onSelectionChange,\n table,\n rowHeight = DEFAULT_ROW_HEIGHT,\n validateRename = () => Promise.resolve(),\n } = props;\n const [renameItem, setRenameItem] = useState<FileStorageItem>();\n const [selectedItems, setSelectedItems] = useState([] as FileStorageItem[]);\n const [focusedItem, setFocusedItem] = useState<FileStorageItem>();\n\n const handleSelectionChange = useCallback(\n newSelectedItems => {\n setSelectedItems(newSelectedItems);\n onSelectionChange?.(newSelectedItems);\n },\n [onSelectionChange]\n );\n\n const handleFocusChange = useCallback(newFocusedItem => {\n setFocusedItem(newFocusedItem);\n }, []);\n\n const handleCopyAction = useCallback(() => {\n if (focusedItem) {\n onCopy?.(focusedItem);\n }\n }, [focusedItem, onCopy]);\n\n const handleDeleteAction = useCallback(() => {\n if (selectedItems.length > 0) {\n onDelete?.(selectedItems);\n }\n }, [onDelete, selectedItems]);\n\n const handleNewFileAction = useCallback(() => {\n onCreateFile?.();\n }, [onCreateFile]);\n\n const handleNewFolderAction = useCallback(() => {\n if (focusedItem) {\n onCreateFolder?.(FileUtils.getPath(focusedItem.filename));\n }\n }, [focusedItem, onCreateFolder]);\n\n const handleRenameAction = useCallback(() => {\n if (focusedItem) {\n setRenameItem(focusedItem);\n }\n }, [focusedItem]);\n\n const handleRenameCancel = useCallback((): void => {\n setRenameItem(undefined);\n }, []);\n\n const handleRenameSubmit = useCallback(\n (newName: string): void => {\n if (renameItem) {\n onRename?.(renameItem, newName);\n setRenameItem(undefined);\n }\n },\n [onRename, renameItem]\n );\n\n const actions = useMemo(() => {\n if (renameItem) {\n // While renaming, we don't want to enable any of the context actions or it may interfere with renaming input\n return [];\n }\n\n const result = [] as ContextAction[];\n if (onCreateFile) {\n result.push({\n title: 'New File',\n description: 'Create new file',\n action: handleNewFileAction,\n group: ContextActions.groups.medium,\n });\n }\n if (onCreateFolder) {\n result.push({\n title: 'New Folder',\n description: 'Create new folder',\n action: handleNewFolderAction,\n group: ContextActions.groups.medium,\n });\n }\n if (onCopy) {\n result.push({\n title: 'Copy',\n description: 'Copy',\n action: handleCopyAction,\n group: ContextActions.groups.low,\n disabled: focusedItem == null || isDirectory(focusedItem),\n });\n }\n if (onDelete && selectedItems.length > 0) {\n result.push({\n title: 'Delete',\n description: 'Delete',\n shortcut: SHORTCUTS.FILE_EXPLORER.DELETE,\n action: handleDeleteAction,\n group: ContextActions.groups.low,\n });\n }\n if (onRename) {\n result.push({\n title: 'Rename',\n description: 'Rename',\n shortcut: SHORTCUTS.FILE_EXPLORER.RENAME,\n action: handleRenameAction,\n group: ContextActions.groups.low,\n disabled: focusedItem == null,\n });\n }\n return result;\n }, [\n handleCopyAction,\n handleDeleteAction,\n handleNewFileAction,\n handleNewFolderAction,\n handleRenameAction,\n focusedItem,\n onCopy,\n onCreateFile,\n onCreateFolder,\n onDelete,\n onRename,\n selectedItems,\n renameItem,\n ]);\n\n const validateRenameItem = useCallback(\n (newName: string): Promise<void> => {\n if (renameItem) {\n return validateRename(renameItem, newName);\n }\n return Promise.reject(new Error('No rename item'));\n },\n [renameItem, validateRename]\n );\n\n const renderItem = useCallback(\n (itemProps: FileListRenderItemProps): JSX.Element => {\n const { item } = itemProps;\n if (renameItem && renameItem.filename === item.filename) {\n return renderFileListItem({\n ...itemProps,\n children: (\n <FileListItemEditor\n item={item}\n validate={validateRenameItem}\n onSubmit={handleRenameSubmit}\n onCancel={handleRenameCancel}\n />\n ),\n });\n }\n return renderFileListItem(itemProps);\n },\n [handleRenameCancel, handleRenameSubmit, renameItem, validateRenameItem]\n );\n\n return (\n <div className=\"file-list-container\">\n {table && (\n <FileList\n onMove={onMove}\n onSelect={onSelect}\n onSelectionChange={handleSelectionChange}\n onFocusChange={handleFocusChange}\n renderItem={renderItem}\n rowHeight={rowHeight}\n table={table}\n isMultiSelect={isMultiSelect}\n focusedPath={focusedPath}\n />\n )}\n {showContextMenu && <ContextActions actions={actions} />}\n </div>\n );\n};\n\nFileListContainer.displayName = 'FileListContainer';\n\nexport default FileListContainer;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FileListContainer.js","names":["ContextActions","React","useCallback","useMemo","useState","FileList","renderFileListItem","DEFAULT_ROW_HEIGHT","isDirectory","SHORTCUTS","FileUtils","FileListItemEditor","FileListContainer","props","isMultiSelect","focusedPath","showContextMenu","onCreateFile","onCreateFolder","onCopy","onDelete","onMove","undefined","onRename","onSelect","onSelectionChange","table","rowHeight","validateRename","Promise","resolve","renameItem","setRenameItem","selectedItems","setSelectedItems","focusedItem","setFocusedItem","handleSelectionChange","newSelectedItems","handleFocusChange","newFocusedItem","handleCopyAction","handleDeleteAction","length","handleNewFileAction","handleNewFolderAction","getPath","filename","handleRenameAction","handleRenameCancel","handleRenameSubmit","newName","actions","result","push","title","description","action","group","groups","medium","low","disabled","shortcut","FILE_EXPLORER","DELETE","RENAME","validateRenameItem","reject","Error","renderItem","itemProps","item","children","displayName"],"sources":["../src/FileListContainer.tsx"],"sourcesContent":["import { ContextAction, ContextActions } from '@deephaven/components';\nimport React, { useCallback, useMemo, useState } from 'react';\nimport FileList, {\n renderFileListItem,\n DEFAULT_ROW_HEIGHT,\n FileListRenderItemProps,\n} from './FileList';\nimport { FileStorageItem, FileStorageTable, isDirectory } from './FileStorage';\nimport SHORTCUTS from './FileExplorerShortcuts';\nimport './FileExplorer.scss';\nimport FileUtils from './FileUtils';\nimport FileListItemEditor from './FileListItemEditor';\n\nexport interface FileListContainerProps {\n showContextMenu?: boolean;\n table: FileStorageTable;\n\n isMultiSelect?: boolean;\n focusedPath?: string;\n\n onCreateFile?: (path?: string) => void;\n onCreateFolder?: (path?: string) => void;\n onCopy?: (file: FileStorageItem) => void;\n onDelete?: (files: FileStorageItem[]) => void;\n onMove?: (files: FileStorageItem[], path: string) => void;\n onRename?: (file: FileStorageItem, newName: string) => void;\n onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => void;\n validateRename?: (file: FileStorageItem, newName: string) => Promise<void>;\n onSelectionChange?: (selectedItems: FileStorageItem[]) => void;\n\n /** Height of each item in the list */\n rowHeight?: number;\n}\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorage.\n */\nexport const FileListContainer = (\n props: FileListContainerProps\n): JSX.Element => {\n const {\n isMultiSelect = false,\n focusedPath,\n showContextMenu = false,\n onCreateFile,\n onCreateFolder,\n onCopy,\n onDelete,\n onMove = () => undefined,\n onRename,\n onSelect,\n onSelectionChange,\n table,\n rowHeight = DEFAULT_ROW_HEIGHT,\n validateRename = () => Promise.resolve(),\n } = props;\n const [renameItem, setRenameItem] = useState<FileStorageItem>();\n const [selectedItems, setSelectedItems] = useState([] as FileStorageItem[]);\n const [focusedItem, setFocusedItem] = useState<FileStorageItem>();\n\n const handleSelectionChange = useCallback(\n newSelectedItems => {\n setSelectedItems(newSelectedItems);\n onSelectionChange?.(newSelectedItems);\n },\n [onSelectionChange]\n );\n\n const handleFocusChange = useCallback(newFocusedItem => {\n setFocusedItem(newFocusedItem);\n }, []);\n\n const handleCopyAction = useCallback(() => {\n if (focusedItem) {\n onCopy?.(focusedItem);\n }\n }, [focusedItem, onCopy]);\n\n const handleDeleteAction = useCallback(() => {\n if (selectedItems.length > 0) {\n onDelete?.(selectedItems);\n }\n }, [onDelete, selectedItems]);\n\n const handleNewFileAction = useCallback(() => {\n onCreateFile?.();\n }, [onCreateFile]);\n\n const handleNewFolderAction = useCallback(() => {\n if (focusedItem) {\n onCreateFolder?.(FileUtils.getPath(focusedItem.filename));\n }\n }, [focusedItem, onCreateFolder]);\n\n const handleRenameAction = useCallback(() => {\n if (focusedItem) {\n setRenameItem(focusedItem);\n }\n }, [focusedItem]);\n\n const handleRenameCancel = useCallback((): void => {\n setRenameItem(undefined);\n }, []);\n\n const handleRenameSubmit = useCallback(\n (newName: string): void => {\n if (renameItem) {\n onRename?.(renameItem, newName);\n setRenameItem(undefined);\n }\n },\n [onRename, renameItem]\n );\n\n const actions = useMemo(() => {\n if (renameItem) {\n // While renaming, we don't want to enable any of the context actions or it may interfere with renaming input\n return [];\n }\n\n const result = [] as ContextAction[];\n if (onCreateFile) {\n result.push({\n title: 'New File',\n description: 'Create new file',\n action: handleNewFileAction,\n group: ContextActions.groups.medium,\n });\n }\n if (onCreateFolder) {\n result.push({\n title: 'New Folder',\n description: 'Create new folder',\n action: handleNewFolderAction,\n group: ContextActions.groups.medium,\n });\n }\n if (onCopy) {\n result.push({\n title: 'Copy',\n description: 'Copy',\n action: handleCopyAction,\n group: ContextActions.groups.low,\n disabled: focusedItem == null || isDirectory(focusedItem),\n });\n }\n if (onDelete && selectedItems.length > 0) {\n result.push({\n title: 'Delete',\n description: 'Delete',\n shortcut: SHORTCUTS.FILE_EXPLORER.DELETE,\n action: handleDeleteAction,\n group: ContextActions.groups.low,\n });\n }\n if (onRename) {\n result.push({\n title: 'Rename',\n description: 'Rename',\n shortcut: SHORTCUTS.FILE_EXPLORER.RENAME,\n action: handleRenameAction,\n group: ContextActions.groups.low,\n disabled: focusedItem == null,\n });\n }\n return result;\n }, [\n handleCopyAction,\n handleDeleteAction,\n handleNewFileAction,\n handleNewFolderAction,\n handleRenameAction,\n focusedItem,\n onCopy,\n onCreateFile,\n onCreateFolder,\n onDelete,\n onRename,\n selectedItems,\n renameItem,\n ]);\n\n const validateRenameItem = useCallback(\n (newName: string): Promise<void> => {\n if (renameItem) {\n return validateRename(renameItem, newName);\n }\n return Promise.reject(new Error('No rename item'));\n },\n [renameItem, validateRename]\n );\n\n const renderItem = useCallback(\n (itemProps: FileListRenderItemProps): JSX.Element => {\n const { item } = itemProps;\n if (renameItem && renameItem.filename === item.filename) {\n return renderFileListItem({\n ...itemProps,\n children: (\n <FileListItemEditor\n item={item}\n validate={validateRenameItem}\n onSubmit={handleRenameSubmit}\n onCancel={handleRenameCancel}\n />\n ),\n });\n }\n return renderFileListItem(itemProps);\n },\n [handleRenameCancel, handleRenameSubmit, renameItem, validateRenameItem]\n );\n\n return (\n <div className=\"file-list-container\">\n {table != null && (\n <FileList\n onMove={onMove}\n onSelect={onSelect}\n onSelectionChange={handleSelectionChange}\n onFocusChange={handleFocusChange}\n renderItem={renderItem}\n rowHeight={rowHeight}\n table={table}\n isMultiSelect={isMultiSelect}\n focusedPath={focusedPath}\n />\n )}\n {showContextMenu && <ContextActions actions={actions} />}\n </div>\n );\n};\n\nFileListContainer.displayName = 'FileListContainer';\n\nexport default FileListContainer;\n"],"mappings":";;;;;;AAAA,SAAwBA,cAAxB,QAA8C,uBAA9C;AACA,OAAOC,KAAP,IAAgBC,WAAhB,EAA6BC,OAA7B,EAAsCC,QAAtC,QAAsD,OAAtD;OACOC,Q,IACLC,kB,EACAC,kB;SAG0CC,W;OACrCC,S;;OAEAC,S;OACAC,kB;;AAuBP;AACA;AACA;AACA,OAAO,IAAMC,iBAAiB,GAC5BC,KAD+B,IAEf;EAChB,IAAM;IACJC,aAAa,GAAG,KADZ;IAEJC,WAFI;IAGJC,eAAe,GAAG,KAHd;IAIJC,YAJI;IAKJC,cALI;IAMJC,MANI;IAOJC,QAPI;IAQJC,MAAM,GAAG,MAAMC,SARX;IASJC,QATI;IAUJC,QAVI;IAWJC,iBAXI;IAYJC,KAZI;IAaJC,SAAS,GAAGpB,kBAbR;IAcJqB,cAAc,GAAG,MAAMC,OAAO,CAACC,OAAR;EAdnB,IAeFjB,KAfJ;EAgBA,IAAM,CAACkB,UAAD,EAAaC,aAAb,IAA8B5B,QAAQ,EAA5C;EACA,IAAM,CAAC6B,aAAD,EAAgBC,gBAAhB,IAAoC9B,QAAQ,CAAC,EAAD,CAAlD;EACA,IAAM,CAAC+B,WAAD,EAAcC,cAAd,IAAgChC,QAAQ,EAA9C;EAEA,IAAMiC,qBAAqB,GAAGnC,WAAW,CACvCoC,gBAAgB,IAAI;IAClBJ,gBAAgB,CAACI,gBAAD,CAAhB;IACAb,iBAAiB,SAAjB,IAAAA,iBAAiB,WAAjB,YAAAA,iBAAiB,CAAGa,gBAAH,CAAjB;EACD,CAJsC,EAKvC,CAACb,iBAAD,CALuC,CAAzC;EAQA,IAAMc,iBAAiB,GAAGrC,WAAW,CAACsC,cAAc,IAAI;IACtDJ,cAAc,CAACI,cAAD,CAAd;EACD,CAFoC,EAElC,EAFkC,CAArC;EAIA,IAAMC,gBAAgB,GAAGvC,WAAW,CAAC,MAAM;IACzC,IAAIiC,WAAJ,EAAiB;MACfhB,MAAM,SAAN,IAAAA,MAAM,WAAN,YAAAA,MAAM,CAAGgB,WAAH,CAAN;IACD;EACF,CAJmC,EAIjC,CAACA,WAAD,EAAchB,MAAd,CAJiC,CAApC;EAMA,IAAMuB,kBAAkB,GAAGxC,WAAW,CAAC,MAAM;IAC3C,IAAI+B,aAAa,CAACU,MAAd,GAAuB,CAA3B,EAA8B;MAC5BvB,QAAQ,SAAR,IAAAA,QAAQ,WAAR,YAAAA,QAAQ,CAAGa,aAAH,CAAR;IACD;EACF,CAJqC,EAInC,CAACb,QAAD,EAAWa,aAAX,CAJmC,CAAtC;EAMA,IAAMW,mBAAmB,GAAG1C,WAAW,CAAC,MAAM;IAC5Ce,YAAY,SAAZ,IAAAA,YAAY,WAAZ,YAAAA,YAAY;EACb,CAFsC,EAEpC,CAACA,YAAD,CAFoC,CAAvC;EAIA,IAAM4B,qBAAqB,GAAG3C,WAAW,CAAC,MAAM;IAC9C,IAAIiC,WAAJ,EAAiB;MACfjB,cAAc,SAAd,IAAAA,cAAc,WAAd,YAAAA,cAAc,CAAGR,SAAS,CAACoC,OAAV,CAAkBX,WAAW,CAACY,QAA9B,CAAH,CAAd;IACD;EACF,CAJwC,EAItC,CAACZ,WAAD,EAAcjB,cAAd,CAJsC,CAAzC;EAMA,IAAM8B,kBAAkB,GAAG9C,WAAW,CAAC,MAAM;IAC3C,IAAIiC,WAAJ,EAAiB;MACfH,aAAa,CAACG,WAAD,CAAb;IACD;EACF,CAJqC,EAInC,CAACA,WAAD,CAJmC,CAAtC;EAMA,IAAMc,kBAAkB,GAAG/C,WAAW,CAAC,MAAY;IACjD8B,aAAa,CAACV,SAAD,CAAb;EACD,CAFqC,EAEnC,EAFmC,CAAtC;EAIA,IAAM4B,kBAAkB,GAAGhD,WAAW,CACnCiD,OAAD,IAA2B;IACzB,IAAIpB,UAAJ,EAAgB;MACdR,QAAQ,SAAR,IAAAA,QAAQ,WAAR,YAAAA,QAAQ,CAAGQ,UAAH,EAAeoB,OAAf,CAAR;MACAnB,aAAa,CAACV,SAAD,CAAb;IACD;EACF,CANmC,EAOpC,CAACC,QAAD,EAAWQ,UAAX,CAPoC,CAAtC;EAUA,IAAMqB,OAAO,GAAGjD,OAAO,CAAC,MAAM;IAC5B,IAAI4B,UAAJ,EAAgB;MACd;MACA,OAAO,EAAP;IACD;;IAED,IAAMsB,MAAM,GAAG,EAAf;;IACA,IAAIpC,YAAJ,EAAkB;MAChBoC,MAAM,CAACC,IAAP,CAAY;QACVC,KAAK,EAAE,UADG;QAEVC,WAAW,EAAE,iBAFH;QAGVC,MAAM,EAAEb,mBAHE;QAIVc,KAAK,EAAE1D,cAAc,CAAC2D,MAAf,CAAsBC;MAJnB,CAAZ;IAMD;;IACD,IAAI1C,cAAJ,EAAoB;MAClBmC,MAAM,CAACC,IAAP,CAAY;QACVC,KAAK,EAAE,YADG;QAEVC,WAAW,EAAE,mBAFH;QAGVC,MAAM,EAAEZ,qBAHE;QAIVa,KAAK,EAAE1D,cAAc,CAAC2D,MAAf,CAAsBC;MAJnB,CAAZ;IAMD;;IACD,IAAIzC,MAAJ,EAAY;MACVkC,MAAM,CAACC,IAAP,CAAY;QACVC,KAAK,EAAE,MADG;QAEVC,WAAW,EAAE,MAFH;QAGVC,MAAM,EAAEhB,gBAHE;QAIViB,KAAK,EAAE1D,cAAc,CAAC2D,MAAf,CAAsBE,GAJnB;QAKVC,QAAQ,EAAE3B,WAAW,IAAI,IAAf,IAAuB3B,WAAW,CAAC2B,WAAD;MALlC,CAAZ;IAOD;;IACD,IAAIf,QAAQ,IAAIa,aAAa,CAACU,MAAd,GAAuB,CAAvC,EAA0C;MACxCU,MAAM,CAACC,IAAP,CAAY;QACVC,KAAK,EAAE,QADG;QAEVC,WAAW,EAAE,QAFH;QAGVO,QAAQ,EAAEtD,SAAS,CAACuD,aAAV,CAAwBC,MAHxB;QAIVR,MAAM,EAAEf,kBAJE;QAKVgB,KAAK,EAAE1D,cAAc,CAAC2D,MAAf,CAAsBE;MALnB,CAAZ;IAOD;;IACD,IAAItC,QAAJ,EAAc;MACZ8B,MAAM,CAACC,IAAP,CAAY;QACVC,KAAK,EAAE,QADG;QAEVC,WAAW,EAAE,QAFH;QAGVO,QAAQ,EAAEtD,SAAS,CAACuD,aAAV,CAAwBE,MAHxB;QAIVT,MAAM,EAAET,kBAJE;QAKVU,KAAK,EAAE1D,cAAc,CAAC2D,MAAf,CAAsBE,GALnB;QAMVC,QAAQ,EAAE3B,WAAW,IAAI;MANf,CAAZ;IAQD;;IACD,OAAOkB,MAAP;EACD,CApDsB,EAoDpB,CACDZ,gBADC,EAEDC,kBAFC,EAGDE,mBAHC,EAIDC,qBAJC,EAKDG,kBALC,EAMDb,WANC,EAODhB,MAPC,EAQDF,YARC,EASDC,cATC,EAUDE,QAVC,EAWDG,QAXC,EAYDU,aAZC,EAaDF,UAbC,CApDoB,CAAvB;EAoEA,IAAMoC,kBAAkB,GAAGjE,WAAW,CACnCiD,OAAD,IAAoC;IAClC,IAAIpB,UAAJ,EAAgB;MACd,OAAOH,cAAc,CAACG,UAAD,EAAaoB,OAAb,CAArB;IACD;;IACD,OAAOtB,OAAO,CAACuC,MAAR,CAAe,IAAIC,KAAJ,CAAU,gBAAV,CAAf,CAAP;EACD,CANmC,EAOpC,CAACtC,UAAD,EAAaH,cAAb,CAPoC,CAAtC;EAUA,IAAM0C,UAAU,GAAGpE,WAAW,CAC3BqE,SAAD,IAAqD;IACnD,IAAM;MAAEC;IAAF,IAAWD,SAAjB;;IACA,IAAIxC,UAAU,IAAIA,UAAU,CAACgB,QAAX,KAAwByB,IAAI,CAACzB,QAA/C,EAAyD;MACvD,OAAOzC,kBAAkB,iCACpBiE,SADoB;QAEvBE,QAAQ,eACN,oBAAC,kBAAD;UACE,IAAI,EAAED,IADR;UAEE,QAAQ,EAAEL,kBAFZ;UAGE,QAAQ,EAAEjB,kBAHZ;UAIE,QAAQ,EAAED;QAJZ;MAHqB,GAAzB;IAWD;;IACD,OAAO3C,kBAAkB,CAACiE,SAAD,CAAzB;EACD,CAjB2B,EAkB5B,CAACtB,kBAAD,EAAqBC,kBAArB,EAAyCnB,UAAzC,EAAqDoC,kBAArD,CAlB4B,CAA9B;EAqBA,oBACE;IAAK,SAAS,EAAC;EAAf,GACGzC,KAAK,IAAI,IAAT,iBACC,oBAAC,QAAD;IACE,MAAM,EAAEL,MADV;IAEE,QAAQ,EAAEG,QAFZ;IAGE,iBAAiB,EAAEa,qBAHrB;IAIE,aAAa,EAAEE,iBAJjB;IAKE,UAAU,EAAE+B,UALd;IAME,SAAS,EAAE3C,SANb;IAOE,KAAK,EAAED,KAPT;IAQE,aAAa,EAAEZ,aARjB;IASE,WAAW,EAAEC;EATf,EAFJ,EAcGC,eAAe,iBAAI,oBAAC,cAAD;IAAgB,OAAO,EAAEoC;EAAzB,EAdtB,CADF;AAkBD,CAlMM;AAoMPxC,iBAAiB,CAAC8D,WAAlB,GAAgC,mBAAhC;AAEA,eAAe9D,iBAAf"}
|
package/dist/FileStorage.d.ts
CHANGED
|
@@ -29,11 +29,11 @@ export interface FileStorageTable extends StorageTable<FileStorageItem> {
|
|
|
29
29
|
* @param path The path to expand
|
|
30
30
|
* @param expanded What expanded state to set
|
|
31
31
|
*/
|
|
32
|
-
setExpanded(path: string, expanded: boolean):
|
|
32
|
+
setExpanded(path: string, expanded: boolean): void;
|
|
33
33
|
/**
|
|
34
34
|
* Collapses all directories
|
|
35
35
|
*/
|
|
36
|
-
collapseAll():
|
|
36
|
+
collapseAll(): void;
|
|
37
37
|
}
|
|
38
38
|
/**
|
|
39
39
|
* FileStorage abstraction. Has methods for managing files, and for retrieving a table to browse files.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileStorage.d.ts","sourceRoot":"","sources":["../src/FileStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;IAEjB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,oBAAY,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAE5C,MAAM,WAAW,eAAgB,SAAQ,WAAW,EAAE,YAAY;IAChE,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,WAAW,oBAAqB,SAAQ,eAAe;IAC3D,IAAI,EAAE,WAAW,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,eAAe,GACpB,IAAI,IAAI,oBAAoB,CAE9B;AAED;;GAEG;AACH,MAAM,WAAW,IAAK,SAAQ,YAAY;IACxC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAiB,SAAQ,YAAY,CAAC,eAAe,CAAC;IACrE,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAEhC;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"FileStorage.d.ts","sourceRoot":"","sources":["../src/FileStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;IAEjB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,oBAAY,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAE5C,MAAM,WAAW,eAAgB,SAAQ,WAAW,EAAE,YAAY;IAChE,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,WAAW,oBAAqB,SAAQ,eAAe;IAC3D,IAAI,EAAE,WAAW,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,eAAe,GACpB,IAAI,IAAI,oBAAoB,CAE9B;AAED;;GAEG;AACH,MAAM,WAAW,IAAK,SAAQ,YAAY;IACxC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAiB,SAAQ,YAAY,CAAC,eAAe,CAAC;IACrE,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAEhC;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IAEnD;;OAEG;IACH,WAAW,IAAI,IAAI,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,QAAQ,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAEtC;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpC;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtC;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExC;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvD;;;;;OAKG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAE7C;;;OAGG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CACzD;AAED,eAAe,WAAW,CAAC"}
|
package/dist/FileStorage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileStorage.js","names":["isDirectory","file","type"],"sources":["../src/FileStorage.ts"],"sourcesContent":["import { StorageTable, StorageItem } from '@deephaven/storage';\n\n/**\n * Basic metadata of the file\n */\nexport interface FileMetadata {\n /** Full path of the file */\n filename: string;\n\n /** Just the file name part of the file (no path) */\n basename: string;\n}\n\nexport type FileType = 'file' | 'directory';\n\nexport interface FileStorageItem extends StorageItem, FileMetadata {\n type: FileType;\n}\n\nexport interface DirectoryStorageItem extends FileStorageItem {\n type: 'directory';\n isExpanded: boolean;\n}\n\nexport function isDirectory(\n file: FileStorageItem\n): file is DirectoryStorageItem {\n return file.type === 'directory';\n}\n\n/**\n * A file including it's contents\n */\nexport interface File extends FileMetadata {\n content: string;\n}\n\nexport interface FileStorageTable extends StorageTable<FileStorageItem> {\n setSearch(search: string): void;\n\n /**\n * @param path The path to expand\n * @param expanded What expanded state to set\n */\n setExpanded(path: string, expanded: boolean):
|
|
1
|
+
{"version":3,"file":"FileStorage.js","names":["isDirectory","file","type"],"sources":["../src/FileStorage.ts"],"sourcesContent":["import { StorageTable, StorageItem } from '@deephaven/storage';\n\n/**\n * Basic metadata of the file\n */\nexport interface FileMetadata {\n /** Full path of the file */\n filename: string;\n\n /** Just the file name part of the file (no path) */\n basename: string;\n}\n\nexport type FileType = 'file' | 'directory';\n\nexport interface FileStorageItem extends StorageItem, FileMetadata {\n type: FileType;\n}\n\nexport interface DirectoryStorageItem extends FileStorageItem {\n type: 'directory';\n isExpanded: boolean;\n}\n\nexport function isDirectory(\n file: FileStorageItem\n): file is DirectoryStorageItem {\n return file.type === 'directory';\n}\n\n/**\n * A file including it's contents\n */\nexport interface File extends FileMetadata {\n content: string;\n}\n\nexport interface FileStorageTable extends StorageTable<FileStorageItem> {\n setSearch(search: string): void;\n\n /**\n * @param path The path to expand\n * @param expanded What expanded state to set\n */\n setExpanded(path: string, expanded: boolean): void;\n\n /**\n * Collapses all directories\n */\n collapseAll(): void;\n}\n\n/**\n * FileStorage abstraction. Has methods for managing files, and for retrieving a table to browse files.\n */\nexport interface FileStorage {\n /**\n * Retrieve a table to view the file list\n */\n getTable(): Promise<FileStorageTable>;\n\n /**\n * Save a file\n * @param file The file to save\n */\n saveFile(file: File): Promise<File>;\n\n /**\n * Load the contents of a file\n * @param name The file to load, including the full path\n */\n loadFile(name: string): Promise<File>;\n\n /**\n * Delete a file\n * @param name The full name of the file to delete\n */\n deleteFile(name: string): Promise<void>;\n\n /**\n * Move a file to a new location\n * @param name Source file name\n * @param newName The new file name, including path\n */\n moveFile(name: string, newName: string): Promise<void>;\n\n /**\n * Get the info for the file at the specified path.\n * If the file does not exists, rejects with a FileNotFoundError\n * @param name The file name to check, including path\n * @returns The FileStorageItem for the path specified, or reject with a FileNotFoundError if it does not exist.\n */\n info(name: string): Promise<FileStorageItem>;\n\n /**\n * Create the directory at the given path\n * @param name The full directory path\n */\n createDirectory(name: string): Promise<FileStorageItem>;\n}\n\nexport default FileStorage;\n"],"mappings":"AAEA;AACA;AACA;AAoBA,OAAO,SAASA,WAAT,CACLC,IADK,EAEyB;EAC9B,OAAOA,IAAI,CAACC,IAAL,KAAc,WAArB;AACD;AAED;AACA;AACA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NewItemModal.d.ts","sourceRoot":"","sources":["../src/NewItemModal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACzE,OAAO,SAAS,MAAM,YAAY,CAAC;AAUnC,OAAO,EACL,iBAAiB,EAGjB,eAAe,EAChB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"NewItemModal.d.ts","sourceRoot":"","sources":["../src/NewItemModal.tsx"],"names":[],"mappings":"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"}
|
package/dist/NewItemModal.js
CHANGED
|
@@ -11,6 +11,7 @@ import { Modal, ModalBody, ModalFooter, ModalHeader, BasicModal, Button } from '
|
|
|
11
11
|
import { Pending, PromiseUtils, ValidationError } from '@deephaven/utils';
|
|
12
12
|
import Log from '@deephaven/log';
|
|
13
13
|
import { vsHome } from '@deephaven/icons';
|
|
14
|
+
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
14
15
|
import FileExplorer from "./FileExplorer.js";
|
|
15
16
|
import FileUtils from "./FileUtils.js";
|
|
16
17
|
import "./NewItemModal.css";
|
|
@@ -399,8 +400,12 @@ class NewItemModal extends PureComponent {
|
|
|
399
400
|
kind: "ghost",
|
|
400
401
|
className: "directory-breadcrumbs",
|
|
401
402
|
onClick: () => this.handleBreadcrumbSelect(directoryPath),
|
|
402
|
-
"aria-label": index === 0 ? '
|
|
403
|
-
icon: index === 0 ?
|
|
403
|
+
"aria-label": index === 0 ? 'Home' : undefined,
|
|
404
|
+
icon: index === 0 ? /*#__PURE__*/React.createElement(FontAwesomeIcon, {
|
|
405
|
+
icon: vsHome,
|
|
406
|
+
transform: "right-1.6"
|
|
407
|
+
}) : undefined,
|
|
408
|
+
tooltip: index === 0 ? 'Home' : undefined
|
|
404
409
|
}, basename), "/");
|
|
405
410
|
});
|
|
406
411
|
}
|
|
@@ -467,15 +472,13 @@ class NewItemModal extends PureComponent {
|
|
|
467
472
|
onSelect: this.handleSelect,
|
|
468
473
|
storage: storage,
|
|
469
474
|
focusedPath: path
|
|
470
|
-
}))))), /*#__PURE__*/React.createElement(ModalFooter, null, /*#__PURE__*/React.createElement(
|
|
471
|
-
|
|
472
|
-
onClick: onCancel
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
className: "btn btn-primary",
|
|
475
|
+
}))))), /*#__PURE__*/React.createElement(ModalFooter, null, /*#__PURE__*/React.createElement(Button, {
|
|
476
|
+
kind: "secondary",
|
|
477
|
+
onClick: onCancel
|
|
478
|
+
}, "Cancel"), /*#__PURE__*/React.createElement(Button, {
|
|
479
|
+
kind: "primary",
|
|
476
480
|
disabled: isSubmitting,
|
|
477
|
-
onClick: this.handleModalSubmit
|
|
478
|
-
type: "button"
|
|
481
|
+
onClick: this.handleModalSubmit
|
|
479
482
|
}, submitBtnLabel))), /*#__PURE__*/React.createElement(BasicModal, {
|
|
480
483
|
isOpen: showOverwriteModal,
|
|
481
484
|
headerText: "Confirm overwrite",
|
package/dist/NewItemModal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NewItemModal.js","names":["React","PureComponent","PropTypes","classNames","Modal","ModalBody","ModalFooter","ModalHeader","BasicModal","Button","Pending","PromiseUtils","ValidationError","Log","vsHome","FileExplorer","FileUtils","FileExistsError","FileNotFoundError","log","module","NewItemModal","getValidationMessage","err","info","type","handleError","isCanceled","error","constructor","props","createRef","Map","handleModalSubmit","bind","handleModalOpened","handleSelect","handleChange","handleKeyDown","handleValidationError","handleOverwriteCancel","handleOverwriteConfirm","handleExtensionChangeCancel","handleExtensionChangeConfirm","handleBreadcrumbSelect","defaultValue","path","hasPath","getPath","state","isSubmitting","prevExtension","getExtension","showExtensionChangeModal","showOverwriteModal","value","getBaseName","componentDidUpdate","prevProps","prevState","isOpen","prevIsOpen","resetValue","isInitialLoad","updateValidationStatus","componentWillUnmount","pending","cancel","cancelableValidatePromise","cancelableExistingItemPromise","setState","validationError","undefined","getValidationPromise","name","checkExisting","makeCancelable","validateName","storage","existingFile","e","newName","then","catch","focusRenameInput","submitModal","event","target","item","debug","makePath","filename","basename","key","stopPropagation","preventDefault","onCancel","onSubmit","newValue","replaceExtension","input","inputRef","current","selectionEnd","length","lastIndexOf","focus","setSelectionRange","skipExtensionCheck","notifyOnExtensionChange","newExtension","newItemName","directoryPath","renderPathButtons","pathAsList","split","pop","map","index","i","render","placeholder","title","isDirectory","prevExtensionText","fileExtensionToString","newExtensionText","submitBtnLabel","nameInputLabel","bool","string","isRequired","oneOf","func","shape"],"sources":["../src/NewItemModal.tsx"],"sourcesContent":["import React, { ChangeEvent, KeyboardEvent, PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport {\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader,\n BasicModal,\n Button,\n} from '@deephaven/components';\nimport {\n CancelablePromise,\n Pending,\n PromiseUtils,\n ValidationError,\n} from '@deephaven/utils';\nimport Log from '@deephaven/log';\nimport { vsHome } from '@deephaven/icons';\nimport FileExplorer from './FileExplorer';\nimport FileStorage, { FileStorageItem, FileType } from './FileStorage';\nimport FileUtils from './FileUtils';\n\nimport './NewItemModal.scss';\nimport FileExistsError from './FileExistsError';\nimport FileNotFoundError from './FileNotFoundError';\n\nconst log = Log.module('NewItemModal');\n\nexport type NewItemModalProps = typeof NewItemModal.defaultProps & {\n isOpen: boolean;\n title: string;\n defaultValue: string;\n type: FileType;\n onSubmit: (name: string) => void;\n onCancel: () => void;\n placeholder: string;\n storage: FileStorage;\n notifyOnExtensionChange?: boolean;\n};\n\nexport type NewItemModalState = {\n path: string;\n isSubmitting: boolean;\n showExtensionChangeModal: boolean;\n showOverwriteModal: boolean;\n validationError?: ValidationError;\n value: string;\n prevExtension?: string;\n newExtension?: string;\n};\n\nclass NewItemModal extends PureComponent<NewItemModalProps, NewItemModalState> {\n static propTypes = {\n isOpen: PropTypes.bool,\n title: PropTypes.string.isRequired,\n defaultValue: PropTypes.string,\n type: PropTypes.oneOf(['file', 'directory']).isRequired,\n onSubmit: PropTypes.func,\n onCancel: PropTypes.func,\n placeholder: PropTypes.string,\n storage: PropTypes.shape({}).isRequired,\n notifyOnExtensionChange: PropTypes.bool,\n };\n\n static defaultProps = {\n isOpen: false,\n defaultValue: '/',\n notifyOnExtensionChange: false,\n placeholder: '',\n onSubmit: (name: string): void => undefined,\n onCancel: (): void => undefined,\n };\n\n static getValidationMessage(err: Error): string {\n if (err instanceof FileExistsError && err.info.type === 'directory') {\n return 'Error: Cannot overwrite existing directory';\n }\n return `${err}`;\n }\n\n static handleError(err: Error): void {\n if (!PromiseUtils.isCanceled(err)) {\n log.error(err);\n }\n }\n\n constructor(props: NewItemModalProps) {\n super(props);\n this.handleModalSubmit = this.handleModalSubmit.bind(this);\n this.handleModalOpened = this.handleModalOpened.bind(this);\n this.handleSelect = this.handleSelect.bind(this);\n this.handleChange = this.handleChange.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleValidationError = this.handleValidationError.bind(this);\n this.handleOverwriteCancel = this.handleOverwriteCancel.bind(this);\n this.handleOverwriteConfirm = this.handleOverwriteConfirm.bind(this);\n this.handleExtensionChangeCancel = this.handleExtensionChangeCancel.bind(\n this\n );\n this.handleExtensionChangeConfirm = this.handleExtensionChangeConfirm.bind(\n this\n );\n this.handleBreadcrumbSelect = this.handleBreadcrumbSelect.bind(this);\n\n const { defaultValue } = props;\n\n const path = FileUtils.hasPath(defaultValue)\n ? FileUtils.getPath(defaultValue)\n : '/';\n\n this.state = {\n isSubmitting: false,\n path,\n prevExtension: FileUtils.getExtension(defaultValue),\n showExtensionChangeModal: false,\n showOverwriteModal: false,\n value: FileUtils.getBaseName(defaultValue),\n };\n }\n\n componentDidUpdate(\n prevProps: NewItemModalProps,\n prevState: NewItemModalState\n ): void {\n const { isOpen } = this.props;\n const { isOpen: prevIsOpen } = prevProps;\n const { value, path } = this.state;\n if (!prevIsOpen && isOpen) {\n this.resetValue();\n this.isInitialLoad = true;\n }\n\n if (prevIsOpen && isOpen) {\n if (\n !this.isInitialLoad &&\n (path !== prevState.path || value !== prevState.value)\n ) {\n this.updateValidationStatus(path, value);\n }\n this.isInitialLoad = false;\n }\n }\n\n componentWillUnmount(): void {\n this.pending.cancel();\n if (this.cancelableValidatePromise) {\n this.cancelableValidatePromise.cancel();\n }\n if (this.cancelableExistingItemPromise) {\n this.cancelableExistingItemPromise.cancel();\n }\n }\n\n private inputRef = React.createRef<HTMLInputElement>();\n\n private cancelableValidatePromise?: CancelablePromise<string>;\n\n private cancelableExistingItemPromise?: CancelablePromise<FileStorageItem | null>;\n\n private pending = new Pending();\n\n private pathMap = new Map();\n\n private isInitialLoad = true;\n\n resetValue(): void {\n const { defaultValue } = this.props as NewItemModalProps;\n const path = FileUtils.hasPath(defaultValue)\n ? FileUtils.getPath(defaultValue)\n : '/';\n this.setState({\n path,\n value: FileUtils.getBaseName(defaultValue),\n validationError: undefined,\n prevExtension: FileUtils.getExtension(defaultValue),\n isSubmitting: false,\n });\n }\n\n getValidationPromise(\n path: string,\n name: string,\n checkExisting = false\n ): CancelablePromise<string> {\n if (this.cancelableValidatePromise) {\n this.cancelableValidatePromise.cancel();\n }\n this.cancelableValidatePromise = PromiseUtils.makeCancelable(\n this.validateName(path, name, checkExisting)\n );\n return this.cancelableValidatePromise;\n }\n\n async validateName(\n path: string,\n name: string,\n checkExisting: boolean\n ): Promise<string> {\n FileUtils.validateName(name);\n\n const { defaultValue, storage } = this.props;\n if (checkExisting) {\n const value = `${path}${name}`;\n if (value !== defaultValue) {\n try {\n const existingFile = await storage.info(value);\n throw new FileExistsError(existingFile);\n } catch (e) {\n if (!(e instanceof FileNotFoundError)) {\n throw e;\n }\n // There is no existing file, ignore\n }\n }\n }\n\n return name;\n }\n\n updateValidationStatus(path: string, newName: string): void {\n this.getValidationPromise(path, newName)\n .then(() => {\n this.setState({ validationError: undefined });\n })\n .catch(this.handleValidationError)\n .catch(NewItemModal.handleError);\n }\n\n handleModalOpened(): void {\n this.focusRenameInput();\n }\n\n handleModalSubmit(): void {\n this.submitModal();\n }\n\n handleChange(event: ChangeEvent<HTMLInputElement>): void {\n const { value } = event.target;\n this.setState({ value });\n }\n\n handleSelect(item: FileStorageItem): void {\n log.debug('handleSelect', item);\n if (item.type === 'directory') {\n this.setState({ path: FileUtils.makePath(item.filename) });\n } else {\n // Use selected item name and folder and focus the input\n const value = item.basename;\n const path = FileUtils.getPath(item.filename);\n this.setState({ value, path }, () => {\n this.focusRenameInput();\n });\n }\n }\n\n // eslint-disable-next-line class-methods-use-this\n handleKeyDown(e: KeyboardEvent): void {\n const { key } = e;\n e.stopPropagation();\n\n switch (key) {\n case 'Enter': {\n // Prevent form submit event\n e.preventDefault();\n this.submitModal();\n break;\n }\n case 'Escape': {\n e.preventDefault();\n const { onCancel } = this.props;\n onCancel();\n break;\n }\n default:\n }\n }\n\n handleValidationError(err: Error): void {\n if (!(err instanceof ValidationError)) {\n throw err;\n }\n log.debug('Validation error', err);\n this.setState({ validationError: err });\n }\n\n handleOverwriteCancel(): void {\n this.setState({\n showOverwriteModal: false,\n isSubmitting: false,\n });\n }\n\n handleOverwriteConfirm(): void {\n this.setState({ showOverwriteModal: false });\n const { onSubmit } = this.props;\n const { path, value } = this.state;\n log.debug('handleOverwriteConfirm', path, value);\n onSubmit(`${path}${value}`);\n }\n\n handleExtensionChangeCancel(): void {\n log.debug('handleExtensionChangeCancel');\n this.setState(({ value, prevExtension }) => {\n const newValue = FileUtils.replaceExtension(value, prevExtension);\n return {\n showExtensionChangeModal: false,\n value: newValue,\n };\n });\n\n this.submitModal(true);\n }\n\n handleExtensionChangeConfirm(): void {\n log.debug('handleExtensionChangeConfirm');\n this.setState({ showExtensionChangeModal: false });\n this.submitModal(true);\n }\n\n /**\n * Focus rename input and select name part for files, select all text for folders\n */\n focusRenameInput(): void {\n const input = this.inputRef.current;\n if (input) {\n const { type } = this.props;\n const { value } = input;\n const selectionEnd =\n type === 'directory' ? value.length : value.lastIndexOf('.');\n input.focus();\n input.setSelectionRange(\n 0,\n selectionEnd > 0 ? selectionEnd : value.length\n );\n }\n }\n\n submitModal(skipExtensionCheck = false): void {\n this.setState(({ prevExtension, value, path }) => {\n const { notifyOnExtensionChange, type } = this.props;\n log.debug('submitModal', prevExtension, value);\n const newExtension = FileUtils.getExtension(value);\n if (\n notifyOnExtensionChange &&\n !skipExtensionCheck &&\n prevExtension !== null &&\n prevExtension !== newExtension\n ) {\n return {\n isSubmitting: false,\n showExtensionChangeModal: true,\n newExtension,\n };\n }\n\n this.getValidationPromise(path, value, true)\n .then((newItemName: string) => {\n const { onSubmit } = this.props;\n onSubmit(`${path}${value}`);\n })\n .catch(e => {\n // Don't allow using existing names for folders\n // For files, prompt if they want to overwrite existing file\n if (e instanceof FileExistsError) {\n if (type !== 'directory' && e.info.type !== 'directory') {\n this.setState({ showOverwriteModal: true });\n return;\n }\n }\n throw e;\n })\n .catch(e => {\n if (PromiseUtils.isCanceled(e)) {\n this.setState({ isSubmitting: false });\n }\n throw e;\n })\n .catch(this.handleValidationError)\n .catch(NewItemModal.handleError);\n\n return {\n isSubmitting: true,\n showExtensionChangeModal: false,\n newExtension: undefined,\n };\n });\n }\n\n handleBreadcrumbSelect(directoryPath: string): void {\n this.setState({ path: directoryPath });\n }\n\n renderPathButtons(path: string): React.ReactNode {\n const pathAsList = path.split('/');\n pathAsList.pop();\n return pathAsList.map((basename, index) => {\n let directoryPath = '';\n for (let i = 0; i < index; i += 1) {\n directoryPath += `${pathAsList[i]}/`;\n }\n directoryPath += `${basename}/`;\n\n return (\n <React.Fragment key={directoryPath}>\n <Button\n kind=\"ghost\"\n className=\"directory-breadcrumbs\"\n onClick={() => this.handleBreadcrumbSelect(directoryPath)}\n aria-label={index === 0 ? 'home' : undefined}\n icon={index === 0 ? vsHome : undefined}\n >\n {basename}\n </Button>\n /\n </React.Fragment>\n );\n });\n }\n\n render(): React.ReactNode {\n const { storage, isOpen, onCancel, placeholder, title, type } = this.props;\n const {\n isSubmitting,\n path,\n showExtensionChangeModal,\n showOverwriteModal,\n validationError,\n value,\n prevExtension,\n newExtension,\n } = this.state;\n\n const isDirectory = type === 'directory';\n const prevExtensionText = FileUtils.fileExtensionToString(prevExtension);\n const newExtensionText = FileUtils.fileExtensionToString(newExtension);\n const submitBtnLabel = isDirectory ? 'Create' : 'Save';\n const nameInputLabel = isDirectory ? 'New folder name' : 'Save file as';\n\n return (\n <>\n <Modal\n isOpen={isOpen}\n toggle={onCancel}\n onOpened={this.handleModalOpened}\n className=\"modal-dialog-centered new-file-modal theme-bg-dark\"\n >\n <ModalHeader toggle={onCancel}>{title}</ModalHeader>\n <ModalBody>\n <form>\n <div className=\"d-flex flex-column new-file-modal-content\">\n <div className=\"flex-grow-0 mb-4\">\n <label htmlFor=\"file-name-input\">{nameInputLabel}</label>\n <input\n id=\"file-name-input\"\n type=\"text\"\n autoComplete=\"off\"\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n spellCheck=\"false\"\n className={classNames('form-control', {\n 'is-invalid': validationError,\n })}\n value={value}\n placeholder={placeholder}\n ref={this.inputRef}\n onKeyDown={this.handleKeyDown}\n onChange={this.handleChange}\n />\n {validationError && (\n <div className=\"invalid-feedback\">\n {NewItemModal.getValidationMessage(validationError)}\n </div>\n )}\n </div>\n <div className=\"flex-grow-0\">\n <label>Directory: /</label>\n {this.renderPathButtons(path)}\n </div>\n <div className=\"flex-grow-1 file-explorer-container\">\n <FileExplorer\n onSelect={this.handleSelect}\n storage={storage}\n focusedPath={path}\n />\n </div>\n </div>\n </form>\n </ModalBody>\n\n <ModalFooter>\n <button\n className=\"btn btn-outline-primary\"\n onClick={onCancel}\n type=\"button\"\n >\n Cancel\n </button>\n <button\n className=\"btn btn-primary\"\n disabled={isSubmitting}\n onClick={this.handleModalSubmit}\n type=\"button\"\n >\n {submitBtnLabel}\n </button>\n </ModalFooter>\n </Modal>\n <BasicModal\n isOpen={showOverwriteModal}\n headerText=\"Confirm overwrite\"\n bodyText=\"File with this name already exists, are you sure you want to overwrite it?\"\n onCancel={this.handleOverwriteCancel}\n onConfirm={this.handleOverwriteConfirm}\n cancelButtonText=\"Cancel\"\n confirmButtonText=\"Overwrite\"\n />\n <BasicModal\n isOpen={showExtensionChangeModal}\n headerText=\"Confirm extension change\"\n bodyText={`Are you sure you want to change extension from \"${prevExtensionText}\" to \"${newExtensionText}\"?`}\n onCancel={this.handleExtensionChangeCancel}\n onConfirm={this.handleExtensionChangeConfirm}\n cancelButtonText={`Keep \"${prevExtensionText}\"`}\n confirmButtonText={`Use \"${newExtensionText}\"`}\n />\n </>\n );\n }\n}\n\nexport default NewItemModal;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"NewItemModal.js","names":["React","PureComponent","PropTypes","classNames","Modal","ModalBody","ModalFooter","ModalHeader","BasicModal","Button","Pending","PromiseUtils","ValidationError","Log","vsHome","FontAwesomeIcon","FileExplorer","FileUtils","FileExistsError","FileNotFoundError","log","module","NewItemModal","getValidationMessage","err","info","type","handleError","isCanceled","error","constructor","props","createRef","Map","handleModalSubmit","bind","handleModalOpened","handleSelect","handleChange","handleKeyDown","handleValidationError","handleOverwriteCancel","handleOverwriteConfirm","handleExtensionChangeCancel","handleExtensionChangeConfirm","handleBreadcrumbSelect","defaultValue","path","hasPath","getPath","state","isSubmitting","prevExtension","getExtension","showExtensionChangeModal","showOverwriteModal","value","getBaseName","componentDidUpdate","prevProps","prevState","isOpen","prevIsOpen","resetValue","isInitialLoad","updateValidationStatus","componentWillUnmount","pending","cancel","cancelableValidatePromise","cancelableExistingItemPromise","setState","validationError","undefined","getValidationPromise","name","checkExisting","makeCancelable","validateName","storage","existingFile","e","newName","then","catch","focusRenameInput","submitModal","event","target","item","debug","makePath","filename","basename","key","stopPropagation","preventDefault","onCancel","onSubmit","newValue","replaceExtension","input","inputRef","current","selectionEnd","length","lastIndexOf","focus","setSelectionRange","skipExtensionCheck","notifyOnExtensionChange","newExtension","newItemName","directoryPath","renderPathButtons","pathAsList","split","pop","map","index","i","render","placeholder","title","isDirectory","prevExtensionText","fileExtensionToString","newExtensionText","submitBtnLabel","nameInputLabel","bool","string","isRequired","oneOf","func","shape"],"sources":["../src/NewItemModal.tsx"],"sourcesContent":["import React, { ChangeEvent, KeyboardEvent, PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport {\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader,\n BasicModal,\n Button,\n} from '@deephaven/components';\nimport {\n CancelablePromise,\n Pending,\n PromiseUtils,\n ValidationError,\n} from '@deephaven/utils';\nimport Log from '@deephaven/log';\nimport { vsHome } from '@deephaven/icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport FileExplorer from './FileExplorer';\nimport FileStorage, { FileStorageItem, FileType } from './FileStorage';\nimport FileUtils from './FileUtils';\n\nimport './NewItemModal.scss';\nimport FileExistsError from './FileExistsError';\nimport FileNotFoundError from './FileNotFoundError';\n\nconst log = Log.module('NewItemModal');\n\nexport type NewItemModalProps = typeof NewItemModal.defaultProps & {\n isOpen: boolean;\n title: string;\n defaultValue: string;\n type: FileType;\n onSubmit: (name: string) => void;\n onCancel: () => void;\n placeholder: string;\n storage: FileStorage;\n notifyOnExtensionChange?: boolean;\n};\n\nexport type NewItemModalState = {\n path: string;\n isSubmitting: boolean;\n showExtensionChangeModal: boolean;\n showOverwriteModal: boolean;\n validationError?: ValidationError;\n value: string;\n prevExtension?: string;\n newExtension?: string;\n};\n\nclass NewItemModal extends PureComponent<NewItemModalProps, NewItemModalState> {\n static propTypes = {\n isOpen: PropTypes.bool,\n title: PropTypes.string.isRequired,\n defaultValue: PropTypes.string,\n type: PropTypes.oneOf(['file', 'directory']).isRequired,\n onSubmit: PropTypes.func,\n onCancel: PropTypes.func,\n placeholder: PropTypes.string,\n storage: PropTypes.shape({}).isRequired,\n notifyOnExtensionChange: PropTypes.bool,\n };\n\n static defaultProps = {\n isOpen: false,\n defaultValue: '/',\n notifyOnExtensionChange: false,\n placeholder: '',\n onSubmit: (name: string): void => undefined,\n onCancel: (): void => undefined,\n };\n\n static getValidationMessage(err: Error): string {\n if (err instanceof FileExistsError && err.info.type === 'directory') {\n return 'Error: Cannot overwrite existing directory';\n }\n return `${err}`;\n }\n\n static handleError(err: Error): void {\n if (!PromiseUtils.isCanceled(err)) {\n log.error(err);\n }\n }\n\n constructor(props: NewItemModalProps) {\n super(props);\n this.handleModalSubmit = this.handleModalSubmit.bind(this);\n this.handleModalOpened = this.handleModalOpened.bind(this);\n this.handleSelect = this.handleSelect.bind(this);\n this.handleChange = this.handleChange.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleValidationError = this.handleValidationError.bind(this);\n this.handleOverwriteCancel = this.handleOverwriteCancel.bind(this);\n this.handleOverwriteConfirm = this.handleOverwriteConfirm.bind(this);\n this.handleExtensionChangeCancel = this.handleExtensionChangeCancel.bind(\n this\n );\n this.handleExtensionChangeConfirm = this.handleExtensionChangeConfirm.bind(\n this\n );\n this.handleBreadcrumbSelect = this.handleBreadcrumbSelect.bind(this);\n\n const { defaultValue } = props;\n\n const path = FileUtils.hasPath(defaultValue)\n ? FileUtils.getPath(defaultValue)\n : '/';\n\n this.state = {\n isSubmitting: false,\n path,\n prevExtension: FileUtils.getExtension(defaultValue),\n showExtensionChangeModal: false,\n showOverwriteModal: false,\n value: FileUtils.getBaseName(defaultValue),\n };\n }\n\n componentDidUpdate(\n prevProps: NewItemModalProps,\n prevState: NewItemModalState\n ): void {\n const { isOpen } = this.props;\n const { isOpen: prevIsOpen } = prevProps;\n const { value, path } = this.state;\n if (!prevIsOpen && isOpen) {\n this.resetValue();\n this.isInitialLoad = true;\n }\n\n if (prevIsOpen && isOpen) {\n if (\n !this.isInitialLoad &&\n (path !== prevState.path || value !== prevState.value)\n ) {\n this.updateValidationStatus(path, value);\n }\n this.isInitialLoad = false;\n }\n }\n\n componentWillUnmount(): void {\n this.pending.cancel();\n if (this.cancelableValidatePromise) {\n this.cancelableValidatePromise.cancel();\n }\n if (this.cancelableExistingItemPromise) {\n this.cancelableExistingItemPromise.cancel();\n }\n }\n\n private inputRef = React.createRef<HTMLInputElement>();\n\n private cancelableValidatePromise?: CancelablePromise<string>;\n\n private cancelableExistingItemPromise?: CancelablePromise<FileStorageItem | null>;\n\n private pending = new Pending();\n\n private pathMap = new Map();\n\n private isInitialLoad = true;\n\n resetValue(): void {\n const { defaultValue } = this.props as NewItemModalProps;\n const path = FileUtils.hasPath(defaultValue)\n ? FileUtils.getPath(defaultValue)\n : '/';\n this.setState({\n path,\n value: FileUtils.getBaseName(defaultValue),\n validationError: undefined,\n prevExtension: FileUtils.getExtension(defaultValue),\n isSubmitting: false,\n });\n }\n\n getValidationPromise(\n path: string,\n name: string,\n checkExisting = false\n ): CancelablePromise<string> {\n if (this.cancelableValidatePromise) {\n this.cancelableValidatePromise.cancel();\n }\n this.cancelableValidatePromise = PromiseUtils.makeCancelable(\n this.validateName(path, name, checkExisting)\n );\n return this.cancelableValidatePromise;\n }\n\n async validateName(\n path: string,\n name: string,\n checkExisting: boolean\n ): Promise<string> {\n FileUtils.validateName(name);\n\n const { defaultValue, storage } = this.props;\n if (checkExisting) {\n const value = `${path}${name}`;\n if (value !== defaultValue) {\n try {\n const existingFile = await storage.info(value);\n throw new FileExistsError(existingFile);\n } catch (e) {\n if (!(e instanceof FileNotFoundError)) {\n throw e;\n }\n // There is no existing file, ignore\n }\n }\n }\n\n return name;\n }\n\n updateValidationStatus(path: string, newName: string): void {\n this.getValidationPromise(path, newName)\n .then(() => {\n this.setState({ validationError: undefined });\n })\n .catch(this.handleValidationError)\n .catch(NewItemModal.handleError);\n }\n\n handleModalOpened(): void {\n this.focusRenameInput();\n }\n\n handleModalSubmit(): void {\n this.submitModal();\n }\n\n handleChange(event: ChangeEvent<HTMLInputElement>): void {\n const { value } = event.target;\n this.setState({ value });\n }\n\n handleSelect(item: FileStorageItem): void {\n log.debug('handleSelect', item);\n if (item.type === 'directory') {\n this.setState({ path: FileUtils.makePath(item.filename) });\n } else {\n // Use selected item name and folder and focus the input\n const value = item.basename;\n const path = FileUtils.getPath(item.filename);\n this.setState({ value, path }, () => {\n this.focusRenameInput();\n });\n }\n }\n\n // eslint-disable-next-line class-methods-use-this\n handleKeyDown(e: KeyboardEvent): void {\n const { key } = e;\n e.stopPropagation();\n\n switch (key) {\n case 'Enter': {\n // Prevent form submit event\n e.preventDefault();\n this.submitModal();\n break;\n }\n case 'Escape': {\n e.preventDefault();\n const { onCancel } = this.props;\n onCancel();\n break;\n }\n default:\n }\n }\n\n handleValidationError(err: Error): void {\n if (!(err instanceof ValidationError)) {\n throw err;\n }\n log.debug('Validation error', err);\n this.setState({ validationError: err });\n }\n\n handleOverwriteCancel(): void {\n this.setState({\n showOverwriteModal: false,\n isSubmitting: false,\n });\n }\n\n handleOverwriteConfirm(): void {\n this.setState({ showOverwriteModal: false });\n const { onSubmit } = this.props;\n const { path, value } = this.state;\n log.debug('handleOverwriteConfirm', path, value);\n onSubmit(`${path}${value}`);\n }\n\n handleExtensionChangeCancel(): void {\n log.debug('handleExtensionChangeCancel');\n this.setState(({ value, prevExtension }) => {\n const newValue = FileUtils.replaceExtension(value, prevExtension);\n return {\n showExtensionChangeModal: false,\n value: newValue,\n };\n });\n\n this.submitModal(true);\n }\n\n handleExtensionChangeConfirm(): void {\n log.debug('handleExtensionChangeConfirm');\n this.setState({ showExtensionChangeModal: false });\n this.submitModal(true);\n }\n\n /**\n * Focus rename input and select name part for files, select all text for folders\n */\n focusRenameInput(): void {\n const input = this.inputRef.current;\n if (input) {\n const { type } = this.props;\n const { value } = input;\n const selectionEnd =\n type === 'directory' ? value.length : value.lastIndexOf('.');\n input.focus();\n input.setSelectionRange(\n 0,\n selectionEnd > 0 ? selectionEnd : value.length\n );\n }\n }\n\n submitModal(skipExtensionCheck = false): void {\n this.setState(({ prevExtension, value, path }) => {\n const { notifyOnExtensionChange, type } = this.props;\n log.debug('submitModal', prevExtension, value);\n const newExtension = FileUtils.getExtension(value);\n if (\n notifyOnExtensionChange &&\n !skipExtensionCheck &&\n prevExtension !== null &&\n prevExtension !== newExtension\n ) {\n return {\n isSubmitting: false,\n showExtensionChangeModal: true,\n newExtension,\n };\n }\n\n this.getValidationPromise(path, value, true)\n .then((newItemName: string) => {\n const { onSubmit } = this.props;\n onSubmit(`${path}${value}`);\n })\n .catch(e => {\n // Don't allow using existing names for folders\n // For files, prompt if they want to overwrite existing file\n if (e instanceof FileExistsError) {\n if (type !== 'directory' && e.info.type !== 'directory') {\n this.setState({ showOverwriteModal: true });\n return;\n }\n }\n throw e;\n })\n .catch(e => {\n if (PromiseUtils.isCanceled(e)) {\n this.setState({ isSubmitting: false });\n }\n throw e;\n })\n .catch(this.handleValidationError)\n .catch(NewItemModal.handleError);\n\n return {\n isSubmitting: true,\n showExtensionChangeModal: false,\n newExtension: undefined,\n };\n });\n }\n\n handleBreadcrumbSelect(directoryPath: string): void {\n this.setState({ path: directoryPath });\n }\n\n renderPathButtons(path: string): React.ReactNode {\n const pathAsList = path.split('/');\n pathAsList.pop();\n return pathAsList.map((basename, index) => {\n let directoryPath = '';\n for (let i = 0; i < index; i += 1) {\n directoryPath += `${pathAsList[i]}/`;\n }\n directoryPath += `${basename}/`;\n\n return (\n <React.Fragment key={directoryPath}>\n <Button\n kind=\"ghost\"\n className=\"directory-breadcrumbs\"\n onClick={() => this.handleBreadcrumbSelect(directoryPath)}\n aria-label={index === 0 ? 'Home' : undefined}\n icon={\n index === 0 ? (\n <FontAwesomeIcon icon={vsHome} transform=\"right-1.6\" />\n ) : undefined\n }\n tooltip={index === 0 ? 'Home' : undefined}\n >\n {basename}\n </Button>\n /\n </React.Fragment>\n );\n });\n }\n\n render(): React.ReactNode {\n const { storage, isOpen, onCancel, placeholder, title, type } = this.props;\n const {\n isSubmitting,\n path,\n showExtensionChangeModal,\n showOverwriteModal,\n validationError,\n value,\n prevExtension,\n newExtension,\n } = this.state;\n\n const isDirectory = type === 'directory';\n const prevExtensionText = FileUtils.fileExtensionToString(prevExtension);\n const newExtensionText = FileUtils.fileExtensionToString(newExtension);\n const submitBtnLabel = isDirectory ? 'Create' : 'Save';\n const nameInputLabel = isDirectory ? 'New folder name' : 'Save file as';\n\n return (\n <>\n <Modal\n isOpen={isOpen}\n toggle={onCancel}\n onOpened={this.handleModalOpened}\n className=\"modal-dialog-centered new-file-modal theme-bg-dark\"\n >\n <ModalHeader toggle={onCancel}>{title}</ModalHeader>\n <ModalBody>\n <form>\n <div className=\"d-flex flex-column new-file-modal-content\">\n <div className=\"flex-grow-0 mb-4\">\n <label htmlFor=\"file-name-input\">{nameInputLabel}</label>\n <input\n id=\"file-name-input\"\n type=\"text\"\n autoComplete=\"off\"\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n spellCheck=\"false\"\n className={classNames('form-control', {\n 'is-invalid': validationError,\n })}\n value={value}\n placeholder={placeholder}\n ref={this.inputRef}\n onKeyDown={this.handleKeyDown}\n onChange={this.handleChange}\n />\n {validationError && (\n <div className=\"invalid-feedback\">\n {NewItemModal.getValidationMessage(validationError)}\n </div>\n )}\n </div>\n <div className=\"flex-grow-0\">\n <label>Directory: /</label>\n {this.renderPathButtons(path)}\n </div>\n <div className=\"flex-grow-1 file-explorer-container\">\n <FileExplorer\n onSelect={this.handleSelect}\n storage={storage}\n focusedPath={path}\n />\n </div>\n </div>\n </form>\n </ModalBody>\n\n <ModalFooter>\n <Button kind=\"secondary\" onClick={onCancel}>\n Cancel\n </Button>\n <Button\n kind=\"primary\"\n disabled={isSubmitting}\n onClick={this.handleModalSubmit}\n >\n {submitBtnLabel}\n </Button>\n </ModalFooter>\n </Modal>\n <BasicModal\n isOpen={showOverwriteModal}\n headerText=\"Confirm overwrite\"\n bodyText=\"File with this name already exists, are you sure you want to overwrite it?\"\n onCancel={this.handleOverwriteCancel}\n onConfirm={this.handleOverwriteConfirm}\n cancelButtonText=\"Cancel\"\n confirmButtonText=\"Overwrite\"\n />\n <BasicModal\n isOpen={showExtensionChangeModal}\n headerText=\"Confirm extension change\"\n bodyText={`Are you sure you want to change extension from \"${prevExtensionText}\" to \"${newExtensionText}\"?`}\n onCancel={this.handleExtensionChangeCancel}\n onConfirm={this.handleExtensionChangeConfirm}\n cancelButtonText={`Keep \"${prevExtensionText}\"`}\n confirmButtonText={`Use \"${newExtensionText}\"`}\n />\n </>\n );\n }\n}\n\nexport default NewItemModal;\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deephaven/file-explorer",
|
|
3
|
-
"version": "0.19.
|
|
3
|
+
"version": "0.19.2-beta.10+75204ed",
|
|
4
4
|
"description": "Deephaven File Explorer React component",
|
|
5
5
|
"author": "Deephaven Data Labs LLC",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -30,11 +30,11 @@
|
|
|
30
30
|
"start": "cross-env NODE_ENV=development npm run watch"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@deephaven/components": "^0.19.
|
|
34
|
-
"@deephaven/icons": "^0.19.
|
|
35
|
-
"@deephaven/log": "^0.19.
|
|
36
|
-
"@deephaven/storage": "^0.19.
|
|
37
|
-
"@deephaven/utils": "^0.19.
|
|
33
|
+
"@deephaven/components": "^0.19.2-beta.10+75204ed",
|
|
34
|
+
"@deephaven/icons": "^0.19.2-beta.10+75204ed",
|
|
35
|
+
"@deephaven/log": "^0.19.2-beta.10+75204ed",
|
|
36
|
+
"@deephaven/storage": "^0.19.2-beta.10+75204ed",
|
|
37
|
+
"@deephaven/utils": "^0.19.2-beta.10+75204ed",
|
|
38
38
|
"@fortawesome/fontawesome-svg-core": "^6.1.1",
|
|
39
39
|
"@fortawesome/react-fontawesome": "^0.1.18",
|
|
40
40
|
"classnames": "^2.3.1",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"react": "^17.0.0"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"@deephaven/tsconfig": "^0.19.
|
|
48
|
+
"@deephaven/tsconfig": "^0.19.2-beta.10+75204ed"
|
|
49
49
|
},
|
|
50
50
|
"files": [
|
|
51
51
|
"dist"
|
|
@@ -53,5 +53,5 @@
|
|
|
53
53
|
"publishConfig": {
|
|
54
54
|
"access": "public"
|
|
55
55
|
},
|
|
56
|
-
"gitHead": "
|
|
56
|
+
"gitHead": "75204eda3d72f91ad80215af6177927ae1bea1ac"
|
|
57
57
|
}
|