web-mojo 2.1.626 → 2.1.675

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 (64) 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 +105 -75
  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.cjs.js.map +1 -1
  11. package/dist/charts.es.js +8 -590
  12. package/dist/charts.es.js.map +1 -1
  13. package/dist/chunks/{ChatView-BxbA5ob6.js → ChatView-BmWwT0QF.js} +72 -16
  14. package/dist/chunks/ChatView-BmWwT0QF.js.map +1 -0
  15. package/dist/chunks/ChatView-Dpxy85W3.js +2 -0
  16. package/dist/chunks/ChatView-Dpxy85W3.js.map +1 -0
  17. package/dist/chunks/{ContextMenu-ATInMbaI.js → ContextMenu-C1A4AVbi.js} +2 -2
  18. package/dist/chunks/{ContextMenu-ATInMbaI.js.map → ContextMenu-C1A4AVbi.js.map} +1 -1
  19. package/dist/chunks/{ContextMenu-Ckttp-rD.js → ContextMenu-CqUg8Aov.js} +2 -2
  20. package/dist/chunks/{ContextMenu-Ckttp-rD.js.map → ContextMenu-CqUg8Aov.js.map} +1 -1
  21. package/dist/chunks/{DataView-BQOKPprj.js → DataView-BZBAmV6d.js} +2 -2
  22. package/dist/chunks/{DataView-BQOKPprj.js.map → DataView-BZBAmV6d.js.map} +1 -1
  23. package/dist/chunks/{DataView-BsWK0Ul7.js → DataView-C73dhEBE.js} +2 -2
  24. package/dist/chunks/{DataView-BsWK0Ul7.js.map → DataView-C73dhEBE.js.map} +1 -1
  25. package/dist/chunks/{Dialog-aTTrQ6uW.js → Dialog-CaQZlPs8.js} +5 -5
  26. package/dist/chunks/{Dialog-aTTrQ6uW.js.map → Dialog-CaQZlPs8.js.map} +1 -1
  27. package/dist/chunks/{Dialog-t4J3qOjC.js → Dialog-CsYKb5_K.js} +2 -2
  28. package/dist/chunks/{Dialog-t4J3qOjC.js.map → Dialog-CsYKb5_K.js.map} +1 -1
  29. package/dist/chunks/{FormView-DvKBq99H.js → FormView-BQet49yz.js} +2 -2
  30. package/dist/chunks/{FormView-DvKBq99H.js.map → FormView-BQet49yz.js.map} +1 -1
  31. package/dist/chunks/{FormView-DjypPrEw.js → FormView-C5gHgWj-.js} +2 -2
  32. package/dist/chunks/{FormView-DjypPrEw.js.map → FormView-C5gHgWj-.js.map} +1 -1
  33. package/dist/chunks/{MetricsChart-DJ_AMjGg.js → MetricsMiniChartWidget-0QE0WL-x.js} +771 -4
  34. package/dist/chunks/MetricsMiniChartWidget-0QE0WL-x.js.map +1 -0
  35. package/dist/chunks/{MetricsChart-BHB2dubV.js → MetricsMiniChartWidget-hp1SBgB2.js} +2 -2
  36. package/dist/chunks/MetricsMiniChartWidget-hp1SBgB2.js.map +1 -0
  37. package/dist/chunks/{PDFViewer-kDd18mqo.js → PDFViewer-CJAsn0H1.js} +3 -3
  38. package/dist/chunks/{PDFViewer-kDd18mqo.js.map → PDFViewer-CJAsn0H1.js.map} +1 -1
  39. package/dist/chunks/{PDFViewer-DXoC6y5o.js → PDFViewer-CX5bKmKa.js} +2 -2
  40. package/dist/chunks/{PDFViewer-DXoC6y5o.js.map → PDFViewer-CX5bKmKa.js.map} +1 -1
  41. package/dist/chunks/{Page-BrWp1FsC.js → Page-DJtwfAf4.js} +2 -2
  42. package/dist/chunks/{Page-BrWp1FsC.js.map → Page-DJtwfAf4.js.map} +1 -1
  43. package/dist/chunks/{Page-DgKaDD9p.js → Page-Oo8qO-IX.js} +2 -2
  44. package/dist/chunks/{Page-DgKaDD9p.js.map → Page-Oo8qO-IX.js.map} +1 -1
  45. package/dist/chunks/{TopNav-DoAl9Rpd.js → TopNav-C4tISlAt.js} +2 -2
  46. package/dist/chunks/{TopNav-DoAl9Rpd.js.map → TopNav-C4tISlAt.js.map} +1 -1
  47. package/dist/chunks/{TopNav-DGtRj5F4.js → TopNav-QlJo-F9B.js} +5 -5
  48. package/dist/chunks/{TopNav-DGtRj5F4.js.map → TopNav-QlJo-F9B.js.map} +1 -1
  49. package/dist/chunks/{WebApp-ciExPk0c.js → WebApp-BWnjZ-UU.js} +14 -13
  50. package/dist/chunks/{WebApp-ciExPk0c.js.map → WebApp-BWnjZ-UU.js.map} +1 -1
  51. package/dist/chunks/{WebApp-DWIriU_w.js → WebApp-DgFbFcSM.js} +2 -2
  52. package/dist/chunks/{WebApp-DWIriU_w.js.map → WebApp-DgFbFcSM.js.map} +1 -1
  53. package/dist/docit.cjs.js +1 -1
  54. package/dist/docit.es.js +5 -5
  55. package/dist/index.cjs.js +1 -1
  56. package/dist/index.es.js +11 -11
  57. package/dist/lightbox.cjs.js +1 -1
  58. package/dist/lightbox.es.js +4 -4
  59. package/package.json +1 -1
  60. package/dist/chunks/ChatView-0e0k3QSK.js +0 -2
  61. package/dist/chunks/ChatView-0e0k3QSK.js.map +0 -1
  62. package/dist/chunks/ChatView-BxbA5ob6.js.map +0 -1
  63. package/dist/chunks/MetricsChart-BHB2dubV.js.map +0 -1
  64. package/dist/chunks/MetricsChart-DJ_AMjGg.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"charts.es.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":["e"],"mappings":"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"}
1
+ {"version":3,"file":"charts.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -1,8 +1,8 @@
1
- import { M as Model, C as Collection, T as ToastService, G as GroupList, d as UserList } from "./ContextMenu-Ckttp-rD.js";
2
- import { r as rest, V as View, d as dataFormatter, M as Mustache } from "./WebApp-ciExPk0c.js";
3
- import { P as Page } from "./Page-BrWp1FsC.js";
4
- import Dialog from "./Dialog-aTTrQ6uW.js";
5
- import { F as FormView, a as applyFileDropMixin } from "./FormView-DjypPrEw.js";
1
+ import { M as Model, C as Collection, T as ToastService, G as GroupList, d as UserList } from "./ContextMenu-CqUg8Aov.js";
2
+ import { r as rest, V as View, d as dataFormatter, M as Mustache } from "./WebApp-BWnjZ-UU.js";
3
+ import { P as Page } from "./Page-DJtwfAf4.js";
4
+ import Dialog from "./Dialog-CaQZlPs8.js";
5
+ import { F as FormView, a as applyFileDropMixin } from "./FormView-C5gHgWj-.js";
6
6
  class S3Bucket extends Model {
7
7
  constructor(data = {}) {
8
8
  super(data, {
@@ -3149,17 +3149,45 @@ class TableRow extends ListViewItem {
3149
3149
  }
3150
3150
  /**
3151
3151
  * Get responsive CSS classes for column visibility
3152
- * @param {string} visibility - Bootstrap breakpoint (sm, md, lg, xl, xxl)
3152
+ * @param {string|object} visibility - Bootstrap breakpoint or config object
3153
+ * - String: 'md' = show at md and up (hide below)
3154
+ * - Object: { hide: 'md' } = hide at md and up (show below)
3155
+ * - Object: { show: 'md', hide: 'lg' } = show from md to lg only
3153
3156
  * @returns {string} Bootstrap responsive display classes
3154
3157
  */
3155
3158
  getResponsiveClasses(visibility) {
3156
3159
  if (!visibility) return "";
3157
3160
  const validBreakpoints = ["sm", "md", "lg", "xl", "xxl"];
3158
- if (!validBreakpoints.includes(visibility)) {
3159
- console.warn(`Invalid visibility breakpoint: ${visibility}. Valid options are: ${validBreakpoints.join(", ")}`);
3160
- return "";
3161
+ if (typeof visibility === "string") {
3162
+ if (!validBreakpoints.includes(visibility)) {
3163
+ console.warn(`Invalid visibility breakpoint: ${visibility}. Valid options are: ${validBreakpoints.join(", ")}`);
3164
+ return "";
3165
+ }
3166
+ return `d-none d-${visibility}-table-cell`;
3167
+ }
3168
+ if (typeof visibility === "object") {
3169
+ const classes = [];
3170
+ if (visibility.hide) {
3171
+ if (!validBreakpoints.includes(visibility.hide)) {
3172
+ console.warn(`Invalid hide breakpoint: ${visibility.hide}. Valid options are: ${validBreakpoints.join(", ")}`);
3173
+ return "";
3174
+ }
3175
+ classes.push(`d-table-cell d-${visibility.hide}-none`);
3176
+ }
3177
+ if (visibility.show) {
3178
+ if (!validBreakpoints.includes(visibility.show)) {
3179
+ console.warn(`Invalid show breakpoint: ${visibility.show}. Valid options are: ${validBreakpoints.join(", ")}`);
3180
+ return "";
3181
+ }
3182
+ if (!visibility.hide) {
3183
+ classes.push(`d-none d-${visibility.show}-table-cell`);
3184
+ } else {
3185
+ classes.push(`d-${visibility.show}-table-cell`);
3186
+ }
3187
+ }
3188
+ return classes.join(" ");
3161
3189
  }
3162
- return `d-none d-${visibility}-table-cell`;
3190
+ return "";
3163
3191
  }
3164
3192
  /**
3165
3193
  * Build the row template with table cells
@@ -3808,17 +3836,45 @@ class TableView extends ListView {
3808
3836
  }
3809
3837
  /**
3810
3838
  * Get responsive CSS classes for column visibility
3811
- * @param {string} visibility - Bootstrap breakpoint (sm, md, lg, xl, xxl)
3839
+ * @param {string|object} visibility - Bootstrap breakpoint or config object
3840
+ * - String: 'md' = show at md and up (hide below)
3841
+ * - Object: { hide: 'md' } = hide at md and up (show below)
3842
+ * - Object: { show: 'md', hide: 'lg' } = show from md to lg only
3812
3843
  * @returns {string} Bootstrap responsive display classes
3813
3844
  */
3814
3845
  getResponsiveClasses(visibility) {
3815
3846
  if (!visibility) return "";
3816
3847
  const validBreakpoints = ["sm", "md", "lg", "xl", "xxl"];
3817
- if (!validBreakpoints.includes(visibility)) {
3818
- console.warn(`Invalid visibility breakpoint: ${visibility}. Valid options are: ${validBreakpoints.join(", ")}`);
3819
- return "";
3848
+ if (typeof visibility === "string") {
3849
+ if (!validBreakpoints.includes(visibility)) {
3850
+ console.warn(`Invalid visibility breakpoint: ${visibility}. Valid options are: ${validBreakpoints.join(", ")}`);
3851
+ return "";
3852
+ }
3853
+ return `d-none d-${visibility}-table-cell`;
3854
+ }
3855
+ if (typeof visibility === "object") {
3856
+ const classes = [];
3857
+ if (visibility.hide) {
3858
+ if (!validBreakpoints.includes(visibility.hide)) {
3859
+ console.warn(`Invalid hide breakpoint: ${visibility.hide}. Valid options are: ${validBreakpoints.join(", ")}`);
3860
+ return "";
3861
+ }
3862
+ classes.push(`d-table-cell d-${visibility.hide}-none`);
3863
+ }
3864
+ if (visibility.show) {
3865
+ if (!validBreakpoints.includes(visibility.show)) {
3866
+ console.warn(`Invalid show breakpoint: ${visibility.show}. Valid options are: ${validBreakpoints.join(", ")}`);
3867
+ return "";
3868
+ }
3869
+ if (!visibility.hide) {
3870
+ classes.push(`d-none d-${visibility.show}-table-cell`);
3871
+ } else {
3872
+ classes.push(`d-${visibility.show}-table-cell`);
3873
+ }
3874
+ }
3875
+ return classes.join(" ");
3820
3876
  }
3821
- return `d-none d-${visibility}-table-cell`;
3877
+ return "";
3822
3878
  }
3823
3879
  /**
3824
3880
  * Extract column key and formatter from combined key (e.g., "sales_amount|currency")
@@ -7178,4 +7234,4 @@ export {
7178
7234
  FileList as y,
7179
7235
  FileForms as z
7180
7236
  };
7181
- //# sourceMappingURL=ChatView-BxbA5ob6.js.map
7237
+ //# sourceMappingURL=ChatView-BmWwT0QF.js.map