{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-RP19-4/src/components/draft/aexpr-table.js"],"names":["Morph","AExprRegistry","attributes","id","ae","meta","function","currentValue","getValueTag","callbacks","dependencies","supportsDependencies","dependencyString","actions","evt","openInspector","undefined","dispose","value","isError","evaluateToCurrentValue","dependency","descriptor","getAsDependencyDescription","type","isMemberDependency","isGlobalDependency","isLocalDependency","keys","key","colorForHeat","heat","others","round","pow","coolDown","element","currentcount","getAttribute","step","setAttribute","max","newColor","AexprTable","initialize","initializeCallbacks","initializeHeader","Array","repopulate","Map","openEventDrops","filterChanged","update","on","aexpr","addAexpr","removeAexpr","updateAexpr","header","col","appendChild","rows","updateFilter","v","table","get","filterElement","buttonShowEvents","added","allAsArray","removed","each","row","createRow","rowOf","rowIndex","index","setRow","igniteRow","currentHeat","min","htmlRow","removeChild","attribute","cell","clearTable","code","numResults","numErrored","Function","filterIn","filter","e","notify","eventDrops","openComponentInWindow","livelyMigrate","other","livelyExample","listify","array","protect","map","inspectorLink","object","link","toString"],"mappings":"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","file":"aexpr-table.js","sourcesContent":["\"enable aexpr\";\n\nimport Morph from 'src/components/widgets/lively-morph.js';\nimport {AExprRegistry} from 'src/client/reactive/active-expression/active-expression.js';\n\nconst attributes = {\n  id : ae => ae.meta().get('id'),\n  function : ae => ae.func,\n  //lastValue : ae => \"\"+ae.lastValue,\n  currentValue : getValueTag,\n  callbacks : ae => listify(ae.callbacks),\n  \n  dependencies : ae => ae.supportsDependencies() ? \n      listify(ae.dependencies().all().map(dependencyString))\n    : <font color=\"#551199\">{\"no dependecy api available\"}</font>,\n  \n  actions : ae => <div>\n    <button click={evt => lively.openInspector(ae, undefined, ae)}>inspect</button>\n    <button click={() => ae.dispose()}>dispose</button>\n  </div>\n}\n                  \n\nfunction getValueTag(ae) {\n  let {value, isError} = ae.evaluateToCurrentValue();\n  return <font color={isError ? \"red\" : \"blue\"}>{\"\"+value}</font>;\n}\n  \nfunction dependencyString(dependency) {\n  let descriptor = dependency.getAsDependencyDescription();\n  let type = 'unknown type';\n  if(dependency.isMemberDependency()) type = 'member';\n  if(dependency.isGlobalDependency()) type = 'global';\n  if(dependency.isLocalDependency()) type = 'local';\n  return <li>{type}\n    {listify(Object.keys(descriptor)\n      .map(key => <span>{key+' : '}{inspectorLink(descriptor[key])}</span>), true)}</li>\n}\n\nfunction colorForHeat(heat) {\n  let others = Math.round(256/Math.pow(heat+0.1, 1)).toString(16);\n  if(others.length == 1)others = \"0\"+others;\n  return \"#FF\"+others+others;\n}\n\nfunction coolDown(element) {\n  let currentcount = parseFloat(element.getAttribute(\"heat\"));\n  if(currentcount <= 0)return;\n  let step = 0.1;\n  currentcount = currentcount * 0.95 - 0.01;\n  element.setAttribute(\"heat\", Math.max(currentcount, 0));\n  let newColor = colorForHeat(currentcount+1);\n  element.setAttribute(\"bgcolor\", newColor);\n  if(currentcount <= 0) {\n    element.setAttribute('heat', 0);\n    element.setAttribute(\"bgcolor\", \"#FFFFFF\");\n  }\n}\n\nexport default class AexprTable extends Morph {\n  async initialize() {\n    this.windowTitle = \"Active Expression Monitor\";\n    this.initializeCallbacks();\n    this.initializeHeader();\n    this.value = new Array();\n    this.repopulate();\n    this.events = new Map();\n    //this.filter.onchange = (x,y,z) => lively.notify(x+\" -- \"+y+\" -- \"+z);\n    this.buttonShowEvents.addEventListener('click', () => this.openEventDrops());\n    this.filterElement.addEventListener('change', () => this.filterChanged());\n    this.update();\n  }\n  \n  initializeCallbacks(){\n    AExprRegistry.on('add', (aexpr) => this.addAexpr(aexpr));\n    AExprRegistry.on('remove', (aexpr) => this.removeAexpr(aexpr));\n    AExprRegistry.on('update', (aexpr) => this.updateAexpr(aexpr));\n  }\n  \n  initializeHeader(){\n    let header = <tr class='header'></tr>;\n    for(let col in attributes)header.appendChild(<td>{col}</td>)\n    this.table.appendChild(header);\n  }\n  \n  update() {\n    this.rows().forEach(coolDown);\n    if(this._filterDirty !== false) {\n      this.updateFilter();\n      this._filterDirty = false;\n    }\n    setTimeout(() => {this.update()}, 100);\n  }\n  \n  get value() {\n    return this._value\n  }\n\n  set value(v) {\n    this._value = v\n    //this.update()\n  }\n  \n  get table() {\n    return this.get(\"#table\");\n  }\n  \n    \n  get filterElement() {\n    return this.get(\"#filter\");\n  }\n  \n  get buttonShowEvents() {\n    return this.get(\"#buttonShowEvents\");\n  }\n\n  \n  repopulate() {  \n    this._rows = [];\n    let added = AExprRegistry.allAsArray().difference(this.value);\n    let removed = this.value.difference(AExprRegistry.allAsArray());\n    for(let each of removed)this.removeAexpr(each);\n    for(let each of added)this.addAexpr(each);\n  } \n  \n  addAexpr(aexpr){\n    let row = this.createRow(aexpr);\n    this.table.appendChild(row);\n    this.value.push(aexpr);\n    this.rows().push(row);\n    this.filterChanged();\n  }\n  \n  removeAexpr(aexpr){\n    let row = this.rowOf(aexpr);\n    if(row) {\n      let rowIndex = this.rows().indexOf(row);\n      this.rows().splice(rowIndex, 1);\n      this.table.removeChild(row);\n    }\n  \n    let index = this.value.indexOf(aexpr);\n    this.value.splice(index, 1);\n    this.filterChanged();\n  }\n  \n  updateAexpr(aexpr){\n    let row = this.rowOf(aexpr);\n    if(!row)return;\n    this.setRow(row, aexpr);\n    this.igniteRow(row);\n    this.filterChanged();\n  }\n  \n  igniteRow(row){\n    let currentHeat = parseFloat(row.getAttribute(\"heat\"));\n    row.setAttribute(\"heat\", currentHeat+1);\n    let newColor = colorForHeat(Math.min(currentHeat+1, 30));\n    row.setAttribute(\"bgcolor\", newColor);\n  }\n  \n  rows() {\n    if(!this._rows) {\n      this._rows = this.table.childNodes\n        .filter(each => each.tagName == 'TR')\n        .filter(each => each.getAttribute('class') == 'aeRow');\n    }\n    return this._rows;\n  }\n  \n  rowOf(aexpr){\n    return this.rows().filter(each => each.aexpr === aexpr)[0];\n  }\n  \n  createRow(aexpr){\n    let htmlRow = <tr class='aeRow'></tr>;\n    htmlRow.setAttribute(\"heat\", 0);\n    //htmlRow.cells = {};\n    this.setRow(htmlRow, aexpr);\n    return htmlRow; \n  }\n  \n  setRow(row, aexpr){\n    row.aexpr = aexpr;\n    while(row.firstChild) {\n      row.removeChild(row.firstChild);\n    }\n    for(let attribute in attributes){\n      let value = attributes[attribute](aexpr);\n      let cell = row.cells[attribute];\n      if(!cell) {\n        cell = <td>{value}</td>;\n        row.appendChild(cell);\n        //row.cells[attribute] = cell;\n      } else {\n        //cell.textContent = {...value};\n      }\n    }\n  }\n  \n  clearTable() {\n    while (this.table.firstChild)this.table.firstChild.remove();\n  }\n  \n  filterChanged() {\n    this._filterDirty = true;\n  }\n  \n  updateFilter() {\n    let code = this.filterElement.value;\n    let numResults = 0;\n    let numErrored = 0;\n    try {\n      if(!code || code == '')code = 'true';\n      this.filter = new Function(\"each\", \"return \"+code);\n      this.rows().forEach(each => {\n        let filterIn = false;\n        try {\n          filterIn = this.filter(each.aexpr);\n        } catch(e) {\n          filterIn = false;\n          numErrored++;\n        };\n        if(filterIn)numResults++;\n        each.style.display = filterIn ? 'table-row' : 'none';\n      });\n      this.get('#filter-info').textContent = \"results/errored/total = \"+numResults+\"/\"+numErrored+\"/\"+this.rows().length;\n    } catch(e) {\n      lively.notify('Error parsing '+code+': '+e);\n    }\n  }\n  \n  async openEventDrops() {\n    let eventDrops = await lively.openComponentInWindow('event-drops');\n    eventDrops.dataFromSource = this.rows()\n      .map(each => each.aexpr)\n      .filter(each => this.filter(each));\n    eventDrops.groupingFunction = each => each.meta().get('id');\n    eventDrops.update();\n  }\n  \n  livelyMigrate(other) {\n    \n  }\n  \n  async livelyExample() {\n    \n  }\n  \n\n}\n\nfunction listify(array, protect) {\n  return <ul style=\"display:block\">{...(\n      array.map(each => <li style={protect ? \"white-space: nowrap\" : \"\"}>{each}</li>)\n    )}</ul>\n}\n\nfunction inspectorLink(object) {\n  let link = <a>{object && object.toString()}</a>;\n  link.onclick = () => lively.openInspector(object);\n  return link;\n}"]}