web-mojo 2.1.627 → 2.1.676
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.
- package/dist/admin.cjs.js +1 -1
- package/dist/admin.cjs.js.map +1 -1
- package/dist/admin.es.js +105 -75
- package/dist/admin.es.js.map +1 -1
- package/dist/auth.cjs.js +1 -1
- package/dist/auth.cjs.js.map +1 -1
- package/dist/auth.es.js +3 -3
- package/dist/auth.es.js.map +1 -1
- package/dist/charts.cjs.js +1 -1
- package/dist/charts.cjs.js.map +1 -1
- package/dist/charts.es.js +8 -590
- package/dist/charts.es.js.map +1 -1
- package/dist/chunks/{ChatView-swFqHyZi.js → ChatView-B3p8qSTr.js} +6 -6
- package/dist/chunks/{ChatView-swFqHyZi.js.map → ChatView-B3p8qSTr.js.map} +1 -1
- package/dist/chunks/{ChatView-BjbXRdAB.js → ChatView-BGlI_MSK.js} +2 -2
- package/dist/chunks/{ChatView-BjbXRdAB.js.map → ChatView-BGlI_MSK.js.map} +1 -1
- package/dist/chunks/{ContextMenu-CyfbvpND.js → ContextMenu-Bx0cE5UR.js} +2 -2
- package/dist/chunks/{ContextMenu-CyfbvpND.js.map → ContextMenu-Bx0cE5UR.js.map} +1 -1
- package/dist/chunks/{ContextMenu-DeL1AJ2K.js → ContextMenu-C5T3u9pD.js} +2 -2
- package/dist/chunks/{ContextMenu-DeL1AJ2K.js.map → ContextMenu-C5T3u9pD.js.map} +1 -1
- package/dist/chunks/{DataView-gB9r-zaX.js → DataView-DnmzuwRI.js} +2 -2
- package/dist/chunks/{DataView-gB9r-zaX.js.map → DataView-DnmzuwRI.js.map} +1 -1
- package/dist/chunks/{DataView-jx8l28w_.js → DataView-Qn3t_qcS.js} +2 -2
- package/dist/chunks/{DataView-jx8l28w_.js.map → DataView-Qn3t_qcS.js.map} +1 -1
- package/dist/chunks/{Dialog-Cj0Qxc7O.js → Dialog-CDwoJqc9.js} +5 -5
- package/dist/chunks/{Dialog-Cj0Qxc7O.js.map → Dialog-CDwoJqc9.js.map} +1 -1
- package/dist/chunks/{Dialog-JhRBUdiM.js → Dialog-DMXaIubd.js} +2 -2
- package/dist/chunks/{Dialog-JhRBUdiM.js.map → Dialog-DMXaIubd.js.map} +1 -1
- package/dist/chunks/{FormView-bFKcq_xg.js → FormView-66LGmBqh.js} +2 -2
- package/dist/chunks/{FormView-bFKcq_xg.js.map → FormView-66LGmBqh.js.map} +1 -1
- package/dist/chunks/{FormView-CpChFpxv.js → FormView-DP6RZ-L7.js} +2 -2
- package/dist/chunks/{FormView-CpChFpxv.js.map → FormView-DP6RZ-L7.js.map} +1 -1
- package/dist/chunks/{MetricsChart-DS6rz7HC.js → MetricsMiniChartWidget-CzqKovoB.js} +777 -4
- package/dist/chunks/MetricsMiniChartWidget-CzqKovoB.js.map +1 -0
- package/dist/chunks/{MetricsChart-Dv49hXjf.js → MetricsMiniChartWidget-hthLm2UU.js} +2 -2
- package/dist/chunks/MetricsMiniChartWidget-hthLm2UU.js.map +1 -0
- package/dist/chunks/{PDFViewer-DnsHONcG.js → PDFViewer-B1mYS5sx.js} +2 -2
- package/dist/chunks/{PDFViewer-DnsHONcG.js.map → PDFViewer-B1mYS5sx.js.map} +1 -1
- package/dist/chunks/{PDFViewer-CcHiuM7c.js → PDFViewer-DcCMCAcj.js} +3 -3
- package/dist/chunks/{PDFViewer-CcHiuM7c.js.map → PDFViewer-DcCMCAcj.js.map} +1 -1
- package/dist/chunks/{Page-DmOy8qUF.js → Page-CTj8NKBW.js} +2 -2
- package/dist/chunks/{Page-DmOy8qUF.js.map → Page-CTj8NKBW.js.map} +1 -1
- package/dist/chunks/{Page-DdYMaASr.js → Page-CayRLia1.js} +2 -2
- package/dist/chunks/{Page-DdYMaASr.js.map → Page-CayRLia1.js.map} +1 -1
- package/dist/chunks/{TopNav-Bat8EzdF.js → TopNav-CKO0_lBo.js} +5 -5
- package/dist/chunks/{TopNav-Bat8EzdF.js.map → TopNav-CKO0_lBo.js.map} +1 -1
- package/dist/chunks/{TopNav-CN_2e_48.js → TopNav-DMkIwiOK.js} +2 -2
- package/dist/chunks/{TopNav-CN_2e_48.js.map → TopNav-DMkIwiOK.js.map} +1 -1
- package/dist/chunks/{WebApp-DpGABopL.js → WebApp-BEjXQJb8.js} +2 -2
- package/dist/chunks/{WebApp-DpGABopL.js.map → WebApp-BEjXQJb8.js.map} +1 -1
- package/dist/chunks/{WebApp-DeoEYrl6.js → WebApp-nRyeYQ0g.js} +14 -13
- package/dist/chunks/{WebApp-DeoEYrl6.js.map → WebApp-nRyeYQ0g.js.map} +1 -1
- package/dist/docit.cjs.js +1 -1
- package/dist/docit.es.js +5 -5
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +11 -11
- package/dist/lightbox.cjs.js +1 -1
- package/dist/lightbox.es.js +4 -4
- package/package.json +1 -1
- package/dist/chunks/MetricsChart-DS6rz7HC.js.map +0 -1
- package/dist/chunks/MetricsChart-Dv49hXjf.js.map +0 -1
package/dist/charts.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./chunks/MetricsChart-Dv49hXjf.js"),e=require("./chunks/WebApp-DpGABopL.js");class MiniChart extends e.View{constructor(t={}){super({className:"mini-chart",...t}),this.chartType=t.chartType||"line",this.data=t.data||[],this.width=t.width||"100%",this.height=t.height||30,this.maintainAspectRatio=t.maintainAspectRatio||!1,this.color=t.color||"rgba(54, 162, 235, 1)",this.fillColor=t.fillColor||"rgba(54, 162, 235, 0.1)",this.strokeWidth=t.strokeWidth||2,this.barGap=t.barGap||2,this.fill=!1!==t.fill,this.smoothing=t.smoothing||.3,this.padding=t.padding||2,this.minValue=t.minValue,this.maxValue=t.maxValue,this.showDots=t.showDots||!1,this.dotRadius=t.dotRadius||2,this.animate=!1!==t.animate,this.animationDuration=t.animationDuration||300,this.showTooltip=!1!==t.showTooltip,this.tooltipFormatter=t.tooltipFormatter||null,this.tooltipTemplate=t.tooltipTemplate||null,this.valueFormat=t.valueFormat||null,this.labelFormat=t.labelFormat||null,this.showCrosshair=!1!==t.showCrosshair,this.crosshairColor=t.crosshairColor||"rgba(0, 0, 0, 0.2)",this.crosshairWidth=t.crosshairWidth||1,this.showXAxis=t.showXAxis||!1,this.xAxisColor=t.xAxisColor||this.color,this.xAxisWidth=t.xAxisWidth||1,this.xAxisDashed=!1!==t.xAxisDashed,this.tooltip=null,this.crosshair=null,this.hoveredIndex=-1,this.dataFormatter=e.dataFormatter,this.labels=t.labels||null}getTemplate(){const t="number"==typeof this.width?`${this.width}px`:this.width,e="number"==typeof this.height?`${this.height}px`:this.height,i=this.maintainAspectRatio?"xMidYMid meet":"none";return`\n <div class="mini-chart-wrapper" style="position: relative; display: block; width: ${t}; height: ${e};">\n <svg\n class="mini-chart-svg"\n width="100%"\n height="100%"\n viewBox="0 0 100 ${this.height}"\n preserveAspectRatio="${i}"\n style="display: block;">\n </svg>\n ${this.showTooltip?'<div class="mini-chart-tooltip" style="display: none;"></div>':""}\n </div>\n `}async onAfterRender(){this.svg=this.element.querySelector(".mini-chart-svg"),this.tooltip=this.element.querySelector(".mini-chart-tooltip"),this.updateDimensions(),this.data&&this.data.length>0&&this.renderChart(),this.showTooltip&&this.svg&&this.setupTooltip(),this.setupResizeObserver()}updateDimensions(){if(!this.svg)return;const t=this.svg.getBoundingClientRect();this.actualWidth=t.width||100,this.actualHeight=t.height||this.height,this.svg.setAttribute("viewBox",`0 0 ${this.actualWidth} ${this.actualHeight}`)}setupResizeObserver(){"undefined"!=typeof ResizeObserver&&(this.resizeObserver=new ResizeObserver(()=>{this.updateDimensions(),this.data&&this.data.length>0&&this.renderChart()}),this.svg&&this.resizeObserver.observe(this.svg))}renderChart(){if(!this.svg||!this.data||0===this.data.length)return;this.svg.innerHTML="";const{min:t,max:e}=this.calculateBounds();if(this.showXAxis&&this.renderXAxis(t,e),"line"===this.chartType?this.renderLine(t,e):"bar"===this.chartType&&this.renderBar(t,e),this.showCrosshair){const t=this.getActualHeight();this.crosshair=this.createSVGElement("line",{x1:0,y1:0,x2:0,y2:t,stroke:this.crosshairColor,"stroke-width":this.crosshairWidth,"stroke-dasharray":"3,3",style:"display: none; pointer-events: none;"}),this.svg.appendChild(this.crosshair)}this.showTooltip&&this.tooltip&&this.setupTooltip(),this.animate&&this.applyAnimation()}renderXAxis(t,e){const i=this.getActualWidth(),s=this.getActualHeight();let a;if(t<=0&&e>=0){const i=e-t,h=(s-2*this.padding)/i;a=s-this.padding-(0-t)*h}else a=s-this.padding;const h=this.createSVGElement("line",{x1:this.padding,y1:a,x2:i-this.padding,y2:a,stroke:this.xAxisColor,"stroke-width":this.xAxisWidth,"stroke-dasharray":this.xAxisDashed?"2,2":"none","stroke-opacity":"0.5"});this.svg.appendChild(h)}calculateBounds(){const t=this.data.map(t=>"object"==typeof t?t.value:t);let e=void 0!==this.minValue?this.minValue:Math.min(...t),i=void 0!==this.maxValue?this.maxValue:Math.max(...t);return 0===i-e&&(e-=1,i+=1),{min:e,max:i}}getActualWidth(){return this.actualWidth||this.width||100}getActualHeight(){return this.actualHeight||this.height||30}renderLine(t,e){const i=this.data.map(t=>"object"==typeof t?t.value:t),s=this.calculatePoints(i,t,e);if(this.fill){const t=this.createAreaPath(s),e=this.createSVGElement("path",{d:t,fill:this.fillColor,stroke:"none"});this.svg.appendChild(e)}const a=this.smoothing>0?this.createSmoothPath(s):this.createLinePath(s),h=this.createSVGElement("path",{d:a,fill:"none",stroke:this.color,"stroke-width":this.strokeWidth,"stroke-linecap":"round","stroke-linejoin":"round"});this.svg.appendChild(h),this.showDots&&s.forEach(t=>{const e=this.createSVGElement("circle",{cx:t.x,cy:t.y,r:this.dotRadius,fill:this.color});this.svg.appendChild(e)})}renderBar(t,e){const i=this.data.map(t=>"object"==typeof t?t.value:t),s=this.calculatePoints(i,t,e),a=this.getActualWidth(),h=this.getActualHeight(),r=(a-2*this.padding-this.barGap*(i.length-1))/i.length;s.forEach((t,e)=>{const i=h-2*this.padding-t.y+this.padding,s=t.x-r/2,a=t.y,o=this.createSVGElement("rect",{x:s,y:a,width:r,height:i,fill:this.color,rx:1,"data-bar-index":e,class:"mini-chart-bar"});this.svg.appendChild(o)})}calculatePoints(t,e,i){const s=i-e,a=this.getActualWidth(),h=this.getActualHeight(),r=(a-2*this.padding)/(t.length-1||1),o=(h-2*this.padding)/s;return t.map((t,i)=>({x:this.padding+i*r,y:h-this.padding-(t-e)*o}))}createLinePath(t){if(0===t.length)return"";let e=`M ${t[0].x},${t[0].y}`;for(let i=1;i<t.length;i++)e+=` L ${t[i].x},${t[i].y}`;return e}createSmoothPath(t){if(t.length<2)return this.createLinePath(t);let e=`M ${t[0].x},${t[0].y}`;for(let i=0;i<t.length-1;i++){const s=t[i],a=t[i+1];e+=` C ${s.x+(a.x-s.x)*this.smoothing},${s.y} ${a.x-(a.x-s.x)*this.smoothing},${a.y} ${a.x},${a.y}`}return e}createAreaPath(t){if(0===t.length)return"";const e=this.smoothing>0?this.createSmoothPath(t):this.createLinePath(t),i=t[t.length-1],s=t[0],a=this.getActualHeight();return`${e} L ${i.x},${a-this.padding} L ${s.x},${a-this.padding} Z`}createSVGElement(t,e={}){const i=document.createElementNS("http://www.w3.org/2000/svg",t);return Object.entries(e).forEach(([t,e])=>{i.setAttribute(t,e)}),i}applyAnimation(){this.svg.querySelectorAll("path").forEach(t=>{const e=t.getTotalLength();t.style.strokeDasharray=e,t.style.strokeDashoffset=e,t.style.animation=`mini-chart-draw ${this.animationDuration}ms ease-out forwards`}),this.svg.querySelectorAll("rect").forEach((t,e)=>{t.style.transformOrigin="bottom",t.style.animation=`mini-chart-bar-grow ${this.animationDuration}ms ease-out ${20*e}ms forwards`,t.style.transform="scaleY(0)"})}setupTooltip(){if(!this.svg||!this.tooltip)return;const t=this.data.map(t=>"object"==typeof t?t.value:t),e=this.calculatePoints(t,...Object.values(this.calculateBounds())),i=this.getActualWidth(),s=this.getActualHeight(),a=i/t.length;e.forEach((t,e)=>{const i=this.createSVGElement("rect",{x:e*a,y:0,width:a,height:s,fill:"transparent",style:"cursor: pointer;"});i.addEventListener("mouseenter",t=>{this.showTooltipAtIndex(e,t)}),i.addEventListener("mousemove",t=>{this.updateTooltipPosition(t)}),i.addEventListener("mouseleave",()=>{this.hideTooltip()}),this.svg.appendChild(i)})}showTooltipAtIndex(t,e){if(!this.tooltip)return;this.hoveredIndex=t;const i="object"==typeof this.data[t]?this.data[t].value:this.data[t],s="object"==typeof this.data[t]?this.data[t].label:null,a=this.labels?this.labels[t]:s;let h;if(this.tooltipTemplate&&"function"==typeof this.tooltipTemplate)h=this.tooltipTemplate({value:i,label:a,index:t,data:this.data[t]});else{let e=i;e=this.valueFormat&&this.dataFormatter?this.dataFormatter.pipe(i,this.valueFormat):this.tooltipFormatter&&"function"==typeof this.tooltipFormatter?this.tooltipFormatter(i,t):"number"==typeof i?i.toLocaleString():i;let s=a;a&&this.labelFormat&&this.dataFormatter&&(s=this.dataFormatter.pipe(a,this.labelFormat)),h=`<strong>${e}</strong>`,s&&(h=`<div class="mini-chart-tooltip-label">${s}</div>${h}`)}if(this.tooltip.innerHTML=h,this.tooltip.style.display="block",this.updateTooltipPosition(e),"bar"===this.chartType&&this.highlightBar(t),this.crosshair&&this.showCrosshair){const e=this.getActualWidth()/this.data.length,i=t*e+e/2;this.crosshair.setAttribute("x1",i),this.crosshair.setAttribute("x2",i),this.crosshair.style.display="block"}}updateTooltipPosition(t){if(!this.tooltip||"none"===this.tooltip.style.display)return;const e=this.svg.getBoundingClientRect(),i=t.clientX-e.left,s=t.clientY-e.top;this.tooltip.style.left=`${i}px`,this.tooltip.style.top=s-10+"px",this.tooltip.style.transform="translate(-50%, -100%)"}hideTooltip(){this.tooltip&&(this.tooltip.style.display="none",this.hoveredIndex=-1),"bar"===this.chartType&&this.unhighlightBars(),this.crosshair&&(this.crosshair.style.display="none")}highlightBar(t){if(!this.svg)return;this.unhighlightBars();const e=this.svg.querySelector(`rect.mini-chart-bar[data-bar-index="${t}"]`);e&&(e.style.opacity="0.7")}unhighlightBars(){this.svg&&this.svg.querySelectorAll("rect.mini-chart-bar").forEach(t=>{t.style.opacity="1"})}setData(t){this.data=t,this.svg&&this.renderChart()}setColor(t){this.color=t,this.svg&&this.renderChart()}setType(t){["line","bar"].includes(t)&&(this.chartType=t,this.svg&&this.renderChart())}resize(t,e){this.width=t,this.height=e,this.updateDimensions(),this.svg&&this.renderChart()}async onBeforeDestroy(){this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),await super.onBeforeDestroy()}}exports.BaseChart=t.BaseChart,exports.MetricsChart=t.MetricsChart,exports.PieChart=t.PieChart,exports.SeriesChart=t.SeriesChart,exports.BUILD_TIME=e.BUILD_TIME,exports.VERSION=e.VERSION,exports.VERSION_INFO=e.VERSION_INFO,exports.VERSION_MAJOR=e.VERSION_MAJOR,exports.VERSION_MINOR=e.VERSION_MINOR,exports.VERSION_REVISION=e.VERSION_REVISION,exports.WebApp=e.WebApp,exports.MetricsMiniChart=class extends MiniChart{constructor(t={}){super(t),this.endpoint=t.endpoint||"/api/metrics/fetch",this.account=t.account||"global",this.granularity=t.granularity||"hours",this.slugs=t.slugs||null,this.category=t.category||null,this.dateStart=t.dateStart||null,this.dateEnd=t.dateEnd||null,this.defaultDateRange=t.defaultDateRange||"24h",this.isLoading=!1,this.lastFetch=null,this.refreshInterval=t.refreshInterval,this.dateStart&&this.dateEnd||this.setQuickRange(this.defaultDateRange),this.slugs&&!Array.isArray(this.slugs)&&(this.slugs=[this.slugs])}async onAfterRender(){await super.onAfterRender(),!this.endpoint||this.data&&0!==this.data.length||await this.fetchData(),this.refreshInterval&&this.endpoint&&this.startAutoRefresh()}buildApiParams(){const t={granularity:this.granularity,account:this.account,with_labels:!0};return this.slugs&&this.slugs.length>0&&this.slugs.forEach(e=>{t["slugs[]"]||(t["slugs[]"]=[]),t["slugs[]"].push(e)}),this.category&&(t.category=this.category),this.dateStart&&(t.dr_start=Math.floor(this.dateStart.getTime()/1e3)),this.dateEnd&&(t.dr_end=Math.floor(this.dateEnd.getTime()/1e3)),t._=Date.now(),t}async fetchData(){if(this.endpoint){this.isLoading=!0;try{const t=this.getApp()?.rest;if(!t)throw new Error("No REST client available");const e=this.buildApiParams(),i=await t.GET(this.endpoint,e);if(!i.success)throw new Error(i.message||"Network error");if(!i.data?.status)throw new Error(i.data?.error||"Server error");const s=i.data.data;this.processMetricsData(s),this.lastFetch=/* @__PURE__ */new Date,await this.render(),this.emit("metrics:loaded",{chart:this,data:s,params:e})}catch(t){console.error("Failed to fetch metrics:",t),this.emit("metrics:error",{chart:this,error:t})}finally{this.isLoading=!1}}}processMetricsData(t){const{data:e,labels:i}=t;if(!e)return;const s=Object.keys(e);if(0===s.length)return;const a=e[s[0]].map(t=>null==t||""===t?0:"number"==typeof t?t:parseFloat(t)||0);this.labels=i||null,this.setData(a)}setQuickRange(t){const e=/* @__PURE__ */new Date;let i;switch(t){case"1h":i=new Date(e.getTime()-36e5);break;case"24h":default:i=new Date(e.getTime()-864e5);break;case"7d":i=new Date(e.getTime()-6048e5);break;case"30d":i=new Date(e.getTime()-2592e6)}this.dateStart=i,this.dateEnd=e}startAutoRefresh(){this.refreshTimer&&clearInterval(this.refreshTimer),this.refreshTimer=setInterval(()=>{this.fetchData()},this.refreshInterval)}stopAutoRefresh(){this.refreshTimer&&(clearInterval(this.refreshTimer),this.refreshTimer=null)}setGranularity(t){return this.granularity=t,this.fetchData()}setDateRange(t,e){return this.dateStart=new Date(t),this.dateEnd=new Date(e),this.fetchData()}setMetrics(t){return this.slugs=Array.isArray(t)?t:[t],this.fetchData()}refresh(){return this.fetchData()}async onBeforeDestroy(){this.stopAutoRefresh(),await super.onBeforeDestroy()}},exports.MiniChart=MiniChart;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./chunks/MetricsMiniChartWidget-hthLm2UU.js"),r=require("./chunks/WebApp-BEjXQJb8.js");exports.BaseChart=e.BaseChart,exports.MetricsChart=e.MetricsChart,exports.MetricsMiniChart=e.MetricsMiniChart,exports.MetricsMiniChartWidget=e.MetricsMiniChartWidget,exports.MiniChart=e.MiniChart,exports.PieChart=e.PieChart,exports.SeriesChart=e.SeriesChart,exports.BUILD_TIME=r.BUILD_TIME,exports.VERSION=r.VERSION,exports.VERSION_INFO=r.VERSION_INFO,exports.VERSION_MAJOR=r.VERSION_MAJOR,exports.VERSION_MINOR=r.VERSION_MINOR,exports.VERSION_REVISION=r.VERSION_REVISION,exports.WebApp=r.WebApp;
|
|
2
2
|
//# sourceMappingURL=charts.cjs.js.map
|
package/dist/charts.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"charts.cjs.js","sources":["../src/extensions/charts/MiniChart.js","../src/extensions/charts/MetricsMiniChart.js"],"sourcesContent":["/**\n * MiniChart - Lightweight sparkline chart component\n * Renders simple line or bar charts with minimal configuration\n * Uses SVG for crisp rendering at any size\n */\n\nimport View from '@core/View.js';\nimport dataFormatter from '@core/utils/DataFormatter.js';\n\nexport default class MiniChart extends View {\n constructor(options = {}) {\n super({\n className: 'mini-chart',\n ...options\n });\n\n // Chart type: 'line' or 'bar'\n this.chartType = options.chartType || 'line';\n\n // Data\n this.data = options.data || [];\n\n // Dimensions\n this.width = options.width || '100%'; // Support both number and '100%'\n this.height = options.height || 30;\n this.maintainAspectRatio = options.maintainAspectRatio || false;\n\n // Styling\n this.color = options.color || 'rgba(54, 162, 235, 1)'; // Primary blue\n this.fillColor = options.fillColor || 'rgba(54, 162, 235, 0.1)'; // Light fill\n this.strokeWidth = options.strokeWidth || 2;\n this.barGap = options.barGap || 2;\n\n // Fill area under line\n this.fill = options.fill !== false; // Default true\n\n // Curve smoothing (0 = straight lines, 1 = very smooth)\n this.smoothing = options.smoothing || 0.3;\n\n // Padding\n this.padding = options.padding || 2;\n\n // Min/Max values (auto-calculated if not provided)\n this.minValue = options.minValue;\n this.maxValue = options.maxValue;\n\n // Show dots on line chart\n this.showDots = options.showDots || false;\n this.dotRadius = options.dotRadius || 2;\n\n // Animation\n this.animate = options.animate !== false;\n this.animationDuration = options.animationDuration || 300;\n\n // Tooltip\n this.showTooltip = options.showTooltip !== false;\n this.tooltipFormatter = options.tooltipFormatter || null;\n this.tooltipTemplate = options.tooltipTemplate || null; // Function returning HTML\n this.valueFormat = options.valueFormat || null; // DataFormatter string\n this.labelFormat = options.labelFormat || null; // DataFormatter string for labels\n\n // Crosshair\n this.showCrosshair = options.showCrosshair !== false;\n this.crosshairColor = options.crosshairColor || 'rgba(0, 0, 0, 0.2)';\n this.crosshairWidth = options.crosshairWidth || 1;\n\n // X-axis\n this.showXAxis = options.showXAxis || false;\n this.xAxisColor = options.xAxisColor || this.color;\n this.xAxisWidth = options.xAxisWidth || 1;\n this.xAxisDashed = options.xAxisDashed !== false;\n\n // Tooltip state\n this.tooltip = null;\n this.crosshair = null;\n this.hoveredIndex = -1;\n\n // DataFormatter instance\n this.dataFormatter = dataFormatter;\n\n // Labels array (can be set externally or from API)\n this.labels = options.labels || null;\n }\n\n getTemplate() {\n const widthStyle = typeof this.width === 'number' ? `${this.width}px` : this.width;\n const heightStyle = typeof this.height === 'number' ? `${this.height}px` : this.height;\n const preserveAspectRatio = this.maintainAspectRatio ? 'xMidYMid meet' : 'none';\n\n return `\n <div class=\"mini-chart-wrapper\" style=\"position: relative; display: block; width: ${widthStyle}; height: ${heightStyle};\">\n <svg\n class=\"mini-chart-svg\"\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 100 ${this.height}\"\n preserveAspectRatio=\"${preserveAspectRatio}\"\n style=\"display: block;\">\n </svg>\n ${this.showTooltip ? '<div class=\"mini-chart-tooltip\" style=\"display: none;\"></div>' : ''}\n </div>\n `;\n }\n\n async onAfterRender() {\n this.svg = this.element.querySelector('.mini-chart-svg');\n this.tooltip = this.element.querySelector('.mini-chart-tooltip');\n\n // Get actual rendered dimensions\n this.updateDimensions();\n\n if (this.data && this.data.length > 0) {\n this.renderChart();\n }\n\n // Setup hover interactions if tooltip enabled\n if (this.showTooltip && this.svg) {\n this.setupTooltip();\n }\n\n // Setup resize observer for responsive behavior\n this.setupResizeObserver();\n }\n\n updateDimensions() {\n if (!this.svg) return;\n\n const rect = this.svg.getBoundingClientRect();\n this.actualWidth = rect.width || 100;\n this.actualHeight = rect.height || this.height;\n\n // Update viewBox to match aspect ratio\n this.svg.setAttribute('viewBox', `0 0 ${this.actualWidth} ${this.actualHeight}`);\n }\n\n setupResizeObserver() {\n if (typeof ResizeObserver === 'undefined') return;\n\n this.resizeObserver = new ResizeObserver(() => {\n this.updateDimensions();\n if (this.data && this.data.length > 0) {\n this.renderChart();\n }\n });\n\n if (this.svg) {\n this.resizeObserver.observe(this.svg);\n }\n }\n\n renderChart() {\n if (!this.svg || !this.data || this.data.length === 0) return;\n\n // Clear previous content\n this.svg.innerHTML = '';\n\n // Calculate bounds\n const { min, max } = this.calculateBounds();\n\n // Add x-axis line if enabled (render first so it's behind chart)\n if (this.showXAxis) {\n this.renderXAxis(min, max);\n }\n\n if (this.chartType === 'line') {\n this.renderLine(min, max);\n } else if (this.chartType === 'bar') {\n this.renderBar(min, max);\n }\n\n // Add crosshair line (initially hidden)\n if (this.showCrosshair) {\n const height = this.getActualHeight();\n this.crosshair = this.createSVGElement('line', {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: height,\n stroke: this.crosshairColor,\n 'stroke-width': this.crosshairWidth,\n 'stroke-dasharray': '3,3',\n style: 'display: none; pointer-events: none;'\n });\n this.svg.appendChild(this.crosshair);\n }\n\n // Setup tooltip hit areas after rendering chart\n if (this.showTooltip && this.tooltip) {\n this.setupTooltip();\n }\n\n // Apply animation if enabled\n if (this.animate) {\n this.applyAnimation();\n }\n }\n\n renderXAxis(min, max) {\n const width = this.getActualWidth();\n const height = this.getActualHeight();\n\n // Calculate y position for x-axis (at zero if data crosses zero, otherwise at bottom)\n let yPos;\n if (min <= 0 && max >= 0) {\n // Data crosses zero, place axis at zero\n const range = max - min;\n const yScale = (height - this.padding * 2) / range;\n yPos = height - this.padding - ((0 - min) * yScale);\n } else {\n // Place at bottom\n yPos = height - this.padding;\n }\n\n const xAxis = this.createSVGElement('line', {\n x1: this.padding,\n y1: yPos,\n x2: width - this.padding,\n y2: yPos,\n stroke: this.xAxisColor,\n 'stroke-width': this.xAxisWidth,\n 'stroke-dasharray': this.xAxisDashed ? '2,2' : 'none',\n 'stroke-opacity': '0.5'\n });\n\n this.svg.appendChild(xAxis);\n }\n\n calculateBounds() {\n const values = this.data.map(d => typeof d === 'object' ? d.value : d);\n\n let min = this.minValue !== undefined ? this.minValue : Math.min(...values);\n let max = this.maxValue !== undefined ? this.maxValue : Math.max(...values);\n\n // Add padding to range\n const range = max - min;\n if (range === 0) {\n min = min - 1;\n max = max + 1;\n }\n\n return { min, max };\n }\n\n getActualWidth() {\n return this.actualWidth || this.width || 100;\n }\n\n getActualHeight() {\n return this.actualHeight || this.height || 30;\n }\n\n renderLine(min, max) {\n const values = this.data.map(d => typeof d === 'object' ? d.value : d);\n const points = this.calculatePoints(values, min, max);\n\n // Create filled area under line\n if (this.fill) {\n const areaPath = this.createAreaPath(points);\n const area = this.createSVGElement('path', {\n d: areaPath,\n fill: this.fillColor,\n stroke: 'none'\n });\n this.svg.appendChild(area);\n }\n\n // Create line path\n const linePath = this.smoothing > 0\n ? this.createSmoothPath(points)\n : this.createLinePath(points);\n\n const line = this.createSVGElement('path', {\n d: linePath,\n fill: 'none',\n stroke: this.color,\n 'stroke-width': this.strokeWidth,\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round'\n });\n this.svg.appendChild(line);\n\n // Add dots if enabled\n if (this.showDots) {\n points.forEach(point => {\n const dot = this.createSVGElement('circle', {\n cx: point.x,\n cy: point.y,\n r: this.dotRadius,\n fill: this.color\n });\n this.svg.appendChild(dot);\n });\n }\n }\n\n renderBar(min, max) {\n const values = this.data.map(d => typeof d === 'object' ? d.value : d);\n const points = this.calculatePoints(values, min, max);\n\n const width = this.getActualWidth();\n const height = this.getActualHeight();\n const barWidth = (width - this.padding * 2 - (this.barGap * (values.length - 1))) / values.length;\n\n points.forEach((point, index) => {\n const barHeight = height - this.padding * 2 - point.y + this.padding;\n const x = point.x - barWidth / 2;\n const y = point.y;\n\n const bar = this.createSVGElement('rect', {\n x: x,\n y: y,\n width: barWidth,\n height: barHeight,\n fill: this.color,\n rx: 1, // Slight rounding\n 'data-bar-index': index,\n class: 'mini-chart-bar'\n });\n this.svg.appendChild(bar);\n });\n }\n\n calculatePoints(values, min, max) {\n const range = max - min;\n const width = this.getActualWidth();\n const height = this.getActualHeight();\n const xStep = (width - this.padding * 2) / (values.length - 1 || 1);\n const yScale = (height - this.padding * 2) / range;\n\n return values.map((value, index) => ({\n x: this.padding + (index * xStep),\n y: height - this.padding - ((value - min) * yScale)\n }));\n }\n\n createLinePath(points) {\n if (points.length === 0) return '';\n\n let path = `M ${points[0].x},${points[0].y}`;\n for (let i = 1; i < points.length; i++) {\n path += ` L ${points[i].x},${points[i].y}`;\n }\n return path;\n }\n\n createSmoothPath(points) {\n if (points.length < 2) return this.createLinePath(points);\n\n let path = `M ${points[0].x},${points[0].y}`;\n\n for (let i = 0; i < points.length - 1; i++) {\n const current = points[i];\n const next = points[i + 1];\n\n // Calculate control points for cubic bezier curve\n const cp1x = current.x + (next.x - current.x) * this.smoothing;\n const cp1y = current.y;\n const cp2x = next.x - (next.x - current.x) * this.smoothing;\n const cp2y = next.y;\n\n path += ` C ${cp1x},${cp1y} ${cp2x},${cp2y} ${next.x},${next.y}`;\n }\n\n return path;\n }\n\n createAreaPath(points) {\n if (points.length === 0) return '';\n\n const linePath = this.smoothing > 0\n ? this.createSmoothPath(points)\n : this.createLinePath(points);\n\n // Close the path along the bottom\n const lastPoint = points[points.length - 1];\n const firstPoint = points[0];\n const height = this.getActualHeight();\n\n return `${linePath} L ${lastPoint.x},${height - this.padding} L ${firstPoint.x},${height - this.padding} Z`;\n }\n\n createSVGElement(tag, attributes = {}) {\n const element = document.createElementNS('http://www.w3.org/2000/svg', tag);\n Object.entries(attributes).forEach(([key, value]) => {\n element.setAttribute(key, value);\n });\n return element;\n }\n\n applyAnimation() {\n const paths = this.svg.querySelectorAll('path');\n paths.forEach(path => {\n const length = path.getTotalLength();\n path.style.strokeDasharray = length;\n path.style.strokeDashoffset = length;\n path.style.animation = `mini-chart-draw ${this.animationDuration}ms ease-out forwards`;\n });\n\n const bars = this.svg.querySelectorAll('rect');\n bars.forEach((bar, index) => {\n bar.style.transformOrigin = 'bottom';\n bar.style.animation = `mini-chart-bar-grow ${this.animationDuration}ms ease-out ${index * 20}ms forwards`;\n bar.style.transform = 'scaleY(0)';\n });\n }\n\n setupTooltip() {\n if (!this.svg || !this.tooltip) return;\n\n // Create invisible overlay rects for hover detection\n const values = this.data.map(d => typeof d === 'object' ? d.value : d);\n const points = this.calculatePoints(values, ...Object.values(this.calculateBounds()));\n\n const width = this.getActualWidth();\n const height = this.getActualHeight();\n const barWidth = width / values.length;\n\n points.forEach((point, index) => {\n const hitArea = this.createSVGElement('rect', {\n x: index * barWidth,\n y: 0,\n width: barWidth,\n height: height,\n fill: 'transparent',\n style: 'cursor: pointer;'\n });\n\n hitArea.addEventListener('mouseenter', (e) => {\n this.showTooltipAtIndex(index, e);\n });\n\n hitArea.addEventListener('mousemove', (e) => {\n this.updateTooltipPosition(e);\n });\n\n hitArea.addEventListener('mouseleave', () => {\n this.hideTooltip();\n });\n\n this.svg.appendChild(hitArea);\n });\n }\n\n showTooltipAtIndex(index, event) {\n if (!this.tooltip) return;\n\n this.hoveredIndex = index;\n const value = typeof this.data[index] === 'object' ? this.data[index].value : this.data[index];\n const dataLabel = typeof this.data[index] === 'object' ? this.data[index].label : null;\n const label = this.labels ? this.labels[index] : dataLabel;\n\n // Build tooltip content using priority system\n let content;\n\n if (this.tooltipTemplate && typeof this.tooltipTemplate === 'function') {\n // 1. Custom template function (highest priority)\n content = this.tooltipTemplate({ value, label, index, data: this.data[index] });\n } else {\n // 2. Format value with DataFormatter or custom formatter\n let displayValue = value;\n\n if (this.valueFormat && this.dataFormatter) {\n // Use DataFormatter with format string\n displayValue = this.dataFormatter.pipe(value, this.valueFormat);\n } else if (this.tooltipFormatter && typeof this.tooltipFormatter === 'function') {\n // Use custom formatter function\n displayValue = this.tooltipFormatter(value, index);\n } else {\n // Default formatting\n displayValue = typeof value === 'number' ? value.toLocaleString() : value;\n }\n\n // Format label if formatter provided\n let displayLabel = label;\n if (label && this.labelFormat && this.dataFormatter) {\n displayLabel = this.dataFormatter.pipe(label, this.labelFormat);\n }\n\n // Build default tooltip HTML\n content = `<strong>${displayValue}</strong>`;\n if (displayLabel) {\n content = `<div class=\"mini-chart-tooltip-label\">${displayLabel}</div>${content}`;\n }\n }\n\n this.tooltip.innerHTML = content;\n this.tooltip.style.display = 'block';\n this.updateTooltipPosition(event);\n\n // Highlight bar if in bar chart mode\n if (this.chartType === 'bar') {\n this.highlightBar(index);\n }\n\n // Show crosshair at the hovered position\n if (this.crosshair && this.showCrosshair) {\n const width = this.getActualWidth();\n const barWidth = width / this.data.length;\n const x = (index * barWidth) + (barWidth / 2);\n this.crosshair.setAttribute('x1', x);\n this.crosshair.setAttribute('x2', x);\n this.crosshair.style.display = 'block';\n }\n }\n\n updateTooltipPosition(event) {\n if (!this.tooltip || this.tooltip.style.display === 'none') return;\n\n const rect = this.svg.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n\n // Position tooltip above cursor\n this.tooltip.style.left = `${x}px`;\n this.tooltip.style.top = `${y - 10}px`;\n this.tooltip.style.transform = 'translate(-50%, -100%)';\n }\n\n hideTooltip() {\n if (this.tooltip) {\n this.tooltip.style.display = 'none';\n this.hoveredIndex = -1;\n }\n\n // Remove bar highlight\n if (this.chartType === 'bar') {\n this.unhighlightBars();\n }\n\n // Hide crosshair\n if (this.crosshair) {\n this.crosshair.style.display = 'none';\n }\n }\n\n highlightBar(index) {\n if (!this.svg) return;\n\n // Remove previous highlights\n this.unhighlightBars();\n\n // Highlight the hovered bar\n const bar = this.svg.querySelector(`rect.mini-chart-bar[data-bar-index=\"${index}\"]`);\n if (bar) {\n bar.style.opacity = '0.7';\n }\n }\n\n unhighlightBars() {\n if (!this.svg) return;\n\n const bars = this.svg.querySelectorAll('rect.mini-chart-bar');\n bars.forEach(bar => {\n bar.style.opacity = '1';\n });\n }\n\n // Public API\n setData(data) {\n this.data = data;\n if (this.svg) {\n this.renderChart();\n }\n }\n\n setColor(color) {\n this.color = color;\n if (this.svg) {\n this.renderChart();\n }\n }\n\n setType(type) {\n if (['line', 'bar'].includes(type)) {\n this.chartType = type;\n if (this.svg) {\n this.renderChart();\n }\n }\n }\n\n resize(width, height) {\n this.width = width;\n this.height = height;\n this.updateDimensions();\n if (this.svg) {\n this.renderChart();\n }\n }\n\n async onBeforeDestroy() {\n // Clean up resize observer\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n await super.onBeforeDestroy();\n }\n}\n","/**\n * MetricsMiniChart - MiniChart with API integration\n * Extends MiniChart to add /api/metrics/fetch support (same API as MetricsChart)\n */\n\nimport MiniChart from './MiniChart.js';\n\nexport default class MetricsMiniChart extends MiniChart {\n constructor(options = {}) {\n super(options);\n \n // API configuration (matching MetricsChart)\n this.endpoint = options.endpoint || '/api/metrics/fetch';\n this.account = options.account || 'global';\n this.granularity = options.granularity || 'hours';\n this.slugs = options.slugs || null; // Single slug or array of slugs\n this.category = options.category || null;\n this.dateStart = options.dateStart || null;\n this.dateEnd = options.dateEnd || null;\n this.defaultDateRange = options.defaultDateRange || '24h';\n \n // State\n this.isLoading = false;\n this.lastFetch = null;\n this.refreshInterval = options.refreshInterval;\n \n // Initialize date range if missing\n if (!this.dateStart || !this.dateEnd) {\n this.setQuickRange(this.defaultDateRange);\n }\n \n // Normalize slugs to array\n if (this.slugs && !Array.isArray(this.slugs)) {\n this.slugs = [this.slugs];\n }\n }\n\n async onAfterRender() {\n await super.onAfterRender();\n \n // Fetch initial data if endpoint provided and no data\n if (this.endpoint && (!this.data || this.data.length === 0)) {\n await this.fetchData();\n }\n \n // Setup auto-refresh if configured\n if (this.refreshInterval && this.endpoint) {\n this.startAutoRefresh();\n }\n }\n\n buildApiParams() {\n const params = {\n granularity: this.granularity,\n account: this.account,\n with_labels: true\n };\n\n // Add slugs\n if (this.slugs && this.slugs.length > 0) {\n this.slugs.forEach(slug => {\n if (!params['slugs[]']) params['slugs[]'] = [];\n params['slugs[]'].push(slug);\n });\n }\n\n if (this.category) {\n params.category = this.category;\n }\n\n // Date range\n if (this.dateStart) {\n params.dr_start = Math.floor(this.dateStart.getTime() / 1000);\n }\n if (this.dateEnd) {\n params.dr_end = Math.floor(this.dateEnd.getTime() / 1000);\n }\n\n // Cache buster\n params._ = Date.now();\n\n return params;\n }\n\n async fetchData() {\n if (!this.endpoint) return;\n \n this.isLoading = true;\n \n try {\n const rest = this.getApp()?.rest;\n if (!rest) {\n throw new Error('No REST client available');\n }\n \n const params = this.buildApiParams();\n const response = await rest.GET(this.endpoint, params);\n \n // Handle Rest standardized response\n if (!response.success) {\n throw new Error(response.message || 'Network error');\n }\n if (!response.data?.status) {\n throw new Error(response.data?.error || 'Server error');\n }\n \n const metricsData = response.data.data;\n this.processMetricsData(metricsData);\n this.lastFetch = new Date();\n \n // Re-render to show updated values\n await this.render();\n \n this.emit('metrics:loaded', { chart: this, data: metricsData, params });\n \n } catch (error) {\n console.error('Failed to fetch metrics:', error);\n this.emit('metrics:error', { chart: this, error });\n } finally {\n this.isLoading = false;\n }\n }\n\n processMetricsData(metricsData) {\n // Expecting: { labels: [...], data: { metric_slug: [values...] } }\n const { data: metrics, labels } = metricsData;\n \n if (!metrics) return;\n \n // Get the first (or only) metric's data\n const metricKeys = Object.keys(metrics);\n if (metricKeys.length === 0) return;\n \n const metricSlug = metricKeys[0];\n const values = metrics[metricSlug];\n \n // Sanitize values\n const sanitizedValues = values.map(val => {\n if (val === null || val === undefined || val === '') return 0;\n return typeof val === 'number' ? val : (parseFloat(val) || 0);\n });\n \n // Update labels (for tooltips)\n this.labels = labels || null;\n \n // Update chart data\n this.setData(sanitizedValues);\n }\n\n setQuickRange(range) {\n const now = new Date();\n let startDate;\n\n switch (range) {\n case '1h':\n startDate = new Date(now.getTime() - (60 * 60 * 1000));\n break;\n case '24h':\n startDate = new Date(now.getTime() - (24 * 60 * 60 * 1000));\n break;\n case '7d':\n startDate = new Date(now.getTime() - (7 * 24 * 60 * 60 * 1000));\n break;\n case '30d':\n startDate = new Date(now.getTime() - (30 * 24 * 60 * 60 * 1000));\n break;\n default:\n startDate = new Date(now.getTime() - (24 * 60 * 60 * 1000));\n }\n\n this.dateStart = startDate;\n this.dateEnd = now;\n }\n\n startAutoRefresh() {\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n }\n \n this.refreshTimer = setInterval(() => {\n this.fetchData();\n }, this.refreshInterval);\n }\n\n stopAutoRefresh() {\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n // Public API\n setGranularity(granularity) {\n this.granularity = granularity;\n return this.fetchData();\n }\n\n setDateRange(startDate, endDate) {\n this.dateStart = new Date(startDate);\n this.dateEnd = new Date(endDate);\n return this.fetchData();\n }\n\n setMetrics(slugs) {\n this.slugs = Array.isArray(slugs) ? slugs : [slugs];\n return this.fetchData();\n }\n\n refresh() {\n return this.fetchData();\n }\n\n async onBeforeDestroy() {\n this.stopAutoRefresh();\n await super.onBeforeDestroy();\n }\n}\n"],"names":["MiniChart","View","constructor","options","super","className","this","chartType","data","width","height","maintainAspectRatio","color","fillColor","strokeWidth","barGap","fill","smoothing","padding","minValue","maxValue","showDots","dotRadius","animate","animationDuration","showTooltip","tooltipFormatter","tooltipTemplate","valueFormat","labelFormat","showCrosshair","crosshairColor","crosshairWidth","showXAxis","xAxisColor","xAxisWidth","xAxisDashed","tooltip","crosshair","hoveredIndex","dataFormatter","labels","getTemplate","widthStyle","heightStyle","preserveAspectRatio","onAfterRender","svg","element","querySelector","updateDimensions","length","renderChart","setupTooltip","setupResizeObserver","rect","getBoundingClientRect","actualWidth","actualHeight","setAttribute","ResizeObserver","resizeObserver","observe","innerHTML","min","max","calculateBounds","renderXAxis","renderLine","renderBar","getActualHeight","createSVGElement","x1","y1","x2","y2","stroke","style","appendChild","applyAnimation","getActualWidth","yPos","range","yScale","xAxis","values","map","d","value","Math","points","calculatePoints","areaPath","createAreaPath","area","linePath","createSmoothPath","createLinePath","line","forEach","point","dot","cx","x","cy","y","r","barWidth","index","barHeight","bar","rx","class","xStep","path","i","current","next","lastPoint","firstPoint","tag","attributes","document","createElementNS","Object","entries","key","querySelectorAll","getTotalLength","strokeDasharray","strokeDashoffset","animation","transformOrigin","transform","hitArea","addEventListener","e","showTooltipAtIndex","updateTooltipPosition","hideTooltip","event","dataLabel","label","content","displayValue","pipe","toLocaleString","displayLabel","display","highlightBar","clientX","left","clientY","top","unhighlightBars","opacity","setData","setColor","setType","type","includes","resize","onBeforeDestroy","disconnect","endpoint","account","granularity","slugs","category","dateStart","dateEnd","defaultDateRange","isLoading","lastFetch","refreshInterval","setQuickRange","Array","isArray","fetchData","startAutoRefresh","buildApiParams","params","with_labels","slug","push","dr_start","floor","getTime","dr_end","_","Date","now","rest","getApp","Error","response","GET","success","message","status","error","metricsData","processMetricsData","render","emit","chart","console","metrics","metricKeys","keys","sanitizedValues","val","parseFloat","startDate","refreshTimer","clearInterval","setInterval","stopAutoRefresh","setGranularity","setDateRange","endDate","setMetrics","refresh"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"charts.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|