delon-chart by aiskillstore
@delon/chart skill - G2Plot enterprise charting components with @delon/chart. For ng-events construction site progress tracking system.
Content & Writing
85 Stars
2 Forks
Updated Jan 19, 2026, 04:39 AM
Why Use This
This skill provides specialized capabilities for aiskillstore's codebase.
Use Cases
- Developing new features in the aiskillstore repository
- Refactoring existing code to follow aiskillstore standards
- Understanding and working with aiskillstore's codebase structure
Install Guide
2 steps- 1
Skip this step if Ananke is already installed.
- 2
Skill Snapshot
Auto scan of skill assets. Informational only.
Valid SKILL.md
Checks against SKILL.md specification
Source & Community
Skill Stats
SKILL.md 395 Lines
Total Files 1
Total Size 0 B
License NOASSERTION
---
name: delon-chart
description: '@delon/chart skill - G2Plot enterprise charting components with @delon/chart. For ng-events construction site progress tracking system.'
---
# @delon/chart - Enterprise Chart Components
Trigger patterns: "chart", "graph", "visualization", "@delon/chart", "G2Plot", "G2"
## Overview
@delon/chart provides enterprise-grade charting components built on G2Plot for data visualization in ng-alain applications.
**Package**: @delon/chart@20.1.0
**Dependencies**: @ant-design/charts (G2Plot wrapper)
## Core Components
### 1. chart-card - Chart Card Container
```typescript
import { ChartCardComponent } from '@delon/chart/chart-card';
<chart-card
[title]="'進度統計'"
[total]="totalTasks()"
[action]="action"
[footer]="footer"
>
<trend flag="up" style="margin-right: 16px;">
<span>週成長</span><span>12%</span>
</trend>
<trend flag="down">
<span>日成長</span><span>11%</span>
</trend>
</chart-card>
```
**Features**:
- Title, total, action, footer slots
- Integrated trend indicators
- Responsive layout
- Loading states
### 2. g2-bar - Bar Charts
```typescript
import { G2BarComponent } from '@delon/chart/bar';
@Component({
standalone: true,
imports: [G2BarComponent],
template: `
<g2-bar
[data]="barData()"
[height]="300"
[padding]="[20, 40, 50, 40]"
/>
`
})
export class TaskChartComponent {
barData = signal([
{ x: '待辦', y: 12 },
{ x: '進行中', y: 8 },
{ x: '已完成', y: 25 }
]);
}
```
**Options**:
- `height` (number) - Chart height in pixels
- `padding` (number[]) - [top, right, bottom, left]
- `color` (string) - Bar color
- `autoLabel` (boolean) - Auto label positioning
### 3. g2-mini-bar - Mini Bar Charts (Sparkline)
```typescript
<g2-mini-bar
[data]="miniData()"
[height]="50"
[color]="'#1890ff'"
/>
miniData = signal([
{ x: '2024-01', y: 5 },
{ x: '2024-02', y: 8 },
{ x: '2024-03', y: 12 }
]);
```
### 4. g2-pie - Pie/Donut Charts
```typescript
import { G2PieComponent } from '@delon/chart/pie';
<g2-pie
[data]="pieData()"
[height]="300"
[hasLegend]="true"
[subTitle]="'總任務數'"
[total]="totalTasks()"
[inner]="0.8"
/>
pieData = signal([
{ x: '待辦', y: 12 },
{ x: '進行中', y: 8 },
{ x: '已完成', y: 25 }
]);
```
**Options**:
- `inner` (number) - 0-1, 0=pie, >0=donut
- `hasLegend` (boolean) - Show legend
- `subTitle` (string) - Center subtitle
- `total` (string) - Center total display
### 5. g2-radar - Radar Charts
```typescript
import { G2RadarComponent } from '@delon/chart/radar';
<g2-radar
[data]="radarData()"
[height]="300"
[hasLegend]="true"
/>
radarData = signal([
{ name: '設計', label: '計畫', value: 85 },
{ name: '設計', label: '執行', value: 70 },
{ name: '開發', label: '計畫', value: 90 },
{ name: '開發', label: '執行', value: 80 }
]);
```
### 6. timeline - Timeline Charts
```typescript
import { TimelineComponent } from '@delon/chart/timeline';
<timeline
[data]="timelineData()"
[title]="'施工進度'"
[maxAxis]="5"
/>
timelineData = signal([
{ x: new Date('2024-01-01'), y1: 10, y2: 20 },
{ x: new Date('2024-02-01'), y1: 15, y2: 25 },
{ x: new Date('2024-03-01'), y1: 20, y2: 30 }
]);
```
### 7. trend - Trend Indicator
```typescript
import { TrendComponent } from '@delon/chart/trend';
<trend flag="up">
<span>週成長</span>
<span class="pl-sm">12%</span>
</trend>
<trend flag="down" colorful="false">
<span>日成長</span>
<span class="pl-sm">11%</span>
</trend>
```
**Flags**: `up` | `down`
**Colorful**: `true` (green/red) | `false` (gray)
## Real-World Examples
### Dashboard Stats with Charts
```typescript
import { Component, signal, computed, inject } from '@angular/core';
import { ChartCardComponent } from '@delon/chart/chart-card';
import { G2BarComponent } from '@delon/chart/bar';
import { G2PieComponent } from '@delon/chart/pie';
import { TrendComponent } from '@delon/chart/trend';
import { TaskService } from '@core/services/task.service';
@Component({
selector: 'app-dashboard',
standalone: true,
imports: [
ChartCardComponent,
G2BarComponent,
G2PieComponent,
TrendComponent
],
template: `
<div nz-row [nzGutter]="24">
<div nz-col [nzXl]="6" [nzLg]="12" [nzMd]="12" [nzSm]="24">
<chart-card
[title]="'總任務數'"
[total]="totalTasks()"
contentHeight="46px"
>
<trend flag="up" style="margin-right: 16px;">
<span>週成長</span><span>{{ weeklyGrowth() }}%</span>
</trend>
</chart-card>
</div>
<div nz-col [nzSpan]="24">
<nz-card [nzTitle]="'任務狀態分佈'">
<g2-bar
[data]="taskStatusData()"
[height]="300"
[padding]="[20, 40, 50, 60]"
/>
</nz-card>
</div>
<div nz-col [nzSpan]="12">
<nz-card [nzTitle]="'任務類型比例'">
<g2-pie
[data]="taskTypeData()"
[height]="300"
[hasLegend]="true"
[inner]="0.6"
[total]="totalTasks()"
/>
</nz-card>
</div>
</div>
`
})
export class DashboardComponent {
private taskService = inject(TaskService);
// Signals for reactive data
tasks = this.taskService.tasks;
totalTasks = computed(() => this.tasks().length);
weeklyGrowth = computed(() => {
// Calculate growth percentage
const thisWeek = this.tasks().filter(t =>
this.isThisWeek(t.createdAt)
).length;
const lastWeek = this.tasks().filter(t =>
this.isLastWeek(t.createdAt)
).length;
return lastWeek > 0 ?
Math.round((thisWeek - lastWeek) / lastWeek * 100) : 0;
});
taskStatusData = computed(() => [
{ x: '待辦', y: this.tasks().filter(t => t.status === 'pending').length },
{ x: '進行中', y: this.tasks().filter(t => t.status === 'in-progress').length },
{ x: '已完成', y: this.tasks().filter(t => t.status === 'completed').length }
]);
taskTypeData = computed(() => [
{ x: '設計', y: this.tasks().filter(t => t.type === 'design').length },
{ x: '開發', y: this.tasks().filter(t => t.type === 'development').length },
{ x: '測試', y: this.tasks().filter(t => t.type === 'testing').length }
]);
private isThisWeek(date: Date): boolean {
const now = new Date();
const weekStart = new Date(now.setDate(now.getDate() - now.getDay()));
return date >= weekStart;
}
private isLastWeek(date: Date): boolean {
const now = new Date();
const weekStart = new Date(now.setDate(now.getDate() - now.getDay() - 7));
const weekEnd = new Date(now.setDate(now.getDate() - now.getDay()));
return date >= weekStart && date < weekEnd;
}
}
```
## Best Practices
### 1. Use Signals for Reactive Charts
✅ **DO**:
```typescript
chartData = computed(() =>
this.tasks().map(t => ({ x: t.name, y: t.value }))
);
```
❌ **DON'T**:
```typescript
chartData: any[] = [];
ngOnInit() {
this.taskService.getTasks().subscribe(tasks => {
this.chartData = tasks.map(t => ({ x: t.name, y: t.value }));
});
}
```
### 2. Responsive Chart Heights
✅ **DO**:
```typescript
@Component({
template: `
<g2-bar
[data]="data()"
[height]="isMobile() ? 200 : 300"
/>
`
})
```
### 3. Loading States
✅ **DO**:
```typescript
@if (loading()) {
<nz-spin nzSimple />
} @else if (chartData().length > 0) {
<g2-bar [data]="chartData()" />
} @else {
<nz-empty nzNotFoundContent="沒有資料" />
}
```
## Performance Tips
1. **Data Transformation**: Transform data in computed signals, not in templates
2. **Chart Reuse**: Reuse chart components with different data props
3. **Lazy Loading**: Load chart module only when needed
4. **Height Optimization**: Use fixed heights for better performance
5. **Data Limits**: Limit chart data points (recommend < 100 for bar/pie)
## Integration Checklist
- [ ] Install @delon/chart@20.1.0
- [ ] Import chart components in standalone components
- [ ] Use signals for reactive chart data
- [ ] Handle loading and empty states
- [ ] Set responsive chart heights
- [ ] Add proper TypeScript types for chart data
- [ ] Test with empty/large datasets
- [ ] Optimize data transformation with computed()
## Anti-Patterns
❌ **Mutating Chart Data Directly**:
```typescript
this.chartData.push({ x: 'new', y: 10 }); // Won't trigger change detection
```
✅ **Use Signal Updates**:
```typescript
this.chartData.update(data => [...data, { x: 'new', y: 10 }]);
```
---
❌ **Complex Logic in Templates**:
```typescript
<g2-bar [data]="tasks.filter(t => t.status === 'completed').map(t => ({x: t.name, y: t.value}))" />
```
✅ **Use Computed Signals**:
```typescript
completedTasksData = computed(() =>
this.tasks()
.filter(t => t.status === 'completed')
.map(t => ({ x: t.name, y: t.value }))
);
```
## Cross-References
- **ng-alain-component** - ST Table for data tables
- **delon-theme** - Page layout and theme customization
- **angular-component** - Signals and computed for reactive charts
- `.github/instructions/angular.instructions.md` - Angular 20 patterns
## Package Information
- **Version**: 20.1.0
- **Repository**: https://github.com/ng-alain/delon
- **Documentation**: https://ng-alain.com/chart
---
**Version**: 1.0
**Created**: 2025-12-25
**Maintainer**: ng-events(GigHub) Development Team
Name Size