{"version":3,"sources":["https://lively-kernel.org/lively4/BP2019RH1/src/internal/individuals-as-points/map/menu.js"],"names":["d3","Menu","constructor","menuDiv","legend","colorAttributes","themeAttributes","dataHandler","drawingCanvas","selectedValues","create","createSelects","createApplyButton","getAttributeOptions","createSelectOptions","addEventListenerToColorSelect","addEventListenerToValueSelects","addEventListenerToApplyButton","selection","lively","query","legendDiv","colorSelect","document","createElement","id","insertBefore","forEach","attribute","select","class","multiple","style","applyButton","innerHTML","attributeOptions","options","getValuesOfAttribute","length","sort","Option","Object","keys","key","option","size","on","selectedAttribute","selectedIndex","value","makeSelectsInvisible","clearSelected","getSelectValues","includes","selected","addEventListener","clearLegend","selectedThemes","setColorByThemeAttribute","setColorByAttribute","createLegend","draw","attributeSelect","result","attributeOption","i","push","clear","removeChild","elements","selectAll","remove","setAttribute","attributeValues","data","enter","append","attr","d","color","colorMap","r","g","b","a","text"],"mappings":"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","file":"menu.js","sourcesContent":["import d3 from \"src/external/d3.v5.js\"\n\nexport class Menu {\n  \n  constructor(menuDiv, legend, colorAttributes, themeAttributes, dataHandler, drawingCanvas) {\n    this.dataHandler = dataHandler\n    this.drawingCanvas = drawingCanvas\n    this.colorAttributes = colorAttributes\n    this.themeAttributes = themeAttributes\n    this.legend = legend\n    this.menuDiv = menuDiv\n    this.selectedValues = {}\n  }\n  \n  create() {\n    this.createSelects()\n    this.createApplyButton()\n    this.getAttributeOptions()\n    this.createSelectOptions()\n    this.addEventListenerToColorSelect()\n    this.addEventListenerToValueSelects()\n    this.addEventListenerToApplyButton()\n  }\n  \n  createSelects() {\n    this.selection = lively.query(this.menuDiv, \"#bp2019-map-control-widget-selection\")\n    this.legendDiv = lively.query(this.menuDiv, \"#bp2019-map-control-widget-legend-div\")\n    \n    this.colorSelect = document.createElement('select')\n    this.colorSelect.id = \"color-select\"\n    this.selection.insertBefore(this.colorSelect, this.legendDiv)\n    \n    this.colorAttributes.forEach(attribute => {\n      let select = document.createElement('select')\n      select.id = attribute + \"-select\"\n      select.class = \"select\"\n      select.multiple = true\n      d3.select(select).style(\"display\", \"none\")\n      this.selection.insertBefore(select, this.legendDiv)\n    })    \n  }\n  \n  createApplyButton() {\n    this.applyButton = document.createElement('button')\n    this.applyButton.id = \"apply-button\"\n    this.applyButton.innerHTML = \"Apply\"\n    this.selection.insertBefore(this.applyButton, this.legendDiv)\n  }\n  \n  getAttributeOptions() {\n    this.attributeOptions = {}\n    this.colorAttributes.forEach(attribute => {\n      let options\n      if(attribute !== \"themes\") {\n        options = this.dataHandler.getValuesOfAttribute(attribute)\n      } else {\n        options = this.themeAttributes\n      }\n      \n      if (options.length > 0) {\n        options.sort()\n        this.attributeOptions[attribute] = options\n      } else {\n        this.attributeOptions[attribute] = []\n      }\n    })\n  }\n  \n  createSelectOptions() {\n    this.colorAttributes.forEach(attribute => {\n      this.colorSelect.options[this.colorSelect.options.length] = new Option(attribute)\n    })\n    \n    Object.keys(this.attributeOptions).forEach(key => {\n      let select = lively.query(this.menuDiv, \"#\" + key + \"-select\")\n      select.options[0] = new Option(\"all\")\n      this.attributeOptions[key].forEach(option => {\n        select.options[select.options.length] = new Option(option)\n      }) \n      \n      if (select.options.length > 10) {\n        select.size = \"10\"\n      } else {\n        select.size = select.options.length\n      }\n\n    })\n  }\n  \n  addEventListenerToColorSelect() {\n    d3.select(this.colorSelect).on(\"change\", () => {\n      let selectedAttribute = this.colorSelect.options[this.colorSelect.selectedIndex].value\n      \n      this.makeSelectsInvisible()\n      \n      this.clearSelected() \n      \n      this.colorAttributes.forEach(attribute => {\n        if (selectedAttribute === attribute) {\n          let select = lively.query(this.menuDiv, \"#\" + attribute + \"-select\")\n          d3.select(select).style(\"display\", \"inline-grid\")\n        }\n      })\n    })\n  }\n  \n  addEventListenerToValueSelects() {\n    Object.keys(this.attributeOptions).forEach(key => {\n      let select = lively.query(this.menuDiv, \"#\" + key + \"-select\")\n      d3.select(select).on(\"change\", () => {\n        this.selectedValues[key] = this.getSelectValues(select)\n        if (this.selectedValues[key].includes(\"all\")) {\n          this.clearSelected()\n          select.options[0].selected = true\n          this.selectedValues[key] = []\n        }\n      })\n    })\n  }\n  \n  addEventListenerToApplyButton() {\n    this.applyButton.addEventListener(\"click\", () => {\n      this.clearLegend()\n      this.dataHandler.selectedThemes = null\n      let selectedAttribute = this.colorSelect.options[this.colorSelect.selectedIndex].value\n      \n      this.colorAttributes.forEach(attribute => {\n        if (!this.selectedValues[attribute]) {\n          this.selectedValues[attribute] = this.attributeOptions[attribute]\n        }\n      })\n      \n      if (selectedAttribute === \"themes\") {\n        this.dataHandler.selectedThemes = this.selectedValues[\"themes\"]\n        this.dataHandler.setColorByThemeAttribute()\n      } else if (this.colorAttributes.includes(selectedAttribute)) {\n        this.dataHandler.setColorByAttribute(this.selectedValues[selectedAttribute], selectedAttribute)\n      } else {\n        this.dataHandler.setColorByAttribute([], selectedAttribute)\n      } \n      \n      this.createLegend()\n      this.drawingCanvas.draw()\n    })\n  }\n  \n  getSelectValues(attributeSelect) {\n    let result = []\n    let options = attributeSelect && attributeSelect.options\n    let attributeOption\n\n    for (let i=0; i < options.length; i++) {\n      attributeOption = options[i]\n      if (attributeOption.selected) {\n        result.push(attributeOption.value)\n      }\n    }\n    return result\n  }\n  \n  clear() {\n    this.clearLegend()\n    this.makeSelectsInvisible()\n    this.colorAttributes.forEach(attribute => {\n      let select = lively.query(this.menuDiv, \"#\" + attribute + \"-select\")\n      this.selection.removeChild(select)\n    })\n    this.selection.removeChild(this.colorSelect)\n    this.selection.removeChild(this.applyButton)\n  }\n  \n  makeSelectsInvisible() {\n    this.colorAttributes.forEach(attribute => {\n        let select = lively.query(this.menuDiv, \"#\" + attribute + \"-select\")\n        d3.select(select).style(\"display\", \"none\")\n    })\n  }\n  \n  clearSelected() {\n    Object.keys(this.attributeOptions).forEach(key => {\n      let select = lively.query(this.menuDiv, \"#\" + key + \"-select\")\n      let elements = select.options\n\n      for(var i = 0; i < elements.length; i++){\n        elements[i].selected = false\n      } \n    })\n  }\n  \n  clearLegend() {\n    d3.select(this.legend).selectAll(\"*\").remove()\n    this.legend\n      .setAttribute(\"viewBox\", \"0 0 400 0\")\n  }\n  \n  createLegend() {\n    this.legend\n      .setAttribute(\"viewBox\", \"0 0 400 \" + this.dataHandler.attributeValues.length * 25)\n    \n    d3.select(this.legend).selectAll(\"dots\")\n      .data(this.dataHandler.attributeValues)\n      .enter()\n      .append(\"circle\")\n        .attr(\"cx\", 10)\n        .attr(\"cy\", function(d,i){ return 10 + i*25})\n        .attr(\"r\", 7)\n        .style(\"fill\", (d) => { \n          let color = this.dataHandler.colorMap[d]\n          return \"rgba(\" + color.r + \",\" + color.g + \",\" + color.b + \",\" + color.a + \")\"})\n    \n    d3.select(this.legend).selectAll(\"labels\")\n      .data(this.dataHandler.attributeValues)\n      .enter()\n      .append(\"text\")\n        .attr(\"x\", 30)\n        .attr(\"y\", function(d,i){ return 10 + i*25})\n        .text(function(d){ return d})\n        .attr(\"text-anchor\", \"left\")\n        .style(\"alignment-baseline\", \"middle\")\n  }\n}"]}