web-mojo 2.1.541 → 2.1.549

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 +11 -11
  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-D8QF3I2d.js → ChatView-DUmQtrvk.js} +20 -18
  12. package/dist/chunks/ChatView-DUmQtrvk.js.map +1 -0
  13. package/dist/chunks/ChatView-S7z1axRn.js +2 -0
  14. package/dist/chunks/ChatView-S7z1axRn.js.map +1 -0
  15. package/dist/chunks/{ContextMenu-BzvHUrN8.js → ContextMenu-BXCBFtAP.js} +2 -2
  16. package/dist/chunks/{ContextMenu-BzvHUrN8.js.map → ContextMenu-BXCBFtAP.js.map} +1 -1
  17. package/dist/chunks/{ContextMenu-BxNAykJd.js → ContextMenu-DhbGpVSL.js} +2 -2
  18. package/dist/chunks/{ContextMenu-BxNAykJd.js.map → ContextMenu-DhbGpVSL.js.map} +1 -1
  19. package/dist/chunks/{DataView-Ckb82Lf6.js → DataView-CbcfRwkD.js} +2 -2
  20. package/dist/chunks/{DataView-Ckb82Lf6.js.map → DataView-CbcfRwkD.js.map} +1 -1
  21. package/dist/chunks/{DataView-DinwdAt8.js → DataView-Ek4BYTEr.js} +2 -2
  22. package/dist/chunks/{DataView-DinwdAt8.js.map → DataView-Ek4BYTEr.js.map} +1 -1
  23. package/dist/chunks/{Dialog-CdjTdWFy.js → Dialog-B4CbgRxK.js} +5 -5
  24. package/dist/chunks/{Dialog-CdjTdWFy.js.map → Dialog-B4CbgRxK.js.map} +1 -1
  25. package/dist/chunks/{Dialog-BqfKgNPl.js → Dialog-sS4tcneL.js} +2 -2
  26. package/dist/chunks/{Dialog-BqfKgNPl.js.map → Dialog-sS4tcneL.js.map} +1 -1
  27. package/dist/chunks/{FormView-CVeqzOfl.js → FormView-BochVM_E.js} +2 -2
  28. package/dist/chunks/{FormView-CVeqzOfl.js.map → FormView-BochVM_E.js.map} +1 -1
  29. package/dist/chunks/{FormView-CO2fMfms.js → FormView-Nh9T4RYF.js} +2 -2
  30. package/dist/chunks/{FormView-CO2fMfms.js.map → FormView-Nh9T4RYF.js.map} +1 -1
  31. package/dist/chunks/{MetricsChart-BiuzBNK_.js → MetricsChart-BnAXZSYf.js} +2 -2
  32. package/dist/chunks/{MetricsChart-BiuzBNK_.js.map → MetricsChart-BnAXZSYf.js.map} +1 -1
  33. package/dist/chunks/{MetricsChart-BtPdRK4u.js → MetricsChart-DMAFQpiZ.js} +3 -3
  34. package/dist/chunks/{MetricsChart-BtPdRK4u.js.map → MetricsChart-DMAFQpiZ.js.map} +1 -1
  35. package/dist/chunks/{PDFViewer-BSS4oiLb.js → PDFViewer-DFGU5qEx.js} +3 -3
  36. package/dist/chunks/{PDFViewer-BSS4oiLb.js.map → PDFViewer-DFGU5qEx.js.map} +1 -1
  37. package/dist/chunks/{PDFViewer-BVP_1_G2.js → PDFViewer-UG4HgNRl.js} +2 -2
  38. package/dist/chunks/{PDFViewer-BVP_1_G2.js.map → PDFViewer-UG4HgNRl.js.map} +1 -1
  39. package/dist/chunks/{Page-C5yf_RnZ.js → Page-3EI2SKd6.js} +2 -2
  40. package/dist/chunks/{Page-C5yf_RnZ.js.map → Page-3EI2SKd6.js.map} +1 -1
  41. package/dist/chunks/{Page-Ck9-JuLX.js → Page-x-paxTWR.js} +2 -2
  42. package/dist/chunks/{Page-Ck9-JuLX.js.map → Page-x-paxTWR.js.map} +1 -1
  43. package/dist/chunks/{TopNav-C4c7gNJt.js → TopNav-BzW5Us7F.js} +2 -2
  44. package/dist/chunks/{TopNav-C4c7gNJt.js.map → TopNav-BzW5Us7F.js.map} +1 -1
  45. package/dist/chunks/{TopNav-BpNbneX8.js → TopNav-cGCRUequ.js} +2 -2
  46. package/dist/chunks/{TopNav-BpNbneX8.js.map → TopNav-cGCRUequ.js.map} +1 -1
  47. package/dist/chunks/WebApp-Co0le5eH.js +2 -0
  48. package/dist/chunks/WebApp-Co0le5eH.js.map +1 -0
  49. package/dist/chunks/{WebApp-DVm8Swji.js → WebApp-gPOds7Ie.js} +29 -18
  50. package/dist/chunks/WebApp-gPOds7Ie.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-CS5v3Ngm.js +0 -2
  59. package/dist/chunks/ChatView-CS5v3Ngm.js.map +0 -1
  60. package/dist/chunks/ChatView-D8QF3I2d.js.map +0 -1
  61. package/dist/chunks/WebApp-CWbRPN8W.js +0 -2
  62. package/dist/chunks/WebApp-CWbRPN8W.js.map +0 -1
  63. package/dist/chunks/WebApp-DVm8Swji.js.map +0 -1
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./chunks/MetricsChart-BiuzBNK_.js"),e=require("./chunks/WebApp-CWbRPN8W.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-BnAXZSYf.js"),e=require("./chunks/WebApp-Co0le5eH.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-BtPdRK4u.js";
2
- import { V as View, d as dataFormatter } from "./chunks/WebApp-DVm8Swji.js";
3
- import { B as B2, b, a, c, e, f, W } from "./chunks/WebApp-DVm8Swji.js";
1
+ import { B, M, P, S } from "./chunks/MetricsChart-DMAFQpiZ.js";
2
+ import { V as View, d as dataFormatter } from "./chunks/WebApp-gPOds7Ie.js";
3
+ import { B as B2, b, a, c, e, f, W } from "./chunks/WebApp-gPOds7Ie.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-BzvHUrN8.js";
2
- import { r as rest, V as View, d as dataFormatter, M as Mustache } from "./WebApp-DVm8Swji.js";
3
- import { P as Page } from "./Page-C5yf_RnZ.js";
4
- import Dialog from "./Dialog-CdjTdWFy.js";
5
- import { F as FormView, a as applyFileDropMixin } from "./FormView-CO2fMfms.js";
1
+ import { M as Model, C as Collection, T as ToastService, G as GroupList, d as UserList } from "./ContextMenu-BXCBFtAP.js";
2
+ import { r as rest, V as View, d as dataFormatter, M as Mustache } from "./WebApp-gPOds7Ie.js";
3
+ import { P as Page } from "./Page-3EI2SKd6.js";
4
+ import Dialog from "./Dialog-B4CbgRxK.js";
5
+ import { F as FormView, a as applyFileDropMixin } from "./FormView-Nh9T4RYF.js";
6
6
  class S3Bucket extends Model {
7
7
  constructor(data = {}) {
8
8
  super(data, {
@@ -4237,29 +4237,30 @@ class TableView extends ListView {
4237
4237
  `;
4238
4238
  }
4239
4239
  this.columns.forEach((column) => {
4240
+ const { fieldKey } = this.parseColumnKey(column.key);
4240
4241
  const sortable = this.sortable && column.sortable !== false;
4241
- const currentSort = this.getSortBy() === column.key ? this.getSortDirection() : null;
4242
+ const currentSort = this.getSortBy() === fieldKey ? this.getSortDirection() : null;
4242
4243
  const sortIcon = this.getSortIcon(currentSort);
4243
- const label = column.label || column.title || column.key;
4244
+ const label = column.label || column.title || fieldKey;
4244
4245
  const responsiveClasses = this.getResponsiveClasses(column.visibility);
4245
4246
  const sortDropdown = sortable ? `
4246
4247
  <div class="dropdown d-inline-block ms-2">
4247
4248
  <button class="btn btn-sm btn-link p-0 text-decoration-none" type="button"
4248
4249
  data-bs-toggle="dropdown" aria-expanded="false"
4249
- data-column="${column.key}">
4250
+ data-column="${fieldKey}">
4250
4251
  ${sortIcon}
4251
4252
  </button>
4252
4253
  <ul class="dropdown-menu dropdown-menu-end">
4253
4254
  <li><a class="dropdown-item ${currentSort === "asc" ? "active" : ""}"
4254
- data-action="sort" data-field="${column.key}" data-direction="asc">
4255
+ data-action="sort" data-field="${fieldKey}" data-direction="asc">
4255
4256
  <i class="bi bi-sort-alpha-down me-2"></i>Sort A-Z
4256
4257
  </a></li>
4257
4258
  <li><a class="dropdown-item ${currentSort === "desc" ? "active" : ""}"
4258
- data-action="sort" data-field="${column.key}" data-direction="desc">
4259
+ data-action="sort" data-field="${fieldKey}" data-direction="desc">
4259
4260
  <i class="bi bi-sort-alpha-down-alt me-2"></i>Sort Z-A
4260
4261
  </a></li>
4261
4262
  <li><a class="dropdown-item ${currentSort === null ? "active" : ""}"
4262
- data-action="sort" data-field="${column.key}" data-direction="none">
4263
+ data-action="sort" data-field="${fieldKey}" data-direction="none">
4263
4264
  <i class="bi bi-x-circle me-2"></i>No Sort
4264
4265
  </a></li>
4265
4266
  </ul>
@@ -4980,16 +4981,17 @@ class TableView extends ListView {
4980
4981
  const currentSortDir = this.getSortDirection();
4981
4982
  this.columns.forEach((column) => {
4982
4983
  if (this.sortable && column.sortable !== false) {
4983
- const dropdown = this.element.querySelector(`[data-bs-toggle="dropdown"][data-column="${column.key}"]`);
4984
+ const { fieldKey } = this.parseColumnKey(column.key);
4985
+ const dropdown = this.element.querySelector(`[data-bs-toggle="dropdown"][data-column="${fieldKey}"]`);
4984
4986
  if (dropdown) {
4985
- const isSorted = currentSortField === column.key;
4987
+ const isSorted = currentSortField === fieldKey;
4986
4988
  const sortIcon = this.getSortIcon(isSorted ? currentSortDir : null);
4987
4989
  dropdown.innerHTML = sortIcon;
4988
4990
  const dropdownMenu = dropdown.nextElementSibling;
4989
4991
  if (dropdownMenu) {
4990
- const ascItem = dropdownMenu.querySelector(`[data-field="${column.key}"][data-direction="asc"]`);
4991
- const descItem = dropdownMenu.querySelector(`[data-field="${column.key}"][data-direction="desc"]`);
4992
- const noneItem = dropdownMenu.querySelector(`[data-field="${column.key}"][data-direction="none"]`);
4992
+ const ascItem = dropdownMenu.querySelector(`[data-field="${fieldKey}"][data-direction="asc"]`);
4993
+ const descItem = dropdownMenu.querySelector(`[data-field="${fieldKey}"][data-direction="desc"]`);
4994
+ const noneItem = dropdownMenu.querySelector(`[data-field="${fieldKey}"][data-direction="none"]`);
4993
4995
  if (ascItem) {
4994
4996
  ascItem.classList.toggle("active", isSorted && currentSortDir === "asc");
4995
4997
  }
@@ -4997,7 +4999,7 @@ class TableView extends ListView {
4997
4999
  descItem.classList.toggle("active", isSorted && currentSortDir === "desc");
4998
5000
  }
4999
5001
  if (noneItem) {
5000
- noneItem.classList.toggle("active", !isSorted || currentSortField !== column.key);
5002
+ noneItem.classList.toggle("active", !isSorted || currentSortField !== fieldKey);
5001
5003
  }
5002
5004
  }
5003
5005
  }
@@ -7176,4 +7178,4 @@ export {
7176
7178
  FileList as y,
7177
7179
  FileForms as z
7178
7180
  };
7179
- //# sourceMappingURL=ChatView-D8QF3I2d.js.map
7181
+ //# sourceMappingURL=ChatView-DUmQtrvk.js.map