# JavaScript Gantt Chart | DayPilot Pro for JavaScript Demo

> Read more about [Gantt chart task links](https://doc.daypilot.org/gantt/links/).

## Links

- Canonical HTML: /demo/gantt/links.html
- Source HTML folder: /demo/gantt/
- Catalog root: /demo/
- Catalog: /demo/llms.txt

## Source

### Inline demo script 1

```javascript
var dp = new DayPilot.Gantt("dp");

        dp.days = 30;

        var colors = ["blue", "red", "green", "black"];
        var styles = ["solid", "dotted", "dashed", "double"];

        // generate and load sample tasks
        var start = new DayPilot.Date().getDatePart();
        var last = null;
        for (var i = 0; i < 5; i++) {
            var duration = Math.floor(Math.random() * 3) + 1; // 1 to 3
            var end = start.addDays(duration);

            var e = new DayPilot.Task({
                start: start,
                end: end,
                id: DayPilot.guid(),
                text: "Task " + i,
                box: {
                    linkCreateDisabled: true,
                },
                tags: {
                    info: "info text"
                },
                children: [
                    {
                        start: start,
                        end: end,
                        id: DayPilot.guid(),
                        text: "Subtask 1",
                        complete: Math.floor(Math.random() * 101) // 0 to 100
                    },
                    {
                        start: start,
                        end: end,
                        id: DayPilot.guid(),
                        text: "Subtask 2",
                        complete: Math.floor(Math.random() * 101) // 0 to 100
                    },
                    {
                        start: end,
                        id: DayPilot.guid(),
                        text: "Milestone 1",
                        type: "Milestone"
                    }

                ]
            });

            dp.tasks.add(e);

            if (last) {
                dp.links.add(new DayPilot.Link({
                    id: DayPilot.guid(),  // optional
                    from: last,
                    to: e.id(),
                    width: 2,
                    color: colors[i - 1],
                    style: styles[i - 1],
                    type: "FinishToStart"
                }));
            }
            last = e.id();
            start = end;

        }

        dp.columns = [
            {
                title: "Name",
                width: 50,
                property: "text"
            },
            {
                title: "Info",
                width: 50,
                property: "info"
            },
            {
                title: "Duration",
                width: 50
            }
        ];

        dp.onBeforeRowHeaderRender = function (args) {
            var duration = args.task.duration();
            var html = duration.toString("d") + "d " + duration.toString("h") + "h";
            args.row.columns[2].html = html;
        };


        dp.contextMenuLink = new DayPilot.Menu({
            items: [
                {
                    text: "Show link ID", onClick: function (args) {
                        DayPilot.Modal.alert("Link ID: " + args.source.data.id);
                    }
                },
                {
                    text: "Delete link", onClick: function (args) {
                        dp.links.remove(args.source);
                    }
                }
            ]
        });

        dp.contextMenuTask = new DayPilot.Menu({
            items: [
                {
                    text: "Show task ID", onClick: function (args) {
                        DayPilot.Modal.alert("Task ID: " + args.source.id());
                    }
                },
                {
                    text: "Delete task", onClick: function (args) {
                        dp.tasks.remove(args.source);
                    }
                }
            ]
        });

        dp.contextMenuRow = new DayPilot.Menu({
            items: [
                {
                    text: "Show task ID", onClick: function (args) {
                        DayPilot.Modal.alert("Task ID: " + args.source.id());
                    }
                },
                {
                    text: "Delete task", onClick: function (args) {
                        dp.tasks.remove(args.source);
                    }
                }
            ]
        });


        dp.init();
```

