{"version":3,"file":"equation_chart_controller-BKmLcsdW.js","sources":["../../../app/javascript/entrypoints/controllers/equation_chart_controller.jsx"],"sourcesContent":["/** @jsx renderer.create */\n\nimport { Controller } from \"@hotwired/stimulus\";\nimport dayjs from \"dayjs\";\n\nimport {\n Chart,\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\n Legend,\n} from \"chart.js\";\nimport ChartDataLabels from \"chartjs-plugin-datalabels\";\n\nimport _ from \"lodash\";\n\nimport { useWindowResize } from \"stimulus-use\";\nimport { useResize } from \"stimulus-use\";\nimport currency from \"currency.js\";\n\nimport { CommonDOMRenderer } from \"render-jsx/dom\";\n\nimport numbro from \"numbro\";\n\nimport { ticksCallback } from \"../utils\";\n\nChart.register(\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\n Legend,\n ChartDataLabels\n);\n\nconst red = \"rgba(255, 0, 0, 1)\";\nconst black = \"rgb(0, 0, 0, 1)\";\n\nconst tooltipWidth = 500;\n\nconst getOrCreateLegendList = (chart, id) => {\n const legendContainer = document.getElementById(id);\n let listContainer = legendContainer.querySelector(\"ul\");\n\n if (!listContainer) {\n listContainer = document.createElement(\"ul\");\n listContainer.style.display = \"flex\";\n listContainer.style.flexDirection = \"row\";\n listContainer.style.margin = 0;\n listContainer.style.padding = 0;\n\n legendContainer.appendChild(listContainer);\n }\n\n return listContainer;\n};\n\nexport default class extends Controller {\n chart = null;\n initial = false;\n values = [];\n labels = [];\n\n static targets = [\"chart\"];\n\n static values = {\n jsonData: Object,\n };\n\n initialize() {\n this.resize = _.debounce(this.resize, 250).bind(this);\n this.windowResize = _.debounce(this.windowResize, 250).bind(this);\n\n Chart.defaults.plugins.legend.onHover = function () {\n document.body.style.cursor = \"pointer\";\n };\n\n Chart.defaults.plugins.legend.onLeave = function () {\n document.body.style.cursor = \"unset\";\n };\n }\n\n chartTargetDisconnect(element) {\n const chart = Chart.getChart(element.id);\n if (chart) {\n chart.destroy();\n }\n }\n\n jsonDataValueChanged() {\n if (!this.initial) {\n this.initial = true;\n } else {\n let chart = Chart.getChart(\"canvas-element\");\n\n const parsedData = this.jsonDataValue;\n\n const parsedEntries = parsedData.entries.map((entry) =>\n JSON.parse(entry)\n );\n const datasets = parsedEntries.map((entry) => ({\n type: \"line\",\n label: entry.name,\n data: Object.values(entry.rows),\n backgroundColor: entry.color,\n segmentColor: entry.color,\n borderColor: entry.color,\n ...this.baseDatalabelOptions(),\n }));\n\n const firstDataset = parsedEntries[0];\n const rows = firstDataset.rows;\n\n this.values = datasets;\n\n this.min = Math.min(...parsedEntries.map((entry) => entry.min)) || null;\n this.max = Math.max(...parsedEntries.map((entry) => entry.max)) || null;\n\n this.dataType = firstDataset.data_type;\n this.reverse = firstDataset.upside_down;\n this.decimalPlaces = firstDataset.decimal_places;\n this.tracking = firstDataset.tracking;\n this.endOfWeek = firstDataset.end_of_week;\n\n this.equations = firstDataset.equations;\n\n if (this.tracking == \"week\") {\n this.labels = Object.keys(firstDataset.rows).map(\n (key) => this.endOfWeek[key]\n );\n } else {\n this.labels = Object.keys(firstDataset.rows) || [];\n }\n\n if (chart) {\n chart.data.labels = this.labels;\n chart.data.datasets = this.values;\n\n chart.options = this.options(rows);\n\n chart.update(\"reset\");\n chart.update(\"normal\");\n } else {\n const ctx = document.getElementById(\"canvas-element\").getContext(\"2d\");\n this.createChart(ctx, rows, this.element);\n }\n }\n }\n\n chartTargetConnected(element) {\n useWindowResize(this);\n useResize(this);\n\n const parsedData = this.jsonDataValue;\n\n if (_.isEmpty(parsedData)) {\n return;\n }\n\n const ctx = document.getElementById(element.id).getContext(\"2d\");\n\n const parsedEntries = parsedData.entries.map((entry) => JSON.parse(entry));\n const datasets = parsedEntries.map((entry) => ({\n type: \"line\",\n label: entry.name,\n data: Object.values(entry.rows),\n backgroundColor: entry.color,\n segmentColor: entry.color,\n borderColor: entry.color,\n ...this.baseDatalabelOptions(),\n }));\n\n const firstDataset = JSON.parse(parsedData.entries[0]);\n const data = firstDataset.rows;\n\n this.values = datasets;\n this.equations = firstDataset.equations;\n\n this.min = Math.min(...parsedEntries.map((entry) => entry.min)) || null;\n this.max = Math.max(...parsedEntries.map((entry) => entry.max)) || null;\n\n this.dataType = firstDataset.data_type;\n this.reverse = firstDataset.upside_down;\n this.decimalPlaces = firstDataset.decimal_places;\n this.tracking = firstDataset.tracking;\n this.endOfWeek = firstDataset.end_of_week;\n\n if (this.tracking == \"week\") {\n this.labels = Object.keys(firstDataset.rows).map(\n (key) => this.endOfWeek[key]\n );\n } else {\n this.labels = Object.keys(firstDataset.rows) || [];\n }\n\n if (_.isEmpty(this.labels) || _.isEmpty(this.values)) {\n return;\n }\n\n this.createChart(ctx, data, element);\n }\n\n getOrCreateTooltip = (chart) => {\n let tooltipEl = chart.canvas.parentNode.querySelector(\"div\");\n\n if (!tooltipEl) {\n tooltipEl = document.createElement(\"div\");\n\n tooltipEl.classList.add(\n \"bg-gray-100\",\n \"text-black\",\n \"rounded\",\n \"shadow-lg\",\n \"border\"\n );\n\n tooltipEl.style.opacity = 1;\n tooltipEl.style.pointerEvents = \"none\";\n tooltipEl.style.position = \"absolute\";\n tooltipEl.style.transform = \"translate(-50%, 0)\";\n tooltipEl.style.transition = \"all .1s ease\";\n tooltipEl.style.zIndex = \"9999999999999999999999\";\n\n const table = document.createElement(\"table\");\n table.style.margin = \"0px\";\n\n tooltipEl.appendChild(table);\n chart.canvas.parentNode.appendChild(tooltipEl);\n }\n\n return tooltipEl;\n };\n\n externalTooltipHandler = (context) => {\n const { chart, tooltip } = context;\n const tooltipEl = this.getOrCreateTooltip(chart);\n\n tooltipEl.innerHTML = \"\";\n\n if (tooltip.opacity === 0) {\n tooltipEl.style.opacity = 0;\n return;\n }\n\n if (tooltip.body) {\n const bodyLines = tooltip.body.map((b) => b.lines);\n const titleLines = tooltip.title || [];\n const renderer = new CommonDOMRenderer();\n\n renderer\n .render(\n
\n
\n

\n {dayjs(titleLines[0]).format(\"MMM DD, YYYY\")}\n

\n
\n
\n
Equation: 
\n
{this.equations[titleLines[0]]}
\n
\n
\n
\n
\n )\n .on(tooltipEl);\n }\n\n const { offsetLeft: positionX, offsetTop: positionY } = chart.canvas;\n\n const left = positionX + tooltip.caretX + tooltipWidth / 2 + 10;\n const bottom = positionY + tooltip.caretY;\n\n const container = chart.canvas;\n const containerRect = container.getBoundingClientRect();\n const containerRight = containerRect.right;\n\n if (\n left + tooltipWidth / 2 > containerRight ||\n left + tooltipWidth / 2 > containerRect.width\n ) {\n tooltipEl.style.left = tooltip.caretX - 275 + \"px\";\n } else {\n tooltipEl.style.left = left + \"px\";\n }\n\n if (bottom + tooltipEl.offsetHeight + 50 > containerRect.bottom) {\n tooltipEl.style.top =\n positionY - tooltipEl.offsetHeight + tooltip.caretY + \"px\";\n } else {\n tooltipEl.style.top = positionY + 15 + tooltip.caretY + \"px\";\n }\n\n tooltipEl.style.opacity = 1;\n tooltipEl.style.font = tooltip.options.bodyFont.string;\n tooltipEl.style.padding =\n tooltip.options.padding + \"px \" + tooltip.options.padding + \"px\";\n tooltipEl.style.zIndex = \"9999999999999999999999\";\n tooltipEl.style.width = tooltipWidth + \"px\";\n tooltipEl.style.maxWidth = tooltipWidth + \"px\";\n };\n\n baseDatalabelOptions = () => ({\n ...this.lineChartSettings(),\n datalabels: {\n display: true,\n color: \"black\",\n textStrokeWidth: 0.5,\n align: \"top\",\n offset: 12,\n font: {\n size: 14,\n },\n },\n });\n\n createChart = (ctx, data, element) => {\n let delayed;\n\n new Chart(ctx, {\n type: \"line\",\n data: {\n labels: this.labels,\n datasets: this.values,\n },\n options: {\n animation: {\n onComplete: () => {\n delayed = true;\n },\n delay: (context) => {\n let delay = 0;\n if (\n context.type === \"data\" &&\n context.mode === \"default\" &&\n !delayed\n ) {\n delay = context.dataIndex * 50 + context.datasetIndex * 25;\n }\n\n return delay;\n },\n },\n font: {\n family: \"Inter var\",\n size: 14,\n },\n ...this.options(data),\n },\n });\n };\n\n resize() {\n [...this.chartTargets].forEach((element) => {\n const chart = Chart.getChart(element.id);\n if (chart) {\n chart.resize();\n }\n });\n }\n\n windowResize({ width, height, event }) {\n [...this.chartTargets].forEach((element) => {\n const chart = Chart.getChart(element.id);\n if (chart) {\n chart.resize();\n }\n });\n }\n\n options = (data) => {\n return {\n responsive: true,\n maintainAspectRatio: true,\n plugins: {\n legend: {\n display: false,\n labels: {\n color: \"black\",\n padding: 20,\n font: {\n size: 25,\n family: \"Inter var\",\n },\n },\n },\n tooltip: {\n enabled: false,\n position: \"nearest\",\n external: this.externalTooltipHandler,\n },\n datalabels: {\n formatter: (value, context) => {\n if (value == \"NR\" || value == \"\") return null;\n\n if (this.dataType === \"currency\") {\n return currency(context.dataset.data[context.dataIndex] || 0, {\n precision: this.decimalPlaces,\n }).format();\n }\n\n if (this.dataType === \"percentage\") {\n return `${numbro(context.dataset.data[context.dataIndex]).format({\n thousandSeparated: true,\n mantissa: this.decimalPlaces,\n })}%`;\n }\n\n return numbro(value).format({\n thousandSeparated: true,\n mantissa: this.decimalPlaces,\n });\n },\n },\n },\n scales: {\n x: {\n grid: {\n color: \"rgb(0, 0, 0, .20)\",\n },\n ticks: {\n includeBounds: false,\n padding: 20,\n reverse: true,\n autoSkip: false,\n color: \"rgb(0, 0, 0)\",\n font: {\n family: \"Inter var\",\n size: 14,\n weight: \"bold\",\n },\n callback: (index) =>\n ticksCallback(index, this.tracking, this.labels),\n },\n },\n y: {\n suggestedMin: this.min,\n suggestedMax: this.max,\n position: \"left\",\n reverse: this.reverse,\n ticks: {\n position: \"left\",\n precision: this.decimalPlaces,\n font: {\n family: \"Inter var\",\n size: 14,\n weight: \"bold\",\n },\n padding: 20,\n color: \"rgb(0, 0, 0)\",\n callback: (value, index, values) => {\n if (value == \"NR\" || value == \"\") return null;\n\n if (this.dataType === \"currency\") {\n try {\n return currency(value, {\n precision: this.decimalPlaces,\n }).format();\n } catch (_) {\n return `$${value}`;\n }\n }\n\n if (this.dataType === \"percentage\") {\n return `${numbro(value).format({\n thousandSeparated: true,\n mantissa: this.decimalPlaces,\n })}%`;\n }\n\n return numbro(value).format({\n thousandSeparated: true,\n mantissa: this.decimalPlaces,\n });\n },\n },\n },\n },\n };\n };\n\n borderColor = (ctx) => {\n let color = black;\n\n if (\n ctx.index != 0 &&\n ((!this.reverse &&\n parseFloat(this.values[0].data[ctx.index - 1]) >=\n parseFloat(this.values[0].data[ctx.index])) ||\n (this.reverse &&\n parseFloat(this.values[0].data[ctx.index - 1]) <=\n parseFloat(this.values[0].data[ctx.index])))\n ) {\n color = red;\n }\n\n return color;\n };\n\n backgroundColor = (ctx, options) => {\n let color = black;\n\n if (\n ctx.index != 0 &&\n ((!this.reverse &&\n parseFloat(this.values[0].data[ctx.index - 1]) >=\n parseFloat(this.values[0].data[ctx.index])) ||\n (this.reverse &&\n parseFloat(this.values[0].data[ctx.index - 1]) <=\n parseFloat(this.values[0].data[ctx.index])))\n ) {\n color = red;\n }\n\n return color;\n };\n\n segmentBorderColor = (ctx) => {\n let color = black;\n\n if (\n (this.reverse && parseFloat(ctx.p0.raw) <= parseFloat(ctx.p1.raw)) ||\n (!this.reverse && parseFloat(ctx.p0.raw) >= parseFloat(ctx.p1.raw))\n ) {\n color = red;\n }\n\n return color;\n };\n\n lineChartSettings = () => {\n return {\n borderColor: this.borderColor,\n backgroundColor: this.backgroundColor,\n segment: {\n borderColor: this.segmentBorderColor,\n },\n };\n };\n}\n"],"names":["Chart","CategoryScale","LinearScale","PointElement","LineElement","Title","Tooltip","Legend","ChartDataLabels","red","black","tooltipWidth","equation_chart_controller","Controller","__publicField","chart","tooltipEl","table","context","tooltip","b","titleLines","renderer","CommonDOMRenderer","dayjs","positionX","positionY","left","bottom","containerRect","containerRight","ctx","data","element","delayed","delay","value","currency","numbro","index","ticksCallback","values","color","options","_","parsedEntries","entry","datasets","firstDataset","rows","key","useWindowResize","useResize","parsedData","width","height","event"],"mappings":"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"}