{"version":3,"sources":["https://lively-kernel.org/lively4/swd21-pipes-and-filters/templates/triple-notes.js"],"names":["Morph","ContextMenu","d3","Graph","TAG_URL","IS_A_URL","SAME_AS_URL","CONTAINS_URL","drawTools","math","aexpr","getNodeByKnot","MIN_MAGNIFICATION","MAX_MAGNIFICATION","NODE_BY_KNOT","Map","knot","has","set","Node","get","RectangleTools","distanceToBorder","rect","dx","dy","width","height","innerDistance","m_link","Math","abs","m_rect","timesX","rectY","sqrt","pow","timesY","rectX","cssClassesByFileType","cssClassesByTagURL","getCSSClassesByType","node","constructor","label","fileEnding","getFileEnding","shouldRenderSizeAware","content","split","_radius","min","length","_width","_height","getKnot","isTriple","isExternal","isExternalURL","URL","url","shift","pop","draw","parentElement","additionalCssClasses","cssClasses","predicate","push","lively","notify","appendRectangularClass","appendCircularClass","actualRadius","Link","_subject","subject","_predicate","_object","object","_triple","frontPart","LinkPart","source","target","backPart","triple","isLoop","linkParts","linkGroup","markerContainer","append","classed","loops","TripleNotes","getKnots","graph","getInstance","knots","setSize","clientWidth","clientHeight","margin","top","left","bottom","right","chartWidth","chartHeight","svg","attr","initialize","windowTitle","registerButtons","select","graphContainer","addEventListener","e","drawChart","getNodes","call","zoomBehavior","prepareConfig","setupStatistics","nodes","map","links","filter","hiddenLinks","forEach","link","concat","linkPartContainer","hiddenLinkElements","selectAll","data","enter","style","linkContainer","createPropertyMarker","marker","appendBasicMarker","m1X","m1Y","m2X","m2Y","datum","linkGroups","each","linkPathElements","curveFunction","line","x","d","y","curve","curveNatural","nodeContainer","nodeElements","dragBehavior","on","event","stopPropagation","preventDefault","knotView","openComponentInWindow","loadKnotForURL","openIn","document","body","undefined","collectContextMenuItems","text","simulation","forceSimulation","force","forceLink","id","index","distance","forceManyBody","strength","forceCenter","forceY","forceX","recalculatePositions","calculateLoopPath","curvePoint","pathStart","calculateIntersection","pathEnd","onReload","linkDistance","value","alpha","restart","updateCharge","knotChargeValue","knotCharge","tripleChargeValue","tripleCharge","forceCenterX","forceCenterY","forceXTarget","forceYTarget","forceXStrength","forceYStrength","zoomTranslateX","getAttribute","setAttribute","zoomTranslateY","zoomScale","scale","zoom","duration","scaleExtent","transform","drag","active","alphaTarget","fx","fy","statistics","numberOfKnots","numberOfTriples","k","appendChild"],"mappings":"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","file":"triple-notes.js","sourcesContent":["import Morph from \"src/components/widgets/lively-morph.js\"\nimport ContextMenu from 'src/client/contextmenu.js';\n\nimport d3 from 'src/external/d3.v4.js';\n\nimport {\n  Graph,\n  TAG_URL,\n  IS_A_URL,\n  SAME_AS_URL,\n  CONTAINS_URL\n} from 'src/client/triples/triples.js';\nimport * as drawTools from 'src/client/triples/drawTools.js';\nimport * as math from 'src/client/triples/math.js';\n\nimport { aexpr } from \"active-expression-frame-based\";\n\nconst MIN_MAGNIFICATION = 0.01;\nconst MAX_MAGNIFICATION = 4;\n\nconst NODE_BY_KNOT = new Map();\nfunction getNodeByKnot(knot) {\n  if(!NODE_BY_KNOT.has(knot)) {\n    NODE_BY_KNOT.set(knot, new Node(knot));\n  }\n  return NODE_BY_KNOT.get(knot);\n}\n\nclass RectangleTools {\n  static distanceToBorder(rect, dx, dy) {\n  \tvar width = rect.width(),\n  \t\theight = rect.height();\n  \n  \tvar innerDistance,\n  \t\tm_link = Math.abs(dy / dx),\n  \t\tm_rect = height / width;\n  \n  \tif (m_link <= m_rect) {\n  \t\tvar timesX = dx / (width / 2),\n  \t\t\trectY = dy / timesX;\n  \t\tinnerDistance = Math.sqrt(Math.pow(width / 2, 2) + Math.pow(rectY, 2));\n  \t} else {\n  \t\tvar timesY = dy / (height / 2),\n  \t\t\trectX = dx / timesY;\n  \t\tinnerDistance = Math.sqrt(Math.pow(height / 2, 2) + Math.pow(rectX, 2));\n  \t}\n  \n  \treturn innerDistance;\n  };\n}\n\nconst cssClassesByFileType = {\n  'png': ['image'],\n  'PNG': ['image'],\n  'jpg': ['image'],\n  'svg': ['image'],\n  'mp3': ['audio'],\n  'mov': ['movie'],\n  'mp4': ['movie'],\n  'avi': ['movie'],\n  'pptx': ['presentation'],\n  'md': ['markdown'],\n  'htm': ['html'],\n  'html': ['html'],\n  'json': ['data'],\n  'csv': ['data']\n}\nconst cssClassesByTagURL = {\n  [TAG_URL]: ['tag'],\n  [IS_A_URL]: ['is-a'],\n  [SAME_AS_URL]: ['same-as'],\n  [CONTAINS_URL]: ['contains'],\n}\nclass Node {\n  static getCSSClassesByType(node) {\n    \n  }\n  constructor(knot, label) {\n    this.knot = knot;\n    //this.r = ~~d3.randomUniform(8, 28)();\n    const fileEnding = this.getFileEnding();\n    const shouldRenderSizeAware = (fileEnding === 'md' || fileEnding === 'html') &&\n     this.knot.content && this.knot.content.split;\n    this._radius = shouldRenderSizeAware ?\n      Math.min((this.knot.content.split(/\\r?\\n/).length + 10) * 0.9, 100) :\n\t    40;\n\t this._width = 60;\n\t this._height = 20;\n  }\n  getKnot() { return this.knot; }\n  label() { return this.knot.label(); }\n  isTriple() { return this.knot.isTriple(); }\n  isExternal() {  return Graph.isExternalURL(new URL(this.knot.url)); }\n  getFileEnding() { return this.knot.url.split('#').shift().split('?').shift().split('.').pop(); }\n  \n  draw(parentElement, additionalCssClasses) {\n    let cssClasses;\n    \n    if(this.knot.isTriple()) {\n      cssClasses = cssClassesByTagURL[this.knot.predicate.url] || ['unspecified'];\n      cssClasses.push('nostroke')\n    } else {\n      const fileEnding = this.getFileEnding();\n      //lively.notify(fileEnding)\n  \t\tcssClasses = cssClassesByFileType[fileEnding] ?\n  \t\t  cssClassesByFileType[fileEnding] :\n  \t\t  (lively.notify(fileEnding), ['white']);\n    }\n\t\t\n    if(this.knot.isTriple()) {\n      drawTools.appendRectangularClass(parentElement, 60, 20, cssClasses, this.label());\n    } else {\n\t\t  drawTools.appendCircularClass(parentElement, this.actualRadius(), cssClasses, this.label());\n    }\n\n\t\t//that.postDrawActions(parentElement);\n\t}\n\t\n\tactualRadius() {\n\t  return this._radius;\n\t}\n\twidth() { return this._width; }\n\theight() { return this._height; }\n\tdistanceToBorder(dx, dy) { return this.isTriple() ?\n\t  RectangleTools.distanceToBorder(this, dx, dy) :\n\t  this.actualRadius();\n\t}\n}\n\nclass Link extends Node {\n  constructor(node) {\n    super(node.getKnot());\n    \n    this._subject = getNodeByKnot(this.getKnot().subject);\n    this._predicate = getNodeByKnot(this.getKnot().predicate);\n    this._object = getNodeByKnot(this.getKnot().object);\n    this._triple = getNodeByKnot(this.getKnot());\n\n    this.frontPart = new LinkPart({\n      source: this._subject,\n      target: this._triple\n    });\n    this.backPart = new LinkPart({\n      source: this._triple,\n      target: this._object\n    });\n  }\n  get subject() { return this._subject; }\n  get predicate() { return this._predicate; }\n  get object() { return this._object; }\n  get triple() { return this._triple; }\n  \n  isLoop() {\n    return this.subject === this.object;\n  }\n  linkParts() {\n    return [this.frontPart, this.backPart];\n  }\n  \n  draw(linkGroup, markerContainer) {\n    linkGroup.append(\"path\")\n    .classed(\"link-path\", true)\n    //.classed(this.domain().cssClassOfNode(), true)\n    //.classed(this.range().cssClassOfNode(), true)\n    //.classed(property.linkType(), true);\n  }\n  \n  // TODO: if we are self-referencial: compute the number of self references from the graph\n  loops() {\n    return 3;\n  }\n}\n\nclass LinkPart {\n  constructor({ source, target }) {\n    this.source = source;\n    this.target = target;\n  }\n}\n\n/*\n * ========================================================\n * ========================================================\n * ========================================================\n */\nexport default class TripleNotes extends Morph {\n\n  async getKnots() {\n    let graph = await Graph.getInstance();\n    return graph.knots;\n  }\n\n  setSize() {\n    let parentElement = this.get('#graph');\n    \n    this.width = parentElement.clientWidth;\n    this.height = parentElement.clientHeight;\n\n    let margin = { top: 0, left: 0, bottom: 0, right: 0 };\n\n    this.chartWidth = this.width - (margin.left + margin.right);\n    this.chartHeight = this.height - (margin.top + margin.bottom);\n\n    this.svg\n      .attr(\"width\", this.chartWidth)\n      .attr(\"height\", this.chartHeight)\n      .attr(\"transform\", \"translate(\"+[margin.left, margin.top]+\")\");\n  }\n\n  async initialize() {\n    this.windowTitle = \"Knot Explorer\";\n    \n    this.registerButtons();\n    \n    this.svg = d3.select(this.get('#graph'))\n      .append(\"svg\");\n      \n    this.graphContainer = this.svg\n      .append(\"g\")\n        .classed(\"graphContainer\", true);\n\n    this.setSize();\n    lively.addEventListener(\"triple-notes\", this, \"extent-changed\", e => this.setSize());\n\n    this.drawChart(await this.getNodes());\n\n    //let initialTransform;\n    //if(\n    //  this.zoomScale !== \"\" &&\n    //  this.zoomTranslateX !== \"\" &&\n    //  this.zoomTranslateY !== \"\"\n    //) {\n    //  initialTransform = d3.zoomIdentity;\n    //    initialTransform.translate(this.zoomTranslateX, this.zoomTranslateY)\n    //    initialTransform.scale(this.zoomScale);\n    //  lively.notify(`Adapt init: ${this.zoomTranslateX},${this.zoomTranslateY}`)\n    //}\n    this.svg\n      //.attr(\"transform\", initialTransform)\n      .call(this.zoomBehavior());\n      //.call(zoomBehavior.scaleTo(1.2).event);\n    \n    this.prepareConfig();\n  }\n  \n  async getNodes() {\n    let knots = await this.getKnots();\n    this.setupStatistics(knots);\n    \n    let nodes = knots.map(getNodeByKnot);\n    let links = nodes\n      .filter(node => node.isTriple())\n      .map(node => new Link(node));\n    \n    let hiddenLinks = [];\n\t\tlinks.forEach(link => hiddenLinks = hiddenLinks.concat(link.linkParts()));\n\n    return {\n      nodes,\n      links,\n      hiddenLinks\n    };\n  }\n\n\n  \n  drawChart({ nodes, links, hiddenLinks }) {\n    \n    // hidden link parts\n    let linkPartContainer = this.graphContainer.append(\"g\").classed(\"linkPartContainer\", true);\n    var hiddenLinkElements = linkPartContainer.selectAll(\"line\")\n      .data(hiddenLinks).enter()\n      .append(\"line\")\n      .style(\"stroke\", \"black\")\n      .style(\"stroke-opacity\", 0.1)\n      .style(\"stroke-width\", 10);\n    \n    // Curved, visible  Links\n    let linkContainer = this.graphContainer.append(\"g\").classed(\"linkContainer\", true);\n    let markerContainer = linkContainer.append(\"defs\");\n    createPropertyMarker(markerContainer);\n    function createPropertyMarker(markerContainer) {\n    \tvar marker = appendBasicMarker(markerContainer);\n    \t//marker.attr(\"refX\", 12);\n        var m1X = -12 ;\n        var m1Y = 8 ;\n        var m2X = -12;\n        var m2Y = -8 ;\n    \tmarker.append(\"path\")\n    \t\t//.attr(\"d\", \"M0,-8L12,0L0,8Z\")\n            .attr(\"d\", \"M0,0L \" + m1X + \",\" + m1Y + \"L\" + m2X + \",\" + m2Y + \"L\" + 0 + \",\" + 0 )\n    \t\t.classed(\"basic-triple-link\", true);\n    }\n    \n    function appendBasicMarker(markerContainer) {\n    \treturn markerContainer.append(\"marker\")\n    \t\t.datum({})\n    \t\t.attr(\"id\", \"triple-notes-basic-triple-link\")\n    \n    \t\t.attr(\"viewBox\", \"-14 -10 28 20\")\n    \t\t.attr(\"markerWidth\",10)\n    \t\t.attr(\"markerHeight\", 10)\n    \t\t//.attr(\"markerUnits\", \"userSpaceOnUse\")\n    \t\t.attr(\"orient\", \"auto\");\n    }\n    \n\t\t// Draw links\n\t\tlet linkGroups = linkContainer.selectAll(\".link\")\n\t\t\t.data(links).enter()\n\t\t\t.append(\"g\")\n\t\t\t.classed(\"link\", true);\n\n\t\tlinkGroups.each(function (link) {\n\t\t  d3.select(this).attr(\"marker-end\", \"url(#triple-notes-basic-triple-link)\");\n\t\t\tlink.draw(d3.select(this), markerContainer);\n\t\t});\n\n\t\t// Select the path for direct access to receive a better performance\n    let linkPathElements = linkGroups.selectAll(\"path\");\n    \n    let curveFunction = d3.line()\n\t\t\t.x(d => d.x)\n\t\t\t.y(d => d.y)\n      .curve(d3.curveNatural);\n\n    // Visible Knots -> Nodes\n    let nodeContainer = this.graphContainer.append(\"g\").classed(\"nodeContainer\", true);\n    let nodeElements = nodeContainer.selectAll(\".node\")\n      .data(nodes).enter()\n      .append(\"g\")\n      .attr(\"class\", \"node\")\n      .call(this.dragBehavior())\n      .on(\"dblclick\", async node => { \n        d3.event.stopPropagation();\n        d3.event.preventDefault();\n        \n        let knotView = await lively.openComponentInWindow(\"knot-view\");\n        knotView.loadKnotForURL(node.getKnot().url);\n      })\n      .on(\"click\", node => {\n        d3.event.stopPropagation();\n        d3.event.preventDefault();\n        \n        this.get('#knot-view').loadKnotForURL(node.getKnot().url);\n      })\n      .on(\"mouseout\", node => {})\n      .on(\"contextmenu\", async node => {\n        d3.event.stopPropagation();\n        d3.event.preventDefault();\n        \n        ContextMenu.openIn(document.body, d3.event, node.getKnot(), undefined, node.getKnot().collectContextMenuItems());\n      });\n\n    nodeElements.each(function (node) {\n\t\t\tnode.draw(d3.select(this));\n    });\n\n    nodeElements.append(\"text\")\n      .attr(\"class\", \"text\")\n      .style(\"text-anchor\", \"middle\")\n      .style(\"alignment-baseline\", \"middle\")\n      .text(d => d.label());\n\n    this.simulation = d3.forceSimulation()\n      .force(\"link\", d3.forceLink().id(d => d.index).distance(200))\n      //.force(\"collide\",d3.forceCollide(d => d.r + 8).iterations(16) )\n      .force(\"charge\", d3.forceManyBody().strength(node => node.isTriple() ? -190*0.5 : -190))\n      .force(\"center\", d3.forceCenter(this.chartWidth / 2, this.chartHeight / 2))\n      .force(\"y\", d3.forceY(0).strength(0.001))\n      .force(\"x\", d3.forceX(0).strength(0.001));\n\n    // Define this.Simulation\n    this.simulation\n      .nodes(nodes)\n      .on(\"tick\", function recalculatePositions() {\n        nodeElements.attr(\"transform\", d => \"translate(\" + d.x + \",\" + d.y + \")\");\n\n        hiddenLinkElements\n          .attr(\"x1\", d => d.source.x)\n          .attr(\"y1\", d => d.source.y)\n          .attr(\"x2\", d => d.target.x)\n          .attr(\"y2\", d => d.target.y);\n\n    \t\t// Set link paths and calculate additional information\n    \t\tlinkPathElements.attr(\"d\", function (link) {\n    \t\t\tif (link.isLoop()) {\n    \t\t\t\treturn math.calculateLoopPath(link);\n    \t\t\t}\n    \t\t\tvar curvePoint = link.triple;\n    \t\t\tvar pathStart = math.calculateIntersection(curvePoint, link.subject, 1);\n    \t\t\tvar pathEnd = math.calculateIntersection(curvePoint, link.object, 1);\n    \n    \t\t\treturn curveFunction([pathStart, curvePoint, pathEnd]);\n        });\n      });\n\n    this.simulation.force(\"link\")\n      .links(hiddenLinks);\n  }\n  \n  onReload() {\n    lively.notify(123);\n  }\n\n  prepareConfig() {\n    // links\n    var linkDistance = this.get('#link-distance');\n    linkDistance.addEventListener('input', () => {\n      lively.notify(`New link distance is ${linkDistance.value}`);\n      this.simulation.force(\"link\").distance(linkDistance.value);\n      this.simulation.alpha(1).restart();\n    });\n    \n    // nbody\n    let updateCharge = () => {\n      let knotChargeValue = knotCharge.value;\n      let tripleChargeValue = tripleCharge.value;\n      this.simulation.force(\"charge\").strength(node => node.isTriple() ? -tripleChargeValue : -knotChargeValue);\n    }\n    var knotCharge = this.get('#nbody-knot-strength');\n    knotCharge.addEventListener('input', () => {\n      lively.notify(`New knot charge is ${knotCharge.value}`);\n      updateCharge();\n      this.simulation.alpha(1).restart();\n    });\n    var tripleCharge = this.get('#nbody-triple-strength');\n    tripleCharge.addEventListener('input', () => {\n      lively.notify(`New triple charge is ${tripleCharge.value}`);\n      updateCharge();\n      this.simulation.alpha(1).restart();\n    });\n\n    // center\n    var forceCenterX = this.get('#force-center-x');\n    forceCenterX.addEventListener('input', () => {\n      lively.notify(`New center x is ${forceCenterX.value}`);\n      this.simulation.force(\"center\").x(forceCenterX.value);\n      this.simulation.alpha(1).restart();\n    });\n    var forceCenterY = this.get('#force-center-y');\n    forceCenterY.addEventListener('input', () => {\n      lively.notify(`New center y is ${forceCenterY.value}`);\n      this.simulation.force(\"center\").y(forceCenterY.value);\n      this.simulation.alpha(1).restart();\n    });\n    \n    // x and y\n    var forceXTarget = this.get('#force-x-target');\n    forceXTarget.addEventListener('input', () => {\n      lively.notify(`New force x target is ${forceXTarget.value}`);\n      this.simulation.force(\"x\").x(forceXTarget.value);\n      this.simulation.alpha(1).restart();\n    });\n    var forceYTarget = this.get('#force-y-target');\n    forceYTarget.addEventListener('input', () => {\n      lively.notify(`New force y target is ${forceYTarget.value}`);\n      this.simulation.force(\"y\").y(forceYTarget.value);\n      this.simulation.alpha(1).restart();\n    });\n    var forceXStrength = this.get('#force-x-strength');\n    forceXStrength.addEventListener('input', () => {\n      lively.notify(`New force x strength is ${forceXStrength.value}`);\n      this.simulation.force(\"x\").strength(forceXStrength.value);\n      this.simulation.alpha(1).restart();\n    });\n    var forceYStrength = this.get('#force-y-strength');\n    forceYStrength.addEventListener('input', () => {\n      lively.notify(`New force y strength is ${forceYStrength.value}`);\n      this.simulation.force(\"y\").strength(forceYStrength.value);\n      this.simulation.alpha(1).restart();\n    });\n  }\n\n  get zoomTranslateX() {\n    return this.getAttribute('data-zoom-translate-x');\n  }\n  set zoomTranslateX(x) {\n    this.setAttribute(\"data-zoom-translate-x\", x);\n    return this.zoomTranslateX;\n  }\n  get zoomTranslateY() {\n    return this.getAttribute('data-zoom-translate-y');\n  }\n  set zoomTranslateY(y) {\n    this.setAttribute(\"data-zoom-translate-y\", y);\n    return this.zoomTranslateY;\n  }\n  get zoomScale() {\n    return this.getAttribute('data-zoom-scale');\n  }\n  set zoomScale(scale) {\n    this.setAttribute(\"data-zoom-scale\", scale);\n    return this.zoomScale;\n  }\n  zoomBehavior() {\n    let zoom = d3.zoom()\n\t\t\t.duration(150)\n    \t.scaleExtent([MIN_MAGNIFICATION, MAX_MAGNIFICATION])\n      .on(\"zoom\", () => {\n        //try {\n        //  this.zoomTranslateX = d3.event.transform.x;\n        //  this.zoomTranslateY = d3.event.transform.y;\n        //  this.zoomScale = d3.event.transform.k;\n        //  lively.notify(`${this.zoomTranslateX}, ${this.zoomTranslateY}, ${this.zoomScale}`);\n        //} catch (e) {\n        //  lively.notify('X', 'y', 'red')\n        //}\n        this.graphContainer.attr(\"transform\", d3.event.transform)\n      });\n\n    //if(\n    //  this.zoomScale !== \"\" &&\n    //  this.zoomTranslateX !== \"\" &&\n    //  this.zoomTranslateY !== \"\"\n    //) {\n    //  let initialTransform = d3.zoomIdentity\n    //    .translate(this.zoomTranslateX, this.zoomTranslateY)\n    //    .scale(this.zoomScale);\n\n    //  zoom.scaleTo(this.graphContainer, this.zoomScale);\n    //  zoom.translateBy([\n    //    this.zoomTranslateX,\n    //    this.zoomTranslateY\n    //  ]);\n\n    //  this.graphContainer.call(zoom, initialTransform);\n    //}\n    \n    return zoom;\n  }\n\n  dragBehavior() {\n    return d3.drag()\n      .on(\"start\", d => {\n        if (!d3.event.active) this.simulation.alphaTarget(0.3).restart();\n        d.fx = d.x;\n        d.fy = d.y;\n      })\n      .on(\"drag\", d => {\n        d.fx = d3.event.x;\n        d.fy = d3.event.y;\n      })\n      .on(\"end\", d => {\n        if (!d3.event.active) this.simulation.alphaTarget(0);\n        d.fx = null;\n        d.fy = null;\n      });\n  }\n\n  setupStatistics(knots) {\n    const statistics = this.get('#statistics');\n    const numberOfKnots = aexpr(() => knots.length);\n    const numberOfTriples = aexpr(() => knots.filter(k => k.isTriple()).length);\n\n    statistics.appendChild(<div><span>Knots: {numberOfKnots}</span></div>);\n    statistics.appendChild(<div><span>Triple: {numberOfTriples}</span></div>);\n  }\n}\n"]}