{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-RP19-4/src/client/reactive/components/basic/event-drops.js"],"names":["Morph","eventDrops","d3","AExprRegistry","EventDrops","initialize","windowTitle","config","range","chart","zoom","onZoom","zoomedTo","scale","domain","onZoomEnd","updateMetaInformation","drop","date","event","timestamp","color","message","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","setAexprs","isStillInWorld","setTimeout","aexprs","scrollBefore","scrollTop","length","groups","groupBy","Object","keys","map","name","flatMap","ae","setData","newDomain","allEvents","min","minBy","max","maxBy","difference","getTime","Date","zoomToDomain","call","numEvents","sumBy","filteredData","textContent","getHours","getMinutes","slice","getSeconds","getMilliseconds","parentElement","undefined","livelyMigrate","other"],"mappings":"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","file":"event-drops.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      range : this.chart ? this.chart.range : void 0,\n      zoom: {\n          onZoom: () => {this.zoomedTo = this.chart.scale().domain()},\n          onZoomEnd: () => this.updateMetaInformation(),\n      },\n      drop: {\n          date: event => event.timestamp,\n          color: event => {\n            switch(event.message) {\n              case 'created': return 'green';\n              case 'disposed': return 'red';\n              case 'changed value': return 'blue';\n              default : return 'black';\n            }\n          }, //'#'+('00000'+(Math.random()*(1<<24)|0).toString(16)).slice(-6),\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            //lively.showEvent(d3.event);\n            //lively.openInspector(d3.event)\n            this.tooltip.html('')// = '';\n            this.tooltip.append(() =>\n                    <div class=\"event\">\n                      <div class=\"content\">\n                        <h3 style=\"font-size: 1em\">{event.message}</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                // .style('left', `${d3.event.clientX - 30}px`)\n                // .style('top', `${d3.event.clientY + 20}px`)\n            //debugger;\n            lively.setGlobalPosition(this.tooltip.node(), lively.pt(d3.event.clientX +3, d3.event.clientY+3));\n            //this.tooltip.style.display = 'inline';\n            //this.hideTooltip.cancel();\n        },\n        onMouseOut: () => {\n          //lively.notify('out')\n            //this.hideTooltip();\n            //this.tooltip.style.display = 'none';\n            //this.hideTooltip();\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      \n      // d3\n      // .select(this)\n      // .append('div')\n      // .classed('tooltip', true)\n      // .style('opacity', 0)\n      // .style('border', 'red 3px solid')\n      // .style('width', '100px')\n      // .style('height', '100px')\n      // .style('background-color', 'blue')\n      // .style('pointer-events', 'auto');\n\n    this.d3 = d3;\n\n    // this.chart.setDomain = (domain) => {\n    //   this.chart.scale().domain(domain);\n    //   let svg = d3.select(this.get('.event-drop-chart'));\n    //   svg.call(this.chart.draw(_.merge(defaultConfig, this.config), this.chart.scale()));\n    // }\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     // || document.body.appendChild(<div id='event-drops-tooltip' class='tooltip' style='background-color:gray; display:none; width:200px; z-index: 500; position:relative'></div>);\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    this.setAexprs(this.getDataFromSource());\n    if(this.isStillInWorld())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.updateMetaInformation();\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.chart.scale().domain()[0]);\n    this.zoomEnd.textContent = this.humanizeDate(this.chart.scale().domain()[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  isStillInWorld() {\n    return this.parentElement && this.parentElement.parentElement != undefined;\n  }\n\n  livelyMigrate(other) {\n    this.zoomedTo = other.zoomedTo;\n    this.groupingFunction = other.groupingFunction;\n    this.dataFromSource = other.dataFromSource;\n  }\n  \n}"]}