@deephaven/console 0.50.1-beta.5 → 0.51.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Console.js.map +1 -1
- package/dist/ConsoleInput.d.ts.map +1 -1
- package/dist/ConsoleInput.js +36 -46
- package/dist/ConsoleInput.js.map +1 -1
- package/dist/ConsoleMenu.js.map +1 -1
- package/dist/ConsoleStatusBar.js.map +1 -1
- package/dist/HeapUsage.js.map +1 -1
- package/dist/command-history/CommandHistory.js.map +1 -1
- package/dist/command-history/CommandHistoryActions.js.map +1 -1
- package/dist/command-history/CommandHistoryItem.js.map +1 -1
- package/dist/command-history/CommandHistoryItemTooltip.js.map +1 -1
- package/dist/command-history/CommandHistoryViewportUpdater.js.map +1 -1
- package/dist/common/Code.js.map +1 -1
- package/dist/common/ConsoleConstants.js.map +1 -1
- package/dist/common/ConsoleUtils.js.map +1 -1
- package/dist/common/ObjectIcon.js.map +1 -1
- package/dist/console-history/ConsoleHistory.js.map +1 -1
- package/dist/console-history/ConsoleHistoryItem.js.map +1 -1
- package/dist/console-history/ConsoleHistoryItemResult.js.map +1 -1
- package/dist/console-history/ConsoleHistoryResultErrorMessage.js.map +1 -1
- package/dist/console-history/ConsoleHistoryResultInProgress.js.map +1 -1
- package/dist/csv/CsvFormats.js.map +1 -1
- package/dist/csv/CsvInputBar.js.map +1 -1
- package/dist/csv/CsvOverlay.js.map +1 -1
- package/dist/csv/CsvParser.js.map +1 -1
- package/dist/csv/CsvTypeParser.js.map +1 -1
- package/dist/csv/NewTableColumnTypes.js.map +1 -1
- package/dist/csv/ZipStreamHelper.js.map +1 -1
- package/dist/log/LogLevelMenuItem.js.map +1 -1
- package/dist/log/LogView.js.map +1 -1
- package/dist/monaco/MonacoProviders.js.map +1 -1
- package/dist/monaco/MonacoUtils.js.map +1 -1
- package/dist/notebook/Editor.js.map +1 -1
- package/dist/notebook/ScriptEditor.js.map +1 -1
- package/dist/notebook/ScriptEditorUtils.js.map +1 -1
- package/package.json +13 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandHistoryViewportUpdater.js","names":["useEffect","useMemo","throttle","Log","UPDATE_DELAY","ROW_BUFFER_PAGES","log","module","CommandHistoryViewportUpdater","table","columns","top","bottom","search","isReversed","onUpdate","throttledUpdateViewport","viewport","viewHeight","bufferedTop","Math","max","bufferedBottom","setViewport","updateTableAndReturnCleanup","cleanup","viewportData","items","offset","debug","setSearchText","setSearch","updateViewport","debug2","cancel"],"sources":["../../src/command-history/CommandHistoryViewportUpdater.tsx"],"sourcesContent":["import { useEffect, useMemo } from 'react';\nimport throttle from 'lodash.throttle';\nimport {\n StorageTableViewport,\n ViewportData,\n ViewportUpdateCallback,\n} from '@deephaven/storage';\nimport Log from '@deephaven/log';\nimport {\n CommandHistoryStorageItem,\n CommandHistoryTable,\n} from './CommandHistoryStorage';\n\nexport type CommandHistoryViewportUpdaterProps = {\n table: CommandHistoryTable;\n columns?: string[];\n top?: number;\n bottom?: number;\n search?: string;\n isReversed?: boolean;\n onUpdate: ViewportUpdateCallback<CommandHistoryStorageItem>;\n};\n\nconst UPDATE_DELAY = 150;\n\nconst ROW_BUFFER_PAGES = 3;\n\nconst log = Log.module('CommandHistoryViewportUpdater');\n\nfunction CommandHistoryViewportUpdater({\n table,\n columns,\n top = 0,\n bottom = 0,\n search,\n isReversed = false,\n onUpdate,\n}: CommandHistoryViewportUpdaterProps): null {\n const throttledUpdateViewport = useMemo(\n () =>\n throttle((viewport: StorageTableViewport) => {\n const viewHeight = viewport.bottom - viewport.top;\n const bufferedTop = Math.max(\n 0,\n viewport.top - viewHeight * ROW_BUFFER_PAGES\n );\n const bufferedBottom = viewport.bottom + viewHeight * ROW_BUFFER_PAGES;\n\n table.setViewport({\n top: bufferedTop,\n bottom: bufferedBottom,\n columns: viewport.columns,\n });\n }, UPDATE_DELAY),\n [table]\n );\n\n useEffect(\n function updateTableAndReturnCleanup() {\n const cleanup = table.onUpdate(\n (viewportData: ViewportData<CommandHistoryStorageItem>) => {\n onUpdate({\n items: viewportData.items ?? [],\n offset: viewportData.offset ?? 0,\n });\n }\n );\n\n return () => {\n log.debug('onUpdate cleanup');\n cleanup();\n };\n },\n [table, onUpdate]\n );\n\n useEffect(\n function setSearchText() {\n table.setSearch(search ?? '');\n },\n [table, search]\n );\n useEffect(\n function updateViewport() {\n throttledUpdateViewport({\n top,\n bottom,\n columns,\n });\n },\n [throttledUpdateViewport, top, bottom, columns, search, isReversed]\n );\n useEffect(\n () => () => {\n log.debug2('Cancel throttledUpdateViewport');\n throttledUpdateViewport.cancel();\n },\n [throttledUpdateViewport]\n );\n\n return null;\n}\n\nexport default CommandHistoryViewportUpdater;\n"],"mappings":"AAAA,SAASA,SAAS,EAAEC,OAAO,QAAQ,OAAO;AAC1C,OAAOC,QAAQ,MAAM,iBAAiB;AAMtC,OAAOC,GAAG,MAAM,gBAAgB;AAgBhC,IAAMC,YAAY,GAAG,GAAG;AAExB,IAAMC,gBAAgB,GAAG,CAAC;AAE1B,IAAMC,GAAG,GAAGH,GAAG,CAACI,MAAM,CAAC,+BAA+B,CAAC;AAEvD,SAASC,
|
|
1
|
+
{"version":3,"file":"CommandHistoryViewportUpdater.js","names":["useEffect","useMemo","throttle","Log","UPDATE_DELAY","ROW_BUFFER_PAGES","log","module","CommandHistoryViewportUpdater","_ref","table","columns","top","bottom","search","isReversed","onUpdate","throttledUpdateViewport","viewport","viewHeight","bufferedTop","Math","max","bufferedBottom","setViewport","updateTableAndReturnCleanup","cleanup","viewportData","_viewportData$items","_viewportData$offset","items","offset","debug","setSearchText","setSearch","updateViewport","debug2","cancel"],"sources":["../../src/command-history/CommandHistoryViewportUpdater.tsx"],"sourcesContent":["import { useEffect, useMemo } from 'react';\nimport throttle from 'lodash.throttle';\nimport {\n StorageTableViewport,\n ViewportData,\n ViewportUpdateCallback,\n} from '@deephaven/storage';\nimport Log from '@deephaven/log';\nimport {\n CommandHistoryStorageItem,\n CommandHistoryTable,\n} from './CommandHistoryStorage';\n\nexport type CommandHistoryViewportUpdaterProps = {\n table: CommandHistoryTable;\n columns?: string[];\n top?: number;\n bottom?: number;\n search?: string;\n isReversed?: boolean;\n onUpdate: ViewportUpdateCallback<CommandHistoryStorageItem>;\n};\n\nconst UPDATE_DELAY = 150;\n\nconst ROW_BUFFER_PAGES = 3;\n\nconst log = Log.module('CommandHistoryViewportUpdater');\n\nfunction CommandHistoryViewportUpdater({\n table,\n columns,\n top = 0,\n bottom = 0,\n search,\n isReversed = false,\n onUpdate,\n}: CommandHistoryViewportUpdaterProps): null {\n const throttledUpdateViewport = useMemo(\n () =>\n throttle((viewport: StorageTableViewport) => {\n const viewHeight = viewport.bottom - viewport.top;\n const bufferedTop = Math.max(\n 0,\n viewport.top - viewHeight * ROW_BUFFER_PAGES\n );\n const bufferedBottom = viewport.bottom + viewHeight * ROW_BUFFER_PAGES;\n\n table.setViewport({\n top: bufferedTop,\n bottom: bufferedBottom,\n columns: viewport.columns,\n });\n }, UPDATE_DELAY),\n [table]\n );\n\n useEffect(\n function updateTableAndReturnCleanup() {\n const cleanup = table.onUpdate(\n (viewportData: ViewportData<CommandHistoryStorageItem>) => {\n onUpdate({\n items: viewportData.items ?? [],\n offset: viewportData.offset ?? 0,\n });\n }\n );\n\n return () => {\n log.debug('onUpdate cleanup');\n cleanup();\n };\n },\n [table, onUpdate]\n );\n\n useEffect(\n function setSearchText() {\n table.setSearch(search ?? '');\n },\n [table, search]\n );\n useEffect(\n function updateViewport() {\n throttledUpdateViewport({\n top,\n bottom,\n columns,\n });\n },\n [throttledUpdateViewport, top, bottom, columns, search, isReversed]\n );\n useEffect(\n () => () => {\n log.debug2('Cancel throttledUpdateViewport');\n throttledUpdateViewport.cancel();\n },\n [throttledUpdateViewport]\n );\n\n return null;\n}\n\nexport default CommandHistoryViewportUpdater;\n"],"mappings":"AAAA,SAASA,SAAS,EAAEC,OAAO,QAAQ,OAAO;AAC1C,OAAOC,QAAQ,MAAM,iBAAiB;AAMtC,OAAOC,GAAG,MAAM,gBAAgB;AAgBhC,IAAMC,YAAY,GAAG,GAAG;AAExB,IAAMC,gBAAgB,GAAG,CAAC;AAE1B,IAAMC,GAAG,GAAGH,GAAG,CAACI,MAAM,CAAC,+BAA+B,CAAC;AAEvD,SAASC,6BAA6BA,CAAAC,IAAA,EAQO;EAAA,IARN;IACrCC,KAAK;IACLC,OAAO;IACPC,GAAG,GAAG,CAAC;IACPC,MAAM,GAAG,CAAC;IACVC,MAAM;IACNC,UAAU,GAAG,KAAK;IAClBC;EACkC,CAAC,GAAAP,IAAA;EACnC,IAAMQ,uBAAuB,GAAGhB,OAAO,CACrC,MACEC,QAAQ,CAAEgB,QAA8B,IAAK;IAC3C,IAAMC,UAAU,GAAGD,QAAQ,CAACL,MAAM,GAAGK,QAAQ,CAACN,GAAG;IACjD,IAAMQ,WAAW,GAAGC,IAAI,CAACC,GAAG,CAC1B,CAAC,EACDJ,QAAQ,CAACN,GAAG,GAAGO,UAAU,GAAGd,gBAC9B,CAAC;IACD,IAAMkB,cAAc,GAAGL,QAAQ,CAACL,MAAM,GAAGM,UAAU,GAAGd,gBAAgB;IAEtEK,KAAK,CAACc,WAAW,CAAC;MAChBZ,GAAG,EAAEQ,WAAW;MAChBP,MAAM,EAAEU,cAAc;MACtBZ,OAAO,EAAEO,QAAQ,CAACP;IACpB,CAAC,CAAC;EACJ,CAAC,EAAEP,YAAY,CAAC,EAClB,CAACM,KAAK,CACR,CAAC;EAEDV,SAAS,CACP,SAASyB,2BAA2BA,CAAA,EAAG;IACrC,IAAMC,OAAO,GAAGhB,KAAK,CAACM,QAAQ,CAC3BW,YAAqD,IAAK;MAAA,IAAAC,mBAAA,EAAAC,oBAAA;MACzDb,QAAQ,CAAC;QACPc,KAAK,GAAAF,mBAAA,GAAED,YAAY,CAACG,KAAK,cAAAF,mBAAA,cAAAA,mBAAA,GAAI,EAAE;QAC/BG,MAAM,GAAAF,oBAAA,GAAEF,YAAY,CAACI,MAAM,cAAAF,oBAAA,cAAAA,oBAAA,GAAI;MACjC,CAAC,CAAC;IACJ,CACF,CAAC;IAED,OAAO,MAAM;MACXvB,GAAG,CAAC0B,KAAK,CAAC,kBAAkB,CAAC;MAC7BN,OAAO,CAAC,CAAC;IACX,CAAC;EACH,CAAC,EACD,CAAChB,KAAK,EAAEM,QAAQ,CAClB,CAAC;EAEDhB,SAAS,CACP,SAASiC,aAAaA,CAAA,EAAG;IACvBvB,KAAK,CAACwB,SAAS,CAACpB,MAAM,aAANA,MAAM,cAANA,MAAM,GAAI,EAAE,CAAC;EAC/B,CAAC,EACD,CAACJ,KAAK,EAAEI,MAAM,CAChB,CAAC;EACDd,SAAS,CACP,SAASmC,cAAcA,CAAA,EAAG;IACxBlB,uBAAuB,CAAC;MACtBL,GAAG;MACHC,MAAM;MACNF;IACF,CAAC,CAAC;EACJ,CAAC,EACD,CAACM,uBAAuB,EAAEL,GAAG,EAAEC,MAAM,EAAEF,OAAO,EAAEG,MAAM,EAAEC,UAAU,CACpE,CAAC;EACDf,SAAS,CACP,MAAM,MAAM;IACVM,GAAG,CAAC8B,MAAM,CAAC,gCAAgC,CAAC;IAC5CnB,uBAAuB,CAACoB,MAAM,CAAC,CAAC;EAClC,CAAC,EACD,CAACpB,uBAAuB,CAC1B,CAAC;EAED,OAAO,IAAI;AACb;AAEA,eAAeT,6BAA6B"}
|
package/dist/common/Code.js.map
CHANGED
|
@@ -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 != 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,KAAK,IAAIC,SAAS,QAAiC,OAAO;AACjE,OAAO,KAAKC,MAAM,MAAM,eAAe;AAAC;AAOxC,MAAMC,IAAI,
|
|
1
|
+
{"version":3,"file":"Code.js","names":["React","Component","monaco","jsx","_jsx","Code","constructor","props","_defineProperty","container","componentDidMount","colorize","children","editor","colorizeElement","theme","render","language","ref","style","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,KAAK,IAAIC,SAAS,QAAiC,OAAO;AACjE,OAAO,KAAKC,MAAM,MAAM,eAAe;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAOxC,MAAMC,IAAI,SAASJ,SAAS,CAAmC;EAC7DK,WAAWA,CAACC,KAAgB,EAAE;IAC5B,KAAK,CAACA,KAAK,CAAC;IAACC,eAAA;IAEb,IAAI,CAACC,SAAS,GAAG,IAAI;EACvB;EAEAC,iBAAiBA,CAAA,EAAS;IACxB,IAAI,CAACC,QAAQ,CAAC,CAAC;EACjB;EAIAA,QAAQA,CAAA,EAAS;IACf,IAAM;MAAEC;IAAS,CAAC,GAAG,IAAI,CAACL,KAAK;IAC/B,IAAI,IAAI,CAACE,SAAS,IAAIG,QAAQ,IAAI,IAAI,EAAE;MACtCV,MAAM,CAACW,MAAM,CAACC,eAAe,CAAC,IAAI,CAACL,SAAS,EAAE;QAC5CM,KAAK,EAAE;MACT,CAAC,CAAC;IACJ;EACF;EAEAC,MAAMA,CAAA,EAAiB;IACrB,IAAM;MAAEJ,QAAQ;MAAEK;IAAS,CAAC,GAAG,IAAI,CAACV,KAAK;IACzC,oBACEH,IAAA;MAAAQ,QAAA,eACER,IAAA;QACE,aAAWa,QAAS;QACpBC,GAAG,EAAET,SAAS,IAAI;UAChB,IAAI,CAACA,SAAS,GAAGA,SAAS;QAC5B;QACA;QACA;QAAA;QACAU,KAAK,EAAE;UAAEC,aAAa,EAAE;QAAO,CAAE;QAAAR,QAAA,EAEhCA;MAAQ,CACN;IAAC,CACH,CAAC;EAEV;AACF;AAEA,eAAeP,IAAI"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConsoleConstants.js","names":["ConsoleConstants","LANGUAGE_MAP","Map"],"sources":["../../src/common/ConsoleConstants.ts"],"sourcesContent":["class ConsoleConstants {\n /**\n * Map of language keys to their display names\n */\n static get LANGUAGE_MAP(): Map<string, string> {\n return new Map([\n ['python', 'Python'],\n ['groovy', 'Groovy'],\n ['scala', 'Scala'],\n ]);\n }\n}\n\nexport default ConsoleConstants;\n"],"mappings":"AAAA,MAAMA,gBAAgB,CAAC;EACrB;AACF;AACA;EACE,WAAWC,
|
|
1
|
+
{"version":3,"file":"ConsoleConstants.js","names":["ConsoleConstants","LANGUAGE_MAP","Map"],"sources":["../../src/common/ConsoleConstants.ts"],"sourcesContent":["class ConsoleConstants {\n /**\n * Map of language keys to their display names\n */\n static get LANGUAGE_MAP(): Map<string, string> {\n return new Map([\n ['python', 'Python'],\n ['groovy', 'Groovy'],\n ['scala', 'Scala'],\n ]);\n }\n}\n\nexport default ConsoleConstants;\n"],"mappings":"AAAA,MAAMA,gBAAgB,CAAC;EACrB;AACF;AACA;EACE,WAAWC,YAAYA,CAAA,EAAwB;IAC7C,OAAO,IAAIC,GAAG,CAAC,CACb,CAAC,QAAQ,EAAE,QAAQ,CAAC,EACpB,CAAC,QAAQ,EAAE,QAAQ,CAAC,EACpB,CAAC,OAAO,EAAE,OAAO,CAAC,CACnB,CAAC;EACJ;AACF;AAEA,eAAeF,gBAAgB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConsoleUtils.js","names":["ShellQuote","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","dh","type","VariableType","TABLE","TREETABLE","HIERARCHICALTABLE","isWidgetType","FIGURE","OTHERWIDGET","PANDAS","isOpenableType","isFigureType","isPandas"],"sources":["../../src/common/ConsoleUtils.ts"],"sourcesContent":["import ShellQuote, { ParseEntry, ControlOperator } from 'shell-quote';\nimport type { dh as DhType } from '@deephaven/jsapi-types';\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(dh: DhType, type: string): boolean {\n return (\n type === dh.VariableType.TABLE ||\n type === dh.VariableType.TREETABLE ||\n type === dh.VariableType.HIERARCHICALTABLE\n );\n }\n\n static isWidgetType(dh: DhType, type: string): boolean {\n return (\n type === dh.VariableType.FIGURE ||\n type === dh.VariableType.OTHERWIDGET ||\n type === dh.VariableType.PANDAS\n );\n }\n\n static isOpenableType(dh: DhType, type: string): boolean {\n return (\n ConsoleUtils.isTableType(dh, type) || ConsoleUtils.isWidgetType(dh, type)\n );\n }\n\n static isFigureType(dh: DhType, type: string): boolean {\n return type === dh.VariableType.FIGURE;\n }\n\n static isPandas(dh: DhType, type: string): boolean {\n return type === dh.VariableType.PANDAS;\n }\n}\n\nexport default ConsoleUtils;\n"],"mappings":"AAAA,OAAOA,UAAU,MAAuC,aAAa;AAGrE,MAAMC,YAAY,CAAC;EACjB,OAAOC,
|
|
1
|
+
{"version":3,"file":"ConsoleUtils.js","names":["ShellQuote","ConsoleUtils","hasComment","arg","comment","undefined","hasPattern","pattern","hasOp","op","parseArguments","str","String","parse","filter","map","concat","formatTimestamp","date","Date","hours","getHours","padStart","minutes","getMinutes","seconds","getSeconds","milliseconds","getMilliseconds","isTableType","dh","type","VariableType","TABLE","TREETABLE","HIERARCHICALTABLE","isWidgetType","FIGURE","OTHERWIDGET","PANDAS","isOpenableType","isFigureType","isPandas"],"sources":["../../src/common/ConsoleUtils.ts"],"sourcesContent":["import ShellQuote, { ParseEntry, ControlOperator } from 'shell-quote';\nimport type { dh as DhType } from '@deephaven/jsapi-types';\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(dh: DhType, type: string): boolean {\n return (\n type === dh.VariableType.TABLE ||\n type === dh.VariableType.TREETABLE ||\n type === dh.VariableType.HIERARCHICALTABLE\n );\n }\n\n static isWidgetType(dh: DhType, type: string): boolean {\n return (\n type === dh.VariableType.FIGURE ||\n type === dh.VariableType.OTHERWIDGET ||\n type === dh.VariableType.PANDAS\n );\n }\n\n static isOpenableType(dh: DhType, type: string): boolean {\n return (\n ConsoleUtils.isTableType(dh, type) || ConsoleUtils.isWidgetType(dh, type)\n );\n }\n\n static isFigureType(dh: DhType, type: string): boolean {\n return type === dh.VariableType.FIGURE;\n }\n\n static isPandas(dh: DhType, type: string): 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":"ObjectIcon.js","names":["React","FontAwesomeIcon","dhPandas","dhTable","vsGraph","vsPreview","useApi","ObjectIcon","type","dh","VariableType","TABLE","TABLEMAP","TREETABLE","HIERARCHICALTABLE","FIGURE","PANDAS"],"sources":["../../src/common/ObjectIcon.tsx"],"sourcesContent":["import React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { dhPandas, dhTable, vsGraph, vsPreview } from '@deephaven/icons';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\n\nexport type ObjectIconProps = {\n type: string;\n};\n\nfunction ObjectIcon({ type }: ObjectIconProps): JSX.Element {\n const dh = useApi();\n switch (type) {\n case dh.VariableType.TABLE:\n case dh.VariableType.TABLEMAP:\n case dh.VariableType.TREETABLE:\n case dh.VariableType.HIERARCHICALTABLE:\n return <FontAwesomeIcon icon={dhTable} />;\n case dh.VariableType.FIGURE:\n return <FontAwesomeIcon icon={vsGraph} />;\n case dh.VariableType.PANDAS:\n return <FontAwesomeIcon icon={dhPandas} />;\n default:\n return <FontAwesomeIcon icon={vsPreview} />;\n }\n}\n\nexport default ObjectIcon;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,eAAe,QAAQ,gCAAgC;AAChE,SAASC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,EAAEC,SAAS,QAAQ,kBAAkB;AACxE,SAASC,MAAM,QAAQ,4BAA4B;AAAC;AAMpD,SAASC,
|
|
1
|
+
{"version":3,"file":"ObjectIcon.js","names":["React","FontAwesomeIcon","dhPandas","dhTable","vsGraph","vsPreview","useApi","jsx","_jsx","ObjectIcon","_ref","type","dh","VariableType","TABLE","TABLEMAP","TREETABLE","HIERARCHICALTABLE","icon","FIGURE","PANDAS"],"sources":["../../src/common/ObjectIcon.tsx"],"sourcesContent":["import React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { dhPandas, dhTable, vsGraph, vsPreview } from '@deephaven/icons';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\n\nexport type ObjectIconProps = {\n type: string;\n};\n\nfunction ObjectIcon({ type }: ObjectIconProps): JSX.Element {\n const dh = useApi();\n switch (type) {\n case dh.VariableType.TABLE:\n case dh.VariableType.TABLEMAP:\n case dh.VariableType.TREETABLE:\n case dh.VariableType.HIERARCHICALTABLE:\n return <FontAwesomeIcon icon={dhTable} />;\n case dh.VariableType.FIGURE:\n return <FontAwesomeIcon icon={vsGraph} />;\n case dh.VariableType.PANDAS:\n return <FontAwesomeIcon icon={dhPandas} />;\n default:\n return <FontAwesomeIcon icon={vsPreview} />;\n }\n}\n\nexport default ObjectIcon;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,eAAe,QAAQ,gCAAgC;AAChE,SAASC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,EAAEC,SAAS,QAAQ,kBAAkB;AACxE,SAASC,MAAM,QAAQ,4BAA4B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAMpD,SAASC,UAAUA,CAAAC,IAAA,EAAyC;EAAA,IAAxC;IAAEC;EAAsB,CAAC,GAAAD,IAAA;EAC3C,IAAME,EAAE,GAAGN,MAAM,CAAC,CAAC;EACnB,QAAQK,IAAI;IACV,KAAKC,EAAE,CAACC,YAAY,CAACC,KAAK;IAC1B,KAAKF,EAAE,CAACC,YAAY,CAACE,QAAQ;IAC7B,KAAKH,EAAE,CAACC,YAAY,CAACG,SAAS;IAC9B,KAAKJ,EAAE,CAACC,YAAY,CAACI,iBAAiB;MACpC,oBAAOT,IAAA,CAACP,eAAe;QAACiB,IAAI,EAAEf;MAAQ,CAAE,CAAC;IAC3C,KAAKS,EAAE,CAACC,YAAY,CAACM,MAAM;MACzB,oBAAOX,IAAA,CAACP,eAAe;QAACiB,IAAI,EAAEd;MAAQ,CAAE,CAAC;IAC3C,KAAKQ,EAAE,CAACC,YAAY,CAACO,MAAM;MACzB,oBAAOZ,IAAA,CAACP,eAAe;QAACiB,IAAI,EAAEhB;MAAS,CAAE,CAAC;IAC5C;MACE,oBAAOM,IAAA,CAACP,eAAe;QAACiB,IAAI,EAAEb;MAAU,CAAE,CAAC;EAC/C;AACF;AAEA,eAAeI,UAAU"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConsoleHistory.js","names":["ConsoleHistoryItem","itemKey","i","item","command","result","message","error","ConsoleHistory","props","disabled","items","language","openObject","supportsType","iconForType","historyElements","length","historyElement","push"],"sources":["../../src/console-history/ConsoleHistory.tsx"],"sourcesContent":["/**\n * Console display for use in the Iris environment.\n */\nimport { type ReactElement } from 'react';\nimport type { VariableDefinition } from '@deephaven/jsapi-types';\nimport ConsoleHistoryItem from './ConsoleHistoryItem';\n\nimport './ConsoleHistory.scss';\nimport { ConsoleHistoryActionItem } from './ConsoleHistoryTypes';\n\ninterface ConsoleHistoryProps {\n items: ConsoleHistoryActionItem[];\n language: string;\n openObject: (object: VariableDefinition) => void;\n disabled?: boolean;\n supportsType(type: string): boolean;\n iconForType(type: string): ReactElement;\n}\n\nfunction itemKey(i: number, item: ConsoleHistoryActionItem): string {\n return `${i}.${item.command}.${item.result && item.result.message}.${\n item.result && item.result.error\n }`;\n}\n\nfunction ConsoleHistory(props: ConsoleHistoryProps): ReactElement {\n const {\n disabled = false,\n items,\n language,\n openObject,\n supportsType,\n iconForType,\n } = props;\n const historyElements = [];\n for (let i = 0; i < items.length; i += 1) {\n const item = items[i];\n const historyElement = (\n <ConsoleHistoryItem\n key={itemKey(i, item)}\n disabled={disabled}\n item={item}\n openObject={openObject}\n language={language}\n supportsType={supportsType}\n iconForType={iconForType}\n />\n );\n historyElements.push(historyElement);\n }\n\n return (\n <div className=\"container-fluid console-history\">{historyElements}</div>\n );\n}\n\nexport default ConsoleHistory;\n"],"mappings":"AAAA;AACA;AACA;AAFA,OAKOA,kBAAkB;AAAA;AAAA;AAczB,SAASC,
|
|
1
|
+
{"version":3,"file":"ConsoleHistory.js","names":["ConsoleHistoryItem","jsx","_jsx","itemKey","i","item","concat","command","result","message","error","ConsoleHistory","props","disabled","items","language","openObject","supportsType","iconForType","historyElements","length","historyElement","push","className","children"],"sources":["../../src/console-history/ConsoleHistory.tsx"],"sourcesContent":["/**\n * Console display for use in the Iris environment.\n */\nimport { type ReactElement } from 'react';\nimport type { VariableDefinition } from '@deephaven/jsapi-types';\nimport ConsoleHistoryItem from './ConsoleHistoryItem';\n\nimport './ConsoleHistory.scss';\nimport { ConsoleHistoryActionItem } from './ConsoleHistoryTypes';\n\ninterface ConsoleHistoryProps {\n items: ConsoleHistoryActionItem[];\n language: string;\n openObject: (object: VariableDefinition) => void;\n disabled?: boolean;\n supportsType(type: string): boolean;\n iconForType(type: string): ReactElement;\n}\n\nfunction itemKey(i: number, item: ConsoleHistoryActionItem): string {\n return `${i}.${item.command}.${item.result && item.result.message}.${\n item.result && item.result.error\n }`;\n}\n\nfunction ConsoleHistory(props: ConsoleHistoryProps): ReactElement {\n const {\n disabled = false,\n items,\n language,\n openObject,\n supportsType,\n iconForType,\n } = props;\n const historyElements = [];\n for (let i = 0; i < items.length; i += 1) {\n const item = items[i];\n const historyElement = (\n <ConsoleHistoryItem\n key={itemKey(i, item)}\n disabled={disabled}\n item={item}\n openObject={openObject}\n language={language}\n supportsType={supportsType}\n iconForType={iconForType}\n />\n );\n historyElements.push(historyElement);\n }\n\n return (\n <div className=\"container-fluid console-history\">{historyElements}</div>\n );\n}\n\nexport default ConsoleHistory;\n"],"mappings":"AAAA;AACA;AACA;AAFA,OAKOA,kBAAkB;AAAA;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAczB,SAASC,OAAOA,CAACC,CAAS,EAAEC,IAA8B,EAAU;EAClE,UAAAC,MAAA,CAAUF,CAAC,OAAAE,MAAA,CAAID,IAAI,CAACE,OAAO,OAAAD,MAAA,CAAID,IAAI,CAACG,MAAM,IAAIH,IAAI,CAACG,MAAM,CAACC,OAAO,OAAAH,MAAA,CAC/DD,IAAI,CAACG,MAAM,IAAIH,IAAI,CAACG,MAAM,CAACE,KAAK;AAEpC;AAEA,SAASC,cAAcA,CAACC,KAA0B,EAAgB;EAChE,IAAM;IACJC,QAAQ,GAAG,KAAK;IAChBC,KAAK;IACLC,QAAQ;IACRC,UAAU;IACVC,YAAY;IACZC;EACF,CAAC,GAAGN,KAAK;EACT,IAAMO,eAAe,GAAG,EAAE;EAC1B,KAAK,IAAIf,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGU,KAAK,CAACM,MAAM,EAAEhB,CAAC,IAAI,CAAC,EAAE;IACxC,IAAMC,IAAI,GAAGS,KAAK,CAACV,CAAC,CAAC;IACrB,IAAMiB,cAAc,gBAClBnB,IAAA,CAACF,kBAAkB;MAEjBa,QAAQ,EAAEA,QAAS;MACnBR,IAAI,EAAEA,IAAK;MACXW,UAAU,EAAEA,UAAW;MACvBD,QAAQ,EAAEA,QAAS;MACnBE,YAAY,EAAEA,YAAa;MAC3BC,WAAW,EAAEA;IAAY,GANpBf,OAAO,CAACC,CAAC,EAAEC,IAAI,CAOrB,CACF;IACDc,eAAe,CAACG,IAAI,CAACD,cAAc,CAAC;EACtC;EAEA,oBACEnB,IAAA;IAAKqB,SAAS,EAAC,iCAAiC;IAAAC,QAAA,EAAEL;EAAe,CAAM,CAAC;AAE5E;AAEA,eAAeR,cAAc"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConsoleHistoryItem.js","names":["React","PureComponent","Button","Log","classNames","Code","ConsoleHistoryItemResult","ConsoleHistoryResultInProgress","ConsoleHistoryResultErrorMessage","log","module","ConsoleHistoryItem","constructor","props","handleCancelClick","bind","handleObjectClick","object","debug","openObject","item","cancelResult","command","render","disabled","language","iconForType","disabledObjects","result","hasCommand","commandElement","resultElements","hasButtons","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 { Button } from '@deephaven/components';\nimport Log from '@deephaven/log';\nimport type { VariableDefinition } from '@deephaven/jsapi-types';\nimport classNames from 'classnames';\nimport { Code } 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 // TODO: #1573 Remove this eslint disable\n // eslint-disable-next-line react/no-unused-prop-types\n supportsType: (type: string) => boolean;\n iconForType: (type: string) => ReactElement;\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, iconForType } = this.props;\n const { disabledObjects, result } = item;\n const hasCommand = item.command != null && item.command !== '';\n\n let commandElement = null;\n if (hasCommand) {\n commandElement = (\n <div className=\"console-history-item-command\">\n <div className=\"console-history-gutter\">></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 let hasButtons = false;\n\n if (result) {\n const { error, message, changes } = result;\n\n if (changes) {\n const { created, updated } = changes;\n // TODO: #1573 filter for supported types or change button kind\n // based on if type is supported. Possibly a warn state for widgets\n // that the UI doesn't have anything registered to support.\n [...created, ...updated].forEach(object => {\n hasButtons = true;\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 <Button\n key={key}\n kind=\"primary\"\n onClick={() => this.handleObjectClick(object)}\n className=\"btn-console-object\"\n disabled={btnDisabled}\n icon={iconForType(object.type)}\n >\n {title}\n </Button>\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 && !hasCommand) {\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 hasButtons = true;\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\n className={classNames('console-command-result', {\n 'console-result-buttons': hasButtons,\n })}\n >\n {commandElement}\n {resultElement}\n </div>\n );\n }\n}\n\nexport default ConsoleHistoryItem;\n"],"mappings":";;;AAAA;AACA;AACA;AACA,OAAOA,KAAK,IAAIC,aAAa,QAAsB,OAAO;AAC1D,SAASC,MAAM,QAAQ,uBAAuB;AAC9C,OAAOC,GAAG,MAAM,gBAAgB;AAEhC,OAAOC,UAAU,MAAM,YAAY;AAAC,SAC3BC,IAAI;AAAA,OACNC,wBAAwB;AAAA,OACxBC,8BAA8B;AAAA,OAC9BC,gCAAgC;AAAA;AAAA;AAAA;AAIvC,IAAMC,GAAG,
|
|
1
|
+
{"version":3,"file":"ConsoleHistoryItem.js","names":["React","PureComponent","Button","Log","classNames","Code","ConsoleHistoryItemResult","ConsoleHistoryResultInProgress","ConsoleHistoryResultErrorMessage","jsx","_jsx","jsxs","_jsxs","log","module","ConsoleHistoryItem","constructor","props","handleCancelClick","bind","handleObjectClick","object","debug","openObject","item","cancelResult","concat","command","render","disabled","language","iconForType","disabledObjects","result","hasCommand","commandElement","className","children","resultElements","hasButtons","error","message","changes","created","updated","forEach","title","key","btnDisabled","undefined","indexOf","element","kind","onClick","icon","type","push","_message","errorMessage","onCancelClick","resultElement","length","_defineProperty"],"sources":["../../src/console-history/ConsoleHistoryItem.tsx"],"sourcesContent":["/**\n * Console display for use in the Iris environment.\n */\nimport React, { PureComponent, ReactElement } from 'react';\nimport { Button } from '@deephaven/components';\nimport Log from '@deephaven/log';\nimport type { VariableDefinition } from '@deephaven/jsapi-types';\nimport classNames from 'classnames';\nimport { Code } 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 // TODO: #1573 Remove this eslint disable\n // eslint-disable-next-line react/no-unused-prop-types\n supportsType: (type: string) => boolean;\n iconForType: (type: string) => ReactElement;\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, iconForType } = this.props;\n const { disabledObjects, result } = item;\n const hasCommand = item.command != null && item.command !== '';\n\n let commandElement = null;\n if (hasCommand) {\n commandElement = (\n <div className=\"console-history-item-command\">\n <div className=\"console-history-gutter\">></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 let hasButtons = false;\n\n if (result) {\n const { error, message, changes } = result;\n\n if (changes) {\n const { created, updated } = changes;\n // TODO: #1573 filter for supported types or change button kind\n // based on if type is supported. Possibly a warn state for widgets\n // that the UI doesn't have anything registered to support.\n [...created, ...updated].forEach(object => {\n hasButtons = true;\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 <Button\n key={key}\n kind=\"primary\"\n onClick={() => this.handleObjectClick(object)}\n className=\"btn-console-object\"\n disabled={btnDisabled}\n icon={iconForType(object.type)}\n >\n {title}\n </Button>\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 && !hasCommand) {\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 hasButtons = true;\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\n className={classNames('console-command-result', {\n 'console-result-buttons': hasButtons,\n })}\n >\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":"ConsoleHistoryItemResult.js","names":["React","PropTypes","ConsoleHistoryItemResult","children","propTypes","node","isRequired"],"sources":["../../src/console-history/ConsoleHistoryItemResult.tsx"],"sourcesContent":["/**\n * Console display for use in the Iris environment.\n */\nimport React, { ReactElement, ReactNode } from 'react';\nimport PropTypes from 'prop-types';\n\nfunction ConsoleHistoryItemResult({\n children,\n}: {\n children: ReactNode;\n}): ReactElement {\n return (\n <div className=\"console-history-item-result\">\n <div className=\"console-history-gutter\">-</div>\n <div className=\"console-history-content\">{children}</div>\n </div>\n );\n}\n\nConsoleHistoryItemResult.propTypes = {\n children: PropTypes.node.isRequired,\n};\n\nexport default ConsoleHistoryItemResult;\n"],"mappings":"AAAA;AACA;AACA;AACA,OAAOA,KAAK,MAAmC,OAAO;AACtD,OAAOC,SAAS,MAAM,YAAY;AAAC;AAAA;AAEnC,SAASC,
|
|
1
|
+
{"version":3,"file":"ConsoleHistoryItemResult.js","names":["React","PropTypes","jsx","_jsx","jsxs","_jsxs","ConsoleHistoryItemResult","_ref","children","className","propTypes","node","isRequired"],"sources":["../../src/console-history/ConsoleHistoryItemResult.tsx"],"sourcesContent":["/**\n * Console display for use in the Iris environment.\n */\nimport React, { ReactElement, ReactNode } from 'react';\nimport PropTypes from 'prop-types';\n\nfunction ConsoleHistoryItemResult({\n children,\n}: {\n children: ReactNode;\n}): ReactElement {\n return (\n <div className=\"console-history-item-result\">\n <div className=\"console-history-gutter\">-</div>\n <div className=\"console-history-content\">{children}</div>\n </div>\n );\n}\n\nConsoleHistoryItemResult.propTypes = {\n children: PropTypes.node.isRequired,\n};\n\nexport default ConsoleHistoryItemResult;\n"],"mappings":"AAAA;AACA;AACA;AACA,OAAOA,KAAK,MAAmC,OAAO;AACtD,OAAOC,SAAS,MAAM,YAAY;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAEnC,SAASC,wBAAwBA,CAAAC,IAAA,EAIhB;EAAA,IAJiB;IAChCC;EAGF,CAAC,GAAAD,IAAA;EACC,oBACEF,KAAA;IAAKI,SAAS,EAAC,6BAA6B;IAAAD,QAAA,gBAC1CL,IAAA;MAAKM,SAAS,EAAC,wBAAwB;MAAAD,QAAA,EAAC;IAAC,CAAK,CAAC,eAC/CL,IAAA;MAAKM,SAAS,EAAC,yBAAyB;MAAAD,QAAA,EAAEA;IAAQ,CAAM,CAAC;EAAA,CACtD,CAAC;AAEV;AAEAF,wBAAwB,CAACI,SAAS,GAAG;EACnCF,QAAQ,EAAEP,SAAS,CAACU,IAAI,CAACC;AAC3B,CAAC;AAED,eAAeN,wBAAwB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConsoleHistoryResultErrorMessage.js","names":["React","PureComponent","classNames","FontAwesomeIcon","vsTriangleRight","vsTriangleDown","assertNotNull","ConsoleHistoryResultErrorMessage","constructor","props","handleKeyPress","bind","handleMouseDown","handleMouseMove","handleMouseUp","handleToggleError","handleMouseEnter","handleMouseLeave","mouseX","mouseY","isClicking","state","isExpanded","isTriggerHovered","event","key","stopPropagation","preventDefault","clientX","clientY","Math","abs","mouseDragThreshold","shiftKey","metaKey","altKey","setState","render","message","messageProp","lineBreakIndex","indexOf","isMultiline","topLineOfMessage","slice","remainderOfMessage","arrowBtnClasses","expanded"],"sources":["../../src/console-history/ConsoleHistoryResultErrorMessage.tsx"],"sourcesContent":["/**\n * Error message that can be expanded\n */\nimport React, {\n KeyboardEvent,\n MouseEvent,\n PureComponent,\n ReactElement,\n} from 'react';\nimport classNames from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsTriangleRight, vsTriangleDown } from '@deephaven/icons';\nimport { assertNotNull } from '@deephaven/utils';\n\ninterface ConsoleHistoryResultErrorMessageProps {\n message?: string;\n}\n\ninterface ConsoleHistoryResultErrorMessageState {\n isExpanded: boolean;\n isTriggerHovered: boolean;\n}\n\nclass ConsoleHistoryResultErrorMessage extends PureComponent<\n ConsoleHistoryResultErrorMessageProps,\n ConsoleHistoryResultErrorMessageState\n> {\n static defaultProps = {\n message: '',\n };\n\n static mouseDragThreshold = 5;\n\n constructor(props: ConsoleHistoryResultErrorMessageProps) {\n super(props);\n\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleMouseDown = this.handleMouseDown.bind(this);\n this.handleMouseMove = this.handleMouseMove.bind(this);\n this.handleMouseUp = this.handleMouseUp.bind(this);\n this.handleToggleError = this.handleToggleError.bind(this);\n this.handleMouseEnter = this.handleMouseEnter.bind(this);\n this.handleMouseLeave = this.handleMouseLeave.bind(this);\n\n this.mouseX = null;\n this.mouseY = null;\n this.isClicking = false;\n\n this.state = {\n isExpanded: false,\n isTriggerHovered: false,\n };\n }\n\n mouseX: number | null;\n\n mouseY: number | null;\n\n isClicking: boolean;\n\n handleKeyPress(event: KeyboardEvent<HTMLDivElement>): void {\n switch (event.key) {\n case 'Enter':\n case ' ':\n // Toggle the error open/closed\n this.handleToggleError();\n event.stopPropagation();\n event.preventDefault();\n break;\n default:\n break;\n }\n }\n\n handleMouseDown(event: MouseEvent<HTMLDivElement>): void {\n this.mouseX = event.clientX;\n this.mouseY = event.clientY;\n this.isClicking = true;\n }\n\n handleMouseMove(event: MouseEvent<HTMLDivElement>): void {\n if (this.mouseX != null && this.mouseY != null) {\n if (\n Math.abs(event.clientX - this.mouseX) >=\n ConsoleHistoryResultErrorMessage.mouseDragThreshold ||\n Math.abs(event.clientY - this.mouseY) >=\n ConsoleHistoryResultErrorMessage.mouseDragThreshold\n ) {\n this.isClicking = false;\n }\n } else if (this.isClicking) {\n // Rare case - could happen if you mouse down, switch window focus, release the mouse, then come back, mouse down outside of the error, drag into the error, then release the mouse\n this.isClicking = false;\n }\n }\n\n handleMouseUp(event: MouseEvent<HTMLDivElement>): void {\n // We don't want to expand/collapse the error if user is holding shift or an alt key\n // They may be trying to adjust their selection\n if (this.isClicking && !event.shiftKey && !event.metaKey && !event.altKey) {\n this.handleToggleError();\n }\n this.mouseX = null;\n this.mouseY = null;\n this.isClicking = false;\n }\n\n handleToggleError(): void {\n this.setState(state => ({ isExpanded: !state.isExpanded }));\n }\n\n handleMouseEnter(): void {\n this.setState({ isTriggerHovered: true });\n }\n\n handleMouseLeave(): void {\n this.setState({ isTriggerHovered: false });\n }\n\n render(): ReactElement {\n const { isExpanded, isTriggerHovered } = this.state;\n const { message: messageProp } = this.props;\n assertNotNull(messageProp);\n const lineBreakIndex = messageProp.indexOf('\\n');\n const isMultiline = lineBreakIndex > -1;\n let topLineOfMessage = messageProp;\n if (isMultiline) {\n topLineOfMessage = messageProp.slice(0, lineBreakIndex);\n }\n const remainderOfMessage = messageProp.slice(lineBreakIndex);\n const arrowBtnClasses = isTriggerHovered\n ? 'error-btn-link error-btn-link--active'\n : 'error-btn-link';\n\n return (\n <div\n key=\"error\"\n className={classNames('error-message', {\n expanded: isExpanded,\n })}\n >\n {isMultiline && (\n <>\n <div className=\"error-gutter\">\n <button\n type=\"button\"\n onClick={this.handleToggleError}\n className={arrowBtnClasses}\n tabIndex={-1}\n >\n <FontAwesomeIcon\n icon={isExpanded ? vsTriangleDown : vsTriangleRight}\n transform=\"left-3\"\n />\n </button>\n </div>\n <div className=\"error-content\">\n <div\n className=\"console-error-text-trigger\"\n role=\"button\"\n tabIndex={0}\n onKeyPress={this.handleKeyPress}\n onMouseDown={this.handleMouseDown}\n onMouseMove={this.handleMouseMove}\n onMouseEnter={this.handleMouseEnter}\n onMouseLeave={this.handleMouseLeave}\n onMouseUp={this.handleMouseUp}\n >\n {topLineOfMessage}\n </div>\n {isExpanded ? remainderOfMessage : ''}\n </div>\n </>\n )}\n {!isMultiline && (\n <div className=\"error-content\">\n <div className=\"console-error-text\">{topLineOfMessage}</div>\n </div>\n )}\n </div>\n );\n }\n}\n\nexport default ConsoleHistoryResultErrorMessage;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ConsoleHistoryResultErrorMessage.js","names":["React","PureComponent","classNames","FontAwesomeIcon","vsTriangleRight","vsTriangleDown","assertNotNull","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","ConsoleHistoryResultErrorMessage","constructor","props","_defineProperty","handleKeyPress","bind","handleMouseDown","handleMouseMove","handleMouseUp","handleToggleError","handleMouseEnter","handleMouseLeave","mouseX","mouseY","isClicking","state","isExpanded","isTriggerHovered","event","key","stopPropagation","preventDefault","clientX","clientY","Math","abs","mouseDragThreshold","shiftKey","metaKey","altKey","setState","render","message","messageProp","lineBreakIndex","indexOf","isMultiline","topLineOfMessage","slice","remainderOfMessage","arrowBtnClasses","className","expanded","children","type","onClick","tabIndex","icon","transform","role","onKeyPress","onMouseDown","onMouseMove","onMouseEnter","onMouseLeave","onMouseUp"],"sources":["../../src/console-history/ConsoleHistoryResultErrorMessage.tsx"],"sourcesContent":["/**\n * Error message that can be expanded\n */\nimport React, {\n KeyboardEvent,\n MouseEvent,\n PureComponent,\n ReactElement,\n} from 'react';\nimport classNames from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsTriangleRight, vsTriangleDown } from '@deephaven/icons';\nimport { assertNotNull } from '@deephaven/utils';\n\ninterface ConsoleHistoryResultErrorMessageProps {\n message?: string;\n}\n\ninterface ConsoleHistoryResultErrorMessageState {\n isExpanded: boolean;\n isTriggerHovered: boolean;\n}\n\nclass ConsoleHistoryResultErrorMessage extends PureComponent<\n ConsoleHistoryResultErrorMessageProps,\n ConsoleHistoryResultErrorMessageState\n> {\n static defaultProps = {\n message: '',\n };\n\n static mouseDragThreshold = 5;\n\n constructor(props: ConsoleHistoryResultErrorMessageProps) {\n super(props);\n\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleMouseDown = this.handleMouseDown.bind(this);\n this.handleMouseMove = this.handleMouseMove.bind(this);\n this.handleMouseUp = this.handleMouseUp.bind(this);\n this.handleToggleError = this.handleToggleError.bind(this);\n this.handleMouseEnter = this.handleMouseEnter.bind(this);\n this.handleMouseLeave = this.handleMouseLeave.bind(this);\n\n this.mouseX = null;\n this.mouseY = null;\n this.isClicking = false;\n\n this.state = {\n isExpanded: false,\n isTriggerHovered: false,\n };\n }\n\n mouseX: number | null;\n\n mouseY: number | null;\n\n isClicking: boolean;\n\n handleKeyPress(event: KeyboardEvent<HTMLDivElement>): void {\n switch (event.key) {\n case 'Enter':\n case ' ':\n // Toggle the error open/closed\n this.handleToggleError();\n event.stopPropagation();\n event.preventDefault();\n break;\n default:\n break;\n }\n }\n\n handleMouseDown(event: MouseEvent<HTMLDivElement>): void {\n this.mouseX = event.clientX;\n this.mouseY = event.clientY;\n this.isClicking = true;\n }\n\n handleMouseMove(event: MouseEvent<HTMLDivElement>): void {\n if (this.mouseX != null && this.mouseY != null) {\n if (\n Math.abs(event.clientX - this.mouseX) >=\n ConsoleHistoryResultErrorMessage.mouseDragThreshold ||\n Math.abs(event.clientY - this.mouseY) >=\n ConsoleHistoryResultErrorMessage.mouseDragThreshold\n ) {\n this.isClicking = false;\n }\n } else if (this.isClicking) {\n // Rare case - could happen if you mouse down, switch window focus, release the mouse, then come back, mouse down outside of the error, drag into the error, then release the mouse\n this.isClicking = false;\n }\n }\n\n handleMouseUp(event: MouseEvent<HTMLDivElement>): void {\n // We don't want to expand/collapse the error if user is holding shift or an alt key\n // They may be trying to adjust their selection\n if (this.isClicking && !event.shiftKey && !event.metaKey && !event.altKey) {\n this.handleToggleError();\n }\n this.mouseX = null;\n this.mouseY = null;\n this.isClicking = false;\n }\n\n handleToggleError(): void {\n this.setState(state => ({ isExpanded: !state.isExpanded }));\n }\n\n handleMouseEnter(): void {\n this.setState({ isTriggerHovered: true });\n }\n\n handleMouseLeave(): void {\n this.setState({ isTriggerHovered: false });\n }\n\n render(): ReactElement {\n const { isExpanded, isTriggerHovered } = this.state;\n const { message: messageProp } = this.props;\n assertNotNull(messageProp);\n const lineBreakIndex = messageProp.indexOf('\\n');\n const isMultiline = lineBreakIndex > -1;\n let topLineOfMessage = messageProp;\n if (isMultiline) {\n topLineOfMessage = messageProp.slice(0, lineBreakIndex);\n }\n const remainderOfMessage = messageProp.slice(lineBreakIndex);\n const arrowBtnClasses = isTriggerHovered\n ? 'error-btn-link error-btn-link--active'\n : 'error-btn-link';\n\n return (\n <div\n key=\"error\"\n className={classNames('error-message', {\n expanded: isExpanded,\n })}\n >\n {isMultiline && (\n <>\n <div className=\"error-gutter\">\n <button\n type=\"button\"\n onClick={this.handleToggleError}\n className={arrowBtnClasses}\n tabIndex={-1}\n >\n <FontAwesomeIcon\n icon={isExpanded ? vsTriangleDown : vsTriangleRight}\n transform=\"left-3\"\n />\n </button>\n </div>\n <div className=\"error-content\">\n <div\n className=\"console-error-text-trigger\"\n role=\"button\"\n tabIndex={0}\n onKeyPress={this.handleKeyPress}\n onMouseDown={this.handleMouseDown}\n onMouseMove={this.handleMouseMove}\n onMouseEnter={this.handleMouseEnter}\n onMouseLeave={this.handleMouseLeave}\n onMouseUp={this.handleMouseUp}\n >\n {topLineOfMessage}\n </div>\n {isExpanded ? remainderOfMessage : ''}\n </div>\n </>\n )}\n {!isMultiline && (\n <div className=\"error-content\">\n <div className=\"console-error-text\">{topLineOfMessage}</div>\n </div>\n )}\n </div>\n );\n }\n}\n\nexport default ConsoleHistoryResultErrorMessage;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConsoleHistoryResultInProgress.js","names":["React","Component","classNames","Button","LoadingSpinner","vsClose","TimeUtils","ConsoleHistoryResultInProgress","constructor","props","updateElapsed","bind","startTime","Date","now","state","elapsed","componentDidMount","timer","setInterval","componentWillUnmount","clearInterval","undefined","setState","Math","round","render","disabled","onCancelClick","formatElapsedTime"],"sources":["../../src/console-history/ConsoleHistoryResultInProgress.tsx"],"sourcesContent":["import React, { Component, ReactElement } from 'react';\nimport classNames from 'classnames';\nimport { Button, LoadingSpinner } from '@deephaven/components';\nimport { vsClose } from '@deephaven/icons';\nimport { TimeUtils } from '@deephaven/utils';\nimport './ConsoleHistoryResultInProgress.scss';\n\ninterface ConsoleHistoryResultInProgressProps {\n onCancelClick: () => void;\n disabled: boolean;\n}\n\ninterface ConsoleHistoryResultInProgressState {\n elapsed: number;\n}\n/**\n * A spinner shown when a command is taking a while.\n */\nclass ConsoleHistoryResultInProgress extends Component<\n ConsoleHistoryResultInProgressProps,\n ConsoleHistoryResultInProgressState\n> {\n static defaultProps = {\n disabled: false,\n };\n\n constructor(props: ConsoleHistoryResultInProgressProps) {\n super(props);\n\n this.updateElapsed = this.updateElapsed.bind(this);\n\n this.startTime = Date.now();\n\n this.state = {\n elapsed: 0,\n };\n }\n\n componentDidMount(): void {\n this.timer = setInterval(this.updateElapsed, 1000);\n }\n\n componentWillUnmount(): void {\n if (this.timer) {\n clearInterval(this.timer);\n }\n\n this.timer = undefined;\n }\n\n timer?: NodeJS.Timer;\n\n startTime: number;\n\n updateElapsed(): void {\n this.setState({\n elapsed: Math.round((Date.now() - this.startTime) / 1000),\n });\n }\n\n render(): ReactElement {\n const { disabled, onCancelClick } = this.props;\n const { elapsed } = this.state;\n return (\n <div\n className={classNames('console-history-result-in-progress', {\n disabled,\n })}\n >\n <span className=\"badge\">\n <LoadingSpinner />\n Running... {TimeUtils.formatElapsedTime(elapsed)} \n <Button\n className=\"console-history-result-in-progress-cancel\"\n kind=\"ghost\"\n icon={vsClose}\n tooltip=\"Cancel\"\n onClick={onCancelClick}\n disabled={disabled}\n />\n </span>\n </div>\n );\n }\n}\n\nexport default ConsoleHistoryResultInProgress;\n"],"mappings":";;;AAAA,OAAOA,KAAK,IAAIC,SAAS,QAAsB,OAAO;AACtD,OAAOC,UAAU,MAAM,YAAY;AACnC,SAASC,MAAM,EAAEC,cAAc,QAAQ,uBAAuB;AAC9D,SAASC,OAAO,QAAQ,kBAAkB;AAC1C,SAASC,SAAS,QAAQ,kBAAkB;AAAC;AAAA;AAAA;AAW7C;AACA;AACA;AACA,MAAMC,8BAA8B,
|
|
1
|
+
{"version":3,"file":"ConsoleHistoryResultInProgress.js","names":["React","Component","classNames","Button","LoadingSpinner","vsClose","TimeUtils","jsx","_jsx","jsxs","_jsxs","ConsoleHistoryResultInProgress","constructor","props","_defineProperty","updateElapsed","bind","startTime","Date","now","state","elapsed","componentDidMount","timer","setInterval","componentWillUnmount","clearInterval","undefined","setState","Math","round","render","disabled","onCancelClick","className","children","formatElapsedTime","kind","icon","tooltip","onClick"],"sources":["../../src/console-history/ConsoleHistoryResultInProgress.tsx"],"sourcesContent":["import React, { Component, ReactElement } from 'react';\nimport classNames from 'classnames';\nimport { Button, LoadingSpinner } from '@deephaven/components';\nimport { vsClose } from '@deephaven/icons';\nimport { TimeUtils } from '@deephaven/utils';\nimport './ConsoleHistoryResultInProgress.scss';\n\ninterface ConsoleHistoryResultInProgressProps {\n onCancelClick: () => void;\n disabled: boolean;\n}\n\ninterface ConsoleHistoryResultInProgressState {\n elapsed: number;\n}\n/**\n * A spinner shown when a command is taking a while.\n */\nclass ConsoleHistoryResultInProgress extends Component<\n ConsoleHistoryResultInProgressProps,\n ConsoleHistoryResultInProgressState\n> {\n static defaultProps = {\n disabled: false,\n };\n\n constructor(props: ConsoleHistoryResultInProgressProps) {\n super(props);\n\n this.updateElapsed = this.updateElapsed.bind(this);\n\n this.startTime = Date.now();\n\n this.state = {\n elapsed: 0,\n };\n }\n\n componentDidMount(): void {\n this.timer = setInterval(this.updateElapsed, 1000);\n }\n\n componentWillUnmount(): void {\n if (this.timer) {\n clearInterval(this.timer);\n }\n\n this.timer = undefined;\n }\n\n timer?: NodeJS.Timer;\n\n startTime: number;\n\n updateElapsed(): void {\n this.setState({\n elapsed: Math.round((Date.now() - this.startTime) / 1000),\n });\n }\n\n render(): ReactElement {\n const { disabled, onCancelClick } = this.props;\n const { elapsed } = this.state;\n return (\n <div\n className={classNames('console-history-result-in-progress', {\n disabled,\n })}\n >\n <span className=\"badge\">\n <LoadingSpinner />\n Running... {TimeUtils.formatElapsedTime(elapsed)} \n <Button\n className=\"console-history-result-in-progress-cancel\"\n kind=\"ghost\"\n icon={vsClose}\n tooltip=\"Cancel\"\n onClick={onCancelClick}\n disabled={disabled}\n />\n </span>\n </div>\n );\n }\n}\n\nexport default ConsoleHistoryResultInProgress;\n"],"mappings":";;;AAAA,OAAOA,KAAK,IAAIC,SAAS,QAAsB,OAAO;AACtD,OAAOC,UAAU,MAAM,YAAY;AACnC,SAASC,MAAM,EAAEC,cAAc,QAAQ,uBAAuB;AAC9D,SAASC,OAAO,QAAQ,kBAAkB;AAC1C,SAASC,SAAS,QAAQ,kBAAkB;AAAC;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAW7C;AACA;AACA;AACA,MAAMC,8BAA8B,SAASV,SAAS,CAGpD;EAKAW,WAAWA,CAACC,KAA0C,EAAE;IACtD,KAAK,CAACA,KAAK,CAAC;IAACC,eAAA;IAAAA,eAAA;IAEb,IAAI,CAACC,aAAa,GAAG,IAAI,CAACA,aAAa,CAACC,IAAI,CAAC,IAAI,CAAC;IAElD,IAAI,CAACC,SAAS,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC;IAE3B,IAAI,CAACC,KAAK,GAAG;MACXC,OAAO,EAAE;IACX,CAAC;EACH;EAEAC,iBAAiBA,CAAA,EAAS;IACxB,IAAI,CAACC,KAAK,GAAGC,WAAW,CAAC,IAAI,CAACT,aAAa,EAAE,IAAI,CAAC;EACpD;EAEAU,oBAAoBA,CAAA,EAAS;IAC3B,IAAI,IAAI,CAACF,KAAK,EAAE;MACdG,aAAa,CAAC,IAAI,CAACH,KAAK,CAAC;IAC3B;IAEA,IAAI,CAACA,KAAK,GAAGI,SAAS;EACxB;EAMAZ,aAAaA,CAAA,EAAS;IACpB,IAAI,CAACa,QAAQ,CAAC;MACZP,OAAO,EAAEQ,IAAI,CAACC,KAAK,CAAC,CAACZ,IAAI,CAACC,GAAG,CAAC,CAAC,GAAG,IAAI,CAACF,SAAS,IAAI,IAAI;IAC1D,CAAC,CAAC;EACJ;EAEAc,MAAMA,CAAA,EAAiB;IACrB,IAAM;MAAEC,QAAQ;MAAEC;IAAc,CAAC,GAAG,IAAI,CAACpB,KAAK;IAC9C,IAAM;MAAEQ;IAAQ,CAAC,GAAG,IAAI,CAACD,KAAK;IAC9B,oBACEZ,IAAA;MACE0B,SAAS,EAAEhC,UAAU,CAAC,oCAAoC,EAAE;QAC1D8B;MACF,CAAC,CAAE;MAAAG,QAAA,eAEHzB,KAAA;QAAMwB,SAAS,EAAC,OAAO;QAAAC,QAAA,gBACrB3B,IAAA,CAACJ,cAAc,IAAE,CAAC,eACP,EAACE,SAAS,CAAC8B,iBAAiB,CAACf,OAAO,CAAC,EAAC,MACjD,eAAAb,IAAA,CAACL,MAAM;UACL+B,SAAS,EAAC,2CAA2C;UACrDG,IAAI,EAAC,OAAO;UACZC,IAAI,EAAEjC,OAAQ;UACdkC,OAAO,EAAC,QAAQ;UAChBC,OAAO,EAAEP,aAAc;UACvBD,QAAQ,EAAEA;QAAS,CACpB,CAAC;MAAA,CACE;IAAC,CACJ,CAAC;EAEV;AACF;AAAClB,eAAA,CAlEKH,8BAA8B,kBAIZ;EACpBqB,QAAQ,EAAE;AACZ,CAAC;AA8DH,eAAerB,8BAA8B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CsvFormats.js","names":["CsvFormats","fromExtension","fileName","endsWith","Object","freeze","DEFAULT_CSV","name","delimiter","newline","undefined","escapeChar","shouldTrim","skipEmptyLines","nullString","TSV","APACHE_COMMON_CSV","EXCEL_CSV","MY_SQL_CSV","RFC4180_CSV","COLON_SV","SEMI_COLON_SV","PIPE_SV","SPACE_SV","AUTODETECT"],"sources":["../../src/csv/CsvFormats.ts"],"sourcesContent":["export type CsvTypes = (typeof CsvFormats.TYPES)[keyof typeof CsvFormats.TYPES];\n\nclass CsvFormats {\n static DEFAULT_TYPE = 'DEFAULT_CSV' as const;\n\n static AUTO = 'AUTODETECT' as const;\n\n static fromExtension(fileName: string): keyof typeof CsvFormats.TYPES {\n if (fileName.endsWith('.csv')) {\n return 'DEFAULT_CSV';\n }\n if (fileName.endsWith('.tsv') || fileName.endsWith('.tab')) {\n return 'TSV';\n }\n if (fileName.endsWith('.psv')) {\n return 'PIPE_SV';\n }\n return 'AUTODETECT';\n }\n\n static TYPES = Object.freeze({\n DEFAULT_CSV: {\n name: 'Default csv (trimmed)',\n delimiter: ',',\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n\n TSV: {\n name: 'Tab seperated (tsv)',\n delimiter: '\\t',\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n\n // From org.apache.commons.csv.CSVFormat#DEFAULT\n APACHE_COMMON_CSV: {\n name: 'Apache Common csv',\n delimiter: ',',\n newline: '\\r\\n',\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: null,\n },\n\n // From org.apache.commons.csv.CSVFormat#EXCEL\n EXCEL_CSV: {\n name: 'Excel csv (strict)',\n delimiter: ',',\n newline: '\\r\\n',\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: false,\n nullString: null,\n },\n\n // From org.apache.commons.csv.CSVFormat#MYSQL\n MY_SQL_CSV: {\n name: 'MySQL csv',\n delimiter: '\\t',\n newline: '\\n',\n escapeChar: '\\\\',\n shouldTrim: true,\n skipEmptyLines: false,\n nullString: '\\\\N',\n },\n\n // From org.apache.commons.csv.CSVFormat#RFC4180\n RFC4180_CSV: {\n name: 'RFC4180 csv',\n delimiter: ',',\n newline: '\\r\\n',\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: false,\n nullString: null,\n },\n\n COLON_SV: {\n name: ': colon sv',\n delimiter: ':',\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n\n SEMI_COLON_SV: {\n name: '; semi-colon sv',\n delimiter: ';',\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n\n PIPE_SV: {\n name: '| pipe separated (psv)',\n delimiter: '|',\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n\n SPACE_SV: {\n name: '\" \" space sv',\n delimiter: ' ',\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n\n AUTODETECT: {\n name: 'autodetect',\n delimiter: undefined, // autodetect\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n });\n}\n\nexport default CsvFormats;\n"],"mappings":";;;AAEA,MAAMA,UAAU,CAAC;EAKf,OAAOC,
|
|
1
|
+
{"version":3,"file":"CsvFormats.js","names":["CsvFormats","fromExtension","fileName","endsWith","_defineProperty","Object","freeze","DEFAULT_CSV","name","delimiter","newline","undefined","escapeChar","shouldTrim","skipEmptyLines","nullString","TSV","APACHE_COMMON_CSV","EXCEL_CSV","MY_SQL_CSV","RFC4180_CSV","COLON_SV","SEMI_COLON_SV","PIPE_SV","SPACE_SV","AUTODETECT"],"sources":["../../src/csv/CsvFormats.ts"],"sourcesContent":["export type CsvTypes = (typeof CsvFormats.TYPES)[keyof typeof CsvFormats.TYPES];\n\nclass CsvFormats {\n static DEFAULT_TYPE = 'DEFAULT_CSV' as const;\n\n static AUTO = 'AUTODETECT' as const;\n\n static fromExtension(fileName: string): keyof typeof CsvFormats.TYPES {\n if (fileName.endsWith('.csv')) {\n return 'DEFAULT_CSV';\n }\n if (fileName.endsWith('.tsv') || fileName.endsWith('.tab')) {\n return 'TSV';\n }\n if (fileName.endsWith('.psv')) {\n return 'PIPE_SV';\n }\n return 'AUTODETECT';\n }\n\n static TYPES = Object.freeze({\n DEFAULT_CSV: {\n name: 'Default csv (trimmed)',\n delimiter: ',',\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n\n TSV: {\n name: 'Tab seperated (tsv)',\n delimiter: '\\t',\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n\n // From org.apache.commons.csv.CSVFormat#DEFAULT\n APACHE_COMMON_CSV: {\n name: 'Apache Common csv',\n delimiter: ',',\n newline: '\\r\\n',\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: null,\n },\n\n // From org.apache.commons.csv.CSVFormat#EXCEL\n EXCEL_CSV: {\n name: 'Excel csv (strict)',\n delimiter: ',',\n newline: '\\r\\n',\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: false,\n nullString: null,\n },\n\n // From org.apache.commons.csv.CSVFormat#MYSQL\n MY_SQL_CSV: {\n name: 'MySQL csv',\n delimiter: '\\t',\n newline: '\\n',\n escapeChar: '\\\\',\n shouldTrim: true,\n skipEmptyLines: false,\n nullString: '\\\\N',\n },\n\n // From org.apache.commons.csv.CSVFormat#RFC4180\n RFC4180_CSV: {\n name: 'RFC4180 csv',\n delimiter: ',',\n newline: '\\r\\n',\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: false,\n nullString: null,\n },\n\n COLON_SV: {\n name: ': colon sv',\n delimiter: ':',\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n\n SEMI_COLON_SV: {\n name: '; semi-colon sv',\n delimiter: ';',\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n\n PIPE_SV: {\n name: '| pipe separated (psv)',\n delimiter: '|',\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n\n SPACE_SV: {\n name: '\" \" space sv',\n delimiter: ' ',\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n\n AUTODETECT: {\n name: 'autodetect',\n delimiter: undefined, // autodetect\n newline: undefined, // autodetect\n escapeChar: '\"',\n shouldTrim: true,\n skipEmptyLines: true,\n nullString: '(null)',\n },\n });\n}\n\nexport default CsvFormats;\n"],"mappings":"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"}
|
|
@@ -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","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 type { IdeSession, Table } from '@deephaven/jsapi-types';\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: 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[]): void => {\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 { tableName, isFirstRowHeaders, showProgress, progressValue, 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 kind=\"primary\" onClick={this.handleCancelInProgress}>\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","jsx","_jsx","jsxs","_jsxs","log","module","TYPE_OPTIONS","Object","entries","TYPES","map","_ref","key","value","children","name","CsvInputBar","constructor","props","_defineProperty","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","_this$inputRef$curren","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","arguments","length","info","concat","File","size","session","timeZone","onInProgress","handleParseDone","tables","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","className","onSubmit","htmlFor","ref","id","onChange","checked","kind","onClick","disabled","style","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 type { IdeSession, Table } from '@deephaven/jsapi-types';\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: 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[]): void => {\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 { tableName, isFirstRowHeaders, showProgress, progressValue, 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 kind=\"primary\" onClick={this.handleCancelInProgress}>\n Cancel\n </Button>\n </div>\n )}\n </div>\n );\n }\n}\n\nexport default CsvInputBar;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CsvOverlay.js","names":["React","Component","memoize","FontAwesomeIcon","Button","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 Button,\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: boolean) =>\n this.getValidExtensions(allowZip).join(', ')\n );\n\n getFileTypeErrorString = memoize((allowZip: boolean) =>\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 kind=\"primary\" onClick={this.handleSelectFile}>\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 kind=\"ghost\"\n className=\"ml-2\"\n onClick={this.unstageFile}\n icon={vsTrash}\n tooltip=\"Remove\"\n />\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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"}
|
|
1
|
+
{"version":3,"file":"CsvOverlay.js","names":["React","Component","memoize","FontAwesomeIcon","Button","ContextActions","GLOBAL_SHORTCUTS","dhFileCsv","dhFileDownload","dhFileSpreadsheet","vsClippy","vsFileZip","vsTrash","vsWarning","assertNotNull","TextUtils","jsx","_jsx","jsxs","_jsxs","PASTED_VALUES","INVALID_MIME_TYPES","VALID_EXTENSIONS","ZIP_EXTENSIONS","CsvOverlay","isValidDropItem","item","kind","find","invalid","test","type","isValidExtension","name","allowZip","arguments","length","undefined","some","ext","endsWith","handleDragOver","e","preventDefault","stopPropagation","getIcon","fileName","constructor","props","_defineProperty","getValidExtensions","join","handleSelectFile","bind","handleFiles","handleDrop","unstageFile","handleMenuPaste","handlePasteEvent","fileElem","createRef","divElem","state","selectedFileName","componentDidMount","_this$divElem$current","_this$divElem$current2","current","addEventListener","focus","componentWillUnmount","_this$divElem$current3","removeEventListener","_this$fileElem$curren","value","click","event","files","target","handleFile","clearDragError","dragError","dataTransfer","items","file","getAsFile","setState","dropError","FILE_TYPE_ERROR","onCancel","onFileOpened","onPaste","onError","uploadInProgress","navigator","clipboard","readText","then","clipText","catch","makeContextMenuItems","title","icon","action","shortcut","PASTE","disabled","render","error","contextActions","ref","className","onDragOver","onDrop","tabIndex","children","actions","id","accept","getAcceptString","style","display","onChange","onClick","tooltip","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 Button,\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: boolean) =>\n this.getValidExtensions(allowZip).join(', ')\n );\n\n getFileTypeErrorString = memoize((allowZip: boolean) =>\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 kind=\"primary\" onClick={this.handleSelectFile}>\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 kind=\"ghost\"\n className=\"ml-2\"\n onClick={this.unstageFile}\n icon={vsTrash}\n tooltip=\"Remove\"\n />\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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"}
|