diff --git a/app/Controllers/Chart/ChartController.php b/app/Controllers/Chart/ChartController.php index 81ad1cc..26d1934 100644 --- a/app/Controllers/Chart/ChartController.php +++ b/app/Controllers/Chart/ChartController.php @@ -554,7 +554,7 @@ class ChartController extends BaseController $clean[] = $h; } } - $out['palette_colors'] = array_slice($clean, 0, 8); + $out['palette_colors'] = array_slice($clean, 0, 12); } return $out; diff --git a/app/Controllers/Dashboard/DashboardController.php b/app/Controllers/Dashboard/DashboardController.php index 57b6aac..edd0364 100644 --- a/app/Controllers/Dashboard/DashboardController.php +++ b/app/Controllers/Dashboard/DashboardController.php @@ -91,6 +91,7 @@ class DashboardController extends BaseController 'chartsList' => $charts, 'dashBoot' => [ 'dashboardId' => $id, + 'dashboardName' => (string) ($dashboard['name'] ?? 'dashboard'), 'workspaceTheme'=> (string) ($dashboard['theme'] ?? 'system'), 'refreshSec' => max(0, (int) ($dashboard['refresh_interval'] ?? 0)), 'widgets' => $this->widgetsBootPayload($widgets), @@ -102,6 +103,7 @@ class DashboardController extends BaseController 'urls' => [ 'chartData' => rtrim(base_url(), '/') . '/chart/', 'chartEdit' => rtrim(base_url(), '/') . '/chart/edit/', + 'chartExportBase' => rtrim(base_url(), '/') . '/chart/', 'saveLayout' => rtrim(base_url(), '/') . '/dashboard/' . $id . '/layout', 'addWidget' => rtrim(base_url(), '/') . '/dashboard/' . $id . '/widget', 'delWidget' => rtrim(base_url(), '/') . '/dashboard/widget/', diff --git a/app/Controllers/Share/PublicController.php b/app/Controllers/Share/PublicController.php index 61ce95d..5686b7a 100644 --- a/app/Controllers/Share/PublicController.php +++ b/app/Controllers/Share/PublicController.php @@ -227,6 +227,7 @@ class PublicController extends BaseController $dashBoot = [ 'dashboardId' => $dashId, + 'dashboardName' => (string) ($dashboard['name'] ?? 'dashboard'), 'workspaceTheme'=> (string) ($dashboard['theme'] ?? 'system'), 'refreshSec' => max(0, (int) ($dashboard['refresh_interval'] ?? 0)), 'widgets' => $this->widgetsBootPayload($widgets), diff --git a/app/Libraries/ChartRenderer.php b/app/Libraries/ChartRenderer.php index c320337..869c292 100644 --- a/app/Libraries/ChartRenderer.php +++ b/app/Libraries/ChartRenderer.php @@ -99,6 +99,10 @@ class ChartRenderer $y = trim((string) ($chart['y_field'] ?? '')); $group = trim((string) ($chart['group_field'] ?? '')); $valueF = trim((string) ($chart['value_field'] ?? '')); + // Combo charts are designed as 2-metric single-series overlays; ignore grouping. + if ($type === 'combo') { + $group = ''; + } $colors = $this->resolveColors($display); $baseFont = 'Inter, system-ui, sans-serif'; @@ -152,7 +156,8 @@ class ChartRenderer default => 'pie', }; - $plotOptions = []; + // Keep plotOptions as an object for Apex (not [] array) when no pie config is needed. + $plotOptions = new \stdClass(); if ($type === 'pie' || $type === 'donut') { $plotOptions['pie'] = [ 'donut' => [ @@ -294,6 +299,7 @@ class ChartRenderer 'plotOptions' => [ 'bar' => [ 'horizontal' => true, + 'isFunnel' => true, 'barHeight' => '75%', 'distributed' => true, 'borderRadius' => 6, @@ -347,7 +353,7 @@ class ChartRenderer } if ($type === 'heatmap') { - if ($x === '' || $y === '') { + if ($x === '' || $y === '' || $group === '') { return null; } $seriesNameCol = $group !== '' ? $group : '__single__'; @@ -436,7 +442,7 @@ class ChartRenderer if ($type === 'combo') { $y2 = trim((string) ($display['secondary_y_field'] ?? '')); - if ($y2 === '' || $group !== '') { + if ($y2 === '') { return null; } $lineData = $this->columnValues($rows, $categories, $x, $y2, ''); @@ -512,7 +518,7 @@ class ChartRenderer 'legend' => $legend, 'plotOptions' => ['bar' => $plotBar], 'fill' => $fill, - 'tooltip' => $this->sharedTooltip(), + 'tooltip' => $apexType === 'bar' ? $this->pointTooltip() : $this->sharedTooltip(), ]; } @@ -530,6 +536,20 @@ class ChartRenderer ]; } + /** + * Show only hovered datapoint in tooltip (used for bar charts). + * + * @return array + */ + private function pointTooltip(): array + { + return [ + 'shared' => false, + 'intersect' => true, + 'theme' => 'light', + ]; + } + /** * @param array $display * @return array diff --git a/app/Views/chart/builder.php b/app/Views/chart/builder.php index e05dcb6..050e7be 100644 --- a/app/Views/chart/builder.php +++ b/app/Views/chart/builder.php @@ -101,7 +101,7 @@ $bootstrapJson = json_encode($bootstrap, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX
-
+
@@ -266,8 +266,8 @@ $bootstrapJson = json_encode($bootstrap, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX
-
-