{"version":3,"file":"group_combination_chart_controller-CvmGqPHo.js","sources":["../../../app/javascript/entrypoints/controllers/group_combination_chart_controller.jsx"],"sourcesContent":["/** @jsx renderer.create */\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 numbro from \"numbro\";\n\nimport { CommonDOMRenderer } from \"render-jsx/dom\";\n\nimport { numberFormatter, ticksCallback } from \"../utils\";\n\nconst tooltipWidth = 350;\n\nChart.register(\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\n Legend,\n ChartDataLabels\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 const parsedEntries = parsedData.entries.map((entry) =>\n JSON.parse(entry)\n );\n\n const colors = parsedEntries.map((entry) => entry.color);\n const datasets = parsedEntries.map((entry, index) => ({\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(entry.color),\n yAxisID: `y${index == 0 ? \"\" : index}`,\n }));\n\n const firstDataset = JSON.parse(parsedData.entries[0]);\n const rows = firstDataset.rows;\n\n this.values = datasets;\n\n this.sameScale = firstDataset.same_scale;\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.min = parsedEntries.map((entry) => entry.min);\n this.max = parsedEntries.map((entry) => entry.max);\n\n if (this.sameScale) {\n this.min = Math.min(...this.min);\n this.max = Math.max(...this.max);\n }\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, colors);\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, colors);\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 colors = parsedEntries.map((entry) => entry.color);\n\n const datasets = parsedEntries.map((entry, index) => ({\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(entry.color),\n yAxisID: `y${index == 0 ? \"\" : index}`,\n }));\n\n const firstDataset = JSON.parse(parsedData.entries[0]);\n const data = firstDataset.rows;\n\n this.values = datasets;\n\n this.sameScale = firstDataset.same_scale;\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.min = parsedEntries.map((entry) => entry.min);\n this.max = parsedEntries.map((entry) => entry.max);\n\n if (this.sameScale) {\n this.min = Math.min(...this.min);\n this.max = Math.max(...this.max);\n }\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, colors);\n }\n\n baseDatalabelOptions = (color) => ({\n datalabels: {\n display: true,\n color: color,\n textStrokeWidth: 0.5,\n align: \"top\",\n offset: 12,\n font: {\n size: 14,\n },\n },\n });\n\n createChart = (ctx, data, element, colors) => {\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: 12,\n },\n ...this.options(data, colors),\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, colors) => {\n return {\n clip: 50,\n layout: {\n padding: {\n top: 40,\n bottom: 0,\n left: 10,\n right: 5,\n },\n },\n responsive: true,\n maintainAspectRatio: true,\n stacked: false,\n interaction: {\n mode: \"index\",\n },\n plugins: {\n legend: false,\n tooltip: {\n enabled: false,\n position: \"nearest\",\n external: this.externalTooltipHandler,\n },\n datalabels: {\n formatter: (value, context) => {\n if (context.dataset.data[context.dataIndex] == \"NR\") {\n return context.dataset.data[context.dataIndex];\n }\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 `${context.dataset.data[context.dataIndex] || 0}%`;\n }\n\n return numbro(context.dataset.data[context.dataIndex] || 0).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: 12,\n weight: \"bold\",\n },\n callback: (index) =>\n ticksCallback(index, this.tracking, this.labels),\n },\n },\n y: {\n ...this.defaultYSettings(),\n suggestedMin: this.sameScale ? this.min : this.min[0],\n suggestedMax: this.sameScale ? this.max : this.max[0],\n ticks: {\n ...this.defaultYSettings().ticks,\n color: this.sameScale ? \"rgb(0, 0, 0)\" : colors[0],\n },\n },\n ...this.additionalYAxes(colors),\n },\n };\n };\n\n additionalYAxes = (colors) => {\n const additional = {};\n\n colors.slice(1).map((color, index) => {\n additional[`y${index + 1}`] = {\n ...this.defaultYSettings(),\n suggestedMin: this.sameScale ? this.min : this.min[index + 1],\n suggestedMax: this.sameScale ? this.max : this.max[index + 1],\n type: \"linear\",\n axis: \"y\",\n display: !this.sameScale,\n position: index % 2 === 0 ? \"right\" : \"left\",\n grid: {\n drawOnChartArea: false,\n },\n ticks: {\n ...this.defaultYSettings().ticks,\n position: index % 2 === 0 ? \"right\" : \"left\",\n color,\n },\n };\n });\n\n return additional;\n };\n\n defaultYSettings = () => {\n return {\n type: \"linear\",\n suggestedMin: this.min || 0,\n suggestedMax: this.max || null,\n position: \"left\",\n reverse: this.reverse,\n ticks: {\n position: \"left\",\n precision: this.decimalPlaces,\n font: {\n family: \"Inter var\",\n size: 12,\n weight: \"bold\",\n },\n padding: 10,\n color: \"rgb(0, 0, 0)\",\n callback: (value, index, values) => {\n if (this.dataType === \"currency\") {\n try {\n return numbro(value).formatCurrency({\n average: true,\n mantissa: this.decimalPlaces,\n optionalMantissa: true,\n currencyPosition: \"prefix\",\n });\n } catch (_) {\n return `$${value}`;\n }\n }\n\n if (this.dataType == \"percentage\") {\n return `${value}%`;\n }\n\n return numbro(value).format({\n average: true,\n mantissa: 0,\n });\n },\n },\n };\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 {tooltip.labelColors.map((color, i) => (\n
\n \n
\n {(bodyLines?.[i] && bodyLines?.[i]?.[0]) ??\n numberFormatter(\n bodyLines?.[i]?.[0]?.split(\":\")?.[1]?.trim(\" \"),\n this.dataType,\n this.decimalPlaces\n )}\n
\n
\n ))}\n
\n
\n
\n )\n .on(tooltipEl);\n\n const { offsetLeft: positionX, offsetTop: positionY } = chart.canvas;\n\n const groupedContainer = document.getElementById(\"grouped-container\");\n\n const left = positionX + tooltip.caretX + tooltipWidth / 2 + 10;\n\n const container = groupedContainer;\n const containerRect = container.getBoundingClientRect();\n const containerRight = container.right;\n\n if (\n left + tooltipWidth / 2 > containerRight ||\n left + tooltipWidth / 2 > containerRect.width\n ) {\n tooltipEl.style.left = left - 350 + \"px\";\n } else {\n tooltipEl.style.left = left + \"px\";\n }\n\n tooltipEl.style.opacity = 1;\n tooltipEl.style.top = positionY + 15 + tooltip.caretY + \"px\";\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 = \"350px\";\n tooltipEl.style.maxWidth = \"350px\";\n }\n };\n}\n"],"names":["tooltipWidth","Chart","CategoryScale","LinearScale","PointElement","LineElement","Title","Tooltip","Legend","ChartDataLabels","group_combination_chart_controller","Controller","__publicField","color","ctx","data","element","colors","delayed","context","delay","value","currency","numbro","index","ticksCallback","additional","values","chart","tooltipEl","table","tooltip","bodyLines","b","titleLines","renderer","CommonDOMRenderer","dayjs","i","_a","numberFormatter","_e","_d","_c","_b","positionX","positionY","groupedContainer","left","container","containerRect","containerRight","_","parsedData","parsedEntries","entry","datasets","firstDataset","rows","key","useWindowResize","useResize","width","height","event"],"mappings":"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"}