@deephaven/file-explorer 0.48.0 → 0.48.1-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"FileExplorer.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","onCopy","undefined","onDelete","onRename","onCreateFile","onCreateFolder","onSelect","onSelectionChange","rowHeight","itemsToDelete","setItemsToDelete","table","setTable","initializeTable","tablePromise","initTable","debug","makeCancelable","getTable","t","close","e","isCanceled","error","cancel","handleError","handleCreateFile","handleCreateFolder","handleCopyFile","file","filename","handleDelete","files","handleDeleteConfirm","forEach","deleteFile","makePath","handleDeleteCancel","handleMove","path","filesToMove","reducePaths","map","newFile","isPath","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 onCopy?: (file: FileStorageItem) => void;\n onCreateFile?: () => void;\n onCreateFolder?: () => void;\n onDelete?: (files: FileStorageItem[]) => void;\n onRename?: (oldName: string, newName: string) => void;\n onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => void;\n onSelectionChange?: (selectedItems: FileStorageItem[]) => void;\n\n /** Height of each item in the list */\n rowHeight?: number;\n}\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorage.\n */\nexport function FileExplorer(props: FileExplorerProps): JSX.Element {\n const {\n storage,\n isMultiSelect = false,\n focusedPath,\n onCopy = () => undefined,\n onDelete = () => undefined,\n onRename = () => undefined,\n onCreateFile = () => undefined,\n onCreateFolder = () => undefined,\n onSelect,\n onSelectionChange,\n rowHeight = DEFAULT_ROW_HEIGHT,\n } = props;\n const [itemsToDelete, setItemsToDelete] = useState<FileStorageItem[]>([]);\n const [table, setTable] = useState<FileStorageTable>();\n\n useEffect(\n function initializeTable() {\n let tablePromise: CancelablePromise<FileStorageTable>;\n async function initTable() {\n log.debug('initTable');\n\n tablePromise = PromiseUtils.makeCancelable(storage.getTable(), t =>\n t.close()\n );\n\n try {\n setTable(await tablePromise);\n } catch (e) {\n if (!PromiseUtils.isCanceled(e)) {\n log.error('Unable to initialize table', e);\n }\n }\n }\n initTable();\n return () => {\n tablePromise.cancel();\n };\n },\n [storage]\n );\n\n const handleError = useCallback((e: Error) => {\n if (!PromiseUtils.isCanceled(e)) {\n log.error(e);\n }\n }, []);\n\n const handleCreateFile = useCallback(() => {\n log.debug('handleCreateFile');\n onCreateFile();\n }, [onCreateFile]);\n\n const handleCreateFolder = useCallback(() => {\n log.debug('handleCreateFolder');\n onCreateFolder();\n }, [onCreateFolder]);\n\n const handleCopyFile = useCallback(\n (file: FileStorageItem) => {\n log.debug('handleCopyFile', file.filename);\n onCopy(file);\n },\n [onCopy]\n );\n\n const handleDelete = useCallback((files: FileStorageItem[]) => {\n log.debug('handleDelete, pending confirmation', files);\n setItemsToDelete(files);\n }, []);\n\n const handleDeleteConfirm = useCallback(() => {\n log.debug('handleDeleteConfirm', itemsToDelete);\n itemsToDelete.forEach(file =>\n storage.deleteFile(\n isDirectory(file) ? FileUtils.makePath(file.filename) : file.filename\n )\n );\n onDelete(itemsToDelete);\n setItemsToDelete([]);\n }, [itemsToDelete, onDelete, storage]);\n\n const handleDeleteCancel = useCallback(() => {\n log.debug('handleDeleteCancel');\n setItemsToDelete([]);\n }, []);\n\n const handleMove = useCallback(\n (files: FileStorageItem[], path: string) => {\n const filesToMove = FileUtils.reducePaths(\n files.map(file =>\n isDirectory(file) ? FileUtils.makePath(file.filename) : file.filename\n )\n );\n\n filesToMove.forEach(file => {\n const newFile = FileUtils.isPath(file)\n ? `${path}${FileUtils.getBaseName(\n file.substring(0, file.length - 1)\n )}/`\n : `${path}${FileUtils.getBaseName(file)}`;\n storage\n .moveFile(file, newFile)\n .then(() => {\n // Each moved file triggers a rename so parent knows something has happened\n // We signal each individually if for some reason there's an error moving one of the files\n onRename(file, newFile);\n })\n .catch(handleError);\n });\n },\n [handleError, onRename, storage]\n );\n\n const handleRename = useCallback(\n (item: FileStorageItem, newName: string) => {\n let name = item.filename;\n const isDir = isDirectory(item);\n if (isDir && !name.endsWith('/')) {\n name = `${name}/`;\n }\n let destination = `${FileUtils.getParent(name)}${newName}`;\n if (isDir && !destination.endsWith('/')) {\n destination = `${destination}/`;\n }\n log.debug2('handleRename', name, destination);\n storage.moveFile(name, destination).catch(handleError);\n onRename(name, destination);\n },\n [handleError, onRename, storage]\n );\n\n const handleValidateRename = useCallback(\n async (renameItem: FileStorageItem, newName: string): Promise<void> => {\n if (newName === renameItem.basename) {\n // Same name is fine\n return undefined;\n }\n FileUtils.validateName(newName);\n\n const newValue = `${FileUtils.getPath(renameItem.filename)}${newName}`;\n try {\n const fileInfo = await storage.info(newValue);\n throw new FileExistsError(fileInfo);\n } catch (e) {\n if (!(e instanceof FileNotFoundError)) {\n throw e;\n }\n // The file does not exist, fine to save at that path\n }\n },\n [storage]\n );\n\n const isDeleteConfirmationShown = itemsToDelete.length > 0;\n const deleteConfirmationMessage = useMemo(() => {\n if (itemsToDelete.length === 1) {\n return `Are you sure you want to delete \"${itemsToDelete[0].filename}\"?`;\n }\n return `Are you sure you want to delete the selected files?`;\n }, [itemsToDelete]);\n\n return (\n <div className=\"file-explorer\">\n {table && (\n <FileListContainer\n isMultiSelect={isMultiSelect}\n focusedPath={focusedPath}\n showContextMenu\n onCopy={handleCopyFile}\n onCreateFolder={handleCreateFolder}\n onCreateFile={handleCreateFile}\n onMove={handleMove}\n onDelete={handleDelete}\n onRename={handleRename}\n onSelect={onSelect}\n onSelectionChange={onSelectionChange}\n rowHeight={rowHeight}\n table={table}\n validateRename={handleValidateRename}\n />\n )}\n <BasicModal\n isOpen={isDeleteConfirmationShown}\n headerText={deleteConfirmationMessage}\n bodyText=\"You cannot undo this action.\"\n onCancel={handleDeleteCancel}\n onConfirm={handleDeleteConfirm}\n confirmButtonText=\"Delete\"\n />\n </div>\n );\n}\n\nFileExplorer.displayName = 'FileExplorer';\n\nexport default FileExplorer;\n"],"mappings":";;AAAA,SAASA,UAAU,QAAQ,uBAAuB;AAClD,OAAOC,GAAG,MAAM,gBAAgB;AAChC,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;AAAA;AAAA;AAExB,IAAMC,GAAG,GAAGb,GAAG,CAACc,MAAM,CAAC,cAAc,CAAC;AAoBtC;AACA;AACA;AACA,OAAO,SAASC,YAAY,CAACC,KAAwB,EAAe;EAClE,IAAM;IACJC,OAAO;IACPC,aAAa,GAAG,KAAK;IACrBC,WAAW;IACXC,MAAM,GAAG,MAAMC,SAAS;IACxBC,QAAQ,GAAG,MAAMD,SAAS;IAC1BE,QAAQ,GAAG,MAAMF,SAAS;IAC1BG,YAAY,GAAG,MAAMH,SAAS;IAC9BI,cAAc,GAAG,MAAMJ,SAAS;IAChCK,QAAQ;IACRC,iBAAiB;IACjBC,SAAS,GAAGrB;EACd,CAAC,GAAGS,KAAK;EACT,IAAM,CAACa,aAAa,EAAEC,gBAAgB,CAAC,GAAGxB,QAAQ,CAAoB,EAAE,CAAC;EACzE,IAAM,CAACyB,KAAK,EAAEC,QAAQ,CAAC,GAAG1B,QAAQ,EAAoB;EAEtDF,SAAS,CACP,SAAS6B,eAAe,GAAG;IACzB,IAAIC,YAAiD;IAAC,SACvCC,SAAS;MAAA;IAAA;IAAA;MAAA,+BAAxB,aAA2B;QACzBtB,GAAG,CAACuB,KAAK,CAAC,WAAW,CAAC;QAEtBF,YAAY,GAAGjC,YAAY,CAACoC,cAAc,CAACpB,OAAO,CAACqB,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,CAACxC,YAAY,CAACyC,UAAU,CAACD,CAAC,CAAC,EAAE;YAC/B5B,GAAG,CAAC8B,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,CAAC3B,OAAO,CAAC,CACV;EAED,IAAM4B,WAAW,GAAG1C,WAAW,CAAEsC,CAAQ,IAAK;IAC5C,IAAI,CAACxC,YAAY,CAACyC,UAAU,CAACD,CAAC,CAAC,EAAE;MAC/B5B,GAAG,CAAC8B,KAAK,CAACF,CAAC,CAAC;IACd;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMK,gBAAgB,GAAG3C,WAAW,CAAC,MAAM;IACzCU,GAAG,CAACuB,KAAK,CAAC,kBAAkB,CAAC;IAC7BZ,YAAY,EAAE;EAChB,CAAC,EAAE,CAACA,YAAY,CAAC,CAAC;EAElB,IAAMuB,kBAAkB,GAAG5C,WAAW,CAAC,MAAM;IAC3CU,GAAG,CAACuB,KAAK,CAAC,oBAAoB,CAAC;IAC/BX,cAAc,EAAE;EAClB,CAAC,EAAE,CAACA,cAAc,CAAC,CAAC;EAEpB,IAAMuB,cAAc,GAAG7C,WAAW,CAC/B8C,IAAqB,IAAK;IACzBpC,GAAG,CAACuB,KAAK,CAAC,gBAAgB,EAAEa,IAAI,CAACC,QAAQ,CAAC;IAC1C9B,MAAM,CAAC6B,IAAI,CAAC;EACd,CAAC,EACD,CAAC7B,MAAM,CAAC,CACT;EAED,IAAM+B,YAAY,GAAGhD,WAAW,CAAEiD,KAAwB,IAAK;IAC7DvC,GAAG,CAACuB,KAAK,CAAC,oCAAoC,EAAEgB,KAAK,CAAC;IACtDtB,gBAAgB,CAACsB,KAAK,CAAC;EACzB,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMC,mBAAmB,GAAGlD,WAAW,CAAC,MAAM;IAC5CU,GAAG,CAACuB,KAAK,CAAC,qBAAqB,EAAEP,aAAa,CAAC;IAC/CA,aAAa,CAACyB,OAAO,CAACL,IAAI,IACxBhC,OAAO,CAACsC,UAAU,CAChB/C,WAAW,CAACyC,IAAI,CAAC,GAAGvC,SAAS,CAAC8C,QAAQ,CAACP,IAAI,CAACC,QAAQ,CAAC,GAAGD,IAAI,CAACC,QAAQ,CACtE,CACF;IACD5B,QAAQ,CAACO,aAAa,CAAC;IACvBC,gBAAgB,CAAC,EAAE,CAAC;EACtB,CAAC,EAAE,CAACD,aAAa,EAAEP,QAAQ,EAAEL,OAAO,CAAC,CAAC;EAEtC,IAAMwC,kBAAkB,GAAGtD,WAAW,CAAC,MAAM;IAC3CU,GAAG,CAACuB,KAAK,CAAC,oBAAoB,CAAC;IAC/BN,gBAAgB,CAAC,EAAE,CAAC;EACtB,CAAC,EAAE,EAAE,CAAC;EAEN,IAAM4B,UAAU,GAAGvD,WAAW,CAC5B,CAACiD,KAAwB,EAAEO,IAAY,KAAK;IAC1C,IAAMC,WAAW,GAAGlD,SAAS,CAACmD,WAAW,CACvCT,KAAK,CAACU,GAAG,CAACb,IAAI,IACZzC,WAAW,CAACyC,IAAI,CAAC,GAAGvC,SAAS,CAAC8C,QAAQ,CAACP,IAAI,CAACC,QAAQ,CAAC,GAAGD,IAAI,CAACC,QAAQ,CACtE,CACF;IAEDU,WAAW,CAACN,OAAO,CAACL,IAAI,IAAI;MAC1B,IAAMc,OAAO,GAAGrD,SAAS,CAACsD,MAAM,CAACf,IAAI,CAAC,aAC/BU,IAAI,SAAGjD,SAAS,CAACuD,WAAW,CAC7BhB,IAAI,CAACiB,SAAS,CAAC,CAAC,EAAEjB,IAAI,CAACkB,MAAM,GAAG,CAAC,CAAC,CACnC,mBACER,IAAI,SAAGjD,SAAS,CAACuD,WAAW,CAAChB,IAAI,CAAC,CAAE;MAC3ChC,OAAO,CACJmD,QAAQ,CAACnB,IAAI,EAAEc,OAAO,CAAC,CACvBM,IAAI,CAAC,MAAM;QACV;QACA;QACA9C,QAAQ,CAAC0B,IAAI,EAAEc,OAAO,CAAC;MACzB,CAAC,CAAC,CACDO,KAAK,CAACzB,WAAW,CAAC;IACvB,CAAC,CAAC;EACJ,CAAC,EACD,CAACA,WAAW,EAAEtB,QAAQ,EAAEN,OAAO,CAAC,CACjC;EAED,IAAMsD,YAAY,GAAGpE,WAAW,CAC9B,CAACqE,IAAqB,EAAEC,OAAe,KAAK;IAC1C,IAAIC,IAAI,GAAGF,IAAI,CAACtB,QAAQ;IACxB,IAAMyB,KAAK,GAAGnE,WAAW,CAACgE,IAAI,CAAC;IAC/B,IAAIG,KAAK,IAAI,CAACD,IAAI,CAACE,QAAQ,CAAC,GAAG,CAAC,EAAE;MAChCF,IAAI,aAAMA,IAAI,MAAG;IACnB;IACA,IAAIG,WAAW,aAAMnE,SAAS,CAACoE,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;IACAhE,GAAG,CAACkE,MAAM,CAAC,cAAc,EAAEL,IAAI,EAAEG,WAAW,CAAC;IAC7C5D,OAAO,CAACmD,QAAQ,CAACM,IAAI,EAAEG,WAAW,CAAC,CAACP,KAAK,CAACzB,WAAW,CAAC;IACtDtB,QAAQ,CAACmD,IAAI,EAAEG,WAAW,CAAC;EAC7B,CAAC,EACD,CAAChC,WAAW,EAAEtB,QAAQ,EAAEN,OAAO,CAAC,CACjC;EAED,IAAM+D,oBAAoB,GAAG7E,WAAW;IAAA,6BACtC,WAAO8E,UAA2B,EAAER,OAAe,EAAoB;MACrE,IAAIA,OAAO,KAAKQ,UAAU,CAACC,QAAQ,EAAE;QACnC;QACA,OAAO7D,SAAS;MAClB;MACAX,SAAS,CAACyE,YAAY,CAACV,OAAO,CAAC;MAE/B,IAAMW,QAAQ,aAAM1E,SAAS,CAAC2E,OAAO,CAACJ,UAAU,CAAC/B,QAAQ,CAAC,SAAGuB,OAAO,CAAE;MACtE,IAAI;QACF,IAAMa,QAAQ,SAASrE,OAAO,CAACsE,IAAI,CAACH,QAAQ,CAAC;QAC7C,MAAM,IAAIzE,eAAe,CAAC2E,QAAQ,CAAC;MACrC,CAAC,CAAC,OAAO7C,CAAC,EAAE;QACV,IAAI,EAAEA,CAAC,YAAY7B,iBAAiB,CAAC,EAAE;UACrC,MAAM6B,CAAC;QACT;QACA;MACF;IACF,CAAC;IAAA;MAAA;IAAA;EAAA,KACD,CAACxB,OAAO,CAAC,CACV;EAED,IAAMuE,yBAAyB,GAAG3D,aAAa,CAACsC,MAAM,GAAG,CAAC;EAC1D,IAAMsB,yBAAyB,GAAGpF,OAAO,CAAC,MAAM;IAC9C,IAAIwB,aAAa,CAACsC,MAAM,KAAK,CAAC,EAAE;MAC9B,mDAA2CtC,aAAa,CAAC,CAAC,CAAC,CAACqB,QAAQ;IACtE;IACA;EACF,CAAC,EAAE,CAACrB,aAAa,CAAC,CAAC;EAEnB,oBACE;IAAK,SAAS,EAAC,eAAe;IAAA,WAC3BE,KAAK,iBACJ,KAAC,iBAAiB;MAChB,aAAa,EAAEb,aAAc;MAC7B,WAAW,EAAEC,WAAY;MACzB,eAAe;MACf,MAAM,EAAE6B,cAAe;MACvB,cAAc,EAAED,kBAAmB;MACnC,YAAY,EAAED,gBAAiB;MAC/B,MAAM,EAAEY,UAAW;MACnB,QAAQ,EAAEP,YAAa;MACvB,QAAQ,EAAEoB,YAAa;MACvB,QAAQ,EAAE7C,QAAS;MACnB,iBAAiB,EAAEC,iBAAkB;MACrC,SAAS,EAAEC,SAAU;MACrB,KAAK,EAAEG,KAAM;MACb,cAAc,EAAEiD;IAAqB,EAExC,eACD,KAAC,UAAU;MACT,MAAM,EAAEQ,yBAA0B;MAClC,UAAU,EAAEC,yBAA0B;MACtC,QAAQ,EAAC,8BAA8B;MACvC,QAAQ,EAAEhC,kBAAmB;MAC7B,SAAS,EAAEJ,mBAAoB;MAC/B,iBAAiB,EAAC;IAAQ,EAC1B;EAAA,EACE;AAEV;AAEAtC,YAAY,CAAC2E,WAAW,GAAG,cAAc;AAEzC,eAAe3E,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","onCopy","undefined","onDelete","onRename","onCreateFile","onCreateFolder","onSelect","onSelectionChange","rowHeight","itemsToDelete","setItemsToDelete","table","setTable","initializeTable","tablePromise","initTable","debug","makeCancelable","getTable","t","close","e","isCanceled","error","cancel","handleError","handleCreateFile","handleCreateFolder","handleCopyFile","file","filename","handleDelete","files","handleDeleteConfirm","forEach","deleteFile","makePath","handleDeleteCancel","handleMove","path","filesToMove","reducePaths","map","newFile","isPath","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 onCopy?: (file: FileStorageItem) => void;\n onCreateFile?: () => void;\n onCreateFolder?: () => void;\n onDelete?: (files: FileStorageItem[]) => void;\n onRename?: (oldName: string, newName: string) => void;\n onSelect: (file: FileStorageItem, event: React.SyntheticEvent) => void;\n onSelectionChange?: (selectedItems: FileStorageItem[]) => void;\n\n /** Height of each item in the list */\n rowHeight?: number;\n}\n\n/**\n * Component that displays and allows interaction with the file system in the provided FileStorage.\n */\nexport function FileExplorer(props: FileExplorerProps): JSX.Element {\n const {\n storage,\n isMultiSelect = false,\n focusedPath,\n onCopy = () => undefined,\n onDelete = () => undefined,\n onRename = () => undefined,\n onCreateFile = () => undefined,\n onCreateFolder = () => undefined,\n onSelect,\n onSelectionChange,\n rowHeight = DEFAULT_ROW_HEIGHT,\n } = props;\n const [itemsToDelete, setItemsToDelete] = useState<FileStorageItem[]>([]);\n const [table, setTable] = useState<FileStorageTable>();\n\n useEffect(\n function initializeTable() {\n let tablePromise: CancelablePromise<FileStorageTable>;\n async function initTable(): Promise<void> {\n log.debug('initTable');\n\n tablePromise = PromiseUtils.makeCancelable(storage.getTable(), t =>\n t.close()\n );\n\n try {\n setTable(await tablePromise);\n } catch (e) {\n if (!PromiseUtils.isCanceled(e)) {\n log.error('Unable to initialize table', e);\n }\n }\n }\n initTable();\n return () => {\n tablePromise.cancel();\n };\n },\n [storage]\n );\n\n const handleError = useCallback((e: Error) => {\n if (!PromiseUtils.isCanceled(e)) {\n log.error(e);\n }\n }, []);\n\n const handleCreateFile = useCallback(() => {\n log.debug('handleCreateFile');\n onCreateFile();\n }, [onCreateFile]);\n\n const handleCreateFolder = useCallback(() => {\n log.debug('handleCreateFolder');\n onCreateFolder();\n }, [onCreateFolder]);\n\n const handleCopyFile = useCallback(\n (file: FileStorageItem) => {\n log.debug('handleCopyFile', file.filename);\n onCopy(file);\n },\n [onCopy]\n );\n\n const handleDelete = useCallback((files: FileStorageItem[]) => {\n log.debug('handleDelete, pending confirmation', files);\n setItemsToDelete(files);\n }, []);\n\n const handleDeleteConfirm = useCallback(() => {\n log.debug('handleDeleteConfirm', itemsToDelete);\n itemsToDelete.forEach(file =>\n storage.deleteFile(\n isDirectory(file) ? FileUtils.makePath(file.filename) : file.filename\n )\n );\n onDelete(itemsToDelete);\n setItemsToDelete([]);\n }, [itemsToDelete, onDelete, storage]);\n\n const handleDeleteCancel = useCallback(() => {\n log.debug('handleDeleteCancel');\n setItemsToDelete([]);\n }, []);\n\n const handleMove = useCallback(\n (files: FileStorageItem[], path: string) => {\n const filesToMove = FileUtils.reducePaths(\n files.map(file =>\n isDirectory(file) ? FileUtils.makePath(file.filename) : file.filename\n )\n );\n\n filesToMove.forEach(file => {\n const newFile = FileUtils.isPath(file)\n ? `${path}${FileUtils.getBaseName(\n file.substring(0, file.length - 1)\n )}/`\n : `${path}${FileUtils.getBaseName(file)}`;\n storage\n .moveFile(file, newFile)\n .then(() => {\n // Each moved file triggers a rename so parent knows something has happened\n // We signal each individually if for some reason there's an error moving one of the files\n onRename(file, newFile);\n })\n .catch(handleError);\n });\n },\n [handleError, onRename, storage]\n );\n\n const handleRename = useCallback(\n (item: FileStorageItem, newName: string) => {\n let name = item.filename;\n const isDir = isDirectory(item);\n if (isDir && !name.endsWith('/')) {\n name = `${name}/`;\n }\n let destination = `${FileUtils.getParent(name)}${newName}`;\n if (isDir && !destination.endsWith('/')) {\n destination = `${destination}/`;\n }\n log.debug2('handleRename', name, destination);\n storage.moveFile(name, destination).catch(handleError);\n onRename(name, destination);\n },\n [handleError, onRename, storage]\n );\n\n const handleValidateRename = useCallback(\n async (renameItem: FileStorageItem, newName: string): Promise<void> => {\n if (newName === renameItem.basename) {\n // Same name is fine\n return undefined;\n }\n FileUtils.validateName(newName);\n\n const newValue = `${FileUtils.getPath(renameItem.filename)}${newName}`;\n try {\n const fileInfo = await storage.info(newValue);\n throw new FileExistsError(fileInfo);\n } catch (e) {\n if (!(e instanceof FileNotFoundError)) {\n throw e;\n }\n // The file does not exist, fine to save at that path\n }\n },\n [storage]\n );\n\n const isDeleteConfirmationShown = itemsToDelete.length > 0;\n const deleteConfirmationMessage = useMemo(() => {\n if (itemsToDelete.length === 1) {\n return `Are you sure you want to delete \"${itemsToDelete[0].filename}\"?`;\n }\n return `Are you sure you want to delete the selected files?`;\n }, [itemsToDelete]);\n\n return (\n <div className=\"file-explorer\">\n {table && (\n <FileListContainer\n isMultiSelect={isMultiSelect}\n focusedPath={focusedPath}\n showContextMenu\n onCopy={handleCopyFile}\n onCreateFolder={handleCreateFolder}\n onCreateFile={handleCreateFile}\n onMove={handleMove}\n onDelete={handleDelete}\n onRename={handleRename}\n onSelect={onSelect}\n onSelectionChange={onSelectionChange}\n rowHeight={rowHeight}\n table={table}\n validateRename={handleValidateRename}\n />\n )}\n <BasicModal\n isOpen={isDeleteConfirmationShown}\n headerText={deleteConfirmationMessage}\n bodyText=\"You cannot undo this action.\"\n onCancel={handleDeleteCancel}\n onConfirm={handleDeleteConfirm}\n confirmButtonText=\"Delete\"\n />\n </div>\n );\n}\n\nFileExplorer.displayName = 'FileExplorer';\n\nexport default FileExplorer;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"FileListItemEditor.js","names":["React","useCallback","useEffect","useRef","useState","classNames","Log","PromiseUtils","log","module","DEFAULT_VALIDATE","Promise","resolve","FileListItemEditor","item","onCancel","onSubmit","validate","input","value","setValue","basename","validationError","setValidationError","validationPromise","setValidationPromise","focus","current","stopPropagation","e","validateAndSubmit","then","catch","info","validateValueAndSetPromise","validatePromise","makeCancelable","undefined","isCanceled","cancel","selectRange","handleBlur","debug2","handleChange","newValue","target","handleKeyDown","key"],"sources":["../src/FileListItemEditor.tsx"],"sourcesContent":["import React, {\n ChangeEvent,\n KeyboardEvent,\n MouseEvent,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport { PromiseUtils } from '@deephaven/utils';\nimport './FileListItemEditor.scss';\nimport { FileStorageItem } from './FileStorage';\n\nconst log = Log.module('FileListItemEditor');\n\nexport interface FileListItemEditorProps {\n item: FileStorageItem;\n onCancel: () => void;\n onSubmit: (newName: string) => void;\n validate?: (newName: string) => Promise<void>;\n}\n\nconst DEFAULT_VALIDATE = () => Promise.resolve();\n\nexport function FileListItemEditor({\n item,\n onCancel,\n onSubmit,\n validate = DEFAULT_VALIDATE,\n}: FileListItemEditorProps): JSX.Element {\n const input = useRef<HTMLInputElement>(null);\n const [value, setValue] = useState(item.basename);\n const [validationError, setValidationError] = useState<Error>();\n const [validationPromise, setValidationPromise] = useState<Promise<void>>(\n Promise.resolve()\n );\n\n const focus = useCallback(() => {\n input.current?.focus();\n // Select the proper range based on the type...\n }, [input]);\n\n const stopPropagation = useCallback(\n (e: MouseEvent) => e.stopPropagation(),\n []\n );\n\n const validateAndSubmit = useCallback(() => {\n validationPromise\n .then(() => {\n onSubmit(value);\n })\n .catch(e => log.info('Unable to validate name', e));\n }, [onSubmit, value, validationPromise]);\n\n useEffect(\n function validateValueAndSetPromise() {\n const validatePromise = PromiseUtils.makeCancelable(validate(value));\n validatePromise\n .then(() => setValidationError(undefined))\n .catch(e => {\n if (!PromiseUtils.isCanceled(e)) {\n setValidationError(e);\n }\n });\n setValidationPromise(validatePromise);\n return () => validatePromise.cancel();\n },\n [validate, value]\n );\n\n useEffect(\n function selectRange() {\n focus();\n },\n [focus]\n );\n\n const handleBlur = useCallback(() => {\n log.debug2('handleBlur');\n validateAndSubmit();\n }, [validateAndSubmit]);\n\n const handleChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n const { value: newValue } = e.target;\n setValue(newValue);\n }, []);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n e.stopPropagation();\n\n const { key } = e;\n switch (key) {\n case 'Enter': {\n validateAndSubmit();\n break;\n }\n case 'Escape': {\n onCancel();\n break;\n }\n default:\n }\n },\n [onCancel, validateAndSubmit]\n );\n\n return (\n <div className=\"file-list-item-editor\">\n <input\n type=\"text\"\n className={classNames('form-control file-list-item-editor-input', {\n 'is-invalid': validationError,\n })}\n value={value}\n ref={input}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onChange={handleChange}\n onClick={stopPropagation}\n onDoubleClick={stopPropagation}\n onMouseDown={stopPropagation}\n />\n\n {validationError && (\n <div className=\"invalid-feedback\">{`${validationError}`}</div>\n )}\n </div>\n );\n}\n\nexport default FileListItemEditor;\n"],"mappings":"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"}
1
+ {"version":3,"file":"FileListItemEditor.js","names":["React","useCallback","useEffect","useRef","useState","classNames","Log","PromiseUtils","log","module","DEFAULT_VALIDATE","Promise","resolve","FileListItemEditor","item","onCancel","onSubmit","validate","input","value","setValue","basename","validationError","setValidationError","validationPromise","setValidationPromise","focus","current","stopPropagation","e","validateAndSubmit","then","catch","info","validateValueAndSetPromise","validatePromise","makeCancelable","undefined","isCanceled","cancel","selectRange","handleBlur","debug2","handleChange","newValue","target","handleKeyDown","key"],"sources":["../src/FileListItemEditor.tsx"],"sourcesContent":["import React, {\n ChangeEvent,\n KeyboardEvent,\n MouseEvent,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport { PromiseUtils } from '@deephaven/utils';\nimport './FileListItemEditor.scss';\nimport { FileStorageItem } from './FileStorage';\n\nconst log = Log.module('FileListItemEditor');\n\nexport interface FileListItemEditorProps {\n item: FileStorageItem;\n onCancel: () => void;\n onSubmit: (newName: string) => void;\n validate?: (newName: string) => Promise<void>;\n}\n\nconst DEFAULT_VALIDATE = (): Promise<void> => Promise.resolve();\n\nexport function FileListItemEditor({\n item,\n onCancel,\n onSubmit,\n validate = DEFAULT_VALIDATE,\n}: FileListItemEditorProps): JSX.Element {\n const input = useRef<HTMLInputElement>(null);\n const [value, setValue] = useState(item.basename);\n const [validationError, setValidationError] = useState<Error>();\n const [validationPromise, setValidationPromise] = useState<Promise<void>>(\n Promise.resolve()\n );\n\n const focus = useCallback(() => {\n input.current?.focus();\n // Select the proper range based on the type...\n }, [input]);\n\n const stopPropagation = useCallback(\n (e: MouseEvent) => e.stopPropagation(),\n []\n );\n\n const validateAndSubmit = useCallback(() => {\n validationPromise\n .then(() => {\n onSubmit(value);\n })\n .catch(e => log.info('Unable to validate name', e));\n }, [onSubmit, value, validationPromise]);\n\n useEffect(\n function validateValueAndSetPromise() {\n const validatePromise = PromiseUtils.makeCancelable(validate(value));\n validatePromise\n .then(() => setValidationError(undefined))\n .catch(e => {\n if (!PromiseUtils.isCanceled(e)) {\n setValidationError(e);\n }\n });\n setValidationPromise(validatePromise);\n return () => validatePromise.cancel();\n },\n [validate, value]\n );\n\n useEffect(\n function selectRange() {\n focus();\n },\n [focus]\n );\n\n const handleBlur = useCallback(() => {\n log.debug2('handleBlur');\n validateAndSubmit();\n }, [validateAndSubmit]);\n\n const handleChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n const { value: newValue } = e.target;\n setValue(newValue);\n }, []);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n e.stopPropagation();\n\n const { key } = e;\n switch (key) {\n case 'Enter': {\n validateAndSubmit();\n break;\n }\n case 'Escape': {\n onCancel();\n break;\n }\n default:\n }\n },\n [onCancel, validateAndSubmit]\n );\n\n return (\n <div className=\"file-list-item-editor\">\n <input\n type=\"text\"\n className={classNames('form-control file-list-item-editor-input', {\n 'is-invalid': validationError,\n })}\n value={value}\n ref={input}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onChange={handleChange}\n onClick={stopPropagation}\n onDoubleClick={stopPropagation}\n onMouseDown={stopPropagation}\n />\n\n {validationError && (\n <div className=\"invalid-feedback\">{`${validationError}`}</div>\n )}\n </div>\n );\n}\n\nexport default FileListItemEditor;\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { DirectoryStorageItem, FileStorageItem } from './FileStorage';
1
+ import type { DirectoryStorageItem, FileStorageItem } from './FileStorage';
2
2
  /**
3
3
  * Make a file name with prefix 'testfile'
4
4
  * @param index Number of the file
@@ -1 +1 @@
1
- {"version":3,"file":"FileTestUtils.d.ts","sourceRoot":"","sources":["../src/FileTestUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEtE;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,SAAI,GAAG,MAAM,CAE9C;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,SAAI,GAAG,MAAM,CAE7C;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,SAAM,GAAG,eAAe,CAQtE;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,SAAI,qBAMlC;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,IAAI,SAAM,GACT,oBAAoB,CAStB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,SAAI,0BAMxC;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,EAAE,MAAM,GACd,eAAe,CAKjB;;;;;;;;;;AAED,wBAQE"}
1
+ {"version":3,"file":"FileTestUtils.d.ts","sourceRoot":"","sources":["../src/FileTestUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE3E;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,SAAI,GAAG,MAAM,CAE9C;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,SAAI,GAAG,MAAM,CAE7C;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,SAAM,GAAG,eAAe,CAQtE;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,SAAI,GAAG,eAAe,EAAE,CAMtD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,IAAI,SAAM,GACT,oBAAoB,CAStB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,SAAI,GAAG,oBAAoB,EAAE,CAMjE;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,EAAE,MAAM,GACd,eAAe,CAKjB;;;;;;;;;;AAED,wBAQE"}
@@ -1 +1 @@
1
- {"version":3,"file":"FileTestUtils.js","names":["makeFileName","index","makeDirName","makeFile","basename","path","filename","type","id","makeFiles","count","result","i","push","makeDirectory","isExpanded","makeDirectories","makeNested","directories","fileNum","map","directory","join"],"sources":["../src/FileTestUtils.ts"],"sourcesContent":["import { DirectoryStorageItem, FileStorageItem } from './FileStorage';\n\n/**\n * Make a file name with prefix 'testfile'\n * @param index Number of the file\n * @returns A string with prefix 'testfile' followed by index\n */\nexport function makeFileName(index = 0): string {\n return `testfile${index}`;\n}\n\n/**\n * Make a directory name with prefix 'testdir'\n * @param index Number of the directory\n * @returns A string with prefix 'testdir' followed by index\n */\nexport function makeDirName(index = 0): string {\n return `testdir${index}`;\n}\n\n/**\n * Make a file object\n * @param basename The basename of the file\n * @param path The path of the file\n * @returns A FileStorageItem object\n */\nexport function makeFile(basename: string, path = '/'): FileStorageItem {\n const filename = `${path}${basename}`;\n return {\n basename,\n filename,\n type: 'file',\n id: filename,\n };\n}\n\n/**\n * Make files from 0 to and not including count\n * @param count The number of files to create (0 to count - 1). Defaults to 5\n * @returns An array of FileStorageItems\n */\nexport function makeFiles(count = 5) {\n const result: FileStorageItem[] = [];\n for (let i = 0; i < count; i += 1) {\n result.push(makeFile(makeFileName(i)));\n }\n return result;\n}\n\n/**\n * Make a directory object\n * @param basename The basename of the directory\n * @param path The path of the directory\n * @returns A DirectoryStorageItem object\n */\nexport function makeDirectory(\n basename: string,\n path = '/'\n): DirectoryStorageItem {\n const filename = `${path}${basename}`;\n return {\n basename,\n filename,\n type: 'directory',\n id: filename,\n isExpanded: false,\n };\n}\n\n/**\n * Make directories from 0 to and not including count\n * @param count The number of directories to create (0 to count - 1). Defaults to 5\n * @returns An array of DirectoryStorageItems\n */\nexport function makeDirectories(count = 5) {\n const result: DirectoryStorageItem[] = [];\n for (let i = 0; i < count; i += 1) {\n result.push(makeDirectory(`testdir${i}`));\n }\n return result;\n}\n\n/**\n * Make a nested file\n * @param directories The nested directories in order\n * @param fileNum Number of the file\n * @returns A FileStorageItem\n */\nexport function makeNested(\n directories: number[],\n fileNum: number\n): FileStorageItem {\n const basename = `/${directories\n .map(directory => makeDirName(directory))\n .join('/')}/`;\n return makeFile(makeFileName(fileNum), basename);\n}\n\nexport default {\n makeFileName,\n makeFile,\n makeFiles,\n makeDirName,\n makeDirectory,\n makeDirectories,\n makeNested,\n};\n"],"mappings":"AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,YAAY,GAAoB;EAAA,IAAnBC,KAAK,uEAAG,CAAC;EACpC,yBAAkBA,KAAK;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,WAAW,GAAoB;EAAA,IAAnBD,KAAK,uEAAG,CAAC;EACnC,wBAAiBA,KAAK;AACxB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,QAAQ,CAACC,QAAgB,EAA+B;EAAA,IAA7BC,IAAI,uEAAG,GAAG;EACnD,IAAMC,QAAQ,aAAMD,IAAI,SAAGD,QAAQ,CAAE;EACrC,OAAO;IACLA,QAAQ;IACRE,QAAQ;IACRC,IAAI,EAAE,MAAM;IACZC,EAAE,EAAEF;EACN,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASG,SAAS,GAAY;EAAA,IAAXC,KAAK,uEAAG,CAAC;EACjC,IAAMC,MAAyB,GAAG,EAAE;EACpC,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,KAAK,EAAEE,CAAC,IAAI,CAAC,EAAE;IACjCD,MAAM,CAACE,IAAI,CAACV,QAAQ,CAACH,YAAY,CAACY,CAAC,CAAC,CAAC,CAAC;EACxC;EACA,OAAOD,MAAM;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASG,aAAa,CAC3BV,QAAgB,EAEM;EAAA,IADtBC,IAAI,uEAAG,GAAG;EAEV,IAAMC,QAAQ,aAAMD,IAAI,SAAGD,QAAQ,CAAE;EACrC,OAAO;IACLA,QAAQ;IACRE,QAAQ;IACRC,IAAI,EAAE,WAAW;IACjBC,EAAE,EAAEF,QAAQ;IACZS,UAAU,EAAE;EACd,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,eAAe,GAAY;EAAA,IAAXN,KAAK,uEAAG,CAAC;EACvC,IAAMC,MAA8B,GAAG,EAAE;EACzC,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,KAAK,EAAEE,CAAC,IAAI,CAAC,EAAE;IACjCD,MAAM,CAACE,IAAI,CAACC,aAAa,kBAAWF,CAAC,EAAG,CAAC;EAC3C;EACA,OAAOD,MAAM;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASM,UAAU,CACxBC,WAAqB,EACrBC,OAAe,EACE;EACjB,IAAMf,QAAQ,cAAOc,WAAW,CAC7BE,GAAG,CAACC,SAAS,IAAInB,WAAW,CAACmB,SAAS,CAAC,CAAC,CACxCC,IAAI,CAAC,GAAG,CAAC,MAAG;EACf,OAAOnB,QAAQ,CAACH,YAAY,CAACmB,OAAO,CAAC,EAAEf,QAAQ,CAAC;AAClD;AAEA,eAAe;EACbJ,YAAY;EACZG,QAAQ;EACRM,SAAS;EACTP,WAAW;EACXY,aAAa;EACbE,eAAe;EACfC;AACF,CAAC"}
1
+ {"version":3,"file":"FileTestUtils.js","names":["makeFileName","index","makeDirName","makeFile","basename","path","filename","type","id","makeFiles","count","result","i","push","makeDirectory","isExpanded","makeDirectories","makeNested","directories","fileNum","map","directory","join"],"sources":["../src/FileTestUtils.ts"],"sourcesContent":["import type { DirectoryStorageItem, FileStorageItem } from './FileStorage';\n\n/**\n * Make a file name with prefix 'testfile'\n * @param index Number of the file\n * @returns A string with prefix 'testfile' followed by index\n */\nexport function makeFileName(index = 0): string {\n return `testfile${index}`;\n}\n\n/**\n * Make a directory name with prefix 'testdir'\n * @param index Number of the directory\n * @returns A string with prefix 'testdir' followed by index\n */\nexport function makeDirName(index = 0): string {\n return `testdir${index}`;\n}\n\n/**\n * Make a file object\n * @param basename The basename of the file\n * @param path The path of the file\n * @returns A FileStorageItem object\n */\nexport function makeFile(basename: string, path = '/'): FileStorageItem {\n const filename = `${path}${basename}`;\n return {\n basename,\n filename,\n type: 'file',\n id: filename,\n };\n}\n\n/**\n * Make files from 0 to and not including count\n * @param count The number of files to create (0 to count - 1). Defaults to 5\n * @returns An array of FileStorageItems\n */\nexport function makeFiles(count = 5): FileStorageItem[] {\n const result: FileStorageItem[] = [];\n for (let i = 0; i < count; i += 1) {\n result.push(makeFile(makeFileName(i)));\n }\n return result;\n}\n\n/**\n * Make a directory object\n * @param basename The basename of the directory\n * @param path The path of the directory\n * @returns A DirectoryStorageItem object\n */\nexport function makeDirectory(\n basename: string,\n path = '/'\n): DirectoryStorageItem {\n const filename = `${path}${basename}`;\n return {\n basename,\n filename,\n type: 'directory',\n id: filename,\n isExpanded: false,\n };\n}\n\n/**\n * Make directories from 0 to and not including count\n * @param count The number of directories to create (0 to count - 1). Defaults to 5\n * @returns An array of DirectoryStorageItems\n */\nexport function makeDirectories(count = 5): DirectoryStorageItem[] {\n const result: DirectoryStorageItem[] = [];\n for (let i = 0; i < count; i += 1) {\n result.push(makeDirectory(`testdir${i}`));\n }\n return result;\n}\n\n/**\n * Make a nested file\n * @param directories The nested directories in order\n * @param fileNum Number of the file\n * @returns A FileStorageItem\n */\nexport function makeNested(\n directories: number[],\n fileNum: number\n): FileStorageItem {\n const basename = `/${directories\n .map(directory => makeDirName(directory))\n .join('/')}/`;\n return makeFile(makeFileName(fileNum), basename);\n}\n\nexport default {\n makeFileName,\n makeFile,\n makeFiles,\n makeDirName,\n makeDirectory,\n makeDirectories,\n makeNested,\n};\n"],"mappings":"AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,YAAY,GAAoB;EAAA,IAAnBC,KAAK,uEAAG,CAAC;EACpC,yBAAkBA,KAAK;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,WAAW,GAAoB;EAAA,IAAnBD,KAAK,uEAAG,CAAC;EACnC,wBAAiBA,KAAK;AACxB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,QAAQ,CAACC,QAAgB,EAA+B;EAAA,IAA7BC,IAAI,uEAAG,GAAG;EACnD,IAAMC,QAAQ,aAAMD,IAAI,SAAGD,QAAQ,CAAE;EACrC,OAAO;IACLA,QAAQ;IACRE,QAAQ;IACRC,IAAI,EAAE,MAAM;IACZC,EAAE,EAAEF;EACN,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASG,SAAS,GAA+B;EAAA,IAA9BC,KAAK,uEAAG,CAAC;EACjC,IAAMC,MAAyB,GAAG,EAAE;EACpC,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,KAAK,EAAEE,CAAC,IAAI,CAAC,EAAE;IACjCD,MAAM,CAACE,IAAI,CAACV,QAAQ,CAACH,YAAY,CAACY,CAAC,CAAC,CAAC,CAAC;EACxC;EACA,OAAOD,MAAM;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASG,aAAa,CAC3BV,QAAgB,EAEM;EAAA,IADtBC,IAAI,uEAAG,GAAG;EAEV,IAAMC,QAAQ,aAAMD,IAAI,SAAGD,QAAQ,CAAE;EACrC,OAAO;IACLA,QAAQ;IACRE,QAAQ;IACRC,IAAI,EAAE,WAAW;IACjBC,EAAE,EAAEF,QAAQ;IACZS,UAAU,EAAE;EACd,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,eAAe,GAAoC;EAAA,IAAnCN,KAAK,uEAAG,CAAC;EACvC,IAAMC,MAA8B,GAAG,EAAE;EACzC,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,KAAK,EAAEE,CAAC,IAAI,CAAC,EAAE;IACjCD,MAAM,CAACE,IAAI,CAACC,aAAa,kBAAWF,CAAC,EAAG,CAAC;EAC3C;EACA,OAAOD,MAAM;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASM,UAAU,CACxBC,WAAqB,EACrBC,OAAe,EACE;EACjB,IAAMf,QAAQ,cAAOc,WAAW,CAC7BE,GAAG,CAACC,SAAS,IAAInB,WAAW,CAACmB,SAAS,CAAC,CAAC,CACxCC,IAAI,CAAC,GAAG,CAAC,MAAG;EACf,OAAOnB,QAAQ,CAACH,YAAY,CAACmB,OAAO,CAAC,EAAEf,QAAQ,CAAC;AAClD;AAEA,eAAe;EACbJ,YAAY;EACZG,QAAQ;EACRM,SAAS;EACTP,WAAW;EACXY,aAAa;EACbE,eAAe;EACfC;AACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deephaven/file-explorer",
3
- "version": "0.48.0",
3
+ "version": "0.48.1-beta.1+32e6d208",
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.48.0",
26
- "@deephaven/icons": "^0.48.0",
27
- "@deephaven/log": "^0.48.0",
28
- "@deephaven/storage": "^0.48.0",
29
- "@deephaven/utils": "^0.48.0",
25
+ "@deephaven/components": "^0.48.1-beta.1+32e6d208",
26
+ "@deephaven/icons": "^0.48.1-beta.1+32e6d208",
27
+ "@deephaven/log": "^0.48.1-beta.1+32e6d208",
28
+ "@deephaven/storage": "^0.48.1-beta.1+32e6d208",
29
+ "@deephaven/utils": "^0.48.1-beta.1+32e6d208",
30
30
  "@fortawesome/fontawesome-svg-core": "^6.2.1",
31
31
  "@fortawesome/react-fontawesome": "^0.2.0",
32
32
  "classnames": "^2.3.1",
@@ -37,7 +37,7 @@
37
37
  "react": "^17.0.0"
38
38
  },
39
39
  "devDependencies": {
40
- "@deephaven/mocks": "^0.48.0"
40
+ "@deephaven/mocks": "^0.48.1-beta.1+32e6d208"
41
41
  },
42
42
  "files": [
43
43
  "dist"
@@ -48,5 +48,5 @@
48
48
  "publishConfig": {
49
49
  "access": "public"
50
50
  },
51
- "gitHead": "302d1c2f1af98161da2931ac3413f14938deb257"
51
+ "gitHead": "32e6d208d0977092f315caa122b8ab23f0fc110a"
52
52
  }