@deephaven/console 0.19.1-beta.0 → 0.19.2-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/Console.d.ts +2 -2
  2. package/dist/Console.d.ts.map +1 -1
  3. package/dist/Console.js +7 -7
  4. package/dist/Console.js.map +1 -1
  5. package/dist/ConsoleMenu.d.ts.map +1 -1
  6. package/dist/ConsoleMenu.js +6 -6
  7. package/dist/ConsoleMenu.js.map +1 -1
  8. package/dist/command-history/CommandHistoryActions.d.ts.map +1 -1
  9. package/dist/command-history/CommandHistoryActions.js +2 -2
  10. package/dist/command-history/CommandHistoryActions.js.map +1 -1
  11. package/dist/command-history/CommandHistoryItemTooltip.d.ts.map +1 -1
  12. package/dist/command-history/CommandHistoryItemTooltip.js +9 -8
  13. package/dist/command-history/CommandHistoryItemTooltip.js.map +1 -1
  14. package/dist/common/Code.js +1 -1
  15. package/dist/common/Code.js.map +1 -1
  16. package/dist/common/ConsoleUtils.js +2 -2
  17. package/dist/common/ConsoleUtils.js.map +1 -1
  18. package/dist/console-history/ConsoleHistoryItem.d.ts.map +1 -1
  19. package/dist/console-history/ConsoleHistoryItem.js +5 -5
  20. package/dist/console-history/ConsoleHistoryItem.js.map +1 -1
  21. package/dist/csv/CsvInputBar.d.ts.map +1 -1
  22. package/dist/csv/CsvInputBar.js +9 -9
  23. package/dist/csv/CsvInputBar.js.map +1 -1
  24. package/dist/csv/CsvOverlay.d.ts +1 -1
  25. package/dist/csv/CsvOverlay.d.ts.map +1 -1
  26. package/dist/csv/CsvOverlay.js +7 -7
  27. package/dist/csv/CsvOverlay.js.map +1 -1
  28. package/dist/csv/CsvParser.js +1 -1
  29. package/dist/csv/CsvParser.js.map +1 -1
  30. package/dist/csv/CsvTypeParser.js +2 -2
  31. package/dist/csv/CsvTypeParser.js.map +1 -1
  32. package/dist/monaco/MonacoUtils.d.ts +1 -1
  33. package/dist/monaco/MonacoUtils.d.ts.map +1 -1
  34. package/dist/monaco/MonacoUtils.js +4 -4
  35. package/dist/monaco/MonacoUtils.js.map +1 -1
  36. package/dist/notebook/ScriptEditor.d.ts.map +1 -1
  37. package/dist/notebook/ScriptEditor.js +8 -8
  38. package/dist/notebook/ScriptEditor.js.map +1 -1
  39. package/package.json +11 -11
  40. package/dist/common/index.d.js +0 -3
  41. package/dist/common/index.d.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CommandHistoryItemTooltip.js","names":["React","Component","debounce","memoize","LoadingSpinner","TimeUtils","FontAwesomeIcon","vsWarning","Code","LOAD_DATA_DEBOUNCE","MAX_NUMBER_OF_LINES","CommandHistoryItemTooltip","getTimeString","startTime","endTime","deltaTime","Math","round","Date","valueOf","formatElapsedTime","constructor","props","commandHistoryStorage","item","language","id","cleanup","listenItem","handleUpdate","handleError","name","split","join","max","bind","handleTimeout","state","currentTime","now","componentDidMount","loadData","componentDidUpdate","prevProps","prevState","data","timer","result","startTimer","stopTimer","componentWillUnmount","cancel","setInterval","clearInterval","undefined","updateTime","setState","error","onUpdate","render","errorMessage","timeString","previewText","getPreviewText","length"],"sources":["../../src/command-history/CommandHistoryItemTooltip.tsx"],"sourcesContent":["import React, { Component, ReactElement } from 'react';\nimport debounce from 'lodash.debounce';\nimport memoize from 'memoizee';\nimport { LoadingSpinner } from '@deephaven/components';\nimport { TimeUtils } from '@deephaven/utils';\nimport { StorageListenerRemover } from '@deephaven/storage';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsWarning } from '@deephaven/icons';\nimport Code from '../common/Code';\nimport './CommandHistoryItemTooltip.scss';\nimport CommandHistoryStorage, {\n CommandHistoryStorageData,\n CommandHistoryStorageItem,\n} from './CommandHistoryStorage';\n\ninterface CommandHistoryItemTooltipProps {\n item: CommandHistoryStorageItem;\n language: string;\n onUpdate?: (data: CommandHistoryStorageData | null) => void;\n commandHistoryStorage: CommandHistoryStorage;\n}\n\ninterface CommandHistoryItemTooltipState {\n currentTime: number;\n data?: CommandHistoryStorageData;\n error?: string;\n}\n\nconst LOAD_DATA_DEBOUNCE = 250;\nconst MAX_NUMBER_OF_LINES = 2500;\n\nexport class CommandHistoryItemTooltip extends Component<\n CommandHistoryItemTooltipProps,\n CommandHistoryItemTooltipState\n> {\n static defaultProps = {\n onUpdate: (): void => undefined,\n };\n\n static getTimeString(\n startTime: string | undefined,\n endTime: string | number\n ): string | null {\n if (!startTime || !endTime) {\n return null;\n }\n\n const deltaTime = Math.round(\n (new Date(endTime).valueOf() - new Date(startTime).valueOf()) / 1000\n );\n\n if (deltaTime < 1) return '<1s';\n\n return TimeUtils.formatElapsedTime(deltaTime);\n }\n\n constructor(props: CommandHistoryItemTooltipProps) {\n super(props);\n\n this.handleUpdate = this.handleUpdate.bind(this);\n this.handleError = this.handleError.bind(this);\n this.handleTimeout = this.handleTimeout.bind(this);\n\n this.state = {\n currentTime: Date.now(),\n };\n }\n\n componentDidMount(): void {\n this.loadData();\n }\n\n componentDidUpdate(\n prevProps: CommandHistoryItemTooltipProps,\n prevState: CommandHistoryItemTooltipState\n ): void {\n const { data } = this.state;\n\n if (\n this.timer == null &&\n !data?.result &&\n data?.startTime &&\n !data?.endTime\n ) {\n this.startTimer();\n } else if (\n (data?.result && !prevState.data?.result) ||\n (data?.endTime && !prevState.data?.endTime)\n ) {\n // Command complete\n this.stopTimer();\n }\n }\n\n componentWillUnmount(): void {\n this.loadData.cancel();\n if (this.cleanup != null) {\n this.cleanup();\n }\n this.stopTimer();\n }\n\n timer?: NodeJS.Timer;\n\n cleanup?: StorageListenerRemover;\n\n loadData = debounce((): void => {\n const { commandHistoryStorage, item, language } = this.props;\n const { id } = item;\n this.cleanup = commandHistoryStorage.listenItem(\n language,\n id,\n this.handleUpdate,\n this.handleError\n );\n }, LOAD_DATA_DEBOUNCE);\n\n startTimer(): void {\n this.stopTimer();\n\n this.timer = setInterval(this.handleTimeout, 1000);\n }\n\n stopTimer(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = undefined;\n }\n }\n\n updateTime(): void {\n this.setState({\n currentTime: Date.now(),\n });\n }\n\n handleError(error: string): void {\n this.setState({ error: `${error}` });\n }\n\n handleUpdate(item: CommandHistoryStorageItem): void {\n const { data } = item ?? {};\n this.setState({ data });\n\n const { onUpdate } = this.props;\n onUpdate?.(data);\n }\n\n handleTimeout(): void {\n this.updateTime();\n }\n\n getPreviewText = memoize(\n name => name.split('\\n', MAX_NUMBER_OF_LINES).join('\\n'),\n { max: 1 }\n );\n\n render(): ReactElement {\n const {\n item: { name },\n language,\n } = this.props;\n const { currentTime, data, error } = this.state;\n const { result, startTime, endTime } = data ?? {};\n\n const errorMessage = result?.error ?? error;\n\n const timeString = CommandHistoryItemTooltip.getTimeString(\n startTime,\n endTime || currentTime\n );\n\n // colorizing in monaco is mostly a function of the number of lines,\n // it gets real slow after a few thousand lines. Truncate the tooltip\n // to avoid UI locks. The full command is still inserted.\n const previewText = this.getPreviewText(name);\n\n return (\n <div className=\"command-history-item-tooltip\">\n <div className=\"scroll-container\">\n <Code language={language}>{previewText}</Code>\n {previewText.length < name.length && <p>Preview Truncated...</p>}\n </div>\n <div className=\"result-info\">\n <div className=\"d-flex justify-content-between\">\n {errorMessage && (\n <div className=\"text-danger mr-1\">\n <FontAwesomeIcon icon={vsWarning} /> Executed with errors\n </div>\n )}\n <div className=\"time-wrapper\">\n Elapsed time:{' '}\n {timeString ? (\n <span className=\"time-string\">{timeString}</span>\n ) : (\n <LoadingSpinner />\n )}\n </div>\n </div>\n {errorMessage && <div className=\"error-message\">{errorMessage}</div>}\n </div>\n </div>\n );\n }\n}\n\nexport default CommandHistoryItemTooltip;\n"],"mappings":"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"}
1
+ {"version":3,"file":"CommandHistoryItemTooltip.js","names":["React","Component","debounce","memoize","LoadingSpinner","TimeUtils","FontAwesomeIcon","vsWarning","Code","LOAD_DATA_DEBOUNCE","MAX_NUMBER_OF_LINES","CommandHistoryItemTooltip","getTimeString","startTime","endTime","deltaTime","Math","round","Date","valueOf","formatElapsedTime","constructor","props","commandHistoryStorage","item","language","id","cleanup","listenItem","handleUpdate","handleError","name","split","join","max","bind","handleTimeout","state","currentTime","now","componentDidMount","loadData","componentDidUpdate","prevProps","prevState","data","timer","result","Boolean","undefined","startTimer","stopTimer","componentWillUnmount","cancel","setInterval","clearInterval","updateTime","setState","error","onUpdate","render","errorMessage","timeString","previewText","getPreviewText","hasTimeString","length"],"sources":["../../src/command-history/CommandHistoryItemTooltip.tsx"],"sourcesContent":["import React, { Component, ReactElement } from 'react';\nimport debounce from 'lodash.debounce';\nimport memoize from 'memoizee';\nimport { LoadingSpinner } from '@deephaven/components';\nimport { TimeUtils } from '@deephaven/utils';\nimport { StorageListenerRemover } from '@deephaven/storage';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsWarning } from '@deephaven/icons';\nimport Code from '../common/Code';\nimport './CommandHistoryItemTooltip.scss';\nimport CommandHistoryStorage, {\n CommandHistoryStorageData,\n CommandHistoryStorageItem,\n} from './CommandHistoryStorage';\n\ninterface CommandHistoryItemTooltipProps {\n item: CommandHistoryStorageItem;\n language: string;\n onUpdate?: (data: CommandHistoryStorageData | null) => void;\n commandHistoryStorage: CommandHistoryStorage;\n}\n\ninterface CommandHistoryItemTooltipState {\n currentTime: number;\n data?: CommandHistoryStorageData;\n error?: string;\n}\n\nconst LOAD_DATA_DEBOUNCE = 250;\nconst MAX_NUMBER_OF_LINES = 2500;\n\nexport class CommandHistoryItemTooltip extends Component<\n CommandHistoryItemTooltipProps,\n CommandHistoryItemTooltipState\n> {\n static defaultProps = {\n onUpdate: (): void => undefined,\n };\n\n static getTimeString(\n startTime: string | undefined,\n endTime: string | number\n ): string | null {\n if (startTime == null || endTime === '' || endTime === 0) {\n return null;\n }\n\n const deltaTime = Math.round(\n (new Date(endTime).valueOf() - new Date(startTime).valueOf()) / 1000\n );\n\n if (deltaTime < 1) return '<1s';\n\n return TimeUtils.formatElapsedTime(deltaTime);\n }\n\n constructor(props: CommandHistoryItemTooltipProps) {\n super(props);\n\n this.handleUpdate = this.handleUpdate.bind(this);\n this.handleError = this.handleError.bind(this);\n this.handleTimeout = this.handleTimeout.bind(this);\n\n this.state = {\n currentTime: Date.now(),\n };\n }\n\n componentDidMount(): void {\n this.loadData();\n }\n\n componentDidUpdate(\n prevProps: CommandHistoryItemTooltipProps,\n prevState: CommandHistoryItemTooltipState\n ): void {\n const { data } = this.state;\n\n if (\n this.timer == null &&\n !data?.result &&\n Boolean(data?.startTime) &&\n !(data == null || data.endTime === undefined)\n ) {\n this.startTimer();\n } else if (\n (data?.result && !prevState.data?.result) ||\n (Boolean(data?.endTime) &&\n !(prevState.data == null || prevState.data.endTime === undefined))\n ) {\n // Command complete\n this.stopTimer();\n }\n }\n\n componentWillUnmount(): void {\n this.loadData.cancel();\n if (this.cleanup != null) {\n this.cleanup();\n }\n this.stopTimer();\n }\n\n timer?: NodeJS.Timer;\n\n cleanup?: StorageListenerRemover;\n\n loadData = debounce((): void => {\n const { commandHistoryStorage, item, language } = this.props;\n const { id } = item;\n this.cleanup = commandHistoryStorage.listenItem(\n language,\n id,\n this.handleUpdate,\n this.handleError\n );\n }, LOAD_DATA_DEBOUNCE);\n\n startTimer(): void {\n this.stopTimer();\n\n this.timer = setInterval(this.handleTimeout, 1000);\n }\n\n stopTimer(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = undefined;\n }\n }\n\n updateTime(): void {\n this.setState({\n currentTime: Date.now(),\n });\n }\n\n handleError(error: string): void {\n this.setState({ error: `${error}` });\n }\n\n handleUpdate(item: CommandHistoryStorageItem): void {\n const { data } = item ?? {};\n this.setState({ data });\n\n const { onUpdate } = this.props;\n onUpdate?.(data);\n }\n\n handleTimeout(): void {\n this.updateTime();\n }\n\n getPreviewText = memoize(\n name => name.split('\\n', MAX_NUMBER_OF_LINES).join('\\n'),\n { max: 1 }\n );\n\n render(): ReactElement {\n const {\n item: { name },\n language,\n } = this.props;\n const { currentTime, data, error } = this.state;\n const { result, startTime, endTime } = data ?? {};\n\n const errorMessage = result?.error ?? error;\n\n const timeString = CommandHistoryItemTooltip.getTimeString(\n startTime,\n endTime ?? currentTime\n );\n\n // colorizing in monaco is mostly a function of the number of lines,\n // it gets real slow after a few thousand lines. Truncate the tooltip\n // to avoid UI locks. The full command is still inserted.\n const previewText = this.getPreviewText(name);\n\n const hasTimeString = Boolean(timeString);\n return (\n <div className=\"command-history-item-tooltip\">\n <div className=\"scroll-container\">\n <Code language={language}>{previewText}</Code>\n {previewText.length < name.length && <p>Preview Truncated...</p>}\n </div>\n <div className=\"result-info\">\n <div className=\"d-flex justify-content-between\">\n {Boolean(errorMessage) && (\n <div className=\"text-danger mr-1\">\n <FontAwesomeIcon icon={vsWarning} /> Executed with errors\n </div>\n )}\n <div className=\"time-wrapper\">\n Elapsed time:{' '}\n {hasTimeString ? (\n <span className=\"time-string\">{timeString}</span>\n ) : (\n <LoadingSpinner />\n )}\n </div>\n </div>\n {Boolean(errorMessage) && (\n <div className=\"error-message\">{errorMessage}</div>\n )}\n </div>\n </div>\n );\n }\n}\n\nexport default CommandHistoryItemTooltip;\n"],"mappings":"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"}
@@ -21,7 +21,7 @@ class Code extends Component {
21
21
  children
22
22
  } = this.props;
23
23
 
24
- if (this.container && children) {
24
+ if (this.container && children != null) {
25
25
  monaco.editor.colorizeElement(this.container, {
26
26
  theme: 'dh-dark'
27
27
  });
@@ -1 +1 @@
1
- {"version":3,"file":"Code.js","names":["React","Component","monaco","Code","constructor","props","container","componentDidMount","colorize","children","editor","colorizeElement","theme","render","language","pointerEvents"],"sources":["../../src/common/Code.tsx"],"sourcesContent":["import React, { Component, ReactElement, ReactNode } from 'react';\nimport * as monaco from 'monaco-editor';\n\ninterface CodeProps {\n children: ReactNode;\n language: string;\n}\n\nclass Code extends Component<CodeProps, Record<string, never>> {\n constructor(props: CodeProps) {\n super(props);\n\n this.container = null;\n }\n\n componentDidMount(): void {\n this.colorize();\n }\n\n container: HTMLDivElement | null;\n\n colorize(): void {\n const { children } = this.props;\n if (this.container && children) {\n monaco.editor.colorizeElement(this.container, {\n theme: 'dh-dark',\n });\n }\n }\n\n render(): ReactElement {\n const { children, language } = this.props;\n return (\n <div>\n <div\n data-lang={language}\n ref={container => {\n this.container = container;\n }}\n // Add pointerEvents: 'none' has huge benefits on performance with Hit Test testing on large colorized elements.\n // You can still select the text event with this set\n style={{ pointerEvents: 'none' }}\n >\n {children}\n </div>\n </div>\n );\n }\n}\n\nexport default Code;\n"],"mappings":";;AAAA,OAAOA,KAAP,IAAgBC,SAAhB,QAA0D,OAA1D;AACA,OAAO,KAAKC,MAAZ,MAAwB,eAAxB;;AAOA,MAAMC,IAAN,SAAmBF,SAAnB,CAA+D;EAC7DG,WAAW,CAACC,KAAD,EAAmB;IAC5B,MAAMA,KAAN;;IAD4B;;IAG5B,KAAKC,SAAL,GAAiB,IAAjB;EACD;;EAEDC,iBAAiB,GAAS;IACxB,KAAKC,QAAL;EACD;;EAIDA,QAAQ,GAAS;IACf,IAAM;MAAEC;IAAF,IAAe,KAAKJ,KAA1B;;IACA,IAAI,KAAKC,SAAL,IAAkBG,QAAtB,EAAgC;MAC9BP,MAAM,CAACQ,MAAP,CAAcC,eAAd,CAA8B,KAAKL,SAAnC,EAA8C;QAC5CM,KAAK,EAAE;MADqC,CAA9C;IAGD;EACF;;EAEDC,MAAM,GAAiB;IACrB,IAAM;MAAEJ,QAAF;MAAYK;IAAZ,IAAyB,KAAKT,KAApC;IACA,oBACE,8CACE;MACE,aAAWS,QADb;MAEE,GAAG,EAAER,SAAS,IAAI;QAChB,KAAKA,SAAL,GAAiBA,SAAjB;MACD,CAJH,CAKE;MACA;MANF;MAOE,KAAK,EAAE;QAAES,aAAa,EAAE;MAAjB;IAPT,GASGN,QATH,CADF,CADF;EAeD;;AAvC4D;;AA0C/D,eAAeN,IAAf"}
1
+ {"version":3,"file":"Code.js","names":["React","Component","monaco","Code","constructor","props","container","componentDidMount","colorize","children","editor","colorizeElement","theme","render","language","pointerEvents"],"sources":["../../src/common/Code.tsx"],"sourcesContent":["import React, { Component, ReactElement, ReactNode } from 'react';\nimport * as monaco from 'monaco-editor';\n\ninterface CodeProps {\n children: ReactNode;\n language: string;\n}\n\nclass Code extends Component<CodeProps, Record<string, never>> {\n constructor(props: CodeProps) {\n super(props);\n\n this.container = null;\n }\n\n componentDidMount(): void {\n this.colorize();\n }\n\n container: HTMLDivElement | null;\n\n colorize(): void {\n const { children } = this.props;\n if (this.container && children != null) {\n monaco.editor.colorizeElement(this.container, {\n theme: 'dh-dark',\n });\n }\n }\n\n render(): ReactElement {\n const { children, language } = this.props;\n return (\n <div>\n <div\n data-lang={language}\n ref={container => {\n this.container = container;\n }}\n // Add pointerEvents: 'none' has huge benefits on performance with Hit Test testing on large colorized elements.\n // You can still select the text event with this set\n style={{ pointerEvents: 'none' }}\n >\n {children}\n </div>\n </div>\n );\n }\n}\n\nexport default Code;\n"],"mappings":";;AAAA,OAAOA,KAAP,IAAgBC,SAAhB,QAA0D,OAA1D;AACA,OAAO,KAAKC,MAAZ,MAAwB,eAAxB;;AAOA,MAAMC,IAAN,SAAmBF,SAAnB,CAA+D;EAC7DG,WAAW,CAACC,KAAD,EAAmB;IAC5B,MAAMA,KAAN;;IAD4B;;IAG5B,KAAKC,SAAL,GAAiB,IAAjB;EACD;;EAEDC,iBAAiB,GAAS;IACxB,KAAKC,QAAL;EACD;;EAIDA,QAAQ,GAAS;IACf,IAAM;MAAEC;IAAF,IAAe,KAAKJ,KAA1B;;IACA,IAAI,KAAKC,SAAL,IAAkBG,QAAQ,IAAI,IAAlC,EAAwC;MACtCP,MAAM,CAACQ,MAAP,CAAcC,eAAd,CAA8B,KAAKL,SAAnC,EAA8C;QAC5CM,KAAK,EAAE;MADqC,CAA9C;IAGD;EACF;;EAEDC,MAAM,GAAiB;IACrB,IAAM;MAAEJ,QAAF;MAAYK;IAAZ,IAAyB,KAAKT,KAApC;IACA,oBACE,8CACE;MACE,aAAWS,QADb;MAEE,GAAG,EAAER,SAAS,IAAI;QAChB,KAAKA,SAAL,GAAiBA,SAAjB;MACD,CAJH,CAKE;MACA;MANF;MAOE,KAAK,EAAE;QAAES,aAAa,EAAE;MAAjB;IAPT,GASGN,QATH,CADF,CADF;EAeD;;AAvC4D;;AA0C/D,eAAeN,IAAf"}
@@ -21,7 +21,7 @@ class ConsoleUtils {
21
21
 
22
22
 
23
23
  static parseArguments(str) {
24
- if (!str || !(typeof str === 'string' || str instanceof String)) {
24
+ if (str == null || !(typeof str === 'string' || str instanceof String)) {
25
25
  return [];
26
26
  } // Parse can return an object, not just a string. See the `ParseEntry` type def for all types
27
27
  // We must map them all to strings. Filter out comments that will not be needed as well.
@@ -41,7 +41,7 @@ class ConsoleUtils {
41
41
  }
42
42
 
43
43
  static formatTimestamp(date) {
44
- if (!date || !(date instanceof Date)) {
44
+ if (date == null || !(date instanceof Date)) {
45
45
  return null;
46
46
  }
47
47
 
@@ -1 +1 @@
1
- {"version":3,"file":"ConsoleUtils.js","names":["ShellQuote","dh","ConsoleUtils","hasComment","arg","comment","undefined","hasPattern","pattern","hasOp","op","parseArguments","str","String","parse","filter","map","formatTimestamp","date","Date","hours","getHours","padStart","minutes","getMinutes","seconds","getSeconds","milliseconds","getMilliseconds","isTableType","type","VariableType","TABLE","TREETABLE","isWidgetType","FIGURE","OTHERWIDGET","PANDAS","isOpenableType","isFigureType","isPandas"],"sources":["../../src/common/ConsoleUtils.ts"],"sourcesContent":["import ShellQuote, { ParseEntry, ControlOperator } from 'shell-quote';\nimport dh, { VariableTypeUnion } from '@deephaven/jsapi-shim';\n\nclass ConsoleUtils {\n static hasComment(arg: ParseEntry): arg is { comment: string } {\n return (arg as { comment: string }).comment !== undefined;\n }\n\n static hasPattern(arg: ParseEntry): arg is { op: 'glob'; pattern: string } {\n return (arg as { pattern: string }).pattern !== undefined;\n }\n\n static hasOp(arg: ParseEntry): arg is { op: ControlOperator } {\n return (arg as { op: ControlOperator }).op !== undefined;\n }\n\n /**\n * Given the provided text, parse out arguments using shell quoting rules.\n * @param str The text to parse.\n * @returns string[] of the arguments. Empty if no arguments found.\n */\n static parseArguments(str: unknown): string[] {\n if (!str || !(typeof str === 'string' || str instanceof String)) {\n return [];\n }\n\n // Parse can return an object, not just a string. See the `ParseEntry` type def for all types\n // We must map them all to strings. Filter out comments that will not be needed as well.\n return ShellQuote.parse(str as string)\n .filter(arg => !this.hasComment(arg))\n .map(arg => {\n if (this.hasPattern(arg)) {\n return arg.pattern;\n }\n if (this.hasOp(arg)) {\n return arg.op;\n }\n return `${arg}`;\n });\n }\n\n static formatTimestamp(date: Date): string | null {\n if (!date || !(date instanceof Date)) {\n return null;\n }\n\n const hours = `${date.getHours()}`.padStart(2, '0');\n const minutes = `${date.getMinutes()}`.padStart(2, '0');\n const seconds = `${date.getSeconds()}`.padStart(2, '0');\n const milliseconds = `${date.getMilliseconds()}`.padStart(3, '0');\n\n return `${hours}:${minutes}:${seconds}.${milliseconds}`;\n }\n\n static isTableType(type: VariableTypeUnion): boolean {\n return type === dh.VariableType.TABLE || type === dh.VariableType.TREETABLE;\n }\n\n static isWidgetType(type: VariableTypeUnion): boolean {\n return (\n type === dh.VariableType.FIGURE ||\n type === dh.VariableType.OTHERWIDGET ||\n type === dh.VariableType.PANDAS\n );\n }\n\n static isOpenableType(type: VariableTypeUnion): boolean {\n return ConsoleUtils.isTableType(type) || ConsoleUtils.isWidgetType(type);\n }\n\n static isFigureType(type: VariableTypeUnion): boolean {\n return type === dh.VariableType.FIGURE;\n }\n\n static isPandas(type: VariableTypeUnion): boolean {\n return type === dh.VariableType.PANDAS;\n }\n}\n\nexport default ConsoleUtils;\n"],"mappings":"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"}
1
+ {"version":3,"file":"ConsoleUtils.js","names":["ShellQuote","dh","ConsoleUtils","hasComment","arg","comment","undefined","hasPattern","pattern","hasOp","op","parseArguments","str","String","parse","filter","map","formatTimestamp","date","Date","hours","getHours","padStart","minutes","getMinutes","seconds","getSeconds","milliseconds","getMilliseconds","isTableType","type","VariableType","TABLE","TREETABLE","isWidgetType","FIGURE","OTHERWIDGET","PANDAS","isOpenableType","isFigureType","isPandas"],"sources":["../../src/common/ConsoleUtils.ts"],"sourcesContent":["import ShellQuote, { ParseEntry, ControlOperator } from 'shell-quote';\nimport dh, { VariableTypeUnion } from '@deephaven/jsapi-shim';\n\nclass ConsoleUtils {\n static hasComment(arg: ParseEntry): arg is { comment: string } {\n return (arg as { comment: string }).comment !== undefined;\n }\n\n static hasPattern(arg: ParseEntry): arg is { op: 'glob'; pattern: string } {\n return (arg as { pattern: string }).pattern !== undefined;\n }\n\n static hasOp(arg: ParseEntry): arg is { op: ControlOperator } {\n return (arg as { op: ControlOperator }).op !== undefined;\n }\n\n /**\n * Given the provided text, parse out arguments using shell quoting rules.\n * @param str The text to parse.\n * @returns string[] of the arguments. Empty if no arguments found.\n */\n static parseArguments(str: unknown): string[] {\n if (str == null || !(typeof str === 'string' || str instanceof String)) {\n return [];\n }\n\n // Parse can return an object, not just a string. See the `ParseEntry` type def for all types\n // We must map them all to strings. Filter out comments that will not be needed as well.\n return ShellQuote.parse(str as string)\n .filter(arg => !this.hasComment(arg))\n .map(arg => {\n if (this.hasPattern(arg)) {\n return arg.pattern;\n }\n if (this.hasOp(arg)) {\n return arg.op;\n }\n return `${arg}`;\n });\n }\n\n static formatTimestamp(date: Date): string | null {\n if (date == null || !(date instanceof Date)) {\n return null;\n }\n\n const hours = `${date.getHours()}`.padStart(2, '0');\n const minutes = `${date.getMinutes()}`.padStart(2, '0');\n const seconds = `${date.getSeconds()}`.padStart(2, '0');\n const milliseconds = `${date.getMilliseconds()}`.padStart(3, '0');\n\n return `${hours}:${minutes}:${seconds}.${milliseconds}`;\n }\n\n static isTableType(type: VariableTypeUnion): boolean {\n return type === dh.VariableType.TABLE || type === dh.VariableType.TREETABLE;\n }\n\n static isWidgetType(type: VariableTypeUnion): boolean {\n return (\n type === dh.VariableType.FIGURE ||\n type === dh.VariableType.OTHERWIDGET ||\n type === dh.VariableType.PANDAS\n );\n }\n\n static isOpenableType(type: VariableTypeUnion): boolean {\n return ConsoleUtils.isTableType(type) || ConsoleUtils.isWidgetType(type);\n }\n\n static isFigureType(type: VariableTypeUnion): boolean {\n return type === dh.VariableType.FIGURE;\n }\n\n static isPandas(type: VariableTypeUnion): boolean {\n return type === dh.VariableType.PANDAS;\n }\n}\n\nexport default ConsoleUtils;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ConsoleHistoryItem.d.ts","sourceRoot":"","sources":["../../src/console-history/ConsoleHistoryItem.tsx"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAK3D,OAAO,2BAA2B,CAAC;AACnC,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAIjE,UAAU,uBAAuB;IAC/B,IAAI,EAAE,wBAAwB,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,cAAM,kBAAmB,SAAQ,aAAa,CAC5C,uBAAuB,EACvB,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CACtB;IACC,MAAM,CAAC,YAAY;;MAEjB;gBAEU,KAAK,EAAE,uBAAuB;IAO1C,iBAAiB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAOnD,iBAAiB,IAAI,IAAI;IAQzB,MAAM,IAAI,YAAY;CA0FvB;AAED,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"ConsoleHistoryItem.d.ts","sourceRoot":"","sources":["../../src/console-history/ConsoleHistoryItem.tsx"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAK3D,OAAO,2BAA2B,CAAC;AACnC,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAIjE,UAAU,uBAAuB;IAC/B,IAAI,EAAE,wBAAwB,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,cAAM,kBAAmB,SAAQ,aAAa,CAC5C,uBAAuB,EACvB,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CACtB;IACC,MAAM,CAAC,YAAY;;MAEjB;gBAEU,KAAK,EAAE,uBAAuB;IAO1C,iBAAiB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAOnD,iBAAiB,IAAI,IAAI;IAQzB,MAAM,IAAI,YAAY;CA4FvB;AAED,eAAe,kBAAkB,CAAC"}
@@ -33,7 +33,7 @@ class ConsoleHistoryItem extends PureComponent {
33
33
  item
34
34
  } = this.props;
35
35
 
36
- if (item && item.cancelResult) {
36
+ if (item != null && item.cancelResult) {
37
37
  log.debug("Cancelling command: ".concat(item.command));
38
38
  item.cancelResult();
39
39
  }
@@ -51,7 +51,7 @@ class ConsoleHistoryItem extends PureComponent {
51
51
  } = item;
52
52
  var commandElement = null;
53
53
 
54
- if (item.command) {
54
+ if (item.command != null && item.command !== '') {
55
55
  commandElement = /*#__PURE__*/React.createElement("div", {
56
56
  className: "console-history-item-command"
57
57
  }, /*#__PURE__*/React.createElement("div", {
@@ -82,7 +82,7 @@ class ConsoleHistoryItem extends PureComponent {
82
82
  title
83
83
  } = object;
84
84
  var key = "".concat(title);
85
- var btnDisabled = disabled || (disabledObjects !== null && disabledObjects !== void 0 ? disabledObjects : []).indexOf(key) >= 0;
85
+ var btnDisabled = disabled === undefined || disabled || (disabledObjects !== null && disabledObjects !== void 0 ? disabledObjects : []).indexOf(key) >= 0;
86
86
  var element = /*#__PURE__*/React.createElement(ButtonOld, {
87
87
  key: key,
88
88
  onClick: () => this.handleObjectClick(object),
@@ -96,7 +96,7 @@ class ConsoleHistoryItem extends PureComponent {
96
96
  } // If the error has an associated command, we'll actually get a separate ERROR item printed out, so only print an error if there isn't an associated command
97
97
 
98
98
 
99
- if (error && !item.command) {
99
+ if (error != null && item.command == null) {
100
100
  var _message;
101
101
 
102
102
  var errorMessage = "".concat((_message = error.message) !== null && _message !== void 0 ? _message : error);
@@ -112,7 +112,7 @@ class ConsoleHistoryItem extends PureComponent {
112
112
  resultElements.push(element);
113
113
  }
114
114
 
115
- if (message) {
115
+ if (message !== undefined && message !== '') {
116
116
  var _element = /*#__PURE__*/React.createElement("div", {
117
117
  key: "log-message",
118
118
  className: "log-message"
@@ -1 +1 @@
1
- {"version":3,"file":"ConsoleHistoryItem.js","names":["React","PureComponent","ButtonOld","Log","Code","ObjectIcon","ConsoleHistoryItemResult","ConsoleHistoryResultInProgress","ConsoleHistoryResultErrorMessage","log","module","ConsoleHistoryItem","constructor","props","handleCancelClick","bind","handleObjectClick","object","debug","openObject","item","cancelResult","command","render","disabled","language","disabledObjects","result","commandElement","resultElements","error","message","changes","created","updated","forEach","title","key","btnDisabled","indexOf","element","type","push","errorMessage","resultElement","length"],"sources":["../../src/console-history/ConsoleHistoryItem.tsx"],"sourcesContent":["/**\n * Console display for use in the Iris environment.\n */\nimport React, { PureComponent, ReactElement } from 'react';\nimport { ButtonOld } from '@deephaven/components';\nimport Log from '@deephaven/log';\nimport { VariableDefinition } from '@deephaven/jsapi-shim';\nimport { Code, ObjectIcon } from '../common';\nimport ConsoleHistoryItemResult from './ConsoleHistoryItemResult';\nimport ConsoleHistoryResultInProgress from './ConsoleHistoryResultInProgress';\nimport ConsoleHistoryResultErrorMessage from './ConsoleHistoryResultErrorMessage';\nimport './ConsoleHistoryItem.scss';\nimport { ConsoleHistoryActionItem } from './ConsoleHistoryTypes';\n\nconst log = Log.module('ConsoleHistoryItem');\n\ninterface ConsoleHistoryItemProps {\n item: ConsoleHistoryActionItem;\n language: string;\n openObject: (object: VariableDefinition) => void;\n disabled?: boolean;\n}\n\nclass ConsoleHistoryItem extends PureComponent<\n ConsoleHistoryItemProps,\n Record<string, never>\n> {\n static defaultProps = {\n disabled: false,\n };\n\n constructor(props: ConsoleHistoryItemProps) {\n super(props);\n\n this.handleCancelClick = this.handleCancelClick.bind(this);\n this.handleObjectClick = this.handleObjectClick.bind(this);\n }\n\n handleObjectClick(object: VariableDefinition): void {\n log.debug('handleObjectClick', object);\n\n const { openObject } = this.props;\n openObject(object);\n }\n\n handleCancelClick(): void {\n const { item } = this.props;\n if (item && item.cancelResult) {\n log.debug(`Cancelling command: ${item.command}`);\n item.cancelResult();\n }\n }\n\n render(): ReactElement {\n const { disabled, item, language } = this.props;\n const { disabledObjects, result } = item;\n\n let commandElement = null;\n if (item.command) {\n commandElement = (\n <div className=\"console-history-item-command\">\n <div className=\"console-history-gutter\">&gt;</div>\n <div className=\"console-history-content\">\n <Code language={language}>{item.command}</Code>\n </div>\n </div>\n );\n }\n\n const resultElements = [];\n\n if (result) {\n const { error, message, changes } = result;\n\n if (changes) {\n const { created, updated } = changes;\n [...created, ...updated].forEach(object => {\n const { title } = object;\n const key = `${title}`;\n const btnDisabled =\n disabled || (disabledObjects ?? []).indexOf(key) >= 0;\n const element = (\n <ButtonOld\n key={key}\n onClick={() => this.handleObjectClick(object)}\n className=\"btn-primary btn-console btn-console-object\"\n disabled={btnDisabled}\n >\n <ObjectIcon type={object.type} /> {title}\n </ButtonOld>\n );\n resultElements.push(element);\n });\n }\n\n // If the error has an associated command, we'll actually get a separate ERROR item printed out, so only print an error if there isn't an associated command\n if (error && !item.command) {\n let errorMessage = `${(error as { message: string }).message ?? error}`;\n if (!errorMessage) {\n errorMessage = error as string;\n }\n const element = (\n <ConsoleHistoryResultErrorMessage\n key=\"result-error\"\n message={errorMessage}\n />\n );\n resultElements.push(element);\n }\n\n if (message) {\n const element = (\n <div key=\"log-message\" className=\"log-message\">\n {message}\n </div>\n );\n resultElements.push(element);\n }\n } else {\n const element = (\n <ConsoleHistoryResultInProgress\n key=\"in_progress\"\n onCancelClick={this.handleCancelClick}\n disabled={disabled}\n />\n );\n resultElements.push(element);\n }\n\n let resultElement = null;\n if (resultElements.length > 0) {\n resultElement = (\n <ConsoleHistoryItemResult>{resultElements}</ConsoleHistoryItemResult>\n );\n }\n\n return (\n <div className=\"container-fluid\">\n {commandElement}\n {resultElement}\n </div>\n );\n }\n}\n\nexport default ConsoleHistoryItem;\n"],"mappings":";;AAAA;AACA;AACA;AACA,OAAOA,KAAP,IAAgBC,aAAhB,QAAmD,OAAnD;AACA,SAASC,SAAT,QAA0B,uBAA1B;AACA,OAAOC,GAAP,MAAgB,gBAAhB;SAESC,I,EAAMC,U;OACRC,wB;OACAC,8B;OACAC,gC;;AAIP,IAAMC,GAAG,GAAGN,GAAG,CAACO,MAAJ,CAAW,oBAAX,CAAZ;;AASA,MAAMC,kBAAN,SAAiCV,aAAjC,CAGE;EAKAW,WAAW,CAACC,KAAD,EAAiC;IAC1C,MAAMA,KAAN;IAEA,KAAKC,iBAAL,GAAyB,KAAKA,iBAAL,CAAuBC,IAAvB,CAA4B,IAA5B,CAAzB;IACA,KAAKC,iBAAL,GAAyB,KAAKA,iBAAL,CAAuBD,IAAvB,CAA4B,IAA5B,CAAzB;EACD;;EAEDC,iBAAiB,CAACC,MAAD,EAAmC;IAClDR,GAAG,CAACS,KAAJ,CAAU,mBAAV,EAA+BD,MAA/B;IAEA,IAAM;MAAEE;IAAF,IAAiB,KAAKN,KAA5B;IACAM,UAAU,CAACF,MAAD,CAAV;EACD;;EAEDH,iBAAiB,GAAS;IACxB,IAAM;MAAEM;IAAF,IAAW,KAAKP,KAAtB;;IACA,IAAIO,IAAI,IAAIA,IAAI,CAACC,YAAjB,EAA+B;MAC7BZ,GAAG,CAACS,KAAJ,+BAAiCE,IAAI,CAACE,OAAtC;MACAF,IAAI,CAACC,YAAL;IACD;EACF;;EAEDE,MAAM,GAAiB;IACrB,IAAM;MAAEC,QAAF;MAAYJ,IAAZ;MAAkBK;IAAlB,IAA+B,KAAKZ,KAA1C;IACA,IAAM;MAAEa,eAAF;MAAmBC;IAAnB,IAA8BP,IAApC;IAEA,IAAIQ,cAAc,GAAG,IAArB;;IACA,IAAIR,IAAI,CAACE,OAAT,EAAkB;MAChBM,cAAc,gBACZ;QAAK,SAAS,EAAC;MAAf,gBACE;QAAK,SAAS,EAAC;MAAf,OADF,eAEE;QAAK,SAAS,EAAC;MAAf,gBACE,oBAAC,IAAD;QAAM,QAAQ,EAAEH;MAAhB,GAA2BL,IAAI,CAACE,OAAhC,CADF,CAFF,CADF;IAQD;;IAED,IAAMO,cAAc,GAAG,EAAvB;;IAEA,IAAIF,MAAJ,EAAY;MACV,IAAM;QAAEG,KAAF;QAASC,OAAT;QAAkBC;MAAlB,IAA8BL,MAApC;;MAEA,IAAIK,OAAJ,EAAa;QACX,IAAM;UAAEC,OAAF;UAAWC;QAAX,IAAuBF,OAA7B;QACA,CAAC,GAAGC,OAAJ,EAAa,GAAGC,OAAhB,EAAyBC,OAAzB,CAAiClB,MAAM,IAAI;UACzC,IAAM;YAAEmB;UAAF,IAAYnB,MAAlB;UACA,IAAMoB,GAAG,aAAMD,KAAN,CAAT;UACA,IAAME,WAAW,GACfd,QAAQ,IAAI,CAACE,eAAD,aAACA,eAAD,cAACA,eAAD,GAAoB,EAApB,EAAwBa,OAAxB,CAAgCF,GAAhC,KAAwC,CADtD;UAEA,IAAMG,OAAO,gBACX,oBAAC,SAAD;YACE,GAAG,EAAEH,GADP;YAEE,OAAO,EAAE,MAAM,KAAKrB,iBAAL,CAAuBC,MAAvB,CAFjB;YAGE,SAAS,EAAC,4CAHZ;YAIE,QAAQ,EAAEqB;UAJZ,gBAME,oBAAC,UAAD;YAAY,IAAI,EAAErB,MAAM,CAACwB;UAAzB,EANF,OAMqCL,KANrC,CADF;UAUAP,cAAc,CAACa,IAAf,CAAoBF,OAApB;QACD,CAhBD;MAiBD,CAtBS,CAwBV;;;MACA,IAAIV,KAAK,IAAI,CAACV,IAAI,CAACE,OAAnB,EAA4B;QAAA;;QAC1B,IAAIqB,YAAY,yBAAOb,KAAD,CAA+BC,OAArC,+CAAgDD,KAAhD,CAAhB;;QACA,IAAI,CAACa,YAAL,EAAmB;UACjBA,YAAY,GAAGb,KAAf;QACD;;QACD,IAAMU,OAAO,gBACX,oBAAC,gCAAD;UACE,GAAG,EAAC,cADN;UAEE,OAAO,EAAEG;QAFX,EADF;QAMAd,cAAc,CAACa,IAAf,CAAoBF,OAApB;MACD;;MAED,IAAIT,OAAJ,EAAa;QACX,IAAMS,QAAO,gBACX;UAAK,GAAG,EAAC,aAAT;UAAuB,SAAS,EAAC;QAAjC,GACGT,OADH,CADF;;QAKAF,cAAc,CAACa,IAAf,CAAoBF,QAApB;MACD;IACF,CA/CD,MA+CO;MACL,IAAMA,SAAO,gBACX,oBAAC,8BAAD;QACE,GAAG,EAAC,aADN;QAEE,aAAa,EAAE,KAAK1B,iBAFtB;QAGE,QAAQ,EAAEU;MAHZ,EADF;;MAOAK,cAAc,CAACa,IAAf,CAAoBF,SAApB;IACD;;IAED,IAAII,aAAa,GAAG,IAApB;;IACA,IAAIf,cAAc,CAACgB,MAAf,GAAwB,CAA5B,EAA+B;MAC7BD,aAAa,gBACX,oBAAC,wBAAD,QAA2Bf,cAA3B,CADF;IAGD;;IAED,oBACE;MAAK,SAAS,EAAC;IAAf,GACGD,cADH,EAEGgB,aAFH,CADF;EAMD;;AApHD;;gBAHIjC,kB,kBAIkB;EACpBa,QAAQ,EAAE;AADU,C;;AAsHxB,eAAeb,kBAAf"}
1
+ {"version":3,"file":"ConsoleHistoryItem.js","names":["React","PureComponent","ButtonOld","Log","Code","ObjectIcon","ConsoleHistoryItemResult","ConsoleHistoryResultInProgress","ConsoleHistoryResultErrorMessage","log","module","ConsoleHistoryItem","constructor","props","handleCancelClick","bind","handleObjectClick","object","debug","openObject","item","cancelResult","command","render","disabled","language","disabledObjects","result","commandElement","resultElements","error","message","changes","created","updated","forEach","title","key","btnDisabled","undefined","indexOf","element","type","push","errorMessage","resultElement","length"],"sources":["../../src/console-history/ConsoleHistoryItem.tsx"],"sourcesContent":["/**\n * Console display for use in the Iris environment.\n */\nimport React, { PureComponent, ReactElement } from 'react';\nimport { ButtonOld } from '@deephaven/components';\nimport Log from '@deephaven/log';\nimport { VariableDefinition } from '@deephaven/jsapi-shim';\nimport { Code, ObjectIcon } from '../common';\nimport ConsoleHistoryItemResult from './ConsoleHistoryItemResult';\nimport ConsoleHistoryResultInProgress from './ConsoleHistoryResultInProgress';\nimport ConsoleHistoryResultErrorMessage from './ConsoleHistoryResultErrorMessage';\nimport './ConsoleHistoryItem.scss';\nimport { ConsoleHistoryActionItem } from './ConsoleHistoryTypes';\n\nconst log = Log.module('ConsoleHistoryItem');\n\ninterface ConsoleHistoryItemProps {\n item: ConsoleHistoryActionItem;\n language: string;\n openObject: (object: VariableDefinition) => void;\n disabled?: boolean;\n}\n\nclass ConsoleHistoryItem extends PureComponent<\n ConsoleHistoryItemProps,\n Record<string, never>\n> {\n static defaultProps = {\n disabled: false,\n };\n\n constructor(props: ConsoleHistoryItemProps) {\n super(props);\n\n this.handleCancelClick = this.handleCancelClick.bind(this);\n this.handleObjectClick = this.handleObjectClick.bind(this);\n }\n\n handleObjectClick(object: VariableDefinition): void {\n log.debug('handleObjectClick', object);\n\n const { openObject } = this.props;\n openObject(object);\n }\n\n handleCancelClick(): void {\n const { item } = this.props;\n if (item != null && item.cancelResult) {\n log.debug(`Cancelling command: ${item.command}`);\n item.cancelResult();\n }\n }\n\n render(): ReactElement {\n const { disabled, item, language } = this.props;\n const { disabledObjects, result } = item;\n\n let commandElement = null;\n if (item.command != null && item.command !== '') {\n commandElement = (\n <div className=\"console-history-item-command\">\n <div className=\"console-history-gutter\">&gt;</div>\n <div className=\"console-history-content\">\n <Code language={language}>{item.command}</Code>\n </div>\n </div>\n );\n }\n\n const resultElements = [];\n\n if (result) {\n const { error, message, changes } = result;\n\n if (changes) {\n const { created, updated } = changes;\n [...created, ...updated].forEach(object => {\n const { title } = object;\n const key = `${title}`;\n const btnDisabled =\n disabled === undefined ||\n disabled ||\n (disabledObjects ?? []).indexOf(key) >= 0;\n const element = (\n <ButtonOld\n key={key}\n onClick={() => this.handleObjectClick(object)}\n className=\"btn-primary btn-console btn-console-object\"\n disabled={btnDisabled}\n >\n <ObjectIcon type={object.type} /> {title}\n </ButtonOld>\n );\n resultElements.push(element);\n });\n }\n\n // If the error has an associated command, we'll actually get a separate ERROR item printed out, so only print an error if there isn't an associated command\n if (error != null && item.command == null) {\n let errorMessage = `${(error as { message: string }).message ?? error}`;\n if (!errorMessage) {\n errorMessage = error as string;\n }\n const element = (\n <ConsoleHistoryResultErrorMessage\n key=\"result-error\"\n message={errorMessage}\n />\n );\n resultElements.push(element);\n }\n\n if (message !== undefined && message !== '') {\n const element = (\n <div key=\"log-message\" className=\"log-message\">\n {message}\n </div>\n );\n resultElements.push(element);\n }\n } else {\n const element = (\n <ConsoleHistoryResultInProgress\n key=\"in_progress\"\n onCancelClick={this.handleCancelClick}\n disabled={disabled}\n />\n );\n resultElements.push(element);\n }\n\n let resultElement = null;\n if (resultElements.length > 0) {\n resultElement = (\n <ConsoleHistoryItemResult>{resultElements}</ConsoleHistoryItemResult>\n );\n }\n\n return (\n <div className=\"container-fluid\">\n {commandElement}\n {resultElement}\n </div>\n );\n }\n}\n\nexport default ConsoleHistoryItem;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CsvInputBar.d.ts","sourceRoot":"","sources":["../../src/csv/CsvInputBar.tsx"],"names":[],"mappings":"AAAA,OAAc,EACZ,WAAW,EACX,SAAS,EACT,SAAS,EACT,YAAY,EACZ,SAAS,EACV,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAS,MAAM,uBAAuB,CAAC;AAI1D,OAAO,SAAS,MAAM,aAAa,CAAC;AACpC,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,oBAAoB,CAAC;AAU5B,UAAU,gBAAgB;IACxB,OAAO,EAAE,UAAU,CAAC;IACpB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9B,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;CACnD;AAED,UAAU,gBAAgB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,OAAO,UAAU,CAAC,KAAK,CAAC;IACpC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;CAC1B;AACD;;GAEG;AACH,cAAM,WAAY,SAAQ,SAAS,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IACrE,MAAM,CAAC,YAAY;;;;MAIjB;gBAEU,KAAK,EAAE,gBAAgB;IA2BnC,kBAAkB,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI;IAuCrD,oBAAoB,IAAI,IAAI;IAO5B,QAAQ,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAEtC,YAAY,IAAI,IAAI;IAKpB,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI;IAO7B,eAAe,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAI3D,qBAAqB,IAAI,IAAI;IAK7B,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,eAAe,CAAC,GAAG,IAAI;IAmBrD,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,EAAE,KAAK,UAAQ,GAAG,IAAI;IAgDzD,aAAa,CAAC,OAAO,EAAE,IAAI,GAAG,IAAI;IA2BlC,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO;IAY9C,sBAAsB,IAAI,IAAI;IAa9B,SAAS,IAAI,IAAI;IAOjB,qBAAqB,CAAC,KAAK,EAAE,WAAW,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAMlE,MAAM,IAAI,YAAY;CAwFvB;AAED,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"CsvInputBar.d.ts","sourceRoot":"","sources":["../../src/csv/CsvInputBar.tsx"],"names":[],"mappings":"AAAA,OAAc,EACZ,WAAW,EACX,SAAS,EACT,SAAS,EACT,YAAY,EACZ,SAAS,EACV,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAS,MAAM,uBAAuB,CAAC;AAI1D,OAAO,SAAS,MAAM,aAAa,CAAC;AACpC,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,oBAAoB,CAAC;AAU5B,UAAU,gBAAgB;IACxB,OAAO,EAAE,UAAU,CAAC;IACpB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9B,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;CACnD;AAED,UAAU,gBAAgB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,OAAO,UAAU,CAAC,KAAK,CAAC;IACpC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;CAC1B;AACD;;GAEG;AACH,cAAM,WAAY,SAAQ,SAAS,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IACrE,MAAM,CAAC,YAAY;;;;MAIjB;gBAEU,KAAK,EAAE,gBAAgB;IA2BnC,kBAAkB,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI;IA8CrD,oBAAoB,IAAI,IAAI;IAO5B,QAAQ,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAEtC,YAAY,IAAI,IAAI;IAKpB,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI;IAO7B,eAAe,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAI3D,qBAAqB,IAAI,IAAI;IAK7B,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,eAAe,CAAC,GAAG,IAAI;IAmBrD,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,EAAE,KAAK,UAAQ,GAAG,IAAI;IAgDzD,aAAa,CAAC,OAAO,EAAE,IAAI,GAAG,IAAI;IA2BlC,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO;IAY9C,sBAAsB,IAAI,IAAI;IAa9B,SAAS,IAAI,IAAI;IAOjB,qBAAqB,CAAC,KAAK,EAAE,WAAW,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAMlE,MAAM,IAAI,YAAY;CA2FvB;AAED,eAAe,WAAW,CAAC"}
@@ -60,7 +60,7 @@ class CsvInputBar extends Component {
60
60
  tableNameSet
61
61
  } = this.state; // Set the table name from a file
62
62
 
63
- if (!tableNameSet && file && !tableName) {
63
+ if (!tableNameSet && file != null && !tableName) {
64
64
  var _this$inputRef$curren;
65
65
 
66
66
  var dotIndex = file.name.lastIndexOf('.');
@@ -70,7 +70,7 @@ class CsvInputBar extends Component {
70
70
  tableNameSet: true
71
71
  });
72
72
  (_this$inputRef$curren = this.inputRef.current) === null || _this$inputRef$curren === void 0 ? void 0 : _this$inputRef$curren.focus();
73
- } else if (!file && prevProps.file || !paste && prevProps.paste) {
73
+ } else if (file == null && prevProps.file != null || paste == null && prevProps.paste != null) {
74
74
  // The file or paste was unstaged
75
75
  this.setState({
76
76
  tableName: '',
@@ -79,16 +79,16 @@ class CsvInputBar extends Component {
79
79
  } // Focus the name input field on paste
80
80
 
81
81
 
82
- if (paste && !tableName && this.inputRef.current) {
82
+ if (paste != null && paste !== '' && !tableName && this.inputRef.current) {
83
83
  this.inputRef.current.focus();
84
84
  } // Determine parser type by file extension
85
85
 
86
86
 
87
- if (file && file !== prevProps.file) {
87
+ if (file != null && file !== prevProps.file) {
88
88
  this.setState({
89
89
  type: CsvFormats.fromExtension(file.name)
90
90
  });
91
- } else if (paste && !prevProps.paste) {
91
+ } else if (paste != null && paste !== '' && (prevProps.paste === undefined || prevProps.paste === '')) {
92
92
  this.setState({
93
93
  type: CsvFormats.AUTO
94
94
  });
@@ -146,13 +146,13 @@ class CsvInputBar extends Component {
146
146
  paste
147
147
  } = this.props;
148
148
 
149
- if (file) {
149
+ if (file != null) {
150
150
  if (file.name.endsWith('.zip')) {
151
151
  this.handleZipFile(file);
152
152
  } else {
153
153
  this.handleFile(file);
154
154
  }
155
- } else if (paste) {
155
+ } else if (paste !== undefined && paste !== '') {
156
156
  this.handleFile(new Blob([paste], {
157
157
  type: 'text/plain'
158
158
  }));
@@ -302,7 +302,7 @@ class CsvInputBar extends Component {
302
302
  type
303
303
  } = this.state; // A blank table name is invalid for pasted values
304
304
 
305
- var isNameInvalid = paste && !tableName;
305
+ var isNameInvalid = Boolean(paste) && !tableName;
306
306
  return /*#__PURE__*/React.createElement("div", {
307
307
  className: "csv-input-bar"
308
308
  }, !showProgress && /*#__PURE__*/React.createElement("form", {
@@ -342,7 +342,7 @@ class CsvInputBar extends Component {
342
342
  }, "Cancel"), /*#__PURE__*/React.createElement(Button, {
343
343
  kind: "primary",
344
344
  type: "submit",
345
- disabled: !(file || paste) || !tableName
345
+ disabled: !(file !== null || paste !== undefined && paste !== '') || !tableName
346
346
  }, "Upload"))), showProgress && /*#__PURE__*/React.createElement("div", {
347
347
  className: "csv-progress-container"
348
348
  }, /*#__PURE__*/React.createElement("label", null, "Uploading Table"), /*#__PURE__*/React.createElement("div", {
@@ -1 +1 @@
1
- {"version":3,"file":"CsvInputBar.js","names":["React","Component","classNames","Button","Checkbox","Log","DbNameValidator","CsvOverlay","CsvParser","CsvFormats","log","module","TYPE_OPTIONS","Object","entries","TYPES","map","key","value","name","CsvInputBar","constructor","props","handleUpload","bind","handleCancel","handleError","handleTableName","toggleFirstRowHeaders","handleProgress","handleCancelInProgress","handleQueryTypeChange","inputRef","createRef","state","tableName","tableNameSet","isFirstRowHeaders","showProgress","progressValue","type","DEFAULT_TYPE","parser","componentDidUpdate","prevProps","file","paste","dotIndex","lastIndexOf","fileTableName","legalizeTableName","substring","setState","current","focus","fromExtension","AUTO","componentWillUnmount","cancel","onClose","e","onError","error","event","target","stopPropagation","preventDefault","endsWith","handleZipFile","handleFile","Blob","isZip","info","File","size","session","timeZone","onInProgress","handleParseDone","tables","length","bindTableToVariable","then","openTable","catch","mergeTables","table","forEach","t","close","onFileCompleted","readHeaders","onProgress","parse","zipFile","onUpdate","unzip","Error","files","csvFound","i","f","isValidExtension","onOpenTable","render","isNameInvalid","width"],"sources":["../../src/csv/CsvInputBar.tsx"],"sourcesContent":["import React, {\n ChangeEvent,\n Component,\n FormEvent,\n ReactElement,\n RefObject,\n} from 'react';\nimport classNames from 'classnames';\nimport type { JSZipObject } from 'jszip';\nimport { Button, Checkbox } from '@deephaven/components';\nimport { IdeSession, Table } from '@deephaven/jsapi-shim';\nimport Log from '@deephaven/log';\nimport { DbNameValidator } from '@deephaven/utils';\nimport CsvOverlay from './CsvOverlay';\nimport CsvParser from './CsvParser';\nimport CsvFormats from './CsvFormats';\nimport './CsvInputBar.scss';\n\nconst log = Log.module('CsvInputBar');\n\nconst TYPE_OPTIONS = Object.entries(CsvFormats.TYPES).map(([key, value]) => (\n <option key={key} value={key}>\n {value.name}\n </option>\n));\n\ninterface CsvInputBarProps {\n session: IdeSession;\n onOpenTable: (name: string) => void;\n onClose: () => void;\n onUpdate: (update: string) => void;\n onError: (e: unknown) => void;\n file: File;\n paste?: string;\n onInProgress: (boolean: boolean) => void;\n timeZone: string;\n unzip?: (zipFile: File) => Promise<JSZipObject[]>;\n}\n\ninterface CsvInputBarState {\n tableName: string;\n tableNameSet: boolean;\n isFirstRowHeaders: boolean;\n showProgress: boolean;\n progressValue: number;\n type: keyof typeof CsvFormats.TYPES;\n parser: CsvParser | null;\n}\n/**\n * Input controls for CSV upload.\n */\nclass CsvInputBar extends Component<CsvInputBarProps, CsvInputBarState> {\n static defaultProps = {\n file: null,\n paste: null,\n unzip: null,\n };\n\n constructor(props: CsvInputBarProps) {\n super(props);\n\n this.handleUpload = this.handleUpload.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n this.handleError = this.handleError.bind(this);\n this.handleTableName = this.handleTableName.bind(this);\n this.toggleFirstRowHeaders = this.toggleFirstRowHeaders.bind(this);\n this.handleProgress = this.handleProgress.bind(this);\n this.handleCancelInProgress = this.handleCancelInProgress.bind(this);\n this.handleQueryTypeChange = this.handleQueryTypeChange.bind(this);\n\n this.inputRef = React.createRef();\n\n this.state = {\n tableName: '',\n tableNameSet: false,\n isFirstRowHeaders: true,\n showProgress: false,\n progressValue: 0,\n type: CsvFormats.DEFAULT_TYPE,\n parser: null,\n };\n }\n\n // React documentation says it is fine to update state inside an if statment\n /* eslint-disable react/no-did-update-set-state */\n componentDidUpdate(prevProps: CsvInputBarProps): void {\n const { file, paste } = this.props;\n const { tableName, tableNameSet } = this.state;\n // Set the table name from a file\n if (!tableNameSet && file && !tableName) {\n const dotIndex = file.name.lastIndexOf('.');\n const fileTableName = DbNameValidator.legalizeTableName(\n file.name.substring(0, dotIndex)\n );\n this.setState({\n tableName: fileTableName,\n tableNameSet: true,\n });\n this.inputRef.current?.focus();\n } else if ((!file && prevProps.file) || (!paste && prevProps.paste)) {\n // The file or paste was unstaged\n this.setState({\n tableName: '',\n tableNameSet: false,\n });\n }\n\n // Focus the name input field on paste\n if (paste && !tableName && this.inputRef.current) {\n this.inputRef.current.focus();\n }\n\n // Determine parser type by file extension\n if (file && file !== prevProps.file) {\n this.setState({\n type: CsvFormats.fromExtension(file.name),\n });\n } else if (paste && !prevProps.paste) {\n this.setState({\n type: CsvFormats.AUTO,\n });\n }\n }\n\n componentWillUnmount(): void {\n const { parser } = this.state;\n if (parser) {\n parser.cancel();\n }\n }\n\n inputRef: RefObject<HTMLInputElement>;\n\n handleCancel(): void {\n const { onClose } = this.props;\n onClose();\n }\n\n handleError(e: unknown): void {\n const { onClose, onError } = this.props;\n log.error(e);\n onError(e);\n onClose();\n }\n\n handleTableName(event: ChangeEvent<HTMLInputElement>): void {\n this.setState({ tableName: event.target.value, tableNameSet: true });\n }\n\n toggleFirstRowHeaders(): void {\n const { isFirstRowHeaders } = this.state;\n this.setState({ isFirstRowHeaders: !isFirstRowHeaders });\n }\n\n handleUpload(event: FormEvent<HTMLFormElement>): void {\n event.stopPropagation();\n event.preventDefault();\n const { file, paste } = this.props;\n if (file) {\n if (file.name.endsWith('.zip')) {\n this.handleZipFile(file);\n } else {\n this.handleFile(file);\n }\n } else if (paste) {\n this.handleFile(\n new Blob([paste], {\n type: 'text/plain',\n })\n );\n }\n }\n\n handleFile(file: Blob | JSZipObject, isZip = false): void {\n log.info(\n `Starting CSV parser for ${\n file instanceof File ? file.name : 'pasted values'\n } ${isZip ? '' : (file as Blob).size} bytes`\n );\n const { session, timeZone, onInProgress } = this.props;\n const { tableName, isFirstRowHeaders, type } = this.state;\n const handleParseDone = (tables: Table[]) => {\n // Do not bother merging just one table\n if (tables.length === 1) {\n session\n .bindTableToVariable(tables[0], tableName)\n .then(() => this.openTable())\n .catch(e => this.handleError(e));\n } else {\n session\n .mergeTables(tables)\n .then(table => {\n session\n .bindTableToVariable(table, tableName)\n .then(() => this.openTable())\n .catch(e => this.handleError(e));\n tables.forEach(t => t.close());\n })\n .catch(e => this.handleError(e));\n }\n };\n const parser = new CsvParser({\n onFileCompleted: handleParseDone,\n session,\n file,\n type: CsvFormats.TYPES[type],\n readHeaders: isFirstRowHeaders,\n onProgress: this.handleProgress,\n onError: this.handleError,\n timeZone,\n isZip,\n });\n parser.parse();\n this.setState({\n showProgress: true,\n parser,\n });\n // Note that calling onClose will set in progress to false\n onInProgress(true);\n }\n\n handleZipFile(zipFile: File): void {\n const { onUpdate, unzip } = this.props;\n if (unzip == null) {\n this.handleError(new Error('No support for zip files available.'));\n return;\n }\n\n unzip(zipFile)\n .then(files => {\n let csvFound = false;\n // Find the first Csv file in the zip and use that\n for (let i = 0; i < files.length; i += 1) {\n const f = files[i];\n if (CsvOverlay.isValidExtension(f.name)) {\n onUpdate(`Loading ${f.name} as csv from ${zipFile.name}`);\n csvFound = true;\n this.handleFile(f, true);\n break;\n }\n }\n if (!csvFound) {\n throw new Error(`No csv file found in ${zipFile.name}`);\n }\n })\n .catch(e => this.handleError(e));\n }\n\n handleProgress(progressValue: number): boolean {\n const { showProgress } = this.state;\n if (showProgress) {\n this.setState({\n progressValue,\n });\n }\n // Indicates to the caller that the upload has been cancelled\n return !showProgress;\n }\n\n // Cancels an in progress upload\n handleCancelInProgress(): void {\n const { onInProgress } = this.props;\n const { parser } = this.state;\n if (parser) {\n parser.cancel();\n }\n this.setState({\n showProgress: false,\n progressValue: 0,\n });\n onInProgress(false);\n }\n\n openTable(): void {\n const { onOpenTable, onClose } = this.props;\n const { tableName } = this.state;\n onOpenTable(tableName);\n onClose();\n }\n\n handleQueryTypeChange(event: ChangeEvent<HTMLSelectElement>): void {\n this.setState({\n type: event.target.value as keyof typeof CsvFormats.TYPES,\n });\n }\n\n render(): ReactElement {\n const { file, paste } = this.props;\n const {\n tableName,\n isFirstRowHeaders,\n showProgress,\n progressValue,\n type,\n } = this.state;\n // A blank table name is invalid for pasted values\n const isNameInvalid = paste && !tableName;\n return (\n <div className=\"csv-input-bar\">\n {!showProgress && (\n <form\n onSubmit={this.handleUpload}\n className=\"csv-input-bar-container form-inline\"\n >\n <div className=\"form-group\">\n <label htmlFor=\"tableNameInput\">Table name</label>\n <input\n ref={this.inputRef}\n id=\"tableNameInput\"\n type=\"text\"\n className={classNames('form-control', {\n 'is-invalid': isNameInvalid,\n })}\n value={tableName}\n onChange={this.handleTableName}\n />\n </div>\n <div className=\"form-group\">\n <label htmlFor=\"formatSelect\">File format</label>\n <select\n id=\"formatSelect\"\n className=\"custom-select\"\n value={type}\n onChange={this.handleQueryTypeChange}\n >\n {TYPE_OPTIONS}\n </select>\n </div>\n <Checkbox\n className=\"firstRowHeaders\"\n checked={isFirstRowHeaders}\n onChange={this.toggleFirstRowHeaders}\n >\n First row is column headers\n </Checkbox>\n <div className=\"csv-input-buttons form-group\">\n <Button kind=\"secondary\" onClick={this.handleCancel}>\n Cancel\n </Button>\n <Button\n kind=\"primary\"\n type=\"submit\"\n disabled={!(file || paste) || !tableName}\n >\n Upload\n </Button>\n </div>\n </form>\n )}\n {showProgress && (\n <div className=\"csv-progress-container\">\n <label>Uploading Table</label>\n <div className=\"progress\">\n <div\n className=\"progress-bar bg-primary\"\n style={{ width: `${progressValue}%` }}\n aria-valuenow={progressValue}\n aria-valuemin={0}\n aria-valuemax={100}\n />\n </div>\n <label>{progressValue}%</label>\n <button\n type=\"button\"\n className=\"btn btn-primary\"\n onClick={this.handleCancelInProgress}\n >\n Cancel\n </button>\n </div>\n )}\n </div>\n );\n }\n}\n\nexport default CsvInputBar;\n"],"mappings":"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"}
1
+ {"version":3,"file":"CsvInputBar.js","names":["React","Component","classNames","Button","Checkbox","Log","DbNameValidator","CsvOverlay","CsvParser","CsvFormats","log","module","TYPE_OPTIONS","Object","entries","TYPES","map","key","value","name","CsvInputBar","constructor","props","handleUpload","bind","handleCancel","handleError","handleTableName","toggleFirstRowHeaders","handleProgress","handleCancelInProgress","handleQueryTypeChange","inputRef","createRef","state","tableName","tableNameSet","isFirstRowHeaders","showProgress","progressValue","type","DEFAULT_TYPE","parser","componentDidUpdate","prevProps","file","paste","dotIndex","lastIndexOf","fileTableName","legalizeTableName","substring","setState","current","focus","fromExtension","undefined","AUTO","componentWillUnmount","cancel","onClose","e","onError","error","event","target","stopPropagation","preventDefault","endsWith","handleZipFile","handleFile","Blob","isZip","info","File","size","session","timeZone","onInProgress","handleParseDone","tables","length","bindTableToVariable","then","openTable","catch","mergeTables","table","forEach","t","close","onFileCompleted","readHeaders","onProgress","parse","zipFile","onUpdate","unzip","Error","files","csvFound","i","f","isValidExtension","onOpenTable","render","isNameInvalid","Boolean","width"],"sources":["../../src/csv/CsvInputBar.tsx"],"sourcesContent":["import React, {\n ChangeEvent,\n Component,\n FormEvent,\n ReactElement,\n RefObject,\n} from 'react';\nimport classNames from 'classnames';\nimport type { JSZipObject } from 'jszip';\nimport { Button, Checkbox } from '@deephaven/components';\nimport { IdeSession, Table } from '@deephaven/jsapi-shim';\nimport Log from '@deephaven/log';\nimport { DbNameValidator } from '@deephaven/utils';\nimport CsvOverlay from './CsvOverlay';\nimport CsvParser from './CsvParser';\nimport CsvFormats from './CsvFormats';\nimport './CsvInputBar.scss';\n\nconst log = Log.module('CsvInputBar');\n\nconst TYPE_OPTIONS = Object.entries(CsvFormats.TYPES).map(([key, value]) => (\n <option key={key} value={key}>\n {value.name}\n </option>\n));\n\ninterface CsvInputBarProps {\n session: IdeSession;\n onOpenTable: (name: string) => void;\n onClose: () => void;\n onUpdate: (update: string) => void;\n onError: (e: unknown) => void;\n file: File;\n paste?: string;\n onInProgress: (boolean: boolean) => void;\n timeZone: string;\n unzip?: (zipFile: File) => Promise<JSZipObject[]>;\n}\n\ninterface CsvInputBarState {\n tableName: string;\n tableNameSet: boolean;\n isFirstRowHeaders: boolean;\n showProgress: boolean;\n progressValue: number;\n type: keyof typeof CsvFormats.TYPES;\n parser: CsvParser | null;\n}\n/**\n * Input controls for CSV upload.\n */\nclass CsvInputBar extends Component<CsvInputBarProps, CsvInputBarState> {\n static defaultProps = {\n file: null,\n paste: null,\n unzip: null,\n };\n\n constructor(props: CsvInputBarProps) {\n super(props);\n\n this.handleUpload = this.handleUpload.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n this.handleError = this.handleError.bind(this);\n this.handleTableName = this.handleTableName.bind(this);\n this.toggleFirstRowHeaders = this.toggleFirstRowHeaders.bind(this);\n this.handleProgress = this.handleProgress.bind(this);\n this.handleCancelInProgress = this.handleCancelInProgress.bind(this);\n this.handleQueryTypeChange = this.handleQueryTypeChange.bind(this);\n\n this.inputRef = React.createRef();\n\n this.state = {\n tableName: '',\n tableNameSet: false,\n isFirstRowHeaders: true,\n showProgress: false,\n progressValue: 0,\n type: CsvFormats.DEFAULT_TYPE,\n parser: null,\n };\n }\n\n // React documentation says it is fine to update state inside an if statment\n /* eslint-disable react/no-did-update-set-state */\n componentDidUpdate(prevProps: CsvInputBarProps): void {\n const { file, paste } = this.props;\n const { tableName, tableNameSet } = this.state;\n // Set the table name from a file\n if (!tableNameSet && file != null && !tableName) {\n const dotIndex = file.name.lastIndexOf('.');\n const fileTableName = DbNameValidator.legalizeTableName(\n file.name.substring(0, dotIndex)\n );\n this.setState({\n tableName: fileTableName,\n tableNameSet: true,\n });\n this.inputRef.current?.focus();\n } else if (\n (file == null && prevProps.file != null) ||\n (paste == null && prevProps.paste != null)\n ) {\n // The file or paste was unstaged\n this.setState({\n tableName: '',\n tableNameSet: false,\n });\n }\n\n // Focus the name input field on paste\n if (paste != null && paste !== '' && !tableName && this.inputRef.current) {\n this.inputRef.current.focus();\n }\n\n // Determine parser type by file extension\n if (file != null && file !== prevProps.file) {\n this.setState({\n type: CsvFormats.fromExtension(file.name),\n });\n } else if (\n paste != null &&\n paste !== '' &&\n (prevProps.paste === undefined || prevProps.paste === '')\n ) {\n this.setState({\n type: CsvFormats.AUTO,\n });\n }\n }\n\n componentWillUnmount(): void {\n const { parser } = this.state;\n if (parser) {\n parser.cancel();\n }\n }\n\n inputRef: RefObject<HTMLInputElement>;\n\n handleCancel(): void {\n const { onClose } = this.props;\n onClose();\n }\n\n handleError(e: unknown): void {\n const { onClose, onError } = this.props;\n log.error(e);\n onError(e);\n onClose();\n }\n\n handleTableName(event: ChangeEvent<HTMLInputElement>): void {\n this.setState({ tableName: event.target.value, tableNameSet: true });\n }\n\n toggleFirstRowHeaders(): void {\n const { isFirstRowHeaders } = this.state;\n this.setState({ isFirstRowHeaders: !isFirstRowHeaders });\n }\n\n handleUpload(event: FormEvent<HTMLFormElement>): void {\n event.stopPropagation();\n event.preventDefault();\n const { file, paste } = this.props;\n if (file != null) {\n if (file.name.endsWith('.zip')) {\n this.handleZipFile(file);\n } else {\n this.handleFile(file);\n }\n } else if (paste !== undefined && paste !== '') {\n this.handleFile(\n new Blob([paste], {\n type: 'text/plain',\n })\n );\n }\n }\n\n handleFile(file: Blob | JSZipObject, isZip = false): void {\n log.info(\n `Starting CSV parser for ${\n file instanceof File ? file.name : 'pasted values'\n } ${isZip ? '' : (file as Blob).size} bytes`\n );\n const { session, timeZone, onInProgress } = this.props;\n const { tableName, isFirstRowHeaders, type } = this.state;\n const handleParseDone = (tables: Table[]) => {\n // Do not bother merging just one table\n if (tables.length === 1) {\n session\n .bindTableToVariable(tables[0], tableName)\n .then(() => this.openTable())\n .catch(e => this.handleError(e));\n } else {\n session\n .mergeTables(tables)\n .then(table => {\n session\n .bindTableToVariable(table, tableName)\n .then(() => this.openTable())\n .catch(e => this.handleError(e));\n tables.forEach(t => t.close());\n })\n .catch(e => this.handleError(e));\n }\n };\n const parser = new CsvParser({\n onFileCompleted: handleParseDone,\n session,\n file,\n type: CsvFormats.TYPES[type],\n readHeaders: isFirstRowHeaders,\n onProgress: this.handleProgress,\n onError: this.handleError,\n timeZone,\n isZip,\n });\n parser.parse();\n this.setState({\n showProgress: true,\n parser,\n });\n // Note that calling onClose will set in progress to false\n onInProgress(true);\n }\n\n handleZipFile(zipFile: File): void {\n const { onUpdate, unzip } = this.props;\n if (unzip == null) {\n this.handleError(new Error('No support for zip files available.'));\n return;\n }\n\n unzip(zipFile)\n .then(files => {\n let csvFound = false;\n // Find the first Csv file in the zip and use that\n for (let i = 0; i < files.length; i += 1) {\n const f = files[i];\n if (CsvOverlay.isValidExtension(f.name)) {\n onUpdate(`Loading ${f.name} as csv from ${zipFile.name}`);\n csvFound = true;\n this.handleFile(f, true);\n break;\n }\n }\n if (!csvFound) {\n throw new Error(`No csv file found in ${zipFile.name}`);\n }\n })\n .catch(e => this.handleError(e));\n }\n\n handleProgress(progressValue: number): boolean {\n const { showProgress } = this.state;\n if (showProgress) {\n this.setState({\n progressValue,\n });\n }\n // Indicates to the caller that the upload has been cancelled\n return !showProgress;\n }\n\n // Cancels an in progress upload\n handleCancelInProgress(): void {\n const { onInProgress } = this.props;\n const { parser } = this.state;\n if (parser) {\n parser.cancel();\n }\n this.setState({\n showProgress: false,\n progressValue: 0,\n });\n onInProgress(false);\n }\n\n openTable(): void {\n const { onOpenTable, onClose } = this.props;\n const { tableName } = this.state;\n onOpenTable(tableName);\n onClose();\n }\n\n handleQueryTypeChange(event: ChangeEvent<HTMLSelectElement>): void {\n this.setState({\n type: event.target.value as keyof typeof CsvFormats.TYPES,\n });\n }\n\n render(): ReactElement {\n const { file, paste } = this.props;\n const {\n tableName,\n isFirstRowHeaders,\n showProgress,\n progressValue,\n type,\n } = this.state;\n // A blank table name is invalid for pasted values\n const isNameInvalid = Boolean(paste) && !tableName;\n return (\n <div className=\"csv-input-bar\">\n {!showProgress && (\n <form\n onSubmit={this.handleUpload}\n className=\"csv-input-bar-container form-inline\"\n >\n <div className=\"form-group\">\n <label htmlFor=\"tableNameInput\">Table name</label>\n <input\n ref={this.inputRef}\n id=\"tableNameInput\"\n type=\"text\"\n className={classNames('form-control', {\n 'is-invalid': isNameInvalid,\n })}\n value={tableName}\n onChange={this.handleTableName}\n />\n </div>\n <div className=\"form-group\">\n <label htmlFor=\"formatSelect\">File format</label>\n <select\n id=\"formatSelect\"\n className=\"custom-select\"\n value={type}\n onChange={this.handleQueryTypeChange}\n >\n {TYPE_OPTIONS}\n </select>\n </div>\n <Checkbox\n className=\"firstRowHeaders\"\n checked={isFirstRowHeaders}\n onChange={this.toggleFirstRowHeaders}\n >\n First row is column headers\n </Checkbox>\n <div className=\"csv-input-buttons form-group\">\n <Button kind=\"secondary\" onClick={this.handleCancel}>\n Cancel\n </Button>\n <Button\n kind=\"primary\"\n type=\"submit\"\n disabled={\n !(file !== null || (paste !== undefined && paste !== '')) ||\n !tableName\n }\n >\n Upload\n </Button>\n </div>\n </form>\n )}\n {showProgress && (\n <div className=\"csv-progress-container\">\n <label>Uploading Table</label>\n <div className=\"progress\">\n <div\n className=\"progress-bar bg-primary\"\n style={{ width: `${progressValue}%` }}\n aria-valuenow={progressValue}\n aria-valuemin={0}\n aria-valuemax={100}\n />\n </div>\n <label>{progressValue}%</label>\n <button\n type=\"button\"\n className=\"btn btn-primary\"\n onClick={this.handleCancelInProgress}\n >\n Cancel\n </button>\n </div>\n )}\n </div>\n );\n }\n}\n\nexport default CsvInputBar;\n"],"mappings":"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"}
@@ -43,7 +43,7 @@ declare class CsvOverlay extends Component<CsvOverlayProps, CsvOverlayState> {
43
43
  handleMenuPaste(): void;
44
44
  handlePasteEvent(event: ClipboardEvent): void;
45
45
  makeContextMenuItems(): ContextAction[];
46
- getValidExtensions: (this: any, allowZip: any) => string[];
46
+ getValidExtensions: (allowZip: boolean) => string[];
47
47
  getAcceptString: (this: any, allowZip: any) => string;
48
48
  getFileTypeErrorString: (this: any, allowZip: any) => string;
49
49
  render(): ReactElement;
@@ -1 +1 @@
1
- {"version":3,"file":"CsvOverlay.d.ts","sourceRoot":"","sources":["../../src/csv/CsvOverlay.tsx"],"names":[],"mappings":"AAAA,OAAc,EACZ,WAAW,EACX,SAAS,EACT,SAAS,EACT,UAAU,EACV,YAAY,EACZ,SAAS,EACV,MAAM,OAAO,CAAC;AAGf,OAAO,EACL,aAAa,EAGd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAIL,cAAc,EAKf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,mBAAmB,CAAC;AAG3B,UAAU,eAAe;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACnC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9B,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,UAAU,eAAe;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAUD;;GAEG;AACH,cAAM,UAAW,SAAQ,SAAS,CAAC,eAAe,EAAE,eAAe,CAAC;IAClE,MAAM,CAAC,YAAY;;;MAGjB;IAEF,MAAM,CAAC,mBAAmB,SAAiC;IAE3D,MAAM,CAAC,eAAe,SAA6B;IAEnD,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO;IAQvD,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,UAAQ,GAAG,OAAO;IAOhE,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,SAAS,GAAG,IAAI;IAKzC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc;gBAapC,KAAK,EAAE,eAAe;IAkBlC,iBAAiB,IAAI,IAAI;IAKzB,oBAAoB,IAAI,IAAI;IAI5B,QAAQ,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAEtC,OAAO,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;IAEnC,gBAAgB,IAAI,IAAI;IAOxB,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,GAAG,IAAI;IASvD,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,GAAG,IAAI;IAyB9C,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAWvD,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAS5B,eAAe,IAAI,IAAI;IAiBvB,gBAAgB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAM7C,oBAAoB,IAAI,aAAa,EAAE;IAavC,kBAAkB,yCAEhB;IAEF,eAAe,uCAEb;IAEF,sBAAsB,uCAEpB;IAEF,MAAM,IAAI,YAAY;CA+EvB;AAED,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"CsvOverlay.d.ts","sourceRoot":"","sources":["../../src/csv/CsvOverlay.tsx"],"names":[],"mappings":"AAAA,OAAc,EACZ,WAAW,EACX,SAAS,EACT,SAAS,EACT,UAAU,EACV,YAAY,EACZ,SAAS,EACV,MAAM,OAAO,CAAC;AAGf,OAAO,EACL,aAAa,EAGd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAIL,cAAc,EAKf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,mBAAmB,CAAC;AAG3B,UAAU,eAAe;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACnC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9B,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,UAAU,eAAe;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAUD;;GAEG;AACH,cAAM,UAAW,SAAQ,SAAS,CAAC,eAAe,EAAE,eAAe,CAAC;IAClE,MAAM,CAAC,YAAY;;;MAGjB;IAEF,MAAM,CAAC,mBAAmB,SAAiC;IAE3D,MAAM,CAAC,eAAe,SAA6B;IAEnD,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO;IAQvD,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,UAAQ,GAAG,OAAO;IAOhE,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,SAAS,GAAG,IAAI;IAKzC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc;gBAapC,KAAK,EAAE,eAAe;IAkBlC,iBAAiB,IAAI,IAAI;IAKzB,oBAAoB,IAAI,IAAI;IAI5B,QAAQ,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAEtC,OAAO,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;IAEnC,gBAAgB,IAAI,IAAI;IAOxB,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,GAAG,IAAI;IASvD,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,GAAG,IAAI;IA6B9C,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAWvD,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAS5B,eAAe,IAAI,IAAI;IAiBvB,gBAAgB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAM7C,oBAAoB,IAAI,aAAa,EAAE;IAavC,kBAAkB,aAAsB,OAAO,cAE7C;IAEF,eAAe,uCAEb;IAEF,sBAAsB,uCAEpB;IAEF,MAAM,IAAI,YAAY;CA+EvB;AAED,eAAe,UAAU,CAAC"}
@@ -17,7 +17,7 @@ var ZIP_EXTENSIONS = ['.zip'];
17
17
 
18
18
  class CsvOverlay extends Component {
19
19
  static isValidDropItem(item) {
20
- return item && item.kind === 'file' && !INVALID_MIME_TYPES.find(invalid => invalid.test(item.type));
20
+ return item != null && item.kind === 'file' && !INVALID_MIME_TYPES.find(invalid => invalid.test(item.type));
21
21
  }
22
22
 
23
23
  static isValidExtension(name) {
@@ -115,12 +115,12 @@ class CsvOverlay extends Component {
115
115
  e.preventDefault();
116
116
  e.stopPropagation();
117
117
 
118
- if (dragError) {
118
+ if (dragError != null) {
119
119
  clearDragError();
120
120
  return;
121
121
  }
122
122
 
123
- if (!e.dataTransfer || !e.dataTransfer.items) {
123
+ if (e.dataTransfer == null || e.dataTransfer.items == null || e.dataTransfer.items.length === 0) {
124
124
  return;
125
125
  }
126
126
 
@@ -209,7 +209,7 @@ class CsvOverlay extends Component {
209
209
  selectedFileName,
210
210
  dropError
211
211
  } = this.state;
212
- var error = dragError || dropError;
212
+ var error = dragError !== null && dragError !== void 0 ? dragError : dropError;
213
213
  var contextActions = this.makeContextMenuItems();
214
214
  return /*#__PURE__*/React.createElement("div", {
215
215
  ref: this.divElem,
@@ -229,7 +229,7 @@ class CsvOverlay extends Component {
229
229
  },
230
230
  onChange: this.handleFiles,
231
231
  "data-testid": "fileElem"
232
- }), !selectedFileName && !error && /*#__PURE__*/React.createElement("div", {
232
+ }), !selectedFileName && (error === undefined || error === '') && /*#__PURE__*/React.createElement("div", {
233
233
  className: "message-content"
234
234
  }, /*#__PURE__*/React.createElement("div", {
235
235
  className: "message-icon"
@@ -241,7 +241,7 @@ class CsvOverlay extends Component {
241
241
  type: "button",
242
242
  className: "btn btn-primary",
243
243
  onClick: this.handleSelectFile
244
- }, "Select File...")), selectedFileName && !error && /*#__PURE__*/React.createElement("div", {
244
+ }, "Select File...")), selectedFileName && (error === undefined || error === '') && /*#__PURE__*/React.createElement("div", {
245
245
  className: "selected-content"
246
246
  }, /*#__PURE__*/React.createElement("div", {
247
247
  className: "selected-icon"
@@ -257,7 +257,7 @@ class CsvOverlay extends Component {
257
257
  onClick: this.unstageFile
258
258
  }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
259
259
  icon: vsTrash
260
- }))))), error && /*#__PURE__*/React.createElement("div", {
260
+ }))))), Boolean(error) && /*#__PURE__*/React.createElement("div", {
261
261
  className: "message-content"
262
262
  }, /*#__PURE__*/React.createElement("div", {
263
263
  className: "message-icon"
@@ -1 +1 @@
1
- {"version":3,"file":"CsvOverlay.js","names":["React","Component","memoize","FontAwesomeIcon","ContextActions","GLOBAL_SHORTCUTS","dhFileCsv","dhFileDownload","dhFileSpreadsheet","vsClippy","vsFileZip","vsTrash","vsWarning","assertNotNull","TextUtils","PASTED_VALUES","INVALID_MIME_TYPES","VALID_EXTENSIONS","ZIP_EXTENSIONS","CsvOverlay","isValidDropItem","item","kind","find","invalid","test","type","isValidExtension","name","allowZip","some","ext","endsWith","handleDragOver","e","preventDefault","stopPropagation","getIcon","fileName","constructor","props","getValidExtensions","join","handleSelectFile","bind","handleFiles","handleDrop","unstageFile","handleMenuPaste","handlePasteEvent","fileElem","createRef","divElem","state","selectedFileName","componentDidMount","current","addEventListener","focus","componentWillUnmount","removeEventListener","value","click","event","files","target","handleFile","clearDragError","dragError","dataTransfer","items","file","getAsFile","setState","dropError","FILE_TYPE_ERROR","onCancel","undefined","onFileOpened","onPaste","onError","uploadInProgress","navigator","clipboard","readText","then","clipText","catch","makeContextMenuItems","title","icon","action","shortcut","PASTE","disabled","render","error","contextActions","getAcceptString","display","getFileTypeErrorString"],"sources":["../../src/csv/CsvOverlay.tsx"],"sourcesContent":["import React, {\n ChangeEvent,\n Component,\n DragEvent,\n MouseEvent,\n ReactElement,\n RefObject,\n} from 'react';\nimport memoize from 'memoize-one';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n ContextAction,\n ContextActions,\n GLOBAL_SHORTCUTS,\n} from '@deephaven/components';\nimport {\n dhFileCsv,\n dhFileDownload,\n dhFileSpreadsheet,\n IconDefinition,\n vsClippy,\n vsFileZip,\n vsTrash,\n vsWarning,\n} from '@deephaven/icons';\nimport './CsvOverlay.scss';\nimport { assertNotNull, TextUtils } from '@deephaven/utils';\n\ninterface CsvOverlayProps {\n allowZip: boolean;\n onFileOpened: (file: File) => void;\n onCancel: () => void;\n onPaste: (clipText: string) => void;\n clearDragError: () => void;\n dragError: string | null;\n onError: (e: unknown) => void;\n uploadInProgress: boolean;\n}\n\ninterface CsvOverlayState {\n selectedFileName: string;\n dropError?: string;\n}\n\nconst PASTED_VALUES = 'pasted values';\n\nconst INVALID_MIME_TYPES = [/^audio.*/, /^font.*/, /^image.*/, /^video.*/];\n\nconst VALID_EXTENSIONS = ['.csv', '.tsv', '.tab', '.psv', '.dsv', '.txt'];\n\nconst ZIP_EXTENSIONS = ['.zip'];\n\n/**\n * Overlay that is displayed when uploading a CSV file.\n */\nclass CsvOverlay extends Component<CsvOverlayProps, CsvOverlayState> {\n static defaultProps = {\n allowZip: false,\n dragError: null,\n };\n\n static MULTIPLE_FILE_ERROR = 'Please select only one file';\n\n static FILE_TYPE_ERROR = 'Filetype not supported.';\n\n static isValidDropItem(item: DataTransferItem): boolean {\n return (\n item &&\n item.kind === 'file' &&\n !INVALID_MIME_TYPES.find(invalid => invalid.test(item.type))\n );\n }\n\n static isValidExtension(name: string, allowZip = false): boolean {\n return (\n VALID_EXTENSIONS.some(ext => name.endsWith(ext)) ||\n (allowZip && ZIP_EXTENSIONS.some(ext => name.endsWith(ext)))\n );\n }\n\n static handleDragOver(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n }\n\n static getIcon(fileName: string): IconDefinition {\n if (fileName === PASTED_VALUES) {\n return vsClippy;\n }\n if (fileName.endsWith('.csv')) {\n return dhFileCsv;\n }\n if (fileName.endsWith('.zip')) {\n return vsFileZip;\n }\n return dhFileSpreadsheet;\n }\n\n constructor(props: CsvOverlayProps) {\n super(props);\n\n this.handleSelectFile = this.handleSelectFile.bind(this);\n this.handleFiles = this.handleFiles.bind(this);\n this.handleDrop = this.handleDrop.bind(this);\n this.unstageFile = this.unstageFile.bind(this);\n this.handleMenuPaste = this.handleMenuPaste.bind(this);\n this.handlePasteEvent = this.handlePasteEvent.bind(this);\n\n this.fileElem = React.createRef();\n this.divElem = React.createRef();\n\n this.state = {\n selectedFileName: '',\n };\n }\n\n componentDidMount(): void {\n this.divElem.current?.addEventListener('paste', this.handlePasteEvent);\n this.divElem.current?.focus();\n }\n\n componentWillUnmount(): void {\n this.divElem.current?.removeEventListener('paste', this.handlePasteEvent);\n }\n\n fileElem: RefObject<HTMLInputElement>;\n\n divElem: RefObject<HTMLDivElement>;\n\n handleSelectFile(): void {\n if (this.fileElem.current) {\n this.fileElem.current.value = '';\n this.fileElem.current?.click();\n }\n }\n\n handleFiles(event: ChangeEvent<HTMLInputElement>): void {\n event.stopPropagation();\n event.preventDefault();\n const { files } = event.target;\n if (files != null) {\n this.handleFile(files[0]);\n }\n }\n\n handleDrop(e: DragEvent<HTMLDivElement>): void {\n const { allowZip, clearDragError, dragError } = this.props;\n e.preventDefault();\n e.stopPropagation();\n\n if (dragError) {\n clearDragError();\n return;\n }\n\n if (!e.dataTransfer || !e.dataTransfer.items) {\n return;\n }\n\n const file = e.dataTransfer.items[0].getAsFile();\n assertNotNull(file);\n if (CsvOverlay.isValidExtension(file.name, allowZip)) {\n this.handleFile(file);\n } else {\n this.setState({\n dropError: CsvOverlay.FILE_TYPE_ERROR,\n });\n }\n }\n\n unstageFile(event: MouseEvent<HTMLButtonElement>): void {\n const { onCancel } = this.props;\n event.stopPropagation();\n event.preventDefault();\n onCancel();\n this.setState({\n selectedFileName: '',\n dropError: undefined,\n });\n }\n\n handleFile(file: File): void {\n const { onFileOpened } = this.props;\n onFileOpened(file);\n this.setState({\n selectedFileName: file.name,\n dropError: undefined,\n });\n }\n\n handleMenuPaste(): void {\n const { onPaste, onError, uploadInProgress } = this.props;\n if (uploadInProgress) {\n return;\n }\n navigator.clipboard\n .readText()\n .then(clipText => {\n onPaste(clipText);\n this.setState({\n selectedFileName: PASTED_VALUES,\n dropError: undefined,\n });\n })\n .catch((e: unknown) => onError(e));\n }\n\n handlePasteEvent(event: ClipboardEvent): void {\n event.stopPropagation();\n event.preventDefault();\n this.handleMenuPaste();\n }\n\n makeContextMenuItems(): ContextAction[] {\n const { uploadInProgress } = this.props;\n return [\n {\n title: 'Paste',\n icon: vsClippy,\n action: this.handleMenuPaste,\n shortcut: GLOBAL_SHORTCUTS.PASTE,\n disabled: uploadInProgress,\n },\n ];\n }\n\n getValidExtensions = memoize(allowZip =>\n allowZip ? [...VALID_EXTENSIONS, ...ZIP_EXTENSIONS] : [...VALID_EXTENSIONS]\n );\n\n getAcceptString = memoize(allowZip =>\n this.getValidExtensions(allowZip).join(', ')\n );\n\n getFileTypeErrorString = memoize(allowZip =>\n TextUtils.join(this.getValidExtensions(allowZip), 'or')\n );\n\n render(): ReactElement {\n const { allowZip, dragError, uploadInProgress } = this.props;\n const { selectedFileName, dropError } = this.state;\n const error = dragError || dropError;\n const contextActions = this.makeContextMenuItems();\n return (\n <div\n ref={this.divElem}\n className=\"csv-overlay fill-parent-absolute\"\n onDragOver={CsvOverlay.handleDragOver}\n onDrop={this.handleDrop}\n tabIndex={-1}\n >\n <ContextActions actions={contextActions} />\n <input\n ref={this.fileElem}\n type=\"file\"\n id=\"fileElem\"\n accept={this.getAcceptString(allowZip)}\n style={{ display: 'none' }}\n onChange={this.handleFiles}\n data-testid=\"fileElem\"\n />\n {!selectedFileName && !error && (\n <div className=\"message-content\">\n <div className=\"message-icon\">\n <FontAwesomeIcon icon={dhFileDownload} />\n </div>\n <label>Drop file (or paste values) here to import</label>\n <div className=\"message-small\">\n <label>or</label>\n </div>\n <button\n type=\"button\"\n className=\"btn btn-primary\"\n onClick={this.handleSelectFile}\n >\n Select File...\n </button>\n </div>\n )}\n {selectedFileName && !error && (\n <div className=\"selected-content\">\n <div className=\"selected-icon\">\n <FontAwesomeIcon icon={CsvOverlay.getIcon(selectedFileName)} />\n </div>\n <div className=\"selected-text\">\n <label>Selected File</label>\n <label className=\"selected-name\">\n {selectedFileName}\n {!uploadInProgress && (\n <button\n type=\"button\"\n className=\"btn btn-link btn-link-icon ml-2\"\n onClick={this.unstageFile}\n >\n <FontAwesomeIcon icon={vsTrash} />\n </button>\n )}\n </label>\n </div>\n </div>\n )}\n {error && (\n <div className=\"message-content\">\n <div className=\"message-icon\">\n <FontAwesomeIcon icon={vsWarning} />\n </div>\n <label>{error}</label>\n {error === CsvOverlay.FILE_TYPE_ERROR && (\n <div className=\"message-small\">\n <label>{this.getFileTypeErrorString(allowZip)}</label>\n </div>\n )}\n </div>\n )}\n </div>\n );\n }\n}\n\nexport default CsvOverlay;\n"],"mappings":"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"}
1
+ {"version":3,"file":"CsvOverlay.js","names":["React","Component","memoize","FontAwesomeIcon","ContextActions","GLOBAL_SHORTCUTS","dhFileCsv","dhFileDownload","dhFileSpreadsheet","vsClippy","vsFileZip","vsTrash","vsWarning","assertNotNull","TextUtils","PASTED_VALUES","INVALID_MIME_TYPES","VALID_EXTENSIONS","ZIP_EXTENSIONS","CsvOverlay","isValidDropItem","item","kind","find","invalid","test","type","isValidExtension","name","allowZip","some","ext","endsWith","handleDragOver","e","preventDefault","stopPropagation","getIcon","fileName","constructor","props","getValidExtensions","join","handleSelectFile","bind","handleFiles","handleDrop","unstageFile","handleMenuPaste","handlePasteEvent","fileElem","createRef","divElem","state","selectedFileName","componentDidMount","current","addEventListener","focus","componentWillUnmount","removeEventListener","value","click","event","files","target","handleFile","clearDragError","dragError","dataTransfer","items","length","file","getAsFile","setState","dropError","FILE_TYPE_ERROR","onCancel","undefined","onFileOpened","onPaste","onError","uploadInProgress","navigator","clipboard","readText","then","clipText","catch","makeContextMenuItems","title","icon","action","shortcut","PASTE","disabled","render","error","contextActions","getAcceptString","display","Boolean","getFileTypeErrorString"],"sources":["../../src/csv/CsvOverlay.tsx"],"sourcesContent":["import React, {\n ChangeEvent,\n Component,\n DragEvent,\n MouseEvent,\n ReactElement,\n RefObject,\n} from 'react';\nimport memoize from 'memoize-one';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n ContextAction,\n ContextActions,\n GLOBAL_SHORTCUTS,\n} from '@deephaven/components';\nimport {\n dhFileCsv,\n dhFileDownload,\n dhFileSpreadsheet,\n IconDefinition,\n vsClippy,\n vsFileZip,\n vsTrash,\n vsWarning,\n} from '@deephaven/icons';\nimport './CsvOverlay.scss';\nimport { assertNotNull, TextUtils } from '@deephaven/utils';\n\ninterface CsvOverlayProps {\n allowZip: boolean;\n onFileOpened: (file: File) => void;\n onCancel: () => void;\n onPaste: (clipText: string) => void;\n clearDragError: () => void;\n dragError: string | null;\n onError: (e: unknown) => void;\n uploadInProgress: boolean;\n}\n\ninterface CsvOverlayState {\n selectedFileName: string;\n dropError?: string;\n}\n\nconst PASTED_VALUES = 'pasted values';\n\nconst INVALID_MIME_TYPES = [/^audio.*/, /^font.*/, /^image.*/, /^video.*/];\n\nconst VALID_EXTENSIONS = ['.csv', '.tsv', '.tab', '.psv', '.dsv', '.txt'];\n\nconst ZIP_EXTENSIONS = ['.zip'];\n\n/**\n * Overlay that is displayed when uploading a CSV file.\n */\nclass CsvOverlay extends Component<CsvOverlayProps, CsvOverlayState> {\n static defaultProps = {\n allowZip: false,\n dragError: null,\n };\n\n static MULTIPLE_FILE_ERROR = 'Please select only one file';\n\n static FILE_TYPE_ERROR = 'Filetype not supported.';\n\n static isValidDropItem(item: DataTransferItem): boolean {\n return (\n item != null &&\n item.kind === 'file' &&\n !INVALID_MIME_TYPES.find(invalid => invalid.test(item.type))\n );\n }\n\n static isValidExtension(name: string, allowZip = false): boolean {\n return (\n VALID_EXTENSIONS.some(ext => name.endsWith(ext)) ||\n (allowZip && ZIP_EXTENSIONS.some(ext => name.endsWith(ext)))\n );\n }\n\n static handleDragOver(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n }\n\n static getIcon(fileName: string): IconDefinition {\n if (fileName === PASTED_VALUES) {\n return vsClippy;\n }\n if (fileName.endsWith('.csv')) {\n return dhFileCsv;\n }\n if (fileName.endsWith('.zip')) {\n return vsFileZip;\n }\n return dhFileSpreadsheet;\n }\n\n constructor(props: CsvOverlayProps) {\n super(props);\n\n this.handleSelectFile = this.handleSelectFile.bind(this);\n this.handleFiles = this.handleFiles.bind(this);\n this.handleDrop = this.handleDrop.bind(this);\n this.unstageFile = this.unstageFile.bind(this);\n this.handleMenuPaste = this.handleMenuPaste.bind(this);\n this.handlePasteEvent = this.handlePasteEvent.bind(this);\n\n this.fileElem = React.createRef();\n this.divElem = React.createRef();\n\n this.state = {\n selectedFileName: '',\n };\n }\n\n componentDidMount(): void {\n this.divElem.current?.addEventListener('paste', this.handlePasteEvent);\n this.divElem.current?.focus();\n }\n\n componentWillUnmount(): void {\n this.divElem.current?.removeEventListener('paste', this.handlePasteEvent);\n }\n\n fileElem: RefObject<HTMLInputElement>;\n\n divElem: RefObject<HTMLDivElement>;\n\n handleSelectFile(): void {\n if (this.fileElem.current) {\n this.fileElem.current.value = '';\n this.fileElem.current?.click();\n }\n }\n\n handleFiles(event: ChangeEvent<HTMLInputElement>): void {\n event.stopPropagation();\n event.preventDefault();\n const { files } = event.target;\n if (files != null) {\n this.handleFile(files[0]);\n }\n }\n\n handleDrop(e: DragEvent<HTMLDivElement>): void {\n const { allowZip, clearDragError, dragError } = this.props;\n e.preventDefault();\n e.stopPropagation();\n\n if (dragError != null) {\n clearDragError();\n return;\n }\n\n if (\n e.dataTransfer == null ||\n e.dataTransfer.items == null ||\n e.dataTransfer.items.length === 0\n ) {\n return;\n }\n\n const file = e.dataTransfer.items[0].getAsFile();\n assertNotNull(file);\n if (CsvOverlay.isValidExtension(file.name, allowZip)) {\n this.handleFile(file);\n } else {\n this.setState({\n dropError: CsvOverlay.FILE_TYPE_ERROR,\n });\n }\n }\n\n unstageFile(event: MouseEvent<HTMLButtonElement>): void {\n const { onCancel } = this.props;\n event.stopPropagation();\n event.preventDefault();\n onCancel();\n this.setState({\n selectedFileName: '',\n dropError: undefined,\n });\n }\n\n handleFile(file: File): void {\n const { onFileOpened } = this.props;\n onFileOpened(file);\n this.setState({\n selectedFileName: file.name,\n dropError: undefined,\n });\n }\n\n handleMenuPaste(): void {\n const { onPaste, onError, uploadInProgress } = this.props;\n if (uploadInProgress) {\n return;\n }\n navigator.clipboard\n .readText()\n .then(clipText => {\n onPaste(clipText);\n this.setState({\n selectedFileName: PASTED_VALUES,\n dropError: undefined,\n });\n })\n .catch((e: unknown) => onError(e));\n }\n\n handlePasteEvent(event: ClipboardEvent): void {\n event.stopPropagation();\n event.preventDefault();\n this.handleMenuPaste();\n }\n\n makeContextMenuItems(): ContextAction[] {\n const { uploadInProgress } = this.props;\n return [\n {\n title: 'Paste',\n icon: vsClippy,\n action: this.handleMenuPaste,\n shortcut: GLOBAL_SHORTCUTS.PASTE,\n disabled: uploadInProgress,\n },\n ];\n }\n\n getValidExtensions = memoize((allowZip: boolean) =>\n allowZip ? [...VALID_EXTENSIONS, ...ZIP_EXTENSIONS] : [...VALID_EXTENSIONS]\n );\n\n getAcceptString = memoize(allowZip =>\n this.getValidExtensions(allowZip).join(', ')\n );\n\n getFileTypeErrorString = memoize(allowZip =>\n TextUtils.join(this.getValidExtensions(allowZip), 'or')\n );\n\n render(): ReactElement {\n const { allowZip, dragError, uploadInProgress } = this.props;\n const { selectedFileName, dropError } = this.state;\n const error = dragError ?? dropError;\n const contextActions = this.makeContextMenuItems();\n return (\n <div\n ref={this.divElem}\n className=\"csv-overlay fill-parent-absolute\"\n onDragOver={CsvOverlay.handleDragOver}\n onDrop={this.handleDrop}\n tabIndex={-1}\n >\n <ContextActions actions={contextActions} />\n <input\n ref={this.fileElem}\n type=\"file\"\n id=\"fileElem\"\n accept={this.getAcceptString(allowZip)}\n style={{ display: 'none' }}\n onChange={this.handleFiles}\n data-testid=\"fileElem\"\n />\n {!selectedFileName && (error === undefined || error === '') && (\n <div className=\"message-content\">\n <div className=\"message-icon\">\n <FontAwesomeIcon icon={dhFileDownload} />\n </div>\n <label>Drop file (or paste values) here to import</label>\n <div className=\"message-small\">\n <label>or</label>\n </div>\n <button\n type=\"button\"\n className=\"btn btn-primary\"\n onClick={this.handleSelectFile}\n >\n Select File...\n </button>\n </div>\n )}\n {selectedFileName && (error === undefined || error === '') && (\n <div className=\"selected-content\">\n <div className=\"selected-icon\">\n <FontAwesomeIcon icon={CsvOverlay.getIcon(selectedFileName)} />\n </div>\n <div className=\"selected-text\">\n <label>Selected File</label>\n <label className=\"selected-name\">\n {selectedFileName}\n {!uploadInProgress && (\n <button\n type=\"button\"\n className=\"btn btn-link btn-link-icon ml-2\"\n onClick={this.unstageFile}\n >\n <FontAwesomeIcon icon={vsTrash} />\n </button>\n )}\n </label>\n </div>\n </div>\n )}\n {Boolean(error) && (\n <div className=\"message-content\">\n <div className=\"message-icon\">\n <FontAwesomeIcon icon={vsWarning} />\n </div>\n <label>{error}</label>\n {error === CsvOverlay.FILE_TYPE_ERROR && (\n <div className=\"message-small\">\n <label>{this.getFileTypeErrorString(allowZip)}</label>\n </div>\n )}\n </div>\n )}\n </div>\n );\n }\n}\n\nexport default CsvOverlay;\n"],"mappings":"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"}
@@ -293,7 +293,7 @@ class CsvParser {
293
293
 
294
294
  handleComplete(results) {
295
295
  // results is undefined for a succesful parse, but has meta data for an abort
296
- if (!results || !results.meta.aborted) {
296
+ if (results == null || results.meta.aborted == null) {
297
297
  this.isComplete = true; // Check if there are any consolidated chunks left over from a zip file
298
298
 
299
299
  if (this.consolidatedChunks) {