Vue Gantt

DHTMLX Vue JS Gantt chart is a separate Gantt chart library for your Vue.js application. The library works only with 3.x version of Vue.js.

There are two different products, DHTMLX Gantt and Vue Gantt. While they are very similar in UX, they are very different in API.

Supported functionality

Common with DHTMLX Gantt

  • adding/editing/deleting tasks and links
  • tasks, projects and milestones
  • configurable scales and grids
  • configurable tooltips
  • time markers

Unique features

  • vue widgets can be used for tasks rendering, tooltips and form controls
  • all configuration properties are reactive
  • full vue sources are provided



  • add the vue-gantt library into your Vue.js project by the following command:
npm install @dhtmlx/trial-vue-gantt

This command will install the Trial version, for Commercial one, use "@dhx/vue-gantt".

  • place the Gantt tag into the desired page:
import { Gantt, DefaultTheme } from "@dhtmlx/trial-vue-gantt";
export default function GanttBasic() {
    return (
            <Gantt />

You can check the demo of our minimal project here. You will find the source code of the gantt in the node_modules/@dhtmlx/trial-vue-gantt/src folder.


The vue-gantt package includes two predefined themes - Default and Material.

You can apply the desired theme by wrapping Gantt into the DefaultTheme or MaterialTheme tags:

        <Gantt />
        <Gantt />

or you can just add the theme tag on the page and add a skin class into one of the parent tags of Gantt:

    <DefaultTheme />
    <MaterialTheme />
    <div class="wx-default">
        <Gantt />
    <div class="wx-material">
        <Gantt />


You can define scales/columns/tasks/links during Gantt initialization:

<Gantt :scales="scales" :columns="columns" :tasks="tasks" :links="links" />

where data may look like this:

const scales = [
    { unit: "month", step: 1, format: "MMMM yyy" },
    { unit: "day", step: 1, format: "d" },
const columns = [
    { name: "text", label: "Task name", width: "100%" },
    { name: "start", label: "Start time", align: "center" },
    { name: "duration", label: "Duration", width: "70px", align: "center" },
    { name: "add-task", label: "", width: "50px", align: "center" },
const tasks = [
        id: 1,
        open: true,
        start_date: "2020-11-06",
        duration: 8,
        text: "vue Gantt Widget",
        progress: 60,
        type: "project",
        id: 2,
        parent: 1,
        start_date: "2020-11-06",
        duration: 4,
        text: "Lib-Gantt",
        progress: 80,
const links = [{ source: 2, target: 1, type: 0 }];

Integration with backend

Let's take a look at GanttBackend.vue.

Code defines the action handler through the save event. This event will be triggered on any update and may be used to save changes to the persistent storage.

In the above example, the RestDataProvider is used. You are not limited to this solution, though, and can extend the provided class or define a custom handler.

We provide you with 2 demo backends:

Again, you are not limited to this solution. The above RestDataProvider can work with any REST like service and you can implement a fully custom solution (sockets, graphql, etc.) through a custom save event.


The following elements can be customized via templates:

  • task text
  • sidebar form

–°heck the code example here.

  • tooltip content

–°heck the code example here.



// templates for different elements of gantt
let templates = {};
// array of markers
let markers = [];
// supported task types
let taskTypes = ["task", "project", "milestone"];
// tasks data
let tasks = [];
// links data
let links = [];
// time scales configuration
let scales = [
    { unit: "month", step: 1, format: "MMMM yyy" },
    { unit: "day", step: 1, format: "d" },
// grid configuration
let columns = [
    { name: "text", label: "Task name", width: "100%" },
    { name: "add-task", label: "", width: "50px", align: "center" },
// time scale start
let start = null;
// time scale end
let end = null;
// width of scale cell
let cellWidth = 100;
// height of chart bar
let cellHeight = 38;
// height of scale cell
let scaleHeight = 30;
// read-only mode flag
let readonly = false;
// show or hide grid
let grid = true;
// show or hide tooltips
let tooltip = null;
// show or hide borders in the chart area
let borders = "full";


// will be called with DataStore value on Gantt initialization
let store = null;
// will be called on any action in the Gantt
let actions = null;
// will be called on any data modification in the Gantt
let save = null;


Data modifications ( both action and save events )

  • add-link
  • update-link
  • delete-link
  • add-task
  • update-task
  • delete-task

UI State ( action event )

  • data-request
  • hide-details
  • move-task
  • scroll-chart
  • select-task
  • show-details
  • task-toggle
  • update-task-time

Example of event usage

function handler({ action, obj, id }){
    if (action === "select-task")
        console.log(`Task ${id} was selected`);
<Gantt @action="handler"/>


Retrieve the store object:

let store;
<Gantt @store="v => store = v" />

and now you can use the store's API to get or modify data:

interface IStore {
    getTask(id: number): GanttItemData;
    updateTask(id: number, obj: any, noSave: boolean): void;
    updateLink(id: number, obj: any, noSave: boolean): void;
        id: number,
        action: string,
        obj: StringHash<any>,
        noSave?: boolean
    ): number;

The action method can be used to trigger any of the above actions:

store.action(taskId, "tasks-toggle");
store.action(linkId, "delete-link");
store.action(null, "add-link", { source: 1, target: 2, type: 0 });
Back to top