highcharts
Version:
JavaScript charting framework
11 lines • 13.1 kB
JavaScript
/**
* Highstock JS v12.3.0 (2025-06-21)
* @module highcharts/modules/datagrouping
* @requires highcharts
*
* Data grouping module
*
* (c) 2010-2025 Torstein Hønsi
*
* License: www.highcharts.com/license
*/let t;import*as e from"../highcharts.js";var i,o,a,n={};n.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var i in e)n.o(e,i)&&!n.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})},n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);let r=e.default;var s=n.n(r);let l={},{arrayMax:u,arrayMin:h,correctFloat:p,extend:d,isNumber:c}=s();function g(t){let e=t.length,i=m(t);return c(i)&&e&&(i=p(i/e)),i}function m(t){let e=t.length,i;if(!e&&t.hasNulls)i=null;else if(e)for(i=0;e--;)i+=t[e];return i}let f={average:g,averages:function(){let t=[];return[].forEach.call(arguments,function(e){t.push(g(e))}),void 0===t[0]?void 0:t},close:function(t){return t.length?t[t.length-1]:t.hasNulls?null:void 0},high:function(t){return t.length?u(t):t.hasNulls?null:void 0},hlc:function(t,e,i){if(t=l.high(t),e=l.low(e),i=l.close(i),c(t)||c(e)||c(i))return[t,e,i]},low:function(t){return t.length?h(t):t.hasNulls?null:void 0},ohlc:function(t,e,i,o){if(t=l.open(t),e=l.high(e),i=l.low(i),o=l.close(o),c(t)||c(e)||c(i)||c(o))return[t,e,i,o]},open:function(t){return t.length?t[0]:t.hasNulls?null:void 0},range:function(t,e){return(t=l.low(t),e=l.high(e),c(t)||c(e))?[t,e]:null===t&&null===e?null:void 0},sum:m};d(l,f);let y={common:{groupPixelWidth:2,dateTimeLabelFormats:{millisecond:["%[AebHMSL]","%[AebHMSL]","-%[HMSL]"],second:["%[AebHMS]","%[AebHMS]","-%[HMS]"],minute:["%[AebHM]","%[AebHM]","-%[HM]"],hour:["%[AebHM]","%[AebHM]","-%[HM]"],day:["%[AebY]","%[Aeb]","-%[AebY]"],week:["%v %[AebY]","%[Aeb]","-%[AebY]"],month:["%[BY]","%[B]","-%[BY]"],year:["%Y","%Y","-%Y"]}},seriesSpecific:{line:{},spline:{},area:{},areaspline:{},arearange:{},column:{groupPixelWidth:10},columnrange:{groupPixelWidth:10},candlestick:{groupPixelWidth:10},ohlc:{groupPixelWidth:5},hlc:{groupPixelWidth:5},heikinashi:{groupPixelWidth:10}},units:[["millisecond",[1,2,5,10,20,25,50,100,200,500]],["second",[1,2,5,10,15,30]],["minute",[1,2,5,10,15,30]],["hour",[1,2,3,4,6,8,12]],["day",[1]],["week",[1]],["month",[1,3,6]],["year",null]]},{addEvent:x,extend:G,merge:M,pick:b}=s();function v(t){let e=this,i=e.series;i.forEach(function(t){t.groupPixelWidth=void 0}),i.forEach(function(i){i.groupPixelWidth=e.getGroupPixelWidth&&e.getGroupPixelWidth(),i.groupPixelWidth&&(i.hasProcessed=!0),i.applyGrouping(!!t.hasExtremesChanged)})}function A(){let t=this.series,e=t.length,i=0,o=!1,a,n;for(;e--;)(n=t[e].options.dataGrouping)&&(i=Math.max(i,b(n.groupPixelWidth,y.common.groupPixelWidth)),a=(t[e].dataTable.modified||t[e].dataTable).rowCount,(t[e].groupPixelWidth||a>this.chart.plotSizeX/i||a&&n.forced)&&(o=!0));return o?i:0}function T(){this.series.forEach(function(t){t.hasProcessed=!1})}function D(e,i){let o;if(i=b(i,!0),e||(e={forced:!1,units:null}),this instanceof t)for(o=this.series.length;o--;)this.series[o].update({dataGrouping:e},!1);else this.chart.options.series.forEach(function(t){t.dataGrouping="boolean"==typeof e?e:M(e,t.dataGrouping)});this.ordinal&&(this.ordinal.slope=void 0),i&&this.chart.redraw()}let C=function(e){t=e;let i=e.prototype;i.applyGrouping||(x(e,"afterSetScale",T),x(e,"postProcessData",v),G(i,{applyGrouping:v,getGroupPixelWidth:A,setDataGrouping:D}))};(i=o||(o={})).setLength=function(t,e,i){return Array.isArray(t)?(t.length=e,t):t[i?"subarray":"slice"](0,e)},i.splice=function(t,e,i,o,a=[]){if(Array.isArray(t))return Array.isArray(a)||(a=Array.from(a)),{removed:t.splice(e,i,...a),array:t};let n=Object.getPrototypeOf(t).constructor,r=t[o?"subarray":"slice"](e,e+i),s=new n(t.length-i+a.length);return s.set(t.subarray(0,e),0),s.set(a,e),s.set(t.subarray(e+i),e+a.length),{removed:r,array:s}};let{setLength:P,splice:w}=o,{fireEvent:S,objectEach:k,uniqueKey:O}=s(),R=class{constructor(t={}){this.autoId=!t.id,this.columns={},this.id=t.id||O(),this.modified=this,this.rowCount=0,this.versionTag=O();let e=0;k(t.columns||{},(t,i)=>{this.columns[i]=t.slice(),e=Math.max(e,t.length)}),this.applyRowCount(e)}applyRowCount(t){this.rowCount=t,k(this.columns,(e,i)=>{e.length!==t&&(this.columns[i]=P(e,t))})}deleteRows(t,e=1){if(e>0&&t<this.rowCount){let i=0;k(this.columns,(o,a)=>{this.columns[a]=w(o,t,e).array,i=o.length}),this.rowCount=i}S(this,"afterDeleteRows",{rowIndex:t,rowCount:e}),this.versionTag=O()}getColumn(t,e){return this.columns[t]}getColumns(t,e){return(t||Object.keys(this.columns)).reduce((t,e)=>(t[e]=this.columns[e],t),{})}getRow(t,e){return(e||Object.keys(this.columns)).map(e=>this.columns[e]?.[t])}setColumn(t,e=[],i=0,o){this.setColumns({[t]:e},i,o)}setColumns(t,e,i){let o=this.rowCount;k(t,(t,e)=>{this.columns[e]=t.slice(),o=t.length}),this.applyRowCount(o),i?.silent||(S(this,"afterSetColumns"),this.versionTag=O())}setRow(t,e=this.rowCount,i,o){let{columns:a}=this,n=i?this.rowCount+1:e+1;k(t,(t,r)=>{let s=a[r]||o?.addColumns!==!1&&Array(n);s&&(i?s=w(s,e,0,!0,[t]).array:s[e]=t,a[r]=s)}),n>this.rowCount&&this.applyRowCount(n),o?.silent||(S(this,"afterSetRows"),this.versionTag=O())}},{addEvent:F,getMagnitude:W,normalizeTickInterval:E,timeUnits:H}=s();!function(t){function e(){return this.chart.time.getTimeTicks.apply(this.chart.time,arguments)}function i(){if("datetime"!==this.type){this.dateTime=void 0;return}this.dateTime||(this.dateTime=new o(this))}t.compose=function(t){return t.keepProps.includes("dateTime")||(t.keepProps.push("dateTime"),t.prototype.getTimeTicks=e,F(t,"afterSetType",i)),t};class o{constructor(t){this.axis=t}normalizeTimeTickInterval(t,e){let i=e||[["millisecond",[1,2,5,10,20,25,50,100,200,500]],["second",[1,2,5,10,15,30]],["minute",[1,2,5,10,15,30]],["hour",[1,2,3,4,6,8,12]],["day",[1,2]],["week",[1,2]],["month",[1,2,3,4,6]],["year",null]],o=i[i.length-1],a=H[o[0]],n=o[1],r;for(r=0;r<i.length&&(a=H[(o=i[r])[0]],n=o[1],!i[r+1]||!(t<=(a*n[n.length-1]+H[i[r+1][0]])/2));r++);a===H.year&&t<5*a&&(n=[1,2,5]);let s=E(t/a,n,"year"===o[0]?Math.max(W(t/a),1):1);return{unitRange:a,count:s,unitName:o[0]}}getXDateFormat(t,e){let{axis:i}=this,o=i.chart.time;return i.closestPointRange?o.getDateFormat(i.closestPointRange,t,i.options.startOfWeek,e)||o.resolveDTLFormat(e.year).main:o.resolveDTLFormat(e.day).main}}t.Additions=o}(a||(a={}));let N=a,I=e.default.SeriesRegistry,{series:{prototype:L}}=n.n(I)(),{addEvent:Y,defined:j,error:z,extend:X,isNumber:q,merge:B,pick:_,splat:J}=s(),K=L.generatePoints;function Q(t){var e,i,o;let a,n,r=this.chart,s=this.options.dataGrouping,l=!1!==this.allowDG&&s&&_(s.enabled,r.options.isStock),u=this.reserveSpace(),h=this.currentDataGrouping,p,d,c=!1;l&&!this.requireSorting&&(this.requireSorting=c=!0);let g=!1==(e=this,i=t,!(e.isCartesian&&!e.isDirty&&!e.xAxis.isDirty&&!e.yAxis.isDirty&&!i))||!l;if(c&&(this.requireSorting=!1),g)return;this.destroyGroupedData();let m=s.groupAll?this.dataTable:this.dataTable.modified||this.dataTable,f=this.getColumn("x",!s.groupAll),x=r.plotSizeX,G=this.xAxis,M=G.getExtremes(),b=G.options.ordinal,v=this.groupPixelWidth;if(v&&f&&m.rowCount&&x&&q(M.min)){n=!0,this.isDirty=!0,this.points=null;let t=M.min,e=M.max,i=b&&G.ordinal&&G.ordinal.getGroupIntervalFactor(t,e,this)||1,l=v*(e-t)/x*i,h=G.getTimeTicks(N.Additions.prototype.normalizeTimeTickInterval(l,s.units||y.units),Math.min(t,f[0]),Math.max(e,f[f.length-1]),G.options.startOfWeek,f,this.closestPointRange),c=L.groupData.apply(this,[m,h,s.approximation]),g=c.modified,A=g.getColumn("x",!0),T=0;for(s?.smoothed&&g.rowCount&&(s.firstAnchor="firstPoint",s.anchor="middle",s.lastAnchor="lastPoint",z(32,!1,r,{"dataGrouping.smoothed":"use dataGrouping.anchor"})),a=1;a<h.length;a++)h.info.segmentStarts&&-1!==h.info.segmentStarts.indexOf(a)||(T=Math.max(h[a]-h[a-1],T));(p=h.info).gapSize=T,this.closestPointRange=h.info.totalRange,this.groupMap=c.groupMap,this.currentDataGrouping=p,function(t,e,i){let o=t.options.dataGrouping,a=t.currentDataGrouping&&t.currentDataGrouping.gapSize,n=t.getColumn("x");if(!(o&&n.length&&a&&t.groupMap))return;let r=e.length-1,s=o.anchor,l=o.firstAnchor,u=o.lastAnchor,h=e.length-1,p=0;if(l&&n[0]>=e[0]){let i;p++;let o=t.groupMap[0].start,r=t.groupMap[0].length;q(o)&&q(r)&&(i=o+(r-1)),e[0]=({start:e[0],middle:e[0]+.5*a,end:e[0]+a,firstPoint:n[0],lastPoint:i&&n[i]})[l]}if(r>0&&u&&a&&e[r]>=i-a){h--;let i=t.groupMap[t.groupMap.length-1].start;e[r]=({start:e[r],middle:e[r]+.5*a,end:e[r]+a,firstPoint:i&&n[i],lastPoint:n[n.length-1]})[u]}if(s&&"start"!==s){let t=a*({middle:.5,end:1})[s];for(;h>=p;)e[h]+=t,h--}}(this,A||[],e),u&&A&&(j((o=A)[0])&&q(G.min)&&q(G.dataMin)&&o[0]<G.min&&((!j(G.options.min)&&G.min<=G.dataMin||G.min===G.dataMin)&&(G.min=Math.min(o[0],G.min)),G.dataMin=Math.min(o[0],G.dataMin)),j(o[o.length-1])&&q(G.max)&&q(G.dataMax)&&o[o.length-1]>G.max&&((!j(G.options.max)&&q(G.dataMax)&&G.max>=G.dataMax||G.max===G.dataMax)&&(G.max=Math.max(o[o.length-1],G.max)),G.dataMax=Math.max(o[o.length-1],G.dataMax))),s.groupAll&&(this.allGroupedTable=g,A=(g=(d=this.cropData(g,G.min||0,G.max||0)).modified).getColumn("x"),this.cropStart=d.start),this.dataTable.modified=g}else this.groupMap=void 0,this.currentDataGrouping=void 0;this.hasGroupedData=n,this.preventGraphAnimation=(h&&h.totalRange)!==(p&&p.totalRange)}function U(){this.groupedData&&(this.groupedData.forEach(function(t,e){t&&(this.groupedData[e]=t.destroy?t.destroy():null)},this),this.groupedData.length=0,delete this.allGroupedTable)}function V(){K.apply(this),this.destroyGroupedData(),this.groupedData=this.hasGroupedData?this.points:null}function Z(){return this.is("arearange")?"range":this.is("ohlc")?"ohlc":this.is("hlc")?"hlc":this.is("column")||this.options.cumulative?"sum":"average"}function $(t,e,i){let o=t.getColumn("x",!0)||[],a=t.getColumn("y",!0),n=this,r=n.data,s=n.options&&n.options.data,u=[],h=new R,p=[],d=t.rowCount,c=!!a,g=[],m=n.pointArrayMap,f=m&&m.length,y=["x"].concat(m||["y"]),x=(m||["y"]).map(()=>[]),G=this.options.dataGrouping&&this.options.dataGrouping.groupAll,M,b,v,A=0,T=0,D="function"==typeof i?i:i&&l[i]?l[i]:l[n.getDGApproximation&&n.getDGApproximation()||"average"];if(f){let t=m.length;for(;t--;)g.push([])}else g.push([]);let C=f||1;for(let t=0;t<=d;t++)if(!(o[t]<e[0])){for(;void 0!==e[A+1]&&o[t]>=e[A+1]||t===d;){if(M=e[A],n.dataGroupInfo={start:G?T:n.cropStart+T,length:g[0].length,groupStart:M},v=D.apply(n,g),n.pointClass&&!j(n.dataGroupInfo.options)&&(n.dataGroupInfo.options=B(n.pointClass.prototype.optionsToObject.call({series:n},n.options.data[n.cropStart+T])),y.forEach(function(t){delete n.dataGroupInfo.options[t]})),void 0!==v){u.push(M);let t=J(v);for(let e=0;e<t.length;e++)x[e].push(t[e]);p.push(n.dataGroupInfo)}T=t;for(let t=0;t<C;t++)g[t].length=0,g[t].hasNulls=!1;if(A+=1,t===d)break}if(t===d)break;if(m){let e,i=G?t:n.cropStart+t,o=r&&r[i]||n.pointClass.prototype.applyOptions.apply({series:n},[s[i]]);for(let t=0;t<f;t++)q(e=o[m[t]])?g[t].push(e):null===e&&(g[t].hasNulls=!0)}else q(b=c?a[t]:null)?g[0].push(b):null===b&&(g[0].hasNulls=!0)}let P={x:u};return(m||["y"]).forEach((t,e)=>{P[t]=x[e]}),h.setColumns(P),{groupMap:p,modified:h}}function tt(t){let e=t.options,i=this.type,o=this.chart.options.plotOptions,a=this.useCommonDataGrouping&&y.common,n=y.seriesSpecific,r=s().defaultOptions.plotOptions[i].dataGrouping;if(o&&(n[i]||a)){let t=this.chart.rangeSelector;r||(r=B(y.common,n[i])),e.dataGrouping=B(a,r,o.series&&o.series.dataGrouping,o[i].dataGrouping,this.userOptions.dataGrouping,!e.isInternal&&t&&q(t.selected)&&t.buttonOptions[t.selected].dataGrouping)}}let te=function(t){let e=t.prototype;e.applyGrouping||(Y(t.prototype.pointClass,"update",function(){if(this.dataGroup)return z(24,!1,this.series.chart),!1}),Y(t,"afterSetOptions",tt),Y(t,"destroy",U),X(e,{applyGrouping:Q,destroyGroupedData:U,generatePoints:V,getDGApproximation:Z,groupData:$}))},ti=e.default.Templating,{format:to}=n.n(ti)(),{composed:ta}=s(),{addEvent:tn,extend:tr,isNumber:ts,pick:tl,pushUnique:tu}=s();function th(t){let e=this.chart,i=e.time,o=t.point,a=o.series,n=a.options,r=a.tooltipOptions,s=n.dataGrouping,l=a.xAxis,u=r.xDateFormat||"",h,p,d,c,g,m=r[t.isFooter?"footerFormat":"headerFormat"];if(l&&"datetime"===l.options.type&&s&&ts(o.key)){p=a.currentDataGrouping,d=s.dateTimeLabelFormats||y.common.dateTimeLabelFormats,p?(c=d[p.unitName],1===p.count?u=c[0]:(u=c[1],h=c[2])):!u&&d&&l.dateTime&&(u=l.dateTime.getXDateFormat(o.x,r.dateTimeLabelFormats));let n=tl(a.groupMap?.[o.index].groupStart,o.key),f=n+(p?.totalRange||0)-1;g=i.dateFormat(u,n),h&&(g+=i.dateFormat(h,f)),a.chart.styledMode&&(m=this.styledModeFormat(m)),t.text=to(m,{point:tr(o,{key:g}),series:a},e),t.preventDefault()}}let tp=s();tp.dataGrouping=tp.dataGrouping||{},tp.dataGrouping.approximationDefaults=tp.dataGrouping.approximationDefaults||f,tp.dataGrouping.approximations=tp.dataGrouping.approximations||l,({compose:function(t,e,i){C(t),te(e),i&&tu(ta,"DataGrouping")&&tn(i,"headerFormatter",th)},groupData:$}).compose(tp.Axis,tp.Series,tp.Tooltip);let td=s();export{td as default};