107 lines
2.7 KiB
TypeScript
107 lines
2.7 KiB
TypeScript
import Spreadsheet, { RangeSelectionType } from "../main";
|
|
import { Cell, CellConstructorProps, CellStyles, Position } from "./cell";
|
|
import { EventTypes } from "./events";
|
|
|
|
export class Clipboard {
|
|
saved: Cell[][] | null = null;
|
|
root: Spreadsheet;
|
|
constructor(root: Spreadsheet) {
|
|
this.root = root;
|
|
}
|
|
|
|
copy(data: Cell[][], range: RangeSelectionType) {
|
|
const mapedData = data
|
|
.map((row) => {
|
|
return row
|
|
.map((item) => {
|
|
return item.displayValue;
|
|
})
|
|
.join("\t");
|
|
})
|
|
.join("\n");
|
|
|
|
this.saved = data;
|
|
navigator.clipboard.writeText(mapedData);
|
|
|
|
this.root.events.dispatch({
|
|
type: EventTypes.COPY_CELLS,
|
|
data,
|
|
dataAsString: mapedData,
|
|
range,
|
|
});
|
|
}
|
|
|
|
paste(root: Spreadsheet, { column, row }: Position, event: ClipboardEvent) {
|
|
if (!this.saved) {
|
|
if (!event.clipboardData) return;
|
|
const data = event.clipboardData.getData("text");
|
|
try {
|
|
const arr = data.split("\n").map((item) => item.split("\t"));
|
|
const arrayOfCells = arr.map((innerRow) => {
|
|
return innerRow.map((item) => {
|
|
const cellProps: CellConstructorProps = {
|
|
displayValue: item,
|
|
position: {
|
|
column,
|
|
row,
|
|
},
|
|
resultValue: item,
|
|
style: new CellStyles(),
|
|
value: item,
|
|
};
|
|
return new Cell(cellProps);
|
|
});
|
|
});
|
|
|
|
const rowsLength = arrayOfCells.length;
|
|
const colsLength = arrayOfCells[0] ? arrayOfCells[0].length : 0;
|
|
|
|
for (let i = 0; i < rowsLength; i++) {
|
|
for (let j = 0; j < colsLength; j++) {
|
|
const savedCell = arrayOfCells[i][j];
|
|
|
|
const position = {
|
|
column: column + j,
|
|
row: row + i,
|
|
};
|
|
|
|
const values = {
|
|
displayValue: savedCell.displayValue,
|
|
value: savedCell.value,
|
|
style: savedCell.style,
|
|
};
|
|
|
|
root.changeCellValues(position, values, false);
|
|
}
|
|
}
|
|
} catch (err) {
|
|
console.error("Cannot read clipboard. ", err);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
const rowsLength = this.saved.length;
|
|
const colsLength = this.saved[0] ? this.saved[0].length : 0;
|
|
|
|
for (let i = 0; i < rowsLength; i++) {
|
|
for (let j = 0; j < colsLength; j++) {
|
|
const savedCell = this.saved[i][j];
|
|
|
|
const position = {
|
|
column: column + j,
|
|
row: row + i,
|
|
};
|
|
|
|
const values = {
|
|
displayValue: savedCell.displayValue,
|
|
value: savedCell.value,
|
|
style: savedCell.style,
|
|
};
|
|
|
|
root.changeCellValues(position, values, false);
|
|
}
|
|
}
|
|
}
|
|
}
|