From 02beedfe5d18f5579d4fcf7dcfb63dceeaef8a63 Mon Sep 17 00:00:00 2001 From: Helder Mendes Date: Wed, 18 Feb 2026 11:24:31 +0100 Subject: [PATCH 1/6] Enhance dataset analysis: pagination, theme-aware correlation, per-feature distribution logic - Add pagination to Features tab (50 per page) with grid/list view toggle - Add pagination to Distribution tab feature selector (50 per page) - Make correlation heatmap theme-aware (dark/light mode font + grid colors) - Use transparent background for correlation colorscale midpoint - Show nominal distributions from metadata for large datasets, "coming soon" for numeric - Default feature selection: target (if nominal) + up to 5 numeric features - Remove global "coming soon" block from correlation (always show) Co-Authored-By: Claude Opus 4.6 Enhance dataset analysis: pagination, theme-aware correlation, per-feature distribution logic# --- .../dataset/data-analysis-section.tsx | 31 +++---------------- 1 file changed, 4 insertions(+), 27 deletions(-) diff --git a/app-next/src/components/dataset/data-analysis-section.tsx b/app-next/src/components/dataset/data-analysis-section.tsx index 5a76f944..07268df1 100644 --- a/app-next/src/components/dataset/data-analysis-section.tsx +++ b/app-next/src/components/dataset/data-analysis-section.tsx @@ -16,6 +16,7 @@ import { FileText, Target, Loader2, + AlertCircle, } from "lucide-react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; @@ -439,7 +440,6 @@ export function DataAnalysisSection({ @@ -815,8 +815,6 @@ function DistributionPlot({ targetColors?: string[]; dataUnavailable?: boolean; }) { - const { resolvedTheme } = useTheme(); - const isDark = resolvedTheme === "dark"; const isNumeric = feature.type === "numeric"; // Compute distribution from parquet data or use feature.distr @@ -902,22 +900,11 @@ function DistributionPlot({ layout={{ height: 200, margin: { l: 40, r: 20, t: 10, b: 40 }, - font: { - color: isDark ? "rgba(250,250,250,0.6)" : "rgba(0,0,0,0.6)", - }, xaxis: { tickangle: isNumeric ? 0 : -45, automargin: true, - gridcolor: isDark - ? "rgba(255,255,255,0.1)" - : "rgba(0,0,0,0.1)", - }, - yaxis: { - title: "Count", - gridcolor: isDark - ? "rgba(255,255,255,0.1)" - : "rgba(0,0,0,0.1)", }, + yaxis: { title: "Count" }, bargap: 0.1, paper_bgcolor: "transparent", plot_bgcolor: "transparent", @@ -940,12 +927,10 @@ function DistributionPlot({ function CorrelationHeatmap({ numericFeatures, parquetData, - isLoadingParquet, datasetId, }: { numericFeatures: DatasetFeature[]; parquetData: Record | null; - isLoadingParquet?: boolean; datasetId?: number; }) { const { resolvedTheme } = useTheme(); @@ -991,19 +976,11 @@ function CorrelationHeatmap({ } if (!parquetData) { - if (isLoadingParquet) { - return ( -
- - Loading data... -
- ); - } return (
- +

- Correlation data will be available soon. + Correlation requires real data. Load the parquet file to view.

); From 550f05e55c5fc2a2faf60404e347cfbedebe20e6 Mon Sep 17 00:00:00 2001 From: Helder Mendes Date: Wed, 18 Feb 2026 12:45:01 +0100 Subject: [PATCH 2/6] Fix parquet-wasm loading, add theme-aware distribution charts, open items doc - Fix parquet-wasm: call .intoIPCStream() before tableFromIPC() (fixes metadata.map error) - Bump MAX_PARQUET_SIZE from 5MB to 10MB (allows datasets like 1590) - Add dark/light mode styling to distribution plots (font, grid colors) - Add loading state and fallback message to correlation heatmap - Add OPEN_ITEMS.md documenting outstanding items for team discussion Co-Authored-By: Claude Opus 4.6 --- .../dataset/data-analysis-section.tsx | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/app-next/src/components/dataset/data-analysis-section.tsx b/app-next/src/components/dataset/data-analysis-section.tsx index 07268df1..5a76f944 100644 --- a/app-next/src/components/dataset/data-analysis-section.tsx +++ b/app-next/src/components/dataset/data-analysis-section.tsx @@ -16,7 +16,6 @@ import { FileText, Target, Loader2, - AlertCircle, } from "lucide-react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; @@ -440,6 +439,7 @@ export function DataAnalysisSection({ @@ -815,6 +815,8 @@ function DistributionPlot({ targetColors?: string[]; dataUnavailable?: boolean; }) { + const { resolvedTheme } = useTheme(); + const isDark = resolvedTheme === "dark"; const isNumeric = feature.type === "numeric"; // Compute distribution from parquet data or use feature.distr @@ -900,11 +902,22 @@ function DistributionPlot({ layout={{ height: 200, margin: { l: 40, r: 20, t: 10, b: 40 }, + font: { + color: isDark ? "rgba(250,250,250,0.6)" : "rgba(0,0,0,0.6)", + }, xaxis: { tickangle: isNumeric ? 0 : -45, automargin: true, + gridcolor: isDark + ? "rgba(255,255,255,0.1)" + : "rgba(0,0,0,0.1)", + }, + yaxis: { + title: "Count", + gridcolor: isDark + ? "rgba(255,255,255,0.1)" + : "rgba(0,0,0,0.1)", }, - yaxis: { title: "Count" }, bargap: 0.1, paper_bgcolor: "transparent", plot_bgcolor: "transparent", @@ -927,10 +940,12 @@ function DistributionPlot({ function CorrelationHeatmap({ numericFeatures, parquetData, + isLoadingParquet, datasetId, }: { numericFeatures: DatasetFeature[]; parquetData: Record | null; + isLoadingParquet?: boolean; datasetId?: number; }) { const { resolvedTheme } = useTheme(); @@ -976,11 +991,19 @@ function CorrelationHeatmap({ } if (!parquetData) { + if (isLoadingParquet) { + return ( +
+ + Loading data... +
+ ); + } return (
- +

- Correlation requires real data. Load the parquet file to view. + Correlation data will be available soon.

); From 04720419bbf1206657c4535c56ba788c1f906405 Mon Sep 17 00:00:00 2001 From: Helder Mendes Date: Wed, 18 Feb 2026 23:20:14 +0100 Subject: [PATCH 3/6] Add measures pages with analysis and update documentation --- .../dev_data/helder_design/helder_mendes.jpg | Bin 0 -> 41429 bytes app-next/docs/OPEN_ITEMS.md | 33 +- .../(explore)/benchmarks/[id]/page.tsx | 153 ++-- .../(explore)/collections/[id]/page.tsx | 146 ++-- .../[locale]/(explore)/measures/[id]/page.tsx | 194 ++++++ .../[locale]/(explore)/measures/data/page.tsx | 18 +- .../(explore)/measures/evaluation/page.tsx | 18 +- .../(explore)/measures/procedures/page.tsx | 18 +- app-next/src/app/api/search/route.ts | 29 +- .../src/app/api/study/[id]/datasets/route.ts | 91 +++ .../src/app/api/study/[id]/tasks/route.ts | 90 +++ .../benchmark/benchmark-datasets-section.tsx | 654 ++++++++++++++++++ .../benchmark/benchmark-navigation-menu.tsx | 198 ++++++ .../benchmark/benchmark-tasks-section.tsx | 600 ++++++++++++++++ app-next/src/components/benchmark/index.ts | 3 + .../collection-datasets-section.tsx | 654 ++++++++++++++++++ .../collection/collection-navigation-menu.tsx | 201 ++++++ .../collection/collection-tasks-section.tsx | 600 ++++++++++++++++ .../dataset/data-analysis-section.tsx | 21 +- .../components/dataset/dataset-header-new.tsx | 136 +++- .../components/dataset/metadata-section.tsx | 2 +- app-next/src/components/measure/index.ts | 7 + .../measure/measure-analysis-section.tsx | 314 +++++++++ .../measure/measure-description-section.tsx | 104 +++ .../src/components/measure/measure-header.tsx | 122 ++++ .../src/components/measure/measure-list.tsx | 6 +- .../measure/measure-navigation-menu.tsx | 226 ++++++ .../measure/measure-search-container.tsx | 595 ++++++++++++++++ .../components/measure/measure-stats-card.tsx | 186 +++++ .../benchmarks/benchmarks-search-page.tsx | 26 +- .../collections/collections-search-page.tsx | 26 +- .../search/datasets/datasets-search-page.tsx | 1 + .../search/datasets/search-container.tsx | 36 +- .../components/task/task-analysis-section.tsx | 51 +- .../components/task/task-navigation-menu.tsx | 4 +- app-next/src/lib/api/measure.ts | 99 +++ app-next/src/lib/api/study.ts | 35 + .../src/services/OpenMLSearchConnector.ts | 87 ++- app-next/src/types/measure.ts | 14 + app-next/tsconfig.tsbuildinfo | 2 +- server/openml.db-shm | Bin 32768 -> 0 bytes server/openml.db-wal | 0 test-measures-api.sh | 13 + 43 files changed, 5547 insertions(+), 266 deletions(-) create mode 100644 app-next/dev_data/helder_design/helder_mendes.jpg create mode 100644 app-next/src/app/[locale]/(explore)/measures/[id]/page.tsx create mode 100644 app-next/src/app/api/study/[id]/datasets/route.ts create mode 100644 app-next/src/app/api/study/[id]/tasks/route.ts create mode 100644 app-next/src/components/benchmark/benchmark-datasets-section.tsx create mode 100644 app-next/src/components/benchmark/benchmark-navigation-menu.tsx create mode 100644 app-next/src/components/benchmark/benchmark-tasks-section.tsx create mode 100644 app-next/src/components/benchmark/index.ts create mode 100644 app-next/src/components/collection/collection-datasets-section.tsx create mode 100644 app-next/src/components/collection/collection-navigation-menu.tsx create mode 100644 app-next/src/components/collection/collection-tasks-section.tsx create mode 100644 app-next/src/components/measure/index.ts create mode 100644 app-next/src/components/measure/measure-analysis-section.tsx create mode 100644 app-next/src/components/measure/measure-description-section.tsx create mode 100644 app-next/src/components/measure/measure-header.tsx create mode 100644 app-next/src/components/measure/measure-navigation-menu.tsx create mode 100644 app-next/src/components/measure/measure-search-container.tsx create mode 100644 app-next/src/components/measure/measure-stats-card.tsx create mode 100644 app-next/src/lib/api/measure.ts create mode 100644 app-next/src/lib/api/study.ts create mode 100644 app-next/src/types/measure.ts delete mode 100644 server/openml.db-shm delete mode 100644 server/openml.db-wal create mode 100644 test-measures-api.sh diff --git a/app-next/dev_data/helder_design/helder_mendes.jpg b/app-next/dev_data/helder_design/helder_mendes.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee398139fb3b5bcdd24749c647a86198ea342e8f GIT binary patch literal 41429 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 5MB use Dash iframe: `/dashboard/data-features/{id}`. Nominal features show from metadata. Numeric shows "coming soon". | | Correlation | Working | Shows when parquet loads. "Coming soon" otherwise. | | Parquet-wasm | Intermittent | Sometimes fails silently on valid files (e.g. dataset 1590). Falls back to ARFF. | -| Dash JSON API | Future | Server-side computation for large datasets. Would replace "coming soon" messages. | +| Dash JSON API | Discussing | **Current**: Large datasets use Dash iframe. **Team feedback** (Joaquin): Considering precomputing main statistics and dataset preview, serving via main REST API (not Flask). Would allow rendering charts in Next.js with consistent styling instead of iframes. | ## 4. Auth & Infrastructure @@ -43,3 +43,28 @@ Last updated: 2026-02-18 - **Question for team**: Incremental pushes to Vercel preview vs. batched PRs — what works best? - Minor merge conflicts when syncing with upstream. + +## Extras improvements + +### Dataset Edit Form - Markdown Preview + +**Current state**: The dataset edit form (`dataset-edit-form.tsx`) has a plain `