bardelman-dhtmlx-gantt-redux
Version:
An open source JavaScript Gantt chart that helps you illustrate a project schedule in a nice-looking chart.
142 lines (116 loc) • 3.55 kB
HTML
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>Fixed project dates</title>
<script src="../../codebase/dhtmlxgantt.js?v=9.0.10"></script>
<link rel="stylesheet" href="../../codebase/dhtmlxgantt.css?v=9.0.10">
<script src="../common/testdata.js?v=9.0.10"></script>
<style>
html, body {
height: 100%;
padding: 0px;
margin: 0px;
overflow: hidden;
}
.gantt_task_line.gantt_dependent_task {
--dhx-gantt-task-background: #65c16f;
}
</style>
</head>
<body>
<div id="gantt_here" style='width:100%; height:100%;'></div>
<script>
var tasks = {
data: [
{
id: 4, text: "Project #1", start_date: "02-04-2023", duration: 0,
progress: 0.4, open: true
},
{
id: 5, text: "Task #2.1", start_date: "02-04-2023", duration: 8,
progress: 0.6, parent: 4
},
{
id: 6, text: "Task #2.2", start_date: "11-04-2023", duration: 8,
progress: 0.6, parent: 4
},
{
id: 7, text: "Project #2", end_date: "19-04-2023", duration: 0,
progress: 0.4, open: true
},
{
id: 8, text: "Task #3.1", start_date: "02-04-2023", duration: 8,
progress: 0.6, parent: 7
},
{
id: 9, text: "Task #3.2", start_date: "11-04-2023", duration: 8,
progress: 0.6, parent: 7
}
],
links: []
};
gantt.templates.task_text = function (start, end, task) {
var text = [task.text];
if (task.$no_end && !task.$no_start) {
text.push("Must start on " + gantt.templates.task_date(start));
} else if (task.$no_start && !task.$no_end) {
text.push("Must end by " + gantt.templates.task_date(end));
}
return text.join(", ");
};
gantt.config.lightbox.sections = [
{name: "description", height: 70, map_to: "text", type: "textarea", focus: true},
{name: "time", type: "duration", map_to: "auto"}
];
gantt.init("gantt_here");
gantt.parse(tasks);
function limitMoveLeft(task, limit) {
var dur = task.end_date - task.start_date;
task.end_date = new Date(limit.end_date);
task.start_date = new Date(+task.end_date - dur);
}
function limitMoveRight(task, limit) {
var dur = task.end_date - task.start_date;
task.start_date = new Date(limit.start_date);
task.end_date = new Date(+task.start_date + dur);
}
function limitResizeLeft(task, limit) {
task.end_date = new Date(limit.end_date);
}
function limitResizeRight(task, limit) {
task.start_date = new Date(limit.start_date)
}
gantt.attachEvent("onTaskDrag", function (id, mode, task, original, e) {
var parent = task.parent ? gantt.getTask(task.parent) : null,
children = gantt.getChildren(id),
modes = gantt.config.drag_mode;
var limitLeft = null,
limitRight = null;
if (!(mode == modes.move || mode == modes.resize)) return;
if (mode == modes.move) {
limitLeft = limitMoveLeft;
limitRight = limitMoveRight;
} else if (mode == modes.resize) {
limitLeft = limitResizeLeft;
limitRight = limitResizeRight;
}
//check parents constraints
if (parent && +parent.end_date < +task.end_date) {
limitLeft(task, parent);
}
if (parent && +parent.start_date > +task.start_date) {
limitRight(task, parent);
}
//check children constraints
for (var i = 0; i < children.length; i++) {
var child = gantt.getTask(children[i]);
if (+task.end_date < +child.end_date) {
limitLeft(task, child);
} else if (+task.start_date > +child.start_date) {
limitRight(task, child)
}
}
});
gantt.message("You cannot drag child tasks outside the dates of their parent tasks.")
</script>
</body>