From b3950aa0177d1aa1b99827f7865f17e66c58c81e Mon Sep 17 00:00:00 2001 From: Valerii Sidorenko Date: Fri, 16 Feb 2024 10:16:32 +0000 Subject: [PATCH] fix(ExecuteResults): escape values in table cells when copy as tsv --- .../Tenant/Query/utils/getPreparedResult.ts | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/containers/Tenant/Query/utils/getPreparedResult.ts b/src/containers/Tenant/Query/utils/getPreparedResult.ts index d9503db226..5dcb6ec259 100644 --- a/src/containers/Tenant/Query/utils/getPreparedResult.ts +++ b/src/containers/Tenant/Query/utils/getPreparedResult.ts @@ -1,6 +1,6 @@ import type {KeyValueRow} from '../../../../types/api/query'; -export const getPreparedResult = (data: KeyValueRow[] | undefined) => { +export function getPreparedResult(data: KeyValueRow[] | undefined) { const columnDivider = '\t'; const rowDivider = '\n'; @@ -9,21 +9,22 @@ export const getPreparedResult = (data: KeyValueRow[] | undefined) => { } const columnHeaders = Object.keys(data[0]); - const rows = Array(columnHeaders).concat(data); - - return rows - .map((item) => { - const row = []; - - for (const field in item) { - if (typeof item[field] === 'object' || Array.isArray(item[field])) { - row.push(JSON.stringify(item[field])); - } else { - row.push(item[field]); - } - } + const rows = [columnHeaders.map(escapeValue).join(columnDivider)]; + for (const row of data) { + const value = []; + for (const column of columnHeaders) { + const v = row[column]; + value.push(escapeValue(typeof v === 'object' ? JSON.stringify(v) : `${v}`)); + } + rows.push(value.join(columnDivider)); + } + return rows.join(rowDivider); +} - return row.join(columnDivider); - }) - .join(rowDivider); -}; +function escapeValue(value: string) { + return value + .replaceAll('\\', '\\\\') + .replaceAll('\n', '\\n') + .replaceAll('\r', '\\r') + .replaceAll('\t', '\\t'); +}