Zooming in Vue Gantt component
11 Jun 202424 minutes to read
The zooming support provides options to increase or decrease the width of timeline cells and also provides options to change the timeline units dynamically. This support enables you to view the tasks in a project clearly from minute to decade timespan. To enable the zooming features, define the ZoomIn
, ZoomOut
, and ZoomToFit
items to toolbar items collections, and this action can be performed on external actions such as button click using the zoomIn
, zoomOut
, and fitToProject
built-in methods. The following zooming options are available to view the project:
Zoom in
This support is used to increase the timeline width and timeline unit from years to minutestimespan. When the ZoomIn
icon was clicked, the timeline cell width is increased when the cellsize exceeds the specified range and the timeline unit is changed based on the current zoom levels.
Zoom out
This support is used to increase the timeline width and timeline unit from minutes to years timespan. When the ZoomOut
icon was clicked, the timeline cell width is decreased when the cell size falls behind the specified range and the timeline view mode is changed based on the current zooming levels.
Zoom to fit
This support is used to view all the tasks available in a project within available area on the chart part of Gantt. When users click the ZoomToFit
icon, then all the tasks are rendered within the available chart container width.
<template>
<div>
<ejs-gantt ref='gantt' id="GanttContainer" :dataSource="data" :taskFields = "taskFields" :height = "height" :toolbar="toolbar"></ejs-gantt>
</div>
</template>
<script setup>
import { provide } from "vue";
import { GanttComponent as EjsGantt, Toolbar } from "@syncfusion/ej2-vue-gantt";
import { projectNewData } from './data-source.js';
const data = projectNewData;
const height = '450px';
const taskFields = {
id: 'TaskID',
name: 'TaskName',
startDate: 'StartDate',
duration: 'Duration',
progress: 'Progress',
dependency: 'Predecessor',
child: 'subtasks'
};
const toolbar = ['ZoomIn','ZoomOut','ZoomToFit'];
provide('gantt', [Toolbar ]);
</script>
<template>
<div>
<ejs-gantt ref='gantt' id="GanttContainer" :dataSource="data" :taskFields = "taskFields" :height = "height" :toolbar="toolbar"></ejs-gantt>
</div>
</template>
<script>
import { GanttComponent, Toolbar } from "@syncfusion/ej2-vue-gantt";
import { projectNewData } from './data-source.js';
export default {
name: "App",
components: {
"ejs-gantt":GanttComponent
},
data: function() {
return{
data: projectNewData,
height: '450px',
taskFields: {
id: 'TaskID',
name: 'TaskName',
startDate: 'StartDate',
duration: 'Duration',
progress: 'Progress',
dependency: 'Predecessor',
child: 'subtasks'
},
toolbar: ['ZoomIn','ZoomOut','ZoomToFit'],
};
},
provide: {
gantt: [Toolbar ]
}
};
</script>
Customizing zooming levels
In Gantt, the zoom in and zoom out actions are performed based on the predefined zooming levels in the zoomingLevels
property. You can customize the zooming actions by defining the required zooming collection to the zoomingLevels
property.
<template>
<div>
<ejs-gantt ref='gantt' id="GanttContainer" :dataSource="data" :dataBound="dataBound" :taskFields = "taskFields" :height = "height" :toolbar="toolbar"></ejs-gantt>
</div>
</template>
<script setup>
import { provide, ref } from "vue";
import { GanttComponent as EjsGantt, Toolbar } from "@syncfusion/ej2-vue-gantt";
import { projectNewData } from './data-source.js';
let customZoomingLevels = [{
topTier: { unit: 'Month', format: 'MMM, yy', count: 1 },
bottomTier: { unit: 'Week', format: 'dd', count: 1 }, timelineUnitSize: 33, level: 0,
timelineViewMode: 'Month', weekStartDay: 0, updateTimescaleView: true, weekendBackground: null, showTooltip: true
},
{
topTier: { unit: 'Month', format: 'MMM, yyyy', count: 1 },
bottomTier: { unit: 'Week', format: 'dd MMM', count: 1 }, timelineUnitSize: 66, level: 1,
timelineViewMode: 'Month', weekStartDay: 0, updateTimescaleView: true, weekendBackground: null, showTooltip: true
},
{
topTier: { unit: 'Month', format: 'MMM, yyyy', count: 1 },
bottomTier: { unit: 'Week', format: 'dd MMM', count: 1 }, timelineUnitSize: 99, level: 2,
timelineViewMode: 'Month', weekStartDay: 0, updateTimescaleView: true, weekendBackground: null, showTooltip: true
},
{
topTier: { unit: 'Week', format: 'MMM dd, yyyy', count: 1 },
bottomTier: { unit: 'Day', format: 'd', count: 1 }, timelineUnitSize: 33, level: 3,
timelineViewMode: 'Week', weekStartDay: 0, updateTimescaleView: true, weekendBackground: null, showTooltip: true
},
{
topTier: { unit: 'Week', format: 'MMM dd, yyyy', count: 1 },
bottomTier: { unit: 'Day', format: 'd', count: 1 }, timelineUnitSize: 66, level: 4,
timelineViewMode: 'Week', weekStartDay: 0, updateTimescaleView: true, weekendBackground: null, showTooltip: true
},
{
topTier: { unit: 'Day', format: 'E dd yyyy', count: 1 },
bottomTier: { unit: 'Hour', format: 'hh a', count: 12 }, timelineUnitSize: 66, level: 5,
timelineViewMode: 'Day', weekStartDay: 0, updateTimescaleView: true, weekendBackground: null, showTooltip: true
},
{
topTier: { unit: 'Day', format: 'E dd yyyy', count: 1 },
bottomTier: { unit: 'Hour', format: 'hh a', count: 6 }, timelineUnitSize: 99, level: 6,
timelineViewMode: 'Day', weekStartDay: 0, updateTimescaleView: true, weekendBackground: null, showTooltip: true
},
];
const gantt = ref(null);
const data = projectNewData;
const height = '450px';
const taskFields = {
id: 'TaskID',
name: 'TaskName',
startDate: 'StartDate',
duration: 'Duration',
progress: 'Progress',
dependency: 'Predecessor',
child: 'subtasks'
};
const toolbar = ['ZoomIn','ZoomOut','ZoomToFit'];
const dataBound = function () {
var ganttObj = gantt.value.ej2Instances;
ganttObj.zoomingLevels = customZoomingLevels;
};
provide('gantt', [Toolbar ]);
</script>
<template>
<div>
<ejs-gantt ref='gantt' id="GanttContainer" :dataSource="data" :dataBound="dataBound" :taskFields = "taskFields" :height = "height" :toolbar="toolbar"></ejs-gantt>
</div>
</template>
<script>
import { GanttComponent, Toolbar } from "@syncfusion/ej2-vue-gantt";
import { projectNewData } from './data-source.js';
let customZoomingLevels = [{
topTier: { unit: 'Month', format: 'MMM, yy', count: 1 },
bottomTier: { unit: 'Week', format: 'dd', count: 1 }, timelineUnitSize: 33, level: 0,
timelineViewMode: 'Month', weekStartDay: 0, updateTimescaleView: true, weekendBackground: null, showTooltip: true
},
{
topTier: { unit: 'Month', format: 'MMM, yyyy', count: 1 },
bottomTier: { unit: 'Week', format: 'dd MMM', count: 1 }, timelineUnitSize: 66, level: 1,
timelineViewMode: 'Month', weekStartDay: 0, updateTimescaleView: true, weekendBackground: null, showTooltip: true
},
{
topTier: { unit: 'Month', format: 'MMM, yyyy', count: 1 },
bottomTier: { unit: 'Week', format: 'dd MMM', count: 1 }, timelineUnitSize: 99, level: 2,
timelineViewMode: 'Month', weekStartDay: 0, updateTimescaleView: true, weekendBackground: null, showTooltip: true
},
{
topTier: { unit: 'Week', format: 'MMM dd, yyyy', count: 1 },
bottomTier: { unit: 'Day', format: 'd', count: 1 }, timelineUnitSize: 33, level: 3,
timelineViewMode: 'Week', weekStartDay: 0, updateTimescaleView: true, weekendBackground: null, showTooltip: true
},
{
topTier: { unit: 'Week', format: 'MMM dd, yyyy', count: 1 },
bottomTier: { unit: 'Day', format: 'd', count: 1 }, timelineUnitSize: 66, level: 4,
timelineViewMode: 'Week', weekStartDay: 0, updateTimescaleView: true, weekendBackground: null, showTooltip: true
},
{
topTier: { unit: 'Day', format: 'E dd yyyy', count: 1 },
bottomTier: { unit: 'Hour', format: 'hh a', count: 12 }, timelineUnitSize: 66, level: 5,
timelineViewMode: 'Day', weekStartDay: 0, updateTimescaleView: true, weekendBackground: null, showTooltip: true
},
{
topTier: { unit: 'Day', format: 'E dd yyyy', count: 1 },
bottomTier: { unit: 'Hour', format: 'hh a', count: 6 }, timelineUnitSize: 99, level: 6,
timelineViewMode: 'Day', weekStartDay: 0, updateTimescaleView: true, weekendBackground: null, showTooltip: true
},
];
export default {
name: "App",
components: {
"ejs-gantt":GanttComponent
},
data: function() {
return{
data: projectNewData,
height: '450px',
taskFields: {
id: 'TaskID',
name: 'TaskName',
startDate: 'StartDate',
duration: 'Duration',
progress: 'Progress',
dependency: 'Predecessor',
child: 'subtasks'
},
toolbar: ['ZoomIn','ZoomOut','ZoomToFit'],
dataBound: function () {
var ganttObj = document.getElementById('GanttContainer').ej2_instances[0];
ganttObj.zoomingLevels = customZoomingLevels;
},
};
},
provide: {
gantt: [Toolbar ]
}
};
</script>
Zoom action by methods
You can perform the various zoom actions dynamically or on external click action using the following methods:
- Zoom in -
zoomIn
- Zoom out -
zoomOut
- Fit to project -
fitToProject
<template>
<div>
<ejs-button id="zoomIn" cssClass="e-info" v-on:click="zoomIn">ZoomIn</ejs-button>
<ejs-button id="zoomOut" cssClass="e-info" v-on:click="zoomOut">ZoomOut</ejs-button>
<ejs-button id="fitToProject" cssClass="e-info" v-on:click="fitToProject">FitToProject</ejs-button>
<ejs-gantt ref='gantt' id="GanttContainer" :dataSource="data" :taskFields = "taskFields" :height = "height"></ejs-gantt>
</div>
</template>
<script setup>
import { ref } from "vue";
import { GanttComponent as EjsGantt } from "@syncfusion/ej2-vue-gantt";
import { ButtonComponent as EjsButton } from "@syncfusion/ej2-vue-buttons";
import { projectNewData } from './data-source.js';
const gantt = ref(null);
const data = projectNewData;
const height = '450px';
const taskFields = {
id: 'TaskID',
name: 'TaskName',
startDate: 'StartDate',
duration: 'Duration',
progress: 'Progress',
dependency: 'Predecessor',
child: 'subtasks'
};
const zoomIn = function(){
gantt.value.zoomIn();
};
const zoomOut = function(){
gantt.value.zoomOut();
};
const fitToProject = function(){
gantt.value.fitToProject();
};
</script>
<template>
<div>
<ejs-button id="zoomIn" cssClass="e-info" v-on:click="zoomIn">ZoomIn</ejs-button>
<ejs-button id="zoomOut" cssClass="e-info" v-on:click="zoomOut">ZoomOut</ejs-button>
<ejs-button id="fitToProject" cssClass="e-info" v-on:click="fitToProject">FitToProject</ejs-button>
<ejs-gantt ref='gantt' id="GanttContainer" :dataSource="data" :taskFields = "taskFields" :height = "height"></ejs-gantt>
</div>
</template>
<script>
import { GanttComponent } from "@syncfusion/ej2-vue-gantt";
import { ButtonComponent } from "@syncfusion/ej2-vue-buttons";
import { projectNewData } from './data-source.js';
export default {
name: "App",
components: {
"ejs-button":ButtonComponent,
"ejs-gantt":GanttComponent
},
data: function() {
return{
data: projectNewData,
height: '450px',
taskFields: {
id: 'TaskID',
name: 'TaskName',
startDate: 'StartDate',
duration: 'Duration',
progress: 'Progress',
dependency: 'Predecessor',
child: 'subtasks'
}
};
},
methods: {
zoomIn: function(){
this.$refs.gantt.zoomIn();
},
zoomOut: function(){
this.$refs.gantt.zoomOut();
},
fitToProject: function(){
this.$refs.gantt.fitToProject();
}
},
};
</script>