release/1.1 → dev: all v1.1 features + plugin system - #394
Conversation
Convert the user footer section from a static div to a clickable button that navigates to /settings/profile. Adds cursor-pointer, hover styling, and aria-label for keyboard accessibility. Closes #351 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When a widget is first placed on a dashboard grid, the container often starts with 0 dimensions during ECharts init. The first setOption() draws to a 0x0 canvas, leaving the chart blank until the user resizes or reloads. Force instance.resize() after setOption so the chart picks up the real container size on first render. Closes #332 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
buildCategoryAxisLabel now considers container width when computing rotation — narrower containers rotate more aggressively so labels don't overlap. Thresholds (pixels per label): - < 40px: 60° - < 70px: 45° - < 100px: 30° - >= 100px: 0° Also tightens label truncation to 10 chars when container is < 400px. Closes #337 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add two new boolean options to LineChart: - connectNulls: draw lines through missing (null) data points - endLabel: show series name label at the end of each line Exposed via the chart options schema so users can toggle in the UI. Closes #146 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add edge ID to metadata items in relationship inspection panel - Add Badge indicator showing 'Node' or 'Relationship' in panel header - Thread optional id through GraphEdge type and transform pipeline so the inspection panel can surface the internal element id for edges Closes #352 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add rightAxisSeries prop to LineChart so series with different scales can share the same chart. When rightAxisSeries is non-empty, yAxis becomes an array [leftAxis, rightAxis] and each series gets yAxisIndex 0 or 1 based on whether its name appears in the set. Also adds a rightYAxisLabel prop for the secondary axis label, exposes both options in the chart options panel as text inputs (comma-separated for series names), and wires them through chart-renderer. Closes #159
Adds static options support for the form widget's select field type. Users can now provide a comma-separated list of options (e.g. 'low,medium,high') instead of writing a seed query. When staticOptions is set, it takes precedence over the seed query. Multi-select and cascading-select still use seed queries only. Closes #151
Replace the minimal EmptyState on the dashboards page with a welcoming Getting Started guide for first-time users. Shows a welcome message, a prominent "Create your first dashboard" CTA, a link to the docs, and a three-step guide (connect, create, add widgets) with deep links to the relevant pages. Closes #333 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
feat: clicking user icon in sidebar opens profile settings (#351)
fix: bar chart blank render on initial widget placement (#332)
…roll feat: scrollable pie chart legend with better controls (#338)
…ation feat: responsive bar chart label rotation based on widget width (#337)
…bels feat(component): connect nulls and end labels for line chart
…on-metadata fix: show ID and entity type in graph inspection panel (#352)
feat(component): dual Y-axis support for line chart
feat: select dropdown field type for form widget (#151)
…pty-state feat: onboarding guide on empty dashboards page (#333)
…on-v2 feat: field validation for form widget (#150)
feat(component): zoom controls and node count for graph chart
First PR in the plugin system epic (#221). Adds the core contract and registry without touching existing chart code. The plugin registry will eventually replace the switch statement in chart-renderer.tsx and the scattered edits across chart-registry.ts, chart-options/, and query-editor-panel.tsx. This PR is purely additive — no existing code paths change. New files: - app/src/lib/chart-plugin-registry.ts — defineChartPlugin, createPluginRegistry - app/src/lib/__tests__/chart-plugin-registry.test.ts — 21 tests Plugin contract (ChartPluginConfig): - type, label, component, transform — required - validate, options, queryHint, compatibleWith, stylingTargets — optional - capabilities: { supportsClickAction, supportsStyling, isECharts, requiresQuery } - enrichClickEvent — plugin-specific click event enrichment Registry API: - register/unregister/get/has/getAll/getTypes/getCompatibleWith Defaults: - supportsClickAction: true - supportsStyling: true when stylingTargets provided, else false - isECharts: false, requiresQuery: true Related: #220, epic #221 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…220) Second PR in the plugin system epic. Wires the plugin registry into chart-renderer.tsx and migrates the markdown widget as a proof of concept. Architecture: - New `app/src/plugins/` directory holds the global registry singleton and individual chart plugins - `chart-renderer.tsx` now checks `pluginRegistry.get(type)` FIRST; the existing switch statement remains as a safety fallback for charts not yet migrated - Plugin component receives a uniform props shape: `{ data, settings, stylingRules, paramValues, colorScales, onClick, connectionId, widgetId, resultId, query, autoFit, clickableColumns, colorThresholds }` Markdown migration (first plugin): - New `app/src/plugins/markdown.tsx` defines the markdown plugin - Content-only widget with no query, no click action, no styling - Component adapter reads `settings.content` and renders MarkdownWidget - The legacy switch case is kept as fallback (dead code after registration) Tests added: - 6 markdown plugin tests (capabilities, transform, component render) - 3 global registry tests (registration on import, idempotency, unknown types) All 1852 app tests pass (+9 new). Related: #220, epic #221 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
feat(app): chart plugin registry — contract + registry primitives (#220)
feat(app): plugin-driven renderer + markdown plugin (#220)
Third PR in the plugin system epic. Migrates the three most-used chart types from the hardcoded switch statement into self-contained plugin files. New plugins: - app/src/plugins/bar.tsx — BarPluginComponent adapter + plugin config - app/src/plugins/line.tsx — LinePluginComponent (includes dual Y-axis, connectNulls, endLabel from #146/#159) - app/src/plugins/pie.tsx — PiePluginComponent (donut, rose, topN) Changes to chart-renderer.tsx: - Removed bar/line/pie/markdown cases from switch (dead code) - Removed now-unused BarChart/LineChart/PieChart dynamic imports - Removed now-unused MarkdownWidget import - Plugin registry lookup intercepts these types before the switch Each plugin reuses existing transforms/validators from chart-registry to stay behaviorally identical during migration. Future PRs will further consolidate options schemas + query hints into plugin configs. Tests added: - 6 bar plugin tests (capabilities, component render, settings passing) - All 1877 app tests pass (+6 new, total +34 since PR 1) Related: #220, epic #221 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…mple feat(app): migrate bar/line/pie charts to plugin system (#220)
Fourth PR in the plugin system epic. Completes the migration — all
17 chart types now use the plugin registry. The switch statement in
chart-renderer.tsx is entirely gone.
New plugins (13):
- single-value.tsx, graph.tsx, map.tsx, table.tsx, json.tsx,
parameter-select.tsx, form.tsx, iframe.tsx, gauge.tsx, sankey.tsx,
sunburst.tsx, radar.tsx, treemap.tsx
chart-renderer.tsx changes:
- Removed the switch statement (was 540+ lines, now 130 lines total)
- Removed all dynamic imports for individual chart components
- Removed unused type imports
- Only delegates to pluginRegistry.get(type) now; unknown types
return a helpful "Unknown chart type" error state
Component wiring:
- Plugin adapter receives { data, settings, stylingRules, paramValues,
colorScales, onClick, onChartClick, connectionId, widgetId, resultId,
query, autoFit, clickableColumns, colorThresholds } from the renderer
- Each plugin picks the props it needs and calls the underlying component
- handleEChartsClick (ECharts wrapper) vs onChartClick (raw row callback)
are both passed — plugins pick the right one (e.g. map uses raw,
bar uses ECharts wrapper)
Special handling:
- Graph: dual path (GraphExplorationWrapper for widgets with connectionId,
GraphChart for previews) preserved
- Table/ParameterSelect/Form: use app-local components (imported from
@/components/*) rather than @neoboard/components
All tests pass (1877) + TypeScript clean + ESLint clean.
Related: #220, epic #221
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Turbopack (Next.js 16 default) doesn't correctly handle CJS require() for transpiled monorepo packages, causing createConnectionModule to be undefined at runtime. This breaks all database queries. Changes: - app/package.json: `next dev --webpack` instead of `--turbopack` - app/e2e/global-setup.ts: explicit `--webpack` for local E2E dev mode - app/next.config.ts: add @neoboard/connection to transpilePackages, remove it from serverExternalPackages (it's an internal package) - app/src/lib/connection-adapter.ts: clean require() with docs E2E tests now pass locally (table, single-value, JSON, Neo4j bar chart verified). The --webpack flag can be removed once Turbopack fixes transpilePackages for CJS monorepo packages. See: vercel/next.js#85316 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…rops - New: plugins/utils.ts — PluginProps type + useEChartsClick() hook - All 16 plugins use PluginProps (no more per-plugin interfaces) - chart-renderer passes only onChartClick (removed handleEChartsClick) - ECharts plugins wrap onChartClick via useEChartsClick() internally - Removed unused useMemo, EChartsClickEvent imports from renderer Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
feat(app): migrate all 13 remaining charts to plugin system (#220)
…219) First PR in the connector plugin system. Adds the plugin contract, registry, and built-in plugins — without changing any existing code paths. New files: - connection/src/generalized/connector-plugin.ts — ConnectorPlugin interface + createConnectorRegistry() - connection/src/neo4j/plugin.ts — neo4jPlugin - connection/src/postgresql/plugin.ts — postgresPlugin - connection/src/connector-registry.ts — global singleton with auto-registration, createConnectionModule(), getAllConnectors() - connection/__tests__/connector-registry.test.ts — 15 tests Plugin contract: type, label, category, createModule, supportsGraphData, supportsWrite, queryLanguage, allowedProtocols, uriPlaceholder, databasePlaceholder Registry: register/get/has/getAll/getTypes + validation Closes #219 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
feat(connection): connector plugin registry + neo4j/postgres plugins (#219)
|
Warning Rate limit exceeded
Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 12 minutes and 55 seconds. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (4)
WalkthroughImplements a plugin-driven architecture for chart rendering and introduces a connector registry system. Replaces monolithic switch-based chart rendering with registry-based plugin lookup, adds 15+ new chart plugins, implements form field validation with blur-time checks and static options support, enhances graph exploration with edge metadata and badged properties panels, and establishes modular database connector registration for Neo4j and PostgreSQL. Changes
Sequence Diagram(s)sequenceDiagram
participant Client as Client/Dashboard
participant Renderer as ChartRenderer
participant Registry as PluginRegistry
participant Plugin as ChartPlugin
participant Component as PluginComponent
Client->>Renderer: render(type, data, props)
Renderer->>Registry: get(type)
Registry-->>Renderer: plugin: ChartPlugin
Renderer->>Plugin: access plugin.component
Renderer->>Component: render(PluginProps)
Component->>Component: transform data via plugin.transform
Component->>Component: apply styling rules
Component-->>Client: rendered chart
sequenceDiagram
participant App as Application
participant Registry as ConnectorRegistry
participant Plugin as ConnectorPlugin
participant Module as ConnectionModule
App->>Registry: createConnectionModule(type, authConfig, advOptions)
Registry->>Registry: getConnector(type)
Registry-->>Registry: plugin: ConnectorPlugin | undefined
alt plugin found
Registry->>Plugin: createModule(authConfig, advOptions)
Plugin->>Module: instantiate ConnectionModule
Module-->>Registry: module instance
Registry-->>App: ConnectionModule
else plugin not found
Registry-->>App: Error: unknown connector type
end
Estimated code review effort🎯 4 (Complex) | ⏱️ ~55 minutes Possibly related issues
Possibly related PRs
Suggested labels
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Two new documentation pages explaining how to extend NeoBoard: - developer/extending/new-chart-plugin.mdx — full guide with defineChartPlugin() reference, PluginProps table, ECharts vs custom patterns, and heatmap example - developer/extending/new-connector-plugin.mdx — ConnectorPlugin reference, ConnectionModule implementation guide, registry API, and testing patterns Updated developer index to link plugin guides prominently. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
docs: chart plugin + connector plugin developer guides
|
release/1.1 → dev: all v1.1 features + plugin system


Merges release/1.1 into dev with all v1.1 features including plugin system, 14 bug fixes, docs, CLI.
Summary by CodeRabbit
Release Notes
New Features
Improvements