define([ "./GanttTaskControl", "dijit/Menu", "dijit/Dialog", "dijit/form/NumberSpinner", "dijit/form/Button", "dijit/form/CheckBox", "dijit/form/DateTextBox", "dijit/form/TimeTextBox", "dijit/form/TextBox", "dijit/form/Form", "dijit/registry", "dojo/_base/declare", "dojo/_base/array", "dojo/_base/lang", "dojo/_base/html", "dojo/date/locale", "dojo/request", "dojo/dom", "dojo/dom-class", "dojo/domReady!" ], function(GanttTaskControl, Menu, Dialog, NumberSpinner, Button, CheckBox, DateTextBox, TimeTextBox, TextBox, Form, registry, declare, arrayUtil, lang, html, locale, request, dom, domClass){ return declare("dojox.gantt.contextMenuTab", [], { constructor: function(id, description, type, showOInfo, tabMenu, withDefaultValue){ this.id = id; this.arrItems = []; this.TabItemContainer = null; this.Description = description; this.tabMenu = tabMenu; this.type = type; this.object = null; this.showObjectInfo = showOInfo; this.withDefaultValue = withDefaultValue; }, preValueValidation: function(items){ for(var i = 0; i < items.length; i++){ var item = items[i]; //TODO add more validation for Id, Name, ..... if(item.required && !item.control.textbox.value){ return false; } } return true; }, encodeDate: function(date){ return date.getFullYear() + "." + (date.getMonth() + 1) + "." + date.getDate(); }, decodeDate: function(dateStr){ var arr = dateStr.split("."); return (arr.length < 3) ? "" : (new Date(arr[0], parseInt(arr[1]) - 1, arr[2])); }, renameTaskAction: function(){ var name = this.arrItems[0].control.textbox.value; if(lang.trim(name).length <= 0){ return; } if(!this.preValueValidation(this.arrItems)){ return; } this.object.setName(name); this.hide(); }, deleteAction: function(){ if(!this.preValueValidation(this.arrItems)){ return; } this.object.project.deleteTask(this.object.taskItem.id); this.hide(); this.tabMenu.ganttChart.resource && this.tabMenu.ganttChart.resource.reConstruct(); }, durationUpdateAction: function(){ var d = this.arrItems[0].control.textbox.value; if(!this.preValueValidation(this.arrItems)){ return; } if(this.object.setDuration(d)){ this.hide(); }else{ alert("Duration out of Range"); return; } this.tabMenu.ganttChart.resource && this.tabMenu.ganttChart.resource.refresh(); }, cpUpdateAction: function(){ var p = this.arrItems[0].control.textbox.value; if(!this.preValueValidation(this.arrItems)){ return; } if(this.object.setPercentCompleted(p)){ this.hide(); }else{ alert("Complete Percentage out of Range"); } }, ownerUpdateAction: function(){ var to = this.arrItems[0].control.textbox.value; if(!this.preValueValidation(this.arrItems)){ return; } if(this.object.setTaskOwner(to)){ this.hide(); }else{ alert("Task owner not Valid"); return; } this.tabMenu.ganttChart.resource && this.tabMenu.ganttChart.resource.reConstruct(); }, ptUpdateAction: function(){ var p = this.arrItems[0].control.textbox.value; if(!this.preValueValidation(this.arrItems)){ return; } if(this.object.setPreviousTask(p)){ this.hide(); }else{ alert("Please verify the Previous Task (" + p + ") and adjust its Time Range"); } }, renameProjectAction: function(){ var name = this.arrItems[0].control.textbox.value; if(lang.trim(name).length <= 0){ return; } if(!this.preValueValidation(this.arrItems)){ return; } this.object.setName(name); this.hide(); }, deleteProjectAction: function(){ if(!this.preValueValidation(this.arrItems)){ return; } this.object.ganttChart.deleteProject(this.object.project.id); this.hide(); this.tabMenu.ganttChart.resource && this.tabMenu.ganttChart.resource.reConstruct(); }, cpProjectAction: function(){ var p = this.arrItems[0].control.textbox.value; if(!this.preValueValidation(this.arrItems)){ return; } if(this.object.setPercentCompleted(p)){ this.hide(); }else{ alert("Percentage not Acceptable"); } }, addTaskAction: function(){ if(!this.preValueValidation(this.arrItems)){ return; } var id = this.arrItems[0].control.textbox.value, name = this.arrItems[1].control.textbox.value, startTime = this.decodeDate(this.arrItems[2].control.textbox.value), duration = this.arrItems[3].control.textbox.value, pc = this.arrItems[4].control.textbox.value, owner = this.arrItems[5].control.textbox.value, parentTaskId = this.arrItems[6].control.textbox.value, predTaskId = this.arrItems[7].control.textbox.value; if(lang.trim(id).length <= 0){ return; } if(this.object.insertTask(id, name, startTime, duration, pc, predTaskId, owner, parentTaskId)){ this.hide(); }else{ alert("Please adjust your Customization"); return; } this.tabMenu.ganttChart.resource && this.tabMenu.ganttChart.resource.reConstruct(); }, addSuccessorTaskAction: function(){ if(!this.preValueValidation(this.arrItems)){ return; } var pr = this.object.project, id = this.arrItems[0].control.textbox.value, name = this.arrItems[1].control.textbox.value, startTime = this.decodeDate(this.arrItems[2].control.textbox.value), duration = this.arrItems[3].control.textbox.value, pc = this.arrItems[4].control.textbox.value, owner = this.arrItems[5].control.textbox.value; if(lang.trim(id).length <= 0){ return; } var parentTaskId = !this.object.parentTask ? "" : this.object.parentTask.taskItem.id; var predTaskId = this.object.taskItem.id; if(pr.insertTask(id, name, startTime, duration, pc, predTaskId, owner, parentTaskId)){ this.hide(); }else{ alert("Please adjust your Customization"); return; } this.tabMenu.ganttChart.resource && this.tabMenu.ganttChart.resource.reConstruct(); }, addChildTaskAction: function(){ if(!this.preValueValidation(this.arrItems)){ return; } var pr = this.object.project, id = this.arrItems[0].control.textbox.value, name = this.arrItems[1].control.textbox.value, startTime = this.decodeDate(this.arrItems[2].control.textbox.value), duration = this.arrItems[3].control.textbox.value, pc = this.arrItems[4].control.textbox.value, owner = this.arrItems[5].control.textbox.value, parentTaskId = this.object.taskItem.id, predTaskId = ""; if(lang.trim(id).length <= 0){ return; } if(pr.insertTask(id, name, startTime, duration, pc, predTaskId, owner, parentTaskId)){ this.hide(); }else{ alert("Please adjust your Customization"); return; } this.tabMenu.ganttChart.resource && this.tabMenu.ganttChart.resource.reConstruct(); }, addProjectAction: function(){ if(!this.preValueValidation(this.arrItems)){ return; } var id = this.arrItems[0].control.textbox.value, namePr = this.arrItems[1].control.textbox.value, startDatePr = this.decodeDate(this.arrItems[2].control.textbox.value); if(lang.trim(id).length <= 0 || lang.trim(namePr).length <= 0){ return; } if(this.tabMenu.ganttChart.insertProject(id, namePr, startDatePr)){ this.hide(); }else{ alert("Please adjust your Customization"); return; } this.tabMenu.ganttChart.resource && this.tabMenu.ganttChart.resource.reConstruct(); }, addAction: function(handler){ this.actionFunc = this[handler]; }, addItem: function(id, name, key, required){ var inputControl; if(key == "startTime" || key == "startDate"){ inputControl = new DateTextBox({type:"text", constraints:{datePattern:"yyyy.M.d", strict:true}}); }else if(key == "percentage"){ inputControl = new NumberSpinner({ constraints:{ max:100, min:0 }}); }else if(key == "duration"){ inputControl = new NumberSpinner({ constraints:{ min:0 }}); }else{ inputControl = new TextBox(); } this.arrItems.push({ id: id, name: name, control: inputControl, tab: this, key: key, required: required }); }, show: function(){ this.tabMenu.tabPanelDlg = this.tabMenu.tabPanelDlg || registry.byId(this.tabMenu.tabPanelDlgId) || new Dialog({ title: "Settings" }); try{ this.tabMenu.tabPanelDlg.show(); }catch(e){ console.log("dialog show exception: " + e.message); return; } this.tabMenu.tabPanelDlg.titleNode.innerHTML = this.Description; var content = this.tabMenu.paneContentArea.firstChild.rows[1].cells[0].firstChild; var cell, cellValue, row = null; if(this.showObjectInfo){ if(this.object){ if(this.object.constructor == GanttTaskControl){ this.insertData(content, "Id", this.object.taskItem.id); this.insertData(content, "Name", this.object.taskItem.name); this.insertData(content, "Start Time", this.encodeDate(this.object.taskItem.startTime)); this.insertData(content, "Duration (hours)", this.object.taskItem.duration + " hours"); this.insertData(content, "Percent Complete (%)", this.object.taskItem.percentage + "%"); this.insertData(content, "Task Assignee", this.object.taskItem.taskOwner); this.insertData(content, "Previous Task Id", this.object.taskItem.previousTaskId); }else{ this.insertData(content, "Id", this.object.project.id); this.insertData(content, "Name", this.object.project.name); this.insertData(content, "Start date", this.encodeDate(this.object.project.startDate)); } } } //separator row = content.insertRow(content.rows.length); cell = row.insertCell(row.cells.length); cell.colSpan = 2; cell.innerHTML = "
"; //input section header row = content.insertRow(content.rows.length); cell = row.insertCell(row.cells.length); cell.colSpan = 2; domClass.add(cell, "ganttMenuDialogInputCellHeader"); cell.innerHTML = "Customization: " + this.Description; //input details arrayUtil.forEach(this.arrItems, function(item){ row = content.insertRow(content.rows.length); cell = row.insertCell(row.cells.length); domClass.add(cell, "ganttMenuDialogInputCell"); cellValue = row.insertCell(row.cells.length); domClass.add(cellValue, "ganttMenuDialogInputCellValue"); cell.innerHTML = item.name; cellValue.appendChild(item.control.domNode); //initialize default value if(this.withDefaultValue && this.object){ if(this.object.constructor == GanttTaskControl){ if(item.key == "startTime"){ item.control.textbox.value = this.encodeDate(this.object.taskItem.startTime); }else{ item.control.textbox.value = item.key ? this.object.taskItem[item.key] : ""; } }else{ if(item.key == "startDate"){ item.control.textbox.value = this.encodeDate(this.object.project.startDate); }else{ item.control.textbox.value = item.key ? (this.object.project[item.key] || this.object[item.key] || "") : ""; } } }else{ //HTML5 placeholder property item.control.textbox.placeholder = item.required ? "---required---" : "---optional---"; } }, this); this.tabMenu.ok.onClick = lang.hitch(this, this.actionFunc); this.tabMenu.cancel.onClick = lang.hitch(this, this.hide); }, hide: function(){ try{ this.tabMenu.tabPanelDlg.hide(); }catch(e){ console.log("dialog show exception: " + e.message); this.tabMenu.tabPanelDlg.destroy(); } var cell = this.tabMenu.paneContentArea.firstChild.rows[1].cells[0]; cell.firstChild.parentNode.removeChild(cell.firstChild); cell.innerHTML = "
"; domClass.add(cell.firstChild, "ganttDialogContentCell"); }, insertData: function(content, name, value){ var cellValue, row = content.insertRow(content.rows.length), cell = row.insertCell(row.cells.length); domClass.add(cell, "ganttMenuDialogDescCell"); cell.innerHTML = name; cellValue = row.insertCell(row.cells.length); domClass.add(cellValue, "ganttMenuDialogDescCellValue"); cellValue.innerHTML = value; } }); });