@deephaven/file-explorer 0.32.1-demo.2 → 0.32.1-table-plugins.9
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 +1 -1
- package/dist/FileExplorer.js.map +1 -1
- package/dist/FileList.d.ts +1 -30
- package/dist/FileList.d.ts.map +1 -1
- package/dist/FileList.js +7 -146
- package/dist/FileList.js.map +1 -1
- package/dist/FileListContainer.d.ts.map +1 -1
- package/dist/FileListContainer.js +11 -11
- package/dist/FileListContainer.js.map +1 -1
- package/dist/FileListItem.d.ts +18 -0
- package/dist/FileListItem.d.ts.map +1 -0
- package/dist/FileListItem.js +118 -0
- package/dist/FileListItem.js.map +1 -0
- package/dist/FileListUtils.d.ts +11 -0
- package/dist/FileListUtils.d.ts.map +1 -0
- package/dist/FileListUtils.js +34 -0
- package/dist/FileListUtils.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +9 -9
package/dist/FileExplorer.js
CHANGED
|
@@ -4,7 +4,7 @@ import { BasicModal } from '@deephaven/components';
|
|
|
4
4
|
import Log from '@deephaven/log';
|
|
5
5
|
import { PromiseUtils } from '@deephaven/utils';
|
|
6
6
|
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
|
7
|
-
import { DEFAULT_ROW_HEIGHT } from "./
|
|
7
|
+
import { DEFAULT_ROW_HEIGHT } from "./FileListUtils.js";
|
|
8
8
|
import { isDirectory } from "./FileStorage.js";
|
|
9
9
|
import "./FileExplorer.css";
|
|
10
10
|
import FileListContainer from "./FileListContainer.js";
|
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 './FileList';\nimport FileStorage, {\n FileStorageItem,\n FileStorageTable,\n isDirectory,\n} from './FileStorage';\nimport './FileExplorer.scss';\nimport FileListContainer from './FileListContainer';\nimport FileUtils from './FileUtils';\nimport FileExistsError from './FileExistsError';\nimport FileNotFoundError from './FileNotFoundError';\n\nconst log = Log.module('FileExplorer');\n\nexport interface FileExplorerProps {\n storage: FileStorage;\n\n isMultiSelect?: boolean;\n 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":";;AAAA,SAASA,UAAU,QAAQ,uBAAuB;AAClD,OAAOC,GAAG,MAAM,gBAAgB;AAChC,SAA4BC,YAAY,QAAQ,kBAAkB;AAClE,OAAOC,KAAK,IAAIC,WAAW,EAAEC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AAAC,SAChEC,kBAAkB;AAAA,SAIzBC,WAAW;AAAA;AAAA,OAGNC,iBAAiB;AAAA,OACjBC,SAAS;AAAA,OACTC,eAAe;AAAA,OACfC,iBAAiB;AAExB,IAAMC,GAAG,GAAGb,GAAG,CAACc,MAAM,CAAC,cAAc,CAAC;AAiBtC;AACA;AACA;AACA,OAAO,SAASC,YAAY,CAACC,KAAwB,EAAe;EAClE,IAAM;IACJC,OAAO;IACPC,aAAa,GAAG,KAAK;IACrBC,WAAW;IACXC,QAAQ,GAAG,MAAMC,SAAS;IAC1BC,QAAQ,GAAG,MAAMD,SAAS;IAC1BE,QAAQ;IACRC,iBAAiB;IACjBC,SAAS,GAAGlB;EACd,CAAC,GAAGS,KAAK;EACT,IAAM,CAACU,aAAa,EAAEC,gBAAgB,CAAC,GAAGrB,QAAQ,CAAoB,EAAE,CAAC;EACzE,IAAM,CAACsB,KAAK,EAAEC,QAAQ,CAAC,GAAGvB,QAAQ,EAAoB;EAEtDF,SAAS,CACP,SAAS0B,eAAe,GAAG;IACzB,IAAIC,YAAiD;IAAC,SACvCC,SAAS;MAAA;IAAA;IAAA;MAAA,+BAAxB,aAA2B;QACzBnB,GAAG,CAACoB,KAAK,CAAC,WAAW,CAAC;QAEtBF,YAAY,GAAG9B,YAAY,CAACiC,cAAc,CAACjB,OAAO,CAACkB,QAAQ,EAAE,EAAEC,CAAC,IAC9DA,CAAC,CAACC,KAAK,EAAE,CACV;QAED,IAAI;UACFR,QAAQ,OAAOE,YAAY,CAAC;QAC9B,CAAC,CAAC,OAAOO,CAAC,EAAE;UACV,IAAI,CAACrC,YAAY,CAACsC,UAAU,CAACD,CAAC,CAAC,EAAE;YAC/BzB,GAAG,CAAC2B,KAAK,CAAC,4BAA4B,EAAEF,CAAC,CAAC;UAC5C;QACF;MACF,CAAC;MAAA;IAAA;IACDN,SAAS,EAAE;IACX,OAAO,MAAM;MACXD,YAAY,CAACU,MAAM,EAAE;IACvB,CAAC;EACH,CAAC,EACD,CAACxB,OAAO,CAAC,CACV;EAED,IAAMyB,WAAW,GAAGvC,WAAW,CAAEmC,CAAQ,IAAK;IAC5C,IAAI,CAACrC,YAAY,CAACsC,UAAU,CAACD,CAAC,CAAC,EAAE;MAC/BzB,GAAG,CAAC2B,KAAK,CAACF,CAAC,CAAC;IACd;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMK,YAAY,GAAGxC,WAAW,CAAEyC,KAAwB,IAAK;IAC7D/B,GAAG,CAACoB,KAAK,CAAC,oCAAoC,EAAEW,KAAK,CAAC;IACtDjB,gBAAgB,CAACiB,KAAK,CAAC;EACzB,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMC,mBAAmB,GAAG1C,WAAW,CAAC,MAAM;IAC5CU,GAAG,CAACoB,KAAK,CAAC,qBAAqB,EAAEP,aAAa,CAAC;IAC/CA,aAAa,CAACoB,OAAO,CAACC,IAAI,IACxB9B,OAAO,CAAC+B,UAAU,CAChBxC,WAAW,CAACuC,IAAI,CAAC,GAAGrC,SAAS,CAACuC,QAAQ,CAACF,IAAI,CAACG,QAAQ,CAAC,GAAGH,IAAI,CAACG,QAAQ,CACtE,CACF;IACD9B,QAAQ,CAACM,aAAa,CAAC;IACvBC,gBAAgB,CAAC,EAAE,CAAC;EACtB,CAAC,EAAE,CAACD,aAAa,EAAEN,QAAQ,EAAEH,OAAO,CAAC,CAAC;EAEtC,IAAMkC,kBAAkB,GAAGhD,WAAW,CAAC,MAAM;IAC3CU,GAAG,CAACoB,KAAK,CAAC,oBAAoB,CAAC;IAC/BN,gBAAgB,CAAC,EAAE,CAAC;EACtB,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMyB,UAAU,GAAGjD,WAAW,CAC5B,CAACyC,KAAwB,EAAES,IAAY,KAAK;IAC1C,IAAMC,WAAW,GAAG5C,SAAS,CAAC6C,WAAW,CACvCX,KAAK,CAACY,GAAG,CAACT,IAAI,IACZvC,WAAW,CAACuC,IAAI,CAAC,GAAGrC,SAAS,CAACuC,QAAQ,CAACF,IAAI,CAACG,QAAQ,CAAC,GAAGH,IAAI,CAACG,QAAQ,CACtE,CACF;IAEDI,WAAW,CAACR,OAAO,CAACC,IAAI,IAAI;MAC1B,IAAMU,OAAO,GAAG/C,SAAS,CAACgD,MAAM,CAACX,IAAI,CAAC,aAC/BM,IAAI,SAAG3C,SAAS,CAACiD,WAAW,CAC7BZ,IAAI,CAACa,SAAS,CAAC,CAAC,EAAEb,IAAI,CAACc,MAAM,GAAG,CAAC,CAAC,CACnC,mBACER,IAAI,SAAG3C,SAAS,CAACiD,WAAW,CAACZ,IAAI,CAAC,CAAE;MAC3C9B,OAAO,CACJ6C,QAAQ,CAACf,IAAI,EAAEU,OAAO,CAAC,CACvBM,IAAI,CAAC,MAAM;QACV;QACA;QACAzC,QAAQ,CAACyB,IAAI,EAAEU,OAAO,CAAC;MACzB,CAAC,CAAC,CACDO,KAAK,CAACtB,WAAW,CAAC;IACvB,CAAC,CAAC;EACJ,CAAC,EACD,CAACA,WAAW,EAAEpB,QAAQ,EAAEL,OAAO,CAAC,CACjC;EAED,IAAMgD,YAAY,GAAG9D,WAAW,CAC9B,CAAC+D,IAAqB,EAAEC,OAAe,KAAK;IAC1C,IAAIC,IAAI,GAAGF,IAAI,CAAChB,QAAQ;IACxB,IAAMmB,KAAK,GAAG7D,WAAW,CAAC0D,IAAI,CAAC;IAC/B,IAAIG,KAAK,IAAI,CAACD,IAAI,CAACE,QAAQ,CAAC,GAAG,CAAC,EAAE;MAChCF,IAAI,aAAMA,IAAI,MAAG;IACnB;IACA,IAAIG,WAAW,aAAM7D,SAAS,CAAC8D,SAAS,CAACJ,IAAI,CAAC,SAAGD,OAAO,CAAE;IAC1D,IAAIE,KAAK,IAAI,CAACE,WAAW,CAACD,QAAQ,CAAC,GAAG,CAAC,EAAE;MACvCC,WAAW,aAAMA,WAAW,MAAG;IACjC;IACA1D,GAAG,CAAC4D,MAAM,CAAC,cAAc,EAAEL,IAAI,EAAEG,WAAW,CAAC;IAC7CtD,OAAO,CAAC6C,QAAQ,CAACM,IAAI,EAAEG,WAAW,CAAC,CAACP,KAAK,CAACtB,WAAW,CAAC;IACtDpB,QAAQ,CAAC8C,IAAI,EAAEG,WAAW,CAAC;EAC7B,CAAC,EACD,CAAC7B,WAAW,EAAEpB,QAAQ,EAAEL,OAAO,CAAC,CACjC;EAED,IAAMyD,oBAAoB,GAAGvE,WAAW;IAAA,6BACtC,WAAOwE,UAA2B,EAAER,OAAe,EAAoB;MACrE,IAAIA,OAAO,KAAKQ,UAAU,CAACC,QAAQ,EAAE;QACnC;QACA,OAAOvD,SAAS;MAClB;MACAX,SAAS,CAACmE,YAAY,CAACV,OAAO,CAAC;MAE/B,IAAMW,QAAQ,aAAMpE,SAAS,CAACqE,OAAO,CAACJ,UAAU,CAACzB,QAAQ,CAAC,SAAGiB,OAAO,CAAE;MACtE,IAAI;QACF,IAAMa,QAAQ,SAAS/D,OAAO,CAACgE,IAAI,CAACH,QAAQ,CAAC;QAC7C,MAAM,IAAInE,eAAe,CAACqE,QAAQ,CAAC;MACrC,CAAC,CAAC,OAAO1C,CAAC,EAAE;QACV,IAAI,EAAEA,CAAC,YAAY1B,iBAAiB,CAAC,EAAE;UACrC,MAAM0B,CAAC;QACT;QACA;MACF;IACF,CAAC;IAAA;MAAA;IAAA;EAAA,KACD,CAACrB,OAAO,CAAC,CACV;EAED,IAAMiE,yBAAyB,GAAGxD,aAAa,CAACmC,MAAM,GAAG,CAAC;EAC1D,IAAMsB,yBAAyB,GAAG9E,OAAO,CAAC,MAAM;IAC9C,IAAIqB,aAAa,CAACmC,MAAM,KAAK,CAAC,EAAE;MAC9B,mDAA2CnC,aAAa,CAAC,CAAC,CAAC,CAACwB,QAAQ;IACtE;IACA;EACF,CAAC,EAAE,CAACxB,aAAa,CAAC,CAAC;EAEnB,oBACE;IAAK,SAAS,EAAC;EAAe,GAC3BE,KAAK,iBACJ,oBAAC,iBAAiB;IAChB,aAAa,EAAEV,aAAc;IAC7B,WAAW,EAAEC,WAAY;IACzB,eAAe;IACf,MAAM,EAAEiC,UAAW;IACnB,QAAQ,EAAET,YAAa;IACvB,QAAQ,EAAEsB,YAAa;IACvB,QAAQ,EAAE1C,QAAS;IACnB,iBAAiB,EAAEC,iBAAkB;IACrC,SAAS,EAAEC,SAAU;IACrB,KAAK,EAAEG,KAAM;IACb,cAAc,EAAE8C;EAAqB,EAExC,eACD,oBAAC,UAAU;IACT,MAAM,EAAEQ,yBAA0B;IAClC,UAAU,EAAEC,yBAA0B;IACtC,QAAQ,EAAC,8BAA8B;IACvC,QAAQ,EAAEhC,kBAAmB;IAC7B,SAAS,EAAEN,mBAAoB;IAC/B,iBAAiB,EAAC;EAAQ,EAC1B,CACE;AAEV;AAEA9B,YAAY,CAACqE,WAAW,GAAG,cAAc;AAEzC,eAAerE,YAAY"}
|
|
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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"}
|
package/dist/FileList.d.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { RenderItemProps } from '@deephaven/components';
|
|
2
|
-
import { IconDefinition } from '@fortawesome/fontawesome-svg-core';
|
|
3
1
|
import React from 'react';
|
|
4
2
|
import { FileStorageItem, FileStorageTable } from './FileStorage';
|
|
5
3
|
import './FileList.scss';
|
|
4
|
+
import { FileListRenderItemProps } from './FileListItem';
|
|
6
5
|
export type LoadedViewport = {
|
|
7
6
|
items: FileStorageItem[];
|
|
8
7
|
offset: number;
|
|
@@ -12,17 +11,6 @@ export type ListViewport = {
|
|
|
12
11
|
top: number;
|
|
13
12
|
bottom: number;
|
|
14
13
|
};
|
|
15
|
-
export type FileListRenderItemProps = RenderItemProps<FileStorageItem> & {
|
|
16
|
-
children?: JSX.Element;
|
|
17
|
-
dropTargetItem?: FileStorageItem;
|
|
18
|
-
draggedItems?: FileStorageItem[];
|
|
19
|
-
isDragInProgress: boolean;
|
|
20
|
-
isDropTargetValid: boolean;
|
|
21
|
-
onDragStart(index: number, e: React.DragEvent<HTMLDivElement>): void;
|
|
22
|
-
onDragOver(index: number, e: React.DragEvent<HTMLDivElement>): void;
|
|
23
|
-
onDragEnd(index: number, e: React.DragEvent<HTMLDivElement>): void;
|
|
24
|
-
onDrop(index: number, e: React.DragEvent<HTMLDivElement>): void;
|
|
25
|
-
};
|
|
26
14
|
export interface FileListProps {
|
|
27
15
|
table: FileStorageTable;
|
|
28
16
|
isMultiSelect?: boolean;
|
|
@@ -36,23 +24,6 @@ export interface FileListProps {
|
|
|
36
24
|
rowHeight?: number;
|
|
37
25
|
overscanCount?: number;
|
|
38
26
|
}
|
|
39
|
-
export declare const getPathFromItem: (file: FileStorageItem) => string;
|
|
40
|
-
export declare const DEFAULT_ROW_HEIGHT = 26;
|
|
41
|
-
export declare const DRAG_HOVER_TIMEOUT = 500;
|
|
42
|
-
export declare const renderFileListItem: (props: FileListRenderItemProps) => JSX.Element;
|
|
43
|
-
/**
|
|
44
|
-
* Get the icon definition for a file or folder item
|
|
45
|
-
* @param item Item to get the icon for
|
|
46
|
-
* @returns Icon definition to pass in the FontAwesomeIcon icon prop
|
|
47
|
-
*/
|
|
48
|
-
export declare function getItemIcon(item: FileStorageItem): IconDefinition;
|
|
49
|
-
/**
|
|
50
|
-
* Get the move operation for the current selection and the given target. Throws if the operation is invalid.
|
|
51
|
-
*/
|
|
52
|
-
export declare function getMoveOperation(draggedItems: FileStorageItem[], targetItem: FileStorageItem): {
|
|
53
|
-
files: FileStorageItem[];
|
|
54
|
-
targetPath: string;
|
|
55
|
-
};
|
|
56
27
|
/**
|
|
57
28
|
* Component that displays and allows interaction with the file system in the provided FileStorageTable.
|
|
58
29
|
*/
|
package/dist/FileList.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileList.d.ts","sourceRoot":"","sources":["../src/FileList.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FileList.d.ts","sourceRoot":"","sources":["../src/FileList.tsx"],"names":[],"mappings":"AAIA,OAAO,KAMN,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAe,MAAM,eAAe,CAAC;AAC/E,OAAO,iBAAiB,CAAC;AAEzB,OAAO,EAAgB,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAIvE,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,gBAAgB,CAAC;IAExB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,aAAa,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;IACxD,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,cAAc,KAAK,IAAI,CAAC;IACvE,iBAAiB,CAAC,EAAE,CAAC,aAAa,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;IAE/D,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,GAAG,CAAC,OAAO,CAAC;IAE7D,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAOD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,GAAG,CAAC,OAAO,CAsY1D;AAED,eAAe,QAAQ,CAAC"}
|
package/dist/FileList.js
CHANGED
|
@@ -3,158 +3,19 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
|
|
|
3
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
4
|
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
5
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); }
|
|
6
|
-
import { ItemList
|
|
7
|
-
import { dhPython, vsCode, vsFolder, vsFolderOpened } from '@deephaven/icons';
|
|
6
|
+
import { ItemList } from '@deephaven/components';
|
|
8
7
|
import Log from '@deephaven/log';
|
|
9
8
|
import { RangeUtils } from '@deephaven/utils';
|
|
10
|
-
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
11
9
|
import classNames from 'classnames';
|
|
12
10
|
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
13
11
|
import { isDirectory } from "./FileStorage.js";
|
|
14
12
|
import "./FileList.css";
|
|
15
|
-
import
|
|
13
|
+
import { DEFAULT_ROW_HEIGHT, getMoveOperation } from "./FileListUtils.js";
|
|
14
|
+
import { FileListItem } from "./FileListItem.js";
|
|
16
15
|
var log = Log.module('FileList');
|
|
17
|
-
export var getPathFromItem = file => isDirectory(file) ? FileUtils.makePath(file.filename) : FileUtils.getPath(file.filename);
|
|
18
|
-
export var DEFAULT_ROW_HEIGHT = 26;
|
|
19
|
-
|
|
20
16
|
// How long you need to hover over a directory before it expands
|
|
21
|
-
|
|
17
|
+
var DRAG_HOVER_TIMEOUT = 500;
|
|
22
18
|
var ITEM_LIST_CLASS_NAME = 'item-list-scroll-pane';
|
|
23
|
-
export var renderFileListItem = props => {
|
|
24
|
-
var _draggedItems$some;
|
|
25
|
-
var {
|
|
26
|
-
children,
|
|
27
|
-
draggedItems,
|
|
28
|
-
isDragInProgress,
|
|
29
|
-
isDropTargetValid,
|
|
30
|
-
isSelected,
|
|
31
|
-
item,
|
|
32
|
-
itemIndex,
|
|
33
|
-
dropTargetItem,
|
|
34
|
-
onDragStart,
|
|
35
|
-
onDragOver,
|
|
36
|
-
onDragEnd,
|
|
37
|
-
onDrop
|
|
38
|
-
} = props;
|
|
39
|
-
var isDragged = (_draggedItems$some = draggedItems === null || draggedItems === void 0 ? void 0 : draggedItems.some(draggedItem => draggedItem.id === item.id)) !== null && _draggedItems$some !== void 0 ? _draggedItems$some : false;
|
|
40
|
-
var itemPath = getPathFromItem(item);
|
|
41
|
-
var dropTargetPath = isDragInProgress && dropTargetItem ? getPathFromItem(dropTargetItem) : null;
|
|
42
|
-
var isExactDropTarget = isDragInProgress && isDropTargetValid && isDirectory(item) && dropTargetPath === itemPath;
|
|
43
|
-
var isInDropTarget = isDragInProgress && isDropTargetValid && dropTargetPath === itemPath;
|
|
44
|
-
var isInvalidDropTarget = isDragInProgress && !isDropTargetValid && dropTargetPath === itemPath;
|
|
45
|
-
var icon = getItemIcon(item);
|
|
46
|
-
var depth = FileUtils.getDepth(item.filename);
|
|
47
|
-
var depthLines = Array(depth).fill(null).map((value, index) =>
|
|
48
|
-
/*#__PURE__*/
|
|
49
|
-
// eslint-disable-next-line react/no-array-index-key
|
|
50
|
-
React.createElement("span", {
|
|
51
|
-
className: "file-list-depth-line",
|
|
52
|
-
key: index
|
|
53
|
-
}));
|
|
54
|
-
return /*#__PURE__*/React.createElement("div", {
|
|
55
|
-
className: classNames('d-flex w-100 align-items-center', 'file-list-item', {
|
|
56
|
-
'is-dragged': isDragged,
|
|
57
|
-
'is-exact-drop-target': isExactDropTarget,
|
|
58
|
-
'is-in-drop-target': isInDropTarget,
|
|
59
|
-
'is-invalid-drop-target': isInvalidDropTarget,
|
|
60
|
-
'is-selected': isSelected
|
|
61
|
-
}),
|
|
62
|
-
onDragStart: function (_onDragStart) {
|
|
63
|
-
function onDragStart(_x) {
|
|
64
|
-
return _onDragStart.apply(this, arguments);
|
|
65
|
-
}
|
|
66
|
-
onDragStart.toString = function () {
|
|
67
|
-
return _onDragStart.toString();
|
|
68
|
-
};
|
|
69
|
-
return onDragStart;
|
|
70
|
-
}(e => onDragStart(itemIndex, e)),
|
|
71
|
-
onDragOver: function (_onDragOver) {
|
|
72
|
-
function onDragOver(_x2) {
|
|
73
|
-
return _onDragOver.apply(this, arguments);
|
|
74
|
-
}
|
|
75
|
-
onDragOver.toString = function () {
|
|
76
|
-
return _onDragOver.toString();
|
|
77
|
-
};
|
|
78
|
-
return onDragOver;
|
|
79
|
-
}(e => onDragOver(itemIndex, e)),
|
|
80
|
-
onDragEnd: function (_onDragEnd) {
|
|
81
|
-
function onDragEnd(_x3) {
|
|
82
|
-
return _onDragEnd.apply(this, arguments);
|
|
83
|
-
}
|
|
84
|
-
onDragEnd.toString = function () {
|
|
85
|
-
return _onDragEnd.toString();
|
|
86
|
-
};
|
|
87
|
-
return onDragEnd;
|
|
88
|
-
}(e => onDragEnd(itemIndex, e)),
|
|
89
|
-
onDrop: function (_onDrop) {
|
|
90
|
-
function onDrop(_x4) {
|
|
91
|
-
return _onDrop.apply(this, arguments);
|
|
92
|
-
}
|
|
93
|
-
onDrop.toString = function () {
|
|
94
|
-
return _onDrop.toString();
|
|
95
|
-
};
|
|
96
|
-
return onDrop;
|
|
97
|
-
}(e => onDrop(itemIndex, e)),
|
|
98
|
-
draggable: true,
|
|
99
|
-
role: "presentation",
|
|
100
|
-
"aria-label": item.basename
|
|
101
|
-
}, depthLines, ' ', /*#__PURE__*/React.createElement(FontAwesomeIcon, {
|
|
102
|
-
icon: icon,
|
|
103
|
-
className: "item-icon",
|
|
104
|
-
fixedWidth: true
|
|
105
|
-
}), ' ', /*#__PURE__*/React.createElement("span", {
|
|
106
|
-
className: "truncation-wrapper"
|
|
107
|
-
}, children !== null && children !== void 0 ? children : item.basename, /*#__PURE__*/React.createElement(Tooltip, {
|
|
108
|
-
options: {
|
|
109
|
-
placement: 'left'
|
|
110
|
-
}
|
|
111
|
-
}, children !== null && children !== void 0 ? children : item.basename)));
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* Get the icon definition for a file or folder item
|
|
116
|
-
* @param item Item to get the icon for
|
|
117
|
-
* @returns Icon definition to pass in the FontAwesomeIcon icon prop
|
|
118
|
-
*/
|
|
119
|
-
export function getItemIcon(item) {
|
|
120
|
-
if (isDirectory(item)) {
|
|
121
|
-
return item.isExpanded ? vsFolderOpened : vsFolder;
|
|
122
|
-
}
|
|
123
|
-
var mimeType = FileUtils.getMimeType(item.basename);
|
|
124
|
-
switch (mimeType) {
|
|
125
|
-
case MIME_TYPE.PYTHON:
|
|
126
|
-
return dhPython;
|
|
127
|
-
default:
|
|
128
|
-
return vsCode;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Get the move operation for the current selection and the given target. Throws if the operation is invalid.
|
|
134
|
-
*/
|
|
135
|
-
export function getMoveOperation(draggedItems, targetItem) {
|
|
136
|
-
if (draggedItems.length === 0 || targetItem == null) {
|
|
137
|
-
throw new Error('No items to move');
|
|
138
|
-
}
|
|
139
|
-
var targetPath = getPathFromItem(targetItem);
|
|
140
|
-
if (draggedItems.some(_ref => {
|
|
141
|
-
var {
|
|
142
|
-
filename
|
|
143
|
-
} = _ref;
|
|
144
|
-
return FileUtils.getPath(filename) === targetPath;
|
|
145
|
-
})) {
|
|
146
|
-
// Cannot drop if target is one of the dragged items is already in the target folder
|
|
147
|
-
throw new Error('File already in the destination folder');
|
|
148
|
-
}
|
|
149
|
-
if (draggedItems.some(item => isDirectory(item) && targetPath.startsWith(FileUtils.makePath(item.filename)))) {
|
|
150
|
-
// Cannot drop if target is a child of one of the directories being moved
|
|
151
|
-
throw new Error('Destination folder cannot be a child of a dragged folder');
|
|
152
|
-
}
|
|
153
|
-
return {
|
|
154
|
-
files: draggedItems,
|
|
155
|
-
targetPath
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
19
|
|
|
159
20
|
/**
|
|
160
21
|
* Component that displays and allows interaction with the file system in the provided FileStorageTable.
|
|
@@ -167,7 +28,7 @@ export function FileList(props) {
|
|
|
167
28
|
onMove,
|
|
168
29
|
onSelect,
|
|
169
30
|
onSelectionChange = () => undefined,
|
|
170
|
-
renderItem =
|
|
31
|
+
renderItem = FileListItem,
|
|
171
32
|
rowHeight = DEFAULT_ROW_HEIGHT,
|
|
172
33
|
overscanCount = ItemList.DEFAULT_OVERSCAN
|
|
173
34
|
} = props;
|
|
@@ -217,8 +78,8 @@ export function FileList(props) {
|
|
|
217
78
|
return null;
|
|
218
79
|
}
|
|
219
80
|
if (count === 1) {
|
|
220
|
-
var
|
|
221
|
-
var item = getItem(
|
|
81
|
+
var index = selectedRanges[0][0];
|
|
82
|
+
var item = getItem(index);
|
|
222
83
|
if (item != null) {
|
|
223
84
|
return item.filename;
|
|
224
85
|
}
|
package/dist/FileList.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileList.js","names":["ItemList","Tooltip","dhPython","vsCode","vsFolder","vsFolderOpened","Log","RangeUtils","FontAwesomeIcon","classNames","React","useCallback","useEffect","useMemo","useRef","useState","isDirectory","FileUtils","MIME_TYPE","log","module","getPathFromItem","file","makePath","filename","getPath","DEFAULT_ROW_HEIGHT","DRAG_HOVER_TIMEOUT","ITEM_LIST_CLASS_NAME","renderFileListItem","props","children","draggedItems","isDragInProgress","isDropTargetValid","isSelected","item","itemIndex","dropTargetItem","onDragStart","onDragOver","onDragEnd","onDrop","isDragged","some","draggedItem","id","itemPath","dropTargetPath","isExactDropTarget","isInDropTarget","isInvalidDropTarget","icon","getItemIcon","depth","getDepth","depthLines","Array","fill","map","value","index","e","basename","placement","isExpanded","mimeType","getMimeType","PYTHON","getMoveOperation","targetItem","length","Error","targetPath","startsWith","files","FileList","isMultiSelect","table","onFocusChange","undefined","onMove","onSelect","onSelectionChange","renderItem","rowHeight","overscanCount","DEFAULT_OVERSCAN","loadedViewport","setLoadedViewport","items","offset","itemCount","viewport","setViewport","top","bottom","setDropTargetItem","setDraggedItems","dragPlaceholder","setDragPlaceholder","selectedRanges","setSelectedRanges","itemList","fileList","getItems","ranges","i","range","j","push","getItem","getDragPlaceholderText","count","dropItems","debug","current","focusItem","err","error","handleSelect","event","setExpanded","handleItemDragStart","debug2","draggedRanges","resetMouseState","newDragPlaceholder","document","createElement","innerHTML","className","body","appendChild","dataTransfer","setDragImage","effectAllowed","handleItemDragOver","preventDefault","handleItemDragEnd","remove","handleItemDrop","handleItemDragExit","handleListDragOver","target","Element","classList","contains","type","handleListDrop","handleSelectionChange","newSelectedRanges","selectedItems","handleFocusChange","focusIndex","focusedItem","handleViewportChange","focusedPath","collapseAll","updateTableViewport","Math","max","setLoadedViewportAndReturnCleanup","listenerRemover","onUpdate","newViewport","itemName","size","expandFolderOnHover","timeout","setTimeout","clearTimeout","renderWrapper","itemProps","onDragExit"],"sources":["../src/FileList.tsx"],"sourcesContent":["import {\n ItemList,\n Range,\n RenderItemProps,\n Tooltip,\n} from '@deephaven/components';\nimport { dhPython, vsCode, vsFolder, vsFolderOpened } from '@deephaven/icons';\nimport Log from '@deephaven/log';\nimport { RangeUtils } from '@deephaven/utils';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport classNames from 'classnames';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { FileStorageItem, FileStorageTable, isDirectory } from './FileStorage';\nimport './FileList.scss';\nimport FileUtils, { MIME_TYPE } from './FileUtils';\n\nconst log = Log.module('FileList');\n\nexport type LoadedViewport = {\n items: FileStorageItem[];\n offset: number;\n itemCount: number;\n};\n\nexport type ListViewport = {\n top: number;\n bottom: number;\n};\n\nexport type FileListRenderItemProps = RenderItemProps<FileStorageItem> & {\n children?: JSX.Element;\n dropTargetItem?: FileStorageItem;\n draggedItems?: FileStorageItem[];\n isDragInProgress: boolean;\n isDropTargetValid: boolean;\n\n onDragStart(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragOver(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragEnd(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDrop(index: number, e: React.DragEvent<HTMLDivElement>): void;\n};\n\nexport interface FileListProps {\n table: FileStorageTable;\n\n isMultiSelect?: boolean;\n 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\nexport const getPathFromItem = (file: FileStorageItem): string =>\n isDirectory(file)\n ? FileUtils.makePath(file.filename)\n : FileUtils.getPath(file.filename);\n\nexport const DEFAULT_ROW_HEIGHT = 26;\n\n// How long you need to hover over a directory before it expands\nexport const DRAG_HOVER_TIMEOUT = 500;\n\nconst ITEM_LIST_CLASS_NAME = 'item-list-scroll-pane';\n\nexport const renderFileListItem = (\n props: FileListRenderItemProps\n): JSX.Element => {\n const {\n children,\n draggedItems,\n isDragInProgress,\n isDropTargetValid,\n isSelected,\n item,\n itemIndex,\n dropTargetItem,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n } = props;\n\n const isDragged =\n draggedItems?.some(draggedItem => draggedItem.id === item.id) ?? false;\n const itemPath = getPathFromItem(item);\n const dropTargetPath =\n isDragInProgress && dropTargetItem ? getPathFromItem(dropTargetItem) : null;\n\n const isExactDropTarget =\n isDragInProgress &&\n isDropTargetValid &&\n isDirectory(item) &&\n dropTargetPath === itemPath;\n const isInDropTarget =\n isDragInProgress && isDropTargetValid && dropTargetPath === itemPath;\n const isInvalidDropTarget =\n isDragInProgress && !isDropTargetValid && dropTargetPath === itemPath;\n\n const icon = getItemIcon(item);\n const depth = FileUtils.getDepth(item.filename);\n const depthLines = Array(depth)\n .fill(null)\n .map((value, index) => (\n // eslint-disable-next-line react/no-array-index-key\n <span className=\"file-list-depth-line\" key={index} />\n ));\n\n return (\n <div\n className={classNames(\n 'd-flex w-100 align-items-center',\n 'file-list-item',\n {\n 'is-dragged': isDragged,\n 'is-exact-drop-target': isExactDropTarget,\n 'is-in-drop-target': isInDropTarget,\n 'is-invalid-drop-target': isInvalidDropTarget,\n 'is-selected': isSelected,\n }\n )}\n onDragStart={e => onDragStart(itemIndex, e)}\n onDragOver={e => onDragOver(itemIndex, e)}\n onDragEnd={e => onDragEnd(itemIndex, e)}\n onDrop={e => onDrop(itemIndex, e)}\n draggable\n role=\"presentation\"\n aria-label={item.basename}\n >\n {depthLines}{' '}\n <FontAwesomeIcon icon={icon} className=\"item-icon\" fixedWidth />{' '}\n <span className=\"truncation-wrapper\">\n {children ?? item.basename}\n <Tooltip\n options={{\n placement: 'left',\n }}\n >\n {children ?? item.basename}\n </Tooltip>\n </span>\n </div>\n );\n};\n\n/**\n * Get the icon definition for a file or folder item\n * @param item Item to get the icon for\n * @returns Icon definition to pass in the FontAwesomeIcon icon prop\n */\nexport function getItemIcon(item: FileStorageItem): IconDefinition {\n if (isDirectory(item)) {\n return item.isExpanded ? vsFolderOpened : vsFolder;\n }\n const mimeType = FileUtils.getMimeType(item.basename);\n switch (mimeType) {\n case MIME_TYPE.PYTHON:\n return dhPython;\n default:\n return vsCode;\n }\n}\n\n/**\n * Get the move operation for the current selection and the given target. Throws if the operation is invalid.\n */\nexport function getMoveOperation(\n draggedItems: FileStorageItem[],\n targetItem: FileStorageItem\n): { files: FileStorageItem[]; targetPath: string } {\n if (draggedItems.length === 0 || targetItem == null) {\n throw new Error('No items to move');\n }\n\n const targetPath = getPathFromItem(targetItem);\n if (\n draggedItems.some(\n ({ filename }) => FileUtils.getPath(filename) === targetPath\n )\n ) {\n // Cannot drop if target is one of the dragged items is already in the target folder\n throw new Error('File already in the destination folder');\n }\n if (\n draggedItems.some(\n item =>\n isDirectory(item) &&\n targetPath.startsWith(FileUtils.makePath(item.filename))\n )\n ) {\n // Cannot drop if target is a child of one of the directories being moved\n throw new Error('Destination folder cannot be a child of a dragged folder');\n }\n return { files: draggedItems, targetPath };\n}\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorageTable.\n */\nexport 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 = renderFileListItem,\n rowHeight = DEFAULT_ROW_HEIGHT,\n overscanCount = ItemList.DEFAULT_OVERSCAN,\n } = props;\n const [loadedViewport, setLoadedViewport] = useState<LoadedViewport>(() => ({\n items: [],\n offset: 0,\n itemCount: 0,\n }));\n const [viewport, setViewport] = useState<ListViewport>({\n top: 0,\n bottom: 0,\n });\n\n const [dropTargetItem, setDropTargetItem] = useState<FileStorageItem>();\n const [draggedItems, setDraggedItems] = useState<FileStorageItem[]>();\n const [dragPlaceholder, setDragPlaceholder] = useState<HTMLDivElement>();\n const [selectedRanges, setSelectedRanges] = useState([] as Range[]);\n\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileListContainer.d.ts","sourceRoot":"","sources":["../src/FileListContainer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAyC,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"FileListContainer.d.ts","sourceRoot":"","sources":["../src/FileListContainer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAI9D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAe,MAAM,eAAe,CAAC;AAE/E,OAAO,qBAAqB,CAAC;AAI7B,MAAM,WAAW,sBAAsB;IACrC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,EAAE,gBAAgB,CAAC;IAExB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,cAAc,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;IAC9C,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5D,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,cAAc,KAAK,IAAI,CAAC;IACvE,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,iBAAiB,CAAC,EAAE,CAAC,aAAa,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;IAE/D,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,GAAG,CAAC,OAAO,CA+L5E;yBA/Le,iBAAiB;;;AAmMjC,eAAe,iBAAiB,CAAC"}
|
|
@@ -1,12 +1,9 @@
|
|
|
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); }
|
|
6
1
|
import { ContextActions } from '@deephaven/components';
|
|
7
2
|
import { assertNotNull } from '@deephaven/utils';
|
|
8
3
|
import React, { useCallback, useMemo, useState } from 'react';
|
|
9
|
-
import FileList
|
|
4
|
+
import FileList from "./FileList.js";
|
|
5
|
+
import { FileListItem } from "./FileListItem.js";
|
|
6
|
+
import { DEFAULT_ROW_HEIGHT } from "./FileListUtils.js";
|
|
10
7
|
import { isDirectory } from "./FileStorage.js";
|
|
11
8
|
import SHORTCUTS from "./FileExplorerShortcuts.js";
|
|
12
9
|
import "./FileExplorer.css";
|
|
@@ -135,16 +132,19 @@ export function FileListContainer(props) {
|
|
|
135
132
|
item
|
|
136
133
|
} = itemProps;
|
|
137
134
|
if (renameItem && renameItem.filename === item.filename) {
|
|
138
|
-
return
|
|
139
|
-
|
|
135
|
+
return (
|
|
136
|
+
/*#__PURE__*/
|
|
137
|
+
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
138
|
+
React.createElement(FileListItem, itemProps, /*#__PURE__*/React.createElement(FileListItemEditor, {
|
|
140
139
|
item: item,
|
|
141
140
|
validate: validateRenameItem,
|
|
142
141
|
onSubmit: handleRenameSubmit,
|
|
143
142
|
onCancel: handleRenameCancel
|
|
144
|
-
})
|
|
145
|
-
|
|
143
|
+
}))
|
|
144
|
+
);
|
|
146
145
|
}
|
|
147
|
-
|
|
146
|
+
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
147
|
+
return /*#__PURE__*/React.createElement(FileListItem, itemProps);
|
|
148
148
|
}, [handleRenameCancel, handleRenameSubmit, renameItem, validateRenameItem]);
|
|
149
149
|
return /*#__PURE__*/React.createElement("div", {
|
|
150
150
|
className: "file-list-container"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileListContainer.js","names":["ContextActions","assertNotNull","React","useCallback","useMemo","useState","FileList","renderFileListItem","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","children","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, {\n renderFileListItem,\n DEFAULT_ROW_HEIGHT,\n FileListRenderItemProps,\n} from './FileList';\nimport { FileStorageItem, FileStorageTable, isDirectory } from './FileStorage';\nimport SHORTCUTS from './FileExplorerShortcuts';\nimport './FileExplorer.scss';\nimport FileUtils from './FileUtils';\nimport FileListItemEditor from './FileListItemEditor';\n\nexport interface FileListContainerProps {\n showContextMenu?: boolean;\n table: FileStorageTable;\n\n isMultiSelect?: boolean;\n 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 renderFileListItem({\n ...itemProps,\n children: (\n <FileListItemEditor\n item={item}\n validate={validateRenameItem}\n onSubmit={handleRenameSubmit}\n onCancel={handleRenameCancel}\n />\n ),\n });\n }\n return renderFileListItem(itemProps);\n },\n [handleRenameCancel, handleRenameSubmit, renameItem, validateRenameItem]\n );\n\n return (\n <div className=\"file-list-container\">\n {table != 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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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { RenderItemProps } from '@deephaven/components';
|
|
3
|
+
import { FileStorageItem } from './FileStorage';
|
|
4
|
+
import './FileList.scss';
|
|
5
|
+
export type FileListRenderItemProps = RenderItemProps<FileStorageItem> & {
|
|
6
|
+
children?: JSX.Element;
|
|
7
|
+
dropTargetItem?: FileStorageItem;
|
|
8
|
+
draggedItems?: FileStorageItem[];
|
|
9
|
+
isDragInProgress: boolean;
|
|
10
|
+
isDropTargetValid: boolean;
|
|
11
|
+
onDragStart(index: number, e: React.DragEvent<HTMLDivElement>): void;
|
|
12
|
+
onDragOver(index: number, e: React.DragEvent<HTMLDivElement>): void;
|
|
13
|
+
onDragEnd(index: number, e: React.DragEvent<HTMLDivElement>): void;
|
|
14
|
+
onDrop(index: number, e: React.DragEvent<HTMLDivElement>): void;
|
|
15
|
+
};
|
|
16
|
+
export declare function FileListItem(props: FileListRenderItemProps): JSX.Element;
|
|
17
|
+
export default FileListItem;
|
|
18
|
+
//# sourceMappingURL=FileListItem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileListItem.d.ts","sourceRoot":"","sources":["../src/FileListItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAW,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAKjE,OAAO,EAAE,eAAe,EAAe,MAAM,eAAe,CAAC;AAC7D,OAAO,iBAAiB,CAAC;AAsBzB,MAAM,MAAM,uBAAuB,GAAG,eAAe,CAAC,eAAe,CAAC,GAAG;IACvE,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;IACjC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAE3B,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IACrE,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IACpE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IACnE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;CACjE,CAAC;AAEF,wBAAgB,YAAY,CAAC,KAAK,EAAE,uBAAuB,GAAG,GAAG,CAAC,OAAO,CA4ExE;AAED,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Tooltip } from '@deephaven/components';
|
|
3
|
+
import { dhPython, vsCode, vsFolder, vsFolderOpened } from '@deephaven/icons';
|
|
4
|
+
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
5
|
+
import classNames from 'classnames';
|
|
6
|
+
import { isDirectory } from "./FileStorage.js";
|
|
7
|
+
import "./FileList.css";
|
|
8
|
+
import FileUtils, { MIME_TYPE } from "./FileUtils.js";
|
|
9
|
+
import { getPathFromItem } from "./FileListUtils.js";
|
|
10
|
+
/**
|
|
11
|
+
* Get the icon definition for a file or folder item
|
|
12
|
+
* @param item Item to get the icon for
|
|
13
|
+
* @returns Icon definition to pass in the FontAwesomeIcon icon prop
|
|
14
|
+
*/
|
|
15
|
+
function getItemIcon(item) {
|
|
16
|
+
if (isDirectory(item)) {
|
|
17
|
+
return item.isExpanded ? vsFolderOpened : vsFolder;
|
|
18
|
+
}
|
|
19
|
+
var mimeType = FileUtils.getMimeType(item.basename);
|
|
20
|
+
switch (mimeType) {
|
|
21
|
+
case MIME_TYPE.PYTHON:
|
|
22
|
+
return dhPython;
|
|
23
|
+
default:
|
|
24
|
+
return vsCode;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function FileListItem(props) {
|
|
28
|
+
var _draggedItems$some;
|
|
29
|
+
var {
|
|
30
|
+
children,
|
|
31
|
+
draggedItems,
|
|
32
|
+
isDragInProgress,
|
|
33
|
+
isDropTargetValid,
|
|
34
|
+
isSelected,
|
|
35
|
+
item,
|
|
36
|
+
itemIndex,
|
|
37
|
+
dropTargetItem,
|
|
38
|
+
onDragStart,
|
|
39
|
+
onDragOver,
|
|
40
|
+
onDragEnd,
|
|
41
|
+
onDrop
|
|
42
|
+
} = props;
|
|
43
|
+
var isDragged = (_draggedItems$some = draggedItems === null || draggedItems === void 0 ? void 0 : draggedItems.some(draggedItem => draggedItem.id === item.id)) !== null && _draggedItems$some !== void 0 ? _draggedItems$some : false;
|
|
44
|
+
var itemPath = getPathFromItem(item);
|
|
45
|
+
var dropTargetPath = isDragInProgress && dropTargetItem ? getPathFromItem(dropTargetItem) : null;
|
|
46
|
+
var isExactDropTarget = isDragInProgress && isDropTargetValid && isDirectory(item) && dropTargetPath === itemPath;
|
|
47
|
+
var isInDropTarget = isDragInProgress && isDropTargetValid && dropTargetPath === itemPath;
|
|
48
|
+
var isInvalidDropTarget = isDragInProgress && !isDropTargetValid && dropTargetPath === itemPath;
|
|
49
|
+
var icon = getItemIcon(item);
|
|
50
|
+
var depth = FileUtils.getDepth(item.filename);
|
|
51
|
+
var depthLines = Array(depth).fill(null).map((value, index) =>
|
|
52
|
+
/*#__PURE__*/
|
|
53
|
+
// eslint-disable-next-line react/no-array-index-key
|
|
54
|
+
React.createElement("span", {
|
|
55
|
+
className: "file-list-depth-line",
|
|
56
|
+
key: index
|
|
57
|
+
}));
|
|
58
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
59
|
+
className: classNames('d-flex w-100 align-items-center', 'file-list-item', {
|
|
60
|
+
'is-dragged': isDragged,
|
|
61
|
+
'is-exact-drop-target': isExactDropTarget,
|
|
62
|
+
'is-in-drop-target': isInDropTarget,
|
|
63
|
+
'is-invalid-drop-target': isInvalidDropTarget,
|
|
64
|
+
'is-selected': isSelected
|
|
65
|
+
}),
|
|
66
|
+
onDragStart: function (_onDragStart) {
|
|
67
|
+
function onDragStart(_x) {
|
|
68
|
+
return _onDragStart.apply(this, arguments);
|
|
69
|
+
}
|
|
70
|
+
onDragStart.toString = function () {
|
|
71
|
+
return _onDragStart.toString();
|
|
72
|
+
};
|
|
73
|
+
return onDragStart;
|
|
74
|
+
}(e => onDragStart(itemIndex, e)),
|
|
75
|
+
onDragOver: function (_onDragOver) {
|
|
76
|
+
function onDragOver(_x2) {
|
|
77
|
+
return _onDragOver.apply(this, arguments);
|
|
78
|
+
}
|
|
79
|
+
onDragOver.toString = function () {
|
|
80
|
+
return _onDragOver.toString();
|
|
81
|
+
};
|
|
82
|
+
return onDragOver;
|
|
83
|
+
}(e => onDragOver(itemIndex, e)),
|
|
84
|
+
onDragEnd: function (_onDragEnd) {
|
|
85
|
+
function onDragEnd(_x3) {
|
|
86
|
+
return _onDragEnd.apply(this, arguments);
|
|
87
|
+
}
|
|
88
|
+
onDragEnd.toString = function () {
|
|
89
|
+
return _onDragEnd.toString();
|
|
90
|
+
};
|
|
91
|
+
return onDragEnd;
|
|
92
|
+
}(e => onDragEnd(itemIndex, e)),
|
|
93
|
+
onDrop: function (_onDrop) {
|
|
94
|
+
function onDrop(_x4) {
|
|
95
|
+
return _onDrop.apply(this, arguments);
|
|
96
|
+
}
|
|
97
|
+
onDrop.toString = function () {
|
|
98
|
+
return _onDrop.toString();
|
|
99
|
+
};
|
|
100
|
+
return onDrop;
|
|
101
|
+
}(e => onDrop(itemIndex, e)),
|
|
102
|
+
draggable: true,
|
|
103
|
+
role: "presentation",
|
|
104
|
+
"aria-label": item.basename
|
|
105
|
+
}, depthLines, ' ', /*#__PURE__*/React.createElement(FontAwesomeIcon, {
|
|
106
|
+
icon: icon,
|
|
107
|
+
className: "item-icon",
|
|
108
|
+
fixedWidth: true
|
|
109
|
+
}), ' ', /*#__PURE__*/React.createElement("span", {
|
|
110
|
+
className: "truncation-wrapper"
|
|
111
|
+
}, children !== null && children !== void 0 ? children : item.basename, /*#__PURE__*/React.createElement(Tooltip, {
|
|
112
|
+
options: {
|
|
113
|
+
placement: 'left'
|
|
114
|
+
}
|
|
115
|
+
}, children !== null && children !== void 0 ? children : item.basename)));
|
|
116
|
+
}
|
|
117
|
+
export default FileListItem;
|
|
118
|
+
//# sourceMappingURL=FileListItem.js.map
|
|
@@ -0,0 +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":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { FileStorageItem } from './FileStorage';
|
|
2
|
+
export declare const DEFAULT_ROW_HEIGHT = 26;
|
|
3
|
+
export declare function getPathFromItem(file: FileStorageItem): string;
|
|
4
|
+
/**
|
|
5
|
+
* Get the move operation for the current selection and the given target. Throws if the operation is invalid.
|
|
6
|
+
*/
|
|
7
|
+
export declare function getMoveOperation(draggedItems: FileStorageItem[], targetItem: FileStorageItem): {
|
|
8
|
+
files: FileStorageItem[];
|
|
9
|
+
targetPath: string;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=FileListUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileListUtils.d.ts","sourceRoot":"","sources":["../src/FileListUtils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGrD,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAI7D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,eAAe,EAAE,EAC/B,UAAU,EAAE,eAAe,GAC1B;IAAE,KAAK,EAAE,eAAe,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAyBlD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { isDirectory } from "./FileStorage.js";
|
|
2
|
+
import FileUtils from "./FileUtils.js";
|
|
3
|
+
export var DEFAULT_ROW_HEIGHT = 26;
|
|
4
|
+
export function getPathFromItem(file) {
|
|
5
|
+
return isDirectory(file) ? FileUtils.makePath(file.filename) : FileUtils.getPath(file.filename);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Get the move operation for the current selection and the given target. Throws if the operation is invalid.
|
|
10
|
+
*/
|
|
11
|
+
export function getMoveOperation(draggedItems, targetItem) {
|
|
12
|
+
if (draggedItems.length === 0 || targetItem == null) {
|
|
13
|
+
throw new Error('No items to move');
|
|
14
|
+
}
|
|
15
|
+
var targetPath = getPathFromItem(targetItem);
|
|
16
|
+
if (draggedItems.some(_ref => {
|
|
17
|
+
var {
|
|
18
|
+
filename
|
|
19
|
+
} = _ref;
|
|
20
|
+
return FileUtils.getPath(filename) === targetPath;
|
|
21
|
+
})) {
|
|
22
|
+
// Cannot drop if target is one of the dragged items is already in the target folder
|
|
23
|
+
throw new Error('File already in the destination folder');
|
|
24
|
+
}
|
|
25
|
+
if (draggedItems.some(item => isDirectory(item) && targetPath.startsWith(FileUtils.makePath(item.filename)))) {
|
|
26
|
+
// Cannot drop if target is a child of one of the directories being moved
|
|
27
|
+
throw new Error('Destination folder cannot be a child of a dragged folder');
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
files: draggedItems,
|
|
31
|
+
targetPath
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=FileListUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileListUtils.js","names":["isDirectory","FileUtils","DEFAULT_ROW_HEIGHT","getPathFromItem","file","makePath","filename","getPath","getMoveOperation","draggedItems","targetItem","length","Error","targetPath","some","item","startsWith","files"],"sources":["../src/FileListUtils.ts"],"sourcesContent":["import { isDirectory } from './FileStorage';\nimport type { FileStorageItem } from './FileStorage';\nimport FileUtils from './FileUtils';\n\nexport const DEFAULT_ROW_HEIGHT = 26;\n\nexport function getPathFromItem(file: FileStorageItem): string {\n return isDirectory(file)\n ? FileUtils.makePath(file.filename)\n : FileUtils.getPath(file.filename);\n}\n\n/**\n * Get the move operation for the current selection and the given target. Throws if the operation is invalid.\n */\nexport function getMoveOperation(\n draggedItems: FileStorageItem[],\n targetItem: FileStorageItem\n): { files: FileStorageItem[]; targetPath: string } {\n if (draggedItems.length === 0 || targetItem == null) {\n throw new Error('No items to move');\n }\n\n const targetPath = getPathFromItem(targetItem);\n if (\n draggedItems.some(\n ({ filename }) => FileUtils.getPath(filename) === targetPath\n )\n ) {\n // Cannot drop if target is one of the dragged items is already in the target folder\n throw new Error('File already in the destination folder');\n }\n if (\n draggedItems.some(\n item =>\n isDirectory(item) &&\n targetPath.startsWith(FileUtils.makePath(item.filename))\n )\n ) {\n // Cannot drop if target is a child of one of the directories being moved\n throw new Error('Destination folder cannot be a child of a dragged folder');\n }\n return { files: draggedItems, targetPath };\n}\n"],"mappings":"SAASA,WAAW;AAAA,OAEbC,SAAS;AAEhB,OAAO,IAAMC,kBAAkB,GAAG,EAAE;AAEpC,OAAO,SAASC,eAAe,CAACC,IAAqB,EAAU;EAC7D,OAAOJ,WAAW,CAACI,IAAI,CAAC,GACpBH,SAAS,CAACI,QAAQ,CAACD,IAAI,CAACE,QAAQ,CAAC,GACjCL,SAAS,CAACM,OAAO,CAACH,IAAI,CAACE,QAAQ,CAAC;AACtC;;AAEA;AACA;AACA;AACA,OAAO,SAASE,gBAAgB,CAC9BC,YAA+B,EAC/BC,UAA2B,EACuB;EAClD,IAAID,YAAY,CAACE,MAAM,KAAK,CAAC,IAAID,UAAU,IAAI,IAAI,EAAE;IACnD,MAAM,IAAIE,KAAK,CAAC,kBAAkB,CAAC;EACrC;EAEA,IAAMC,UAAU,GAAGV,eAAe,CAACO,UAAU,CAAC;EAC9C,IACED,YAAY,CAACK,IAAI,CACf;IAAA,IAAC;MAAER;IAAS,CAAC;IAAA,OAAKL,SAAS,CAACM,OAAO,CAACD,QAAQ,CAAC,KAAKO,UAAU;EAAA,EAC7D,EACD;IACA;IACA,MAAM,IAAID,KAAK,CAAC,wCAAwC,CAAC;EAC3D;EACA,IACEH,YAAY,CAACK,IAAI,CACfC,IAAI,IACFf,WAAW,CAACe,IAAI,CAAC,IACjBF,UAAU,CAACG,UAAU,CAACf,SAAS,CAACI,QAAQ,CAACU,IAAI,CAACT,QAAQ,CAAC,CAAC,CAC3D,EACD;IACA;IACA,MAAM,IAAIM,KAAK,CAAC,0DAA0D,CAAC;EAC7E;EACA,OAAO;IAAEK,KAAK,EAAER,YAAY;IAAEI;EAAW,CAAC;AAC5C"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,8 @@ import FileExplorer from './FileExplorer';
|
|
|
2
2
|
export * from './FileExplorer';
|
|
3
3
|
export * from './FileListContainer';
|
|
4
4
|
export * from './FileList';
|
|
5
|
+
export * from './FileListItem';
|
|
6
|
+
export * from './FileListUtils';
|
|
5
7
|
export * from './FileStorage';
|
|
6
8
|
export { default as FileExistsError } from './FileExistsError';
|
|
7
9
|
export { default as FileNotFoundError } from './FileNotFoundError';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAE1C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AAEnD,eAAe,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAE1C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AAEnD,eAAe,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,8 @@ import FileExplorer from "./FileExplorer.js";
|
|
|
2
2
|
export * from "./FileExplorer.js";
|
|
3
3
|
export * from "./FileListContainer.js";
|
|
4
4
|
export * from "./FileList.js";
|
|
5
|
+
export * from "./FileListItem.js";
|
|
6
|
+
export * from "./FileListUtils.js";
|
|
5
7
|
export * from "./FileStorage.js";
|
|
6
8
|
export { default as FileExistsError } from "./FileExistsError.js";
|
|
7
9
|
export { default as FileNotFoundError } from "./FileNotFoundError.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["FileExplorer","default","FileExistsError","FileNotFoundError","SHORTCUTS","NewItemModal","FileExplorerToolbar","FileUtils"],"sources":["../src/index.ts"],"sourcesContent":["import FileExplorer from './FileExplorer';\n\nexport * from './FileExplorer';\nexport * from './FileListContainer';\nexport * from './FileList';\nexport * from './FileStorage';\nexport { default as FileExistsError } from './FileExistsError';\nexport { default as FileNotFoundError } from './FileNotFoundError';\nexport { default as SHORTCUTS } from './FileExplorerShortcuts';\nexport { default as NewItemModal } from './NewItemModal';\nexport { default as FileExplorerToolbar } from './FileExplorerToolbar';\nexport { default as FileUtils } from './FileUtils';\n\nexport default FileExplorer;\n"],"mappings":"OAAOA,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","names":["FileExplorer","default","FileExistsError","FileNotFoundError","SHORTCUTS","NewItemModal","FileExplorerToolbar","FileUtils"],"sources":["../src/index.ts"],"sourcesContent":["import FileExplorer from './FileExplorer';\n\nexport * from './FileExplorer';\nexport * from './FileListContainer';\nexport * from './FileList';\nexport * from './FileListItem';\nexport * from './FileListUtils';\nexport * from './FileStorage';\nexport { default as FileExistsError } from './FileExistsError';\nexport { default as FileNotFoundError } from './FileNotFoundError';\nexport { default as SHORTCUTS } from './FileExplorerShortcuts';\nexport { default as NewItemModal } from './NewItemModal';\nexport { default as FileExplorerToolbar } from './FileExplorerToolbar';\nexport { default as FileUtils } from './FileUtils';\n\nexport default FileExplorer;\n"],"mappings":"OAAOA,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAQVC,OAAO,IAAIC,eAAe;AAAA,SAC1BD,OAAO,IAAIE,iBAAiB;AAAA,SAC5BF,OAAO,IAAIG,SAAS;AAAA,SACpBH,OAAO,IAAII,YAAY;AAAA,SACvBJ,OAAO,IAAIK,mBAAmB;AAAA,SAC9BL,OAAO,IAAIM,SAAS;AAE7B,eAAeP,YAAY"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deephaven/file-explorer",
|
|
3
|
-
"version": "0.32.1-
|
|
3
|
+
"version": "0.32.1-table-plugins.9+29cd4d8",
|
|
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.32.1-
|
|
26
|
-
"@deephaven/icons": "^0.32.1-
|
|
27
|
-
"@deephaven/log": "^0.32.1-
|
|
28
|
-
"@deephaven/storage": "^0.32.1-
|
|
29
|
-
"@deephaven/utils": "^0.32.1-
|
|
25
|
+
"@deephaven/components": "^0.32.1-table-plugins.9+29cd4d8",
|
|
26
|
+
"@deephaven/icons": "^0.32.1-table-plugins.9+29cd4d8",
|
|
27
|
+
"@deephaven/log": "^0.32.1-table-plugins.9+29cd4d8",
|
|
28
|
+
"@deephaven/storage": "^0.32.1-table-plugins.9+29cd4d8",
|
|
29
|
+
"@deephaven/utils": "^0.32.1-table-plugins.9+29cd4d8",
|
|
30
30
|
"@fortawesome/fontawesome-svg-core": "^6.2.1",
|
|
31
31
|
"@fortawesome/react-fontawesome": "^0.2.0",
|
|
32
32
|
"classnames": "^2.3.1",
|
|
@@ -37,8 +37,8 @@
|
|
|
37
37
|
"react": "^17.0.0"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
|
-
"@deephaven/mocks": "^0.32.1-
|
|
41
|
-
"@deephaven/tsconfig": "^0.32.1-
|
|
40
|
+
"@deephaven/mocks": "^0.32.1-table-plugins.9+29cd4d8",
|
|
41
|
+
"@deephaven/tsconfig": "^0.32.1-table-plugins.9+29cd4d8"
|
|
42
42
|
},
|
|
43
43
|
"files": [
|
|
44
44
|
"dist"
|
|
@@ -46,5 +46,5 @@
|
|
|
46
46
|
"publishConfig": {
|
|
47
47
|
"access": "public"
|
|
48
48
|
},
|
|
49
|
-
"gitHead": "
|
|
49
|
+
"gitHead": "29cd4d83572be60355a22e372fe11f70ad5ea75a"
|
|
50
50
|
}
|