Root cause: backend returns minimal style object without title/legend/axis
sub-objects, causing TypeError 'Cannot read properties of undefined'.
Fix: normalize style with full defaults at the builder entry point,
protecting ALL chart type builders uniformly.
Also fix antd deprecation warnings (destroyOnClose -> destroyOnHidden).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- DropZone: log actual error message instead of generic text
- KPICard: aggregate all rows, auto-detect 同比/环比 columns,
show proper formatting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
All 17 chart types now show Chinese names (柱状图, 折线图, 饼图, etc.)
and use specific Ant Design icons instead of generic BarChartOutlined.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When creating a chart, automatically assign first text column to X axis
and first number column to Y axis (varies by chart type).
Charts now show data immediately instead of blank.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- All 4 API clients now consistently use /api/v1/ prefix on all routes
- ChartRenderer fills missing style fields with defaults to prevent
undefined property crashes when backend returns minimal style
- KPICard uses safe defaults for background/border/title
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
react-grid-layout v2 removed WidthProvider. Use ResizeObserver to
track container width and pass it directly to Responsive component.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- useImportData: use dataset_id instead of id from backend response,
fetch rows after import, fix column type mapping
- useCreateChart: fix bindings mapper to use axis instead of fieldRole,
graceful error handling instead of throwing
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Clicking a chart type card now calls useCreateChart to create
a chart instance on the backend and add it to the canvas.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
WidthProvider is not available during SSR. Use dynamic import
inside useEffect to load it only on the client side.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
FastAPI latest rejects 204 with response body.
Use response_class=Response and return Response(status_code=204).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
pip install from pypi.org times out in China network.
Use https://pypi.tuna.tsinghua.edu.cn/simple for both pip and poetry.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
template-service and export-service used [project]+setuptools format
which is incompatible with poetry install in Dockerfile.
Unified to [tool.poetry] + poetry-core build-backend.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Build stage uses network: host so pip can resolve DNS through host.
Removed version: "3.9" (obsolete warning).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
data-service and chart-service have alembic.ini inside alembic/ dir,
not at service root. Remove the separate COPY line.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Previously excluded due to nested .git from create-next-app.
Includes all Clean Architecture layers, API client integration,
and full UI component suite.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>