Skip to content

Commit e9586a4

Browse files
committed
feat: add support for customizable column widths and extra columns in Gantt chart
1 parent bdc8da5 commit e9586a4

File tree

7 files changed

+151
-10
lines changed

7 files changed

+151
-10
lines changed

README.md

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,84 @@ npm start
144144

145145
\*Required
146146

147+
## Extra Columns Support
148+
149+
You can add custom columns to the task list by using the `extraColumns` prop:
150+
151+
```javascript
152+
import { Gantt, Task, ExtraColumn } from 'gantt-task-react';
153+
154+
// Define extra columns
155+
const extraColumns: ExtraColumn[] = [
156+
{
157+
key: "status",
158+
title: "Status",
159+
width: "100px",
160+
},
161+
{
162+
key: "assignee",
163+
title: "Assignee",
164+
width: "120px",
165+
},
166+
{
167+
key: "priority",
168+
title: "Priority",
169+
width: "80px",
170+
render: (task) => (
171+
<span className={`priority-${task.extraColumns?.priority}`}>
172+
{task.extraColumns?.priority}
173+
</span>
174+
),
175+
},
176+
];
177+
178+
// Add extra data to your tasks
179+
const tasks: Task[] = [
180+
{
181+
id: "1",
182+
name: "Task 1",
183+
start: new Date(),
184+
end: new Date(),
185+
progress: 50,
186+
type: "task",
187+
extraColumns: {
188+
status: "In Progress",
189+
assignee: "John Doe",
190+
priority: "High",
191+
},
192+
},
193+
];
194+
195+
<Gantt
196+
tasks={tasks}
197+
extraColumns={extraColumns}
198+
nameColumnWidth="200px"
199+
fromColumnWidth="130px"
200+
toColumnWidth="130px"
201+
/>
202+
```
203+
204+
### ExtraColumn Interface
205+
206+
| Parameter Name | Type | Description |
207+
| :------------- | :-------------------------------------- | :----------------------------------------------------------------------- |
208+
| key\* | string | Unique key for the column, used to access data in task.extraColumns |
209+
| title\* | string | Column header title |
210+
| width | string | Column width (e.g., "100px", "120px"). Defaults to listCellWidth |
211+
| render | `(task: Task) => React.ReactNode` | Optional custom render function for complex column content |
212+
213+
### Column Width Configuration
214+
215+
You can customize the width of the default columns:
216+
217+
| Parameter Name | Type | Description |
218+
| :---------------- | :----- | :----------------------------------------------- |
219+
| nameColumnWidth | string | Width of the Name column (e.g., "200px") |
220+
| fromColumnWidth | string | Width of the From/Start date column (e.g., "130px") |
221+
| toColumnWidth | string | Width of the To/End date column (e.g., "130px") |
222+
223+
\*Required
224+
147225
## License
148226
149227
[MIT](https://oss.ninja/mit/jaredpalmer/)

example/src/ExtraColumnsApp.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ const ExtraColumnsApp: React.FC = () => {
3333
tasks={tasks}
3434
viewMode={view}
3535
extraColumns={extraColumns}
36+
nameColumnWidth="180px"
37+
fromColumnWidth="120px"
38+
toColumnWidth="120px"
3639
onDateChange={(task, _children) => {
3740
console.log("On date change Id:" + task.id);
3841
setTasks(tasks);

src/components/gantt/gantt.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ export const Gantt: React.FunctionComponent<GanttProps> = ({
5959
TaskListHeader = TaskListHeaderDefault,
6060
TaskListTable = TaskListTableDefault,
6161
extraColumns,
62+
nameColumnWidth,
63+
fromColumnWidth,
64+
toColumnWidth,
6265
onDateChange,
6366
onProgressChange,
6467
onDoubleClick,
@@ -448,6 +451,9 @@ export const Gantt: React.FunctionComponent<GanttProps> = ({
448451
setSelectedTask: handleSelectedTask,
449452
onExpanderClick: handleExpanderClick,
450453
extraColumns,
454+
nameColumnWidth,
455+
fromColumnWidth,
456+
toColumnWidth,
451457
TaskListHeader,
452458
TaskListTable,
453459
};

src/components/task-list/task-list-header.tsx

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,19 @@ export const TaskListHeaderDefault: React.FC<{
88
fontFamily: string;
99
fontSize: string;
1010
extraColumns?: ExtraColumn[];
11-
}> = ({ headerHeight, fontFamily, fontSize, rowWidth, extraColumns = [] }) => {
11+
nameColumnWidth?: string;
12+
fromColumnWidth?: string;
13+
toColumnWidth?: string;
14+
}> = ({
15+
headerHeight,
16+
fontFamily,
17+
fontSize,
18+
rowWidth,
19+
extraColumns = [],
20+
nameColumnWidth,
21+
fromColumnWidth,
22+
toColumnWidth
23+
}) => {
1224
return (
1325
<div
1426
className={styles.ganttTable}
@@ -26,7 +38,7 @@ export const TaskListHeaderDefault: React.FC<{
2638
<div
2739
className={styles.ganttTable_HeaderItem}
2840
style={{
29-
minWidth: rowWidth,
41+
minWidth: nameColumnWidth || rowWidth,
3042
}}
3143
>
3244
&nbsp;Name
@@ -41,7 +53,7 @@ export const TaskListHeaderDefault: React.FC<{
4153
<div
4254
className={styles.ganttTable_HeaderItem}
4355
style={{
44-
minWidth: rowWidth,
56+
minWidth: fromColumnWidth || rowWidth,
4557
}}
4658
>
4759
&nbsp;From
@@ -56,7 +68,7 @@ export const TaskListHeaderDefault: React.FC<{
5668
<div
5769
className={styles.ganttTable_HeaderItem}
5870
style={{
59-
minWidth: rowWidth,
71+
minWidth: toColumnWidth || rowWidth,
6072
}}
6173
>
6274
&nbsp;To

src/components/task-list/task-list-table.tsx

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ export const TaskListTableDefault: React.FC<{
3232
setSelectedTask: (taskId: string) => void;
3333
onExpanderClick: (task: Task) => void;
3434
extraColumns?: ExtraColumn[];
35+
nameColumnWidth?: string;
36+
fromColumnWidth?: string;
37+
toColumnWidth?: string;
3538
}> = ({
3639
rowHeight,
3740
rowWidth,
@@ -41,6 +44,9 @@ export const TaskListTableDefault: React.FC<{
4144
locale,
4245
onExpanderClick,
4346
extraColumns = [],
47+
nameColumnWidth,
48+
fromColumnWidth,
49+
toColumnWidth,
4450
}) => {
4551
const toLocaleDateString = useMemo(
4652
() => toLocaleDateStringFactory(locale),
@@ -72,8 +78,8 @@ export const TaskListTableDefault: React.FC<{
7278
<div
7379
className={styles.taskListCell}
7480
style={{
75-
minWidth: rowWidth,
76-
maxWidth: rowWidth,
81+
minWidth: nameColumnWidth || rowWidth,
82+
maxWidth: nameColumnWidth || rowWidth,
7783
}}
7884
title={t.name}
7985
>
@@ -94,17 +100,17 @@ export const TaskListTableDefault: React.FC<{
94100
<div
95101
className={styles.taskListCell}
96102
style={{
97-
minWidth: rowWidth,
98-
maxWidth: rowWidth,
103+
minWidth: fromColumnWidth || rowWidth,
104+
maxWidth: fromColumnWidth || rowWidth,
99105
}}
100106
>
101107
&nbsp;{toLocaleDateString(t.start, dateTimeOptions)}
102108
</div>
103109
<div
104110
className={styles.taskListCell}
105111
style={{
106-
minWidth: rowWidth,
107-
maxWidth: rowWidth,
112+
minWidth: toColumnWidth || rowWidth,
113+
maxWidth: toColumnWidth || rowWidth,
108114
}}
109115
>
110116
&nbsp;{toLocaleDateString(t.end, dateTimeOptions)}

src/components/task-list/task-list.tsx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,18 @@ export type TaskListProps = {
1818
setSelectedTask: (task: string) => void;
1919
onExpanderClick: (task: Task) => void;
2020
extraColumns?: ExtraColumn[];
21+
nameColumnWidth?: string;
22+
fromColumnWidth?: string;
23+
toColumnWidth?: string;
2124
TaskListHeader: React.FC<{
2225
headerHeight: number;
2326
rowWidth: string;
2427
fontFamily: string;
2528
fontSize: string;
2629
extraColumns?: ExtraColumn[];
30+
nameColumnWidth?: string;
31+
fromColumnWidth?: string;
32+
toColumnWidth?: string;
2733
}>;
2834
TaskListTable: React.FC<{
2935
rowHeight: number;
@@ -36,6 +42,9 @@ export type TaskListProps = {
3642
setSelectedTask: (taskId: string) => void;
3743
onExpanderClick: (task: Task) => void;
3844
extraColumns?: ExtraColumn[];
45+
nameColumnWidth?: string;
46+
fromColumnWidth?: string;
47+
toColumnWidth?: string;
3948
}>;
4049
};
4150

@@ -55,6 +64,9 @@ export const TaskList: React.FC<TaskListProps> = ({
5564
taskListRef,
5665
horizontalContainerClass,
5766
extraColumns,
67+
nameColumnWidth,
68+
fromColumnWidth,
69+
toColumnWidth,
5870
TaskListHeader,
5971
TaskListTable,
6072
}) => {
@@ -71,6 +83,9 @@ export const TaskList: React.FC<TaskListProps> = ({
7183
fontSize,
7284
rowWidth,
7385
extraColumns,
86+
nameColumnWidth,
87+
fromColumnWidth,
88+
toColumnWidth,
7489
};
7590
const selectedTaskId = selectedTask ? selectedTask.id : "";
7691
const tableProps = {
@@ -84,6 +99,9 @@ export const TaskList: React.FC<TaskListProps> = ({
8499
setSelectedTask,
85100
onExpanderClick,
86101
extraColumns,
102+
nameColumnWidth,
103+
fromColumnWidth,
104+
toColumnWidth,
87105
};
88106

89107
return (

src/types/public-types.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,9 @@ export interface StylingOption {
136136
fontFamily: string;
137137
fontSize: string;
138138
extraColumns?: ExtraColumn[];
139+
nameColumnWidth?: string;
140+
fromColumnWidth?: string;
141+
toColumnWidth?: string;
139142
}>;
140143
TaskListTable?: React.FC<{
141144
rowHeight: number;
@@ -151,6 +154,9 @@ export interface StylingOption {
151154
setSelectedTask: (taskId: string) => void;
152155
onExpanderClick: (task: Task) => void;
153156
extraColumns?: ExtraColumn[];
157+
nameColumnWidth?: string;
158+
fromColumnWidth?: string;
159+
toColumnWidth?: string;
154160
}>;
155161
}
156162

@@ -160,4 +166,16 @@ export interface GanttProps extends EventOption, DisplayOption, StylingOption {
160166
* Extra columns to display in the task list
161167
*/
162168
extraColumns?: ExtraColumn[];
169+
/**
170+
* Width of the Name column
171+
*/
172+
nameColumnWidth?: string;
173+
/**
174+
* Width of the From column
175+
*/
176+
fromColumnWidth?: string;
177+
/**
178+
* Width of the To column
179+
*/
180+
toColumnWidth?: string;
163181
}

0 commit comments

Comments
 (0)