@deephaven/console 1.22.1 → 1.22.2-alpha-pivot-builder.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 +85 -141
- package/dist/Console.js.map +1 -1
- package/dist/ConsoleInput.js +23 -41
- package/dist/ConsoleInput.js.map +1 -1
- package/dist/ConsoleObjectsMenu.js +13 -8
- package/dist/ConsoleObjectsMenu.js.map +1 -1
- package/dist/ConsoleStatusBar.js +15 -10
- package/dist/ConsoleStatusBar.js.map +1 -1
- package/dist/HeapUsage.js +33 -26
- package/dist/HeapUsage.js.map +1 -1
- package/dist/command-history/CommandHistory.js +45 -76
- package/dist/command-history/CommandHistory.js.map +1 -1
- package/dist/command-history/CommandHistoryActions.js +3 -4
- package/dist/command-history/CommandHistoryActions.js.map +1 -1
- package/dist/command-history/CommandHistoryItem.js +5 -6
- package/dist/command-history/CommandHistoryItem.js.map +1 -1
- package/dist/command-history/CommandHistoryItemTooltip.js +20 -33
- package/dist/command-history/CommandHistoryItemTooltip.js.map +1 -1
- package/dist/command-history/CommandHistoryViewportUpdater.js +10 -9
- package/dist/command-history/CommandHistoryViewportUpdater.js.map +1 -1
- package/dist/common/Code.js +14 -8
- package/dist/common/Code.js.map +1 -1
- package/dist/common/ObjectIcon.js +1 -3
- package/dist/common/ObjectIcon.js.map +1 -1
- package/dist/console-history/ConsoleHistory.js +8 -9
- package/dist/console-history/ConsoleHistory.js.map +1 -1
- package/dist/console-history/ConsoleHistoryItem.js +17 -32
- package/dist/console-history/ConsoleHistoryItem.js.map +1 -1
- package/dist/console-history/ConsoleHistoryItemActions.js +3 -5
- package/dist/console-history/ConsoleHistoryItemActions.js.map +1 -1
- package/dist/console-history/ConsoleHistoryItemResult.js +1 -3
- package/dist/console-history/ConsoleHistoryItemResult.js.map +1 -1
- package/dist/console-history/ConsoleHistoryItemTooltip.js +4 -8
- package/dist/console-history/ConsoleHistoryItemTooltip.js.map +1 -1
- package/dist/console-history/ConsoleHistoryResultErrorMessage.js +4 -7
- package/dist/console-history/ConsoleHistoryResultErrorMessage.js.map +1 -1
- package/dist/console-history/ConsoleHistoryResultInProgress.js +4 -7
- package/dist/console-history/ConsoleHistoryResultInProgress.js.map +1 -1
- package/dist/csv/CsvInputBar.js +51 -67
- package/dist/csv/CsvInputBar.js.map +1 -1
- package/dist/csv/CsvOverlay.js +19 -31
- package/dist/csv/CsvOverlay.js.map +1 -1
- package/dist/csv/CsvParser.js +25 -36
- package/dist/csv/CsvParser.js.map +1 -1
- package/dist/csv/CsvTypeParser.js +4 -10
- package/dist/csv/CsvTypeParser.js.map +1 -1
- package/dist/log/LogLevelMenuItem.js +6 -8
- package/dist/log/LogLevelMenuItem.js.map +1 -1
- package/dist/log/LogView.js +9 -27
- package/dist/log/LogView.js.map +1 -1
- package/dist/monaco/MonacoProviders.js +27 -41
- package/dist/monaco/MonacoProviders.js.map +1 -1
- package/dist/monaco/MonacoThemeProvider.js +3 -6
- package/dist/monaco/MonacoThemeProvider.js.map +1 -1
- package/dist/monaco/MonacoUtils.js +17 -36
- package/dist/monaco/MonacoUtils.js.map +1 -1
- package/dist/monaco/RuffSettingsModal.js +29 -17
- package/dist/monaco/RuffSettingsModal.js.map +1 -1
- package/dist/notebook/Editor.js +4 -12
- package/dist/notebook/Editor.js.map +1 -1
- package/dist/notebook/ScriptEditor.js +34 -51
- package/dist/notebook/ScriptEditor.js.map +1 -1
- package/package.json +14 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CsvParser.js","names":["Papa","Log","assertNotNull","DbNameValidator","CsvTypeParser","makeZipStreamHelper","log","module","ZIP_CONSOLIDATE_CHUNKS","CsvParser","generateHeaderRecursive","n","header","char","concat","Math","floor","String","fromCharCode","constructor","_ref","onFileCompleted","session","file","type","readHeaders","onProgress","onError","timeZone","isZip","_defineProperty","tables","rowCount","rowsProcessed","chunks","totalChunks","ceil","size","LocalChunkSize","isComplete","zipProgress","numConsolidated","isCancelled","handleChunk","bind","handleError","handleComplete","handleNodeUpdate","handleCreateTable","config","delimiter","newline","escapeChar","dynamicTyping","error","skipEmptyLines","chunk","complete","fastMode","cancel","transpose","numColumns","array","numRows","length","columns","Array","fill","map","r","row","Error","c","value","shouldTrim","trim","nullCheck","nullString","parse","handleParseDone","types","File","Blob","zipStream","resume","typeParser","result","parser","debug2","abort","forEach","t","close","data","headers","legalizeColumnNames","slice","generateHeaders","consolidateChunks","index","e","consolidatedChunks","i","uploadConsolidatedChunks","_this$consolidatedChu","toUpload","undefined","pause","newTable","then","table","progress","round","catch","results","meta","aborted","metadata","percent","_CsvParser","push"],"sources":["../../src/csv/CsvParser.ts"],"sourcesContent":["import Papa, {\n type ParseLocalConfig,\n type Parser,\n type ParseResult,\n} from 'papaparse';\nimport Log from '@deephaven/log';\nimport { assertNotNull, DbNameValidator } from '@deephaven/utils';\nimport type { dh } from '@deephaven/jsapi-types';\nimport type { JSZipObject } from 'jszip';\nimport CsvTypeParser from './CsvTypeParser';\nimport { type CsvTypes } from './CsvFormats';\nimport makeZipStreamHelper from './ZipStreamHelper';\n\nconst log = Log.module('CsvParser');\n\n// This is based on jszip streaming ~15 KB chunks to papa parse\n// Want to consolidate to ~10 MB chunks\nconst ZIP_CONSOLIDATE_CHUNKS = 650;\n\ninterface CsvParserConstructor {\n onFileCompleted: (tables: dh.Table[]) => void;\n session: dh.IdeSession;\n file: File | Blob | JSZipObject;\n type: CsvTypes;\n readHeaders: boolean;\n onProgress: (progressValue: number) => boolean;\n onError: (e: unknown) => void;\n timeZone: string;\n isZip: boolean;\n}\n\n/**\n * Parser a CSV file in chunks and returns a table handle for each chunk.\n */\nclass CsvParser {\n // Generates column names A-Z, AA-AZ, BA-BZ, etc...\n static generateHeaders = (numColumns: number): string[] => {\n const headers = [];\n for (let i = 0; i < numColumns; i += 1) {\n headers.push(CsvParser.generateHeaderRecursive(i));\n }\n return headers;\n };\n\n static generateHeaderRecursive(n: number): string {\n let header = '';\n let char = n;\n if (n >= 26) {\n header = header.concat(\n CsvParser.generateHeaderRecursive(Math.floor(n / 26) - 1)\n );\n char = n % 26;\n }\n return header.concat(String.fromCharCode(65 + char));\n }\n\n constructor({\n onFileCompleted,\n session,\n file,\n type,\n readHeaders = true,\n onProgress,\n onError,\n timeZone,\n isZip,\n }: CsvParserConstructor) {\n this.onFileCompleted = onFileCompleted;\n this.session = session;\n this.file = file;\n this.isZip = isZip;\n this.type = type;\n this.readHeaders = readHeaders;\n this.timeZone = timeZone;\n this.onProgress = onProgress;\n this.onError = onError;\n this.tables = [];\n this.rowCount = 0;\n this.rowsProcessed = 0;\n this.chunks = 0;\n this.totalChunks = isZip\n ? 0\n : Math.ceil((file as Blob).size / Papa.LocalChunkSize);\n this.isComplete = false;\n this.zipProgress = 0;\n this.numConsolidated = 0;\n this.isCancelled = false;\n\n this.handleChunk = this.handleChunk.bind(this);\n this.handleError = this.handleError.bind(this);\n this.handleComplete = this.handleComplete.bind(this);\n this.handleNodeUpdate = this.handleNodeUpdate.bind(this);\n this.handleCreateTable = this.handleCreateTable.bind(this);\n\n this.config = {\n delimiter: type.delimiter,\n newline: type.newline as '\\r\\n' | '\\n' | '\\r' | undefined,\n escapeChar: type.escapeChar,\n dynamicTyping: false,\n error: this.handleError,\n skipEmptyLines: type.skipEmptyLines,\n chunk: this.handleChunk,\n complete: this.handleComplete,\n fastMode: false,\n };\n }\n\n onFileCompleted: (tables: dh.Table[]) => void;\n\n session: dh.IdeSession;\n\n file: File | Blob | JSZipObject;\n\n isZip: boolean;\n\n type: CsvTypes;\n\n readHeaders: boolean;\n\n timeZone: string;\n\n onProgress: (progressValue: number) => boolean;\n\n onError: (e: unknown) => void;\n\n tables: dh.Table[];\n\n headers?: string[];\n\n types?: string[];\n\n rowCount: number;\n\n rowsProcessed: number;\n\n chunks: number;\n\n totalChunks: number;\n\n isComplete: boolean;\n\n zipProgress: number;\n\n consolidatedChunks?: string[][];\n\n numConsolidated: number;\n\n isCancelled: boolean;\n\n config: ParseLocalConfig<unknown, Blob | NodeJS.ReadableStream>;\n\n cancel(): void {\n this.isCancelled = true;\n }\n\n transpose(numColumns: number, array: string[][]): string[][] {\n const numRows = array.length;\n const columns = new Array(numColumns)\n .fill(null)\n .map(() => new Array(numRows));\n for (let r = 0; r < numRows; r += 1) {\n const row = array[r];\n if (row.length < numColumns) {\n throw new Error(\n `Insufficient columns. Expected ${numColumns} but found ${row.length}\\n${row}`\n );\n }\n for (let c = 0; c < numColumns; c += 1) {\n const value = this.type.shouldTrim ? array[r][c].trim() : array[r][c];\n columns[c][r] = this.nullCheck(value);\n }\n }\n return columns as string[][];\n }\n\n nullCheck(value: string): string {\n return value === this.type.nullString ? '' : value;\n }\n\n parse(): void {\n const handleParseDone = (types: string[], rowCount: number): void => {\n this.types = types;\n this.rowCount = rowCount;\n\n if (this.file instanceof File || this.file instanceof Blob) {\n Papa.parse(this.file, this.config);\n } else {\n const zipStream = makeZipStreamHelper(this.file, this.handleNodeUpdate);\n // This is actually a stream, but papaparse TS doesn't like it\n Papa.parse(zipStream as unknown as Blob, this.config);\n // The stream needs to be manually resumed since jszip starts paused\n // Papaparse does not call resume and assumes the stream is already reading\n zipStream.resume();\n }\n };\n const typeParser = new CsvTypeParser(\n handleParseDone,\n this.file,\n this.readHeaders,\n this.config,\n this.type.nullString,\n this.onProgress,\n this.onError,\n this.totalChunks,\n this.isZip,\n this.type.shouldTrim\n );\n typeParser.parse();\n }\n\n handleChunk(result: ParseResult<string[]>, parser: Parser): void {\n const { readHeaders, onError, handleCreateTable, isZip, tables } = this;\n if (this.isCancelled) {\n log.debug2('CSV parser cancelled.');\n parser.abort();\n tables.forEach(t => t.close());\n return;\n }\n let { data } = result;\n if (!this.headers) {\n if (readHeaders) {\n this.headers = DbNameValidator.legalizeColumnNames(data[0]);\n data = data.slice(1);\n } else {\n this.headers = CsvParser.generateHeaders(data[0].length);\n }\n }\n\n let columns: string[][] = [];\n try {\n columns = this.transpose(this.headers.length, data);\n if (isZip) {\n // Zip file chunks are tiny, so consolidate them to avoid create thousands of small tables\n this.consolidateChunks(columns, parser);\n } else {\n const index = this.chunks;\n this.chunks += 1;\n handleCreateTable(index, columns, parser);\n }\n } catch (e: unknown) {\n onError(e);\n }\n }\n\n consolidateChunks(columns: string[][], parser: Parser): void {\n if (!this.consolidatedChunks) {\n this.consolidatedChunks = columns.slice();\n } else {\n for (let i = 0; i < columns.length; i += 1) {\n this.consolidatedChunks[i] = this.consolidatedChunks[i].concat(\n columns[i]\n );\n }\n }\n this.numConsolidated += 1;\n if (this.numConsolidated >= ZIP_CONSOLIDATE_CHUNKS || this.isComplete) {\n this.uploadConsolidatedChunks(parser);\n }\n }\n\n uploadConsolidatedChunks(parser: Parser | null): void {\n const { handleCreateTable } = this;\n const index = this.chunks;\n this.chunks += 1;\n const toUpload = this.consolidatedChunks?.slice();\n this.consolidatedChunks = undefined;\n this.numConsolidated = 0;\n assertNotNull(toUpload);\n handleCreateTable(index, toUpload, parser);\n }\n\n handleCreateTable(\n index: number,\n columns: string[][],\n parser: Parser | null\n ): void {\n const {\n session,\n tables,\n onFileCompleted,\n totalChunks,\n types,\n onProgress,\n onError,\n } = this;\n if (parser) {\n parser.pause();\n }\n assertNotNull(this.headers);\n assertNotNull(types);\n\n this.rowsProcessed += columns[0].length;\n\n session\n .newTable(this.headers, types, columns, this.timeZone)\n .then(table => {\n if (this.isCancelled) {\n log.debug2('CSV parser cancelled.');\n if (parser) {\n parser.abort();\n }\n tables.forEach(t => t.close());\n return;\n }\n if (parser) {\n parser.resume();\n }\n tables[index] = table;\n // This accounts for 50% of parsing plus 50% already done by the type parser\n let progress = 0;\n if (totalChunks > 0) {\n progress = Math.round((tables.length / totalChunks) * 50) + 50;\n } else {\n // The zip file can be read entirely while in the middle of parsing\n // Since we know the number of rows from the type parsing, use that for progress\n progress = Math.round((this.rowsProcessed / this.rowCount) * 50) + 50;\n }\n log.debug2(`CSV parser progress ${progress}`);\n onProgress(progress);\n if (this.isComplete && tables.length === this.chunks) {\n log.debug2('CSV parser complete.');\n onFileCompleted(tables);\n }\n })\n .catch(e => {\n if (!this.isComplete && parser) {\n parser.abort();\n }\n onError(e);\n });\n }\n\n handleComplete(results: ParseResult<unknown>): void {\n // results is undefined for a succesful parse, but has meta data for an abort\n if (results == null || results.meta.aborted == null) {\n this.isComplete = true;\n // Check if there are any consolidated chunks left over from a zip file\n if (this.consolidatedChunks) {\n this.uploadConsolidatedChunks(null);\n }\n }\n }\n\n handleError(error: unknown): void {\n const { onError } = this;\n onError(error);\n }\n\n handleNodeUpdate(metadata: { percent: number }): void {\n this.zipProgress = metadata.percent;\n }\n}\n\nexport default CsvParser;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"CsvParser.js","names":["Papa","Log","assertNotNull","DbNameValidator","CsvTypeParser","makeZipStreamHelper","log","module","ZIP_CONSOLIDATE_CHUNKS","CsvParser","generateHeaderRecursive","n","header","char","concat","Math","floor","String","fromCharCode","constructor","_ref","onFileCompleted","session","file","type","_ref$readHeaders","readHeaders","onProgress","onError","timeZone","isZip","_defineProperty","tables","rowCount","rowsProcessed","chunks","totalChunks","ceil","size","LocalChunkSize","isComplete","zipProgress","numConsolidated","isCancelled","handleChunk","bind","handleError","handleComplete","handleNodeUpdate","handleCreateTable","config","delimiter","newline","escapeChar","dynamicTyping","error","skipEmptyLines","chunk","complete","fastMode","cancel","transpose","numColumns","array","numRows","length","columns","Array","fill","map","r","row","Error","c","value","shouldTrim","trim","nullCheck","nullString","parse","handleParseDone","types","File","Blob","zipStream","resume","typeParser","result","parser","debug2","abort","forEach","t","close","data","headers","legalizeColumnNames","slice","generateHeaders","consolidateChunks","index","e","consolidatedChunks","i","uploadConsolidatedChunks","_this$consolidatedChu","toUpload","undefined","pause","newTable","then","table","progress","round","catch","results","meta","aborted","metadata","percent","_CsvParser","push"],"sources":["../../src/csv/CsvParser.ts"],"sourcesContent":["import Papa, {\n type ParseLocalConfig,\n type Parser,\n type ParseResult,\n} from 'papaparse';\nimport Log from '@deephaven/log';\nimport { assertNotNull, DbNameValidator } from '@deephaven/utils';\nimport type { dh } from '@deephaven/jsapi-types';\nimport type { JSZipObject } from 'jszip';\nimport CsvTypeParser from './CsvTypeParser';\nimport { type CsvTypes } from './CsvFormats';\nimport makeZipStreamHelper from './ZipStreamHelper';\n\nconst log = Log.module('CsvParser');\n\n// This is based on jszip streaming ~15 KB chunks to papa parse\n// Want to consolidate to ~10 MB chunks\nconst ZIP_CONSOLIDATE_CHUNKS = 650;\n\ninterface CsvParserConstructor {\n onFileCompleted: (tables: dh.Table[]) => void;\n session: dh.IdeSession;\n file: File | Blob | JSZipObject;\n type: CsvTypes;\n readHeaders: boolean;\n onProgress: (progressValue: number) => boolean;\n onError: (e: unknown) => void;\n timeZone: string;\n isZip: boolean;\n}\n\n/**\n * Parser a CSV file in chunks and returns a table handle for each chunk.\n */\nclass CsvParser {\n // Generates column names A-Z, AA-AZ, BA-BZ, etc...\n static generateHeaders = (numColumns: number): string[] => {\n const headers = [];\n for (let i = 0; i < numColumns; i += 1) {\n headers.push(CsvParser.generateHeaderRecursive(i));\n }\n return headers;\n };\n\n static generateHeaderRecursive(n: number): string {\n let header = '';\n let char = n;\n if (n >= 26) {\n header = header.concat(\n CsvParser.generateHeaderRecursive(Math.floor(n / 26) - 1)\n );\n char = n % 26;\n }\n return header.concat(String.fromCharCode(65 + char));\n }\n\n constructor({\n onFileCompleted,\n session,\n file,\n type,\n readHeaders = true,\n onProgress,\n onError,\n timeZone,\n isZip,\n }: CsvParserConstructor) {\n this.onFileCompleted = onFileCompleted;\n this.session = session;\n this.file = file;\n this.isZip = isZip;\n this.type = type;\n this.readHeaders = readHeaders;\n this.timeZone = timeZone;\n this.onProgress = onProgress;\n this.onError = onError;\n this.tables = [];\n this.rowCount = 0;\n this.rowsProcessed = 0;\n this.chunks = 0;\n this.totalChunks = isZip\n ? 0\n : Math.ceil((file as Blob).size / Papa.LocalChunkSize);\n this.isComplete = false;\n this.zipProgress = 0;\n this.numConsolidated = 0;\n this.isCancelled = false;\n\n this.handleChunk = this.handleChunk.bind(this);\n this.handleError = this.handleError.bind(this);\n this.handleComplete = this.handleComplete.bind(this);\n this.handleNodeUpdate = this.handleNodeUpdate.bind(this);\n this.handleCreateTable = this.handleCreateTable.bind(this);\n\n this.config = {\n delimiter: type.delimiter,\n newline: type.newline as '\\r\\n' | '\\n' | '\\r' | undefined,\n escapeChar: type.escapeChar,\n dynamicTyping: false,\n error: this.handleError,\n skipEmptyLines: type.skipEmptyLines,\n chunk: this.handleChunk,\n complete: this.handleComplete,\n fastMode: false,\n };\n }\n\n onFileCompleted: (tables: dh.Table[]) => void;\n\n session: dh.IdeSession;\n\n file: File | Blob | JSZipObject;\n\n isZip: boolean;\n\n type: CsvTypes;\n\n readHeaders: boolean;\n\n timeZone: string;\n\n onProgress: (progressValue: number) => boolean;\n\n onError: (e: unknown) => void;\n\n tables: dh.Table[];\n\n headers?: string[];\n\n types?: string[];\n\n rowCount: number;\n\n rowsProcessed: number;\n\n chunks: number;\n\n totalChunks: number;\n\n isComplete: boolean;\n\n zipProgress: number;\n\n consolidatedChunks?: string[][];\n\n numConsolidated: number;\n\n isCancelled: boolean;\n\n config: ParseLocalConfig<unknown, Blob | NodeJS.ReadableStream>;\n\n cancel(): void {\n this.isCancelled = true;\n }\n\n transpose(numColumns: number, array: string[][]): string[][] {\n const numRows = array.length;\n const columns = new Array(numColumns)\n .fill(null)\n .map(() => new Array(numRows));\n for (let r = 0; r < numRows; r += 1) {\n const row = array[r];\n if (row.length < numColumns) {\n throw new Error(\n `Insufficient columns. Expected ${numColumns} but found ${row.length}\\n${row}`\n );\n }\n for (let c = 0; c < numColumns; c += 1) {\n const value = this.type.shouldTrim ? array[r][c].trim() : array[r][c];\n columns[c][r] = this.nullCheck(value);\n }\n }\n return columns as string[][];\n }\n\n nullCheck(value: string): string {\n return value === this.type.nullString ? '' : value;\n }\n\n parse(): void {\n const handleParseDone = (types: string[], rowCount: number): void => {\n this.types = types;\n this.rowCount = rowCount;\n\n if (this.file instanceof File || this.file instanceof Blob) {\n Papa.parse(this.file, this.config);\n } else {\n const zipStream = makeZipStreamHelper(this.file, this.handleNodeUpdate);\n // This is actually a stream, but papaparse TS doesn't like it\n Papa.parse(zipStream as unknown as Blob, this.config);\n // The stream needs to be manually resumed since jszip starts paused\n // Papaparse does not call resume and assumes the stream is already reading\n zipStream.resume();\n }\n };\n const typeParser = new CsvTypeParser(\n handleParseDone,\n this.file,\n this.readHeaders,\n this.config,\n this.type.nullString,\n this.onProgress,\n this.onError,\n this.totalChunks,\n this.isZip,\n this.type.shouldTrim\n );\n typeParser.parse();\n }\n\n handleChunk(result: ParseResult<string[]>, parser: Parser): void {\n const { readHeaders, onError, handleCreateTable, isZip, tables } = this;\n if (this.isCancelled) {\n log.debug2('CSV parser cancelled.');\n parser.abort();\n tables.forEach(t => t.close());\n return;\n }\n let { data } = result;\n if (!this.headers) {\n if (readHeaders) {\n this.headers = DbNameValidator.legalizeColumnNames(data[0]);\n data = data.slice(1);\n } else {\n this.headers = CsvParser.generateHeaders(data[0].length);\n }\n }\n\n let columns: string[][] = [];\n try {\n columns = this.transpose(this.headers.length, data);\n if (isZip) {\n // Zip file chunks are tiny, so consolidate them to avoid create thousands of small tables\n this.consolidateChunks(columns, parser);\n } else {\n const index = this.chunks;\n this.chunks += 1;\n handleCreateTable(index, columns, parser);\n }\n } catch (e: unknown) {\n onError(e);\n }\n }\n\n consolidateChunks(columns: string[][], parser: Parser): void {\n if (!this.consolidatedChunks) {\n this.consolidatedChunks = columns.slice();\n } else {\n for (let i = 0; i < columns.length; i += 1) {\n this.consolidatedChunks[i] = this.consolidatedChunks[i].concat(\n columns[i]\n );\n }\n }\n this.numConsolidated += 1;\n if (this.numConsolidated >= ZIP_CONSOLIDATE_CHUNKS || this.isComplete) {\n this.uploadConsolidatedChunks(parser);\n }\n }\n\n uploadConsolidatedChunks(parser: Parser | null): void {\n const { handleCreateTable } = this;\n const index = this.chunks;\n this.chunks += 1;\n const toUpload = this.consolidatedChunks?.slice();\n this.consolidatedChunks = undefined;\n this.numConsolidated = 0;\n assertNotNull(toUpload);\n handleCreateTable(index, toUpload, parser);\n }\n\n handleCreateTable(\n index: number,\n columns: string[][],\n parser: Parser | null\n ): void {\n const {\n session,\n tables,\n onFileCompleted,\n totalChunks,\n types,\n onProgress,\n onError,\n } = this;\n if (parser) {\n parser.pause();\n }\n assertNotNull(this.headers);\n assertNotNull(types);\n\n this.rowsProcessed += columns[0].length;\n\n session\n .newTable(this.headers, types, columns, this.timeZone)\n .then(table => {\n if (this.isCancelled) {\n log.debug2('CSV parser cancelled.');\n if (parser) {\n parser.abort();\n }\n tables.forEach(t => t.close());\n return;\n }\n if (parser) {\n parser.resume();\n }\n tables[index] = table;\n // This accounts for 50% of parsing plus 50% already done by the type parser\n let progress = 0;\n if (totalChunks > 0) {\n progress = Math.round((tables.length / totalChunks) * 50) + 50;\n } else {\n // The zip file can be read entirely while in the middle of parsing\n // Since we know the number of rows from the type parsing, use that for progress\n progress = Math.round((this.rowsProcessed / this.rowCount) * 50) + 50;\n }\n log.debug2(`CSV parser progress ${progress}`);\n onProgress(progress);\n if (this.isComplete && tables.length === this.chunks) {\n log.debug2('CSV parser complete.');\n onFileCompleted(tables);\n }\n })\n .catch(e => {\n if (!this.isComplete && parser) {\n parser.abort();\n }\n onError(e);\n });\n }\n\n handleComplete(results: ParseResult<unknown>): void {\n // results is undefined for a succesful parse, but has meta data for an abort\n if (results == null || results.meta.aborted == null) {\n this.isComplete = true;\n // Check if there are any consolidated chunks left over from a zip file\n if (this.consolidatedChunks) {\n this.uploadConsolidatedChunks(null);\n }\n }\n }\n\n handleError(error: unknown): void {\n const { onError } = this;\n onError(error);\n }\n\n handleNodeUpdate(metadata: { percent: number }): void {\n this.zipProgress = metadata.percent;\n }\n}\n\nexport default CsvParser;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -177,9 +177,7 @@ class CsvTypeParser {
|
|
|
177
177
|
}
|
|
178
178
|
}
|
|
179
179
|
handleChunk(result, parser) {
|
|
180
|
-
var
|
|
181
|
-
data
|
|
182
|
-
} = result;
|
|
180
|
+
var data = result.data;
|
|
183
181
|
if (!this.types) {
|
|
184
182
|
if (data == null || data.length === 0) {
|
|
185
183
|
parser.abort();
|
|
@@ -220,10 +218,8 @@ class CsvTypeParser {
|
|
|
220
218
|
}
|
|
221
219
|
}
|
|
222
220
|
handleComplete(results) {
|
|
223
|
-
var
|
|
224
|
-
|
|
225
|
-
onFileCompleted
|
|
226
|
-
} = this;
|
|
221
|
+
var types = this.types,
|
|
222
|
+
onFileCompleted = this.onFileCompleted;
|
|
227
223
|
// results is undefined for a succesful parse, but has meta data for an abort
|
|
228
224
|
assertNotNull(types);
|
|
229
225
|
if (results == null || !results.meta.aborted) {
|
|
@@ -235,9 +231,7 @@ class CsvTypeParser {
|
|
|
235
231
|
}
|
|
236
232
|
}
|
|
237
233
|
handleError(error) {
|
|
238
|
-
var
|
|
239
|
-
onError
|
|
240
|
-
} = this;
|
|
234
|
+
var onError = this.onError;
|
|
241
235
|
onError(error);
|
|
242
236
|
}
|
|
243
237
|
handleNodeUpdate(metadata) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CsvTypeParser.js","names":["assertNotNull","Papa","NewTableColumnTypes","makeZipStreamHelper","UNKNOWN","MAX_INT","MIN_INT","DATE_TIME_REGEX","LOCAL_TIME_REGEX","CsvTypeParser","determineType","value","type","nullString","STRING","INTEGER","checkInteger","LONG","checkLong","DOUBLE","checkDouble","BOOLEAN","checkBoolean","DATE_TIME","checkDateTime","LOCAL_TIME","checkLocalTime","getTypeFromUnknown","isNotParsableNumber","s","isNaN","noCommas","replace","getNumberType","includes","lower","toLowerCase","test","maxIntLength","startsWith","length","intValue","parseInt","constructor","onFileCompleted","file","readHeaders","parentConfig","onProgress","onError","totalChunks","isZip","shouldTrim","_defineProperty","chunks","rowCount","zipProgress","handleChunk","bind","handleComplete","handleError","handleNodeUpdate","config","_objectSpread","error","chunk","complete","parse","File","Blob","zipStream","resume","result","parser","data","types","abort","Array","fill","slice","cloneTypes","forEach","row","i","trim","concat","progress","Math","round","isCancelled","results","meta","aborted","map","metadata","percent"],"sources":["../../src/csv/CsvTypeParser.ts"],"sourcesContent":["import type { JSZipObject } from 'jszip';\nimport { assertNotNull } from '@deephaven/utils';\nimport Papa, {\n type Parser,\n type ParseResult,\n type ParseLocalConfig,\n} from 'papaparse';\n// Intentionally using isNaN rather than Number.isNaN\n/* eslint-disable no-restricted-globals */\nimport { NewTableColumnTypes } from '@deephaven/jsapi-utils';\nimport makeZipStreamHelper from './ZipStreamHelper';\n\n// Initially column types start as unknown\nconst UNKNOWN = 'unknown';\n\nconst MAX_INT = 2147483647;\nconst MIN_INT = -2147483648;\n\nconst DATE_TIME_REGEX =\n /^[0-9]{4}-[0-1][0-9]-[0-3][0-9][ T][0-2][0-9]:[0-5][0-9]:[0-6][0-9](?:\\.[0-9]{1,9})?(?: [a-zA-Z]+)?$/;\nconst LOCAL_TIME_REGEX =\n /^([0-9]+T)?([0-9]+):([0-9]+)(:[0-9]+)?(?:\\.[0-9]{1,9})?$/;\n\n/**\n * Determines the type of each column in a CSV file by parsing it and looking at every value.\n */\nclass CsvTypeParser {\n static determineType(\n value: string,\n type: string,\n nullString: string | null\n ): string {\n if (!value || value === nullString) {\n // A null tells us nothing about the type\n return type;\n }\n\n switch (type) {\n case NewTableColumnTypes.STRING:\n // Strings never get promoted\n return NewTableColumnTypes.STRING;\n case NewTableColumnTypes.INTEGER:\n return CsvTypeParser.checkInteger(value);\n case NewTableColumnTypes.LONG:\n return CsvTypeParser.checkLong(value);\n case NewTableColumnTypes.DOUBLE:\n return CsvTypeParser.checkDouble(value);\n case NewTableColumnTypes.BOOLEAN:\n return CsvTypeParser.checkBoolean(value);\n case NewTableColumnTypes.DATE_TIME:\n return CsvTypeParser.checkDateTime(value);\n case NewTableColumnTypes.LOCAL_TIME:\n return CsvTypeParser.checkLocalTime(value);\n default:\n return CsvTypeParser.getTypeFromUnknown(value);\n }\n }\n\n // Allows for cusomt rules in addition to isNaN\n static isNotParsableNumber(s: string): boolean {\n return (\n isNaN(s as unknown as number) || s === 'Infinity' || s === '-Infinity'\n );\n }\n\n static checkInteger(value: string): string {\n const noCommas = value.replace(/,/g, '');\n if (CsvTypeParser.isNotParsableNumber(noCommas)) {\n return NewTableColumnTypes.STRING;\n }\n\n return CsvTypeParser.getNumberType(noCommas);\n }\n\n static checkLong(value: string): string {\n const noCommas = value.replace(/,/g, '');\n if (CsvTypeParser.isNotParsableNumber(noCommas)) {\n return NewTableColumnTypes.STRING;\n }\n\n if (noCommas.includes('.')) {\n return NewTableColumnTypes.DOUBLE;\n }\n\n return NewTableColumnTypes.LONG;\n }\n\n static checkDouble(value: string): string {\n const noCommas = value.replace(/,/g, '');\n if (CsvTypeParser.isNotParsableNumber(noCommas)) {\n return NewTableColumnTypes.STRING;\n }\n\n return NewTableColumnTypes.DOUBLE;\n }\n\n static checkBoolean(value: string): string {\n const lower = value.toLowerCase();\n if (lower === 'true' || lower === 'false') {\n return NewTableColumnTypes.BOOLEAN;\n }\n return NewTableColumnTypes.STRING;\n }\n\n static checkDateTime(value: string): string {\n if (DATE_TIME_REGEX.test(value)) {\n return NewTableColumnTypes.DATE_TIME;\n }\n\n return NewTableColumnTypes.STRING;\n }\n\n static checkLocalTime(value: string): string {\n if (LOCAL_TIME_REGEX.test(value)) {\n return NewTableColumnTypes.LOCAL_TIME;\n }\n\n return NewTableColumnTypes.STRING;\n }\n\n static getTypeFromUnknown(value: string): string {\n const noCommas = value.replace(/,/g, '');\n if (CsvTypeParser.isNotParsableNumber(noCommas)) {\n const lower = value.toLowerCase();\n if (lower === 'true' || lower === 'false') {\n return NewTableColumnTypes.BOOLEAN;\n }\n\n if (DATE_TIME_REGEX.test(value) && value.includes(':')) {\n return NewTableColumnTypes.DATE_TIME;\n }\n\n if (LOCAL_TIME_REGEX.test(value)) {\n return NewTableColumnTypes.LOCAL_TIME;\n }\n\n return NewTableColumnTypes.STRING;\n }\n\n return CsvTypeParser.getNumberType(noCommas);\n }\n\n static getNumberType(value: string): string {\n if (value.includes('.')) {\n return NewTableColumnTypes.DOUBLE;\n }\n\n // Fast length check\n const maxIntLength = value.startsWith('-') ? 11 : 10;\n if (value.length > maxIntLength) {\n return NewTableColumnTypes.LONG;\n }\n\n // Slower parseInt check\n const intValue = parseInt(value, 10);\n if (intValue > MAX_INT || intValue < MIN_INT) {\n return NewTableColumnTypes.LONG;\n }\n\n return NewTableColumnTypes.INTEGER;\n }\n\n constructor(\n onFileCompleted: (types: string[], rowCount: number) => void,\n file: File | Blob | JSZipObject,\n readHeaders: boolean,\n parentConfig: ParseLocalConfig<unknown, Blob | NodeJS.ReadableStream>,\n nullString: string | null,\n onProgress: (progressValue: number) => boolean,\n onError: (e: unknown) => void,\n totalChunks: number,\n isZip: boolean,\n shouldTrim: boolean\n ) {\n this.onFileCompleted = onFileCompleted;\n this.file = file;\n this.readHeaders = readHeaders;\n this.nullString = nullString;\n this.onProgress = onProgress;\n this.onError = onError;\n this.chunks = 0;\n this.totalChunks = totalChunks;\n this.rowCount = 0;\n this.isZip = isZip;\n this.shouldTrim = shouldTrim;\n this.zipProgress = 0;\n\n this.handleChunk = this.handleChunk.bind(this);\n this.handleComplete = this.handleComplete.bind(this);\n this.handleError = this.handleError.bind(this);\n this.handleNodeUpdate = this.handleNodeUpdate.bind(this);\n\n this.config = {\n ...parentConfig,\n error: this.handleError,\n chunk: this.handleChunk,\n complete: this.handleComplete,\n };\n }\n\n onFileCompleted: (types: string[], rowCount: number) => void;\n\n file: File | Blob | JSZipObject;\n\n readHeaders: boolean;\n\n nullString: string | null;\n\n onProgress: (progressValue: number) => boolean;\n\n onError: (e: unknown) => void;\n\n types?: string[];\n\n chunks: number;\n\n totalChunks: number;\n\n rowCount: number;\n\n isZip: boolean;\n\n shouldTrim: boolean;\n\n zipProgress: number;\n\n config: ParseLocalConfig<unknown, Blob | NodeJS.ReadableStream>;\n\n parse(): void {\n if (this.file instanceof File || this.file instanceof Blob) {\n Papa.parse(this.file, this.config);\n } else {\n const zipStream = makeZipStreamHelper(this.file, this.handleNodeUpdate);\n // This is actually a stream, but papaparse TS doesn't like it\n Papa.parse(zipStream as unknown as Blob, this.config);\n // The stream needs to be manually resumed since jszip starts paused\n // Papaparse does not call resume and assumes the stream is already reading\n zipStream.resume();\n }\n }\n\n handleChunk(result: ParseResult<string[]>, parser: Parser): void {\n let { data } = result;\n if (!this.types) {\n if (data == null || data.length === 0) {\n parser.abort();\n this.onError('Error parsing CSV: no data in file.');\n return;\n }\n this.types = new Array(data[0].length).fill(UNKNOWN);\n if (this.readHeaders) {\n // If headers are being read from the file, remove them from type analysis\n data = data.slice(1);\n }\n }\n\n this.rowCount += data.length;\n\n assertNotNull(this.types);\n\n const cloneTypes = [...this.types];\n\n data.forEach(row => {\n if (row.length >= cloneTypes.length) {\n for (let i = 0; i < cloneTypes.length; i += 1) {\n cloneTypes[i] = CsvTypeParser.determineType(\n this.shouldTrim ? row[i].trim() : row[i],\n cloneTypes[i],\n this.nullString\n );\n }\n this.types = cloneTypes;\n } else {\n parser.abort();\n this.onError(\n `Error parsing CSV: Insufficient data in row.\\nExpected length ${cloneTypes.length} but found ${row.length}.\\nRow = ${row}`\n );\n }\n });\n\n this.chunks += 1;\n // 50 because the type parsing accounts for 50% of the parsing\n let progress = 0;\n if (this.totalChunks > 0) {\n progress = Math.round((this.chunks / this.totalChunks) * 50);\n } else {\n progress = Math.round(this.zipProgress / 2);\n }\n const isCancelled = this.onProgress(progress);\n if (isCancelled) {\n parser.abort();\n }\n }\n\n handleComplete(results: ParseResult<unknown>): void {\n const { types, onFileCompleted } = this;\n // results is undefined for a succesful parse, but has meta data for an abort\n assertNotNull(types);\n if (results == null || !results.meta.aborted) {\n onFileCompleted(\n types.map(type =>\n // If the type is still unknown or a local time, just map it to a string.\n // Local times are not supported by the backend in DHC, and probably should have more context to parse safely anyway (such as a date or a time zone).\n // In these cases, we just map it to a string, and the user can use an `.update_view` later if they want to parse it into a different type.\n type === UNKNOWN || type === NewTableColumnTypes.LOCAL_TIME\n ? NewTableColumnTypes.STRING\n : type\n ),\n this.rowCount\n );\n }\n }\n\n handleError(error: unknown): void {\n const { onError } = this;\n onError(error);\n }\n\n handleNodeUpdate(metadata: { percent: number }): void {\n this.zipProgress = metadata.percent;\n }\n}\n\nexport default CsvTypeParser;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"CsvTypeParser.js","names":["assertNotNull","Papa","NewTableColumnTypes","makeZipStreamHelper","UNKNOWN","MAX_INT","MIN_INT","DATE_TIME_REGEX","LOCAL_TIME_REGEX","CsvTypeParser","determineType","value","type","nullString","STRING","INTEGER","checkInteger","LONG","checkLong","DOUBLE","checkDouble","BOOLEAN","checkBoolean","DATE_TIME","checkDateTime","LOCAL_TIME","checkLocalTime","getTypeFromUnknown","isNotParsableNumber","s","isNaN","noCommas","replace","getNumberType","includes","lower","toLowerCase","test","maxIntLength","startsWith","length","intValue","parseInt","constructor","onFileCompleted","file","readHeaders","parentConfig","onProgress","onError","totalChunks","isZip","shouldTrim","_defineProperty","chunks","rowCount","zipProgress","handleChunk","bind","handleComplete","handleError","handleNodeUpdate","config","_objectSpread","error","chunk","complete","parse","File","Blob","zipStream","resume","result","parser","data","types","abort","Array","fill","slice","cloneTypes","forEach","row","i","trim","concat","progress","Math","round","isCancelled","results","meta","aborted","map","metadata","percent"],"sources":["../../src/csv/CsvTypeParser.ts"],"sourcesContent":["import type { JSZipObject } from 'jszip';\nimport { assertNotNull } from '@deephaven/utils';\nimport Papa, {\n type Parser,\n type ParseResult,\n type ParseLocalConfig,\n} from 'papaparse';\n// Intentionally using isNaN rather than Number.isNaN\n/* eslint-disable no-restricted-globals */\nimport { NewTableColumnTypes } from '@deephaven/jsapi-utils';\nimport makeZipStreamHelper from './ZipStreamHelper';\n\n// Initially column types start as unknown\nconst UNKNOWN = 'unknown';\n\nconst MAX_INT = 2147483647;\nconst MIN_INT = -2147483648;\n\nconst DATE_TIME_REGEX =\n /^[0-9]{4}-[0-1][0-9]-[0-3][0-9][ T][0-2][0-9]:[0-5][0-9]:[0-6][0-9](?:\\.[0-9]{1,9})?(?: [a-zA-Z]+)?$/;\nconst LOCAL_TIME_REGEX =\n /^([0-9]+T)?([0-9]+):([0-9]+)(:[0-9]+)?(?:\\.[0-9]{1,9})?$/;\n\n/**\n * Determines the type of each column in a CSV file by parsing it and looking at every value.\n */\nclass CsvTypeParser {\n static determineType(\n value: string,\n type: string,\n nullString: string | null\n ): string {\n if (!value || value === nullString) {\n // A null tells us nothing about the type\n return type;\n }\n\n switch (type) {\n case NewTableColumnTypes.STRING:\n // Strings never get promoted\n return NewTableColumnTypes.STRING;\n case NewTableColumnTypes.INTEGER:\n return CsvTypeParser.checkInteger(value);\n case NewTableColumnTypes.LONG:\n return CsvTypeParser.checkLong(value);\n case NewTableColumnTypes.DOUBLE:\n return CsvTypeParser.checkDouble(value);\n case NewTableColumnTypes.BOOLEAN:\n return CsvTypeParser.checkBoolean(value);\n case NewTableColumnTypes.DATE_TIME:\n return CsvTypeParser.checkDateTime(value);\n case NewTableColumnTypes.LOCAL_TIME:\n return CsvTypeParser.checkLocalTime(value);\n default:\n return CsvTypeParser.getTypeFromUnknown(value);\n }\n }\n\n // Allows for cusomt rules in addition to isNaN\n static isNotParsableNumber(s: string): boolean {\n return (\n isNaN(s as unknown as number) || s === 'Infinity' || s === '-Infinity'\n );\n }\n\n static checkInteger(value: string): string {\n const noCommas = value.replace(/,/g, '');\n if (CsvTypeParser.isNotParsableNumber(noCommas)) {\n return NewTableColumnTypes.STRING;\n }\n\n return CsvTypeParser.getNumberType(noCommas);\n }\n\n static checkLong(value: string): string {\n const noCommas = value.replace(/,/g, '');\n if (CsvTypeParser.isNotParsableNumber(noCommas)) {\n return NewTableColumnTypes.STRING;\n }\n\n if (noCommas.includes('.')) {\n return NewTableColumnTypes.DOUBLE;\n }\n\n return NewTableColumnTypes.LONG;\n }\n\n static checkDouble(value: string): string {\n const noCommas = value.replace(/,/g, '');\n if (CsvTypeParser.isNotParsableNumber(noCommas)) {\n return NewTableColumnTypes.STRING;\n }\n\n return NewTableColumnTypes.DOUBLE;\n }\n\n static checkBoolean(value: string): string {\n const lower = value.toLowerCase();\n if (lower === 'true' || lower === 'false') {\n return NewTableColumnTypes.BOOLEAN;\n }\n return NewTableColumnTypes.STRING;\n }\n\n static checkDateTime(value: string): string {\n if (DATE_TIME_REGEX.test(value)) {\n return NewTableColumnTypes.DATE_TIME;\n }\n\n return NewTableColumnTypes.STRING;\n }\n\n static checkLocalTime(value: string): string {\n if (LOCAL_TIME_REGEX.test(value)) {\n return NewTableColumnTypes.LOCAL_TIME;\n }\n\n return NewTableColumnTypes.STRING;\n }\n\n static getTypeFromUnknown(value: string): string {\n const noCommas = value.replace(/,/g, '');\n if (CsvTypeParser.isNotParsableNumber(noCommas)) {\n const lower = value.toLowerCase();\n if (lower === 'true' || lower === 'false') {\n return NewTableColumnTypes.BOOLEAN;\n }\n\n if (DATE_TIME_REGEX.test(value) && value.includes(':')) {\n return NewTableColumnTypes.DATE_TIME;\n }\n\n if (LOCAL_TIME_REGEX.test(value)) {\n return NewTableColumnTypes.LOCAL_TIME;\n }\n\n return NewTableColumnTypes.STRING;\n }\n\n return CsvTypeParser.getNumberType(noCommas);\n }\n\n static getNumberType(value: string): string {\n if (value.includes('.')) {\n return NewTableColumnTypes.DOUBLE;\n }\n\n // Fast length check\n const maxIntLength = value.startsWith('-') ? 11 : 10;\n if (value.length > maxIntLength) {\n return NewTableColumnTypes.LONG;\n }\n\n // Slower parseInt check\n const intValue = parseInt(value, 10);\n if (intValue > MAX_INT || intValue < MIN_INT) {\n return NewTableColumnTypes.LONG;\n }\n\n return NewTableColumnTypes.INTEGER;\n }\n\n constructor(\n onFileCompleted: (types: string[], rowCount: number) => void,\n file: File | Blob | JSZipObject,\n readHeaders: boolean,\n parentConfig: ParseLocalConfig<unknown, Blob | NodeJS.ReadableStream>,\n nullString: string | null,\n onProgress: (progressValue: number) => boolean,\n onError: (e: unknown) => void,\n totalChunks: number,\n isZip: boolean,\n shouldTrim: boolean\n ) {\n this.onFileCompleted = onFileCompleted;\n this.file = file;\n this.readHeaders = readHeaders;\n this.nullString = nullString;\n this.onProgress = onProgress;\n this.onError = onError;\n this.chunks = 0;\n this.totalChunks = totalChunks;\n this.rowCount = 0;\n this.isZip = isZip;\n this.shouldTrim = shouldTrim;\n this.zipProgress = 0;\n\n this.handleChunk = this.handleChunk.bind(this);\n this.handleComplete = this.handleComplete.bind(this);\n this.handleError = this.handleError.bind(this);\n this.handleNodeUpdate = this.handleNodeUpdate.bind(this);\n\n this.config = {\n ...parentConfig,\n error: this.handleError,\n chunk: this.handleChunk,\n complete: this.handleComplete,\n };\n }\n\n onFileCompleted: (types: string[], rowCount: number) => void;\n\n file: File | Blob | JSZipObject;\n\n readHeaders: boolean;\n\n nullString: string | null;\n\n onProgress: (progressValue: number) => boolean;\n\n onError: (e: unknown) => void;\n\n types?: string[];\n\n chunks: number;\n\n totalChunks: number;\n\n rowCount: number;\n\n isZip: boolean;\n\n shouldTrim: boolean;\n\n zipProgress: number;\n\n config: ParseLocalConfig<unknown, Blob | NodeJS.ReadableStream>;\n\n parse(): void {\n if (this.file instanceof File || this.file instanceof Blob) {\n Papa.parse(this.file, this.config);\n } else {\n const zipStream = makeZipStreamHelper(this.file, this.handleNodeUpdate);\n // This is actually a stream, but papaparse TS doesn't like it\n Papa.parse(zipStream as unknown as Blob, this.config);\n // The stream needs to be manually resumed since jszip starts paused\n // Papaparse does not call resume and assumes the stream is already reading\n zipStream.resume();\n }\n }\n\n handleChunk(result: ParseResult<string[]>, parser: Parser): void {\n let { data } = result;\n if (!this.types) {\n if (data == null || data.length === 0) {\n parser.abort();\n this.onError('Error parsing CSV: no data in file.');\n return;\n }\n this.types = new Array(data[0].length).fill(UNKNOWN);\n if (this.readHeaders) {\n // If headers are being read from the file, remove them from type analysis\n data = data.slice(1);\n }\n }\n\n this.rowCount += data.length;\n\n assertNotNull(this.types);\n\n const cloneTypes = [...this.types];\n\n data.forEach(row => {\n if (row.length >= cloneTypes.length) {\n for (let i = 0; i < cloneTypes.length; i += 1) {\n cloneTypes[i] = CsvTypeParser.determineType(\n this.shouldTrim ? row[i].trim() : row[i],\n cloneTypes[i],\n this.nullString\n );\n }\n this.types = cloneTypes;\n } else {\n parser.abort();\n this.onError(\n `Error parsing CSV: Insufficient data in row.\\nExpected length ${cloneTypes.length} but found ${row.length}.\\nRow = ${row}`\n );\n }\n });\n\n this.chunks += 1;\n // 50 because the type parsing accounts for 50% of the parsing\n let progress = 0;\n if (this.totalChunks > 0) {\n progress = Math.round((this.chunks / this.totalChunks) * 50);\n } else {\n progress = Math.round(this.zipProgress / 2);\n }\n const isCancelled = this.onProgress(progress);\n if (isCancelled) {\n parser.abort();\n }\n }\n\n handleComplete(results: ParseResult<unknown>): void {\n const { types, onFileCompleted } = this;\n // results is undefined for a succesful parse, but has meta data for an abort\n assertNotNull(types);\n if (results == null || !results.meta.aborted) {\n onFileCompleted(\n types.map(type =>\n // If the type is still unknown or a local time, just map it to a string.\n // Local times are not supported by the backend in DHC, and probably should have more context to parse safely anyway (such as a date or a time zone).\n // In these cases, we just map it to a string, and the user can use an `.update_view` later if they want to parse it into a different type.\n type === UNKNOWN || type === NewTableColumnTypes.LOCAL_TIME\n ? NewTableColumnTypes.STRING\n : type\n ),\n this.rowCount\n );\n }\n }\n\n handleError(error: unknown): void {\n const { onError } = this;\n onError(error);\n }\n\n handleNodeUpdate(metadata: { percent: number }): void {\n this.zipProgress = metadata.percent;\n }\n}\n\nexport default CsvTypeParser;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -10,17 +10,15 @@ class LogLevelMenuItem extends PureComponent {
|
|
|
10
10
|
this.handleSwitchClick = this.handleSwitchClick.bind(this);
|
|
11
11
|
}
|
|
12
12
|
handleSwitchClick() {
|
|
13
|
-
var
|
|
14
|
-
logLevel,
|
|
15
|
-
onClick
|
|
16
|
-
} = this.props;
|
|
13
|
+
var _this$props = this.props,
|
|
14
|
+
logLevel = _this$props.logLevel,
|
|
15
|
+
onClick = _this$props.onClick;
|
|
17
16
|
onClick(logLevel);
|
|
18
17
|
}
|
|
19
18
|
render() {
|
|
20
|
-
var
|
|
21
|
-
logLevel,
|
|
22
|
-
on
|
|
23
|
-
} = this.props;
|
|
19
|
+
var _this$props2 = this.props,
|
|
20
|
+
logLevel = _this$props2.logLevel,
|
|
21
|
+
on = _this$props2.on;
|
|
24
22
|
return /*#__PURE__*/_jsxs("div", {
|
|
25
23
|
className: classNames('log-level-menu-item', logLevel),
|
|
26
24
|
children: [/*#__PURE__*/_jsx(UISwitch, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogLevelMenuItem.js","names":["React","PureComponent","classNames","UISwitch","jsx","_jsx","jsxs","_jsxs","LogLevelMenuItem","constructor","props","handleSwitchClick","bind","logLevel","onClick","render","on","className","children"],"sources":["../../src/log/LogLevelMenuItem.tsx"],"sourcesContent":["// Port of https://github.com/react-bootstrap/react-bootstrap/blob/master/src/Collapse.js\nimport React, { PureComponent, type ReactElement } from 'react';\nimport classNames from 'classnames';\nimport { UISwitch } from '@deephaven/components';\nimport './LogLevelMenuItem.scss';\n\ninterface LogLevelMenuItemProps {\n logLevel: string;\n on: boolean;\n onClick: (logLevel: string) => void;\n}\n\nclass LogLevelMenuItem extends PureComponent<\n LogLevelMenuItemProps,\n Record<string, never>\n> {\n constructor(props: LogLevelMenuItemProps) {\n super(props);\n\n this.handleSwitchClick = this.handleSwitchClick.bind(this);\n }\n\n handleSwitchClick(): void {\n const { logLevel, onClick } = this.props;\n onClick(logLevel);\n }\n\n render(): ReactElement {\n const { logLevel, on } = this.props;\n return (\n <div className={classNames('log-level-menu-item', logLevel)}>\n <UISwitch on={on} onClick={this.handleSwitchClick} />\n {logLevel}\n </div>\n );\n }\n}\n\nexport default LogLevelMenuItem;\n"],"mappings":"AAAA;AACA,OAAOA,KAAK,IAAIC,aAAa,QAA2B,OAAO;AAC/D,OAAOC,UAAU,MAAM,YAAY;AACnC,SAASC,QAAQ,QAAQ,uBAAuB;AAAC;AAAA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AASjD,MAAMC,gBAAgB,SAASP,aAAa,CAG1C;EACAQ,WAAWA,CAACC,KAA4B,EAAE;IACxC,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACC,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACC,IAAI,CAAC,IAAI,CAAC;EAC5D;EAEAD,iBAAiBA,CAAA,EAAS;IACxB,
|
|
1
|
+
{"version":3,"file":"LogLevelMenuItem.js","names":["React","PureComponent","classNames","UISwitch","jsx","_jsx","jsxs","_jsxs","LogLevelMenuItem","constructor","props","handleSwitchClick","bind","_this$props","logLevel","onClick","render","_this$props2","on","className","children"],"sources":["../../src/log/LogLevelMenuItem.tsx"],"sourcesContent":["// Port of https://github.com/react-bootstrap/react-bootstrap/blob/master/src/Collapse.js\nimport React, { PureComponent, type ReactElement } from 'react';\nimport classNames from 'classnames';\nimport { UISwitch } from '@deephaven/components';\nimport './LogLevelMenuItem.scss';\n\ninterface LogLevelMenuItemProps {\n logLevel: string;\n on: boolean;\n onClick: (logLevel: string) => void;\n}\n\nclass LogLevelMenuItem extends PureComponent<\n LogLevelMenuItemProps,\n Record<string, never>\n> {\n constructor(props: LogLevelMenuItemProps) {\n super(props);\n\n this.handleSwitchClick = this.handleSwitchClick.bind(this);\n }\n\n handleSwitchClick(): void {\n const { logLevel, onClick } = this.props;\n onClick(logLevel);\n }\n\n render(): ReactElement {\n const { logLevel, on } = this.props;\n return (\n <div className={classNames('log-level-menu-item', logLevel)}>\n <UISwitch on={on} onClick={this.handleSwitchClick} />\n {logLevel}\n </div>\n );\n }\n}\n\nexport default LogLevelMenuItem;\n"],"mappings":"AAAA;AACA,OAAOA,KAAK,IAAIC,aAAa,QAA2B,OAAO;AAC/D,OAAOC,UAAU,MAAM,YAAY;AACnC,SAASC,QAAQ,QAAQ,uBAAuB;AAAC;AAAA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AASjD,MAAMC,gBAAgB,SAASP,aAAa,CAG1C;EACAQ,WAAWA,CAACC,KAA4B,EAAE;IACxC,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACC,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACC,IAAI,CAAC,IAAI,CAAC;EAC5D;EAEAD,iBAAiBA,CAAA,EAAS;IACxB,IAAAE,WAAA,GAA8B,IAAI,CAACH,KAAK;MAAhCI,QAAQ,GAAAD,WAAA,CAARC,QAAQ;MAAEC,OAAO,GAAAF,WAAA,CAAPE,OAAO;IACzBA,OAAO,CAACD,QAAQ,CAAC;EACnB;EAEAE,MAAMA,CAAA,EAAiB;IACrB,IAAAC,YAAA,GAAyB,IAAI,CAACP,KAAK;MAA3BI,QAAQ,GAAAG,YAAA,CAARH,QAAQ;MAAEI,EAAE,GAAAD,YAAA,CAAFC,EAAE;IACpB,oBACEX,KAAA;MAAKY,SAAS,EAAEjB,UAAU,CAAC,qBAAqB,EAAEY,QAAQ,CAAE;MAAAM,QAAA,gBAC1Df,IAAA,CAACF,QAAQ;QAACe,EAAE,EAAEA,EAAG;QAACH,OAAO,EAAE,IAAI,CAACJ;MAAkB,CAAE,CAAC,EACpDG,QAAQ;IAAA,CACN,CAAC;EAEV;AACF;AAEA,eAAeN,gBAAgB","ignoreList":[]}
|
package/dist/log/LogView.js
CHANGED
|
@@ -55,15 +55,11 @@ class LogView extends PureComponent {
|
|
|
55
55
|
}
|
|
56
56
|
componentDidUpdate(prevProps, prevState) {
|
|
57
57
|
this.updateDimensions();
|
|
58
|
-
var
|
|
59
|
-
shownLogLevels
|
|
60
|
-
} = this.state;
|
|
58
|
+
var shownLogLevels = this.state.shownLogLevels;
|
|
61
59
|
if (prevState.shownLogLevels !== shownLogLevels) {
|
|
62
60
|
this.refreshLogText();
|
|
63
61
|
}
|
|
64
|
-
var
|
|
65
|
-
session
|
|
66
|
-
} = this.props;
|
|
62
|
+
var session = this.props.session;
|
|
67
63
|
if (prevProps.session !== session) {
|
|
68
64
|
this.stopListening();
|
|
69
65
|
this.startListening();
|
|
@@ -144,9 +140,7 @@ class LogView extends PureComponent {
|
|
|
144
140
|
});
|
|
145
141
|
}
|
|
146
142
|
startListening() {
|
|
147
|
-
var
|
|
148
|
-
session
|
|
149
|
-
} = this.props;
|
|
143
|
+
var session = this.props.session;
|
|
150
144
|
this.cancelListener = session.onLogMessage(this.handleLogMessage);
|
|
151
145
|
}
|
|
152
146
|
stopListening() {
|
|
@@ -216,9 +210,7 @@ class LogView extends PureComponent {
|
|
|
216
210
|
(_this$editor4 = this.editor) === null || _this$editor4 === void 0 || _this$editor4.trigger('keyboard', 'actions.find', undefined);
|
|
217
211
|
}
|
|
218
212
|
toggleAll() {
|
|
219
|
-
var
|
|
220
|
-
shownLogLevels
|
|
221
|
-
} = this.state;
|
|
213
|
+
var shownLogLevels = this.state.shownLogLevels;
|
|
222
214
|
var isAllEnabled = true;
|
|
223
215
|
for (var i = 0; i < LogView.AllLogLevels.length; i += 1) {
|
|
224
216
|
var logLevel = LogView.AllLogLevels[i];
|
|
@@ -243,18 +235,14 @@ class LogView extends PureComponent {
|
|
|
243
235
|
}
|
|
244
236
|
}
|
|
245
237
|
toggleLogLevel(logLevel) {
|
|
246
|
-
var
|
|
247
|
-
shownLogLevels
|
|
248
|
-
} = this.state;
|
|
238
|
+
var shownLogLevels = this.state.shownLogLevels;
|
|
249
239
|
var isEnabled = shownLogLevels[logLevel];
|
|
250
240
|
var updatedLogLevels = {};
|
|
251
241
|
updatedLogLevels[logLevel] = !isEnabled;
|
|
252
242
|
this.updateLogLevels(updatedLogLevels);
|
|
253
243
|
}
|
|
254
244
|
updateLogLevels(updatedLogLevels) {
|
|
255
|
-
var
|
|
256
|
-
shownLogLevels
|
|
257
|
-
} = this.state;
|
|
245
|
+
var shownLogLevels = this.state.shownLogLevels;
|
|
258
246
|
shownLogLevels = _objectSpread(_objectSpread({}, shownLogLevels), updatedLogLevels);
|
|
259
247
|
this.setState({
|
|
260
248
|
shownLogLevels
|
|
@@ -311,9 +299,7 @@ class LogView extends PureComponent {
|
|
|
311
299
|
return;
|
|
312
300
|
}
|
|
313
301
|
this.truncateLogIfNecessary();
|
|
314
|
-
var
|
|
315
|
-
shownLogLevels
|
|
316
|
-
} = this.state;
|
|
302
|
+
var shownLogLevels = this.state.shownLogLevels;
|
|
317
303
|
var isBottomVisible = this.isBottomVisible();
|
|
318
304
|
var text = '';
|
|
319
305
|
for (var i = 0; i < this.messages.length; i += 1) {
|
|
@@ -379,9 +365,7 @@ class LogView extends PureComponent {
|
|
|
379
365
|
|
|
380
366
|
/** Checks if the given log message is visible with the current filters */
|
|
381
367
|
isLogItemVisible(message) {
|
|
382
|
-
var
|
|
383
|
-
shownLogLevels
|
|
384
|
-
} = this.state;
|
|
368
|
+
var shownLogLevels = this.state.shownLogLevels;
|
|
385
369
|
return shownLogLevels[message.logLevel];
|
|
386
370
|
}
|
|
387
371
|
flush() {
|
|
@@ -447,9 +431,7 @@ class LogView extends PureComponent {
|
|
|
447
431
|
var popperOptions = {
|
|
448
432
|
placement: 'bottom-end'
|
|
449
433
|
};
|
|
450
|
-
var
|
|
451
|
-
shownLogLevels
|
|
452
|
-
} = this.state;
|
|
434
|
+
var shownLogLevels = this.state.shownLogLevels;
|
|
453
435
|
var actions = this.getMenuActions(shownLogLevels);
|
|
454
436
|
return /*#__PURE__*/_jsxs("div", {
|
|
455
437
|
className: "log-pane h-100 w-100",
|
package/dist/log/LogView.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogView.js","names":["React","PureComponent","Button","DropdownMenu","vsGear","dhTrashUndo","assertNotNull","monaco","ConsoleUtils","LogLevel","LogLevelMenuItem","MonacoUtils","jsx","_jsx","jsxs","_jsxs","LogView","getLogText","logItem","date","Date","micros","timestamp","formatTimestamp","concat","logLevel","message","constructor","props","_defineProperty","handleClearClick","bind","handleFlushTimeout","handleLogMessage","handleMenuItemClick","handleResetClick","handleResize","handleToggleAllClick","logLevelMenuItems","editorContainer","bufferedMessages","messages","state","shownLogLevels","componentDidMount","resetLogLevels","initMonaco","startListening","window","addEventListener","componentDidUpdate","prevProps","prevState","updateDimensions","refreshLogText","session","stopListening","clearLogs","componentWillUnmount","stopFlushTimer","destroyMonaco","removeEventListener","getMenuActions","_this","actions","push","menuElement","className","children","group","order","_loop","AllLogLevels","i","on","title","onClick","ref","element","length","kind","_loop2","isEnabled","DefaultLogLevels","some","level","setState","cancelListener","onLogMessage","undefined","editor","create","copyWithSyntaxHighlighting","fixedOverflowWidgets","folding","fontFamily","glyphMargin","language","lineDecorationsWidth","lineNumbers","lineNumbersMinChars","minimap","enabled","readOnly","renderLineHighlight","scrollBeyondLastLine","value","wordWrap","KeyCode","Escape","KeyMod","Shift","forEach","keybindings","disableKeyBindings","addAction","id","label","keybindingContext","run","_this$editor","_this$editor2","position","getPosition","setPosition","dispose","triggerFindWidget","_this$editor3","_this$editor4","focus","trigger","toggleAll","isAllEnabled","updatedLogLevels","toggleLogLevel","updateLogLevels","_objectSpread","appendLogText","text","model","getModel","line","getLineCount","column","getLineLength","isBottomVisible","edits","range","startLineNumber","startColumn","endLineNumber","endColumn","forceMoveMarkers","applyEdits","lineCount","revealLine","truncateLogIfNecessary","logText","charAt","trimRight","setValue","_this$editor$getModel","maxLogSize","splice","truncateSize","scrollToBottom","_this$editor5","_this$editor5$getMode","call","isLineVisible","_this$editor6","visibleRanges","getVisibleRanges","isLogItemVisible","flush","queue","flushTimer","setTimeout","bufferTimeout","clearTimeout","layout","render","popperOptions","placement","icon","tooltip","popperClassName","STDOUT","ERROR","FATAL","STDERR","WARN","INFO","DEBUG","TRACE"],"sources":["../../src/log/LogView.tsx"],"sourcesContent":["import React, { PureComponent, type ReactElement } from 'react';\nimport {\n Button,\n type DropdownActions,\n DropdownMenu,\n} from '@deephaven/components';\nimport { vsGear, dhTrashUndo } from '@deephaven/icons';\nimport { assertNotNull } from '@deephaven/utils';\nimport type { dh } from '@deephaven/jsapi-types';\nimport { type Placement } from 'popper.js';\nimport * as monaco from 'monaco-editor';\nimport ConsoleUtils from '../common/ConsoleUtils';\nimport LogLevel from './LogLevel';\nimport './LogView.scss';\nimport LogLevelMenuItem from './LogLevelMenuItem';\nimport { MonacoUtils } from '../monaco';\n\ninterface LogViewProps {\n session: dh.IdeSession;\n}\n\ninterface LogViewState {\n shownLogLevels: Record<string, boolean>;\n}\n/**\n * Log view contents. Uses a monaco editor to display/search the contents of the log.\n */\nclass LogView extends PureComponent<LogViewProps, LogViewState> {\n static DefaultLogLevels = [\n LogLevel.STDOUT,\n LogLevel.ERROR,\n LogLevel.FATAL,\n LogLevel.STDERR,\n LogLevel.WARN,\n ];\n\n static AllLogLevels = [\n LogLevel.INFO,\n LogLevel.STDOUT,\n LogLevel.ERROR,\n LogLevel.FATAL,\n LogLevel.STDERR,\n LogLevel.WARN,\n LogLevel.DEBUG,\n LogLevel.TRACE,\n ];\n\n /** ms to buffer log messages before processing them */\n static bufferTimeout = 16;\n\n /** Maximum number of messages to store in the log */\n static maxLogSize = 131072;\n\n static truncateSize = 65536;\n\n static getLogText(logItem: dh.ide.LogItem): string {\n const date = new Date(logItem.micros / 1000);\n const timestamp = ConsoleUtils.formatTimestamp(date);\n return `${timestamp} ${logItem.logLevel} ${logItem.message}`;\n }\n\n constructor(props: LogViewProps) {\n super(props);\n\n this.handleClearClick = this.handleClearClick.bind(this);\n this.handleFlushTimeout = this.handleFlushTimeout.bind(this);\n this.handleLogMessage = this.handleLogMessage.bind(this);\n this.handleMenuItemClick = this.handleMenuItemClick.bind(this);\n this.handleResetClick = this.handleResetClick.bind(this);\n this.handleResize = this.handleResize.bind(this);\n this.handleToggleAllClick = this.handleToggleAllClick.bind(this);\n\n this.logLevelMenuItems = {};\n\n this.editorContainer = null;\n\n this.bufferedMessages = [];\n this.messages = [];\n\n this.state = {\n shownLogLevels: {},\n };\n }\n\n componentDidMount(): void {\n this.resetLogLevels();\n this.initMonaco();\n this.startListening();\n\n window.addEventListener('resize', this.handleResize);\n }\n\n componentDidUpdate(prevProps: LogViewProps, prevState: LogViewState): void {\n this.updateDimensions();\n\n const { shownLogLevels } = this.state;\n if (prevState.shownLogLevels !== shownLogLevels) {\n this.refreshLogText();\n }\n\n const { session } = this.props;\n if (prevProps.session !== session) {\n this.stopListening();\n this.startListening();\n // clear logs when starting a new console\n this.clearLogs();\n }\n }\n\n componentWillUnmount(): void {\n this.stopFlushTimer();\n this.stopListening();\n this.destroyMonaco();\n\n window.removeEventListener('resize', this.handleResize);\n }\n\n cancelListener?: () => void | null;\n\n editor?: monaco.editor.IStandaloneCodeEditor;\n\n editorContainer: HTMLDivElement | null;\n\n logLevelMenuItems: Record<string, LogLevelMenuItem>;\n\n flushTimer?: ReturnType<typeof setTimeout>;\n\n bufferedMessages: dh.ide.LogItem[];\n\n messages: dh.ide.LogItem[];\n\n getMenuActions(shownLogLevels: Record<string, boolean>): DropdownActions {\n const actions = [];\n\n actions.push({\n menuElement: (\n <div className=\"log-level-menu-title\">Display Log Levels</div>\n ),\n group: 1,\n order: 10,\n });\n\n for (let i = 0; i < LogView.AllLogLevels.length; i += 1) {\n const logLevel = LogView.AllLogLevels[i];\n const on =\n shownLogLevels[logLevel] != null ? shownLogLevels[logLevel] : false;\n actions.push({\n title: logLevel,\n group: 1,\n order: i + 100,\n\n menuElement: (\n <LogLevelMenuItem\n logLevel={logLevel}\n on={on}\n onClick={this.handleMenuItemClick}\n ref={element => {\n if (element != null) {\n this.logLevelMenuItems[logLevel] = element;\n }\n }}\n />\n ),\n });\n }\n\n actions.push({\n group: 1,\n order: 1000,\n menuElement: (\n <div className=\"log-level-menu-controls\">\n <Button\n kind=\"ghost\"\n className=\"log-level-toggle-all\"\n onClick={this.handleToggleAllClick}\n >\n Toggle All\n </Button>\n <Button kind=\"ghost\" onClick={this.handleResetClick}>\n Reset\n </Button>\n </div>\n ),\n });\n\n return actions;\n }\n\n resetLogLevels(): void {\n const shownLogLevels: Record<string, boolean> = {};\n for (let i = 0; i < LogView.AllLogLevels.length; i += 1) {\n const logLevel = LogView.AllLogLevels[i];\n const isEnabled = LogView.DefaultLogLevels.some(\n level => level === logLevel\n );\n shownLogLevels[logLevel] = isEnabled;\n }\n\n this.setState({ shownLogLevels });\n }\n\n startListening(): void {\n const { session } = this.props;\n this.cancelListener = session.onLogMessage(this.handleLogMessage);\n }\n\n stopListening(): void {\n if (this.cancelListener != null) {\n this.cancelListener();\n this.cancelListener = undefined;\n }\n }\n\n initMonaco(): void {\n assertNotNull(this.editorContainer);\n this.editor = monaco.editor.create(this.editorContainer, {\n copyWithSyntaxHighlighting: false,\n fixedOverflowWidgets: true,\n folding: false,\n fontFamily: 'Fira Mono',\n glyphMargin: false,\n language: 'log',\n lineDecorationsWidth: 0,\n lineNumbers: 'off',\n lineNumbersMinChars: 0,\n minimap: { enabled: false },\n readOnly: true,\n renderLineHighlight: 'none',\n scrollBeyondLastLine: false,\n value: '',\n wordWrap: 'on',\n });\n\n // Override default Monaco keybindings for `escape` and `shift-escape`\n [\n [monaco.KeyCode.Escape],\n [monaco.KeyMod.Shift | monaco.KeyCode.Escape], // eslint-disable-line no-bitwise\n ].forEach(keybindings => {\n assertNotNull(this.editor);\n\n // Monaco default behavior is for escape key to close the find widget.\n // Instead, capture it and do nothing. Same for shift-escape.\n MonacoUtils.disableKeyBindings(this.editor, keybindings);\n\n // Restore regular escape to clear selection, when editorText has focus.\n this.editor.addAction({\n id: 'clear-selection-on-escape',\n label: '',\n keybindings: [monaco.KeyCode.Escape],\n keybindingContext: 'findWidgetVisible && editorTextFocus',\n run: () => {\n const position = this.editor?.getPosition();\n assertNotNull(position);\n this.editor?.setPosition(position);\n },\n });\n });\n }\n\n destroyMonaco(): void {\n if (this.editor) {\n this.editor.dispose();\n this.editor = undefined;\n }\n }\n\n triggerFindWidget(): void {\n // The actions.find action can no longer be triggered when the editor is not in focus, with monaco 0.22.x.\n // As a workaround, just focus the editor before triggering the action\n // https://github.com/microsoft/monaco-editor/issues/2355\n this.editor?.focus();\n this.editor?.trigger('keyboard', 'actions.find', undefined);\n }\n\n toggleAll(): void {\n const { shownLogLevels } = this.state;\n let isAllEnabled = true;\n for (let i = 0; i < LogView.AllLogLevels.length; i += 1) {\n const logLevel = LogView.AllLogLevels[i];\n if (!shownLogLevels[logLevel]) {\n isAllEnabled = false;\n break;\n }\n }\n\n if (isAllEnabled) {\n this.setState({ shownLogLevels: {} });\n } else {\n const updatedLogLevels: Record<string, boolean> = {};\n for (let i = 0; i < LogView.AllLogLevels.length; i += 1) {\n const logLevel = LogView.AllLogLevels[i];\n updatedLogLevels[logLevel] = true;\n }\n this.setState({ shownLogLevels: updatedLogLevels });\n }\n }\n\n toggleLogLevel(logLevel: string): void {\n const { shownLogLevels } = this.state;\n const isEnabled = shownLogLevels[logLevel];\n const updatedLogLevels: Record<string, boolean> = {};\n updatedLogLevels[logLevel] = !isEnabled;\n this.updateLogLevels(updatedLogLevels);\n }\n\n updateLogLevels(updatedLogLevels: Record<string, boolean>): void {\n let { shownLogLevels } = this.state;\n shownLogLevels = { ...shownLogLevels, ...updatedLogLevels };\n this.setState({ shownLogLevels });\n }\n\n appendLogText(text: string): void {\n if (!this.editor) {\n return;\n }\n\n const model = this.editor.getModel();\n let line = model?.getLineCount();\n assertNotNull(line);\n let column = model?.getLineLength(line);\n assertNotNull(column);\n const isBottomVisible = this.isBottomVisible();\n\n const edits = [];\n if (column > 0) {\n edits.push({\n range: {\n startLineNumber: line,\n startColumn: column + 1,\n endLineNumber: line,\n endColumn: column + 1,\n },\n text: '\\n',\n forceMoveMarkers: true,\n });\n line += 1;\n column = 0;\n }\n\n edits.push({\n range: {\n startLineNumber: line,\n startColumn: column,\n endLineNumber: line,\n endColumn: column,\n },\n text,\n forceMoveMarkers: true,\n });\n\n model?.applyEdits(edits);\n\n if (isBottomVisible) {\n const lineCount = model?.getLineCount();\n assertNotNull(lineCount);\n this.editor.revealLine(lineCount, 1);\n }\n }\n\n /**\n * Refresh the contents of the log component with the updated filter text\n */\n refreshLogText(): void {\n if (!this.editor) {\n return;\n }\n\n this.truncateLogIfNecessary();\n\n const { shownLogLevels } = this.state;\n const isBottomVisible = this.isBottomVisible();\n\n let text = '';\n for (let i = 0; i < this.messages.length; i += 1) {\n const message = this.messages[i];\n if (shownLogLevels[message.logLevel]) {\n const logText = LogView.getLogText(message);\n if (logText.length > 0) {\n text += logText;\n if (logText.charAt(logText.length - 1) !== '\\n') {\n text += '\\n';\n }\n }\n }\n }\n text = text.trimRight();\n\n this.editor.setValue(text);\n\n if (isBottomVisible) {\n const line = this.editor.getModel()?.getLineCount();\n assertNotNull(line);\n this.editor.revealLine(line, 1);\n }\n\n this.stopFlushTimer();\n this.bufferedMessages = [];\n }\n\n truncateLogIfNecessary(): void {\n if (this.messages.length > LogView.maxLogSize) {\n this.messages = this.messages.splice(\n this.messages.length - LogView.truncateSize\n );\n }\n }\n\n scrollToBottom(): void {\n if (!this.editor) {\n return;\n }\n\n const line = this.editor?.getModel?.()?.getLineCount();\n assertNotNull(line);\n this.editor.revealLine(line, 1);\n }\n\n isBottomVisible(): boolean {\n if (!this.editor) {\n return true;\n }\n\n const model = this.editor.getModel();\n const line = model?.getLineCount();\n\n assertNotNull(line);\n return this.isLineVisible(line);\n }\n\n isLineVisible(line: number): boolean {\n const visibleRanges = this.editor?.getVisibleRanges();\n if (visibleRanges == null || visibleRanges.length === 0) {\n return false;\n }\n\n for (let i = 0; i < visibleRanges.length; i += 1) {\n const range = visibleRanges[i];\n if (range.startLineNumber <= line && line <= range.endLineNumber) {\n return true;\n }\n }\n\n return false;\n }\n\n /** Checks if the given log message is visible with the current filters */\n isLogItemVisible(message: dh.ide.LogItem): boolean {\n const { shownLogLevels } = this.state;\n return shownLogLevels[message.logLevel];\n }\n\n flush(): void {\n let text = '';\n for (let i = 0; i < this.bufferedMessages.length; i += 1) {\n const message = this.bufferedMessages[i];\n const logText = LogView.getLogText(message);\n text += logText;\n if (logText.charAt(logText.length - 1) !== '\\n') {\n text += '\\n';\n }\n }\n\n this.bufferedMessages = [];\n\n this.appendLogText(text);\n }\n\n queue(message: dh.ide.LogItem): void {\n this.bufferedMessages.push(message);\n if (this.bufferedMessages.length === 1) {\n this.flushTimer = setTimeout(\n this.handleFlushTimeout,\n LogView.bufferTimeout\n );\n }\n }\n\n stopFlushTimer(): void {\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = undefined;\n }\n }\n\n updateDimensions(): void {\n if (this.editor) {\n this.editor.layout();\n }\n }\n\n handleClearClick(): void {\n this.clearLogs();\n }\n\n clearLogs(): void {\n this.messages = [];\n this.refreshLogText();\n }\n\n handleFlushTimeout(): void {\n this.stopFlushTimer();\n this.flush();\n }\n\n handleLogMessage(message: dh.ide.LogItem): void {\n this.messages.push(message);\n\n if (this.editor && this.isLogItemVisible(message)) {\n this.queue(message);\n }\n }\n\n handleMenuItemClick(logLevel: string): void {\n this.toggleLogLevel(logLevel);\n }\n\n handleResetClick(): void {\n this.resetLogLevels();\n }\n\n handleResize(): void {\n this.updateDimensions();\n }\n\n handleToggleAllClick(): void {\n this.toggleAll();\n }\n\n render(): ReactElement {\n const popperOptions = { placement: 'bottom-end' as Placement };\n const { shownLogLevels } = this.state;\n const actions = this.getMenuActions(shownLogLevels);\n return (\n <div className=\"log-pane h-100 w-100\">\n <div className=\"log-pane-menu\">\n <Button\n kind=\"ghost\"\n className=\"btn-clear-logs\"\n onClick={this.handleClearClick}\n icon={dhTrashUndo}\n tooltip=\"Clear log\"\n />\n <Button\n kind=\"ghost\"\n className=\"btn-link-icon btn-overflow\"\n icon={vsGear}\n tooltip=\"Log Settings\"\n onClick={() => {\n // no-op: click is handled in `DropdownMenu'\n }}\n >\n <DropdownMenu\n actions={actions}\n popperClassName=\"log-level-menu-popper\"\n popperOptions={popperOptions}\n />\n </Button>\n </div>\n <div\n className=\"log-pane-editor h-100 w-100\"\n ref={editorContainer => {\n this.editorContainer = editorContainer;\n }}\n />\n </div>\n );\n }\n}\n\nexport default LogView;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"LogView.js","names":["React","PureComponent","Button","DropdownMenu","vsGear","dhTrashUndo","assertNotNull","monaco","ConsoleUtils","LogLevel","LogLevelMenuItem","MonacoUtils","jsx","_jsx","jsxs","_jsxs","LogView","getLogText","logItem","date","Date","micros","timestamp","formatTimestamp","concat","logLevel","message","constructor","props","_defineProperty","handleClearClick","bind","handleFlushTimeout","handleLogMessage","handleMenuItemClick","handleResetClick","handleResize","handleToggleAllClick","logLevelMenuItems","editorContainer","bufferedMessages","messages","state","shownLogLevels","componentDidMount","resetLogLevels","initMonaco","startListening","window","addEventListener","componentDidUpdate","prevProps","prevState","updateDimensions","refreshLogText","session","stopListening","clearLogs","componentWillUnmount","stopFlushTimer","destroyMonaco","removeEventListener","getMenuActions","_this","actions","push","menuElement","className","children","group","order","_loop","AllLogLevels","i","on","title","onClick","ref","element","length","kind","_loop2","isEnabled","DefaultLogLevels","some","level","setState","cancelListener","onLogMessage","undefined","editor","create","copyWithSyntaxHighlighting","fixedOverflowWidgets","folding","fontFamily","glyphMargin","language","lineDecorationsWidth","lineNumbers","lineNumbersMinChars","minimap","enabled","readOnly","renderLineHighlight","scrollBeyondLastLine","value","wordWrap","KeyCode","Escape","KeyMod","Shift","forEach","keybindings","disableKeyBindings","addAction","id","label","keybindingContext","run","_this$editor","_this$editor2","position","getPosition","setPosition","dispose","triggerFindWidget","_this$editor3","_this$editor4","focus","trigger","toggleAll","isAllEnabled","updatedLogLevels","toggleLogLevel","updateLogLevels","_objectSpread","appendLogText","text","model","getModel","line","getLineCount","column","getLineLength","isBottomVisible","edits","range","startLineNumber","startColumn","endLineNumber","endColumn","forceMoveMarkers","applyEdits","lineCount","revealLine","truncateLogIfNecessary","logText","charAt","trimRight","setValue","_this$editor$getModel","maxLogSize","splice","truncateSize","scrollToBottom","_this$editor5","_this$editor5$getMode","call","isLineVisible","_this$editor6","visibleRanges","getVisibleRanges","isLogItemVisible","flush","queue","flushTimer","setTimeout","bufferTimeout","clearTimeout","layout","render","popperOptions","placement","icon","tooltip","popperClassName","STDOUT","ERROR","FATAL","STDERR","WARN","INFO","DEBUG","TRACE"],"sources":["../../src/log/LogView.tsx"],"sourcesContent":["import React, { PureComponent, type ReactElement } from 'react';\nimport {\n Button,\n type DropdownActions,\n DropdownMenu,\n} from '@deephaven/components';\nimport { vsGear, dhTrashUndo } from '@deephaven/icons';\nimport { assertNotNull } from '@deephaven/utils';\nimport type { dh } from '@deephaven/jsapi-types';\nimport { type Placement } from 'popper.js';\nimport * as monaco from 'monaco-editor';\nimport ConsoleUtils from '../common/ConsoleUtils';\nimport LogLevel from './LogLevel';\nimport './LogView.scss';\nimport LogLevelMenuItem from './LogLevelMenuItem';\nimport { MonacoUtils } from '../monaco';\n\ninterface LogViewProps {\n session: dh.IdeSession;\n}\n\ninterface LogViewState {\n shownLogLevels: Record<string, boolean>;\n}\n/**\n * Log view contents. Uses a monaco editor to display/search the contents of the log.\n */\nclass LogView extends PureComponent<LogViewProps, LogViewState> {\n static DefaultLogLevels = [\n LogLevel.STDOUT,\n LogLevel.ERROR,\n LogLevel.FATAL,\n LogLevel.STDERR,\n LogLevel.WARN,\n ];\n\n static AllLogLevels = [\n LogLevel.INFO,\n LogLevel.STDOUT,\n LogLevel.ERROR,\n LogLevel.FATAL,\n LogLevel.STDERR,\n LogLevel.WARN,\n LogLevel.DEBUG,\n LogLevel.TRACE,\n ];\n\n /** ms to buffer log messages before processing them */\n static bufferTimeout = 16;\n\n /** Maximum number of messages to store in the log */\n static maxLogSize = 131072;\n\n static truncateSize = 65536;\n\n static getLogText(logItem: dh.ide.LogItem): string {\n const date = new Date(logItem.micros / 1000);\n const timestamp = ConsoleUtils.formatTimestamp(date);\n return `${timestamp} ${logItem.logLevel} ${logItem.message}`;\n }\n\n constructor(props: LogViewProps) {\n super(props);\n\n this.handleClearClick = this.handleClearClick.bind(this);\n this.handleFlushTimeout = this.handleFlushTimeout.bind(this);\n this.handleLogMessage = this.handleLogMessage.bind(this);\n this.handleMenuItemClick = this.handleMenuItemClick.bind(this);\n this.handleResetClick = this.handleResetClick.bind(this);\n this.handleResize = this.handleResize.bind(this);\n this.handleToggleAllClick = this.handleToggleAllClick.bind(this);\n\n this.logLevelMenuItems = {};\n\n this.editorContainer = null;\n\n this.bufferedMessages = [];\n this.messages = [];\n\n this.state = {\n shownLogLevels: {},\n };\n }\n\n componentDidMount(): void {\n this.resetLogLevels();\n this.initMonaco();\n this.startListening();\n\n window.addEventListener('resize', this.handleResize);\n }\n\n componentDidUpdate(prevProps: LogViewProps, prevState: LogViewState): void {\n this.updateDimensions();\n\n const { shownLogLevels } = this.state;\n if (prevState.shownLogLevels !== shownLogLevels) {\n this.refreshLogText();\n }\n\n const { session } = this.props;\n if (prevProps.session !== session) {\n this.stopListening();\n this.startListening();\n // clear logs when starting a new console\n this.clearLogs();\n }\n }\n\n componentWillUnmount(): void {\n this.stopFlushTimer();\n this.stopListening();\n this.destroyMonaco();\n\n window.removeEventListener('resize', this.handleResize);\n }\n\n cancelListener?: () => void | null;\n\n editor?: monaco.editor.IStandaloneCodeEditor;\n\n editorContainer: HTMLDivElement | null;\n\n logLevelMenuItems: Record<string, LogLevelMenuItem>;\n\n flushTimer?: ReturnType<typeof setTimeout>;\n\n bufferedMessages: dh.ide.LogItem[];\n\n messages: dh.ide.LogItem[];\n\n getMenuActions(shownLogLevels: Record<string, boolean>): DropdownActions {\n const actions = [];\n\n actions.push({\n menuElement: (\n <div className=\"log-level-menu-title\">Display Log Levels</div>\n ),\n group: 1,\n order: 10,\n });\n\n for (let i = 0; i < LogView.AllLogLevels.length; i += 1) {\n const logLevel = LogView.AllLogLevels[i];\n const on =\n shownLogLevels[logLevel] != null ? shownLogLevels[logLevel] : false;\n actions.push({\n title: logLevel,\n group: 1,\n order: i + 100,\n\n menuElement: (\n <LogLevelMenuItem\n logLevel={logLevel}\n on={on}\n onClick={this.handleMenuItemClick}\n ref={element => {\n if (element != null) {\n this.logLevelMenuItems[logLevel] = element;\n }\n }}\n />\n ),\n });\n }\n\n actions.push({\n group: 1,\n order: 1000,\n menuElement: (\n <div className=\"log-level-menu-controls\">\n <Button\n kind=\"ghost\"\n className=\"log-level-toggle-all\"\n onClick={this.handleToggleAllClick}\n >\n Toggle All\n </Button>\n <Button kind=\"ghost\" onClick={this.handleResetClick}>\n Reset\n </Button>\n </div>\n ),\n });\n\n return actions;\n }\n\n resetLogLevels(): void {\n const shownLogLevels: Record<string, boolean> = {};\n for (let i = 0; i < LogView.AllLogLevels.length; i += 1) {\n const logLevel = LogView.AllLogLevels[i];\n const isEnabled = LogView.DefaultLogLevels.some(\n level => level === logLevel\n );\n shownLogLevels[logLevel] = isEnabled;\n }\n\n this.setState({ shownLogLevels });\n }\n\n startListening(): void {\n const { session } = this.props;\n this.cancelListener = session.onLogMessage(this.handleLogMessage);\n }\n\n stopListening(): void {\n if (this.cancelListener != null) {\n this.cancelListener();\n this.cancelListener = undefined;\n }\n }\n\n initMonaco(): void {\n assertNotNull(this.editorContainer);\n this.editor = monaco.editor.create(this.editorContainer, {\n copyWithSyntaxHighlighting: false,\n fixedOverflowWidgets: true,\n folding: false,\n fontFamily: 'Fira Mono',\n glyphMargin: false,\n language: 'log',\n lineDecorationsWidth: 0,\n lineNumbers: 'off',\n lineNumbersMinChars: 0,\n minimap: { enabled: false },\n readOnly: true,\n renderLineHighlight: 'none',\n scrollBeyondLastLine: false,\n value: '',\n wordWrap: 'on',\n });\n\n // Override default Monaco keybindings for `escape` and `shift-escape`\n [\n [monaco.KeyCode.Escape],\n [monaco.KeyMod.Shift | monaco.KeyCode.Escape], // eslint-disable-line no-bitwise\n ].forEach(keybindings => {\n assertNotNull(this.editor);\n\n // Monaco default behavior is for escape key to close the find widget.\n // Instead, capture it and do nothing. Same for shift-escape.\n MonacoUtils.disableKeyBindings(this.editor, keybindings);\n\n // Restore regular escape to clear selection, when editorText has focus.\n this.editor.addAction({\n id: 'clear-selection-on-escape',\n label: '',\n keybindings: [monaco.KeyCode.Escape],\n keybindingContext: 'findWidgetVisible && editorTextFocus',\n run: () => {\n const position = this.editor?.getPosition();\n assertNotNull(position);\n this.editor?.setPosition(position);\n },\n });\n });\n }\n\n destroyMonaco(): void {\n if (this.editor) {\n this.editor.dispose();\n this.editor = undefined;\n }\n }\n\n triggerFindWidget(): void {\n // The actions.find action can no longer be triggered when the editor is not in focus, with monaco 0.22.x.\n // As a workaround, just focus the editor before triggering the action\n // https://github.com/microsoft/monaco-editor/issues/2355\n this.editor?.focus();\n this.editor?.trigger('keyboard', 'actions.find', undefined);\n }\n\n toggleAll(): void {\n const { shownLogLevels } = this.state;\n let isAllEnabled = true;\n for (let i = 0; i < LogView.AllLogLevels.length; i += 1) {\n const logLevel = LogView.AllLogLevels[i];\n if (!shownLogLevels[logLevel]) {\n isAllEnabled = false;\n break;\n }\n }\n\n if (isAllEnabled) {\n this.setState({ shownLogLevels: {} });\n } else {\n const updatedLogLevels: Record<string, boolean> = {};\n for (let i = 0; i < LogView.AllLogLevels.length; i += 1) {\n const logLevel = LogView.AllLogLevels[i];\n updatedLogLevels[logLevel] = true;\n }\n this.setState({ shownLogLevels: updatedLogLevels });\n }\n }\n\n toggleLogLevel(logLevel: string): void {\n const { shownLogLevels } = this.state;\n const isEnabled = shownLogLevels[logLevel];\n const updatedLogLevels: Record<string, boolean> = {};\n updatedLogLevels[logLevel] = !isEnabled;\n this.updateLogLevels(updatedLogLevels);\n }\n\n updateLogLevels(updatedLogLevels: Record<string, boolean>): void {\n let { shownLogLevels } = this.state;\n shownLogLevels = { ...shownLogLevels, ...updatedLogLevels };\n this.setState({ shownLogLevels });\n }\n\n appendLogText(text: string): void {\n if (!this.editor) {\n return;\n }\n\n const model = this.editor.getModel();\n let line = model?.getLineCount();\n assertNotNull(line);\n let column = model?.getLineLength(line);\n assertNotNull(column);\n const isBottomVisible = this.isBottomVisible();\n\n const edits = [];\n if (column > 0) {\n edits.push({\n range: {\n startLineNumber: line,\n startColumn: column + 1,\n endLineNumber: line,\n endColumn: column + 1,\n },\n text: '\\n',\n forceMoveMarkers: true,\n });\n line += 1;\n column = 0;\n }\n\n edits.push({\n range: {\n startLineNumber: line,\n startColumn: column,\n endLineNumber: line,\n endColumn: column,\n },\n text,\n forceMoveMarkers: true,\n });\n\n model?.applyEdits(edits);\n\n if (isBottomVisible) {\n const lineCount = model?.getLineCount();\n assertNotNull(lineCount);\n this.editor.revealLine(lineCount, 1);\n }\n }\n\n /**\n * Refresh the contents of the log component with the updated filter text\n */\n refreshLogText(): void {\n if (!this.editor) {\n return;\n }\n\n this.truncateLogIfNecessary();\n\n const { shownLogLevels } = this.state;\n const isBottomVisible = this.isBottomVisible();\n\n let text = '';\n for (let i = 0; i < this.messages.length; i += 1) {\n const message = this.messages[i];\n if (shownLogLevels[message.logLevel]) {\n const logText = LogView.getLogText(message);\n if (logText.length > 0) {\n text += logText;\n if (logText.charAt(logText.length - 1) !== '\\n') {\n text += '\\n';\n }\n }\n }\n }\n text = text.trimRight();\n\n this.editor.setValue(text);\n\n if (isBottomVisible) {\n const line = this.editor.getModel()?.getLineCount();\n assertNotNull(line);\n this.editor.revealLine(line, 1);\n }\n\n this.stopFlushTimer();\n this.bufferedMessages = [];\n }\n\n truncateLogIfNecessary(): void {\n if (this.messages.length > LogView.maxLogSize) {\n this.messages = this.messages.splice(\n this.messages.length - LogView.truncateSize\n );\n }\n }\n\n scrollToBottom(): void {\n if (!this.editor) {\n return;\n }\n\n const line = this.editor?.getModel?.()?.getLineCount();\n assertNotNull(line);\n this.editor.revealLine(line, 1);\n }\n\n isBottomVisible(): boolean {\n if (!this.editor) {\n return true;\n }\n\n const model = this.editor.getModel();\n const line = model?.getLineCount();\n\n assertNotNull(line);\n return this.isLineVisible(line);\n }\n\n isLineVisible(line: number): boolean {\n const visibleRanges = this.editor?.getVisibleRanges();\n if (visibleRanges == null || visibleRanges.length === 0) {\n return false;\n }\n\n for (let i = 0; i < visibleRanges.length; i += 1) {\n const range = visibleRanges[i];\n if (range.startLineNumber <= line && line <= range.endLineNumber) {\n return true;\n }\n }\n\n return false;\n }\n\n /** Checks if the given log message is visible with the current filters */\n isLogItemVisible(message: dh.ide.LogItem): boolean {\n const { shownLogLevels } = this.state;\n return shownLogLevels[message.logLevel];\n }\n\n flush(): void {\n let text = '';\n for (let i = 0; i < this.bufferedMessages.length; i += 1) {\n const message = this.bufferedMessages[i];\n const logText = LogView.getLogText(message);\n text += logText;\n if (logText.charAt(logText.length - 1) !== '\\n') {\n text += '\\n';\n }\n }\n\n this.bufferedMessages = [];\n\n this.appendLogText(text);\n }\n\n queue(message: dh.ide.LogItem): void {\n this.bufferedMessages.push(message);\n if (this.bufferedMessages.length === 1) {\n this.flushTimer = setTimeout(\n this.handleFlushTimeout,\n LogView.bufferTimeout\n );\n }\n }\n\n stopFlushTimer(): void {\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = undefined;\n }\n }\n\n updateDimensions(): void {\n if (this.editor) {\n this.editor.layout();\n }\n }\n\n handleClearClick(): void {\n this.clearLogs();\n }\n\n clearLogs(): void {\n this.messages = [];\n this.refreshLogText();\n }\n\n handleFlushTimeout(): void {\n this.stopFlushTimer();\n this.flush();\n }\n\n handleLogMessage(message: dh.ide.LogItem): void {\n this.messages.push(message);\n\n if (this.editor && this.isLogItemVisible(message)) {\n this.queue(message);\n }\n }\n\n handleMenuItemClick(logLevel: string): void {\n this.toggleLogLevel(logLevel);\n }\n\n handleResetClick(): void {\n this.resetLogLevels();\n }\n\n handleResize(): void {\n this.updateDimensions();\n }\n\n handleToggleAllClick(): void {\n this.toggleAll();\n }\n\n render(): ReactElement {\n const popperOptions = { placement: 'bottom-end' as Placement };\n const { shownLogLevels } = this.state;\n const actions = this.getMenuActions(shownLogLevels);\n return (\n <div className=\"log-pane h-100 w-100\">\n <div className=\"log-pane-menu\">\n <Button\n kind=\"ghost\"\n className=\"btn-clear-logs\"\n onClick={this.handleClearClick}\n icon={dhTrashUndo}\n tooltip=\"Clear log\"\n />\n <Button\n kind=\"ghost\"\n className=\"btn-link-icon btn-overflow\"\n icon={vsGear}\n tooltip=\"Log Settings\"\n onClick={() => {\n // no-op: click is handled in `DropdownMenu'\n }}\n >\n <DropdownMenu\n actions={actions}\n popperClassName=\"log-level-menu-popper\"\n popperOptions={popperOptions}\n />\n </Button>\n </div>\n <div\n className=\"log-pane-editor h-100 w-100\"\n ref={editorContainer => {\n this.editorContainer = editorContainer;\n }}\n />\n </div>\n );\n }\n}\n\nexport default LogView;\n"],"mappings":"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","ignoreList":[]}
|