@deephaven/file-explorer 1.7.2-beta.1 → 1.7.2-react-18-alpha.3

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":"FileExistsError.js","names":["ValidationError","FileExistsError","constructor","info","_defineProperty"],"sources":["../src/FileExistsError.ts"],"sourcesContent":["import { ValidationError } from '@deephaven/utils';\nimport { type FileStorageItem } from './FileStorage';\n\nclass FileExistsError extends ValidationError {\n isExistingFile = true;\n\n info: FileStorageItem;\n\n constructor(info: FileStorageItem) {\n super('Name already exists');\n this.info = info;\n }\n}\n\nexport default FileExistsError;\n"],"mappings":";;;AAAA,SAASA,eAAe,QAAQ,kBAAkB;AAGlD,MAAMC,eAAe,SAASD,eAAe,CAAC;EAK5CE,WAAWA,CAACC,IAAqB,EAAE;IACjC,KAAK,CAAC,qBAAqB,CAAC;IAACC,eAAA,yBALd,IAAI;IAAAA,eAAA;IAMnB,IAAI,CAACD,IAAI,GAAGA,IAAI;EAClB;AACF;AAEA,eAAeF,eAAe"}
1
+ {"version":3,"file":"FileExistsError.js","names":["ValidationError","FileExistsError","constructor","info","_defineProperty"],"sources":["../src/FileExistsError.ts"],"sourcesContent":["import { ValidationError } from '@deephaven/utils';\nimport { type FileStorageItem } from './FileStorage';\n\nclass FileExistsError extends ValidationError {\n isExistingFile = true;\n\n info: FileStorageItem;\n\n constructor(info: FileStorageItem) {\n super('Name already exists');\n this.info = info;\n }\n}\n\nexport default FileExistsError;\n"],"mappings":";;;AAAA,SAASA,eAAe,QAAQ,kBAAkB;AAGlD,MAAMC,eAAe,SAASD,eAAe,CAAC;EAK5CE,WAAWA,CAACC,IAAqB,EAAE;IACjC,KAAK,CAAC,qBAAqB,CAAC;IAACC,eAAA,yBALd,IAAI;IAAAA,eAAA;IAMnB,IAAI,CAACD,IAAI,GAAGA,IAAI;EAClB;AACF;AAEA,eAAeF,eAAe","ignoreList":[]}
@@ -11,8 +11,7 @@ import FileListContainer from "./FileListContainer.js";
11
11
  import FileUtils from "./FileUtils.js";
12
12
  import FileExistsError from "./FileExistsError.js";
13
13
  import FileNotFoundError from "./FileNotFoundError.js";
14
- import { jsx as _jsx } from "react/jsx-runtime";
15
- import { jsxs as _jsxs } from "react/jsx-runtime";
14
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
16
15
  var log = Log.module('FileExplorer');
17
16
  /**
18
17
  * Component that displays and allows interaction with the file system in the provided FileStorage.
@@ -113,7 +112,7 @@ export function FileExplorer(props) {
113
112
  storage.moveFile(name, destination).catch(handleError);
114
113
  onRename(name, destination);
115
114
  }, [handleError, onRename, storage]);
116
- var handleValidateRename = useCallback( /*#__PURE__*/function () {
115
+ var handleValidateRename = useCallback(/*#__PURE__*/function () {
117
116
  var _ref = _asyncToGenerator(function* (renameItem, newName) {
118
117
  if (newName === renameItem.basename) {
119
118
  // Same name is fine
@@ -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","jsx","_jsx","jsxs","_jsxs","log","module","FileExplorer","props","storage","isMultiSelect","focusedPath","onCopy","undefined","onDelete","onRename","onCreateFile","onCreateFolder","onSelect","onSelectionChange","rowHeight","itemsToDelete","setItemsToDelete","table","setTable","initializeTable","tablePromise","initTable","_initTable","apply","arguments","_asyncToGenerator","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","concat","getBaseName","substring","length","moveFile","then","catch","handleRename","item","newName","name","isDir","endsWith","destination","getParent","debug2","handleValidateRename","_ref","renameItem","basename","validateName","newValue","getPath","fileInfo","info","_x","_x2","isDeleteConfirmationShown","deleteConfirmationMessage","className","children","showContextMenu","onMove","validateRename","isOpen","headerText","bodyText","onCancel","onConfirm","confirmButtonText","displayName"],"sources":["../src/FileExplorer.tsx"],"sourcesContent":["import { BasicModal } from '@deephaven/components';\nimport Log from '@deephaven/log';\nimport { type CancelablePromise, PromiseUtils } from '@deephaven/utils';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { DEFAULT_ROW_HEIGHT } from './FileListUtils';\nimport {\n type FileStorageItem,\n type FileStorageTable,\n isDirectory,\n} from './FileStorage';\nimport type FileStorage 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":";;AAAA,SAASA,UAAU,QAAQ,uBAAuB;AAClD,OAAOC,GAAG,MAAM,gBAAgB;AAChC,SAAiCC,YAAY,QAAQ,kBAAkB;AACvE,OAAOC,KAAK,IAAIC,WAAW,EAAEC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AAAC,SAChEC,kBAAkB;AAAA,SAIzBC,WAAW;AAAA;AAAA,OAINC,iBAAiB;AAAA,OACjBC,SAAS;AAAA,OACTC,eAAe;AAAA,OACfC,iBAAiB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAExB,IAAMC,GAAG,GAAGjB,GAAG,CAACkB,MAAM,CAAC,cAAc,CAAC;AAoBtC;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAACC,KAAwB,EAAe;EAClE,IAAM;IACJC,OAAO;IACPC,aAAa,GAAG,KAAK;IACrBC,WAAW;IACXC,MAAM,GAAGA,CAAA,KAAMC,SAAS;IACxBC,QAAQ,GAAGA,CAAA,KAAMD,SAAS;IAC1BE,QAAQ,GAAGA,CAAA,KAAMF,SAAS;IAC1BG,YAAY,GAAGA,CAAA,KAAMH,SAAS;IAC9BI,cAAc,GAAGA,CAAA,KAAMJ,SAAS;IAChCK,QAAQ;IACRC,iBAAiB;IACjBC,SAAS,GAAGzB;EACd,CAAC,GAAGa,KAAK;EACT,IAAM,CAACa,aAAa,EAAEC,gBAAgB,CAAC,GAAG5B,QAAQ,CAAoB,EAAE,CAAC;EACzE,IAAM,CAAC6B,KAAK,EAAEC,QAAQ,CAAC,GAAG9B,QAAQ,CAAmB,CAAC;EAEtDF,SAAS,CACP,SAASiC,eAAeA,CAAA,EAAG;IACzB,IAAIC,YAAiD;IAAC,SACvCC,SAASA,CAAA;MAAA,OAAAC,UAAA,CAAAC,KAAA,OAAAC,SAAA;IAAA;IAAA,SAAAF,WAAA;MAAAA,UAAA,GAAAG,iBAAA,CAAxB,aAA0C;QACxC1B,GAAG,CAAC2B,KAAK,CAAC,WAAW,CAAC;QAEtBN,YAAY,GAAGrC,YAAY,CAAC4C,cAAc,CAACxB,OAAO,CAACyB,QAAQ,CAAC,CAAC,EAAEC,CAAC,IAC9DA,CAAC,CAACC,KAAK,CAAC,CACV,CAAC;QAED,IAAI;UACFZ,QAAQ,OAAOE,YAAY,CAAC;QAC9B,CAAC,CAAC,OAAOW,CAAC,EAAE;UACV,IAAI,CAAChD,YAAY,CAACiD,UAAU,CAACD,CAAC,CAAC,EAAE;YAC/BhC,GAAG,CAACkC,KAAK,CAAC,4BAA4B,EAAEF,CAAC,CAAC;UAC5C;QACF;MACF,CAAC;MAAA,OAAAT,UAAA,CAAAC,KAAA,OAAAC,SAAA;IAAA;IACDH,SAAS,CAAC,CAAC;IACX,OAAO,MAAM;MACXD,YAAY,CAACc,MAAM,CAAC,CAAC;IACvB,CAAC;EACH,CAAC,EACD,CAAC/B,OAAO,CACV,CAAC;EAED,IAAMgC,WAAW,GAAGlD,WAAW,CAAE8C,CAAQ,IAAK;IAC5C,IAAI,CAAChD,YAAY,CAACiD,UAAU,CAACD,CAAC,CAAC,EAAE;MAC/BhC,GAAG,CAACkC,KAAK,CAACF,CAAC,CAAC;IACd;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMK,gBAAgB,GAAGnD,WAAW,CAAC,MAAM;IACzCc,GAAG,CAAC2B,KAAK,CAAC,kBAAkB,CAAC;IAC7BhB,YAAY,CAAC,CAAC;EAChB,CAAC,EAAE,CAACA,YAAY,CAAC,CAAC;EAElB,IAAM2B,kBAAkB,GAAGpD,WAAW,CAAC,MAAM;IAC3Cc,GAAG,CAAC2B,KAAK,CAAC,oBAAoB,CAAC;IAC/Bf,cAAc,CAAC,CAAC;EAClB,CAAC,EAAE,CAACA,cAAc,CAAC,CAAC;EAEpB,IAAM2B,cAAc,GAAGrD,WAAW,CAC/BsD,IAAqB,IAAK;IACzBxC,GAAG,CAAC2B,KAAK,CAAC,gBAAgB,EAAEa,IAAI,CAACC,QAAQ,CAAC;IAC1ClC,MAAM,CAACiC,IAAI,CAAC;EACd,CAAC,EACD,CAACjC,MAAM,CACT,CAAC;EAED,IAAMmC,YAAY,GAAGxD,WAAW,CAAEyD,KAAwB,IAAK;IAC7D3C,GAAG,CAAC2B,KAAK,CAAC,oCAAoC,EAAEgB,KAAK,CAAC;IACtD1B,gBAAgB,CAAC0B,KAAK,CAAC;EACzB,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMC,mBAAmB,GAAG1D,WAAW,CAAC,MAAM;IAC5Cc,GAAG,CAAC2B,KAAK,CAAC,qBAAqB,EAAEX,aAAa,CAAC;IAC/CA,aAAa,CAAC6B,OAAO,CAACL,IAAI,IACxBpC,OAAO,CAAC0C,UAAU,CAChBvD,WAAW,CAACiD,IAAI,CAAC,GAAG/C,SAAS,CAACsD,QAAQ,CAACP,IAAI,CAACC,QAAQ,CAAC,GAAGD,IAAI,CAACC,QAC/D,CACF,CAAC;IACDhC,QAAQ,CAACO,aAAa,CAAC;IACvBC,gBAAgB,CAAC,EAAE,CAAC;EACtB,CAAC,EAAE,CAACD,aAAa,EAAEP,QAAQ,EAAEL,OAAO,CAAC,CAAC;EAEtC,IAAM4C,kBAAkB,GAAG9D,WAAW,CAAC,MAAM;IAC3Cc,GAAG,CAAC2B,KAAK,CAAC,oBAAoB,CAAC;IAC/BV,gBAAgB,CAAC,EAAE,CAAC;EACtB,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMgC,UAAU,GAAG/D,WAAW,CAC5B,CAACyD,KAAwB,EAAEO,IAAY,KAAK;IAC1C,IAAMC,WAAW,GAAG1D,SAAS,CAAC2D,WAAW,CACvCT,KAAK,CAACU,GAAG,CAACb,IAAI,IACZjD,WAAW,CAACiD,IAAI,CAAC,GAAG/C,SAAS,CAACsD,QAAQ,CAACP,IAAI,CAACC,QAAQ,CAAC,GAAGD,IAAI,CAACC,QAC/D,CACF,CAAC;IAEDU,WAAW,CAACN,OAAO,CAACL,IAAI,IAAI;MAC1B,IAAMc,OAAO,GAAG7D,SAAS,CAAC8D,MAAM,CAACf,IAAI,CAAC,MAAAgB,MAAA,CAC/BN,IAAI,EAAAM,MAAA,CAAG/D,SAAS,CAACgE,WAAW,CAC7BjB,IAAI,CAACkB,SAAS,CAAC,CAAC,EAAElB,IAAI,CAACmB,MAAM,GAAG,CAAC,CACnC,CAAC,YAAAH,MAAA,CACEN,IAAI,EAAAM,MAAA,CAAG/D,SAAS,CAACgE,WAAW,CAACjB,IAAI,CAAC,CAAE;MAC3CpC,OAAO,CACJwD,QAAQ,CAACpB,IAAI,EAAEc,OAAO,CAAC,CACvBO,IAAI,CAAC,MAAM;QACV;QACA;QACAnD,QAAQ,CAAC8B,IAAI,EAAEc,OAAO,CAAC;MACzB,CAAC,CAAC,CACDQ,KAAK,CAAC1B,WAAW,CAAC;IACvB,CAAC,CAAC;EACJ,CAAC,EACD,CAACA,WAAW,EAAE1B,QAAQ,EAAEN,OAAO,CACjC,CAAC;EAED,IAAM2D,YAAY,GAAG7E,WAAW,CAC9B,CAAC8E,IAAqB,EAAEC,OAAe,KAAK;IAC1C,IAAIC,IAAI,GAAGF,IAAI,CAACvB,QAAQ;IACxB,IAAM0B,KAAK,GAAG5E,WAAW,CAACyE,IAAI,CAAC;IAC/B,IAAIG,KAAK,IAAI,CAACD,IAAI,CAACE,QAAQ,CAAC,GAAG,CAAC,EAAE;MAChCF,IAAI,MAAAV,MAAA,CAAMU,IAAI,MAAG;IACnB;IACA,IAAIG,WAAW,MAAAb,MAAA,CAAM/D,SAAS,CAAC6E,SAAS,CAACJ,IAAI,CAAC,EAAAV,MAAA,CAAGS,OAAO,CAAE;IAC1D,IAAIE,KAAK,IAAI,CAACE,WAAW,CAACD,QAAQ,CAAC,GAAG,CAAC,EAAE;MACvCC,WAAW,MAAAb,MAAA,CAAMa,WAAW,MAAG;IACjC;IACArE,GAAG,CAACuE,MAAM,CAAC,cAAc,EAAEL,IAAI,EAAEG,WAAW,CAAC;IAC7CjE,OAAO,CAACwD,QAAQ,CAACM,IAAI,EAAEG,WAAW,CAAC,CAACP,KAAK,CAAC1B,WAAW,CAAC;IACtD1B,QAAQ,CAACwD,IAAI,EAAEG,WAAW,CAAC;EAC7B,CAAC,EACD,CAACjC,WAAW,EAAE1B,QAAQ,EAAEN,OAAO,CACjC,CAAC;EAED,IAAMoE,oBAAoB,GAAGtF,WAAW;IAAA,IAAAuF,IAAA,GAAA/C,iBAAA,CACtC,WAAOgD,UAA2B,EAAET,OAAe,EAAoB;MACrE,IAAIA,OAAO,KAAKS,UAAU,CAACC,QAAQ,EAAE;QACnC;QACA,OAAOnE,SAAS;MAClB;MACAf,SAAS,CAACmF,YAAY,CAACX,OAAO,CAAC;MAE/B,IAAMY,QAAQ,MAAArB,MAAA,CAAM/D,SAAS,CAACqF,OAAO,CAACJ,UAAU,CAACjC,QAAQ,CAAC,EAAAe,MAAA,CAAGS,OAAO,CAAE;MACtE,IAAI;QACF,IAAMc,QAAQ,SAAS3E,OAAO,CAAC4E,IAAI,CAACH,QAAQ,CAAC;QAC7C,MAAM,IAAInF,eAAe,CAACqF,QAAQ,CAAC;MACrC,CAAC,CAAC,OAAO/C,CAAC,EAAE;QACV,IAAI,EAAEA,CAAC,YAAYrC,iBAAiB,CAAC,EAAE;UACrC,MAAMqC,CAAC;QACT;QACA;MACF;IACF,CAAC;IAAA,iBAAAiD,EAAA,EAAAC,GAAA;MAAA,OAAAT,IAAA,CAAAjD,KAAA,OAAAC,SAAA;IAAA;EAAA,KACD,CAACrB,OAAO,CACV,CAAC;EAED,IAAM+E,yBAAyB,GAAGnE,aAAa,CAAC2C,MAAM,GAAG,CAAC;EAC1D,IAAMyB,yBAAyB,GAAGhG,OAAO,CAAC,MAAM;IAC9C,IAAI4B,aAAa,CAAC2C,MAAM,KAAK,CAAC,EAAE;MAC9B,4CAAAH,MAAA,CAA2CxC,aAAa,CAAC,CAAC,CAAC,CAACyB,QAAQ;IACtE;IACA;EACF,CAAC,EAAE,CAACzB,aAAa,CAAC,CAAC;EAEnB,oBACEjB,KAAA;IAAKsF,SAAS,EAAC,eAAe;IAAAC,QAAA,GAC3BpE,KAAK,iBACJrB,IAAA,CAACL,iBAAiB;MAChBa,aAAa,EAAEA,aAAc;MAC7BC,WAAW,EAAEA,WAAY;MACzBiF,eAAe;MACfhF,MAAM,EAAEgC,cAAe;MACvB3B,cAAc,EAAE0B,kBAAmB;MACnC3B,YAAY,EAAE0B,gBAAiB;MAC/BmD,MAAM,EAAEvC,UAAW;MACnBxC,QAAQ,EAAEiC,YAAa;MACvBhC,QAAQ,EAAEqD,YAAa;MACvBlD,QAAQ,EAAEA,QAAS;MACnBC,iBAAiB,EAAEA,iBAAkB;MACrCC,SAAS,EAAEA,SAAU;MACrBG,KAAK,EAAEA,KAAM;MACbuE,cAAc,EAAEjB;IAAqB,CACtC,CACF,eACD3E,IAAA,CAACf,UAAU;MACT4G,MAAM,EAAEP,yBAA0B;MAClCQ,UAAU,EAAEP,yBAA0B;MACtCQ,QAAQ,EAAC,8BAA8B;MACvCC,QAAQ,EAAE7C,kBAAmB;MAC7B8C,SAAS,EAAElD,mBAAoB;MAC/BmD,iBAAiB,EAAC;IAAQ,CAC3B,CAAC;EAAA,CACC,CAAC;AAEV;AAEA7F,YAAY,CAAC8F,WAAW,GAAG,cAAc;AAEzC,eAAe9F,YAAY"}
1
+ {"version":3,"file":"FileExplorer.js","names":["BasicModal","Log","PromiseUtils","React","useCallback","useEffect","useMemo","useState","DEFAULT_ROW_HEIGHT","isDirectory","FileListContainer","FileUtils","FileExistsError","FileNotFoundError","jsx","_jsx","jsxs","_jsxs","log","module","FileExplorer","props","storage","isMultiSelect","focusedPath","onCopy","undefined","onDelete","onRename","onCreateFile","onCreateFolder","onSelect","onSelectionChange","rowHeight","itemsToDelete","setItemsToDelete","table","setTable","initializeTable","tablePromise","initTable","_initTable","apply","arguments","_asyncToGenerator","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","concat","getBaseName","substring","length","moveFile","then","catch","handleRename","item","newName","name","isDir","endsWith","destination","getParent","debug2","handleValidateRename","_ref","renameItem","basename","validateName","newValue","getPath","fileInfo","info","_x","_x2","isDeleteConfirmationShown","deleteConfirmationMessage","className","children","showContextMenu","onMove","validateRename","isOpen","headerText","bodyText","onCancel","onConfirm","confirmButtonText","displayName"],"sources":["../src/FileExplorer.tsx"],"sourcesContent":["import { BasicModal } from '@deephaven/components';\nimport Log from '@deephaven/log';\nimport { type CancelablePromise, PromiseUtils } from '@deephaven/utils';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { DEFAULT_ROW_HEIGHT } from './FileListUtils';\nimport {\n type FileStorageItem,\n type FileStorageTable,\n isDirectory,\n} from './FileStorage';\nimport type FileStorage 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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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"FileExplorerShortcuts.js","names":["ShortcutRegistry","KEY","MODIFIER","FILE_EXPLORER","name","DELETE","createAndAdd","id","shortcut","macShortcut","CMD","BACKSPACE","RENAME","ENTER"],"sources":["../src/FileExplorerShortcuts.ts"],"sourcesContent":["import { ShortcutRegistry, KEY, MODIFIER } from '@deephaven/components';\n\nconst FILE_EXPLORER = {\n name: 'File Explorer',\n DELETE: ShortcutRegistry.createAndAdd({\n id: 'FILE_EXPLORER.DELETE',\n name: 'Delete',\n shortcut: [KEY.DELETE],\n macShortcut: [MODIFIER.CMD, KEY.BACKSPACE],\n }),\n RENAME: ShortcutRegistry.createAndAdd({\n id: 'FILE_EXPLORER.RENAME',\n name: 'Rename',\n shortcut: [KEY.ENTER],\n macShortcut: [KEY.ENTER],\n }),\n};\n\nexport default {\n FILE_EXPLORER,\n};\n"],"mappings":"AAAA,SAASA,gBAAgB,EAAEC,GAAG,EAAEC,QAAQ,QAAQ,uBAAuB;AAEvE,IAAMC,aAAa,GAAG;EACpBC,IAAI,EAAE,eAAe;EACrBC,MAAM,EAAEL,gBAAgB,CAACM,YAAY,CAAC;IACpCC,EAAE,EAAE,sBAAsB;IAC1BH,IAAI,EAAE,QAAQ;IACdI,QAAQ,EAAE,CAACP,GAAG,CAACI,MAAM,CAAC;IACtBI,WAAW,EAAE,CAACP,QAAQ,CAACQ,GAAG,EAAET,GAAG,CAACU,SAAS;EAC3C,CAAC,CAAC;EACFC,MAAM,EAAEZ,gBAAgB,CAACM,YAAY,CAAC;IACpCC,EAAE,EAAE,sBAAsB;IAC1BH,IAAI,EAAE,QAAQ;IACdI,QAAQ,EAAE,CAACP,GAAG,CAACY,KAAK,CAAC;IACrBJ,WAAW,EAAE,CAACR,GAAG,CAACY,KAAK;EACzB,CAAC;AACH,CAAC;AAED,eAAe;EACbV;AACF,CAAC"}
1
+ {"version":3,"file":"FileExplorerShortcuts.js","names":["ShortcutRegistry","KEY","MODIFIER","FILE_EXPLORER","name","DELETE","createAndAdd","id","shortcut","macShortcut","CMD","BACKSPACE","RENAME","ENTER"],"sources":["../src/FileExplorerShortcuts.ts"],"sourcesContent":["import { ShortcutRegistry, KEY, MODIFIER } from '@deephaven/components';\n\nconst FILE_EXPLORER = {\n name: 'File Explorer',\n DELETE: ShortcutRegistry.createAndAdd({\n id: 'FILE_EXPLORER.DELETE',\n name: 'Delete',\n shortcut: [KEY.DELETE],\n macShortcut: [MODIFIER.CMD, KEY.BACKSPACE],\n }),\n RENAME: ShortcutRegistry.createAndAdd({\n id: 'FILE_EXPLORER.RENAME',\n name: 'Rename',\n shortcut: [KEY.ENTER],\n macShortcut: [KEY.ENTER],\n }),\n};\n\nexport default {\n FILE_EXPLORER,\n};\n"],"mappings":"AAAA,SAASA,gBAAgB,EAAEC,GAAG,EAAEC,QAAQ,QAAQ,uBAAuB;AAEvE,IAAMC,aAAa,GAAG;EACpBC,IAAI,EAAE,eAAe;EACrBC,MAAM,EAAEL,gBAAgB,CAACM,YAAY,CAAC;IACpCC,EAAE,EAAE,sBAAsB;IAC1BH,IAAI,EAAE,QAAQ;IACdI,QAAQ,EAAE,CAACP,GAAG,CAACI,MAAM,CAAC;IACtBI,WAAW,EAAE,CAACP,QAAQ,CAACQ,GAAG,EAAET,GAAG,CAACU,SAAS;EAC3C,CAAC,CAAC;EACFC,MAAM,EAAEZ,gBAAgB,CAACM,YAAY,CAAC;IACpCC,EAAE,EAAE,sBAAsB;IAC1BH,IAAI,EAAE,QAAQ;IACdI,QAAQ,EAAE,CAACP,GAAG,CAACY,KAAK,CAAC;IACrBJ,WAAW,EAAE,CAACR,GAAG,CAACY,KAAK;EACzB,CAAC;AACH,CAAC;AAED,eAAe;EACbV;AACF,CAAC","ignoreList":[]}
@@ -2,8 +2,7 @@ import React from 'react';
2
2
  import { Button, DebouncedSearchInput } from '@deephaven/components';
3
3
  import { vsNewFile, vsNewFolder } from '@deephaven/icons';
4
4
  import "./FileExplorerToolbar.css";
5
- import { jsx as _jsx } from "react/jsx-runtime";
6
- import { jsxs as _jsxs } from "react/jsx-runtime";
5
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
6
  export function FileExplorerToolbar(_ref) {
8
7
  var {
9
8
  createFile,
@@ -1 +1 @@
1
- {"version":3,"file":"FileExplorerToolbar.js","names":["React","Button","DebouncedSearchInput","vsNewFile","vsNewFolder","jsx","_jsx","jsxs","_jsxs","FileExplorerToolbar","_ref","createFile","createFolder","onSearchChange","defaultSearchText","className","children","kind","icon","tooltip","onClick","value","onChange","placeholder"],"sources":["../src/FileExplorerToolbar.tsx"],"sourcesContent":["import React from 'react';\nimport { Button, DebouncedSearchInput } from '@deephaven/components';\nimport { vsNewFile, vsNewFolder } from '@deephaven/icons';\nimport './FileExplorerToolbar.scss';\n\ntype FileExplorerToolbarProps = {\n createFile: () => void;\n createFolder: () => void;\n onSearchChange?: (text: string) => void;\n defaultSearchText?: string;\n};\n\nexport function FileExplorerToolbar({\n createFile,\n createFolder,\n onSearchChange,\n defaultSearchText = '',\n}: FileExplorerToolbarProps): JSX.Element {\n return (\n <div className=\"file-explorer-toolbar\">\n <div className=\"file-explorer-toolbar-buttons\">\n <Button\n kind=\"ghost\"\n icon={vsNewFile}\n tooltip=\"New notebook\"\n onClick={createFile}\n aria-label=\"New notebook\"\n />\n <Button\n kind=\"ghost\"\n icon={vsNewFolder}\n tooltip=\"New folder\"\n onClick={createFolder}\n aria-label=\"New folder\"\n />\n </div>\n {onSearchChange && (\n <div className=\"file-explorer-toolbar-search\">\n <DebouncedSearchInput\n value={defaultSearchText}\n onChange={onSearchChange}\n placeholder=\"Search by name\"\n />\n </div>\n )}\n </div>\n );\n}\n\nexport default FileExplorerToolbar;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,MAAM,EAAEC,oBAAoB,QAAQ,uBAAuB;AACpE,SAASC,SAAS,EAAEC,WAAW,QAAQ,kBAAkB;AAAC;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAU1D,OAAO,SAASC,mBAAmBA,CAAAC,IAAA,EAKO;EAAA,IALN;IAClCC,UAAU;IACVC,YAAY;IACZC,cAAc;IACdC,iBAAiB,GAAG;EACI,CAAC,GAAAJ,IAAA;EACzB,oBACEF,KAAA;IAAKO,SAAS,EAAC,uBAAuB;IAAAC,QAAA,gBACpCR,KAAA;MAAKO,SAAS,EAAC,+BAA+B;MAAAC,QAAA,gBAC5CV,IAAA,CAACL,MAAM;QACLgB,IAAI,EAAC,OAAO;QACZC,IAAI,EAAEf,SAAU;QAChBgB,OAAO,EAAC,cAAc;QACtBC,OAAO,EAAET,UAAW;QACpB,cAAW;MAAc,CAC1B,CAAC,eACFL,IAAA,CAACL,MAAM;QACLgB,IAAI,EAAC,OAAO;QACZC,IAAI,EAAEd,WAAY;QAClBe,OAAO,EAAC,YAAY;QACpBC,OAAO,EAAER,YAAa;QACtB,cAAW;MAAY,CACxB,CAAC;IAAA,CACC,CAAC,EACLC,cAAc,iBACbP,IAAA;MAAKS,SAAS,EAAC,8BAA8B;MAAAC,QAAA,eAC3CV,IAAA,CAACJ,oBAAoB;QACnBmB,KAAK,EAAEP,iBAAkB;QACzBQ,QAAQ,EAAET,cAAe;QACzBU,WAAW,EAAC;MAAgB,CAC7B;IAAC,CACC,CACN;EAAA,CACE,CAAC;AAEV;AAEA,eAAed,mBAAmB"}
1
+ {"version":3,"file":"FileExplorerToolbar.js","names":["React","Button","DebouncedSearchInput","vsNewFile","vsNewFolder","jsx","_jsx","jsxs","_jsxs","FileExplorerToolbar","_ref","createFile","createFolder","onSearchChange","defaultSearchText","className","children","kind","icon","tooltip","onClick","value","onChange","placeholder"],"sources":["../src/FileExplorerToolbar.tsx"],"sourcesContent":["import React from 'react';\nimport { Button, DebouncedSearchInput } from '@deephaven/components';\nimport { vsNewFile, vsNewFolder } from '@deephaven/icons';\nimport './FileExplorerToolbar.scss';\n\ntype FileExplorerToolbarProps = {\n createFile: () => void;\n createFolder: () => void;\n onSearchChange?: (text: string) => void;\n defaultSearchText?: string;\n};\n\nexport function FileExplorerToolbar({\n createFile,\n createFolder,\n onSearchChange,\n defaultSearchText = '',\n}: FileExplorerToolbarProps): JSX.Element {\n return (\n <div className=\"file-explorer-toolbar\">\n <div className=\"file-explorer-toolbar-buttons\">\n <Button\n kind=\"ghost\"\n icon={vsNewFile}\n tooltip=\"New notebook\"\n onClick={createFile}\n aria-label=\"New notebook\"\n />\n <Button\n kind=\"ghost\"\n icon={vsNewFolder}\n tooltip=\"New folder\"\n onClick={createFolder}\n aria-label=\"New folder\"\n />\n </div>\n {onSearchChange && (\n <div className=\"file-explorer-toolbar-search\">\n <DebouncedSearchInput\n value={defaultSearchText}\n onChange={onSearchChange}\n placeholder=\"Search by name\"\n />\n </div>\n )}\n </div>\n );\n}\n\nexport default FileExplorerToolbar;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,MAAM,EAAEC,oBAAoB,QAAQ,uBAAuB;AACpE,SAASC,SAAS,EAAEC,WAAW,QAAQ,kBAAkB;AAAC;AAAA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAU1D,OAAO,SAASC,mBAAmBA,CAAAC,IAAA,EAKO;EAAA,IALN;IAClCC,UAAU;IACVC,YAAY;IACZC,cAAc;IACdC,iBAAiB,GAAG;EACI,CAAC,GAAAJ,IAAA;EACzB,oBACEF,KAAA;IAAKO,SAAS,EAAC,uBAAuB;IAAAC,QAAA,gBACpCR,KAAA;MAAKO,SAAS,EAAC,+BAA+B;MAAAC,QAAA,gBAC5CV,IAAA,CAACL,MAAM;QACLgB,IAAI,EAAC,OAAO;QACZC,IAAI,EAAEf,SAAU;QAChBgB,OAAO,EAAC,cAAc;QACtBC,OAAO,EAAET,UAAW;QACpB,cAAW;MAAc,CAC1B,CAAC,eACFL,IAAA,CAACL,MAAM;QACLgB,IAAI,EAAC,OAAO;QACZC,IAAI,EAAEd,WAAY;QAClBe,OAAO,EAAC,YAAY;QACpBC,OAAO,EAAER,YAAa;QACtB,cAAW;MAAY,CACxB,CAAC;IAAA,CACC,CAAC,EACLC,cAAc,iBACbP,IAAA;MAAKS,SAAS,EAAC,8BAA8B;MAAAC,QAAA,eAC3CV,IAAA,CAACJ,oBAAoB;QACnBmB,KAAK,EAAEP,iBAAkB;QACzBQ,QAAQ,EAAET,cAAe;QACzBU,WAAW,EAAC;MAAgB,CAC7B;IAAC,CACC,CACN;EAAA,CACE,CAAC;AAEV;AAEA,eAAed,mBAAmB","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"FileList.d.ts","sourceRoot":"","sources":["../src/FileList.tsx"],"names":[],"mappings":"AAIA,OAAO,KAMN,MAAM,OAAO,CAAC;AACf,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,gBAAgB,EAEtB,MAAM,eAAe,CAAC;AACvB,OAAO,iBAAiB,CAAC;AAEzB,OAAO,EAAgB,KAAK,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAI5E,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,CA6Z1D;AAED,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"FileList.d.ts","sourceRoot":"","sources":["../src/FileList.tsx"],"names":[],"mappings":"AAQA,OAAO,KAMN,MAAM,OAAO,CAAC;AACf,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,gBAAgB,EAEtB,MAAM,eAAe,CAAC;AACvB,OAAO,iBAAiB,CAAC;AAEzB,OAAO,EAAgB,KAAK,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAI5E,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,CA6Z1D;AAED,eAAe,QAAQ,CAAC"}
package/dist/FileList.js CHANGED
@@ -100,14 +100,14 @@ export function FileList(props) {
100
100
  log.debug('dropItems', draggedItems, 'to', itemIndex);
101
101
  try {
102
102
  var {
103
- files: _files,
103
+ files,
104
104
  targetPath
105
105
  } = getMoveOperation(draggedItems, dropTargetItem);
106
- onMove === null || onMove === void 0 ? void 0 : onMove(_files, targetPath);
106
+ onMove === null || onMove === void 0 || onMove(files, targetPath);
107
107
  if (itemIndex != null) {
108
108
  var _itemList$current;
109
109
  setSelectedRanges([[itemIndex, itemIndex]]);
110
- (_itemList$current = itemList.current) === null || _itemList$current === void 0 ? void 0 : _itemList$current.focusItem(itemIndex);
110
+ (_itemList$current = itemList.current) === null || _itemList$current === void 0 || _itemList$current.focusItem(itemIndex);
111
111
  }
112
112
  } catch (err) {
113
113
  log.error('Unable to complete move', err);
@@ -119,7 +119,7 @@ export function FileList(props) {
119
119
  log.debug('handleItemClick', item);
120
120
  onSelect(item, event);
121
121
  if (isDirectory(item)) {
122
- table === null || table === void 0 ? void 0 : table.setExpanded(item.filename, !item.isExpanded);
122
+ table === null || table === void 0 || table.setExpanded(item.filename, !item.isExpanded);
123
123
  }
124
124
  }
125
125
  }, [loadedViewport, onSelect, table]);
@@ -134,7 +134,7 @@ export function FileList(props) {
134
134
  setDraggedItems(getItems(draggedRanges));
135
135
 
136
136
  // We need to reset reset the mouse state since we steal the drag
137
- (_itemList$current2 = itemList.current) === null || _itemList$current2 === void 0 ? void 0 : _itemList$current2.resetMouseState();
137
+ (_itemList$current2 = itemList.current) === null || _itemList$current2 === void 0 || _itemList$current2.resetMouseState();
138
138
  var newDragPlaceholder = document.createElement('div');
139
139
  var dndPlaceholderContent = document.createElement('div');
140
140
  dndPlaceholderContent.className = 'dnd-placeholder-content';
@@ -153,7 +153,7 @@ export function FileList(props) {
153
153
  }, [getItem]);
154
154
  var handleItemDragEnd = useCallback((itemIndex, e) => {
155
155
  log.debug('handleItemDragEnd', itemIndex);
156
- dragPlaceholder === null || dragPlaceholder === void 0 ? void 0 : dragPlaceholder.remove();
156
+ dragPlaceholder === null || dragPlaceholder === void 0 || dragPlaceholder.remove();
157
157
 
158
158
  // Drag end is triggered after drop
159
159
  // Also drop isn't triggered if drag end is outside of the list
@@ -193,15 +193,15 @@ export function FileList(props) {
193
193
  log.debug2('handleSelectionChange', newSelectedRanges);
194
194
  if (force === true || newSelectedRanges !== selectedRanges) {
195
195
  setSelectedRanges(newSelectedRanges);
196
- var _selectedItems = getItems(newSelectedRanges);
197
- onSelectionChange(_selectedItems);
196
+ var selectedItems = getItems(newSelectedRanges);
197
+ onSelectionChange(selectedItems);
198
198
  }
199
199
  }, [getItems, onSelectionChange, selectedRanges]);
200
200
  var handleFocusChange = useCallback(focusIndex => {
201
201
  log.debug2('handleFocusChange', focusIndex);
202
202
  if (focusIndex != null) {
203
- var [_focusedItem] = getItems([[focusIndex, focusIndex]]);
204
- onFocusChange(_focusedItem);
203
+ var [focusedItem] = getItems([[focusIndex, focusIndex]]);
204
+ onFocusChange(focusedItem);
205
205
  } else {
206
206
  onFocusChange();
207
207
  }
@@ -244,7 +244,7 @@ export function FileList(props) {
244
244
  }, [table, focusedPath]);
245
245
  useEffect(function updateTableViewport() {
246
246
  log.debug('updating table viewport', viewport);
247
- table === null || table === void 0 ? void 0 : table.setViewport({
247
+ table === null || table === void 0 || table.setViewport({
248
248
  top: Math.max(0, viewport.top - overscanCount),
249
249
  bottom: viewport.bottom + overscanCount
250
250
  });
@@ -285,7 +285,7 @@ export function FileList(props) {
285
285
  if (dropTargetItem != null && isDirectory(dropTargetItem) && dropTargetItem.filename !== '/') {
286
286
  var timeout = setTimeout(() => {
287
287
  if (!dropTargetItem.isExpanded) {
288
- table === null || table === void 0 ? void 0 : table.setExpanded(dropTargetItem.filename, true);
288
+ table === null || table === void 0 || table.setExpanded(dropTargetItem.filename, true);
289
289
  }
290
290
  }, DRAG_HOVER_TIMEOUT);
291
291
  return () => clearTimeout(timeout);
@@ -1 +1 @@
1
- {"version":3,"file":"FileList.js","names":["ItemList","Log","RangeUtils","classNames","React","useCallback","useEffect","useMemo","useRef","useState","isDirectory","DEFAULT_ROW_HEIGHT","getMoveOperation","FileListItem","jsx","_jsx","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","focusedIndex","itemList","fileList","getItems","ranges","length","i","range","j","push","getItem","itemIndex","getDragPlaceholderText","count","index","item","filename","concat","dropItems","debug","files","targetPath","_itemList$current","current","focusItem","err","error","handleSelect","event","setExpanded","isExpanded","handleItemDragStart","e","_itemList$current2","_getDragPlaceholderTe","debug2","draggedRanges","isSelected","resetMouseState","newDragPlaceholder","document","createElement","dndPlaceholderContent","className","innerText","appendChild","body","dataTransfer","setDragImage","effectAllowed","handleItemDragOver","preventDefault","handleItemDragEnd","remove","handleItemDrop","handleItemDragExit","handleListDragOver","target","Element","classList","contains","type","basename","id","handleListDrop","handleSelectionChange","newSelectedRanges","force","arguments","selectedItems","handleFocusChange","focusIndex","focusedItem","handleViewportChange","isDropTargetValid","focusedPath","collapseAll","updateTableViewport","Math","max","setLoadedViewportAndReturnCleanup","listenerRemover","onUpdate","newViewport","map","_objectSpread","itemName","size","updateFocusAndSelection","expandFolderOnHover","timeout","setTimeout","clearTimeout","renderWrapper","itemProps","isDragInProgress","onDragStart","onDragEnd","onDragOver","onDragExit","onDrop","ref","children","onViewportChange","isDragSelect","isDeselectOnClick"],"sources":["../src/FileList.tsx"],"sourcesContent":["import { ItemList, type 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 {\n type FileStorageItem,\n type FileStorageTable,\n isDirectory,\n} from './FileStorage';\nimport './FileList.scss';\nimport { DEFAULT_ROW_HEIGHT, getMoveOperation } from './FileListUtils';\nimport { FileListItem, type 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 focusedIndex = useRef<number | null>();\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 const dndPlaceholderContent = document.createElement('div');\n dndPlaceholderContent.className = 'dnd-placeholder-content';\n dndPlaceholderContent.innerText = getDragPlaceholderText() ?? '';\n newDragPlaceholder.appendChild(dndPlaceholderContent);\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, force = false) => {\n log.debug2('handleSelectionChange', newSelectedRanges);\n if (force === true || 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 focusedIndex.current = focusIndex;\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 // if the loadedViewport changes, re-fire the focused\n // item and the selected range items as they could have\n // been updated\n useEffect(\n function updateFocusAndSelection() {\n if (focusedIndex.current != null) {\n handleFocusChange(focusedIndex.current);\n }\n if (selectedRanges.length > 0) {\n // force the update, as the selected range may be the same\n // but the selected items may now be different\n handleSelectionChange(selectedRanges, true);\n }\n },\n [loadedViewport, handleFocusChange, handleSelectionChange, selectedRanges]\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","jsx","_jsx","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","focusedIndex","itemList","fileList","getItems","ranges","length","i","range","j","push","getItem","itemIndex","getDragPlaceholderText","count","index","item","filename","concat","dropItems","debug","files","targetPath","_itemList$current","current","focusItem","err","error","handleSelect","event","setExpanded","isExpanded","handleItemDragStart","e","_itemList$current2","_getDragPlaceholderTe","debug2","draggedRanges","isSelected","resetMouseState","newDragPlaceholder","document","createElement","dndPlaceholderContent","className","innerText","appendChild","body","dataTransfer","setDragImage","effectAllowed","handleItemDragOver","preventDefault","handleItemDragEnd","remove","handleItemDrop","handleItemDragExit","handleListDragOver","target","Element","classList","contains","type","basename","id","handleListDrop","handleSelectionChange","newSelectedRanges","force","arguments","selectedItems","handleFocusChange","focusIndex","focusedItem","handleViewportChange","isDropTargetValid","focusedPath","collapseAll","updateTableViewport","Math","max","setLoadedViewportAndReturnCleanup","listenerRemover","onUpdate","newViewport","map","_objectSpread","itemName","size","updateFocusAndSelection","expandFolderOnHover","timeout","setTimeout","clearTimeout","renderWrapper","itemProps","isDragInProgress","onDragStart","onDragEnd","onDragOver","onDragExit","onDrop","ref","children","onViewportChange","isDragSelect","isDeselectOnClick"],"sources":["../src/FileList.tsx"],"sourcesContent":["import {\n ItemList,\n type Range,\n type RenderItemProps,\n} 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 {\n type FileStorageItem,\n type FileStorageTable,\n isDirectory,\n} from './FileStorage';\nimport './FileList.scss';\nimport { DEFAULT_ROW_HEIGHT, getMoveOperation } from './FileListUtils';\nimport { FileListItem, type 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 readonly Range[]);\n\n const focusedIndex = useRef<number | null>();\n\n const itemList = useRef<ItemList<FileStorageItem>>(null);\n const fileList = useRef<HTMLDivElement>(null);\n\n const getItems = useCallback(\n (ranges: readonly 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 const dndPlaceholderContent = document.createElement('div');\n dndPlaceholderContent.className = 'dnd-placeholder-content';\n dndPlaceholderContent.innerText = getDragPlaceholderText() ?? '';\n newDragPlaceholder.appendChild(dndPlaceholderContent);\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: readonly Range[], force = false) => {\n log.debug2('handleSelectionChange', newSelectedRanges);\n if (force === true || 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: number | null) => {\n log.debug2('handleFocusChange', focusIndex);\n if (focusIndex != null) {\n const [focusedItem] = getItems([[focusIndex, focusIndex]]);\n onFocusChange(focusedItem);\n } else {\n onFocusChange();\n }\n focusedIndex.current = focusIndex;\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 // if the loadedViewport changes, re-fire the focused\n // item and the selected range items as they could have\n // been updated\n useEffect(\n function updateFocusAndSelection() {\n if (focusedIndex.current != null) {\n handleFocusChange(focusedIndex.current);\n }\n if (selectedRanges.length > 0) {\n // force the update, as the selected range may be the same\n // but the selected items may now be different\n handleSelectionChange(selectedRanges, true);\n }\n },\n [loadedViewport, handleFocusChange, handleSelectionChange, selectedRanges]\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: RenderItemProps<FileStorageItem>) =>\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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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"FileListContainer.d.ts","sourceRoot":"","sources":["../src/FileListContainer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAI9D,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,gBAAgB,EAEtB,MAAM,eAAe,CAAC;AAEvB,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
+ {"version":3,"file":"FileListContainer.d.ts","sourceRoot":"","sources":["../src/FileListContainer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAI9D,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,gBAAgB,EAEtB,MAAM,eAAe,CAAC;AAEvB,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,CAkM5E;yBAlMe,iBAAiB;;;AAsMjC,eAAe,iBAAiB,CAAC"}
@@ -14,8 +14,7 @@ import SHORTCUTS from "./FileExplorerShortcuts.js";
14
14
  import "./FileExplorer.css";
15
15
  import FileUtils from "./FileUtils.js";
16
16
  import FileListItemEditor from "./FileListItemEditor.js";
17
- import { jsx as _jsx } from "react/jsx-runtime";
18
- import { jsxs as _jsxs } from "react/jsx-runtime";
17
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
19
18
  /**
20
19
  * Component that displays and allows interaction with the file system in the provided FileStorage.
21
20
  */
@@ -41,27 +40,27 @@ export function FileListContainer(props) {
41
40
  var [focusedItem, setFocusedItem] = useState();
42
41
  var handleSelectionChange = useCallback(newSelectedItems => {
43
42
  setSelectedItems(newSelectedItems);
44
- onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange(newSelectedItems);
43
+ onSelectionChange === null || onSelectionChange === void 0 || onSelectionChange(newSelectedItems);
45
44
  }, [onSelectionChange]);
46
45
  var handleFocusChange = useCallback(newFocusedItem => {
47
46
  setFocusedItem(newFocusedItem);
48
47
  }, []);
49
48
  var handleCopyAction = useCallback(() => {
50
49
  if (focusedItem) {
51
- onCopy === null || onCopy === void 0 ? void 0 : onCopy(focusedItem);
50
+ onCopy === null || onCopy === void 0 || onCopy(focusedItem);
52
51
  }
53
52
  }, [focusedItem, onCopy]);
54
53
  var handleDeleteAction = useCallback(() => {
55
54
  if (selectedItems.length > 0) {
56
- onDelete === null || onDelete === void 0 ? void 0 : onDelete(selectedItems);
55
+ onDelete === null || onDelete === void 0 || onDelete(selectedItems);
57
56
  }
58
57
  }, [onDelete, selectedItems]);
59
58
  var handleNewFileAction = useCallback(() => {
60
- onCreateFile === null || onCreateFile === void 0 ? void 0 : onCreateFile();
59
+ onCreateFile === null || onCreateFile === void 0 || onCreateFile();
61
60
  }, [onCreateFile]);
62
61
  var handleNewFolderAction = useCallback(() => {
63
62
  if (focusedItem) {
64
- onCreateFolder === null || onCreateFolder === void 0 ? void 0 : onCreateFolder(FileUtils.getPath(focusedItem.filename));
63
+ onCreateFolder === null || onCreateFolder === void 0 || onCreateFolder(FileUtils.getPath(focusedItem.filename));
65
64
  }
66
65
  }, [focusedItem, onCreateFolder]);
67
66
  var handleRenameAction = useCallback(() => {
@@ -74,7 +73,7 @@ export function FileListContainer(props) {
74
73
  }, []);
75
74
  var handleRenameSubmit = useCallback(newName => {
76
75
  if (renameItem) {
77
- onRename === null || onRename === void 0 ? void 0 : onRename(renameItem, newName);
76
+ onRename === null || onRename === void 0 || onRename(renameItem, newName);
78
77
  setRenameItem(undefined);
79
78
  }
80
79
  }, [onRename, renameItem]);
@@ -1 +1 @@
1
- {"version":3,"file":"FileListContainer.js","names":["ContextActions","assertNotNull","React","useCallback","useMemo","useState","FileList","FileListItem","DEFAULT_ROW_HEIGHT","isDirectory","SHORTCUTS","FileUtils","FileListItemEditor","jsx","_jsx","jsxs","_jsxs","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","_objectSpread","children","validate","onSubmit","onCancel","className","onFocusChange","displayName"],"sources":["../src/FileListContainer.tsx"],"sourcesContent":["import { type ContextAction, ContextActions } from '@deephaven/components';\nimport { assertNotNull } from '@deephaven/utils';\nimport React, { useCallback, useMemo, useState } from 'react';\nimport FileList from './FileList';\nimport { FileListItem, type FileListRenderItemProps } from './FileListItem';\nimport { DEFAULT_ROW_HEIGHT } from './FileListUtils';\nimport {\n type FileStorageItem,\n type FileStorageTable,\n isDirectory,\n} 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 File',\n description: 'Copy the selected file',\n action: handleCopyAction,\n group: ContextActions.groups.low,\n disabled: focusedItem == null || isDirectory(focusedItem),\n });\n }\n if (onDelete && selectedItems.length > 0) {\n result.push({\n title: 'Delete',\n description: 'Delete',\n shortcut: SHORTCUTS.FILE_EXPLORER.DELETE,\n action: handleDeleteAction,\n group: ContextActions.groups.low,\n });\n }\n if (onRename) {\n result.push({\n title: 'Rename',\n description: 'Rename',\n shortcut: SHORTCUTS.FILE_EXPLORER.RENAME,\n action: handleRenameAction,\n group: ContextActions.groups.low,\n disabled: focusedItem == null,\n });\n }\n return result;\n }, [\n handleCopyAction,\n handleDeleteAction,\n handleNewFileAction,\n handleNewFolderAction,\n handleRenameAction,\n focusedItem,\n onCopy,\n onCreateFile,\n onCreateFolder,\n onDelete,\n onRename,\n selectedItems,\n renameItem,\n ]);\n\n const validateRenameItem = useCallback(\n (newName: string): Promise<void> => {\n assertNotNull(renameItem);\n return validateRename(renameItem, newName);\n },\n [renameItem, validateRename]\n );\n\n const renderItem = useCallback(\n (itemProps: FileListRenderItemProps): JSX.Element => {\n const { item } = itemProps;\n if (renameItem && renameItem.filename === item.filename) {\n return (\n // eslint-disable-next-line react/jsx-props-no-spreading\n <FileListItem {...itemProps}>\n <FileListItemEditor\n item={item}\n validate={validateRenameItem}\n onSubmit={handleRenameSubmit}\n onCancel={handleRenameCancel}\n />\n </FileListItem>\n );\n }\n // eslint-disable-next-line react/jsx-props-no-spreading\n return <FileListItem {...itemProps} />;\n },\n [handleRenameCancel, handleRenameSubmit, renameItem, validateRenameItem]\n );\n\n return (\n <div className=\"file-list-container\">\n {table != null && (\n <FileList\n onMove={onMove}\n onSelect={onSelect}\n onSelectionChange={handleSelectionChange}\n onFocusChange={handleFocusChange}\n renderItem={renderItem}\n rowHeight={rowHeight}\n table={table}\n isMultiSelect={isMultiSelect}\n focusedPath={focusedPath}\n />\n )}\n {showContextMenu && <ContextActions actions={actions} />}\n </div>\n );\n}\n\nFileListContainer.displayName = 'FileListContainer';\n\nexport default FileListContainer;\n"],"mappings":"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"}
1
+ {"version":3,"file":"FileListContainer.js","names":["ContextActions","assertNotNull","React","useCallback","useMemo","useState","FileList","FileListItem","DEFAULT_ROW_HEIGHT","isDirectory","SHORTCUTS","FileUtils","FileListItemEditor","jsx","_jsx","jsxs","_jsxs","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","_objectSpread","children","validate","onSubmit","onCancel","className","onFocusChange","displayName"],"sources":["../src/FileListContainer.tsx"],"sourcesContent":["import { type ContextAction, ContextActions } from '@deephaven/components';\nimport { assertNotNull } from '@deephaven/utils';\nimport React, { useCallback, useMemo, useState } from 'react';\nimport FileList from './FileList';\nimport { FileListItem, type FileListRenderItemProps } from './FileListItem';\nimport { DEFAULT_ROW_HEIGHT } from './FileListUtils';\nimport {\n type FileStorageItem,\n type FileStorageTable,\n isDirectory,\n} 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: FileStorageItem[]) => {\n setSelectedItems(newSelectedItems);\n onSelectionChange?.(newSelectedItems);\n },\n [onSelectionChange]\n );\n\n const handleFocusChange = useCallback(\n (newFocusedItem: FileStorageItem | undefined) => {\n setFocusedItem(newFocusedItem);\n },\n []\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 File',\n description: 'Copy the selected file',\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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","ignoreList":[]}
@@ -11,6 +11,7 @@ export type FileListRenderItemProps = RenderItemProps<FileStorageItem> & {
11
11
  onDragStart: (index: number, e: React.DragEvent<HTMLDivElement>) => void;
12
12
  onDragOver: (index: number, e: React.DragEvent<HTMLDivElement>) => void;
13
13
  onDragEnd: (index: number, e: React.DragEvent<HTMLDivElement>) => void;
14
+ onDragExit: () => void;
14
15
  onDrop: (index: number, e: React.DragEvent<HTMLDivElement>) => void;
15
16
  };
16
17
  export declare function FileListItem(props: FileListRenderItemProps): JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"FileListItem.d.ts","sourceRoot":"","sources":["../src/FileListItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAW,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAKtE,OAAO,EAAE,KAAK,eAAe,EAAe,MAAM,eAAe,CAAC;AAClE,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,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACzE,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACxE,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACvE,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;CACrE,CAAC;AAEF,wBAAgB,YAAY,CAAC,KAAK,EAAE,uBAAuB,GAAG,GAAG,CAAC,OAAO,CA0ExE;AAED,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"FileListItem.d.ts","sourceRoot":"","sources":["../src/FileListItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAW,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAKtE,OAAO,EAAE,KAAK,eAAe,EAAe,MAAM,eAAe,CAAC;AAClE,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,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACzE,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACxE,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACvE,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;CACrE,CAAC;AAEF,wBAAgB,YAAY,CAAC,KAAK,EAAE,uBAAuB,GAAG,GAAG,CAAC,OAAO,CA4ExE;AAED,eAAe,YAAY,CAAC"}
@@ -12,9 +12,7 @@ import { getPathFromItem } from "./FileListUtils.js";
12
12
  * @param item Item to get the icon for
13
13
  * @returns Icon definition to pass in the FontAwesomeIcon icon prop
14
14
  */
15
- import { jsx as _jsx } from "react/jsx-runtime";
16
- import { Fragment as _Fragment } from "react/jsx-runtime";
17
- import { jsxs as _jsxs } from "react/jsx-runtime";
15
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
18
16
  function getItemIcon(item) {
19
17
  if (isDirectory(item)) {
20
18
  return item.isExpanded ? vsFolderOpened : vsFolder;
@@ -41,6 +39,7 @@ export function FileListItem(props) {
41
39
  onDragStart: _onDragStart,
42
40
  onDragOver: _onDragOver,
43
41
  onDragEnd: _onDragEnd,
42
+ onDragExit,
44
43
  onDrop: _onDrop
45
44
  } = props;
46
45
  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;
@@ -68,6 +67,7 @@ export function FileListItem(props) {
68
67
  onDragStart: e => _onDragStart(itemIndex, e),
69
68
  onDragOver: e => _onDragOver(itemIndex, e),
70
69
  onDragEnd: e => _onDragEnd(itemIndex, e),
70
+ onDragExit: onDragExit,
71
71
  onDrop: e => _onDrop(itemIndex, e),
72
72
  draggable: true,
73
73
  role: "presentation",
@@ -1 +1 @@
1
- {"version":3,"file":"FileListItem.js","names":["React","Tooltip","dhPython","vsCode","vsFolder","vsFolderOpened","FontAwesomeIcon","classNames","isDirectory","FileUtils","MIME_TYPE","getPathFromItem","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","getItemIcon","item","isExpanded","mimeType","getMimeType","basename","PYTHON","FileListItem","props","_draggedItems$some","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","className","e","draggable","role","fixedWidth"],"sources":["../src/FileListItem.tsx"],"sourcesContent":["import React from 'react';\nimport { Tooltip, type RenderItemProps } from '@deephaven/components';\nimport { dhPython, vsCode, vsFolder, vsFolderOpened } from '@deephaven/icons';\nimport { type IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport classNames from 'classnames';\nimport { type 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 ?? (\n <>\n {item.basename}\n <Tooltip>{item.basename}</Tooltip>\n </>\n )}\n </span>\n </div>\n );\n}\n\nexport default FileListItem;\n"],"mappings":"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"}
1
+ {"version":3,"file":"FileListItem.js","names":["React","Tooltip","dhPython","vsCode","vsFolder","vsFolderOpened","FontAwesomeIcon","classNames","isDirectory","FileUtils","MIME_TYPE","getPathFromItem","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","getItemIcon","item","isExpanded","mimeType","getMimeType","basename","PYTHON","FileListItem","props","_draggedItems$some","children","draggedItems","isDragInProgress","isDropTargetValid","isSelected","itemIndex","dropTargetItem","onDragStart","onDragOver","onDragEnd","onDragExit","onDrop","isDragged","some","draggedItem","id","itemPath","dropTargetPath","isExactDropTarget","isInDropTarget","isInvalidDropTarget","icon","depth","getDepth","filename","depthLines","Array","fill","map","value","index","className","e","draggable","role","fixedWidth"],"sources":["../src/FileListItem.tsx"],"sourcesContent":["import React from 'react';\nimport { Tooltip, type RenderItemProps } from '@deephaven/components';\nimport { dhPython, vsCode, vsFolder, vsFolderOpened } from '@deephaven/icons';\nimport { type IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport classNames from 'classnames';\nimport { type 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 onDragExit: () => 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 onDragExit,\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 onDragExit={onDragExit}\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 ?? (\n <>\n {item.basename}\n <Tooltip>{item.basename}</Tooltip>\n </>\n )}\n </span>\n </div>\n );\n}\n\nexport default FileListItem;\n"],"mappings":"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","ignoreList":[]}
@@ -3,8 +3,7 @@ import classNames from 'classnames';
3
3
  import Log from '@deephaven/log';
4
4
  import { PromiseUtils } from '@deephaven/utils';
5
5
  import "./FileListItemEditor.css";
6
- import { jsx as _jsx } from "react/jsx-runtime";
7
- import { jsxs as _jsxs } from "react/jsx-runtime";
6
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
8
7
  var log = Log.module('FileListItemEditor');
9
8
  var DEFAULT_VALIDATE = () => Promise.resolve();
10
9
  export function FileListItemEditor(_ref) {
@@ -20,7 +19,7 @@ export function FileListItemEditor(_ref) {
20
19
  var [validationPromise, setValidationPromise] = useState(Promise.resolve());
21
20
  var focus = useCallback(() => {
22
21
  var _input$current;
23
- (_input$current = input.current) === null || _input$current === void 0 ? void 0 : _input$current.focus();
22
+ (_input$current = input.current) === null || _input$current === void 0 || _input$current.focus();
24
23
  // Select the proper range based on the type...
25
24
  }, [input]);
26
25
  var stopPropagation = useCallback(e => e.stopPropagation(), []);
@@ -1 +1 @@
1
- {"version":3,"file":"FileListItemEditor.js","names":["React","useCallback","useEffect","useRef","useState","classNames","Log","PromiseUtils","jsx","_jsx","jsxs","_jsxs","log","module","DEFAULT_VALIDATE","Promise","resolve","FileListItemEditor","_ref","item","onCancel","onSubmit","validate","input","value","setValue","basename","validationError","setValidationError","validationPromise","setValidationPromise","focus","_input$current","current","stopPropagation","e","validateAndSubmit","then","catch","info","validateValueAndSetPromise","validatePromise","makeCancelable","undefined","isCanceled","cancel","selectRange","handleBlur","debug2","handleChange","newValue","target","handleKeyDown","key","className","children","type","ref","onBlur","onKeyDown","onChange","onClick","onDoubleClick","onMouseDown","concat"],"sources":["../src/FileListItemEditor.tsx"],"sourcesContent":["import React, {\n type ChangeEvent,\n type KeyboardEvent,\n type 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 { type 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
+ {"version":3,"file":"FileListItemEditor.js","names":["React","useCallback","useEffect","useRef","useState","classNames","Log","PromiseUtils","jsx","_jsx","jsxs","_jsxs","log","module","DEFAULT_VALIDATE","Promise","resolve","FileListItemEditor","_ref","item","onCancel","onSubmit","validate","input","value","setValue","basename","validationError","setValidationError","validationPromise","setValidationPromise","focus","_input$current","current","stopPropagation","e","validateAndSubmit","then","catch","info","validateValueAndSetPromise","validatePromise","makeCancelable","undefined","isCanceled","cancel","selectRange","handleBlur","debug2","handleChange","newValue","target","handleKeyDown","key","className","children","type","ref","onBlur","onKeyDown","onChange","onClick","onDoubleClick","onMouseDown","concat"],"sources":["../src/FileListItemEditor.tsx"],"sourcesContent":["import React, {\n type ChangeEvent,\n type KeyboardEvent,\n type 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 { type 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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","ignoreList":[]}
@@ -1 +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","_ref","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,eAAeA,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,gBAAgBA,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,CACfC,IAAA;IAAA,IAAC;MAAET;IAAS,CAAC,GAAAS,IAAA;IAAA,OAAKd,SAAS,CAACM,OAAO,CAACD,QAAQ,CAAC,KAAKO,UAAU;EAAA,CAC9D,CAAC,EACD;IACA;IACA,MAAM,IAAID,KAAK,CAAC,wCAAwC,CAAC;EAC3D;EACA,IACEH,YAAY,CAACK,IAAI,CACfE,IAAI,IACFhB,WAAW,CAACgB,IAAI,CAAC,IACjBH,UAAU,CAACI,UAAU,CAAChB,SAAS,CAACI,QAAQ,CAACW,IAAI,CAACV,QAAQ,CAAC,CAC3D,CAAC,EACD;IACA;IACA,MAAM,IAAIM,KAAK,CAAC,0DAA0D,CAAC;EAC7E;EACA,OAAO;IAAEM,KAAK,EAAET,YAAY;IAAEI;EAAW,CAAC;AAC5C"}
1
+ {"version":3,"file":"FileListUtils.js","names":["isDirectory","FileUtils","DEFAULT_ROW_HEIGHT","getPathFromItem","file","makePath","filename","getPath","getMoveOperation","draggedItems","targetItem","length","Error","targetPath","some","_ref","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,eAAeA,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,gBAAgBA,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,CACfC,IAAA;IAAA,IAAC;MAAET;IAAS,CAAC,GAAAS,IAAA;IAAA,OAAKd,SAAS,CAACM,OAAO,CAACD,QAAQ,CAAC,KAAKO,UAAU;EAAA,CAC9D,CAAC,EACD;IACA;IACA,MAAM,IAAID,KAAK,CAAC,wCAAwC,CAAC;EAC3D;EACA,IACEH,YAAY,CAACK,IAAI,CACfE,IAAI,IACFhB,WAAW,CAACgB,IAAI,CAAC,IACjBH,UAAU,CAACI,UAAU,CAAChB,SAAS,CAACI,QAAQ,CAACW,IAAI,CAACV,QAAQ,CAAC,CAC3D,CAAC,EACD;IACA;IACA,MAAM,IAAIM,KAAK,CAAC,0DAA0D,CAAC;EAC7E;EACA,OAAO;IAAEM,KAAK,EAAET,YAAY;IAAEI;EAAW,CAAC;AAC5C","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"FileNotFoundError.js","names":["FileNotFoundError","Error","constructor","_defineProperty"],"sources":["../src/FileNotFoundError.ts"],"sourcesContent":["class FileNotFoundError extends Error {\n constructor() {\n super('No file exists at the path specified');\n }\n\n isFileNotFound = true;\n}\n\nexport default FileNotFoundError;\n"],"mappings":";;;AAAA,MAAMA,iBAAiB,SAASC,KAAK,CAAC;EACpCC,WAAWA,CAAA,EAAG;IACZ,KAAK,CAAC,sCAAsC,CAAC;IAACC,eAAA,yBAG/B,IAAI;EAFrB;AAGF;AAEA,eAAeH,iBAAiB"}
1
+ {"version":3,"file":"FileNotFoundError.js","names":["FileNotFoundError","Error","constructor","_defineProperty"],"sources":["../src/FileNotFoundError.ts"],"sourcesContent":["class FileNotFoundError extends Error {\n constructor() {\n super('No file exists at the path specified');\n }\n\n isFileNotFound = true;\n}\n\nexport default FileNotFoundError;\n"],"mappings":";;;AAAA,MAAMA,iBAAiB,SAASC,KAAK,CAAC;EACpCC,WAAWA,CAAA,EAAG;IACZ,KAAK,CAAC,sCAAsC,CAAC;IAACC,eAAA,yBAG/B,IAAI;EAFrB;AAGF;AAEA,eAAeH,iBAAiB","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"FileStorage.js","names":["isFileType","type","isDirectory","file"],"sources":["../src/FileStorage.ts"],"sourcesContent":["import { type StorageTable, type StorageItem } from '@deephaven/storage';\n\n/**\n * Basic metadata of the file\n */\nexport interface FileMetadata {\n /** Full path of the file */\n filename: string;\n\n /** Just the file name part of the file (no path) */\n basename: string;\n}\n\nexport type FileType = 'file' | 'directory';\n\nexport function isFileType(type: string): type is FileType {\n return type === 'file' || type === 'directory';\n}\n\nexport interface FileStorageItem extends StorageItem, FileMetadata {\n type: FileType;\n}\n\nexport interface DirectoryStorageItem extends FileStorageItem {\n type: 'directory';\n isExpanded: boolean;\n}\n\nexport function isDirectory(\n file: FileStorageItem\n): file is DirectoryStorageItem {\n return file.type === 'directory';\n}\n\n/**\n * A file including it's contents\n */\nexport interface File extends FileMetadata {\n content: string;\n}\n\nexport interface FileStorageTable extends StorageTable<FileStorageItem> {\n setSearch: (search: string) => void;\n\n /**\n * @param path The path to expand\n * @param expanded What expanded state to set\n */\n setExpanded: (path: string, expanded: boolean) => void;\n\n /**\n * Collapses all directories\n */\n collapseAll: () => void;\n}\n\n/**\n * FileStorage abstraction. Has methods for managing files, and for retrieving a table to browse files.\n */\nexport interface FileStorage {\n /**\n * Retrieve a table to view the file list\n */\n getTable: () => Promise<FileStorageTable>;\n\n /**\n * Save a file\n * @param file The file to save\n */\n saveFile: (file: File) => Promise<File>;\n\n /**\n * Load the contents of a file\n * @param name The file to load, including the full path\n */\n loadFile: (name: string) => Promise<File>;\n\n /**\n * Delete a file\n * @param name The full name of the file to delete\n */\n deleteFile: (name: string) => Promise<void>;\n\n /**\n * Move a file to a new location\n * @param name Source file name\n * @param newName The new file name, including path\n */\n moveFile: (name: string, newName: string) => Promise<void>;\n\n /**\n * Copy a file to a new location\n * @param name The name of the file to copy\n * @param newName The new file name, including path\n */\n copyFile: (name: string, newName: string) => Promise<void>;\n\n /**\n * Get the info for the file at the specified path.\n * If the file does not exists, rejects with a FileNotFoundError\n * @param name The file name to check, including path\n * @returns The FileStorageItem for the path specified, or reject with a FileNotFoundError if it does not exist.\n */\n info: (name: string) => Promise<FileStorageItem>;\n\n /**\n * Create the directory at the given path\n * @param name The full directory path\n */\n createDirectory: (name: string) => Promise<FileStorageItem>;\n}\n\nexport default FileStorage;\n"],"mappings":"AAEA;AACA;AACA;;AAWA,OAAO,SAASA,UAAUA,CAACC,IAAY,EAAoB;EACzD,OAAOA,IAAI,KAAK,MAAM,IAAIA,IAAI,KAAK,WAAW;AAChD;AAWA,OAAO,SAASC,WAAWA,CACzBC,IAAqB,EACS;EAC9B,OAAOA,IAAI,CAACF,IAAI,KAAK,WAAW;AAClC;;AAEA;AACA;AACA;;AAoBA;AACA;AACA"}
1
+ {"version":3,"file":"FileStorage.js","names":["isFileType","type","isDirectory","file"],"sources":["../src/FileStorage.ts"],"sourcesContent":["import { type StorageTable, type StorageItem } from '@deephaven/storage';\n\n/**\n * Basic metadata of the file\n */\nexport interface FileMetadata {\n /** Full path of the file */\n filename: string;\n\n /** Just the file name part of the file (no path) */\n basename: string;\n}\n\nexport type FileType = 'file' | 'directory';\n\nexport function isFileType(type: string): type is FileType {\n return type === 'file' || type === 'directory';\n}\n\nexport interface FileStorageItem extends StorageItem, FileMetadata {\n type: FileType;\n}\n\nexport interface DirectoryStorageItem extends FileStorageItem {\n type: 'directory';\n isExpanded: boolean;\n}\n\nexport function isDirectory(\n file: FileStorageItem\n): file is DirectoryStorageItem {\n return file.type === 'directory';\n}\n\n/**\n * A file including it's contents\n */\nexport interface File extends FileMetadata {\n content: string;\n}\n\nexport interface FileStorageTable extends StorageTable<FileStorageItem> {\n setSearch: (search: string) => void;\n\n /**\n * @param path The path to expand\n * @param expanded What expanded state to set\n */\n setExpanded: (path: string, expanded: boolean) => void;\n\n /**\n * Collapses all directories\n */\n collapseAll: () => void;\n}\n\n/**\n * FileStorage abstraction. Has methods for managing files, and for retrieving a table to browse files.\n */\nexport interface FileStorage {\n /**\n * Retrieve a table to view the file list\n */\n getTable: () => Promise<FileStorageTable>;\n\n /**\n * Save a file\n * @param file The file to save\n */\n saveFile: (file: File) => Promise<File>;\n\n /**\n * Load the contents of a file\n * @param name The file to load, including the full path\n */\n loadFile: (name: string) => Promise<File>;\n\n /**\n * Delete a file\n * @param name The full name of the file to delete\n */\n deleteFile: (name: string) => Promise<void>;\n\n /**\n * Move a file to a new location\n * @param name Source file name\n * @param newName The new file name, including path\n */\n moveFile: (name: string, newName: string) => Promise<void>;\n\n /**\n * Copy a file to a new location\n * @param name The name of the file to copy\n * @param newName The new file name, including path\n */\n copyFile: (name: string, newName: string) => Promise<void>;\n\n /**\n * Get the info for the file at the specified path.\n * If the file does not exists, rejects with a FileNotFoundError\n * @param name The file name to check, including path\n * @returns The FileStorageItem for the path specified, or reject with a FileNotFoundError if it does not exist.\n */\n info: (name: string) => Promise<FileStorageItem>;\n\n /**\n * Create the directory at the given path\n * @param name The full directory path\n */\n createDirectory: (name: string) => Promise<FileStorageItem>;\n}\n\nexport default FileStorage;\n"],"mappings":"AAEA;AACA;AACA;;AAWA,OAAO,SAASA,UAAUA,CAACC,IAAY,EAAoB;EACzD,OAAOA,IAAI,KAAK,MAAM,IAAIA,IAAI,KAAK,WAAW;AAChD;AAWA,OAAO,SAASC,WAAWA,CACzBC,IAAqB,EACS;EAC9B,OAAOA,IAAI,CAACF,IAAI,KAAK,WAAW;AAClC;;AAEA;AACA;AACA;;AAoBA;AACA;AACA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"FileTestUtils.js","names":["makeFileName","index","arguments","length","undefined","concat","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,YAAYA,CAAA,EAAoB;EAAA,IAAnBC,KAAK,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC;EACpC,kBAAAG,MAAA,CAAkBJ,KAAK;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASK,WAAWA,CAAA,EAAoB;EAAA,IAAnBL,KAAK,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC;EACnC,iBAAAG,MAAA,CAAiBJ,KAAK;AACxB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASM,QAAQA,CAACC,QAAgB,EAA+B;EAAA,IAA7BC,IAAI,GAAAP,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,GAAG;EACnD,IAAMQ,QAAQ,MAAAL,MAAA,CAAMI,IAAI,EAAAJ,MAAA,CAAGG,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,SAASA,CAAA,EAA+B;EAAA,IAA9BC,KAAK,GAAAZ,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC;EACjC,IAAMa,MAAyB,GAAG,EAAE;EACpC,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,KAAK,EAAEE,CAAC,IAAI,CAAC,EAAE;IACjCD,MAAM,CAACE,IAAI,CAACV,QAAQ,CAACP,YAAY,CAACgB,CAAC,CAAC,CAAC,CAAC;EACxC;EACA,OAAOD,MAAM;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASG,aAAaA,CAC3BV,QAAgB,EAEM;EAAA,IADtBC,IAAI,GAAAP,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,GAAG;EAEV,IAAMQ,QAAQ,MAAAL,MAAA,CAAMI,IAAI,EAAAJ,MAAA,CAAGG,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,eAAeA,CAAA,EAAoC;EAAA,IAAnCN,KAAK,GAAAZ,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC;EACvC,IAAMa,MAA8B,GAAG,EAAE;EACzC,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,KAAK,EAAEE,CAAC,IAAI,CAAC,EAAE;IACjCD,MAAM,CAACE,IAAI,CAACC,aAAa,WAAAb,MAAA,CAAWW,CAAC,CAAE,CAAC,CAAC;EAC3C;EACA,OAAOD,MAAM;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASM,UAAUA,CACxBC,WAAqB,EACrBC,OAAe,EACE;EACjB,IAAMf,QAAQ,OAAAH,MAAA,CAAOiB,WAAW,CAC7BE,GAAG,CAACC,SAAS,IAAInB,WAAW,CAACmB,SAAS,CAAC,CAAC,CACxCC,IAAI,CAAC,GAAG,CAAC,MAAG;EACf,OAAOnB,QAAQ,CAACP,YAAY,CAACuB,OAAO,CAAC,EAAEf,QAAQ,CAAC;AAClD;AAEA,eAAe;EACbR,YAAY;EACZO,QAAQ;EACRM,SAAS;EACTP,WAAW;EACXY,aAAa;EACbE,eAAe;EACfC;AACF,CAAC"}
1
+ {"version":3,"file":"FileTestUtils.js","names":["makeFileName","index","arguments","length","undefined","concat","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":"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","ignoreList":[]}
package/dist/FileUtils.js CHANGED
@@ -5,19 +5,19 @@ import FileNotFoundError from "./FileNotFoundError.js";
5
5
  /**
6
6
  * A basic list of some common MIME types.
7
7
  */
8
- export var MIME_TYPE;
9
-
10
- /**
11
- * Collection of utils for operating on file names
12
- */
13
- (function (MIME_TYPE) {
8
+ export var MIME_TYPE = /*#__PURE__*/function (MIME_TYPE) {
14
9
  MIME_TYPE["GROOVY"] = "text/x-groovy";
15
10
  MIME_TYPE["PLAIN_TEXT"] = "text/plain";
16
11
  MIME_TYPE["PYTHON"] = "text/x-python";
17
12
  MIME_TYPE["PYTHON_COMPILED"] = "application/x-python-code";
18
13
  MIME_TYPE["SCALA"] = "text/x-scala";
19
14
  MIME_TYPE["UNKNOWN"] = "";
20
- })(MIME_TYPE || (MIME_TYPE = {}));
15
+ return MIME_TYPE;
16
+ }({});
17
+
18
+ /**
19
+ * Collection of utils for operating on file names
20
+ */
21
21
  export class FileUtils {
22
22
  static fileExists(fileStorage, name) {
23
23
  return _asyncToGenerator(function* () {
@@ -1 +1 @@
1
- {"version":3,"file":"FileUtils.js","names":["ValidationError","FileNotFoundError","MIME_TYPE","FileUtils","fileExists","fileStorage","name","_asyncToGenerator","info","e","fileExtensionToString","extension","arguments","length","undefined","concat","getDepth","_name$match","hasPath","Error","matches","match","getExtension","components","getBaseName","split","_components$pop","pop","_name$split$pop","getCopyFileName","originalName","extensionPosition","lastIndexOf","substring","copyName","getUniqueCopyFileName","getMimeType","toLowerCase","GROOVY","PYTHON","PYTHON_COMPILED","SCALA","PLAIN_TEXT","UNKNOWN","getParent","parts","join","getPath","startsWith","isPath","endsWith","makePath","replaceExtension","newExtension","index","nameWithoutExtension","extensionString","validateName","reservedNames","invalidCharsRegex","invalidCharLabels","Map","includes","test","_name$match$reduce$ma","_name$match2","reduce","acc","next","map","char","has","get","reducePaths","paths","folders","filter","path","some","folder","removeRoot","root","filename","addRoot"],"sources":["../src/FileUtils.ts"],"sourcesContent":["import { ValidationError } from '@deephaven/utils';\nimport FileNotFoundError from './FileNotFoundError';\nimport { type FileStorage } from './FileStorage';\n\n/**\n * A basic list of some common MIME types.\n */\nexport enum MIME_TYPE {\n GROOVY = 'text/x-groovy',\n PLAIN_TEXT = 'text/plain',\n PYTHON = 'text/x-python',\n PYTHON_COMPILED = 'application/x-python-code',\n SCALA = 'text/x-scala',\n UNKNOWN = '',\n}\n\n/**\n * Collection of utils for operating on file names\n */\nexport class FileUtils {\n static async fileExists(\n fileStorage: FileStorage,\n name: string\n ): Promise<boolean> {\n try {\n await fileStorage.info(name);\n return true;\n } catch (e) {\n // Should probably make sure it's a `FileNotFoundError`, and re-throw the error if it is not\n if (!(e instanceof FileNotFoundError)) {\n throw e;\n }\n return false;\n }\n }\n\n /**\n * Format file extension\n * @param extension File extension to format, defaults to empty string\n * @returns Formatted string - '' for no extension, '.' for empty extension, '.ext' for non-empty extension\n */\n static fileExtensionToString(extension = ''): string {\n return extension.length === 0 ? '' : `.${extension}`;\n }\n\n /**\n * Get the depth (how many directories deep it is) of the provided filename with path.\n * @param name The full file name to get the depth of\n */\n static getDepth(name: string): number {\n if (!FileUtils.hasPath(name)) {\n throw new Error(`Invalid path provided: ${name}`);\n }\n const matches = name.match(/\\//g) ?? [];\n return matches.length - 1;\n }\n\n /**\n * Get just the extension of file name.\n * Note that it just returns the last extension, so 'example.tar.gz' would just return 'gz'.\n * @param name The file name with or without path to get the extension of\n * @returns The file extension\n */\n static getExtension(name: string): string {\n const components = this.getBaseName(name).split('.');\n if (components.length > 1) {\n return components.pop() ?? '';\n }\n return '';\n }\n\n /**\n * Get the base name portion of the file, eg '/foo/bar.txt' => 'bar.txt'\n * @param name The full name including path of the file\n * @returns Just the file name part of the file\n */\n static getBaseName(name: string): string {\n return name.split('/').pop() ?? '';\n }\n\n /**\n * Create copy file name, used for copying unsaved files so doesn't have to be unique\n * @param originalName File name\n * @returns The file name of the copy\n */\n static getCopyFileName(originalName: string): string {\n const extensionPosition = originalName.lastIndexOf('.');\n let extension = null;\n let name = null;\n if (extensionPosition < 0) {\n // No extension\n name = originalName;\n } else {\n name = originalName.substring(0, extensionPosition);\n extension = originalName.substring(extensionPosition + 1);\n }\n const copyName = name ? `${name}-copy` : 'Copy';\n return extension !== null ? `${copyName}.${extension}` : copyName;\n }\n\n static async getUniqueCopyFileName(\n fileStorage: FileStorage,\n originalName: string\n ): Promise<string> {\n let copyName = FileUtils.getCopyFileName(originalName);\n // await in loop is fine here, this isn't a parallel task\n // eslint-disable-next-line no-await-in-loop\n while (await FileUtils.fileExists(fileStorage, copyName)) {\n copyName = FileUtils.getCopyFileName(copyName);\n }\n return copyName;\n }\n\n /**\n * Return a MIME type for the provided file\n * @param name The file name to get the type for\n * @returns A known MIME type if recognized\n */\n static getMimeType(name: string): MIME_TYPE {\n const extension = this.getExtension(name).toLowerCase();\n switch (extension) {\n case 'groovy':\n return MIME_TYPE.GROOVY;\n case 'py':\n return MIME_TYPE.PYTHON;\n case 'pyc':\n return MIME_TYPE.PYTHON_COMPILED;\n case 'scala':\n return MIME_TYPE.SCALA;\n case 'txt':\n return MIME_TYPE.PLAIN_TEXT;\n default:\n return MIME_TYPE.UNKNOWN;\n }\n }\n\n /**\n * Pop the last part of the filename component to return the parent path\n * @param name The file name to get the parent path of\n */\n static getParent(name: string): string {\n if (!FileUtils.hasPath(name)) {\n throw new Error(`Invalid name provided: ${name}`);\n }\n\n const parts = name.split('/');\n while (parts.pop() === '');\n if (parts.length === 0) {\n throw new Error(`No parent for path provided: ${name}`);\n }\n return `${parts.join('/')}/`;\n }\n\n /**\n * Get the path name portion of the file\n * @param name The full path with or without filename to get the path of\n * @returns Just the path with out the file name part, including trailing slash\n */\n static getPath(name: string): string {\n if (!FileUtils.hasPath(name)) {\n throw new Error(`Invalid filename provided: ${name}`);\n }\n const parts = name.split('/');\n parts.pop();\n return `${parts.join('/')}/`;\n }\n\n /**\n * Check if a given file name includes the full path\n * @param name The file name to check\n * @returns True if it's a full path, false otherwise\n */\n static hasPath(name: string): boolean {\n return name.startsWith('/');\n }\n\n /**\n * Check a given file name is a path\n * @param name The file name to check\n * @returns True if it's a full path, false otherwise\n */\n static isPath(name: string): boolean {\n return name.startsWith('/') && name.endsWith('/');\n }\n\n /**\n * Turns a directory file name into a path. Basically ensures there's a trailing slash\n * @param name The directory name to make a path\n */\n static makePath(name: string): string {\n if (!name.endsWith('/')) {\n return `${name}/`;\n }\n return name;\n }\n\n /**\n * Replace extension in the item name\n * @param name Name to replace the extension in\n * @param newExtension New extension, defaults to no extension\n */\n static replaceExtension(name: string, newExtension = ''): string {\n const index = name.lastIndexOf('.');\n const nameWithoutExtension = index > -1 ? name.substring(0, index) : name;\n const extensionString = FileUtils.fileExtensionToString(newExtension);\n return `${nameWithoutExtension}${extensionString}`;\n }\n\n /**\n * Validate the provided name. Throws an error if validation fails\n * @param name The item name to validate\n */\n static validateName(name: string): void {\n // Static checks\n const reservedNames = ['.', '..'];\n // Global flag to show all invalid chars, not just the first match\n const invalidCharsRegex = /[\\\\/\\0]/g;\n const invalidCharLabels = new Map([['\\0', 'null']]);\n\n if (!name) {\n throw new ValidationError(`Name cannot be empty`);\n }\n if (reservedNames.includes(name)) {\n throw new ValidationError(`\"${name}\" is a reserved name`);\n }\n if (invalidCharsRegex.test(name)) {\n throw new ValidationError(\n `Invalid characters in name: \"${\n name\n .match(invalidCharsRegex)\n // Filter out duplicates\n ?.reduce(\n (acc, next) => (acc.includes(next) ? acc : [...acc, next]),\n [] as string[]\n )\n .map(char =>\n invalidCharLabels.has(char) ? invalidCharLabels.get(char) : char\n )\n .join('\", \"') ?? ''\n }\"`\n );\n }\n }\n\n /**\n * Reduce the provided paths to the minimum selection.\n * Removes any nested files or directories if a parent is already selected.\n * @param paths The paths to reduce\n */\n static reducePaths(paths: string[]): string[] {\n const folders = paths.filter(path => FileUtils.isPath(path));\n return paths.filter(\n path =>\n !folders.some(folder => path !== folder && path.startsWith(folder))\n );\n }\n\n /**\n * Removes the root path from the provided file name. Throws if the filename does not start with root.\n * @param root The root to remove\n * @param filename Filename to remove the root path from\n * @returns Filename without the root\n */\n static removeRoot(root: string, filename: string): string {\n if (root.length === 0) {\n return filename;\n }\n if (!filename.startsWith(root)) {\n throw new Error(\n `Filename ${filename} does not start with expected root ${root}`\n );\n }\n\n return filename.substring(root.length);\n }\n\n /**\n * Add root to the filename as prefix\n * @param path Filename to prefix root to\n * @returns Filename with root at the prefix\n */\n static addRoot(root: string, path: string): string {\n return `${root}${path}`;\n }\n}\n\nexport default FileUtils;\n"],"mappings":"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"}
1
+ {"version":3,"file":"FileUtils.js","names":["ValidationError","FileNotFoundError","MIME_TYPE","FileUtils","fileExists","fileStorage","name","_asyncToGenerator","info","e","fileExtensionToString","extension","arguments","length","undefined","concat","getDepth","_name$match","hasPath","Error","matches","match","getExtension","components","getBaseName","split","_components$pop","pop","_name$split$pop","getCopyFileName","originalName","extensionPosition","lastIndexOf","substring","copyName","getUniqueCopyFileName","getMimeType","toLowerCase","GROOVY","PYTHON","PYTHON_COMPILED","SCALA","PLAIN_TEXT","UNKNOWN","getParent","parts","join","getPath","startsWith","isPath","endsWith","makePath","replaceExtension","newExtension","index","nameWithoutExtension","extensionString","validateName","reservedNames","invalidCharsRegex","invalidCharLabels","Map","includes","test","_name$match$reduce$ma","_name$match2","reduce","acc","next","map","char","has","get","reducePaths","paths","folders","filter","path","some","folder","removeRoot","root","filename","addRoot"],"sources":["../src/FileUtils.ts"],"sourcesContent":["import { ValidationError } from '@deephaven/utils';\nimport FileNotFoundError from './FileNotFoundError';\nimport { type FileStorage } from './FileStorage';\n\n/**\n * A basic list of some common MIME types.\n */\nexport enum MIME_TYPE {\n GROOVY = 'text/x-groovy',\n PLAIN_TEXT = 'text/plain',\n PYTHON = 'text/x-python',\n PYTHON_COMPILED = 'application/x-python-code',\n SCALA = 'text/x-scala',\n UNKNOWN = '',\n}\n\n/**\n * Collection of utils for operating on file names\n */\nexport class FileUtils {\n static async fileExists(\n fileStorage: FileStorage,\n name: string\n ): Promise<boolean> {\n try {\n await fileStorage.info(name);\n return true;\n } catch (e) {\n // Should probably make sure it's a `FileNotFoundError`, and re-throw the error if it is not\n if (!(e instanceof FileNotFoundError)) {\n throw e;\n }\n return false;\n }\n }\n\n /**\n * Format file extension\n * @param extension File extension to format, defaults to empty string\n * @returns Formatted string - '' for no extension, '.' for empty extension, '.ext' for non-empty extension\n */\n static fileExtensionToString(extension = ''): string {\n return extension.length === 0 ? '' : `.${extension}`;\n }\n\n /**\n * Get the depth (how many directories deep it is) of the provided filename with path.\n * @param name The full file name to get the depth of\n */\n static getDepth(name: string): number {\n if (!FileUtils.hasPath(name)) {\n throw new Error(`Invalid path provided: ${name}`);\n }\n const matches = name.match(/\\//g) ?? [];\n return matches.length - 1;\n }\n\n /**\n * Get just the extension of file name.\n * Note that it just returns the last extension, so 'example.tar.gz' would just return 'gz'.\n * @param name The file name with or without path to get the extension of\n * @returns The file extension\n */\n static getExtension(name: string): string {\n const components = this.getBaseName(name).split('.');\n if (components.length > 1) {\n return components.pop() ?? '';\n }\n return '';\n }\n\n /**\n * Get the base name portion of the file, eg '/foo/bar.txt' => 'bar.txt'\n * @param name The full name including path of the file\n * @returns Just the file name part of the file\n */\n static getBaseName(name: string): string {\n return name.split('/').pop() ?? '';\n }\n\n /**\n * Create copy file name, used for copying unsaved files so doesn't have to be unique\n * @param originalName File name\n * @returns The file name of the copy\n */\n static getCopyFileName(originalName: string): string {\n const extensionPosition = originalName.lastIndexOf('.');\n let extension = null;\n let name = null;\n if (extensionPosition < 0) {\n // No extension\n name = originalName;\n } else {\n name = originalName.substring(0, extensionPosition);\n extension = originalName.substring(extensionPosition + 1);\n }\n const copyName = name ? `${name}-copy` : 'Copy';\n return extension !== null ? `${copyName}.${extension}` : copyName;\n }\n\n static async getUniqueCopyFileName(\n fileStorage: FileStorage,\n originalName: string\n ): Promise<string> {\n let copyName = FileUtils.getCopyFileName(originalName);\n // await in loop is fine here, this isn't a parallel task\n // eslint-disable-next-line no-await-in-loop\n while (await FileUtils.fileExists(fileStorage, copyName)) {\n copyName = FileUtils.getCopyFileName(copyName);\n }\n return copyName;\n }\n\n /**\n * Return a MIME type for the provided file\n * @param name The file name to get the type for\n * @returns A known MIME type if recognized\n */\n static getMimeType(name: string): MIME_TYPE {\n const extension = this.getExtension(name).toLowerCase();\n switch (extension) {\n case 'groovy':\n return MIME_TYPE.GROOVY;\n case 'py':\n return MIME_TYPE.PYTHON;\n case 'pyc':\n return MIME_TYPE.PYTHON_COMPILED;\n case 'scala':\n return MIME_TYPE.SCALA;\n case 'txt':\n return MIME_TYPE.PLAIN_TEXT;\n default:\n return MIME_TYPE.UNKNOWN;\n }\n }\n\n /**\n * Pop the last part of the filename component to return the parent path\n * @param name The file name to get the parent path of\n */\n static getParent(name: string): string {\n if (!FileUtils.hasPath(name)) {\n throw new Error(`Invalid name provided: ${name}`);\n }\n\n const parts = name.split('/');\n while (parts.pop() === '');\n if (parts.length === 0) {\n throw new Error(`No parent for path provided: ${name}`);\n }\n return `${parts.join('/')}/`;\n }\n\n /**\n * Get the path name portion of the file\n * @param name The full path with or without filename to get the path of\n * @returns Just the path with out the file name part, including trailing slash\n */\n static getPath(name: string): string {\n if (!FileUtils.hasPath(name)) {\n throw new Error(`Invalid filename provided: ${name}`);\n }\n const parts = name.split('/');\n parts.pop();\n return `${parts.join('/')}/`;\n }\n\n /**\n * Check if a given file name includes the full path\n * @param name The file name to check\n * @returns True if it's a full path, false otherwise\n */\n static hasPath(name: string): boolean {\n return name.startsWith('/');\n }\n\n /**\n * Check a given file name is a path\n * @param name The file name to check\n * @returns True if it's a full path, false otherwise\n */\n static isPath(name: string): boolean {\n return name.startsWith('/') && name.endsWith('/');\n }\n\n /**\n * Turns a directory file name into a path. Basically ensures there's a trailing slash\n * @param name The directory name to make a path\n */\n static makePath(name: string): string {\n if (!name.endsWith('/')) {\n return `${name}/`;\n }\n return name;\n }\n\n /**\n * Replace extension in the item name\n * @param name Name to replace the extension in\n * @param newExtension New extension, defaults to no extension\n */\n static replaceExtension(name: string, newExtension = ''): string {\n const index = name.lastIndexOf('.');\n const nameWithoutExtension = index > -1 ? name.substring(0, index) : name;\n const extensionString = FileUtils.fileExtensionToString(newExtension);\n return `${nameWithoutExtension}${extensionString}`;\n }\n\n /**\n * Validate the provided name. Throws an error if validation fails\n * @param name The item name to validate\n */\n static validateName(name: string): void {\n // Static checks\n const reservedNames = ['.', '..'];\n // Global flag to show all invalid chars, not just the first match\n const invalidCharsRegex = /[\\\\/\\0]/g;\n const invalidCharLabels = new Map([['\\0', 'null']]);\n\n if (!name) {\n throw new ValidationError(`Name cannot be empty`);\n }\n if (reservedNames.includes(name)) {\n throw new ValidationError(`\"${name}\" is a reserved name`);\n }\n if (invalidCharsRegex.test(name)) {\n throw new ValidationError(\n `Invalid characters in name: \"${\n name\n .match(invalidCharsRegex)\n // Filter out duplicates\n ?.reduce(\n (acc, next) => (acc.includes(next) ? acc : [...acc, next]),\n [] as string[]\n )\n .map(char =>\n invalidCharLabels.has(char) ? invalidCharLabels.get(char) : char\n )\n .join('\", \"') ?? ''\n }\"`\n );\n }\n }\n\n /**\n * Reduce the provided paths to the minimum selection.\n * Removes any nested files or directories if a parent is already selected.\n * @param paths The paths to reduce\n */\n static reducePaths(paths: string[]): string[] {\n const folders = paths.filter(path => FileUtils.isPath(path));\n return paths.filter(\n path =>\n !folders.some(folder => path !== folder && path.startsWith(folder))\n );\n }\n\n /**\n * Removes the root path from the provided file name. Throws if the filename does not start with root.\n * @param root The root to remove\n * @param filename Filename to remove the root path from\n * @returns Filename without the root\n */\n static removeRoot(root: string, filename: string): string {\n if (root.length === 0) {\n return filename;\n }\n if (!filename.startsWith(root)) {\n throw new Error(\n `Filename ${filename} does not start with expected root ${root}`\n );\n }\n\n return filename.substring(root.length);\n }\n\n /**\n * Add root to the filename as prefix\n * @param path Filename to prefix root to\n * @returns Filename with root at the prefix\n */\n static addRoot(root: string, path: string): string {\n return `${root}${path}`;\n }\n}\n\nexport default FileUtils;\n"],"mappings":"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","ignoreList":[]}
@@ -1,5 +1,4 @@
1
1
  import React, { type ChangeEvent, type KeyboardEvent, PureComponent } from 'react';
2
- import PropTypes from 'prop-types';
3
2
  import { type CancelablePromise, ValidationError } from '@deephaven/utils';
4
3
  import { type FileStorageItem, type FileType } from './FileStorage';
5
4
  import type FileStorage from './FileStorage';
@@ -26,17 +25,6 @@ export type NewItemModalState = {
26
25
  newExtension?: string;
27
26
  };
28
27
  declare class NewItemModal extends PureComponent<NewItemModalProps, NewItemModalState> {
29
- static propTypes: {
30
- isOpen: PropTypes.Requireable<boolean>;
31
- title: PropTypes.Validator<string>;
32
- defaultValue: PropTypes.Requireable<string>;
33
- type: PropTypes.Validator<string>;
34
- onSubmit: PropTypes.Requireable<(...args: any[]) => any>;
35
- onCancel: PropTypes.Requireable<(...args: any[]) => any>;
36
- placeholder: PropTypes.Requireable<string>;
37
- storage: PropTypes.Validator<NonNullable<PropTypes.InferProps<{}>>>;
38
- notifyOnExtensionChange: PropTypes.Requireable<boolean>;
39
- };
40
28
  static defaultProps: {
41
29
  isOpen: boolean;
42
30
  defaultValue: string;
@@ -1 +1 @@
1
- {"version":3,"file":"NewItemModal.d.ts","sourceRoot":"","sources":["../src/NewItemModal.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NewItemModal.d.ts","sourceRoot":"","sources":["../src/NewItemModal.tsx"],"names":[],"mappings":"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"}
@@ -4,7 +4,6 @@ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object
4
4
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
5
5
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
6
6
  import React, { PureComponent } from 'react';
7
- import PropTypes from 'prop-types';
8
7
  import classNames from 'classnames';
9
8
  import { Modal, ModalBody, ModalFooter, ModalHeader, BasicModal, Button } from '@deephaven/components';
10
9
  import { Pending, PromiseUtils, ValidationError } from '@deephaven/utils';
@@ -16,9 +15,7 @@ import FileUtils from "./FileUtils.js";
16
15
  import "./NewItemModal.css";
17
16
  import FileExistsError from "./FileExistsError.js";
18
17
  import FileNotFoundError from "./FileNotFoundError.js";
19
- import { jsx as _jsx } from "react/jsx-runtime";
20
- import { jsxs as _jsxs } from "react/jsx-runtime";
21
- import { Fragment as _Fragment } from "react/jsx-runtime";
18
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
22
19
  var log = Log.module('NewItemModal');
23
20
  class NewItemModal extends PureComponent {
24
21
  static getValidationMessage(err) {
@@ -138,7 +135,6 @@ class NewItemModal extends PureComponent {
138
135
  }
139
136
  }
140
137
  }
141
-
142
138
  return name;
143
139
  })();
144
140
  }
@@ -468,17 +464,6 @@ class NewItemModal extends PureComponent {
468
464
  });
469
465
  }
470
466
  }
471
- _defineProperty(NewItemModal, "propTypes", {
472
- isOpen: PropTypes.bool,
473
- title: PropTypes.string.isRequired,
474
- defaultValue: PropTypes.string,
475
- type: PropTypes.oneOf(['file', 'directory']).isRequired,
476
- onSubmit: PropTypes.func,
477
- onCancel: PropTypes.func,
478
- placeholder: PropTypes.string,
479
- storage: PropTypes.shape({}).isRequired,
480
- notifyOnExtensionChange: PropTypes.bool
481
- });
482
467
  _defineProperty(NewItemModal, "defaultProps", {
483
468
  isOpen: false,
484
469
  defaultValue: '/',
@@ -1 +1 @@
1
- {"version":3,"file":"NewItemModal.js","names":["React","PureComponent","PropTypes","classNames","Modal","ModalBody","ModalFooter","ModalHeader","BasicModal","Button","Pending","PromiseUtils","ValidationError","Log","vsHome","FontAwesomeIcon","FileExplorer","FileUtils","FileExistsError","FileNotFoundError","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","log","module","NewItemModal","getValidationMessage","err","info","type","concat","handleError","isCanceled","error","constructor","props","_defineProperty","createRef","Map","handleModalSubmit","bind","handleModalOpened","handleSelect","handleChange","handleKeyDown","handleValidationError","handleOverwriteCancel","handleOverwriteConfirm","handleExtensionChangeCancel","handleExtensionChangeConfirm","handleBreadcrumbSelect","defaultValue","path","hasPath","getPath","state","isSubmitting","prevExtension","getExtension","showExtensionChangeModal","showOverwriteModal","value","getBaseName","componentDidUpdate","prevProps","prevState","isOpen","prevIsOpen","resetValue","isInitialLoad","updateValidationStatus","componentWillUnmount","pending","cancel","cancelableValidatePromise","cancelableExistingItemPromise","setState","validationError","undefined","getValidationPromise","name","checkExisting","arguments","length","makeCancelable","validateName","_this","_asyncToGenerator","storage","existingFile","e","newName","then","catch","focusRenameInput","submitModal","event","target","item","debug","makePath","filename","basename","key","stopPropagation","preventDefault","onCancel","onSubmit","_ref","newValue","replaceExtension","input","inputRef","current","selectionEnd","lastIndexOf","focus","setSelectionRange","skipExtensionCheck","_ref2","notifyOnExtensionChange","newExtension","newItemName","directoryPath","renderPathButtons","pathAsList","split","pop","map","index","i","children","kind","className","onClick","icon","transform","tooltip","render","placeholder","title","isDirectory","prevExtensionText","fileExtensionToString","newExtensionText","submitBtnLabel","nameInputLabel","toggle","onOpened","htmlFor","id","autoComplete","autoCapitalize","autoCorrect","spellCheck","ref","onKeyDown","onChange","onSelect","focusedPath","disabled","headerText","bodyText","onConfirm","cancelButtonText","confirmButtonText","bool","string","isRequired","oneOf","func","shape","isOverwrite"],"sources":["../src/NewItemModal.tsx"],"sourcesContent":["import React, {\n type ChangeEvent,\n type KeyboardEvent,\n PureComponent,\n} from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport {\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader,\n BasicModal,\n Button,\n} from '@deephaven/components';\nimport {\n type CancelablePromise,\n Pending,\n PromiseUtils,\n ValidationError,\n} from '@deephaven/utils';\nimport Log from '@deephaven/log';\nimport { vsHome } from '@deephaven/icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport FileExplorer from './FileExplorer';\nimport { type FileStorageItem, type FileType } from './FileStorage';\nimport type FileStorage from './FileStorage';\nimport FileUtils from './FileUtils';\n\nimport './NewItemModal.scss';\nimport FileExistsError from './FileExistsError';\nimport FileNotFoundError from './FileNotFoundError';\n\nconst log = Log.module('NewItemModal');\n\nexport type NewItemModalProps = typeof NewItemModal.defaultProps & {\n isOpen: boolean;\n title: string;\n defaultValue: string;\n type: FileType;\n onSubmit: (name: string, isOverwrite?: boolean) => void;\n onCancel: () => void;\n placeholder: string;\n storage: FileStorage;\n notifyOnExtensionChange?: boolean;\n};\n\nexport type NewItemModalState = {\n path: string;\n isSubmitting: boolean;\n showExtensionChangeModal: boolean;\n showOverwriteModal: boolean;\n validationError?: ValidationError;\n value: string;\n prevExtension?: string;\n newExtension?: string;\n};\n\nclass NewItemModal extends PureComponent<NewItemModalProps, NewItemModalState> {\n static propTypes = {\n isOpen: PropTypes.bool,\n title: PropTypes.string.isRequired,\n defaultValue: PropTypes.string,\n type: PropTypes.oneOf(['file', 'directory']).isRequired,\n onSubmit: PropTypes.func,\n onCancel: PropTypes.func,\n placeholder: PropTypes.string,\n storage: PropTypes.shape({}).isRequired,\n notifyOnExtensionChange: PropTypes.bool,\n };\n\n static defaultProps = {\n isOpen: false,\n defaultValue: '/',\n notifyOnExtensionChange: false,\n placeholder: '',\n onSubmit: (name: string, isOverwrite?: boolean): void => undefined,\n onCancel: (): void => undefined,\n };\n\n static getValidationMessage(err: Error): string {\n if (err instanceof FileExistsError && err.info.type === 'directory') {\n return 'Error: Cannot overwrite existing directory';\n }\n return `${err}`;\n }\n\n static handleError(err: Error): void {\n if (!PromiseUtils.isCanceled(err)) {\n log.error(err);\n }\n }\n\n constructor(props: NewItemModalProps) {\n super(props);\n this.handleModalSubmit = this.handleModalSubmit.bind(this);\n this.handleModalOpened = this.handleModalOpened.bind(this);\n this.handleSelect = this.handleSelect.bind(this);\n this.handleChange = this.handleChange.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleValidationError = this.handleValidationError.bind(this);\n this.handleOverwriteCancel = this.handleOverwriteCancel.bind(this);\n this.handleOverwriteConfirm = this.handleOverwriteConfirm.bind(this);\n this.handleExtensionChangeCancel =\n this.handleExtensionChangeCancel.bind(this);\n this.handleExtensionChangeConfirm =\n this.handleExtensionChangeConfirm.bind(this);\n this.handleBreadcrumbSelect = this.handleBreadcrumbSelect.bind(this);\n\n const { defaultValue } = props;\n\n const path = FileUtils.hasPath(defaultValue)\n ? FileUtils.getPath(defaultValue)\n : '/';\n\n this.state = {\n isSubmitting: false,\n path,\n prevExtension: FileUtils.getExtension(defaultValue),\n showExtensionChangeModal: false,\n showOverwriteModal: false,\n value: FileUtils.getBaseName(defaultValue),\n };\n }\n\n componentDidUpdate(\n prevProps: NewItemModalProps,\n prevState: NewItemModalState\n ): void {\n const { isOpen } = this.props;\n const { isOpen: prevIsOpen } = prevProps;\n const { value, path } = this.state;\n if (!prevIsOpen && isOpen) {\n this.resetValue();\n this.isInitialLoad = true;\n }\n\n if (prevIsOpen && isOpen) {\n if (\n !this.isInitialLoad &&\n (path !== prevState.path || value !== prevState.value)\n ) {\n this.updateValidationStatus(path, value);\n }\n this.isInitialLoad = false;\n }\n }\n\n componentWillUnmount(): void {\n this.pending.cancel();\n if (this.cancelableValidatePromise) {\n this.cancelableValidatePromise.cancel();\n }\n if (this.cancelableExistingItemPromise) {\n this.cancelableExistingItemPromise.cancel();\n }\n }\n\n private inputRef = React.createRef<HTMLInputElement>();\n\n private cancelableValidatePromise?: CancelablePromise<string>;\n\n private cancelableExistingItemPromise?: CancelablePromise<FileStorageItem | null>;\n\n private pending = new Pending();\n\n private pathMap = new Map();\n\n private isInitialLoad = true;\n\n resetValue(): void {\n const { defaultValue } = this.props as NewItemModalProps;\n const path = FileUtils.hasPath(defaultValue)\n ? FileUtils.getPath(defaultValue)\n : '/';\n this.setState({\n path,\n value: FileUtils.getBaseName(defaultValue),\n validationError: undefined,\n prevExtension: FileUtils.getExtension(defaultValue),\n isSubmitting: false,\n });\n }\n\n getValidationPromise(\n path: string,\n name: string,\n checkExisting = false\n ): CancelablePromise<string> {\n if (this.cancelableValidatePromise) {\n this.cancelableValidatePromise.cancel();\n }\n this.cancelableValidatePromise = PromiseUtils.makeCancelable(\n this.validateName(path, name, checkExisting)\n );\n return this.cancelableValidatePromise;\n }\n\n async validateName(\n path: string,\n name: string,\n checkExisting: boolean\n ): Promise<string> {\n FileUtils.validateName(name);\n\n const { defaultValue, storage } = this.props;\n if (checkExisting) {\n const value = `${path}${name}`;\n if (value !== defaultValue) {\n try {\n const existingFile = await storage.info(value);\n throw new FileExistsError(existingFile);\n } catch (e) {\n if (!(e instanceof FileNotFoundError)) {\n throw e;\n }\n // There is no existing file, ignore\n }\n }\n }\n\n return name;\n }\n\n updateValidationStatus(path: string, newName: string): void {\n this.getValidationPromise(path, newName)\n .then(() => {\n this.setState({ validationError: undefined });\n })\n .catch(this.handleValidationError)\n .catch(NewItemModal.handleError);\n }\n\n handleModalOpened(): void {\n this.focusRenameInput();\n }\n\n handleModalSubmit(): void {\n this.submitModal();\n }\n\n handleChange(event: ChangeEvent<HTMLInputElement>): void {\n const { value } = event.target;\n this.setState({ value });\n }\n\n handleSelect(item: FileStorageItem): void {\n log.debug('handleSelect', item);\n if (item.type === 'directory') {\n this.setState({ path: FileUtils.makePath(item.filename) });\n } else {\n // Use selected item name and folder and focus the input\n const value = item.basename;\n const path = FileUtils.getPath(item.filename);\n this.setState({ value, path }, () => {\n this.focusRenameInput();\n });\n }\n }\n\n // eslint-disable-next-line class-methods-use-this\n handleKeyDown(e: KeyboardEvent): void {\n const { key } = e;\n e.stopPropagation();\n\n switch (key) {\n case 'Enter': {\n // Prevent form submit event\n e.preventDefault();\n this.submitModal();\n break;\n }\n case 'Escape': {\n e.preventDefault();\n const { onCancel } = this.props;\n onCancel();\n break;\n }\n default:\n }\n }\n\n handleValidationError(err: Error): void {\n if (!(err instanceof ValidationError)) {\n throw err;\n }\n log.debug('Validation error', err);\n this.setState({ validationError: err });\n }\n\n handleOverwriteCancel(): void {\n this.setState({\n showOverwriteModal: false,\n isSubmitting: false,\n });\n }\n\n handleOverwriteConfirm(): void {\n this.setState({ showOverwriteModal: false });\n const { onSubmit } = this.props;\n const { path, value } = this.state;\n log.debug('handleOverwriteConfirm', path, value);\n\n onSubmit(`${path}${value}`, true);\n }\n\n handleExtensionChangeCancel(): void {\n log.debug('handleExtensionChangeCancel');\n this.setState(({ value, prevExtension }) => {\n const newValue = FileUtils.replaceExtension(value, prevExtension);\n return {\n showExtensionChangeModal: false,\n value: newValue,\n };\n });\n\n this.submitModal(true);\n }\n\n handleExtensionChangeConfirm(): void {\n log.debug('handleExtensionChangeConfirm');\n this.setState({ showExtensionChangeModal: false });\n this.submitModal(true);\n }\n\n /**\n * Focus rename input and select name part for files, select all text for folders\n */\n focusRenameInput(): void {\n const input = this.inputRef.current;\n if (input) {\n const { type } = this.props;\n const { value } = input;\n const selectionEnd =\n type === 'directory' ? value.length : value.lastIndexOf('.');\n input.focus();\n input.setSelectionRange(\n 0,\n selectionEnd > 0 ? selectionEnd : value.length\n );\n }\n }\n\n submitModal(skipExtensionCheck = false): void {\n this.setState(({ prevExtension, value, path }) => {\n const { notifyOnExtensionChange, type } = this.props;\n log.debug('submitModal', prevExtension, value);\n const newExtension = FileUtils.getExtension(value);\n if (\n notifyOnExtensionChange &&\n !skipExtensionCheck &&\n prevExtension !== null &&\n prevExtension !== newExtension\n ) {\n return {\n isSubmitting: false,\n showExtensionChangeModal: true,\n newExtension,\n };\n }\n\n this.getValidationPromise(path, value, true)\n .then((newItemName: string) => {\n const { onSubmit } = this.props;\n onSubmit(`${path}${value}`);\n })\n .catch(e => {\n // Don't allow using existing names for folders\n // For files, prompt if they want to overwrite existing file\n if (e instanceof FileExistsError) {\n if (type !== 'directory' && e.info.type !== 'directory') {\n this.setState({ showOverwriteModal: true });\n return;\n }\n }\n throw e;\n })\n .catch(e => {\n if (PromiseUtils.isCanceled(e)) {\n this.setState({ isSubmitting: false });\n }\n throw e;\n })\n .catch(this.handleValidationError)\n .catch(NewItemModal.handleError);\n\n return {\n isSubmitting: true,\n showExtensionChangeModal: false,\n newExtension: undefined,\n };\n });\n }\n\n handleBreadcrumbSelect(directoryPath: string): void {\n this.setState({ path: directoryPath });\n }\n\n renderPathButtons(path: string): React.ReactNode {\n const pathAsList = path.split('/');\n pathAsList.pop();\n return pathAsList.map((basename, index) => {\n let directoryPath = '';\n for (let i = 0; i < index; i += 1) {\n directoryPath += `${pathAsList[i]}/`;\n }\n directoryPath += `${basename}/`;\n\n return (\n <React.Fragment key={directoryPath}>\n <Button\n kind=\"ghost\"\n className=\"directory-breadcrumbs\"\n onClick={() => this.handleBreadcrumbSelect(directoryPath)}\n aria-label={index === 0 ? 'Home' : undefined}\n icon={\n index === 0 ? (\n <FontAwesomeIcon icon={vsHome} transform=\"right-1.6\" />\n ) : undefined\n }\n tooltip={index === 0 ? 'Home' : undefined}\n >\n {basename}\n </Button>\n /\n </React.Fragment>\n );\n });\n }\n\n render(): React.ReactNode {\n const { storage, isOpen, onCancel, placeholder, title, type } = this.props;\n const {\n isSubmitting,\n path,\n showExtensionChangeModal,\n showOverwriteModal,\n validationError,\n value,\n prevExtension,\n newExtension,\n } = this.state;\n\n const isDirectory = type === 'directory';\n const prevExtensionText = FileUtils.fileExtensionToString(prevExtension);\n const newExtensionText = FileUtils.fileExtensionToString(newExtension);\n const submitBtnLabel = isDirectory ? 'Create' : 'Save';\n const nameInputLabel = isDirectory ? 'New folder name' : 'Save file as';\n\n return (\n <>\n <Modal\n isOpen={isOpen}\n toggle={onCancel}\n onOpened={this.handleModalOpened}\n className=\"modal-dialog-centered new-file-modal\"\n >\n <ModalHeader toggle={onCancel}>{title}</ModalHeader>\n <ModalBody>\n <form>\n <div className=\"d-flex flex-column new-file-modal-content\">\n <div className=\"flex-grow-0 mb-4\">\n <label htmlFor=\"file-name-input\">{nameInputLabel}</label>\n <input\n id=\"file-name-input\"\n type=\"text\"\n autoComplete=\"off\"\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n spellCheck=\"false\"\n className={classNames('form-control', {\n 'is-invalid': validationError,\n })}\n value={value}\n placeholder={placeholder}\n ref={this.inputRef}\n onKeyDown={this.handleKeyDown}\n onChange={this.handleChange}\n />\n {validationError && (\n <div className=\"invalid-feedback\">\n {NewItemModal.getValidationMessage(validationError)}\n </div>\n )}\n </div>\n <div className=\"flex-grow-0\">\n <label>Directory: /</label>\n {this.renderPathButtons(path)}\n </div>\n <div className=\"flex-grow-1 file-explorer-container\">\n <FileExplorer\n onSelect={this.handleSelect}\n storage={storage}\n focusedPath={path}\n />\n </div>\n </div>\n </form>\n </ModalBody>\n\n <ModalFooter>\n <Button kind=\"secondary\" onClick={onCancel}>\n Cancel\n </Button>\n <Button\n kind=\"primary\"\n disabled={isSubmitting}\n onClick={this.handleModalSubmit}\n >\n {submitBtnLabel}\n </Button>\n </ModalFooter>\n </Modal>\n <BasicModal\n isOpen={showOverwriteModal}\n headerText=\"Confirm overwrite\"\n bodyText=\"File with this name already exists, are you sure you want to overwrite it?\"\n onCancel={this.handleOverwriteCancel}\n onConfirm={this.handleOverwriteConfirm}\n cancelButtonText=\"Cancel\"\n confirmButtonText=\"Overwrite\"\n />\n <BasicModal\n isOpen={showExtensionChangeModal}\n headerText=\"Confirm extension change\"\n bodyText={`Are you sure you want to change extension from \"${prevExtensionText}\" to \"${newExtensionText}\"?`}\n onCancel={this.handleExtensionChangeCancel}\n onConfirm={this.handleExtensionChangeConfirm}\n cancelButtonText={`Keep \"${prevExtensionText}\"`}\n confirmButtonText={`Use \"${newExtensionText}\"`}\n />\n </>\n );\n }\n}\n\nexport default NewItemModal;\n"],"mappings":"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"}
1
+ {"version":3,"file":"NewItemModal.js","names":["React","PureComponent","classNames","Modal","ModalBody","ModalFooter","ModalHeader","BasicModal","Button","Pending","PromiseUtils","ValidationError","Log","vsHome","FontAwesomeIcon","FileExplorer","FileUtils","FileExistsError","FileNotFoundError","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","log","module","NewItemModal","getValidationMessage","err","info","type","concat","handleError","isCanceled","error","constructor","props","_defineProperty","createRef","Map","handleModalSubmit","bind","handleModalOpened","handleSelect","handleChange","handleKeyDown","handleValidationError","handleOverwriteCancel","handleOverwriteConfirm","handleExtensionChangeCancel","handleExtensionChangeConfirm","handleBreadcrumbSelect","defaultValue","path","hasPath","getPath","state","isSubmitting","prevExtension","getExtension","showExtensionChangeModal","showOverwriteModal","value","getBaseName","componentDidUpdate","prevProps","prevState","isOpen","prevIsOpen","resetValue","isInitialLoad","updateValidationStatus","componentWillUnmount","pending","cancel","cancelableValidatePromise","cancelableExistingItemPromise","setState","validationError","undefined","getValidationPromise","name","checkExisting","arguments","length","makeCancelable","validateName","_this","_asyncToGenerator","storage","existingFile","e","newName","then","catch","focusRenameInput","submitModal","event","target","item","debug","makePath","filename","basename","key","stopPropagation","preventDefault","onCancel","onSubmit","_ref","newValue","replaceExtension","input","inputRef","current","selectionEnd","lastIndexOf","focus","setSelectionRange","skipExtensionCheck","_ref2","notifyOnExtensionChange","newExtension","newItemName","directoryPath","renderPathButtons","pathAsList","split","pop","map","index","i","children","kind","className","onClick","icon","transform","tooltip","render","placeholder","title","isDirectory","prevExtensionText","fileExtensionToString","newExtensionText","submitBtnLabel","nameInputLabel","toggle","onOpened","htmlFor","id","autoComplete","autoCapitalize","autoCorrect","spellCheck","ref","onKeyDown","onChange","onSelect","focusedPath","disabled","headerText","bodyText","onConfirm","cancelButtonText","confirmButtonText","isOverwrite"],"sources":["../src/NewItemModal.tsx"],"sourcesContent":["import React, {\n type ChangeEvent,\n type KeyboardEvent,\n PureComponent,\n} from 'react';\nimport classNames from 'classnames';\nimport {\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader,\n BasicModal,\n Button,\n} from '@deephaven/components';\nimport {\n type CancelablePromise,\n Pending,\n PromiseUtils,\n ValidationError,\n} from '@deephaven/utils';\nimport Log from '@deephaven/log';\nimport { vsHome } from '@deephaven/icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport FileExplorer from './FileExplorer';\nimport { type FileStorageItem, type FileType } from './FileStorage';\nimport type FileStorage from './FileStorage';\nimport FileUtils from './FileUtils';\n\nimport './NewItemModal.scss';\nimport FileExistsError from './FileExistsError';\nimport FileNotFoundError from './FileNotFoundError';\n\nconst log = Log.module('NewItemModal');\n\nexport type NewItemModalProps = typeof NewItemModal.defaultProps & {\n isOpen: boolean;\n title: string;\n defaultValue: string;\n type: FileType;\n onSubmit: (name: string, isOverwrite?: boolean) => void;\n onCancel: () => void;\n placeholder: string;\n storage: FileStorage;\n notifyOnExtensionChange?: boolean;\n};\n\nexport type NewItemModalState = {\n path: string;\n isSubmitting: boolean;\n showExtensionChangeModal: boolean;\n showOverwriteModal: boolean;\n validationError?: ValidationError;\n value: string;\n prevExtension?: string;\n newExtension?: string;\n};\n\nclass NewItemModal extends PureComponent<NewItemModalProps, NewItemModalState> {\n static defaultProps = {\n isOpen: false,\n defaultValue: '/',\n notifyOnExtensionChange: false,\n placeholder: '',\n onSubmit: (name: string, isOverwrite?: boolean): void => undefined,\n onCancel: (): void => undefined,\n };\n\n static getValidationMessage(err: Error): string {\n if (err instanceof FileExistsError && err.info.type === 'directory') {\n return 'Error: Cannot overwrite existing directory';\n }\n return `${err}`;\n }\n\n static handleError(err: Error): void {\n if (!PromiseUtils.isCanceled(err)) {\n log.error(err);\n }\n }\n\n constructor(props: NewItemModalProps) {\n super(props);\n this.handleModalSubmit = this.handleModalSubmit.bind(this);\n this.handleModalOpened = this.handleModalOpened.bind(this);\n this.handleSelect = this.handleSelect.bind(this);\n this.handleChange = this.handleChange.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleValidationError = this.handleValidationError.bind(this);\n this.handleOverwriteCancel = this.handleOverwriteCancel.bind(this);\n this.handleOverwriteConfirm = this.handleOverwriteConfirm.bind(this);\n this.handleExtensionChangeCancel =\n this.handleExtensionChangeCancel.bind(this);\n this.handleExtensionChangeConfirm =\n this.handleExtensionChangeConfirm.bind(this);\n this.handleBreadcrumbSelect = this.handleBreadcrumbSelect.bind(this);\n\n const { defaultValue } = props;\n\n const path = FileUtils.hasPath(defaultValue)\n ? FileUtils.getPath(defaultValue)\n : '/';\n\n this.state = {\n isSubmitting: false,\n path,\n prevExtension: FileUtils.getExtension(defaultValue),\n showExtensionChangeModal: false,\n showOverwriteModal: false,\n value: FileUtils.getBaseName(defaultValue),\n };\n }\n\n componentDidUpdate(\n prevProps: NewItemModalProps,\n prevState: NewItemModalState\n ): void {\n const { isOpen } = this.props;\n const { isOpen: prevIsOpen } = prevProps;\n const { value, path } = this.state;\n if (!prevIsOpen && isOpen) {\n this.resetValue();\n this.isInitialLoad = true;\n }\n\n if (prevIsOpen && isOpen) {\n if (\n !this.isInitialLoad &&\n (path !== prevState.path || value !== prevState.value)\n ) {\n this.updateValidationStatus(path, value);\n }\n this.isInitialLoad = false;\n }\n }\n\n componentWillUnmount(): void {\n this.pending.cancel();\n if (this.cancelableValidatePromise) {\n this.cancelableValidatePromise.cancel();\n }\n if (this.cancelableExistingItemPromise) {\n this.cancelableExistingItemPromise.cancel();\n }\n }\n\n private inputRef = React.createRef<HTMLInputElement>();\n\n private cancelableValidatePromise?: CancelablePromise<string>;\n\n private cancelableExistingItemPromise?: CancelablePromise<FileStorageItem | null>;\n\n private pending = new Pending();\n\n private pathMap = new Map();\n\n private isInitialLoad = true;\n\n resetValue(): void {\n const { defaultValue } = this.props as NewItemModalProps;\n const path = FileUtils.hasPath(defaultValue)\n ? FileUtils.getPath(defaultValue)\n : '/';\n this.setState({\n path,\n value: FileUtils.getBaseName(defaultValue),\n validationError: undefined,\n prevExtension: FileUtils.getExtension(defaultValue),\n isSubmitting: false,\n });\n }\n\n getValidationPromise(\n path: string,\n name: string,\n checkExisting = false\n ): CancelablePromise<string> {\n if (this.cancelableValidatePromise) {\n this.cancelableValidatePromise.cancel();\n }\n this.cancelableValidatePromise = PromiseUtils.makeCancelable(\n this.validateName(path, name, checkExisting)\n );\n return this.cancelableValidatePromise;\n }\n\n async validateName(\n path: string,\n name: string,\n checkExisting: boolean\n ): Promise<string> {\n FileUtils.validateName(name);\n\n const { defaultValue, storage } = this.props;\n if (checkExisting) {\n const value = `${path}${name}`;\n if (value !== defaultValue) {\n try {\n const existingFile = await storage.info(value);\n throw new FileExistsError(existingFile);\n } catch (e) {\n if (!(e instanceof FileNotFoundError)) {\n throw e;\n }\n // There is no existing file, ignore\n }\n }\n }\n\n return name;\n }\n\n updateValidationStatus(path: string, newName: string): void {\n this.getValidationPromise(path, newName)\n .then(() => {\n this.setState({ validationError: undefined });\n })\n .catch(this.handleValidationError)\n .catch(NewItemModal.handleError);\n }\n\n handleModalOpened(): void {\n this.focusRenameInput();\n }\n\n handleModalSubmit(): void {\n this.submitModal();\n }\n\n handleChange(event: ChangeEvent<HTMLInputElement>): void {\n const { value } = event.target;\n this.setState({ value });\n }\n\n handleSelect(item: FileStorageItem): void {\n log.debug('handleSelect', item);\n if (item.type === 'directory') {\n this.setState({ path: FileUtils.makePath(item.filename) });\n } else {\n // Use selected item name and folder and focus the input\n const value = item.basename;\n const path = FileUtils.getPath(item.filename);\n this.setState({ value, path }, () => {\n this.focusRenameInput();\n });\n }\n }\n\n // eslint-disable-next-line class-methods-use-this\n handleKeyDown(e: KeyboardEvent): void {\n const { key } = e;\n e.stopPropagation();\n\n switch (key) {\n case 'Enter': {\n // Prevent form submit event\n e.preventDefault();\n this.submitModal();\n break;\n }\n case 'Escape': {\n e.preventDefault();\n const { onCancel } = this.props;\n onCancel();\n break;\n }\n default:\n }\n }\n\n handleValidationError(err: Error): void {\n if (!(err instanceof ValidationError)) {\n throw err;\n }\n log.debug('Validation error', err);\n this.setState({ validationError: err });\n }\n\n handleOverwriteCancel(): void {\n this.setState({\n showOverwriteModal: false,\n isSubmitting: false,\n });\n }\n\n handleOverwriteConfirm(): void {\n this.setState({ showOverwriteModal: false });\n const { onSubmit } = this.props;\n const { path, value } = this.state;\n log.debug('handleOverwriteConfirm', path, value);\n\n onSubmit(`${path}${value}`, true);\n }\n\n handleExtensionChangeCancel(): void {\n log.debug('handleExtensionChangeCancel');\n this.setState(({ value, prevExtension }) => {\n const newValue = FileUtils.replaceExtension(value, prevExtension);\n return {\n showExtensionChangeModal: false,\n value: newValue,\n };\n });\n\n this.submitModal(true);\n }\n\n handleExtensionChangeConfirm(): void {\n log.debug('handleExtensionChangeConfirm');\n this.setState({ showExtensionChangeModal: false });\n this.submitModal(true);\n }\n\n /**\n * Focus rename input and select name part for files, select all text for folders\n */\n focusRenameInput(): void {\n const input = this.inputRef.current;\n if (input) {\n const { type } = this.props;\n const { value } = input;\n const selectionEnd =\n type === 'directory' ? value.length : value.lastIndexOf('.');\n input.focus();\n input.setSelectionRange(\n 0,\n selectionEnd > 0 ? selectionEnd : value.length\n );\n }\n }\n\n submitModal(skipExtensionCheck = false): void {\n this.setState(({ prevExtension, value, path }) => {\n const { notifyOnExtensionChange, type } = this.props;\n log.debug('submitModal', prevExtension, value);\n const newExtension = FileUtils.getExtension(value);\n if (\n notifyOnExtensionChange &&\n !skipExtensionCheck &&\n prevExtension !== null &&\n prevExtension !== newExtension\n ) {\n return {\n isSubmitting: false,\n showExtensionChangeModal: true,\n newExtension,\n };\n }\n\n this.getValidationPromise(path, value, true)\n .then((newItemName: string) => {\n const { onSubmit } = this.props;\n onSubmit(`${path}${value}`);\n })\n .catch(e => {\n // Don't allow using existing names for folders\n // For files, prompt if they want to overwrite existing file\n if (e instanceof FileExistsError) {\n if (type !== 'directory' && e.info.type !== 'directory') {\n this.setState({ showOverwriteModal: true });\n return;\n }\n }\n throw e;\n })\n .catch(e => {\n if (PromiseUtils.isCanceled(e)) {\n this.setState({ isSubmitting: false });\n }\n throw e;\n })\n .catch(this.handleValidationError)\n .catch(NewItemModal.handleError);\n\n return {\n isSubmitting: true,\n showExtensionChangeModal: false,\n newExtension: undefined,\n };\n });\n }\n\n handleBreadcrumbSelect(directoryPath: string): void {\n this.setState({ path: directoryPath });\n }\n\n renderPathButtons(path: string): React.ReactNode {\n const pathAsList = path.split('/');\n pathAsList.pop();\n return pathAsList.map((basename, index) => {\n let directoryPath = '';\n for (let i = 0; i < index; i += 1) {\n directoryPath += `${pathAsList[i]}/`;\n }\n directoryPath += `${basename}/`;\n\n return (\n <React.Fragment key={directoryPath}>\n <Button\n kind=\"ghost\"\n className=\"directory-breadcrumbs\"\n onClick={() => this.handleBreadcrumbSelect(directoryPath)}\n aria-label={index === 0 ? 'Home' : undefined}\n icon={\n index === 0 ? (\n <FontAwesomeIcon icon={vsHome} transform=\"right-1.6\" />\n ) : undefined\n }\n tooltip={index === 0 ? 'Home' : undefined}\n >\n {basename}\n </Button>\n /\n </React.Fragment>\n );\n });\n }\n\n render(): React.ReactNode {\n const { storage, isOpen, onCancel, placeholder, title, type } = this.props;\n const {\n isSubmitting,\n path,\n showExtensionChangeModal,\n showOverwriteModal,\n validationError,\n value,\n prevExtension,\n newExtension,\n } = this.state;\n\n const isDirectory = type === 'directory';\n const prevExtensionText = FileUtils.fileExtensionToString(prevExtension);\n const newExtensionText = FileUtils.fileExtensionToString(newExtension);\n const submitBtnLabel = isDirectory ? 'Create' : 'Save';\n const nameInputLabel = isDirectory ? 'New folder name' : 'Save file as';\n\n return (\n <>\n <Modal\n isOpen={isOpen}\n toggle={onCancel}\n onOpened={this.handleModalOpened}\n className=\"modal-dialog-centered new-file-modal\"\n >\n <ModalHeader toggle={onCancel}>{title}</ModalHeader>\n <ModalBody>\n <form>\n <div className=\"d-flex flex-column new-file-modal-content\">\n <div className=\"flex-grow-0 mb-4\">\n <label htmlFor=\"file-name-input\">{nameInputLabel}</label>\n <input\n id=\"file-name-input\"\n type=\"text\"\n autoComplete=\"off\"\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n spellCheck=\"false\"\n className={classNames('form-control', {\n 'is-invalid': validationError,\n })}\n value={value}\n placeholder={placeholder}\n ref={this.inputRef}\n onKeyDown={this.handleKeyDown}\n onChange={this.handleChange}\n />\n {validationError && (\n <div className=\"invalid-feedback\">\n {NewItemModal.getValidationMessage(validationError)}\n </div>\n )}\n </div>\n <div className=\"flex-grow-0\">\n <label>Directory: /</label>\n {this.renderPathButtons(path)}\n </div>\n <div className=\"flex-grow-1 file-explorer-container\">\n <FileExplorer\n onSelect={this.handleSelect}\n storage={storage}\n focusedPath={path}\n />\n </div>\n </div>\n </form>\n </ModalBody>\n\n <ModalFooter>\n <Button kind=\"secondary\" onClick={onCancel}>\n Cancel\n </Button>\n <Button\n kind=\"primary\"\n disabled={isSubmitting}\n onClick={this.handleModalSubmit}\n >\n {submitBtnLabel}\n </Button>\n </ModalFooter>\n </Modal>\n <BasicModal\n isOpen={showOverwriteModal}\n headerText=\"Confirm overwrite\"\n bodyText=\"File with this name already exists, are you sure you want to overwrite it?\"\n onCancel={this.handleOverwriteCancel}\n onConfirm={this.handleOverwriteConfirm}\n cancelButtonText=\"Cancel\"\n confirmButtonText=\"Overwrite\"\n />\n <BasicModal\n isOpen={showExtensionChangeModal}\n headerText=\"Confirm extension change\"\n bodyText={`Are you sure you want to change extension from \"${prevExtensionText}\" to \"${newExtensionText}\"?`}\n onCancel={this.handleExtensionChangeCancel}\n onConfirm={this.handleExtensionChangeConfirm}\n cancelButtonText={`Keep \"${prevExtensionText}\"`}\n confirmButtonText={`Use \"${newExtensionText}\"`}\n />\n </>\n );\n }\n}\n\nexport default NewItemModal;\n"],"mappings":"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","ignoreList":[]}
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 './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"}
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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deephaven/file-explorer",
3
- "version": "1.7.2-beta.1+a19bc114",
3
+ "version": "1.7.2-react-18-alpha.3+b369a51e",
4
4
  "description": "Deephaven File Explorer React component",
5
5
  "author": "Deephaven Data Labs LLC",
6
6
  "license": "Apache-2.0",
@@ -22,23 +22,22 @@
22
22
  "build:sass": "sass --embed-sources --load-path=../../node_modules ./src:./dist"
23
23
  },
24
24
  "dependencies": {
25
- "@deephaven/components": "^1.7.2-beta.1+a19bc114",
26
- "@deephaven/icons": "^1.7.2-beta.1+a19bc114",
27
- "@deephaven/log": "^1.7.2-beta.1+a19bc114",
28
- "@deephaven/storage": "^1.7.2-beta.1+a19bc114",
29
- "@deephaven/utils": "^1.7.2-beta.1+a19bc114",
25
+ "@deephaven/components": "^1.7.2-react-18-alpha.3+b369a51e",
26
+ "@deephaven/icons": "^1.7.2-react-18-alpha.3+b369a51e",
27
+ "@deephaven/log": "^1.7.2-react-18-alpha.3+b369a51e",
28
+ "@deephaven/storage": "^1.7.2-react-18-alpha.3+b369a51e",
29
+ "@deephaven/utils": "^1.7.2-react-18-alpha.3+b369a51e",
30
30
  "@fortawesome/fontawesome-svg-core": "^6.2.1",
31
31
  "@fortawesome/react-fontawesome": "^0.2.0",
32
32
  "classnames": "^2.3.1",
33
- "lodash.throttle": "^4.1.1",
34
- "prop-types": "^15.7.2"
33
+ "lodash.throttle": "^4.1.1"
35
34
  },
36
35
  "peerDependencies": {
37
36
  "react": ">=16.8.0"
38
37
  },
39
38
  "devDependencies": {
40
- "@deephaven/mocks": "^1.7.2-beta.1+a19bc114",
41
- "@deephaven/test-utils": "^1.7.2-beta.1+a19bc114"
39
+ "@deephaven/mocks": "^1.7.2-react-18-alpha.3+b369a51e",
40
+ "@deephaven/test-utils": "^1.7.2-react-18-alpha.3+b369a51e"
42
41
  },
43
42
  "files": [
44
43
  "dist"
@@ -49,5 +48,5 @@
49
48
  "publishConfig": {
50
49
  "access": "public"
51
50
  },
52
- "gitHead": "a19bc11446da4328bc5c216064ec810b24ee0312"
51
+ "gitHead": "b369a51ee94d212641a14c6ce1f19fcc85168339"
53
52
  }