laif-ds
Version:
Design System di Laif con componenti React basati su principi di Atomic Design
123 lines (92 loc) • 3.89 kB
Markdown
# GanttChart
## Overview
Composable Gantt chart with a tree, time scale, and draggable bars. Built as a root `Gantt` component with subcomponents `Gantt.Controls` and `Gantt.Chart`. Supports zoom dimensions, drag step sizes, programmatic callbacks, and custom left-render content for items.
---
## Components & Props
### Gantt (root)
| Prop | Type | Default | Description |
| --------------------- | -------------------------------------- | ---------------------- | ----------- |
| `children` | `React.ReactNode` | — | Compose `Gantt.Controls` and `Gantt.Chart`. |
| `draggable` | `boolean` | `false` | Enable dragging/resizing of bars. |
| `defaultDimension` | `GanttDimensions` | `GanttDimensions.HOUR` | Initial zoom (hour, day, etc.). |
| `defaultDragStepSize` | `DragStepSizes` | `DragStepSizes.THIRTY_MIN` | Initial drag step. |
| `treeTitle` | `string` | `"Attività"` | Title of the left tree column. |
See `enums` in `ui/gantt/enums/` for `GanttDimensions` and `DragStepSizes` values.
### Gantt.Chart
| Prop | Type | Default | Description |
| ----------------- | --------------------------- | ----------- | ----------- |
| `data` | `GanttDataType[]` | **required**| Items to render (with optional nested children). |
| `className` | `string` | `undefined` | Wrapper classes. |
| `onBarDoubleClick`| `(bar) => void` | `undefined` | Invoked on item double click. |
| `onBarChange` | `(bar, newData) => void` | `undefined` | Invoked after drag/resize changes. |
### Gantt.Controls
| Prop | Type | Default | Description |
| ----------- | -------- | ----------- | ----------- |
| `className` | `string` | `undefined` | Toolbar wrapper classes. |
---
## Data Types
Minimal item structure (`ui/gantt/types/GanttData.tsx`):
```ts
type RawGanttDataType = {
key: string
title: string
color?: string
data?: BarItemDataType // Repeat or fixed datetime interval
children?: GanttDataType[] // Nested items
leftRender?: React.ReactNode | ((bar) => React.ReactNode)
}
type NoRepeatDataType = { startDate: string; endDate: string }
type RepeatDataType = {
repeatType: DataRepeatTypes
fromTime: number
toTime: number
fromDate?: string
toDate?: string
weekdays?: number[]
monthdays?: number[]
}
```
---
## Examples
### Default
```tsx
import Gantt from "laif-ds/ui/gantt/components/Gantt/Gantt";
export function Basic() {
return (
<div className="h-[500px]">
<Gantt>
<Gantt.Controls />
<Gantt.Chart data={sampleData} />
</Gantt>
</div>
);
}
```
### Draggable + Defaults
```tsx
import { GanttDimensions, DragStepSizes } from "laif-ds/ui/gantt/enums";
export function Draggable() {
return (
<div className="h-[500px]">
<Gantt draggable defaultDimension={GanttDimensions.DAY} defaultDragStepSize={DragStepSizes.ONE_DAY}>
<Gantt.Controls />
<Gantt.Chart data={sampleData} />
</Gantt>
</div>
);
}
```
### Custom Tree Title
```tsx
<div className="h-[500px]">
<Gantt draggable treeTitle="Progetti">
<Gantt.Controls />
<Gantt.Chart data={sampleData} />
</Gantt>
</div>
```
---
## Notes
- **Virtualization**: Tree, bars, and scale use windowed lists for performance.
- **Current time**: Auto-updates while scrolling to keep the date indicator in sync.
- **Left render**: Use `leftRender` to inject icons/actions next to item titles.