mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-19 01:25:36 -05:00
Better cell selection (#6914)
* Better cell selection * Explicit return type and undefined assignment * More complex copy/paste * Get TS to be less mad at me * Remove EoL * Fail safe if statement * strict null check
This commit is contained in:
@@ -43,22 +43,27 @@ export interface IGridDataProvider {
|
||||
}
|
||||
|
||||
export async function getResultsString(provider: IGridDataProvider, selection: Slick.Range[], includeHeaders?: boolean): Promise<string> {
|
||||
let headers: Map<Number, string> = new Map();
|
||||
let rows: Map<Number, Map<Number, string>> = new Map();
|
||||
let copyTable: string[][] = [];
|
||||
const eol = provider.getEolString();
|
||||
|
||||
// create a mapping of the ranges to get promises
|
||||
let tasks = selection.map((range, i) => {
|
||||
return async () => {
|
||||
let selectionsCopy = selection;
|
||||
let startCol = range.fromCell;
|
||||
let startRow = range.fromRow;
|
||||
|
||||
const result = await provider.getRowData(range.fromRow, range.toRow - range.fromRow + 1);
|
||||
// If there was a previous selection separate it with a line break. Currently
|
||||
// when there are multiple selections they are never on the same line
|
||||
if (provider.shouldIncludeHeaders(includeHeaders)) {
|
||||
let columnHeaders = provider.getColumnHeaders(range);
|
||||
if (columnHeaders !== undefined) {
|
||||
if (copyTable[0] === undefined) {
|
||||
copyTable[0] = [];
|
||||
}
|
||||
copyTable[0].push(...columnHeaders);
|
||||
let columnHeaders = provider.getColumnHeaders(range);
|
||||
if (columnHeaders !== undefined) {
|
||||
let idx = 0;
|
||||
for (let header of columnHeaders) {
|
||||
headers.set(startCol + idx, header);
|
||||
idx++;
|
||||
}
|
||||
}
|
||||
// Iterate over the rows to paste into the copy string
|
||||
@@ -70,11 +75,17 @@ export async function getResultsString(provider: IGridDataProvider, selection: S
|
||||
? cellObjects.map(x => removeNewLines(x.displayValue))
|
||||
: cellObjects.map(x => x.displayValue);
|
||||
|
||||
let idx = rowIndex + 1;
|
||||
if (copyTable[idx] === undefined) {
|
||||
copyTable[idx] = [];
|
||||
let idx = 0;
|
||||
for (let cell of cells) {
|
||||
let map = rows.get(rowIndex + startRow);
|
||||
if (!map) {
|
||||
map = new Map();
|
||||
rows.set(rowIndex + startRow, map);
|
||||
}
|
||||
|
||||
map.set(startCol + idx, cell);
|
||||
idx++;
|
||||
}
|
||||
copyTable[idx].push(...cells);
|
||||
}
|
||||
};
|
||||
});
|
||||
@@ -88,13 +99,23 @@ export async function getResultsString(provider: IGridDataProvider, selection: S
|
||||
}
|
||||
|
||||
let copyString = '';
|
||||
copyTable.forEach((row) => {
|
||||
if (row === undefined) {
|
||||
return;
|
||||
if (includeHeaders) {
|
||||
copyString = [...headers.values()].join('\t').concat(eol);
|
||||
}
|
||||
|
||||
const rowKeys = [...headers.keys()];
|
||||
|
||||
for (let rowEntry of rows) {
|
||||
let rowMap = rowEntry[1];
|
||||
for (let rowIdx of rowKeys) {
|
||||
|
||||
let value = rowMap.get(rowIdx);
|
||||
if (value) {
|
||||
copyString = copyString.concat(value);
|
||||
}
|
||||
copyString = copyString.concat('\t');
|
||||
}
|
||||
copyString = copyString.concat(row.join('\t').concat(eol));
|
||||
});
|
||||
copyString = copyString.slice(0, -1 * eol.length);
|
||||
}
|
||||
|
||||
return copyString;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user