$(() => {
$('#gantt').dxGantt({
taskTitlePosition: 'outside',
scaleType: 'days',
tasks: {
dataSource: tasks,
},
dependencies: {
dataSource: dependencies,
},
resources: {
dataSource: resources,
},
resourceAssignments: {
dataSource: resourceAssignments,
},
editing: {
enabled: true,
},
columns: [{
dataField: 'title',
caption: 'Subject',
width: 300,
}, {
dataField: 'start',
caption: 'Start Date',
}, {
dataField: 'end',
caption: 'End Date',
}],
taskListWidth: 500,
taskContentTemplate: getTaskContentTemplate,
}).dxGantt('instance');
function getImagePath(taskId) {
const imgPath = '../../../../images/employees/';
let img = taskId < 10 ? `0${taskId}` : taskId;
img = `${imgPath + img}.png`;
return img;
}
function getTaskContentTemplate(item) {
const resource = item.taskResources[0];
const img = getImagePath(item.taskData.id);
const color = item.taskData.id % 6;
const taskWidth = `${item.taskSize.width}px;`;
const $customContainer = $(document.createElement('div'))
.addClass('custom-task')
.attr('style', `width:${taskWidth}`)
.addClass(`custom-task-color-${color}`);
const $imgWrapper = $(document.createElement('div'))
.addClass('custom-task-img-wrapper')
.appendTo($customContainer);
$(document.createElement('img'))
.addClass('custom-task-img')
.attr({
src: resource ? img : 'unknown.png',
alt: 'imageAlt',
})
.appendTo($imgWrapper);
const $wrapper = $(document.createElement('div'))
.addClass('custom-task-wrapper')
.appendTo($customContainer);
$(document.createElement('div'))
.addClass('custom-task-title')
.text(item.taskData.title)
.appendTo($wrapper);
$(document.createElement('div'))
.addClass('custom-task-row')
.text(resource ? resource.text : '')
.appendTo($wrapper);
$(document.createElement('div'))
.addClass('custom-task-progress')
.attr('style', `width:${parseFloat(item.taskData.progress)}%;`)
.appendTo($customContainer);
return $customContainer;
}
});
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>DevExtreme Demo</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>window.jQuery || document.write(decodeURIComponent('%3Cscript src="js/jquery.min.js"%3E%3C/script%3E'))</script>
<script src="https://cdn3.devexpress.com/jslib/22.2.6/js/dx-gantt.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/22.2.6/css/dx.light.css" />
<link rel="stylesheet" href="https://cdn3.devexpress.com/jslib/22.2.6/css/dx-gantt.min.css" />
<script src="https://cdn3.devexpress.com/jslib/22.2.6/js/dx.all.js"></script>
<script src="data.js"></script>
<link rel="stylesheet" type="text/css" href="styles.css" />
<script src="index.js"></script>
</head>
<body class="dx-viewport">
<div class="demo-container">
<div id="gantt"> </div>
</div>
</body>
</html>
#gantt {
height: 700px;
}
.custom-task-color-0 {
background-color: #5c57c9;
}
.custom-task-color-1 {
background-color: #35b86b;
}
.custom-task-color-2 {
background-color: #4796ce;
}
.custom-task-color-3 {
background-color: #ce4776;
}
.custom-task-color-4 {
background-color: #ce5b47;
}
.custom-task-color-5 {
background-color: #f78119;
}
.custom-task-color-6 {
background-color: #9f47ce;
}
.custom-task {
max-height: 48px;
height: 100%;
display: block;
overflow: hidden;
}
.custom-task-wrapper {
padding: 8px;
color: #fff;
}
.custom-task-wrapper > * {
display: block;
overflow: hidden;
text-overflow: ellipsis;
}
.custom-task-img-wrapper {
float: left;
width: 32px;
height: 32px;
border-radius: 50%;
margin: 8px;
background-color: #fff;
overflow: hidden;
}
.custom-task-img {
width: 32px;
}
.custom-task-title {
font-weight: 600;
font-size: 13px;
}
.custom-task-row {
font-size: 11px;
}
.custom-task-progress {
position: absolute;
left: 0;
bottom: 0;
width: 0%;
height: 4px;
background: rgba(0, 0, 0, 0.3);
}
.dx-gantt .dx-row {
height: 63px;
}
const currentDate = new Date(Date.now());
const month = currentDate.getMonth();
const year = currentDate.getFullYear();
const tasks = [{
id: 1,
parentId: 0,
title: 'Analysis/Software Requirements',
start: new Date(year, month, 1),
end: new Date(year, month, 28),
progress: 31,
}, {
id: 2,
parentId: 1,
title: 'Conduct needs analysis',
start: new Date(year, month, 1),
end: new Date(year, month, 3),
progress: 15,
}, {
id: 3,
parentId: 1,
title: 'Draft preliminary software specifications',
start: new Date(year, month, 3),
end: new Date(year, month, 5),
progress: 30,
}, {
id: 4,
parentId: 1,
title: 'Review software specifications/budget with team',
start: new Date(year, month, 4),
end: new Date(year, month, 6),
progress: 60,
}, {
id: 5,
parentId: 1,
title: 'Incorporate feedback on software specifications',
start: new Date(year, month, 6),
end: new Date(year, month, 8),
progress: 45,
}, {
id: 6,
parentId: 1,
title: 'Develop delivery timeline',
start: new Date(year, month, 8),
end: new Date(year, month, 14),
progress: 15,
}, {
id: 7,
parentId: 1,
title: 'Obtain approvals to proceed (concept, timeline, budget)',
start: new Date(year, month, 14),
end: new Date(year, month, 20),
progress: 15,
}, {
id: 8,
parentId: 1,
title: 'Draft preliminary software specifications',
start: new Date(year, month, 20),
end: new Date(year, month, 25),
progress: 0,
}, {
id: 9,
parentId: 1,
title: 'Secure required resources',
start: new Date(year, month, 25),
end: new Date(year, month, 28),
progress: 0,
},
];
const dependencies = [{
id: 1,
predecessorId: 2,
successorId: 3,
type: 0,
}, {
id: 2,
predecessorId: 3,
successorId: 4,
type: 0,
}, {
id: 3,
predecessorId: 4,
successorId: 5,
type: 0,
}, {
id: 4,
predecessorId: 5,
successorId: 6,
type: 0,
}, {
id: 5,
predecessorId: 6,
successorId: 7,
type: 0,
}, {
id: 6,
predecessorId: 7,
successorId: 8,
type: 0,
}, {
id: 7,
predecessorId: 8,
successorId: 9,
type: 0,
}];
const resources = [{
id: 1,
text: 'John Heart',
}, {
id: 2,
text: 'Paul Peyton',
}, {
id: 3,
text: 'Robert Reagan',
}, {
id: 4,
text: 'Greta Sims',
}, {
id: 5,
text: 'Brett Wade',
}, {
id: 6,
text: 'Sandra Johnson',
}, {
id: 7,
text: 'Kevin Carter',
}, {
id: 8,
text: 'Cynthia Stanwick',
}, {
id: 9,
text: 'Olivia Samuelson',
}];
const resourceAssignments = [{
id: 0,
taskId: 1,
resourceId: 1,
}, {
id: 1,
taskId: 2,
resourceId: 2,
}, {
id: 2,
taskId: 3,
resourceId: 3,
}, {
id: 3,
taskId: 4,
resourceId: 4,
}, {
id: 4,
taskId: 5,
resourceId: 5,
}, {
id: 5,
taskId: 6,
resourceId: 6,
}, {
id: 6,
taskId: 7,
resourceId: 7,
}, {
id: 7,
taskId: 8,
resourceId: 8,
}, {
id: 8,
taskId: 9,
resourceId: 9,
}];