{"version":3,"file":"diversification-growth-BwoYWtrp.js","sources":["../../../node_modules/d3-array/src/bisect.js","../../../app/javascript/components/viz/diversification/diversification-growth-graph.js","../../../app/javascript/components/viz/diversification/diversification-growth.vue"],"sourcesContent":["import ascending from \"./ascending.js\";\nimport bisector from \"./bisector.js\";\n\nvar ascendingBisect = bisector(ascending);\nexport var bisectRight = ascendingBisect.right;\nexport var bisectLeft = ascendingBisect.left;\nexport default bisectRight;\n","import * as d3 from '~/app/custom-d3'\nimport numeral from 'numeral'\n\nexport default class GrowthGraph {\n  constructor(el, funds, investedAmount) {\n    this.el = el\n    this.activeFund = null\n    this.funds = funds\n    this.fundEntries = d3.entries(funds)\n    this.investedAmount = investedAmount\n    this.margin = {\n      top: 20,\n      left: 70,\n      right: 40,\n      bottom: 30\n    }\n\n    this.options = this.generateBounds()\n    this.setup()\n\n    this.callbacks = {};\n  }\n\n  on(event, callback) {\n    this.callbacks[event] = callback\n  }\n\n  generateBounds() {\n    var bounds = this.el.getBoundingClientRect(),\n        height = 300,\n        width = 1100\n    if(height > bounds.width) {\n      height = bounds.width * 0.8\n    }\n    if(width > bounds.width) {\n      width = bounds.width\n    }\n    return {\n      height: height,\n      width: width\n    }\n  }\n\n  setup() {\n    this.svg = d3.select(this.el).append(\"svg\")\n        .attr('class', 'graph')\n        .attr('width', this.options.width)\n        .attr('height', this.options.height);\n\n    if ('ontouchstart' in document) {\n      this.svg.style('-webkit-tap-highlight-color', 'transparent')\n         .on('touchmove', this.moved.bind(this))\n         .on('touchend', this.left.bind(this))\n    } else {\n      this.svg.on('mousemove', this.moved.bind(this))\n              .on('mouseleave', this.left.bind(this));\n    }\n\n    // X-axis\n    this.xAxisEl = this.svg.append(\"g\")\n                 .attr(\"class\", \"x axis\")\n                 .attr(\"transform\", \"translate(\"+this.margin.left+\",\" + (this.options.height-this.margin.top-10) + \")\");\n    this.xAxisEl.append(\"text\")\n           .attr(\"class\", \"text-end\")\n           .attr(\"y\", -18)\n           .attr(\"x\", this.options.width-this.margin.right-this.margin.left-10)\n           .attr(\"dy\", \".71em\")\n           .text(\"Year\");\n\n    // Y-axis\n    this.yAxisEl = this.svg.append(\"g\")\n                 .attr(\"class\", \"y axis\")\n                 .attr(\"transform\", \"translate(\"+this.margin.left+\",\"+this.margin.top+\")\");\n    this.yAxisEl.append(\"text\")\n           .attr(\"class\", \"text-end rotate--90\")\n           .attr(\"y\", 6)\n           .attr(\"x\", this.margin.top*-1)\n           .attr(\"dy\", \".71em\")\n           .text(\"Value\");\n\n    // Lines\n    this.lines = this.svg.append(\"g\")\n                         .attr(\"transform\", \"translate(\"+this.margin.left+\",\"+this.margin.top+\")\")\n\n    // Dot for active point\n    this.dot = this.svg.append('g')\n                       .attr('display', 'none');\n    this.circle = this.dot.append('circle')\n                          .attr('r', 6);\n    this.tip = d3.tip().attr('class', 'd3-tip rounded').html(function(message) {\n       return `<p class='font-bold'>${message}</p>`;\n    }).offset([-12, 0]);\n    this.svg.call(this.tip)\n\n  }\n\n  update(funds, data, yearRange) {\n    this.years = d3.range(yearRange[0], yearRange[1]+1)\n    this.funds = funds\n    this.fundEntries = d3.entries(funds)\n    this.growthData = this.generateGrowthData(data, yearRange[0], yearRange[1])\n\n    this.updateYAxis(this.growthData)\n    this.updateXAxis(yearRange)\n    this.updateGrowthLines(this.growthData, yearRange[0])\n  }\n\n  generateGrowthData(data, startYear, endYear) {\n    return this.fundEntries.map((fund, index) => {\n      return {\n        fund: fund,\n        returns: this.fundReturns(fund.key, data, startYear, endYear)\n      }\n    })\n  }\n\n  // Generates an array of returns for this fund\n  fundReturns(symbol, data, startYear, endYear) {\n    // Limit the data to the year range\n    var yearlyData = data.filter((d) => ((d.year >= startYear) && (d.year < endYear)))\n\n    var amount = this.investedAmount\n    var returns = yearlyData.map((yearData) => {\n      amount = amount * (1 + yearData.results[symbol]/100);\n      return amount;\n    })\n    returns.unshift(this.investedAmount)\n    return returns\n  }\n\n  // X-axis is for the risk\n  updateXAxis(years) {\n    this.xScale = d3.scaleLinear()\n        .domain(years)\n        .range([0, this.options.width - this.margin.left - this.margin.right]);\n    var xAxis = d3.axisBottom().scale(this.xScale).tickFormat((d) => d).ticks(3)\n    this.xAxisEl.call(xAxis);\n  }\n\n  // Y-axis is the average returns\n  updateYAxis(growthData) {\n    var maxValue = d3.max(growthData, (d) => d3.max(d.returns)),\n        minValue = d3.min(growthData, (d) => d3.min(d.returns));\n    if(minValue > 0) { minValue = 0; }\n    this.yScale = d3.scaleLinear()\n        .domain([maxValue+1000, minValue])\n        .range([0, this.options.height - this.margin.bottom - this.margin.top])\n\n    var yAxis = d3.axisLeft().scale(this.yScale).ticks(6).tickFormat((d) => `${numeral(d).format('$0,0')}`)\n    this.yAxisEl.call(yAxis);\n  }\n\n  updateGrowthLines(growthData, startYear) {\n    var line = d3.line()\n                 .x((d, i) => this.xScale(startYear + i))\n                 .y((d, i) => this.yScale(d))\n\n    this.lines.selectAll('path')\n              .data(growthData)\n              .enter()\n              .append('path')\n              .attr('class', 'line stroke-width-sm blend-multiply rendering-crisp linejoin-round linecap-round')\n    this.lines.selectAll('path')\n              .transition().duration(1000)\n    this.lines.selectAll('path')\n              .attr('sector', (d) => d.fund.key)\n              .attr('d', (d) => line(d.returns))\n              .style('stroke', (d) => d.fund.value.style.darkColor)\n  }\n\n  moved() {\n    d3.event.preventDefault();\n\n    // X/Year - Find the X coordinate for the current hover position\n    var exactYear = this.xScale.invert(d3.event.layerX-this.margin.left);\n    const upperYearIndex = d3.bisectLeft(this.years, exactYear, 1);\n    const lowerYearIndex = upperYearIndex - 1;\n    const yearIndex = (exactYear - this.years[lowerYearIndex]) > (this.years[upperYearIndex] - exactYear) ? upperYearIndex : lowerYearIndex;\n\n    // Y/Fund - Find the Y coordinate for the current hover position\n    var ym = this.yScale.invert(d3.event.layerY-this.margin.top);\n    var newFund = this.growthData.reduce((a, b) => Math.abs(a.returns[yearIndex] - ym) < Math.abs(b.returns[yearIndex] - ym) ? a : b);\n\n    // Highlight the active fund\n    if(this.activeFund != newFund) {\n      this.activeFund = newFund\n      this.callbacks['activate']('')\n      setTimeout(() => this.callbacks['activate'](newFund.fund.key), 5)\n    }\n\n    var xDot = this.xScale(this.years[yearIndex]) + this.margin.left,\n        yDot = this.yScale(this.activeFund.returns[yearIndex]) + this.margin.top;\n    this.dot.attr('display', null)\n            .attr(\"transform\", `translate(${xDot},${yDot})`)\n    this.circle.style('fill', this.activeFund.fund.value.style.darkColor)\n    var message = `<span class=\"text-${this.activeFund.fund.value.style.lightClass}\">${this.activeFund.fund.value.label} - ${numeral(this.activeFund.returns[yearIndex]).format('$0,0')}</span>`\n    this.tip.style('color', this.activeFund.fund.value.style.darkColor)\n            .style('background-color', this.activeFund.fund.value.style.darkColor)\n    this.tip.show(message, this.circle.node())\n  }\n\n  left() {\n    this.dot.attr('display', 'none')\n    this.tip.hide()\n    this.lines.selectAll('path')\n              .style('stroke', (d) => d.fund.value.style.darkColor)\n              .classed('stroke-width-sm', true)\n              .classed('stroke-width-lg', false)\n  }\n\n  highlight(sector) {\n    this.lines.selectAll('path')\n              .style('stroke', '')\n              .classed('z-10', false)\n              .classed('stroke-grey-300', true)\n              .classed('stroke-width-sm', true)\n              .classed('stroke-width-lg', false)\n\n    if(sector && (sector.length !== 0)) {\n      var line = this.lines.select(`[sector=${sector}]`)\n                .style('stroke', this.funds[sector].style.darkColor)\n                .classed('z-10', true)\n                .classed('stroke-grey-300', false)\n                .classed('stroke-width-sm', false)\n                .classed('stroke-width-lg', true)\n    }\n  }\n}\n","<template>\n  <div class='growth-graph'></div>\n</template>\n\n<script>\nimport GrowthGraph from './diversification-growth-graph'\n\nexport default {\n  props: ['funds', 'yearRange', 'data', 'activeFund', 'investedAmount'],\n  watch: {\n    activeFund: function(newActiveFund) {\n      this.growthGraph.highlight(newActiveFund)\n    },\n    data: {\n      handler: function (newData) {\n        this.updateGraph(this.funds, newData, this.yearRange);\n      },\n      deep: true\n    },\n    funds: {\n      handler: function (newFunds) {\n        this.updateGraph(newFunds, this.data, this.yearRange);\n      },\n      deep: true\n    },\n    yearRange: {\n      handler: function (newYearRange) {\n        this.updateGraph(this.funds, this.data, newYearRange);\n      },\n      deep: true\n    },\n  },\n  mounted() {\n    this.growthGraph = new GrowthGraph(this.$el, this.funds, this.investedAmount)\n    this.updateGraph(this.funds, this.data, this.yearRange)\n\n    this.growthGraph.on('activate', (symbol) => {\n      this.$emit('activateFund', symbol)\n    })\n  },\n  methods: {\n    updateGraph(funds, data, yearRange) {\n      this.growthGraph.update(funds, data, yearRange)\n    }\n  }\n}\n</script>\n"],"names":["ascendingBisect","bisector","ascending","bisectLeft","GrowthGraph","el","funds","investedAmount","d3.entries","event","callback","bounds","height","width","d3.select","d3.tip","message","data","yearRange","d3.range","startYear","endYear","fund","index","symbol","yearlyData","d","amount","returns","yearData","years","d3.scaleLinear","xAxis","d3.axisBottom","growthData","maxValue","d3.max","minValue","d3.min","yAxis","d3.axisLeft","numeral","line","d3.line","i","d3.event","exactYear","upperYearIndex","d3.bisectLeft","lowerYearIndex","yearIndex","ym","newFund","a","b","xDot","yDot","sector","_sfc_main","newActiveFund","newData","newFunds","newYearRange","_hoisted_1","_openBlock","_createElementBlock"],"mappings":"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","x_google_ignoreList":[0]}