上海普加軟件有限公司
PlusRGantt(普加資源甘特圖)是使用Javascript開發(fā)的、基于Web網頁的甘特圖控件。
資源甘特圖用于生產制造領域, 可以顯示一個生產線或設備的多道工序排布情況,并且可以進行干涉調整, 達到最佳生產效益。
基于WEB網頁顯示,無需安裝任何插件。
顯示為左側任務表格、右側時間軸刻度條形圖的甘特圖界面。
支持分級加載,不一次性加載全部數(shù)據(jù)。這樣可以支持大數(shù)據(jù)量顯示。
支持年/月/日/時/分/秒等不同時間刻度單位。
支持表格列、條形圖外觀、ToolTip提示信息、右鍵菜單等任意自定義。
跨所有瀏覽器顯示,如IE(1.5+)、FireFox、Chrome、Opera、Safari等。
跨任意服務端平臺,如ASP.NET、ASP、PHP、JSP、ColdFusion、Ruby on Rails等都可以使用。
語言本地化。包括英語、中文、日文和其他任意的語言。
PlusRGantt只需要您提供一個簡單的數(shù)據(jù)結構,就能在WEB網頁上顯示一個漂亮的甘特圖。
您可以輕松修改它任意部位的外觀,比如單元格、條形圖、提示信息等。
PlusRGantt是一個Javascript控件,運行在WEB瀏覽器中。與服務端平臺和數(shù)據(jù)庫無關。
使用者需要用Ajax從服務端獲取甘特圖數(shù)據(jù),是一個簡單的樹形結構。
甘特圖數(shù)據(jù)到達頁面后,使用PlusRGantt的loadData方法,加載顯示甘特圖界面。
然后,使用者可以做如下自定義處理:
PlusRGantt數(shù)據(jù)是一個樹形結構的任務數(shù)據(jù)。這里是JSON格式的數(shù)據(jù)。
下一級子任務由"children"屬性體現(xiàn)。
前置任務由"PredecessorLink"屬性體現(xiàn)。
[ { Name: "P1", //節(jié)點名稱 UID: 1, //節(jié)點唯一標識符 Tasks: [ { Name: "task1", //任務名稱 UID: "p1", //任務唯一標識符 Start: "2007-01-03T00:00:00", //開始日期 Finish: "2007-01-03T23:59:59", //完成日期 PercentComplete: 0, //進度 Duration: 1*24*3600 //工期。單位"秒" }, ...... ] }, ...... ]
首先,對于jQuery, YUI, Prototype.js等框架來說,它們對頁面的操作基于原始Dom元素的。
所以,你可以不用做任何額外的處理,按PlusProject正常的例子,把項目甘特圖對象加入到頁面元素就可以了。
其次,對于ExtJS這樣封裝度很高的框架,可以從Ext對象找到它的dom,然后render加入即可。使用代碼如下:
//獲取ext控件對象 var extControl = Ext.get(id); //設置尺寸為100%自適應 gantt.setStyle("width:100%;height:100%"); //把project加入到ext控件對象的dom屬性中 gantt.render(extControl.dom);
只需要這樣設置后,PlusProject就能在Ext的布局面板中自動調整尺寸大小,看上去跟Ext原生的控件一樣了。
如果要顯示他語言界面,只需要引用locale文件夾下資源js文件即可,例如英文資源包使用如下:
<script src="../scripts/miniui/locale/en_US.js" type="text/javascript"></script>
語言本地化(英語)示例,請查看這里。
屬性可以從對象直接讀取,但是不能進行賦值操作。如果想對屬性進行賦值,必須使用提供的方法。
var gantt = new PlusRGantt(); var visible= gantt.visible; //正確 gantt.visible= true; //錯誤!!! gantt.setVisible(true); //正確
屬性 | 類型 | 描述 |
readOnly | Boolean | 是否只讀。 |
visible | Boolean | 是否顯示。 |
style | String | 樣式。 |
tableWidth | Number | 表格區(qū)寬度。 |
width | Number | 寬度。 |
height | Number | 高度。 |
showTableView | Boolean | 是否顯示任務表格。 |
showGanttView | Boolean | 是否顯示條形圖。 |
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 | 行高。 |
allowResize | Boolean | 是否允許拖拽調整甘特圖。 |
allowCreateBar | Boolean | 默認false。是否允許拖拽創(chuàng)建條形圖。 |
方法 | 參數(shù)類型 | 描述 |
setStyle(String) | 設置樣式,比如:gantt.setStyle("width:100%;height:400px")。 | |
loadData(Array) | 加載數(shù)據(jù)(含節(jié)點和任務)。 | |
getData() | 獲取數(shù)據(jù)(含節(jié)點和任務)。 | |
getTasks() | 獲取任務數(shù)據(jù)(不含節(jié)點)。 | |
getNodeTree() | 返回樹形數(shù)據(jù)。 | |
getNodeList() | 返回列表數(shù)據(jù)。 | |
setColumns( Array ) | 設置表格列集合。 | |
setTreeColumn( String ) | 設置樹形節(jié)點列。 | |
getNode(nodeUID) | 根據(jù)節(jié)點UID,獲取節(jié)點。 | |
getTask(taskUID) | 根據(jù)任務UID,獲取任務。 | |
getOwnerNode(task) | 根據(jù)任務,獲取所屬節(jié)點。 | |
addTask(task, node, index) |
task:Object。新任務對象。 node:節(jié)點。 index:Number。加入的索引位置。 |
新增任務。 |
removeTask(task) | 刪除任務。 | |
removeTasks(Array) | 刪除多個任務。 | |
updateTask(task, property, value) updateTask(task, keyValues) |
property:String。任務屬性名,如"Start"。 value:Object。屬性值。 keyValues:Object。鍵值對,如{Name:'測試完成', PercentComplete: 0} |
更新任務屬性。 |
getSelectedTask() | 獲取選中的任務。 | |
getSelectedTasks() | 獲取選中的任務集合。 | |
isSelectedTask(task) | 判斷是否選中任務。 | |
selectTask(task) | 選中任務。 | |
deselectTask(task) | 取消選中節(jié)點。 | |
selectTasks(Array) | 選中多個任務。 | |
deselectTasks(Array) | 取消選中多個任務。 | |
selectAllTasks() | 選中所有任務。 | |
deselectAllTasks() | 取消選中所有任務。 | |
addNodes(nodes, parentNode) | 加入多個子節(jié)點。 | |
getSelected() | 獲取選中的節(jié)點。 | |
getSelecteds() | 獲取選中的節(jié)點集合。 | |
isSelected(node) | 判斷是否選中節(jié)點。 | |
select(node) | 選中節(jié)點。 | |
deselect(node) | 取消選中節(jié)點。 | |
selects(Array) | 選中多個節(jié)點。 | |
deselects(Array) | 取消選中多個節(jié)點。 | |
selectAll() | 選中所有節(jié)點。 | |
deselectAll() | 取消選中所有節(jié)點。 | |
getParentNode(node) | 獲取父節(jié)點對象。 | |
getChildNodes(node) //下一級任務 |
獲取子節(jié)點數(shù)組。 | |
getAllChildNodes(node) | 獲取所有子節(jié)點數(shù)組。 | |
getAncestorNodes(node) | 獲取父級節(jié)點數(shù)組。 | |
isAncestor(parentNode, node) | 判斷兩節(jié)點之間是否有父子關系。 | |
eachChild(node, fn, scope) | 遍歷下一級子節(jié)點。 | |
cascadeChild(node, fn, scope) | 遍歷所有子節(jié)點。 | |
bubbleParent(node, fn, scope) | 遍歷父級子節(jié)點。 | |
collapseAll ( ) | 折疊所有節(jié)點。 | |
expandAll ( ) | 展開所有節(jié)點。 | |
collapseLevel( Number ) | 折疊某層級節(jié)點。 | |
expandLevel( Number ) | 展開某層級節(jié)點。 | |
collapse(task) | 折疊節(jié)點。 | |
expand(task) | 展開節(jié)點。 | |
frozenColumn( start, end ) | 鎖定列。 | |
unfrozenColumn( ) | 取消鎖定列。 | |
filter(fn) | 根據(jù)條件過濾任務。project.filter(function(task){ if(task.Duration == 2) return true; else return false; }); |
|
clearFilter() | 取消過濾任務 | |
setShowTableView( Boolean ) | 設置表格是否顯示。 | |
setShowGanttView( Boolean ) | 設置條形圖是否顯示。 | |
setShowGridLines( Boolean ) | 設置是否顯示條形圖背景表格線。 | |
setTimeLines( Array ) | 設置項目時間線。 | |
setRowHeight( Number ) | 設置行高。 | |
setTopTimeScale( String ) | String:時間刻度。 "year/halfyear/quarter/month/week/day/hour" |
設置頂層時間刻度。 |
setBottomTimeScale( String ) | 同上 |
設置底層時間刻度。(底層必須比頂層要?。?/td> |
zoomIn( ) | 放大時間刻度 | |
zoomOut( ) | 縮小時間刻度 | |
scrollIntoView(task) | 定位顯示任務。 |
通過如下方式監(jiān)聽事件:
functon onTaskDblClick(e){ var gantt = e.source; var task = e.task; //e是事件對象, 具體請看每個事件的"參數(shù)類型" } gantt.on('taskdblclick', onTaskDblClick);
事件名稱 | 事件對象 | 描述 |
drawitem |
{ source: Object, //甘特圖對象 item: Object, //條形圖,任務對象 itemBox: Object, //條形圖的坐標尺寸 itemHtml: Stirng//單元格內容HTML } |
繪制條形圖時發(fā)生。 |
taskclick |
{ source: Object, //甘特圖對象 task: Object //任務對象 } |
單擊任務時發(fā)生。 |
taskdblclick |
{ source: Object, //甘特圖對象 task: Object //任務對象 } |
雙擊任務時發(fā)生。 |
taskdragstart |
{ source: Object, //甘特圖對象 task: Object, //被拖拽的任務 action: String, //拖拽方式:start,finish,move,percentcomplete dragUpdown: Boolean, //move的時候,是否允許換行拖拽 cancel: Boolean //是否取消操作 } |
條形圖開始拖拽時發(fā)生。 |
taskdragdrop |
{ source: Object, //甘特圖對象 task: Object, //被拖拽的任務 dropNode: Object, //目標投放節(jié)點 action: String, //拖拽方式:start,finish,move,percentcomplete cancel: Boolean //是否取消拖拽操作 } |
拖拽行釋放時發(fā)生。 |
taskdragcomplete |
{ source: Object, //甘特圖對象 task: Object, //被拖拽的任務 dropNode: Object, //目標投放節(jié)點 action: String, //拖拽方式:start,finish,move,percentcomplete value: Object //值 } |
拖拽行釋放時發(fā)生。 |
taskselect |
|
選中任務時發(fā)生。 |
taskdeselect |
|
取消選中任務時發(fā)生。 |
barcreate |
{ source: Object, //甘特圖對象 task: Object, //被拖拽的任務 node: Object //目標節(jié)點對象 } |
拖拽創(chuàng)建bar時發(fā)生。 |
開發(fā)者可以控制右側條形圖的HTML外觀,達到任意的條形圖效果:
//1)自定義條形圖外觀顯示 gantt.on("drawitem", function (e) { var item = e.item, node = gantt.getOwnerNode(item); var cls = "myitem"; if (node.Name == "P2" || node.Name == "D1") { cls = "myitem2"; } e.itemCls = cls; }); //2)自定義條形圖提示信息 gantt.on('itemtooltipneeded', function (e) { var task = e.task; e.tooltip = "<div>任務:" + 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)聽表格的"taskdragstart"和"taskdragdrop"事件,可以控制任務條形圖的各個拖拽細節(jié)。
gantt.on("taskdragstart", function (e) { var action = e.action; //move, start, finish, percentcomplete var task = e.task, node = gantt.getOwnerNode(e.task); //進度100%的任務不允許拖拽 if (task.PercentComplete == 100) { e.cancel = true; } //P2的所有任務,只允許調整進度拖拽。 if (node.Name == "P2") { if (action != "percentcomplete") { e.cancel = true; } } //P1的所有任務不允許跨行拖拽。 if (node.Name != "P1") { e.dragUpdown = true; } }); gantt.on("taskdragdrop", function (e) { var task = e.task, node = gantt.getOwnerNode(e.task), dropNode = e.dropNode; if (dropNode && dropNode.Name == "P3") { e.cancel = true; } });
示例請參考"控制單元格可編輯"
開發(fā)者可以自定義任務排程算法實現(xiàn),達到精確控制任務排程生產的需要。
示例請參考"任務排程"
示例請參考"多選任務條形圖"
示例請參考"任務編輯面板"
示例請參考"選中顯示任務詳細"