{"version":3,"sources":["https://lively-kernel.org/lively4/swd21-particles/src/components/widgets/lively-bibtex-editor.js"],"names":["Parser","Morph","ContextMenu","Strings","Bibliography","LivelyBibtexEditor","initialize","setAttribute","windowTitle","registerButtons","lively","html","registerKeys","get","getContent","toBibtex","detailsToJSON","updateView","merge","onMergeButton","addEventListener","evt","onCopy","onCut","onPaste","draggable","onDragStart","onDrop","onDragOver","onClick","table","detailsTable","isActiveElement","isMerging","source","rows","selectedOrCurrentRows","length","preventDefault","stopPropagation","flatEntries","map","row","rowToJSO","entries","flatEntriesToBibtexEntries","dataTransfer","setData","setDragImage","getData","insertData","dropEffect","isEditingCells","path","composedPath","includes","focusWithoutScroll","onKeyDown","ctrlKey","key","onSave","selectedEntries","Array","from","querySelectorAll","onContextMenu","shiftKey","isEditing","currentEntry","getAttribute","src","url","findEntryInPath","find","ea","tagName","toUpperCase","fixKeyCases","json","result","citationKey","entryType","entryTags","toLowerCase","bibtexToFlatEntries","toJSON","flatEntryToBibtexEntry","Object","keys","sort","flatEntriesToBibtex","loadEntries","files","loadFile","e","error","textContent","notify","replace","innerHTML","appendChild","setFromJSO","setDetailsEntry","reset","onTableCellSelected","onFinishEditingCell","selectedEntry","asJSO","currentRowIndex","applyDetails","entry","getDetailsEntry","all","colorMergeTable","colorDetailsTable","bibtex","JSON","stringify","isEditingDetails","allParents","activeElement","selectedOrCurrentCells","cells","selectedCells","push","currentCell","currentCells","rowOfCell","uniq","Error","saveFile","success","openBrowser","onSaveButton","sortByField","fieldName","sortBy","onSortByKeyButton","onSortByYearButton","onCancelButton","style","position","pos","getPosition","extent","getExtent","parentElement","insertBefore","remove","setPosition","setExtent","a","original","originalEntries","other","otherEntries","allKeys","concat","onFinishDetailsEditingCell","setFromArray","asArray","column","otherURL","prompt","mergeOtherURL","onCombineButton","mergeOtherEntries","onFinishButton","finishMerge","onNewCitationKeyButton","flatEntry","bibtexEntry","generateCitationKey","onBrowseButton","clipboardData","data","insert","arr","index","newitems","slice","rowInsert","warn","newentries","openInspector","merged","mergedEntries","assign","originalEntry","hidden","colorA","colorB","colorM","header","shift","indexOf","i","m","b","backgroundColor","name","cell","columnTitles","finished","f","clone","livelySource","thiss","livelyExample","lively4url","overflow"],"mappings":"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","file":"lively-bibtex-editor.js","sourcesContent":["import Parser from 'src/external/bibtexParse.js';\nimport Morph from 'src/components/widgets/lively-morph.js';\nimport ContextMenu from 'src/client/contextmenu.js'\nimport Strings from 'src/client/strings.js'  \nimport Bibliography from 'src/client/bibliography.js';\n/*MD\n# Lively Bibtex Editor\n\nMD*/\n\nexport default class LivelyBibtexEditor extends Morph {\n  async initialize() {\n    \n    this.setAttribute(\"tabindex\", 0) // just ensure focusabiltity\n    this.windowTitle = \"LivelyBibtexEditor\";\n    this.registerButtons()\n    lively.html.registerKeys(this, \"Bibtex\")\n    \n    // change indicator will observe changes in HTML, but \"getContent\" will check for plausibility....\n    this.get('#content-change-indicator').getContent = () => this.toBibtex()\n    this.get('#details-change-indicator').getContent = () => this.detailsToJSON()\n\n    await this.updateView()\n    \n    if (this.merge) {\n      this.onMergeButton()\n    }\n    \n    this.addEventListener(\"copy\", evt => this.onCopy(evt), true);\n    this.addEventListener(\"cut\", evt => this.onCut(evt), true);\n    this.addEventListener(\"paste\", evt => this.onPaste(evt), true);\n\n    this.draggable = true;\n    this.addEventListener(\"dragstart\", evt => this.onDragStart(evt));\n\n    this.addEventListener(\"drop\", evt => this.onDrop(evt))\n    this.addEventListener(\"dragover\", evt => this.onDragOver(evt))\n    \n    this.addEventListener(\"click\", evt => this.onClick(evt));\n  }\n \n//   checkForContentChanges() {\n    \n//     var source = this.toBibtex()\n//     if (source !== this.lastBibtex) {\n//       this.contentChanged = true    \n//     } else {\n//       this.contentChanged = false\n//     }\n//     this.updateChangeIndicator()\n//   }\n  \n  async onDragStart(evt) {\n    if (!this.table) return \n    if (this.detailsTable && lively.isActiveElement(this.detailsTable)) return   \n    if (this.isMerging()) return\n    \n    let source;\n    let rows = this.selectedOrCurrentRows()  \n    if (rows.length == 0) {\n      // nothing to drag\n      evt.preventDefault();\n      evt.stopPropagation();        \n      return\n    }\n    \n    let flatEntries = rows.map(row => this.table.rowToJSO(row))\n    \n    let entries = this.flatEntriesToBibtexEntries(flatEntries)\n    source = Parser.toBibtex(entries, false)\n    evt.dataTransfer.setData(\"text/plain\", source);\n    evt.dataTransfer.setDragImage(rows[0], 0, 0); \n  }\n  \n  onDrop(evt) {\n    if (this.isMerging()) return\n    evt.preventDefault();\n    evt.stopPropagation();\n\n    var source = evt.dataTransfer.getData(\"text\")\n    this.insertData(source) \n  }\n  \n  onDragOver(evt) {\n    if (this.isMerging()) return\n    // here we could show a preview of what would happen \n    evt.dataTransfer.dropEffect = \"copy\";\n  }\n\n  isEditingCells() {\n    return this.table && this.table.isEditingCells()\n  }\n  \n  \n  onClick(evt) {\n    var path = evt.composedPath()\n    // we already have a focus here?\n    if (!this.isEditingCells()) {\n      if(this.detailsTable && path.includes(this.detailsTable)) {\n        // nothing...\n      } else {\n        \n\n        \n        \n        lively.focusWithoutScroll(this.get(\"#copyHack\"))       \n      }\n    } \n    \n  }\n  \n  \n  onKeyDown(evt) {\n    if (evt.ctrlKey && evt.key == \"s\") {\n      evt.stopPropagation()\n      evt.preventDefault()\n      this.onSave()\n    }\n  }\n  \n  selectedEntries() {\n    return Array.from(this.querySelectorAll(\"lively-bibtex-entry.selected\"))\n  }\n  \n  onContextMenu(evt) {\n    if (!evt.shiftKey) {\n      evt.stopPropagation();\n      evt.preventDefault();\n      return \n    }\n  }\n  \n\n  \n  isEditing() {\n    return this.currentEntry && (this.currentEntry.getAttribute(\"mode\") == \"edit\")\n  }\n  \n  \n  get src() {\n    return this.getAttribute(\"src\")\n  }\n\n  set src(url) {\n    this.setAttribute(\"src\", url)\n    this.updateView()\n  }\n  \n  \n  get merge() {\n    return this.getAttribute(\"merge\")\n  }\n\n  set merge(url) {\n    this.setAttribute(\"merge\", url)\n  }\n  \n  findEntryInPath(path) {\n    return path.find(ea => ea.tagName == \"lively-bibtex-entry\".toUpperCase())\n  }\n\n  fixKeyCases(json) {\n    return json.map(ea => {\n      var result = ({citationKey: ea.citationKey, entryType: ea.entryType, entryTags: {}})\n      if (ea.entryTags) {\n        for(var key in ea.entryTags) {\n          result.entryTags[key.toLowerCase()] = ea.entryTags[key]\n        }\n      }\n      return result\n    })\n  }\n\n  bibtexToFlatEntries(source) {\n    var json = Parser.toJSON(source);\n    var entries = this.fixKeyCases(json)      \n    var flatEntries = entries.map(ea => {\n      var row = {citationKey: ea.citationKey, entryType: ea.entryType} \n      for(var key in ea.entryTags) {\n        if(key && ea.entryTags[key]) {\n          row[key] = ea.entryTags[key]\n        }\n      }\n      return row \n    })\n    return flatEntries\n  }\n\n  \n  flatEntryToBibtexEntry(ea) {\n    var row = {\n        citationKey: ea.citationKey, \n        entryType: ea.entryType, \n        entryTags: []\n      } \n      for(var key of Object.keys(ea).sort()) {\n        if (key !== \"citationKey\" \n            && key !== \"entryType\" \n            && key !== \"entryTags\"  \n            && key && ea[key]) {\n          row.entryTags[key] = ea[key]\n        }\n      }\n    return row\n  }\n  \n  flatEntriesToBibtexEntries(flatEntries) {\n    return flatEntries.map(ea => {\n      return this.flatEntryToBibtexEntry(ea) \n    })\n  }\n  \n  flatEntriesToBibtex(flatEntries) {\n    var entries = this.flatEntriesToBibtexEntries(flatEntries)\n    return Parser.toBibtex(entries, false);\n  }\n  \n  async loadEntries(url) {\n    var source = await lively.files.loadFile(url)\n    try {\n      var flatEntries  = this.bibtexToFlatEntries(source)\n    } catch(e) {\n      lively.error(\"Could not load \" + url)\n      return\n    }\n    return flatEntries\n  }\n\n  async updateView() { \n    let flatEntries\n    if (!this.src) {\n      var source = this.textContent\n      try  {\n        flatEntries  = this.bibtexToFlatEntries(source)\n      } catch(e) {\n        lively.notify(\"could not parse: \" + source)\n        return \n      }\n    } else {\n      this.get(\"#srcLabel\").textContent = this.src.replace(/.*\\//,\"\")\n      flatEntries = await this.loadEntries(this.src)\n    }\n    this.get('#content').innerHTML = \"\"\n    var table = await (<lively-table></lively-table>)\n    this.table = table\n    this.get('#content').appendChild(table)\n    table.setFromJSO(flatEntries, true)\n    this.setDetailsEntry(null)\n    this.get(\"lively-change-indicator\").reset()\n    table.addEventListener(\"cell-selected\", (evt) => this.onTableCellSelected(evt))\n    // table.addEventListener(\"start-editing-cell\", (evt) => this.onStartEditingCell(evt))\n    table.addEventListener(\"finish-editing-cell\", (evt) => this.onFinishEditingCell(evt))\n  }\n  \n  selectedEntry() {\n    return this.table.asJSO()[this.table.currentRowIndex - 1]\n  }\n  \n  applyDetails() {\n    var entry = this.getDetailsEntry()\n    if (!entry) return\n    var all = this.table.asJSO()\n    all[this.table.currentRowIndex - 1] = entry\n    this.table.setFromJSO(all, true)\n    if (this.isMerging()) {\n      this.colorMergeTable()\n      this.colorDetailsTable()\n    }\n  }\n  \n  toBibtex() {\n    var flatEntries = this.table.asJSO()\n    var bibtex = this.flatEntriesToBibtex(flatEntries)\n    return bibtex\n  }\n  \n  detailsToJSON() {\n    var entry = this.getDetailsEntry()\n    return entry && JSON.stringify(entry)      \n  }\n  \n  isEditingDetails() {\n    return lively.allParents(lively.activeElement()).includes(this.detailsTable)\n  }\n  \n  selectedOrCurrentCells() {\n    var cells = []\n    if (this.table.selectedCells) {\n      cells.push(...this.table.selectedCells)   \n    } else if(this.currentCell) {\n      cells.push(this.currentCells)\n    }\n    return cells    \n  }\n  \n  selectedOrCurrentRows(){\n    var rows = this.selectedOrCurrentCells()\n      .map(ea => this.table.rowOfCell(ea))\n      .uniq()\n      .map(ea => this.table.rows()[ea])\n    return rows\n  }\n  \n  async onSave() {\n    if (this.isMerging()) return lively.notify(\"Merge in process\")\n    if (this.isEditingDetails()) {\n      this.applyDetails()\n    } else {\n      this.setDetailsEntry(this.selectedEntry())\n    }\n    if (!this.table) return\n    \n    try {\n      var bibtex = this.toBibtex()\n      Parser.toJSON(bibtex) // just try to parse it again  \n    } catch(e) {\n      lively.error(\"BibtexEditor\", \"Could not save because of rror: \" + e)\n      return\n    }\n    if (!this.src) throw new Error(\"BibtexEditor src missing\" )\n    await lively.files.saveFile(this.src, bibtex)\n    lively.success(\"saved bibtex\", this.src, 5, \n                                 () => lively.openBrowser(this.src))\n    \n    this.get('#content-change-indicator').reset()\n    this.get('#details-change-indicator').reset()\n\n  }\n  \n  onSaveButton() {\n    this.onSave()\n  }\n  \n  \n  sortByField(fieldName) {\n    if (!this.table) return;\n    var flatEntries = this.table.asJSO()\n    flatEntries = flatEntries.sortBy(ea => ea[fieldName])\n    this.table.setFromJSO(flatEntries, true)\n    this.setDetailsEntry(null)\n  }\n  \n  onSortByKeyButton() {\n    this.sortByField(\"citationKey\")\n  }\n  \n  onSortByYearButton() {\n    this.sortByField(\"year\")\n  }\n  \n  async onCancelButton() {\n    /*MD  #Refactor #Duplication with <edit://src/components/widgets/lively-bibtex.js#onEditButton> MD*/\n    if (this.style.position) {\n      var pos = lively.getPosition(this)\n      var extent = lively.getExtent(this)\n    }\n    var bibtex = await (<lively-bibtex></lively-bibtex>)\n    if (this.src) {\n      bibtex.setAttribute(\"src\", this.src)\n    } else {\n      bibtex.textContent = this.textContent\n    }\n    this.parentElement.insertBefore(bibtex, this)\n    bibtex.updateView()\n    this.remove()\n    if (pos) {\n      lively.setPosition(bibtex, pos)\n      lively.setExtent(bibtex, extent)\n    }\n  }\n  \n  async onTableCellSelected(evt) {\n    this.setDetailsEntry(this.selectedEntry())\n    if (this.isMerging()) this.colorMergeTable()\n  }\n  \n  async setDetailsEntry(entry) {\n    this.get(\"#details\").innerHTML = \"\" \n    if (entry) {\n      var detailsTable = await (<lively-table></lively-table>)\n      this.detailsTable = detailsTable\n      this.get('#details').appendChild(detailsTable)\n      var a = []\n      if (this.isMerging()) {\n        a.push([\"\", \"A\", \"M\", \"B\"])\n        let original = this.originalEntries.find(ea => ea.citationKey == entry.citationKey) || {} \n        let other  = this.otherEntries.find(ea => ea.citationKey == entry.citationKey) || {}\n        let allKeys = (Object.keys(original).concat(Object.keys(other)).uniq())\n        for(let key of allKeys) {\n          if (key == 0) {\n          } else {\n            a.push([key, original[key], entry[key], other[key]])\n          }\n        }\n      } else {\n        for(var key in entry) {\n          if (key && entry[key]) {\n            a.push([key, entry[key]])\n          }\n        }\n      }\n      \n      this.detailsTable.addEventListener(\"finish-editing-cell\", (evt) => this.onFinishDetailsEditingCell(evt))\n      \n      detailsTable.setFromArray(a)      \n    }\n    this.get('#details-change-indicator').reset()\n    \n    if (this.isMerging()) {\n      this.colorDetailsTable()\n    }\n  }\n  \n  getDetailsEntry() {\n    if (!this.detailsTable) return;\n    var a = this.detailsTable.asArray()\n    var entry = {}\n    var column = this.isMerging() ? 2 : 1;\n    for(var ea of a) {\n      if (ea[0]) {\n        entry[ea[0]] = ea[column]\n      }\n    }\n    return entry    \n  }\n \n  onFinishEditingCell() {\n    lively.notify(\"update details\")\n    this.setDetailsEntry(this.selectedEntry())\n  }\n  \n  onFinishDetailsEditingCell() {    \n    lively.notify(\"update table\")\n    this.applyDetails()\n  }\n  \n  \n  async onMergeButton() {\n    var otherURL  = this.getAttribute(\"merge\")\n    if (!otherURL) {\n      otherURL = await lively.prompt(\"merge other url\", \"\")\n      if (!otherURL) {\n        return lively.notify(\"cannot merge without url\")\n      } else {\n        this.merge = otherURL\n      }\n    }\n    this.mergeOtherURL(otherURL)\n  }\n  \n  \n  onCombineButton() {\n    var rows = this.selectedOrCurrentRows()\n    if (rows.length != 2) {\n      return lively.notify(\"select two rows (with CTRL+click)\")\n    }\n    let flatEntries = rows.map(row => this.table.rowToJSO(row))\n    \n    flatEntries[0].citationKey = flatEntries[1].citationKey // #TODO merge relies on this...\n    \n    rows[1].remove() // don't need it any more\n    \n    this.mergeOtherEntries([flatEntries[1]])\n    \n    this.setDetailsEntry(flatEntries[0])\n  }\n\n  onFinishButton() { \n    this.finishMerge()\n  }\n  \n  async onNewCitationKeyButton() {\n    if (!this.detailsTable) return;\n    \n    var flatEntry = this.getDetailsEntry()\n    if (!flatEntry) return\n    var bibtexEntry = this.flatEntryToBibtexEntry(flatEntry)\n    flatEntry.citationKey = Bibliography.generateCitationKey(bibtexEntry) \n    await this.setDetailsEntry(flatEntry)\n    \n    this.applyDetails()\n  }\n  \n   onBrowseButton() {\n    if (!this.detailsTable) return;\n    var flatEntry = this.getDetailsEntry()\n    if (!flatEntry) return\n    lively.openBrowser(\"bib://\"+ flatEntry.citationKey)\n    \n  }\n  \n  /*MD ## Copy and Paste MD*/\n  onCopy(evt) {\n    if (this.isEditingCells()) return\n    if (this.detailsTable && lively.isActiveElement(this.detailsTable)) return   \n\n\n    let source;\n    let rows = this.selectedOrCurrentRows()  \n    let flatEntries = rows.map(row => this.table.rowToJSO(row))\n    let entries = this.flatEntriesToBibtexEntries(flatEntries)\n    source = Parser.toBibtex(entries, false)\n    \n    evt.clipboardData.setData('application/bibtex', source);\n    evt.clipboardData.setData('text/plain', source);\n    evt.stopPropagation();\n    evt.preventDefault();\n  }\n  \n  onCut(evt) {\n    if (this.isEditingCells()) return\n    if (this.detailsTable && lively.isActiveElement(this.detailsTable)) return   \n\n    lively.notify(\"on Cut\")\n    this.onCopy(evt);\n    var rows = this.selectedOrCurrentRows()\n    for(var row of rows) {\n      row.remove()\n    } \n  }\n\n  insertData(data) {\n    function insert(arr, index, newitems) {\n      return [\n        ...arr.slice(0, index),\n        ...newitems,\n        ...arr.slice(index)\n      ]\n    }\n\n\n    var all = this.table.asJSO()\n    let rowInsert;\n    \n    if (this.table.currentRowIndex) {\n      rowInsert = this.table.currentRowIndex\n    } else {\n      rowInsert = all.length\n      \n    }\n    \n    try {\n      var entries = this.bibtexToFlatEntries(data)\n    } catch(e) {\n      lively.warn(\"could not inssert data\", data )\n      return \n    }\n    \n    \n    var newentries = insert(all, rowInsert, entries)\n    this.table.setFromJSO(newentries)\n\n    lively.notify(\"new entries\", \"\", 10, \n                  () =>lively.openInspector(newentries))\n   \n  }\n  \n  \n  onPaste(evt) {\n    if (this.isEditingCells()) return\n    if (this.detailsTable && lively.isActiveElement(this.detailsTable)) return   \n\n    \n    evt.stopPropagation();\n    evt.preventDefault();\n    \n    this.insertData(evt.clipboardData.getData('text/plain')) \n  }\n  \n  /*MD ## Merge MD*/\n  \n  isMerging() {\n    return this.originalEntries && true \n  }\n  \n  \n  async mergeOtherURL(otherURL) {\n    if (this.isMerging()) throw new Error(\"Merge in process\")\n    if (!otherURL) throw new Error(\"missing other URL\")\n  \n    var entries = await this.loadEntries(otherURL)\n    return this.mergeOtherEntries(entries)\n  }\n  \n  async mergeOtherEntries(entries) {\n    this.originalEntries = this.table.asJSO()    \n    this.otherEntries = entries\n\n    \n    var merged = []\n    this.mergedEntries = merged \n    for(let ea of this.originalEntries) {\n      let entry = Object.assign({\"0\": \"A\"}, ea)\n      merged.push(entry)\n    }\n    for(let ea of this.otherEntries) {\n      let entry = merged.find(originalEntry => originalEntry.citationKey == ea.citationKey) \n      if (entry) {\n        entry[0] = \"M\"\n        for (let key in ea) {\n          if (ea[key] && !entry[key]) {\n            entry[key] = ea[key]\n          } \n        }\n      } else {\n        entry = Object.assign({\"0\": \"B\"}, ea)\n        merged.push(entry)        \n      }\n      \n      \n    }\n    this.table.setFromJSO(merged, true)\n    this.setDetailsEntry(null)\n      \n    \n    this.colorMergeTable()\n    \n    \n    this.get(\"#saveButton\").hidden = true\n    this.get(\"#mergeButton\").hidden = true\n    this.get(\"#finishButton\").hidden = false\n\n  }\n\n  colorMergeTable() {\n    let colorA = \"yellow\"\n    let colorB = \"lightblue\"\n    let colorM = \"orange\"\n    \n    \n    // #TODO this should be pulled into the table....\n    let rows = this.table.rows() \n    let header = rows.shift()\n    header = Array.from(header.querySelectorAll(\"th\")).map(ea => ea.textContent)    \n    var indexOf = {}\n    for(let i in header) {\n      indexOf[header[i]] = i\n    }\n\n    let mergedEntries = this.table.asJSO() \n    for(let row of rows) {\n      \n      let cells = row.querySelectorAll(\"td\")\n      \n      \n      var citationKey = cells[indexOf[\"citationKey\"]].textContent     \n      var a = this.originalEntries.find(ea => ea.citationKey == citationKey)\n      var m = mergedEntries.find(ea => ea.citationKey == citationKey)\n      var b = this.otherEntries.find(ea => ea.citationKey == citationKey)\n      if (a && b) {\n        cells[0].style.backgroundColor = colorM\n      } else if (a) {\n        cells[0].style.backgroundColor = colorA\n      } else if (b) {\n        cells[0].style.backgroundColor = colorB\n      }\n      for(let name of header) {\n        let cell = cells[indexOf[name]]\n        if (a && b) {\n          if (a[name] != b[name] || a[name] != m[name]) {\n            if (a[name] == m[name]) {\n              cell.style.backgroundColor = colorA\n            } else if (b[name] == m[name]) {\n              cell.style.backgroundColor = colorB\n            } else {\n              cell.style.backgroundColor = colorM\n            }\n          } else {\n              cell.style.backgroundColor = \"\"\n          }\n        }\n      }\n    }\n  }\n  \n  colorDetailsTable() {\n    if (!this.isMerging() || !this.detailsTable) return;\n    \n    let colorA = \"yellow\"\n    let colorB = \"lightblue\"\n    let colorM = \"orange\"\n    \n    \n    let rows = this.detailsTable.rows() \n    let header = this.detailsTable.column(0).map(ea => ea.textContent)\n\n    let columnTitles = rows[0].querySelectorAll(\"th\")\n    if (columnTitles[1]) columnTitles[1].style.backgroundColor = colorA;\n    if (columnTitles[2]) columnTitles[2].style.backgroundColor = colorM;\n    if (columnTitles[3]) columnTitles[3].style.backgroundColor = colorB;\n    \n    for(let row of rows) {      \n      let cells = row.querySelectorAll(\"td\")\n      var a = cells[1]\n      var m = cells[2]\n      var b = cells[3]\n      if (a && m && b) {\n        \n        if (a.textContent != m.textContent && b.textContent !== m.textContent) {\n          m.style.backgroundColor = colorM\n        } else if (a.textContent == m.textContent) {\n          m.style.backgroundColor = colorA\n        } else if (a.textContent == m.textContent) {\n          m.style.backgroundColor = colorA\n        } else if (b.textContent == m.textContent) {\n          m.style.backgroundColor = colorB\n        } \n      }\n    }\n  }\n  \n  \n  async finishMerge() {\n     if (!this.isMerging()) throw \"not in merge mode\"\n    var merged = this.table.asJSO()\n    var finished = merged.map(ea => {\n      var f = ea.clone()\n      delete f[0]\n      return f\n    })\n    this.table.setFromJSO(finished, true)\n    this.setDetailsEntry(null)\n    \n    delete this.originalEntries\n    delete this.otherEntries\n    \n    \n    this.get(\"#saveButton\").hidden = false\n    this.get(\"#mergeButton\").hidden = false\n    this.get(\"#finishButton\").hidden = true\n  }\n  \n  livelySource() {\n     return thiss.toBibtex()\n  }\n\n  async livelyExample() {\n    // this customizes a default instance to a pretty example\n    // this is used by the \n    this.src = lively4url + \"/demos/bibliography/_incoming.bib\"\n    this.merge = lively4url + \"/demos/bibliography/_other.bib\"\n    this.style.overflow = \"scroll\"\n  }\n}"]}