@deephaven/file-explorer 0.46.1-beta.0 → 0.46.1-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/FileExplorer.js +25 -22
- package/dist/FileExplorer.js.map +1 -1
- package/dist/FileExplorerToolbar.js +28 -23
- package/dist/FileExplorerToolbar.js.map +1 -1
- package/dist/FileList.js +20 -18
- package/dist/FileList.js.map +1 -1
- package/dist/FileListContainer.js +31 -21
- package/dist/FileListContainer.js.map +1 -1
- package/dist/FileListItem.js +21 -17
- package/dist/FileListItem.js.map +1 -1
- package/dist/FileListItemEditor.js +22 -18
- package/dist/FileListItemEditor.js.map +1 -1
- package/dist/NewItemModal.js +99 -75
- package/dist/NewItemModal.js.map +1 -1
- package/package.json +8 -8
package/dist/FileExplorer.js
CHANGED
|
@@ -11,6 +11,8 @@ import FileListContainer from "./FileListContainer.js";
|
|
|
11
11
|
import FileUtils from "./FileUtils.js";
|
|
12
12
|
import FileExistsError from "./FileExistsError.js";
|
|
13
13
|
import FileNotFoundError from "./FileNotFoundError.js";
|
|
14
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
15
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
14
16
|
var log = Log.module('FileExplorer');
|
|
15
17
|
/**
|
|
16
18
|
* Component that displays and allows interaction with the file system in the provided FileStorage.
|
|
@@ -125,28 +127,29 @@ export function FileExplorer(props) {
|
|
|
125
127
|
}
|
|
126
128
|
return "Are you sure you want to delete the selected files?";
|
|
127
129
|
}, [itemsToDelete]);
|
|
128
|
-
return /*#__PURE__*/
|
|
129
|
-
className: "file-explorer"
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
130
|
+
return /*#__PURE__*/_jsxs("div", {
|
|
131
|
+
className: "file-explorer",
|
|
132
|
+
children: [table && /*#__PURE__*/_jsx(FileListContainer, {
|
|
133
|
+
isMultiSelect: isMultiSelect,
|
|
134
|
+
focusedPath: focusedPath,
|
|
135
|
+
showContextMenu: true,
|
|
136
|
+
onMove: handleMove,
|
|
137
|
+
onDelete: handleDelete,
|
|
138
|
+
onRename: handleRename,
|
|
139
|
+
onSelect: onSelect,
|
|
140
|
+
onSelectionChange: onSelectionChange,
|
|
141
|
+
rowHeight: rowHeight,
|
|
142
|
+
table: table,
|
|
143
|
+
validateRename: handleValidateRename
|
|
144
|
+
}), /*#__PURE__*/_jsx(BasicModal, {
|
|
145
|
+
isOpen: isDeleteConfirmationShown,
|
|
146
|
+
headerText: deleteConfirmationMessage,
|
|
147
|
+
bodyText: "You cannot undo this action.",
|
|
148
|
+
onCancel: handleDeleteCancel,
|
|
149
|
+
onConfirm: handleDeleteConfirm,
|
|
150
|
+
confirmButtonText: "Delete"
|
|
151
|
+
})]
|
|
152
|
+
});
|
|
150
153
|
}
|
|
151
154
|
FileExplorer.displayName = 'FileExplorer';
|
|
152
155
|
export default FileExplorer;
|
package/dist/FileExplorer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileExplorer.js","names":["BasicModal","Log","PromiseUtils","React","useCallback","useEffect","useMemo","useState","DEFAULT_ROW_HEIGHT","isDirectory","FileListContainer","FileUtils","FileExistsError","FileNotFoundError","log","module","FileExplorer","props","storage","isMultiSelect","focusedPath","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 './FileListUtils';\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 focusedPath?: string;\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 function FileExplorer(props: FileExplorerProps): JSX.Element {\n const {\n storage,\n isMultiSelect = false,\n focusedPath,\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 focusedPath={focusedPath}\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
|
+
{"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","focusedPath","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 './FileListUtils';\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 focusedPath?: string;\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 function FileExplorer(props: FileExplorerProps): JSX.Element {\n const {\n storage,\n isMultiSelect = false,\n focusedPath,\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 focusedPath={focusedPath}\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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"}
|
|
@@ -2,6 +2,8 @@ import React from 'react';
|
|
|
2
2
|
import { Button, DebouncedSearchInput } from '@deephaven/components';
|
|
3
3
|
import { vsNewFile, vsNewFolder } from '@deephaven/icons';
|
|
4
4
|
import "./FileExplorerToolbar.css";
|
|
5
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
6
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
5
7
|
export function FileExplorerToolbar(_ref) {
|
|
6
8
|
var {
|
|
7
9
|
createFile,
|
|
@@ -9,29 +11,32 @@ export function FileExplorerToolbar(_ref) {
|
|
|
9
11
|
onSearchChange,
|
|
10
12
|
defaultSearchText = ''
|
|
11
13
|
} = _ref;
|
|
12
|
-
return /*#__PURE__*/
|
|
13
|
-
className: "file-explorer-toolbar"
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
14
|
+
return /*#__PURE__*/_jsxs("div", {
|
|
15
|
+
className: "file-explorer-toolbar",
|
|
16
|
+
children: [/*#__PURE__*/_jsxs("div", {
|
|
17
|
+
className: "file-explorer-toolbar-buttons",
|
|
18
|
+
children: [/*#__PURE__*/_jsx(Button, {
|
|
19
|
+
kind: "ghost",
|
|
20
|
+
icon: vsNewFile,
|
|
21
|
+
tooltip: "New notebook",
|
|
22
|
+
onClick: createFile,
|
|
23
|
+
"aria-label": "New notebook"
|
|
24
|
+
}), /*#__PURE__*/_jsx(Button, {
|
|
25
|
+
kind: "ghost",
|
|
26
|
+
icon: vsNewFolder,
|
|
27
|
+
tooltip: "New folder",
|
|
28
|
+
onClick: createFolder,
|
|
29
|
+
"aria-label": "New folder"
|
|
30
|
+
})]
|
|
31
|
+
}), onSearchChange && /*#__PURE__*/_jsx("div", {
|
|
32
|
+
className: "file-explorer-toolbar-search",
|
|
33
|
+
children: /*#__PURE__*/_jsx(DebouncedSearchInput, {
|
|
34
|
+
value: defaultSearchText,
|
|
35
|
+
onChange: onSearchChange,
|
|
36
|
+
placeholder: "Search by name"
|
|
37
|
+
})
|
|
38
|
+
})]
|
|
39
|
+
});
|
|
35
40
|
}
|
|
36
41
|
export default FileExplorerToolbar;
|
|
37
42
|
//# sourceMappingURL=FileExplorerToolbar.js.map
|
|
@@ -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 function FileExplorerToolbar({\n createFile,\n createFolder,\n onSearchChange,\n defaultSearchText = '',\n}: FileExplorerToolbarProps): JSX.Element {\n return (\n <div className=\"file-explorer-toolbar\">\n <div className=\"file-explorer-toolbar-buttons\">\n <Button\n kind=\"ghost\"\n icon={vsNewFile}\n tooltip=\"New notebook\"\n onClick={createFile}\n aria-label=\"New notebook\"\n />\n <Button\n kind=\"ghost\"\n icon={vsNewFolder}\n tooltip=\"New folder\"\n onClick={createFolder}\n aria-label=\"New folder\"\n />\n </div>\n {onSearchChange && (\n <div className=\"file-explorer-toolbar-search\">\n <DebouncedSearchInput\n value={defaultSearchText}\n onChange={onSearchChange}\n placeholder=\"Search by name\"\n />\n </div>\n )}\n </div>\n );\n}\n\nexport default FileExplorerToolbar;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,MAAM,EAAEC,oBAAoB,QAAQ,uBAAuB;AACpE,SAASC,SAAS,EAAEC,WAAW,QAAQ,kBAAkB;AAAC;AAU1D,OAAO,SAASC,mBAAmB,OAKO;EAAA,IALN;IAClCC,UAAU;IACVC,YAAY;IACZC,cAAc;IACdC,iBAAiB,GAAG;EACI,CAAC;EACzB,oBACE;IAAK,SAAS,EAAC;
|
|
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 function FileExplorerToolbar({\n createFile,\n createFolder,\n onSearchChange,\n defaultSearchText = '',\n}: FileExplorerToolbarProps): JSX.Element {\n return (\n <div className=\"file-explorer-toolbar\">\n <div className=\"file-explorer-toolbar-buttons\">\n <Button\n kind=\"ghost\"\n icon={vsNewFile}\n tooltip=\"New notebook\"\n onClick={createFile}\n aria-label=\"New notebook\"\n />\n <Button\n kind=\"ghost\"\n icon={vsNewFolder}\n tooltip=\"New folder\"\n onClick={createFolder}\n aria-label=\"New folder\"\n />\n </div>\n {onSearchChange && (\n <div className=\"file-explorer-toolbar-search\">\n <DebouncedSearchInput\n value={defaultSearchText}\n onChange={onSearchChange}\n placeholder=\"Search by name\"\n />\n </div>\n )}\n </div>\n );\n}\n\nexport default FileExplorerToolbar;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,MAAM,EAAEC,oBAAoB,QAAQ,uBAAuB;AACpE,SAASC,SAAS,EAAEC,WAAW,QAAQ,kBAAkB;AAAC;AAAA;AAAA;AAU1D,OAAO,SAASC,mBAAmB,OAKO;EAAA,IALN;IAClCC,UAAU;IACVC,YAAY;IACZC,cAAc;IACdC,iBAAiB,GAAG;EACI,CAAC;EACzB,oBACE;IAAK,SAAS,EAAC,uBAAuB;IAAA,wBACpC;MAAK,SAAS,EAAC,+BAA+B;MAAA,wBAC5C,KAAC,MAAM;QACL,IAAI,EAAC,OAAO;QACZ,IAAI,EAAEN,SAAU;QAChB,OAAO,EAAC,cAAc;QACtB,OAAO,EAAEG,UAAW;QACpB,cAAW;MAAc,EACzB,eACF,KAAC,MAAM;QACL,IAAI,EAAC,OAAO;QACZ,IAAI,EAAEF,WAAY;QAClB,OAAO,EAAC,YAAY;QACpB,OAAO,EAAEG,YAAa;QACtB,cAAW;MAAY,EACvB;IAAA,EACE,EACLC,cAAc,iBACb;MAAK,SAAS,EAAC,8BAA8B;MAAA,uBAC3C,KAAC,oBAAoB;QACnB,KAAK,EAAEC,iBAAkB;QACzB,QAAQ,EAAED,cAAe;QACzB,WAAW,EAAC;MAAgB;IAC5B,EAEL;EAAA,EACG;AAEV;AAEA,eAAeH,mBAAmB"}
|
package/dist/FileList.js
CHANGED
|
@@ -12,6 +12,7 @@ import { isDirectory } from "./FileStorage.js";
|
|
|
12
12
|
import "./FileList.css";
|
|
13
13
|
import { DEFAULT_ROW_HEIGHT, getMoveOperation } from "./FileListUtils.js";
|
|
14
14
|
import { FileListItem } from "./FileListItem.js";
|
|
15
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
15
16
|
var log = Log.module('FileList');
|
|
16
17
|
// How long you need to hover over a directory before it expands
|
|
17
18
|
var DRAG_HOVER_TIMEOUT = 500;
|
|
@@ -281,29 +282,30 @@ export function FileList(props) {
|
|
|
281
282
|
onDragExit: handleItemDragExit,
|
|
282
283
|
onDrop: handleItemDrop
|
|
283
284
|
})), [handleItemDragEnd, handleItemDragExit, handleItemDragOver, handleItemDragStart, handleItemDrop, draggedItems, dropTargetItem, isDropTargetValid, renderItem]);
|
|
284
|
-
return /*#__PURE__*/
|
|
285
|
+
return /*#__PURE__*/_jsx("div", {
|
|
285
286
|
ref: fileList,
|
|
286
287
|
className: classNames('file-list', {
|
|
287
288
|
'is-dragging': draggedItems != null
|
|
288
289
|
}),
|
|
289
290
|
onDragOver: handleListDragOver,
|
|
290
|
-
onDrop: handleListDrop
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
291
|
+
onDrop: handleListDrop,
|
|
292
|
+
children: /*#__PURE__*/_jsx(ItemList, {
|
|
293
|
+
ref: itemList,
|
|
294
|
+
items: loadedViewport.items,
|
|
295
|
+
itemCount: loadedViewport.itemCount,
|
|
296
|
+
offset: loadedViewport.offset,
|
|
297
|
+
onFocusChange: handleFocusChange,
|
|
298
|
+
onSelect: handleSelect,
|
|
299
|
+
onSelectionChange: handleSelectionChange,
|
|
300
|
+
onViewportChange: handleViewportChange,
|
|
301
|
+
selectedRanges: selectedRanges,
|
|
302
|
+
renderItem: renderWrapper,
|
|
303
|
+
rowHeight: rowHeight,
|
|
304
|
+
isMultiSelect: isMultiSelect,
|
|
305
|
+
isDragSelect: false,
|
|
306
|
+
isDeselectOnClick: false
|
|
307
|
+
})
|
|
308
|
+
});
|
|
307
309
|
}
|
|
308
310
|
export default FileList;
|
|
309
311
|
//# sourceMappingURL=FileList.js.map
|
package/dist/FileList.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileList.js","names":["ItemList","Log","RangeUtils","classNames","React","useCallback","useEffect","useMemo","useRef","useState","isDirectory","DEFAULT_ROW_HEIGHT","getMoveOperation","FileListItem","log","module","DRAG_HOVER_TIMEOUT","ITEM_LIST_CLASS_NAME","FileList","props","isMultiSelect","table","onFocusChange","undefined","onMove","onSelect","onSelectionChange","renderItem","rowHeight","overscanCount","DEFAULT_OVERSCAN","loadedViewport","setLoadedViewport","items","offset","itemCount","viewport","setViewport","top","bottom","dropTargetItem","setDropTargetItem","draggedItems","setDraggedItems","dragPlaceholder","setDragPlaceholder","selectedRanges","setSelectedRanges","itemList","fileList","getItems","ranges","length","i","range","j","push","getItem","itemIndex","getDragPlaceholderText","count","index","item","filename","dropItems","debug","files","targetPath","current","focusItem","err","error","handleSelect","event","setExpanded","isExpanded","handleItemDragStart","e","debug2","draggedRanges","isSelected","resetMouseState","newDragPlaceholder","document","createElement","innerHTML","className","body","appendChild","dataTransfer","setDragImage","effectAllowed","handleItemDragOver","preventDefault","handleItemDragEnd","remove","handleItemDrop","handleItemDragExit","handleListDragOver","target","Element","classList","contains","type","basename","id","handleListDrop","handleSelectionChange","newSelectedRanges","selectedItems","handleFocusChange","focusIndex","focusedItem","handleViewportChange","isDropTargetValid","focusedPath","collapseAll","updateTableViewport","Math","max","setLoadedViewportAndReturnCleanup","listenerRemover","onUpdate","newViewport","map","itemName","size","expandFolderOnHover","timeout","setTimeout","clearTimeout","renderWrapper","itemProps","isDragInProgress","onDragStart","onDragEnd","onDragOver","onDragExit","onDrop"],"sources":["../src/FileList.tsx"],"sourcesContent":["import { ItemList, Range } from '@deephaven/components';\nimport Log from '@deephaven/log';\nimport { RangeUtils } from '@deephaven/utils';\nimport classNames from 'classnames';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { FileStorageItem, FileStorageTable, isDirectory } from './FileStorage';\nimport './FileList.scss';\nimport { DEFAULT_ROW_HEIGHT, getMoveOperation } from './FileListUtils';\nimport { FileListItem, FileListRenderItemProps } from './FileListItem';\n\nconst log = Log.module('FileList');\n\nexport type LoadedViewport = {\n items: FileStorageItem[];\n offset: number;\n itemCount: number;\n};\n\nexport type ListViewport = {\n top: number;\n bottom: number;\n};\n\nexport interface FileListProps {\n table: FileStorageTable;\n\n isMultiSelect?: boolean;\n focusedPath?: string;\n\n onFocusChange?: (focusedItem?: FileStorageItem) => void;\n onMove?: (files: FileStorageItem[], path: string) => void;\n onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => void;\n onSelectionChange?: (selectedItems: FileStorageItem[]) => void;\n\n renderItem?: (props: FileListRenderItemProps) => JSX.Element;\n\n /** Height of each item in the list */\n rowHeight?: number;\n\n overscanCount?: number;\n}\n\n// How long you need to hover over a directory before it expands\nconst DRAG_HOVER_TIMEOUT = 500;\n\nconst ITEM_LIST_CLASS_NAME = 'item-list-scroll-pane';\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorageTable.\n */\nexport function FileList(props: FileListProps): JSX.Element {\n const {\n isMultiSelect = false,\n table,\n onFocusChange = () => undefined,\n onMove,\n onSelect,\n onSelectionChange = () => undefined,\n renderItem = FileListItem,\n rowHeight = DEFAULT_ROW_HEIGHT,\n overscanCount = ItemList.DEFAULT_OVERSCAN,\n } = props;\n const [loadedViewport, setLoadedViewport] = useState<LoadedViewport>(() => ({\n items: [],\n offset: 0,\n itemCount: 0,\n }));\n const [viewport, setViewport] = useState<ListViewport>({\n top: 0,\n bottom: 0,\n });\n\n const [dropTargetItem, setDropTargetItem] = useState<FileStorageItem>();\n const [draggedItems, setDraggedItems] = useState<FileStorageItem[]>();\n const [dragPlaceholder, setDragPlaceholder] = useState<HTMLDivElement>();\n const [selectedRanges, setSelectedRanges] = useState([] as Range[]);\n\n const itemList = useRef<ItemList<FileStorageItem>>(null);\n const fileList = useRef<HTMLDivElement>(null);\n\n const getItems = useCallback(\n (ranges: Range[]): FileStorageItem[] => {\n if (ranges.length === 0 || loadedViewport == null) {\n return [];\n }\n\n const items = [] as FileStorageItem[];\n for (let i = 0; i < ranges.length; i += 1) {\n const range = ranges[i];\n for (let j = range[0]; j <= range[1]; j += 1) {\n if (\n j >= loadedViewport.offset &&\n j < loadedViewport.offset + loadedViewport.items.length\n ) {\n items.push(loadedViewport.items[j - loadedViewport.offset]);\n }\n }\n }\n return items;\n },\n [loadedViewport]\n );\n\n const getItem = useCallback(\n (itemIndex: number): FileStorageItem | undefined => {\n const items = getItems([[itemIndex, itemIndex]]);\n if (items.length > 0) {\n return items[0];\n }\n },\n [getItems]\n );\n\n /**\n * Get the placeholder text to show when a drag operation is in progress\n */\n const getDragPlaceholderText = useCallback(() => {\n const count = RangeUtils.count(selectedRanges);\n if (count === 0) {\n return null;\n }\n\n if (count === 1) {\n const index = selectedRanges[0][0];\n const item = getItem(index);\n if (item != null) {\n return item.filename;\n }\n }\n return `${count} items`;\n }, [getItem, selectedRanges]);\n\n /**\n * Drop the currently dragged items at the currently set drop target.\n * If an itemIndex is provided, focus that index after the drop.\n */\n const dropItems = useCallback(\n (itemIndex?: number) => {\n if (!draggedItems || !dropTargetItem) {\n return;\n }\n\n log.debug('dropItems', draggedItems, 'to', itemIndex);\n\n try {\n const { files, targetPath } = getMoveOperation(\n draggedItems,\n dropTargetItem\n );\n onMove?.(files, targetPath);\n if (itemIndex != null) {\n setSelectedRanges([[itemIndex, itemIndex]]);\n itemList.current?.focusItem(itemIndex);\n }\n } catch (err) {\n log.error('Unable to complete move', err);\n }\n },\n [draggedItems, dropTargetItem, onMove]\n );\n\n const handleSelect = useCallback(\n (itemIndex: number, event: React.SyntheticEvent) => {\n const item = loadedViewport.items[itemIndex - loadedViewport.offset];\n if (item !== undefined) {\n log.debug('handleItemClick', item);\n\n onSelect(item, event);\n if (isDirectory(item)) {\n table?.setExpanded(item.filename, !item.isExpanded);\n }\n }\n },\n [loadedViewport, onSelect, table]\n );\n\n const handleItemDragStart = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n log.debug2('handleItemDragStart', itemIndex, selectedRanges);\n\n let draggedRanges = selectedRanges;\n if (!RangeUtils.isSelected(selectedRanges, itemIndex)) {\n draggedRanges = [[itemIndex, itemIndex]];\n setSelectedRanges(draggedRanges);\n }\n\n setDraggedItems(getItems(draggedRanges));\n\n // We need to reset reset the mouse state since we steal the drag\n itemList.current?.resetMouseState();\n\n const newDragPlaceholder = document.createElement('div');\n newDragPlaceholder.innerHTML = `<div class=\"dnd-placeholder-content\">${getDragPlaceholderText()}</div>`;\n newDragPlaceholder.className = 'file-list-dnd-placeholder';\n document.body.appendChild(newDragPlaceholder);\n e.dataTransfer.setDragImage(newDragPlaceholder, 0, 0);\n e.dataTransfer.effectAllowed = 'move';\n setDragPlaceholder(newDragPlaceholder);\n },\n [getDragPlaceholderText, getItems, selectedRanges]\n );\n\n const handleItemDragOver = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n\n log.debug2('handleItemDragOver', e);\n setDropTargetItem(getItem(itemIndex));\n },\n [getItem]\n );\n\n const handleItemDragEnd = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n log.debug('handleItemDragEnd', itemIndex);\n\n dragPlaceholder?.remove();\n\n // Drag end is triggered after drop\n // Also drop isn't triggered if drag end is outside of the list\n setDraggedItems(undefined);\n setDropTargetItem(undefined);\n setDragPlaceholder(undefined);\n },\n [dragPlaceholder]\n );\n\n const handleItemDrop = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n dropItems(itemIndex);\n },\n [dropItems]\n );\n\n const handleItemDragExit = useCallback(() => {\n log.debug2('handleItemDragExit');\n setDropTargetItem(undefined);\n }, []);\n\n const handleListDragOver = useCallback(\n (e: React.DragEvent<HTMLDivElement>) => {\n if (\n e.target instanceof Element &&\n e.target.classList.contains(ITEM_LIST_CLASS_NAME)\n ) {\n // Need to prevent default to enable drop\n // https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#droptargets\n e.preventDefault();\n\n log.debug2('handleListDragOver', e);\n setDropTargetItem({\n type: 'directory',\n filename: '/',\n basename: '/',\n id: '/',\n });\n }\n },\n []\n );\n\n const handleListDrop = useCallback(\n (e: React.DragEvent<HTMLDivElement>) => {\n if (\n e.target instanceof Element &&\n e.target.classList.contains(ITEM_LIST_CLASS_NAME)\n ) {\n log.debug('handleListDrop');\n dropItems();\n }\n },\n [dropItems]\n );\n\n const handleSelectionChange = useCallback(\n newSelectedRanges => {\n log.debug2('handleSelectionChange', newSelectedRanges);\n if (newSelectedRanges !== selectedRanges) {\n setSelectedRanges(newSelectedRanges);\n const selectedItems = getItems(newSelectedRanges);\n onSelectionChange(selectedItems);\n }\n },\n [getItems, onSelectionChange, selectedRanges]\n );\n\n const handleFocusChange = useCallback(\n focusIndex => {\n log.debug2('handleFocusChange', focusIndex);\n if (focusIndex != null) {\n const [focusedItem] = getItems([[focusIndex, focusIndex]]);\n onFocusChange(focusedItem);\n } else {\n onFocusChange();\n }\n },\n [getItems, onFocusChange]\n );\n\n const handleViewportChange = useCallback(\n (top: number, bottom: number) => {\n log.debug('handleViewportChange', top, bottom);\n if (top !== viewport.top || bottom !== viewport.bottom) {\n setViewport({ top, bottom });\n }\n },\n [viewport]\n );\n\n const isDropTargetValid = useMemo(() => {\n if (!draggedItems || !dropTargetItem) {\n return false;\n }\n\n try {\n getMoveOperation(draggedItems, dropTargetItem);\n log.debug('handleValidateDropTarget true');\n return true;\n } catch (e) {\n log.debug('handleValidateDropTarget false');\n return false;\n }\n }, [draggedItems, dropTargetItem]);\n\n const { focusedPath } = props;\n useEffect(() => {\n if (focusedPath !== undefined) {\n if (focusedPath === '/') {\n table.collapseAll();\n } else {\n table.setExpanded(focusedPath, false);\n table.setExpanded(focusedPath, true);\n }\n }\n }, [table, focusedPath]);\n\n useEffect(\n function updateTableViewport() {\n log.debug('updating table viewport', viewport);\n table?.setViewport({\n top: Math.max(0, viewport.top - overscanCount),\n bottom: viewport.bottom + overscanCount,\n });\n },\n [overscanCount, table, viewport]\n );\n\n // Listen for table updates\n useEffect(\n function setLoadedViewportAndReturnCleanup() {\n const listenerRemover = table.onUpdate(newViewport => {\n setLoadedViewport({\n items: newViewport.items.map(item => ({\n ...item,\n itemName: item.basename,\n })),\n offset: newViewport.offset,\n itemCount: table.size,\n });\n });\n return () => {\n listenerRemover();\n };\n },\n [table]\n );\n\n // Expand a folder if hovering over it\n useEffect(\n function expandFolderOnHover() {\n if (\n dropTargetItem != null &&\n isDirectory(dropTargetItem) &&\n dropTargetItem.filename !== '/'\n ) {\n const timeout = setTimeout(() => {\n if (!dropTargetItem.isExpanded) {\n table?.setExpanded(dropTargetItem.filename, true);\n }\n }, DRAG_HOVER_TIMEOUT);\n return () => clearTimeout(timeout);\n }\n },\n [dropTargetItem, table]\n );\n\n const renderWrapper = useCallback(\n itemProps =>\n renderItem({\n ...itemProps,\n isDragInProgress: draggedItems != null,\n dropTargetItem,\n draggedItems,\n isDropTargetValid,\n onDragStart: handleItemDragStart,\n onDragEnd: handleItemDragEnd,\n onDragOver: handleItemDragOver,\n onDragExit: handleItemDragExit,\n onDrop: handleItemDrop,\n }),\n [\n handleItemDragEnd,\n handleItemDragExit,\n handleItemDragOver,\n handleItemDragStart,\n handleItemDrop,\n draggedItems,\n dropTargetItem,\n isDropTargetValid,\n renderItem,\n ]\n );\n\n return (\n <div\n ref={fileList}\n className={classNames('file-list', {\n 'is-dragging': draggedItems != null,\n })}\n onDragOver={handleListDragOver}\n onDrop={handleListDrop}\n >\n <ItemList\n ref={itemList}\n items={loadedViewport.items}\n itemCount={loadedViewport.itemCount}\n offset={loadedViewport.offset}\n onFocusChange={handleFocusChange}\n onSelect={handleSelect}\n onSelectionChange={handleSelectionChange}\n onViewportChange={handleViewportChange}\n selectedRanges={selectedRanges}\n renderItem={renderWrapper}\n rowHeight={rowHeight}\n isMultiSelect={isMultiSelect}\n isDragSelect={false}\n isDeselectOnClick={false}\n />\n </div>\n );\n}\n\nexport default FileList;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FileList.js","names":["ItemList","Log","RangeUtils","classNames","React","useCallback","useEffect","useMemo","useRef","useState","isDirectory","DEFAULT_ROW_HEIGHT","getMoveOperation","FileListItem","log","module","DRAG_HOVER_TIMEOUT","ITEM_LIST_CLASS_NAME","FileList","props","isMultiSelect","table","onFocusChange","undefined","onMove","onSelect","onSelectionChange","renderItem","rowHeight","overscanCount","DEFAULT_OVERSCAN","loadedViewport","setLoadedViewport","items","offset","itemCount","viewport","setViewport","top","bottom","dropTargetItem","setDropTargetItem","draggedItems","setDraggedItems","dragPlaceholder","setDragPlaceholder","selectedRanges","setSelectedRanges","itemList","fileList","getItems","ranges","length","i","range","j","push","getItem","itemIndex","getDragPlaceholderText","count","index","item","filename","dropItems","debug","files","targetPath","current","focusItem","err","error","handleSelect","event","setExpanded","isExpanded","handleItemDragStart","e","debug2","draggedRanges","isSelected","resetMouseState","newDragPlaceholder","document","createElement","innerHTML","className","body","appendChild","dataTransfer","setDragImage","effectAllowed","handleItemDragOver","preventDefault","handleItemDragEnd","remove","handleItemDrop","handleItemDragExit","handleListDragOver","target","Element","classList","contains","type","basename","id","handleListDrop","handleSelectionChange","newSelectedRanges","selectedItems","handleFocusChange","focusIndex","focusedItem","handleViewportChange","isDropTargetValid","focusedPath","collapseAll","updateTableViewport","Math","max","setLoadedViewportAndReturnCleanup","listenerRemover","onUpdate","newViewport","map","itemName","size","expandFolderOnHover","timeout","setTimeout","clearTimeout","renderWrapper","itemProps","isDragInProgress","onDragStart","onDragEnd","onDragOver","onDragExit","onDrop"],"sources":["../src/FileList.tsx"],"sourcesContent":["import { ItemList, Range } from '@deephaven/components';\nimport Log from '@deephaven/log';\nimport { RangeUtils } from '@deephaven/utils';\nimport classNames from 'classnames';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { FileStorageItem, FileStorageTable, isDirectory } from './FileStorage';\nimport './FileList.scss';\nimport { DEFAULT_ROW_HEIGHT, getMoveOperation } from './FileListUtils';\nimport { FileListItem, FileListRenderItemProps } from './FileListItem';\n\nconst log = Log.module('FileList');\n\nexport type LoadedViewport = {\n items: FileStorageItem[];\n offset: number;\n itemCount: number;\n};\n\nexport type ListViewport = {\n top: number;\n bottom: number;\n};\n\nexport interface FileListProps {\n table: FileStorageTable;\n\n isMultiSelect?: boolean;\n focusedPath?: string;\n\n onFocusChange?: (focusedItem?: FileStorageItem) => void;\n onMove?: (files: FileStorageItem[], path: string) => void;\n onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => void;\n onSelectionChange?: (selectedItems: FileStorageItem[]) => void;\n\n renderItem?: (props: FileListRenderItemProps) => JSX.Element;\n\n /** Height of each item in the list */\n rowHeight?: number;\n\n overscanCount?: number;\n}\n\n// How long you need to hover over a directory before it expands\nconst DRAG_HOVER_TIMEOUT = 500;\n\nconst ITEM_LIST_CLASS_NAME = 'item-list-scroll-pane';\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorageTable.\n */\nexport function FileList(props: FileListProps): JSX.Element {\n const {\n isMultiSelect = false,\n table,\n onFocusChange = () => undefined,\n onMove,\n onSelect,\n onSelectionChange = () => undefined,\n renderItem = FileListItem,\n rowHeight = DEFAULT_ROW_HEIGHT,\n overscanCount = ItemList.DEFAULT_OVERSCAN,\n } = props;\n const [loadedViewport, setLoadedViewport] = useState<LoadedViewport>(() => ({\n items: [],\n offset: 0,\n itemCount: 0,\n }));\n const [viewport, setViewport] = useState<ListViewport>({\n top: 0,\n bottom: 0,\n });\n\n const [dropTargetItem, setDropTargetItem] = useState<FileStorageItem>();\n const [draggedItems, setDraggedItems] = useState<FileStorageItem[]>();\n const [dragPlaceholder, setDragPlaceholder] = useState<HTMLDivElement>();\n const [selectedRanges, setSelectedRanges] = useState([] as Range[]);\n\n const itemList = useRef<ItemList<FileStorageItem>>(null);\n const fileList = useRef<HTMLDivElement>(null);\n\n const getItems = useCallback(\n (ranges: Range[]): FileStorageItem[] => {\n if (ranges.length === 0 || loadedViewport == null) {\n return [];\n }\n\n const items = [] as FileStorageItem[];\n for (let i = 0; i < ranges.length; i += 1) {\n const range = ranges[i];\n for (let j = range[0]; j <= range[1]; j += 1) {\n if (\n j >= loadedViewport.offset &&\n j < loadedViewport.offset + loadedViewport.items.length\n ) {\n items.push(loadedViewport.items[j - loadedViewport.offset]);\n }\n }\n }\n return items;\n },\n [loadedViewport]\n );\n\n const getItem = useCallback(\n (itemIndex: number): FileStorageItem | undefined => {\n const items = getItems([[itemIndex, itemIndex]]);\n if (items.length > 0) {\n return items[0];\n }\n },\n [getItems]\n );\n\n /**\n * Get the placeholder text to show when a drag operation is in progress\n */\n const getDragPlaceholderText = useCallback(() => {\n const count = RangeUtils.count(selectedRanges);\n if (count === 0) {\n return null;\n }\n\n if (count === 1) {\n const index = selectedRanges[0][0];\n const item = getItem(index);\n if (item != null) {\n return item.filename;\n }\n }\n return `${count} items`;\n }, [getItem, selectedRanges]);\n\n /**\n * Drop the currently dragged items at the currently set drop target.\n * If an itemIndex is provided, focus that index after the drop.\n */\n const dropItems = useCallback(\n (itemIndex?: number) => {\n if (!draggedItems || !dropTargetItem) {\n return;\n }\n\n log.debug('dropItems', draggedItems, 'to', itemIndex);\n\n try {\n const { files, targetPath } = getMoveOperation(\n draggedItems,\n dropTargetItem\n );\n onMove?.(files, targetPath);\n if (itemIndex != null) {\n setSelectedRanges([[itemIndex, itemIndex]]);\n itemList.current?.focusItem(itemIndex);\n }\n } catch (err) {\n log.error('Unable to complete move', err);\n }\n },\n [draggedItems, dropTargetItem, onMove]\n );\n\n const handleSelect = useCallback(\n (itemIndex: number, event: React.SyntheticEvent) => {\n const item = loadedViewport.items[itemIndex - loadedViewport.offset];\n if (item !== undefined) {\n log.debug('handleItemClick', item);\n\n onSelect(item, event);\n if (isDirectory(item)) {\n table?.setExpanded(item.filename, !item.isExpanded);\n }\n }\n },\n [loadedViewport, onSelect, table]\n );\n\n const handleItemDragStart = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n log.debug2('handleItemDragStart', itemIndex, selectedRanges);\n\n let draggedRanges = selectedRanges;\n if (!RangeUtils.isSelected(selectedRanges, itemIndex)) {\n draggedRanges = [[itemIndex, itemIndex]];\n setSelectedRanges(draggedRanges);\n }\n\n setDraggedItems(getItems(draggedRanges));\n\n // We need to reset reset the mouse state since we steal the drag\n itemList.current?.resetMouseState();\n\n const newDragPlaceholder = document.createElement('div');\n newDragPlaceholder.innerHTML = `<div class=\"dnd-placeholder-content\">${getDragPlaceholderText()}</div>`;\n newDragPlaceholder.className = 'file-list-dnd-placeholder';\n document.body.appendChild(newDragPlaceholder);\n e.dataTransfer.setDragImage(newDragPlaceholder, 0, 0);\n e.dataTransfer.effectAllowed = 'move';\n setDragPlaceholder(newDragPlaceholder);\n },\n [getDragPlaceholderText, getItems, selectedRanges]\n );\n\n const handleItemDragOver = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n\n log.debug2('handleItemDragOver', e);\n setDropTargetItem(getItem(itemIndex));\n },\n [getItem]\n );\n\n const handleItemDragEnd = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n log.debug('handleItemDragEnd', itemIndex);\n\n dragPlaceholder?.remove();\n\n // Drag end is triggered after drop\n // Also drop isn't triggered if drag end is outside of the list\n setDraggedItems(undefined);\n setDropTargetItem(undefined);\n setDragPlaceholder(undefined);\n },\n [dragPlaceholder]\n );\n\n const handleItemDrop = useCallback(\n (itemIndex: number, e: React.DragEvent<HTMLDivElement>) => {\n dropItems(itemIndex);\n },\n [dropItems]\n );\n\n const handleItemDragExit = useCallback(() => {\n log.debug2('handleItemDragExit');\n setDropTargetItem(undefined);\n }, []);\n\n const handleListDragOver = useCallback(\n (e: React.DragEvent<HTMLDivElement>) => {\n if (\n e.target instanceof Element &&\n e.target.classList.contains(ITEM_LIST_CLASS_NAME)\n ) {\n // Need to prevent default to enable drop\n // https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#droptargets\n e.preventDefault();\n\n log.debug2('handleListDragOver', e);\n setDropTargetItem({\n type: 'directory',\n filename: '/',\n basename: '/',\n id: '/',\n });\n }\n },\n []\n );\n\n const handleListDrop = useCallback(\n (e: React.DragEvent<HTMLDivElement>) => {\n if (\n e.target instanceof Element &&\n e.target.classList.contains(ITEM_LIST_CLASS_NAME)\n ) {\n log.debug('handleListDrop');\n dropItems();\n }\n },\n [dropItems]\n );\n\n const handleSelectionChange = useCallback(\n newSelectedRanges => {\n log.debug2('handleSelectionChange', newSelectedRanges);\n if (newSelectedRanges !== selectedRanges) {\n setSelectedRanges(newSelectedRanges);\n const selectedItems = getItems(newSelectedRanges);\n onSelectionChange(selectedItems);\n }\n },\n [getItems, onSelectionChange, selectedRanges]\n );\n\n const handleFocusChange = useCallback(\n focusIndex => {\n log.debug2('handleFocusChange', focusIndex);\n if (focusIndex != null) {\n const [focusedItem] = getItems([[focusIndex, focusIndex]]);\n onFocusChange(focusedItem);\n } else {\n onFocusChange();\n }\n },\n [getItems, onFocusChange]\n );\n\n const handleViewportChange = useCallback(\n (top: number, bottom: number) => {\n log.debug('handleViewportChange', top, bottom);\n if (top !== viewport.top || bottom !== viewport.bottom) {\n setViewport({ top, bottom });\n }\n },\n [viewport]\n );\n\n const isDropTargetValid = useMemo(() => {\n if (!draggedItems || !dropTargetItem) {\n return false;\n }\n\n try {\n getMoveOperation(draggedItems, dropTargetItem);\n log.debug('handleValidateDropTarget true');\n return true;\n } catch (e) {\n log.debug('handleValidateDropTarget false');\n return false;\n }\n }, [draggedItems, dropTargetItem]);\n\n const { focusedPath } = props;\n useEffect(() => {\n if (focusedPath !== undefined) {\n if (focusedPath === '/') {\n table.collapseAll();\n } else {\n table.setExpanded(focusedPath, false);\n table.setExpanded(focusedPath, true);\n }\n }\n }, [table, focusedPath]);\n\n useEffect(\n function updateTableViewport() {\n log.debug('updating table viewport', viewport);\n table?.setViewport({\n top: Math.max(0, viewport.top - overscanCount),\n bottom: viewport.bottom + overscanCount,\n });\n },\n [overscanCount, table, viewport]\n );\n\n // Listen for table updates\n useEffect(\n function setLoadedViewportAndReturnCleanup() {\n const listenerRemover = table.onUpdate(newViewport => {\n setLoadedViewport({\n items: newViewport.items.map(item => ({\n ...item,\n itemName: item.basename,\n })),\n offset: newViewport.offset,\n itemCount: table.size,\n });\n });\n return () => {\n listenerRemover();\n };\n },\n [table]\n );\n\n // Expand a folder if hovering over it\n useEffect(\n function expandFolderOnHover() {\n if (\n dropTargetItem != null &&\n isDirectory(dropTargetItem) &&\n dropTargetItem.filename !== '/'\n ) {\n const timeout = setTimeout(() => {\n if (!dropTargetItem.isExpanded) {\n table?.setExpanded(dropTargetItem.filename, true);\n }\n }, DRAG_HOVER_TIMEOUT);\n return () => clearTimeout(timeout);\n }\n },\n [dropTargetItem, table]\n );\n\n const renderWrapper = useCallback(\n itemProps =>\n renderItem({\n ...itemProps,\n isDragInProgress: draggedItems != null,\n dropTargetItem,\n draggedItems,\n isDropTargetValid,\n onDragStart: handleItemDragStart,\n onDragEnd: handleItemDragEnd,\n onDragOver: handleItemDragOver,\n onDragExit: handleItemDragExit,\n onDrop: handleItemDrop,\n }),\n [\n handleItemDragEnd,\n handleItemDragExit,\n handleItemDragOver,\n handleItemDragStart,\n handleItemDrop,\n draggedItems,\n dropTargetItem,\n isDropTargetValid,\n renderItem,\n ]\n );\n\n return (\n <div\n ref={fileList}\n className={classNames('file-list', {\n 'is-dragging': draggedItems != null,\n })}\n onDragOver={handleListDragOver}\n onDrop={handleListDrop}\n >\n <ItemList\n ref={itemList}\n items={loadedViewport.items}\n itemCount={loadedViewport.itemCount}\n offset={loadedViewport.offset}\n onFocusChange={handleFocusChange}\n onSelect={handleSelect}\n onSelectionChange={handleSelectionChange}\n onViewportChange={handleViewportChange}\n selectedRanges={selectedRanges}\n renderItem={renderWrapper}\n rowHeight={rowHeight}\n isMultiSelect={isMultiSelect}\n isDragSelect={false}\n isDeselectOnClick={false}\n />\n </div>\n );\n}\n\nexport default FileList;\n"],"mappings":"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"}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
2
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
3
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
4
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
5
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
1
6
|
import { ContextActions } from '@deephaven/components';
|
|
2
7
|
import { assertNotNull } from '@deephaven/utils';
|
|
3
8
|
import React, { useCallback, useMemo, useState } from 'react';
|
|
@@ -9,6 +14,8 @@ import SHORTCUTS from "./FileExplorerShortcuts.js";
|
|
|
9
14
|
import "./FileExplorer.css";
|
|
10
15
|
import FileUtils from "./FileUtils.js";
|
|
11
16
|
import FileListItemEditor from "./FileListItemEditor.js";
|
|
17
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
18
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
12
19
|
/**
|
|
13
20
|
* Component that displays and allows interaction with the file system in the provided FileStorage.
|
|
14
21
|
*/
|
|
@@ -135,32 +142,35 @@ export function FileListContainer(props) {
|
|
|
135
142
|
return (
|
|
136
143
|
/*#__PURE__*/
|
|
137
144
|
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
145
|
+
_jsx(FileListItem, _objectSpread(_objectSpread({}, itemProps), {}, {
|
|
146
|
+
children: /*#__PURE__*/_jsx(FileListItemEditor, {
|
|
147
|
+
item: item,
|
|
148
|
+
validate: validateRenameItem,
|
|
149
|
+
onSubmit: handleRenameSubmit,
|
|
150
|
+
onCancel: handleRenameCancel
|
|
151
|
+
})
|
|
143
152
|
}))
|
|
144
153
|
);
|
|
145
154
|
}
|
|
146
155
|
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
147
|
-
return /*#__PURE__*/
|
|
156
|
+
return /*#__PURE__*/_jsx(FileListItem, _objectSpread({}, itemProps));
|
|
148
157
|
}, [handleRenameCancel, handleRenameSubmit, renameItem, validateRenameItem]);
|
|
149
|
-
return /*#__PURE__*/
|
|
150
|
-
className: "file-list-container"
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
158
|
+
return /*#__PURE__*/_jsxs("div", {
|
|
159
|
+
className: "file-list-container",
|
|
160
|
+
children: [table != null && /*#__PURE__*/_jsx(FileList, {
|
|
161
|
+
onMove: onMove,
|
|
162
|
+
onSelect: onSelect,
|
|
163
|
+
onSelectionChange: handleSelectionChange,
|
|
164
|
+
onFocusChange: handleFocusChange,
|
|
165
|
+
renderItem: renderItem,
|
|
166
|
+
rowHeight: rowHeight,
|
|
167
|
+
table: table,
|
|
168
|
+
isMultiSelect: isMultiSelect,
|
|
169
|
+
focusedPath: focusedPath
|
|
170
|
+
}), showContextMenu && /*#__PURE__*/_jsx(ContextActions, {
|
|
171
|
+
actions: actions
|
|
172
|
+
})]
|
|
173
|
+
});
|
|
164
174
|
}
|
|
165
175
|
FileListContainer.displayName = 'FileListContainer';
|
|
166
176
|
export default FileListContainer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileListContainer.js","names":["ContextActions","assertNotNull","React","useCallback","useMemo","useState","FileList","FileListItem","DEFAULT_ROW_HEIGHT","isDirectory","SHORTCUTS","FileUtils","FileListItemEditor","FileListContainer","props","isMultiSelect","focusedPath","showContextMenu","onCreateFile","onCreateFolder","onCopy","onDelete","onMove","onRename","onSelect","onSelectionChange","table","rowHeight","validateRename","Promise","resolve","renameItem","setRenameItem","selectedItems","setSelectedItems","focusedItem","setFocusedItem","handleSelectionChange","newSelectedItems","handleFocusChange","newFocusedItem","handleCopyAction","handleDeleteAction","length","handleNewFileAction","handleNewFolderAction","getPath","filename","handleRenameAction","handleRenameCancel","undefined","handleRenameSubmit","newName","actions","result","push","title","description","action","group","groups","medium","low","disabled","shortcut","FILE_EXPLORER","DELETE","RENAME","validateRenameItem","renderItem","itemProps","item","displayName"],"sources":["../src/FileListContainer.tsx"],"sourcesContent":["import { ContextAction, ContextActions } from '@deephaven/components';\nimport { assertNotNull } from '@deephaven/utils';\nimport React, { useCallback, useMemo, useState } from 'react';\nimport FileList from './FileList';\nimport { FileListItem, FileListRenderItemProps } from './FileListItem';\nimport { DEFAULT_ROW_HEIGHT } from './FileListUtils';\nimport { FileStorageItem, FileStorageTable, isDirectory } from './FileStorage';\nimport SHORTCUTS from './FileExplorerShortcuts';\nimport './FileExplorer.scss';\nimport FileUtils from './FileUtils';\nimport FileListItemEditor from './FileListItemEditor';\n\nexport interface FileListContainerProps {\n showContextMenu?: boolean;\n table: FileStorageTable;\n\n isMultiSelect?: boolean;\n focusedPath?: string;\n\n onCreateFile?: (path?: string) => void;\n onCreateFolder?: (path?: string) => void;\n onCopy?: (file: FileStorageItem) => void;\n onDelete?: (files: FileStorageItem[]) => void;\n onMove?: (files: FileStorageItem[], path: string) => void;\n onRename?: (file: FileStorageItem, newName: string) => void;\n onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => void;\n validateRename?: (file: FileStorageItem, newName: string) => Promise<void>;\n onSelectionChange?: (selectedItems: FileStorageItem[]) => void;\n\n /** Height of each item in the list */\n rowHeight?: number;\n}\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorage.\n */\nexport function FileListContainer(props: FileListContainerProps): JSX.Element {\n const {\n isMultiSelect = false,\n focusedPath,\n showContextMenu = false,\n onCreateFile,\n onCreateFolder,\n onCopy,\n onDelete,\n onMove,\n onRename,\n onSelect,\n onSelectionChange,\n table,\n rowHeight = DEFAULT_ROW_HEIGHT,\n validateRename = () => Promise.resolve(),\n } = props;\n const [renameItem, setRenameItem] = useState<FileStorageItem>();\n const [selectedItems, setSelectedItems] = useState([] as FileStorageItem[]);\n const [focusedItem, setFocusedItem] = useState<FileStorageItem>();\n\n const handleSelectionChange = useCallback(\n newSelectedItems => {\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 assertNotNull(renameItem);\n return validateRename(renameItem, newName);\n },\n [renameItem, validateRename]\n );\n\n const renderItem = useCallback(\n (itemProps: FileListRenderItemProps): JSX.Element => {\n const { item } = itemProps;\n if (renameItem && renameItem.filename === item.filename) {\n return (\n // eslint-disable-next-line react/jsx-props-no-spreading\n <FileListItem {...itemProps}>\n <FileListItemEditor\n item={item}\n validate={validateRenameItem}\n onSubmit={handleRenameSubmit}\n onCancel={handleRenameCancel}\n />\n </FileListItem>\n );\n }\n // eslint-disable-next-line react/jsx-props-no-spreading\n return <FileListItem {...itemProps} />;\n },\n [handleRenameCancel, handleRenameSubmit, renameItem, validateRenameItem]\n );\n\n return (\n <div className=\"file-list-container\">\n {table != null && (\n <FileList\n onMove={onMove}\n onSelect={onSelect}\n onSelectionChange={handleSelectionChange}\n onFocusChange={handleFocusChange}\n renderItem={renderItem}\n rowHeight={rowHeight}\n table={table}\n isMultiSelect={isMultiSelect}\n focusedPath={focusedPath}\n />\n )}\n {showContextMenu && <ContextActions actions={actions} />}\n </div>\n );\n}\n\nFileListContainer.displayName = 'FileListContainer';\n\nexport default FileListContainer;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FileListContainer.js","names":["ContextActions","assertNotNull","React","useCallback","useMemo","useState","FileList","FileListItem","DEFAULT_ROW_HEIGHT","isDirectory","SHORTCUTS","FileUtils","FileListItemEditor","FileListContainer","props","isMultiSelect","focusedPath","showContextMenu","onCreateFile","onCreateFolder","onCopy","onDelete","onMove","onRename","onSelect","onSelectionChange","table","rowHeight","validateRename","Promise","resolve","renameItem","setRenameItem","selectedItems","setSelectedItems","focusedItem","setFocusedItem","handleSelectionChange","newSelectedItems","handleFocusChange","newFocusedItem","handleCopyAction","handleDeleteAction","length","handleNewFileAction","handleNewFolderAction","getPath","filename","handleRenameAction","handleRenameCancel","undefined","handleRenameSubmit","newName","actions","result","push","title","description","action","group","groups","medium","low","disabled","shortcut","FILE_EXPLORER","DELETE","RENAME","validateRenameItem","renderItem","itemProps","item","displayName"],"sources":["../src/FileListContainer.tsx"],"sourcesContent":["import { ContextAction, ContextActions } from '@deephaven/components';\nimport { assertNotNull } from '@deephaven/utils';\nimport React, { useCallback, useMemo, useState } from 'react';\nimport FileList from './FileList';\nimport { FileListItem, FileListRenderItemProps } from './FileListItem';\nimport { DEFAULT_ROW_HEIGHT } from './FileListUtils';\nimport { FileStorageItem, FileStorageTable, isDirectory } from './FileStorage';\nimport SHORTCUTS from './FileExplorerShortcuts';\nimport './FileExplorer.scss';\nimport FileUtils from './FileUtils';\nimport FileListItemEditor from './FileListItemEditor';\n\nexport interface FileListContainerProps {\n showContextMenu?: boolean;\n table: FileStorageTable;\n\n isMultiSelect?: boolean;\n focusedPath?: string;\n\n onCreateFile?: (path?: string) => void;\n onCreateFolder?: (path?: string) => void;\n onCopy?: (file: FileStorageItem) => void;\n onDelete?: (files: FileStorageItem[]) => void;\n onMove?: (files: FileStorageItem[], path: string) => void;\n onRename?: (file: FileStorageItem, newName: string) => void;\n onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => void;\n validateRename?: (file: FileStorageItem, newName: string) => Promise<void>;\n onSelectionChange?: (selectedItems: FileStorageItem[]) => void;\n\n /** Height of each item in the list */\n rowHeight?: number;\n}\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorage.\n */\nexport function FileListContainer(props: FileListContainerProps): JSX.Element {\n const {\n isMultiSelect = false,\n focusedPath,\n showContextMenu = false,\n onCreateFile,\n onCreateFolder,\n onCopy,\n onDelete,\n onMove,\n onRename,\n onSelect,\n onSelectionChange,\n table,\n rowHeight = DEFAULT_ROW_HEIGHT,\n validateRename = () => Promise.resolve(),\n } = props;\n const [renameItem, setRenameItem] = useState<FileStorageItem>();\n const [selectedItems, setSelectedItems] = useState([] as FileStorageItem[]);\n const [focusedItem, setFocusedItem] = useState<FileStorageItem>();\n\n const handleSelectionChange = useCallback(\n newSelectedItems => {\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 assertNotNull(renameItem);\n return validateRename(renameItem, newName);\n },\n [renameItem, validateRename]\n );\n\n const renderItem = useCallback(\n (itemProps: FileListRenderItemProps): JSX.Element => {\n const { item } = itemProps;\n if (renameItem && renameItem.filename === item.filename) {\n return (\n // eslint-disable-next-line react/jsx-props-no-spreading\n <FileListItem {...itemProps}>\n <FileListItemEditor\n item={item}\n validate={validateRenameItem}\n onSubmit={handleRenameSubmit}\n onCancel={handleRenameCancel}\n />\n </FileListItem>\n );\n }\n // eslint-disable-next-line react/jsx-props-no-spreading\n return <FileListItem {...itemProps} />;\n },\n [handleRenameCancel, handleRenameSubmit, renameItem, validateRenameItem]\n );\n\n return (\n <div className=\"file-list-container\">\n {table != null && (\n <FileList\n onMove={onMove}\n onSelect={onSelect}\n onSelectionChange={handleSelectionChange}\n onFocusChange={handleFocusChange}\n renderItem={renderItem}\n rowHeight={rowHeight}\n table={table}\n isMultiSelect={isMultiSelect}\n focusedPath={focusedPath}\n />\n )}\n {showContextMenu && <ContextActions actions={actions} />}\n </div>\n );\n}\n\nFileListContainer.displayName = 'FileListContainer';\n\nexport default FileListContainer;\n"],"mappings":"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"}
|
package/dist/FileListItem.js
CHANGED
|
@@ -12,6 +12,8 @@ import { getPathFromItem } from "./FileListUtils.js";
|
|
|
12
12
|
* @param item Item to get the icon for
|
|
13
13
|
* @returns Icon definition to pass in the FontAwesomeIcon icon prop
|
|
14
14
|
*/
|
|
15
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
16
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
15
17
|
function getItemIcon(item) {
|
|
16
18
|
if (isDirectory(item)) {
|
|
17
19
|
return item.isExpanded ? vsFolderOpened : vsFolder;
|
|
@@ -51,11 +53,10 @@ export function FileListItem(props) {
|
|
|
51
53
|
var depthLines = Array(depth).fill(null).map((value, index) =>
|
|
52
54
|
/*#__PURE__*/
|
|
53
55
|
// eslint-disable-next-line react/no-array-index-key
|
|
54
|
-
|
|
55
|
-
className: "file-list-depth-line"
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
return /*#__PURE__*/React.createElement("div", {
|
|
56
|
+
_jsx("span", {
|
|
57
|
+
className: "file-list-depth-line"
|
|
58
|
+
}, index));
|
|
59
|
+
return /*#__PURE__*/_jsxs("div", {
|
|
59
60
|
className: classNames('d-flex w-100 align-items-center', 'file-list-item', {
|
|
60
61
|
'is-dragged': isDragged,
|
|
61
62
|
'is-exact-drop-target': isExactDropTarget,
|
|
@@ -101,18 +102,21 @@ export function FileListItem(props) {
|
|
|
101
102
|
}(e => onDrop(itemIndex, e)),
|
|
102
103
|
draggable: true,
|
|
103
104
|
role: "presentation",
|
|
104
|
-
"aria-label": item.basename
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
105
|
+
"aria-label": item.basename,
|
|
106
|
+
children: [depthLines, ' ', /*#__PURE__*/_jsx(FontAwesomeIcon, {
|
|
107
|
+
icon: icon,
|
|
108
|
+
className: "item-icon",
|
|
109
|
+
fixedWidth: true
|
|
110
|
+
}), ' ', /*#__PURE__*/_jsxs("span", {
|
|
111
|
+
className: "truncation-wrapper",
|
|
112
|
+
children: [children !== null && children !== void 0 ? children : item.basename, /*#__PURE__*/_jsx(Tooltip, {
|
|
113
|
+
options: {
|
|
114
|
+
placement: 'left'
|
|
115
|
+
},
|
|
116
|
+
children: children !== null && children !== void 0 ? children : item.basename
|
|
117
|
+
})]
|
|
118
|
+
})]
|
|
119
|
+
});
|
|
116
120
|
}
|
|
117
121
|
export default FileListItem;
|
|
118
122
|
//# sourceMappingURL=FileListItem.js.map
|
package/dist/FileListItem.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileListItem.js","names":["React","Tooltip","dhPython","vsCode","vsFolder","vsFolderOpened","FontAwesomeIcon","classNames","isDirectory","FileUtils","MIME_TYPE","getPathFromItem","getItemIcon","item","isExpanded","mimeType","getMimeType","basename","PYTHON","FileListItem","props","children","draggedItems","isDragInProgress","isDropTargetValid","isSelected","itemIndex","dropTargetItem","onDragStart","onDragOver","onDragEnd","onDrop","isDragged","some","draggedItem","id","itemPath","dropTargetPath","isExactDropTarget","isInDropTarget","isInvalidDropTarget","icon","depth","getDepth","filename","depthLines","Array","fill","map","value","index","e","placement"],"sources":["../src/FileListItem.tsx"],"sourcesContent":["import React from 'react';\nimport { Tooltip, RenderItemProps } from '@deephaven/components';\nimport { dhPython, vsCode, vsFolder, vsFolderOpened } from '@deephaven/icons';\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport classNames from 'classnames';\nimport { FileStorageItem, isDirectory } from './FileStorage';\nimport './FileList.scss';\nimport FileUtils, { MIME_TYPE } from './FileUtils';\nimport { getPathFromItem } from './FileListUtils';\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 */\nfunction 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\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 function FileListItem(props: FileListRenderItemProps): 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 placement: 'left',\n }}\n >\n {children ?? item.basename}\n </Tooltip>\n </span>\n </div>\n );\n}\n\nexport default FileListItem;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,OAAO,QAAyB,uBAAuB;AAChE,SAASC,QAAQ,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,cAAc,QAAQ,kBAAkB;AAE7E,SAASC,eAAe,QAAQ,gCAAgC;AAChE,OAAOC,UAAU,MAAM,YAAY;AAAC,SACVC,WAAW;AAAA;AAAA,OAE9BC,SAAS,IAAIC,SAAS;AAAA,SACpBC,eAAe;AAExB;AACA;AACA;AACA;AACA;
|
|
1
|
+
{"version":3,"file":"FileListItem.js","names":["React","Tooltip","dhPython","vsCode","vsFolder","vsFolderOpened","FontAwesomeIcon","classNames","isDirectory","FileUtils","MIME_TYPE","getPathFromItem","getItemIcon","item","isExpanded","mimeType","getMimeType","basename","PYTHON","FileListItem","props","children","draggedItems","isDragInProgress","isDropTargetValid","isSelected","itemIndex","dropTargetItem","onDragStart","onDragOver","onDragEnd","onDrop","isDragged","some","draggedItem","id","itemPath","dropTargetPath","isExactDropTarget","isInDropTarget","isInvalidDropTarget","icon","depth","getDepth","filename","depthLines","Array","fill","map","value","index","e","placement"],"sources":["../src/FileListItem.tsx"],"sourcesContent":["import React from 'react';\nimport { Tooltip, RenderItemProps } from '@deephaven/components';\nimport { dhPython, vsCode, vsFolder, vsFolderOpened } from '@deephaven/icons';\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport classNames from 'classnames';\nimport { FileStorageItem, isDirectory } from './FileStorage';\nimport './FileList.scss';\nimport FileUtils, { MIME_TYPE } from './FileUtils';\nimport { getPathFromItem } from './FileListUtils';\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 */\nfunction 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\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 function FileListItem(props: FileListRenderItemProps): 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 placement: 'left',\n }}\n >\n {children ?? item.basename}\n </Tooltip>\n </span>\n </div>\n );\n}\n\nexport default FileListItem;\n"],"mappings":"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"}
|
|
@@ -3,6 +3,8 @@ import classNames from 'classnames';
|
|
|
3
3
|
import Log from '@deephaven/log';
|
|
4
4
|
import { PromiseUtils } from '@deephaven/utils';
|
|
5
5
|
import "./FileListItemEditor.css";
|
|
6
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
7
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
6
8
|
var log = Log.module('FileListItemEditor');
|
|
7
9
|
var DEFAULT_VALIDATE = () => Promise.resolve();
|
|
8
10
|
export function FileListItemEditor(_ref) {
|
|
@@ -69,24 +71,26 @@ export function FileListItemEditor(_ref) {
|
|
|
69
71
|
default:
|
|
70
72
|
}
|
|
71
73
|
}, [onCancel, validateAndSubmit]);
|
|
72
|
-
return /*#__PURE__*/
|
|
73
|
-
className: "file-list-item-editor"
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
74
|
+
return /*#__PURE__*/_jsxs("div", {
|
|
75
|
+
className: "file-list-item-editor",
|
|
76
|
+
children: [/*#__PURE__*/_jsx("input", {
|
|
77
|
+
type: "text",
|
|
78
|
+
className: classNames('form-control file-list-item-editor-input', {
|
|
79
|
+
'is-invalid': validationError
|
|
80
|
+
}),
|
|
81
|
+
value: value,
|
|
82
|
+
ref: input,
|
|
83
|
+
onBlur: handleBlur,
|
|
84
|
+
onKeyDown: handleKeyDown,
|
|
85
|
+
onChange: handleChange,
|
|
86
|
+
onClick: stopPropagation,
|
|
87
|
+
onDoubleClick: stopPropagation,
|
|
88
|
+
onMouseDown: stopPropagation
|
|
89
|
+
}), validationError && /*#__PURE__*/_jsx("div", {
|
|
90
|
+
className: "invalid-feedback",
|
|
91
|
+
children: "".concat(validationError)
|
|
92
|
+
})]
|
|
93
|
+
});
|
|
90
94
|
}
|
|
91
95
|
export default FileListItemEditor;
|
|
92
96
|
//# sourceMappingURL=FileListItemEditor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileListItemEditor.js","names":["React","useCallback","useEffect","useRef","useState","classNames","Log","PromiseUtils","log","module","DEFAULT_VALIDATE","Promise","resolve","FileListItemEditor","item","onCancel","onSubmit","validate","input","value","setValue","basename","validationError","setValidationError","validationPromise","setValidationPromise","focus","current","stopPropagation","e","validateAndSubmit","then","catch","info","validateValueAndSetPromise","validatePromise","makeCancelable","undefined","isCanceled","cancel","selectRange","handleBlur","debug2","handleChange","newValue","target","handleKeyDown","key"],"sources":["../src/FileListItemEditor.tsx"],"sourcesContent":["import React, {\n ChangeEvent,\n KeyboardEvent,\n MouseEvent,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport { PromiseUtils } from '@deephaven/utils';\nimport './FileListItemEditor.scss';\nimport { FileStorageItem } from './FileStorage';\n\nconst log = Log.module('FileListItemEditor');\n\nexport interface FileListItemEditorProps {\n item: FileStorageItem;\n onCancel: () => void;\n onSubmit: (newName: string) => void;\n validate?: (newName: string) => Promise<void>;\n}\n\nconst DEFAULT_VALIDATE = () => Promise.resolve();\n\nexport function FileListItemEditor({\n item,\n onCancel,\n onSubmit,\n validate = DEFAULT_VALIDATE,\n}: FileListItemEditorProps): JSX.Element {\n const input = useRef<HTMLInputElement>(null);\n const [value, setValue] = useState(item.basename);\n const [validationError, setValidationError] = useState<Error>();\n const [validationPromise, setValidationPromise] = useState<Promise<void>>(\n Promise.resolve()\n );\n\n const focus = useCallback(() => {\n input.current?.focus();\n // Select the proper range based on the type...\n }, [input]);\n\n const stopPropagation = useCallback(\n (e: MouseEvent) => e.stopPropagation(),\n []\n );\n\n const validateAndSubmit = useCallback(() => {\n validationPromise\n .then(() => {\n onSubmit(value);\n })\n .catch(e => log.info('Unable to validate name', e));\n }, [onSubmit, value, validationPromise]);\n\n useEffect(\n function validateValueAndSetPromise() {\n const validatePromise = PromiseUtils.makeCancelable(validate(value));\n validatePromise\n .then(() => setValidationError(undefined))\n .catch(e => {\n if (!PromiseUtils.isCanceled(e)) {\n setValidationError(e);\n }\n });\n setValidationPromise(validatePromise);\n return () => validatePromise.cancel();\n },\n [validate, value]\n );\n\n useEffect(\n function selectRange() {\n focus();\n },\n [focus]\n );\n\n const handleBlur = useCallback(() => {\n log.debug2('handleBlur');\n validateAndSubmit();\n }, [validateAndSubmit]);\n\n const handleChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n const { value: newValue } = e.target;\n setValue(newValue);\n }, []);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n e.stopPropagation();\n\n const { key } = e;\n switch (key) {\n case 'Enter': {\n validateAndSubmit();\n break;\n }\n case 'Escape': {\n onCancel();\n break;\n }\n default:\n }\n },\n [onCancel, validateAndSubmit]\n );\n\n return (\n <div className=\"file-list-item-editor\">\n <input\n type=\"text\"\n className={classNames('form-control file-list-item-editor-input', {\n 'is-invalid': validationError,\n })}\n value={value}\n ref={input}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onChange={handleChange}\n onClick={stopPropagation}\n onDoubleClick={stopPropagation}\n onMouseDown={stopPropagation}\n />\n\n {validationError && (\n <div className=\"invalid-feedback\">{`${validationError}`}</div>\n )}\n </div>\n );\n}\n\nexport default FileListItemEditor;\n"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"FileListItemEditor.js","names":["React","useCallback","useEffect","useRef","useState","classNames","Log","PromiseUtils","log","module","DEFAULT_VALIDATE","Promise","resolve","FileListItemEditor","item","onCancel","onSubmit","validate","input","value","setValue","basename","validationError","setValidationError","validationPromise","setValidationPromise","focus","current","stopPropagation","e","validateAndSubmit","then","catch","info","validateValueAndSetPromise","validatePromise","makeCancelable","undefined","isCanceled","cancel","selectRange","handleBlur","debug2","handleChange","newValue","target","handleKeyDown","key"],"sources":["../src/FileListItemEditor.tsx"],"sourcesContent":["import React, {\n ChangeEvent,\n KeyboardEvent,\n MouseEvent,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport { PromiseUtils } from '@deephaven/utils';\nimport './FileListItemEditor.scss';\nimport { FileStorageItem } from './FileStorage';\n\nconst log = Log.module('FileListItemEditor');\n\nexport interface FileListItemEditorProps {\n item: FileStorageItem;\n onCancel: () => void;\n onSubmit: (newName: string) => void;\n validate?: (newName: string) => Promise<void>;\n}\n\nconst DEFAULT_VALIDATE = () => Promise.resolve();\n\nexport function FileListItemEditor({\n item,\n onCancel,\n onSubmit,\n validate = DEFAULT_VALIDATE,\n}: FileListItemEditorProps): JSX.Element {\n const input = useRef<HTMLInputElement>(null);\n const [value, setValue] = useState(item.basename);\n const [validationError, setValidationError] = useState<Error>();\n const [validationPromise, setValidationPromise] = useState<Promise<void>>(\n Promise.resolve()\n );\n\n const focus = useCallback(() => {\n input.current?.focus();\n // Select the proper range based on the type...\n }, [input]);\n\n const stopPropagation = useCallback(\n (e: MouseEvent) => e.stopPropagation(),\n []\n );\n\n const validateAndSubmit = useCallback(() => {\n validationPromise\n .then(() => {\n onSubmit(value);\n })\n .catch(e => log.info('Unable to validate name', e));\n }, [onSubmit, value, validationPromise]);\n\n useEffect(\n function validateValueAndSetPromise() {\n const validatePromise = PromiseUtils.makeCancelable(validate(value));\n validatePromise\n .then(() => setValidationError(undefined))\n .catch(e => {\n if (!PromiseUtils.isCanceled(e)) {\n setValidationError(e);\n }\n });\n setValidationPromise(validatePromise);\n return () => validatePromise.cancel();\n },\n [validate, value]\n );\n\n useEffect(\n function selectRange() {\n focus();\n },\n [focus]\n );\n\n const handleBlur = useCallback(() => {\n log.debug2('handleBlur');\n validateAndSubmit();\n }, [validateAndSubmit]);\n\n const handleChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n const { value: newValue } = e.target;\n setValue(newValue);\n }, []);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n e.stopPropagation();\n\n const { key } = e;\n switch (key) {\n case 'Enter': {\n validateAndSubmit();\n break;\n }\n case 'Escape': {\n onCancel();\n break;\n }\n default:\n }\n },\n [onCancel, validateAndSubmit]\n );\n\n return (\n <div className=\"file-list-item-editor\">\n <input\n type=\"text\"\n className={classNames('form-control file-list-item-editor-input', {\n 'is-invalid': validationError,\n })}\n value={value}\n ref={input}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onChange={handleChange}\n onClick={stopPropagation}\n onDoubleClick={stopPropagation}\n onMouseDown={stopPropagation}\n />\n\n {validationError && (\n <div className=\"invalid-feedback\">{`${validationError}`}</div>\n )}\n </div>\n );\n}\n\nexport default FileListItemEditor;\n"],"mappings":"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"}
|
package/dist/NewItemModal.js
CHANGED
|
@@ -16,6 +16,9 @@ import FileUtils from "./FileUtils.js";
|
|
|
16
16
|
import "./NewItemModal.css";
|
|
17
17
|
import FileExistsError from "./FileExistsError.js";
|
|
18
18
|
import FileNotFoundError from "./FileNotFoundError.js";
|
|
19
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
20
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
21
|
+
import { Fragment as _Fragment } from "react/jsx-runtime";
|
|
19
22
|
var log = Log.module('NewItemModal');
|
|
20
23
|
class NewItemModal extends PureComponent {
|
|
21
24
|
static getValidationMessage(err) {
|
|
@@ -341,19 +344,20 @@ class NewItemModal extends PureComponent {
|
|
|
341
344
|
directoryPath += "".concat(pathAsList[i], "/");
|
|
342
345
|
}
|
|
343
346
|
directoryPath += "".concat(basename, "/");
|
|
344
|
-
return /*#__PURE__*/
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
347
|
+
return /*#__PURE__*/_jsxs(React.Fragment, {
|
|
348
|
+
children: [/*#__PURE__*/_jsx(Button, {
|
|
349
|
+
kind: "ghost",
|
|
350
|
+
className: "directory-breadcrumbs",
|
|
351
|
+
onClick: () => this.handleBreadcrumbSelect(directoryPath),
|
|
352
|
+
"aria-label": index === 0 ? 'Home' : undefined,
|
|
353
|
+
icon: index === 0 ? /*#__PURE__*/_jsx(FontAwesomeIcon, {
|
|
354
|
+
icon: vsHome,
|
|
355
|
+
transform: "right-1.6"
|
|
356
|
+
}) : undefined,
|
|
357
|
+
tooltip: index === 0 ? 'Home' : undefined,
|
|
358
|
+
children: basename
|
|
359
|
+
}), "/"]
|
|
360
|
+
}, directoryPath);
|
|
357
361
|
});
|
|
358
362
|
}
|
|
359
363
|
render() {
|
|
@@ -380,68 +384,88 @@ class NewItemModal extends PureComponent {
|
|
|
380
384
|
var newExtensionText = FileUtils.fileExtensionToString(newExtension);
|
|
381
385
|
var submitBtnLabel = isDirectory ? 'Create' : 'Save';
|
|
382
386
|
var nameInputLabel = isDirectory ? 'New folder name' : 'Save file as';
|
|
383
|
-
return /*#__PURE__*/
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
387
|
+
return /*#__PURE__*/_jsxs(_Fragment, {
|
|
388
|
+
children: [/*#__PURE__*/_jsxs(Modal, {
|
|
389
|
+
isOpen: isOpen,
|
|
390
|
+
toggle: onCancel,
|
|
391
|
+
onOpened: this.handleModalOpened,
|
|
392
|
+
className: "modal-dialog-centered new-file-modal theme-bg-dark",
|
|
393
|
+
children: [/*#__PURE__*/_jsx(ModalHeader, {
|
|
394
|
+
toggle: onCancel,
|
|
395
|
+
children: title
|
|
396
|
+
}), /*#__PURE__*/_jsx(ModalBody, {
|
|
397
|
+
children: /*#__PURE__*/_jsx("form", {
|
|
398
|
+
children: /*#__PURE__*/_jsxs("div", {
|
|
399
|
+
className: "d-flex flex-column new-file-modal-content",
|
|
400
|
+
children: [/*#__PURE__*/_jsxs("div", {
|
|
401
|
+
className: "flex-grow-0 mb-4",
|
|
402
|
+
children: [/*#__PURE__*/_jsx("label", {
|
|
403
|
+
htmlFor: "file-name-input",
|
|
404
|
+
children: nameInputLabel
|
|
405
|
+
}), /*#__PURE__*/_jsx("input", {
|
|
406
|
+
id: "file-name-input",
|
|
407
|
+
type: "text",
|
|
408
|
+
autoComplete: "off",
|
|
409
|
+
autoCapitalize: "none",
|
|
410
|
+
autoCorrect: "off",
|
|
411
|
+
spellCheck: "false",
|
|
412
|
+
className: classNames('form-control', {
|
|
413
|
+
'is-invalid': validationError
|
|
414
|
+
}),
|
|
415
|
+
value: value,
|
|
416
|
+
placeholder: placeholder,
|
|
417
|
+
ref: this.inputRef,
|
|
418
|
+
onKeyDown: this.handleKeyDown,
|
|
419
|
+
onChange: this.handleChange
|
|
420
|
+
}), validationError && /*#__PURE__*/_jsx("div", {
|
|
421
|
+
className: "invalid-feedback",
|
|
422
|
+
children: NewItemModal.getValidationMessage(validationError)
|
|
423
|
+
})]
|
|
424
|
+
}), /*#__PURE__*/_jsxs("div", {
|
|
425
|
+
className: "flex-grow-0",
|
|
426
|
+
children: [/*#__PURE__*/_jsx("label", {
|
|
427
|
+
children: "Directory: /"
|
|
428
|
+
}), this.renderPathButtons(path)]
|
|
429
|
+
}), /*#__PURE__*/_jsx("div", {
|
|
430
|
+
className: "flex-grow-1 file-explorer-container",
|
|
431
|
+
children: /*#__PURE__*/_jsx(FileExplorer, {
|
|
432
|
+
onSelect: this.handleSelect,
|
|
433
|
+
storage: storage,
|
|
434
|
+
focusedPath: path
|
|
435
|
+
})
|
|
436
|
+
})]
|
|
437
|
+
})
|
|
438
|
+
})
|
|
439
|
+
}), /*#__PURE__*/_jsxs(ModalFooter, {
|
|
440
|
+
children: [/*#__PURE__*/_jsx(Button, {
|
|
441
|
+
kind: "secondary",
|
|
442
|
+
onClick: onCancel,
|
|
443
|
+
children: "Cancel"
|
|
444
|
+
}), /*#__PURE__*/_jsx(Button, {
|
|
445
|
+
kind: "primary",
|
|
446
|
+
disabled: isSubmitting,
|
|
447
|
+
onClick: this.handleModalSubmit,
|
|
448
|
+
children: submitBtnLabel
|
|
449
|
+
})]
|
|
450
|
+
})]
|
|
451
|
+
}), /*#__PURE__*/_jsx(BasicModal, {
|
|
452
|
+
isOpen: showOverwriteModal,
|
|
453
|
+
headerText: "Confirm overwrite",
|
|
454
|
+
bodyText: "File with this name already exists, are you sure you want to overwrite it?",
|
|
455
|
+
onCancel: this.handleOverwriteCancel,
|
|
456
|
+
onConfirm: this.handleOverwriteConfirm,
|
|
457
|
+
cancelButtonText: "Cancel",
|
|
458
|
+
confirmButtonText: "Overwrite"
|
|
459
|
+
}), /*#__PURE__*/_jsx(BasicModal, {
|
|
460
|
+
isOpen: showExtensionChangeModal,
|
|
461
|
+
headerText: "Confirm extension change",
|
|
462
|
+
bodyText: "Are you sure you want to change extension from \"".concat(prevExtensionText, "\" to \"").concat(newExtensionText, "\"?"),
|
|
463
|
+
onCancel: this.handleExtensionChangeCancel,
|
|
464
|
+
onConfirm: this.handleExtensionChangeConfirm,
|
|
465
|
+
cancelButtonText: "Keep \"".concat(prevExtensionText, "\""),
|
|
466
|
+
confirmButtonText: "Use \"".concat(newExtensionText, "\"")
|
|
467
|
+
})]
|
|
468
|
+
});
|
|
445
469
|
}
|
|
446
470
|
}
|
|
447
471
|
_defineProperty(NewItemModal, "propTypes", {
|
package/dist/NewItemModal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NewItemModal.js","names":["React","PureComponent","PropTypes","classNames","Modal","ModalBody","ModalFooter","ModalHeader","BasicModal","Button","Pending","PromiseUtils","ValidationError","Log","vsHome","FontAwesomeIcon","FileExplorer","FileUtils","FileExistsError","FileNotFoundError","log","module","NewItemModal","getValidationMessage","err","info","type","handleError","isCanceled","error","constructor","props","createRef","Map","handleModalSubmit","bind","handleModalOpened","handleSelect","handleChange","handleKeyDown","handleValidationError","handleOverwriteCancel","handleOverwriteConfirm","handleExtensionChangeCancel","handleExtensionChangeConfirm","handleBreadcrumbSelect","defaultValue","path","hasPath","getPath","state","isSubmitting","prevExtension","getExtension","showExtensionChangeModal","showOverwriteModal","value","getBaseName","componentDidUpdate","prevProps","prevState","isOpen","prevIsOpen","resetValue","isInitialLoad","updateValidationStatus","componentWillUnmount","pending","cancel","cancelableValidatePromise","cancelableExistingItemPromise","setState","validationError","undefined","getValidationPromise","name","checkExisting","makeCancelable","validateName","storage","existingFile","e","newName","then","catch","focusRenameInput","submitModal","event","target","item","debug","makePath","filename","basename","key","stopPropagation","preventDefault","onCancel","onSubmit","newValue","replaceExtension","input","inputRef","current","selectionEnd","length","lastIndexOf","focus","setSelectionRange","skipExtensionCheck","notifyOnExtensionChange","newExtension","newItemName","directoryPath","renderPathButtons","pathAsList","split","pop","map","index","i","render","placeholder","title","isDirectory","prevExtensionText","fileExtensionToString","newExtensionText","submitBtnLabel","nameInputLabel","bool","string","isRequired","oneOf","func","shape","isOverwrite"],"sources":["../src/NewItemModal.tsx"],"sourcesContent":["import React, { ChangeEvent, KeyboardEvent, PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport {\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader,\n BasicModal,\n Button,\n} from '@deephaven/components';\nimport {\n CancelablePromise,\n Pending,\n PromiseUtils,\n ValidationError,\n} from '@deephaven/utils';\nimport Log from '@deephaven/log';\nimport { vsHome } from '@deephaven/icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport FileExplorer from './FileExplorer';\nimport FileStorage, { FileStorageItem, FileType } from './FileStorage';\nimport FileUtils from './FileUtils';\n\nimport './NewItemModal.scss';\nimport FileExistsError from './FileExistsError';\nimport FileNotFoundError from './FileNotFoundError';\n\nconst log = Log.module('NewItemModal');\n\nexport type NewItemModalProps = typeof NewItemModal.defaultProps & {\n isOpen: boolean;\n title: string;\n defaultValue: string;\n type: FileType;\n onSubmit: (name: string, isOverwrite?: boolean) => 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, isOverwrite?: boolean): 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 =\n this.handleExtensionChangeCancel.bind(this);\n this.handleExtensionChangeConfirm =\n this.handleExtensionChangeConfirm.bind(this);\n this.handleBreadcrumbSelect = this.handleBreadcrumbSelect.bind(this);\n\n const { defaultValue } = props;\n\n const path = FileUtils.hasPath(defaultValue)\n ? FileUtils.getPath(defaultValue)\n : '/';\n\n this.state = {\n isSubmitting: false,\n path,\n prevExtension: FileUtils.getExtension(defaultValue),\n showExtensionChangeModal: false,\n showOverwriteModal: false,\n value: FileUtils.getBaseName(defaultValue),\n };\n }\n\n componentDidUpdate(\n prevProps: NewItemModalProps,\n prevState: NewItemModalState\n ): void {\n const { isOpen } = this.props;\n const { isOpen: prevIsOpen } = prevProps;\n const { value, path } = this.state;\n if (!prevIsOpen && isOpen) {\n this.resetValue();\n this.isInitialLoad = true;\n }\n\n if (prevIsOpen && isOpen) {\n if (\n !this.isInitialLoad &&\n (path !== prevState.path || value !== prevState.value)\n ) {\n this.updateValidationStatus(path, value);\n }\n this.isInitialLoad = false;\n }\n }\n\n componentWillUnmount(): void {\n this.pending.cancel();\n if (this.cancelableValidatePromise) {\n this.cancelableValidatePromise.cancel();\n }\n if (this.cancelableExistingItemPromise) {\n this.cancelableExistingItemPromise.cancel();\n }\n }\n\n private inputRef = React.createRef<HTMLInputElement>();\n\n private cancelableValidatePromise?: CancelablePromise<string>;\n\n private cancelableExistingItemPromise?: CancelablePromise<FileStorageItem | null>;\n\n private pending = new Pending();\n\n private pathMap = new Map();\n\n private isInitialLoad = true;\n\n resetValue(): void {\n const { defaultValue } = this.props as NewItemModalProps;\n const path = FileUtils.hasPath(defaultValue)\n ? FileUtils.getPath(defaultValue)\n : '/';\n this.setState({\n path,\n value: FileUtils.getBaseName(defaultValue),\n validationError: undefined,\n prevExtension: FileUtils.getExtension(defaultValue),\n isSubmitting: false,\n });\n }\n\n getValidationPromise(\n path: string,\n name: string,\n checkExisting = false\n ): CancelablePromise<string> {\n if (this.cancelableValidatePromise) {\n this.cancelableValidatePromise.cancel();\n }\n this.cancelableValidatePromise = PromiseUtils.makeCancelable(\n this.validateName(path, name, checkExisting)\n );\n return this.cancelableValidatePromise;\n }\n\n async validateName(\n path: string,\n name: string,\n checkExisting: boolean\n ): Promise<string> {\n FileUtils.validateName(name);\n\n const { defaultValue, storage } = this.props;\n if (checkExisting) {\n const value = `${path}${name}`;\n if (value !== defaultValue) {\n try {\n const existingFile = await storage.info(value);\n throw new FileExistsError(existingFile);\n } catch (e) {\n if (!(e instanceof FileNotFoundError)) {\n throw e;\n }\n // There is no existing file, ignore\n }\n }\n }\n\n return name;\n }\n\n updateValidationStatus(path: string, newName: string): void {\n this.getValidationPromise(path, newName)\n .then(() => {\n this.setState({ validationError: undefined });\n })\n .catch(this.handleValidationError)\n .catch(NewItemModal.handleError);\n }\n\n handleModalOpened(): void {\n this.focusRenameInput();\n }\n\n handleModalSubmit(): void {\n this.submitModal();\n }\n\n handleChange(event: ChangeEvent<HTMLInputElement>): void {\n const { value } = event.target;\n this.setState({ value });\n }\n\n handleSelect(item: FileStorageItem): void {\n log.debug('handleSelect', item);\n if (item.type === 'directory') {\n this.setState({ path: FileUtils.makePath(item.filename) });\n } else {\n // Use selected item name and folder and focus the input\n const value = item.basename;\n const path = FileUtils.getPath(item.filename);\n this.setState({ value, path }, () => {\n this.focusRenameInput();\n });\n }\n }\n\n // eslint-disable-next-line class-methods-use-this\n handleKeyDown(e: KeyboardEvent): void {\n const { key } = e;\n e.stopPropagation();\n\n switch (key) {\n case 'Enter': {\n // Prevent form submit event\n e.preventDefault();\n this.submitModal();\n break;\n }\n case 'Escape': {\n e.preventDefault();\n const { onCancel } = this.props;\n onCancel();\n break;\n }\n default:\n }\n }\n\n handleValidationError(err: Error): void {\n if (!(err instanceof ValidationError)) {\n throw err;\n }\n log.debug('Validation error', err);\n this.setState({ validationError: err });\n }\n\n handleOverwriteCancel(): void {\n this.setState({\n showOverwriteModal: false,\n isSubmitting: false,\n });\n }\n\n handleOverwriteConfirm(): void {\n this.setState({ showOverwriteModal: false });\n const { onSubmit } = this.props;\n const { path, value } = this.state;\n log.debug('handleOverwriteConfirm', path, value);\n\n onSubmit(`${path}${value}`, true);\n }\n\n handleExtensionChangeCancel(): void {\n log.debug('handleExtensionChangeCancel');\n this.setState(({ value, prevExtension }) => {\n const newValue = FileUtils.replaceExtension(value, prevExtension);\n return {\n showExtensionChangeModal: false,\n value: newValue,\n };\n });\n\n this.submitModal(true);\n }\n\n handleExtensionChangeConfirm(): void {\n log.debug('handleExtensionChangeConfirm');\n this.setState({ showExtensionChangeModal: false });\n this.submitModal(true);\n }\n\n /**\n * Focus rename input and select name part for files, select all text for folders\n */\n focusRenameInput(): void {\n const input = this.inputRef.current;\n if (input) {\n const { type } = this.props;\n const { value } = input;\n const selectionEnd =\n type === 'directory' ? value.length : value.lastIndexOf('.');\n input.focus();\n input.setSelectionRange(\n 0,\n selectionEnd > 0 ? selectionEnd : value.length\n );\n }\n }\n\n submitModal(skipExtensionCheck = false): void {\n this.setState(({ prevExtension, value, path }) => {\n const { notifyOnExtensionChange, type } = this.props;\n log.debug('submitModal', prevExtension, value);\n const newExtension = FileUtils.getExtension(value);\n if (\n notifyOnExtensionChange &&\n !skipExtensionCheck &&\n prevExtension !== null &&\n prevExtension !== newExtension\n ) {\n return {\n isSubmitting: false,\n showExtensionChangeModal: true,\n newExtension,\n };\n }\n\n this.getValidationPromise(path, value, true)\n .then((newItemName: string) => {\n const { onSubmit } = this.props;\n onSubmit(`${path}${value}`);\n })\n .catch(e => {\n // Don't allow using existing names for folders\n // For files, prompt if they want to overwrite existing file\n if (e instanceof FileExistsError) {\n if (type !== 'directory' && e.info.type !== 'directory') {\n this.setState({ showOverwriteModal: true });\n return;\n }\n }\n throw e;\n })\n .catch(e => {\n if (PromiseUtils.isCanceled(e)) {\n this.setState({ isSubmitting: false });\n }\n throw e;\n })\n .catch(this.handleValidationError)\n .catch(NewItemModal.handleError);\n\n return {\n isSubmitting: true,\n showExtensionChangeModal: false,\n newExtension: undefined,\n };\n });\n }\n\n handleBreadcrumbSelect(directoryPath: string): void {\n this.setState({ path: directoryPath });\n }\n\n renderPathButtons(path: string): React.ReactNode {\n const pathAsList = path.split('/');\n pathAsList.pop();\n return pathAsList.map((basename, index) => {\n let directoryPath = '';\n for (let i = 0; i < index; i += 1) {\n directoryPath += `${pathAsList[i]}/`;\n }\n directoryPath += `${basename}/`;\n\n return (\n <React.Fragment key={directoryPath}>\n <Button\n kind=\"ghost\"\n className=\"directory-breadcrumbs\"\n onClick={() => this.handleBreadcrumbSelect(directoryPath)}\n aria-label={index === 0 ? 'Home' : undefined}\n icon={\n index === 0 ? (\n <FontAwesomeIcon icon={vsHome} transform=\"right-1.6\" />\n ) : undefined\n }\n tooltip={index === 0 ? 'Home' : undefined}\n >\n {basename}\n </Button>\n /\n </React.Fragment>\n );\n });\n }\n\n render(): React.ReactNode {\n const { storage, isOpen, onCancel, placeholder, title, type } = this.props;\n const {\n isSubmitting,\n path,\n showExtensionChangeModal,\n showOverwriteModal,\n validationError,\n value,\n prevExtension,\n newExtension,\n } = this.state;\n\n const isDirectory = type === 'directory';\n const prevExtensionText = FileUtils.fileExtensionToString(prevExtension);\n const newExtensionText = FileUtils.fileExtensionToString(newExtension);\n const submitBtnLabel = isDirectory ? 'Create' : 'Save';\n const nameInputLabel = isDirectory ? 'New folder name' : 'Save file as';\n\n return (\n <>\n <Modal\n isOpen={isOpen}\n toggle={onCancel}\n onOpened={this.handleModalOpened}\n className=\"modal-dialog-centered new-file-modal theme-bg-dark\"\n >\n <ModalHeader toggle={onCancel}>{title}</ModalHeader>\n <ModalBody>\n <form>\n <div className=\"d-flex flex-column new-file-modal-content\">\n <div className=\"flex-grow-0 mb-4\">\n <label htmlFor=\"file-name-input\">{nameInputLabel}</label>\n <input\n id=\"file-name-input\"\n type=\"text\"\n autoComplete=\"off\"\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n spellCheck=\"false\"\n className={classNames('form-control', {\n 'is-invalid': validationError,\n })}\n value={value}\n placeholder={placeholder}\n ref={this.inputRef}\n onKeyDown={this.handleKeyDown}\n onChange={this.handleChange}\n />\n {validationError && (\n <div className=\"invalid-feedback\">\n {NewItemModal.getValidationMessage(validationError)}\n </div>\n )}\n </div>\n <div className=\"flex-grow-0\">\n <label>Directory: /</label>\n {this.renderPathButtons(path)}\n </div>\n <div className=\"flex-grow-1 file-explorer-container\">\n <FileExplorer\n onSelect={this.handleSelect}\n storage={storage}\n focusedPath={path}\n />\n </div>\n </div>\n </form>\n </ModalBody>\n\n <ModalFooter>\n <Button kind=\"secondary\" onClick={onCancel}>\n Cancel\n </Button>\n <Button\n kind=\"primary\"\n disabled={isSubmitting}\n onClick={this.handleModalSubmit}\n >\n {submitBtnLabel}\n </Button>\n </ModalFooter>\n </Modal>\n <BasicModal\n isOpen={showOverwriteModal}\n headerText=\"Confirm overwrite\"\n bodyText=\"File with this name already exists, are you sure you want to overwrite it?\"\n onCancel={this.handleOverwriteCancel}\n onConfirm={this.handleOverwriteConfirm}\n cancelButtonText=\"Cancel\"\n confirmButtonText=\"Overwrite\"\n />\n <BasicModal\n isOpen={showExtensionChangeModal}\n headerText=\"Confirm extension change\"\n bodyText={`Are you sure you want to change extension from \"${prevExtensionText}\" to \"${newExtensionText}\"?`}\n onCancel={this.handleExtensionChangeCancel}\n onConfirm={this.handleExtensionChangeConfirm}\n cancelButtonText={`Keep \"${prevExtensionText}\"`}\n confirmButtonText={`Use \"${newExtensionText}\"`}\n />\n </>\n );\n }\n}\n\nexport default NewItemModal;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"NewItemModal.js","names":["React","PureComponent","PropTypes","classNames","Modal","ModalBody","ModalFooter","ModalHeader","BasicModal","Button","Pending","PromiseUtils","ValidationError","Log","vsHome","FontAwesomeIcon","FileExplorer","FileUtils","FileExistsError","FileNotFoundError","log","module","NewItemModal","getValidationMessage","err","info","type","handleError","isCanceled","error","constructor","props","createRef","Map","handleModalSubmit","bind","handleModalOpened","handleSelect","handleChange","handleKeyDown","handleValidationError","handleOverwriteCancel","handleOverwriteConfirm","handleExtensionChangeCancel","handleExtensionChangeConfirm","handleBreadcrumbSelect","defaultValue","path","hasPath","getPath","state","isSubmitting","prevExtension","getExtension","showExtensionChangeModal","showOverwriteModal","value","getBaseName","componentDidUpdate","prevProps","prevState","isOpen","prevIsOpen","resetValue","isInitialLoad","updateValidationStatus","componentWillUnmount","pending","cancel","cancelableValidatePromise","cancelableExistingItemPromise","setState","validationError","undefined","getValidationPromise","name","checkExisting","makeCancelable","validateName","storage","existingFile","e","newName","then","catch","focusRenameInput","submitModal","event","target","item","debug","makePath","filename","basename","key","stopPropagation","preventDefault","onCancel","onSubmit","newValue","replaceExtension","input","inputRef","current","selectionEnd","length","lastIndexOf","focus","setSelectionRange","skipExtensionCheck","notifyOnExtensionChange","newExtension","newItemName","directoryPath","renderPathButtons","pathAsList","split","pop","map","index","i","render","placeholder","title","isDirectory","prevExtensionText","fileExtensionToString","newExtensionText","submitBtnLabel","nameInputLabel","bool","string","isRequired","oneOf","func","shape","isOverwrite"],"sources":["../src/NewItemModal.tsx"],"sourcesContent":["import React, { ChangeEvent, KeyboardEvent, PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport {\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader,\n BasicModal,\n Button,\n} from '@deephaven/components';\nimport {\n CancelablePromise,\n Pending,\n PromiseUtils,\n ValidationError,\n} from '@deephaven/utils';\nimport Log from '@deephaven/log';\nimport { vsHome } from '@deephaven/icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport FileExplorer from './FileExplorer';\nimport FileStorage, { FileStorageItem, FileType } from './FileStorage';\nimport FileUtils from './FileUtils';\n\nimport './NewItemModal.scss';\nimport FileExistsError from './FileExistsError';\nimport FileNotFoundError from './FileNotFoundError';\n\nconst log = Log.module('NewItemModal');\n\nexport type NewItemModalProps = typeof NewItemModal.defaultProps & {\n isOpen: boolean;\n title: string;\n defaultValue: string;\n type: FileType;\n onSubmit: (name: string, isOverwrite?: boolean) => 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, isOverwrite?: boolean): 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 =\n this.handleExtensionChangeCancel.bind(this);\n this.handleExtensionChangeConfirm =\n this.handleExtensionChangeConfirm.bind(this);\n this.handleBreadcrumbSelect = this.handleBreadcrumbSelect.bind(this);\n\n const { defaultValue } = props;\n\n const path = FileUtils.hasPath(defaultValue)\n ? FileUtils.getPath(defaultValue)\n : '/';\n\n this.state = {\n isSubmitting: false,\n path,\n prevExtension: FileUtils.getExtension(defaultValue),\n showExtensionChangeModal: false,\n showOverwriteModal: false,\n value: FileUtils.getBaseName(defaultValue),\n };\n }\n\n componentDidUpdate(\n prevProps: NewItemModalProps,\n prevState: NewItemModalState\n ): void {\n const { isOpen } = this.props;\n const { isOpen: prevIsOpen } = prevProps;\n const { value, path } = this.state;\n if (!prevIsOpen && isOpen) {\n this.resetValue();\n this.isInitialLoad = true;\n }\n\n if (prevIsOpen && isOpen) {\n if (\n !this.isInitialLoad &&\n (path !== prevState.path || value !== prevState.value)\n ) {\n this.updateValidationStatus(path, value);\n }\n this.isInitialLoad = false;\n }\n }\n\n componentWillUnmount(): void {\n this.pending.cancel();\n if (this.cancelableValidatePromise) {\n this.cancelableValidatePromise.cancel();\n }\n if (this.cancelableExistingItemPromise) {\n this.cancelableExistingItemPromise.cancel();\n }\n }\n\n private inputRef = React.createRef<HTMLInputElement>();\n\n private cancelableValidatePromise?: CancelablePromise<string>;\n\n private cancelableExistingItemPromise?: CancelablePromise<FileStorageItem | null>;\n\n private pending = new Pending();\n\n private pathMap = new Map();\n\n private isInitialLoad = true;\n\n resetValue(): void {\n const { defaultValue } = this.props as NewItemModalProps;\n const path = FileUtils.hasPath(defaultValue)\n ? FileUtils.getPath(defaultValue)\n : '/';\n this.setState({\n path,\n value: FileUtils.getBaseName(defaultValue),\n validationError: undefined,\n prevExtension: FileUtils.getExtension(defaultValue),\n isSubmitting: false,\n });\n }\n\n getValidationPromise(\n path: string,\n name: string,\n checkExisting = false\n ): CancelablePromise<string> {\n if (this.cancelableValidatePromise) {\n this.cancelableValidatePromise.cancel();\n }\n this.cancelableValidatePromise = PromiseUtils.makeCancelable(\n this.validateName(path, name, checkExisting)\n );\n return this.cancelableValidatePromise;\n }\n\n async validateName(\n path: string,\n name: string,\n checkExisting: boolean\n ): Promise<string> {\n FileUtils.validateName(name);\n\n const { defaultValue, storage } = this.props;\n if (checkExisting) {\n const value = `${path}${name}`;\n if (value !== defaultValue) {\n try {\n const existingFile = await storage.info(value);\n throw new FileExistsError(existingFile);\n } catch (e) {\n if (!(e instanceof FileNotFoundError)) {\n throw e;\n }\n // There is no existing file, ignore\n }\n }\n }\n\n return name;\n }\n\n updateValidationStatus(path: string, newName: string): void {\n this.getValidationPromise(path, newName)\n .then(() => {\n this.setState({ validationError: undefined });\n })\n .catch(this.handleValidationError)\n .catch(NewItemModal.handleError);\n }\n\n handleModalOpened(): void {\n this.focusRenameInput();\n }\n\n handleModalSubmit(): void {\n this.submitModal();\n }\n\n handleChange(event: ChangeEvent<HTMLInputElement>): void {\n const { value } = event.target;\n this.setState({ value });\n }\n\n handleSelect(item: FileStorageItem): void {\n log.debug('handleSelect', item);\n if (item.type === 'directory') {\n this.setState({ path: FileUtils.makePath(item.filename) });\n } else {\n // Use selected item name and folder and focus the input\n const value = item.basename;\n const path = FileUtils.getPath(item.filename);\n this.setState({ value, path }, () => {\n this.focusRenameInput();\n });\n }\n }\n\n // eslint-disable-next-line class-methods-use-this\n handleKeyDown(e: KeyboardEvent): void {\n const { key } = e;\n e.stopPropagation();\n\n switch (key) {\n case 'Enter': {\n // Prevent form submit event\n e.preventDefault();\n this.submitModal();\n break;\n }\n case 'Escape': {\n e.preventDefault();\n const { onCancel } = this.props;\n onCancel();\n break;\n }\n default:\n }\n }\n\n handleValidationError(err: Error): void {\n if (!(err instanceof ValidationError)) {\n throw err;\n }\n log.debug('Validation error', err);\n this.setState({ validationError: err });\n }\n\n handleOverwriteCancel(): void {\n this.setState({\n showOverwriteModal: false,\n isSubmitting: false,\n });\n }\n\n handleOverwriteConfirm(): void {\n this.setState({ showOverwriteModal: false });\n const { onSubmit } = this.props;\n const { path, value } = this.state;\n log.debug('handleOverwriteConfirm', path, value);\n\n onSubmit(`${path}${value}`, true);\n }\n\n handleExtensionChangeCancel(): void {\n log.debug('handleExtensionChangeCancel');\n this.setState(({ value, prevExtension }) => {\n const newValue = FileUtils.replaceExtension(value, prevExtension);\n return {\n showExtensionChangeModal: false,\n value: newValue,\n };\n });\n\n this.submitModal(true);\n }\n\n handleExtensionChangeConfirm(): void {\n log.debug('handleExtensionChangeConfirm');\n this.setState({ showExtensionChangeModal: false });\n this.submitModal(true);\n }\n\n /**\n * Focus rename input and select name part for files, select all text for folders\n */\n focusRenameInput(): void {\n const input = this.inputRef.current;\n if (input) {\n const { type } = this.props;\n const { value } = input;\n const selectionEnd =\n type === 'directory' ? value.length : value.lastIndexOf('.');\n input.focus();\n input.setSelectionRange(\n 0,\n selectionEnd > 0 ? selectionEnd : value.length\n );\n }\n }\n\n submitModal(skipExtensionCheck = false): void {\n this.setState(({ prevExtension, value, path }) => {\n const { notifyOnExtensionChange, type } = this.props;\n log.debug('submitModal', prevExtension, value);\n const newExtension = FileUtils.getExtension(value);\n if (\n notifyOnExtensionChange &&\n !skipExtensionCheck &&\n prevExtension !== null &&\n prevExtension !== newExtension\n ) {\n return {\n isSubmitting: false,\n showExtensionChangeModal: true,\n newExtension,\n };\n }\n\n this.getValidationPromise(path, value, true)\n .then((newItemName: string) => {\n const { onSubmit } = this.props;\n onSubmit(`${path}${value}`);\n })\n .catch(e => {\n // Don't allow using existing names for folders\n // For files, prompt if they want to overwrite existing file\n if (e instanceof FileExistsError) {\n if (type !== 'directory' && e.info.type !== 'directory') {\n this.setState({ showOverwriteModal: true });\n return;\n }\n }\n throw e;\n })\n .catch(e => {\n if (PromiseUtils.isCanceled(e)) {\n this.setState({ isSubmitting: false });\n }\n throw e;\n })\n .catch(this.handleValidationError)\n .catch(NewItemModal.handleError);\n\n return {\n isSubmitting: true,\n showExtensionChangeModal: false,\n newExtension: undefined,\n };\n });\n }\n\n handleBreadcrumbSelect(directoryPath: string): void {\n this.setState({ path: directoryPath });\n }\n\n renderPathButtons(path: string): React.ReactNode {\n const pathAsList = path.split('/');\n pathAsList.pop();\n return pathAsList.map((basename, index) => {\n let directoryPath = '';\n for (let i = 0; i < index; i += 1) {\n directoryPath += `${pathAsList[i]}/`;\n }\n directoryPath += `${basename}/`;\n\n return (\n <React.Fragment key={directoryPath}>\n <Button\n kind=\"ghost\"\n className=\"directory-breadcrumbs\"\n onClick={() => this.handleBreadcrumbSelect(directoryPath)}\n aria-label={index === 0 ? 'Home' : undefined}\n icon={\n index === 0 ? (\n <FontAwesomeIcon icon={vsHome} transform=\"right-1.6\" />\n ) : undefined\n }\n tooltip={index === 0 ? 'Home' : undefined}\n >\n {basename}\n </Button>\n /\n </React.Fragment>\n );\n });\n }\n\n render(): React.ReactNode {\n const { storage, isOpen, onCancel, placeholder, title, type } = this.props;\n const {\n isSubmitting,\n path,\n showExtensionChangeModal,\n showOverwriteModal,\n validationError,\n value,\n prevExtension,\n newExtension,\n } = this.state;\n\n const isDirectory = type === 'directory';\n const prevExtensionText = FileUtils.fileExtensionToString(prevExtension);\n const newExtensionText = FileUtils.fileExtensionToString(newExtension);\n const submitBtnLabel = isDirectory ? 'Create' : 'Save';\n const nameInputLabel = isDirectory ? 'New folder name' : 'Save file as';\n\n return (\n <>\n <Modal\n isOpen={isOpen}\n toggle={onCancel}\n onOpened={this.handleModalOpened}\n className=\"modal-dialog-centered new-file-modal theme-bg-dark\"\n >\n <ModalHeader toggle={onCancel}>{title}</ModalHeader>\n <ModalBody>\n <form>\n <div className=\"d-flex flex-column new-file-modal-content\">\n <div className=\"flex-grow-0 mb-4\">\n <label htmlFor=\"file-name-input\">{nameInputLabel}</label>\n <input\n id=\"file-name-input\"\n type=\"text\"\n autoComplete=\"off\"\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n spellCheck=\"false\"\n className={classNames('form-control', {\n 'is-invalid': validationError,\n })}\n value={value}\n placeholder={placeholder}\n ref={this.inputRef}\n onKeyDown={this.handleKeyDown}\n onChange={this.handleChange}\n />\n {validationError && (\n <div className=\"invalid-feedback\">\n {NewItemModal.getValidationMessage(validationError)}\n </div>\n )}\n </div>\n <div className=\"flex-grow-0\">\n <label>Directory: /</label>\n {this.renderPathButtons(path)}\n </div>\n <div className=\"flex-grow-1 file-explorer-container\">\n <FileExplorer\n onSelect={this.handleSelect}\n storage={storage}\n focusedPath={path}\n />\n </div>\n </div>\n </form>\n </ModalBody>\n\n <ModalFooter>\n <Button kind=\"secondary\" onClick={onCancel}>\n Cancel\n </Button>\n <Button\n kind=\"primary\"\n disabled={isSubmitting}\n onClick={this.handleModalSubmit}\n >\n {submitBtnLabel}\n </Button>\n </ModalFooter>\n </Modal>\n <BasicModal\n isOpen={showOverwriteModal}\n headerText=\"Confirm overwrite\"\n bodyText=\"File with this name already exists, are you sure you want to overwrite it?\"\n onCancel={this.handleOverwriteCancel}\n onConfirm={this.handleOverwriteConfirm}\n cancelButtonText=\"Cancel\"\n confirmButtonText=\"Overwrite\"\n />\n <BasicModal\n isOpen={showExtensionChangeModal}\n headerText=\"Confirm extension change\"\n bodyText={`Are you sure you want to change extension from \"${prevExtensionText}\" to \"${newExtensionText}\"?`}\n onCancel={this.handleExtensionChangeCancel}\n onConfirm={this.handleExtensionChangeConfirm}\n cancelButtonText={`Keep \"${prevExtensionText}\"`}\n confirmButtonText={`Use \"${newExtensionText}\"`}\n />\n </>\n );\n }\n}\n\nexport default NewItemModal;\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deephaven/file-explorer",
|
|
3
|
-
"version": "0.46.1-beta.
|
|
3
|
+
"version": "0.46.1-beta.4+6ff27a67",
|
|
4
4
|
"description": "Deephaven File Explorer React component",
|
|
5
5
|
"author": "Deephaven Data Labs LLC",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -22,11 +22,11 @@
|
|
|
22
22
|
"build:sass": "sass --embed-sources --load-path=../../node_modules ./src:./dist"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@deephaven/components": "^0.46.1-beta.
|
|
26
|
-
"@deephaven/icons": "^0.46.1-beta.
|
|
27
|
-
"@deephaven/log": "^0.46.1-beta.
|
|
28
|
-
"@deephaven/storage": "^0.46.1-beta.
|
|
29
|
-
"@deephaven/utils": "^0.46.1-beta.
|
|
25
|
+
"@deephaven/components": "^0.46.1-beta.4+6ff27a67",
|
|
26
|
+
"@deephaven/icons": "^0.46.1-beta.4+6ff27a67",
|
|
27
|
+
"@deephaven/log": "^0.46.1-beta.4+6ff27a67",
|
|
28
|
+
"@deephaven/storage": "^0.46.1-beta.4+6ff27a67",
|
|
29
|
+
"@deephaven/utils": "^0.46.1-beta.4+6ff27a67",
|
|
30
30
|
"@fortawesome/fontawesome-svg-core": "^6.2.1",
|
|
31
31
|
"@fortawesome/react-fontawesome": "^0.2.0",
|
|
32
32
|
"classnames": "^2.3.1",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"react": "^17.0.0"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
|
-
"@deephaven/mocks": "^0.46.1-beta.
|
|
40
|
+
"@deephaven/mocks": "^0.46.1-beta.4+6ff27a67"
|
|
41
41
|
},
|
|
42
42
|
"files": [
|
|
43
43
|
"dist"
|
|
@@ -48,5 +48,5 @@
|
|
|
48
48
|
"publishConfig": {
|
|
49
49
|
"access": "public"
|
|
50
50
|
},
|
|
51
|
-
"gitHead": "
|
|
51
|
+
"gitHead": "6ff27a67fded2d6a7affe5ec8480faf01ff1af00"
|
|
52
52
|
}
|