diff --git a/bower.json b/bower.json index 5740e7a6..7fb78377 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "gantt", - "version": "2.1.0", + "version": "2.1.1", "homepage": "http://dhtmlx.com/docs/products/dhtmlxGantt/", "description": "JavaScript event calendar. Allows to manage events and appointments in different views", "main": "codebase/dhtmlxgantt.js", diff --git a/codebase/dhtmlxgantt.js b/codebase/dhtmlxgantt.js index 843dda37..cd779bf7 100644 --- a/codebase/dhtmlxgantt.js +++ b/codebase/dhtmlxgantt.js @@ -35,7 +35,7 @@ if(r+="",s.innerHTML=r,e.content){var d=e.content;"string"==typeof d&&(d=d var o=Math.abs(Math.floor(((window.innerWidth||document.documentElement.offsetWidth)-r.offsetWidth)/2)),d=Math.abs(Math.floor(((window.innerHeight||document.documentElement.offsetHeight)-r.offsetHeight)/2));return r.style.top="top"==t.position?"-3px":d+"px",r.style.left=o+"px",r.onkeydown=e,r.focus(),t.hidden&&dhtmlx.modalbox.hide(r),r}function o(t){return r(t,!0,!1)}function d(t){return r(t,!0,!0)}function l(t){return r(t)}function _(t,e,n){return"object"!=typeof t&&("function"==typeof e&&(n=e,e=""),t={text:t,type:e,callback:n}),t }function h(t,e,n,i){return"object"!=typeof t&&(t={text:t,type:e,expire:n,id:i}),t.id=t.id||g.uid(),t.expire=t.expire||g.expire,t}var c=null;document.attachEvent?document.attachEvent("onkeydown",e):document.addEventListener("keydown",e,!0),dhtmlx.alert=function(){var t=_.apply(this,arguments);return t.type=t.type||"confirm",o(t)},dhtmlx.confirm=function(){var t=_.apply(this,arguments);return t.type=t.type||"alert",d(t)},dhtmlx.modalbox=function(){var t=_.apply(this,arguments);return t.type=t.type||"alert",l(t) },dhtmlx.modalbox.hide=function(t){for(;t&&t.getAttribute&&!t.getAttribute("dhxbox");)t=t.parentNode;t&&(t.parentNode.removeChild(t),n(!1))};var g=dhtmlx.message=function(t){t=h.apply(this,arguments),t.type=t.type||"info";var e=t.type.split("-")[0];switch(e){case"alert":return o(t);case"confirm":return d(t);case"modalbox":return l(t);default:return a(t)}};g.seed=(new Date).valueOf(),g.uid=function(){return g.seed++},g.expire=4e3,g.keyboard=!0,g.position="top",g.pull={},g.timers={},g.hideAll=function(){for(var t in g.pull)g.hide(t) -},g.hide=function(t){var e=g.pull[t];e&&e.parentNode&&(window.setTimeout(function(){e.parentNode.removeChild(e),e=null},2e3),e.className+=" hidden",g.timers[t]&&window.clearTimeout(g.timers[t]),delete g.pull[t])}}(),gantt={version:"2.1.0"},dhtmlxEventable=function(obj){obj._silent_mode=!1,obj._silentStart=function(){this._silent_mode=!0},obj._silentEnd=function(){this._silent_mode=!1},obj.attachEvent=function(t,e,n){return t="ev_"+t.toLowerCase(),this[t]||(this[t]=new this._eventCatcher(n||this)),t+":"+this[t].addEvent(e) +},g.hide=function(t){var e=g.pull[t];e&&e.parentNode&&(window.setTimeout(function(){e.parentNode.removeChild(e),e=null},2e3),e.className+=" hidden",g.timers[t]&&window.clearTimeout(g.timers[t]),delete g.pull[t])}}(),gantt={version:"2.1.1"},dhtmlxEventable=function(obj){obj._silent_mode=!1,obj._silentStart=function(){this._silent_mode=!0},obj._silentEnd=function(){this._silent_mode=!1},obj.attachEvent=function(t,e,n){return t="ev_"+t.toLowerCase(),this[t]||(this[t]=new this._eventCatcher(n||this)),t+":"+this[t].addEvent(e) },obj.callEvent=function(t,e){return this._silent_mode?!0:(t="ev_"+t.toLowerCase(),this[t]?this[t].apply(this,e):!0)},obj.checkEvent=function(t){return!!this["ev_"+t.toLowerCase()]},obj._eventCatcher=function(obj){var dhx_catch=[],z=function(){for(var t=!0,e=0;ethis.config.sensitivity){if(this.config.started=!0,this.config.ignore=!1,th },dragEnd:function(){this.config.marker&&(this.config.marker.parentNode.removeChild(this.config.marker),this.config.marker=null,this.callEvent("onDragEnd",[])),document.body.className=document.body.className.replace(" gantt_noselect","")},getPosition:function(t){var e=0,n=0;return t=t||window.event,t.pageX||t.pageY?(e=t.pageX,n=t.pageY):(t.clientX||t.clientY)&&(e=t.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,n=t.clientY+document.body.scrollTop+document.documentElement.scrollTop),{x:e,y:n} }},gantt._init_grid=function(){this._click.gantt_close=dhtmlx.bind(function(t,e){this.close(e)},this),this._click.gantt_open=dhtmlx.bind(function(t,e){this.open(e)},this),this._click.gantt_row=dhtmlx.bind(function(t,e,n){if(null!==e){var i=this.getTaskNode(e),a=Math.max(i.offsetLeft-this.config.task_scroll_offset,0);this.scrollTo(a),this.callEvent("onTaskRowClick",[e,n])}},this),this._click.gantt_grid_head_cell=dhtmlx.bind(function(t,e,n){var i=n.getAttribute("column_id");if(this.callEvent("onGridHeaderClick",[i,t]))if("add"==i)this._click.gantt_add(t,this.config.root_id); else if(this.config.sort){var a=this._sort&&this._sort.direction&&this._sort.name==i?this._sort.direction:"desc";a="desc"==a?"asc":"desc",this._sort={name:i,direction:a},this._render_grid_header(),this.sort(i,"desc"==a)}},this),!this.config.sort&&this.config.order_branch&&this._init_dnd(),this._click.gantt_add=dhtmlx.bind(function(t,e){if(!this.config.readonly){var n=e?this.getTask(e):!1,i="";if(n)i=n.start_date;else{var a=this._order[0];i=a?this.getTask(a).start_date:this.getState().min_date}n&&(n.$open=!0); -var s={text:gantt.locale.labels.new_task,start_date:this.templates.xml_format(i),duration:1,progress:0,parent:e};this.callEvent("onTaskCreated",[s]),this.addTask(s),this.showTask(s.id),this.selectTask(s.id),this.config.details_on_create&&this.showLightbox(s.id)}},this)},gantt._render_grid=function(){this._is_grid_visible()&&(this._calc_grid_width(),this._render_grid_header())},gantt._calc_grid_width=function(){if(this.config.autofit){for(var t=this.config.columns,e=0,n=[],i=[],a=0;a0?n.length:i.length>0?i.length:1)}if(n.length>0)for(var o=r/(n.length?n.length:1),a=0;an+o.width&&(o.width=this._get_grid_width()-n),n+=o.width; -var d=this._sort&&o.name==this._sort.name?"
":"",l=["gantt_grid_head_cell","gantt_grid_head_"+o.name,r?"gantt_last_cell":"",this.templates.grid_header_class(o.name,o)].join(" "),_="width:"+(o.width-(r?1:0))+"px;",h=o.label||i["column_"+o.name];h=h||"";var c="
"+h+d+"
";e.push(c)}this.$grid_scale.style.height=this.config.scale_height-1+"px",this.$grid_scale.style.lineHeight=a+"px",this.$grid_scale.style.width=n-1+"px",this.$grid_scale.innerHTML=e.join("") +var s={text:gantt.locale.labels.new_task,start_date:this.templates.xml_format(i),duration:1,progress:0,parent:e};s.id=dhtmlx.uid(),this.callEvent("onTaskCreated",[s]),this.config.details_on_create?(s.$new=!0,this._pull[s.id]=this._init_task(s),this._add_branch(s),s.$level=this._item_level(s),this.selectTask(s.id),this.refreshData(),this.showLightbox(s.id)):(this.addTask(s),this.showTask(s.id),this.selectTask(s.id))}},this)},gantt._render_grid=function(){this._is_grid_visible()&&(this._calc_grid_width(),this._render_grid_header()) +},gantt._calc_grid_width=function(){if(this.config.autofit){for(var t=this.config.columns,e=0,n=[],i=[],a=0;a0?n.length:i.length>0?i.length:1)}if(n.length>0)for(var o=r/(n.length?n.length:1),a=0;an+o.width&&(o.width=this._get_grid_width()-n),n+=o.width;var d=this._sort&&o.name==this._sort.name?"
":"",l=["gantt_grid_head_cell","gantt_grid_head_"+o.name,r?"gantt_last_cell":"",this.templates.grid_header_class(o.name,o)].join(" "),_="width:"+(o.width-(r?1:0))+"px;",h=o.label||i["column_"+o.name];h=h||"";var c="
"+h+d+"
";e.push(c)}this.$grid_scale.style.height=this.config.scale_height-1+"px",this.$grid_scale.style.lineHeight=a+"px",this.$grid_scale.style.width=n-1+"px",this.$grid_scale.innerHTML=e.join("") },gantt._render_grid_item=function(t){if(!gantt._is_grid_visible())return null;for(var e=this.config.columns,n=[],i=0;i":(s=o.template?o.template(t):t[o.name],s instanceof Date&&(s=this.templates.date_grid(s)),s="
"+s+"
");var d="gantt_cell"+(r?" gantt_last_cell":""),l="";if(o.tree){for(var _=0;_0; h?(l+=this.templates.grid_open(t),l+=this.templates.grid_folder(t)):(l+=this.templates.grid_blank(t),l+=this.templates.grid_file(t))}var c="width:"+(o.width-(r?1:0))+"px;";dhtmlx.defined(o.align)&&(c+="text-align:"+o.align+";"),a="
"+l+s+"
",n.push(a)}var d=t.$index%2===0?"":" odd";if(d+=t.$transparent?" gantt_transparent":"",this.templates.grid_row_class){var g=this.templates.grid_row_class.call(this,t.start_date,t.end_date,t);g&&(d+=" "+g)}this.getState().selected_task==t.id&&(d+=" gantt_selected"); var u=document.createElement("div");return u.className="gantt_row"+d,u.style.height=this.config.row_height+"px",u.style.lineHeight=gantt.config.row_height+"px",u.setAttribute(this.config.task_attribute,t.id),u.innerHTML=n.join(""),u},gantt.open=function(t){gantt._set_item_state(t,!0),this.callEvent("onTaskOpened",[t])},gantt.close=function(t){gantt._set_item_state(t,!1),this.callEvent("onTaskClosed",[t])},gantt._set_item_state=function(t,e){t&&this._pull[t]&&(this._pull[t].$open=e,this.refreshData()) @@ -138,13 +138,14 @@ null!==e&&delete this.dates[e]}else this.hours=[]},is_working_unit:function(t,e, }return!1},get_working_hours:function(t){var e=this._timestamp({date:t}),n=!0;return void 0!==this.dates[e]?n=this.dates[e]:void 0!==this.dates[t.getDay()]&&(n=this.dates[t.getDay()]),n===!0?this.hours:n?n:[]},get_work_units_between:function(t,e,n,i){if(!n)return!1;for(var a=new Date(t),s=new Date(e),i=i||1,r=0;a.valueOf()s;){var r=gantt.date.add(a,i,n); this.is_working_unit(i>0?a:r,n)&&s++,a=r}return a},get_closest_worktime:function(t){if(this.is_working_unit(t.date,t.unit))return t.date;var e=t.unit,n=gantt.date[e+"_start"](t.date),i=new Date(n),a=new Date(n),s=!0,r=3e3,o=0,d="any"==t.dir||!t.dir,l=1;for("past"==t.dir&&(l=-1);!this.is_working_unit(n,e);)if(d&&(n=s?i:a,l=-1*l),n=gantt.date.add(n,l,e),d&&(s?i=n:a=n),s=!s,o++,o>r)return dhtmlx.assert(!1,"Invalid working time check"),!1;return(n==a||"past"==t.dir)&&(n=gantt.date.add(n,1,e)),n}},gantt.getTask=function(t){return dhtmlx.assert(this._pull[t]),this._pull[t] },gantt.getTaskByTime=function(t,e){var n=this._pull,i=[];if(t||e){t=+t||-1/0,e=+e||1/0;for(var a in n){var s=n[a];+s.start_datet&&i.push(s)}}else for(var a in n)i.push(n[a]);return i},gantt.isTaskExists=function(t){return dhtmlx.defined(this._pull[t])},gantt.isTaskVisible=function(t){if(!this._pull[t])return!1;if(!(+this._pull[t].start_date<+this._max_date&&+this._pull[t].end_date>+this._min_date))return!1;for(var e=0,n=this._order.length;n>e;e++)if(this._order[e]==t)return!0;return!1 -},gantt.updateTask=function(t,e){return dhtmlx.defined(e)||(e=this.getTask(t)),this.callEvent("onBeforeTaskUpdate",[t,e])===!1?!1:(this._pull[e.id]=e,this._is_parent_sync(e)||this._resync_parent(e),this._update_parents(e.id),this.refreshTask(e.id),this.callEvent("onAfterTaskUpdate",[t,e]),this._sync_order(),void this._adjust_scales())},gantt._add_branch=function(t){this._branches[t.parent]||(this._branches[t.parent]=[]),this._branches[t.parent].push(t.id),this._sync_parent(t),this._sync_order()},gantt._move_branch=function(t,e,n){t.parent=n,this._sync_parent(t),this._replace_branch_child(e,t.id),n?this._add_branch(t):delete this._branches[t.id],t.$level=this._item_level(t),this._sync_order() -},gantt._resync_parent=function(t){this._move_branch(t,t.$rendered_parent,t.parent)},gantt._sync_parent=function(t){t.$rendered_parent=t.parent},gantt._is_parent_sync=function(t){return t.$rendered_parent==t.parent},gantt._replace_branch_child=function(t,e,n){var i=this._branches[t];if(i){for(var a=[],s=0;s0;)this.deleteLink(n.$source[0]); -for(;n.$target.length>0;)this.deleteLink(n.$target[0]);return delete this._pull[t],this._move_branch(n,n.parent,null),e||(this.callEvent("onAfterTaskDelete",[t,n]),this.refreshData()),!0},gantt.clearAll=function(){this._pull={},this._branches={},this._order=[],this._order_full=[],this._lpull={},this.refreshData(),this.callEvent("onClear",[])},gantt.changeTaskId=function(t,e){var n=this._pull[e]=this._pull[t];this._pull[e].id=e,delete this._pull[t];for(var i in this._pull)this._pull[i].parent==t&&(this._pull[i].parent=e); -this._lightbox_id==t&&(this._lightbox_id=e),this._replace_branch_child(n.parent,t,e),this.callEvent("onTaskIdChange",[t,e])},gantt._get_duration_unit=function(){return 1e3*gantt._get_line(this.config.duration_unit)||this.config.duration_unit},gantt._get_safe_type=function(t){for(var e in this.config.types)if(this.config.types[e]==t)return t;return gantt.config.types.task},gantt._get_type_name=function(t){for(var e in this.config.types)if(this.config.types[e]==t)return e;return"task"},gantt.getWorkHours=function(t){return this._working_time_helper.get_working_hours(t) +},gantt.updateTask=function(t,e){return dhtmlx.defined(e)||(e=this.getTask(t)),this.callEvent("onBeforeTaskUpdate",[t,e])===!1?!1:(this._pull[e.id]=e,this._is_parent_sync(e)||this._resync_parent(e),this._update_parents(e.id),this.refreshTask(e.id),this.callEvent("onAfterTaskUpdate",[t,e]),this._sync_order(),void this._adjust_scales())},gantt._add_branch=function(t){this._branches[t.parent]||(this._branches[t.parent]=[]);for(var e=this._branches[t.parent],n=!1,i=0,a=e.length;a>i;i++)if(e[i]==t.id){n=!0; +break}n||e.push(t.id),this._sync_parent(t),this._sync_order()},gantt._move_branch=function(t,e,n){t.parent=n,this._sync_parent(t),this._replace_branch_child(e,t.id),n?this._add_branch(t):delete this._branches[t.id],t.$level=this._item_level(t),this._sync_order()},gantt._resync_parent=function(t){this._move_branch(t,t.$rendered_parent,t.parent)},gantt._sync_parent=function(t){t.$rendered_parent=t.parent},gantt._is_parent_sync=function(t){return t.$rendered_parent==t.parent},gantt._replace_branch_child=function(t,e,n){var i=this._branches[t]; +if(i){for(var a=[],s=0;s0;)this.deleteLink(n.$source[0]);for(;n.$target.length>0;)this.deleteLink(n.$target[0]);return delete this._pull[t],this._move_branch(n,n.parent,null),e||(this.callEvent("onAfterTaskDelete",[t,n]),this.refreshData()),!0 +},gantt.clearAll=function(){this._pull={},this._branches={},this._order=[],this._order_full=[],this._lpull={},this.refreshData(),this.callEvent("onClear",[])},gantt._update_flags=function(t,e){this._lightbox_id==t&&(this._lightbox_id=e),this._selected_task==t&&(this._selected_task=e),this._tasks_dnd.drag&&this._tasks_dnd.drag.id==t&&(this._tasks_dnd.drag.id=e)},gantt.changeTaskId=function(t,e){var n=this._pull[e]=this._pull[t];this._pull[e].id=e,delete this._pull[t];for(var i in this._pull)this._pull[i].parent==t&&(this._pull[i].parent=e); +this._update_flags(t,e),this._replace_branch_child(n.parent,t,e),this.callEvent("onTaskIdChange",[t,e])},gantt._get_duration_unit=function(){return 1e3*gantt._get_line(this.config.duration_unit)||this.config.duration_unit},gantt._get_safe_type=function(t){for(var e in this.config.types)if(this.config.types[e]==t)return t;return gantt.config.types.task},gantt._get_type_name=function(t){for(var e in this.config.types)if(this.config.types[e]==t)return e;return"task"},gantt.getWorkHours=function(t){return this._working_time_helper.get_working_hours(t) },gantt.setWorkTime=function(t){this._working_time_helper.set_time(t)},gantt.isWorkTime=function(t,e){var n=this._working_time_helper;return n.is_working_unit(t,e||this.config.duration_unit)},gantt.getClosestWorkTime=function(t){var e=this._working_time_helper;return t instanceof Date&&(t={date:t}),t.dir=t.dir||"any",t.unit=t.unit||this.config.duration_unit,e.get_closest_worktime(t)},gantt.calculateDuration=function(t,e){var n=this._working_time_helper;return n.get_work_units_between(t,e,this.config.duration_unit,this.config.duration_step) -},gantt.calculateEndDate=function(t,e){var n=this._working_time_helper,i=e>=0?1:-1;return n.add_worktime(t,Math.abs(e),this.config.duration_unit,i*this.config.duration_step)},gantt._init_task=function(t){return(!dhtmlx.defined(t.id)||this._pull[t.id])&&(t.id=dhtmlx.uid()),t.start_date&&(t.start_date=gantt.date.parseDate(t.start_date,"xml_date")),t.end_date&&(t.end_date=gantt.date.parseDate(t.end_date,"xml_date")),t.start_date&&!t.end_date&&t.duration&&(t.end_date=this.calculateEndDate(t.start_date,t.duration)),gantt.config.work_time&&gantt.config.correct_work_time&&(t.start_date&&(t.start_date=gantt.getClosestWorkTime(t.start_date)),t.end_date&&(t.end_date=gantt.getClosestWorkTime(t.end_date))),gantt._init_task_timing(t),t.$source=[],t.$target=[],t.parent=t.parent||this.config.root_id,t.$open=dhtmlx.defined(t.open)?t.open:!1,t.$level=this._item_level(t),t +},gantt.calculateEndDate=function(t,e){var n=this._working_time_helper,i=e>=0?1:-1;return n.add_worktime(t,Math.abs(e),this.config.duration_unit,i*this.config.duration_step)},gantt._init_task=function(t){return dhtmlx.defined(t.id)||(t.id=dhtmlx.uid()),t.start_date&&(t.start_date=gantt.date.parseDate(t.start_date,"xml_date")),t.end_date&&(t.end_date=gantt.date.parseDate(t.end_date,"xml_date")),t.start_date&&!t.end_date&&t.duration&&(t.end_date=this.calculateEndDate(t.start_date,t.duration)),gantt.config.work_time&&gantt.config.correct_work_time&&(t.start_date&&(t.start_date=gantt.getClosestWorkTime(t.start_date)),t.end_date&&(t.end_date=gantt.getClosestWorkTime(t.end_date))),gantt._init_task_timing(t),t.$source=[],t.$target=[],t.parent=t.parent||this.config.root_id,t.$open=dhtmlx.defined(t.open)?t.open:!1,t.$level=this._item_level(t),t },gantt._init_task_timing=function(t){void 0===t.$rendered_type?t.$rendered_type=t.type:t.$rendered_type!=t.type&&(delete t.$no_end,delete t.$no_start,t.$rendered_type=t.type),void 0!==t.$no_end&&void 0!==t.$no_start||t.type==this.config.types.milestone||(t.type==this.config.types.project?t.$no_end=t.$no_start=!0:(t.$no_end=!(t.end_date||t.duration),t.$no_start=!t.start_date)),t.type==this.config.types.milestone&&(t.end_date=t.start_date),t.start_date&&t.end_date&&(t.duration=this.calculateDuration(t.start_date,t.end_date)),t.duration=t.duration||0 },gantt._is_flex_task=function(t){return!(!t.$no_end&&!t.$no_start)},gantt._update_parents=function(t,e){if(t){for(var n=this.getTask(t);!n.$no_end&&!n.$no_start&&n.parent&&this.isTaskExists(n.parent);)n=this.getTask(n.parent);if(n.$no_end){var i=0;this.eachTask(function(t){t.end_date&&+t.end_date>+i&&(i=new Date(t.end_date))},n.id),i&&(n.end_date=i)}if(n.$no_start){var a=1/0;this.eachTask(function(t){t.start_date&&+t.start_date<+a&&(a=new Date(t.start_date))},n.id),1/0!=a&&(n.start_date=a)}(n.$no_end||n.$no_start)&&(this._init_task_timing(n),e||this.refreshTask(n.id,!0)),n.parent&&this.isTaskExists(n.parent)&&this._update_parents(n.parent,e) }},gantt.isChildOf=function(t,e){if(!this.isTaskExists(t))return!1;if(e===this.config.root_id)return this.isTaskExists(t);for(var n=this.getTask(t);n&&this.isTaskExists(n.parent);)if(n=this.getTask(n.parent),n&&n.id==e)return!0;return!1},gantt._get_closest_date=function(t){for(var e=t.date,n=t.step,i=t.unit,a=gantt.date[i+"_start"](new Date(this._min_date));+e>+a;)a=gantt.date.add(a,n,i);var s=gantt.date.add(a,-1*n,i);return t.dir&&"future"==t.dir?a:t.dir&&"past"==t.dir?s:Math.abs(e-s)0&&(o+=" ");var _="";switch(l){case"%Y":t._time_format_order[2]=d,t._time_format_order.size++; -for(var h=a.getFullYear()-5,c=0;10>c;c++)_+="";break;case"%m":t._time_format_order[1]=d,t._time_format_order.size++;for(var c=0;12>c;c++)_+="";break;case"%d":t._time_format_order[0]=d,t._time_format_order.size++;for(var c=1;32>c;c++)_+="";break;case"%H:%i":var s=1440,r=0;t._time_format_order[3]=d,t._time_format_order.size++;var c=r,g=a.getDate();for(t._time_values=[];s>c;){var u=this.templates.time_picker(a); -_+="",t._time_values.push(c),a.setTime(a.valueOf()+60*this._get_timepicker_step()*1e3);var f=a.getDate()!=g?1:0;c=24*f*60+60*a.getHours()+a.getMinutes()}}if(_){var p=t.readonly?"disabled='disabled'":"",m=e?" style='display:none'":"";o+=""}}return o},_fill_lightbox_select:function(t,e,n,i){if(t[e+i[0]].value=n.getDate(),t[e+i[1]].value=n.getMonth(),t[e+i[2]].value=n.getFullYear(),dhtmlx.defined(i[3])){var a=60*n.getHours()+n.getMinutes(); +gantt._save_lightbox();break;case gantt.keys.edit_cancel:gantt._cancel_lightbox()}}},gantt._cancel_lightbox=function(){var t=this.getLightboxValues();this.callEvent("onLightboxCancel",[this._lightbox_id,t.$new]),t.$new&&(this._deleteTask(t.id,!0),this.refreshData()),this.hideLightbox()},gantt._save_lightbox=function(){var t=this.getLightboxValues();this.callEvent("onLightboxSave",[this._lightbox_id,t,!!t.$new])&&(t.$new?(delete t.$new,this.addTask(t)):(dhtmlx.mixin(this.getTask(t.id),t,!0),this.updateTask(t.id)),this.refreshData(),this.hideLightbox()) +},gantt.getLightboxValues=function(){for(var t=dhtmlx.mixin({},this.getTask(this._lightbox_id)),e=this._get_typed_lightbox_config(),n=0;n0&&(o+=" ");var _="";switch(l){case"%Y":t._time_format_order[2]=d,t._time_format_order.size++;for(var h=a.getFullYear()-5,c=0;10>c;c++)_+="";break;case"%m":t._time_format_order[1]=d,t._time_format_order.size++;for(var c=0;12>c;c++)_+="";break;case"%d":t._time_format_order[0]=d,t._time_format_order.size++;for(var c=1;32>c;c++)_+="";break;case"%H:%i":var s=1440,r=0; +t._time_format_order[3]=d,t._time_format_order.size++;var c=r,g=a.getDate();for(t._time_values=[];s>c;){var u=this.templates.time_picker(a);_+="",t._time_values.push(c),a.setTime(a.valueOf()+60*this._get_timepicker_step()*1e3);var f=a.getDate()!=g?1:0;c=24*f*60+60*a.getHours()+a.getMinutes()}}if(_){var p=t.readonly?"disabled='disabled'":"",m=e?" style='display:none'":"";o+=""}}return o},_fill_lightbox_select:function(t,e,n,i){if(t[e+i[0]].value=n.getDate(),t[e+i[1]].value=n.getMonth(),t[e+i[2]].value=n.getFullYear(),dhtmlx.defined(i[3])){var a=60*n.getHours()+n.getMinutes(); a=Math.round(a/gantt._get_timepicker_step())*gantt._get_timepicker_step(),t[e+i[3]].value=a}},template:{render:function(t){var e=(t.height||"30")+"px";return"
"},set_value:function(t,e){t.innerHTML=e||""},get_value:function(t){return t.innerHTML||""},focus:function(){}},textarea:{render:function(t){var e=(t.height||"130")+"px";return"
"},set_value:function(t,e){t.firstChild.value=e||"" },get_value:function(t){return t.firstChild.value},focus:function(t){var e=t.firstChild;gantt._focus(e,!0)}},select:{render:function(t){for(var e=(t.height||"23")+"px",n="
"},set_value:function(t,e,n,i){var a=t.firstChild;!a._dhx_onchange&&i.onchange&&(a.onchange=i.onchange,a._dhx_onchange=!0),"undefined"==typeof e&&(e=(a.options[0]||{}).value),a.value=e||"" },get_value:function(t){return t.firstChild.value},focus:function(t){var e=t.firstChild;gantt._focus(e,!0)}},time:{render:function(t){var e=this.form_blocks.getTimePicker.call(this,t),n=["
"];return n.push(e),t.single_date?(e=this.form_blocks.getTimePicker.call(this,t,!0),n.push("")):n.push("  –  "),n.push(e),n.push("
"),n.join("") @@ -207,8 +208,8 @@ var n=[];for(var i in t)t.hasOwnProperty(i)&&n.push(this.escape((e||"")+i)+"="+t for(var i=0;i
",this.$grid_scale=this.$grid.childNodes[0],this.$grid_data=this.$grid.childNodes[1],this.$task.innerHTML="
",this.$task_scale=this.$task.childNodes[0],this.$task_data=this.$task.childNodes[1],this.$task_bg=this.$task_data.childNodes[0],this.$task_links=this.$task_data.childNodes[1],this.$task_bars=this.$task_data.childNodes[2] -},gantt.$click={buttons:{edit:function(t){gantt.showLightbox(t)},"delete":function(t){var e=gantt.locale.labels.confirm_deleting,n=gantt.locale.labels.confirm_deleting_title;gantt._dhtmlx_confirm(e,n,function(){gantt.deleteTask(t),gantt.hideLightbox()})}}},gantt._calculate_content_height=function(){var t=this.config.scale_height,e=this._order.length*this.config.row_height,n=this._scroll_hor?this.config.scroll_size+1:0;return this._is_grid_visible()||this._is_chart_visible()?t+e+2+n:0},gantt._calculate_content_width=function(){{var t=this._get_grid_width(),e=this._tasks?this._tasks.full_width:0; -this._scroll_ver?this.config.scroll_size+1:0}return this._is_chart_visible()||(e=0),this._is_grid_visible()||(t=0),t+e+1},gantt._get_resize_options=function(){var t={x:!1,y:!1};return"xy"==this.config.autosize?t.x=t.y=!0:"y"==this.config.autosize||this.config.autosize===!0?t.y=!0:"x"==this.config.autosize&&(t.x=!0),t},gantt._set_sizes=function(){var t=this._get_resize_options();if(t.y&&(this._obj.style.height=this._calculate_content_height()+"px"),t.x&&(this._obj.style.width=this._calculate_content_width()+"px"),this._y=this._obj.clientHeight,!(this._y<20)){this.$grid.style.height=this.$task.style.height=Math.max(this._y-this.$scroll_hor.offsetHeight-2,0)+"px"; +},gantt.$click={buttons:{edit:function(t){gantt.showLightbox(t)},"delete":function(t){var e=gantt.locale.labels.confirm_deleting,n=gantt.locale.labels.confirm_deleting_title;gantt._dhtmlx_confirm(e,n,function(){var e=gantt.getTask(t);e.$new?(gantt._deleteTask(t,!0),gantt.refreshData()):gantt.deleteTask(t),gantt.hideLightbox()})}}},gantt._calculate_content_height=function(){var t=this.config.scale_height,e=this._order.length*this.config.row_height,n=this._scroll_hor?this.config.scroll_size+1:0;return this._is_grid_visible()||this._is_chart_visible()?t+e+2+n:0 +},gantt._calculate_content_width=function(){{var t=this._get_grid_width(),e=this._tasks?this._tasks.full_width:0;this._scroll_ver?this.config.scroll_size+1:0}return this._is_chart_visible()||(e=0),this._is_grid_visible()||(t=0),t+e+1},gantt._get_resize_options=function(){var t={x:!1,y:!1};return"xy"==this.config.autosize?t.x=t.y=!0:"y"==this.config.autosize||this.config.autosize===!0?t.y=!0:"x"==this.config.autosize&&(t.x=!0),t},gantt._set_sizes=function(){var t=this._get_resize_options();if(t.y&&(this._obj.style.height=this._calculate_content_height()+"px"),t.x&&(this._obj.style.width=this._calculate_content_width()+"px"),this._y=this._obj.clientHeight,!(this._y<20)){this.$grid.style.height=this.$task.style.height=Math.max(this._y-this.$scroll_hor.offsetHeight-2,0)+"px"; var e=Math.max(this._y-(this.config.scale_height||0)-this.$scroll_hor.offsetHeight-2,0);this.$grid_data.style.height=this.$task_data.style.height=e+"px";var n=Math.max(this._get_grid_width()-1,0);this.$grid.style.width=n+"px",this.$grid.style.display=0===n?"none":"",this._x=this._obj.clientWidth,this._x<20||(this.$grid_data.style.width=Math.max(this._get_grid_width()-1,0)+"px",this.$task.style.width=Math.max(this._x-this._get_grid_width()-2,0)+"px")}},gantt.getScrollState=function(){return{x:this.$task.scrollLeft,y:this.$task_data.scrollTop} },gantt.scrollTo=function(t,e){1*t==t&&(this.$task.scrollLeft=t),1*e==e&&(this.$task_data.scrollTop=e,this.$grid_data.scrollTop=e)},gantt.showDate=function(t){var e=this.posFromDate(t),n=Math.max(e-this.config.task_scroll_offset,0);this.scrollTo(n)},gantt.showTask=function(t){var e=this.getTaskNode(t);if(e){var n=Math.max(e.offsetLeft-this.config.task_scroll_offset,0),i=e.offsetTop-(this.$task_data.offsetHeight-this.config.row_height)/2;this.scrollTo(n,i)}},gantt._on_resize=gantt.setSizes=function(){gantt._set_sizes(),gantt._scroll_resize() },gantt.render=function(){if(this._render_grid(),this._render_tasks_scales(),this._scroll_resize(),this._on_resize(),this._render_data(),this.config.initial_scroll){var t=this._order[0]||this.config.root_id;t&&this.showTask(t)}this.callEvent("onGanttRender",[])},gantt._set_scroll_events=function(){dhtmlxEvent(this.$scroll_hor,"scroll",function(){if(!gantt._touch_scroll_active){var t=gantt.$scroll_hor.scrollLeft;gantt.scrollTo(t)}}),dhtmlxEvent(this.$scroll_ver,"scroll",function(){if(!gantt._touch_scroll_active){var t=gantt.$scroll_ver.scrollTop; @@ -221,7 +222,7 @@ if(a==t)return e[i]}return null},gantt.getState=function(){return{drag_id:this._ if(t){if(this._selected_task==t)return this._selected_task;if(!this.callEvent("onBeforeTaskSelected",[t]))return!1;this.unselectTask(),this._selected_task=t,this.refreshTask(t),this.callEvent("onTaskSelected",[t])}return this._selected_task},gantt.unselectTask=function(){var t=this._selected_task;t&&(this._selected_task=null,this.refreshTask(t),this.callEvent("onTaskUnselected",[t]))},gantt.getSelectedId=function(){return dhtmlx.defined(this._selected_task)?this._selected_task:null},gantt.changeLightboxType=function(t){return this.getLightboxType()==t?!0:void gantt._silent_redraw_lightbox(t) },gantt.date={init:function(){for(var t=gantt.locale.date.month_short,e=gantt.locale.date.month_short_hash={},n=0;nt?"0"+t:t},copy:function(t){return new Date(t.valueOf())},date_to_str:function(t,e){return t=t.replace(/%[a-zA-Z]/g,function(t){switch(t){case"%d":return'"+gantt.date.to_fixed(date.getDate())+"'; +},add:function(t,e,n){var i=new Date(t.valueOf());switch(n){case"day":i=gantt.date._add_days(i,e);break;case"week":i=gantt.date._add_days(i,7*e);break;case"month":i.setMonth(i.getMonth()+e);break;case"year":i.setYear(i.getFullYear()+e);break;case"hour":i.setTime(i.getTime()+60*e*60*1e3);break;case"minute":i.setTime(i.getTime()+60*e*1e3);break;default:return gantt.date["add_"+n](t,e,n)}return i},to_fixed:function(t){return 10>t?"0"+t:t},copy:function(t){return new Date(t.valueOf())},date_to_str:function(t,e){return t=t.replace(/%[a-zA-Z]/g,function(t){switch(t){case"%d":return'"+gantt.date.to_fixed(date.getDate())+"'; case"%m":return'"+gantt.date.to_fixed((date.getMonth()+1))+"';case"%j":return'"+date.getDate()+"';case"%n":return'"+(date.getMonth()+1)+"';case"%y":return'"+gantt.date.to_fixed(date.getFullYear()%100)+"';case"%Y":return'"+date.getFullYear()+"';case"%D":return'"+gantt.locale.date.day_short[date.getDay()]+"';case"%l":return'"+gantt.locale.date.day_full[date.getDay()]+"';case"%M":return'"+gantt.locale.date.month_short[date.getMonth()]+"';case"%F":return'"+gantt.locale.date.month_full[date.getMonth()]+"'; case"%h":return'"+gantt.date.to_fixed((date.getHours()+11)%12+1)+"';case"%g":return'"+((date.getHours()+11)%12+1)+"';case"%G":return'"+date.getHours()+"';case"%H":return'"+gantt.date.to_fixed(date.getHours())+"';case"%i":return'"+gantt.date.to_fixed(date.getMinutes())+"';case"%a":return'"+(date.getHours()>11?"pm":"am")+"';case"%A":return'"+(date.getHours()>11?"PM":"AM")+"';case"%s":return'"+gantt.date.to_fixed(date.getSeconds())+"';case"%W":return'"+gantt.date.to_fixed(gantt.date.getISOWeek(date))+"'; default:return t}}),e&&(t=t.replace(/date\.get/g,"date.getUTC")),new Function("date",'return "'+t+'";')},str_to_date:function(t,e){for(var n="var temp=date.match(/[a-zA-Z]+|[0-9]+/g);",i=t.match(/%[a-zA-Z]/g),a=0;a50?1900:2000);";break;case"%g":case"%G":case"%h":case"%H":n+="set[3]=temp["+a+"]||0;";break;case"%i":n+="set[4]=temp["+a+"]||0;"; diff --git a/sources/dhtmlxgantt.js b/sources/dhtmlxgantt.js index 981c6431..1846b192 100644 --- a/sources/dhtmlxgantt.js +++ b/sources/dhtmlxgantt.js @@ -1213,7 +1213,7 @@ if(!window.dhtmlx) }; })(); gantt = { - version:"2.1.0" + version:"2.1.1" }; /*jsl:ignore*/ @@ -1619,12 +1619,26 @@ gantt._init_grid = function() { parent.$open = true; var item = { text:gantt.locale.labels.new_task, start_date:this.templates.xml_format(startDate), duration: 1, progress: 0, parent: id }; + item.id = dhtmlx.uid(); this.callEvent("onTaskCreated", [item]); - this.addTask(item); - this.showTask(item.id); - this.selectTask(item.id); - if (this.config.details_on_create) - this.showLightbox(item.id); + + if (this.config.details_on_create){ + item.$new = true; + this._pull[item.id] = this._init_task(item); + + this._add_branch(item); + item.$level = this._item_level(item); + this.selectTask(item.id); + this.refreshData(); + this.showLightbox(item.id); + }else{ + this.addTask(item); + + this.showTask(item.id); + this.selectTask(item.id); + } + + }, this); @@ -4917,7 +4931,17 @@ gantt.updateTask = function(id, item) { gantt._add_branch = function(task){ if (!this._branches[task.parent]) this._branches[task.parent] = []; - this._branches[task.parent].push(task.id); + var branch = this._branches[task.parent]; + var added_already = false; + for(var i = 0, length = branch.length; i < length; i++){ + if(branch[i] == task.id){ + added_already = true; + break; + } + } + if(!added_already) + branch.push(task.id); + this._sync_parent(task); this._sync_order(); }; @@ -4992,8 +5016,7 @@ gantt._deleteTask = function(id, silent) { this._dp.setUpdateMode("off"); var branches = this._branches[item.id] || []; - if(this._selected_task == id) - this._selected_task = null; + this._update_flags(id, false); for (var i = 0; i < branches.length; i++) { this._silentStart(); @@ -5037,6 +5060,17 @@ gantt.clearAll = function() { this.callEvent("onClear", []); }; +gantt._update_flags = function(oldid, newid){ + // TODO: need a proper way to update all possible flags + if (this._lightbox_id == oldid) + this._lightbox_id = newid; + if (this._selected_task == oldid){ + this._selected_task = newid; + } + if (this._tasks_dnd.drag && this._tasks_dnd.drag.id == oldid){ + this._tasks_dnd.drag.id = newid; + } +}; gantt.changeTaskId = function(oldid, newid) { var item = this._pull[newid] = this._pull[oldid]; this._pull[newid].id = newid; @@ -5045,8 +5079,7 @@ gantt.changeTaskId = function(oldid, newid) { if (this._pull[id].parent == oldid) this._pull[id].parent = newid; } - if (this._lightbox_id == oldid) - this._lightbox_id = newid; + this._update_flags(oldid, newid); this._replace_branch_child(item.parent, oldid, newid); this.callEvent("onTaskIdChange", [oldid, newid]); @@ -5108,7 +5141,7 @@ gantt.calculateEndDate = function(start, duration, unit){ }; gantt._init_task = function(task){ - if (!dhtmlx.defined(task.id) || this._pull[task.id]) + if (!dhtmlx.defined(task.id)) task.id = dhtmlx.uid(); if(task.start_date) @@ -5834,7 +5867,12 @@ gantt._init_lightbox_events = function(){ gantt._cancel_lightbox=function(){ - this.callEvent("onLightboxCancel",[this._lightbox_id, this.$new]); + var task = this.getLightboxValues(); + this.callEvent("onLightboxCancel",[this._lightbox_id, task.$new]); + if(task.$new){ + this._deleteTask(task.id, true); + this.refreshData(); + } this.hideLightbox(); }; @@ -5844,6 +5882,7 @@ gantt._save_lightbox=function(){ return; if (task.$new){ + delete task.$new; this.addTask(task); }else{ dhtmlx.mixin(this.getTask(task.id), task, true); @@ -7211,7 +7250,14 @@ gantt.$click={ var title = gantt.locale.labels.confirm_deleting_title; gantt._dhtmlx_confirm(question, title, function(){ - gantt.deleteTask(id); + var task = gantt.getTask(id); + if(task.$new){ + gantt._deleteTask(id, true); + gantt.refreshData(); + }else{ + gantt.deleteTask(id); + } + gantt.hideLightbox(); }); } @@ -7655,8 +7701,24 @@ gantt.date={ break; case "month": ndate.setMonth(ndate.getMonth()+inc); break; case "year": ndate.setYear(ndate.getFullYear()+inc); break; - case "hour": ndate.setHours(ndate.getHours()+inc); break; - case "minute": ndate.setMinutes(ndate.getMinutes()+inc); break; + case "hour": + /* + adding hours/minutes via setHour(getHour() + inc) gives weird result when + adding one hour to the time before switch to a Daylight Saving time + + example: //Sun Mar 30 2014 01:00:00 GMT+0100 (W. Europe Standard Time) + new Date(2014, 02, 30, 1).setHours(2) + >>Sun Mar 30 2014 01:00:00 GMT+0100 (W. Europe Standard Time) + + setTime seems working as expected + */ + ndate.setTime(ndate.getTime()+inc * 60 * 60 * 1000); + break; + case "minute": + + ndate.setTime(ndate.getTime() + inc * 60 * 1000); + + break; default: return gantt.date["add_"+mode](date,inc,mode); }