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:
Amir Omidi
2019-09-11 18:23:49 -07:00
committed by GitHub
parent 0793e11b04
commit abe917f3c1
3 changed files with 176 additions and 25 deletions

View File

@@ -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;
}