@kyndryl-design-system/shidoka-charts 2.1.2 → 2.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart.d.ts","sourceRoot":"","sources":["../../../src/components/chart/chart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAQ,MAAM,KAAK,CAAC;AAKvC,OAAO,0BAA0B,CAAC;AA8ClC;;;;;;GAMG;AACH,qBACa,OAAQ,SAAQ,UAAU;IACrC,OAAgB,MAAM,+BAAa;IAEnC,mBAAmB;IAEnB,UAAU,SAAM;IAEhB,yBAAyB;IAEzB,WAAW,SAAM;IAEjB,2BAA2B;IAE3B,IAAI,EAAE,GAAG,CAAM;IAEf,4BAA4B;IAE5B,MAAM,EAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAEvB,8BAA8B;IAE9B,QAAQ,EAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IAEtB,uDAAuD;IAEvD,OAAO,EAAE,GAAG,CAAM;IAElB,yHAAyH;IAEzH,OAAO,EAAE,GAAG,CAAM;IAElB,wEAAwE;IAExE,MAAM,EAAE,GAAG,CAAQ;IAEnB,uEAAuE;IAEvE,KAAK,EAAE,GAAG,CAAQ;IAElB,sCAAsC;IAEtC,eAAe,UAAS;IAExB,0CAA0C;IAE1C,YAAY,UAAS;IAErB,qCAAqC;IAErC,UAAU,UAAS;IAEnB,0BAA0B;IAE1B,YAAY,UAAS;IAErB,4CAA4C;IAE5C,QAAQ,UAAS;IAEjB,gCAAgC;IAEhC,YAAY;;;;;;;MAOV;IAEF;;OAEG;IAEH,UAAU,UAAS;IAEnB;;;OAGG;IAEH,SAAS,EAAG,iBAAiB,CAAC;IAE9B;;;OAGG;IAEH,MAAM,EAAG,iBAAiB,CAAC;IAE3B;;;OAGG;IAEH,KAAK,EAAG,cAAc,CAAC;IAEvB;;OAEG;IAEH,KAAK,EAAE,GAAG,CAAQ;IAElB;;OAEG;IAEH,SAAS,UAAS;IAElB;;OAEG;IAEH,aAAa,UAAS;IAEtB;;OAEG;IAEH,aAAa,EAAE,GAAG,CAAM;IAExB;;OAEG;IAEH,cAAc,EAAE,GAAG,CAAM;IAEzB;;OAEG;IAEH,OAAO,UAAS;IAEhB;;OAEG;IACH,eAAe,EAAE,GAAG,CAIlB;IAEF,cAAc,EAAE,GAAG,CAMhB;IAEM,MAAM;
|
|
1
|
+
{"version":3,"file":"chart.d.ts","sourceRoot":"","sources":["../../../src/components/chart/chart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAQ,MAAM,KAAK,CAAC;AAKvC,OAAO,0BAA0B,CAAC;AA8ClC;;;;;;GAMG;AACH,qBACa,OAAQ,SAAQ,UAAU;IACrC,OAAgB,MAAM,+BAAa;IAEnC,mBAAmB;IAEnB,UAAU,SAAM;IAEhB,yBAAyB;IAEzB,WAAW,SAAM;IAEjB,2BAA2B;IAE3B,IAAI,EAAE,GAAG,CAAM;IAEf,4BAA4B;IAE5B,MAAM,EAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAEvB,8BAA8B;IAE9B,QAAQ,EAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IAEtB,uDAAuD;IAEvD,OAAO,EAAE,GAAG,CAAM;IAElB,yHAAyH;IAEzH,OAAO,EAAE,GAAG,CAAM;IAElB,wEAAwE;IAExE,MAAM,EAAE,GAAG,CAAQ;IAEnB,uEAAuE;IAEvE,KAAK,EAAE,GAAG,CAAQ;IAElB,sCAAsC;IAEtC,eAAe,UAAS;IAExB,0CAA0C;IAE1C,YAAY,UAAS;IAErB,qCAAqC;IAErC,UAAU,UAAS;IAEnB,0BAA0B;IAE1B,YAAY,UAAS;IAErB,4CAA4C;IAE5C,QAAQ,UAAS;IAEjB,gCAAgC;IAEhC,YAAY;;;;;;;MAOV;IAEF;;OAEG;IAEH,UAAU,UAAS;IAEnB;;;OAGG;IAEH,SAAS,EAAG,iBAAiB,CAAC;IAE9B;;;OAGG;IAEH,MAAM,EAAG,iBAAiB,CAAC;IAE3B;;;OAGG;IAEH,KAAK,EAAG,cAAc,CAAC;IAEvB;;OAEG;IAEH,KAAK,EAAE,GAAG,CAAQ;IAElB;;OAEG;IAEH,SAAS,UAAS;IAElB;;OAEG;IAEH,aAAa,UAAS;IAEtB;;OAEG;IAEH,aAAa,EAAE,GAAG,CAAM;IAExB;;OAEG;IAEH,cAAc,EAAE,GAAG,CAAM;IAEzB;;OAEG;IAEH,OAAO,UAAS;IAEhB;;OAEG;IACH,eAAe,EAAE,GAAG,CAIlB;IAEF,cAAc,EAAE,GAAG,CAMhB;IAEM,MAAM;IAwVf,OAAO,CAAC,YAAY;IAMX,iBAAiB;IASjB,oBAAoB;IAOpB,YAAY;IAKZ,OAAO,CAAC,YAAY,EAAE,GAAG;IA0FlC;;;OAGG;IACH,OAAO,CAAC,SAAS;IAgDjB;;;OAGG;YACW,YAAY;IAmE1B,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,mBAAmB;IA2B3B,OAAO,CAAC,iBAAiB;IA2BzB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,sBAAsB;CAG/B;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,UAAU,EAAE,OAAO,CAAC;KACrB;CACF"}
|
|
@@ -48,6 +48,7 @@ import{__decorate as t}from"../../_virtual/_tslib.js";import'./../../external/@l
|
|
|
48
48
|
|
|
49
49
|
<div class="download">
|
|
50
50
|
<button
|
|
51
|
+
tabindex="0"
|
|
51
52
|
class="control-button"
|
|
52
53
|
aria-label=${this.customLabels.downloadMenu}
|
|
53
54
|
title=${this.customLabels.downloadMenu}
|
|
@@ -60,17 +61,20 @@ import{__decorate as t}from"../../_virtual/_tslib.js";import'./../../external/@l
|
|
|
60
61
|
<div class="download-menu">
|
|
61
62
|
${this.tableDisabled?null:e`
|
|
62
63
|
<button
|
|
64
|
+
tabindex="0"
|
|
63
65
|
@click=${t=>this.handleDownloadCsv(t)}
|
|
64
66
|
>
|
|
65
67
|
${this.customLabels.downloadCsv}
|
|
66
68
|
</button>
|
|
67
69
|
`}
|
|
68
70
|
<button
|
|
71
|
+
tabindex="0"
|
|
69
72
|
@click=${t=>this.handleDownloadImage(t,!1)}
|
|
70
73
|
>
|
|
71
74
|
${this.customLabels.downloadPng}
|
|
72
75
|
</button>
|
|
73
76
|
<button
|
|
77
|
+
tabindex="0"
|
|
74
78
|
@click=${t=>this.handleDownloadImage(t,!0)}
|
|
75
79
|
>
|
|
76
80
|
${this.customLabels.downloadJpg}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart.js","sources":["../../../src/components/chart/chart.ts"],"sourcesContent":["import { LitElement, html } from 'lit';\nimport { customElement, property, state, query } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { deepmerge, deepmergeCustom } from 'deepmerge-ts';\nimport Chart from 'chart.js/auto';\nimport 'chartjs-adapter-date-fns';\nimport {\n ChoroplethController,\n BubbleMapController,\n GeoFeature,\n ColorScale,\n SizeScale,\n ProjectionScale,\n} from 'chartjs-chart-geo';\nimport { TreemapController, TreemapElement } from 'chartjs-chart-treemap';\nimport { MatrixController, MatrixElement } from 'chartjs-chart-matrix';\nimport canvasBackgroundPlugin from '../../common/plugins/canvasBackground';\nimport doughnutLabelPlugin from '../../common/plugins/doughnutLabel';\nimport meterGaugePlugin from '../../common/plugins/meterGaugeNeedle';\nimport gradientLegendPlugin from '../../common/plugins/gradientLegend';\nimport a11yPlugin from 'chartjs-plugin-a11y-legend';\nimport datalabelsPlugin from 'chartjs-plugin-datalabels';\nimport annotationPlugin from 'chartjs-plugin-annotation';\nimport { convertChartDataToCSV, debounce } from '../../common/helpers/helpers';\nimport ChartScss from './chart.scss';\nimport globalOptions from '../../common/config/globalOptions';\nimport globalOptionsNonRadial from '../../common/config/globalOptionsNonRadial';\nimport globalOptionsRadial from '../../common/config/globalOptionsRadial';\nimport chartIcon from '@kyndryl-design-system/shidoka-icons/svg/monochrome/16/analytics.svg';\nimport tableIcon from '@kyndryl-design-system/shidoka-icons/svg/monochrome/16/table-view.svg';\nimport downloadIcon from '@kyndryl-design-system/shidoka-icons/svg/monochrome/16/download.svg';\nimport maximizeIcon from '@kyndryl-design-system/shidoka-icons/svg/monochrome/16/expand.svg';\nimport minimizeIcon from '@kyndryl-design-system/shidoka-icons/svg/monochrome/16/shrink.svg';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport { getTokenThemeVal } from '@kyndryl-design-system/shidoka-foundation/common/helpers/color';\n\nChart.register(\n ChoroplethController,\n BubbleMapController,\n GeoFeature,\n ColorScale,\n SizeScale,\n ProjectionScale,\n TreemapController,\n TreemapElement,\n MatrixController,\n MatrixElement,\n annotationPlugin,\n datalabelsPlugin\n);\n\n/**\n * Chart.js wrapper component.\n * @slot unnamed - Slot for custom content between header and chart.\n * @slot controls - Slot for custom controls such as an overflow menu.\n * @slot tooltip - Slot for tooltip in header.\n * @slot draghandle - Slot for widget drag handle.\n */\n@customElement('kd-chart')\nexport class KDChart extends LitElement {\n static override styles = ChartScss;\n\n /** Chart title. */\n @property({ type: String })\n chartTitle = '';\n\n /** Chart description. */\n @property({ type: String })\n description = '';\n\n /** Chart.js chart type. */\n @property({ type: String })\n type: any = '';\n\n /** Chart.js data.labels. */\n @property({ type: Array })\n labels!: Array<string>;\n\n /** Chart.js data.datasets. */\n @property({ type: Array })\n datasets!: Array<any>;\n\n /** Chart.js options. Can override Shidoka defaults. */\n @property({ type: Object })\n options: any = {};\n\n /** Chart.js additional plugins. Must be registerable inline via Chart.plugins array, not globally via Chart.register. */\n @property({ type: Array })\n plugins: any = [];\n\n /** Chart.js canvas height (px). Disables maintainAspectRatio option. */\n @property({ type: Number })\n height: any = null;\n\n /** Chart.js canvas width (px). Disables maintainAspectRatio option. */\n @property({ type: Number })\n width: any = null;\n\n /** Hides the description visually. */\n @property({ type: Boolean })\n hideDescription = false;\n\n /** Hides the closed captions visually. */\n @property({ type: Boolean })\n hideCaptions = false;\n\n /** Hides the title & description. */\n @property({ type: Boolean })\n hideHeader = false;\n\n /** Hides the controls. */\n @property({ type: Boolean })\n hideControls = false;\n\n /** Removes the outer border and padding. */\n @property({ type: Boolean })\n noBorder = false;\n\n /** Customizable text labels. */\n @property({ type: Object })\n customLabels = {\n toggleView: 'Toggle View Mode',\n toggleFullscreen: 'Toggle Fullscreen',\n downloadMenu: 'Download Menu',\n downloadCsv: 'Download as CSV',\n downloadPng: 'Download as PNG',\n downloadJpg: 'Download as JPG',\n };\n\n /** Fullscreen state.\n * @ignore\n */\n @state()\n fullscreen = false;\n\n /**\n * Queries the container element.\n * @ignore\n */\n @query('.container')\n container!: HTMLCanvasElement;\n\n /**\n * Queries the canvas element.\n * @ignore\n */\n @query('canvas')\n canvas!: HTMLCanvasElement;\n\n /**\n * Queries the closed caption div.\n * @ignore\n */\n @query('.closed-caption')\n ccDiv!: HTMLDivElement;\n\n /** The chart instance.\n * @ignore\n */\n @state()\n chart: any = null;\n\n /** Table view mode.\n * @ignore\n */\n @state()\n tableView = false;\n\n /** Disable table view feature.\n * @ignore\n */\n @state()\n tableDisabled = false;\n\n /** Merged options.\n * @ignore\n */\n @state()\n mergedOptions: any = {};\n\n /** Merged datasets.\n * @ignore\n */\n @state()\n mergedDatasets: any = {};\n\n /** Is Widget. Inherited from kyn-widget.\n * @internal\n */\n @state()\n _widget = false;\n\n /** ResizeObserver for canvas-container.\n * @internal\n */\n _resizeObserver: any = new ResizeObserver(\n debounce(() => {\n this._resizeChart();\n })\n );\n\n _themeObserver: any = new MutationObserver(() => {\n if (this.chart) {\n this.mergeOptions().then(() => {\n this.initChart();\n });\n }\n });\n\n override render() {\n const Classes = {\n container: true,\n fullscreen: this.fullscreen,\n 'no-border': this.noBorder || this._widget,\n widget: this._widget,\n };\n\n return html`\n <div\n class=${classMap(Classes)}\n @fullscreenchange=${() => this.handleFullscreenChange()}\n >\n ${!this.hideHeader || !this.hideControls\n ? html`\n <div class=\"header\">\n ${!this.hideHeader\n ? html`\n <slot name=\"draghandle\"></slot>\n\n <div id=\"titleDesc\">\n <div class=\"title\">\n ${this.chartTitle}\n <slot name=\"tooltip\"></slot>\n </div>\n <div\n class=\"description ${this.hideDescription\n ? 'hidden-visually'\n : ''}\"\n >\n ${this.description}\n </div>\n </div>\n `\n : null}\n ${!this.hideControls\n ? html`\n <div class=\"controls\">\n ${!this.tableDisabled\n ? html`\n <button\n class=\"control-button\"\n @click=${() => this.handleViewToggle()}\n aria-label=${this.customLabels.toggleView}\n title=${this.customLabels.toggleView}\n >\n <span slot=\"icon\">\n ${this.tableView\n ? unsafeSVG(chartIcon)\n : unsafeSVG(tableIcon)}\n </span>\n </button>\n `\n : null}\n\n <button\n class=\"control-button\"\n @click=${() => this.handleFullscreen()}\n aria-label=${this.customLabels.toggleFullscreen}\n title=${this.customLabels.toggleFullscreen}\n >\n <span slot=\"icon\">\n ${this.fullscreen\n ? unsafeSVG(minimizeIcon)\n : unsafeSVG(maximizeIcon)}\n </span>\n </button>\n\n <div class=\"download\">\n <button\n class=\"control-button\"\n aria-label=${this.customLabels.downloadMenu}\n title=${this.customLabels.downloadMenu}\n >\n <span slot=\"icon\">\n ${unsafeSVG(downloadIcon)}\n </span>\n </button>\n\n <div class=\"download-menu\">\n ${!this.tableDisabled\n ? html`\n <button\n @click=${(e: Event) =>\n this.handleDownloadCsv(e)}\n >\n ${this.customLabels.downloadCsv}\n </button>\n `\n : null}\n <button\n @click=${(e: Event) =>\n this.handleDownloadImage(e, false)}\n >\n ${this.customLabels.downloadPng}\n </button>\n <button\n @click=${(e: Event) =>\n this.handleDownloadImage(e, true)}\n >\n ${this.customLabels.downloadJpg}\n </button>\n </div>\n </div>\n\n <slot name=\"controls\"></slot>\n </div>\n `\n : null}\n </div>\n `\n : null}\n\n <div>\n <slot></slot>\n </div>\n\n <figure class=\"${this.tableView ? 'hidden' : ''}\">\n <div\n class=\"canvas-container\"\n style=\"${this.width ? `width: ${this.width}px;` : ''}\n ${this.height ? `height: ${this.height}px;` : ''}\"\n >\n <canvas role=\"img\" aria-labelledby=\"titleDesc\"></canvas>\n </div>\n <figcaption>\n <div\n class=\"closed-caption ${this.hideCaptions\n ? 'hidden-visually'\n : ''}\"\n ></div>\n </figcaption>\n </figure>\n\n ${!this.tableDisabled && this.tableView\n ? html`\n <div class=\"table\">\n <table>\n ${this.type === 'matrix'\n ? html`\n <thead>\n <tr>\n <th>\n ${this.options?.scales?.y?.title?.text ||\n 'Y Axis'}\n </th>\n <th>\n ${this.options?.scales?.x?.title?.text ||\n 'X Axis'}\n </th>\n ${this.datasets.map(\n (dataset) => html`<th>${dataset.label}</th>`\n )}\n </tr>\n </thead>\n <tbody>\n ${this.datasets[0].data.map((cell: any) => {\n const xLabel = Array.isArray(this.labels)\n ? this.labels[cell.x - 1] || ''\n : (this.labels as any).x?.[cell.x - 1] || '';\n const yLabel = Array.isArray(this.labels)\n ? this.labels[cell.y - 1] || ''\n : (this.labels as any).y?.[cell.y - 1] || '';\n return html`\n <tr>\n <td>${yLabel}</td>\n <td>${xLabel}</td>\n ${this.datasets.map(\n () => html`<td>${cell.value}</td>`\n )}\n </tr>\n `;\n })}\n </tbody>\n `\n : html`\n <thead>\n <tr>\n ${this.labels?.length || this.type === 'treemap'\n ? html`<th>${this.getTableAxisLabel()}</th>`\n : null}\n ${this.datasets.map(\n (dataset) => html`<th>${dataset.label}</th>`\n )}\n </tr>\n </thead>\n <tbody>\n ${this.type === 'treemap'\n ? Array.isArray(this.datasets[0].tree)\n ? this.datasets[0].tree.map(\n (_value: any) => html`\n <tr>\n <td>\n ${_value[this.datasets[0].labelKey]}\n </td>\n <td>${_value[this.datasets[0].key]}</td>\n </tr>\n `\n )\n : Object.entries(this.datasets[0].tree).map(\n (_value: any) => {\n const HtmlStrings = [];\n if (_value[1].value) {\n HtmlStrings.push(html`\n <tr>\n <td>${_value[0]}</td>\n <td>${_value[1].value}</td>\n </tr>\n `);\n } else {\n Object.entries(_value[1]).map(\n (_subValue: any) => {\n if (_subValue[1].value) {\n HtmlStrings.push(html`\n <tr>\n <td>${_subValue[0]}</td>\n <td>${_subValue[1].value}</td>\n </tr>\n `);\n } else {\n Object.entries(_subValue[1]).map(\n (_subSubValue: any) => {\n HtmlStrings.push(html`\n <tr>\n <td>${_subSubValue[0]}</td>\n <td>\n ${_subSubValue[1].value}\n </td>\n </tr>\n `);\n }\n );\n }\n }\n );\n }\n return HtmlStrings;\n }\n )\n : this.datasets[0].data.map(\n (_value: any, i: number) => {\n const IndexAxis =\n this.options.indexAxis || 'x';\n const NonIndexAxis =\n IndexAxis === 'x' ? 'y' : 'x';\n return html`\n <tr>\n ${this.labels.length\n ? html`\n ${this.options?.scales[IndexAxis]\n ?.type === 'time'\n ? html`\n <td>\n ${new Date(\n this.labels[i]\n ).toLocaleString()}\n </td>\n `\n : html`\n <td>${this.labels[i]}</td>\n `}\n `\n : null}\n ${this.datasets.map((dataset) => {\n const dataPoint = dataset.data[i];\n if (\n this.type === 'bubbleMap' ||\n this.type === 'choropleth'\n ) {\n return html`\n <td>${dataset.data[i].value}</td>\n `;\n } else if (\n this.options?.scales[NonIndexAxis]\n ?.type === 'time'\n ) {\n return html`\n <td>\n ${new Date(\n dataPoint\n ).toLocaleString()}\n </td>\n `;\n } else if (Array.isArray(dataPoint)) {\n return html`\n <td>\n ${dataPoint[0]}, ${dataPoint[1]}\n </td>\n `;\n } else if (\n typeof dataPoint === 'object' &&\n !Array.isArray(dataPoint) &&\n dataPoint !== null\n ) {\n return html`\n <td>\n ${Object.keys(dataPoint).map(\n (key) => {\n const Label =\n this.options.scales[key]\n ?.title?.text || key;\n const DisplayData =\n this.options.scales[key]\n ?.type === 'time'\n ? new Date(\n dataPoint[key]\n ).toLocaleString()\n : dataPoint[key];\n return html`\n <div>\n <strong>\n ${Label}:\n </strong>\n ${DisplayData}\n </div>\n `;\n }\n )}\n </td>\n `;\n } else {\n return html`\n <td>${dataset.data[i]}</td>\n `;\n }\n })}\n </tr>\n `;\n }\n )}\n </tbody>\n `}\n </table>\n </div>\n `\n : null}\n </div>\n `;\n }\n\n private _resizeChart() {\n if (this.chart) {\n this.chart.resize();\n }\n }\n\n override connectedCallback() {\n super.connectedCallback();\n\n this._themeObserver.observe(\n document.querySelector('meta[name=\"color-scheme\"]'),\n { attributes: true }\n );\n }\n\n override disconnectedCallback() {\n this._resizeObserver.disconnect();\n this._themeObserver.disconnect();\n\n super.disconnectedCallback();\n }\n\n override firstUpdated() {\n const el = this.shadowRoot?.querySelector('.canvas-container');\n this._resizeObserver.observe(el);\n }\n\n override updated(changedProps: any) {\n // Update chart instance when data changes.\n if (\n this.chart &&\n (changedProps.has('labels') ||\n changedProps.has('datasets') ||\n changedProps.has('options'))\n ) {\n this.mergeOptions().then(() => {\n this.chart.data.labels = this.labels;\n this.chart.options = this.mergedOptions;\n\n // remove datasets not in mergedDatasets\n this.chart.data.datasets.forEach((dataset: any, index: number) => {\n const NewDataset = this.mergedDatasets.find(\n (newDataset: any) => newDataset.label === dataset.label\n );\n\n if (!NewDataset) {\n // remove\n this.chart.data.datasets.splice(index, 1);\n }\n });\n\n // update datasets, add new ones\n this.mergedDatasets.forEach((dataset: any) => {\n const OldDataset = this.chart.data.datasets.find(\n (oldDataset: any) => oldDataset.label === dataset.label\n );\n\n if (!OldDataset) {\n // add new dataset\n this.chart.data.datasets.push(dataset);\n } else {\n // update each key/entry in the dataset object\n Object.keys(dataset).forEach((key) => {\n OldDataset[key] = dataset[key];\n });\n }\n });\n\n this.chart.update();\n });\n }\n\n // init chart\n // check to make sure initial datasets + data have been provided\n let hasData = false;\n if (this.datasets && this.datasets.length) {\n for (const dataset of this.datasets) {\n hasData =\n dataset.data?.length > 0 ||\n dataset.tree?.length > 0 ||\n (dataset.tree && Object.keys(dataset.tree).length > 0);\n\n if (!hasData) {\n console.error('Missing data for one or more chart datasets.');\n break;\n }\n }\n }\n\n if (!this.chart && this.type && changedProps.has('datasets') && hasData) {\n this.mergeOptions().then(() => {\n this.initChart();\n });\n\n this.checkType();\n }\n\n // Re-init chart instance when type, plugins, colorPalette, width, or height change.\n if (\n this.chart &&\n (changedProps.has('type') ||\n changedProps.has('plugins') ||\n changedProps.has('width') ||\n changedProps.has('height'))\n ) {\n this.mergeOptions().then(() => {\n this.initChart();\n });\n\n this.checkType();\n }\n\n if (this.chart && changedProps.has('noBorder')) {\n this.chart.resize();\n }\n }\n\n /**\n * Initializes a bar chart using the Chart.js library with provided labels, datasets,\n * and options.\n */\n private initChart() {\n const ignoredTypes = ['choropleth', 'treemap', 'bubbleMap'];\n\n // Chart.defaults.font.family = getComputedStyle(\n // document.documentElement\n // ).getPropertyValue('--kd-font-family-secondary');\n Chart.defaults.color = getTokenThemeVal('--kd-color-text-level-primary');\n\n // let plugins = [\n // canvasBackgroundPlugin,\n // doughnutLabelPlugin,\n // meterGaugePlugin,\n // ...this.plugins,\n // ];\n\n // Select plugin when type='meter'. Otherwise both plugins (meterGaugePlugin & doughnutLabelPlugin) are called\n const pluginSelectForDoghnutMeter =\n this.type === 'meter' ? meterGaugePlugin : doughnutLabelPlugin;\n\n let plugins = [\n canvasBackgroundPlugin,\n pluginSelectForDoghnutMeter,\n gradientLegendPlugin,\n ...this.plugins,\n ];\n\n // only add certain plugins for standard chart types\n if (!ignoredTypes.includes(this.type)) {\n // plugins = [...plugins, a11yPlugin, musicPlugin];\n plugins = [...plugins, a11yPlugin];\n }\n\n if (this.chart) {\n this.chart.destroy();\n }\n\n this.chart = new Chart(this.canvas, {\n //type: this.type,\n type: this.type === 'meter' ? 'doughnut' : this.type,\n data: {\n labels: this.labels,\n datasets: this.mergedDatasets,\n },\n options: this.mergedOptions,\n plugins: plugins,\n });\n }\n\n /**\n * Merges various chart type options and dataset options to create a\n * final set of options for a chart.\n */\n private async mergeOptions() {\n const radialTypes = ['pie', 'doughnut', 'radar', 'polarArea', 'meter'];\n const ignoredTypes = ['choropleth', 'treemap', 'bubbleMap'];\n\n const additionalTypeImports: any = [];\n this.datasets.forEach((dataset) => {\n // get chart types from datasets so we can import additional configs\n if (dataset.type) {\n additionalTypeImports.push(\n import(`../../common/config/chartTypes/${dataset.type}.js`)\n );\n }\n });\n\n // import main and additional chart type configs\n const chartTypeConfigs = await Promise.all([\n import(`../../common/config/chartTypes/${this.type}.js`),\n ...additionalTypeImports,\n ]);\n\n // start with global options\n let mergedOptions: any = globalOptions(this);\n\n // merge global type options\n if (radialTypes.includes(this.type)) {\n mergedOptions = deepmerge(mergedOptions, globalOptionsRadial(this));\n } else if (!ignoredTypes.includes(this.type)) {\n mergedOptions = deepmerge(mergedOptions, globalOptionsNonRadial(this));\n }\n\n const mergedDatasets: any = JSON.parse(JSON.stringify(this.datasets));\n\n chartTypeConfigs.forEach((chartTypeConfig: any) => {\n // merge all of the imported chart type options with the global options\n mergedOptions = deepmerge(mergedOptions, chartTypeConfig.options(this));\n\n // merge all of the imported chart type dataset options\n mergedDatasets.forEach((dataset: any, index: number) => {\n if (\n (!dataset.type && chartTypeConfig.type === this.type) ||\n dataset.type === chartTypeConfig.type\n ) {\n mergedDatasets[index] = deepmerge(\n dataset,\n chartTypeConfig.datasetOptions(this, index)\n );\n }\n });\n });\n\n if (this.options) {\n // merge any consumer supplied options with defaults\n mergedOptions = deepmerge(mergedOptions, this.options);\n }\n this.mergedOptions = mergedOptions;\n\n // merge default chart type dataset options with consumer supplied datasets\n mergedDatasets.forEach((dataset: object, index: number) => {\n const customDeepmerge = deepmergeCustom({\n mergeArrays: false,\n });\n mergedDatasets[index] = customDeepmerge(dataset, this.datasets[index]);\n });\n\n this.mergedDatasets = mergedDatasets;\n }\n\n private getTableAxisLabel() {\n let label = '';\n\n if (this.options?.indexAxis === 'y') {\n if (this.options?.scales?.y?.title?.text) {\n label = this.options?.scales.y.title.text;\n } else {\n label = 'Y Axis';\n }\n } else {\n if (this.options?.scales?.x?.title?.text) {\n label = this.options?.scales.x.title.text;\n } else {\n label = 'X Axis';\n }\n }\n\n return label;\n }\n\n private handleViewToggle() {\n this.tableView = !this.tableView;\n }\n\n private checkType() {\n // chart types that can't have a data table view\n const blacklist: any = [];\n this.tableDisabled = blacklist.includes(this.type);\n }\n\n private handleDownloadImage(e: Event, jpeg: boolean) {\n e.preventDefault();\n\n // add bg color to canvas\n const context: any = this.canvas.getContext('2d');\n const color = getTokenThemeVal('--kd-color-background-page-default');\n context.save();\n context.globalCompositeOperation = 'destination-over';\n context.fillStyle = color;\n context.fillRect(0, 0, this.canvas.width, this.canvas.height);\n\n // set image format\n const imgFormat = jpeg ? 'image/jpeg' : 'image/png';\n const fileExt = jpeg ? 'jpg' : 'png';\n\n // create a fake link to download the image\n const a = document.createElement('a');\n a.href = this.chart.toBase64Image(imgFormat, 1);\n a.download = this.chartTitle + '.' + fileExt;\n\n // trigger the download\n a.click();\n\n // remove canvas bg color\n context.restore();\n }\n\n private handleDownloadCsv(e: Event) {\n e.preventDefault();\n let csv = '';\n\n for (let i = 0; i < this.chart.data.datasets.length; i++) {\n csv += convertChartDataToCSV({\n data: this.chart.data.datasets[i],\n labels: this.labels,\n });\n }\n if (csv == null) return;\n\n const filename = this.chartTitle + '.csv';\n if (!csv.match(/^data:text\\/csv/i)) {\n csv = 'data:text/csv;charset=utf-8,' + csv;\n }\n\n // not sure if anything below this comment works\n const data = encodeURI(csv);\n const link = document.createElement('a');\n link.setAttribute('href', data);\n link.setAttribute('download', filename);\n document.body.appendChild(link); // Required for FF\n link.click();\n document.body.removeChild(link);\n }\n\n private handleFullscreen() {\n if (this.shadowRoot?.fullscreenElement) {\n document.exitFullscreen();\n } else {\n this.container.requestFullscreen();\n }\n }\n\n private handleFullscreenChange() {\n this.fullscreen = this.shadowRoot?.fullscreenElement !== null;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kd-chart': KDChart;\n }\n}\n"],"names":["Chart","register","ChoroplethController","BubbleMapController","GeoFeature","ColorScale","SizeScale","ProjectionScale","TreemapController","TreemapElement","MatrixController","MatrixElement","annotationPlugin","datalabelsPlugin","KDChart","LitElement","constructor","this","chartTitle","description","type","options","plugins","height","width","hideDescription","hideCaptions","hideHeader","hideControls","noBorder","customLabels","toggleView","toggleFullscreen","downloadMenu","downloadCsv","downloadPng","downloadJpg","fullscreen","chart","tableView","tableDisabled","mergedOptions","mergedDatasets","_widget","_resizeObserver","ResizeObserver","debounce","_resizeChart","_themeObserver","MutationObserver","mergeOptions","then","initChart","render","Classes","container","widget","html","classMap","handleFullscreenChange","handleViewToggle","unsafeSVG","chartIcon","tableIcon","handleFullscreen","minimizeIcon","maximizeIcon","downloadIcon","e","handleDownloadCsv","handleDownloadImage","_d","_c","_b","_a","scales","y","title","text","_h","_g","_f","_e","x","datasets","map","dataset","label","data","cell","xLabel","Array","isArray","labels","yLabel","value","_j","length","getTableAxisLabel","tree","_value","labelKey","key","Object","entries","HtmlStrings","push","_subValue","_subSubValue","i","IndexAxis","indexAxis","NonIndexAxis","Date","toLocaleString","dataPoint","keys","Label","DisplayData","resize","connectedCallback","super","observe","document","querySelector","attributes","disconnectedCallback","disconnect","firstUpdated","el","shadowRoot","updated","changedProps","has","forEach","index","find","newDataset","splice","OldDataset","oldDataset","update","hasData","console","error","checkType","defaults","color","getTokenThemeVal","pluginSelectForDoghnutMeter","meterGaugePlugin","doughnutLabelPlugin","canvasBackgroundPlugin","gradientLegendPlugin","includes","a11yPlugin","destroy","canvas","additionalTypeImports","__variableDynamicImportRuntime0__","chartTypeConfigs","Promise","all","__variableDynamicImportRuntime1__","globalOptions","deepmerge","globalOptionsRadial","globalOptionsNonRadial","JSON","parse","stringify","chartTypeConfig","datasetOptions","customDeepmerge","deepmergeCustom","mergeArrays","_k","_l","jpeg","preventDefault","context","getContext","save","globalCompositeOperation","fillStyle","fillRect","imgFormat","fileExt","a","createElement","href","toBase64Image","download","click","restore","csv","convertChartDataToCSV","filename","match","encodeURI","link","setAttribute","body","appendChild","removeChild","fullscreenElement","exitFullscreen","requestFullscreen","styles","ChartScss","__decorate","property","String","prototype","Number","Boolean","state","query","customElement"],"mappings":"ggJAoCAA,EAAMC,SACJC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,GAWK,IAAMC,EAAN,cAAsBC,EAAtB,WAAAC,uBAKLC,KAAUC,WAAG,GAIbD,KAAWE,YAAG,GAIdF,KAAIG,KAAQ,GAYZH,KAAOI,QAAQ,GAIfJ,KAAOK,QAAQ,GAIfL,KAAMM,OAAQ,KAIdN,KAAKO,MAAQ,KAIbP,KAAeQ,iBAAG,EAIlBR,KAAYS,cAAG,EAIfT,KAAUU,YAAG,EAIbV,KAAYW,cAAG,EAIfX,KAAQY,UAAG,EAIXZ,KAAAa,aAAe,CACbC,WAAY,mBACZC,iBAAkB,oBAClBC,aAAc,gBACdC,YAAa,kBACbC,YAAa,kBACbC,YAAa,mBAOfnB,KAAUoB,YAAG,EA2BbpB,KAAKqB,MAAQ,KAMbrB,KAASsB,WAAG,EAMZtB,KAAauB,eAAG,EAMhBvB,KAAawB,cAAQ,GAMrBxB,KAAcyB,eAAQ,GAMtBzB,KAAO0B,SAAG,EAKV1B,KAAA2B,gBAAuB,IAAIC,eACzBC,GAAS,KACP7B,KAAK8B,cAAc,KAIvB9B,KAAA+B,eAAsB,IAAIC,kBAAiB,KACrChC,KAAKqB,OACPrB,KAAKiC,eAAeC,MAAK,KACvBlC,KAAKmC,WAAW,GAEnB,GAsqBJ,CAnqBU,MAAAC,yBACP,MAAMC,EAAU,CACdC,WAAW,EACXlB,WAAYpB,KAAKoB,WACjB,YAAapB,KAAKY,UAAYZ,KAAK0B,QACnCa,OAAQvC,KAAK0B,SAGf,OAAOc,CAAI;;gBAECC,EAASJ;4BACG,IAAMrC,KAAK0C;;UAE5B1C,KAAKU,YAAeV,KAAKW,aAkGxB,KAjGA6B,CAAI;;kBAEGxC,KAAKU,WAkBJ,KAjBA8B,CAAI;;;;;4BAKIxC,KAAKC;;;;+CAIcD,KAAKQ,gBACtB,kBACA;;4BAEFR,KAAKE;;;;kBAKdF,KAAKW,aAyEJ,KAxEA6B,CAAI;;0BAEGxC,KAAKuB,cAeJ,KAdAiB,CAAI;;;yCAGS,IAAMxC,KAAK2C;6CACP3C,KAAKa,aAAaC;wCACvBd,KAAKa,aAAaC;;;oCAGtBd,KAAKsB,UACHsB,EAAUC,GACVD,EAAUE;;;;;;;mCAQb,IAAM9C,KAAK+C;uCACP/C,KAAKa,aAAaE;kCACvBf,KAAKa,aAAaE;;;8BAGtBf,KAAKoB,WACHwB,EAAUI,GACVJ,EAAUK;;;;;;;yCAODjD,KAAKa,aAAaG;oCACvBhB,KAAKa,aAAaG;;;gCAGtB4B,EAAUM;;;;;8BAKXlD,KAAKuB,cASJ,KARAiB,CAAI;;6CAEUW,GACRnD,KAAKoD,kBAAkBD;;sCAEvBnD,KAAKa,aAAaI;;;;uCAKhBkC,GACRnD,KAAKqD,oBAAoBF,GAAG;;gCAE5BnD,KAAKa,aAAaK;;;uCAGViC,GACRnD,KAAKqD,oBAAoBF,GAAG;;gCAE5BnD,KAAKa,aAAaM;;;;;;;;;;;;;;;yBAiBzBnB,KAAKsB,UAAY,SAAW;;;qBAGhCtB,KAAKO,MAAQ,UAAUP,KAAKO,WAAa;cAChDP,KAAKM,OAAS,WAAWN,KAAKM,YAAc;;;;;;sCAMpBN,KAAKS,aACzB,kBACA;;;;;WAKPT,KAAKuB,eAAiBvB,KAAKsB,UAC1BkB,CAAI;;;oBAGkB,WAAdxC,KAAKG,KACHqC,CAAI;;;;yCAIMc,EAAyB,QAAzBC,EAAsB,QAAtBC,EAAc,QAAdC,EAAAzD,KAAKI,eAAS,IAAAqD,OAAA,EAAAA,EAAAC,cAAQ,IAAAF,OAAA,EAAAA,EAAAG,SAAG,IAAAJ,OAAA,EAAAA,EAAAK,4BAAOC,OAClC;;;yCAGEC,EAAyB,QAAzBC,EAAsB,QAAtBC,EAAc,QAAdC,EAAAjE,KAAKI,eAAS,IAAA6D,OAAA,EAAAA,EAAAP,cAAQ,IAAAM,OAAA,EAAAA,EAAAE,SAAG,IAAAH,OAAA,EAAAA,EAAAH,4BAAOC,OAClC;;8BAEA7D,KAAKmE,SAASC,KACbC,GAAY7B,CAAI,OAAO6B,EAAQC;;;;4BAKlCtE,KAAKmE,SAAS,GAAGI,KAAKH,KAAKI,YAC3B,MAAMC,EAASC,MAAMC,QAAQ3E,KAAK4E,QAC9B5E,KAAK4E,OAAOJ,EAAKN,EAAI,IAAM,IACF,QAAzBT,EAACzD,KAAK4E,OAAeV,SAAI,IAAAT,OAAA,EAAAA,EAAAe,EAAKN,EAAI,KAAM,GACtCW,EAASH,MAAMC,QAAQ3E,KAAK4E,QAC9B5E,KAAK4E,OAAOJ,EAAKb,EAAI,IAAM,IACF,QAAzBH,EAACxD,KAAK4E,OAAejB,SAAI,IAAAH,OAAA,EAAAA,EAAAgB,EAAKb,EAAI,KAAM,GAC5C,OAAOnB,CAAI;;sCAEDqC;sCACAJ;kCACJzE,KAAKmE,SAASC,KACd,IAAM5B,CAAI,OAAOgC,EAAKM;;6BAG3B;;wBAIPtC,CAAI;;;+BAGe,QAAXuC,EAAA/E,KAAK4E,cAAM,IAAAG,OAAA,EAAAA,EAAEC,SAAwB,YAAdhF,KAAKG,KAC1BqC,CAAI,OAAOxC,KAAKiF,2BAChB;8BACFjF,KAAKmE,SAASC,KACbC,GAAY7B,CAAI,OAAO6B,EAAQC;;;;4BAKpB,YAAdtE,KAAKG,KACHuE,MAAMC,QAAQ3E,KAAKmE,SAAS,GAAGe,MAC7BlF,KAAKmE,SAAS,GAAGe,KAAKd,KACnBe,GAAgB3C,CAAI;;;0CAGb2C,EAAOnF,KAAKmE,SAAS,GAAGiB;;4CAEtBD,EAAOnF,KAAKmE,SAAS,GAAGkB;;sCAIpCC,OAAOC,QAAQvF,KAAKmE,SAAS,GAAGe,MAAMd,KACnCe,IACC,MAAMK,EAAc,GAmCpB,OAlCIL,EAAO,GAAGL,MACZU,EAAYC,KAAKjD,CAAI;;gDAEX2C,EAAO;gDACPA,EAAO,GAAGL;;yCAIpBQ,OAAOC,QAAQJ,EAAO,IAAIf,KACvBsB,IACKA,EAAU,GAAGZ,MACfU,EAAYC,KAAKjD,CAAI;;sDAEXkD,EAAU;sDACVA,EAAU,GAAGZ;;+CAIvBQ,OAAOC,QAAQG,EAAU,IAAItB,KAC1BuB,IACCH,EAAYC,KAAKjD,CAAI;;0DAEXmD,EAAa;;wDAEfA,EAAa,GAAGb;;;kDAGtB,GAGP,IAIAU,CAAW,IAGxBxF,KAAKmE,SAAS,GAAGI,KAAKH,KACpB,CAACe,EAAaS,aACZ,MAAMC,EACJ7F,KAAKI,QAAQ0F,WAAa,IACtBC,EACU,MAAdF,EAAoB,IAAM,IAC5B,OAAOrD,CAAI;;wCAELxC,KAAK4E,OAAOI,OACVxC,CAAI;8CAEW,UAAT,QADFgB,EAAY,QAAZC,EAAAzD,KAAKI,eAAO,IAAAqD,OAAA,EAAAA,EAAEC,OAAOmC,UACnB,IAAArC,OAAA,EAAAA,EAAArD,MACAqC,CAAI;;sDAEE,IAAIwD,KACJhG,KAAK4E,OAAOgB,IACZK;;kDAGNzD,CAAI;wDACIxC,KAAK4E,OAAOgB;;4CAG1B;wCACF5F,KAAKmE,SAASC,KAAKC,YACnB,MAAM6B,EAAY7B,EAAQE,KAAKqB,GAC/B,MACgB,cAAd5F,KAAKG,MACS,eAAdH,KAAKG,KAEEqC,CAAI;kDACH6B,EAAQE,KAAKqB,GAAGd;4CAIX,UADqB,QAAlCtB,EAAY,QAAZC,EAAAzD,KAAKI,eAAO,IAAAqD,OAAA,EAAAA,EAAEC,OAAOqC,UAAa,IAAAvC,OAAA,EAAAA,EAC9BrD,MAEGqC,CAAI;;gDAEL,IAAIwD,KACJE,GACAD;;4CAGGvB,MAAMC,QAAQuB,GAChB1D,CAAI;;gDAEL0D,EAAU,OAAOA,EAAU;;4CAIZ,iBAAdA,GACNxB,MAAMC,QAAQuB,IACD,OAAdA,EA6BO1D,CAAI;kDACH6B,EAAQE,KAAKqB;4CA5BdpD,CAAI;;gDAEL8C,OAAOa,KAAKD,GAAW9B,KACtBiB,cACC,MAAMe,aAEA,QADJ3C,EAAAzD,KAAKI,QAAQsD,OAAO2B,UAChB,IAAA5B,OAAA,EAAAA,EAAAG,4BAAOC,OAAQwB,EACfgB,EAES,UAAT,QADJ9C,EAAAvD,KAAKI,QAAQsD,OAAO2B,UAChB,IAAA9B,OAAA,EAAAA,EAAApD,MACA,IAAI6F,KACFE,EAAUb,IACVY,iBACFC,EAAUb,GAChB,OAAO7C,CAAI;;;0DAGH4D;;wDAEFC;;mDAEL;;2CASV;;mCAGN;;;;;cAQvB;;KAGT,CAEO,YAAAvE,GACF9B,KAAKqB,OACPrB,KAAKqB,MAAMiF,QAEd,CAEQ,iBAAAC,GACPC,MAAMD,oBAENvG,KAAK+B,eAAe0E,QAClBC,SAASC,cAAc,6BACvB,CAAEC,YAAY,GAEjB,CAEQ,oBAAAC,GACP7G,KAAK2B,gBAAgBmF,aACrB9G,KAAK+B,eAAe+E,aAEpBN,MAAMK,sBACP,CAEQ,YAAAE,SACP,MAAMC,EAAoB,QAAfvD,EAAAzD,KAAKiH,kBAAU,IAAAxD,OAAA,EAAAA,EAAEkD,cAAc,qBAC1C3G,KAAK2B,gBAAgB8E,QAAQO,EAC9B,CAEQ,OAAAE,CAAQC,WAGbnH,KAAKqB,QACJ8F,EAAaC,IAAI,WAChBD,EAAaC,IAAI,aACjBD,EAAaC,IAAI,aAEnBpH,KAAKiC,eAAeC,MAAK,KACvBlC,KAAKqB,MAAMkD,KAAKK,OAAS5E,KAAK4E,OAC9B5E,KAAKqB,MAAMjB,QAAUJ,KAAKwB,cAG1BxB,KAAKqB,MAAMkD,KAAKJ,SAASkD,SAAQ,CAAChD,EAAciD,KAC3BtH,KAAKyB,eAAe8F,MACpCC,GAAoBA,EAAWlD,QAAUD,EAAQC,SAKlDtE,KAAKqB,MAAMkD,KAAKJ,SAASsD,OAAOH,EAAO,EACxC,IAIHtH,KAAKyB,eAAe4F,SAAShD,IAC3B,MAAMqD,EAAa1H,KAAKqB,MAAMkD,KAAKJ,SAASoD,MACzCI,GAAoBA,EAAWrD,QAAUD,EAAQC,QAG/CoD,EAKHpC,OAAOa,KAAK9B,GAASgD,SAAShC,IAC5BqC,EAAWrC,GAAOhB,EAAQgB,EAAI,IAJhCrF,KAAKqB,MAAMkD,KAAKJ,SAASsB,KAAKpB,EAM/B,IAGHrE,KAAKqB,MAAMuG,QAAQ,IAMvB,IAAIC,GAAU,EACd,GAAI7H,KAAKmE,UAAYnE,KAAKmE,SAASa,OACjC,IAAK,MAAMX,KAAWrE,KAAKmE,SAMzB,GALA0D,GACgB,UAAdxD,EAAQE,YAAM,IAAAd,OAAA,EAAAA,EAAAuB,QAAS,IACT,UAAdX,EAAQa,YAAM,IAAA1B,OAAA,EAAAA,EAAAwB,QAAS,GACtBX,EAAQa,MAAQI,OAAOa,KAAK9B,EAAQa,MAAMF,OAAS,GAEjD6C,EAAS,CACZC,QAAQC,MAAM,gDACd,KACD,EAIA/H,KAAKqB,OAASrB,KAAKG,MAAQgH,EAAaC,IAAI,aAAeS,IAC9D7H,KAAKiC,eAAeC,MAAK,KACvBlC,KAAKmC,WAAW,IAGlBnC,KAAKgI,aAKLhI,KAAKqB,QACJ8F,EAAaC,IAAI,SAChBD,EAAaC,IAAI,YACjBD,EAAaC,IAAI,UACjBD,EAAaC,IAAI,aAEnBpH,KAAKiC,eAAeC,MAAK,KACvBlC,KAAKmC,WAAW,IAGlBnC,KAAKgI,aAGHhI,KAAKqB,OAAS8F,EAAaC,IAAI,aACjCpH,KAAKqB,MAAMiF,QAEd,CAMO,SAAAnE,GAMNpD,EAAMkJ,SAASC,MAAQC,EAAiB,iCAUxC,MAAMC,EACU,UAAdpI,KAAKG,KAAmBkI,EAAmBC,EAE7C,IAAIjI,EAAU,CACZkI,EACAH,EACAI,KACGxI,KAAKK,SAtBW,CAAC,aAAc,UAAW,aA0B7BoI,SAASzI,KAAKG,QAE9BE,EAAU,IAAIA,EAASqI,IAGrB1I,KAAKqB,OACPrB,KAAKqB,MAAMsH,UAGb3I,KAAKqB,MAAQ,IAAItC,EAAMiB,KAAK4I,OAAQ,CAElCzI,KAAoB,UAAdH,KAAKG,KAAmB,WAAaH,KAAKG,KAChDoE,KAAM,CACJK,OAAQ5E,KAAK4E,OACbT,SAAUnE,KAAKyB,gBAEjBrB,QAASJ,KAAKwB,cACdnB,QAASA,GAEZ,CAMO,kBAAM4B,GACZ,MAGM4G,EAA6B,GACnC7I,KAAKmE,SAASkD,SAAShD,IAEjBA,EAAQlE,MACV0I,EAAsBpD,miDACpBqD,CAAO,kCAAkCzE,EAAQlE,WAEpD,IAIH,MAAM4I,QAAyBC,QAAQC,IAAI,CACzCC,EAAO,kCAAkClJ,KAAKG,cAC3C0I,IAIL,IAAIrH,EAAqB2H,EAAcnJ,MApBnB,CAAC,MAAO,WAAY,QAAS,YAAa,SAuB9CyI,SAASzI,KAAKG,MAC5BqB,EAAgB4H,EAAU5H,EAAe6H,KAvBtB,CAAC,aAAc,UAAW,aAwBtBZ,SAASzI,KAAKG,QACrCqB,EAAgB4H,EAAU5H,EAAe8H,EAAuBtJ,QAGlE,MAAMyB,EAAsB8H,KAAKC,MAAMD,KAAKE,UAAUzJ,KAAKmE,WAE3D4E,EAAiB1B,SAASqC,IAExBlI,EAAgB4H,EAAU5H,EAAekI,EAAgBtJ,QAAQJ,OAGjEyB,EAAe4F,SAAQ,CAAChD,EAAciD,OAEhCjD,EAAQlE,MAAQuJ,EAAgBvJ,OAASH,KAAKG,MAChDkE,EAAQlE,OAASuJ,EAAgBvJ,QAEjCsB,EAAe6F,GAAS8B,EACtB/E,EACAqF,EAAgBC,eAAe3J,KAAMsH,IAExC,GACD,IAGAtH,KAAKI,UAEPoB,EAAgB4H,EAAU5H,EAAexB,KAAKI,UAEhDJ,KAAKwB,cAAgBA,EAGrBC,EAAe4F,SAAQ,CAAChD,EAAiBiD,KACvC,MAAMsC,EAAkBC,EAAgB,CACtCC,aAAa,IAEfrI,EAAe6F,GAASsC,EAAgBvF,EAASrE,KAAKmE,SAASmD,GAAO,IAGxEtH,KAAKyB,eAAiBA,CACvB,CAEO,iBAAAwD,6BACN,IAAIX,EAAQ,GAgBZ,OAZIA,EAF4B,OAAd,UAAdtE,KAAKI,eAAS,IAAAqD,OAAA,EAAAA,EAAAqC,YACkB,QAA9B7B,EAAuB,QAAvBX,UAAAC,EAAc,QAAdC,EAAAxD,KAAKI,eAAS,IAAAoD,OAAA,EAAAA,EAAAE,6BAAQC,SAAC,IAAAL,OAAA,EAAAA,EAAEM,aAAK,IAAAK,OAAA,EAAAA,EAAEJ,MACd,QAAZG,EAAAhE,KAAKI,eAAO,IAAA4D,OAAA,EAAAA,EAAEN,OAAOC,EAAEC,MAAMC,KAE7B,UAGwB,QAA9BkG,EAAuB,QAAvBhF,UAAAjB,EAAc,QAAdC,EAAA/D,KAAKI,eAAS,IAAA2D,OAAA,EAAAA,EAAAL,6BAAQQ,SAAC,IAAAa,OAAA,EAAAA,EAAEnB,aAAK,IAAAmG,OAAA,EAAAA,EAAElG,MACd,QAAZmG,EAAAhK,KAAKI,eAAO,IAAA4J,OAAA,EAAAA,EAAEtG,OAAOQ,EAAEN,MAAMC,KAE7B,SAILS,CACR,CAEO,gBAAA3B,GACN3C,KAAKsB,WAAatB,KAAKsB,SACxB,CAEO,SAAA0G,GAGNhI,KAAKuB,cADkB,GACQkH,SAASzI,KAAKG,KAC9C,CAEO,mBAAAkD,CAAoBF,EAAU8G,GACpC9G,EAAE+G,iBAGF,MAAMC,EAAenK,KAAK4I,OAAOwB,WAAW,MACtClC,EAAQC,EAAiB,sCAC/BgC,EAAQE,OACRF,EAAQG,yBAA2B,mBACnCH,EAAQI,UAAYrC,EACpBiC,EAAQK,SAAS,EAAG,EAAGxK,KAAK4I,OAAOrI,MAAOP,KAAK4I,OAAOtI,QAGtD,MAAMmK,EAAYR,EAAO,aAAe,YAClCS,EAAUT,EAAO,MAAQ,MAGzBU,EAAIjE,SAASkE,cAAc,KACjCD,EAAEE,KAAO7K,KAAKqB,MAAMyJ,cAAcL,EAAW,GAC7CE,EAAEI,SAAW/K,KAAKC,WAAa,IAAMyK,EAGrCC,EAAEK,QAGFb,EAAQc,SACT,CAEO,iBAAA7H,CAAkBD,GACxBA,EAAE+G,iBACF,IAAIgB,EAAM,GAEV,IAAK,IAAItF,EAAI,EAAGA,EAAI5F,KAAKqB,MAAMkD,KAAKJ,SAASa,OAAQY,IACnDsF,GAAOC,EAAsB,CAC3B5G,KAAMvE,KAAKqB,MAAMkD,KAAKJ,SAASyB,GAC/BhB,OAAQ5E,KAAK4E,SAGjB,GAAW,MAAPsG,EAAa,OAEjB,MAAME,EAAWpL,KAAKC,WAAa,OAC9BiL,EAAIG,MAAM,sBACbH,EAAM,+BAAiCA,GAIzC,MAAM3G,EAAO+G,UAAUJ,GACjBK,EAAO7E,SAASkE,cAAc,KACpCW,EAAKC,aAAa,OAAQjH,GAC1BgH,EAAKC,aAAa,WAAYJ,GAC9B1E,SAAS+E,KAAKC,YAAYH,GAC1BA,EAAKP,QACLtE,SAAS+E,KAAKE,YAAYJ,EAC3B,CAEO,gBAAAxI,UACa,UAAf/C,KAAKiH,kBAAU,IAAAxD,OAAA,EAAAA,EAAEmI,mBACnBlF,SAASmF,iBAET7L,KAAKsC,UAAUwJ,mBAElB,CAEO,sBAAApJ,SACN1C,KAAKoB,WAAoD,QAAtB,QAAjBqC,EAAAzD,KAAKiH,kBAAY,IAAAxD,OAAA,EAAAA,EAAAmI,kBACpC,GAvzBe/L,EAAMkM,OAAGC,EAIzBC,EAAA,CADCC,EAAS,CAAE/L,KAAMgM,UACFtM,EAAAuM,UAAA,kBAAA,GAIhBH,EAAA,CADCC,EAAS,CAAE/L,KAAMgM,UACDtM,EAAAuM,UAAA,mBAAA,GAIjBH,EAAA,CADCC,EAAS,CAAE/L,KAAMgM,UACHtM,EAAAuM,UAAA,YAAA,GAIfH,EAAA,CADCC,EAAS,CAAE/L,KAAMuE,SACK7E,EAAAuM,UAAA,cAAA,GAIvBH,EAAA,CADCC,EAAS,CAAE/L,KAAMuE,SACI7E,EAAAuM,UAAA,gBAAA,GAItBH,EAAA,CADCC,EAAS,CAAE/L,KAAMmF,UACAzF,EAAAuM,UAAA,eAAA,GAIlBH,EAAA,CADCC,EAAS,CAAE/L,KAAMuE,SACA7E,EAAAuM,UAAA,eAAA,GAIlBH,EAAA,CADCC,EAAS,CAAE/L,KAAMkM,UACCxM,EAAAuM,UAAA,cAAA,GAInBH,EAAA,CADCC,EAAS,CAAE/L,KAAMkM,UACAxM,EAAAuM,UAAA,aAAA,GAIlBH,EAAA,CADCC,EAAS,CAAE/L,KAAMmM,WACMzM,EAAAuM,UAAA,uBAAA,GAIxBH,EAAA,CADCC,EAAS,CAAE/L,KAAMmM,WACGzM,EAAAuM,UAAA,oBAAA,GAIrBH,EAAA,CADCC,EAAS,CAAE/L,KAAMmM,WACCzM,EAAAuM,UAAA,kBAAA,GAInBH,EAAA,CADCC,EAAS,CAAE/L,KAAMmM,WACGzM,EAAAuM,UAAA,oBAAA,GAIrBH,EAAA,CADCC,EAAS,CAAE/L,KAAMmM,WACDzM,EAAAuM,UAAA,gBAAA,GAIjBH,EAAA,CADCC,EAAS,CAAE/L,KAAMmF,UAQhBzF,EAAAuM,UAAA,oBAAA,GAMFH,EAAA,CADCM,KACkB1M,EAAAuM,UAAA,kBAAA,GAOnBH,EAAA,CADCO,EAAM,eACuB3M,EAAAuM,UAAA,iBAAA,GAO9BH,EAAA,CADCO,EAAM,WACoB3M,EAAAuM,UAAA,cAAA,GAO3BH,EAAA,CADCO,EAAM,oBACgB3M,EAAAuM,UAAA,aAAA,GAMvBH,EAAA,CADCM,KACiB1M,EAAAuM,UAAA,aAAA,GAMlBH,EAAA,CADCM,KACiB1M,EAAAuM,UAAA,iBAAA,GAMlBH,EAAA,CADCM,KACqB1M,EAAAuM,UAAA,qBAAA,GAMtBH,EAAA,CADCM,KACuB1M,EAAAuM,UAAA,qBAAA,GAMxBH,EAAA,CADCM,KACwB1M,EAAAuM,UAAA,sBAAA,GAMzBH,EAAA,CADCM,KACe1M,EAAAuM,UAAA,eAAA,GAnILvM,EAAOoM,EAAA,CADnBQ,EAAc,aACF5M"}
|
|
1
|
+
{"version":3,"file":"chart.js","sources":["../../../src/components/chart/chart.ts"],"sourcesContent":["import { LitElement, html } from 'lit';\nimport { customElement, property, state, query } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { deepmerge, deepmergeCustom } from 'deepmerge-ts';\nimport Chart from 'chart.js/auto';\nimport 'chartjs-adapter-date-fns';\nimport {\n ChoroplethController,\n BubbleMapController,\n GeoFeature,\n ColorScale,\n SizeScale,\n ProjectionScale,\n} from 'chartjs-chart-geo';\nimport { TreemapController, TreemapElement } from 'chartjs-chart-treemap';\nimport { MatrixController, MatrixElement } from 'chartjs-chart-matrix';\nimport canvasBackgroundPlugin from '../../common/plugins/canvasBackground';\nimport doughnutLabelPlugin from '../../common/plugins/doughnutLabel';\nimport meterGaugePlugin from '../../common/plugins/meterGaugeNeedle';\nimport gradientLegendPlugin from '../../common/plugins/gradientLegend';\nimport a11yPlugin from 'chartjs-plugin-a11y-legend';\nimport datalabelsPlugin from 'chartjs-plugin-datalabels';\nimport annotationPlugin from 'chartjs-plugin-annotation';\nimport { convertChartDataToCSV, debounce } from '../../common/helpers/helpers';\nimport ChartScss from './chart.scss';\nimport globalOptions from '../../common/config/globalOptions';\nimport globalOptionsNonRadial from '../../common/config/globalOptionsNonRadial';\nimport globalOptionsRadial from '../../common/config/globalOptionsRadial';\nimport chartIcon from '@kyndryl-design-system/shidoka-icons/svg/monochrome/16/analytics.svg';\nimport tableIcon from '@kyndryl-design-system/shidoka-icons/svg/monochrome/16/table-view.svg';\nimport downloadIcon from '@kyndryl-design-system/shidoka-icons/svg/monochrome/16/download.svg';\nimport maximizeIcon from '@kyndryl-design-system/shidoka-icons/svg/monochrome/16/expand.svg';\nimport minimizeIcon from '@kyndryl-design-system/shidoka-icons/svg/monochrome/16/shrink.svg';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport { getTokenThemeVal } from '@kyndryl-design-system/shidoka-foundation/common/helpers/color';\n\nChart.register(\n ChoroplethController,\n BubbleMapController,\n GeoFeature,\n ColorScale,\n SizeScale,\n ProjectionScale,\n TreemapController,\n TreemapElement,\n MatrixController,\n MatrixElement,\n annotationPlugin,\n datalabelsPlugin\n);\n\n/**\n * Chart.js wrapper component.\n * @slot unnamed - Slot for custom content between header and chart.\n * @slot controls - Slot for custom controls such as an overflow menu.\n * @slot tooltip - Slot for tooltip in header.\n * @slot draghandle - Slot for widget drag handle.\n */\n@customElement('kd-chart')\nexport class KDChart extends LitElement {\n static override styles = ChartScss;\n\n /** Chart title. */\n @property({ type: String })\n chartTitle = '';\n\n /** Chart description. */\n @property({ type: String })\n description = '';\n\n /** Chart.js chart type. */\n @property({ type: String })\n type: any = '';\n\n /** Chart.js data.labels. */\n @property({ type: Array })\n labels!: Array<string>;\n\n /** Chart.js data.datasets. */\n @property({ type: Array })\n datasets!: Array<any>;\n\n /** Chart.js options. Can override Shidoka defaults. */\n @property({ type: Object })\n options: any = {};\n\n /** Chart.js additional plugins. Must be registerable inline via Chart.plugins array, not globally via Chart.register. */\n @property({ type: Array })\n plugins: any = [];\n\n /** Chart.js canvas height (px). Disables maintainAspectRatio option. */\n @property({ type: Number })\n height: any = null;\n\n /** Chart.js canvas width (px). Disables maintainAspectRatio option. */\n @property({ type: Number })\n width: any = null;\n\n /** Hides the description visually. */\n @property({ type: Boolean })\n hideDescription = false;\n\n /** Hides the closed captions visually. */\n @property({ type: Boolean })\n hideCaptions = false;\n\n /** Hides the title & description. */\n @property({ type: Boolean })\n hideHeader = false;\n\n /** Hides the controls. */\n @property({ type: Boolean })\n hideControls = false;\n\n /** Removes the outer border and padding. */\n @property({ type: Boolean })\n noBorder = false;\n\n /** Customizable text labels. */\n @property({ type: Object })\n customLabels = {\n toggleView: 'Toggle View Mode',\n toggleFullscreen: 'Toggle Fullscreen',\n downloadMenu: 'Download Menu',\n downloadCsv: 'Download as CSV',\n downloadPng: 'Download as PNG',\n downloadJpg: 'Download as JPG',\n };\n\n /** Fullscreen state.\n * @ignore\n */\n @state()\n fullscreen = false;\n\n /**\n * Queries the container element.\n * @ignore\n */\n @query('.container')\n container!: HTMLCanvasElement;\n\n /**\n * Queries the canvas element.\n * @ignore\n */\n @query('canvas')\n canvas!: HTMLCanvasElement;\n\n /**\n * Queries the closed caption div.\n * @ignore\n */\n @query('.closed-caption')\n ccDiv!: HTMLDivElement;\n\n /** The chart instance.\n * @ignore\n */\n @state()\n chart: any = null;\n\n /** Table view mode.\n * @ignore\n */\n @state()\n tableView = false;\n\n /** Disable table view feature.\n * @ignore\n */\n @state()\n tableDisabled = false;\n\n /** Merged options.\n * @ignore\n */\n @state()\n mergedOptions: any = {};\n\n /** Merged datasets.\n * @ignore\n */\n @state()\n mergedDatasets: any = {};\n\n /** Is Widget. Inherited from kyn-widget.\n * @internal\n */\n @state()\n _widget = false;\n\n /** ResizeObserver for canvas-container.\n * @internal\n */\n _resizeObserver: any = new ResizeObserver(\n debounce(() => {\n this._resizeChart();\n })\n );\n\n _themeObserver: any = new MutationObserver(() => {\n if (this.chart) {\n this.mergeOptions().then(() => {\n this.initChart();\n });\n }\n });\n\n override render() {\n const Classes = {\n container: true,\n fullscreen: this.fullscreen,\n 'no-border': this.noBorder || this._widget,\n widget: this._widget,\n };\n\n return html`\n <div\n class=${classMap(Classes)}\n @fullscreenchange=${() => this.handleFullscreenChange()}\n >\n ${!this.hideHeader || !this.hideControls\n ? html`\n <div class=\"header\">\n ${!this.hideHeader\n ? html`\n <slot name=\"draghandle\"></slot>\n\n <div id=\"titleDesc\">\n <div class=\"title\">\n ${this.chartTitle}\n <slot name=\"tooltip\"></slot>\n </div>\n <div\n class=\"description ${this.hideDescription\n ? 'hidden-visually'\n : ''}\"\n >\n ${this.description}\n </div>\n </div>\n `\n : null}\n ${!this.hideControls\n ? html`\n <div class=\"controls\">\n ${!this.tableDisabled\n ? html`\n <button\n class=\"control-button\"\n @click=${() => this.handleViewToggle()}\n aria-label=${this.customLabels.toggleView}\n title=${this.customLabels.toggleView}\n >\n <span slot=\"icon\">\n ${this.tableView\n ? unsafeSVG(chartIcon)\n : unsafeSVG(tableIcon)}\n </span>\n </button>\n `\n : null}\n\n <button\n class=\"control-button\"\n @click=${() => this.handleFullscreen()}\n aria-label=${this.customLabels.toggleFullscreen}\n title=${this.customLabels.toggleFullscreen}\n >\n <span slot=\"icon\">\n ${this.fullscreen\n ? unsafeSVG(minimizeIcon)\n : unsafeSVG(maximizeIcon)}\n </span>\n </button>\n\n <div class=\"download\">\n <button\n tabindex=\"0\"\n class=\"control-button\"\n aria-label=${this.customLabels.downloadMenu}\n title=${this.customLabels.downloadMenu}\n >\n <span slot=\"icon\">\n ${unsafeSVG(downloadIcon)}\n </span>\n </button>\n\n <div class=\"download-menu\">\n ${!this.tableDisabled\n ? html`\n <button\n tabindex=\"0\"\n @click=${(e: Event) =>\n this.handleDownloadCsv(e)}\n >\n ${this.customLabels.downloadCsv}\n </button>\n `\n : null}\n <button\n tabindex=\"0\"\n @click=${(e: Event) =>\n this.handleDownloadImage(e, false)}\n >\n ${this.customLabels.downloadPng}\n </button>\n <button\n tabindex=\"0\"\n @click=${(e: Event) =>\n this.handleDownloadImage(e, true)}\n >\n ${this.customLabels.downloadJpg}\n </button>\n </div>\n </div>\n\n <slot name=\"controls\"></slot>\n </div>\n `\n : null}\n </div>\n `\n : null}\n\n <div>\n <slot></slot>\n </div>\n\n <figure class=\"${this.tableView ? 'hidden' : ''}\">\n <div\n class=\"canvas-container\"\n style=\"${this.width ? `width: ${this.width}px;` : ''}\n ${this.height ? `height: ${this.height}px;` : ''}\"\n >\n <canvas role=\"img\" aria-labelledby=\"titleDesc\"></canvas>\n </div>\n <figcaption>\n <div\n class=\"closed-caption ${this.hideCaptions\n ? 'hidden-visually'\n : ''}\"\n ></div>\n </figcaption>\n </figure>\n\n ${!this.tableDisabled && this.tableView\n ? html`\n <div class=\"table\">\n <table>\n ${this.type === 'matrix'\n ? html`\n <thead>\n <tr>\n <th>\n ${this.options?.scales?.y?.title?.text ||\n 'Y Axis'}\n </th>\n <th>\n ${this.options?.scales?.x?.title?.text ||\n 'X Axis'}\n </th>\n ${this.datasets.map(\n (dataset) => html`<th>${dataset.label}</th>`\n )}\n </tr>\n </thead>\n <tbody>\n ${this.datasets[0].data.map((cell: any) => {\n const xLabel = Array.isArray(this.labels)\n ? this.labels[cell.x - 1] || ''\n : (this.labels as any).x?.[cell.x - 1] || '';\n const yLabel = Array.isArray(this.labels)\n ? this.labels[cell.y - 1] || ''\n : (this.labels as any).y?.[cell.y - 1] || '';\n return html`\n <tr>\n <td>${yLabel}</td>\n <td>${xLabel}</td>\n ${this.datasets.map(\n () => html`<td>${cell.value}</td>`\n )}\n </tr>\n `;\n })}\n </tbody>\n `\n : html`\n <thead>\n <tr>\n ${this.labels?.length || this.type === 'treemap'\n ? html`<th>${this.getTableAxisLabel()}</th>`\n : null}\n ${this.datasets.map(\n (dataset) => html`<th>${dataset.label}</th>`\n )}\n </tr>\n </thead>\n <tbody>\n ${this.type === 'treemap'\n ? Array.isArray(this.datasets[0].tree)\n ? this.datasets[0].tree.map(\n (_value: any) => html`\n <tr>\n <td>\n ${_value[this.datasets[0].labelKey]}\n </td>\n <td>${_value[this.datasets[0].key]}</td>\n </tr>\n `\n )\n : Object.entries(this.datasets[0].tree).map(\n (_value: any) => {\n const HtmlStrings = [];\n if (_value[1].value) {\n HtmlStrings.push(html`\n <tr>\n <td>${_value[0]}</td>\n <td>${_value[1].value}</td>\n </tr>\n `);\n } else {\n Object.entries(_value[1]).map(\n (_subValue: any) => {\n if (_subValue[1].value) {\n HtmlStrings.push(html`\n <tr>\n <td>${_subValue[0]}</td>\n <td>${_subValue[1].value}</td>\n </tr>\n `);\n } else {\n Object.entries(_subValue[1]).map(\n (_subSubValue: any) => {\n HtmlStrings.push(html`\n <tr>\n <td>${_subSubValue[0]}</td>\n <td>\n ${_subSubValue[1].value}\n </td>\n </tr>\n `);\n }\n );\n }\n }\n );\n }\n return HtmlStrings;\n }\n )\n : this.datasets[0].data.map(\n (_value: any, i: number) => {\n const IndexAxis =\n this.options.indexAxis || 'x';\n const NonIndexAxis =\n IndexAxis === 'x' ? 'y' : 'x';\n return html`\n <tr>\n ${this.labels.length\n ? html`\n ${this.options?.scales[IndexAxis]\n ?.type === 'time'\n ? html`\n <td>\n ${new Date(\n this.labels[i]\n ).toLocaleString()}\n </td>\n `\n : html`\n <td>${this.labels[i]}</td>\n `}\n `\n : null}\n ${this.datasets.map((dataset) => {\n const dataPoint = dataset.data[i];\n if (\n this.type === 'bubbleMap' ||\n this.type === 'choropleth'\n ) {\n return html`\n <td>${dataset.data[i].value}</td>\n `;\n } else if (\n this.options?.scales[NonIndexAxis]\n ?.type === 'time'\n ) {\n return html`\n <td>\n ${new Date(\n dataPoint\n ).toLocaleString()}\n </td>\n `;\n } else if (Array.isArray(dataPoint)) {\n return html`\n <td>\n ${dataPoint[0]}, ${dataPoint[1]}\n </td>\n `;\n } else if (\n typeof dataPoint === 'object' &&\n !Array.isArray(dataPoint) &&\n dataPoint !== null\n ) {\n return html`\n <td>\n ${Object.keys(dataPoint).map(\n (key) => {\n const Label =\n this.options.scales[key]\n ?.title?.text || key;\n const DisplayData =\n this.options.scales[key]\n ?.type === 'time'\n ? new Date(\n dataPoint[key]\n ).toLocaleString()\n : dataPoint[key];\n return html`\n <div>\n <strong>\n ${Label}:\n </strong>\n ${DisplayData}\n </div>\n `;\n }\n )}\n </td>\n `;\n } else {\n return html`\n <td>${dataset.data[i]}</td>\n `;\n }\n })}\n </tr>\n `;\n }\n )}\n </tbody>\n `}\n </table>\n </div>\n `\n : null}\n </div>\n `;\n }\n\n private _resizeChart() {\n if (this.chart) {\n this.chart.resize();\n }\n }\n\n override connectedCallback() {\n super.connectedCallback();\n\n this._themeObserver.observe(\n document.querySelector('meta[name=\"color-scheme\"]'),\n { attributes: true }\n );\n }\n\n override disconnectedCallback() {\n this._resizeObserver.disconnect();\n this._themeObserver.disconnect();\n\n super.disconnectedCallback();\n }\n\n override firstUpdated() {\n const el = this.shadowRoot?.querySelector('.canvas-container');\n this._resizeObserver.observe(el);\n }\n\n override updated(changedProps: any) {\n // Update chart instance when data changes.\n if (\n this.chart &&\n (changedProps.has('labels') ||\n changedProps.has('datasets') ||\n changedProps.has('options'))\n ) {\n this.mergeOptions().then(() => {\n this.chart.data.labels = this.labels;\n this.chart.options = this.mergedOptions;\n\n // remove datasets not in mergedDatasets\n this.chart.data.datasets.forEach((dataset: any, index: number) => {\n const NewDataset = this.mergedDatasets.find(\n (newDataset: any) => newDataset.label === dataset.label\n );\n\n if (!NewDataset) {\n // remove\n this.chart.data.datasets.splice(index, 1);\n }\n });\n\n // update datasets, add new ones\n this.mergedDatasets.forEach((dataset: any) => {\n const OldDataset = this.chart.data.datasets.find(\n (oldDataset: any) => oldDataset.label === dataset.label\n );\n\n if (!OldDataset) {\n // add new dataset\n this.chart.data.datasets.push(dataset);\n } else {\n // update each key/entry in the dataset object\n Object.keys(dataset).forEach((key) => {\n OldDataset[key] = dataset[key];\n });\n }\n });\n\n this.chart.update();\n });\n }\n\n // init chart\n // check to make sure initial datasets + data have been provided\n let hasData = false;\n if (this.datasets && this.datasets.length) {\n for (const dataset of this.datasets) {\n hasData =\n dataset.data?.length > 0 ||\n dataset.tree?.length > 0 ||\n (dataset.tree && Object.keys(dataset.tree).length > 0);\n\n if (!hasData) {\n console.error('Missing data for one or more chart datasets.');\n break;\n }\n }\n }\n\n if (!this.chart && this.type && changedProps.has('datasets') && hasData) {\n this.mergeOptions().then(() => {\n this.initChart();\n });\n\n this.checkType();\n }\n\n // Re-init chart instance when type, plugins, colorPalette, width, or height change.\n if (\n this.chart &&\n (changedProps.has('type') ||\n changedProps.has('plugins') ||\n changedProps.has('width') ||\n changedProps.has('height'))\n ) {\n this.mergeOptions().then(() => {\n this.initChart();\n });\n\n this.checkType();\n }\n\n if (this.chart && changedProps.has('noBorder')) {\n this.chart.resize();\n }\n }\n\n /**\n * Initializes a bar chart using the Chart.js library with provided labels, datasets,\n * and options.\n */\n private initChart() {\n const ignoredTypes = ['choropleth', 'treemap', 'bubbleMap'];\n\n // Chart.defaults.font.family = getComputedStyle(\n // document.documentElement\n // ).getPropertyValue('--kd-font-family-secondary');\n Chart.defaults.color = getTokenThemeVal('--kd-color-text-level-primary');\n\n // let plugins = [\n // canvasBackgroundPlugin,\n // doughnutLabelPlugin,\n // meterGaugePlugin,\n // ...this.plugins,\n // ];\n\n // Select plugin when type='meter'. Otherwise both plugins (meterGaugePlugin & doughnutLabelPlugin) are called\n const pluginSelectForDoghnutMeter =\n this.type === 'meter' ? meterGaugePlugin : doughnutLabelPlugin;\n\n let plugins = [\n canvasBackgroundPlugin,\n pluginSelectForDoghnutMeter,\n gradientLegendPlugin,\n ...this.plugins,\n ];\n\n // only add certain plugins for standard chart types\n if (!ignoredTypes.includes(this.type)) {\n // plugins = [...plugins, a11yPlugin, musicPlugin];\n plugins = [...plugins, a11yPlugin];\n }\n\n if (this.chart) {\n this.chart.destroy();\n }\n\n this.chart = new Chart(this.canvas, {\n //type: this.type,\n type: this.type === 'meter' ? 'doughnut' : this.type,\n data: {\n labels: this.labels,\n datasets: this.mergedDatasets,\n },\n options: this.mergedOptions,\n plugins: plugins,\n });\n }\n\n /**\n * Merges various chart type options and dataset options to create a\n * final set of options for a chart.\n */\n private async mergeOptions() {\n const radialTypes = ['pie', 'doughnut', 'radar', 'polarArea', 'meter'];\n const ignoredTypes = ['choropleth', 'treemap', 'bubbleMap'];\n\n const additionalTypeImports: any = [];\n this.datasets.forEach((dataset) => {\n // get chart types from datasets so we can import additional configs\n if (dataset.type) {\n additionalTypeImports.push(\n import(`../../common/config/chartTypes/${dataset.type}.js`)\n );\n }\n });\n\n // import main and additional chart type configs\n const chartTypeConfigs = await Promise.all([\n import(`../../common/config/chartTypes/${this.type}.js`),\n ...additionalTypeImports,\n ]);\n\n // start with global options\n let mergedOptions: any = globalOptions(this);\n\n // merge global type options\n if (radialTypes.includes(this.type)) {\n mergedOptions = deepmerge(mergedOptions, globalOptionsRadial(this));\n } else if (!ignoredTypes.includes(this.type)) {\n mergedOptions = deepmerge(mergedOptions, globalOptionsNonRadial(this));\n }\n\n const mergedDatasets: any = JSON.parse(JSON.stringify(this.datasets));\n\n chartTypeConfigs.forEach((chartTypeConfig: any) => {\n // merge all of the imported chart type options with the global options\n mergedOptions = deepmerge(mergedOptions, chartTypeConfig.options(this));\n\n // merge all of the imported chart type dataset options\n mergedDatasets.forEach((dataset: any, index: number) => {\n if (\n (!dataset.type && chartTypeConfig.type === this.type) ||\n dataset.type === chartTypeConfig.type\n ) {\n mergedDatasets[index] = deepmerge(\n dataset,\n chartTypeConfig.datasetOptions(this, index)\n );\n }\n });\n });\n\n if (this.options) {\n // merge any consumer supplied options with defaults\n mergedOptions = deepmerge(mergedOptions, this.options);\n }\n this.mergedOptions = mergedOptions;\n\n // merge default chart type dataset options with consumer supplied datasets\n mergedDatasets.forEach((dataset: object, index: number) => {\n const customDeepmerge = deepmergeCustom({\n mergeArrays: false,\n });\n mergedDatasets[index] = customDeepmerge(dataset, this.datasets[index]);\n });\n\n this.mergedDatasets = mergedDatasets;\n }\n\n private getTableAxisLabel() {\n let label = '';\n\n if (this.options?.indexAxis === 'y') {\n if (this.options?.scales?.y?.title?.text) {\n label = this.options?.scales.y.title.text;\n } else {\n label = 'Y Axis';\n }\n } else {\n if (this.options?.scales?.x?.title?.text) {\n label = this.options?.scales.x.title.text;\n } else {\n label = 'X Axis';\n }\n }\n\n return label;\n }\n\n private handleViewToggle() {\n this.tableView = !this.tableView;\n }\n\n private checkType() {\n // chart types that can't have a data table view\n const blacklist: any = [];\n this.tableDisabled = blacklist.includes(this.type);\n }\n\n private handleDownloadImage(e: Event, jpeg: boolean) {\n e.preventDefault();\n\n // add bg color to canvas\n const context: any = this.canvas.getContext('2d');\n const color = getTokenThemeVal('--kd-color-background-page-default');\n context.save();\n context.globalCompositeOperation = 'destination-over';\n context.fillStyle = color;\n context.fillRect(0, 0, this.canvas.width, this.canvas.height);\n\n // set image format\n const imgFormat = jpeg ? 'image/jpeg' : 'image/png';\n const fileExt = jpeg ? 'jpg' : 'png';\n\n // create a fake link to download the image\n const a = document.createElement('a');\n a.href = this.chart.toBase64Image(imgFormat, 1);\n a.download = this.chartTitle + '.' + fileExt;\n\n // trigger the download\n a.click();\n\n // remove canvas bg color\n context.restore();\n }\n\n private handleDownloadCsv(e: Event) {\n e.preventDefault();\n let csv = '';\n\n for (let i = 0; i < this.chart.data.datasets.length; i++) {\n csv += convertChartDataToCSV({\n data: this.chart.data.datasets[i],\n labels: this.labels,\n });\n }\n if (csv == null) return;\n\n const filename = this.chartTitle + '.csv';\n if (!csv.match(/^data:text\\/csv/i)) {\n csv = 'data:text/csv;charset=utf-8,' + csv;\n }\n\n // not sure if anything below this comment works\n const data = encodeURI(csv);\n const link = document.createElement('a');\n link.setAttribute('href', data);\n link.setAttribute('download', filename);\n document.body.appendChild(link); // Required for FF\n link.click();\n document.body.removeChild(link);\n }\n\n private handleFullscreen() {\n if (this.shadowRoot?.fullscreenElement) {\n document.exitFullscreen();\n } else {\n this.container.requestFullscreen();\n }\n }\n\n private handleFullscreenChange() {\n this.fullscreen = this.shadowRoot?.fullscreenElement !== null;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kd-chart': KDChart;\n }\n}\n"],"names":["Chart","register","ChoroplethController","BubbleMapController","GeoFeature","ColorScale","SizeScale","ProjectionScale","TreemapController","TreemapElement","MatrixController","MatrixElement","annotationPlugin","datalabelsPlugin","KDChart","LitElement","constructor","this","chartTitle","description","type","options","plugins","height","width","hideDescription","hideCaptions","hideHeader","hideControls","noBorder","customLabels","toggleView","toggleFullscreen","downloadMenu","downloadCsv","downloadPng","downloadJpg","fullscreen","chart","tableView","tableDisabled","mergedOptions","mergedDatasets","_widget","_resizeObserver","ResizeObserver","debounce","_resizeChart","_themeObserver","MutationObserver","mergeOptions","then","initChart","render","Classes","container","widget","html","classMap","handleFullscreenChange","handleViewToggle","unsafeSVG","chartIcon","tableIcon","handleFullscreen","minimizeIcon","maximizeIcon","downloadIcon","e","handleDownloadCsv","handleDownloadImage","_d","_c","_b","_a","scales","y","title","text","_h","_g","_f","_e","x","datasets","map","dataset","label","data","cell","xLabel","Array","isArray","labels","yLabel","value","_j","length","getTableAxisLabel","tree","_value","labelKey","key","Object","entries","HtmlStrings","push","_subValue","_subSubValue","i","IndexAxis","indexAxis","NonIndexAxis","Date","toLocaleString","dataPoint","keys","Label","DisplayData","resize","connectedCallback","super","observe","document","querySelector","attributes","disconnectedCallback","disconnect","firstUpdated","el","shadowRoot","updated","changedProps","has","forEach","index","find","newDataset","splice","OldDataset","oldDataset","update","hasData","console","error","checkType","defaults","color","getTokenThemeVal","pluginSelectForDoghnutMeter","meterGaugePlugin","doughnutLabelPlugin","canvasBackgroundPlugin","gradientLegendPlugin","includes","a11yPlugin","destroy","canvas","additionalTypeImports","__variableDynamicImportRuntime0__","chartTypeConfigs","Promise","all","__variableDynamicImportRuntime1__","globalOptions","deepmerge","globalOptionsRadial","globalOptionsNonRadial","JSON","parse","stringify","chartTypeConfig","datasetOptions","customDeepmerge","deepmergeCustom","mergeArrays","_k","_l","jpeg","preventDefault","context","getContext","save","globalCompositeOperation","fillStyle","fillRect","imgFormat","fileExt","a","createElement","href","toBase64Image","download","click","restore","csv","convertChartDataToCSV","filename","match","encodeURI","link","setAttribute","body","appendChild","removeChild","fullscreenElement","exitFullscreen","requestFullscreen","styles","ChartScss","__decorate","property","String","prototype","Number","Boolean","state","query","customElement"],"mappings":"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"}
|