@deephaven/file-explorer 1.22.1 → 1.22.2-alpha-pivot-builder.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/FileExplorer.js +32 -15
- package/dist/FileExplorer.js.map +1 -1
- package/dist/FileExplorerToolbar.js +5 -6
- package/dist/FileExplorerToolbar.js.map +1 -1
- package/dist/FileList.js +59 -32
- package/dist/FileList.js.map +1 -1
- package/dist/FileListContainer.js +37 -22
- package/dist/FileListContainer.js.map +1 -1
- package/dist/FileListItem.js +13 -15
- package/dist/FileListItem.js.map +1 -1
- package/dist/FileListItemEditor.js +25 -15
- package/dist/FileListItemEditor.js.map +1 -1
- package/dist/FileListUtils.js +1 -3
- package/dist/FileListUtils.js.map +1 -1
- package/dist/NewItemModal.js +47 -78
- package/dist/NewItemModal.js.map +1 -1
- package/package.json +9 -9
package/dist/FileExplorer.js
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
|
|
2
2
|
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
|
|
3
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
4
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
5
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
6
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
7
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
8
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
3
9
|
import { BasicModal } from '@deephaven/components';
|
|
4
10
|
import Log from '@deephaven/log';
|
|
5
11
|
import { PromiseUtils } from '@deephaven/utils';
|
|
@@ -17,21 +23,32 @@ var log = Log.module('FileExplorer');
|
|
|
17
23
|
* Component that displays and allows interaction with the file system in the provided FileStorage.
|
|
18
24
|
*/
|
|
19
25
|
export function FileExplorer(props) {
|
|
20
|
-
var
|
|
21
|
-
|
|
22
|
-
isMultiSelect = false,
|
|
23
|
-
focusedPath,
|
|
24
|
-
onCopy =
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
26
|
+
var storage = props.storage,
|
|
27
|
+
_props$isMultiSelect = props.isMultiSelect,
|
|
28
|
+
isMultiSelect = _props$isMultiSelect === void 0 ? false : _props$isMultiSelect,
|
|
29
|
+
focusedPath = props.focusedPath,
|
|
30
|
+
_props$onCopy = props.onCopy,
|
|
31
|
+
onCopy = _props$onCopy === void 0 ? () => undefined : _props$onCopy,
|
|
32
|
+
_props$onDelete = props.onDelete,
|
|
33
|
+
onDelete = _props$onDelete === void 0 ? () => undefined : _props$onDelete,
|
|
34
|
+
_props$onRename = props.onRename,
|
|
35
|
+
onRename = _props$onRename === void 0 ? () => undefined : _props$onRename,
|
|
36
|
+
_props$onCreateFile = props.onCreateFile,
|
|
37
|
+
onCreateFile = _props$onCreateFile === void 0 ? () => undefined : _props$onCreateFile,
|
|
38
|
+
_props$onCreateFolder = props.onCreateFolder,
|
|
39
|
+
onCreateFolder = _props$onCreateFolder === void 0 ? () => undefined : _props$onCreateFolder,
|
|
40
|
+
onSelect = props.onSelect,
|
|
41
|
+
onSelectionChange = props.onSelectionChange,
|
|
42
|
+
_props$rowHeight = props.rowHeight,
|
|
43
|
+
rowHeight = _props$rowHeight === void 0 ? DEFAULT_ROW_HEIGHT : _props$rowHeight;
|
|
44
|
+
var _useState = useState([]),
|
|
45
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
46
|
+
itemsToDelete = _useState2[0],
|
|
47
|
+
setItemsToDelete = _useState2[1];
|
|
48
|
+
var _useState3 = useState(),
|
|
49
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
50
|
+
table = _useState4[0],
|
|
51
|
+
setTable = _useState4[1];
|
|
35
52
|
useEffect(function initializeTable() {
|
|
36
53
|
var tablePromise;
|
|
37
54
|
function initTable() {
|
package/dist/FileExplorer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileExplorer.js","names":["BasicModal","Log","PromiseUtils","React","useCallback","useEffect","useMemo","useState","DEFAULT_ROW_HEIGHT","isDirectory","FileListContainer","FileUtils","FileExistsError","FileNotFoundError","jsx","_jsx","jsxs","_jsxs","log","module","FileExplorer","props","storage","isMultiSelect","focusedPath","onCopy","undefined","onDelete","onRename","onCreateFile","onCreateFolder","onSelect","onSelectionChange","rowHeight","itemsToDelete","setItemsToDelete","table","setTable","initializeTable","tablePromise","initTable","_initTable","apply","arguments","_asyncToGenerator","debug","makeCancelable","getTable","t","close","e","isCanceled","error","cancel","handleError","handleCreateFile","handleCreateFolder","handleCopyFile","file","filename","handleDelete","files","handleDeleteConfirm","forEach","deleteFile","makePath","handleDeleteCancel","handleMove","path","filesToMove","reducePaths","map","newFile","isPath","concat","getBaseName","substring","length","moveFile","then","catch","handleRename","item","newName","name","isDir","endsWith","destination","getParent","debug2","handleValidateRename","_ref","renameItem","basename","validateName","newValue","getPath","fileInfo","info","_x","_x2","isDeleteConfirmationShown","deleteConfirmationMessage","className","children","showContextMenu","onMove","validateRename","isOpen","headerText","bodyText","onCancel","onConfirm","confirmButtonText","displayName"],"sources":["../src/FileExplorer.tsx"],"sourcesContent":["import { BasicModal } from '@deephaven/components';\nimport Log from '@deephaven/log';\nimport { type CancelablePromise, PromiseUtils } from '@deephaven/utils';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { DEFAULT_ROW_HEIGHT } from './FileListUtils';\nimport {\n type FileStorageItem,\n type FileStorageTable,\n isDirectory,\n} from './FileStorage';\nimport type FileStorage from './FileStorage';\nimport './FileExplorer.scss';\nimport FileListContainer from './FileListContainer';\nimport FileUtils from './FileUtils';\nimport FileExistsError from './FileExistsError';\nimport FileNotFoundError from './FileNotFoundError';\n\nconst log = Log.module('FileExplorer');\n\nexport interface FileExplorerProps {\n storage: FileStorage;\n\n isMultiSelect?: boolean;\n focusedPath?: string;\n\n onCopy?: (file: FileStorageItem) => void;\n onCreateFile?: () => void;\n onCreateFolder?: () => void;\n onDelete?: (files: FileStorageItem[]) => void;\n onRename?: (oldName: string, newName: string) => void;\n onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => 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 function FileExplorer(props: FileExplorerProps): JSX.Element {\n const {\n storage,\n isMultiSelect = false,\n focusedPath,\n onCopy = () => undefined,\n onDelete = () => undefined,\n onRename = () => undefined,\n onCreateFile = () => undefined,\n onCreateFolder = () => undefined,\n onSelect,\n onSelectionChange,\n rowHeight = DEFAULT_ROW_HEIGHT,\n } = props;\n const [itemsToDelete, setItemsToDelete] = useState<FileStorageItem[]>([]);\n const [table, setTable] = useState<FileStorageTable>();\n\n useEffect(\n function initializeTable() {\n let tablePromise: CancelablePromise<FileStorageTable>;\n async function initTable(): Promise<void> {\n log.debug('initTable');\n\n tablePromise = PromiseUtils.makeCancelable(storage.getTable(), t =>\n t.close()\n );\n\n try {\n setTable(await tablePromise);\n } catch (e) {\n if (!PromiseUtils.isCanceled(e)) {\n log.error('Unable to initialize table', e);\n }\n }\n }\n initTable();\n return () => {\n tablePromise.cancel();\n };\n },\n [storage]\n );\n\n const handleError = useCallback((e: Error) => {\n if (!PromiseUtils.isCanceled(e)) {\n log.error(e);\n }\n }, []);\n\n const handleCreateFile = useCallback(() => {\n log.debug('handleCreateFile');\n onCreateFile();\n }, [onCreateFile]);\n\n const handleCreateFolder = useCallback(() => {\n log.debug('handleCreateFolder');\n onCreateFolder();\n }, [onCreateFolder]);\n\n const handleCopyFile = useCallback(\n (file: FileStorageItem) => {\n log.debug('handleCopyFile', file.filename);\n onCopy(file);\n },\n [onCopy]\n );\n\n const handleDelete = useCallback((files: FileStorageItem[]) => {\n log.debug('handleDelete, pending confirmation', files);\n setItemsToDelete(files);\n }, []);\n\n const handleDeleteConfirm = useCallback(() => {\n log.debug('handleDeleteConfirm', itemsToDelete);\n itemsToDelete.forEach(file =>\n storage.deleteFile(\n isDirectory(file) ? FileUtils.makePath(file.filename) : file.filename\n )\n );\n onDelete(itemsToDelete);\n setItemsToDelete([]);\n }, [itemsToDelete, onDelete, storage]);\n\n const handleDeleteCancel = useCallback(() => {\n log.debug('handleDeleteCancel');\n setItemsToDelete([]);\n }, []);\n\n const handleMove = useCallback(\n (files: FileStorageItem[], path: string) => {\n const filesToMove = FileUtils.reducePaths(\n files.map(file =>\n isDirectory(file) ? FileUtils.makePath(file.filename) : file.filename\n )\n );\n\n filesToMove.forEach(file => {\n const newFile = FileUtils.isPath(file)\n ? `${path}${FileUtils.getBaseName(\n file.substring(0, file.length - 1)\n )}/`\n : `${path}${FileUtils.getBaseName(file)}`;\n storage\n .moveFile(file, newFile)\n .then(() => {\n // Each moved file triggers a rename so parent knows something has happened\n // We signal each individually if for some reason there's an error moving one of the files\n onRename(file, newFile);\n })\n .catch(handleError);\n });\n },\n [handleError, onRename, storage]\n );\n\n const handleRename = useCallback(\n (item: FileStorageItem, newName: string) => {\n let name = item.filename;\n const isDir = isDirectory(item);\n if (isDir && !name.endsWith('/')) {\n name = `${name}/`;\n }\n let destination = `${FileUtils.getParent(name)}${newName}`;\n if (isDir && !destination.endsWith('/')) {\n destination = `${destination}/`;\n }\n log.debug2('handleRename', name, destination);\n storage.moveFile(name, destination).catch(handleError);\n onRename(name, destination);\n },\n [handleError, onRename, storage]\n );\n\n const handleValidateRename = useCallback(\n async (renameItem: FileStorageItem, newName: string): Promise<void> => {\n if (newName === renameItem.basename) {\n // Same name is fine\n return undefined;\n }\n FileUtils.validateName(newName);\n\n const newValue = `${FileUtils.getPath(renameItem.filename)}${newName}`;\n try {\n const fileInfo = await storage.info(newValue);\n throw new FileExistsError(fileInfo);\n } catch (e) {\n if (!(e instanceof FileNotFoundError)) {\n throw e;\n }\n // The file does not exist, fine to save at that path\n }\n },\n [storage]\n );\n\n const isDeleteConfirmationShown = itemsToDelete.length > 0;\n const deleteConfirmationMessage = useMemo(() => {\n if (itemsToDelete.length === 1) {\n return `Are you sure you want to delete \"${itemsToDelete[0].filename}\"?`;\n }\n return `Are you sure you want to delete the selected files?`;\n }, [itemsToDelete]);\n\n return (\n <div className=\"file-explorer\">\n {table && (\n <FileListContainer\n isMultiSelect={isMultiSelect}\n focusedPath={focusedPath}\n showContextMenu\n onCopy={handleCopyFile}\n onCreateFolder={handleCreateFolder}\n onCreateFile={handleCreateFile}\n onMove={handleMove}\n onDelete={handleDelete}\n onRename={handleRename}\n onSelect={onSelect}\n onSelectionChange={onSelectionChange}\n rowHeight={rowHeight}\n table={table}\n validateRename={handleValidateRename}\n />\n )}\n <BasicModal\n isOpen={isDeleteConfirmationShown}\n headerText={deleteConfirmationMessage}\n bodyText=\"You cannot undo this action.\"\n onCancel={handleDeleteCancel}\n onConfirm={handleDeleteConfirm}\n confirmButtonText=\"Delete\"\n />\n </div>\n );\n}\n\nFileExplorer.displayName = 'FileExplorer';\n\nexport default FileExplorer;\n"],"mappings":";;AAAA,SAASA,UAAU,QAAQ,uBAAuB;AAClD,OAAOC,GAAG,MAAM,gBAAgB;AAChC,SAAiCC,YAAY,QAAQ,kBAAkB;AACvE,OAAOC,KAAK,IAAIC,WAAW,EAAEC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AAAC,SAChEC,kBAAkB;AAAA,SAIzBC,WAAW;AAAA;AAAA,OAINC,iBAAiB;AAAA,OACjBC,SAAS;AAAA,OACTC,eAAe;AAAA,OACfC,iBAAiB;AAAA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAExB,IAAMC,GAAG,GAAGjB,GAAG,CAACkB,MAAM,CAAC,cAAc,CAAC;AAoBtC;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAACC,KAAwB,EAAe;EAClE,IAAM;IACJC,OAAO;IACPC,aAAa,GAAG,KAAK;IACrBC,WAAW;IACXC,MAAM,GAAGA,CAAA,KAAMC,SAAS;IACxBC,QAAQ,GAAGA,CAAA,KAAMD,SAAS;IAC1BE,QAAQ,GAAGA,CAAA,KAAMF,SAAS;IAC1BG,YAAY,GAAGA,CAAA,KAAMH,SAAS;IAC9BI,cAAc,GAAGA,CAAA,KAAMJ,SAAS;IAChCK,QAAQ;IACRC,iBAAiB;IACjBC,SAAS,GAAGzB;EACd,CAAC,GAAGa,KAAK;EACT,IAAM,CAACa,aAAa,EAAEC,gBAAgB,CAAC,GAAG5B,QAAQ,CAAoB,EAAE,CAAC;EACzE,IAAM,CAAC6B,KAAK,EAAEC,QAAQ,CAAC,GAAG9B,QAAQ,CAAmB,CAAC;EAEtDF,SAAS,CACP,SAASiC,eAAeA,CAAA,EAAG;IACzB,IAAIC,YAAiD;IAAC,SACvCC,SAASA,CAAA;MAAA,OAAAC,UAAA,CAAAC,KAAA,OAAAC,SAAA;IAAA;IAAA,SAAAF,WAAA;MAAAA,UAAA,GAAAG,iBAAA,CAAxB,aAA0C;QACxC1B,GAAG,CAAC2B,KAAK,CAAC,WAAW,CAAC;QAEtBN,YAAY,GAAGrC,YAAY,CAAC4C,cAAc,CAACxB,OAAO,CAACyB,QAAQ,CAAC,CAAC,EAAEC,CAAC,IAC9DA,CAAC,CAACC,KAAK,CAAC,CACV,CAAC;QAED,IAAI;UACFZ,QAAQ,OAAOE,YAAY,CAAC;QAC9B,CAAC,CAAC,OAAOW,CAAC,EAAE;UACV,IAAI,CAAChD,YAAY,CAACiD,UAAU,CAACD,CAAC,CAAC,EAAE;YAC/BhC,GAAG,CAACkC,KAAK,CAAC,4BAA4B,EAAEF,CAAC,CAAC;UAC5C;QACF;MACF,CAAC;MAAA,OAAAT,UAAA,CAAAC,KAAA,OAAAC,SAAA;IAAA;IACDH,SAAS,CAAC,CAAC;IACX,OAAO,MAAM;MACXD,YAAY,CAACc,MAAM,CAAC,CAAC;IACvB,CAAC;EACH,CAAC,EACD,CAAC/B,OAAO,CACV,CAAC;EAED,IAAMgC,WAAW,GAAGlD,WAAW,CAAE8C,CAAQ,IAAK;IAC5C,IAAI,CAAChD,YAAY,CAACiD,UAAU,CAACD,CAAC,CAAC,EAAE;MAC/BhC,GAAG,CAACkC,KAAK,CAACF,CAAC,CAAC;IACd;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMK,gBAAgB,GAAGnD,WAAW,CAAC,MAAM;IACzCc,GAAG,CAAC2B,KAAK,CAAC,kBAAkB,CAAC;IAC7BhB,YAAY,CAAC,CAAC;EAChB,CAAC,EAAE,CAACA,YAAY,CAAC,CAAC;EAElB,IAAM2B,kBAAkB,GAAGpD,WAAW,CAAC,MAAM;IAC3Cc,GAAG,CAAC2B,KAAK,CAAC,oBAAoB,CAAC;IAC/Bf,cAAc,CAAC,CAAC;EAClB,CAAC,EAAE,CAACA,cAAc,CAAC,CAAC;EAEpB,IAAM2B,cAAc,GAAGrD,WAAW,CAC/BsD,IAAqB,IAAK;IACzBxC,GAAG,CAAC2B,KAAK,CAAC,gBAAgB,EAAEa,IAAI,CAACC,QAAQ,CAAC;IAC1ClC,MAAM,CAACiC,IAAI,CAAC;EACd,CAAC,EACD,CAACjC,MAAM,CACT,CAAC;EAED,IAAMmC,YAAY,GAAGxD,WAAW,CAAEyD,KAAwB,IAAK;IAC7D3C,GAAG,CAAC2B,KAAK,CAAC,oCAAoC,EAAEgB,KAAK,CAAC;IACtD1B,gBAAgB,CAAC0B,KAAK,CAAC;EACzB,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMC,mBAAmB,GAAG1D,WAAW,CAAC,MAAM;IAC5Cc,GAAG,CAAC2B,KAAK,CAAC,qBAAqB,EAAEX,aAAa,CAAC;IAC/CA,aAAa,CAAC6B,OAAO,CAACL,IAAI,IACxBpC,OAAO,CAAC0C,UAAU,CAChBvD,WAAW,CAACiD,IAAI,CAAC,GAAG/C,SAAS,CAACsD,QAAQ,CAACP,IAAI,CAACC,QAAQ,CAAC,GAAGD,IAAI,CAACC,QAC/D,CACF,CAAC;IACDhC,QAAQ,CAACO,aAAa,CAAC;IACvBC,gBAAgB,CAAC,EAAE,CAAC;EACtB,CAAC,EAAE,CAACD,aAAa,EAAEP,QAAQ,EAAEL,OAAO,CAAC,CAAC;EAEtC,IAAM4C,kBAAkB,GAAG9D,WAAW,CAAC,MAAM;IAC3Cc,GAAG,CAAC2B,KAAK,CAAC,oBAAoB,CAAC;IAC/BV,gBAAgB,CAAC,EAAE,CAAC;EACtB,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMgC,UAAU,GAAG/D,WAAW,CAC5B,CAACyD,KAAwB,EAAEO,IAAY,KAAK;IAC1C,IAAMC,WAAW,GAAG1D,SAAS,CAAC2D,WAAW,CACvCT,KAAK,CAACU,GAAG,CAACb,IAAI,IACZjD,WAAW,CAACiD,IAAI,CAAC,GAAG/C,SAAS,CAACsD,QAAQ,CAACP,IAAI,CAACC,QAAQ,CAAC,GAAGD,IAAI,CAACC,QAC/D,CACF,CAAC;IAEDU,WAAW,CAACN,OAAO,CAACL,IAAI,IAAI;MAC1B,IAAMc,OAAO,GAAG7D,SAAS,CAAC8D,MAAM,CAACf,IAAI,CAAC,MAAAgB,MAAA,CAC/BN,IAAI,EAAAM,MAAA,CAAG/D,SAAS,CAACgE,WAAW,CAC7BjB,IAAI,CAACkB,SAAS,CAAC,CAAC,EAAElB,IAAI,CAACmB,MAAM,GAAG,CAAC,CACnC,CAAC,YAAAH,MAAA,CACEN,IAAI,EAAAM,MAAA,CAAG/D,SAAS,CAACgE,WAAW,CAACjB,IAAI,CAAC,CAAE;MAC3CpC,OAAO,CACJwD,QAAQ,CAACpB,IAAI,EAAEc,OAAO,CAAC,CACvBO,IAAI,CAAC,MAAM;QACV;QACA;QACAnD,QAAQ,CAAC8B,IAAI,EAAEc,OAAO,CAAC;MACzB,CAAC,CAAC,CACDQ,KAAK,CAAC1B,WAAW,CAAC;IACvB,CAAC,CAAC;EACJ,CAAC,EACD,CAACA,WAAW,EAAE1B,QAAQ,EAAEN,OAAO,CACjC,CAAC;EAED,IAAM2D,YAAY,GAAG7E,WAAW,CAC9B,CAAC8E,IAAqB,EAAEC,OAAe,KAAK;IAC1C,IAAIC,IAAI,GAAGF,IAAI,CAACvB,QAAQ;IACxB,IAAM0B,KAAK,GAAG5E,WAAW,CAACyE,IAAI,CAAC;IAC/B,IAAIG,KAAK,IAAI,CAACD,IAAI,CAACE,QAAQ,CAAC,GAAG,CAAC,EAAE;MAChCF,IAAI,MAAAV,MAAA,CAAMU,IAAI,MAAG;IACnB;IACA,IAAIG,WAAW,MAAAb,MAAA,CAAM/D,SAAS,CAAC6E,SAAS,CAACJ,IAAI,CAAC,EAAAV,MAAA,CAAGS,OAAO,CAAE;IAC1D,IAAIE,KAAK,IAAI,CAACE,WAAW,CAACD,QAAQ,CAAC,GAAG,CAAC,EAAE;MACvCC,WAAW,MAAAb,MAAA,CAAMa,WAAW,MAAG;IACjC;IACArE,GAAG,CAACuE,MAAM,CAAC,cAAc,EAAEL,IAAI,EAAEG,WAAW,CAAC;IAC7CjE,OAAO,CAACwD,QAAQ,CAACM,IAAI,EAAEG,WAAW,CAAC,CAACP,KAAK,CAAC1B,WAAW,CAAC;IACtD1B,QAAQ,CAACwD,IAAI,EAAEG,WAAW,CAAC;EAC7B,CAAC,EACD,CAACjC,WAAW,EAAE1B,QAAQ,EAAEN,OAAO,CACjC,CAAC;EAED,IAAMoE,oBAAoB,GAAGtF,WAAW;IAAA,IAAAuF,IAAA,GAAA/C,iBAAA,CACtC,WAAOgD,UAA2B,EAAET,OAAe,EAAoB;MACrE,IAAIA,OAAO,KAAKS,UAAU,CAACC,QAAQ,EAAE;QACnC;QACA,OAAOnE,SAAS;MAClB;MACAf,SAAS,CAACmF,YAAY,CAACX,OAAO,CAAC;MAE/B,IAAMY,QAAQ,MAAArB,MAAA,CAAM/D,SAAS,CAACqF,OAAO,CAACJ,UAAU,CAACjC,QAAQ,CAAC,EAAAe,MAAA,CAAGS,OAAO,CAAE;MACtE,IAAI;QACF,IAAMc,QAAQ,SAAS3E,OAAO,CAAC4E,IAAI,CAACH,QAAQ,CAAC;QAC7C,MAAM,IAAInF,eAAe,CAACqF,QAAQ,CAAC;MACrC,CAAC,CAAC,OAAO/C,CAAC,EAAE;QACV,IAAI,EAAEA,CAAC,YAAYrC,iBAAiB,CAAC,EAAE;UACrC,MAAMqC,CAAC;QACT;QACA;MACF;IACF,CAAC;IAAA,iBAAAiD,EAAA,EAAAC,GAAA;MAAA,OAAAT,IAAA,CAAAjD,KAAA,OAAAC,SAAA;IAAA;EAAA,KACD,CAACrB,OAAO,CACV,CAAC;EAED,IAAM+E,yBAAyB,GAAGnE,aAAa,CAAC2C,MAAM,GAAG,CAAC;EAC1D,IAAMyB,yBAAyB,GAAGhG,OAAO,CAAC,MAAM;IAC9C,IAAI4B,aAAa,CAAC2C,MAAM,KAAK,CAAC,EAAE;MAC9B,4CAAAH,MAAA,CAA2CxC,aAAa,CAAC,CAAC,CAAC,CAACyB,QAAQ;IACtE;IACA;EACF,CAAC,EAAE,CAACzB,aAAa,CAAC,CAAC;EAEnB,oBACEjB,KAAA;IAAKsF,SAAS,EAAC,eAAe;IAAAC,QAAA,GAC3BpE,KAAK,iBACJrB,IAAA,CAACL,iBAAiB;MAChBa,aAAa,EAAEA,aAAc;MAC7BC,WAAW,EAAEA,WAAY;MACzBiF,eAAe;MACfhF,MAAM,EAAEgC,cAAe;MACvB3B,cAAc,EAAE0B,kBAAmB;MACnC3B,YAAY,EAAE0B,gBAAiB;MAC/BmD,MAAM,EAAEvC,UAAW;MACnBxC,QAAQ,EAAEiC,YAAa;MACvBhC,QAAQ,EAAEqD,YAAa;MACvBlD,QAAQ,EAAEA,QAAS;MACnBC,iBAAiB,EAAEA,iBAAkB;MACrCC,SAAS,EAAEA,SAAU;MACrBG,KAAK,EAAEA,KAAM;MACbuE,cAAc,EAAEjB;IAAqB,CACtC,CACF,eACD3E,IAAA,CAACf,UAAU;MACT4G,MAAM,EAAEP,yBAA0B;MAClCQ,UAAU,EAAEP,yBAA0B;MACtCQ,QAAQ,EAAC,8BAA8B;MACvCC,QAAQ,EAAE7C,kBAAmB;MAC7B8C,SAAS,EAAElD,mBAAoB;MAC/BmD,iBAAiB,EAAC;IAAQ,CAC3B,CAAC;EAAA,CACC,CAAC;AAEV;AAEA7F,YAAY,CAAC8F,WAAW,GAAG,cAAc;AAEzC,eAAe9F,YAAY","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"FileExplorer.js","names":["BasicModal","Log","PromiseUtils","React","useCallback","useEffect","useMemo","useState","DEFAULT_ROW_HEIGHT","isDirectory","FileListContainer","FileUtils","FileExistsError","FileNotFoundError","jsx","_jsx","jsxs","_jsxs","log","module","FileExplorer","props","storage","_props$isMultiSelect","isMultiSelect","focusedPath","_props$onCopy","onCopy","undefined","_props$onDelete","onDelete","_props$onRename","onRename","_props$onCreateFile","onCreateFile","_props$onCreateFolder","onCreateFolder","onSelect","onSelectionChange","_props$rowHeight","rowHeight","_useState","_useState2","_slicedToArray","itemsToDelete","setItemsToDelete","_useState3","_useState4","table","setTable","initializeTable","tablePromise","initTable","_initTable","apply","arguments","_asyncToGenerator","debug","makeCancelable","getTable","t","close","e","isCanceled","error","cancel","handleError","handleCreateFile","handleCreateFolder","handleCopyFile","file","filename","handleDelete","files","handleDeleteConfirm","forEach","deleteFile","makePath","handleDeleteCancel","handleMove","path","filesToMove","reducePaths","map","newFile","isPath","concat","getBaseName","substring","length","moveFile","then","catch","handleRename","item","newName","name","isDir","endsWith","destination","getParent","debug2","handleValidateRename","_ref","renameItem","basename","validateName","newValue","getPath","fileInfo","info","_x","_x2","isDeleteConfirmationShown","deleteConfirmationMessage","className","children","showContextMenu","onMove","validateRename","isOpen","headerText","bodyText","onCancel","onConfirm","confirmButtonText","displayName"],"sources":["../src/FileExplorer.tsx"],"sourcesContent":["import { BasicModal } from '@deephaven/components';\nimport Log from '@deephaven/log';\nimport { type CancelablePromise, PromiseUtils } from '@deephaven/utils';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { DEFAULT_ROW_HEIGHT } from './FileListUtils';\nimport {\n type FileStorageItem,\n type FileStorageTable,\n isDirectory,\n} from './FileStorage';\nimport type FileStorage from './FileStorage';\nimport './FileExplorer.scss';\nimport FileListContainer from './FileListContainer';\nimport FileUtils from './FileUtils';\nimport FileExistsError from './FileExistsError';\nimport FileNotFoundError from './FileNotFoundError';\n\nconst log = Log.module('FileExplorer');\n\nexport interface FileExplorerProps {\n storage: FileStorage;\n\n isMultiSelect?: boolean;\n focusedPath?: string;\n\n onCopy?: (file: FileStorageItem) => void;\n onCreateFile?: () => void;\n onCreateFolder?: () => void;\n onDelete?: (files: FileStorageItem[]) => void;\n onRename?: (oldName: string, newName: string) => void;\n onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => 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 function FileExplorer(props: FileExplorerProps): JSX.Element {\n const {\n storage,\n isMultiSelect = false,\n focusedPath,\n onCopy = () => undefined,\n onDelete = () => undefined,\n onRename = () => undefined,\n onCreateFile = () => undefined,\n onCreateFolder = () => undefined,\n onSelect,\n onSelectionChange,\n rowHeight = DEFAULT_ROW_HEIGHT,\n } = props;\n const [itemsToDelete, setItemsToDelete] = useState<FileStorageItem[]>([]);\n const [table, setTable] = useState<FileStorageTable>();\n\n useEffect(\n function initializeTable() {\n let tablePromise: CancelablePromise<FileStorageTable>;\n async function initTable(): Promise<void> {\n log.debug('initTable');\n\n tablePromise = PromiseUtils.makeCancelable(storage.getTable(), t =>\n t.close()\n );\n\n try {\n setTable(await tablePromise);\n } catch (e) {\n if (!PromiseUtils.isCanceled(e)) {\n log.error('Unable to initialize table', e);\n }\n }\n }\n initTable();\n return () => {\n tablePromise.cancel();\n };\n },\n [storage]\n );\n\n const handleError = useCallback((e: Error) => {\n if (!PromiseUtils.isCanceled(e)) {\n log.error(e);\n }\n }, []);\n\n const handleCreateFile = useCallback(() => {\n log.debug('handleCreateFile');\n onCreateFile();\n }, [onCreateFile]);\n\n const handleCreateFolder = useCallback(() => {\n log.debug('handleCreateFolder');\n onCreateFolder();\n }, [onCreateFolder]);\n\n const handleCopyFile = useCallback(\n (file: FileStorageItem) => {\n log.debug('handleCopyFile', file.filename);\n onCopy(file);\n },\n [onCopy]\n );\n\n const handleDelete = useCallback((files: FileStorageItem[]) => {\n log.debug('handleDelete, pending confirmation', files);\n setItemsToDelete(files);\n }, []);\n\n const handleDeleteConfirm = useCallback(() => {\n log.debug('handleDeleteConfirm', itemsToDelete);\n itemsToDelete.forEach(file =>\n storage.deleteFile(\n isDirectory(file) ? FileUtils.makePath(file.filename) : file.filename\n )\n );\n onDelete(itemsToDelete);\n setItemsToDelete([]);\n }, [itemsToDelete, onDelete, storage]);\n\n const handleDeleteCancel = useCallback(() => {\n log.debug('handleDeleteCancel');\n setItemsToDelete([]);\n }, []);\n\n const handleMove = useCallback(\n (files: FileStorageItem[], path: string) => {\n const filesToMove = FileUtils.reducePaths(\n files.map(file =>\n isDirectory(file) ? FileUtils.makePath(file.filename) : file.filename\n )\n );\n\n filesToMove.forEach(file => {\n const newFile = FileUtils.isPath(file)\n ? `${path}${FileUtils.getBaseName(\n file.substring(0, file.length - 1)\n )}/`\n : `${path}${FileUtils.getBaseName(file)}`;\n storage\n .moveFile(file, newFile)\n .then(() => {\n // Each moved file triggers a rename so parent knows something has happened\n // We signal each individually if for some reason there's an error moving one of the files\n onRename(file, newFile);\n })\n .catch(handleError);\n });\n },\n [handleError, onRename, storage]\n );\n\n const handleRename = useCallback(\n (item: FileStorageItem, newName: string) => {\n let name = item.filename;\n const isDir = isDirectory(item);\n if (isDir && !name.endsWith('/')) {\n name = `${name}/`;\n }\n let destination = `${FileUtils.getParent(name)}${newName}`;\n if (isDir && !destination.endsWith('/')) {\n destination = `${destination}/`;\n }\n log.debug2('handleRename', name, destination);\n storage.moveFile(name, destination).catch(handleError);\n onRename(name, destination);\n },\n [handleError, onRename, storage]\n );\n\n const handleValidateRename = useCallback(\n async (renameItem: FileStorageItem, newName: string): Promise<void> => {\n if (newName === renameItem.basename) {\n // Same name is fine\n return undefined;\n }\n FileUtils.validateName(newName);\n\n const newValue = `${FileUtils.getPath(renameItem.filename)}${newName}`;\n try {\n const fileInfo = await storage.info(newValue);\n throw new FileExistsError(fileInfo);\n } catch (e) {\n if (!(e instanceof FileNotFoundError)) {\n throw e;\n }\n // The file does not exist, fine to save at that path\n }\n },\n [storage]\n );\n\n const isDeleteConfirmationShown = itemsToDelete.length > 0;\n const deleteConfirmationMessage = useMemo(() => {\n if (itemsToDelete.length === 1) {\n return `Are you sure you want to delete \"${itemsToDelete[0].filename}\"?`;\n }\n return `Are you sure you want to delete the selected files?`;\n }, [itemsToDelete]);\n\n return (\n <div className=\"file-explorer\">\n {table && (\n <FileListContainer\n isMultiSelect={isMultiSelect}\n focusedPath={focusedPath}\n showContextMenu\n onCopy={handleCopyFile}\n onCreateFolder={handleCreateFolder}\n onCreateFile={handleCreateFile}\n onMove={handleMove}\n onDelete={handleDelete}\n onRename={handleRename}\n onSelect={onSelect}\n onSelectionChange={onSelectionChange}\n rowHeight={rowHeight}\n table={table}\n validateRename={handleValidateRename}\n />\n )}\n <BasicModal\n isOpen={isDeleteConfirmationShown}\n headerText={deleteConfirmationMessage}\n bodyText=\"You cannot undo this action.\"\n onCancel={handleDeleteCancel}\n onConfirm={handleDeleteConfirm}\n confirmButtonText=\"Delete\"\n />\n </div>\n );\n}\n\nFileExplorer.displayName = 'FileExplorer';\n\nexport default FileExplorer;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -4,12 +4,11 @@ import { vsNewFile, vsNewFolder } from '@deephaven/icons';
|
|
|
4
4
|
import "./FileExplorerToolbar.css";
|
|
5
5
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
6
6
|
export function FileExplorerToolbar(_ref) {
|
|
7
|
-
var
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
defaultSearchText = ''
|
|
12
|
-
} = _ref;
|
|
7
|
+
var createFile = _ref.createFile,
|
|
8
|
+
createFolder = _ref.createFolder,
|
|
9
|
+
onSearchChange = _ref.onSearchChange,
|
|
10
|
+
_ref$defaultSearchTex = _ref.defaultSearchText,
|
|
11
|
+
defaultSearchText = _ref$defaultSearchTex === void 0 ? '' : _ref$defaultSearchTex;
|
|
13
12
|
return /*#__PURE__*/_jsxs("div", {
|
|
14
13
|
className: "file-explorer-toolbar",
|
|
15
14
|
children: [/*#__PURE__*/_jsxs("div", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileExplorerToolbar.js","names":["React","Button","DebouncedSearchInput","vsNewFile","vsNewFolder","jsx","_jsx","jsxs","_jsxs","FileExplorerToolbar","_ref","createFile","createFolder","onSearchChange","defaultSearchText","className","children","kind","icon","tooltip","onClick","value","onChange","placeholder"],"sources":["../src/FileExplorerToolbar.tsx"],"sourcesContent":["import React from 'react';\nimport { Button, DebouncedSearchInput } from '@deephaven/components';\nimport { vsNewFile, vsNewFolder } from '@deephaven/icons';\nimport './FileExplorerToolbar.scss';\n\ntype FileExplorerToolbarProps = {\n createFile: () => void;\n createFolder: () => void;\n onSearchChange?: (text: string) => void;\n defaultSearchText?: string;\n};\n\nexport function FileExplorerToolbar({\n createFile,\n createFolder,\n onSearchChange,\n defaultSearchText = '',\n}: FileExplorerToolbarProps): JSX.Element {\n return (\n <div className=\"file-explorer-toolbar\">\n <div className=\"file-explorer-toolbar-buttons\">\n <Button\n kind=\"ghost\"\n icon={vsNewFile}\n tooltip=\"New notebook\"\n onClick={createFile}\n aria-label=\"New notebook\"\n />\n <Button\n kind=\"ghost\"\n icon={vsNewFolder}\n tooltip=\"New folder\"\n onClick={createFolder}\n aria-label=\"New folder\"\n />\n </div>\n {onSearchChange && (\n <div className=\"file-explorer-toolbar-search\">\n <DebouncedSearchInput\n value={defaultSearchText}\n onChange={onSearchChange}\n placeholder=\"Search by name\"\n />\n </div>\n )}\n </div>\n );\n}\n\nexport default FileExplorerToolbar;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,MAAM,EAAEC,oBAAoB,QAAQ,uBAAuB;AACpE,SAASC,SAAS,EAAEC,WAAW,QAAQ,kBAAkB;AAAC;AAAA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAU1D,OAAO,SAASC,mBAAmBA,CAAAC,IAAA,EAKO;EAAA,
|
|
1
|
+
{"version":3,"file":"FileExplorerToolbar.js","names":["React","Button","DebouncedSearchInput","vsNewFile","vsNewFolder","jsx","_jsx","jsxs","_jsxs","FileExplorerToolbar","_ref","createFile","createFolder","onSearchChange","_ref$defaultSearchTex","defaultSearchText","className","children","kind","icon","tooltip","onClick","value","onChange","placeholder"],"sources":["../src/FileExplorerToolbar.tsx"],"sourcesContent":["import React from 'react';\nimport { Button, DebouncedSearchInput } from '@deephaven/components';\nimport { vsNewFile, vsNewFolder } from '@deephaven/icons';\nimport './FileExplorerToolbar.scss';\n\ntype FileExplorerToolbarProps = {\n createFile: () => void;\n createFolder: () => void;\n onSearchChange?: (text: string) => void;\n defaultSearchText?: string;\n};\n\nexport function FileExplorerToolbar({\n createFile,\n createFolder,\n onSearchChange,\n defaultSearchText = '',\n}: FileExplorerToolbarProps): JSX.Element {\n return (\n <div className=\"file-explorer-toolbar\">\n <div className=\"file-explorer-toolbar-buttons\">\n <Button\n kind=\"ghost\"\n icon={vsNewFile}\n tooltip=\"New notebook\"\n onClick={createFile}\n aria-label=\"New notebook\"\n />\n <Button\n kind=\"ghost\"\n icon={vsNewFolder}\n tooltip=\"New folder\"\n onClick={createFolder}\n aria-label=\"New folder\"\n />\n </div>\n {onSearchChange && (\n <div className=\"file-explorer-toolbar-search\">\n <DebouncedSearchInput\n value={defaultSearchText}\n onChange={onSearchChange}\n placeholder=\"Search by name\"\n />\n </div>\n )}\n </div>\n );\n}\n\nexport default FileExplorerToolbar;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,MAAM,EAAEC,oBAAoB,QAAQ,uBAAuB;AACpE,SAASC,SAAS,EAAEC,WAAW,QAAQ,kBAAkB;AAAC;AAAA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAU1D,OAAO,SAASC,mBAAmBA,CAAAC,IAAA,EAKO;EAAA,IAJxCC,UAAU,GAAAD,IAAA,CAAVC,UAAU;IACVC,YAAY,GAAAF,IAAA,CAAZE,YAAY;IACZC,cAAc,GAAAH,IAAA,CAAdG,cAAc;IAAAC,qBAAA,GAAAJ,IAAA,CACdK,iBAAiB;IAAjBA,iBAAiB,GAAAD,qBAAA,cAAG,EAAE,GAAAA,qBAAA;EAEtB,oBACEN,KAAA;IAAKQ,SAAS,EAAC,uBAAuB;IAAAC,QAAA,gBACpCT,KAAA;MAAKQ,SAAS,EAAC,+BAA+B;MAAAC,QAAA,gBAC5CX,IAAA,CAACL,MAAM;QACLiB,IAAI,EAAC,OAAO;QACZC,IAAI,EAAEhB,SAAU;QAChBiB,OAAO,EAAC,cAAc;QACtBC,OAAO,EAAEV,UAAW;QACpB,cAAW;MAAc,CAC1B,CAAC,eACFL,IAAA,CAACL,MAAM;QACLiB,IAAI,EAAC,OAAO;QACZC,IAAI,EAAEf,WAAY;QAClBgB,OAAO,EAAC,YAAY;QACpBC,OAAO,EAAET,YAAa;QACtB,cAAW;MAAY,CACxB,CAAC;IAAA,CACC,CAAC,EACLC,cAAc,iBACbP,IAAA;MAAKU,SAAS,EAAC,8BAA8B;MAAAC,QAAA,eAC3CX,IAAA,CAACJ,oBAAoB;QACnBoB,KAAK,EAAEP,iBAAkB;QACzBQ,QAAQ,EAAEV,cAAe;QACzBW,WAAW,EAAC;MAAgB,CAC7B;IAAC,CACC,CACN;EAAA,CACE,CAAC;AAEV;AAEA,eAAef,mBAAmB","ignoreList":[]}
|
package/dist/FileList.js
CHANGED
|
@@ -3,6 +3,12 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
3
3
|
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
4
4
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
5
5
|
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
6
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
7
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
8
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
9
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
10
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
11
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
6
12
|
import { ItemList } from '@deephaven/components';
|
|
7
13
|
import Log from '@deephaven/log';
|
|
8
14
|
import { RangeUtils } from '@deephaven/utils';
|
|
@@ -22,30 +28,52 @@ var ITEM_LIST_CLASS_NAME = 'item-list-scroll-pane';
|
|
|
22
28
|
* Component that displays and allows interaction with the file system in the provided FileStorageTable.
|
|
23
29
|
*/
|
|
24
30
|
export function FileList(props) {
|
|
25
|
-
var
|
|
26
|
-
isMultiSelect = false,
|
|
27
|
-
table,
|
|
28
|
-
onFocusChange =
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
var
|
|
31
|
+
var _props$isMultiSelect = props.isMultiSelect,
|
|
32
|
+
isMultiSelect = _props$isMultiSelect === void 0 ? false : _props$isMultiSelect,
|
|
33
|
+
table = props.table,
|
|
34
|
+
_props$onFocusChange = props.onFocusChange,
|
|
35
|
+
onFocusChange = _props$onFocusChange === void 0 ? () => undefined : _props$onFocusChange,
|
|
36
|
+
onMove = props.onMove,
|
|
37
|
+
onSelect = props.onSelect,
|
|
38
|
+
_props$onSelectionCha = props.onSelectionChange,
|
|
39
|
+
onSelectionChange = _props$onSelectionCha === void 0 ? () => undefined : _props$onSelectionCha,
|
|
40
|
+
_props$renderItem = props.renderItem,
|
|
41
|
+
renderItem = _props$renderItem === void 0 ? FileListItem : _props$renderItem,
|
|
42
|
+
_props$rowHeight = props.rowHeight,
|
|
43
|
+
rowHeight = _props$rowHeight === void 0 ? DEFAULT_ROW_HEIGHT : _props$rowHeight,
|
|
44
|
+
_props$overscanCount = props.overscanCount,
|
|
45
|
+
overscanCount = _props$overscanCount === void 0 ? ItemList.DEFAULT_OVERSCAN : _props$overscanCount;
|
|
46
|
+
var _useState = useState(() => ({
|
|
47
|
+
items: [],
|
|
48
|
+
offset: 0,
|
|
49
|
+
itemCount: 0
|
|
50
|
+
})),
|
|
51
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
52
|
+
loadedViewport = _useState2[0],
|
|
53
|
+
setLoadedViewport = _useState2[1];
|
|
54
|
+
var _useState3 = useState({
|
|
55
|
+
top: 0,
|
|
56
|
+
bottom: 0
|
|
57
|
+
}),
|
|
58
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
59
|
+
viewport = _useState4[0],
|
|
60
|
+
setViewport = _useState4[1];
|
|
61
|
+
var _useState5 = useState(),
|
|
62
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
63
|
+
dropTargetItem = _useState6[0],
|
|
64
|
+
setDropTargetItem = _useState6[1];
|
|
65
|
+
var _useState7 = useState(),
|
|
66
|
+
_useState8 = _slicedToArray(_useState7, 2),
|
|
67
|
+
draggedItems = _useState8[0],
|
|
68
|
+
setDraggedItems = _useState8[1];
|
|
69
|
+
var _useState9 = useState(),
|
|
70
|
+
_useState0 = _slicedToArray(_useState9, 2),
|
|
71
|
+
dragPlaceholder = _useState0[0],
|
|
72
|
+
setDragPlaceholder = _useState0[1];
|
|
73
|
+
var _useState1 = useState([]),
|
|
74
|
+
_useState10 = _slicedToArray(_useState1, 2),
|
|
75
|
+
selectedRanges = _useState10[0],
|
|
76
|
+
setSelectedRanges = _useState10[1];
|
|
49
77
|
var focusedIndex = useRef();
|
|
50
78
|
var itemList = useRef(null);
|
|
51
79
|
var fileList = useRef(null);
|
|
@@ -99,10 +127,9 @@ export function FileList(props) {
|
|
|
99
127
|
}
|
|
100
128
|
log.debug('dropItems', draggedItems, 'to', itemIndex);
|
|
101
129
|
try {
|
|
102
|
-
var
|
|
103
|
-
files,
|
|
104
|
-
targetPath
|
|
105
|
-
} = getMoveOperation(draggedItems, dropTargetItem);
|
|
130
|
+
var _getMoveOperation = getMoveOperation(draggedItems, dropTargetItem),
|
|
131
|
+
files = _getMoveOperation.files,
|
|
132
|
+
targetPath = _getMoveOperation.targetPath;
|
|
106
133
|
onMove === null || onMove === void 0 || onMove(files, targetPath);
|
|
107
134
|
if (itemIndex != null) {
|
|
108
135
|
var _itemList$current;
|
|
@@ -200,7 +227,9 @@ export function FileList(props) {
|
|
|
200
227
|
var handleFocusChange = useCallback(focusIndex => {
|
|
201
228
|
log.debug2('handleFocusChange', focusIndex);
|
|
202
229
|
if (focusIndex != null) {
|
|
203
|
-
var
|
|
230
|
+
var _getItems = getItems([[focusIndex, focusIndex]]),
|
|
231
|
+
_getItems2 = _slicedToArray(_getItems, 1),
|
|
232
|
+
focusedItem = _getItems2[0];
|
|
204
233
|
onFocusChange(focusedItem);
|
|
205
234
|
} else {
|
|
206
235
|
onFocusChange();
|
|
@@ -229,9 +258,7 @@ export function FileList(props) {
|
|
|
229
258
|
return false;
|
|
230
259
|
}
|
|
231
260
|
}, [draggedItems, dropTargetItem]);
|
|
232
|
-
var
|
|
233
|
-
focusedPath
|
|
234
|
-
} = props;
|
|
261
|
+
var focusedPath = props.focusedPath;
|
|
235
262
|
useEffect(() => {
|
|
236
263
|
if (focusedPath !== undefined) {
|
|
237
264
|
if (focusedPath === '/') {
|
package/dist/FileList.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileList.js","names":["ItemList","Log","RangeUtils","classNames","React","useCallback","useEffect","useMemo","useRef","useState","isDirectory","DEFAULT_ROW_HEIGHT","getMoveOperation","FileListItem","jsx","_jsx","log","module","DRAG_HOVER_TIMEOUT","ITEM_LIST_CLASS_NAME","FileList","props","isMultiSelect","table","onFocusChange","undefined","onMove","onSelect","onSelectionChange","renderItem","rowHeight","overscanCount","DEFAULT_OVERSCAN","loadedViewport","setLoadedViewport","items","offset","itemCount","viewport","setViewport","top","bottom","dropTargetItem","setDropTargetItem","draggedItems","setDraggedItems","dragPlaceholder","setDragPlaceholder","selectedRanges","setSelectedRanges","focusedIndex","itemList","fileList","getItems","ranges","length","i","range","j","push","getItem","itemIndex","getDragPlaceholderText","count","index","item","filename","concat","dropItems","debug","files","targetPath","_itemList$current","current","focusItem","err","error","handleSelect","event","setExpanded","isExpanded","handleItemDragStart","e","_itemList$current2","_getDragPlaceholderTe","debug2","draggedRanges","isSelected","resetMouseState","newDragPlaceholder","document","createElement","dndPlaceholderContent","className","innerText","appendChild","body","dataTransfer","setDragImage","effectAllowed","handleItemDragOver","preventDefault","handleItemDragEnd","remove","handleItemDrop","handleItemDragExit","handleListDragOver","target","Element","classList","contains","type","basename","id","handleListDrop","handleSelectionChange","newSelectedRanges","force","arguments","selectedItems","handleFocusChange","focusIndex","focusedItem","handleViewportChange","isDropTargetValid","focusedPath","collapseAll","updateTableViewport","Math","max","setLoadedViewportAndReturnCleanup","listenerRemover","onUpdate","newViewport","map","_objectSpread","itemName","size","updateFocusAndSelection","expandFolderOnHover","timeout","setTimeout","clearTimeout","renderWrapper","itemProps","isDragInProgress","onDragStart","onDragEnd","onDragOver","onDragExit","onDrop","ref","children","onViewportChange","isDragSelect","isDeselectOnClick"],"sources":["../src/FileList.tsx"],"sourcesContent":["import {\n ItemList,\n type Range,\n type RenderItemProps,\n} from '@deephaven/components';\nimport Log from '@deephaven/log';\nimport { RangeUtils } from '@deephaven/utils';\nimport classNames from 'classnames';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n type FileStorageItem,\n type FileStorageTable,\n isDirectory,\n} from './FileStorage';\nimport './FileList.scss';\nimport { DEFAULT_ROW_HEIGHT, getMoveOperation } from './FileListUtils';\nimport { FileListItem, type FileListRenderItemProps } from './FileListItem';\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 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\n// How long you need to hover over a directory before it expands\nconst DRAG_HOVER_TIMEOUT = 500;\n\nconst ITEM_LIST_CLASS_NAME = 'item-list-scroll-pane';\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorageTable.\n */\nexport function FileList(props: FileListProps): JSX.Element {\n const {\n isMultiSelect = false,\n table,\n onFocusChange = () => undefined,\n onMove,\n onSelect,\n onSelectionChange = () => undefined,\n renderItem = FileListItem,\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 readonly Range[]);\n\n const focusedIndex = useRef<number | null>();\n\n const itemList = useRef<ItemList<FileStorageItem>>(null);\n const fileList = useRef<HTMLDivElement>(null);\n\n const getItems = useCallback(\n (ranges: readonly 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 const dndPlaceholderContent = document.createElement('div');\n dndPlaceholderContent.className = 'dnd-placeholder-content';\n dndPlaceholderContent.innerText = getDragPlaceholderText() ?? '';\n newDragPlaceholder.appendChild(dndPlaceholderContent);\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: readonly Range[], force = false) => {\n log.debug2('handleSelectionChange', newSelectedRanges);\n if (force === true || 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: number | null) => {\n log.debug2('handleFocusChange', focusIndex);\n if (focusIndex != null) {\n const [focusedItem] = getItems([[focusIndex, focusIndex]]);\n onFocusChange(focusedItem);\n } else {\n onFocusChange();\n }\n focusedIndex.current = focusIndex;\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 // if the loadedViewport changes, re-fire the focused\n // item and the selected range items as they could have\n // been updated\n useEffect(\n function updateFocusAndSelection() {\n if (focusedIndex.current != null) {\n handleFocusChange(focusedIndex.current);\n }\n if (selectedRanges.length > 0) {\n // force the update, as the selected range may be the same\n // but the selected items may now be different\n handleSelectionChange(selectedRanges, true);\n }\n },\n [loadedViewport, handleFocusChange, handleSelectionChange, selectedRanges]\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: RenderItemProps<FileStorageItem>) =>\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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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"FileList.js","names":["ItemList","Log","RangeUtils","classNames","React","useCallback","useEffect","useMemo","useRef","useState","isDirectory","DEFAULT_ROW_HEIGHT","getMoveOperation","FileListItem","jsx","_jsx","log","module","DRAG_HOVER_TIMEOUT","ITEM_LIST_CLASS_NAME","FileList","props","_props$isMultiSelect","isMultiSelect","table","_props$onFocusChange","onFocusChange","undefined","onMove","onSelect","_props$onSelectionCha","onSelectionChange","_props$renderItem","renderItem","_props$rowHeight","rowHeight","_props$overscanCount","overscanCount","DEFAULT_OVERSCAN","_useState","items","offset","itemCount","_useState2","_slicedToArray","loadedViewport","setLoadedViewport","_useState3","top","bottom","_useState4","viewport","setViewport","_useState5","_useState6","dropTargetItem","setDropTargetItem","_useState7","_useState8","draggedItems","setDraggedItems","_useState9","_useState0","dragPlaceholder","setDragPlaceholder","_useState1","_useState10","selectedRanges","setSelectedRanges","focusedIndex","itemList","fileList","getItems","ranges","length","i","range","j","push","getItem","itemIndex","getDragPlaceholderText","count","index","item","filename","concat","dropItems","debug","_getMoveOperation","files","targetPath","_itemList$current","current","focusItem","err","error","handleSelect","event","setExpanded","isExpanded","handleItemDragStart","e","_itemList$current2","_getDragPlaceholderTe","debug2","draggedRanges","isSelected","resetMouseState","newDragPlaceholder","document","createElement","dndPlaceholderContent","className","innerText","appendChild","body","dataTransfer","setDragImage","effectAllowed","handleItemDragOver","preventDefault","handleItemDragEnd","remove","handleItemDrop","handleItemDragExit","handleListDragOver","target","Element","classList","contains","type","basename","id","handleListDrop","handleSelectionChange","newSelectedRanges","force","arguments","selectedItems","handleFocusChange","focusIndex","_getItems","_getItems2","focusedItem","handleViewportChange","isDropTargetValid","focusedPath","collapseAll","updateTableViewport","Math","max","setLoadedViewportAndReturnCleanup","listenerRemover","onUpdate","newViewport","map","_objectSpread","itemName","size","updateFocusAndSelection","expandFolderOnHover","timeout","setTimeout","clearTimeout","renderWrapper","itemProps","isDragInProgress","onDragStart","onDragEnd","onDragOver","onDragExit","onDrop","ref","children","onViewportChange","isDragSelect","isDeselectOnClick"],"sources":["../src/FileList.tsx"],"sourcesContent":["import {\n ItemList,\n type Range,\n type RenderItemProps,\n} from '@deephaven/components';\nimport Log from '@deephaven/log';\nimport { RangeUtils } from '@deephaven/utils';\nimport classNames from 'classnames';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n type FileStorageItem,\n type FileStorageTable,\n isDirectory,\n} from './FileStorage';\nimport './FileList.scss';\nimport { DEFAULT_ROW_HEIGHT, getMoveOperation } from './FileListUtils';\nimport { FileListItem, type FileListRenderItemProps } from './FileListItem';\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 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\n// How long you need to hover over a directory before it expands\nconst DRAG_HOVER_TIMEOUT = 500;\n\nconst ITEM_LIST_CLASS_NAME = 'item-list-scroll-pane';\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorageTable.\n */\nexport function FileList(props: FileListProps): JSX.Element {\n const {\n isMultiSelect = false,\n table,\n onFocusChange = () => undefined,\n onMove,\n onSelect,\n onSelectionChange = () => undefined,\n renderItem = FileListItem,\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 readonly Range[]);\n\n const focusedIndex = useRef<number | null>();\n\n const itemList = useRef<ItemList<FileStorageItem>>(null);\n const fileList = useRef<HTMLDivElement>(null);\n\n const getItems = useCallback(\n (ranges: readonly 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 const dndPlaceholderContent = document.createElement('div');\n dndPlaceholderContent.className = 'dnd-placeholder-content';\n dndPlaceholderContent.innerText = getDragPlaceholderText() ?? '';\n newDragPlaceholder.appendChild(dndPlaceholderContent);\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: readonly Range[], force = false) => {\n log.debug2('handleSelectionChange', newSelectedRanges);\n if (force === true || 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: number | null) => {\n log.debug2('handleFocusChange', focusIndex);\n if (focusIndex != null) {\n const [focusedItem] = getItems([[focusIndex, focusIndex]]);\n onFocusChange(focusedItem);\n } else {\n onFocusChange();\n }\n focusedIndex.current = focusIndex;\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 // if the loadedViewport changes, re-fire the focused\n // item and the selected range items as they could have\n // been updated\n useEffect(\n function updateFocusAndSelection() {\n if (focusedIndex.current != null) {\n handleFocusChange(focusedIndex.current);\n }\n if (selectedRanges.length > 0) {\n // force the update, as the selected range may be the same\n // but the selected items may now be different\n handleSelectionChange(selectedRanges, true);\n }\n },\n [loadedViewport, handleFocusChange, handleSelectionChange, selectedRanges]\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: RenderItemProps<FileStorageItem>) =>\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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","ignoreList":[]}
|
|
@@ -3,6 +3,12 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
3
3
|
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
4
4
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
5
5
|
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
6
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
7
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
8
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
9
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
10
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
11
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
6
12
|
import { ContextActions } from '@deephaven/components';
|
|
7
13
|
import { assertNotNull } from '@deephaven/utils';
|
|
8
14
|
import React, { useCallback, useMemo, useState } from 'react';
|
|
@@ -19,25 +25,36 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
19
25
|
* Component that displays and allows interaction with the file system in the provided FileStorage.
|
|
20
26
|
*/
|
|
21
27
|
export function FileListContainer(props) {
|
|
22
|
-
var
|
|
23
|
-
isMultiSelect = false,
|
|
24
|
-
focusedPath,
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
var
|
|
28
|
+
var _props$isMultiSelect = props.isMultiSelect,
|
|
29
|
+
isMultiSelect = _props$isMultiSelect === void 0 ? false : _props$isMultiSelect,
|
|
30
|
+
focusedPath = props.focusedPath,
|
|
31
|
+
_props$showContextMen = props.showContextMenu,
|
|
32
|
+
showContextMenu = _props$showContextMen === void 0 ? false : _props$showContextMen,
|
|
33
|
+
onCreateFile = props.onCreateFile,
|
|
34
|
+
onCreateFolder = props.onCreateFolder,
|
|
35
|
+
onCopy = props.onCopy,
|
|
36
|
+
onDelete = props.onDelete,
|
|
37
|
+
onMove = props.onMove,
|
|
38
|
+
onRename = props.onRename,
|
|
39
|
+
onSelect = props.onSelect,
|
|
40
|
+
onSelectionChange = props.onSelectionChange,
|
|
41
|
+
table = props.table,
|
|
42
|
+
_props$rowHeight = props.rowHeight,
|
|
43
|
+
rowHeight = _props$rowHeight === void 0 ? DEFAULT_ROW_HEIGHT : _props$rowHeight,
|
|
44
|
+
_props$validateRename = props.validateRename,
|
|
45
|
+
validateRename = _props$validateRename === void 0 ? () => Promise.resolve() : _props$validateRename;
|
|
46
|
+
var _useState = useState(),
|
|
47
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
48
|
+
renameItem = _useState2[0],
|
|
49
|
+
setRenameItem = _useState2[1];
|
|
50
|
+
var _useState3 = useState([]),
|
|
51
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
52
|
+
selectedItems = _useState4[0],
|
|
53
|
+
setSelectedItems = _useState4[1];
|
|
54
|
+
var _useState5 = useState(),
|
|
55
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
56
|
+
focusedItem = _useState6[0],
|
|
57
|
+
setFocusedItem = _useState6[1];
|
|
41
58
|
var handleSelectionChange = useCallback(newSelectedItems => {
|
|
42
59
|
setSelectedItems(newSelectedItems);
|
|
43
60
|
onSelectionChange === null || onSelectionChange === void 0 || onSelectionChange(newSelectedItems);
|
|
@@ -134,9 +151,7 @@ export function FileListContainer(props) {
|
|
|
134
151
|
return validateRename(renameItem, newName);
|
|
135
152
|
}, [renameItem, validateRename]);
|
|
136
153
|
var renderItem = useCallback(itemProps => {
|
|
137
|
-
var
|
|
138
|
-
item
|
|
139
|
-
} = itemProps;
|
|
154
|
+
var item = itemProps.item;
|
|
140
155
|
if (renameItem && renameItem.filename === item.filename) {
|
|
141
156
|
return (
|
|
142
157
|
/*#__PURE__*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileListContainer.js","names":["ContextActions","assertNotNull","React","useCallback","useMemo","useState","FileList","FileListItem","DEFAULT_ROW_HEIGHT","isDirectory","SHORTCUTS","FileUtils","FileListItemEditor","jsx","_jsx","jsxs","_jsxs","FileListContainer","props","isMultiSelect","focusedPath","showContextMenu","onCreateFile","onCreateFolder","onCopy","onDelete","onMove","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","undefined","handleRenameSubmit","newName","actions","result","push","title","description","action","group","groups","medium","low","disabled","shortcut","FILE_EXPLORER","DELETE","RENAME","validateRenameItem","renderItem","itemProps","item","_objectSpread","children","validate","onSubmit","onCancel","className","onFocusChange","displayName"],"sources":["../src/FileListContainer.tsx"],"sourcesContent":["import { type ContextAction, ContextActions } from '@deephaven/components';\nimport { assertNotNull } from '@deephaven/utils';\nimport React, { useCallback, useMemo, useState } from 'react';\nimport FileList from './FileList';\nimport { FileListItem, type FileListRenderItemProps } from './FileListItem';\nimport { DEFAULT_ROW_HEIGHT } from './FileListUtils';\nimport {\n type FileStorageItem,\n type FileStorageTable,\n isDirectory,\n} 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 function FileListContainer(props: FileListContainerProps): JSX.Element {\n const {\n isMultiSelect = false,\n focusedPath,\n showContextMenu = false,\n onCreateFile,\n onCreateFolder,\n onCopy,\n onDelete,\n onMove,\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: FileStorageItem[]) => {\n setSelectedItems(newSelectedItems);\n onSelectionChange?.(newSelectedItems);\n },\n [onSelectionChange]\n );\n\n const handleFocusChange = useCallback(\n (newFocusedItem: FileStorageItem | undefined) => {\n setFocusedItem(newFocusedItem);\n },\n []\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 File',\n description: 'Copy the selected file',\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 assertNotNull(renameItem);\n return validateRename(renameItem, newName);\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 (\n // eslint-disable-next-line react/jsx-props-no-spreading\n <FileListItem {...itemProps}>\n <FileListItemEditor\n item={item}\n validate={validateRenameItem}\n onSubmit={handleRenameSubmit}\n onCancel={handleRenameCancel}\n />\n </FileListItem>\n );\n }\n // eslint-disable-next-line react/jsx-props-no-spreading\n return <FileListItem {...itemProps} />;\n },\n [handleRenameCancel, handleRenameSubmit, renameItem, validateRenameItem]\n );\n\n return (\n <div className=\"file-list-container\">\n {table != null && (\n <FileList\n onMove={onMove}\n onSelect={onSelect}\n onSelectionChange={handleSelectionChange}\n onFocusChange={handleFocusChange}\n renderItem={renderItem}\n rowHeight={rowHeight}\n table={table}\n isMultiSelect={isMultiSelect}\n focusedPath={focusedPath}\n />\n )}\n {showContextMenu && <ContextActions actions={actions} />}\n </div>\n );\n}\n\nFileListContainer.displayName = 'FileListContainer';\n\nexport default FileListContainer;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"FileListContainer.js","names":["ContextActions","assertNotNull","React","useCallback","useMemo","useState","FileList","FileListItem","DEFAULT_ROW_HEIGHT","isDirectory","SHORTCUTS","FileUtils","FileListItemEditor","jsx","_jsx","jsxs","_jsxs","FileListContainer","props","_props$isMultiSelect","isMultiSelect","focusedPath","_props$showContextMen","showContextMenu","onCreateFile","onCreateFolder","onCopy","onDelete","onMove","onRename","onSelect","onSelectionChange","table","_props$rowHeight","rowHeight","_props$validateRename","validateRename","Promise","resolve","_useState","_useState2","_slicedToArray","renameItem","setRenameItem","_useState3","_useState4","selectedItems","setSelectedItems","_useState5","_useState6","focusedItem","setFocusedItem","handleSelectionChange","newSelectedItems","handleFocusChange","newFocusedItem","handleCopyAction","handleDeleteAction","length","handleNewFileAction","handleNewFolderAction","getPath","filename","handleRenameAction","handleRenameCancel","undefined","handleRenameSubmit","newName","actions","result","push","title","description","action","group","groups","medium","low","disabled","shortcut","FILE_EXPLORER","DELETE","RENAME","validateRenameItem","renderItem","itemProps","item","_objectSpread","children","validate","onSubmit","onCancel","className","onFocusChange","displayName"],"sources":["../src/FileListContainer.tsx"],"sourcesContent":["import { type ContextAction, ContextActions } from '@deephaven/components';\nimport { assertNotNull } from '@deephaven/utils';\nimport React, { useCallback, useMemo, useState } from 'react';\nimport FileList from './FileList';\nimport { FileListItem, type FileListRenderItemProps } from './FileListItem';\nimport { DEFAULT_ROW_HEIGHT } from './FileListUtils';\nimport {\n type FileStorageItem,\n type FileStorageTable,\n isDirectory,\n} 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 function FileListContainer(props: FileListContainerProps): JSX.Element {\n const {\n isMultiSelect = false,\n focusedPath,\n showContextMenu = false,\n onCreateFile,\n onCreateFolder,\n onCopy,\n onDelete,\n onMove,\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: FileStorageItem[]) => {\n setSelectedItems(newSelectedItems);\n onSelectionChange?.(newSelectedItems);\n },\n [onSelectionChange]\n );\n\n const handleFocusChange = useCallback(\n (newFocusedItem: FileStorageItem | undefined) => {\n setFocusedItem(newFocusedItem);\n },\n []\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 File',\n description: 'Copy the selected file',\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 assertNotNull(renameItem);\n return validateRename(renameItem, newName);\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 (\n // eslint-disable-next-line react/jsx-props-no-spreading\n <FileListItem {...itemProps}>\n <FileListItemEditor\n item={item}\n validate={validateRenameItem}\n onSubmit={handleRenameSubmit}\n onCancel={handleRenameCancel}\n />\n </FileListItem>\n );\n }\n // eslint-disable-next-line react/jsx-props-no-spreading\n return <FileListItem {...itemProps} />;\n },\n [handleRenameCancel, handleRenameSubmit, renameItem, validateRenameItem]\n );\n\n return (\n <div className=\"file-list-container\">\n {table != null && (\n <FileList\n onMove={onMove}\n onSelect={onSelect}\n onSelectionChange={handleSelectionChange}\n onFocusChange={handleFocusChange}\n renderItem={renderItem}\n rowHeight={rowHeight}\n table={table}\n isMultiSelect={isMultiSelect}\n focusedPath={focusedPath}\n />\n )}\n {showContextMenu && <ContextActions actions={actions} />}\n </div>\n );\n}\n\nFileListContainer.displayName = 'FileListContainer';\n\nexport default FileListContainer;\n"],"mappings":"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","ignoreList":[]}
|