{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-RP19-4/src/components/widgets/lively-table.js"],"names":["Morph","ContextMenu","DragBehavior","LivelyTable","create","document","createElement","initialize","addEventListener","evt","onClick","lively","html","registerKeys","onMouseDown","onCopy","onCut","onPaste","onFocus","onFocusout","onExtentChanged","onContextMenu","isCell","cell","tagName","shiftKey","stopPropagation","preventDefault","menu","insertColumnAt","currentColumnIndex","removeColumnAt","insertRowAt","currentRowIndex","removeRowAt","openIn","body","table","get","setWidth","getExtent","x","setHeight","y","sleep","isInFocus","classList","remove","add","clearAllSelection","querySelectorAll","forEach","ea","removeAttribute","setFocusAndTextSelection","element","contentEditable","focus","sel","window","getSelection","livelyExample","setFromArray","rows","Array","from","column","indexOrLabel","index","Number","isInteger","header","indexOf","undefined","cells","map","row","cellsIn","cellAt","columnIndex","rowIndex","columnOfCell","parentElement","rowOfCell","clearSelection","doNotClearStart","currentCell","currentRow","currentColumn","startCell","startRowIndex","startColumnIndex","selectedCells","addSelectedCell","push","removeSelectedCell","filter","selectCell","multipleSelection","rowCells","initailizeCells","selectCellPrivate","selectRow","multiselection","selectColumn","changeSelection","columnDelta","rowDelta","removeSelection","columnA","columnB","rowA","rowB","changeSelectionBetween","columnMin","Math","min","columnMax","max","rowMin","rowMax","dispatchEvent","CustomEvent","detail","navigateRelative","newCell","setTextSelectionOfCellContents","range","createRange","setStart","i","textContent","length","e","collapse","removeAllRanges","addRange","onEnterDown","srcElement","wasEditing","isInEditing","onEscDown","contains","handleArrowKey","deltaColumn","deltaRow","onLeftDown","onRightDown","onUpDown","onDownDown","composedPath","onMouseMoveSelection","onMouseUpSelection","removeEventListener","cellArray","oldCell","insertBefore","style","width","focusedElement","activeElement","oldRow","newRow","innerHTML","asArray","eaRow","eaCell","maxColumnsIn","array","reduce","sum","setFromArrayClean","maxColumns","join","force","querySelector","setFromArrayAt","columnOffset","rowOffset","tableLength","appendChild","rowElement","fromRow","j","Error","asCSV","splitIntoRows","csv","separator","split","line","m","match","setFromCSV","setFromCSVat","asJSO","all","slice","obj","name","copySelectionAsTable","tmp","_","values","groupBy","sortBy","getSelectionAsCSV","getSelectionAsJSO","result","each","key","keyForCell","setFromJSO","jso","headers","Object","keys","unshift","data","clipboardData","setData","selString","toString","getData","livelyMigrate","other","selection","currenColumnIndex"],"mappings":"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","file":"lively-table.js","sourcesContent":["import Morph from 'src/components/widgets/lively-morph.js';\nimport ContextMenu from 'src/client/contextmenu.js';\nimport DragBehavior from \"src/client/morphic/dragbehavior.js\";\n\nexport default class LivelyTable extends Morph {\n\n  static create() {\n    // return Object.create(LivelyTable.prototype, {})\n    return document.createElement(\"lively-table\");\n  }\n\n  initialize() {\n    this.addEventListener(\"click\", evt => this.onClick(evt));\n    lively.html.registerKeys(this, \"Table\"\n    //  this.setAttribute(\"tabindex\", 0)\n\n    );this.addEventListener(\"mousedown\", evt => this.onMouseDown(evt));\n    this.addEventListener(\"copy\", evt => this.onCopy(evt));\n    this.addEventListener(\"cut\", evt => this.onCut(evt));\n    this.addEventListener(\"paste\", evt => this.onPaste(evt));\n\n    this.addEventListener(\"focus\", evt => this.onFocus(evt));\n    this.addEventListener(\"focusout\", evt => this.onFocusout(evt));\n\n    this.addEventListener(\"extent-changed\", evt => this.onExtentChanged(evt));\n    this.addEventListener('contextmenu', evt => this.onContextMenu(evt), false);\n  }\n\n  isCell(cell) {\n    return cell.tagName == \"TD\" || cell.tagName == \"TH\";\n  }\n\n  onContextMenu(evt) {\n    if (!evt.shiftKey) {\n      evt.stopPropagation();\n      evt.preventDefault();\n      var menu = new ContextMenu(this, [[\"add column\", () => this.insertColumnAt(this.currentColumnIndex)], [\"remove column\", () => this.removeColumnAt(this.currentColumnIndex)], [\"add row\", () => this.insertRowAt(this.currentRowIndex)], [\"remove row\", () => this.removeRowAt(this.currentRowIndex)]]);\n      menu.openIn(document.body, evt, this);\n      return true;\n    }\n  }\n\n  onExtentChanged() {\n    var table = this.get(\"table\");\n    lively.setWidth(table, lively.getExtent(this).x);\n    lively.setHeight(this, lively.getExtent(table).y, true);\n  }\n\n  async onFocusout() {\n    // we are about to lose our focus lets wait a bit\n    await lively.sleep(0\n    // if we really lost our focus... \n    );if (!this.isInFocus()) {\n      this.classList.remove(\"active\");\n    }\n  }\n\n  onFocus() {\n    if (this.isInFocus()) {\n      this.classList.add(\"active\");\n    }\n  }\n\n  clearAllSelection() {\n    this.querySelectorAll(\"td\").forEach(ea => {\n      ea.classList.remove(\"editing\");\n      ea.removeAttribute(\"contentEditable\"\n      // ea.contentEditable = false\n\n      );\n    });\n  }\n\n  setFocusAndTextSelection(element) {\n    if (!element) return;\n    this.clearAllSelection();\n    element.contentEditable = true;\n    element.focus();\n    var sel = window.getSelection\n    // sel.selectAllChildren(element)\n    ();\n  }\n\n  livelyExample() {\n    this.setFromArray([['A', 'B', 'C', 'D', 'E'], ['First', 'Second', 'Third', 'Fourth', ''], ['Hello', 'World', '', '', ''], ['Foo', 'Bar', '', '', '']]);\n  }\n\n  rows() {\n    return Array.from(this.querySelectorAll(\"tr\"));\n  }\n\n  column(indexOrLabel) {\n    var index;\n    if (Number.isInteger(indexOrLabel)) {\n      index = indexOrLabel;\n    } else {\n      index = this.header().indexOf(indexOrLabel);\n      if (index == -1) return undefined;\n    }\n    return this.cells().map(row => row[index]);\n  }\n\n  cells() {\n    return this.rows().map(ea => this.cellsIn(ea));\n  }\n\n  cellsIn(row) {\n    return Array.from(row.querySelectorAll(\"td,th\"));\n  }\n\n  cellAt(columnIndex, rowIndex) {\n    var row = this.rows()[rowIndex];\n    if (!row) return undefined;\n    return row.querySelectorAll(\"td,th\")[columnIndex];\n  }\n\n  columnOfCell(cell) {\n    return this.cellsIn(cell.parentElement).indexOf(cell);\n  }\n\n  rowOfCell(cell) {\n    var row = cell.parentElement;\n    return this.rows().indexOf(row);\n  }\n\n  clearSelection(doNotClearStart) {\n    if (this.currentCell) {\n      this.currentCell.removeAttribute(\"contentEditable\");\n      this.currentCell.classList.remove(\"table-selected\");\n    }\n    if (!doNotClearStart) {\n      this.currentCell = undefined;\n      this.currentRow = undefined;\n      this.currentRowIndex = undefined;\n      this.currentColumnIndex = undefined;\n      this.currentColumn = undefined;\n      this.startCell = undefined;\n      this.startRowIndex = undefined;\n      this.startColumnIndex = undefined;\n    }\n\n    this.querySelectorAll(\"td,th\").forEach(ea => {\n      ea.classList.remove(\"table-selected\");\n      ea.classList.remove(\"start-selection\");\n    });\n\n    this.selectedCells = [];\n  }\n\n  addSelectedCell(element) {\n    if (!this.selectedCells) this.selectedCells = [];\n    if (this.selectedCells.indexOf(element) < 0) {\n      this.selectedCells.push(element);\n    }\n    element.classList.add(\"table-selected\");\n  }\n\n  removeSelectedCell(element) {\n    if (!this.selectedCells) this.selectedCells = [];\n    this.selectedCells.push(element);\n    this.selectedCells = this.selectedCells.filter(ea => ea !== element);\n    element.classList.remove(\"table-selected\");\n  }\n\n  selectCell(element, multipleSelection) {\n    if (!this.isCell(element)) return;\n    if (this.currentCell && this.currentCell != element) {\n      this.currentCell.contentEditable = false;\n      if (!multipleSelection) this.currentCell.classList.remove(\"table-selected\");\n    }\n    if (!element.parentElement) return; // cell must be one of mine\n\n    this.currentCell = element;\n    const {\n      rows,\n      row,\n      rowCells\n    } = this.initailizeCells(element);\n\n    this.currentRow = element.parentElement;\n    this.currentRowIndex = rows.indexOf(row);\n    this.currentColumnIndex = rowCells.indexOf(element);\n    this.currentColumn = rows.map(ea => ea[this.currentColumnIndex]);\n\n    this.selectCellPrivate(multipleSelection, rows, row, rowCells, element);\n  }\n\n  initailizeCells(element) {\n    let rows = this.rows(),\n        row = element.parentElement,\n        rowCells = this.cellsIn(row);\n    return {\n      rows,\n      row,\n      rowCells\n    };\n  }\n\n  selectCellPrivate(multipleSelection, rows, row, rowCells, element) {\n    if (multipleSelection) {\n      this.addSelectedCell(this.currentCell);\n    } else {\n      if (this.selectedCells) this.selectedCells.forEach(ea => {\n        ea.classList.remove(\"start-selection\");\n        ea.classList.remove(\"table-selected\");\n      });\n      this.selectedCells = [this.currentCell];\n      this.currentCell.classList.add(\"table-selected\");\n      this.startCell = this.currentCell;\n      this.startRowIndex = rows.indexOf(row);\n      this.startColumnIndex = rowCells.indexOf(element);\n      this.startCell.classList.add(\"start-selection\");\n    }\n  }\n\n  selectRow(rowIndex, multiselection) {\n    if (!multiselection) {\n      this.clearSelection();\n    }\n    this.cells()[rowIndex].forEach(cell => {\n      this.selectCell(cell, true);\n    });\n  }\n\n  selectColumn(columnIndex, multiselection) {\n    if (!multiselection) {\n      this.clearSelection();\n    }\n    this.cells().forEach(row => {\n      this.selectCell(row[columnIndex], true);\n    });\n  }\n\n  changeSelection(columnDelta, rowDelta, removeSelection) {\n    var cells = this.cells();\n    let columnA = this.startColumnIndex,\n        columnB = this.currentColumnIndex + columnDelta,\n        rowA = this.startRowIndex,\n        rowB = this.currentRowIndex + rowDelta;\n    this.changeSelectionBetween(columnA, columnB, rowA, rowB, removeSelection);\n  }\n\n  changeSelectionBetween(columnA, columnB, rowA, rowB, removeSelection) {\n    var cells = this.cells(),\n        columnMin = Math.min(columnA, columnB),\n        columnMax = Math.max(columnA, columnB),\n        rowMin = Math.min(rowA, rowB),\n        rowMax = Math.max(rowA, rowB);\n\n    for (var rowIndex = rowMin; rowIndex <= rowMax; rowIndex++) {\n      var row = cells[rowIndex];\n\n      if (row) {\n        // lively.notify(\"change selection \" + columnMin + \" \" + columnMax)\n\n        for (var columnIndex = columnMin; columnIndex <= columnMax; columnIndex++) {\n          var cell = row[columnIndex];\n          // lively.showElement(cell)\n          if (cell) {\n            if (removeSelection) {\n              this.removeSelectedCell(cell);\n            } else {\n              this.addSelectedCell(cell);\n            }\n          }\n        }\n      }\n    }\n\n    this.dispatchEvent(new CustomEvent(\"selection-changed\", { detail: { table: this } }));\n  }\n\n  navigateRelative(columnDelta, rowDelta, multipleSelection) {\n    if (this.currentColumnIndex === undefined) return;\n    var cells = this.cells();\n    if (multipleSelection) {\n      this.changeSelection(-columnDelta, -rowDelta, true);\n\n      this.changeSelection(columnDelta, rowDelta);\n    }\n    var row = cells[this.currentRowIndex + rowDelta];\n    if (!row) return;\n    var newCell = row[this.currentColumnIndex + columnDelta];\n\n    if (newCell) {\n      this.selectCell(newCell, multipleSelection);\n    }\n  }\n\n  setTextSelectionOfCellContents(cell) {\n    var range = document.createRange();\n    var sel = window.getSelection();\n    try {\n      // #TODO find a more correct way to set selection.... \n      range.setStart(cell, 0);\n      // I have problems setting this to the end... so lets go as far as we can in small steps\n      for (var i = 0; i <= cell.textContent.length; i++) {\n        range.setStart(cell, i);\n      }\n    } catch (e) {\n      // do nothing..\n    }\n    range.collapse(true);\n    sel.removeAllRanges();\n    sel.addRange(range);\n  }\n\n  //\n  // Keyboard Events\n  //\n\n  onEnterDown(evt) {\n\n    if (!this.currentCell) return;\n    var cell = evt.srcElement;\n    if (this.currentCell != cell) return;\n    var wasEditing = this.isInEditing(cell);\n\n    this.clearSelection(true);\n    this.setFocusAndTextSelection(cell);\n    this.setTextSelectionOfCellContents(cell);\n\n    if (wasEditing) {\n      cell.classList.remove(\"editing\");\n    } else {\n      cell.classList.add(\"editing\");\n    }\n    evt.stopPropagation();\n    evt.preventDefault();\n  }\n\n  onEscDown(evt) {\n    if (!this.currentCell) return;\n    this.setFocusAndTextSelection(this.currentCell);\n    evt.stopPropagation();\n    evt.preventDefault();\n  }\n\n  isInEditing(cell) {\n    return cell.classList.contains(\"editing\");\n  }\n\n  handleArrowKey(evt, deltaColumn, deltaRow) {\n    if (this.isInEditing(this.currentCell)) return;\n    this.navigateRelative(deltaColumn, deltaRow, evt.shiftKey == true);\n    this.setFocusAndTextSelection(this.currentCell);\n    evt.stopPropagation();\n    evt.preventDefault();\n  }\n\n  onLeftDown(evt) {\n    this.handleArrowKey(evt, -1, 0);\n  }\n\n  onRightDown(evt) {\n    this.handleArrowKey(evt, 1, 0);\n  }\n\n  onUpDown(evt) {\n    this.handleArrowKey(evt, 0, -1);\n  }\n\n  onDownDown(evt) {\n    this.handleArrowKey(evt, 0, 1);\n  }\n\n  onMouseDown(evt) {\n\n    var cell = evt.composedPath()[0];\n    if (cell === this.currentCell) return;\n\n    if (cell !== this.currentCell) {\n      this.clearSelection(true);\n      this.selectCell(cell);\n    }\n\n    lively.addEventListener(\"LivelyTable\", document.body, \"mousemove\", evt => this.onMouseMoveSelection(evt));\n    lively.addEventListener(\"LivelyTable\", document.body, \"mouseup\", evt => this.onMouseUpSelection(evt\n\n    // evt.stopPropagation()\n    ));evt.preventDefault\n\n    // lively.notify(\"mouse down\")\n\n    ();\n  }\n\n  onMouseMoveSelection(evt) {\n    var cell = evt.composedPath()[0];\n    if (this.isCell(cell)) {\n      if (cell === this.currentCell) return;\n\n      this.clearSelection(true);\n\n      var column = this.columnOfCell(cell);\n      var row = this.rowOfCell(cell);\n\n      this.changeSelectionBetween(this.startColumnIndex, column, this.startRowIndex, row\n\n      // lively.notify(\"mouse move\")\n      );\n    }\n  }\n\n  //\n  // Mouse Events\n  //\n\n  onMouseUpSelection(evt) {\n    lively.removeEventListener(\"LivelyTable\", document.body, \"mousemove\");\n    lively.removeEventListener(\"LivelyTable\", document.body, \"mouseup\");\n\n    var cell = evt.composedPath()[0];\n    if (cell === this.currentCell) return;\n\n    this.setFocusAndTextSelection(this.currentCell\n    // var sel = window.getSelection();\n    // sel.removeAllRanges();\n    // var range = document.createRange();\n    // this.currentCell.focus()\n    // range.selectNodeContents(this.currentCell);  \n    // sel.addRange(range);\n    );\n  }\n\n  onClick(evt) {\n    if (this.currentCell === evt.srcElement) {\n      this.currentCell.contentEditable = true; // edit only on second click into selection\n    } else {\n      this.selectCell(evt.srcElement);\n    }\n\n    this.setFocusAndTextSelection(this.currentCell);\n\n    evt.stopPropagation();\n    evt.preventDefault();\n  }\n\n  insertColumnAt(index) {\n    this.cells().forEach(cellArray => {\n      var oldCell = cellArray[index];\n      var newCell = document.createElement(oldCell.tagName);\n      oldCell.parentElement.insertBefore(newCell, oldCell);\n      newCell.style.width = oldCell.style.width;\n    });\n  }\n\n  removeColumnAt(index) {\n    this.cells().forEach(cellArray => {\n      var oldCell = cellArray[index];\n      oldCell.remove();\n    });\n  }\n\n  isInFocus(focusedElement = document.activeElement) {\n    if (focusedElement === this) return true;\n    if (!focusedElement) return false;\n    return this.isInFocus(focusedElement.parentElement);\n  }\n\n  insertRowAt(index) {\n    var oldRow = this.rows()[index];\n    var newRow = document.createElement(\"tr\");\n    newRow.innerHTML = oldRow.innerHTML;\n    newRow.querySelectorAll(\"th,td\").forEach(ea => ea.textContent = \"\");\n    oldRow.parentElement.insertBefore(newRow, oldRow);\n    return newRow;\n  }\n\n  removeRowAt(index) {\n    var oldRow = this.rows()[index];\n    oldRow.remove();\n  }\n\n  asArray() {\n    return Array.from(this.querySelectorAll(\"tr\")).map(eaRow => {\n      return Array.from(eaRow.querySelectorAll(\"td,th\")).map(eaCell => eaCell.textContent);\n    });\n  }\n\n  maxColumnsIn(array) {\n    return array.reduce((sum, ea) => Math.max(sum, ea.length), 0);\n  }\n\n  setFromArrayClean(array) {\n    var maxColumns = this.maxColumnsIn(array);\n    this.innerHTML = \"<table>\" + array.map((row, rowIndex) => {\n      var html = \"\";\n      for (var i = 0; i < maxColumns; i++) {\n        var ea = row[i] !== undefined ? row[i] : \"\";\n        html += rowIndex == 0 ? // header \n        `<th style=\"width: 40px\">${ea}</th>` : `<td>${ea}</th>`;\n      }\n      return \"<tr>\" + html + \"</tr>\";\n    }).join(\"\\n\") + \"</table>\";\n  }\n\n  setFromArray(array, force) {\n    if (!this.querySelector(\"tbody\") || force) {\n      this.setFromArrayClean(array);\n    } else {\n      var maxColumns = this.maxColumnsIn(array);\n      this.rows().filter((ea, index) => index >= array.length).forEach(ea => ea.remove());\n      this.cells().forEach(row => {\n        row.filter((cell, index) => {\n          return index >= maxColumns;\n        }).forEach(ea => ea.remove());\n      });\n      this.querySelectorAll(\"td,th\").forEach(ea => ea.textContent = \"\");\n      this.setFromArrayAt(array, 0, 0);\n    }\n  }\n\n  setFromArrayAt(array, columnOffset, rowOffset) {\n    var cells = this.cells();\n    var header = cells[0];\n    var tableLength = columnOffset + array[0].length;\n    // lively.notify(\"grow table? \" + tableLength  + \" \" + header.length + \" | \" + columnOffset + \" \" + array.length )\n    if (tableLength > header.length) {\n      var rows = this.rows\n      // we have to grow wider\n      ();rows.forEach((row, index) => {\n        for (var i = 0; i < tableLength - header.length; i++) {\n          var cell = document.createElement(\"td\");\n          row.appendChild(cell);\n        }\n      }\n      // we changed this contents and have to update\n      );cells = this.cells();\n      header = cells[0];\n    }\n    for (var i = 0; i < array.length; i++) {\n      var row = cells[rowOffset + i];\n      if (!row) {\n        var rowElement = document.createElement(\"tr\");\n        rowElement.innerHTML = header.map(ea => \"<td></td>\").join(\"\");\n        this.querySelector(\"tbody\").appendChild(rowElement);\n        var row = rowElement.querySelectorAll(\"td\");\n        cells.push(row);\n      }\n      var fromRow = array[i];\n      for (var j = 0; j < fromRow.length; j++) {\n        var index = columnOffset + j;\n        var cell = row[index];\n        if (!cell) throw new Error(\"No cell at \" + index + \", in \" + row);\n        cell.textContent = fromRow[j];\n      }\n    }\n  }\n\n  asCSV() {\n    return this.asArray().map(eaRow => eaRow.join(\"\\t\")).join(\"\\n\");\n  }\n\n  splitIntoRows(csv, separator = /[;\\t,]/) {\n    return csv.split(\"\\n\").map(line => {\n      return line.split(separator).map(ea => {\n        var m = ea.match(/^\"(.*)\"$/);\n        if (m) {\n          return m[1];\n        } else {\n          return ea;\n        }\n      });\n    });\n  }\n\n  setFromCSV(csv, separator) {\n    this.setFromArray(this.splitIntoRows(csv, separator));\n  }\n  setFromCSVat(csv, column, row, separator) {\n    this.setFromArrayAt(this.splitIntoRows(csv, separator), column, row);\n  }\n\n  asJSO() {\n    var all = this.asArray();\n    var header = all[0];\n    return all.slice(1).map(row => {\n      var obj = {};\n      row.forEach((ea, index) => {\n        var name = header[index];\n        obj[name] = ea;\n      });\n      return obj;\n    });\n  }\n\n  copySelectionAsTable() {\n    var tmp = LivelyTable.create();\n    tmp.setFromArray(_.values(_.groupBy(this.selectedCells, ea => this.rowOfCell(ea))).map(row => _.sortBy(row, ea => this.columnOfCell(ea)).map(ea => ea.textContent)));\n    return tmp;\n  }\n\n  getSelectionAsCSV() {\n    return this.copySelectionAsTable().asCSV();\n  }\n\n  getSelectionAsJSO() {\n    if (!this.selectedCells) return [];\n\n    let result = [];\n\n    this.selectedCells.forEach(each => {\n      let row = this.rowOfCell(each);\n      let key = this.keyForCell(each);\n      if (!result[row]) result[row] = {};\n      result[row][key] = each.textContent;\n    });\n\n    return result;\n  }\n\n  keyForCell(cell) {\n    return this.cells()[0][this.columnOfCell(cell)].textContent;\n  }\n\n  /*\n   * set the contents of the table from a JSO where the keys of each object will become the header\n   * example: [{a: 1, b: 2}, {a: 4, b: 5, c: 6}]\n   */\n  setFromJSO(jso) {\n    if (!jso) return;\n    var headers = [];\n    var rows = jso.map(obj => {\n      obj = obj || {};\n      // add headers that are introduced in that row\n      Object.keys(obj).forEach(key => {\n        if (headers.indexOf(key) < 0) {\n          headers.push(key);\n        }\n      });\n      return headers.map(key => {\n        return obj[key];\n      });\n    });\n    rows.unshift(headers);\n    this.setFromArray(rows);\n  }\n\n  onCopy(evt) {\n    // lively.notify(\"on copy\")\n\n    if (!this.currentCell) return;\n    if (this.selectedCells && this.selectedCells.length > 1) {\n      var data = this.getSelectionAsCSV\n      // lively.notify(\"data \" + data)\n      ();evt.clipboardData.setData('text/plain', data);\n    } else {\n      var selString = window.getSelection().toString();\n      if (selString.length > 0) {\n        evt.clipboardData.setData('text/plain', selString);\n      } else {\n        evt.clipboardData.setData('text/plain', this.currentCell.textContent);\n      }\n    }\n    evt.stopPropagation();\n    evt.preventDefault();\n  }\n\n  onCut(evt) {\n    this.onCopy(evt);\n    if (this.selectedCells && this.selectedCells.length > 1) {\n      // lively.notify(\"cut \" + this.selectedCells.length)\n      this.selectedCells.forEach(ea => {\n        ea.textContent = \"\";\n      });\n    } else {\n      this.currentCell.textContent = \"\";\n    }\n  }\n\n  onPaste(evt) {\n    // lively.notify(\"on paste\")\n\n    if (!this.currentCell) return;\n\n    var cells;\n    if (this.selectedCells && this.selectedCells.length > 1) {\n      // lively.notify(\"cut \" + this.selectedCells.length)\n      cells = this.selectedCells;\n    } else {\n      cells = [this.currentCell];\n    }\n\n    var data = evt.clipboardData.getData('text/plain');\n\n    this.selectedCells.map(ea => {\n      // cells will change so get them early... \n      return { column: this.columnOfCell(ea), row: this.rowOfCell(ea) };\n    }).forEach(ea => {\n      this.setFromCSVat(data, ea.column, ea.row);\n    });\n    evt.stopPropagation();\n    evt.preventDefault();\n  }\n\n  livelyMigrate(other) {\n    this.clearSelection();\n    var selection = this.cellAt(other.currenColumnIndex, other.currentRowIndex);\n    if (selection) this.selectCell(selection);\n  }\n\n  header() {\n    return this.asArray()[0];\n  }\n\n}"]}