web-mojo 2.1.535 → 2.1.546

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.
Files changed (63) hide show
  1. package/dist/admin.cjs.js +1 -1
  2. package/dist/admin.cjs.js.map +1 -1
  3. package/dist/admin.es.js +12 -12
  4. package/dist/admin.es.js.map +1 -1
  5. package/dist/auth.cjs.js +1 -1
  6. package/dist/auth.cjs.js.map +1 -1
  7. package/dist/auth.es.js +3 -3
  8. package/dist/auth.es.js.map +1 -1
  9. package/dist/charts.cjs.js +1 -1
  10. package/dist/charts.es.js +3 -3
  11. package/dist/chunks/{ChatView-B6_WuQEq.js → ChatView-DFQF253h.js} +12 -13
  12. package/dist/chunks/ChatView-DFQF253h.js.map +1 -0
  13. package/dist/chunks/ChatView-c3w18Nge.js +2 -0
  14. package/dist/chunks/ChatView-c3w18Nge.js.map +1 -0
  15. package/dist/chunks/{ContextMenu-CUFAbhvX.js → ContextMenu-DcZOc9gr.js} +2 -2
  16. package/dist/chunks/{ContextMenu-CUFAbhvX.js.map → ContextMenu-DcZOc9gr.js.map} +1 -1
  17. package/dist/chunks/{ContextMenu-DL21mK-K.js → ContextMenu-RPzLox4y.js} +2 -2
  18. package/dist/chunks/{ContextMenu-DL21mK-K.js.map → ContextMenu-RPzLox4y.js.map} +1 -1
  19. package/dist/chunks/{DataView-pjnkp_s6.js → DataView-CgqR1xyr.js} +2 -2
  20. package/dist/chunks/{DataView-pjnkp_s6.js.map → DataView-CgqR1xyr.js.map} +1 -1
  21. package/dist/chunks/{DataView-ztckztwQ.js → DataView-DoGJlcLG.js} +2 -2
  22. package/dist/chunks/{DataView-ztckztwQ.js.map → DataView-DoGJlcLG.js.map} +1 -1
  23. package/dist/chunks/{Dialog-DZcy_jFe.js → Dialog-CLzvolPa.js} +2 -2
  24. package/dist/chunks/{Dialog-DZcy_jFe.js.map → Dialog-CLzvolPa.js.map} +1 -1
  25. package/dist/chunks/{Dialog-Be3ZkGtt.js → Dialog-DCDnevkt.js} +5 -5
  26. package/dist/chunks/{Dialog-Be3ZkGtt.js.map → Dialog-DCDnevkt.js.map} +1 -1
  27. package/dist/chunks/{FormView-CyHZtouJ.js → FormView-09VtwR2c.js} +2 -2
  28. package/dist/chunks/{FormView-CyHZtouJ.js.map → FormView-09VtwR2c.js.map} +1 -1
  29. package/dist/chunks/{FormView-RJ5niGVY.js → FormView-BEii6BoR.js} +2 -2
  30. package/dist/chunks/{FormView-RJ5niGVY.js.map → FormView-BEii6BoR.js.map} +1 -1
  31. package/dist/chunks/{MetricsChart-HFbmINDC.js → MetricsChart-Wo5sQ68q.js} +3 -3
  32. package/dist/chunks/{MetricsChart-HFbmINDC.js.map → MetricsChart-Wo5sQ68q.js.map} +1 -1
  33. package/dist/chunks/{MetricsChart-DK9a46gB.js → MetricsChart-sFdE3MZj.js} +2 -2
  34. package/dist/chunks/{MetricsChart-DK9a46gB.js.map → MetricsChart-sFdE3MZj.js.map} +1 -1
  35. package/dist/chunks/{PDFViewer-DSL5K-RC.js → PDFViewer-BhFvSVNo.js} +3 -3
  36. package/dist/chunks/{PDFViewer-DSL5K-RC.js.map → PDFViewer-BhFvSVNo.js.map} +1 -1
  37. package/dist/chunks/{PDFViewer-DtTeFEKS.js → PDFViewer-CG_dvmZT.js} +2 -2
  38. package/dist/chunks/{PDFViewer-DtTeFEKS.js.map → PDFViewer-CG_dvmZT.js.map} +1 -1
  39. package/dist/chunks/{Page-D8fANAJX.js → Page-DoGJeSX8.js} +2 -2
  40. package/dist/chunks/{Page-D8fANAJX.js.map → Page-DoGJeSX8.js.map} +1 -1
  41. package/dist/chunks/{Page-fyywOoGg.js → Page-MtaIf93q.js} +2 -2
  42. package/dist/chunks/{Page-fyywOoGg.js.map → Page-MtaIf93q.js.map} +1 -1
  43. package/dist/chunks/{TopNav-BYsRM6BZ.js → TopNav-BdzUfQv_.js} +2 -2
  44. package/dist/chunks/{TopNav-BYsRM6BZ.js.map → TopNav-BdzUfQv_.js.map} +1 -1
  45. package/dist/chunks/{TopNav-DnpYXG9a.js → TopNav-t5ZBQ3WL.js} +2 -2
  46. package/dist/chunks/{TopNav-DnpYXG9a.js.map → TopNav-t5ZBQ3WL.js.map} +1 -1
  47. package/dist/chunks/WebApp-BTgGjF-0.js +2 -0
  48. package/dist/chunks/WebApp-BTgGjF-0.js.map +1 -0
  49. package/dist/chunks/{WebApp-Brh2wRZ3.js → WebApp-C-Hi63fx.js} +59 -18
  50. package/dist/chunks/WebApp-C-Hi63fx.js.map +1 -0
  51. package/dist/docit.cjs.js +1 -1
  52. package/dist/docit.es.js +5 -5
  53. package/dist/index.cjs.js +1 -1
  54. package/dist/index.es.js +11 -11
  55. package/dist/lightbox.cjs.js +1 -1
  56. package/dist/lightbox.es.js +4 -4
  57. package/package.json +1 -1
  58. package/dist/chunks/ChatView-7uXqcmuN.js +0 -2
  59. package/dist/chunks/ChatView-7uXqcmuN.js.map +0 -1
  60. package/dist/chunks/ChatView-B6_WuQEq.js.map +0 -1
  61. package/dist/chunks/WebApp-Brh2wRZ3.js.map +0 -1
  62. package/dist/chunks/WebApp-XHTE27hi.js +0 -2
  63. package/dist/chunks/WebApp-XHTE27hi.js.map +0 -1
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./chunks/MetricsChart-DK9a46gB.js"),e=require("./chunks/WebApp-XHTE27hi.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 t=require("./chunks/MetricsChart-sFdE3MZj.js"),e=require("./chunks/WebApp-BTgGjF-0.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;
2
2
  //# sourceMappingURL=charts.cjs.js.map
package/dist/charts.es.js CHANGED
@@ -1,6 +1,6 @@
1
- import { B, M, P, S } from "./chunks/MetricsChart-HFbmINDC.js";
2
- import { V as View, d as dataFormatter } from "./chunks/WebApp-Brh2wRZ3.js";
3
- import { B as B2, b, a, c, e, f, W } from "./chunks/WebApp-Brh2wRZ3.js";
1
+ import { B, M, P, S } from "./chunks/MetricsChart-Wo5sQ68q.js";
2
+ import { V as View, d as dataFormatter } from "./chunks/WebApp-C-Hi63fx.js";
3
+ import { B as B2, b, a, c, e, f, W } from "./chunks/WebApp-C-Hi63fx.js";
4
4
  class MiniChart extends View {
5
5
  constructor(options = {}) {
6
6
  super({
@@ -1,8 +1,8 @@
1
- import { M as Model, C as Collection, T as ToastService, G as GroupList, d as UserList } from "./ContextMenu-CUFAbhvX.js";
2
- import { r as rest, V as View, d as dataFormatter, M as Mustache } from "./WebApp-Brh2wRZ3.js";
3
- import { P as Page } from "./Page-D8fANAJX.js";
4
- import Dialog from "./Dialog-Be3ZkGtt.js";
5
- import { F as FormView, a as applyFileDropMixin } from "./FormView-CyHZtouJ.js";
1
+ import { M as Model, C as Collection, T as ToastService, G as GroupList, d as UserList } from "./ContextMenu-DcZOc9gr.js";
2
+ import { r as rest, V as View, d as dataFormatter, M as Mustache } from "./WebApp-C-Hi63fx.js";
3
+ import { P as Page } from "./Page-DoGJeSX8.js";
4
+ import Dialog from "./Dialog-DCDnevkt.js";
5
+ import { F as FormView, a as applyFileDropMixin } from "./FormView-09VtwR2c.js";
6
6
  class S3Bucket extends Model {
7
7
  constructor(data = {}) {
8
8
  super(data, {
@@ -3136,6 +3136,7 @@ class TableRow extends ListViewItem {
3136
3136
  super({
3137
3137
  tagName: "tr",
3138
3138
  className: "table-row",
3139
+ enableTooltips: true,
3139
3140
  ...options
3140
3141
  });
3141
3142
  this.columns = options.columns || [];
@@ -3498,8 +3499,8 @@ class TableRow extends ListViewItem {
3498
3499
  const inputType = options.inputType || "text";
3499
3500
  return `
3500
3501
  <div class="d-flex gap-1 align-items-center">
3501
- <input type="${inputType}"
3502
- class="form-control form-control-sm cell-input"
3502
+ <input type="${inputType}"
3503
+ class="form-control form-control-sm cell-input"
3503
3504
  value="${this.escapeHtml(currentValue || "")}"
3504
3505
  placeholder="${placeholder}">
3505
3506
  <button type="button" class="btn btn-sm btn-success cell-save" title="Save">
@@ -3519,7 +3520,7 @@ class TableRow extends ListViewItem {
3519
3520
  const rows = options.rows || 2;
3520
3521
  return `
3521
3522
  <div class="d-flex gap-1">
3522
- <textarea class="form-control form-control-sm cell-input"
3523
+ <textarea class="form-control form-control-sm cell-input"
3523
3524
  rows="${rows}"
3524
3525
  placeholder="${placeholder}">${this.escapeHtml(currentValue || "")}</textarea>
3525
3526
  <div class="d-flex flex-column gap-1">
@@ -5025,13 +5026,11 @@ class TableView extends ListView {
5025
5026
  this.updateBatchActionsPanel();
5026
5027
  }
5027
5028
  /**
5028
- * Override render to set data properties before rendering
5029
+ * Override onBeforeRender to set data properties before rendering
5029
5030
  */
5030
- async render(force, container) {
5031
+ async onBeforeRender() {
5031
5032
  this.searchValue = this.getActiveFilters().search || "";
5032
5033
  this.footerTotals = this.calculateFooterTotals();
5033
- console.log("Setting footerTotals before render:", this.footerTotals);
5034
- return super.render(force, container);
5035
5034
  }
5036
5035
  /**
5037
5036
  * Override onAfterRender to update pagination info
@@ -7177,4 +7176,4 @@ export {
7177
7176
  FileList as y,
7178
7177
  FileForms as z
7179
7178
  };
7180
- //# sourceMappingURL=ChatView-B6_WuQEq.js.map
7179
+ //# sourceMappingURL=ChatView-DFQF253h.js.map