@deephaven/file-explorer 0.17.1-beta.4 → 0.18.1-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,6 +7,7 @@ export interface FileExplorerProps {
7
7
  onDelete?: (files: FileStorageItem[]) => void;
8
8
  onRename?: (oldName: string, newName: string) => void;
9
9
  onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => void;
10
+ onSelectionChange?: (selectedItems: FileStorageItem[]) => void;
10
11
  /** Height of each item in the list */
11
12
  rowHeight?: number;
12
13
  }
@@ -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;;CAqKlE,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;IACvE,iBAAiB,CAAC,EAAE,CAAC,aAAa,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;IAE/D,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,YAAY;YAAW,iBAAiB,GAAG,WAAW;;CAuKlE,CAAC;AAIF,eAAe,YAAY,CAAC"}
@@ -25,6 +25,7 @@ export var FileExplorer = props => {
25
25
  onDelete = () => undefined,
26
26
  onRename = () => undefined,
27
27
  onSelect,
28
+ onSelectionChange,
28
29
  rowHeight = DEFAULT_ROW_HEIGHT
29
30
  } = props;
30
31
  var [itemsToDelete, setItemsToDelete] = useState([]);
@@ -147,6 +148,7 @@ export var FileExplorer = props => {
147
148
  onDelete: handleDelete,
148
149
  onRename: handleRename,
149
150
  onSelect: onSelect,
151
+ onSelectionChange: onSelectionChange,
150
152
  rowHeight: rowHeight,
151
153
  table: table,
152
154
  validateRename: handleValidateRename
@@ -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","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"],"sources":["../src/FileExplorer.tsx"],"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"],"mappings":"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"}
1
+ {"version":3,"file":"FileExplorer.js","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","onSelectionChange","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"],"sources":["../src/FileExplorer.tsx"],"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 onSelectionChange?: (selectedItems: FileStorageItem[]) => void;\n\n /** Height of each item in the list */\n rowHeight?: number;\n}\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorage.\n */\nexport const FileExplorer = (props: FileExplorerProps): JSX.Element => {\n const {\n storage,\n isMultiSelect = false,\n onDelete = () => undefined,\n onRename = () => 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() {\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 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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"FileExplorerToolbar.d.ts","sourceRoot":"","sources":["../src/FileExplorerToolbar.tsx"],"names":[],"mappings":";AAGA,OAAO,4BAA4B,CAAC;AAEpC,aAAK,wBAAwB,GAAG;IAC9B,UAAU,IAAI,IAAI,CAAC;IACnB,YAAY,IAAI,IAAI,CAAC;IACrB,cAAc,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,mBAAmB,qEAK7B,wBAAwB,KAAG,WA0B7B,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"FileExplorerToolbar.d.ts","sourceRoot":"","sources":["../src/FileExplorerToolbar.tsx"],"names":[],"mappings":";AAGA,OAAO,4BAA4B,CAAC;AAEpC,aAAK,wBAAwB,GAAG;IAC9B,UAAU,IAAI,IAAI,CAAC;IACnB,YAAY,IAAI,IAAI,CAAC;IACrB,cAAc,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,mBAAmB,qEAK7B,wBAAwB,KAAG,WA4B7B,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
@@ -17,12 +17,14 @@ export var FileExplorerToolbar = _ref => {
17
17
  kind: "ghost",
18
18
  icon: vsNewFile,
19
19
  tooltip: "New notebook",
20
- onClick: createFile
20
+ onClick: createFile,
21
+ "aria-label": "New notebook"
21
22
  }), /*#__PURE__*/React.createElement(Button, {
22
23
  kind: "ghost",
23
24
  icon: vsNewFolder,
24
25
  tooltip: "New folder",
25
- onClick: createFolder
26
+ onClick: createFolder,
27
+ "aria-label": "New folder"
26
28
  })), onSearchChange && /*#__PURE__*/React.createElement("div", {
27
29
  className: "file-explorer-toolbar-search"
28
30
  }, /*#__PURE__*/React.createElement(DebouncedSearchInput, {
@@ -1 +1 @@
1
- {"version":3,"file":"FileExplorerToolbar.js","names":["React","Button","DebouncedSearchInput","vsNewFile","vsNewFolder","FileExplorerToolbar","createFile","createFolder","onSearchChange","defaultSearchText"],"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 const FileExplorerToolbar = ({\n createFile,\n createFolder,\n onSearchChange,\n defaultSearchText = '',\n}: FileExplorerToolbarProps): JSX.Element => (\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 />\n <Button\n kind=\"ghost\"\n icon={vsNewFolder}\n tooltip=\"New folder\"\n onClick={createFolder}\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\nexport default FileExplorerToolbar;\n"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,MAAT,EAAiBC,oBAAjB,QAA6C,uBAA7C;AACA,SAASC,SAAT,EAAoBC,WAApB,QAAuC,kBAAvC;;AAUA,OAAO,IAAMC,mBAAmB,GAAG;EAAA,IAAC;IAClCC,UADkC;IAElCC,YAFkC;IAGlCC,cAHkC;IAIlCC,iBAAiB,GAAG;EAJc,CAAD;EAAA,oBAMjC;IAAK,SAAS,EAAC;EAAf,gBACE;IAAK,SAAS,EAAC;EAAf,gBACE,oBAAC,MAAD;IACE,IAAI,EAAC,OADP;IAEE,IAAI,EAAEN,SAFR;IAGE,OAAO,EAAC,cAHV;IAIE,OAAO,EAAEG;EAJX,EADF,eAOE,oBAAC,MAAD;IACE,IAAI,EAAC,OADP;IAEE,IAAI,EAAEF,WAFR;IAGE,OAAO,EAAC,YAHV;IAIE,OAAO,EAAEG;EAJX,EAPF,CADF,EAeGC,cAAc,iBACb;IAAK,SAAS,EAAC;EAAf,gBACE,oBAAC,oBAAD;IACE,KAAK,EAAEC,iBADT;IAEE,QAAQ,EAAED,cAFZ;IAGE,WAAW,EAAC;EAHd,EADF,CAhBJ,CANiC;AAAA,CAA5B;AAiCP,eAAeH,mBAAf"}
1
+ {"version":3,"file":"FileExplorerToolbar.js","names":["React","Button","DebouncedSearchInput","vsNewFile","vsNewFolder","FileExplorerToolbar","createFile","createFolder","onSearchChange","defaultSearchText"],"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 const FileExplorerToolbar = ({\n createFile,\n createFolder,\n onSearchChange,\n defaultSearchText = '',\n}: FileExplorerToolbarProps): JSX.Element => (\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\nexport default FileExplorerToolbar;\n"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,MAAT,EAAiBC,oBAAjB,QAA6C,uBAA7C;AACA,SAASC,SAAT,EAAoBC,WAApB,QAAuC,kBAAvC;;AAUA,OAAO,IAAMC,mBAAmB,GAAG;EAAA,IAAC;IAClCC,UADkC;IAElCC,YAFkC;IAGlCC,cAHkC;IAIlCC,iBAAiB,GAAG;EAJc,CAAD;EAAA,oBAMjC;IAAK,SAAS,EAAC;EAAf,gBACE;IAAK,SAAS,EAAC;EAAf,gBACE,oBAAC,MAAD;IACE,IAAI,EAAC,OADP;IAEE,IAAI,EAAEN,SAFR;IAGE,OAAO,EAAC,cAHV;IAIE,OAAO,EAAEG,UAJX;IAKE,cAAW;EALb,EADF,eAQE,oBAAC,MAAD;IACE,IAAI,EAAC,OADP;IAEE,IAAI,EAAEF,WAFR;IAGE,OAAO,EAAC,YAHV;IAIE,OAAO,EAAEG,YAJX;IAKE,cAAW;EALb,EARF,CADF,EAiBGC,cAAc,iBACb;IAAK,SAAS,EAAC;EAAf,gBACE,oBAAC,oBAAD;IACE,KAAK,EAAEC,iBADT;IAEE,QAAQ,EAAED,cAFZ;IAGE,WAAW,EAAC;EAHd,EADF,CAlBJ,CANiC;AAAA,CAA5B;AAmCP,eAAeH,mBAAf"}
@@ -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,WAyX/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,WA6EF,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
@@ -105,7 +105,8 @@ export var renderFileListItem = props => {
105
105
  return onDrop;
106
106
  }(e => onDrop(itemIndex, e)),
107
107
  draggable: true,
108
- role: "presentation"
108
+ role: "presentation",
109
+ "aria-label": item.basename
109
110
  }, depthLines, ' ', /*#__PURE__*/React.createElement(FontAwesomeIcon, {
110
111
  icon: icon,
111
112
  className: "item-icon",
@@ -1 +1 @@
1
- {"version":3,"file":"FileList.js","names":["ItemList","Tooltip","dhPython","vsCode","vsFolder","vsFolderOpened","Log","RangeUtils","FontAwesomeIcon","classNames","React","useCallback","useEffect","useMemo","useRef","useState","isDirectory","FileUtils","MIME_TYPE","log","module","getPathFromItem","file","makePath","filename","getPath","DEFAULT_ROW_HEIGHT","DRAG_HOVER_TIMEOUT","ITEM_LIST_CLASS_NAME","renderFileListItem","props","children","draggedItems","isDragInProgress","isDropTargetValid","isSelected","item","itemIndex","dropTargetItem","onDragStart","onDragOver","onDragEnd","onDrop","isDragged","some","draggedItem","id","itemPath","dropTargetPath","isExactDropTarget","isInDropTarget","isInvalidDropTarget","icon","getItemIcon","depth","getDepth","depthLines","Array","fill","map","value","index","e","basename","modifiers","preventOverflow","boundariesElement","placement","isExpanded","mimeType","getMimeType","PYTHON","getMoveOperation","targetItem","length","Error","targetPath","startsWith","files","FileList","isMultiSelect","table","onFocusChange","undefined","onMove","onSelect","onSelectionChange","renderItem","rowHeight","overscanCount","DEFAULT_OVERSCAN","loadedViewport","setLoadedViewport","items","offset","itemCount","viewport","setViewport","top","bottom","setDropTargetItem","setDraggedItems","dragPlaceholder","setDragPlaceholder","selectedRanges","setSelectedRanges","itemList","fileList","getItems","ranges","i","range","j","push","getItem","getDragPlaceholderText","count","dropItems","debug","current","focusItem","err","error","handleSelect","event","setExpanded","handleItemDragStart","debug2","draggedRanges","resetMouseState","newDragPlaceholder","document","createElement","innerHTML","className","body","appendChild","dataTransfer","setDragImage","effectAllowed","handleItemDragOver","preventDefault","handleItemDragEnd","remove","handleItemDrop","handleItemDragExit","handleListDragOver","target","Element","classList","contains","type","handleListDrop","handleSelectionChange","newSelectedRanges","selectedItems","handleFocusChange","focusIndex","focusedItem","handleViewportChange","updateTableViewport","Math","max","setLoadedViewportAndReturnCleanup","listenerRemover","onUpdate","newViewport","itemName","size","expandFolderOnHover","timeout","setTimeout","clearTimeout","renderWrapper","itemProps","onDragExit"],"sources":["../src/FileList.tsx"],"sourcesContent":["import {\n ItemList,\n Range,\n RenderItemProps,\n Tooltip,\n} from '@deephaven/components';\nimport { dhPython, vsCode, vsFolder, vsFolderOpened } from '@deephaven/icons';\nimport Log from '@deephaven/log';\nimport { RangeUtils } from '@deephaven/utils';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport classNames from 'classnames';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { FileStorageItem, FileStorageTable, isDirectory } from './FileStorage';\nimport './FileList.scss';\nimport FileUtils, { MIME_TYPE } from './FileUtils';\n\nconst log = Log.module('FileList');\n\nexport type LoadedViewport = {\n items: FileStorageItem[];\n offset: number;\n itemCount: number;\n};\n\nexport type ListViewport = {\n top: number;\n bottom: number;\n};\n\nexport type FileListRenderItemProps = RenderItemProps<FileStorageItem> & {\n children?: JSX.Element;\n dropTargetItem?: FileStorageItem;\n draggedItems?: FileStorageItem[];\n isDragInProgress: boolean;\n isDropTargetValid: boolean;\n\n onDragStart(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragOver(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragEnd(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDrop(index: number, e: React.DragEvent<HTMLDivElement>): void;\n};\n\nexport interface FileListProps {\n table: FileStorageTable;\n\n isMultiSelect?: boolean;\n\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 item Item to get the icon for\n * @returns Icon definition to pass in the FontAwesomeIcon icon prop\n */\nexport function getItemIcon(item: FileStorageItem): IconDefinition {\n if (isDirectory(item)) {\n return item.isExpanded ? vsFolderOpened : vsFolder;\n }\n const mimeType = FileUtils.getMimeType(item.basename);\n switch (mimeType) {\n case MIME_TYPE.PYTHON:\n return dhPython;\n default:\n return vsCode;\n }\n}\n\n/**\n * Get the move operation for the current selection and the given target. Throws if the operation is invalid.\n */\nexport function getMoveOperation(\n draggedItems: FileStorageItem[],\n targetItem: FileStorageItem\n): { files: FileStorageItem[]; targetPath: string } {\n if (draggedItems.length === 0 || !targetItem) {\n throw new Error('No items to move');\n }\n\n const targetPath = getPathFromItem(targetItem);\n if (\n draggedItems.some(\n ({ filename }) => FileUtils.getPath(filename) === targetPath\n )\n ) {\n // Cannot drop if target is one of the dragged items is already in the target folder\n throw new Error('File already in the destination folder');\n }\n if (\n draggedItems.some(\n item =>\n isDirectory(item) &&\n targetPath.startsWith(FileUtils.makePath(item.filename))\n )\n ) {\n // Cannot drop if target is a child of one of the directories being moved\n throw new Error('Destination folder cannot be a child of a dragged folder');\n }\n return { files: draggedItems, targetPath };\n}\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorageTable.\n */\nexport const FileList = (props: FileListProps): JSX.Element => {\n const {\n isMultiSelect = false,\n table,\n onFocusChange = () => undefined,\n onMove,\n onSelect,\n onSelectionChange = () => undefined,\n renderItem = renderFileListItem,\n rowHeight = DEFAULT_ROW_HEIGHT,\n overscanCount = ItemList.DEFAULT_OVERSCAN,\n } = props;\n const [loadedViewport, setLoadedViewport] = useState<LoadedViewport>(() => ({\n items: [],\n offset: 0,\n itemCount: 0,\n }));\n const [viewport, setViewport] = useState<ListViewport>({\n top: 0,\n bottom: 0,\n });\n\n const [dropTargetItem, setDropTargetItem] = useState<FileStorageItem>();\n const [draggedItems, setDraggedItems] = useState<FileStorageItem[]>();\n const [dragPlaceholder, setDragPlaceholder] = useState<HTMLDivElement>();\n const [selectedRanges, setSelectedRanges] = useState([] as Range[]);\n 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"],"mappings":"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"}
1
+ {"version":3,"file":"FileList.js","names":["ItemList","Tooltip","dhPython","vsCode","vsFolder","vsFolderOpened","Log","RangeUtils","FontAwesomeIcon","classNames","React","useCallback","useEffect","useMemo","useRef","useState","isDirectory","FileUtils","MIME_TYPE","log","module","getPathFromItem","file","makePath","filename","getPath","DEFAULT_ROW_HEIGHT","DRAG_HOVER_TIMEOUT","ITEM_LIST_CLASS_NAME","renderFileListItem","props","children","draggedItems","isDragInProgress","isDropTargetValid","isSelected","item","itemIndex","dropTargetItem","onDragStart","onDragOver","onDragEnd","onDrop","isDragged","some","draggedItem","id","itemPath","dropTargetPath","isExactDropTarget","isInDropTarget","isInvalidDropTarget","icon","getItemIcon","depth","getDepth","depthLines","Array","fill","map","value","index","e","basename","modifiers","preventOverflow","boundariesElement","placement","isExpanded","mimeType","getMimeType","PYTHON","getMoveOperation","targetItem","length","Error","targetPath","startsWith","files","FileList","isMultiSelect","table","onFocusChange","undefined","onMove","onSelect","onSelectionChange","renderItem","rowHeight","overscanCount","DEFAULT_OVERSCAN","loadedViewport","setLoadedViewport","items","offset","itemCount","viewport","setViewport","top","bottom","setDropTargetItem","setDraggedItems","dragPlaceholder","setDragPlaceholder","selectedRanges","setSelectedRanges","itemList","fileList","getItems","ranges","i","range","j","push","getItem","getDragPlaceholderText","count","dropItems","debug","current","focusItem","err","error","handleSelect","event","setExpanded","handleItemDragStart","debug2","draggedRanges","resetMouseState","newDragPlaceholder","document","createElement","innerHTML","className","body","appendChild","dataTransfer","setDragImage","effectAllowed","handleItemDragOver","preventDefault","handleItemDragEnd","remove","handleItemDrop","handleItemDragExit","handleListDragOver","target","Element","classList","contains","type","handleListDrop","handleSelectionChange","newSelectedRanges","selectedItems","handleFocusChange","focusIndex","focusedItem","handleViewportChange","updateTableViewport","Math","max","setLoadedViewportAndReturnCleanup","listenerRemover","onUpdate","newViewport","itemName","size","expandFolderOnHover","timeout","setTimeout","clearTimeout","renderWrapper","itemProps","onDragExit"],"sources":["../src/FileList.tsx"],"sourcesContent":["import {\n ItemList,\n Range,\n RenderItemProps,\n Tooltip,\n} from '@deephaven/components';\nimport { dhPython, vsCode, vsFolder, vsFolderOpened } from '@deephaven/icons';\nimport Log from '@deephaven/log';\nimport { RangeUtils } from '@deephaven/utils';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport classNames from 'classnames';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { FileStorageItem, FileStorageTable, isDirectory } from './FileStorage';\nimport './FileList.scss';\nimport FileUtils, { MIME_TYPE } from './FileUtils';\n\nconst log = Log.module('FileList');\n\nexport type LoadedViewport = {\n items: FileStorageItem[];\n offset: number;\n itemCount: number;\n};\n\nexport type ListViewport = {\n top: number;\n bottom: number;\n};\n\nexport type FileListRenderItemProps = RenderItemProps<FileStorageItem> & {\n children?: JSX.Element;\n dropTargetItem?: FileStorageItem;\n draggedItems?: FileStorageItem[];\n isDragInProgress: boolean;\n isDropTargetValid: boolean;\n\n onDragStart(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragOver(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragEnd(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDrop(index: number, e: React.DragEvent<HTMLDivElement>): void;\n};\n\nexport interface FileListProps {\n table: FileStorageTable;\n\n isMultiSelect?: boolean;\n\n onFocusChange?: (focusedItem?: FileStorageItem) => void;\n onMove: (files: FileStorageItem[], path: string) => void;\n onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => void;\n onSelectionChange?: (selectedItems: FileStorageItem[]) => void;\n\n renderItem?: (props: FileListRenderItemProps) => JSX.Element;\n\n /** Height of each item in the list */\n rowHeight?: number;\n\n overscanCount?: number;\n}\n\nexport const getPathFromItem = (file: FileStorageItem): string =>\n isDirectory(file)\n ? FileUtils.makePath(file.filename)\n : FileUtils.getPath(file.filename);\n\nexport const DEFAULT_ROW_HEIGHT = 26;\n\n// How long you need to hover over a directory before it expands\nexport const DRAG_HOVER_TIMEOUT = 500;\n\nconst ITEM_LIST_CLASS_NAME = 'item-list-scroll-pane';\n\nexport const renderFileListItem = (\n props: FileListRenderItemProps\n): JSX.Element => {\n const {\n children,\n draggedItems,\n isDragInProgress,\n isDropTargetValid,\n isSelected,\n item,\n itemIndex,\n dropTargetItem,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n } = props;\n\n const isDragged =\n draggedItems?.some(draggedItem => draggedItem.id === item.id) ?? false;\n const itemPath = getPathFromItem(item);\n const dropTargetPath =\n isDragInProgress && dropTargetItem ? getPathFromItem(dropTargetItem) : null;\n\n const isExactDropTarget =\n isDragInProgress &&\n isDropTargetValid &&\n isDirectory(item) &&\n dropTargetPath === itemPath;\n const isInDropTarget =\n isDragInProgress && isDropTargetValid && dropTargetPath === itemPath;\n const isInvalidDropTarget =\n isDragInProgress && !isDropTargetValid && dropTargetPath === itemPath;\n\n const icon = getItemIcon(item);\n const depth = FileUtils.getDepth(item.filename);\n const depthLines = Array(depth)\n .fill(null)\n .map((value, index) => (\n // eslint-disable-next-line react/no-array-index-key\n <span className=\"file-list-depth-line\" key={index} />\n ));\n\n return (\n <div\n className={classNames(\n 'd-flex w-100 align-items-center',\n 'file-list-item',\n {\n 'is-dragged': isDragged,\n 'is-exact-drop-target': isExactDropTarget,\n 'is-in-drop-target': isInDropTarget,\n 'is-invalid-drop-target': isInvalidDropTarget,\n 'is-selected': isSelected,\n }\n )}\n onDragStart={e => onDragStart(itemIndex, e)}\n onDragOver={e => onDragOver(itemIndex, e)}\n onDragEnd={e => onDragEnd(itemIndex, e)}\n onDrop={e => onDrop(itemIndex, e)}\n draggable\n role=\"presentation\"\n aria-label={item.basename}\n >\n {depthLines}{' '}\n <FontAwesomeIcon icon={icon} className=\"item-icon\" fixedWidth />{' '}\n <span className=\"truncation-wrapper\">\n {children ?? item.basename}\n <Tooltip\n options={{\n modifiers: { preventOverflow: { boundariesElement: 'window' } },\n placement: 'left',\n }}\n >\n {children ?? item.basename}\n </Tooltip>\n </span>\n </div>\n );\n};\n\n/**\n * Get the icon definition for a file or folder item\n * @param item Item to get the icon for\n * @returns Icon definition to pass in the FontAwesomeIcon icon prop\n */\nexport function getItemIcon(item: FileStorageItem): IconDefinition {\n if (isDirectory(item)) {\n return item.isExpanded ? vsFolderOpened : vsFolder;\n }\n const mimeType = FileUtils.getMimeType(item.basename);\n switch (mimeType) {\n case MIME_TYPE.PYTHON:\n return dhPython;\n default:\n return vsCode;\n }\n}\n\n/**\n * Get the move operation for the current selection and the given target. Throws if the operation is invalid.\n */\nexport function getMoveOperation(\n draggedItems: FileStorageItem[],\n targetItem: FileStorageItem\n): { files: FileStorageItem[]; targetPath: string } {\n if (draggedItems.length === 0 || !targetItem) {\n throw new Error('No items to move');\n }\n\n const targetPath = getPathFromItem(targetItem);\n if (\n draggedItems.some(\n ({ filename }) => FileUtils.getPath(filename) === targetPath\n )\n ) {\n // Cannot drop if target is one of the dragged items is already in the target folder\n throw new Error('File already in the destination folder');\n }\n if (\n draggedItems.some(\n item =>\n isDirectory(item) &&\n targetPath.startsWith(FileUtils.makePath(item.filename))\n )\n ) {\n // Cannot drop if target is a child of one of the directories being moved\n throw new Error('Destination folder cannot be a child of a dragged folder');\n }\n return { files: draggedItems, targetPath };\n}\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorageTable.\n */\nexport const FileList = (props: FileListProps): JSX.Element => {\n const {\n isMultiSelect = false,\n table,\n onFocusChange = () => undefined,\n onMove,\n onSelect,\n onSelectionChange = () => undefined,\n renderItem = renderFileListItem,\n rowHeight = DEFAULT_ROW_HEIGHT,\n overscanCount = ItemList.DEFAULT_OVERSCAN,\n } = props;\n const [loadedViewport, setLoadedViewport] = useState<LoadedViewport>(() => ({\n items: [],\n offset: 0,\n itemCount: 0,\n }));\n const [viewport, setViewport] = useState<ListViewport>({\n top: 0,\n bottom: 0,\n });\n\n const [dropTargetItem, setDropTargetItem] = useState<FileStorageItem>();\n const [draggedItems, setDraggedItems] = useState<FileStorageItem[]>();\n const [dragPlaceholder, setDragPlaceholder] = useState<HTMLDivElement>();\n const [selectedRanges, setSelectedRanges] = useState([] as Range[]);\n 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"],"mappings":"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"}
@@ -13,6 +13,7 @@ export interface FileListContainerProps {
13
13
  onRename?: (file: FileStorageItem, newName: string) => void;
14
14
  onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => void;
15
15
  validateRename?: (file: FileStorageItem, newName: string) => Promise<void>;
16
+ onSelectionChange?: (selectedItems: FileStorageItem[]) => void;
16
17
  /** Height of each item in the list */
17
18
  rowHeight?: number;
18
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FileListContainer.d.ts","sourceRoot":"","sources":["../src/FileListContainer.tsx"],"names":[],"mappings":"AACA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAM9D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAe,MAAM,eAAe,CAAC;AAE/E,OAAO,qBAAqB,CAAC;AAI7B,MAAM,WAAW,sBAAsB;IACrC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,EAAE,gBAAgB,CAAC;IAExB,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,cAAc,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;IAC9C,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5D,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,cAAc,KAAK,IAAI,CAAC;IACvE,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3E,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB;YACrB,sBAAsB,GAC5B,WAAW;;CAyLb,CAAC;AAIF,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"FileListContainer.d.ts","sourceRoot":"","sources":["../src/FileListContainer.tsx"],"names":[],"mappings":"AACA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAM9D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAe,MAAM,eAAe,CAAC;AAE/E,OAAO,qBAAqB,CAAC;AAI7B,MAAM,WAAW,sBAAsB;IACrC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,EAAE,gBAAgB,CAAC;IAExB,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,cAAc,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;IAC9C,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5D,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,cAAc,KAAK,IAAI,CAAC;IACvE,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,iBAAiB,CAAC,EAAE,CAAC,aAAa,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;IAE/D,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB;YACrB,sBAAsB,GAC5B,WAAW;;CA8Lb,CAAC;AAIF,eAAe,iBAAiB,CAAC"}
@@ -27,6 +27,7 @@ export var FileListContainer = props => {
27
27
  onMove = () => undefined,
28
28
  onRename,
29
29
  onSelect,
30
+ onSelectionChange,
30
31
  table,
31
32
  rowHeight = DEFAULT_ROW_HEIGHT,
32
33
  validateRename = () => Promise.resolve()
@@ -36,7 +37,8 @@ export var FileListContainer = props => {
36
37
  var [focusedItem, setFocusedItem] = useState();
37
38
  var handleSelectionChange = useCallback(newSelectedItems => {
38
39
  setSelectedItems(newSelectedItems);
39
- }, []);
40
+ onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange(newSelectedItems);
41
+ }, [onSelectionChange]);
40
42
  var handleFocusChange = useCallback(newFocusedItem => {
41
43
  setFocusedItem(newFocusedItem);
42
44
  }, []);
@@ -1 +1 @@
1
- {"version":3,"file":"FileListContainer.js","names":["ContextActions","React","useCallback","useMemo","useState","FileList","renderFileListItem","DEFAULT_ROW_HEIGHT","isDirectory","SHORTCUTS","FileUtils","FileListItemEditor","FileListContainer","props","isMultiSelect","showContextMenu","onCreateFile","onCreateFolder","onCopy","onDelete","onMove","undefined","onRename","onSelect","table","rowHeight","validateRename","Promise","resolve","renameItem","setRenameItem","selectedItems","setSelectedItems","focusedItem","setFocusedItem","handleSelectionChange","newSelectedItems","handleFocusChange","newFocusedItem","handleCopyAction","handleDeleteAction","length","handleNewFileAction","handleNewFolderAction","getPath","filename","handleRenameAction","handleRenameCancel","handleRenameSubmit","newName","actions","result","push","title","description","action","group","groups","medium","low","disabled","shortcut","FILE_EXPLORER","DELETE","RENAME","validateRenameItem","reject","Error","renderItem","itemProps","item","children","displayName"],"sources":["../src/FileListContainer.tsx"],"sourcesContent":["import { ContextAction, ContextActions } from '@deephaven/components';\nimport React, { useCallback, useMemo, useState } from 'react';\nimport FileList, {\n renderFileListItem,\n DEFAULT_ROW_HEIGHT,\n FileListRenderItemProps,\n} from './FileList';\nimport { FileStorageItem, FileStorageTable, isDirectory } from './FileStorage';\nimport SHORTCUTS from './FileExplorerShortcuts';\nimport './FileExplorer.scss';\nimport FileUtils from './FileUtils';\nimport FileListItemEditor from './FileListItemEditor';\n\nexport interface FileListContainerProps {\n showContextMenu?: boolean;\n table: FileStorageTable;\n\n isMultiSelect?: boolean;\n\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\n /** Height of each item in the list */\n rowHeight?: number;\n}\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorage.\n */\nexport const FileListContainer = (\n props: FileListContainerProps\n): JSX.Element => {\n const {\n isMultiSelect = false,\n showContextMenu = false,\n onCreateFile,\n onCreateFolder,\n onCopy,\n onDelete,\n onMove = () => undefined,\n onRename,\n onSelect,\n table,\n rowHeight = DEFAULT_ROW_HEIGHT,\n validateRename = () => Promise.resolve(),\n } = props;\n const [renameItem, setRenameItem] = useState<FileStorageItem>();\n const [selectedItems, setSelectedItems] = useState([] as FileStorageItem[]);\n const [focusedItem, setFocusedItem] = useState<FileStorageItem>();\n\n const handleSelectionChange = useCallback(newSelectedItems => {\n setSelectedItems(newSelectedItems);\n }, []);\n\n const handleFocusChange = useCallback(newFocusedItem => {\n setFocusedItem(newFocusedItem);\n }, []);\n\n const handleCopyAction = useCallback(() => {\n if (focusedItem) {\n onCopy?.(focusedItem);\n }\n }, [focusedItem, onCopy]);\n\n const handleDeleteAction = useCallback(() => {\n if (selectedItems.length > 0) {\n onDelete?.(selectedItems);\n }\n }, [onDelete, selectedItems]);\n\n const handleNewFileAction = useCallback(() => {\n onCreateFile?.();\n }, [onCreateFile]);\n\n const handleNewFolderAction = useCallback(() => {\n if (focusedItem) {\n onCreateFolder?.(FileUtils.getPath(focusedItem.filename));\n }\n }, [focusedItem, onCreateFolder]);\n\n const handleRenameAction = useCallback(() => {\n if (focusedItem) {\n setRenameItem(focusedItem);\n }\n }, [focusedItem]);\n\n const handleRenameCancel = useCallback((): void => {\n setRenameItem(undefined);\n }, []);\n\n const handleRenameSubmit = useCallback(\n (newName: string): void => {\n if (renameItem) {\n onRename?.(renameItem, newName);\n setRenameItem(undefined);\n }\n },\n [onRename, renameItem]\n );\n\n const actions = useMemo(() => {\n if (renameItem) {\n // While renaming, we don't want to enable any of the context actions or it may interfere with renaming input\n return [];\n }\n\n const result = [] as ContextAction[];\n if (onCreateFile) {\n result.push({\n title: 'New File',\n description: 'Create new file',\n action: handleNewFileAction,\n group: ContextActions.groups.medium,\n });\n }\n if (onCreateFolder) {\n result.push({\n title: 'New Folder',\n description: 'Create new folder',\n action: handleNewFolderAction,\n group: ContextActions.groups.medium,\n });\n }\n if (onCopy) {\n result.push({\n title: 'Copy',\n description: 'Copy',\n action: handleCopyAction,\n group: ContextActions.groups.low,\n disabled: focusedItem == null || isDirectory(focusedItem),\n });\n }\n if (onDelete && selectedItems.length > 0) {\n result.push({\n title: 'Delete',\n description: 'Delete',\n shortcut: SHORTCUTS.FILE_EXPLORER.DELETE,\n action: handleDeleteAction,\n group: ContextActions.groups.low,\n });\n }\n if (onRename) {\n result.push({\n title: 'Rename',\n description: 'Rename',\n shortcut: SHORTCUTS.FILE_EXPLORER.RENAME,\n action: handleRenameAction,\n group: ContextActions.groups.low,\n disabled: focusedItem == null,\n });\n }\n return result;\n }, [\n handleCopyAction,\n handleDeleteAction,\n handleNewFileAction,\n handleNewFolderAction,\n handleRenameAction,\n focusedItem,\n onCopy,\n onCreateFile,\n onCreateFolder,\n onDelete,\n onRename,\n selectedItems,\n renameItem,\n ]);\n\n const validateRenameItem = useCallback(\n (newName: string): Promise<void> => {\n if (renameItem) {\n return validateRename(renameItem, newName);\n }\n return Promise.reject(new Error('No rename item'));\n },\n [renameItem, validateRename]\n );\n\n const renderItem = useCallback(\n (itemProps: FileListRenderItemProps): JSX.Element => {\n const { item } = itemProps;\n if (renameItem && renameItem.filename === item.filename) {\n return renderFileListItem({\n ...itemProps,\n children: (\n <FileListItemEditor\n item={item}\n validate={validateRenameItem}\n onSubmit={handleRenameSubmit}\n onCancel={handleRenameCancel}\n />\n ),\n });\n }\n return renderFileListItem(itemProps);\n },\n [handleRenameCancel, handleRenameSubmit, renameItem, validateRenameItem]\n );\n\n return (\n <div className=\"file-list-container\">\n {table && (\n <FileList\n onMove={onMove}\n onSelect={onSelect}\n onSelectionChange={handleSelectionChange}\n onFocusChange={handleFocusChange}\n renderItem={renderItem}\n rowHeight={rowHeight}\n table={table}\n isMultiSelect={isMultiSelect}\n />\n )}\n {showContextMenu && <ContextActions actions={actions} />}\n </div>\n );\n};\n\nFileListContainer.displayName = 'FileListContainer';\n\nexport default FileListContainer;\n"],"mappings":"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"}
1
+ {"version":3,"file":"FileListContainer.js","names":["ContextActions","React","useCallback","useMemo","useState","FileList","renderFileListItem","DEFAULT_ROW_HEIGHT","isDirectory","SHORTCUTS","FileUtils","FileListItemEditor","FileListContainer","props","isMultiSelect","showContextMenu","onCreateFile","onCreateFolder","onCopy","onDelete","onMove","undefined","onRename","onSelect","onSelectionChange","table","rowHeight","validateRename","Promise","resolve","renameItem","setRenameItem","selectedItems","setSelectedItems","focusedItem","setFocusedItem","handleSelectionChange","newSelectedItems","handleFocusChange","newFocusedItem","handleCopyAction","handleDeleteAction","length","handleNewFileAction","handleNewFolderAction","getPath","filename","handleRenameAction","handleRenameCancel","handleRenameSubmit","newName","actions","result","push","title","description","action","group","groups","medium","low","disabled","shortcut","FILE_EXPLORER","DELETE","RENAME","validateRenameItem","reject","Error","renderItem","itemProps","item","children","displayName"],"sources":["../src/FileListContainer.tsx"],"sourcesContent":["import { ContextAction, ContextActions } from '@deephaven/components';\nimport React, { useCallback, useMemo, useState } from 'react';\nimport FileList, {\n renderFileListItem,\n DEFAULT_ROW_HEIGHT,\n FileListRenderItemProps,\n} from './FileList';\nimport { FileStorageItem, FileStorageTable, isDirectory } from './FileStorage';\nimport SHORTCUTS from './FileExplorerShortcuts';\nimport './FileExplorer.scss';\nimport FileUtils from './FileUtils';\nimport FileListItemEditor from './FileListItemEditor';\n\nexport interface FileListContainerProps {\n showContextMenu?: boolean;\n table: FileStorageTable;\n\n isMultiSelect?: boolean;\n\n onCreateFile?: (path?: string) => void;\n onCreateFolder?: (path?: string) => void;\n onCopy?: (file: FileStorageItem) => void;\n onDelete?: (files: FileStorageItem[]) => void;\n onMove?: (files: FileStorageItem[], path: string) => void;\n onRename?: (file: FileStorageItem, newName: string) => void;\n onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => void;\n validateRename?: (file: FileStorageItem, newName: string) => Promise<void>;\n onSelectionChange?: (selectedItems: FileStorageItem[]) => void;\n\n /** Height of each item in the list */\n rowHeight?: number;\n}\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorage.\n */\nexport const FileListContainer = (\n props: FileListContainerProps\n): JSX.Element => {\n const {\n isMultiSelect = false,\n showContextMenu = false,\n onCreateFile,\n onCreateFolder,\n onCopy,\n onDelete,\n onMove = () => undefined,\n onRename,\n onSelect,\n onSelectionChange,\n table,\n rowHeight = DEFAULT_ROW_HEIGHT,\n validateRename = () => Promise.resolve(),\n } = props;\n const [renameItem, setRenameItem] = useState<FileStorageItem>();\n const [selectedItems, setSelectedItems] = useState([] as FileStorageItem[]);\n const [focusedItem, setFocusedItem] = useState<FileStorageItem>();\n\n const handleSelectionChange = useCallback(\n newSelectedItems => {\n setSelectedItems(newSelectedItems);\n onSelectionChange?.(newSelectedItems);\n },\n [onSelectionChange]\n );\n\n const handleFocusChange = useCallback(newFocusedItem => {\n setFocusedItem(newFocusedItem);\n }, []);\n\n const handleCopyAction = useCallback(() => {\n if (focusedItem) {\n onCopy?.(focusedItem);\n }\n }, [focusedItem, onCopy]);\n\n const handleDeleteAction = useCallback(() => {\n if (selectedItems.length > 0) {\n onDelete?.(selectedItems);\n }\n }, [onDelete, selectedItems]);\n\n const handleNewFileAction = useCallback(() => {\n onCreateFile?.();\n }, [onCreateFile]);\n\n const handleNewFolderAction = useCallback(() => {\n if (focusedItem) {\n onCreateFolder?.(FileUtils.getPath(focusedItem.filename));\n }\n }, [focusedItem, onCreateFolder]);\n\n const handleRenameAction = useCallback(() => {\n if (focusedItem) {\n setRenameItem(focusedItem);\n }\n }, [focusedItem]);\n\n const handleRenameCancel = useCallback((): void => {\n setRenameItem(undefined);\n }, []);\n\n const handleRenameSubmit = useCallback(\n (newName: string): void => {\n if (renameItem) {\n onRename?.(renameItem, newName);\n setRenameItem(undefined);\n }\n },\n [onRename, renameItem]\n );\n\n const actions = useMemo(() => {\n if (renameItem) {\n // While renaming, we don't want to enable any of the context actions or it may interfere with renaming input\n return [];\n }\n\n const result = [] as ContextAction[];\n if (onCreateFile) {\n result.push({\n title: 'New File',\n description: 'Create new file',\n action: handleNewFileAction,\n group: ContextActions.groups.medium,\n });\n }\n if (onCreateFolder) {\n result.push({\n title: 'New Folder',\n description: 'Create new folder',\n action: handleNewFolderAction,\n group: ContextActions.groups.medium,\n });\n }\n if (onCopy) {\n result.push({\n title: 'Copy',\n description: 'Copy',\n action: handleCopyAction,\n group: ContextActions.groups.low,\n disabled: focusedItem == null || isDirectory(focusedItem),\n });\n }\n if (onDelete && selectedItems.length > 0) {\n result.push({\n title: 'Delete',\n description: 'Delete',\n shortcut: SHORTCUTS.FILE_EXPLORER.DELETE,\n action: handleDeleteAction,\n group: ContextActions.groups.low,\n });\n }\n if (onRename) {\n result.push({\n title: 'Rename',\n description: 'Rename',\n shortcut: SHORTCUTS.FILE_EXPLORER.RENAME,\n action: handleRenameAction,\n group: ContextActions.groups.low,\n disabled: focusedItem == null,\n });\n }\n return result;\n }, [\n handleCopyAction,\n handleDeleteAction,\n handleNewFileAction,\n handleNewFolderAction,\n handleRenameAction,\n focusedItem,\n onCopy,\n onCreateFile,\n onCreateFolder,\n onDelete,\n onRename,\n selectedItems,\n renameItem,\n ]);\n\n const validateRenameItem = useCallback(\n (newName: string): Promise<void> => {\n if (renameItem) {\n return validateRename(renameItem, newName);\n }\n return Promise.reject(new Error('No rename item'));\n },\n [renameItem, validateRename]\n );\n\n const renderItem = useCallback(\n (itemProps: FileListRenderItemProps): JSX.Element => {\n const { item } = itemProps;\n if (renameItem && renameItem.filename === item.filename) {\n return renderFileListItem({\n ...itemProps,\n children: (\n <FileListItemEditor\n item={item}\n validate={validateRenameItem}\n onSubmit={handleRenameSubmit}\n onCancel={handleRenameCancel}\n />\n ),\n });\n }\n return renderFileListItem(itemProps);\n },\n [handleRenameCancel, handleRenameSubmit, renameItem, validateRenameItem]\n );\n\n return (\n <div className=\"file-list-container\">\n {table && (\n <FileList\n onMove={onMove}\n onSelect={onSelect}\n onSelectionChange={handleSelectionChange}\n onFocusChange={handleFocusChange}\n renderItem={renderItem}\n rowHeight={rowHeight}\n table={table}\n isMultiSelect={isMultiSelect}\n />\n )}\n {showContextMenu && <ContextActions actions={actions} />}\n </div>\n );\n};\n\nFileListContainer.displayName = 'FileListContainer';\n\nexport default FileListContainer;\n"],"mappings":"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"}
@@ -9,5 +9,8 @@
9
9
  display: flex;
10
10
  flex-direction: column;
11
11
  }
12
+ .new-file-modal-content .directory-breadcrumbs {
13
+ color: #4878ea;
14
+ }
12
15
 
13
16
  /*# sourceMappingURL=NewItemModal.css.map */
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../src/NewItemModal.scss","../../components/scss/bootstrap_overrides.scss"],"names":[],"mappings":"AAME;EACE,OCcO;;ADXT;EACE;EACA,eC6GY;ED5GZ;EACA,QAXe;EAYf;EACA","file":"NewItemModal.css"}
1
+ {"version":3,"sourceRoot":"","sources":["../src/NewItemModal.scss","../../components/scss/bootstrap_overrides.scss"],"names":[],"mappings":"AAME;EACE,OCcO;;ADXT;EACE;EACA,eC6GY;ED5GZ;EACA,QAXe;EAYf;EACA;;AAGF;EACE,OCRY","file":"NewItemModal.css"}
@@ -73,6 +73,8 @@ declare class NewItemModal extends PureComponent<NewItemModalProps, NewItemModal
73
73
  */
74
74
  focusRenameInput(): void;
75
75
  submitModal(skipExtensionCheck?: boolean): void;
76
+ handleBreadcrumbSelect(directoryPath: string): void;
77
+ renderPathButtons(path: string): React.ReactNode;
76
78
  render(): React.ReactNode;
77
79
  }
78
80
  export default NewItemModal;
@@ -1 +1 @@
1
- {"version":3,"file":"NewItemModal.d.ts","sourceRoot":"","sources":["../src/NewItemModal.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NewItemModal.d.ts","sourceRoot":"","sources":["../src/NewItemModal.tsx"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
7
7
  import React, { PureComponent } from 'react';
8
8
  import PropTypes from 'prop-types';
9
9
  import classNames from 'classnames';
10
- import { Modal, ModalBody, ModalFooter, ModalHeader, BasicModal } from '@deephaven/components';
10
+ import { Modal, ModalBody, ModalFooter, ModalHeader, BasicModal, Button } from '@deephaven/components';
11
11
  import { Pending, PromiseUtils, ValidationError } from '@deephaven/utils';
12
12
  import Log from '@deephaven/log';
13
13
  import FileExplorer from "./FileExplorer.js";
@@ -55,6 +55,7 @@ class NewItemModal extends PureComponent {
55
55
  this.handleOverwriteConfirm = this.handleOverwriteConfirm.bind(this);
56
56
  this.handleExtensionChangeCancel = this.handleExtensionChangeCancel.bind(this);
57
57
  this.handleExtensionChangeConfirm = this.handleExtensionChangeConfirm.bind(this);
58
+ this.handleBreadcrumbSelect = this.handleBreadcrumbSelect.bind(this);
58
59
  var {
59
60
  defaultValue
60
61
  } = props;
@@ -367,6 +368,34 @@ class NewItemModal extends PureComponent {
367
368
  });
368
369
  }
369
370
 
371
+ handleBreadcrumbSelect(directoryPath) {
372
+ this.setState({
373
+ path: directoryPath.slice(4)
374
+ });
375
+ }
376
+
377
+ renderPathButtons(path) {
378
+ var pathAsList = path.split('/');
379
+ pathAsList[0] = 'root';
380
+ pathAsList.pop();
381
+ return pathAsList.map((basename, index) => {
382
+ var directoryPath = '';
383
+
384
+ for (var i = 0; i < index; i += 1) {
385
+ directoryPath += "".concat(pathAsList[i], "/");
386
+ }
387
+
388
+ directoryPath += "".concat(basename, "/");
389
+ return /*#__PURE__*/React.createElement(React.Fragment, {
390
+ key: directoryPath
391
+ }, /*#__PURE__*/React.createElement(Button, {
392
+ kind: "ghost",
393
+ className: "directory-breadcrumbs",
394
+ onClick: () => this.handleBreadcrumbSelect(directoryPath)
395
+ }, basename), "/");
396
+ });
397
+ }
398
+
370
399
  render() {
371
400
  var {
372
401
  storage,
@@ -423,9 +452,7 @@ class NewItemModal extends PureComponent {
423
452
  className: "invalid-feedback"
424
453
  }, NewItemModal.getValidationMessage(validationError))), /*#__PURE__*/React.createElement("div", {
425
454
  className: "flex-grow-0"
426
- }, /*#__PURE__*/React.createElement("label", null, "Directory: ", /*#__PURE__*/React.createElement("span", {
427
- className: "new-item-parentId"
428
- }, path))), /*#__PURE__*/React.createElement("div", {
455
+ }, /*#__PURE__*/React.createElement("label", null, "Directory: /"), this.renderPathButtons(path)), /*#__PURE__*/React.createElement("div", {
429
456
  className: "flex-grow-1 file-explorer-container"
430
457
  }, /*#__PURE__*/React.createElement(FileExplorer, {
431
458
  onSelect: this.handleSelect,
@@ -1 +1 @@
1
- {"version":3,"file":"NewItemModal.js","names":["React","PureComponent","PropTypes","classNames","Modal","ModalBody","ModalFooter","ModalHeader","BasicModal","Pending","PromiseUtils","ValidationError","Log","FileExplorer","FileUtils","FileExistsError","FileNotFoundError","log","module","NewItemModal","getValidationMessage","err","info","type","handleError","isCanceled","error","constructor","props","createRef","Map","handleModalSubmit","bind","handleModalOpened","handleSelect","handleChange","handleKeyDown","handleValidationError","handleOverwriteCancel","handleOverwriteConfirm","handleExtensionChangeCancel","handleExtensionChangeConfirm","defaultValue","path","hasPath","getPath","state","isSubmitting","prevExtension","getExtension","showExtensionChangeModal","showOverwriteModal","value","getBaseName","componentDidUpdate","prevProps","prevState","isOpen","prevIsOpen","resetValue","updateValidationStatus","componentWillUnmount","pending","cancel","cancelableValidatePromise","cancelableExistingItemPromise","setState","validationError","undefined","getValidationPromise","name","checkExisting","makeCancelable","validateName","storage","existingFile","e","newName","then","catch","focusRenameInput","submitModal","event","target","item","debug","makePath","filename","basename","key","stopPropagation","preventDefault","onCancel","onSubmit","newValue","replaceExtension","input","inputRef","current","selectionEnd","length","lastIndexOf","focus","setSelectionRange","skipExtensionCheck","notifyOnExtensionChange","newExtension","newItemName","render","placeholder","title","isDirectory","prevExtensionText","fileExtensionToString","newExtensionText","submitBtnLabel","nameInputLabel","bool","string","isRequired","oneOf","func","shape"],"sources":["../src/NewItemModal.tsx"],"sourcesContent":["import React, { ChangeEvent, KeyboardEvent, PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport {\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader,\n BasicModal,\n} from '@deephaven/components';\nimport {\n CancelablePromise,\n Pending,\n PromiseUtils,\n ValidationError,\n} from '@deephaven/utils';\nimport Log from '@deephaven/log';\nimport FileExplorer from './FileExplorer';\nimport FileStorage, { FileStorageItem, FileType } from './FileStorage';\nimport FileUtils from './FileUtils';\n\nimport './NewItemModal.scss';\nimport FileExistsError from './FileExistsError';\nimport FileNotFoundError from './FileNotFoundError';\n\nconst log = Log.module('NewItemModal');\n\nexport type NewItemModalProps = typeof NewItemModal.defaultProps & {\n isOpen: boolean;\n title: string;\n defaultValue: string;\n type: FileType;\n onSubmit: (name: string) => void;\n onCancel: () => void;\n placeholder: string;\n storage: FileStorage;\n notifyOnExtensionChange?: boolean;\n};\n\nexport type NewItemModalState = {\n path: string;\n isSubmitting: boolean;\n showExtensionChangeModal: boolean;\n showOverwriteModal: boolean;\n validationError?: ValidationError;\n value: string;\n prevExtension?: string;\n newExtension?: string;\n};\n\nclass NewItemModal extends PureComponent<NewItemModalProps, NewItemModalState> {\n static propTypes = {\n isOpen: PropTypes.bool,\n title: PropTypes.string.isRequired,\n defaultValue: PropTypes.string,\n type: PropTypes.oneOf(['file', 'directory']).isRequired,\n onSubmit: PropTypes.func,\n onCancel: PropTypes.func,\n placeholder: PropTypes.string,\n storage: PropTypes.shape({}).isRequired,\n notifyOnExtensionChange: PropTypes.bool,\n };\n\n static defaultProps = {\n isOpen: false,\n defaultValue: '/',\n notifyOnExtensionChange: false,\n placeholder: '',\n onSubmit: (name: string): void => undefined,\n onCancel: (): void => undefined,\n };\n\n static getValidationMessage(err: Error): string {\n if (err instanceof FileExistsError && err.info.type === 'directory') {\n return 'Error: Cannot overwrite existing directory';\n }\n return `${err}`;\n }\n\n static handleError(err: Error): void {\n if (!PromiseUtils.isCanceled(err)) {\n log.error(err);\n }\n }\n\n constructor(props: NewItemModalProps) {\n super(props);\n this.handleModalSubmit = this.handleModalSubmit.bind(this);\n this.handleModalOpened = this.handleModalOpened.bind(this);\n this.handleSelect = this.handleSelect.bind(this);\n this.handleChange = this.handleChange.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleValidationError = this.handleValidationError.bind(this);\n this.handleOverwriteCancel = this.handleOverwriteCancel.bind(this);\n this.handleOverwriteConfirm = this.handleOverwriteConfirm.bind(this);\n this.handleExtensionChangeCancel = this.handleExtensionChangeCancel.bind(\n this\n );\n this.handleExtensionChangeConfirm = this.handleExtensionChangeConfirm.bind(\n this\n );\n\n const { defaultValue } = props;\n\n const path = FileUtils.hasPath(defaultValue)\n ? FileUtils.getPath(defaultValue)\n : '/';\n\n this.state = {\n isSubmitting: false,\n path,\n prevExtension: FileUtils.getExtension(defaultValue),\n showExtensionChangeModal: false,\n showOverwriteModal: false,\n value: FileUtils.getBaseName(defaultValue),\n };\n }\n\n componentDidUpdate(\n prevProps: NewItemModalProps,\n prevState: NewItemModalState\n ): void {\n const { isOpen } = this.props;\n const { isOpen: prevIsOpen } = prevProps;\n const { value, path } = this.state;\n if (!prevIsOpen && isOpen) {\n this.resetValue();\n }\n if (path !== prevState.path || value !== prevState.value) {\n this.updateValidationStatus(path, value);\n }\n }\n\n componentWillUnmount(): void {\n this.pending.cancel();\n if (this.cancelableValidatePromise) {\n this.cancelableValidatePromise.cancel();\n }\n if (this.cancelableExistingItemPromise) {\n this.cancelableExistingItemPromise.cancel();\n }\n }\n\n private inputRef = React.createRef<HTMLInputElement>();\n\n private cancelableValidatePromise?: CancelablePromise<string>;\n\n private cancelableExistingItemPromise?: CancelablePromise<FileStorageItem | null>;\n\n private pending = new Pending();\n\n private pathMap = new Map();\n\n resetValue(): void {\n const { defaultValue } = this.props as NewItemModalProps;\n const path = FileUtils.hasPath(defaultValue)\n ? FileUtils.getPath(defaultValue)\n : '/';\n this.setState({\n path,\n value: FileUtils.getBaseName(defaultValue),\n validationError: undefined,\n prevExtension: FileUtils.getExtension(defaultValue),\n isSubmitting: false,\n });\n }\n\n getValidationPromise(\n path: string,\n name: string,\n checkExisting = false\n ): CancelablePromise<string> {\n if (this.cancelableValidatePromise) {\n this.cancelableValidatePromise.cancel();\n }\n this.cancelableValidatePromise = PromiseUtils.makeCancelable(\n this.validateName(path, name, checkExisting)\n );\n return this.cancelableValidatePromise;\n }\n\n async validateName(\n path: string,\n name: string,\n checkExisting: boolean\n ): Promise<string> {\n FileUtils.validateName(name);\n\n const { defaultValue, storage } = this.props;\n if (checkExisting) {\n const value = `${path}${name}`;\n if (value !== defaultValue) {\n try {\n const existingFile = await storage.info(value);\n throw new FileExistsError(existingFile);\n } catch (e) {\n if (!(e instanceof FileNotFoundError)) {\n throw e;\n }\n // There is no existing file, ignore\n }\n }\n }\n\n return name;\n }\n\n updateValidationStatus(path: string, newName: string): void {\n this.getValidationPromise(path, newName)\n .then(() => {\n this.setState({ validationError: undefined });\n })\n .catch(this.handleValidationError)\n .catch(NewItemModal.handleError);\n }\n\n handleModalOpened(): void {\n this.focusRenameInput();\n }\n\n handleModalSubmit(): void {\n this.submitModal();\n }\n\n handleChange(event: ChangeEvent<HTMLInputElement>): void {\n const { value } = event.target;\n this.setState({ value });\n }\n\n handleSelect(item: FileStorageItem): void {\n log.debug('handleSelect', item);\n if (item.type === 'directory') {\n this.setState({ path: FileUtils.makePath(item.filename) });\n } else {\n // Use selected item name and folder and focus the input\n const value = item.basename;\n const path = FileUtils.getPath(item.filename);\n this.setState({ value, path }, () => {\n this.focusRenameInput();\n });\n }\n }\n\n // eslint-disable-next-line class-methods-use-this\n handleKeyDown(e: KeyboardEvent): void {\n const { key } = e;\n e.stopPropagation();\n\n switch (key) {\n case 'Enter': {\n // Prevent form submit event\n e.preventDefault();\n this.submitModal();\n break;\n }\n case 'Escape': {\n e.preventDefault();\n const { onCancel } = this.props;\n onCancel();\n break;\n }\n default:\n }\n }\n\n handleValidationError(err: Error): void {\n if (!(err instanceof ValidationError)) {\n throw err;\n }\n log.debug('Validation error', err);\n this.setState({ validationError: err });\n }\n\n handleOverwriteCancel(): void {\n this.setState({\n showOverwriteModal: false,\n isSubmitting: false,\n });\n }\n\n handleOverwriteConfirm(): void {\n this.setState({ showOverwriteModal: false });\n const { onSubmit } = this.props;\n const { path, value } = this.state;\n log.debug('handleOverwriteConfirm', path, value);\n onSubmit(`${path}${value}`);\n }\n\n handleExtensionChangeCancel(): void {\n log.debug('handleExtensionChangeCancel');\n this.setState(({ value, prevExtension }) => {\n const newValue = FileUtils.replaceExtension(value, prevExtension);\n return {\n showExtensionChangeModal: false,\n value: newValue,\n };\n });\n\n this.submitModal(true);\n }\n\n handleExtensionChangeConfirm(): void {\n log.debug('handleExtensionChangeConfirm');\n this.setState({ showExtensionChangeModal: false });\n this.submitModal(true);\n }\n\n /**\n * Focus rename input and select name part for files, select all text for folders\n */\n focusRenameInput(): void {\n const input = this.inputRef.current;\n if (input) {\n const { type } = this.props;\n const { value } = input;\n const selectionEnd =\n type === 'directory' ? value.length : value.lastIndexOf('.');\n input.focus();\n input.setSelectionRange(\n 0,\n selectionEnd > 0 ? selectionEnd : value.length\n );\n }\n }\n\n submitModal(skipExtensionCheck = false): void {\n this.setState(({ prevExtension, value, path }) => {\n const { notifyOnExtensionChange, type } = this.props;\n log.debug('submitModal', prevExtension, value);\n const newExtension = FileUtils.getExtension(value);\n if (\n notifyOnExtensionChange &&\n !skipExtensionCheck &&\n prevExtension !== null &&\n prevExtension !== newExtension\n ) {\n return {\n isSubmitting: false,\n showExtensionChangeModal: true,\n newExtension,\n };\n }\n\n this.getValidationPromise(path, value, true)\n .then((newItemName: string) => {\n const { onSubmit } = this.props;\n onSubmit(`${path}${value}`);\n })\n .catch(e => {\n // Don't allow using existing names for folders\n // For files, prompt if they want to overwrite existing file\n if (e instanceof FileExistsError) {\n if (type !== 'directory' && e.info.type !== 'directory') {\n this.setState({ showOverwriteModal: true });\n return;\n }\n }\n throw e;\n })\n .catch(e => {\n if (PromiseUtils.isCanceled(e)) {\n this.setState({ isSubmitting: false });\n }\n throw e;\n })\n .catch(this.handleValidationError)\n .catch(NewItemModal.handleError);\n\n return {\n isSubmitting: true,\n showExtensionChangeModal: false,\n newExtension: undefined,\n };\n });\n }\n\n render(): React.ReactNode {\n const { storage, isOpen, onCancel, placeholder, title, type } = this.props;\n const {\n isSubmitting,\n path,\n showExtensionChangeModal,\n showOverwriteModal,\n validationError,\n value,\n prevExtension,\n newExtension,\n } = this.state;\n\n const isDirectory = type === 'directory';\n const prevExtensionText = FileUtils.fileExtensionToString(prevExtension);\n const newExtensionText = FileUtils.fileExtensionToString(newExtension);\n const submitBtnLabel = isDirectory ? 'Create' : 'Save';\n const nameInputLabel = isDirectory ? 'New folder name' : 'Save file as';\n\n return (\n <>\n <Modal\n isOpen={isOpen}\n toggle={onCancel}\n onOpened={this.handleModalOpened}\n className=\"modal-dialog-centered new-file-modal theme-bg-dark\"\n >\n <ModalHeader toggle={onCancel}>{title}</ModalHeader>\n <ModalBody>\n <form>\n <div className=\"d-flex flex-column new-file-modal-content\">\n <div className=\"flex-grow-0 mb-4\">\n <label htmlFor=\"file-name-input\">{nameInputLabel}</label>\n <input\n id=\"file-name-input\"\n type=\"text\"\n autoComplete=\"off\"\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n spellCheck=\"false\"\n className={classNames('form-control', {\n 'is-invalid': validationError,\n })}\n value={value}\n placeholder={placeholder}\n ref={this.inputRef}\n onKeyDown={this.handleKeyDown}\n onChange={this.handleChange}\n />\n {validationError && (\n <div className=\"invalid-feedback\">\n {NewItemModal.getValidationMessage(validationError)}\n </div>\n )}\n </div>\n <div className=\"flex-grow-0\">\n <label>\n Directory: <span className=\"new-item-parentId\">{path}</span>\n </label>\n </div>\n <div className=\"flex-grow-1 file-explorer-container\">\n <FileExplorer\n onSelect={this.handleSelect}\n storage={storage}\n />\n </div>\n </div>\n </form>\n </ModalBody>\n\n <ModalFooter>\n <button\n className=\"btn btn-outline-primary\"\n onClick={onCancel}\n type=\"button\"\n >\n Cancel\n </button>\n <button\n className=\"btn btn-primary\"\n disabled={isSubmitting}\n onClick={this.handleModalSubmit}\n type=\"button\"\n >\n {submitBtnLabel}\n </button>\n </ModalFooter>\n </Modal>\n <BasicModal\n isOpen={showOverwriteModal}\n headerText=\"Confirm overwrite\"\n bodyText=\"File with this name already exists, are you sure you want to overwrite it?\"\n onCancel={this.handleOverwriteCancel}\n onConfirm={this.handleOverwriteConfirm}\n cancelButtonText=\"Cancel\"\n confirmButtonText=\"Overwrite\"\n />\n <BasicModal\n isOpen={showExtensionChangeModal}\n headerText=\"Confirm extension change\"\n bodyText={`Are you sure you want to change extension from \"${prevExtensionText}\" to \"${newExtensionText}\"?`}\n onCancel={this.handleExtensionChangeCancel}\n onConfirm={this.handleExtensionChangeConfirm}\n cancelButtonText={`Keep \"${prevExtensionText}\"`}\n confirmButtonText={`Use \"${newExtensionText}\"`}\n />\n </>\n );\n }\n}\n\nexport default NewItemModal;\n"],"mappings":"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"}
1
+ {"version":3,"file":"NewItemModal.js","names":["React","PureComponent","PropTypes","classNames","Modal","ModalBody","ModalFooter","ModalHeader","BasicModal","Button","Pending","PromiseUtils","ValidationError","Log","FileExplorer","FileUtils","FileExistsError","FileNotFoundError","log","module","NewItemModal","getValidationMessage","err","info","type","handleError","isCanceled","error","constructor","props","createRef","Map","handleModalSubmit","bind","handleModalOpened","handleSelect","handleChange","handleKeyDown","handleValidationError","handleOverwriteCancel","handleOverwriteConfirm","handleExtensionChangeCancel","handleExtensionChangeConfirm","handleBreadcrumbSelect","defaultValue","path","hasPath","getPath","state","isSubmitting","prevExtension","getExtension","showExtensionChangeModal","showOverwriteModal","value","getBaseName","componentDidUpdate","prevProps","prevState","isOpen","prevIsOpen","resetValue","updateValidationStatus","componentWillUnmount","pending","cancel","cancelableValidatePromise","cancelableExistingItemPromise","setState","validationError","undefined","getValidationPromise","name","checkExisting","makeCancelable","validateName","storage","existingFile","e","newName","then","catch","focusRenameInput","submitModal","event","target","item","debug","makePath","filename","basename","key","stopPropagation","preventDefault","onCancel","onSubmit","newValue","replaceExtension","input","inputRef","current","selectionEnd","length","lastIndexOf","focus","setSelectionRange","skipExtensionCheck","notifyOnExtensionChange","newExtension","newItemName","directoryPath","slice","renderPathButtons","pathAsList","split","pop","map","index","i","render","placeholder","title","isDirectory","prevExtensionText","fileExtensionToString","newExtensionText","submitBtnLabel","nameInputLabel","bool","string","isRequired","oneOf","func","shape"],"sources":["../src/NewItemModal.tsx"],"sourcesContent":["import React, { ChangeEvent, KeyboardEvent, PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport {\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader,\n BasicModal,\n Button,\n} from '@deephaven/components';\nimport {\n CancelablePromise,\n Pending,\n PromiseUtils,\n ValidationError,\n} from '@deephaven/utils';\nimport Log from '@deephaven/log';\nimport FileExplorer from './FileExplorer';\nimport FileStorage, { FileStorageItem, FileType } from './FileStorage';\nimport FileUtils from './FileUtils';\n\nimport './NewItemModal.scss';\nimport FileExistsError from './FileExistsError';\nimport FileNotFoundError from './FileNotFoundError';\n\nconst log = Log.module('NewItemModal');\n\nexport type NewItemModalProps = typeof NewItemModal.defaultProps & {\n isOpen: boolean;\n title: string;\n defaultValue: string;\n type: FileType;\n onSubmit: (name: string) => void;\n onCancel: () => void;\n placeholder: string;\n storage: FileStorage;\n notifyOnExtensionChange?: boolean;\n};\n\nexport type NewItemModalState = {\n path: string;\n isSubmitting: boolean;\n showExtensionChangeModal: boolean;\n showOverwriteModal: boolean;\n validationError?: ValidationError;\n value: string;\n prevExtension?: string;\n newExtension?: string;\n};\n\nclass NewItemModal extends PureComponent<NewItemModalProps, NewItemModalState> {\n static propTypes = {\n isOpen: PropTypes.bool,\n title: PropTypes.string.isRequired,\n defaultValue: PropTypes.string,\n type: PropTypes.oneOf(['file', 'directory']).isRequired,\n onSubmit: PropTypes.func,\n onCancel: PropTypes.func,\n placeholder: PropTypes.string,\n storage: PropTypes.shape({}).isRequired,\n notifyOnExtensionChange: PropTypes.bool,\n };\n\n static defaultProps = {\n isOpen: false,\n defaultValue: '/',\n notifyOnExtensionChange: false,\n placeholder: '',\n onSubmit: (name: string): void => undefined,\n onCancel: (): void => undefined,\n };\n\n static getValidationMessage(err: Error): string {\n if (err instanceof FileExistsError && err.info.type === 'directory') {\n return 'Error: Cannot overwrite existing directory';\n }\n return `${err}`;\n }\n\n static handleError(err: Error): void {\n if (!PromiseUtils.isCanceled(err)) {\n log.error(err);\n }\n }\n\n constructor(props: NewItemModalProps) {\n super(props);\n this.handleModalSubmit = this.handleModalSubmit.bind(this);\n this.handleModalOpened = this.handleModalOpened.bind(this);\n this.handleSelect = this.handleSelect.bind(this);\n this.handleChange = this.handleChange.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleValidationError = this.handleValidationError.bind(this);\n this.handleOverwriteCancel = this.handleOverwriteCancel.bind(this);\n this.handleOverwriteConfirm = this.handleOverwriteConfirm.bind(this);\n this.handleExtensionChangeCancel = this.handleExtensionChangeCancel.bind(\n this\n );\n this.handleExtensionChangeConfirm = this.handleExtensionChangeConfirm.bind(\n this\n );\n this.handleBreadcrumbSelect = this.handleBreadcrumbSelect.bind(this);\n\n const { defaultValue } = props;\n\n const path = FileUtils.hasPath(defaultValue)\n ? FileUtils.getPath(defaultValue)\n : '/';\n\n this.state = {\n isSubmitting: false,\n path,\n prevExtension: FileUtils.getExtension(defaultValue),\n showExtensionChangeModal: false,\n showOverwriteModal: false,\n value: FileUtils.getBaseName(defaultValue),\n };\n }\n\n componentDidUpdate(\n prevProps: NewItemModalProps,\n prevState: NewItemModalState\n ): void {\n const { isOpen } = this.props;\n const { isOpen: prevIsOpen } = prevProps;\n const { value, path } = this.state;\n if (!prevIsOpen && isOpen) {\n this.resetValue();\n }\n if (path !== prevState.path || value !== prevState.value) {\n this.updateValidationStatus(path, value);\n }\n }\n\n componentWillUnmount(): void {\n this.pending.cancel();\n if (this.cancelableValidatePromise) {\n this.cancelableValidatePromise.cancel();\n }\n if (this.cancelableExistingItemPromise) {\n this.cancelableExistingItemPromise.cancel();\n }\n }\n\n private inputRef = React.createRef<HTMLInputElement>();\n\n private cancelableValidatePromise?: CancelablePromise<string>;\n\n private cancelableExistingItemPromise?: CancelablePromise<FileStorageItem | null>;\n\n private pending = new Pending();\n\n private pathMap = new Map();\n\n resetValue(): void {\n const { defaultValue } = this.props as NewItemModalProps;\n const path = FileUtils.hasPath(defaultValue)\n ? FileUtils.getPath(defaultValue)\n : '/';\n this.setState({\n path,\n value: FileUtils.getBaseName(defaultValue),\n validationError: undefined,\n prevExtension: FileUtils.getExtension(defaultValue),\n isSubmitting: false,\n });\n }\n\n getValidationPromise(\n path: string,\n name: string,\n checkExisting = false\n ): CancelablePromise<string> {\n if (this.cancelableValidatePromise) {\n this.cancelableValidatePromise.cancel();\n }\n this.cancelableValidatePromise = PromiseUtils.makeCancelable(\n this.validateName(path, name, checkExisting)\n );\n return this.cancelableValidatePromise;\n }\n\n async validateName(\n path: string,\n name: string,\n checkExisting: boolean\n ): Promise<string> {\n FileUtils.validateName(name);\n\n const { defaultValue, storage } = this.props;\n if (checkExisting) {\n const value = `${path}${name}`;\n if (value !== defaultValue) {\n try {\n const existingFile = await storage.info(value);\n throw new FileExistsError(existingFile);\n } catch (e) {\n if (!(e instanceof FileNotFoundError)) {\n throw e;\n }\n // There is no existing file, ignore\n }\n }\n }\n\n return name;\n }\n\n updateValidationStatus(path: string, newName: string): void {\n this.getValidationPromise(path, newName)\n .then(() => {\n this.setState({ validationError: undefined });\n })\n .catch(this.handleValidationError)\n .catch(NewItemModal.handleError);\n }\n\n handleModalOpened(): void {\n this.focusRenameInput();\n }\n\n handleModalSubmit(): void {\n this.submitModal();\n }\n\n handleChange(event: ChangeEvent<HTMLInputElement>): void {\n const { value } = event.target;\n this.setState({ value });\n }\n\n handleSelect(item: FileStorageItem): void {\n log.debug('handleSelect', item);\n if (item.type === 'directory') {\n this.setState({ path: FileUtils.makePath(item.filename) });\n } else {\n // Use selected item name and folder and focus the input\n const value = item.basename;\n const path = FileUtils.getPath(item.filename);\n this.setState({ value, path }, () => {\n this.focusRenameInput();\n });\n }\n }\n\n // eslint-disable-next-line class-methods-use-this\n handleKeyDown(e: KeyboardEvent): void {\n const { key } = e;\n e.stopPropagation();\n\n switch (key) {\n case 'Enter': {\n // Prevent form submit event\n e.preventDefault();\n this.submitModal();\n break;\n }\n case 'Escape': {\n e.preventDefault();\n const { onCancel } = this.props;\n onCancel();\n break;\n }\n default:\n }\n }\n\n handleValidationError(err: Error): void {\n if (!(err instanceof ValidationError)) {\n throw err;\n }\n log.debug('Validation error', err);\n this.setState({ validationError: err });\n }\n\n handleOverwriteCancel(): void {\n this.setState({\n showOverwriteModal: false,\n isSubmitting: false,\n });\n }\n\n handleOverwriteConfirm(): void {\n this.setState({ showOverwriteModal: false });\n const { onSubmit } = this.props;\n const { path, value } = this.state;\n log.debug('handleOverwriteConfirm', path, value);\n onSubmit(`${path}${value}`);\n }\n\n handleExtensionChangeCancel(): void {\n log.debug('handleExtensionChangeCancel');\n this.setState(({ value, prevExtension }) => {\n const newValue = FileUtils.replaceExtension(value, prevExtension);\n return {\n showExtensionChangeModal: false,\n value: newValue,\n };\n });\n\n this.submitModal(true);\n }\n\n handleExtensionChangeConfirm(): void {\n log.debug('handleExtensionChangeConfirm');\n this.setState({ showExtensionChangeModal: false });\n this.submitModal(true);\n }\n\n /**\n * Focus rename input and select name part for files, select all text for folders\n */\n focusRenameInput(): void {\n const input = this.inputRef.current;\n if (input) {\n const { type } = this.props;\n const { value } = input;\n const selectionEnd =\n type === 'directory' ? value.length : value.lastIndexOf('.');\n input.focus();\n input.setSelectionRange(\n 0,\n selectionEnd > 0 ? selectionEnd : value.length\n );\n }\n }\n\n submitModal(skipExtensionCheck = false): void {\n this.setState(({ prevExtension, value, path }) => {\n const { notifyOnExtensionChange, type } = this.props;\n log.debug('submitModal', prevExtension, value);\n const newExtension = FileUtils.getExtension(value);\n if (\n notifyOnExtensionChange &&\n !skipExtensionCheck &&\n prevExtension !== null &&\n prevExtension !== newExtension\n ) {\n return {\n isSubmitting: false,\n showExtensionChangeModal: true,\n newExtension,\n };\n }\n\n this.getValidationPromise(path, value, true)\n .then((newItemName: string) => {\n const { onSubmit } = this.props;\n onSubmit(`${path}${value}`);\n })\n .catch(e => {\n // Don't allow using existing names for folders\n // For files, prompt if they want to overwrite existing file\n if (e instanceof FileExistsError) {\n if (type !== 'directory' && e.info.type !== 'directory') {\n this.setState({ showOverwriteModal: true });\n return;\n }\n }\n throw e;\n })\n .catch(e => {\n if (PromiseUtils.isCanceled(e)) {\n this.setState({ isSubmitting: false });\n }\n throw e;\n })\n .catch(this.handleValidationError)\n .catch(NewItemModal.handleError);\n\n return {\n isSubmitting: true,\n showExtensionChangeModal: false,\n newExtension: undefined,\n };\n });\n }\n\n handleBreadcrumbSelect(directoryPath: string): void {\n this.setState({ path: directoryPath.slice(4) });\n }\n\n renderPathButtons(path: string): React.ReactNode {\n const pathAsList = path.split('/');\n pathAsList[0] = 'root';\n pathAsList.pop();\n return pathAsList.map((basename, index) => {\n let directoryPath = '';\n for (let i = 0; i < index; i += 1) {\n directoryPath += `${pathAsList[i]}/`;\n }\n directoryPath += `${basename}/`;\n\n return (\n <React.Fragment key={directoryPath}>\n <Button\n kind=\"ghost\"\n className=\"directory-breadcrumbs\"\n onClick={() => this.handleBreadcrumbSelect(directoryPath)}\n >\n {basename}\n </Button>\n /\n </React.Fragment>\n );\n });\n }\n\n render(): React.ReactNode {\n const { storage, isOpen, onCancel, placeholder, title, type } = this.props;\n const {\n isSubmitting,\n path,\n showExtensionChangeModal,\n showOverwriteModal,\n validationError,\n value,\n prevExtension,\n newExtension,\n } = this.state;\n\n const isDirectory = type === 'directory';\n const prevExtensionText = FileUtils.fileExtensionToString(prevExtension);\n const newExtensionText = FileUtils.fileExtensionToString(newExtension);\n const submitBtnLabel = isDirectory ? 'Create' : 'Save';\n const nameInputLabel = isDirectory ? 'New folder name' : 'Save file as';\n\n return (\n <>\n <Modal\n isOpen={isOpen}\n toggle={onCancel}\n onOpened={this.handleModalOpened}\n className=\"modal-dialog-centered new-file-modal theme-bg-dark\"\n >\n <ModalHeader toggle={onCancel}>{title}</ModalHeader>\n <ModalBody>\n <form>\n <div className=\"d-flex flex-column new-file-modal-content\">\n <div className=\"flex-grow-0 mb-4\">\n <label htmlFor=\"file-name-input\">{nameInputLabel}</label>\n <input\n id=\"file-name-input\"\n type=\"text\"\n autoComplete=\"off\"\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n spellCheck=\"false\"\n className={classNames('form-control', {\n 'is-invalid': validationError,\n })}\n value={value}\n placeholder={placeholder}\n ref={this.inputRef}\n onKeyDown={this.handleKeyDown}\n onChange={this.handleChange}\n />\n {validationError && (\n <div className=\"invalid-feedback\">\n {NewItemModal.getValidationMessage(validationError)}\n </div>\n )}\n </div>\n <div className=\"flex-grow-0\">\n <label>Directory: /</label>\n {this.renderPathButtons(path)}\n </div>\n <div className=\"flex-grow-1 file-explorer-container\">\n <FileExplorer\n onSelect={this.handleSelect}\n storage={storage}\n />\n </div>\n </div>\n </form>\n </ModalBody>\n\n <ModalFooter>\n <button\n className=\"btn btn-outline-primary\"\n onClick={onCancel}\n type=\"button\"\n >\n Cancel\n </button>\n <button\n className=\"btn btn-primary\"\n disabled={isSubmitting}\n onClick={this.handleModalSubmit}\n type=\"button\"\n >\n {submitBtnLabel}\n </button>\n </ModalFooter>\n </Modal>\n <BasicModal\n isOpen={showOverwriteModal}\n headerText=\"Confirm overwrite\"\n bodyText=\"File with this name already exists, are you sure you want to overwrite it?\"\n onCancel={this.handleOverwriteCancel}\n onConfirm={this.handleOverwriteConfirm}\n cancelButtonText=\"Cancel\"\n confirmButtonText=\"Overwrite\"\n />\n <BasicModal\n isOpen={showExtensionChangeModal}\n headerText=\"Confirm extension change\"\n bodyText={`Are you sure you want to change extension from \"${prevExtensionText}\" to \"${newExtensionText}\"?`}\n onCancel={this.handleExtensionChangeCancel}\n onConfirm={this.handleExtensionChangeConfirm}\n cancelButtonText={`Keep \"${prevExtensionText}\"`}\n confirmButtonText={`Use \"${newExtensionText}\"`}\n />\n </>\n );\n }\n}\n\nexport default NewItemModal;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deephaven/file-explorer",
3
- "version": "0.17.1-beta.4+1995291",
3
+ "version": "0.18.1-beta.0+3295265",
4
4
  "description": "Deephaven File Explorer React component",
5
5
  "author": "Deephaven Data Labs LLC",
6
6
  "license": "Apache-2.0",
@@ -30,11 +30,11 @@
30
30
  "start": "cross-env NODE_ENV=development npm run watch"
31
31
  },
32
32
  "dependencies": {
33
- "@deephaven/components": "^0.17.1-beta.4+1995291",
34
- "@deephaven/icons": "^0.17.1-beta.4+1995291",
35
- "@deephaven/log": "^0.17.1-beta.4+1995291",
36
- "@deephaven/storage": "^0.17.1-beta.4+1995291",
37
- "@deephaven/utils": "^0.17.1-beta.4+1995291",
33
+ "@deephaven/components": "^0.18.1-beta.0+3295265",
34
+ "@deephaven/icons": "^0.18.1-beta.0+3295265",
35
+ "@deephaven/log": "^0.18.1-beta.0+3295265",
36
+ "@deephaven/storage": "^0.18.1-beta.0+3295265",
37
+ "@deephaven/utils": "^0.18.1-beta.0+3295265",
38
38
  "@fortawesome/fontawesome-svg-core": "^6.1.1",
39
39
  "@fortawesome/react-fontawesome": "^0.1.18",
40
40
  "classnames": "^2.3.1",
@@ -46,7 +46,7 @@
46
46
  "react": "^17.0.0"
47
47
  },
48
48
  "devDependencies": {
49
- "@deephaven/tsconfig": "^0.17.1-beta.4+1995291"
49
+ "@deephaven/tsconfig": "^0.18.1-beta.0+3295265"
50
50
  },
51
51
  "files": [
52
52
  "dist"
@@ -54,5 +54,5 @@
54
54
  "publishConfig": {
55
55
  "access": "public"
56
56
  },
57
- "gitHead": "1995291c1352e7571fa62963606a1108a6e8b3ea"
57
+ "gitHead": "3295265e760a8dc9133e5cc3e4cd857173ec7c29"
58
58
  }