@deephaven/file-explorer 0.11.2-js-plugins.1 → 0.11.3-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/FileList.css +5 -0
- package/dist/FileList.css.map +1 -1
- package/dist/FileList.d.ts.map +1 -1
- package/dist/FileList.js +13 -2
- package/dist/FileList.js.map +1 -1
- package/package.json +11 -16
package/dist/FileList.css
CHANGED
|
@@ -34,6 +34,11 @@
|
|
|
34
34
|
.file-list .item-list-item:focus, .file-list .item-list-item.active, .file-list .item-list-item:hover, .file-list .item-list-item.is-focused {
|
|
35
35
|
color: #f0f0ee;
|
|
36
36
|
}
|
|
37
|
+
.file-list .truncation-wrapper {
|
|
38
|
+
overflow-x: hidden;
|
|
39
|
+
text-overflow: ellipsis;
|
|
40
|
+
white-space: pre;
|
|
41
|
+
}
|
|
37
42
|
.file-list .item-icon {
|
|
38
43
|
margin-right: 0.25rem;
|
|
39
44
|
}
|
package/dist/FileList.css.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sourceRoot":"","sources":["../src/FileList.scss","../../components/scss/bootstrap_overrides.scss","../../components/scss/new_variables.scss"],"names":[],"mappings":"AAcA;EACE;EACA;EACA;EACA;EACA;
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["../src/FileList.scss","../../components/scss/bootstrap_overrides.scss","../../components/scss/new_variables.scss"],"names":[],"mappings":"AAcA;EACE;EACA;EACA;EACA;EACA;AA6EA;AA0BA;;AArGA;EACE,aAnBW;EAoBX;EACA,OApBgB;EAqBhB;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA,OCfO;EDgBP,YC2Fa;ED1Fb;EACA;;AAEA;EACE,kBApC0B;;AAuC5B;EACE,kBAxC0B;;AA2C5B;EAIE,OCxCW;;AD4Cf;EACE;EACA;EACA;;AAGF;EACE,cE9DO;;AFkEP;EACE,kBA5DiB;;AAgEnB;EACE,kBAnEkB;EAoElB,OC9DW;ED+DX,mBApE6B;EAqE7B,oBArE6B;;AAyEjC;EACE;;AAGE;EACE;;AAIJ;AAAA;EAEE,OC/EW;;ADqFb;EAEE,kBCxFU;EDyFV,OCxFW;EDyFX;;AAKJ;EAEE;;AAKF;EACE;;AAIF;EACE;;;AAKJ;EACE;EACA;EACA;;AAEA;EACE;EACA,YC5EW;ED6EX,OCxHa;EDyHb,eCbY","file":"FileList.css"}
|
package/dist/FileList.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileList.d.ts","sourceRoot":"","sources":["../src/FileList.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"FileList.d.ts","sourceRoot":"","sources":["../src/FileList.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,eAAe,EAEhB,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAEnE,OAAO,KAMN,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAe,MAAM,eAAe,CAAC;AAC/E,OAAO,iBAAiB,CAAC;AAKzB,oBAAY,cAAc,GAAG;IAC3B,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,oBAAY,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,oBAAY,uBAAuB,GAAG,eAAe,CAAC,eAAe,CAAC,GAAG;IACvE,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;IACjC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAE3B,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IACrE,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IACpE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IACnE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;CACjE,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,gBAAgB,CAAC;IAExB,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,aAAa,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;IACxD,MAAM,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,cAAc,KAAK,IAAI,CAAC;IACvE,iBAAiB,CAAC,EAAE,CAAC,aAAa,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;IAE/D,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,GAAG,CAAC,OAAO,CAAC;IAE7D,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,eAAe,SAAU,eAAe,KAAG,MAGlB,CAAC;AAEvC,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAGrC,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAItC,eAAO,MAAM,kBAAkB,UACtB,uBAAuB,KAC7B,WA4EF,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,cAAc,CAWjE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,eAAe,EAAE,EAC/B,UAAU,EAAE,eAAe,GAC1B;IAAE,KAAK,EAAE,eAAe,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAyBlD;AAED;;GAEG;AACH,eAAO,MAAM,QAAQ,UAAW,aAAa,KAAG,WAgX/C,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|
package/dist/FileList.js
CHANGED
|
@@ -4,7 +4,7 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
|
|
|
4
4
|
|
|
5
5
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
6
6
|
|
|
7
|
-
import { ItemList } from '@deephaven/components';
|
|
7
|
+
import { ItemList, Tooltip } from '@deephaven/components';
|
|
8
8
|
import { dhPython, vsCode, vsFolder, vsFolderOpened } from '@deephaven/icons';
|
|
9
9
|
import Log from '@deephaven/log';
|
|
10
10
|
import { RangeUtils } from '@deephaven/utils';
|
|
@@ -110,7 +110,18 @@ export var renderFileListItem = props => {
|
|
|
110
110
|
icon: icon,
|
|
111
111
|
className: "item-icon",
|
|
112
112
|
fixedWidth: true
|
|
113
|
-
}), ' ',
|
|
113
|
+
}), ' ', /*#__PURE__*/React.createElement("span", {
|
|
114
|
+
className: "truncation-wrapper"
|
|
115
|
+
}, children !== null && children !== void 0 ? children : item.basename, /*#__PURE__*/React.createElement(Tooltip, {
|
|
116
|
+
options: {
|
|
117
|
+
modifiers: {
|
|
118
|
+
preventOverflow: {
|
|
119
|
+
boundariesElement: 'window'
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
placement: 'left'
|
|
123
|
+
}
|
|
124
|
+
}, children !== null && children !== void 0 ? children : item.basename)));
|
|
114
125
|
};
|
|
115
126
|
/**
|
|
116
127
|
* Get the icon definition for a file or folder item
|
package/dist/FileList.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/FileList.tsx"],"names":["ItemList","dhPython","vsCode","vsFolder","vsFolderOpened","Log","RangeUtils","FontAwesomeIcon","classNames","React","useCallback","useEffect","useMemo","useRef","useState","isDirectory","FileUtils","MIME_TYPE","log","module","getPathFromItem","file","makePath","filename","getPath","DEFAULT_ROW_HEIGHT","DRAG_HOVER_TIMEOUT","ITEM_LIST_CLASS_NAME","renderFileListItem","props","children","draggedItems","isDragInProgress","isDropTargetValid","isSelected","item","itemIndex","dropTargetItem","onDragStart","onDragOver","onDragEnd","onDrop","isDragged","some","draggedItem","id","itemPath","dropTargetPath","isExactDropTarget","isInDropTarget","isInvalidDropTarget","icon","getItemIcon","depth","getDepth","depthLines","Array","fill","map","value","index","e","basename","isExpanded","mimeType","getMimeType","PYTHON","getMoveOperation","targetItem","length","Error","targetPath","startsWith","files","FileList","isMultiSelect","table","onFocusChange","undefined","onMove","onSelect","onSelectionChange","renderItem","rowHeight","overscanCount","DEFAULT_OVERSCAN","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","Math","max","listenerRemover","onUpdate","newViewport","itemName","size","timeout","setTimeout","clearTimeout","renderWrapper","itemProps","onDragExit"],"mappings":"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","sourcesContent":["import { ItemList, Range, RenderItemProps } from '@deephaven/components';\nimport { dhPython, vsCode, vsFolder, vsFolderOpened } from '@deephaven/icons';\nimport Log from '@deephaven/log';\nimport { RangeUtils } from '@deephaven/utils';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport classNames from 'classnames';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { FileStorageItem, FileStorageTable, isDirectory } from './FileStorage';\nimport './FileList.scss';\nimport FileUtils, { MIME_TYPE } from './FileUtils';\n\nconst log = Log.module('FileList');\n\nexport type LoadedViewport = {\n items: FileStorageItem[];\n offset: number;\n itemCount: number;\n};\n\nexport type ListViewport = {\n top: number;\n bottom: number;\n};\n\nexport type FileListRenderItemProps = RenderItemProps<FileStorageItem> & {\n children?: JSX.Element;\n dropTargetItem?: FileStorageItem;\n draggedItems?: FileStorageItem[];\n isDragInProgress: boolean;\n isDropTargetValid: boolean;\n\n onDragStart(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragOver(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragEnd(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDrop(index: number, e: React.DragEvent<HTMLDivElement>): void;\n};\n\nexport interface FileListProps {\n table: FileStorageTable;\n\n isMultiSelect?: boolean;\n\n onFocusChange?: (focusedItem?: FileStorageItem) => void;\n onMove: (files: FileStorageItem[], path: string) => void;\n onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => void;\n onSelectionChange?: (selectedItems: FileStorageItem[]) => void;\n\n renderItem?: (props: FileListRenderItemProps) => JSX.Element;\n\n /** Height of each item in the list */\n rowHeight?: number;\n\n overscanCount?: number;\n}\n\nexport const getPathFromItem = (file: FileStorageItem): string =>\n isDirectory(file)\n ? FileUtils.makePath(file.filename)\n : FileUtils.getPath(file.filename);\n\nexport const DEFAULT_ROW_HEIGHT = 26;\n\n// How long you need to hover over a directory before it expands\nexport const DRAG_HOVER_TIMEOUT = 500;\n\nconst ITEM_LIST_CLASS_NAME = 'item-list-scroll-pane';\n\nexport const renderFileListItem = (\n props: FileListRenderItemProps\n): JSX.Element => {\n const {\n children,\n draggedItems,\n isDragInProgress,\n isDropTargetValid,\n isSelected,\n item,\n itemIndex,\n dropTargetItem,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n } = props;\n\n const isDragged =\n draggedItems?.some(draggedItem => draggedItem.id === item.id) ?? false;\n const itemPath = getPathFromItem(item);\n const dropTargetPath =\n isDragInProgress && dropTargetItem ? getPathFromItem(dropTargetItem) : null;\n\n const isExactDropTarget =\n isDragInProgress &&\n isDropTargetValid &&\n isDirectory(item) &&\n dropTargetPath === itemPath;\n const isInDropTarget =\n isDragInProgress && isDropTargetValid && dropTargetPath === itemPath;\n const isInvalidDropTarget =\n isDragInProgress && !isDropTargetValid && dropTargetPath === itemPath;\n\n const icon = getItemIcon(item);\n const depth = FileUtils.getDepth(item.filename);\n const depthLines = Array(depth)\n .fill(null)\n .map((value, index) => (\n // eslint-disable-next-line react/no-array-index-key\n <span className=\"file-list-depth-line\" key={index} />\n ));\n\n return (\n <div\n className={classNames(\n 'd-flex w-100 align-items-center',\n 'file-list-item',\n {\n 'is-dragged': isDragged,\n 'is-exact-drop-target': isExactDropTarget,\n 'is-in-drop-target': isInDropTarget,\n 'is-invalid-drop-target': isInvalidDropTarget,\n 'is-selected': isSelected,\n }\n )}\n onDragStart={e => onDragStart(itemIndex, e)}\n onDragOver={e => onDragOver(itemIndex, e)}\n onDragEnd={e => onDragEnd(itemIndex, e)}\n onDrop={e => onDrop(itemIndex, e)}\n draggable\n role=\"presentation\"\n >\n {depthLines}{' '}\n <FontAwesomeIcon icon={icon} className=\"item-icon\" fixedWidth />{' '}\n {children ?? item.basename}\n </div>\n );\n};\n\n/**\n * Get the icon definition for a file or folder item\n * @param {FileStorageItem} item Item to get the icon for\n * @returns {IconDefinition} Icon definition to pass in the FontAwesomeIcon icon prop\n */\nexport function getItemIcon(item: FileStorageItem): IconDefinition {\n if (isDirectory(item)) {\n return item.isExpanded ? vsFolderOpened : vsFolder;\n }\n const mimeType = FileUtils.getMimeType(item.basename);\n switch (mimeType) {\n case MIME_TYPE.PYTHON:\n return dhPython;\n default:\n return vsCode;\n }\n}\n\n/**\n * Get the move operation for the current selection and the given target. Throws if the operation is invalid.\n */\nexport function getMoveOperation(\n draggedItems: FileStorageItem[],\n targetItem: FileStorageItem\n): { files: FileStorageItem[]; targetPath: string } {\n if (draggedItems.length === 0 || !targetItem) {\n throw new Error('No items to move');\n }\n\n const targetPath = getPathFromItem(targetItem);\n if (\n draggedItems.some(\n ({ filename }) => FileUtils.getPath(filename) === targetPath\n )\n ) {\n // Cannot drop if target is one of the dragged items is already in the target folder\n throw new Error('File already in the destination folder');\n }\n if (\n draggedItems.some(\n item =>\n isDirectory(item) &&\n targetPath.startsWith(FileUtils.makePath(item.filename))\n )\n ) {\n // Cannot drop if target is a child of one of the directories being moved\n throw new Error('Destination folder cannot be a child of a dragged folder');\n }\n return { files: draggedItems, targetPath };\n}\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorageTable.\n */\nexport const FileList = (props: FileListProps): JSX.Element => {\n const {\n isMultiSelect = false,\n table,\n onFocusChange = () => undefined,\n onMove,\n onSelect,\n onSelectionChange = () => undefined,\n renderItem = renderFileListItem,\n rowHeight = DEFAULT_ROW_HEIGHT,\n overscanCount = ItemList.DEFAULT_OVERSCAN,\n } = props;\n const [loadedViewport, setLoadedViewport] = useState<LoadedViewport>(() => ({\n items: [],\n offset: 0,\n itemCount: 0,\n }));\n const [viewport, setViewport] = useState<ListViewport>({\n top: 0,\n bottom: 0,\n });\n\n const [dropTargetItem, setDropTargetItem] = useState<FileStorageItem>();\n const [draggedItems, setDraggedItems] = useState<FileStorageItem[]>();\n const [dragPlaceholder, setDragPlaceholder] = useState<HTMLDivElement>();\n const [selectedRanges, setSelectedRanges] = useState([] as Range[]);\n const itemList = useRef<ItemList<FileStorageItem>>(null);\n const fileList = useRef<HTMLDivElement>(null);\n\n const getItems = useCallback(\n (ranges: Range[]): FileStorageItem[] => {\n if (ranges.length === 0 || !loadedViewport) {\n return [];\n }\n\n const items = [] as FileStorageItem[];\n for (let i = 0; i < ranges.length; i += 1) {\n const range = ranges[i];\n for (let j = range[0]; j <= range[1]; j += 1) {\n if (\n j >= loadedViewport.offset &&\n j < loadedViewport.offset + loadedViewport.items.length\n ) {\n items.push(loadedViewport.items[j - loadedViewport.offset]);\n }\n }\n }\n return items;\n },\n [loadedViewport]\n );\n\n const getItem = useCallback(\n (itemIndex: number): FileStorageItem | undefined => {\n const items = getItems([[itemIndex, itemIndex]]);\n if (items.length > 0) {\n return items[0];\n }\n },\n [getItems]\n );\n\n /**\n * Get the placeholder text to show when a drag operation is in progress\n */\n const getDragPlaceholderText = useCallback(() => {\n const count = RangeUtils.count(selectedRanges);\n if (count === 0) {\n return null;\n }\n\n if (count === 1) {\n const index = selectedRanges[0][0];\n const item = getItem(index);\n if (item != null) {\n return item.filename;\n }\n }\n return `${count} items`;\n }, [getItem, selectedRanges]);\n\n /**\n * Drop the currently dragged items at the currently set drop target.\n * If an itemIndex is provided, focus that index after the drop.\n */\n const dropItems = useCallback(\n (itemIndex?: number) => {\n if (!draggedItems || !dropTargetItem) {\n return;\n }\n\n log.debug('dropItems', draggedItems, 'to', itemIndex);\n\n try {\n const { files, targetPath } = getMoveOperation(\n draggedItems,\n dropTargetItem\n );\n onMove(files, targetPath);\n if (itemIndex != null) {\n setSelectedRanges([[itemIndex, itemIndex]]);\n itemList.current?.focusItem(itemIndex);\n }\n } catch (err) {\n log.error('Unable to complete move', err);\n }\n },\n [draggedItems, dropTargetItem, onMove]\n );\n\n const handleSelect = useCallback(\n (itemIndex: number, event: React.SyntheticEvent) => {\n const item = loadedViewport.items[itemIndex - loadedViewport.offset];\n if (item !== undefined) {\n log.debug('handleItemClick', item);\n\n onSelect(item, event);\n if (isDirectory(item)) {\n table?.setExpanded(item.filename, !item.isExpanded);\n }\n }\n },\n [loadedViewport, onSelect, table]\n );\n\n const handleItemDragStart = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n log.debug2('handleItemDragStart', itemIndex, selectedRanges);\n\n let draggedRanges = selectedRanges;\n if (!RangeUtils.isSelected(selectedRanges, itemIndex)) {\n draggedRanges = [[itemIndex, itemIndex]];\n setSelectedRanges(draggedRanges);\n }\n\n setDraggedItems(getItems(draggedRanges));\n\n // We need to reset reset the mouse state since we steal the drag\n itemList.current?.resetMouseState();\n\n const newDragPlaceholder = document.createElement('div');\n newDragPlaceholder.innerHTML = `<div class=\"dnd-placeholder-content\">${getDragPlaceholderText()}</div>`;\n newDragPlaceholder.className = 'file-list-dnd-placeholder';\n document.body.appendChild(newDragPlaceholder);\n e.dataTransfer.setDragImage(newDragPlaceholder, 0, 0);\n e.dataTransfer.effectAllowed = 'move';\n setDragPlaceholder(newDragPlaceholder);\n },\n [getDragPlaceholderText, getItems, selectedRanges]\n );\n\n const handleItemDragOver = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n\n log.debug2('handleItemDragOver', e);\n setDropTargetItem(getItem(itemIndex));\n },\n [getItem]\n );\n\n const handleItemDragEnd = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n log.debug('handleItemDragEnd', itemIndex);\n\n dragPlaceholder?.remove();\n\n // Drag end is triggered after drop\n // Also drop isn't triggered if drag end is outside of the list\n setDraggedItems(undefined);\n setDropTargetItem(undefined);\n setDragPlaceholder(undefined);\n },\n [dragPlaceholder]\n );\n\n const handleItemDrop = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n dropItems(itemIndex);\n },\n [dropItems]\n );\n\n const handleItemDragExit = useCallback(() => {\n log.debug2('handleItemDragExit');\n setDropTargetItem(undefined);\n }, []);\n\n const handleListDragOver = useCallback(\n (e: React.DragEvent<HTMLDivElement>) => {\n if (\n e.target instanceof Element &&\n e.target.classList.contains(ITEM_LIST_CLASS_NAME)\n ) {\n // Need to prevent default to enable drop\n // https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#droptargets\n e.preventDefault();\n\n log.debug2('handleListDragOver', e);\n setDropTargetItem({\n type: 'directory',\n filename: '/',\n basename: '/',\n id: '/',\n });\n }\n },\n []\n );\n\n const handleListDrop = useCallback(\n (e: React.DragEvent<HTMLDivElement>) => {\n if (\n e.target instanceof Element &&\n e.target.classList.contains(ITEM_LIST_CLASS_NAME)\n ) {\n log.debug('handleListDrop');\n dropItems();\n }\n },\n [dropItems]\n );\n\n const handleSelectionChange = useCallback(\n newSelectedRanges => {\n log.debug2('handleSelectionChange', newSelectedRanges);\n if (newSelectedRanges !== selectedRanges) {\n setSelectedRanges(newSelectedRanges);\n const selectedItems = getItems(newSelectedRanges);\n onSelectionChange(selectedItems);\n }\n },\n [getItems, onSelectionChange, selectedRanges]\n );\n\n const handleFocusChange = useCallback(\n focusIndex => {\n log.debug2('handleFocusChange', focusIndex);\n if (focusIndex != null) {\n const [focusedItem] = getItems([[focusIndex, focusIndex]]);\n onFocusChange(focusedItem);\n } else {\n onFocusChange();\n }\n },\n [getItems, onFocusChange]\n );\n\n const handleViewportChange = useCallback(\n (top: number, bottom: number) => {\n log.debug('handleViewportChange', top, bottom);\n if (top !== viewport.top || bottom !== viewport.bottom) {\n setViewport({ top, bottom });\n }\n },\n [viewport]\n );\n\n const isDropTargetValid = useMemo(() => {\n if (!draggedItems || !dropTargetItem) {\n return false;\n }\n\n try {\n getMoveOperation(draggedItems, dropTargetItem);\n log.debug('handleValidateDropTarget true');\n return true;\n } catch (e) {\n log.debug('handleValidateDropTarget false');\n return false;\n }\n }, [draggedItems, dropTargetItem]);\n\n useEffect(() => {\n log.debug('updating table viewport', viewport);\n table?.setViewport({\n top: Math.max(0, viewport.top - overscanCount),\n bottom: viewport.bottom + overscanCount,\n });\n }, [overscanCount, table, viewport]);\n\n // Listen for table updates\n useEffect(() => {\n const listenerRemover = table.onUpdate(newViewport => {\n setLoadedViewport({\n items: newViewport.items.map(item => ({\n ...item,\n itemName: item.basename,\n })),\n offset: newViewport.offset,\n itemCount: table.size,\n });\n });\n return () => {\n listenerRemover();\n };\n }, [table]);\n\n // Expand a folder if hovering over it\n useEffect(() => {\n if (\n dropTargetItem != null &&\n isDirectory(dropTargetItem) &&\n dropTargetItem.filename !== '/'\n ) {\n const timeout = setTimeout(() => {\n if (!dropTargetItem.isExpanded) {\n table?.setExpanded(dropTargetItem.filename, true);\n }\n }, DRAG_HOVER_TIMEOUT);\n return () => clearTimeout(timeout);\n }\n }, [dropTargetItem, table]);\n\n const renderWrapper = useCallback(\n itemProps =>\n renderItem({\n ...itemProps,\n isDragInProgress: draggedItems != null,\n dropTargetItem,\n draggedItems,\n isDropTargetValid,\n onDragStart: handleItemDragStart,\n onDragEnd: handleItemDragEnd,\n onDragOver: handleItemDragOver,\n onDragExit: handleItemDragExit,\n onDrop: handleItemDrop,\n }),\n [\n handleItemDragEnd,\n handleItemDragExit,\n handleItemDragOver,\n handleItemDragStart,\n handleItemDrop,\n draggedItems,\n dropTargetItem,\n isDropTargetValid,\n renderItem,\n ]\n );\n\n return (\n <div\n ref={fileList}\n className={classNames('file-list', {\n 'is-dragging': draggedItems != null,\n })}\n onDragOver={handleListDragOver}\n onDrop={handleListDrop}\n >\n <ItemList\n ref={itemList}\n items={loadedViewport.items}\n itemCount={loadedViewport.itemCount}\n offset={loadedViewport.offset}\n onFocusChange={handleFocusChange}\n onSelect={handleSelect}\n onSelectionChange={handleSelectionChange}\n onViewportChange={handleViewportChange}\n selectedRanges={selectedRanges}\n renderItem={renderWrapper}\n rowHeight={rowHeight}\n isMultiSelect={isMultiSelect}\n isDragSelect={false}\n isDeselectOnClick={false}\n />\n </div>\n );\n};\n\nexport default FileList;\n"],"file":"FileList.js"}
|
|
1
|
+
{"version":3,"sources":["../src/FileList.tsx"],"names":["ItemList","Tooltip","dhPython","vsCode","vsFolder","vsFolderOpened","Log","RangeUtils","FontAwesomeIcon","classNames","React","useCallback","useEffect","useMemo","useRef","useState","isDirectory","FileUtils","MIME_TYPE","log","module","getPathFromItem","file","makePath","filename","getPath","DEFAULT_ROW_HEIGHT","DRAG_HOVER_TIMEOUT","ITEM_LIST_CLASS_NAME","renderFileListItem","props","children","draggedItems","isDragInProgress","isDropTargetValid","isSelected","item","itemIndex","dropTargetItem","onDragStart","onDragOver","onDragEnd","onDrop","isDragged","some","draggedItem","id","itemPath","dropTargetPath","isExactDropTarget","isInDropTarget","isInvalidDropTarget","icon","getItemIcon","depth","getDepth","depthLines","Array","fill","map","value","index","e","basename","modifiers","preventOverflow","boundariesElement","placement","isExpanded","mimeType","getMimeType","PYTHON","getMoveOperation","targetItem","length","Error","targetPath","startsWith","files","FileList","isMultiSelect","table","onFocusChange","undefined","onMove","onSelect","onSelectionChange","renderItem","rowHeight","overscanCount","DEFAULT_OVERSCAN","loadedViewport","setLoadedViewport","items","offset","itemCount","viewport","setViewport","top","bottom","setDropTargetItem","setDraggedItems","dragPlaceholder","setDragPlaceholder","selectedRanges","setSelectedRanges","itemList","fileList","getItems","ranges","i","range","j","push","getItem","getDragPlaceholderText","count","dropItems","debug","current","focusItem","err","error","handleSelect","event","setExpanded","handleItemDragStart","debug2","draggedRanges","resetMouseState","newDragPlaceholder","document","createElement","innerHTML","className","body","appendChild","dataTransfer","setDragImage","effectAllowed","handleItemDragOver","preventDefault","handleItemDragEnd","remove","handleItemDrop","handleItemDragExit","handleListDragOver","target","Element","classList","contains","type","handleListDrop","handleSelectionChange","newSelectedRanges","selectedItems","handleFocusChange","focusIndex","focusedItem","handleViewportChange","Math","max","listenerRemover","onUpdate","newViewport","itemName","size","timeout","setTimeout","clearTimeout","renderWrapper","itemProps","onDragExit"],"mappings":";;;;;;AAAA,SACEA,QADF,EAIEC,OAJF,QAKO,uBALP;AAMA,SAASC,QAAT,EAAmBC,MAAnB,EAA2BC,QAA3B,EAAqCC,cAArC,QAA2D,kBAA3D;AACA,OAAOC,GAAP,MAAgB,gBAAhB;AACA,SAASC,UAAT,QAA2B,kBAA3B;AACA,SAASC,eAAT,QAAgC,gCAAhC;AAEA,OAAOC,UAAP,MAAuB,YAAvB;AACA,OAAOC,KAAP,IACEC,WADF,EAEEC,SAFF,EAGEC,OAHF,EAIEC,MAJF,EAKEC,QALF,QAMO,OANP;SAO4CC,W;;OAErCC,S,IAAaC,S;AAEpB,IAAMC,GAAG,GAAGb,GAAG,CAACc,MAAJ,CAAW,UAAX,CAAZ;AA4CA,OAAO,IAAMC,eAAe,GAAIC,IAAD,IAC7BN,WAAW,CAACM,IAAD,CAAX,GACIL,SAAS,CAACM,QAAV,CAAmBD,IAAI,CAACE,QAAxB,CADJ,GAEIP,SAAS,CAACQ,OAAV,CAAkBH,IAAI,CAACE,QAAvB,CAHC;AAKP,OAAO,IAAME,kBAAkB,GAAG,EAA3B,C,CAEP;;AACA,OAAO,IAAMC,kBAAkB,GAAG,GAA3B;AAEP,IAAMC,oBAAoB,GAAG,uBAA7B;AAEA,OAAO,IAAMC,kBAAkB,GAC7BC,KADgC,IAEhB;AAAA;;AAChB,MAAM;AACJC,IAAAA,QADI;AAEJC,IAAAA,YAFI;AAGJC,IAAAA,gBAHI;AAIJC,IAAAA,iBAJI;AAKJC,IAAAA,UALI;AAMJC,IAAAA,IANI;AAOJC,IAAAA,SAPI;AAQJC,IAAAA,cARI;AASJC,IAAAA,WATI;AAUJC,IAAAA,UAVI;AAWJC,IAAAA,SAXI;AAYJC,IAAAA;AAZI,MAaFZ,KAbJ;AAeA,MAAMa,SAAS,yBACbX,YADa,aACbA,YADa,uBACbA,YAAY,CAAEY,IAAd,CAAmBC,WAAW,IAAIA,WAAW,CAACC,EAAZ,KAAmBV,IAAI,CAACU,EAA1D,CADa,mEACoD,KADnE;AAEA,MAAMC,QAAQ,GAAG1B,eAAe,CAACe,IAAD,CAAhC;AACA,MAAMY,cAAc,GAClBf,gBAAgB,IAAIK,cAApB,GAAqCjB,eAAe,CAACiB,cAAD,CAApD,GAAuE,IADzE;AAGA,MAAMW,iBAAiB,GACrBhB,gBAAgB,IAChBC,iBADA,IAEAlB,WAAW,CAACoB,IAAD,CAFX,IAGAY,cAAc,KAAKD,QAJrB;AAKA,MAAMG,cAAc,GAClBjB,gBAAgB,IAAIC,iBAApB,IAAyCc,cAAc,KAAKD,QAD9D;AAEA,MAAMI,mBAAmB,GACvBlB,gBAAgB,IAAI,CAACC,iBAArB,IAA0Cc,cAAc,KAAKD,QAD/D;AAGA,MAAMK,IAAI,GAAGC,WAAW,CAACjB,IAAD,CAAxB;AACA,MAAMkB,KAAK,GAAGrC,SAAS,CAACsC,QAAV,CAAmBnB,IAAI,CAACZ,QAAxB,CAAd;AACA,MAAMgC,UAAU,GAAGC,KAAK,CAACH,KAAD,CAAL,CAChBI,IADgB,CACX,IADW,EAEhBC,GAFgB,CAEZ,CAACC,KAAD,EAAQC,KAAR;AAAA;AACH;AACA;AAAM,IAAA,SAAS,EAAC,sBAAhB;AAAuC,IAAA,GAAG,EAAEA;AAA5C,IAJe,CAAnB;AAOA,sBACE;AACE,IAAA,SAAS,EAAEpD,UAAU,CACnB,iCADmB,EAEnB,gBAFmB,EAGnB;AACE,oBAAckC,SADhB;AAEE,8BAAwBM,iBAF1B;AAGE,2BAAqBC,cAHvB;AAIE,gCAA0BC,mBAJ5B;AAKE,qBAAehB;AALjB,KAHmB,CADvB;AAYE,IAAA,WAAW;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA,MAAE2B,CAAC,IAAIvB,WAAW,CAACF,SAAD,EAAYyB,CAAZ,CAAlB,CAZb;AAaE,IAAA,UAAU;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA,MAAEA,CAAC,IAAItB,UAAU,CAACH,SAAD,EAAYyB,CAAZ,CAAjB,CAbZ;AAcE,IAAA,SAAS;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA,MAAEA,CAAC,IAAIrB,SAAS,CAACJ,SAAD,EAAYyB,CAAZ,CAAhB,CAdX;AAeE,IAAA,MAAM;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA,MAAEA,CAAC,IAAIpB,MAAM,CAACL,SAAD,EAAYyB,CAAZ,CAAb,CAfR;AAgBE,IAAA,SAAS,MAhBX;AAiBE,IAAA,IAAI,EAAC;AAjBP,KAmBGN,UAnBH,EAmBe,GAnBf,eAoBE,oBAAC,eAAD;AAAiB,IAAA,IAAI,EAAEJ,IAAvB;AAA6B,IAAA,SAAS,EAAC,WAAvC;AAAmD,IAAA,UAAU;AAA7D,IApBF,EAoBmE,GApBnE,eAqBE;AAAM,IAAA,SAAS,EAAC;AAAhB,KACGrB,QADH,aACGA,QADH,cACGA,QADH,GACeK,IAAI,CAAC2B,QADpB,eAEE,oBAAC,OAAD;AACE,IAAA,OAAO,EAAE;AACPC,MAAAA,SAAS,EAAE;AAAEC,QAAAA,eAAe,EAAE;AAAEC,UAAAA,iBAAiB,EAAE;AAArB;AAAnB,OADJ;AAEPC,MAAAA,SAAS,EAAE;AAFJ;AADX,KAMGpC,QANH,aAMGA,QANH,cAMGA,QANH,GAMeK,IAAI,CAAC2B,QANpB,CAFF,CArBF,CADF;AAmCD,CA9EM;AAgFP;AACA;AACA;AACA;AACA;;AACA,OAAO,SAASV,WAAT,CAAqBjB,IAArB,EAA4D;AACjE,MAAIpB,WAAW,CAACoB,IAAD,CAAf,EAAuB;AACrB,WAAOA,IAAI,CAACgC,UAAL,GAAkB/D,cAAlB,GAAmCD,QAA1C;AACD;;AACD,MAAMiE,QAAQ,GAAGpD,SAAS,CAACqD,WAAV,CAAsBlC,IAAI,CAAC2B,QAA3B,CAAjB;;AACA,UAAQM,QAAR;AACE,SAAKnD,SAAS,CAACqD,MAAf;AACE,aAAOrE,QAAP;;AACF;AACE,aAAOC,MAAP;AAJJ;AAMD;AAED;AACA;AACA;;AACA,OAAO,SAASqE,gBAAT,CACLxC,YADK,EAELyC,UAFK,EAG6C;AAClD,MAAIzC,YAAY,CAAC0C,MAAb,KAAwB,CAAxB,IAA6B,CAACD,UAAlC,EAA8C;AAC5C,UAAM,IAAIE,KAAJ,CAAU,kBAAV,CAAN;AACD;;AAED,MAAMC,UAAU,GAAGvD,eAAe,CAACoD,UAAD,CAAlC;;AACA,MACEzC,YAAY,CAACY,IAAb,CACE;AAAA,QAAC;AAAEpB,MAAAA;AAAF,KAAD;AAAA,WAAkBP,SAAS,CAACQ,OAAV,CAAkBD,QAAlB,MAAgCoD,UAAlD;AAAA,GADF,CADF,EAIE;AACA;AACA,UAAM,IAAID,KAAJ,CAAU,wCAAV,CAAN;AACD;;AACD,MACE3C,YAAY,CAACY,IAAb,CACER,IAAI,IACFpB,WAAW,CAACoB,IAAD,CAAX,IACAwC,UAAU,CAACC,UAAX,CAAsB5D,SAAS,CAACM,QAAV,CAAmBa,IAAI,CAACZ,QAAxB,CAAtB,CAHJ,CADF,EAME;AACA;AACA,UAAM,IAAImD,KAAJ,CAAU,0DAAV,CAAN;AACD;;AACD,SAAO;AAAEG,IAAAA,KAAK,EAAE9C,YAAT;AAAuB4C,IAAAA;AAAvB,GAAP;AACD;AAED;AACA;AACA;;AACA,OAAO,IAAMG,QAAQ,GAAIjD,KAAD,IAAuC;AAC7D,MAAM;AACJkD,IAAAA,aAAa,GAAG,KADZ;AAEJC,IAAAA,KAFI;AAGJC,IAAAA,aAAa,GAAG,MAAMC,SAHlB;AAIJC,IAAAA,MAJI;AAKJC,IAAAA,QALI;AAMJC,IAAAA,iBAAiB,GAAG,MAAMH,SANtB;AAOJI,IAAAA,UAAU,GAAG1D,kBAPT;AAQJ2D,IAAAA,SAAS,GAAG9D,kBARR;AASJ+D,IAAAA,aAAa,GAAGzF,QAAQ,CAAC0F;AATrB,MAUF5D,KAVJ;AAWA,MAAM,CAAC6D,cAAD,EAAiBC,iBAAjB,IAAsC7E,QAAQ,CAAiB,OAAO;AAC1E8E,IAAAA,KAAK,EAAE,EADmE;AAE1EC,IAAAA,MAAM,EAAE,CAFkE;AAG1EC,IAAAA,SAAS,EAAE;AAH+D,GAAP,CAAjB,CAApD;AAKA,MAAM,CAACC,QAAD,EAAWC,WAAX,IAA0BlF,QAAQ,CAAe;AACrDmF,IAAAA,GAAG,EAAE,CADgD;AAErDC,IAAAA,MAAM,EAAE;AAF6C,GAAf,CAAxC;AAKA,MAAM,CAAC7D,cAAD,EAAiB8D,iBAAjB,IAAsCrF,QAAQ,EAApD;AACA,MAAM,CAACiB,YAAD,EAAeqE,eAAf,IAAkCtF,QAAQ,EAAhD;AACA,MAAM,CAACuF,eAAD,EAAkBC,kBAAlB,IAAwCxF,QAAQ,EAAtD;AACA,MAAM,CAACyF,cAAD,EAAiBC,iBAAjB,IAAsC1F,QAAQ,CAAC,EAAD,CAApD;AACA,MAAM2F,QAAQ,GAAG5F,MAAM,CAA4B,IAA5B,CAAvB;AACA,MAAM6F,QAAQ,GAAG7F,MAAM,CAAiB,IAAjB,CAAvB;AAEA,MAAM8F,QAAQ,GAAGjG,WAAW,CACzBkG,MAAD,IAAwC;AACtC,QAAIA,MAAM,CAACnC,MAAP,KAAkB,CAAlB,IAAuB,CAACiB,cAA5B,EAA4C;AAC1C,aAAO,EAAP;AACD;;AAED,QAAME,KAAK,GAAG,EAAd;;AACA,SAAK,IAAIiB,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGD,MAAM,CAACnC,MAA3B,EAAmCoC,CAAC,IAAI,CAAxC,EAA2C;AACzC,UAAMC,KAAK,GAAGF,MAAM,CAACC,CAAD,CAApB;;AACA,WAAK,IAAIE,CAAC,GAAGD,KAAK,CAAC,CAAD,CAAlB,EAAuBC,CAAC,IAAID,KAAK,CAAC,CAAD,CAAjC,EAAsCC,CAAC,IAAI,CAA3C,EAA8C;AAC5C,YACEA,CAAC,IAAIrB,cAAc,CAACG,MAApB,IACAkB,CAAC,GAAGrB,cAAc,CAACG,MAAf,GAAwBH,cAAc,CAACE,KAAf,CAAqBnB,MAFnD,EAGE;AACAmB,UAAAA,KAAK,CAACoB,IAAN,CAAWtB,cAAc,CAACE,KAAf,CAAqBmB,CAAC,GAAGrB,cAAc,CAACG,MAAxC,CAAX;AACD;AACF;AACF;;AACD,WAAOD,KAAP;AACD,GAnByB,EAoB1B,CAACF,cAAD,CApB0B,CAA5B;AAuBA,MAAMuB,OAAO,GAAGvG,WAAW,CACxB0B,SAAD,IAAoD;AAClD,QAAMwD,KAAK,GAAGe,QAAQ,CAAC,CAAC,CAACvE,SAAD,EAAYA,SAAZ,CAAD,CAAD,CAAtB;;AACA,QAAIwD,KAAK,CAACnB,MAAN,GAAe,CAAnB,EAAsB;AACpB,aAAOmB,KAAK,CAAC,CAAD,CAAZ;AACD;AACF,GANwB,EAOzB,CAACe,QAAD,CAPyB,CAA3B;AAUA;AACF;AACA;;AACE,MAAMO,sBAAsB,GAAGxG,WAAW,CAAC,MAAM;AAC/C,QAAMyG,KAAK,GAAG7G,UAAU,CAAC6G,KAAX,CAAiBZ,cAAjB,CAAd;;AACA,QAAIY,KAAK,KAAK,CAAd,EAAiB;AACf,aAAO,IAAP;AACD;;AAED,QAAIA,KAAK,KAAK,CAAd,EAAiB;AACf,UAAMvD,MAAK,GAAG2C,cAAc,CAAC,CAAD,CAAd,CAAkB,CAAlB,CAAd;AACA,UAAMpE,IAAI,GAAG8E,OAAO,CAACrD,MAAD,CAApB;;AACA,UAAIzB,IAAI,IAAI,IAAZ,EAAkB;AAChB,eAAOA,IAAI,CAACZ,QAAZ;AACD;AACF;;AACD,qBAAU4F,KAAV;AACD,GAdyC,EAcvC,CAACF,OAAD,EAAUV,cAAV,CAduC,CAA1C;AAgBA;AACF;AACA;AACA;;AACE,MAAMa,SAAS,GAAG1G,WAAW,CAC1B0B,SAAD,IAAwB;AACtB,QAAI,CAACL,YAAD,IAAiB,CAACM,cAAtB,EAAsC;AACpC;AACD;;AAEDnB,IAAAA,GAAG,CAACmG,KAAJ,CAAU,WAAV,EAAuBtF,YAAvB,EAAqC,IAArC,EAA2CK,SAA3C;;AAEA,QAAI;AACF,UAAM;AAAEyC,QAAAA,KAAK,EAALA,MAAF;AAASF,QAAAA;AAAT,UAAwBJ,gBAAgB,CAC5CxC,YAD4C,EAE5CM,cAF4C,CAA9C;AAIA8C,MAAAA,MAAM,CAACN,MAAD,EAAQF,UAAR,CAAN;;AACA,UAAIvC,SAAS,IAAI,IAAjB,EAAuB;AAAA;;AACrBoE,QAAAA,iBAAiB,CAAC,CAAC,CAACpE,SAAD,EAAYA,SAAZ,CAAD,CAAD,CAAjB;AACA,6BAAAqE,QAAQ,CAACa,OAAT,wEAAkBC,SAAlB,CAA4BnF,SAA5B;AACD;AACF,KAVD,CAUE,OAAOoF,GAAP,EAAY;AACZtG,MAAAA,GAAG,CAACuG,KAAJ,CAAU,yBAAV,EAAqCD,GAArC;AACD;AACF,GArB0B,EAsB3B,CAACzF,YAAD,EAAeM,cAAf,EAA+B8C,MAA/B,CAtB2B,CAA7B;AAyBA,MAAMuC,YAAY,GAAGhH,WAAW,CAC9B,CAAC0B,SAAD,EAAoBuF,KAApB,KAAoD;AAClD,QAAMxF,IAAI,GAAGuD,cAAc,CAACE,KAAf,CAAqBxD,SAAS,GAAGsD,cAAc,CAACG,MAAhD,CAAb;;AACA,QAAI1D,IAAI,KAAK+C,SAAb,EAAwB;AACtBhE,MAAAA,GAAG,CAACmG,KAAJ,CAAU,iBAAV,EAA6BlF,IAA7B;AAEAiD,MAAAA,QAAQ,CAACjD,IAAD,EAAOwF,KAAP,CAAR;;AACA,UAAI5G,WAAW,CAACoB,IAAD,CAAf,EAAuB;AACrB6C,QAAAA,KAAK,SAAL,IAAAA,KAAK,WAAL,YAAAA,KAAK,CAAE4C,WAAP,CAAmBzF,IAAI,CAACZ,QAAxB,EAAkC,CAACY,IAAI,CAACgC,UAAxC;AACD;AACF;AACF,GAX6B,EAY9B,CAACuB,cAAD,EAAiBN,QAAjB,EAA2BJ,KAA3B,CAZ8B,CAAhC;AAeA,MAAM6C,mBAAmB,GAAGnH,WAAW,CACrC,CAAC0B,SAAD,EAAoByB,CAApB,KAA2D;AAAA;;AACzD3C,IAAAA,GAAG,CAAC4G,MAAJ,CAAW,qBAAX,EAAkC1F,SAAlC,EAA6CmE,cAA7C;AAEA,QAAIwB,aAAa,GAAGxB,cAApB;;AACA,QAAI,CAACjG,UAAU,CAAC4B,UAAX,CAAsBqE,cAAtB,EAAsCnE,SAAtC,CAAL,EAAuD;AACrD2F,MAAAA,aAAa,GAAG,CAAC,CAAC3F,SAAD,EAAYA,SAAZ,CAAD,CAAhB;AACAoE,MAAAA,iBAAiB,CAACuB,aAAD,CAAjB;AACD;;AAED3B,IAAAA,eAAe,CAACO,QAAQ,CAACoB,aAAD,CAAT,CAAf,CATyD,CAWzD;;AACA,0BAAAtB,QAAQ,CAACa,OAAT,0EAAkBU,eAAlB;AAEA,QAAMC,kBAAkB,GAAGC,QAAQ,CAACC,aAAT,CAAuB,KAAvB,CAA3B;AACAF,IAAAA,kBAAkB,CAACG,SAAnB,oDAAuElB,sBAAsB,EAA7F;AACAe,IAAAA,kBAAkB,CAACI,SAAnB,GAA+B,2BAA/B;AACAH,IAAAA,QAAQ,CAACI,IAAT,CAAcC,WAAd,CAA0BN,kBAA1B;AACApE,IAAAA,CAAC,CAAC2E,YAAF,CAAeC,YAAf,CAA4BR,kBAA5B,EAAgD,CAAhD,EAAmD,CAAnD;AACApE,IAAAA,CAAC,CAAC2E,YAAF,CAAeE,aAAf,GAA+B,MAA/B;AACApC,IAAAA,kBAAkB,CAAC2B,kBAAD,CAAlB;AACD,GAtBoC,EAuBrC,CAACf,sBAAD,EAAyBP,QAAzB,EAAmCJ,cAAnC,CAvBqC,CAAvC;AA0BA,MAAMoC,kBAAkB,GAAGjI,WAAW,CACpC,CAAC0B,SAAD,EAAoByB,CAApB,KAA2D;AACzDA,IAAAA,CAAC,CAAC+E,cAAF;AAEA1H,IAAAA,GAAG,CAAC4G,MAAJ,CAAW,oBAAX,EAAiCjE,CAAjC;AACAsC,IAAAA,iBAAiB,CAACc,OAAO,CAAC7E,SAAD,CAAR,CAAjB;AACD,GANmC,EAOpC,CAAC6E,OAAD,CAPoC,CAAtC;AAUA,MAAM4B,iBAAiB,GAAGnI,WAAW,CACnC,CAAC0B,SAAD,EAAoByB,CAApB,KAA2D;AACzD3C,IAAAA,GAAG,CAACmG,KAAJ,CAAU,mBAAV,EAA+BjF,SAA/B;AAEAiE,IAAAA,eAAe,SAAf,IAAAA,eAAe,WAAf,YAAAA,eAAe,CAAEyC,MAAjB,GAHyD,CAKzD;AACA;;AACA1C,IAAAA,eAAe,CAAClB,SAAD,CAAf;AACAiB,IAAAA,iBAAiB,CAACjB,SAAD,CAAjB;AACAoB,IAAAA,kBAAkB,CAACpB,SAAD,CAAlB;AACD,GAXkC,EAYnC,CAACmB,eAAD,CAZmC,CAArC;AAeA,MAAM0C,cAAc,GAAGrI,WAAW,CAChC,CAAC0B,SAAD,EAAoByB,CAApB,KAA2D;AACzDuD,IAAAA,SAAS,CAAChF,SAAD,CAAT;AACD,GAH+B,EAIhC,CAACgF,SAAD,CAJgC,CAAlC;AAOA,MAAM4B,kBAAkB,GAAGtI,WAAW,CAAC,MAAM;AAC3CQ,IAAAA,GAAG,CAAC4G,MAAJ,CAAW,oBAAX;AACA3B,IAAAA,iBAAiB,CAACjB,SAAD,CAAjB;AACD,GAHqC,EAGnC,EAHmC,CAAtC;AAKA,MAAM+D,kBAAkB,GAAGvI,WAAW,CACnCmD,CAAD,IAAwC;AACtC,QACEA,CAAC,CAACqF,MAAF,YAAoBC,OAApB,IACAtF,CAAC,CAACqF,MAAF,CAASE,SAAT,CAAmBC,QAAnB,CAA4B1H,oBAA5B,CAFF,EAGE;AACA;AACA;AACAkC,MAAAA,CAAC,CAAC+E,cAAF;AAEA1H,MAAAA,GAAG,CAAC4G,MAAJ,CAAW,oBAAX,EAAiCjE,CAAjC;AACAsC,MAAAA,iBAAiB,CAAC;AAChBmD,QAAAA,IAAI,EAAE,WADU;AAEhB/H,QAAAA,QAAQ,EAAE,GAFM;AAGhBuC,QAAAA,QAAQ,EAAE,GAHM;AAIhBjB,QAAAA,EAAE,EAAE;AAJY,OAAD,CAAjB;AAMD;AACF,GAlBmC,EAmBpC,EAnBoC,CAAtC;AAsBA,MAAM0G,cAAc,GAAG7I,WAAW,CAC/BmD,CAAD,IAAwC;AACtC,QACEA,CAAC,CAACqF,MAAF,YAAoBC,OAApB,IACAtF,CAAC,CAACqF,MAAF,CAASE,SAAT,CAAmBC,QAAnB,CAA4B1H,oBAA5B,CAFF,EAGE;AACAT,MAAAA,GAAG,CAACmG,KAAJ,CAAU,gBAAV;AACAD,MAAAA,SAAS;AACV;AACF,GAT+B,EAUhC,CAACA,SAAD,CAVgC,CAAlC;AAaA,MAAMoC,qBAAqB,GAAG9I,WAAW,CACvC+I,iBAAiB,IAAI;AACnBvI,IAAAA,GAAG,CAAC4G,MAAJ,CAAW,uBAAX,EAAoC2B,iBAApC;;AACA,QAAIA,iBAAiB,KAAKlD,cAA1B,EAA0C;AACxCC,MAAAA,iBAAiB,CAACiD,iBAAD,CAAjB;;AACA,UAAMC,cAAa,GAAG/C,QAAQ,CAAC8C,iBAAD,CAA9B;;AACApE,MAAAA,iBAAiB,CAACqE,cAAD,CAAjB;AACD;AACF,GARsC,EASvC,CAAC/C,QAAD,EAAWtB,iBAAX,EAA8BkB,cAA9B,CATuC,CAAzC;AAYA,MAAMoD,iBAAiB,GAAGjJ,WAAW,CACnCkJ,UAAU,IAAI;AACZ1I,IAAAA,GAAG,CAAC4G,MAAJ,CAAW,mBAAX,EAAgC8B,UAAhC;;AACA,QAAIA,UAAU,IAAI,IAAlB,EAAwB;AACtB,UAAM,CAACC,YAAD,IAAgBlD,QAAQ,CAAC,CAAC,CAACiD,UAAD,EAAaA,UAAb,CAAD,CAAD,CAA9B;AACA3E,MAAAA,aAAa,CAAC4E,YAAD,CAAb;AACD,KAHD,MAGO;AACL5E,MAAAA,aAAa;AACd;AACF,GATkC,EAUnC,CAAC0B,QAAD,EAAW1B,aAAX,CAVmC,CAArC;AAaA,MAAM6E,oBAAoB,GAAGpJ,WAAW,CACtC,CAACuF,GAAD,EAAcC,MAAd,KAAiC;AAC/BhF,IAAAA,GAAG,CAACmG,KAAJ,CAAU,sBAAV,EAAkCpB,GAAlC,EAAuCC,MAAvC;;AACA,QAAID,GAAG,KAAKF,QAAQ,CAACE,GAAjB,IAAwBC,MAAM,KAAKH,QAAQ,CAACG,MAAhD,EAAwD;AACtDF,MAAAA,WAAW,CAAC;AAAEC,QAAAA,GAAF;AAAOC,QAAAA;AAAP,OAAD,CAAX;AACD;AACF,GANqC,EAOtC,CAACH,QAAD,CAPsC,CAAxC;AAUA,MAAM9D,iBAAiB,GAAGrB,OAAO,CAAC,MAAM;AACtC,QAAI,CAACmB,YAAD,IAAiB,CAACM,cAAtB,EAAsC;AACpC,aAAO,KAAP;AACD;;AAED,QAAI;AACFkC,MAAAA,gBAAgB,CAACxC,YAAD,EAAeM,cAAf,CAAhB;AACAnB,MAAAA,GAAG,CAACmG,KAAJ,CAAU,+BAAV;AACA,aAAO,IAAP;AACD,KAJD,CAIE,OAAOxD,CAAP,EAAU;AACV3C,MAAAA,GAAG,CAACmG,KAAJ,CAAU,gCAAV;AACA,aAAO,KAAP;AACD;AACF,GAbgC,EAa9B,CAACtF,YAAD,EAAeM,cAAf,CAb8B,CAAjC;AAeA1B,EAAAA,SAAS,CAAC,MAAM;AACdO,IAAAA,GAAG,CAACmG,KAAJ,CAAU,yBAAV,EAAqCtB,QAArC;AACAf,IAAAA,KAAK,SAAL,IAAAA,KAAK,WAAL,YAAAA,KAAK,CAAEgB,WAAP,CAAmB;AACjBC,MAAAA,GAAG,EAAE8D,IAAI,CAACC,GAAL,CAAS,CAAT,EAAYjE,QAAQ,CAACE,GAAT,GAAeT,aAA3B,CADY;AAEjBU,MAAAA,MAAM,EAAEH,QAAQ,CAACG,MAAT,GAAkBV;AAFT,KAAnB;AAID,GANQ,EAMN,CAACA,aAAD,EAAgBR,KAAhB,EAAuBe,QAAvB,CANM,CAAT,CAjR6D,CAyR7D;;AACApF,EAAAA,SAAS,CAAC,MAAM;AACd,QAAMsJ,eAAe,GAAGjF,KAAK,CAACkF,QAAN,CAAeC,WAAW,IAAI;AACpDxE,MAAAA,iBAAiB,CAAC;AAChBC,QAAAA,KAAK,EAAEuE,WAAW,CAACvE,KAAZ,CAAkBlC,GAAlB,CAAsBvB,IAAI,oCAC5BA,IAD4B;AAE/BiI,UAAAA,QAAQ,EAAEjI,IAAI,CAAC2B;AAFgB,UAA1B,CADS;AAKhB+B,QAAAA,MAAM,EAAEsE,WAAW,CAACtE,MALJ;AAMhBC,QAAAA,SAAS,EAAEd,KAAK,CAACqF;AAND,OAAD,CAAjB;AAQD,KATuB,CAAxB;AAUA,WAAO,MAAM;AACXJ,MAAAA,eAAe;AAChB,KAFD;AAGD,GAdQ,EAcN,CAACjF,KAAD,CAdM,CAAT,CA1R6D,CA0S7D;;AACArE,EAAAA,SAAS,CAAC,MAAM;AACd,QACE0B,cAAc,IAAI,IAAlB,IACAtB,WAAW,CAACsB,cAAD,CADX,IAEAA,cAAc,CAACd,QAAf,KAA4B,GAH9B,EAIE;AACA,UAAM+I,OAAO,GAAGC,UAAU,CAAC,MAAM;AAC/B,YAAI,CAAClI,cAAc,CAAC8B,UAApB,EAAgC;AAC9Ba,UAAAA,KAAK,SAAL,IAAAA,KAAK,WAAL,YAAAA,KAAK,CAAE4C,WAAP,CAAmBvF,cAAc,CAACd,QAAlC,EAA4C,IAA5C;AACD;AACF,OAJyB,EAIvBG,kBAJuB,CAA1B;AAKA,aAAO,MAAM8I,YAAY,CAACF,OAAD,CAAzB;AACD;AACF,GAbQ,EAaN,CAACjI,cAAD,EAAiB2C,KAAjB,CAbM,CAAT;AAeA,MAAMyF,aAAa,GAAG/J,WAAW,CAC/BgK,SAAS,IACPpF,UAAU,iCACLoF,SADK;AAER1I,IAAAA,gBAAgB,EAAED,YAAY,IAAI,IAF1B;AAGRM,IAAAA,cAHQ;AAIRN,IAAAA,YAJQ;AAKRE,IAAAA,iBALQ;AAMRK,IAAAA,WAAW,EAAEuF,mBANL;AAORrF,IAAAA,SAAS,EAAEqG,iBAPH;AAQRtG,IAAAA,UAAU,EAAEoG,kBARJ;AASRgC,IAAAA,UAAU,EAAE3B,kBATJ;AAURvG,IAAAA,MAAM,EAAEsG;AAVA,KAFmB,EAc/B,CACEF,iBADF,EAEEG,kBAFF,EAGEL,kBAHF,EAIEd,mBAJF,EAKEkB,cALF,EAMEhH,YANF,EAOEM,cAPF,EAQEJ,iBARF,EASEqD,UATF,CAd+B,CAAjC;AA2BA,sBACE;AACE,IAAA,GAAG,EAAEoB,QADP;AAEE,IAAA,SAAS,EAAElG,UAAU,CAAC,WAAD,EAAc;AACjC,qBAAeuB,YAAY,IAAI;AADE,KAAd,CAFvB;AAKE,IAAA,UAAU,EAAEkH,kBALd;AAME,IAAA,MAAM,EAAEM;AANV,kBAQE,oBAAC,QAAD;AACE,IAAA,GAAG,EAAE9C,QADP;AAEE,IAAA,KAAK,EAAEf,cAAc,CAACE,KAFxB;AAGE,IAAA,SAAS,EAAEF,cAAc,CAACI,SAH5B;AAIE,IAAA,MAAM,EAAEJ,cAAc,CAACG,MAJzB;AAKE,IAAA,aAAa,EAAE8D,iBALjB;AAME,IAAA,QAAQ,EAAEjC,YANZ;AAOE,IAAA,iBAAiB,EAAE8B,qBAPrB;AAQE,IAAA,gBAAgB,EAAEM,oBARpB;AASE,IAAA,cAAc,EAAEvD,cATlB;AAUE,IAAA,UAAU,EAAEkE,aAVd;AAWE,IAAA,SAAS,EAAElF,SAXb;AAYE,IAAA,aAAa,EAAER,aAZjB;AAaE,IAAA,YAAY,EAAE,KAbhB;AAcE,IAAA,iBAAiB,EAAE;AAdrB,IARF,CADF;AA2BD,CAhXM;AAkXP,eAAeD,QAAf","sourcesContent":["import {\n ItemList,\n Range,\n RenderItemProps,\n Tooltip,\n} from '@deephaven/components';\nimport { dhPython, vsCode, vsFolder, vsFolderOpened } from '@deephaven/icons';\nimport Log from '@deephaven/log';\nimport { RangeUtils } from '@deephaven/utils';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport classNames from 'classnames';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { FileStorageItem, FileStorageTable, isDirectory } from './FileStorage';\nimport './FileList.scss';\nimport FileUtils, { MIME_TYPE } from './FileUtils';\n\nconst log = Log.module('FileList');\n\nexport type LoadedViewport = {\n items: FileStorageItem[];\n offset: number;\n itemCount: number;\n};\n\nexport type ListViewport = {\n top: number;\n bottom: number;\n};\n\nexport type FileListRenderItemProps = RenderItemProps<FileStorageItem> & {\n children?: JSX.Element;\n dropTargetItem?: FileStorageItem;\n draggedItems?: FileStorageItem[];\n isDragInProgress: boolean;\n isDropTargetValid: boolean;\n\n onDragStart(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragOver(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragEnd(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDrop(index: number, e: React.DragEvent<HTMLDivElement>): void;\n};\n\nexport interface FileListProps {\n table: FileStorageTable;\n\n isMultiSelect?: boolean;\n\n onFocusChange?: (focusedItem?: FileStorageItem) => void;\n onMove: (files: FileStorageItem[], path: string) => void;\n onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => void;\n onSelectionChange?: (selectedItems: FileStorageItem[]) => void;\n\n renderItem?: (props: FileListRenderItemProps) => JSX.Element;\n\n /** Height of each item in the list */\n rowHeight?: number;\n\n overscanCount?: number;\n}\n\nexport const getPathFromItem = (file: FileStorageItem): string =>\n isDirectory(file)\n ? FileUtils.makePath(file.filename)\n : FileUtils.getPath(file.filename);\n\nexport const DEFAULT_ROW_HEIGHT = 26;\n\n// How long you need to hover over a directory before it expands\nexport const DRAG_HOVER_TIMEOUT = 500;\n\nconst ITEM_LIST_CLASS_NAME = 'item-list-scroll-pane';\n\nexport const renderFileListItem = (\n props: FileListRenderItemProps\n): JSX.Element => {\n const {\n children,\n draggedItems,\n isDragInProgress,\n isDropTargetValid,\n isSelected,\n item,\n itemIndex,\n dropTargetItem,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n } = props;\n\n const isDragged =\n draggedItems?.some(draggedItem => draggedItem.id === item.id) ?? false;\n const itemPath = getPathFromItem(item);\n const dropTargetPath =\n isDragInProgress && dropTargetItem ? getPathFromItem(dropTargetItem) : null;\n\n const isExactDropTarget =\n isDragInProgress &&\n isDropTargetValid &&\n isDirectory(item) &&\n dropTargetPath === itemPath;\n const isInDropTarget =\n isDragInProgress && isDropTargetValid && dropTargetPath === itemPath;\n const isInvalidDropTarget =\n isDragInProgress && !isDropTargetValid && dropTargetPath === itemPath;\n\n const icon = getItemIcon(item);\n const depth = FileUtils.getDepth(item.filename);\n const depthLines = Array(depth)\n .fill(null)\n .map((value, index) => (\n // eslint-disable-next-line react/no-array-index-key\n <span className=\"file-list-depth-line\" key={index} />\n ));\n\n return (\n <div\n className={classNames(\n 'd-flex w-100 align-items-center',\n 'file-list-item',\n {\n 'is-dragged': isDragged,\n 'is-exact-drop-target': isExactDropTarget,\n 'is-in-drop-target': isInDropTarget,\n 'is-invalid-drop-target': isInvalidDropTarget,\n 'is-selected': isSelected,\n }\n )}\n onDragStart={e => onDragStart(itemIndex, e)}\n onDragOver={e => onDragOver(itemIndex, e)}\n onDragEnd={e => onDragEnd(itemIndex, e)}\n onDrop={e => onDrop(itemIndex, e)}\n draggable\n role=\"presentation\"\n >\n {depthLines}{' '}\n <FontAwesomeIcon icon={icon} className=\"item-icon\" fixedWidth />{' '}\n <span className=\"truncation-wrapper\">\n {children ?? item.basename}\n <Tooltip\n options={{\n modifiers: { preventOverflow: { boundariesElement: 'window' } },\n placement: 'left',\n }}\n >\n {children ?? item.basename}\n </Tooltip>\n </span>\n </div>\n );\n};\n\n/**\n * Get the icon definition for a file or folder item\n * @param {FileStorageItem} item Item to get the icon for\n * @returns {IconDefinition} Icon definition to pass in the FontAwesomeIcon icon prop\n */\nexport function getItemIcon(item: FileStorageItem): IconDefinition {\n if (isDirectory(item)) {\n return item.isExpanded ? vsFolderOpened : vsFolder;\n }\n const mimeType = FileUtils.getMimeType(item.basename);\n switch (mimeType) {\n case MIME_TYPE.PYTHON:\n return dhPython;\n default:\n return vsCode;\n }\n}\n\n/**\n * Get the move operation for the current selection and the given target. Throws if the operation is invalid.\n */\nexport function getMoveOperation(\n draggedItems: FileStorageItem[],\n targetItem: FileStorageItem\n): { files: FileStorageItem[]; targetPath: string } {\n if (draggedItems.length === 0 || !targetItem) {\n throw new Error('No items to move');\n }\n\n const targetPath = getPathFromItem(targetItem);\n if (\n draggedItems.some(\n ({ filename }) => FileUtils.getPath(filename) === targetPath\n )\n ) {\n // Cannot drop if target is one of the dragged items is already in the target folder\n throw new Error('File already in the destination folder');\n }\n if (\n draggedItems.some(\n item =>\n isDirectory(item) &&\n targetPath.startsWith(FileUtils.makePath(item.filename))\n )\n ) {\n // Cannot drop if target is a child of one of the directories being moved\n throw new Error('Destination folder cannot be a child of a dragged folder');\n }\n return { files: draggedItems, targetPath };\n}\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorageTable.\n */\nexport const FileList = (props: FileListProps): JSX.Element => {\n const {\n isMultiSelect = false,\n table,\n onFocusChange = () => undefined,\n onMove,\n onSelect,\n onSelectionChange = () => undefined,\n renderItem = renderFileListItem,\n rowHeight = DEFAULT_ROW_HEIGHT,\n overscanCount = ItemList.DEFAULT_OVERSCAN,\n } = props;\n const [loadedViewport, setLoadedViewport] = useState<LoadedViewport>(() => ({\n items: [],\n offset: 0,\n itemCount: 0,\n }));\n const [viewport, setViewport] = useState<ListViewport>({\n top: 0,\n bottom: 0,\n });\n\n const [dropTargetItem, setDropTargetItem] = useState<FileStorageItem>();\n const [draggedItems, setDraggedItems] = useState<FileStorageItem[]>();\n const [dragPlaceholder, setDragPlaceholder] = useState<HTMLDivElement>();\n const [selectedRanges, setSelectedRanges] = useState([] as Range[]);\n const itemList = useRef<ItemList<FileStorageItem>>(null);\n const fileList = useRef<HTMLDivElement>(null);\n\n const getItems = useCallback(\n (ranges: Range[]): FileStorageItem[] => {\n if (ranges.length === 0 || !loadedViewport) {\n return [];\n }\n\n const items = [] as FileStorageItem[];\n for (let i = 0; i < ranges.length; i += 1) {\n const range = ranges[i];\n for (let j = range[0]; j <= range[1]; j += 1) {\n if (\n j >= loadedViewport.offset &&\n j < loadedViewport.offset + loadedViewport.items.length\n ) {\n items.push(loadedViewport.items[j - loadedViewport.offset]);\n }\n }\n }\n return items;\n },\n [loadedViewport]\n );\n\n const getItem = useCallback(\n (itemIndex: number): FileStorageItem | undefined => {\n const items = getItems([[itemIndex, itemIndex]]);\n if (items.length > 0) {\n return items[0];\n }\n },\n [getItems]\n );\n\n /**\n * Get the placeholder text to show when a drag operation is in progress\n */\n const getDragPlaceholderText = useCallback(() => {\n const count = RangeUtils.count(selectedRanges);\n if (count === 0) {\n return null;\n }\n\n if (count === 1) {\n const index = selectedRanges[0][0];\n const item = getItem(index);\n if (item != null) {\n return item.filename;\n }\n }\n return `${count} items`;\n }, [getItem, selectedRanges]);\n\n /**\n * Drop the currently dragged items at the currently set drop target.\n * If an itemIndex is provided, focus that index after the drop.\n */\n const dropItems = useCallback(\n (itemIndex?: number) => {\n if (!draggedItems || !dropTargetItem) {\n return;\n }\n\n log.debug('dropItems', draggedItems, 'to', itemIndex);\n\n try {\n const { files, targetPath } = getMoveOperation(\n draggedItems,\n dropTargetItem\n );\n onMove(files, targetPath);\n if (itemIndex != null) {\n setSelectedRanges([[itemIndex, itemIndex]]);\n itemList.current?.focusItem(itemIndex);\n }\n } catch (err) {\n log.error('Unable to complete move', err);\n }\n },\n [draggedItems, dropTargetItem, onMove]\n );\n\n const handleSelect = useCallback(\n (itemIndex: number, event: React.SyntheticEvent) => {\n const item = loadedViewport.items[itemIndex - loadedViewport.offset];\n if (item !== undefined) {\n log.debug('handleItemClick', item);\n\n onSelect(item, event);\n if (isDirectory(item)) {\n table?.setExpanded(item.filename, !item.isExpanded);\n }\n }\n },\n [loadedViewport, onSelect, table]\n );\n\n const handleItemDragStart = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n log.debug2('handleItemDragStart', itemIndex, selectedRanges);\n\n let draggedRanges = selectedRanges;\n if (!RangeUtils.isSelected(selectedRanges, itemIndex)) {\n draggedRanges = [[itemIndex, itemIndex]];\n setSelectedRanges(draggedRanges);\n }\n\n setDraggedItems(getItems(draggedRanges));\n\n // We need to reset reset the mouse state since we steal the drag\n itemList.current?.resetMouseState();\n\n const newDragPlaceholder = document.createElement('div');\n newDragPlaceholder.innerHTML = `<div class=\"dnd-placeholder-content\">${getDragPlaceholderText()}</div>`;\n newDragPlaceholder.className = 'file-list-dnd-placeholder';\n document.body.appendChild(newDragPlaceholder);\n e.dataTransfer.setDragImage(newDragPlaceholder, 0, 0);\n e.dataTransfer.effectAllowed = 'move';\n setDragPlaceholder(newDragPlaceholder);\n },\n [getDragPlaceholderText, getItems, selectedRanges]\n );\n\n const handleItemDragOver = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n\n log.debug2('handleItemDragOver', e);\n setDropTargetItem(getItem(itemIndex));\n },\n [getItem]\n );\n\n const handleItemDragEnd = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n log.debug('handleItemDragEnd', itemIndex);\n\n dragPlaceholder?.remove();\n\n // Drag end is triggered after drop\n // Also drop isn't triggered if drag end is outside of the list\n setDraggedItems(undefined);\n setDropTargetItem(undefined);\n setDragPlaceholder(undefined);\n },\n [dragPlaceholder]\n );\n\n const handleItemDrop = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n dropItems(itemIndex);\n },\n [dropItems]\n );\n\n const handleItemDragExit = useCallback(() => {\n log.debug2('handleItemDragExit');\n setDropTargetItem(undefined);\n }, []);\n\n const handleListDragOver = useCallback(\n (e: React.DragEvent<HTMLDivElement>) => {\n if (\n e.target instanceof Element &&\n e.target.classList.contains(ITEM_LIST_CLASS_NAME)\n ) {\n // Need to prevent default to enable drop\n // https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#droptargets\n e.preventDefault();\n\n log.debug2('handleListDragOver', e);\n setDropTargetItem({\n type: 'directory',\n filename: '/',\n basename: '/',\n id: '/',\n });\n }\n },\n []\n );\n\n const handleListDrop = useCallback(\n (e: React.DragEvent<HTMLDivElement>) => {\n if (\n e.target instanceof Element &&\n e.target.classList.contains(ITEM_LIST_CLASS_NAME)\n ) {\n log.debug('handleListDrop');\n dropItems();\n }\n },\n [dropItems]\n );\n\n const handleSelectionChange = useCallback(\n newSelectedRanges => {\n log.debug2('handleSelectionChange', newSelectedRanges);\n if (newSelectedRanges !== selectedRanges) {\n setSelectedRanges(newSelectedRanges);\n const selectedItems = getItems(newSelectedRanges);\n onSelectionChange(selectedItems);\n }\n },\n [getItems, onSelectionChange, selectedRanges]\n );\n\n const handleFocusChange = useCallback(\n focusIndex => {\n log.debug2('handleFocusChange', focusIndex);\n if (focusIndex != null) {\n const [focusedItem] = getItems([[focusIndex, focusIndex]]);\n onFocusChange(focusedItem);\n } else {\n onFocusChange();\n }\n },\n [getItems, onFocusChange]\n );\n\n const handleViewportChange = useCallback(\n (top: number, bottom: number) => {\n log.debug('handleViewportChange', top, bottom);\n if (top !== viewport.top || bottom !== viewport.bottom) {\n setViewport({ top, bottom });\n }\n },\n [viewport]\n );\n\n const isDropTargetValid = useMemo(() => {\n if (!draggedItems || !dropTargetItem) {\n return false;\n }\n\n try {\n getMoveOperation(draggedItems, dropTargetItem);\n log.debug('handleValidateDropTarget true');\n return true;\n } catch (e) {\n log.debug('handleValidateDropTarget false');\n return false;\n }\n }, [draggedItems, dropTargetItem]);\n\n useEffect(() => {\n log.debug('updating table viewport', viewport);\n table?.setViewport({\n top: Math.max(0, viewport.top - overscanCount),\n bottom: viewport.bottom + overscanCount,\n });\n }, [overscanCount, table, viewport]);\n\n // Listen for table updates\n useEffect(() => {\n const listenerRemover = table.onUpdate(newViewport => {\n setLoadedViewport({\n items: newViewport.items.map(item => ({\n ...item,\n itemName: item.basename,\n })),\n offset: newViewport.offset,\n itemCount: table.size,\n });\n });\n return () => {\n listenerRemover();\n };\n }, [table]);\n\n // Expand a folder if hovering over it\n useEffect(() => {\n if (\n dropTargetItem != null &&\n isDirectory(dropTargetItem) &&\n dropTargetItem.filename !== '/'\n ) {\n const timeout = setTimeout(() => {\n if (!dropTargetItem.isExpanded) {\n table?.setExpanded(dropTargetItem.filename, true);\n }\n }, DRAG_HOVER_TIMEOUT);\n return () => clearTimeout(timeout);\n }\n }, [dropTargetItem, table]);\n\n const renderWrapper = useCallback(\n itemProps =>\n renderItem({\n ...itemProps,\n isDragInProgress: draggedItems != null,\n dropTargetItem,\n draggedItems,\n isDropTargetValid,\n onDragStart: handleItemDragStart,\n onDragEnd: handleItemDragEnd,\n onDragOver: handleItemDragOver,\n onDragExit: handleItemDragExit,\n onDrop: handleItemDrop,\n }),\n [\n handleItemDragEnd,\n handleItemDragExit,\n handleItemDragOver,\n handleItemDragStart,\n handleItemDrop,\n draggedItems,\n dropTargetItem,\n isDropTargetValid,\n renderItem,\n ]\n );\n\n return (\n <div\n ref={fileList}\n className={classNames('file-list', {\n 'is-dragging': draggedItems != null,\n })}\n onDragOver={handleListDragOver}\n onDrop={handleListDrop}\n >\n <ItemList\n ref={itemList}\n items={loadedViewport.items}\n itemCount={loadedViewport.itemCount}\n offset={loadedViewport.offset}\n onFocusChange={handleFocusChange}\n onSelect={handleSelect}\n onSelectionChange={handleSelectionChange}\n onViewportChange={handleViewportChange}\n selectedRanges={selectedRanges}\n renderItem={renderWrapper}\n rowHeight={rowHeight}\n isMultiSelect={isMultiSelect}\n isDragSelect={false}\n isDeselectOnClick={false}\n />\n </div>\n );\n};\n\nexport default FileList;\n"],"file":"FileList.js"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deephaven/file-explorer",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.3-beta.0+548192a",
|
|
4
4
|
"description": "Deephaven File Explorer React component",
|
|
5
5
|
"author": "Deephaven Data Labs LLC",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
10
|
-
"url": "https://github.com/deephaven/web-client-ui"
|
|
10
|
+
"url": "https://github.com/deephaven/web-client-ui.git",
|
|
11
|
+
"directory": "packages/file-explorer"
|
|
11
12
|
},
|
|
12
13
|
"source": "src/index.ts",
|
|
13
14
|
"main": "dist/index.js",
|
|
@@ -26,14 +27,12 @@
|
|
|
26
27
|
"watch:babel": "npm run babel -- -w --skip-initial-build",
|
|
27
28
|
"watch:sass": "npm run sass -- --watch --update",
|
|
28
29
|
"prestart": "npm run build-dev",
|
|
29
|
-
"start": "cross-env NODE_ENV=development npm run watch"
|
|
30
|
-
"storybook": "start-storybook -p 6006",
|
|
31
|
-
"build-storybook": "build-storybook"
|
|
30
|
+
"start": "cross-env NODE_ENV=development npm run watch"
|
|
32
31
|
},
|
|
33
32
|
"dependencies": {
|
|
34
|
-
"@deephaven/icons": "^0.11.
|
|
35
|
-
"@deephaven/storage": "^0.11.
|
|
36
|
-
"@deephaven/utils": "^0.11.
|
|
33
|
+
"@deephaven/icons": "^0.11.3-beta.0+548192a",
|
|
34
|
+
"@deephaven/storage": "^0.11.3-beta.0+548192a",
|
|
35
|
+
"@deephaven/utils": "^0.11.3-beta.0+548192a",
|
|
37
36
|
"@fortawesome/fontawesome-svg-core": "1.2.36",
|
|
38
37
|
"@fortawesome/react-fontawesome": "^0.1.12",
|
|
39
38
|
"classnames": "^2.3.1",
|
|
@@ -49,13 +48,9 @@
|
|
|
49
48
|
},
|
|
50
49
|
"devDependencies": {
|
|
51
50
|
"@babel/cli": "^7.16.0",
|
|
52
|
-
"@deephaven/components": "^0.11.
|
|
53
|
-
"@deephaven/log": "^0.11.
|
|
54
|
-
"@deephaven/tsconfig": "^0.11.
|
|
55
|
-
"@storybook/addon-actions": "^6.2.3",
|
|
56
|
-
"@storybook/addon-essentials": "^6.2.3",
|
|
57
|
-
"@storybook/addon-links": "^6.2.3",
|
|
58
|
-
"@storybook/react": "^6.2.3",
|
|
51
|
+
"@deephaven/components": "^0.11.3-beta.0+548192a",
|
|
52
|
+
"@deephaven/log": "^0.11.3-beta.0+548192a",
|
|
53
|
+
"@deephaven/tsconfig": "^0.11.3-beta.0+548192a",
|
|
59
54
|
"@types/react": "^17.0.2",
|
|
60
55
|
"cross-env": "^7.0.2",
|
|
61
56
|
"follow-redirects": ">=1.14.7",
|
|
@@ -71,5 +66,5 @@
|
|
|
71
66
|
"publishConfig": {
|
|
72
67
|
"access": "public"
|
|
73
68
|
},
|
|
74
|
-
"gitHead": "
|
|
69
|
+
"gitHead": "548192a2271314cce046487728c4ba18291d3dcd"
|
|
75
70
|
}
|