From ee112714e811a07a110d4b29296bab3d240e68d9 Mon Sep 17 00:00:00 2001 From: Alan Ren Date: Mon, 5 Jun 2023 12:50:56 -0700 Subject: [PATCH] handle long text cells (#23320) --- src/sql/base/browser/ui/table/formatters.ts | 20 ++++++++++++------- .../contrib/query/browser/gridPanel.ts | 8 +++++--- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/sql/base/browser/ui/table/formatters.ts b/src/sql/base/browser/ui/table/formatters.ts index 9857ee2ebf..46580b8439 100644 --- a/src/sql/base/browser/ui/table/formatters.ts +++ b/src/sql/base/browser/ui/table/formatters.ts @@ -66,20 +66,25 @@ export function isCssIconCellValue(obj: any | undefined): obj is CssIconCellValu export function hyperLinkFormatter(row: number | undefined, cell: any | undefined, value: any, columnDef: any | undefined, dataContext: any | undefined): string { let cellClasses = 'grid-cell-value-container'; let valueToDisplay: string = ''; - + let isHyperlink: boolean = false; if (DBCellValue.isDBCellValue(value)) { valueToDisplay = 'NULL'; if (!value.isNull) { valueToDisplay = getCellDisplayValue(value.displayValue); - return `${valueToDisplay}`; + isHyperlink = true; } else { cellClasses += ' missing-value'; } } else if (isHyperlinkCellValue(value)) { valueToDisplay = getCellDisplayValue(value.displayText); - return `${valueToDisplay}`; + isHyperlink = true; + } + + if (isHyperlink) { + return `${valueToDisplay}`; + } else { + return `${valueToDisplay}`; } - return `${valueToDisplay}`; } /** @@ -131,10 +136,11 @@ export function textFormatter(row: number | undefined, cell: any | undefined, va return formattedValue; } -function getCellDisplayValue(cellValue: string): string { +export function getCellDisplayValue(cellValue: string): string { + let valueToDisplay = cellValue.length > 250 ? cellValue.slice(0, 250) + '...' : cellValue; // allow-any-unicode-next-line - let valueToDisplay = cellValue.replace(/(\r\n|\n|\r)/g, '↵'); - return escape(valueToDisplay.length > 250 ? valueToDisplay.slice(0, 250) + '...' : valueToDisplay); + valueToDisplay = valueToDisplay.replace(/(\r\n|\n|\r)/g, '↵'); + return escape(valueToDisplay); } diff --git a/src/sql/workbench/contrib/query/browser/gridPanel.ts b/src/sql/workbench/contrib/query/browser/gridPanel.ts index 1fc69feaf7..6dc073c8b9 100644 --- a/src/sql/workbench/contrib/query/browser/gridPanel.ts +++ b/src/sql/workbench/contrib/query/browser/gridPanel.ts @@ -17,7 +17,7 @@ import { IGridActionContext, SaveResultAction, CopyResultAction, SelectAllGridAc import { CellSelectionModel } from 'sql/base/browser/ui/table/plugins/cellSelectionModel.plugin'; import { RowNumberColumn } from 'sql/base/browser/ui/table/plugins/rowNumberColumn.plugin'; import { escape } from 'sql/base/common/strings'; -import { DBCellValue, hyperLinkFormatter, textFormatter } from 'sql/base/browser/ui/table/formatters'; +import { DBCellValue, getCellDisplayValue, hyperLinkFormatter, textFormatter } from 'sql/base/browser/ui/table/formatters'; import { AdditionalKeyBindings } from 'sql/base/browser/ui/table/plugins/additionalKeyBindings.plugin'; import { IContextMenuService, IContextViewService } from 'vs/platform/contextview/browser/contextView'; @@ -925,9 +925,11 @@ export abstract class GridTableBase extends Disposable implements IView, IQue let dataWithSchema = {}; // skip the first column since its a number column for (let i = 1; i < this.columns.length; i++) { + const displayValue = r[i - 1].displayValue ?? ''; + const ariaLabel = getCellDisplayValue(displayValue); dataWithSchema[this.columns[i].field] = { - displayValue: r[i - 1].displayValue, - ariaLabel: escape(r[i - 1].displayValue), + displayValue: displayValue, + ariaLabel: ariaLabel, isNull: r[i - 1].isNull, invariantCultureDisplayValue: r[i - 1].invariantCultureDisplayValue };