TaskWindow = function () { TaskWindow.superclass.constructor.call(this); this.initControls(); this.initEvents(); } mini.extend(TaskWindow, mini.Window, { url: mini_JSPath + "../plusproject/js/TaskWindow.html", width: 580, height: 380, showFooter: true, showModal: true, initControls: function () { //body var bodyEl = this.getBodyEl(); mini.update(this.url, bodyEl); //footer buttons var footerEl = this.getFooterEl(); mini.setStyle(footerEl, "padding:8px;padding-right:10px;text-align:right;"); footerEl.innerHTML = '确定 取消'; mini.parse(footerEl); //获取控件对象 this.ok = mini.getbyName("ok", this); this.cancel = mini.getbyName("cancel", this); this.addLink = mini.get("twin_linkadd"); this.delLink = mini.get("twin_linkdel"); this.addRes = mini.get("twin_resadd"); this.delRes = mini.get("twin_resdel"); this.Name = mini.get("twin_name"); this.Principal = mini.get("twin_principal"); this.PercentComplete = mini.get("twin_percentcomplete"); this.Department = mini.get("twin_department"); this.Duration = mini.get("twin_duration"); this.Work = mini.get("twin_work"); this.Start = mini.get("twin_start"); this.Finish = mini.get("twin_finish"); this.ActualStart = mini.get("twin_actualstart"); this.ActualFinish = mini.get("twin_actualfinish"); this.PredecessorLink = mini.get("twin_linkgrid"); this.Assignments = mini.get("twin_resgrid"); this.ConstraintType = mini.get("twin_constrainttype"); this.ConstraintDate = mini.get("twin_constraintdate"); this.FixedDate = mini.get("twin_fixeddate"); this.Milestone = mini.get("twin_milestone"); this.Critical2 = mini.get("twin_critical2"); this.WBS = mini.get("twin_wbs"); this.Notes = mini.get("twin_notes"); }, initEvents: function () { //绑定事件处理函数 ////////////////////////////// this.Department.on('ValueChanged', function () { this.Principal.setData(this.getPrincipalsByDepartment(this.Department.getValue())); this.Principal.setValue(''); }, this); ///////////////////////////// this.Duration.on("valuechanged", function (e) { if (this.dateChangedAction != null) return; this.dateChangedAction = "duration"; var start = this.Start.getValue(); var duration = this.Duration.getValue(); if (start) { var date = this.project.getFinishByCalendar(start, duration); this.Finish.setValue(date); } this.dateChangedAction = null; }, this); this.Start.on("valuechanged", function (e) { if (this.dateChangedAction != null) return; this.dateChangedAction = "start"; var start = this.Start.getValue(); var duration = this.Duration.getValue(); if (start) { var date = this.project.getFinishByCalendar(start, duration); this.Finish.setValue(date); } this.dateChangedAction = null; }, this); this.Finish.on("valuechanged", function (e) { if (this.dateChangedAction != null) return; this.dateChangedAction = "finish"; var finish = this.Finish.getValue(); var start = this.Start.getValue(); if (finish && start) { if (start >= finish) { start = finish; this.Start.setValue(start); } var duration = this.project.getDurationByCalendar(start, finish); this.Duration.setValue(duration); } this.dateChangedAction = null; }, this); //////////////////////////// this.addLink.on("click", function (e) { var link = { Type: 1, LinkLag: 0 }; this.PredecessorLink.addRow(link); }, this); this.delLink.on("click", function (e) { this.PredecessorLink.removeSelected(); }, this); this.PredecessorLink.on("drawcell", function (e) { var link = e.record, field = e.field; var preTask = this.getTaskByUID(link.PredecessorUID) || {}; if (field == "PredecessorID") { e.cellHtml = preTask.ID; } if (field == "PredecessorName") { e.cellHtml = preTask.Name; } if (field == "Type") { var linkType = mini.Gantt.PredecessorLinkType[e.value]; e.cellHtml = linkType.Name; } if (field == "LinkLag") { e.cellHtml = e.value + "天"; } }, this); this.PredecessorLink.on("cellbeginedit", function (e) { var link = e.record, field = e.field; var preTask = this.getTaskByUID(link.PredecessorUID) || {}; if (e.field == "PredecessorID") { e.value = preTask.ID || ""; } if (e.field == "Type") { e.editor.setData(mini.Gantt.PredecessorLinkType); } }, this); this.PredecessorLink.on("cellcommitedit", function (e) { if (e.field == "PredecessorID") { //e.editor.setData(mini.Gantt.PredecessorLinkType); e.cancel = true; var task = this.getTaskByID(e.value); if (task) { e.sender.updateRow(e.record, "PredecessorUID", task.UID); } else { e.sender.updateRow(e.record, "PredecessorUID", ""); } } }, this); ///////////////////////////////// this.addRes.on("click", function (e) { var align = { Units: 1 }; this.Assignments.addRow(align); }, this); this.delRes.on("click", function (e) { this.Assignments.removeSelected(); }, this); var me = this; this.Assignments.on("drawcell", function (e) { var ass = e.record, field = e.field; var re = me.getResourceByUID(ass.ResourceUID); if (!re) return; if (field == "ResourceUID") { e.cellHtml = re.Name; } if (field == "Units") { if (re.Type == 1) { e.cellHtml = parseInt(e.value * 100) + "%"; } else { if (re.Type == 2) { e.cellHtml = ""; } else { e.cellHtml = e.value; } } } }, this); this.Assignments.on("cellbeginedit", function (e) { var record = e.record, resource = me.getResourceByUID(record.ResourceUID); if (e.field == "ResourceUID") { e.editor.setData(this.getResources()); } else { if (!resource) { e.cancel = true; return; } } if (e.field == 'Units') { if (resource.Type == 2) { e.cancel = true; } if (resource.Type == 1) { e.value = e.value * 100; } } if (e.field == 'Cost') { if (resource.Type != 2) { e.cancel = true; } } }, this); this.Assignments.on("cellcommitedit", function (e) { var record = e.record, resource = me.getResourceByUID(record.ResourceUID); if (!resource) return; if (e.field == "Units") { if (resource.Type == 1) { //e.value = NumberUtil.toFixed(parseFloat(e.value / 100), 2); var num = parseFloat(e.value / 100); e.value = num; } } }); this.Assignments.on("cellendedit", function (e) { var record = e.record, resource = this.getResourceByUID(record.ResourceUID); if (!resource) return; if (resource.Type != 2) { var Cost = record.Units * resource.Cost; me.Assignments.updateRow(record, { Cost: Cost }); } // if (e.field == "ResourceUID") { // e.editor.setData(this.getResources()); // } // if (e.field == 'Units') { // if (resource.Type == 2) { // e.cancel = true; // } // if (resource.Type == 0) { // // } // } // if (e.field == 'Cost') { // if (resource.Type != 2) { // e.cancel = true; // } // } }, this); ////////////////////////// this.FixedDate.on("checkedchanged", function (e) { this.editEnabled(); }, this); ////////////////////////// this.ok.on("click", function (e) { var ret = true; if (this.callback) ret = this.callback('ok'); if (ret !== false) { this.hide(); } }, this); this.cancel.on("click", function (e) { var ret = true; if (this.callback) ret = this.callback('cancel'); if (ret !== false) { this.hide(); } }, this); this.on("beforebuttonclick", function (e) { if (e.name == "close") { e.cancel = true; var ret = true; if (this.callback) ret = this.callback('close'); if (ret !== false) { this.hide(); } } }, this); }, //如果是摘要任务, 并且不固定工期, 则禁止摘要任务操作日期(开始/完成/工期) editEnabled: function () { this.Duration.enable(); this.Start.enable(); this.Finish.enable(); this.ConstraintType.enable(); this.ConstraintDate.enable(); this.FixedDate.disable(); if (this.__TaskSummary) { this.FixedDate.enable(); if (this.FixedDate.getChecked()) { this.ConstraintType.disable(); this.ConstraintDate.disable(); } else { this.Duration.disable(true); this.Start.disable(true); this.Finish.disable(true); } } }, activeTab: function (tabName) { var tabs = mini.get("twin_tabs"); var tab = tabs.getTab(tabName); if (tab) { tabs.activeTab(tab); } }, setData: function (task, project, callback) { // var tabs = mini.get("twin_tabs"); // var tab = tabs.getTab("adv"); // tabs.updateTab(tab, { visible: false }); //可根据用户权限和操作场景,动态显示和隐藏tab // this.callback = callback; this.project = project; this.dataProject = project.getData(); //部门、负责人 this.Department.setData(this.getDepartments()); this.Department.setValue(task.Department); this.Principal.setData(this.getPrincipalsByDepartment(this.Department.getValue())); this.Principal.setValue(task.Principal); //常规 this.Name.setValue(task.Name); this.PercentComplete.setValue(task.PercentComplete); this.Work.setValue(task.Work); //日期 this.dateChangedAction = "no"; this.Duration.setValue(task.Duration); this.Start.setValue(task.Start); this.Finish.setValue(task.Finish); this.ActualStart.setValue(task.ActualStart); this.ActualFinish.setValue(task.ActualFinish); this.dateChangedAction = null; //高级 var ctypes = mini.Gantt.ConstraintType.clone(); if (task.Summary) { for (var i = ctypes.length - 1; i >= 0; i--) { var ct = ctypes[i]; if (ct.ID != 0 && ct.ID != 4 && ct.ID != 7) { ctypes.removeAt(i); } } } this.ConstraintType.setData(ctypes); this.ConstraintType.setValue(task.ConstraintType); this.ConstraintDate.setValue(task.ConstraintDate); this.FixedDate.setChecked(task.FixedDate == 1); this.Milestone.setChecked(task.Milestone == 1); this.Critical2.setChecked(task.Critical2 == 1); this.WBS.setValue(task.WBS); //前置任务、资源分配 this.PredecessorLink.setData(mini.clone(task.PredecessorLink) || []); var me = this; var ass = mini.clone(task.Assignments) || []; // $.each(ass, function (index, o) { // var re = me.getResourceByUID(o.ResourceUID); // if(re && re.) o.Cost = re. // }); this.Assignments.setData(ass); this.Notes.setValue(task.Notes); //保存初始化的任务开始日期(点击"确定", 判断此值是否变化, 如果变化, 且没有设置任务限制, 则自动设置任务限制) this.__TaskStart = task.Start ? new Date(task.Start.getTime()) : null; this.__TaskSummary = task.Summary == 1; //控件可操作性处理 this.editEnabled(); //设置日期选择框的显示日期为项目开始日期,方便操作 var startDate = this.dataProject.StartDate; this.Start.setViewDate(startDate); this.Finish.setViewDate(startDate); this.ConstraintDate.setViewDate(startDate); this.ActualStart.setViewDate(startDate); this.ActualFinish.setViewDate(startDate); }, getData: function () { var task = { DateChangeAction: this.DateChangeAction, Name: this.Name.getValue(), Department: this.Department.getValue(), Principal: this.Principal.getValue(), PercentComplete: this.PercentComplete.getValue(), Duration: this.Duration.getValue(), Work: this.Work.getValue(), Start: this.Start.getValue(), Finish: this.Finish.getValue(), ActualStart: this.ActualStart.getValue(), ActualFinish: this.ActualFinish.getValue(), ConstraintType: this.ConstraintType.getValue(), ConstraintDate: this.ConstraintDate.getValue(), Notes: this.Notes.getValue(), WBS: this.WBS.getValue(), FixedDate: this.FixedDate.getChecked() ? 1 : 0, Milestone: this.Milestone.getChecked() ? 1 : 0, Critical2: this.Critical2.getChecked() ? 1 : 0 }; //资源分配 task.Assignments = mini.clone(this.Assignments.getData()); //前置任务 task.PredecessorLink = mini.clone(this.PredecessorLink.getData()); //日期范围 if (task.Start) { //开始日期是: 00:00:00 var d = task.Start; task.Start = new Date(d.getFullYear(), d.getMonth(), d.getDate()); } if (task.Finish) {//完成日期是: 23:23:59 var d = task.Finish; task.Finish = new Date(d.getFullYear(), d.getMonth(), d.getDate(), 23, 59, 59); } //任务限制 if (task.ConstraintType == 0 || task.ConstraintType == 1) { task.ConstraintDate = null; if ((!this.__TaskStart && task.Start) || (this.__TaskStart && task.Start && this.__TaskStart.getTime() != task.Start.getTime())) { task.ConstraintType = 4; //不得早于...开始 task.ConstraintDate = new Date(task.Start.getTime()); } } else if (!task.ConstraintDate) { if (task.ConstraintType == 2 || task.ConstraintType == 4 || task.ConstraintType == 5) task.ConstraintDate = new Date(task.Start.getTime()); if (task.ConstraintType == 3 || task.ConstraintType == 6 || task.ConstraintType == 7) task.ConstraintDate = new Date(task.Finish.getTime()); } return task; }, ///////////////////// getResources: function () { var data = this.dataProject.Resources || [] return data; }, getDepartments: function () { var data = this.dataProject.Departments || [] return data; }, getPrincipals: function () { var data = this.dataProject.Principals || [] return data; }, getPrincipalsByDepartment: function (dept) { var psAll = this.getPrincipals(); var ps = []; for (var i = 0, l = psAll.length; i < l; i++) { var p = psAll[i]; if (p.Department == dept) { ps.push(p); } } return ps; }, getTaskByID: function (taskID) { return this.project.getTaskByID(taskID); }, getTaskByUID: function (taskUID) { return this.project.getTask(taskUID); }, getResourceByUID: function (reUID) { return this.project.getResource(reUID); } });