UNPKG

@eclipse-scout/chart

Version:
1 lines 128 kB
import{AbstractLayout as Ve,Action as tt,BaseDoEntity as at,ChartTableControlConfigHelper as it,DateColumn as oe,DateFormat as rt,FormField as st,FormFieldAdapter as lt,FormFieldTile as nt,FormFieldTileAdapter as ot,HtmlComponent as ht,KeyStroke as dt,KeyStrokeContext as fe,ModelAdapter as ct,NumberColumn as ie,ObjectFactory as ut,ObjectIdProvider as Le,Point as pt,PropertyEventEmitter as _t,RoundingMode as ft,TabbableCoordinator as me,TabbableItem as Re,TableControl as mt,TableControlAdapter as gt,TableMatrix as L,TableUserFilter as Ct,Tile as yt,Tooltip as bt,Widget as Tt,aria as he,arrays as k,colorSchemes as ge,dates as O,focusUtils as xt,graphics as $e,icons as X,keys as de,numbers as ce,objects as B,scout as C,scrollbars as H,strings as S,styles as D,tooltips as ue,typeName as At}from"@eclipse-scout/core";import{CategoryScale as kt,Chart as R,_adapters as Bt}from"chart.js";import"chart.js/auto";import{default as Se}from"chartjs-plugin-datalabels";var w={};w.n=b=>{var e=b&&b.__esModule?()=>b.default:()=>b;return w.d(e,{a:e}),e},w.d=(b,e)=>{for(var t in e)w.o(e,t)&&!w.o(b,t)&&Object.defineProperty(b,t,{enumerable:!0,get:e[t]})},w.o=(b,e)=>Object.prototype.hasOwnProperty.call(b,e),w.r=b=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(b,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(b,"__esModule",{value:!0})};var Et={};w.r(Et);var Ce={};w.r(Ce),w.d(Ce,{AbstractChartRenderer:()=>ye,AbstractSvgChartRenderer:()=>V,Chart:()=>o,ChartAdapter:()=>Fe,ChartColorMode:()=>re,ChartField:()=>ze,ChartFieldAdapter:()=>Ke,ChartFieldTile:()=>Ye,ChartFieldTileAdapter:()=>Je,ChartJsRenderer:()=>se,ChartLayout:()=>De,ChartTableControl:()=>le,ChartTableControlAdapter:()=>qe,ChartTableControlConfigDo:()=>I,ChartTableControlConfigHelperImpl:()=>Oe,ChartTableControlLayout:()=>He,ChartTableUserFilter:()=>q,FocusFirstChartTypeKeyStroke:()=>we,FulfillmentChartRenderer:()=>ve,SalesfunnelChartRenderer:()=>Ie,SpeedoChartRenderer:()=>E,VennAsync3Calculator:()=>Pe,VennChartRenderer:()=>Ge,VennCircle:()=>Y,VennCircleHelper:()=>Ne,chartJsDateAdapter:()=>Me,default:()=>Ze}),C.addObjectFactories({ChartTableControlConfigHelper:()=>new Oe});class Oe extends it{async _exportConfig(e){if(!e?.detailTable)return null;let t=e.detailTable.findTableControl(le);return t&&t.selected?C.create(I,{chartTypeId:t.chartType,chartGroup1ColumnId:t.chartGroup1?.id,chartGroup1Modifier:t.chartGroup1?.modifier,chartGroup2ColumnId:t.chartGroup2?.id,chartGroup2Modifier:t.chartGroup2?.modifier,chartAggregationColumnId:t.chartAggregation?.id,chartAggregationModifier:t.chartAggregation?.modifier}):null}async _importConfig(e,t){if(!e?.detailTable||!t)return;let a=e.detailTable.findTableControl(le);a&&(a.setSelected(!0),a.setChartType(t.chartTypeId),a.setChartGroup1({id:t.chartGroup1ColumnId,modifier:t.chartGroup1Modifier}),a.setChartGroup2({id:t.chartGroup2ColumnId,modifier:t.chartGroup2Modifier}),a.setChartAggregation({id:t.chartAggregationColumnId,modifier:t.chartAggregationModifier}))}}const Lt=require("jquery");var g=w.n(Lt);class o extends Tt{data;config;checkedItems;chartRenderer;_updatedOnce;_updateChartTimeoutId;_updateChartOpts;_updateChartOptsWhileNotAttached;constructor(){super(),this.$container=null,this.data=null,this.config=null,this.checkedItems=[],this.chartRenderer=null,this._updateChartTimeoutId=null,this._updateChartOpts=null,this._updateChartOptsWhileNotAttached=[],this._updatedOnce=!1}static Type={PIE:"pie",LINE:"line",BAR:"bar",BAR_HORIZONTAL:"horizontalBar",COMBO_BAR_LINE:"comboBarLine",FULFILLMENT:"fulfillment",SPEEDO:"speedo",SALESFUNNEL:"salesfunnel",VENN:"venn",DOUGHNUT:"doughnut",POLAR_AREA:"polarArea",RADAR:"radar",BUBBLE:"bubble",SCATTER:"scatter"};static Position={TOP:"top",BOTTOM:"bottom",LEFT:"left",RIGHT:"right",CENTER:"center"};static DEFAULT_ANIMATION_DURATION=600;static DEFAULT_DEBOUNCE_TIMEOUT=100;_init(e){super._init(e),this.setConfig(this.config),this._setData(this.data)}_render(){this.$container=this.$parent.appendDiv("chart"),he.role(this.$container,"none"),this.htmlComp=ht.install(this.$container,this.session),this.htmlComp.setLayout(new De(this))}_renderProperties(){super._renderProperties(),this._renderClickable(),this._renderCheckable(),this._renderChartType(),this._renderColorScheme(),this.updateChart({requestAnimation:!0,debounce:o.DEFAULT_DEBOUNCE_TIMEOUT})}_renderOnAttach(){super._renderOnAttach();const e=this._updateChartOptsWhileNotAttached.splice(0);this.chartRenderer?.isDetachSupported()||(this._updateChartRenderer(),e.forEach(t=>delete t.requestAnimation),e.push({requestAnimation:!1})),e.forEach(t=>this.updateChart(g().extend(!0,{},t,{debounce:!0})))}_remove(){this.chartRenderer&&this.chartRenderer.remove(!1),this.$container.remove(),this.$container=null}setData(e){this.setProperty("data",e),this.setCheckedItems(this.checkedItems)}_setData(e){e&&(e=g().extend({axes:[]},e)),this._setProperty("data",e)}_renderData(){this.updateChart({requestAnimation:!0,debounce:o.DEFAULT_DEBOUNCE_TIMEOUT,onlyUpdateData:!0})}setConfig(e){let t={type:o.Type.PIE,options:{autoColor:!0,colorMode:re.AUTO,colorScheme:ge.ColorSchemeId.DEFAULT,transparent:!1,maxSegments:5,adjustGridMaxMin:!0,clickable:!1,checkable:!1,animation:{duration:o.DEFAULT_ANIMATION_DURATION},plugins:{datalabels:{display:!1},tooltip:{enabled:!0},legend:{display:!0,clickable:!1,position:o.Position.RIGHT,pointsVisible:!0}}}};if(e=g().extend(!0,{},t,e),e.options.colorScheme=ge.ensureColorScheme(e.options.colorScheme),B.equalsRecursive(this.config,e))return;let a=g().extend(!0,{},this.config);e.data?a.data=e.data:delete a.data;let i=(r,s,l)=>{if(!(!r||!s||!l)){if(!r.options||!r.options[l]){s.options&&delete s.options[l],s.options&&B.isEmpty(s.options.scales)&&!(r.options&&r.options.scales)&&delete s.options.scales,B.isEmpty(s.options)&&!r.options&&delete s.options;return}s.options[l]=r.options[l]}};if(i(e,a,"xLabelMap"),i(e,a,"yLabelMap"),B.equalsRecursive(a,e)){this._setProperty("config",e),this.rendered&&this._renderConfig(!0),this.setCheckedItems(this.checkedItems);return}this.rendered&&this.config&&this.config.type&&this.$container.removeClass(this.config.type+"-chart"),this.setProperty("config",e),this.setCheckedItems(this.checkedItems),this._updateChartRenderer()}_renderConfig(e){this._renderClickable(),this._renderCheckable(),this._renderChartType(),this._renderColorScheme(),this.updateChart({requestAnimation:!0,debounce:o.DEFAULT_DEBOUNCE_TIMEOUT,onlyUpdateData:e})}setCheckedItems(e){this.setProperty("checkedItems",k.ensure(this._filterCheckedItems(e)))}_filterCheckedItems(e){if(!Array.isArray(e))return e;let t=[];this.data&&this.data.chartValueGroups?this.data.chartValueGroups.forEach(i=>t.push(i.values.length)):this.config&&this.config.data&&this.config.data.datasets.forEach(i=>t.push(i.data.length));let a=e.filter(i=>t[i.datasetIndex]&&i.dataIndex<t[i.datasetIndex]);return a.length<e.length?a:e}_renderCheckedItems(){this.chartRenderer&&this.chartRenderer.renderCheckedItems()}_renderEnabled(){this.updateChart()}_renderClickable(){this.$container.toggleClass("clickable",this.config.options.clickable)}_renderCheckable(){this.$container.toggleClass("checkable",this.config.options.checkable)}_renderChartType(){this.$container.addClass(this.config.type+"-chart")}_renderColorScheme(){ge.toggleColorSchemeClasses(this.$container,this.config.options.colorScheme)}updateChart(e){e=e||{},e.onlyUpdateData=e.onlyUpdateData&&this.chartRenderer&&this.chartRenderer.isDataUpdatable(),e.enforceRerender=!e.onlyUpdateData&&!e.onlyRefresh,this._updateChartTimeoutId&&(clearTimeout(this._updateChartTimeoutId),this._updateChartOpts&&(e.requestAnimation=e.requestAnimation||this._updateChartOpts.requestAnimation,e.onlyUpdateData=e.onlyUpdateData||this._updateChartOpts.onlyUpdateData,e.onlyRefresh=e.onlyRefresh||this._updateChartOpts.onlyRefresh,e.enforceRerender=e.enforceRerender||this._updateChartOpts.enforceRerender),this._updateChartTimeoutId=null,this._updateChartOpts=null);let t=i.bind(this);e.debounce===!0||typeof e.debounce=="number"?(this._updateChartOpts=e,typeof e.debounce=="number"?this._updateChartTimeoutId=setTimeout(t,e.debounce):this._updateChartTimeoutId=setTimeout(t)):t();function i(){if(this._updateChartTimeoutId=null,this._updateChartOpts=null,!this.$container||!this.$container.isAttached()){this._updateChartOptsWhileNotAttached.push(e);return}this._updatedOnce=!0,this.chartRenderer&&(e.enforceRerender?this.chartRenderer.remove(this.chartRenderer.shouldAnimateRemoveOnUpdate(e),r=>{this.removing||r||(this.chartRenderer.render(e.requestAnimation),this.trigger("chartRender"))}):e.onlyUpdateData?this.chartRenderer.updateData(e.requestAnimation):e.onlyRefresh&&this.chartRenderer.refresh())}}_resolveChartRenderer(){switch(this.config.type){case o.Type.FULFILLMENT:return new ve(this);case o.Type.SPEEDO:return new E(this);case o.Type.SALESFUNNEL:return new Ie(this);case o.Type.VENN:return new Ge(this);case o.Type.BAR:case o.Type.BAR_HORIZONTAL:case o.Type.LINE:case o.Type.COMBO_BAR_LINE:case o.Type.PIE:case o.Type.DOUGHNUT:case o.Type.POLAR_AREA:case o.Type.RADAR:case o.Type.BUBBLE:case o.Type.SCATTER:return new se(this)}return null}_updateChartRenderer(){this.chartRenderer&&this.chartRenderer.remove(),this.setProperty("chartRenderer",this._resolveChartRenderer())}handleValueClick(e,t){if(this.config.options.checkable){let a=[...this.checkedItems],i=a.filter(r=>r.datasetIndex===e.datasetIndex&&r.dataIndex===e.dataIndex)[0];i?k.remove(a,i):a.push(e),this.setCheckedItems(a)}this.trigger("valueClick",{data:e,originalEvent:t})}handleNonValueClick(e){this.trigger("nonValueClick",{originalEvent:e})}handleLegendClick(e,t){this.trigger("legendItemClick",{legendItemIndex:e,originalEvent:t})}}var re;(function(b){b.AUTO="auto",b.DATASET="dataset",b.DATA="data"})(re||(re={}));class Fe extends ct{_onWidgetValueClick(e){this._send("valueClick",e.data)}_onWidgetEvent(e){e.type==="valueClick"?this._onWidgetValueClick(e):super._onWidgetEvent(e)}}class De extends Ve{chart;constructor(e){super(),this.chart=e}layout(e){let t={requestAnimation:!0,debounce:o.DEFAULT_DEBOUNCE_TIMEOUT,onlyUpdateData:!0};(!this.chart.session.ready||this.chart._updatedOnce)&&(t.requestAnimation=!1),this.chart.session.ready||(t.debounce=!1),this.chart.findParent(yt)?.$container.hasClass("dragged")&&(t.debounce=!1),this.chart.chartRenderer instanceof se&&this.chart.chartRenderer.chartJs?.resize(),this.chart.updateChart(t)}}class ye extends _t{chart;session;rendering;rendered;animationDuration;firstOpaqueBackgroundColor;constructor(e){super(),this.chart=e,this.session=e.session,this.rendering=!1,this.rendered=!1,this.animationDuration=0,this.firstOpaqueBackgroundColor=""}validate(){return this._validateChartData()?this._validate():!1}_validateChartData(){let e=this.chart&&this.chart.data;if(!e||!e.chartValueGroups||e.chartValueGroups.length===0)return!1;let t,a=0;for(t=0;t<e.chartValueGroups.length;t++){let i=e.chartValueGroups[t];if(!i.values)return!1;if(t===0)a=i.values.length;else if(i.values.length!==a)return!1;if(!this.chart.config.options.autoColor&&!k.ensure(i.colorHexValue).length&&!i.cssClass)return!1}for(t=0;t<e.axes.length;t++)if(e.axes[t].length!==a)return!1;return!0}_validate(){return!0}render(e){if(!this.validate()||!this.chart.rendered)return;const t=this.chart.config.options.animation.duration;this.setAnimationDuration(e?t:0),this.rendering=!0,this._render(),this.rendering=!1,this.rendered=!0,this.setAnimationDuration(t)}_render(){}renderCheckedItems(){this.rendered&&this._renderCheckedItems()}_renderCheckedItems(){}updateData(e){if(!this.rendered){this.render(e);return}if(!this.validate()||!this.isDataUpdatable())return;const t=this.chart.config.options.animation.duration;this.setAnimationDuration(e?t:0),this._updateData(),this.setAnimationDuration(t)}_updateData(){}isDataUpdatable(){return!1}isDetachSupported(){return!0}refresh(){this.rendering||(this.rendered&&this.remove(!1),this.render(!1))}setAnimationDuration(e){this.setProperty("animationDuration",e)&&this.rendered&&this._renderAnimationDuration()}_setAnimationDuration(e){this._setProperty("animationDuration",e)}_renderAnimationDuration(){}remove(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,t=arguments.length>1?arguments[1]:void 0;const a=this.chart.config.options.animation.duration;this.setAnimationDuration(e&&a),this.animationDuration&&this.rendered?this._removeAnimated(t):this._remove(t),this.setAnimationDuration(a)}_remove(e){this.rendered=!1,e&&e()}_removeAnimated(e){this._remove(e)}shouldAnimateRemoveOnUpdate(e){return e.requestAnimation}}class V extends ye{chartBox;clipId;maskId;suppressLegendBox;height;width;chartAnimationStopping;$svg;_nonValueClickHandler;constructor(e){super(e),this.chartBox=null,this.clipId="Clip-"+Le.get().createUiSeqId(),this.maskId="Mask-"+Le.get().createUiSeqId(),this.suppressLegendBox=!1,this._nonValueClickHandler=this._onNonValueClick.bind(this)}static FONT_SIZE_SMALLEST="smallestFont";static FONT_SIZE_SMALL="smallFont";static FONT_SIZE_MIDDLE="middleFont";static FONT_SIZE_BIG="bigFont";_render(){this.$svg||(this.$svg=this.chart.$container.appendSVG("svg","chart-svg"),he.role(this.$svg,"img"),this.linkChartWithFieldLabel(this.$svg),this.$svg.on("click",this._nonValueClickHandler)),this.firstOpaqueBackgroundColor=D.getFirstOpaqueBackgroundColor(this.$svg),this.height=this.$svg.height(),this.width=this.$svg.width(),this._initChartBox(),this._useFontSizeBig()?this.$svg.addClass(V.FONT_SIZE_BIG):this._useFontSizeMiddle()?this.$svg.addClass(V.FONT_SIZE_MIDDLE):this._useFontSizeSmall()?this.$svg.addClass(V.FONT_SIZE_SMALL):this._useFontSizeSmallest()&&this.$svg.addClass(V.FONT_SIZE_SMALLEST),this.$svg.isAttached()&&this._renderInternal()}linkChartWithFieldLabel(e){if(!e)return;let t=e.parents(".chart-field");if(t.length>0){let a=t.eq(0).children("label");a.length>0&&he.linkElementWithLabel(e,a.eq(0))}}_renderInternal(){}_useFontSizeBig(){return!1}_useFontSizeMiddle(){return!1}_useFontSizeSmall(){return!1}_useFontSizeSmallest(){return!1}remove(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,t=arguments.length>1?arguments[1]:void 0;this.rendered&&!this.chartAnimationStopping&&(this.chartAnimationStopping=!0,this.$svg.children().stop(!0,!1),this.chartAnimationStopping=!1),super.remove(e,t)}_remove(e){this.rendered&&(this.$svg.children().stop(!0,!1),this.rendered&&(this.$svg.remove(),this.$svg=null)),this.rendered=!1,e&&e(this.chartAnimationStopping)}_createClickObject(e,t){return{xIndex:e,dataIndex:e,datasetIndex:t}}_onChartValueClick(e){this.chart.handleValueClick(e.data,e.originalEvent),e.stopPropagation()}_onNonValueClick(e){this.chart.handleNonValueClick(e.originalEvent),e.stopPropagation()}_measureText(e,t){let a=this.$svg.appendSVG("text",t).attr("x",0).attr("y",0).attr("visibility","hidden").text(e),i;try{i=a[0].getBBox()}catch{return{height:0,width:0}}return a.remove(),i}_renderLine(e,t,a,i,r){let s=this.$svg.appendSVG("line",r).attr("x1",e).attr("y1",t).attr("x2",a).attr("y2",i);return this.animationDuration&&s.attr("opacity",0).animateSVG("opacity",1,this.animationDuration,null,!0),s}_renderLineLabel(e,t,a,i,r){let s=this.$svg.appendSVG("text",i||"line-label").attr("x",e).attr("y",t).text(a);if(r){s.attr("mask","url(#"+this.maskId+")");let l=this.$svg.appendSVG("text",i?i+" background":"line-label-background").attr("x",e).attr("y",t).attr("clip-path","url(#"+this.clipId+")").text(a);s.data("$background",l),this.animationDuration&&l.attr("opacity",0).animateSVG("opacity",1,this.animationDuration,null,!0)}return this.animationDuration&&s.attr("opacity",0).animateSVG("opacity",1,this.animationDuration,null,!0),s}_initChartBox(){this.chartBox={width:this.width,height:this.height,xOffset:0,yOffset:0,mX:function(){return this.xOffset+this.width/2},mY:function(){return this.yOffset+this.height/2}}}_createAnimationObjectWithTabIndexRemoval(e,t){return{step:function(a,i){try{e.bind(this)(a,i)}catch(r){throw g()(this).stop(!0,!1),r}},duration:t||o.DEFAULT_ANIMATION_DURATION,complete:function(){g()(this).removeAttr("tabindex")}}}_addClipping(e){let t=this.$svg.appendSVG("clipPath");t[0].id=this.clipId;let a=this.$svg.appendSVG("mask");a.appendSVG("rect").attr("x",0).attr("y",0).attr("width","100%").attr("height","100%").attr("fill","white"),a[0].id=this.maskId,this.chart.$container.find("."+e).each(function(i){this.id="ClipMask-"+Le.get().createUiSeqId(),t.appendSVG("use").attrXLINK("href","#"+this.id),a.appendSVG("use").attrXLINK("href","#"+this.id)})}_renderWireLegend(e,t,a,i){if(!this.chart.config.options.plugins.tooltip.enabled)return{detachFunc:()=>{},attachFunc:()=>{},removeFunc:()=>{}};let r={},s=5,l,h=0,n=17,c=n;i&&(l=this.$svg.appendSVG("rect","wire-legend-background-box").attr("opacity","1"));let d=t,u,p=0,f=0;if(d.h===-1?f=d.x2-2*s:f=this.width-d.x2-2*s,Array.isArray(e))for(let _=0;_<e.length;_++){let T=e.length-_-1,A=d.y2+d.v*s-n*T-s*T,x=this._renderLineLabel(d.x2+s,A,S.truncateText(e[_],f,this._measureText.bind(this)),"",i);x.addClass(a),p=Math.max(p,x[0].getComputedTextLength()),_===0?u=x:u.data("lines")?u.data("lines").push(x):u.data("lines",[x])}else u=this._renderLineLabel(d.x2+s,d.y2+d.v*s,S.truncateText(e,f,this._measureText.bind(this)),"",i),u.addClass(a),p=u[0].getComputedTextLength();if(h=p+2*s,t.autoPosition&&(d=t.posFunc.call(this,h,c),u.attr("x",d.x2+s),u.attr("y",d.y2+d.v*s)),d.h===-1?(u.attr("x",d.x2-s-p),u.css("text-anchor","left"),u.data("lines")&&u.data("lines").forEach(_=>{_.attr("x",d.x2-s-p),_.css("text-anchor","left")})):(u.attr("x",d.x2+s),u.css("text-anchor","right"),u.data("lines")&&u.data("lines").forEach(_=>{_.attr("x",d.x2+s),_.css("text-anchor","right")})),d.v===1)u.data("lines")&&u.data("lines").forEach((_,T)=>{_.attr("y",d.x2-s-p);let A=1+T;_.attr("y",d.y2+d.v*s+n*A+s*(A+1))}),u.attr("dy","0.7em");else if(u.data("lines")){let _=u.data("lines").length;u.attr("y",d.y2+d.v*s-n*_-s*_),u.data("lines").forEach((T,A)=>{_=u.data("lines").length-1-A,T.attr("y",d.y2+d.v*s-n*_-s*_)})}u.add(u.data("lines")).each((_,T)=>{let A=g()(T),x=A.data("$background");x&&(x.attr("x",A.attr("x")),x.attr("y",A.attr("y")),x.css("text-anchor",A.css("text-anchor")),x.attr("dy",A.attr("dy")))});let m=[];d.x1>0&&d.y1>0&&(m.push(this._renderLine(d.x1,d.y1,d.x2,d.y2,"label-line")),m.push(this._renderLine(d.x2,d.y2,d.x2+d.h*(p+2*s),d.y2,"label-line"))),u.data("wires",m);let y=this.$svg;return r.detachFunc=()=>{u.data("wires").forEach(_=>{_.detach()}),u.data("lines")&&u.data("lines").forEach(_=>{_.data("$background")&&y.append(_.data("$background")),_.detach()}),u.data("$background")&&u.data("$background").remove(),u.detach()},r.attachFunc=()=>{y.append(u),u.data("$background")&&y.append(u.data("$background")),y.append(u.data("wires")),u.data("lines")&&u.data("lines").forEach(_=>{y.append(_),_.data("$background")&&y.append(_.data("$background"))})},r.removeFunc=()=>{u.data("wires").forEach(_=>{_.remove()}),u.data("lines")&&u.data("lines").forEach(_=>{_.data("$background")&&_.data("$background").remove(),_().remove()}),u.data("$background")&&u.data("$background").remove(),u.remove()},r.$field=u,r}}const Me={getAdapter(b){return{formats:()=>Rt(b.locale),parse:(e,t)=>B.isNullOrUndefined(e)?null:e instanceof Date?e.getTime():B.isString(e)?B.isString(t)&&S.hasText(t)?(e=new rt(b.locale,t).parse(e),e instanceof Date?e.getTime():null):(e=O.parseJsonDate(e),e instanceof Date?e.getTime():null):null,format:(e,t)=>{if(t==="quarter")throw new Error('The time unit "quarter" is not supported for formatting.');return O.format(new Date(e),b.locale,t)},add:(e,t,a)=>{let i=new Date(e);switch(a){case"millisecond":return O.shiftTime(i,0,0,0,t).getTime();case"second":return O.shiftTime(i,0,0,t,0).getTime();case"minute":return O.shiftTime(i,0,t,0,0).getTime();case"hour":return O.shiftTime(i,t,0,0,0).getTime();case"day":return O.shift(i,0,0,t).getTime();case"week":return O.shift(i,0,0,t*7).getTime();case"month":return O.shift(i,0,t,0).getTime();case"quarter":return O.shift(i,0,t*3,0).getTime();case"year":return O.shift(i,t,0,0).getTime();default:return e}},diff:(e,t,a)=>{switch(a){case"millisecond":return e-t;case"second":return(e-t)/1e3;case"minute":return(e-t)/1e3/60;case"hour":return(e-t)/1e3/60/60;case"day":return O.compareDays(new Date(e),new Date(t));case"week":return O.compareDays(new Date(e),new Date(t))/7;case"month":return O.compareMonths(new Date(e),new Date(t));case"quarter":return O.compareMonths(new Date(e),new Date(t))/3;case"year":return new Date(e).getFullYear()-new Date(t).getFullYear();default:return 0}},startOf:(e,t,a)=>{let i=new Date(e);switch(t){case"second":return i.setMilliseconds(0);case"minute":return i.setSeconds(0,0);case"hour":return i.setMinutes(0,0,0);case"day":return i.setHours(0,0,0,0);case"week":return O.firstDayOfWeek(i,0).getTime();case"isoWeek":return O.firstDayOfWeek(i,a).getTime();case"month":return O.trunc(i).setDate(0);case"quarter":return O.trunc(i).setMonth(i.getMonth()%4,1);case"year":return O.trunc(i).setMonth(0,1);default:return e}},endOf:(e,t)=>{let a=new Date(e);switch(t){case"second":return a.setMilliseconds(999);case"minute":return a.setSeconds(59,999);case"hour":return a.setMinutes(59,59,999);case"day":return a.setHours(23,59,59,999);case"week":{a.setHours(23,59,59,999);let i=O.firstDayOfWeek(a,0);return i.setDate(i.getDate()+7)}case"month":return a.setHours(23,59,59,999),a.setDate(Ue(a.getMonth(),a.getFullYear()));case"quarter":{a.setHours(23,59,59,999);let i=a.getMonth()%4+2;return a.setMonth(i,Ue(i,a.getFullYear()))}case"year":return a.setHours(23,59,59,999),a.setMonth(11,31);default:return e}}}}};function Rt(b){return{datetime:b.dateFormatPatternDefault+" "+b.timeFormatPatternDefault,millisecond:"HH:mm:ss.SSS",second:"HH:mm:ss",minute:b.timeFormatPatternDefault,hour:b.timeFormatPatternDefault,day:b.dateFormatPatternDefault,week:"ww",month:"MMM yyyy",quarter:"qqq - yyyy",year:"yyyy"}}function Ue(b,e){return b in[3,5,8,10]?30:b===1?O.isLeapYear(e)?29:28:31}R.register(Se),g().extend(!0,R.defaults,{maintainAspectRatio:!1,elements:{line:{borderWidth:2},point:{radius:0,hitRadius:10,hoverRadius:7,hoverBorderWidth:2},arc:{borderWidth:1},bar:{borderWidth:1,borderSkipped:""}},plugins:{legend:{labels:{usePointStyle:!0,boxHeight:7}}}}),g().extend(!0,R.overrides,{line:{elements:{point:{borderWidth:2}}},scatter:{elements:{point:{radius:3}}},bubble:{layout:{autoPadding:!1}}});let We=!1;const St=(1+Math.sqrt(5))/2;class se extends ye{static ARROW_LEFT_RIGHT="↔";static ARROW_UP_DOWN="↕";chartJs;onlyIntegers;maxXAxesTicksHeight;numSupportedColors;colorSchemeCssClass;minRadialChartDatalabelSpace;resetDatasetAfterHover;legendHoverDatasets;removing;$canvas;_labelFormatter;_xLabelFormatter;_yLabelFormatter;_xAxisFitter;_yAxisFitter;_radialChartDatalabelsDisplayHandler;_radialChartDatalabelsFormatter;_datalabelsFormatter;_datalabelBackgroundColorHandler;_legendLabelGenerator;_clickHandler;_hoverHandler;_pointerHoverHandler;_legendClickHandler;_legendHoverHandler;_legendPointerHoverHandler;_legendLeaveHandler;_legendPointerLeaveHandler;_resizeHandler;_tooltipTitleGenerator;_tooltipItemsGenerator;_tooltipLabelGenerator;_tooltipLabelValueGenerator;_tooltipLabelColorGenerator;_tooltipRenderer;_tooltip;_tooltipTimeoutId;_updatingDatalabels;_hoveringClickableElement;constructor(e){super(e),this.chartJs=null,this.onlyIntegers=!0,this.maxXAxesTicksHeight=75,this.numSupportedColors=6,this.colorSchemeCssClass="",this.minRadialChartDatalabelSpace=25,this._labelFormatter=this._createLabelFormatter(this._formatLabel),this._xLabelFormatter=this._createLabelFormatter(this._formatXLabel),this._yLabelFormatter=this._createLabelFormatter(this._formatYLabel),this._xAxisFitter=this._fitXAxis.bind(this),this._yAxisFitter=this._fitYAxis.bind(this),this._radialChartDatalabelsDisplayHandler=this._displayDatalabelsOnRadialChart.bind(this),this._radialChartDatalabelsFormatter=this._formatDatalabelsOnRadialChart.bind(this),this._datalabelsFormatter=this._formatDatalabels.bind(this),this._datalabelBackgroundColorHandler=this._getBackgroundColorOfDataset.bind(this),this._legendLabelGenerator=this._generateLegendLabels.bind(this),this.resetDatasetAfterHover=!1,this._clickHandler=this._onClick.bind(this),this._hoverHandler=this._onHover.bind(this),this._pointerHoverHandler=this._onHoverPointer.bind(this),this.legendHoverDatasets=[],this._legendClickHandler=this._onLegendClick.bind(this),this._legendHoverHandler=this._onLegendHover.bind(this),this._legendPointerHoverHandler=this._onLegendHoverPointer.bind(this),this._legendLeaveHandler=this._onLegendLeave.bind(this),this._legendPointerLeaveHandler=this._onLegendLeavePointer.bind(this),this._resizeHandler=this._onResize.bind(this),this._tooltipTitleGenerator=this._generateTooltipTitle.bind(this),this._tooltipItemsGenerator=this._generateTooltipItems.bind(this),this._tooltipLabelGenerator=this._generateTooltipLabel.bind(this),this._tooltipLabelValueGenerator=this._generateTooltipLabelValue.bind(this),this._tooltipLabelColorGenerator=this._generateTooltipLabelColor.bind(this),this._tooltipRenderer=this._renderTooltip.bind(this),this._tooltip=null,this._tooltipTimeoutId=null}_validateChartData(){let e=!0,t=this.chart&&this.chart.data;if((!t||!t.chartValueGroups||t.chartValueGroups.length===0||!t.axes)&&(e=!1),e&&C.isOneOf(this.chart.config.type,o.Type.POLAR_AREA,o.Type.RADAR)){let r,s=0;for(r=0;r<t.chartValueGroups.length;r++){let l=t.chartValueGroups[r];l.values||(e=!1),r===0?s=l.values.length:l.values.length!==s&&(e=!1)}for(r=0;r<t.axes.length;r++)t.axes[r].length!==s&&(e=!1)}if(e)return!0;let a=!0,i=this.chart&&this.chart.config;if((!i||!i.data||!i.data.datasets||i.data.datasets.length===0)&&(a=!1),a&&C.isOneOf(i.type,o.Type.POLAR_AREA,o.Type.RADAR)){let r,s=0;for(r=0;r<i.data.datasets.length;r++){let l=i.data.datasets[r];l.data||(a=!1),r===0?s=l.data.length:l.data.length!==s&&(a=!1)}}return a}_render(){this.$canvas||(this.$canvas=this.chart.$container.appendElement("<canvas>"),this.$canvas.on("click",this._onCanvasClick.bind(this)),he.hidden(this.$canvas,!0)),this.firstOpaqueBackgroundColor=D.getFirstOpaqueBackgroundColor(this.$canvas),We||(R.defaults.font.family=this.$canvas.css("font-family"),Bt._date.override(Me.getAdapter(this.chart.session)),We=!0);let e=g().extend(!0,{},this.chart.config);this._adjustConfig(e),this._renderChart(e)}_renderChart(e){this.chartJs&&this.chartJs.destroy(),e=g().extend(!0,{},e,{options:{animation:{}}},e),e.options.animation.duration=this.animationDuration,this.chartJs=new R(this.$canvas[0].getContext("2d"),e),this._adjustSize(this.chartJs.config,this.chartJs.chartArea,{isDatasetVisible:t=>this.chartJs.getDatasetMeta(t).visible}),this.refresh()}_updateData(){if(!this.chartJs)return;let e=g().extend(!0,{},this.chart.config);this._adjustConfig(e);let t=this.chartJs.config.data,a=e.data,i=(n,c,d,u)=>{if(!n||!c||!d)return;if(!c[d]){let m=n[d];(m||u)&&(c[d]=m);return}if(!n[d]){if(u){c[d]=void 0;return}if(Array.isArray(c[d])){c[d].splice(0,c[d].length);return}c[d]=void 0;return}if(!Array.isArray(n[d])||!Array.isArray(c[d])){c[d]=n[d];return}for(let m=0;m<Math.min(n[d].length,c[d].length);m++)c[d][m]=n[d][m];let p=c[d].length,f=n[d].length;p>f?c[d].splice(f,p-f):p<f&&c[d].push(...n[d].splice(p))},r=(n,c)=>k.find(n,d=>d.datasetId===c),s=(n,c)=>k.findIndex(n,d=>d.datasetId===c);if(t&&a){i(a,t,"labels"),t.datasets||(t.datasets=[]),a.datasets||(a.datasets=[]),a.datasets.every(n=>B.isNullOrUndefined(n.datasetId))&&(a.datasets.forEach((n,c)=>{n.datasetId=""+c}),t.datasets.forEach((n,c)=>{n.datasetId=""+c})),t.datasets.forEach(n=>{let c=r(a.datasets,n.datasetId);c&&(n.label=c.label,n.type=c.type,i(c,n,"data"),i(c,n,"backgroundColor",!0),i(c,n,"borderColor",!0),i(c,n,"hoverBackgroundColor",!0),i(c,n,"hoverBorderColor",!0),i(c,n,"legendColor",!0),i(c,n,"pointBackgroundColor",!0),i(c,n,"pointHoverBackgroundColor",!0),i(c,n,"pointBorderColor",!0),i(c,n,"pointHoverBorderColor",!0),i(c,n,"uncheckedBackgroundColor",!0),i(c,n,"uncheckedHoverBackgroundColor",!0),i(c,n,"checkedBackgroundColor",!0),i(c,n,"checkedHoverBackgroundColor",!0),i(c,n,"uncheckedPointBackgroundColor",!0),i(c,n,"uncheckedPointHoverBackgroundColor",!0),i(c,n,"checkedPointBackgroundColor",!0),i(c,n,"checkedPointHoverBackgroundColor",!0),i(c,n,"lineTension",!0),i(c,n,"pointRadius",!0),i(c,n,"uncheckedPointRadius",!0),i(c,n,"checkedPointRadius",!0),this._adjustDatasetBorderWidths(n))});for(let n=t.datasets.length-1;n>=0;n--){let c=t.datasets[n].datasetId;(B.isNullOrUndefined(c)||s(a.datasets,c)===-1)&&t.datasets.splice(n,1)}t.datasets.sort((n,c)=>s(a.datasets,n.datasetId)-s(a.datasets,c.datasetId)),a.datasets.forEach((n,c)=>{let d=t.datasets[c];d&&d.datasetId&&n.datasetId===d.datasetId||t.datasets.splice(c,0,n)})}else this.chartJs.config.data=a;i(e.options,this.chartJs.config.options,"xLabelMap",!0),i(e.options,this.chartJs.config.options,"yLabelMap",!0),g().extend(!0,this.chartJs.config,{options:{animation:{duration:this.animationDuration}}});let l=this.chartJs.config.options.scales||{};[l.x||{},l.y||{},l.yDiffType||{},l.r||{}].forEach(n=>{(n.ticks||{}).stepSize=void 0}),this.refresh(),this._adjustSize(this.chartJs.config,this.chartJs.chartArea,{isDatasetVisible:n=>this.chartJs.getDatasetMeta(n).visible}),this.refresh()}isDataUpdatable(){return!0}isDetachSupported(){return!1}refresh(){this.chartJs?this.chartJs.update():super.refresh()}_renderAnimationDuration(){this.chartJs&&(g().extend(!0,this.chartJs.config,{options:{animation:{duration:this.animationDuration}}}),this.refresh())}_renderCheckedItems(){this.chartJs&&this._checkItems(this.chartJs.config)&&this.refresh()}_checkItems(e){if(!e||!e.data)return!1;let t=(i,r,s)=>{if(Array.isArray(i)&&Array.isArray(r)){let l=0;return k.ensure(s).filter(h=>!isNaN(h)&&h<Math.min(i.length,r.length)).forEach(h=>{i[h]!==r[h]&&(i[h]=r[h],l++)}),l}return 0},a=0;return e.data.datasets.forEach((i,r)=>{let s=this.chart.checkedItems.filter(h=>h.datasetIndex===r).map(h=>h.dataIndex),l=k.init(i.data.length,null).map((h,n)=>n);k.removeAll(l,s),a=a+t(i.backgroundColor,i.checkedBackgroundColor,s)+t(i.hoverBackgroundColor,i.checkedHoverBackgroundColor,s)+t(i.pointBackgroundColor,i.checkedPointBackgroundColor,s)+t(i.pointHoverBackgroundColor,i.checkedPointHoverBackgroundColor,s)+t(i.pointRadius,i.checkedPointRadius,s)+t(i.backgroundColor,i.uncheckedBackgroundColor,l)+t(i.hoverBackgroundColor,i.uncheckedHoverBackgroundColor,l)+t(i.pointBackgroundColor,i.uncheckedPointBackgroundColor,l)+t(i.pointHoverBackgroundColor,i.uncheckedPointHoverBackgroundColor,l)+t(i.pointRadius,i.uncheckedPointRadius,l),this._adjustDatasetBorderWidths(i)}),0<a}stopAnimations(){this.chartJs&&this.chartJs.stop()}_adjustConfig(e){!e||!e.type||(this._adjustType(e),this.chart.data&&this._computeDatasets(this.chart.data,e),this._adjustData(e),this._adjustLegend(e),this._adjustTooltip(e),this._adjustGrid(e),this._adjustPlugins(e),this._adjustColors(e),this._adjustClickHandler(e),this._adjustResizeHandler(e))}_adjustType(e){if(e.type===o.Type.COMBO_BAR_LINE){e.type=o.Type.BAR;let t=(e.options||{}).scaleLabelByTypeMap;t&&(t[o.Type.BAR]=t[o.Type.COMBO_BAR_LINE])}else this._isHorizontalBar(e)&&(e.type=o.Type.BAR,e.options=g().extend(!0,{},e.options,{indexAxis:"y"}))}_computeDatasets(e,t){let a=[],i=[],r=(l,h)=>{g().isEmptyObject(h)||(t.options[l]=h)};(e.axes[0]||[]).forEach(l=>a.push(l.label));let s=this._isHorizontalBar(t);r(s?"yLabelMap":"xLabelMap",this._computeLabelMap(e.axes[0])),r(s?"xLabelMap":"yLabelMap",this._computeLabelMap(e.axes[1])),e.chartValueGroups.forEach(l=>i.push({type:l.type,label:l.groupName,data:g().extend(!0,[],l.values)})),t.data={labels:a,datasets:i}}_isHorizontalBar(e){return e&&(e.type===o.Type.BAR_HORIZONTAL||e.type===o.Type.BAR&&e.options&&e.options.indexAxis==="y")}_computeLabelMap(e){let t={};return(e||[]).forEach((a,i)=>{t[i]=a.label}),t}_adjustData(e){!e||!e.data||!e.type||(this._adjustBarBorderWidth(e),this._adjustMaxSegments(e),this._adjustBubbleRadii(e),this._adjustOnlyIntegers(e))}_adjustBarBorderWidth(e){!e||!e.data||!e.type||!C.isOneOf(e.type,o.Type.BAR)||e.data.datasets.forEach(t=>{(t.type||o.Type.BAR)===o.Type.BAR&&(t.borderWidth=t.borderWidth||1,t.hoverBorderWidth=t.hoverBorderWidth||2,this._adjustDatasetBorderWidths(t))})}_adjustDatasetBorderWidths(e){this._adjustDatasetBorderWidth(e),this._adjustDatasetBorderWidth(e,!0)}_adjustDatasetBorderWidth(e,t){if(!e)return;let a=t?"hoverBorderWidth":"borderWidth",i=t?"hoverBorderWidthBackup":"borderWidthBackup",r=t?"hoverBackgroundColor":"backgroundColor",s=t?"hoverBorderColor":"borderColor";if(e[i]&&(e[a]=e[i],delete e[i]),!e[a]||B.isFunction(e[a]))return;let l=Array.isArray(e[a]),h=Array.isArray(e[r]),n=Array.isArray(e[s]);if(!(l||h||n)&&e[r]===e[s]){e[i]=e[a],e[a]=0;return}let d=(e.data||[]).length;l?e[a].length<d&&e[a].push(...k.init(d-e[a].length,e[a][0])):e[a]=k.init(d,e[a]);let u=e[a],p=u.length,f=k.init(p,null);for(let m=0;m<p;m++){let y=h?e[r][m]:e[r],_=n?e[s][m]:e[s];f[m]=u[m],y===_&&(u[m]=0)}k.equals(u,f)||(e[i]=f)}_adjustMaxSegments(e){if(!e||!e.data||!e.type||!C.isOneOf(e.type,o.Type.PIE,o.Type.DOUGHNUT,o.Type.POLAR_AREA,o.Type.RADAR))return;let t=e.options.maxSegments;if(!(t&&e.data.datasets.length&&t<e.data.datasets[0].data.length))return;e.data.datasets.forEach(i=>{let r=i.data.slice(0,t);r[t-1]=i.data.slice(t-1,i.data.length).reduce((s,l)=>s+l,0),i.data=r});let a=e.data.labels.slice(0,t);a[t-1]=this.chart.session.text("ui.OtherValues"),e.data.labels=a,e.data.maxSegmentsExceeded=!0}_isMaxSegmentsExceeded(e,t){return!C.isOneOf(e.type,o.Type.PIE,o.Type.DOUGHNUT,o.Type.POLAR_AREA,o.Type.RADAR)||e.options.otherSegmentClickable||!e.data.maxSegmentsExceeded||!e.options.maxSegments?!1:e.options.maxSegments-1<=t}_adjustBubbleRadii(e){!e||!e.data||!e.type||e.type!==o.Type.BUBBLE||e.data.datasets.forEach(t=>t.data.forEach(a=>{isNaN(a.r)||(a.z=Math.pow(a.r,2)),a.r=1}))}_adjustOnlyIntegers(e){this.onlyIntegers=!0,!(!e||!e.data||!e.type)&&(C.isOneOf(e.type,o.Type.BUBBLE,o.Type.SCATTER)?this.onlyIntegers=e.data.datasets.every(t=>t.data.every(a=>ce.isInteger(a.x)&&ce.isInteger(a.y))):this.onlyIntegers=e.data.datasets.every(t=>t.data.every(a=>ce.isInteger(a))))}_adjustLegend(e){!e||!e.type||!e.options||(e.options=g().extend(!0,{},e.options,{plugins:{legend:{labels:{generateLabels:this._legendLabelGenerator}}}}),e.options.plugins.legend.pointsVisible||(e.options.plugins.legend.labels.boxWidth=0))}_adjustTooltip(e){if(!e)return;e.options=g().extend(!0,{},{plugins:{tooltip:{callbacks:{title:this._tooltipTitleGenerator,items:this._tooltipItemsGenerator,label:this._tooltipLabelGenerator,labelValue:this._tooltipLabelValueGenerator,labelColor:this._tooltipLabelColorGenerator}}}},e.options);let t=e.options.plugins.tooltip;t.enabled&&(t.enabled=!1,t.external=this._tooltipRenderer)}_generateTooltipTitle(e){if(!e||!e.length)return"";let t=e[0],a=t.chart,i=a.config,r=t.dataset,s=[];if(C.isOneOf(i.type,o.Type.BUBBLE)){let l=i.options.scales.x,h=i.options.scales.y,n=this._getAxisLabels(i),c=l.ticks.callback(r.data[t.dataIndex].x,null,null);c&&s.push(this._createTooltipAttribute(n.x,S.encode(c),!0));let d=h.ticks.callback(r.data[t.dataIndex].y,null,null);d&&s.push(this._createTooltipAttribute(n.y,S.encode(d),!0))}else if(!C.isOneOf(i.type,o.Type.SCATTER)){let l=a.data.labels[t.dataIndex];s.push(this._createTooltipAttribute(i.options.reformatLabels?this._formatLabel(l):l,"",!0))}return s}_getAxisLabels(e){let t=e.options.scales.x.title.text,a=e.options.scales.y.title.text;return t=this._resolveAxisLabel(t,se.ARROW_LEFT_RIGHT),a=this._resolveAxisLabel(a,"&nbsp;"+se.ARROW_UP_DOWN+"&nbsp;"),{x:t,y:a}}_resolveAxisLabel(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"";return B.isFunction(e)&&(e=e(),e=B.isString(e)?e:""),e?S.encode(e):t}_generateTooltipItems(e,t,a,i){if(!e||!e.length)return"";let r=e[0],s=r.chart,l=s.config,h=!1,n=!1,c="";if(e.forEach(d=>{let{label:u,labelValue:p,labelColor:f}=this._getItemDetails(d,t,a,i);if(C.isOneOf(l.type,o.Type.SCATTER)){let{x:m,y}=p;h||=B.isString(m),n||=B.isString(y),c+=this._createTooltipScatterAttribute(u,m,y,!1,f)}else c+=this._createTooltipAttribute(u,p,!1,f)}),C.isOneOf(l.type,o.Type.SCATTER)){let d="<table><tbody>",u=this._getAxisLabels(l);d+=this._createTooltipScatterAttribute("",h?u.x:"",n?u.y:"",!0),c=S.box(d,c,"</tbody></table>")}return c}_getItemDetails(e,t,a,i){let r,s,l;return B.isFunction(t)&&(r=t(e),r=B.isString(r)?r:""),B.isFunction(a)&&(s=a(e),s=B.isString(s)||B.isObject(s)?s:""),B.isFunction(i)&&(l=i(e),l=B.isObject(l)&&l.backgroundColor||""),{label:r,labelValue:s,labelColor:l}}_generateTooltipLabel(e){return S.encode(e.dataset.label)}_generateTooltipLabelValue(e){let t=e.chart.config,a=e.dataset;return t.type===o.Type.BUBBLE?S.encode(this._formatLabel(a.data[e.dataIndex].z)):t.type===o.Type.SCATTER?{x:S.encode(this._formatXLabel(a.data[e.dataIndex].x)),y:S.encode(this._formatYLabel(a.data[e.dataIndex].y))}:S.encode(this._formatLabel(a.data[e.dataIndex]))}_generateTooltipLabelColor(e){let t=e.chart.config,a=e.dataset,i,r,s,l;C.isOneOf(a.type||t.type,o.Type.LINE,o.Type.BAR,o.Type.BAR_HORIZONTAL,o.Type.RADAR,o.Type.BUBBLE,o.Type.SCATTER)&&(s=a.borderColor,i=Array.isArray(a.legendColor)?a.legendColor[e.dataIndex]:a.legendColor,l=e.datasetIndex),C.isOneOf(t.type,o.Type.PIE,o.Type.DOUGHNUT,o.Type.POLAR_AREA)&&(i=Array.isArray(a.legendColor)?a.legendColor[e.dataIndex]:a.legendColor,r=Array.isArray(a.backgroundColor)?a.backgroundColor[e.dataIndex]:a.backgroundColor,r=this._adjustColorOpacity(r,1),l=e.dataIndex),B.isFunction(i)&&(i=i.call(e.chart,l));let h=i||r||s;if(!h||B.isFunction(h)){let n;R.overrides[t.type]&&R.overrides[t.type].plugins&&R.overrides[t.type].plugins.tooltip&&R.overrides[t.type].plugins.tooltip.callbacks&&(n=R.overrides[t.type].plugins.tooltip.callbacks.labelColor),h=(n||R.defaults.plugins.tooltip.callbacks.labelColor).call(e.chart,e).backgroundColor}return{backgroundColor:h}}_createTooltipAttribute(e,t,a,i){return'<div class="'+(a?"attribute title":"attribute")+'">'+(i?'<div class="color" style="background-color:'+i+'"></div>':"")+(e?"<label>"+e+"</label>":"")+(t?'<div class="value">'+t+"</div>":"")+"</div>"}_createTooltipScatterAttribute(e,t,a,i,r){return'<tr class="'+(i?"attribute title":"attribute")+'"><td class="color-cell">'+(r?'<div class="color" style="background-color:'+r+'"></div>':"")+'</td><td class="label">'+e+"</td>"+(t?'<td class="value">'+t+"</td>":"")+(a?'<td class="value">'+a+"</td>":"")+"</tr>"}_renderTooltip(e){if(e.tooltip.opacity===0||e.tooltip.dataPoints.length<1){this._tooltipTimeoutId&&(clearTimeout(this._tooltipTimeoutId),this._tooltipTimeoutId=void 0),this._tooltip&&(this._tooltip.destroy(),this._tooltip=null);return}!!this._tooltip?this._renderTooltipLater(e):(clearTimeout(this._tooltipTimeoutId),this._tooltipTimeoutId=setTimeout(()=>this._renderTooltipLater(e),ue.DEFAULT_TOOLTIP_DELAY))}_renderTooltipLater(e){if(!this.rendered||this.removing)return;let t=e.tooltip,a=t.dataPoints;if(a.length<1)return;let i=a[0];if(!i.chart.getDatasetMeta(i.datasetIndex).data[i.dataIndex])return;this._tooltip&&(this._tooltip.destroy(),this._tooltip=null);let s=t.options||{},l=s.callbacks||{},h=l.title,n=l.items,c=l.label,d=l.labelValue,u=l.labelColor,p="";B.isFunction(h)&&(p+=k.ensure(h(a)).join("")),B.isFunction(n)&&(p+=k.ensure(n(a,c,d,u)).join(""));let f=this._computeTooltipPositionAndOffset(i),m=new pt(t.caretX+f.offsetX,t.caretY+f.offsetY);this._tooltip=C.create({objectType:bt,parent:this.chart,$anchor:this.$canvas,text:p,htmlEnabled:!0,cssClass:S.join(" ","chart-tooltip",s.cssClass),tooltipPosition:f.tooltipPosition,tooltipDirection:f.tooltipDirection,originProducer:A=>{const x=$e.offsetBounds(A);return x.height=f.height,x},offsetProducer:A=>m}),this._tooltip.render(),this._tooltip.$container.css("pointer-events","none");let y=!1,_=(s.titleFont||{}).family;_&&(this._tooltip.$container.css("--chart-tooltip-font-family",_),y=!0);let T=0;this._tooltip.$container.find("label").each((A,x)=>{T=Math.max(T,$e.prefSize(g()(x)).width)}),T>0&&(this._tooltip.$container.css("--chart-tooltip-label-width",Math.min(T,120)+"px"),y=!0),y&&this._tooltip.position()}_computeTooltipPositionAndOffset(e){let t="top",a="right",i=0,r=0,s=0,l=e.chart,h=e.datasetIndex,n=e.dataIndex,c=l.config,d=c.data.datasets,u=d[h],p=u.data[n];if(this._isHorizontalBar(c))B.isObject(p)&&B.isArray(p.x)&&p.x.length===2?a=(p.x[0]+p.x[1])/2<0?"left":"right":a=p<0?"left":"right";else if((u.type||c.type)===o.Type.BAR)t=p<0?"bottom":"top";else if(C.isOneOf(c.type,o.Type.PIE,o.Type.DOUGHNUT,o.Type.POLAR_AREA)){let f=l.getDatasetMeta(h).data[n].getProps(["startAngle","endAngle"]),m=f.startAngle,y=f.endAngle,_=(m+y)/2;t=0<=_&&_<Math.PI?"bottom":"top",a=-Math.PI/2<=_&&_<Math.PI/2?"right":"left"}else if(c.type===o.Type.RADAR){let m=l.getDatasetMeta(h).data[n].getProps(["angle"]).angle;t=0<=m&&m<Math.PI?"bottom":"top",a=-Math.PI/2<=m&&m<Math.PI/2?"right":"left"}else if(C.isOneOf(c.type,o.Type.BUBBLE,o.Type.SCATTER)){let f=l.getDatasetMeta(h).data[n],m=l.chartArea,y=m.left+m.width/2;a=f.x<y?"left":"right"}if(this._isHorizontalBar(c)){let f=l.getDatasetMeta(h).data[n].getProps(["height","width"]);s=f.height;let m=f.width,y=m/(St+1);r=-s/2,i=a==="left"?y:-y}else if(C.isOneOf(c.type,o.Type.LINE,o.Type.BUBBLE,o.Type.SCATTER,o.Type.RADAR)||u.type===o.Type.LINE){let m=l.getDatasetMeta(h).data[n].options,y=m.hoverRadius+m.hoverBorderWidth;c.type===o.Type.BUBBLE&&(y+=p.r),s=2*y,r=-y}else if(C.isOneOf(c.type,o.Type.PIE,o.Type.DOUGHNUT,o.Type.POLAR_AREA)){let f=l.getDatasetMeta(h).data[n].getProps(["startAngle","endAngle","innerRadius","outerRadius"]),m=f.startAngle,y=f.endAngle,_=(m+y)/2,T=f.innerRadius,A=f.outerRadius,x=(A-T)/2;i=x*Math.cos(_),r=x*Math.sin(_)}return{tooltipPosition:t,tooltipDirection:a,offsetX:i,offsetY:r,height:s}}_adjustGrid(e){e&&(e.options=g().extend(!0,{},e.options),this._adjustScalesR(e),this._adjustScalesXY(e))}_adjustScalesR(e){if(!e||!e.type||!e.options)return;C.isOneOf(e.type,o.Type.POLAR_AREA,o.Type.RADAR)&&(e.options=g().extend(!0,{},{scales:{r:{}}},e.options));let t=e.options,a=t?t.scales:{};a&&a.r&&(a.r=g().extend(!0,{},{minSpaceBetweenTicks:35,beginAtZero:!0,angleLines:{display:!1},ticks:{callback:this._labelFormatter},pointLabels:{callback:this._labelFormatter,font:{size:R.defaults.font.size}}},a.r))}_adjustScalesXY(e){!e||!e.type||!e.options||(C.isOneOf(e.type,o.Type.BAR,o.Type.LINE,o.Type.BUBBLE)?e.options=g().extend(!0,{},{scales:{x:{minSpaceBetweenTicks:150},y:{minSpaceBetweenTicks:35}}},e.options):C.isOneOf(e.type,o.Type.SCATTER)&&(e.options=g().extend(!0,{},{scales:{x:{minSpaceBetweenTicks:35,ticks:{padding:10}},y:{minSpaceBetweenTicks:35,ticks:{padding:10}}}},e.options)),this._adjustXAxis(e),this._adjustYAxis(e))}_adjustXAxis(e){if(!e||!e.type||!e.options||!e.options.scales||!e.options.scales.x)return;let t=e.type,a=e.options.scales;this._isHorizontalBar(e)||C.isOneOf(t,o.Type.BUBBLE,o.Type.SCATTER)?a.x=g().extend(!0,{},{beginAtZero:this._isHorizontalBar(e),offset:t===o.Type.BUBBLE,grid:{drawTicks:!1},border:{display:!1},ticks:{padding:5}},a.x):a.x=g().extend(!0,{},{offset:!0,grid:{display:!1},border:{display:!1}},a.x),(this._isHorizontalBar(e)||C.isOneOf(t,o.Type.BUBBLE,o.Type.SCATTER)||e.options.reformatLabels)&&(a.x=g().extend(!0,{},{ticks:{callback:this._xLabelFormatter}},a.x)),a.x.afterCalculateLabelRotation=this._xAxisFitter}_adjustYAxis(e){if(!e||!e.type||!e.options||!e.options.scales||!e.options.scales.y)return;let t=e.type,a=e.options.scales;this._isHorizontalBar(e)?a.y=g().extend(!0,{},{grid:{display:!1},border:{display:!1}},a.y):a.y=g().extend(!0,{},{beginAtZero:!C.isOneOf(t,o.Type.BUBBLE,o.Type.SCATTER),grid:{drawTicks:!1},border:{display:!1},ticks:{padding:5}},a.y),(!this._isHorizontalBar(e)||e.options.reformatLabels)&&(a.y=g().extend(!0,{},{ticks:{callback:this._yLabelFormatter}},a.y)),a.y.afterFit=this._yAxisFitter}_adjustPlugins(e){this._adjustPluginsDatalabels(e)}_adjustPluginsDatalabels(e){if(!e||!e.type||!e.options||!e.options.plugins||!e.options.plugins.datalabels||!e.options.plugins.datalabels.display)return;let t=e.options.plugins;if(C.isOneOf(e.type,o.Type.PIE,o.Type.DOUGHNUT)){t.datalabels=g().extend(!0,{},{formatter:this._radialChartDatalabelsFormatter},t.datalabels),t.datalabels.display=this._radialChartDatalabelsDisplayHandler,this._updatingDatalabels=!1;let a=e.options.animation||{},i=a.onProgress,r=a.onComplete,s=h=>{if(this._updatingDatalabels)return;this._updatingDatalabels=!0;let n=h.chart,c=n.getSortedVisibleDatasetMetas(),d=[...n.getActiveElements()],u=[];c.forEach((p,f)=>{p.data.forEach((m,y)=>{let _=k.findIndex(d,T=>T.datasetIndex===f&&T.index===y);_>0?d.splice(_,1):u.push({datasetIndex:f,index:y,element:m})})}),n["$"+Se.id]._actives=u,Se.afterEvent(n,null,null),this._updatingDatalabels=!1},l=(h,n)=>{s(h),n&&n(h)};e.options.animation=g().extend(!0,{},e.options.animation,{onProgress:h=>l(h,i),onComplete:h=>l(h,r)})}else C.isOneOf(e.type,o.Type.BAR,o.Type.LINE,o.Type.POLAR_AREA,o.Type.RADAR,o.Type.BUBBLE)?(t.datalabels=g().extend(!0,{},{backgroundColor:this._datalabelBackgroundColorHandler,borderRadius:3},t.datalabels),t.datalabels.display="auto"):C.isOneOf(e.type,o.Type.SCATTER)&&(t.datalabels=g().extend(!0,{},{backgroundColor:this._datalabelBackgroundColorHandler,borderRadius:3,anchor:"end",align:"top",offset:3},t.datalabels),t.datalabels.display="auto");if(e.options.reformatLabels){let a=i=>(r,s)=>{let l=i.call(s.chart,r,s);return this._formatLabel(l)};e.data&&e.data.datasets.forEach(r=>{r.datalabels&&r.datalabels.formatter&&(r.datalabels.formatter=a(r.datalabels.formatter))}),t.datalabels.formatter&&(t.datalabels.formatter=a(t.datalabels.formatter))}t.datalabels=g().extend(!0,{},{formatter:this._datalabelsFormatter},t.datalabels)}_getNumberFormatter(){return this.chartJs?.config?.options?.numberFormatter}_createLabelFormatter(e){const t=this;return function(a){return e.call(t,a,this)}}_formatLabel(e,t){return e=this._formatCategory(e,t),this._formatLabelMap(e,null,this._getNumberFormatter())}_formatXLabel(e,t){return e=this._formatCategory(e,t),this._formatLabelMap(e,this._getXLabelMap(),this._getNumberFormatter())}_formatYLabel(e,t){return e=this._formatCategory(e,t),this._formatLabelMap(e,this._getYLabelMap(),this._getNumberFormatter())}_formatCategory(e,t){return t instanceof kt&&ce.isNumber(e)?t.getLabelForValue(e):e}_getXLabelMap(){return this._getLabelMap("xLabelMap")}_getYLabelMap(){return this._getLabelMap("yLabelMap")}_getLabelMap(e){if(this.chartJs&&this.chartJs.config&&this.chartJs.config.options)return this.chartJs.config.options[e]}_formatLabelMap(e,t,a){return t?t[e]:isNaN(e)||typeof e=="string"?""+e:a?a(e,this._formatNumberLabel.bind(this)):this._formatNumberLabel(e)}_formatNumberLabel(e){if(isNaN(e))return""+e;let t=Math.abs(e),a="";if(t>=1e6){t=t/1e6,a=" "+this.chart.session.text("ui.Mio");let i=[this.chart.session.text("ui.Mrd"),this.chart.session.text("ui.Bio"),this.chart.session.text("ui.Brd"),this.chart.session.text("ui.Tri"),this.chart.session.text("ui.Trd")];for(let r=0;r<i.length&&t>=1e3;r++)t=t/1e3,a=" "+i[r]}return this.session.locale.decimalFormat.format(Math.sign(e)*t)+a}_fitXAxis(e){if(!e||e.labelRotation===0)return;let t=this.maxXAxesTicksHeight,a=R.defaults.font,i=R.defaults.scale.ticks,r=i.font||{},s,l;if(this.chartJs){let u=this.chartJs.chartArea,p=Math.abs(u.top-u.bottom);t=Math.min(t,p/3)}e.options&&e.options.ticks&&(l=e.options.ticks.maxRotation,s=(e.options.ticks.font||{}).size),l=l||i.maxRotation,s=s||r.size||a.size,isNaN(e.labelRotation)&&(e.labelRotation=l),e.height=isNaN(e.height)?t:Math.min(e.height,t);let h=e.labelRotation,n=(t-s*Math.sin((90-h)/180*Math.PI))/Math.sin(h/180*Math.PI);if(((e._labelSizes||{}).widest||{}).width>n){let u=e.ctx.measureText.bind(e.ctx);e.ticks.forEach(p=>{p.label=S.truncateText(p.label,n,u)}),e._labelSizes=void 0}}_fitYAxis(e){if(!e)return;let t=0,a=0;if(e.options&&e.options.ticks&&(t=e.options.ticks.padding||0),e.options&&e.options.grid&&(a=e.options.grid.tickLength||0),((e._labelSizes||{}).widest||{}).width>e.maxWidth-t){let s=e.maxWidth-t-a,l=e.ctx.measureText.bind(e.ctx);e.ticks.forEach(h=>{h.label=S.truncateText(h.label,s,l)})}}_displayDatalabelsOnRadialChart(e){let t=e.chart.getDatasetMeta(e.datasetIndex).data[e.dataIndex].getProps(["startAngle","endAngle","innerRadius","outerRadius"]),a=(t.outerRadius+t.innerRadius)/2,i=Math.min(t.endAngle-t.startAngle,Math.PI)/2,r=Math.abs(Math.sin(i))*a,s=r*2,l=t.outerRadius-t.innerRadius;return Math.min(s,l)>this.minRadialChartDatalabelSpace}_formatDatalabelsOnRadialChart(e,t){let a=this._computeSumOfVisibleElements(t),i=t.dataset,r=0,s=[];for(let l=0;l<t.dataIndex+1;l++){let h=i.data[l]/a*100-r,n=Math.round(h);r=n-h,s.push(n+"%")}return s[t.dataIndex]}_computeSumOfVisibleElements(e){let t=e.dataset,a=e.chart,i=0;for(let r=0;r<t.data.length;r++)a.getDataVisibility(r)&&(i+=t.data[r]);return i}_formatDatalabels(e,t){let a=t.chart.config;return a.type===o.Type.BUBBLE?this._formatLabel(e.z):a.type===o.Type.SCATTER?S.join(" / ",this._formatXLabel(e.x),this._formatYLabel(e.y)):this._formatLabel(e)}_getBackgroundColorOfDataset(e){return e.dataset.backgroundColor}_adjustColors(e){this._adjustColorSchemeCssClass(e),this._adjustDatasetColors(e),this._adjustLegendColors(e),this._adjustScalesRColors(e),this._adjustScalesXYColors(e),this._adjustPluginColors(e)}_adjustColorSchemeCssClass(e){!e||!e.options||(this.colorSchemeCssClass=ge.getCssClasses(e.options.colorScheme).join(" "))}_adjustDatasetColors(e){if(!e||!e.data||!e.type)return;let t=e.data,a=e.type,i=e.options&&e.options.autoColor,r=e.options&&e.options.checkable,s=e.options&&e.options.colorMode,l=i&&(s===re.DATASET?!1:s===re.DATA?!0:C.isOneOf(a,o.Type.PIE,o.Type.DOUGHNUT,o.Type.POLAR_AREA)),h={backgroundColors:[],borderColors:[],hoverBackgroundColors:[],hoverBorderColors:[],checkedBackgroundColors:[],checkedHoverBackgroundColors:[],legendColors:[],pointHoverColors:[]};h=g().extend(!0,h,this._computeDatasetColors(e,l)),t.datasets.forEach((n,