{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-RP19-4/src/client/reactive/components/basic/aexpr-timeline.js"],"names":["Morph","eventDrops","d3","AExprRegistry","EventDrops","initialize","windowTitle","config","bound","format","undefined","range","start","Date","performance","timeOrigin","end","line","color","_","index","schemeCategory10","zoom","onZoom","zoomedTo","chart","scale","domain","updateMetaInformation","restrictPan","drop","date","event","timestamp","type","onClick","data","lively","notify","JSON","stringify","openInspector","onMouseOver","tooltip","transition","duration","style","html","append","value","toString","humanizeDate","setGlobalPosition","node","pt","clientX","clientY","onMouseOut","numberEventsContainer","get","zoomStart","zoomEnd","document","body","querySelectorAll","forEach","each","remove","update","existing","select","attr","classed","getDataFromSource","dataFromSource","allAsArray","isFunction","getGroupingFunction","deIndex","string","substring","lastIndexOf","groupingFunction","meta","detached","setAexprs","setTimeout","aexprs","scrollBefore","scrollTop","length","groups","groupBy","Object","keys","map","name","flatMap","ae","setData","newDomain","allEvents","min","minBy","max","maxBy","difference","getTime","zoomToDomain","call","numEvents","sumBy","filteredData","textContent","getHours","getMinutes","slice","getSeconds","getMilliseconds","livelyMigrate","other","detachedCallback"],"mappings":"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","file":"aexpr-timeline.js","sourcesContent":["\"enable aexpr\";\n\nimport Morph from 'src/components/widgets/lively-morph.js';\n\nimport eventDrops from 'src/external/event-drops.js';\nimport d3 from 'src/external/d3.v5.js';\n\nimport {AExprRegistry} from 'src/client/reactive/active-expression/active-expression.js'\n\nexport default class EventDrops extends Morph {\n  async initialize() {\n    this.windowTitle = \"Active Expression Event Timeline\";\n    this.config = {\n      d3,\n      bound : {format: () => undefined},\n      range : {start: new Date(performance.timeOrigin), end: new Date()},\n      line : {\n        color: (_, index) => d3.schemeCategory10[index%10]\n      },\n      zoom: {\n          onZoom: () => {\n            this.zoomedTo = this.chart.scale().domain();\n            this.updateMetaInformation();\n          },\n      },\n      restrictPan : true,\n      drop: {\n          date: event => event.timestamp,\n          color: event => {\n            switch(event.type) {\n              case 'created': return 'green';\n              case 'disposed': return 'red';\n              case 'changed value': return 'blue';\n              case 'dependencies changed': return 'purple';\n              default : return 'black';\n            }\n          },\n          onClick : data => {\n            lively.notify(JSON.stringify(data));\n            lively.openInspector(data);\n          },\n          onMouseOver: event => {\n            this.tooltip\n                .transition()\n                .duration(200)\n                .style('opacity', 1)\n                .style('pointer-events', 'auto');\n            this.tooltip.html('');\n            this.tooltip.append(() =>\n                    <div class=\"event\">\n                      <div class=\"content\">\n                        <h3 style=\"font-size: 1em\">{event.type}</h3>\n                        <span style=\"font-size: 1em\">{(event.value || \"\").toString()}</span>\n                        <p style=\"font-size: 1em\">at {this.humanizeDate(event.timestamp)}</p>\n                      </div>\n                    </div>);\n            lively.setGlobalPosition(this.tooltip.node(), lively.pt(d3.event.clientX +3, d3.event.clientY+3));\n        },\n        onMouseOut: () => {\n            this.tooltip\n                .transition()\n                .duration(500)\n                .style('opacity', 0)\n                .style('pointer-events', 'none');\n        }\n      },\n    };\n    this.chart = eventDrops(this.config);\n    \n    this.numberEventsContainer = this.get('#numberEvents');\n    this.zoomStart = this.get('#zoomStart');\n    this.zoomEnd = this.get('#zoomEnd');\n    document.body.querySelectorAll('#event-drops-tooltip').forEach(each => each.remove());\n    this.d3 = d3;\n    this.update();\n   \n  }\n  \n  get tooltip() {\n    let existing = document.body.querySelectorAll('#event-drops-tooltip')[0];\n    \n    return existing ? d3.select(existing) : d3\n      .select('body')\n      .append('div')\n      .attr('id', 'event-drops-tooltip')\n      .classed('tooltip', true)\n      .style('opacity', 0)\n      .style('width', '200px')\n      .style('box-sizing', 'border-box')\n      .style('border', '10px solid transparent')\n      .style('background-color', '#EEEEEE')\n      .style('z-index', 500)\n      .style('pointer-events', 'auto');\n  }\n  \n\n  getDataFromSource() {\n    let dataFromSource = this.dataFromSource || (() => AExprRegistry.allAsArray());\n    if(_.isFunction(dataFromSource))return dataFromSource();\n    else return dataFromSource;\n  }\n\n  getGroupingFunction() {\n    let deIndex = string => string.substring(0, string.lastIndexOf(\"#\"));\n    return this.groupingFunction || (each => deIndex(each.meta().get('id')))\n  }\n  \n  update() {\n    if(this.detached)return;\n    this.setAexprs(this.getDataFromSource());\n    setTimeout(() => {this.update()}, 1000);\n  }\n  \n  setAexprs(aexprs) {\n    let scrollBefore = this.get('#diagram').scrollTop;\n    if(aexprs.length == 0)return;\n    let groups = aexprs.groupBy(this.getGroupingFunction());\n    groups = Object.keys(groups).map(each => ({name : each, data: groups[each].flatMap(ae => ae.meta().get('events'))}));\n    this.setData(groups);\n    let newDomain = this.zoomedTo;\n    if(!newDomain) {\n      let allEvents = groups.flatMap(each => each.data);\n      let min = _.minBy(allEvents, each => each.timestamp).timestamp;\n      let max = _.maxBy(allEvents, each => each.timestamp).timestamp;\n      let difference = max.getTime() - min.getTime();\n      if(difference == 0)difference = 100;\n      min = new Date(min.getTime() - difference*0.1);\n      max = new Date(max.getTime() + difference*0.1);\n      newDomain = [min, max];\n    }\n    this.chart.scale().domain(newDomain);\n    this.chart.zoomToDomain(newDomain); \n    this.get('#diagram').scrollTop = scrollBefore;\n  }\n  \n  setData(data) {\n    d3\n      .select(this.get('#diagram'))\n      .data([data])\n      .call(this.chart);\n  }\n  \n  updateMetaInformation() {\n    const numEvents = _.sumBy(this.chart.filteredData(), each => each.data.length);\n    this.numberEventsContainer.textContent = numEvents;\n    this.zoomStart.textContent = this.humanizeDate(this.zoomedTo[0]);\n    this.zoomEnd.textContent = this.humanizeDate(this.zoomedTo[1]);\n  }\n  \n  humanizeDate(date) {\n    return `        ${date.getHours()}:${('0'+date.getMinutes()).slice(-2)}:${('0'+date.getSeconds()).slice(-2)}.${('000'+date.getMilliseconds()).slice(-4)}\n    `;\n  }\n\n  livelyMigrate(other) {\n    this.zoomedTo = other.zoomedTo;\n    this.groupingFunction = other.groupingFunction;\n    this.dataFromSource = other.dataFromSource;\n  }\n\n  detachedCallback() {\n    this.detached = true;\n  }\n  \n}"]}