上海普加軟件有限公司
PlusGantt(普加甘特圖)是使用Javascript開發(fā)的、基于Web網(wǎng)頁的甘特圖控件。
可廣泛應(yīng)用于項目管理系統(tǒng)、 ERP 系統(tǒng)、MES系統(tǒng)或其它的任務(wù)資源分配相關(guān)領(lǐng)域。
基于WEB網(wǎng)頁顯示,無需安裝任何插件。
顯示為左側(cè)任務(wù)表格、右側(cè)時間軸刻度條形圖的甘特圖界面。
支持跟蹤甘特圖視圖。可對比“計劃任務(wù)”與“實際任務(wù)”的區(qū)別。
支持分級加載,不一次性加載全部數(shù)據(jù)。這樣可以支持大數(shù)據(jù)量顯示。
支持年/月/日/時/分/秒等不同時間刻度單位。
支持表格列、條形圖外觀、ToolTip提示信息、右鍵菜單等任意自定義。
跨所有瀏覽器顯示,如IE(1.5+)、FireFox、Chrome、Opera、Safari等。
跨任意服務(wù)端平臺,如ASP.NET、ASP、PHP、JSP、ColdFusion、Ruby on Rails等都可以使用。
語言本地化。包括英語、中文、日文和其他任意的語言。
PlusGantt只需要您提供一個簡單的數(shù)據(jù)結(jié)構(gòu),就能在WEB網(wǎng)頁上顯示一個漂亮的甘特圖。
您可以輕松修改它任意部位的外觀,比如單元格、條形圖、提示信息等。
PlusGantt是一個Javascript控件,運行在WEB瀏覽器中。與服務(wù)端平臺和數(shù)據(jù)庫無關(guān)。
使用者需要用Ajax從服務(wù)端獲取甘特圖數(shù)據(jù),是一個簡單的樹形結(jié)構(gòu)。
甘特圖數(shù)據(jù)到達頁面后,使用PlusGantt的loadTasks方法,加載顯示甘特圖界面。
然后,使用者可以做如下自定義處理:
普加甘特圖能很好完成在WEB上顯示甘特圖的功能。
但是如果您需要在WEB上實現(xiàn)一個類似微軟Project功能邏輯的控件,請查看普加項目管理控件PlusProject。
PlusGantt數(shù)據(jù)是一個樹形結(jié)構(gòu)的任務(wù)數(shù)據(jù)。這里是JSON格式的數(shù)據(jù)。
下一級子任務(wù)由"children"屬性體現(xiàn)。
前置任務(wù)由"PredecessorLink"屬性體現(xiàn)。
[{ "UID": "1", "Name": "項目范圍規(guī)劃", "Duration": 8, "Start": "2007-01-01T00:00:00", "Finish": "2007-01-10T00:00:00", "PercentComplete": 0, "Summary": 1, "Critical": 0, "Milestone": 0, "PredecessorLink": [], "ParentTaskUID": -1 }, { "UID": "2", "Name": "確定項目范圍", "Duration": 1, "Start": "2007-01-01T00:00:00", "Finish": "2007-01-01T23:23:59", "PercentComplete": 0, "Summary": 0, "Critical": 0, "Milestone": 0, "PredecessorLink": [], "ParentTaskUID": "1" }, { "UID": "3", "Name": "獲得項目所需資金", "Duration": 2, "Start": "2007-01-02T00:00:00", "Finish": "2007-01-03T23:23:59", "PercentComplete": 0, "Summary": 0, "Critical": 0, "Milestone": 0, "PredecessorLink": [{ "Type": 1, "PredecessorUID": "2" }], "ParentTaskUID": "1" }, ... ]樹形結(jié)構(gòu)(children):
[ { UID: "1", //任務(wù)唯一標(biāo)識符 Name: "項目范圍規(guī)劃", //任務(wù)名稱 Duration: 4, //工期 Start: "2007-01-01T00:00:00", //開始日期 Finish: "2007-01-04T23:59:59", //完成日期 PercentComplete: 14, //完成百分比 Summary: 1, //摘要任務(wù) Critical: 1, //關(guān)鍵任務(wù) Milestone: 0, //里程碑 PredecessorLink: [], //前置任務(wù) children: [ { UID: "2", Duration: 4, Start: "2007-01-01T08:00:00", Finish: "2007-01-01T12:00:00", PercentComplete: 100, Summary: 0, Critical: 1, Name: "確定項目范圍", Milestone: 0, PredecessorLink: [] }, { UID: "3", Duration: 8, Start: "2007-01-01T13:00:00", Finish: "2007-01-02T12:00:00", PercentComplete: 0, Summary: 0, Critical: 1, Name: "獲得項目所需資金", Milestone: 0, PredecessorLink: [ //前置任務(wù) { PredecessorUID: "2", Type": 1 } ] }, ....//更多子任務(wù) ] }, .... //更多任務(wù) ]
任務(wù)屬性描述如下:
首先,對于jQuery, YUI, Prototype.js等框架來說,它們對頁面的操作基于原始Dom元素的。
所以,你可以不用做任何額外的處理,按PlusProject正常的例子,把項目甘特圖對象加入到頁面元素就可以了。
其次,對于ExtJS這樣封裝度很高的框架,可以從Ext對象找到它的dom,然后render加入即可。使用代碼如下:
//獲取ext控件對象 var extControl = Ext.get(id); //設(shè)置尺寸為100%自適應(yīng) gantt.setStyle("width:100%;height:100%"); //把project加入到ext控件對象的dom屬性中 gantt.render(extControl.dom);
只需要這樣設(shè)置后,PlusProject就能在Ext的布局面板中自動調(diào)整尺寸大小,看上去跟Ext原生的控件一樣了。
如果要顯示他語言界面,只需要引用locale文件夾下資源js文件即可,例如英文資源包使用如下:
<script src="../scripts/miniui/locale/en_US.js" type="text/javascript"></script>
語言本地化(英語)示例,請查看這里。
屬性可以從對象直接讀取,但是不能進行賦值操作。如果想對屬性進行賦值,必須使用提供的方法。
var gantt = new PlusGantt(); var visible= gantt.visible; //正確 gantt.visible= true; //錯誤!!! gantt.setVisible(true); //正確
屬性 | 類型 | 描述 |
readOnly | Boolean | 是否只讀。 |
visible | Boolean | 是否顯示。 |
style | String | 樣式。 |
width | Number | 寬度。 |
height | Number | 高度。 |
showTableView | Boolean | 是否顯示任務(wù)表格。 |
showGanttView | Boolean | 是否顯示條形圖。 |
showLinkLines | Boolean | 是否顯示箭頭連線。 |
showCritical | Boolean | 是否顯示關(guān)鍵路徑 |
showGridLines | Boolean | 是否條形圖表格線。 |
timeLines | Array | 時間線數(shù)組。[ {date: new Date(2007, 0, 3), text: "時間線"}, {date: new Date(2007, 0, 5), text: "時間線2", style: "width:2px;background:red;"} ] |
rowHeight | Number | 行高。 |
allowDragDrop | Boolean | 是否允許任務(wù)行拖拽。 |
multiSelect | Boolean | 是否允許多選任務(wù)。 |
allowResize | Boolean | 是否允許拖拽調(diào)整甘特圖。 |
方法 | 參數(shù)類型 | 描述 |
setStyle(String) | 設(shè)置樣式,比如:gantt.setStyle("width:100%;height:400px")。 | |
loadTasks(Array) | 加載任務(wù)集合(樹形)。 | |
getTaskTree() | 返回任務(wù)樹形集合。 | |
getTaskList() | 返回任務(wù)列表集合。 | |
getRemovedTasks() | 返回被刪除的任務(wù)集合。 | |
acceptChanges() | 恢復(fù)任務(wù)狀態(tài)(撤銷任務(wù)增加、刪除、修改標(biāo)記)。 | |
setColumns( Array ) | 設(shè)置表格列集合。 | |
setTreeColumn( String ) | 設(shè)置樹形節(jié)點列。 | |
findTasks(field, value) | field:String。如"Duration"。 value:Object。屬性值。 |
返回符合條件的任務(wù)集合。 |
getTask(taskUID) | 根據(jù)任務(wù)UID,獲取任務(wù)。 | |
getTaskByID(taskID) | 根據(jù)任務(wù)ID,獲取任務(wù)。project.filter(function(task){ if(task.Duration == 2) return true; else return false; }); |
|
clearFilter() | 取消過濾任務(wù) | |
getSelected() | 獲取選中的任務(wù)。 | |
getSelecteds() | 獲取選中的任務(wù)集合。 | |
isSelected(task) | 判斷是否選中任務(wù)。 | |
select(task) | 選中任務(wù)。 | |
deselect(task) | 取消選中任務(wù)。 | |
selects(Array) | 選中多個任務(wù)。 | |
deselects(Array) | 取消選中多個任務(wù)。 | |
selectAll() | 選中所有任務(wù)。 | |
deselectAll() | 取消選中所有任務(wù)。 | |
getParentTask(task) | 獲取父任務(wù)對象。 | |
getChildTasks(task) //下一級任務(wù) | 獲取子任務(wù)數(shù)組。 | |
getAllChildTasks(task) | 獲取所有子任務(wù)數(shù)組。 | |
getAncestorTasks(task) | 獲取父級任務(wù)數(shù)組。 | |
isAncestor(parentTask, task) | 判斷兩任務(wù)之間是否有父子關(guān)系。 | |
eachChild(task, fn, scope) | 遍歷下一級子節(jié)點。 | |
cascadeChild(task, fn, scope) | 遍歷所有子節(jié)點。 | |
bubbleParent(task, fn, scope) | 遍歷父級子節(jié)點。 | |
addTask(task) addTask(task, index) addTask(task, action, parentTask) |
task:Object。新任務(wù)對象。 index:Number。加入的索引位置。 action:String。加入的方式,before/after/add。 parentTask:父任務(wù)。 |
新增任務(wù)。 |
removeTask(task) | 刪除任務(wù)。 | |
updateTask(task, property, value) updateTask(task, keyValues) |
property:String。任務(wù)屬性名,如"Start"。 value:Object。屬性值。 keyValues:Object。鍵值對,如{Name:'測試完成', PercentComplete: 0} |
更新任務(wù)屬性。 |
moveTask(task, targetTask, action) | action:String。"before"/"after"/"add" targetTask:目標(biāo)任務(wù) action:移動方式 |
移動任務(wù)。 |
upgradeTask(task) | 升級任務(wù)。 | |
downgradeTask(task) | 降級任務(wù)。 | |
addTasks(tasks, index, parentTasks)
addTasks(tasks, action, parentTasks) |
tasks:Array。新任務(wù)數(shù)組。 index:Number/"before"/"after"/"add"。加入方式。 parentTasks:Array。父任務(wù)數(shù)組。 |
批量新增任務(wù)。 |
removeTasks(tasks) | 批量刪除任務(wù)。 | |
updateTasks(tasks, keyValues) |
tasks:Array。任務(wù)數(shù)組。 keyValues:Object。鍵值對,如{Name:'測試完成', PercentComplete: 0} |
批量修改任務(wù)。 |
collapseAll ( ) | 折疊所有任務(wù)。 | |
expandAll ( ) | 展開所有任務(wù)。 | |
collapseLevel( Number ) | 折疊某層級任務(wù)。 | |
expandLevel( Number ) | 展開某層級任務(wù)。 | |
collapse(task) | 折疊任務(wù)。 | |
expand(task) | 展開任務(wù)。 | |
setShowTableView( Boolean ) | 設(shè)置表格是否顯示。 | |
setShowGanttView( Boolean ) | 設(shè)置條形圖是否顯示。 | |
setTableViewExpanded( Boolean ) | 設(shè)置表格折疊。 | |
setGanttViewExpanded( Boolean ) | 設(shè)置條形圖折疊。 | |
setTableViewWidth( Number ) | 設(shè)置表格寬度。 | |
setGanttViewWidth( Number ) | 設(shè)置條形圖寬度。 | |
setShowLinkLines( Boolean ) | 設(shè)置是否顯示箭頭連線。 | |
setShowCritical( Boolean ) | 設(shè)置是否顯示關(guān)鍵路徑 | |
setShowGridLines( Boolean ) | 設(shè)置是否顯示條形圖背景表格線。 | |
setTimeLines( Array ) | 設(shè)置項目時間線。 | |
setRowHeight( Number ) | 設(shè)置行高。 | |
setMultiSelect( Boolean ) | 設(shè)置是否多選任務(wù)。 | |
setAllowDragDrop( Boolean ) | 設(shè)置是否允許任務(wù)行拖拽。 | |
setTopTimeScale( String ) | String:時間刻度。 "year/halfyear/quarter/month/week/day/hour" |
設(shè)置頂層時間刻度。 |
setBottomTimeScale( String ) | 同上 |
設(shè)置底層時間刻度。(底層必須比頂層要小) |
zoomIn( ) | 放大時間刻度 | |
zoomOut( ) | 縮小時間刻度 | |
scrollIntoView(task) | 定位顯示任務(wù)。 |
通過如下方式監(jiān)聽事件:
functon onTaskDblClick(e){ var project = e.source; var task = e.task; //e是事件對象, 具體請看每個事件的"參數(shù)類型" } gantt.on('taskdblclick', onTaskDblClick);
事件名稱 | 事件對象 | 描述 |
drawcell |
{ source: Object, //甘特圖對象 record: Object, //任務(wù)對象 column: Object, //列對象 field: String, //屬性名 value: Object, //單元格值 cellHtml: Stirng//單元格內(nèi)容HTML } |
繪制單元格時發(fā)生。 |
drawitem |
{ source: Object, //甘特圖對象 item: Object, //條形圖,任務(wù)對象 itemBox: Object, //條形圖的坐標(biāo)尺寸 itemHtml: Stirng//單元格內(nèi)容HTML } |
繪制條形圖時發(fā)生。 |
taskclick |
{ source: Object, //甘特圖對象 task: Object //任務(wù)對象 } |
單擊任務(wù)時發(fā)生。 |
taskdblclick |
{ source: Object, //甘特圖對象 task: Object //任務(wù)對象 } |
雙擊任務(wù)時發(fā)生。 |
taskdragdrop |
{ source: Object, //甘特圖對象 tasks: Array, //被拖拽的任務(wù)集合 targetTask: Object, //目標(biāo)任務(wù) action: String, //投放方式:before,after,append cancel: Boolean //是否取消操作 } |
拖拽行釋放時發(fā)生。 |
cellbeginedit |
{ source: Object, //甘特圖對象 record: Object, //任務(wù)對象 column: Object, //列對象 field: String, //屬性名 value: Object, //單元格值 cancel: Boolean //是否取消操作 } |
單元格開始編輯時發(fā)生 |
CellCommitEdit |
{ source: Object, //甘特圖對象 record: Object, //任務(wù)對象 column: Object, //列對象 field: String, //屬性名 value: Object, //單元格值 cancel: Boolean //是否取消操作 } |
單元格提交編輯值時發(fā)生 |
itemdragstart |
{ source: Object, //甘特圖對象 item: Object, //任務(wù)對象 action: String, //拖拽操作: |
條形圖開始拖拽時發(fā)生。 |
itemdragcomplete |
{ source: Object, //甘特圖對象 item: Object, //任務(wù)對象 action: String, //拖拽操作: |
條形圖完成拖拽時發(fā)生。 |
開發(fā)者可以根據(jù)自己擴展的任務(wù)屬性類型,來創(chuàng)建自己的列。
具體請參考"自定義列示例"。
通過監(jiān)聽處理"drawcell"事件,可以根據(jù)任務(wù)信息,設(shè)置行、單元格樣式,以及自定義單元格Html內(nèi)容。
gantt.on("drawcell", function (e) { var task = e.record, column = e.column, field = e.field; //單元格樣式 if (column.name == "Name") { e.cellCls = "mycellcls"; } //行樣式 if (task.Summary == 1) { e.rowCls = "myrowcls"; } ////自定義單元格Html。如果是工期列, 并且工期大與5天, 顯示紅色 if (field == "Name" && task.Duration > 5) { e.cellHtml = '<b style="color:red;">' + task.Name + '</b>'; } if (field == "Name" && task.Duration <= 2) { e.cellHtml = '<span style="color:blue;">' + task.Name + '</span>'; } if (task.Duration == 0) { e.rowCls = "deletetask"; } });
示例請參考"自定義單元格"
開發(fā)者可以控制右側(cè)條形圖的HTML外觀,達到任意的條形圖效果:
//1)自定義條形圖外觀顯示 gantt.on("drawitem", function (e) { var item = e.item; var left = e.itemBox.left, top = e.itemBox.top, width = e.itemBox.width, height = e.itemBox.height; if (!item.Summary && !item.Milestone) { var percentWidth = width * (item.PercentComplete / 100); e.itemHtml = '<div id="' + item._id + '" class="myitem" style="left:' + left + 'px;top:' + top + 'px;width:' + width + 'px;height:' + (height) + 'px;">'; e.itemHtml += '<div style="width:' + (percentWidth) + 'px;" class="percentcomplete"></div>'; e.itemHtml += '</div>'; //e.ItemHtml = '<a style="left:'+left+'px;top:'+top+'px;width:'+width+'px;height:'+(height-2)+'px;" class="myitem">111</a>'; } }); //2)自定義條形圖提示信息 gantt.on('itemtooltipneeded', function (e) { var task = e.task; e.tooltip = "<div>任務(wù):" + task.Name + "</div>" // + "<div ><div style='float:left;'>進度:<b>"+task.PercentComplete + "%</b></div>" // + "<div style='float:right;'>工期:"+task.Duration + "日</div></div>" + "<div style='clear:both;'>開始日期:" + mini.formatDate(task.Start, 'yyyy-MM-dd') + "</div>" + "<div>完成日期:" + mini.formatDate(task.Finish, 'yyyy-MM-dd') + "</div>"; });
示例請參考"自定義顯示條形圖"
通過監(jiān)聽表格的"cellbeginedit"事件,可以控制每個行、每個單元格是否可編輯。
//控制單元格是否可編輯 gantt.on("cellbeginedit", function (e) { var task = e.record, column = e.column, field = e.field; if (task.Summary == 1) { e.cancel = true; } if (field == 'Duration') { e.cancel = true; } });
示例請參考"控制單元格可編輯"