@deephaven/file-explorer 0.11.9-beta.0 → 0.11.10-beta.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"FileExplorer.d.ts","sourceRoot":"","sources":["../src/FileExplorer.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAoD,MAAM,OAAO,CAAC;AAEzE,OAAO,WAAW,EAAE,EAClB,eAAe,EAGhB,MAAM,eAAe,CAAC;AACvB,OAAO,qBAAqB,CAAC;AAQ7B,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,WAAW,CAAC;IAErB,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;IAC9C,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,cAAc,KAAK,IAAI,CAAC;IAEvE,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,YAAY;YAAW,iBAAiB,GAAG,WAAW;;CAkKlE,CAAC;AAIF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"FileExplorer.d.ts","sourceRoot":"","sources":["../src/FileExplorer.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAoD,MAAM,OAAO,CAAC;AAEzE,OAAO,WAAW,EAAE,EAClB,eAAe,EAGhB,MAAM,eAAe,CAAC;AACvB,OAAO,qBAAqB,CAAC;AAQ7B,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,WAAW,CAAC;IAErB,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;IAC9C,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,cAAc,KAAK,IAAI,CAAC;IAEvE,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,YAAY;YAAW,iBAAiB,GAAG,WAAW;;CAqKlE,CAAC;AAIF,eAAe,YAAY,CAAC"}
@@ -29,7 +29,7 @@ export var FileExplorer = props => {
29
29
  } = props;
30
30
  var [itemsToDelete, setItemsToDelete] = useState([]);
31
31
  var [table, setTable] = useState();
32
- useEffect(() => {
32
+ useEffect(function initializeTable() {
33
33
  var tablePromise;
34
34
 
35
35
  function initTable() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/FileExplorer.tsx"],"names":["BasicModal","Log","PromiseUtils","React","useCallback","useEffect","useMemo","useState","DEFAULT_ROW_HEIGHT","isDirectory","FileListContainer","FileUtils","FileExistsError","FileNotFoundError","log","module","FileExplorer","props","storage","isMultiSelect","onDelete","undefined","onRename","onSelect","rowHeight","itemsToDelete","setItemsToDelete","table","setTable","tablePromise","initTable","debug","makeCancelable","getTable","t","close","e","isCanceled","error","cancel","handleError","handleDelete","files","handleDeleteConfirm","forEach","file","deleteFile","makePath","filename","handleDeleteCancel","handleMove","path","filesToMove","reducePaths","map","newFile","isPath","getBaseName","substring","length","moveFile","then","catch","handleRename","item","newName","name","isDir","endsWith","destination","getParent","debug2","handleValidateRename","renameItem","basename","validateName","newValue","getPath","fileInfo","info","isDeleteConfirmationShown","deleteConfirmationMessage","displayName"],"mappings":"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","sourcesContent":["import { BasicModal } from '@deephaven/components';\nimport Log from '@deephaven/log';\nimport { CancelablePromise, PromiseUtils } from '@deephaven/utils';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { DEFAULT_ROW_HEIGHT } from './FileList';\nimport FileStorage, {\n FileStorageItem,\n FileStorageTable,\n isDirectory,\n} 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\n onDelete?: (files: FileStorageItem[]) => void;\n onRename?: (oldName: string, newName: string) => void;\n onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => void;\n\n /** Height of each item in the list */\n rowHeight?: number;\n}\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorage.\n */\nexport const FileExplorer = (props: FileExplorerProps): JSX.Element => {\n const {\n storage,\n isMultiSelect = false,\n onDelete = () => undefined,\n onRename = () => undefined,\n onSelect,\n rowHeight = DEFAULT_ROW_HEIGHT,\n } = props;\n const [itemsToDelete, setItemsToDelete] = useState<FileStorageItem[]>([]);\n const [table, setTable] = useState<FileStorageTable>();\n\n useEffect(() => {\n let tablePromise: CancelablePromise<FileStorageTable>;\n async function initTable() {\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 }, [storage]);\n\n const handleError = useCallback((e: Error) => {\n if (!PromiseUtils.isCanceled(e)) {\n log.error(e);\n }\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 showContextMenu\n onMove={handleMove}\n onDelete={handleDelete}\n onRename={handleRename}\n onSelect={onSelect}\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"],"file":"FileExplorer.js"}
1
+ {"version":3,"sources":["../src/FileExplorer.tsx"],"names":["BasicModal","Log","PromiseUtils","React","useCallback","useEffect","useMemo","useState","DEFAULT_ROW_HEIGHT","isDirectory","FileListContainer","FileUtils","FileExistsError","FileNotFoundError","log","module","FileExplorer","props","storage","isMultiSelect","onDelete","undefined","onRename","onSelect","rowHeight","itemsToDelete","setItemsToDelete","table","setTable","initializeTable","tablePromise","initTable","debug","makeCancelable","getTable","t","close","e","isCanceled","error","cancel","handleError","handleDelete","files","handleDeleteConfirm","forEach","file","deleteFile","makePath","filename","handleDeleteCancel","handleMove","path","filesToMove","reducePaths","map","newFile","isPath","getBaseName","substring","length","moveFile","then","catch","handleRename","item","newName","name","isDir","endsWith","destination","getParent","debug2","handleValidateRename","renameItem","basename","validateName","newValue","getPath","fileInfo","info","isDeleteConfirmationShown","deleteConfirmationMessage","displayName"],"mappings":"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","sourcesContent":["import { BasicModal } from '@deephaven/components';\nimport Log from '@deephaven/log';\nimport { CancelablePromise, PromiseUtils } from '@deephaven/utils';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { DEFAULT_ROW_HEIGHT } from './FileList';\nimport FileStorage, {\n FileStorageItem,\n FileStorageTable,\n isDirectory,\n} 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\n onDelete?: (files: FileStorageItem[]) => void;\n onRename?: (oldName: string, newName: string) => void;\n onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => void;\n\n /** Height of each item in the list */\n rowHeight?: number;\n}\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorage.\n */\nexport const FileExplorer = (props: FileExplorerProps): JSX.Element => {\n const {\n storage,\n isMultiSelect = false,\n onDelete = () => undefined,\n onRename = () => undefined,\n onSelect,\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() {\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 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 showContextMenu\n onMove={handleMove}\n onDelete={handleDelete}\n onRename={handleRename}\n onSelect={onSelect}\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"],"file":"FileExplorer.js"}
@@ -1 +1 @@
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"}
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,WAyX/C,CAAC;AAEF,eAAe,QAAQ,CAAC"}
package/dist/FileList.js CHANGED
@@ -403,7 +403,7 @@ export var FileList = props => {
403
403
  return false;
404
404
  }
405
405
  }, [draggedItems, dropTargetItem]);
406
- useEffect(() => {
406
+ useEffect(function updateTableViewport() {
407
407
  log.debug('updating table viewport', viewport);
408
408
  table === null || table === void 0 ? void 0 : table.setViewport({
409
409
  top: Math.max(0, viewport.top - overscanCount),
@@ -411,7 +411,7 @@ export var FileList = props => {
411
411
  });
412
412
  }, [overscanCount, table, viewport]); // Listen for table updates
413
413
 
414
- useEffect(() => {
414
+ useEffect(function setLoadedViewportAndReturnCleanup() {
415
415
  var listenerRemover = table.onUpdate(newViewport => {
416
416
  setLoadedViewport({
417
417
  items: newViewport.items.map(item => _objectSpread(_objectSpread({}, item), {}, {
@@ -426,7 +426,7 @@ export var FileList = props => {
426
426
  };
427
427
  }, [table]); // Expand a folder if hovering over it
428
428
 
429
- useEffect(() => {
429
+ useEffect(function expandFolderOnHover() {
430
430
  if (dropTargetItem != null && isDirectory(dropTargetItem) && dropTargetItem.filename !== '/') {
431
431
  var timeout = setTimeout(() => {
432
432
  if (!dropTargetItem.isExpanded) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/FileList.tsx"],"names":["ItemList","Tooltip","dhPython","vsCode","vsFolder","vsFolderOpened","Log","RangeUtils","FontAwesomeIcon","classNames","React","useCallback","useEffect","useMemo","useRef","useState","isDirectory","FileUtils","MIME_TYPE","log","module","getPathFromItem","file","makePath","filename","getPath","DEFAULT_ROW_HEIGHT","DRAG_HOVER_TIMEOUT","ITEM_LIST_CLASS_NAME","renderFileListItem","props","children","draggedItems","isDragInProgress","isDropTargetValid","isSelected","item","itemIndex","dropTargetItem","onDragStart","onDragOver","onDragEnd","onDrop","isDragged","some","draggedItem","id","itemPath","dropTargetPath","isExactDropTarget","isInDropTarget","isInvalidDropTarget","icon","getItemIcon","depth","getDepth","depthLines","Array","fill","map","value","index","e","basename","modifiers","preventOverflow","boundariesElement","placement","isExpanded","mimeType","getMimeType","PYTHON","getMoveOperation","targetItem","length","Error","targetPath","startsWith","files","FileList","isMultiSelect","table","onFocusChange","undefined","onMove","onSelect","onSelectionChange","renderItem","rowHeight","overscanCount","DEFAULT_OVERSCAN","loadedViewport","setLoadedViewport","items","offset","itemCount","viewport","setViewport","top","bottom","setDropTargetItem","setDraggedItems","dragPlaceholder","setDragPlaceholder","selectedRanges","setSelectedRanges","itemList","fileList","getItems","ranges","i","range","j","push","getItem","getDragPlaceholderText","count","dropItems","debug","current","focusItem","err","error","handleSelect","event","setExpanded","handleItemDragStart","debug2","draggedRanges","resetMouseState","newDragPlaceholder","document","createElement","innerHTML","className","body","appendChild","dataTransfer","setDragImage","effectAllowed","handleItemDragOver","preventDefault","handleItemDragEnd","remove","handleItemDrop","handleItemDragExit","handleListDragOver","target","Element","classList","contains","type","handleListDrop","handleSelectionChange","newSelectedRanges","selectedItems","handleFocusChange","focusIndex","focusedItem","handleViewportChange","Math","max","listenerRemover","onUpdate","newViewport","itemName","size","timeout","setTimeout","clearTimeout","renderWrapper","itemProps","onDragExit"],"mappings":"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","sourcesContent":["import {\n ItemList,\n Range,\n RenderItemProps,\n Tooltip,\n} from '@deephaven/components';\nimport { dhPython, vsCode, vsFolder, vsFolderOpened } from '@deephaven/icons';\nimport Log from '@deephaven/log';\nimport { RangeUtils } from '@deephaven/utils';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport classNames from 'classnames';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { FileStorageItem, FileStorageTable, isDirectory } from './FileStorage';\nimport './FileList.scss';\nimport FileUtils, { MIME_TYPE } from './FileUtils';\n\nconst log = Log.module('FileList');\n\nexport type LoadedViewport = {\n items: FileStorageItem[];\n offset: number;\n itemCount: number;\n};\n\nexport type ListViewport = {\n top: number;\n bottom: number;\n};\n\nexport type FileListRenderItemProps = RenderItemProps<FileStorageItem> & {\n children?: JSX.Element;\n dropTargetItem?: FileStorageItem;\n draggedItems?: FileStorageItem[];\n isDragInProgress: boolean;\n isDropTargetValid: boolean;\n\n onDragStart(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragOver(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragEnd(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDrop(index: number, e: React.DragEvent<HTMLDivElement>): void;\n};\n\nexport interface FileListProps {\n table: FileStorageTable;\n\n isMultiSelect?: boolean;\n\n onFocusChange?: (focusedItem?: FileStorageItem) => void;\n onMove: (files: FileStorageItem[], path: string) => void;\n onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => void;\n onSelectionChange?: (selectedItems: FileStorageItem[]) => void;\n\n renderItem?: (props: FileListRenderItemProps) => JSX.Element;\n\n /** Height of each item in the list */\n rowHeight?: number;\n\n overscanCount?: number;\n}\n\nexport const getPathFromItem = (file: FileStorageItem): string =>\n isDirectory(file)\n ? FileUtils.makePath(file.filename)\n : FileUtils.getPath(file.filename);\n\nexport const DEFAULT_ROW_HEIGHT = 26;\n\n// How long you need to hover over a directory before it expands\nexport const DRAG_HOVER_TIMEOUT = 500;\n\nconst ITEM_LIST_CLASS_NAME = 'item-list-scroll-pane';\n\nexport const renderFileListItem = (\n props: FileListRenderItemProps\n): JSX.Element => {\n const {\n children,\n draggedItems,\n isDragInProgress,\n isDropTargetValid,\n isSelected,\n item,\n itemIndex,\n dropTargetItem,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n } = props;\n\n const isDragged =\n draggedItems?.some(draggedItem => draggedItem.id === item.id) ?? false;\n const itemPath = getPathFromItem(item);\n const dropTargetPath =\n isDragInProgress && dropTargetItem ? getPathFromItem(dropTargetItem) : null;\n\n const isExactDropTarget =\n isDragInProgress &&\n isDropTargetValid &&\n isDirectory(item) &&\n dropTargetPath === itemPath;\n const isInDropTarget =\n isDragInProgress && isDropTargetValid && dropTargetPath === itemPath;\n const isInvalidDropTarget =\n isDragInProgress && !isDropTargetValid && dropTargetPath === itemPath;\n\n const icon = getItemIcon(item);\n const depth = FileUtils.getDepth(item.filename);\n const depthLines = Array(depth)\n .fill(null)\n .map((value, index) => (\n // eslint-disable-next-line react/no-array-index-key\n <span className=\"file-list-depth-line\" key={index} />\n ));\n\n return (\n <div\n className={classNames(\n 'd-flex w-100 align-items-center',\n 'file-list-item',\n {\n 'is-dragged': isDragged,\n 'is-exact-drop-target': isExactDropTarget,\n 'is-in-drop-target': isInDropTarget,\n 'is-invalid-drop-target': isInvalidDropTarget,\n 'is-selected': isSelected,\n }\n )}\n onDragStart={e => onDragStart(itemIndex, e)}\n onDragOver={e => onDragOver(itemIndex, e)}\n onDragEnd={e => onDragEnd(itemIndex, e)}\n onDrop={e => onDrop(itemIndex, e)}\n draggable\n role=\"presentation\"\n >\n {depthLines}{' '}\n <FontAwesomeIcon icon={icon} className=\"item-icon\" fixedWidth />{' '}\n <span className=\"truncation-wrapper\">\n {children ?? item.basename}\n <Tooltip\n options={{\n modifiers: { preventOverflow: { boundariesElement: 'window' } },\n placement: 'left',\n }}\n >\n {children ?? item.basename}\n </Tooltip>\n </span>\n </div>\n );\n};\n\n/**\n * Get the icon definition for a file or folder item\n * @param {FileStorageItem} item Item to get the icon for\n * @returns {IconDefinition} Icon definition to pass in the FontAwesomeIcon icon prop\n */\nexport function getItemIcon(item: FileStorageItem): IconDefinition {\n if (isDirectory(item)) {\n return item.isExpanded ? vsFolderOpened : vsFolder;\n }\n const mimeType = FileUtils.getMimeType(item.basename);\n switch (mimeType) {\n case MIME_TYPE.PYTHON:\n return dhPython;\n default:\n return vsCode;\n }\n}\n\n/**\n * Get the move operation for the current selection and the given target. Throws if the operation is invalid.\n */\nexport function getMoveOperation(\n draggedItems: FileStorageItem[],\n targetItem: FileStorageItem\n): { files: FileStorageItem[]; targetPath: string } {\n if (draggedItems.length === 0 || !targetItem) {\n throw new Error('No items to move');\n }\n\n const targetPath = getPathFromItem(targetItem);\n if (\n draggedItems.some(\n ({ filename }) => FileUtils.getPath(filename) === targetPath\n )\n ) {\n // Cannot drop if target is one of the dragged items is already in the target folder\n throw new Error('File already in the destination folder');\n }\n if (\n draggedItems.some(\n item =>\n isDirectory(item) &&\n targetPath.startsWith(FileUtils.makePath(item.filename))\n )\n ) {\n // Cannot drop if target is a child of one of the directories being moved\n throw new Error('Destination folder cannot be a child of a dragged folder');\n }\n return { files: draggedItems, targetPath };\n}\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorageTable.\n */\nexport const FileList = (props: FileListProps): JSX.Element => {\n const {\n isMultiSelect = false,\n table,\n onFocusChange = () => undefined,\n onMove,\n onSelect,\n onSelectionChange = () => undefined,\n renderItem = renderFileListItem,\n rowHeight = DEFAULT_ROW_HEIGHT,\n overscanCount = ItemList.DEFAULT_OVERSCAN,\n } = props;\n const [loadedViewport, setLoadedViewport] = useState<LoadedViewport>(() => ({\n items: [],\n offset: 0,\n itemCount: 0,\n }));\n const [viewport, setViewport] = useState<ListViewport>({\n top: 0,\n bottom: 0,\n });\n\n const [dropTargetItem, setDropTargetItem] = useState<FileStorageItem>();\n const [draggedItems, setDraggedItems] = useState<FileStorageItem[]>();\n const [dragPlaceholder, setDragPlaceholder] = useState<HTMLDivElement>();\n const [selectedRanges, setSelectedRanges] = useState([] as Range[]);\n const itemList = useRef<ItemList<FileStorageItem>>(null);\n const fileList = useRef<HTMLDivElement>(null);\n\n const getItems = useCallback(\n (ranges: Range[]): FileStorageItem[] => {\n if (ranges.length === 0 || !loadedViewport) {\n return [];\n }\n\n const items = [] as FileStorageItem[];\n for (let i = 0; i < ranges.length; i += 1) {\n const range = ranges[i];\n for (let j = range[0]; j <= range[1]; j += 1) {\n if (\n j >= loadedViewport.offset &&\n j < loadedViewport.offset + loadedViewport.items.length\n ) {\n items.push(loadedViewport.items[j - loadedViewport.offset]);\n }\n }\n }\n return items;\n },\n [loadedViewport]\n );\n\n const getItem = useCallback(\n (itemIndex: number): FileStorageItem | undefined => {\n const items = getItems([[itemIndex, itemIndex]]);\n if (items.length > 0) {\n return items[0];\n }\n },\n [getItems]\n );\n\n /**\n * Get the placeholder text to show when a drag operation is in progress\n */\n const getDragPlaceholderText = useCallback(() => {\n const count = RangeUtils.count(selectedRanges);\n if (count === 0) {\n return null;\n }\n\n if (count === 1) {\n const index = selectedRanges[0][0];\n const item = getItem(index);\n if (item != null) {\n return item.filename;\n }\n }\n return `${count} items`;\n }, [getItem, selectedRanges]);\n\n /**\n * Drop the currently dragged items at the currently set drop target.\n * If an itemIndex is provided, focus that index after the drop.\n */\n const dropItems = useCallback(\n (itemIndex?: number) => {\n if (!draggedItems || !dropTargetItem) {\n return;\n }\n\n log.debug('dropItems', draggedItems, 'to', itemIndex);\n\n try {\n const { files, targetPath } = getMoveOperation(\n draggedItems,\n dropTargetItem\n );\n onMove(files, targetPath);\n if (itemIndex != null) {\n setSelectedRanges([[itemIndex, itemIndex]]);\n itemList.current?.focusItem(itemIndex);\n }\n } catch (err) {\n log.error('Unable to complete move', err);\n }\n },\n [draggedItems, dropTargetItem, onMove]\n );\n\n const handleSelect = useCallback(\n (itemIndex: number, event: React.SyntheticEvent) => {\n const item = loadedViewport.items[itemIndex - loadedViewport.offset];\n if (item !== undefined) {\n log.debug('handleItemClick', item);\n\n onSelect(item, event);\n if (isDirectory(item)) {\n table?.setExpanded(item.filename, !item.isExpanded);\n }\n }\n },\n [loadedViewport, onSelect, table]\n );\n\n const handleItemDragStart = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n log.debug2('handleItemDragStart', itemIndex, selectedRanges);\n\n let draggedRanges = selectedRanges;\n if (!RangeUtils.isSelected(selectedRanges, itemIndex)) {\n draggedRanges = [[itemIndex, itemIndex]];\n setSelectedRanges(draggedRanges);\n }\n\n setDraggedItems(getItems(draggedRanges));\n\n // We need to reset reset the mouse state since we steal the drag\n itemList.current?.resetMouseState();\n\n const newDragPlaceholder = document.createElement('div');\n newDragPlaceholder.innerHTML = `<div class=\"dnd-placeholder-content\">${getDragPlaceholderText()}</div>`;\n newDragPlaceholder.className = 'file-list-dnd-placeholder';\n document.body.appendChild(newDragPlaceholder);\n e.dataTransfer.setDragImage(newDragPlaceholder, 0, 0);\n e.dataTransfer.effectAllowed = 'move';\n setDragPlaceholder(newDragPlaceholder);\n },\n [getDragPlaceholderText, getItems, selectedRanges]\n );\n\n const handleItemDragOver = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n\n log.debug2('handleItemDragOver', e);\n setDropTargetItem(getItem(itemIndex));\n },\n [getItem]\n );\n\n const handleItemDragEnd = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n log.debug('handleItemDragEnd', itemIndex);\n\n dragPlaceholder?.remove();\n\n // Drag end is triggered after drop\n // Also drop isn't triggered if drag end is outside of the list\n setDraggedItems(undefined);\n setDropTargetItem(undefined);\n setDragPlaceholder(undefined);\n },\n [dragPlaceholder]\n );\n\n const handleItemDrop = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n dropItems(itemIndex);\n },\n [dropItems]\n );\n\n const handleItemDragExit = useCallback(() => {\n log.debug2('handleItemDragExit');\n setDropTargetItem(undefined);\n }, []);\n\n const handleListDragOver = useCallback(\n (e: React.DragEvent<HTMLDivElement>) => {\n if (\n e.target instanceof Element &&\n e.target.classList.contains(ITEM_LIST_CLASS_NAME)\n ) {\n // Need to prevent default to enable drop\n // https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#droptargets\n e.preventDefault();\n\n log.debug2('handleListDragOver', e);\n setDropTargetItem({\n type: 'directory',\n filename: '/',\n basename: '/',\n id: '/',\n });\n }\n },\n []\n );\n\n const handleListDrop = useCallback(\n (e: React.DragEvent<HTMLDivElement>) => {\n if (\n e.target instanceof Element &&\n e.target.classList.contains(ITEM_LIST_CLASS_NAME)\n ) {\n log.debug('handleListDrop');\n dropItems();\n }\n },\n [dropItems]\n );\n\n const handleSelectionChange = useCallback(\n newSelectedRanges => {\n log.debug2('handleSelectionChange', newSelectedRanges);\n if (newSelectedRanges !== selectedRanges) {\n setSelectedRanges(newSelectedRanges);\n const selectedItems = getItems(newSelectedRanges);\n onSelectionChange(selectedItems);\n }\n },\n [getItems, onSelectionChange, selectedRanges]\n );\n\n const handleFocusChange = useCallback(\n focusIndex => {\n log.debug2('handleFocusChange', focusIndex);\n if (focusIndex != null) {\n const [focusedItem] = getItems([[focusIndex, focusIndex]]);\n onFocusChange(focusedItem);\n } else {\n onFocusChange();\n }\n },\n [getItems, onFocusChange]\n );\n\n const handleViewportChange = useCallback(\n (top: number, bottom: number) => {\n log.debug('handleViewportChange', top, bottom);\n if (top !== viewport.top || bottom !== viewport.bottom) {\n setViewport({ top, bottom });\n }\n },\n [viewport]\n );\n\n const isDropTargetValid = useMemo(() => {\n if (!draggedItems || !dropTargetItem) {\n return false;\n }\n\n try {\n getMoveOperation(draggedItems, dropTargetItem);\n log.debug('handleValidateDropTarget true');\n return true;\n } catch (e) {\n log.debug('handleValidateDropTarget false');\n return false;\n }\n }, [draggedItems, dropTargetItem]);\n\n useEffect(() => {\n 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","updateTableViewport","Math","max","setLoadedViewportAndReturnCleanup","listenerRemover","onUpdate","newViewport","itemName","size","expandFolderOnHover","timeout","setTimeout","clearTimeout","renderWrapper","itemProps","onDragExit"],"mappings":"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","sourcesContent":["import {\n ItemList,\n Range,\n RenderItemProps,\n Tooltip,\n} from '@deephaven/components';\nimport { dhPython, vsCode, vsFolder, vsFolderOpened } from '@deephaven/icons';\nimport Log from '@deephaven/log';\nimport { RangeUtils } from '@deephaven/utils';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport classNames from 'classnames';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { FileStorageItem, FileStorageTable, isDirectory } from './FileStorage';\nimport './FileList.scss';\nimport FileUtils, { MIME_TYPE } from './FileUtils';\n\nconst log = Log.module('FileList');\n\nexport type LoadedViewport = {\n items: FileStorageItem[];\n offset: number;\n itemCount: number;\n};\n\nexport type ListViewport = {\n top: number;\n bottom: number;\n};\n\nexport type FileListRenderItemProps = RenderItemProps<FileStorageItem> & {\n children?: JSX.Element;\n dropTargetItem?: FileStorageItem;\n draggedItems?: FileStorageItem[];\n isDragInProgress: boolean;\n isDropTargetValid: boolean;\n\n onDragStart(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragOver(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragEnd(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDrop(index: number, e: React.DragEvent<HTMLDivElement>): void;\n};\n\nexport interface FileListProps {\n table: FileStorageTable;\n\n isMultiSelect?: boolean;\n\n onFocusChange?: (focusedItem?: FileStorageItem) => void;\n onMove: (files: FileStorageItem[], path: string) => void;\n onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => void;\n onSelectionChange?: (selectedItems: FileStorageItem[]) => void;\n\n renderItem?: (props: FileListRenderItemProps) => JSX.Element;\n\n /** Height of each item in the list */\n rowHeight?: number;\n\n overscanCount?: number;\n}\n\nexport const getPathFromItem = (file: FileStorageItem): string =>\n isDirectory(file)\n ? FileUtils.makePath(file.filename)\n : FileUtils.getPath(file.filename);\n\nexport const DEFAULT_ROW_HEIGHT = 26;\n\n// How long you need to hover over a directory before it expands\nexport const DRAG_HOVER_TIMEOUT = 500;\n\nconst ITEM_LIST_CLASS_NAME = 'item-list-scroll-pane';\n\nexport const renderFileListItem = (\n props: FileListRenderItemProps\n): JSX.Element => {\n const {\n children,\n draggedItems,\n isDragInProgress,\n isDropTargetValid,\n isSelected,\n item,\n itemIndex,\n dropTargetItem,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n } = props;\n\n const isDragged =\n draggedItems?.some(draggedItem => draggedItem.id === item.id) ?? false;\n const itemPath = getPathFromItem(item);\n const dropTargetPath =\n isDragInProgress && dropTargetItem ? getPathFromItem(dropTargetItem) : null;\n\n const isExactDropTarget =\n isDragInProgress &&\n isDropTargetValid &&\n isDirectory(item) &&\n dropTargetPath === itemPath;\n const isInDropTarget =\n isDragInProgress && isDropTargetValid && dropTargetPath === itemPath;\n const isInvalidDropTarget =\n isDragInProgress && !isDropTargetValid && dropTargetPath === itemPath;\n\n const icon = getItemIcon(item);\n const depth = FileUtils.getDepth(item.filename);\n const depthLines = Array(depth)\n .fill(null)\n .map((value, index) => (\n // eslint-disable-next-line react/no-array-index-key\n <span className=\"file-list-depth-line\" key={index} />\n ));\n\n return (\n <div\n className={classNames(\n 'd-flex w-100 align-items-center',\n 'file-list-item',\n {\n 'is-dragged': isDragged,\n 'is-exact-drop-target': isExactDropTarget,\n 'is-in-drop-target': isInDropTarget,\n 'is-invalid-drop-target': isInvalidDropTarget,\n 'is-selected': isSelected,\n }\n )}\n onDragStart={e => onDragStart(itemIndex, e)}\n onDragOver={e => onDragOver(itemIndex, e)}\n onDragEnd={e => onDragEnd(itemIndex, e)}\n onDrop={e => onDrop(itemIndex, e)}\n draggable\n role=\"presentation\"\n >\n {depthLines}{' '}\n <FontAwesomeIcon icon={icon} className=\"item-icon\" fixedWidth />{' '}\n <span className=\"truncation-wrapper\">\n {children ?? item.basename}\n <Tooltip\n options={{\n modifiers: { preventOverflow: { boundariesElement: 'window' } },\n placement: 'left',\n }}\n >\n {children ?? item.basename}\n </Tooltip>\n </span>\n </div>\n );\n};\n\n/**\n * Get the icon definition for a file or folder item\n * @param {FileStorageItem} item Item to get the icon for\n * @returns {IconDefinition} Icon definition to pass in the FontAwesomeIcon icon prop\n */\nexport function getItemIcon(item: FileStorageItem): IconDefinition {\n if (isDirectory(item)) {\n return item.isExpanded ? vsFolderOpened : vsFolder;\n }\n const mimeType = FileUtils.getMimeType(item.basename);\n switch (mimeType) {\n case MIME_TYPE.PYTHON:\n return dhPython;\n default:\n return vsCode;\n }\n}\n\n/**\n * Get the move operation for the current selection and the given target. Throws if the operation is invalid.\n */\nexport function getMoveOperation(\n draggedItems: FileStorageItem[],\n targetItem: FileStorageItem\n): { files: FileStorageItem[]; targetPath: string } {\n if (draggedItems.length === 0 || !targetItem) {\n throw new Error('No items to move');\n }\n\n const targetPath = getPathFromItem(targetItem);\n if (\n draggedItems.some(\n ({ filename }) => FileUtils.getPath(filename) === targetPath\n )\n ) {\n // Cannot drop if target is one of the dragged items is already in the target folder\n throw new Error('File already in the destination folder');\n }\n if (\n draggedItems.some(\n item =>\n isDirectory(item) &&\n targetPath.startsWith(FileUtils.makePath(item.filename))\n )\n ) {\n // Cannot drop if target is a child of one of the directories being moved\n throw new Error('Destination folder cannot be a child of a dragged folder');\n }\n return { files: draggedItems, targetPath };\n}\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorageTable.\n */\nexport const FileList = (props: FileListProps): JSX.Element => {\n const {\n isMultiSelect = false,\n table,\n onFocusChange = () => undefined,\n onMove,\n onSelect,\n onSelectionChange = () => undefined,\n renderItem = renderFileListItem,\n rowHeight = DEFAULT_ROW_HEIGHT,\n overscanCount = ItemList.DEFAULT_OVERSCAN,\n } = props;\n const [loadedViewport, setLoadedViewport] = useState<LoadedViewport>(() => ({\n items: [],\n offset: 0,\n itemCount: 0,\n }));\n const [viewport, setViewport] = useState<ListViewport>({\n top: 0,\n bottom: 0,\n });\n\n const [dropTargetItem, setDropTargetItem] = useState<FileStorageItem>();\n const [draggedItems, setDraggedItems] = useState<FileStorageItem[]>();\n const [dragPlaceholder, setDragPlaceholder] = useState<HTMLDivElement>();\n const [selectedRanges, setSelectedRanges] = useState([] as Range[]);\n const itemList = useRef<ItemList<FileStorageItem>>(null);\n const fileList = useRef<HTMLDivElement>(null);\n\n const getItems = useCallback(\n (ranges: Range[]): FileStorageItem[] => {\n if (ranges.length === 0 || !loadedViewport) {\n return [];\n }\n\n const items = [] as FileStorageItem[];\n for (let i = 0; i < ranges.length; i += 1) {\n const range = ranges[i];\n for (let j = range[0]; j <= range[1]; j += 1) {\n if (\n j >= loadedViewport.offset &&\n j < loadedViewport.offset + loadedViewport.items.length\n ) {\n items.push(loadedViewport.items[j - loadedViewport.offset]);\n }\n }\n }\n return items;\n },\n [loadedViewport]\n );\n\n const getItem = useCallback(\n (itemIndex: number): FileStorageItem | undefined => {\n const items = getItems([[itemIndex, itemIndex]]);\n if (items.length > 0) {\n return items[0];\n }\n },\n [getItems]\n );\n\n /**\n * Get the placeholder text to show when a drag operation is in progress\n */\n const getDragPlaceholderText = useCallback(() => {\n const count = RangeUtils.count(selectedRanges);\n if (count === 0) {\n return null;\n }\n\n if (count === 1) {\n const index = selectedRanges[0][0];\n const item = getItem(index);\n if (item != null) {\n return item.filename;\n }\n }\n return `${count} items`;\n }, [getItem, selectedRanges]);\n\n /**\n * Drop the currently dragged items at the currently set drop target.\n * If an itemIndex is provided, focus that index after the drop.\n */\n const dropItems = useCallback(\n (itemIndex?: number) => {\n if (!draggedItems || !dropTargetItem) {\n return;\n }\n\n log.debug('dropItems', draggedItems, 'to', itemIndex);\n\n try {\n const { files, targetPath } = getMoveOperation(\n draggedItems,\n dropTargetItem\n );\n onMove(files, targetPath);\n if (itemIndex != null) {\n setSelectedRanges([[itemIndex, itemIndex]]);\n itemList.current?.focusItem(itemIndex);\n }\n } catch (err) {\n log.error('Unable to complete move', err);\n }\n },\n [draggedItems, dropTargetItem, onMove]\n );\n\n const handleSelect = useCallback(\n (itemIndex: number, event: React.SyntheticEvent) => {\n const item = loadedViewport.items[itemIndex - loadedViewport.offset];\n if (item !== undefined) {\n log.debug('handleItemClick', item);\n\n onSelect(item, event);\n if (isDirectory(item)) {\n table?.setExpanded(item.filename, !item.isExpanded);\n }\n }\n },\n [loadedViewport, onSelect, table]\n );\n\n const handleItemDragStart = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n log.debug2('handleItemDragStart', itemIndex, selectedRanges);\n\n let draggedRanges = selectedRanges;\n if (!RangeUtils.isSelected(selectedRanges, itemIndex)) {\n draggedRanges = [[itemIndex, itemIndex]];\n setSelectedRanges(draggedRanges);\n }\n\n setDraggedItems(getItems(draggedRanges));\n\n // We need to reset reset the mouse state since we steal the drag\n itemList.current?.resetMouseState();\n\n const newDragPlaceholder = document.createElement('div');\n newDragPlaceholder.innerHTML = `<div class=\"dnd-placeholder-content\">${getDragPlaceholderText()}</div>`;\n newDragPlaceholder.className = 'file-list-dnd-placeholder';\n document.body.appendChild(newDragPlaceholder);\n e.dataTransfer.setDragImage(newDragPlaceholder, 0, 0);\n e.dataTransfer.effectAllowed = 'move';\n setDragPlaceholder(newDragPlaceholder);\n },\n [getDragPlaceholderText, getItems, selectedRanges]\n );\n\n const handleItemDragOver = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n\n log.debug2('handleItemDragOver', e);\n setDropTargetItem(getItem(itemIndex));\n },\n [getItem]\n );\n\n const handleItemDragEnd = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n log.debug('handleItemDragEnd', itemIndex);\n\n dragPlaceholder?.remove();\n\n // Drag end is triggered after drop\n // Also drop isn't triggered if drag end is outside of the list\n setDraggedItems(undefined);\n setDropTargetItem(undefined);\n setDragPlaceholder(undefined);\n },\n [dragPlaceholder]\n );\n\n const handleItemDrop = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n dropItems(itemIndex);\n },\n [dropItems]\n );\n\n const handleItemDragExit = useCallback(() => {\n log.debug2('handleItemDragExit');\n setDropTargetItem(undefined);\n }, []);\n\n const handleListDragOver = useCallback(\n (e: React.DragEvent<HTMLDivElement>) => {\n if (\n e.target instanceof Element &&\n e.target.classList.contains(ITEM_LIST_CLASS_NAME)\n ) {\n // Need to prevent default to enable drop\n // https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#droptargets\n e.preventDefault();\n\n log.debug2('handleListDragOver', e);\n setDropTargetItem({\n type: 'directory',\n filename: '/',\n basename: '/',\n id: '/',\n });\n }\n },\n []\n );\n\n const handleListDrop = useCallback(\n (e: React.DragEvent<HTMLDivElement>) => {\n if (\n e.target instanceof Element &&\n e.target.classList.contains(ITEM_LIST_CLASS_NAME)\n ) {\n log.debug('handleListDrop');\n dropItems();\n }\n },\n [dropItems]\n );\n\n const handleSelectionChange = useCallback(\n newSelectedRanges => {\n log.debug2('handleSelectionChange', newSelectedRanges);\n if (newSelectedRanges !== selectedRanges) {\n setSelectedRanges(newSelectedRanges);\n const selectedItems = getItems(newSelectedRanges);\n onSelectionChange(selectedItems);\n }\n },\n [getItems, onSelectionChange, selectedRanges]\n );\n\n const handleFocusChange = useCallback(\n focusIndex => {\n log.debug2('handleFocusChange', focusIndex);\n if (focusIndex != null) {\n const [focusedItem] = getItems([[focusIndex, focusIndex]]);\n onFocusChange(focusedItem);\n } else {\n onFocusChange();\n }\n },\n [getItems, onFocusChange]\n );\n\n const handleViewportChange = useCallback(\n (top: number, bottom: number) => {\n log.debug('handleViewportChange', top, bottom);\n if (top !== viewport.top || bottom !== viewport.bottom) {\n setViewport({ top, bottom });\n }\n },\n [viewport]\n );\n\n const isDropTargetValid = useMemo(() => {\n if (!draggedItems || !dropTargetItem) {\n return false;\n }\n\n try {\n getMoveOperation(draggedItems, dropTargetItem);\n log.debug('handleValidateDropTarget true');\n return true;\n } catch (e) {\n log.debug('handleValidateDropTarget false');\n return false;\n }\n }, [draggedItems, dropTargetItem]);\n\n useEffect(\n function updateTableViewport() {\n log.debug('updating table viewport', viewport);\n table?.setViewport({\n top: Math.max(0, viewport.top - overscanCount),\n bottom: viewport.bottom + overscanCount,\n });\n },\n [overscanCount, table, viewport]\n );\n\n // Listen for table updates\n useEffect(\n function setLoadedViewportAndReturnCleanup() {\n const listenerRemover = table.onUpdate(newViewport => {\n setLoadedViewport({\n items: newViewport.items.map(item => ({\n ...item,\n itemName: item.basename,\n })),\n offset: newViewport.offset,\n itemCount: table.size,\n });\n });\n return () => {\n listenerRemover();\n };\n },\n [table]\n );\n\n // Expand a folder if hovering over it\n useEffect(\n function expandFolderOnHover() {\n if (\n dropTargetItem != null &&\n isDirectory(dropTargetItem) &&\n dropTargetItem.filename !== '/'\n ) {\n const timeout = setTimeout(() => {\n if (!dropTargetItem.isExpanded) {\n table?.setExpanded(dropTargetItem.filename, true);\n }\n }, DRAG_HOVER_TIMEOUT);\n return () => clearTimeout(timeout);\n }\n },\n [dropTargetItem, table]\n );\n\n const renderWrapper = useCallback(\n itemProps =>\n renderItem({\n ...itemProps,\n isDragInProgress: draggedItems != null,\n dropTargetItem,\n draggedItems,\n isDropTargetValid,\n onDragStart: handleItemDragStart,\n onDragEnd: handleItemDragEnd,\n onDragOver: handleItemDragOver,\n onDragExit: handleItemDragExit,\n onDrop: handleItemDrop,\n }),\n [\n handleItemDragEnd,\n handleItemDragExit,\n handleItemDragOver,\n handleItemDragStart,\n handleItemDrop,\n draggedItems,\n dropTargetItem,\n isDropTargetValid,\n renderItem,\n ]\n );\n\n return (\n <div\n ref={fileList}\n className={classNames('file-list', {\n 'is-dragging': draggedItems != null,\n })}\n onDragOver={handleListDragOver}\n onDrop={handleListDrop}\n >\n <ItemList\n ref={itemList}\n items={loadedViewport.items}\n itemCount={loadedViewport.itemCount}\n offset={loadedViewport.offset}\n onFocusChange={handleFocusChange}\n onSelect={handleSelect}\n onSelectionChange={handleSelectionChange}\n onViewportChange={handleViewportChange}\n selectedRanges={selectedRanges}\n renderItem={renderWrapper}\n rowHeight={rowHeight}\n isMultiSelect={isMultiSelect}\n isDragSelect={false}\n isDeselectOnClick={false}\n />\n </div>\n );\n};\n\nexport default FileList;\n"],"file":"FileList.js"}
@@ -1 +1 @@
1
- {"version":3,"file":"FileListItemEditor.d.ts","sourceRoot":"","sources":["../src/FileListItemEditor.tsx"],"names":[],"mappings":";AAYA,OAAO,2BAA2B,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAIhD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AAED,eAAO,MAAM,kBAAkB,4CAK5B,uBAAuB,KAAG,WA+F5B,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"FileListItemEditor.d.ts","sourceRoot":"","sources":["../src/FileListItemEditor.tsx"],"names":[],"mappings":";AAYA,OAAO,2BAA2B,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAIhD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AAED,eAAO,MAAM,kBAAkB,4CAK5B,uBAAuB,KAAG,WAqG5B,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -26,7 +26,7 @@ export var FileListItemEditor = _ref => {
26
26
  onSubmit(value);
27
27
  }).catch(e => log.info('Unable to validate name', e));
28
28
  }, [onSubmit, value, validationPromise]);
29
- useEffect(() => {
29
+ useEffect(function validateValueAndSetPromise() {
30
30
  var validatePromise = PromiseUtils.makeCancelable(validate(value));
31
31
  validatePromise.then(() => setValidationError(undefined)).catch(e => {
32
32
  if (!PromiseUtils.isCanceled(e)) {
@@ -36,7 +36,7 @@ export var FileListItemEditor = _ref => {
36
36
  setValidationPromise(validatePromise);
37
37
  return () => validatePromise.cancel();
38
38
  }, [validate, value]);
39
- useEffect(() => {
39
+ useEffect(function selectRange() {
40
40
  focus();
41
41
  }, [focus]);
42
42
  var handleBlur = useCallback(() => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/FileListItemEditor.tsx"],"names":["React","useCallback","useEffect","useRef","useState","classNames","Log","PromiseUtils","log","module","FileListItemEditor","item","onCancel","onSubmit","validate","Promise","resolve","input","value","setValue","basename","validationError","setValidationError","validationPromise","setValidationPromise","focus","current","stopPropagation","e","validateAndSubmit","then","catch","info","validatePromise","makeCancelable","undefined","isCanceled","cancel","handleBlur","debug2","handleChange","newValue","target","handleKeyDown","key"],"mappings":"AAAA,OAAOA,KAAP,IAIEC,WAJF,EAKEC,SALF,EAMEC,MANF,EAOEC,QAPF,QAQO,OARP;AASA,OAAOC,UAAP,MAAuB,YAAvB;AACA,OAAOC,GAAP,MAAgB,gBAAhB;AACA,SAASC,YAAT,QAA6B,kBAA7B;;AAIA,IAAMC,GAAG,GAAGF,GAAG,CAACG,MAAJ,CAAW,oBAAX,CAAZ;AASA,OAAO,IAAMC,kBAAkB,GAAG,QAKU;AAAA,MALT;AACjCC,IAAAA,IADiC;AAEjCC,IAAAA,QAFiC;AAGjCC,IAAAA,QAHiC;AAIjCC,IAAAA,QAAQ,GAAG,MAAMC,OAAO,CAACC,OAAR;AAJgB,GAKS;AAC1C,MAAMC,KAAK,GAAGd,MAAM,CAAmB,IAAnB,CAApB;AACA,MAAM,CAACe,KAAD,EAAQC,QAAR,IAAoBf,QAAQ,CAACO,IAAI,CAACS,QAAN,CAAlC;AACA,MAAM,CAACC,eAAD,EAAkBC,kBAAlB,IAAwClB,QAAQ,EAAtD;AACA,MAAM,CAACmB,iBAAD,EAAoBC,oBAApB,IAA4CpB,QAAQ,CACxDW,OAAO,CAACC,OAAR,EADwD,CAA1D;AAIA,MAAMS,KAAK,GAAGxB,WAAW,CAAC,MAAM;AAAA;;AAC9B,sBAAAgB,KAAK,CAACS,OAAN,kEAAeD,KAAf,GAD8B,CAE9B;AACD,GAHwB,EAGtB,CAACR,KAAD,CAHsB,CAAzB;AAKA,MAAMU,eAAe,GAAG1B,WAAW,CAChC2B,CAAD,IAAmBA,CAAC,CAACD,eAAF,EADc,EAEjC,EAFiC,CAAnC;AAKA,MAAME,iBAAiB,GAAG5B,WAAW,CAAC,MAAM;AAC1CsB,IAAAA,iBAAiB,CACdO,IADH,CACQ,MAAM;AACVjB,MAAAA,QAAQ,CAACK,KAAD,CAAR;AACD,KAHH,EAIGa,KAJH,CAISH,CAAC,IAAIpB,GAAG,CAACwB,IAAJ,CAAS,yBAAT,EAAoCJ,CAApC,CAJd;AAKD,GANoC,EAMlC,CAACf,QAAD,EAAWK,KAAX,EAAkBK,iBAAlB,CANkC,CAArC;AAQArB,EAAAA,SAAS,CAAC,MAAM;AACd,QAAM+B,eAAe,GAAG1B,YAAY,CAAC2B,cAAb,CAA4BpB,QAAQ,CAACI,KAAD,CAApC,CAAxB;AACAe,IAAAA,eAAe,CACZH,IADH,CACQ,MAAMR,kBAAkB,CAACa,SAAD,CADhC,EAEGJ,KAFH,CAESH,CAAC,IAAI;AACV,UAAI,CAACrB,YAAY,CAAC6B,UAAb,CAAwBR,CAAxB,CAAL,EAAiC;AAC/BN,QAAAA,kBAAkB,CAACM,CAAD,CAAlB;AACD;AACF,KANH;AAOAJ,IAAAA,oBAAoB,CAACS,eAAD,CAApB;AACA,WAAO,MAAMA,eAAe,CAACI,MAAhB,EAAb;AACD,GAXQ,EAWN,CAACvB,QAAD,EAAWI,KAAX,CAXM,CAAT;AAaAhB,EAAAA,SAAS,CAAC,MAAM;AACduB,IAAAA,KAAK;AACN,GAFQ,EAEN,CAACA,KAAD,CAFM,CAAT;AAIA,MAAMa,UAAU,GAAGrC,WAAW,CAAC,MAAM;AACnCO,IAAAA,GAAG,CAAC+B,MAAJ,CAAW,YAAX;AACAV,IAAAA,iBAAiB;AAClB,GAH6B,EAG3B,CAACA,iBAAD,CAH2B,CAA9B;AAKA,MAAMW,YAAY,GAAGvC,WAAW,CAAE2B,CAAD,IAAsC;AACrE,QAAM;AAAEV,MAAAA,KAAK,EAAEuB;AAAT,QAAsBb,CAAC,CAACc,MAA9B;AACAvB,IAAAA,QAAQ,CAACsB,QAAD,CAAR;AACD,GAH+B,EAG7B,EAH6B,CAAhC;AAKA,MAAME,aAAa,GAAG1C,WAAW,CAC9B2B,CAAD,IAAsB;AACpBA,IAAAA,CAAC,CAACD,eAAF;AAEA,QAAM;AAAEiB,MAAAA;AAAF,QAAUhB,CAAhB;;AACA,YAAQgB,GAAR;AACE,WAAK,OAAL;AAAc;AACZf,UAAAA,iBAAiB;AACjB;AACD;;AACD,WAAK,QAAL;AAAe;AACbjB,UAAAA,QAAQ;AACR;AACD;;AACD;AATF;AAWD,GAhB8B,EAiB/B,CAACA,QAAD,EAAWiB,iBAAX,CAjB+B,CAAjC;AAoBA,sBACE;AAAK,IAAA,SAAS,EAAC;AAAf,kBACE;AACE,IAAA,IAAI,EAAC,MADP;AAEE,IAAA,SAAS,EAAExB,UAAU,CAAC,0CAAD,EAA6C;AAChE,oBAAcgB;AADkD,KAA7C,CAFvB;AAKE,IAAA,KAAK,EAAEH,KALT;AAME,IAAA,GAAG,EAAED,KANP;AAOE,IAAA,MAAM,EAAEqB,UAPV;AAQE,IAAA,SAAS,EAAEK,aARb;AASE,IAAA,QAAQ,EAAEH,YATZ;AAUE,IAAA,OAAO,EAAEb,eAVX;AAWE,IAAA,aAAa,EAAEA,eAXjB;AAYE,IAAA,WAAW,EAAEA;AAZf,IADF,EAgBGN,eAAe,iBACd;AAAK,IAAA,SAAS,EAAC;AAAf,eAAsCA,eAAtC,EAjBJ,CADF;AAsBD,CApGM;AAsGP,eAAeX,kBAAf","sourcesContent":["import React, {\n ChangeEvent,\n KeyboardEvent,\n MouseEvent,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport { PromiseUtils } from '@deephaven/utils';\nimport './FileListItemEditor.scss';\nimport { FileStorageItem } from './FileStorage';\n\nconst log = Log.module('FileListItemEditor');\n\nexport interface FileListItemEditorProps {\n item: FileStorageItem;\n onCancel: () => void;\n onSubmit: (newName: string) => void;\n validate?: (newName: string) => Promise<void>;\n}\n\nexport const FileListItemEditor = ({\n item,\n onCancel,\n onSubmit,\n validate = () => Promise.resolve(),\n}: FileListItemEditorProps): JSX.Element => {\n const input = useRef<HTMLInputElement>(null);\n const [value, setValue] = useState(item.basename);\n const [validationError, setValidationError] = useState<Error>();\n const [validationPromise, setValidationPromise] = useState<Promise<void>>(\n Promise.resolve()\n );\n\n const focus = useCallback(() => {\n input.current?.focus();\n // Select the proper range based on the type...\n }, [input]);\n\n const stopPropagation = useCallback(\n (e: MouseEvent) => e.stopPropagation(),\n []\n );\n\n const validateAndSubmit = useCallback(() => {\n validationPromise\n .then(() => {\n onSubmit(value);\n })\n .catch(e => log.info('Unable to validate name', e));\n }, [onSubmit, value, validationPromise]);\n\n useEffect(() => {\n const validatePromise = PromiseUtils.makeCancelable(validate(value));\n validatePromise\n .then(() => setValidationError(undefined))\n .catch(e => {\n if (!PromiseUtils.isCanceled(e)) {\n setValidationError(e);\n }\n });\n setValidationPromise(validatePromise);\n return () => validatePromise.cancel();\n }, [validate, value]);\n\n useEffect(() => {\n focus();\n }, [focus]);\n\n const handleBlur = useCallback(() => {\n log.debug2('handleBlur');\n validateAndSubmit();\n }, [validateAndSubmit]);\n\n const handleChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n const { value: newValue } = e.target;\n setValue(newValue);\n }, []);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n e.stopPropagation();\n\n const { key } = e;\n switch (key) {\n case 'Enter': {\n validateAndSubmit();\n break;\n }\n case 'Escape': {\n onCancel();\n break;\n }\n default:\n }\n },\n [onCancel, validateAndSubmit]\n );\n\n return (\n <div className=\"file-list-item-editor\">\n <input\n type=\"text\"\n className={classNames('form-control file-list-item-editor-input', {\n 'is-invalid': validationError,\n })}\n value={value}\n ref={input}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onChange={handleChange}\n onClick={stopPropagation}\n onDoubleClick={stopPropagation}\n onMouseDown={stopPropagation}\n />\n\n {validationError && (\n <div className=\"invalid-feedback\">{`${validationError}`}</div>\n )}\n </div>\n );\n};\n\nexport default FileListItemEditor;\n"],"file":"FileListItemEditor.js"}
1
+ {"version":3,"sources":["../src/FileListItemEditor.tsx"],"names":["React","useCallback","useEffect","useRef","useState","classNames","Log","PromiseUtils","log","module","FileListItemEditor","item","onCancel","onSubmit","validate","Promise","resolve","input","value","setValue","basename","validationError","setValidationError","validationPromise","setValidationPromise","focus","current","stopPropagation","e","validateAndSubmit","then","catch","info","validateValueAndSetPromise","validatePromise","makeCancelable","undefined","isCanceled","cancel","selectRange","handleBlur","debug2","handleChange","newValue","target","handleKeyDown","key"],"mappings":"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","sourcesContent":["import React, {\n ChangeEvent,\n KeyboardEvent,\n MouseEvent,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport { PromiseUtils } from '@deephaven/utils';\nimport './FileListItemEditor.scss';\nimport { FileStorageItem } from './FileStorage';\n\nconst log = Log.module('FileListItemEditor');\n\nexport interface FileListItemEditorProps {\n item: FileStorageItem;\n onCancel: () => void;\n onSubmit: (newName: string) => void;\n validate?: (newName: string) => Promise<void>;\n}\n\nexport const FileListItemEditor = ({\n item,\n onCancel,\n onSubmit,\n validate = () => Promise.resolve(),\n}: FileListItemEditorProps): JSX.Element => {\n const input = useRef<HTMLInputElement>(null);\n const [value, setValue] = useState(item.basename);\n const [validationError, setValidationError] = useState<Error>();\n const [validationPromise, setValidationPromise] = useState<Promise<void>>(\n Promise.resolve()\n );\n\n const focus = useCallback(() => {\n input.current?.focus();\n // Select the proper range based on the type...\n }, [input]);\n\n const stopPropagation = useCallback(\n (e: MouseEvent) => e.stopPropagation(),\n []\n );\n\n const validateAndSubmit = useCallback(() => {\n validationPromise\n .then(() => {\n onSubmit(value);\n })\n .catch(e => log.info('Unable to validate name', e));\n }, [onSubmit, value, validationPromise]);\n\n useEffect(\n function validateValueAndSetPromise() {\n const validatePromise = PromiseUtils.makeCancelable(validate(value));\n validatePromise\n .then(() => setValidationError(undefined))\n .catch(e => {\n if (!PromiseUtils.isCanceled(e)) {\n setValidationError(e);\n }\n });\n setValidationPromise(validatePromise);\n return () => validatePromise.cancel();\n },\n [validate, value]\n );\n\n useEffect(\n function selectRange() {\n focus();\n },\n [focus]\n );\n\n const handleBlur = useCallback(() => {\n log.debug2('handleBlur');\n validateAndSubmit();\n }, [validateAndSubmit]);\n\n const handleChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n const { value: newValue } = e.target;\n setValue(newValue);\n }, []);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n e.stopPropagation();\n\n const { key } = e;\n switch (key) {\n case 'Enter': {\n validateAndSubmit();\n break;\n }\n case 'Escape': {\n onCancel();\n break;\n }\n default:\n }\n },\n [onCancel, validateAndSubmit]\n );\n\n return (\n <div className=\"file-list-item-editor\">\n <input\n type=\"text\"\n className={classNames('form-control file-list-item-editor-input', {\n 'is-invalid': validationError,\n })}\n value={value}\n ref={input}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onChange={handleChange}\n onClick={stopPropagation}\n onDoubleClick={stopPropagation}\n onMouseDown={stopPropagation}\n />\n\n {validationError && (\n <div className=\"invalid-feedback\">{`${validationError}`}</div>\n )}\n </div>\n );\n};\n\nexport default FileListItemEditor;\n"],"file":"FileListItemEditor.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deephaven/file-explorer",
3
- "version": "0.11.9-beta.0+34ddf36",
3
+ "version": "0.11.10-beta.2+7418086",
4
4
  "description": "Deephaven File Explorer React component",
5
5
  "author": "Deephaven Data Labs LLC",
6
6
  "license": "Apache-2.0",
@@ -30,9 +30,9 @@
30
30
  "start": "cross-env NODE_ENV=development npm run watch"
31
31
  },
32
32
  "dependencies": {
33
- "@deephaven/icons": "^0.11.9-beta.0+34ddf36",
34
- "@deephaven/storage": "^0.11.9-beta.0+34ddf36",
35
- "@deephaven/utils": "^0.11.9-beta.0+34ddf36",
33
+ "@deephaven/icons": "^0.11.10-beta.2+7418086",
34
+ "@deephaven/storage": "^0.11.10-beta.2+7418086",
35
+ "@deephaven/utils": "^0.11.10-beta.2+7418086",
36
36
  "@fortawesome/fontawesome-svg-core": "1.2.36",
37
37
  "@fortawesome/react-fontawesome": "^0.1.15",
38
38
  "classnames": "^2.3.1",
@@ -47,8 +47,8 @@
47
47
  "react": "^17.0.0"
48
48
  },
49
49
  "devDependencies": {
50
- "@deephaven/log": "^0.11.9-beta.0+34ddf36",
51
- "@deephaven/tsconfig": "^0.11.9-beta.0+34ddf36"
50
+ "@deephaven/log": "^0.11.10-beta.2+7418086",
51
+ "@deephaven/tsconfig": "^0.11.10-beta.2+7418086"
52
52
  },
53
53
  "files": [
54
54
  "dist"
@@ -56,5 +56,5 @@
56
56
  "publishConfig": {
57
57
  "access": "public"
58
58
  },
59
- "gitHead": "34ddf36a257f99891c1387f8dfd1ed9aac95faee"
59
+ "gitHead": "741808673294dda2692c64463d48017722375b47"
60
60
  }