🚀 Highlights
Lightning-Fast Chart Loading! -- Charts with large data tables no longer wait for the entire page to render. Datatable payloads now load asynchronously in the background, so your dashboards feel snappier from the very first second. Combined with optimized menu rendering and smarter query caching, this release delivers a noticeable speed boost across the board.
✨ What's New
- 🗺️ Heatmap visibility toggle: Head to Chart Settings to show or hide the heatmap overlay on supported chart types. Perfect for switching between a color-coded view and a clean data display without reconfiguring the chart.
📈 Improvements
⚡ Async datatable loading: Charts with large data tables now fetch their data via a dedicated background request instead of embedding it in the page HTML. The result: faster initial page loads, especially on dashboards with many data-heavy charts.
🧠 Smarter menu rendering: Dashboards with many categories previously generated thousands of HTML elements server-side. Menus with more than 20 items now render client-side, cutting page weight and speeding up load times.
🔗 Faster filter dropdowns: Filter dropdown categories are preloaded with eager-loaded relations, and sort-order maps are precomputed -- reducing redundant database queries and delivering quicker filter interactions.
🏗️ Cleaner architecture: The chart controller has been split into focused classes (
ChartPageController,ChartManagementController,ChartDataController), making the codebase easier to extend and maintain.🔧 Dev tooling upgrades: ESLint upgraded to v10 and PHP_CodeSniffer to v4 with the latest coding standard rules -- keeping the development experience modern and catching more issues early. Laravel Telescope has been removed to simplify the dev stack.
🐛 Bug Fixes
- Filter dropdowns with question arrays: Question-type filter dropdowns with array-style filter IDs no longer trigger conversion errors or redirect loops on shared/embedded views.
- Chart legend after async load: The chart legend now recalculates correctly when datatable data arrives asynchronously, so case numbers and labels stay accurate.
- XSS hardening in menus: Dynamic menu rendering has been hardened against potential cross-site scripting in generated option values.
- Dropdown defaults: Stale dropdown default IDs are now validated against existing subcategories and gracefully fall back to text matching, preventing redirect loops.
- SQL expression handling: Complex SQL expressions (including parenthesized forms like
((...))*100) now normalize and route correctly, eliminating empty results in certain chart queries. - Route parameter preservation: Filter middleware redirects now preserve all required route parameters, preventing crashes on routes like chart-add-data and shared reports.
- Benchmark dropdown close behavior: Global benchmark multi-select dropdowns close again when clicking outside, restoring the expected apply-on-close behavior.