UNPKG

ngx-smart-spreadsheet

Version:

Lightweight spreadsheet module for Angular

111 lines 17 kB
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