{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-RP19-4/src/components/draft/event-drops.js"],"names":["Morph","eventDrops","d3","repositoriesData","AExprRegistry","EventDrops","initialize","range","zoom","onZoom","onZoomEnd","updateMetaInformation","drop","date","event","color","onClick","data","notify","stringify","openInspector","onMouseOver","humanizeDate","setGlobalPosition","pt","onMouseOut","map","repository","name","get","each","remove","update","tooltip","existing","document","select","getDataFromSource","dataFromSource","allAsArray","isFunction","getGroupingFunction","deIndex","string","substring","lastIndexOf","meta","setAexprs","isStillInWorld","aexprs","scrollBefore","groups","groupBy","keys","ae","setData","newDomain","allEvents","flatMap","min","minBy","max","maxBy","difference","getTime","Date","numEvents","sumBy","monthNames","getHours","getMinutes","getSeconds","getMilliseconds","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';\n//import eventDrops from 'https://unpkg.com/event-drops@1.3.0/dist/index.js';\nimport d3 from 'src/external/d3.v5.js';\nimport repositoriesData from 'src/components/draft/event-drops-data.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\n    //let repositoriesData = require('event-drops-data.json');\n    \n    repositoriesData = repositoriesData.map(repository => ({name: repository.name, data: repository.commits}));\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    const monthNames = [\n        'Jan.',\n        'Feb.',\n        'March',\n        'Apr.',\n        'May',\n        'June',\n        'Jul.',\n        'Aug.',\n        'Sept.',\n        'Oct.',\n        'Nov.',\n        'Dec.',\n    ];\n\n    return `\n        ${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}"]}