UNPKG

apexcharts

Version:

A JavaScript Chart Library

6 lines (5 loc) 15.3 kB
/*! * ApexCharts v6.6.1 * (c) 2018-2026 ApexCharts */ "use strict";var e=Object.defineProperty,t=Object.defineProperties,r=Object.getOwnPropertyDescriptors,s=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,n=Object.prototype.propertyIsEnumerable,a=(t,r,s)=>r in t?e(t,r,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[r]=s;Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const o=require("apexcharts/core"),l="__apexcharts_crossfilters__";function c(e){if(!Number.isFinite(e))return e;const t=Number(e.toPrecision(12));return Object.is(t,-0)?0:t}function h(e){return"number"==typeof e&&Number.isFinite(e)}function f(e){if("function"==typeof e)return e;if(e&&"object"==typeof e){if("string"==typeof e.sum){const t=e.sum;return e=>e.reduce((e,r)=>e+(Number(r[t])||0),0)}if("string"==typeof e.avg){const t=e.avg;return e=>e.length?e.reduce((e,r)=>e+(Number(r[t])||0),0)/e.length:0}if("string"==typeof e.min){const t=e.min;return e=>e.length?Math.min(...e.map(e=>Number(e[t])||0)):0}if("string"==typeof e.max){const t=e.max;return e=>e.length?Math.max(...e.map(e=>Number(e[t])||0)):0}}return e=>e.length}function u(e,t){return"function"==typeof t?e.slice().sort(t):"asc"===t?e.slice().sort((e,t)=>e>t?1:e<t?-1:0):"desc"===t?e.slice().sort((e,t)=>e<t?1:e>t?-1:0):e}function d(e,t){if(!h(e))return-1;const r=t.length-1;if(e<t[0]||e>t[r])return-1;if(e===t[r])return r-1;for(let s=0;s<r;s++)if(e>=t[s]&&e<t[s+1])return s;return-1}function g(e){const t=[];for(let r=0;r<e.length-1;r++)t.push(c((e[r]+e[r+1])/2));return t}class m{constructor(e,t){this.id=e,this.records=Array.isArray(t)?t:[],this.dims=new Map,this._listeners=new Map}static _store(){const e=globalThis;return e[l]||(e[l]=new Map),e[l]}static getOrCreate(e){if(!e||"string"!=typeof e.id)throw new Error("ApexCharts.crossfilter requires an { id } string.");const t=m._store();let r=t.get(e.id);return r?(e.records&&r.setRecords(e.records),r):(r=new m(e.id,e.records),t.set(e.id,r),r)}static get(e){return m._store().get(e)||null}setRecords(e){return this.records=Array.isArray(e)?e:[],this.dims.forEach(e=>this._recomputeDomain(e)),this._emit("records",this.state()),this._emit("change",this.state()),this}registerDimension(e,t){if(!t||"function"!=typeof t.dimension)throw new Error(`crossfilter.registerDimension("${e}") needs a dimension function.`);const r=t.type||(t.bins?"range":"category"),s={accessor:t.dimension,reducer:f(t.reduce),type:r,bins:t.bins,order:t.order,filter:null,labels:[],edges:null};return this.dims.set(e,s),this._recomputeDomain(s),null!=t.filter&&this._setFilterOn(s,t.filter),this}hasDimension(e){return this.dims.has(e)}removeDimension(e){return this.dims.delete(e),this}_recomputeDomain(e){if("matrix"===e.type){const t=function(e,t,r){const s=new Set,i=new Set,n=[],a=[];for(let r=0;r<e.length;r++){const o=t(e[r]);if(!o)continue;const l=o[0],c=o[1];null==l||s.has(l)||(s.add(l),n.push(l)),null==c||i.has(c)||(i.add(c),a.push(c))}return{xLabels:u(n,r),yLabels:u(a,r)}}(this.records,e.accessor,e.order);return e.xLabels=t.xLabels,e.yLabels=t.yLabels,void(e.edges=null)}if("range"===e.type)e.edges=function(e,t,r){if(r&&Array.isArray(r.thresholds)&&r.thresholds.length>=2){const e=Array.from(new Set(r.thresholds.filter(h))).sort((e,t)=>e-t);return e.length>=2?e.map(c):[0,1]}let s=1/0,i=-1/0;for(let r=0;r<e.length;r++){const n=t(e[r]);h(n)&&(n<s&&(s=n),n>i&&(i=n))}if(s===1/0)return[0,1];if(s===i){const e=Math.abs(s)>0?Math.abs(s):1;return[c(s),c(s+e)]}if(r&&h(r.width)&&r.width>0){const e=r.width,t=Math.floor(s/e)*e;let n=Math.ceil(i/e)*e;n<=t&&(n=t+e);const a=Math.max(1,Math.round((n-t)/e)),o=new Array(a+1);for(let r=0;r<=a;r++)o[r]=c(t+r*e);return o}const n=r&&h(r.count)&&r.count>=1?Math.floor(r.count):30,a=(i-s)/n,o=new Array(n+1);for(let e=0;e<=n;e++)o[e]=c(s+e*a);return o[n]=c(i),o}(this.records,e.accessor,e.bins),e.labels=g(e.edges);else if(e.labels=function(e,t,r){const s=new Set,i=[];for(let r=0;r<e.length;r++){const n=t(e[r]);null!=n&&(s.has(n)||(s.add(n),i.push(n)))}return u(i,r)}(this.records,e.accessor,e.order),e.edges=null,e.filter instanceof Set){const t=new Set(e.labels);Array.from(e.filter).forEach(r=>{t.has(r)||e.filter.delete(r)})}}filter(e,t){const r=this.dims.get(e);return r?(this._setFilterOn(r,t),this._emit("change",this.state()),this):this}toggleKey(e,t){const r=this.dims.get(e);if(!r||"category"!==r.type)return this;r.filter instanceof Set||(r.filter=new Set);const s=r.filter;return s.has(t)?s.delete(t):s.add(t),0===s.size&&(r.filter=null),this._emit("change",this.state()),this}_setFilterOn(e,t){if(null==t)return void(e.filter=null);if("range"===e.type)return void(Array.isArray(t)&&2===t.length&&t.every(h)?e.filter=[Math.min(t[0],t[1]),Math.max(t[0],t[1])]:e.filter=null);const r=(Set,new Set(t));e.filter=r.size?r:null}clear(e){const t=this.dims.get(e);return t&&(t.filter=null),this._emit("change",this.state()),this}reset(){return this.dims.forEach(e=>{e.filter=null}),this._emit("change",this.state()),this}_hasFilter(e){return null!=e.filter&&(!(e.filter instanceof Set)||e.filter.size>0)}_passes(e,t){if(!this._hasFilter(e))return!0;const r=e.accessor(t);return e.filter instanceof Set?e.filter.has(r):!!h(r)&&(r>=e.filter[0]&&r<=e.filter[1])}filteredRecords(e){const t=[];return this.dims.forEach((r,s)=>{s!==e&&this._hasFilter(r)&&t.push(r)}),0===t.length?this.records:this.records.filter(e=>t.every(t=>this._passes(t,e)))}filteredRows(){return this.filteredRecords(null)}aggregateFor(e){const t=this.dims.get(e);if(!t)return{type:"category",labels:[],values:[],keys:[]};const r=this.filteredRecords(e);if("matrix"===t.type){const e=new Map(t.xLabels.map((e,t)=>[e,t])),s=new Map(t.yLabels.map((e,t)=>[e,t])),i=t.yLabels.map(()=>t.xLabels.map(()=>[]));for(let n=0;n<r.length;n++){const a=t.accessor(r[n]);if(!a)continue;const o=e.get(a[0]),l=s.get(a[1]);null!=o&&null!=l&&i[l][o].push(r[n])}return{type:"matrix",xLabels:t.xLabels.slice(),yLabels:t.yLabels.slice(),matrix:i.map(e=>e.map(e=>t.reducer(e)))}}if("range"===t.type){const e=t.edges||[0,1],s=e.length-1,i=Array.from({length:s},()=>[]);for(let s=0;s<r.length;s++){const n=d(t.accessor(r[s]),e);n>=0&&i[n].push(r[s])}return{type:"range",labels:g(e),values:i.map(e=>t.reducer(e)),keys:i.map((t,r)=>[e[r],e[r+1]]),edges:e}}const s=new Map;t.labels.forEach(e=>s.set(e,[]));for(let e=0;e<r.length;e++){const i=t.accessor(r[e]),n=s.get(i);n&&n.push(r[e])}return{type:"category",labels:t.labels.slice(),values:t.labels.map(e=>t.reducer(s.get(e)||[])),keys:t.labels.slice()}}aggregateAll(){const e={};return this.dims.forEach((t,r)=>{e[r]=this.aggregateFor(r)}),e}state(){const e={};return this.dims.forEach((t,r)=>{this._hasFilter(t)&&(e[r]=t.filter instanceof Set?Array.from(t.filter):t.filter.slice())}),{filters:e,filteredCount:this.filteredRows().length,total:this.records.length}}filterOf(e){const t=this.dims.get(e);return t&&this._hasFilter(t)?t.filter instanceof Set?new Set(t.filter):t.filter.slice():null}on(e,t){let r=this._listeners.get(e);return r||(r=new Set,this._listeners.set(e,r)),r.add(t),()=>this.off(e,t)}off(e,t){var r;return null==(r=this._listeners.get(e))||r.delete(t),this}_emit(e,t){var r;null==(r=this._listeners.get(e))||r.forEach(e=>{try{e(t)}catch(e){}})}_esc(e){return String(null==e?"":e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}_resolveColumns(e){if(Array.isArray(e)&&e.length)return e.map(e=>"string"==typeof e?{field:e,label:e}:{field:e.field,label:e.label||e.field,format:e.format});const t=this.records[0];return(t?Object.keys(t):[]).map(e=>({field:e,label:e}))}_tableHTML(e,t,r){const s="<thead><tr>"+e.map(e=>`<th>${this._esc(e.label)}</th>`).join("")+"</tr></thead>",i="<tbody>"+t.map(t=>"<tr>"+e.map(e=>{const r=t[e.field],s=e.format?e.format(r,t):r;return`<td>${this._esc(s)}</td>`}).join("")+"</tr>").join("")+"</tbody>";return`<table class="apexcharts-cf-table">${`<caption>${t.length} of ${r} rows</caption>`}${s}${i}</table>`}dataTable(e,t){if(!e)return{refresh(){},destroy(){}};const r=t||{},s=this._resolveColumns(r.columns),i=r.pageSize||0,n=r.page||0,a=()=>{const t=this.filteredRows(),r=i?t.slice(n*i,n*i+i):t;e.innerHTML=this._tableHTML(s,r,t.length)};a();const o=this.on("change",a);return{refresh:a,destroy:()=>{o(),e.innerHTML=""}}}destroy(){m._store().delete(this.id),this.dims.clear(),this._listeners.clear(),this.records=[]}}const p=[".apexcharts-bar-area",".apexcharts-candlestick-area",".apexcharts-boxPlot-area",".apexcharts-rangebar-area",".apexcharts-marker"].join(", "),_=[".apexcharts-pie-area",".apexcharts-bar-area"].join(", "),y="apexcharts-crossfilter-dimmed",b=["pie","donut","polarArea","radialBar"];o.registerFeatures({linkedViews:class{constructor(e,t){this.w=e,this.ctx=t,this._dimmed=!1,this._wired=!1,this._pending=!1,this._lastValues=null,this._onPointSelect=this._onPointSelect.bind(this),this._afterRender=this._afterRender.bind(this),this._onChange=this._onChange.bind(this),"filter"===this._mode()&&this._initEngine()}_mode(){const e=this.w.config.chart.link;return e&&"function"==typeof e.dimension?"filter":e&&e.enabled?"highlight":"off"}_enabled(){const e=this.w.config.chart.link;return!(!e||!e.enabled)}onSourceSelection(e){var t;const r=this._mode();if("off"===r)return;if(!e||null==e.min||null==e.max)return;let s=Math.min(e.min,e.max),i=Math.max(e.min,e.max);const n=this.w.globals.minX,a=this.w.globals.maxX;if(isFinite(n)&&isFinite(a)&&a>n){const e=1e-6*(a-n);s-n<=e&&(s=n),a-i<=e&&(i=a)}if("filter"===r){const e=this._cf();if(!e)return;return e.filter(this._chartId(),[s,i]),void this._fireFilterChange(e,[s,i])}this._group().forEach(e=>{var t;null==(t=null==e?void 0:e.linkedViews)||t.applyDim(s,i)});const o={xaxis:{min:s,max:i},sourceChartID:this.w.globals.chartID};"function"==typeof this.w.config.chart.events.crossFilter&&this.w.config.chart.events.crossFilter(this.ctx,o),null==(t=this.ctx.events)||t.fireEvent("crossFilter",[this.ctx,o])}_group(){const e="function"==typeof this.ctx.getGroupedCharts?this.ctx.getGroupedCharts():[];return[this.ctx,...e]}applyDim(e,t){if(!this._enabled())return;const r=this.w,s=r.dom.baseEl;if(!s)return;const i=r.config.chart.link.dimOpacity;r.dom.elWrap&&"number"==typeof i&&r.dom.elWrap.style.setProperty("--apx-cf-dim",String(i));const n=r.globals.seriesX||[];s.querySelectorAll(p).forEach(r=>{const s=r.getAttribute("j");if(null===s)return;const i=parseInt(s,10),a=r.getAttribute("index"),o=null===a?0:parseInt(a,10),l=n[o]||n[0];if(!l)return;const c=l[i];null!=c&&r.classList.toggle(y,c<e||c>t)}),this._dimmed=!0}clear(){const e=this.w.dom.baseEl;e&&(e.querySelectorAll("."+y).forEach(e=>e.classList.remove(y)),this._dimmed=!1)}clearGroup(){if("filter"===this._mode()){const e=this._cf();return void(e&&e.reset())}this._group().forEach(e=>{var t;return null==(t=null==e?void 0:e.linkedViews)?void 0:t.clear()})}_chartId(){return this.w.globals.chartID}_cf(){const e=this.w.config.chart.link,t=e&&(e.id||this.w.config.chart.group);return t?m.get(t):null}_isPie(){return-1!==b.indexOf(this.w.config.chart.type)}_isHeatmap(){return"heatmap"===this.w.config.chart.type}_initEngine(){const e=this._cf(),t=this.w.config.chart.link;if(!e){t&&t.id||this.w.config.chart.group;return}const r=this._chartId();e.hasDimension(r)||e.registerDimension(r,{dimension:t.dimension,reduce:t.reduce,type:t.type||(this._isHeatmap()?"matrix":void 0),bins:t.bins,order:t.order}),this._injectSeries(e.aggregateFor(r)),this._wire(e)}_seriesFromAgg(e){if("matrix"===e.type)return e.yLabels.map((t,r)=>({name:String(t),data:e.xLabels.map((t,s)=>({x:String(t),y:e.matrix[r][s]}))}));if(this._isPie())return e.values.slice();const t=this.w.config.chart.link.seriesName||"Count";return"range"===e.type?[{name:t,data:e.labels.map((t,r)=>[t,e.values[r]])}]:[{name:t,data:e.values.slice()}]}_sigOf(e){return JSON.stringify(e.matrix||e.values)}_injectSeries(e){const t=this.w;this._lastValues=this._sigOf(e),t.config.series=this._seriesFromAgg(e),"matrix"!==e.type&&(this._isPie()?t.config.labels=e.labels.map(String):"category"===e.type?(t.config.xaxis||(t.config.xaxis={}),t.config.xaxis.categories=e.labels.map(String)):"range"===e.type&&this._pinRangeDomain(e.edges))}_pinRangeDomain(e){if(!Array.isArray(e)||e.length<2)return;const t=this.w;t.config.xaxis||(t.config.xaxis={}),null==t.config.xaxis.min&&(t.config.xaxis.min=e[0]),null==t.config.xaxis.max&&(t.config.xaxis.max=e[e.length-1])}_wire(e){this._wired||(this._wired=!0,this.ctx.addEventListener("dataPointSelection",this._onPointSelect),this.ctx.addEventListener("mounted",this._afterRender),this.ctx.addEventListener("updated",this._afterRender),e.on("change",this._onChange))}_onPointSelect(e,t,r){if("filter"!==this._mode()||!r||null==r.dataPointIndex)return;const s=this._cf();if(!s)return;const i=this._chartId(),n=s.aggregateFor(i);if("matrix"===n.type)return;const a=n.keys[r.dataPointIndex];null!=a&&(s.toggleKey(i,a),this._fireFilterChange(s,a))}_onChange(){"filter"!==this._mode()||this._pending||(this._pending=!0,Promise.resolve().then(()=>{this._pending=!1,this.w.globals.isDestroyed||this._applyAggregation()}))}_applyAggregation(){if("filter"!==this._mode())return;const e=this._cf();if(!e)return;const t=e.aggregateFor(this._chartId()),r=this._sigOf(t);r!==this._lastValues?(this._lastValues=r,this.ctx.updateSeries(this._seriesFromAgg(t),!0)):this._applySelfDim()}_afterRender(){if("filter"!==this._mode())return;const e=this.w.config.series;e&&0!==e.length?this._applySelfDim():this._reassertSeries()}_reassertSeries(){this._pending||(this._pending=!0,Promise.resolve().then(()=>{if(this._pending=!1,this.w.globals.isDestroyed)return;const e=this._cf();if(!e)return;const t=e.aggregateFor(this._chartId()),r=this._seriesFromAgg(t);r.length&&(this._lastValues=this._sigOf(t),this.ctx.updateSeries(r,!0))}))}_applySelfDim(){const e=this._cf();if(!e)return;const t=this.w,r=t.dom.baseEl;if(!r)return;const s=this._chartId(),i=e.filterOf(s),n=t.config.chart.link.dimOpacity;t.dom.elWrap&&"number"==typeof n&&t.dom.elWrap.style.setProperty("--apx-cf-dim",String(n));const a=i instanceof Set,o=Array.isArray(i),l=e.aggregateFor(s).keys;r.querySelectorAll(_).forEach(e=>{const t=e.getAttribute("j");if(null===t)return;const r=l[parseInt(t,10)];let s=!1;a?s=!i.has(r):o&&Array.isArray(r)&&(s=r[1]<=i[0]||r[0]>=i[1]),e.classList.toggle(y,s)}),this._dimmed=!!i}_fireFilterChange(e,o){var l;const c=(h=((e,t)=>{for(var r in t||(t={}))i.call(t,r)&&a(e,r,t[r]);if(s)for(var r of s(t))n.call(t,r)&&a(e,r,t[r]);return e})({},e.state()),f={sourceChartID:this._chartId(),key:o},t(h,r(f)));var h,f;const u=this.w.config.chart.events;"function"==typeof u.filterChange&&u.filterChange(this.ctx,c),null==(l=this.ctx.events)||l.fireEvent("filterChange",[this.ctx,c])}teardown(){var e,t,r,s,i,n;if(this.clear(),this._wired){null==(t=(e=this.ctx).removeEventListener)||t.call(e,"dataPointSelection",this._onPointSelect),null==(s=(r=this.ctx).removeEventListener)||s.call(r,"mounted",this._afterRender),null==(n=(i=this.ctx).removeEventListener)||n.call(i,"updated",this._afterRender);const a=this._cf();a&&(a.off("change",this._onChange),a.removeDimension(this._chartId())),this._wired=!1}}}});const x=o;x._crossfilterFactory=e=>m.getOrCreate(e),x._crossfilterGet=e=>m.get(e),exports.default=o;