ngx-smart-spreadsheet
Version:
Lightweight spreadsheet module for Angular
111 lines • 17 kB
JavaScript
import generateHeader from "../header-index-generator";
import generageId from "../id-generator";
import Cell from "./cell";
class Table {
constructor(id, head, body) {
this.id = id;
this.head = head;
this.body = body;
}
static empty(rows, cols) {
const tableId = generageId();
const row = Array(cols).fill('');
const head = row.map((v, c) => generateHeader(c + 1));
const body = [];
for (let r = 0; r < rows; r++) {
body.push(row.map((v, c) => new Cell(tableId, r, c, '')));
}
return new Table(tableId, head, body);
}
static load(data) {
if (!data.length) {
throw new Error('Error: invalid data structure');
}
const tableId = generageId();
const cols = data.reduce((prev, current) => Math.max(prev, current.length), 0);
const head = Array(cols).fill('').map((v, c) => generateHeader(c + 1));
const body = [];
for (let r = 0; r < data.length; r++) {
const row = data[r];
const bodyRow = [];
for (let c = 0; c < cols; c++) {
const value = c < row.length ? row[c] : '';
bodyRow.push(new Cell(tableId, r, c, value));
}
body.push(bodyRow);
}
return new Table(tableId, head, body);
}
findCell(row, col) {
for (const record of this.body) {
for (const field of record) {
if (field.row === row && field.col === col) {
return field;
}
}
}
return null;
}
insertColumn(colIndex) {
{
const remains = this.head.slice(0, colIndex);
const updates = Array(this.head.length - colIndex + 1)
.fill('')
.map((v, c) => generateHeader((c + 1) + colIndex));
this.head = [...remains, ...updates];
}
{
const body = [];
for (let r = 0; r < this.body.length; r++) {
const row = this.body[r];
const above = row.slice(0, colIndex);
const present = new Cell(this.id, r, colIndex, '');
const below = row.slice(colIndex).map(cell => cell.withCol(cell.col + 1));
const newRow = [...above, present, ...below];
body.push(newRow);
}
this.body = body;
}
}
deleteColumn(colIndex) {
{
const remains = this.head.slice(0, colIndex);
const updates = this.head.slice(colIndex + 1)
.map((v, c) => generateHeader((c + 1) + colIndex));
this.head = [...remains, ...updates];
}
{
const body = [];
for (let r = 0; r < this.body.length; r++) {
const row = this.body[r];
const above = row.slice(0, colIndex);
const below = row.slice(colIndex + 1).map(cell => cell.withCol(cell.col + 1));
const newRow = [...above, ...below];
body.push(newRow);
}
this.body = body;
}
}
insertRow(rowIndex) {
const above = this.body.slice(0, rowIndex);
const present = Array(this.colCount).fill('')
.map((v, c) => new Cell(this.id, rowIndex, c, ''));
const below = this.body.slice(rowIndex)
.map((row) => row.map((cell) => cell.withRow(cell.row + 1)));
this.body = [...above, present, ...below];
}
deleteRow(rowIndex) {
const above = this.body.slice(0, rowIndex);
const below = this.body.slice(rowIndex + 1)
.map((row) => row.map((cell) => cell.withRow(cell.row + 1)));
this.body = [...above, ...below];
}
get rowCount() {
return this.body.length;
}
get colCount() {
return this.head.length;
}
}
export default Table;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnQtc3ByZWFkc2hlZXQvc3JjL2xpYi9tb2RlbC90YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLGNBQWMsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLFVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLElBQUksTUFBTSxRQUFRLENBQUM7QUFFMUIsTUFBTSxLQUFLO0lBQ1AsWUFDVyxFQUFVLEVBQ1YsSUFBYyxFQUNkLElBQWM7UUFGZCxPQUFFLEdBQUYsRUFBRSxDQUFRO1FBQ1YsU0FBSSxHQUFKLElBQUksQ0FBVTtRQUNkLFNBQUksR0FBSixJQUFJLENBQVU7SUFDckIsQ0FBQztJQUVFLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBWSxFQUFFLElBQVk7UUFDMUMsTUFBTSxPQUFPLEdBQUcsVUFBVSxFQUFFLENBQUM7UUFDN0IsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqQyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FB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dXJjZXNDb250ZW50IjpbImltcG9ydCBnZW5lcmF0ZUhlYWRlciBmcm9tIFwiLi4vaGVhZGVyLWluZGV4LWdlbmVyYXRvclwiO1xuaW1wb3J0IGdlbmVyYWdlSWQgZnJvbSBcIi4uL2lkLWdlbmVyYXRvclwiO1xuaW1wb3J0IENlbGwgZnJvbSBcIi4vY2VsbFwiO1xuXG5jbGFzcyBUYWJsZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBpZDogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgaGVhZDogc3RyaW5nW10sXG4gICAgICAgIHB1YmxpYyBib2R5OiBDZWxsW11bXVxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGVtcHR5KHJvd3M6IG51bWJlciwgY29sczogbnVtYmVyKTogVGFibGUge1xuICAgICAgICBjb25zdCB0YWJsZUlkID0gZ2VuZXJhZ2VJZCgpO1xuICAgICAgICBjb25zdCByb3cgPSBBcnJheShjb2xzKS5maWxsKCcnKTtcbiAgICAgICAgY29uc3QgaGVhZCA9IHJvdy5tYXAoKHYsIGMpID0+IGdlbmVyYXRlSGVhZGVyKGMgKyAxKSk7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCByb3dzOyByKyspIHtcbiAgICAgICAgICAgIGJvZHkucHVzaChyb3cubWFwKCh2LCBjKSA9PiBuZXcgQ2VsbCh0YWJsZUlkLCByLCBjLCAnJykpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRhYmxlKHRhYmxlSWQsIGhlYWQsIGJvZHkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbG9hZChkYXRhOiBzdHJpbmdbXVtdKTogVGFibGUge1xuICAgICAgICBpZiAoIWRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yOiBpbnZhbGlkIGRhdGEgc3RydWN0dXJlJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFibGVJZCA9IGdlbmVyYWdlSWQoKTtcbiAgICAgICAgY29uc3QgY29scyA9IGRhdGEucmVkdWNlKChwcmV2LCBjdXJyZW50KSA9PiBNYXRoLm1heChwcmV2LCBjdXJyZW50Lmxlbmd0aCksIDApO1xuICAgICAgICBjb25zdCBoZWFkID0gQXJyYXkoY29scykuZmlsbCgnJykubWFwKCh2LCBjKSA9PiBnZW5lcmF0ZUhlYWRlcihjICsgMSkpO1xuICAgICAgICBjb25zdCBib2R5ID0gW107XG4gICAgICAgIGZvciAobGV0IHIgPSAwOyByIDwgZGF0YS5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgY29uc3Qgcm93ID0gZGF0YVtyXTtcbiAgICAgICAgICAgIGNvbnN0IGJvZHlSb3c6IENlbGxbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjb2xzOyBjKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGMgPCByb3cubGVuZ3RoID8gcm93W2NdIDogJyc7XG4gICAgICAgICAgICAgICAgYm9keVJvdy5wdXNoKG5ldyBDZWxsKHRhYmxlSWQsIHIsIGMsIHZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBib2R5LnB1c2goYm9keVJvdyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZSh0YWJsZUlkLCBoZWFkLCBib2R5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmluZENlbGwocm93OiBudW1iZXIsIGNvbDogbnVtYmVyKTogQ2VsbCB8IG51bGwge1xuICAgICAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiB0aGlzLmJvZHkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgcmVjb3JkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLnJvdyA9PT0gcm93ICYmIGZpZWxkLmNvbCA9PT0gY29sKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGluc2VydENvbHVtbihjb2xJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbWFpbnMgPSB0aGlzLmhlYWQuc2xpY2UoMCwgY29sSW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlcyA9IEFycmF5KHRoaXMuaGVhZC5sZW5ndGggLSBjb2xJbmRleCArIDEpXG4gICAgICAgICAgICAgICAgLmZpbGwoJycpXG4gICAgICAgICAgICAgICAgLm1hcCgodiwgYykgPT4gZ2VuZXJhdGVIZWFkZXIoKGMgKyAxKSArIGNvbEluZGV4KSk7XG4gICAgICAgICAgICB0aGlzLmhlYWQgPSBbLi4ucmVtYWlucywgLi4udXBkYXRlc107XG4gICAgICAgIH1cbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCB0aGlzLmJvZHkubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSB0aGlzLmJvZHlbcl07XG4gICAgICAgICAgICAgICAgY29uc3QgYWJvdmUgPSByb3cuc2xpY2UoMCwgY29sSW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXNlbnQgPSBuZXcgQ2VsbCh0aGlzLmlkLCByLCBjb2xJbmRleCwgJycpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJlbG93ID0gcm93LnNsaWNlKGNvbEluZGV4KS5tYXAoY2VsbCA9PiBjZWxsLndpdGhDb2woY2VsbC5jb2wgKyAxKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Um93ID0gWy4uLmFib3ZlLCBwcmVzZW50LCAuLi5iZWxvd107XG4gICAgICAgICAgICAgICAgYm9keS5wdXNoKG5ld1Jvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZUNvbHVtbihjb2xJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbWFpbnMgPSB0aGlzLmhlYWQuc2xpY2UoMCwgY29sSW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlcyA9IHRoaXMuaGVhZC5zbGljZShjb2xJbmRleCArIDEpXG4gICAgICAgICAgICAgICAgLm1hcCgodiwgYykgPT4gZ2VuZXJhdGVIZWFkZXIoKGMgKyAxKSArIGNvbEluZGV4KSk7XG4gICAgICAgICAgICB0aGlzLmhlYWQgPSBbLi4ucmVtYWlucywgLi4udXBkYXRlc107XG4gICAgICAgIH1cbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCB0aGlzLmJvZHkubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSB0aGlzLmJvZHlbcl07XG4gICAgICAgICAgICAgICAgY29uc3QgYWJvdmUgPSByb3cuc2xpY2UoMCwgY29sSW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJlbG93ID0gcm93LnNsaWNlKGNvbEluZGV4ICsgMSkubWFwKGNlbGwgPT4gY2VsbC53aXRoQ29sKGNlbGwuY29sICsgMSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1JvdyA9IFsuLi5hYm92ZSwgLi4uYmVsb3ddO1xuICAgICAgICAgICAgICAgIGJvZHkucHVzaChuZXdSb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBpbnNlcnRSb3cocm93SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBhYm92ZSA9IHRoaXMuYm9keS5zbGljZSgwLCByb3dJbmRleCk7XG4gICAgICAgIGNvbnN0IHByZXNlbnQgPSBBcnJheSh0aGlzLmNvbENvdW50KS5maWxsKCcnKVxuICAgICAgICAgICAgLm1hcCgodiwgYykgPT4gbmV3IENlbGwodGhpcy5pZCwgcm93SW5kZXgsIGMsICcnKSk7XG4gICAgICAgIGNvbnN0IGJlbG93ID0gdGhpcy5ib2R5LnNsaWNlKHJvd0luZGV4KVxuICAgICAgICAgICAgLm1hcCgocm93KSA9PiByb3cubWFwKChjZWxsKSA9PiBjZWxsLndpdGhSb3coY2VsbC5yb3cgKyAxKSkpO1xuICAgICAgICB0aGlzLmJvZHkgPSBbLi4uYWJvdmUsIHByZXNlbnQsIC4uLmJlbG93XTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlUm93KHJvd0luZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYWJvdmUgPSB0aGlzLmJvZHkuc2xpY2UoMCwgcm93SW5kZXgpO1xuICAgICAgICBjb25zdCBiZWxvdyA9IHRoaXMuYm9keS5zbGljZShyb3dJbmRleCArIDEpXG4gICAgICAgICAgICAubWFwKChyb3cpID0+IHJvdy5tYXAoKGNlbGwpID0+IGNlbGwud2l0aFJvdyhjZWxsLnJvdyArIDEpKSk7XG4gICAgICAgIHRoaXMuYm9keSA9IFsuLi5hYm92ZSwgLi4uYmVsb3ddO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcm93Q291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm9keS5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb2xDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWFkLmxlbmd0aDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRhYmxlO1xuIl19