ngx-smart-spreadsheet
Version:
Lightweight spreadsheet module for Angular
1 lines • 56.1 kB
Source Map (JSON)
{"version":3,"file":"ngx-smart-spreadsheet.mjs","sources":["../../../projects/ngx-smart-spreadsheet/src/lib/deep-marge.ts","../../../projects/ngx-smart-spreadsheet/src/lib/spreadsheet-settings.ts","../../../projects/ngx-smart-spreadsheet/src/lib/csv-converter.ts","../../../projects/ngx-smart-spreadsheet/src/lib/model/anchor.ts","../../../projects/ngx-smart-spreadsheet/src/lib/model/range.ts","../../../projects/ngx-smart-spreadsheet/src/lib/header-index-generator.ts","../../../projects/ngx-smart-spreadsheet/src/lib/id-generator.ts","../../../projects/ngx-smart-spreadsheet/src/lib/model/cell.ts","../../../projects/ngx-smart-spreadsheet/src/lib/model/table.ts","../../../projects/ngx-smart-spreadsheet/src/lib/ngx-context-menu-item.component.ts","../../../projects/ngx-smart-spreadsheet/src/lib/ngx-context-menu.component.ts","../../../projects/ngx-smart-spreadsheet/src/lib/ngx-context-menu.component.html","../../../projects/ngx-smart-spreadsheet/src/lib/content-editable.directive.ts","../../../projects/ngx-smart-spreadsheet/src/lib/ngx-smart-spreadsheet.component.ts","../../../projects/ngx-smart-spreadsheet/src/lib/ngx-smart-spreadsheet.component.html","../../../projects/ngx-smart-spreadsheet/src/lib/ngx-smart-spreadsheet.module.ts","../../../projects/ngx-smart-spreadsheet/src/public-api.ts","../../../projects/ngx-smart-spreadsheet/src/ngx-smart-spreadsheet.ts"],"sourcesContent":["function isObject(item: any): any {\n return (item && typeof item === 'object' && !Array.isArray(item));\n}\n\nexport function mergeDeep(target: any, ...sources: any): any {\n if (!sources.length) return target;\n const source = sources.shift();\n\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) Object.assign(target, { [key]: {} });\n mergeDeep(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n }\n }\n return mergeDeep(target, ...sources);\n}\n","import { mergeDeep } from \"./deep-marge\";\nimport { SpreadsheetSettingOptions } from \"./spreadsheet-settings-options\";\n\nconst defaultOptions: SpreadsheetSettingOptions = {\n contextMenuRowLabel: {\n INSERT_ROW_ABOVE: 'Insert 1 row above',\n INSERT_ROW_BELOW: 'Insert 1 row below',\n DELETE_ROW: 'Delete row',\n },\n contextMenuColLabel: {\n INSERT_COLUMN_LEFT: 'Insert 1 column left',\n INSERT_COLUMN_RIGHT: 'Insert 1 column right',\n DELETE_COLUMN: 'Delete column',\n }\n};\n\nexport class SpreadsheetSettings {\n constructor(\n public rows: number | null,\n public cols: number | null,\n public data: string[][] | null,\n public options?: SpreadsheetSettingOptions\n ) {\n this.options = mergeDeep(defaultOptions, options || {});\n }\n\n public static empty(rows: number, cols: number, options?: SpreadsheetSettingOptions): SpreadsheetSettings {\n return new SpreadsheetSettings(rows, cols, null, options);\n }\n\n public static load(data: string[][], options?: SpreadsheetSettingOptions): SpreadsheetSettings {\n return new SpreadsheetSettings(null, null, data, options);\n }\n};\n","const DELIMITER = '\\t';\nconst PARSE_PATTERN = new RegExp(\n (\n '(\\\\' + DELIMITER + '|\\\\r?\\\\n|\\\\r|^)' +\n '(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|' +\n '([^\"\\\\' + DELIMITER + '\\\\r\\\\n]*))'\n ),\n \"gi\"\n);\n\nconst csvToArray = (strData: string): string[][] => {\n const arrData: string[][] = [[]];\n let arrMatches = null;\n while (arrMatches = PARSE_PATTERN.exec(strData)) {\n const strMatchedDelimiter = arrMatches[1];\n if (strMatchedDelimiter.length && (strMatchedDelimiter != DELIMITER)) {\n arrData.push([]);\n }\n\n const strMatchedValue = (arrMatches[2])\n ? arrMatches[2].replace(new RegExp('\"\"', 'g'), '\"') : arrMatches[3];\n\n arrData[arrData.length - 1].push(strMatchedValue);\n }\n return arrData;\n};\n\nexport default csvToArray;\n","class Anchor {\n constructor(\n public r: number,\n public c: number,\n ) { }\n}\n\nexport default Anchor;\n","import Anchor from \"./anchor\";\n\nclass Range {\n constructor(\n public r1: number,\n public c1: number,\n public r2: number,\n public c2: number\n ) { }\n\n public calc(row: number, col: number): void {\n if (row < this.r1) {\n this.r1 = row;\n }\n if (row > this.r2) {\n this.r2 = row;\n }\n if (col < this.c1) {\n this.c1 = col;\n }\n if (col > this.c2) {\n this.c2 = col;\n }\n }\n\n public includes(row: number, col: number): boolean {\n return (row >= this.r1 && row <= this.r2)\n && (col >= this.c1 && col <= this.c2);\n }\n\n public equals(range: Range) {\n return this.r1 === range.r1 && this.c1 === range.c1 && this.r2 === range.r2 && this.c2 === range.c2;\n }\n\n public static of(row: number, col: number, row2: number = row, col2: number = col): Range {\n return new Range(row, col, row2, col2);\n }\n\n public static marge(a1: Anchor, a2: Anchor): Range {\n const r1 = a1.r < a2.r ? a1.r : a2.r;\n const r2 = a1.r > a2.r ? a1.r : a2.r;\n const c1 = a1.c < a2.c ? a1.c : a2.c;\n const c2 = a1.c > a2.c ? a1.c : a2.c;\n return new Range(r1, c1, r2, c2);\n }\n}\n\nexport default Range;\n","const CHARS = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',\n 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];\nconst LENGTH = CHARS.length;\n\nconst generateHeader = (index: number): string => {\n index -= 1;\n const remain = Math.floor(index / LENGTH);\n return (remain > 0) ? generateHeader(remain) + CHARS[index % LENGTH] : CHARS[index % LENGTH];\n};\n\nexport default generateHeader;\n","const CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\nconst LENGTH = CHARS.length;\n\nconst generageId = (): string =>\n new Array(8).fill(null)\n .map(() => CHARS.charAt(Math.floor(Math.random() * LENGTH)))\n .join('');\n\nexport default generageId;\n","\nclass Cell {\n public id: string;\n constructor(\n public tableId: string,\n public row: number,\n public col: number,\n public value: string,\n public editable: boolean = false\n ) {\n this.id = `${tableId}-${row}-${col}`;\n }\n\n public withRow(index: number): Cell {\n return new Cell(this.tableId, index, this.col, this.value, this.editable);\n }\n\n public withCol(index: number): Cell {\n return new Cell(this.tableId, this.row, index, this.value, this.editable);\n }\n}\n\nexport default Cell;\n","import generateHeader from \"../header-index-generator\";\nimport generageId from \"../id-generator\";\nimport Cell from \"./cell\";\n\nclass Table {\n constructor(\n public id: string,\n public head: string[],\n public body: Cell[][]\n ) { }\n\n public static empty(rows: number, cols: number): Table {\n const tableId = generageId();\n const row = Array(cols).fill('');\n const head = row.map((v, c) => generateHeader(c + 1));\n const body = [];\n for (let r = 0; r < rows; r++) {\n body.push(row.map((v, c) => new Cell(tableId, r, c, '')));\n }\n return new Table(tableId, head, body);\n }\n\n public static load(data: string[][]): Table {\n if (!data.length) {\n throw new Error('Error: invalid data structure');\n }\n const tableId = generageId();\n const cols = data.reduce((prev, current) => Math.max(prev, current.length), 0);\n const head = Array(cols).fill('').map((v, c) => generateHeader(c + 1));\n const body = [];\n for (let r = 0; r < data.length; r++) {\n const row = data[r];\n const bodyRow: Cell[] = [];\n for (let c = 0; c < cols; c++) {\n const value = c < row.length ? row[c] : '';\n bodyRow.push(new Cell(tableId, r, c, value));\n }\n body.push(bodyRow);\n }\n return new Table(tableId, head, body);\n }\n\n public findCell(row: number, col: number): Cell | null {\n for (const record of this.body) {\n for (const field of record) {\n if (field.row === row && field.col === col) {\n return field;\n }\n }\n }\n return null;\n }\n\n public insertColumn(colIndex: number): void {\n {\n const remains = this.head.slice(0, colIndex);\n const updates = Array(this.head.length - colIndex + 1)\n .fill('')\n .map((v, c) => generateHeader((c + 1) + colIndex));\n this.head = [...remains, ...updates];\n }\n {\n const body = [];\n for (let r = 0; r < this.body.length; r++) {\n const row = this.body[r];\n const above = row.slice(0, colIndex);\n const present = new Cell(this.id, r, colIndex, '');\n const below = row.slice(colIndex).map(cell => cell.withCol(cell.col + 1));\n const newRow = [...above, present, ...below];\n body.push(newRow);\n }\n this.body = body;\n }\n }\n\n public deleteColumn(colIndex: number): void {\n {\n const remains = this.head.slice(0, colIndex);\n const updates = this.head.slice(colIndex + 1)\n .map((v, c) => generateHeader((c + 1) + colIndex));\n this.head = [...remains, ...updates];\n }\n {\n const body = [];\n for (let r = 0; r < this.body.length; r++) {\n const row = this.body[r];\n const above = row.slice(0, colIndex);\n const below = row.slice(colIndex + 1).map(cell => cell.withCol(cell.col + 1));\n const newRow = [...above, ...below];\n body.push(newRow);\n }\n this.body = body;\n }\n }\n\n public insertRow(rowIndex: number): void {\n const above = this.body.slice(0, rowIndex);\n const present = Array(this.colCount).fill('')\n .map((v, c) => new Cell(this.id, rowIndex, c, ''));\n const below = this.body.slice(rowIndex)\n .map((row) => row.map((cell) => cell.withRow(cell.row + 1)));\n this.body = [...above, present, ...below];\n }\n\n public deleteRow(rowIndex: number): void {\n const above = this.body.slice(0, rowIndex);\n const below = this.body.slice(rowIndex + 1)\n .map((row) => row.map((cell) => cell.withRow(cell.row + 1)));\n this.body = [...above, ...below];\n }\n\n public get rowCount(): number {\n return this.body.length;\n }\n\n public get colCount(): number {\n return this.head.length;\n }\n}\n\nexport default Table;\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\n\n@Component({\n selector: 'ngx-context-menu-item',\n template: ''\n})\nexport class NgxContextMenuItemComponent {\n @Input()\n label?: string;\n @Input()\n disabled?: boolean;\n @Input()\n divider?: boolean;\n @Output()\n click = new EventEmitter<number>();\n\n clicked(index: number) {\n if (!this.disabled) {\n this.click.emit(index);\n }\n }\n}\n","import { Component, ContentChildren, ElementRef, EventEmitter, HostListener, Output, QueryList, ViewChild } from '@angular/core';\nimport { NgxContextMenuItemComponent } from './ngx-context-menu-item.component';\n\n@Component({\n selector: 'ngx-context-menu',\n templateUrl: './ngx-context-menu.component.html',\n styleUrls: ['./ngx-context-menu.component.scss']\n})\nexport class NgxContextMenuComponent {\n @ViewChild('menu', { static: true })\n menuElementRef!: ElementRef<HTMLElement>;\n\n @ContentChildren(NgxContextMenuItemComponent)\n itemTemplates!: QueryList<NgxContextMenuItemComponent>;\n\n @Output()\n closed = new EventEmitter();\n\n target: number = -1;\n\n public show(ev: MouseEvent, index: number): void {\n this.target = index;\n this.menuElement.style.display = 'flex';\n\n const menuTop = ((ev.clientY + this.menuHeight) > this.documentHeight) ?\n ev.pageY - this.menuHeight : ev.pageY + 15;\n const menuLeft = ((ev.clientX + this.menuWidth) > this.documentWidth) ?\n ev.pageX - this.menuWidth : ev.pageX;\n this.menuElement.style.top = `${menuTop}px`;\n this.menuElement.style.left = `${menuLeft}px`;\n }\n\n @HostListener('document:click', ['$event'])\n click(): void {\n this.menuElement.style.display = 'none';\n this.closed.emit();\n }\n\n private get menuElement(): HTMLElement {\n return this.menuElementRef.nativeElement;\n }\n\n private get menuStyle(): CSSStyleDeclaration {\n return getComputedStyle(this.menuElement);\n }\n\n private get menuWidth(): number {\n return this.menuElement.offsetWidth +\n parseInt(this.menuStyle.marginLeft) + parseInt(this.menuStyle.marginRight) +\n parseInt(this.menuStyle.paddingLeft) + parseInt(this.menuStyle.paddingRight);\n }\n\n private get menuHeight(): number {\n return this.menuElement.offsetHeight +\n parseInt(this.menuStyle.marginTop) + parseInt(this.menuStyle.marginBottom) +\n parseInt(this.menuStyle.paddingTop) + parseInt(this.menuStyle.paddingBottom);\n }\n\n private get documentWidth(): number {\n return document.documentElement.clientWidth;\n }\n\n private get documentHeight(): number {\n return document.documentElement.clientHeight;\n }\n\n}\n","<div #menu class=\"menu\">\n <ng-container *ngFor=\"let item of itemTemplates\">\n <div class=\"item\" *ngIf=\"!item.divider; else divider\" (click)=\"item.clicked(target)\"\n [class.disabled]=\"item.disabled\">\n {{item.label}}\n </div>\n <ng-template #divider>\n <div class=\"divider\"></div>\n </ng-template>\n </ng-container>\n</div>","import { Directive, ElementRef, EventEmitter, HostListener, Input, Output } from '@angular/core';\n\n@Directive({\n selector: '[nssContentEditable]'\n})\nexport class ContentEditableDirective {\n @Input()\n set model(value: string) {\n this.element.innerText = value || '';\n }\n @Output()\n modelChange = new EventEmitter<string>();\n\n constructor(private elementRef: ElementRef<HTMLElement>) {\n this.element.tabIndex = 0;\n }\n\n @HostListener('blur', ['$event.target.value'])\n blur() {\n this.modelChange.emit(this.element.innerText);\n }\n\n get element(): HTMLElement {\n return this.elementRef.nativeElement as HTMLElement;\n }\n}\n","import { Component, EventEmitter, HostListener, Input, OnInit, Output, ViewChild } from '@angular/core';\nimport csvToArray from './csv-converter';\nimport Anchor from './model/anchor';\nimport Cell from './model/cell';\nimport Range from './model/range';\nimport Table from './model/table';\nimport { NgxContextMenuComponent } from './ngx-context-menu.component';\nimport { SpreadsheetSettings } from './spreadsheet-settings';\n\n@Component({\n selector: 'ngx-smart-spreadsheet',\n templateUrl: './ngx-smart-spreadsheet.component.html',\n styleUrls: ['./ngx-smart-spreadsheet.component.scss']\n})\nexport class NgxSmartSpreadsheetComponent implements OnInit {\n @ViewChild('theadMenu')\n theadContextMenu!: NgxContextMenuComponent;\n @ViewChild('tbodyMenu')\n tbodyContextMenu!: NgxContextMenuComponent;\n\n @Input()\n settings: SpreadsheetSettings | null = null;\n\n @Output()\n copied = new EventEmitter<string>();\n\n table: Table | null = null;\n activatedCell: Cell | null = null;\n range: Range | null = null;\n anchor: Anchor | null = null;\n\n activeTheadIndex: number = -1;\n activeTbodyIndex: number = -1;\n\n ngOnInit(): void {\n if (this.settings?.rows && this.settings?.cols) {\n this.table = Table.empty(this.settings.rows, this.settings.cols);\n } else if (this.settings?.data) {\n this.table = Table.load(this.settings.data);\n }\n }\n\n public get data(): string[][] {\n if (!this.table) {\n return [[]];\n }\n return this.table.body.map(row => row.map(cell => cell.value));\n }\n\n @HostListener('mousedown', ['$event'])\n private mousedown(ev: MouseEvent): void {\n const { row, col, valid } = this.getPositionFromId(ev.target);\n if (!valid) {\n return;\n }\n this.range = Range.of(row, col);\n if (!ev.shiftKey || !this.anchor) {\n this.anchor = new Anchor(row, col);\n }\n }\n\n @HostListener('document:mousemove', ['$event'])\n private mousemove(ev: MouseEvent): void {\n if (!this.range || !this.anchor) {\n return;\n }\n const self = this.getPositionFromId(ev.target);\n if (self.valid) {\n const range = Range.marge({ r: self.row, c: self.col }, this.anchor);\n if (!this.range?.equals(range)) {\n this.range = range;\n }\n }\n }\n\n @HostListener('document:mouseup', ['$event'])\n private mouseup(ev: MouseEvent): void {\n if (ev.shiftKey && this.anchor) {\n const self = this.getPositionFromId(ev.target);\n if (self.valid) {\n const range = Range.marge({ r: self.row, c: self.col }, this.anchor);\n if (!this.range?.equals(range)) {\n this.range = range;\n }\n }\n }\n this.anchor = null;\n }\n\n @HostListener('document:keydown', ['$event'])\n private onKeyDown(ev: KeyboardEvent): void {\n const key = ev.key.toLowerCase();\n const isCtrl = ((ev.ctrlKey && !ev.metaKey) || (!ev.ctrlKey && ev.metaKey));\n if (!this.table) {\n return;\n }\n\n if (!this.anchor && ev.shiftKey && this.activatedCell) {\n const { row, col } = this.activatedCell;\n this.anchor = new Anchor(row, col);\n }\n\n if (key === 'enter' && this.activatedCell) {\n const { row, col, editable } = this.activatedCell;\n if (editable && ev.shiftKey) {\n ev.preventDefault();\n this.moveTo(row + 1, col, false, editable);\n }\n } else if (key === 'tab' && this.activatedCell) {\n ev.preventDefault();\n const { rowCount, colCount } = this.table;\n const { row, col, editable } = this.activatedCell;\n const next = ev.shiftKey ? col - 1 : col + 1;\n if (next < 0 && row > 0) {\n this.moveTo(row - 1, colCount - 1, false, editable);\n } else if (next >= colCount && row < rowCount) {\n this.moveTo(row + 1, 0, false, editable);\n } else {\n this.moveTo(row, next, false, editable);\n }\n } else if (key === 'f2') {\n this.setEditable(ev, true);\n } else if (key === 'escape') {\n this.setEditable(ev, false);\n } else if (key === 'c' && isCtrl) {\n this.copy();\n } else if (key === 'v' && isCtrl) {\n this.paste();\n } else if (key === 'delete') {\n this.delete();\n }\n }\n\n @HostListener('document:keyup', ['$event'])\n private onKeyUp(ev: KeyboardEvent): void {\n if (!this.activatedCell || this.activatedCell.editable) {\n return;\n }\n if (!ev.shiftKey) {\n this.anchor = null;\n }\n const { row, col } = this.activatedCell;\n switch (ev.key.toLowerCase()) {\n case 'arrowup':\n this.moveTo(row - 1, col, ev.shiftKey, false);\n break;\n case 'arrowdown':\n this.moveTo(row + 1, col, ev.shiftKey, false);\n break;\n case 'arrowleft':\n this.moveTo(row, col - 1, ev.shiftKey, false);\n break;\n case 'arrowright':\n this.moveTo(row, col + 1, ev.shiftKey, false);\n break;\n }\n }\n\n trackByCell(index: number, value: Cell): string | null {\n return value ? value.id : null;\n }\n\n clickHeader(colIndex: number): void {\n const rowLength = this.table?.body.length || 0;\n if (rowLength > 0) {\n this.range = Range.of(0, colIndex, rowLength, colIndex);\n }\n }\n\n clickRow(rowIndex: number): void {\n if (!this.table) {\n return;\n }\n if (rowIndex >= 0 && rowIndex < this.table.body.length) {\n const cols = this.table.body[rowIndex];\n this.range = Range.of(rowIndex, 0, rowIndex, cols.length);\n }\n }\n\n focus(ev: FocusEvent): void {\n const found = this.findCellByEventTarget(ev.target);\n this.activatedCell = found;\n }\n\n blur(ev: FocusEvent): void {\n const found = this.findCellByEventTarget(ev.target);\n if (found) {\n found.editable = false;\n }\n }\n\n dblclick(ev: Event, target: Cell): void {\n const td = ev.target as HTMLTableCellElement;\n if (target === this.activatedCell) {\n target.editable = true;\n }\n }\n\n setValue(ev: Event, target: Cell): void {\n const value = (ev.target as HTMLTableCellElement).innerText || '';\n target.value = value;\n }\n\n setEditable(ev: Event, editable: boolean): void {\n ev.stopPropagation();\n const found = this.findCellByEventTarget(ev.target);\n if (found) {\n found.editable = editable;\n }\n }\n\n //#region menu event handle\n showTheadMenu(ev: MouseEvent, index: number): void {\n ev.stopPropagation();\n this.theadContextMenu.show(ev, index);\n }\n\n showTbodyMenu(ev: MouseEvent, index: number): void {\n ev.stopPropagation();\n this.tbodyContextMenu.show(ev, index);\n }\n //#endregion\n\n private moveTo(row: number, col: number, shiftKey: boolean, editable: boolean): void {\n if (!this.table) {\n return;\n }\n const { body } = this.table;\n if (row >= 0 && row < body.length) {\n const cols = body[row];\n if (col >= 0 && col < cols.length) {\n const cell = cols[col];\n const e = document.getElementById(cell.id);\n if (e) {\n e.focus();\n const s = window.getSelection();\n const r = document.createRange();\n r.setStart(e, e.childElementCount);\n r.setEnd(e, e.childElementCount);\n s?.removeAllRanges();\n s?.addRange(r);\n }\n if (shiftKey && this.range && this.anchor) {\n this.range = Range.marge(this.anchor, { r: row, c: col });\n } else {\n this.range = Range.of(cell.row, cell.col);\n }\n if (editable) {\n cell.editable = true;\n }\n }\n }\n }\n\n private findCellByEventTarget(target: EventTarget | null): Cell | null {\n const { row, col, valid } = this.getPositionFromId(target);\n return valid ? (this.table?.findCell(row, col) || null) : null;\n }\n\n private getPositionFromId(target: EventTarget | null): { row: number, col: number, valid: boolean } {\n const element = target as HTMLTableCellElement;\n if (!this.table || !element?.id?.match(/(\\w+)-(\\d+)-(\\d+)/)) {\n return { row: NaN, col: NaN, valid: false };\n }\n const valid = RegExp.$1 === this.table.id;\n const row = parseInt(RegExp.$2 || '', 10);\n const col = parseInt(RegExp.$3 || '', 10);\n return { row, col, valid };\n }\n\n private copy(): void {\n if (!this.table || !this.range) {\n return;\n }\n const lines = [];\n for (let r = this.range.r1; r <= this.range.r2; r++) {\n const line = [];\n for (let c = this.range.c1; c <= this.range.c2; c++) {\n const cell = this.table.findCell(r, c);\n if (cell) {\n const value = (cell.value.match(/[\\t\\n\\r \"]+/))\n ? '\"' + cell.value.split('\"').join('\"\"') + '\"'\n : cell.value;\n line.push(value);\n }\n }\n lines.push(line.join('\\t'));\n }\n const text = lines.join('\\n');\n if (text) {\n navigator.clipboard.writeText(text)\n .then(() => this.copied.emit(text));\n }\n }\n\n private paste(): void {\n if (!this.table || !this.range) {\n return;\n }\n const { r1, c1, r2, c2 } = this.range;\n navigator.clipboard.readText()\n .then((data) => {\n const ar = csvToArray(data);\n if (!ar.length) {\n return;\n }\n if (ar.length === 1 && ar[0].length === 1) {\n const clipboardText = ar[0][0];\n for (let r = r1; r <= r2; r++) {\n for (let c = c1; c <= c2; c++) {\n const cell = this.table!.findCell(r, c);\n if (cell) {\n cell.value = clipboardText;\n }\n }\n }\n } else if ((r2 - r1 + 1) === ar.length && (c2 - c1 + 1) === ar[0].length) {\n for (let r = r1; r <= r2; r++) {\n for (let c = c1; c <= c2; c++) {\n const cell = this.table!.findCell(r, c);\n if (cell) {\n cell.value = ar[r][c];\n }\n }\n }\n } else {\n let cell = null;\n for (let r = 0, tableRow = r1; r < ar.length; r++, tableRow++) {\n const row = ar[r];\n for (let c = 0, tableCol = c1; c < row.length; c++, tableCol++) {\n const col = row[c];\n cell = this.table!.findCell(tableRow, tableCol);\n if (cell) {\n cell.value = col;\n }\n }\n }\n if (cell) {\n this.range = Range.of(r1, c1, cell.row, cell.col);\n }\n }\n });\n }\n\n private delete(): void {\n if (!this.table || !this.range) {\n return;\n }\n const { r1, c1, r2, c2 } = this.range;\n for (let r = r1; r <= r2; r++) {\n for (let c = c1; c <= c2; c++) {\n const cell = this.table.findCell(r, c);\n if (cell) {\n cell.value = '';\n }\n }\n }\n }\n\n}\n","<ng-container *ngIf=\"settings && table\">\n <div class=\"container\">\n <table>\n <thead>\n <tr>\n <th></th>\n <th *ngFor=\"let col of table.head; let c = index\" (click)=\"clickHeader(c)\"\n (mouseenter)=\"activeTheadIndex = c\" (mouseleave)=\"activeTheadIndex = -1\">\n <div class=\"head\">\n <div class=\"label\">{{col}}</div>\n <div class=\"dropdown\" *ngIf=\"activeTheadIndex === c\">\n <button class=\"dropbtn\" (click)=\"showTheadMenu($event, c)\">></button>\n </div>\n </div>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of table.body; let r = index;\">\n <th (click)=\"clickRow(r)\" (mouseenter)=\"activeTbodyIndex = r\" (mouseleave)=\"activeTbodyIndex = -1\">\n <div class=\"head\">\n <div class=\"label\">{{r + 1}}</div>\n <div class=\"dropdown\" *ngIf=\"activeTbodyIndex === r\">\n <button class=\"dropbtn\" (click)=\"showTbodyMenu($event, r)\">></button>\n </div>\n </div>\n </th>\n <td [id]=\"cell.id\" *ngFor=\"let cell of row; let c = index; trackBy: trackByCell\"\n [class.focus]=\"cell === activatedCell\" [class.sel]=\"range?.includes(cell.row, cell.col)\"\n nssContentEditable [(model)]=\"cell.value\" (focus)=\"focus($event)\" (blur)=\"blur($event)\"\n (dblclick)=\"dblclick($event, cell)\" [attr.contenteditable]=\"cell.editable\">\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <ngx-context-menu #theadMenu (closed)=\"activeTheadIndex = -1\">\n <ngx-context-menu-item [label]=\"settings.options?.contextMenuColLabel?.INSERT_COLUMN_LEFT\"\n (click)=\"table.insertColumn($event)\">\n </ngx-context-menu-item>\n <ngx-context-menu-item [label]=\"settings.options?.contextMenuColLabel?.INSERT_COLUMN_RIGHT\"\n (click)=\"table.insertColumn($event + 1)\">\n </ngx-context-menu-item>\n <ngx-context-menu-item [divider]=\"true\"></ngx-context-menu-item>\n <ngx-context-menu-item [label]=\"settings.options?.contextMenuColLabel?.DELETE_COLUMN\"\n [disabled]=\"table.colCount <= 1\" (click)=\"table.deleteColumn($event)\">\n </ngx-context-menu-item>\n </ngx-context-menu>\n\n <ngx-context-menu #tbodyMenu (closed)=\"activeTbodyIndex = -1\">\n <ngx-context-menu-item [label]=\"settings.options?.contextMenuRowLabel?.INSERT_ROW_ABOVE\"\n (click)=\"table.insertRow($event)\">\n </ngx-context-menu-item>\n <ngx-context-menu-item [label]=\"settings.options?.contextMenuRowLabel?.INSERT_ROW_BELOW\"\n (click)=\"table.insertRow($event + 1)\">\n </ngx-context-menu-item>\n <ngx-context-menu-item [divider]=\"true\"></ngx-context-menu-item>\n <ngx-context-menu-item [label]=\"settings.options?.contextMenuRowLabel?.DELETE_ROW\"\n [disabled]=\"table.rowCount <= 1\" (click)=\"table.deleteRow($event)\">\n </ngx-context-menu-item>\n </ngx-context-menu>\n</ng-container>","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ContentEditableDirective } from './content-editable.directive';\nimport { NgxContextMenuItemComponent } from './ngx-context-menu-item.component';\nimport { NgxContextMenuComponent } from './ngx-context-menu.component';\nimport { NgxSmartSpreadsheetComponent } from './ngx-smart-spreadsheet.component';\n\n\n\n@NgModule({\n declarations: [\n NgxSmartSpreadsheetComponent,\n NgxContextMenuComponent,\n NgxContextMenuItemComponent,\n ContentEditableDirective\n ],\n imports: [\n CommonModule\n ],\n exports: [\n NgxSmartSpreadsheetComponent\n ]\n})\nexport class NgxSmartSpreadsheetModule { }\n","/*\n * Public API Surface of ngx-smart-spreadsheet\n */\n\nexport * from './lib/spreadsheet-settings';\nexport * from './lib/spreadsheet-settings-options';\nexport * from './lib/ngx-smart-spreadsheet.component';\nexport * from './lib/ngx-smart-spreadsheet.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["CHARS","LENGTH"],"mappings":"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