项目进度管理最直观的展现就是甘特图,最近项目需求要在网页中安排任务,管理进度等,故研究了一下甘特图,在网上找到一个关于jQuery做甘特图的插件,写的非常好。
具体地址如下:http://github.com/thegrubbsian/jquery.ganttView
不过该甘特图插件没有现成编辑功能,故有找到一个改版:
http://github.com/nkmrshn/jquery.ganttView
改版后的甘特图可以编辑功能,效果图如下:
具体使用方法如下:
1. 下载文件,目录结果如下:
/example
/lib
jquery.ganttView.js
jquery.ganttView.css
2. 代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>jQuery Gantt</title>
<link rel="stylesheet" type="text/css" href="reset.css" />
<link rel="stylesheet" type="text/css" media="screen" href="example.css" />
<link rel="stylesheet" type="text/css" media="screen" href="../jquery.ganttView.css" />
<link rel="stylesheet" type="text/css" media="screen" href="../lib/flick/jquery-ui-1.8.2.custom.css" />
<script type="text/javascript" src="../lib/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="../lib/jquery-ui-1.8.2.custom.min.js"></script>
<script type="text/javascript" src="../lib/date.js"></script>
<script type="text/javascript" src="../lib/holidays.js"></script>
<script type="text/javascript" src="../jquery.ganttView.js"></script>
<script type="text/javascript">
$(function () {
var ganttData = [
{id: 1, name: "タスク1", series: [
{id: 1, name: "担当者1", text: "Test1-1", start: new Date(2010,00,02), end: new Date(2010,00,05), readOnly: true},
{id: 2, name: "担当者2", text: "Test1-2", start: new Date(2010,00,02), end: new Date(2010,00,05)}
]},
{id: 2, name: "タスク2", series: [{id: 3, name: "担当者2", text: "Test2", start: new Date(2010,00,05), end: new Date(2010,00,08)}]},
{id: 3, name: "タスク3", series: [{id: 4, name: "担当者3", start: new Date(2010,00,09), end: new Date(2010,00,12)}]},
{id: 4, name: "タスク4", series: [{id: 5, name: "担当者4", start: new Date(2010,00,02), end: new Date(2010,00,08), readOnly: true}]},
{id: 5, name: "タスク5", series: [{id: 6, name: "担当者5", start: new Date(2010,00,08), end: new Date(2010,00,15)}]}
];
var selectedObj = null;
$("#ganttChart").ganttView({
showWeekends: true,
data: ganttData,
cellWidth: 21,
start: new Date(2010,00,01),
end: new Date(2010,05,15),
slideWidth: 600,
excludeWeekends: true,
showDayOfWeek: true,
showHolidays: true,
excludeHolidays: true,
clicked: function (o) {
selectedObj = o;
var data = selectedObj.data('block-data');
var itemName = data.itemName ? data.itemName : "";
var seriesName = data.seriesName ? data.seriesName: "";
var text = data.text ? data.text : "";
var sYYYY = data.start.getYear();
sYYYY = sYYYY < 1000 ? sYYYY + 1900 : sYYYY;
var sMM = data.start.getMonth() + 1;
var sDD = data.start.getDate();
var eYYYY = data.end.getYear();
eYYYY = eYYYY < 1000 ? eYYYY + 1900 : eYYYY;
var eMM = data.end.getMonth() + 1;
var eDD = data.end.getDate();
$('#ganttData-item-id').val(data.itemId);
$('#ganttData-item-name').val(itemName);
$('#ganttData-series-id').val(data.seriesId);
$('#ganttData-series-name').val(seriesName);
$('#ganttData-series-start').val(sYYYY + "/" + sMM + "/" + sDD);
$('#ganttData-series-end').val(eYYYY + "/" + eMM + "/" + eDD);
$('#ganttData-series-text').val(text);
},
dblClicked: function (o) {
if (selectedObj == null) { return; }
if (selectedObj.data('block-data').seriesId == o.data('block-data').seriesId) {
$('#ganttData-reset').trigger("click");
}
},
changed: function (o) {
o.trigger("click");
}
});
$('#ganttData-add').click(function () {
var name = $('#ganttData-series-name').val();
name = (name == "") ? null : name;
var text = $('#ganttData-series-text').val();
text = (text == "") ? null : text;
var start = $('#ganttData-series-start').val().split("/");
var end = $('#ganttData-series-end').val().split("/");
var data = [{
id: parseInt($('#ganttData-item-id').val()),
name: $('#ganttData-item-name').val(),
series: [{
id: parseInt($('#ganttData-series-id').val()),
name: name,
text: text,
start: new Date(start[0], parseInt(start[1]) - 1, start[2]),
end: new Date(end[0], parseInt(end[1]) - 1, end[2]),
}]
}];
$().ganttView.addData(data);
});
$('#ganttData-refresh').click(function () {
if (selectedObj == null) { return; }
var data = selectedObj.data('block-data');
data.itemName = $('#ganttData-item-name').val();
data.seriesName = $('#ganttData-series-name').val();
var start = $("#ganttData-series-start").val().split("/");
data.start = new Date(start[0], parseInt(start[1]) - 1, start[2]);
var end = $("#ganttData-series-end").val().split("/");
data.end = new Date(end[0], parseInt(end[1]) - 1, end[2]);
data.text = $('#ganttData-series-text').val();
selectedObj.refreshGanttData();
});
$('#ganttData-delete').click(function () {
if (selectedObj == null) { return; }
selectedObj.deleteGanttData(selectedObj);
$('#ganttData-reset').trigger("click");
});
$('#ganttData-reset').click(function () {
selectedObj = null;
$('.ganttData-input input').val("");
});
});
</script>
</head>
<body>
<div id="ganttChart"></div>
<br/>
<div id="ganttData">
<div class="ganttData-item">
<div class="ganttData-header">Item ID</div>
<div class="ganttData-input"><input type="text" id="ganttData-item-id" /></div>
</div>
<div class="ganttData-item">
<div class="ganttData-header">Item Name</div>
<div class="ganttData-input"><input type="text" id="ganttData-item-name" /></div>
</div>
<div class="ganttData-item">
<div class="ganttData-header">Series ID</div>
<div class="ganttData-input"><input type="text" id="ganttData-series-id" /></div>
</div>
<div class="ganttData-item">
<div class="ganttData-header">Series Name</div>
<div class="ganttData-input"><input type="text" id="ganttData-series-name" /></div>
</div>
<div class="ganttData-item">
<div class="ganttData-header">Start</div>
<div class="ganttData-input"><input type="text" id="ganttData-series-start" /></div>
</div>
<div class="ganttData-item">
<div class="ganttData-header">End</div>
<div class="ganttData-input"><input type="text" id="ganttData-series-end" /></div>
</div>
<div class="ganttData-item">
<div class="ganttData-header">Series Text</div>
<div class="ganttData-input"><input type="text" id="ganttData-series-text" /></div>
</div>
<div class="ganttData-item">
<input type="button" id="ganttData-reset" value="リセット" />
<input type="button" id="ganttData-add" value="追加" />
<input type="button" id="ganttData-refresh" value="更新" />
<input type="button" id="ganttData-delete" value="削除" />
</div>
</div>
</body>
</html>
以上代码在/example/index.html 中。