{"version":3,"sources":["https://lively-kernel.org/lively4/BP2019RH1/components/bp2019-y-axis-widget.js"],"names":["d3","Morph","DataProcessor","ReGL","getRandomInteger","deepCopy","assertListenerInterface","InspectAction","FilterAction","ColorAction","GroupAction","NullAction","Bp2019YAxisWidget","initialize","name","listeners","canvas","get","renderer","_createReglContextOnCanvas","canvasMargin","style","marginLeft","left","marginTop","top","scalesSVG","select","attr","width","right","height","bottom","xAxisGroup","xScale","scaleBand","padding","yAxisGroup","yScale","groupingInformation","currentActions","controlWidget","addListener","setData","data","activate","listener","push","applyActionFromRootApplication","action","_dispatchAction","applyAction","isGlobal","forEach","_draw","_initializeData","originalData","initializeAfterDataFetch","_initializeAxes","_resetAxes","_runCurrentActions","stop","_handleGroupAction","_handleColorAction","_handleSelectAction","_handleFilterAction","_handleNullAction","_handleNotSupportedAction","drawPoints","pointWidth","points","context","getContext","individual","drawing","currentPosition","_getCanvasSize","axesGroups","x","y","scales","range","Object","keys","axisName","attributes","scale","domain","axis","axisBottom","axisLeft","call","attribute","_handleGroupingActionAmount","_handleGroupingActionAttribute","otherAxis","groupingAttribute","lively","notify","values","getValuesForAttribute","amountsByValues","maxValue","value","individualValue","getUniqueValueFromIndividual","Math","max","scaleLinear","selectAll","reverse","bandwidth","runOn","key","getBoundingClientRect"],"mappings":"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","file":"bp2019-y-axis-widget.js","sourcesContent":["\"enable aexpr\";\n\nimport d3 from 'src/external/d3.v5.js'\n\nimport Morph from 'src/components/widgets/lively-morph.js';\n\nimport DataProcessor from '../src/internal/individuals-as-points/common/data-processor.js'\nimport { ReGL } from \"../src/internal/individuals-as-points/common/regl-point-wrapper.js\"\nimport { getRandomInteger, deepCopy } from \"../src/internal/individuals-as-points/common/utils.js\"\n\nimport { assertListenerInterface } from \"../src/internal/individuals-as-points/common/interfaces.js\";\n\nimport { \n  InspectAction, \n  FilterAction, \n  ColorAction, \n  GroupAction, \n  NullAction \n} from '../src/internal/individuals-as-points/common/actions.js'\n\nexport default class Bp2019YAxisWidget extends Morph {\n  async initialize() {\n    this.name = \"yAxisWidget\"\n    \n    this.listeners = []\n    \n    this.canvas = this.get(\"#y-axis-widget-canvas\")\n    this.renderer = this._createReglContextOnCanvas()\n    \n    this.canvasMargin = {\"left\": 100, \"top\": 30, \"right\": 0, \"bottom\": 100}\n    \n    this.canvas.style.marginLeft = this.canvasMargin.left + \"px\"\n    this.canvas.style.marginTop = this.canvasMargin.top + \"px\"\n    \n    this.scalesSVG = d3.select(this.get(\"#scales-svg\"))\n    this.scalesSVG \n      .attr('width', this.canvas.width + this.canvasMargin.left + this.canvasMargin.right)\n      .attr('height', this.canvas.height + this.canvasMargin.bottom + this.canvasMargin.top)\n      .attr('class', 'svg-plot')\n    \n    let xAxisGroup = d3.select(this.get(\"#x-axis-group\"))\n    let xScale = d3.scaleBand().padding(0.1)\n    \n    let yAxisGroup = d3.select(this.get(\"#y-axis-group\"))\n    let yScale = d3.scaleBand().padding(0.1)\n    \n    this.groupingInformation = {\n      \"attributes\": {\n        \"x\": \"\",\n        \"y\": \"\"\n      },\n      \"axesGroups\": {\n        \"x\": xAxisGroup,\n        \"y\": yAxisGroup\n      },\n      \"scales\": {\n        \"x\": xScale,\n        \"y\": yScale\n      },\n    }\n    \n    this.currentActions = {\n      \"x\": new NullAction(),\n      \"y\": new NullAction(),\n      \"color\": new NullAction(),\n      \"filter\": new NullAction(),\n      \"select\": new NullAction(),\n    }\n        \n    this.controlWidget = this.get(\"#control-widget\")\n    this.controlWidget.addListener(this)\n  }\n  \n  // ------------------------------------------\n  // Public Methods\n  // ------------------------------------------\n  \n  async setData(data) {\n    this.data = data\n    this.activate()\n  }\n  \n  addListener(listener) {\n    assertListenerInterface(listener)\n    this.listeners.push(listener)\n  }\n  \n  async applyActionFromRootApplication(action) {\n    this._dispatchAction(action)\n  }\n  \n  applyAction(action) {\n    if (action.isGlobal) {\n      this.listeners.forEach(listener => {\n        listener.applyAction(action)\n      })\n    } else {\n      this._dispatchAction(action)\n    }\n    this._draw()\n  }\n  \n  async activate() {\n    this._initializeData()\n    this.originalData = deepCopy(this.data)\n    this.controlWidget.initializeAfterDataFetch()\n    this._initializeAxes()\n    this._resetAxes()\n    this._runCurrentActions()\n    this._draw()\n  }\n  \n  async stop() {\n    \n  }\n  \n  // ------------------------------------------\n  // Private Methods\n  // ------------------------------------------\n  \n  _dispatchAction(action) {\n    switch(true) {\n      case (action instanceof GroupAction):\n        this._handleGroupAction(action);\n        break;\n      case (action instanceof ColorAction):\n        this._handleColorAction(action);\n        break;\n      case (action instanceof InspectAction):\n        this._handleSelectAction(action);\n        break;\n      case (action instanceof FilterAction):\n        this._handleFilterAction(action);\n        break;\n      case (action instanceof NullAction):\n        this._handleNullAction(action)\n        break;\n      default:\n        this._handleNotSupportedAction(action);\n    }\n  }\n  \n  _draw() {\n    this.renderer.drawPoints({\n      pointWidth: 5,\n      points: this.data\n    })\n  }\n  \n  _createReglContextOnCanvas(){\n    let context = this.canvas.getContext(\"webgl\"); \n    return new ReGL(context);\n  }\n  \n  _initializeData() {\n    this.data.forEach(individual => {\n      individual.drawing.currentPosition = {\n        \"x\": getRandomInteger(0, this._getCanvasSize().width),\n        \"y\": getRandomInteger(0, this._getCanvasSize().height)\n      }\n    })\n  }\n  \n  _initializeAxes() {\n    this.groupingInformation.axesGroups.x.attr(\n      'transform', \n      `translate(${this.canvasMargin.left - 0.2 * this.canvasMargin.left}, ${this._getCanvasSize().height + this.canvasMargin.top})`\n    )\n    this.groupingInformation.axesGroups.y.attr(\n      'transform', \n      `translate(${this.canvasMargin.left - 0.2 * this.canvasMargin.left}, ${this.canvasMargin.top})`\n    )\n    this.groupingInformation.scales.x.range([0, this._getCanvasSize().width])\n    this.groupingInformation.scales.y.range([0, this._getCanvasSize().height]) \n  }\n  \n  _resetAxes() {\n    Object.keys(this.groupingInformation.axesGroups).forEach(axisName => {\n      this.groupingInformation.attributes[axisName] = \"\"\n      \n      let scale = this.groupingInformation.scales[axisName]\n      scale.domain([])\n      \n      let axis\n      if (axisName === \"x\") {\n        axis = d3.axisBottom(scale)\n      } else {\n        axis = d3.axisLeft(scale)\n      }\n      \n      this.groupingInformation.axesGroups[axisName].call(axis)\n    })\n  }\n  \n  _handleGroupAction(action) {\n    if (action.attribute === \"amount\") {\n      this._handleGroupingActionAmount(action)\n    } else {\n      this._handleGroupingActionAttribute(action)\n    }\n    \n    this.groupingInformation.attributes[action.axis] = action.attribute\n    this.currentActions[action.axis] = action\n    \n    let otherAxis = action.axis === \"x\" ? \"y\" : \"x\"\n    if (this.groupingInformation.attributes[otherAxis] === \"amount\") {\n      this._handleGroupAction(this.currentActions[otherAxis])\n    }\n  }\n  \n  _handleGroupingActionAmount(action) {\n    let axisName = action.axis\n    let otherAxis = axisName === \"x\" ? \"y\" : \"x\"\n    let groupingAttribute = this.groupingInformation.attributes[otherAxis]\n    \n    if (groupingAttribute === \"amount\" || groupingAttribute === \"\") {\n      lively.notify(\"you cannot get an amount of amounts or randomness\")\n      return\n    }\n    \n    let values = DataProcessor.getValuesForAttribute(groupingAttribute)\n    let amountsByValues = {}\n    let maxValue = 0\n    values.forEach(value => {\n      amountsByValues[value] = 0\n    })\n    this.data.forEach(individual => {\n      let individualValue = DataProcessor.getUniqueValueFromIndividual(individual, groupingAttribute)\n      amountsByValues[individualValue] += 1\n      maxValue = Math.max(maxValue, amountsByValues[individualValue])\n    })\n    \n    let scale = d3.scaleLinear().domain([0, maxValue]).range(axisName === \"x\" ? [0, this.canvas.width] : [this.canvas.height, 0])\n    \n    this.data.forEach(individual => {\n      let individualValue = DataProcessor.getUniqueValueFromIndividual(individual, groupingAttribute)\n      if (axisName === \"x\") {\n        individual.drawing.currentPosition[axisName] = getRandomInteger(0, scale(amountsByValues[individualValue]))\n      } else {\n        individual.drawing.currentPosition[axisName] = getRandomInteger(scale(amountsByValues[individualValue]), this.canvas.height)\n      }\n    })\n    \n    let axis\n    if (axisName === \"x\") {\n      axis = d3.axisBottom(scale)\n    } else {\n      axis = d3.axisLeft(scale)\n    }\n    \n    this.groupingInformation.axesGroups[axisName].call(axis)\n    if (axisName === \"x\") {\n      this.groupingInformation.axesGroups[axisName].selectAll(\"text\")\n          .attr(\"y\", 0)\n          .attr(\"x\", 9)\n          .attr(\"dy\", \".35em\")\n          .attr(\"transform\", \"rotate(90)\")\n          .style(\"text-anchor\", \"start\");\n    }\n  }\n  \n  _handleGroupingActionAttribute(action) {\n    let groupingAttribute = action.attribute\n    let values = DataProcessor.getValuesForAttribute(groupingAttribute)\n    \n    let axisName = action.axis\n    \n    this.groupingInformation.scales[axisName].domain(axisName === \"x\" ? values : values.reverse())\n    \n    let scale = this.groupingInformation.scales[axisName]\n    let bandwidth = this.groupingInformation.scales[axisName].bandwidth()\n    \n    this.data.forEach(individual => {\n      let individualValue = DataProcessor.getUniqueValueFromIndividual(individual, groupingAttribute)\n      individual.drawing.currentPosition[axisName] = scale(individualValue) + getRandomInteger(0, bandwidth)\n    })\n    \n    let axis\n    if (axisName === \"x\") {\n      axis = d3.axisBottom(scale)\n    } else {\n      axis = d3.axisLeft(scale)\n    }\n    \n    this.groupingInformation.axesGroups[axisName].call(axis)\n    if (axisName === \"x\") {\n      this.groupingInformation.axesGroups[axisName].selectAll(\"text\")\n          .attr(\"y\", 0)\n          .attr(\"x\", 9)\n          .attr(\"dy\", \".35em\")\n          .attr(\"transform\", \"rotate(90)\")\n          .style(\"text-anchor\", \"start\");\n    }\n  }\n       \n  _handleColorAction(action) {\n    this.data = action.runOn(this.data)\n    \n    this.currentActions[\"color\"] = action\n  }\n        \n  _handleFilterAction(action) {\n    this.data = deepCopy(this.originalData)\n    \n    Object.keys(this.currentActions).forEach(key => {\n      if (key !== \"filter\") {\n        this._dispatchAction(this.currentActions[key])\n      }\n    })  \n    \n    this.data = action.runOn(this.data)\n    \n    this.currentActions[\"filter\"] = action\n  }\n        \n  _handleSelectAction(action) {\n    this.currentActions[\"select\"] = action \n  }\n  \n  _handleNullAction(action) {\n    \n  }\n        \n  _handleNotSupportedAction(action) {\n    lively.notify(\"This Action is not Supported!\")\n  }\n  \n  _getCanvasSize() {\n    return this.canvas.getBoundingClientRect()\n  }\n  \n  _runCurrentActions() {\n    Object.keys(this.currentActions).forEach(key => {\n      this._dispatchAction(this.currentActions[key])\n    })\n  }\n}"]}