New dhtmlxGantt library, and etemplate2 widget to use it (work in progress)

This commit is contained in:
Nathan Gray
2014-04-16 19:47:29 +00:00
parent 3b68b8bff8
commit c4f56f2c3b
280 changed files with 30260 additions and 480 deletions

View File

@ -0,0 +1,181 @@
/*
This software is allowed to use under GPL or you need to obtain Commercial or Enterprise License
to use it in non-GPL project. Please contact sales@dhtmlx.com for details
*/
gantt.config.quickinfo_buttons = ["icon_delete","icon_edit"];
gantt.config.quick_info_detached = true;
gantt.attachEvent("onTaskClick", function(id){
gantt.showQuickInfo(id);
return true;
});
(function(){
var events = ["onEmptyClick", "onViewChange", "onLightbox", "onBeforeTaskDelete", "onBeforeDrag"];
var hiding_function = function(){
gantt._hideQuickInfo();
return true;
};
for (var i=0; i<events.length; i++)
gantt.attachEvent(events[i], hiding_function);
})();
gantt.templates.quick_info_title = function(start, end, ev){ return ev.text.substr(0,50); };
gantt.templates.quick_info_content = function(start, end, ev){ return ev.details || ev.text; };
gantt.templates.quick_info_date = function(start, end, ev){
return gantt.templates.task_time(start, end, ev);
};
gantt.showQuickInfo = function(id){
if (id == this._quick_info_box_id) return;
this.hideQuickInfo(true);
var pos = this._get_event_counter_part(id);
if (pos){
this._quick_info_box = this._init_quick_info(pos);
this._fill_quick_data(id);
this._show_quick_info(pos);
}
};
gantt._hideQuickInfo = function(){
gantt.hideQuickInfo();
};
gantt.hideQuickInfo = function(forced){
var qi = this._quick_info_box;
this._quick_info_box_id = 0;
if (qi && qi.parentNode){
if (gantt.config.quick_info_detached)
return qi.parentNode.removeChild(qi);
if (qi.style.right == "auto")
qi.style.left = "-350px";
else
qi.style.right = "-350px";
if (forced)
qi.parentNode.removeChild(qi);
}
};
dhtmlxEvent(window, "keydown", function(e){
if (e.keyCode == 27)
gantt.hideQuickInfo();
});
gantt._show_quick_info = function(pos){
var qi = gantt._quick_info_box;
if (gantt.config.quick_info_detached){
if (!qi.parentNode ||
qi.parentNode.nodeName.toLowerCase() == "#document-fragment")//IE8
gantt.$task_data.appendChild(qi);
var width = qi.offsetWidth;
var height = qi.offsetHeight;
var scrolls = this.getScrollState();
var screen_width = this.$task.offsetWidth + scrolls.x - width;
qi.style.left = Math.min(Math.max(scrolls.x, pos.left - pos.dx*(width - pos.width)), screen_width) + "px";
qi.style.top = pos.top - (pos.dy?height:-pos.height) - 25 + "px";
} else {
qi.style.top = 20 + "px";
if (pos.dx == 1){
qi.style.right = "auto";
qi.style.left = "-300px";
setTimeout(function(){
qi.style.left = "-10px";
},1);
} else {
qi.style.left = "auto";
qi.style.right = "-300px";
setTimeout(function(){
qi.style.right = "-10px";
},1);
}
qi.className = qi.className.replace("dhx_qi_left","").replace("dhx_qi_left","")+" dhx_qi_"+(pos==1?"left":"right");
gantt._obj.appendChild(qi);
}
};
gantt._init_quick_info = function(){
if (!this._quick_info_box){
var qi = this._quick_info_box = document.createElement("div");
qi.className = "dhx_cal_quick_info";
if (gantt.$testmode)
qi.className += " dhx_no_animate";
//title
var html = "<div class=\"dhx_cal_qi_title\">" +
"<div class=\"dhx_cal_qi_tcontent\"></div><div class=\"dhx_cal_qi_tdate\"></div>" +
"</div>" +
"<div class=\"dhx_cal_qi_content\"></div>";
//buttons
html += "<div class=\"dhx_cal_qi_controls\">";
var buttons = gantt.config.quickinfo_buttons;
for (var i = 0; i < buttons.length; i++)
html += "<div class=\"dhx_qi_big_icon "+buttons[i]+"\" title=\""+gantt.locale.labels[buttons[i]]+"\"><div class='dhx_menu_icon " + buttons[i] + "'></div><div>"+gantt.locale.labels[buttons[i]]+"</div></div>";
html += "</div>";
qi.innerHTML = html;
dhtmlxEvent(qi, "click", function(ev){
ev = ev || event;
gantt._qi_button_click(ev.target || ev.srcElement);
});
if (gantt.config.quick_info_detached)
dhtmlxEvent(gantt.$task_data, "scroll", function(){ gantt.hideQuickInfo(); });
}
return this._quick_info_box;
};
gantt._qi_button_click = function(node){
var box = gantt._quick_info_box;
if (!node || node == box) return;
var mask = node.className;
if (mask.indexOf("_icon")!=-1){
var id = gantt._quick_info_box_id;
gantt.$click.buttons[mask.split(" ")[1].replace("icon_","")](id);
} else
gantt._qi_button_click(node.parentNode);
};
gantt._get_event_counter_part = function(id){
var domEv = gantt.getTaskNode(id);
var left = 0;
var top = 0;
var node = domEv;
while (node && node.className != "gantt_task"){
left += node.offsetLeft;
top += node.offsetTop;
node = node.offsetParent;
}
var scroll = this.getScrollState();
if(node){
var dx = (left + domEv.offsetWidth/2) - scroll.x > (gantt._x/2) ? 1 : 0;
var dy = (top + domEv.offsetHeight/2) - scroll.y > (gantt._y/2) ? 1 : 0;
return { left:left, top:top, dx:dx, dy:dy,
width:domEv.offsetWidth, height:domEv.offsetHeight };
}
return 0;
};
gantt._fill_quick_data = function(id){
var ev = gantt.getTask(id);
var qi = gantt._quick_info_box;
gantt._quick_info_box_id = id;
//title content
var titleContent = qi.firstChild.firstChild;
titleContent.innerHTML = gantt.templates.quick_info_title(ev.start_date, ev.end_date, ev);
var titleDate = titleContent.nextSibling;
titleDate.innerHTML = gantt.templates.quick_info_date(ev.start_date, ev.end_date, ev);
//main content
var main = qi.firstChild.nextSibling;
main.innerHTML = gantt.templates.quick_info_content(ev.start_date, ev.end_date, ev);
};

View File

@ -0,0 +1,5 @@
/*
This software is allowed to use under GPL or you need to obtain Commercial or Enterprise License
to use it in non-GPL project. Please contact sales@dhtmlx.com for details
*/
{"version":3,"file":"dhtmlxgantt_quick_info.js.map","sources":["dhtmlxgantt_quick_info.js"],"names":["gantt","config","quickinfo_buttons","quick_info_detached","attachEvent","id","showQuickInfo","events","hiding_function","_hideQuickInfo","i","length","templates","quick_info_title","start","end","ev","text","substr","quick_info_content","details","quick_info_date","task_time","this","_quick_info_box_id","hideQuickInfo","pos","_get_event_counter_part","_quick_info_box","_init_quick_info","_fill_quick_data","_show_quick_info","forced","qi","parentNode","removeChild","style","right","left","dhtmlxEvent","window","e","keyCode","nodeName","toLowerCase","$task_data","appendChild","width","offsetWidth","height","offsetHeight","scrolls","getScrollState","screen_width","$task","x","Math","min","max","dx","top","dy","setTimeout","className","replace","_obj","document","createElement","$testmode","html","buttons","locale","labels","innerHTML","event","_qi_button_click","target","srcElement","node","box","mask","indexOf","$click","split","domEv","getTaskNode","offsetLeft","offsetTop","offsetParent","scroll","_x","y","_y","getTask","titleContent","firstChild","start_date","end_date","titleDate","nextSibling","main"],"mappings":"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"}

View File

@ -0,0 +1,145 @@
/*
This software is allowed to use under GPL or you need to obtain Commercial or Enterprise License
to use it in non-GPL project. Please contact sales@dhtmlx.com for details
*/
gantt._tooltip = {};
gantt._tooltip_class = "gantt_tooltip";
gantt.config.tooltip_timeout = 30;//,
// timeout_to_hide: 50,
// delta_x: 15,
// delta_y: -20
gantt._create_tooltip = function(){
if (!this._tooltip_html){
this._tooltip_html = document.createElement('div');
this._tooltip_html.className = gantt._tooltip_class;
}
return this._tooltip_html;
};
gantt._show_tooltip = function(text, pos) {
if (gantt.config.touch && !gantt.config.touch_tooltip) return;
var tip = this._create_tooltip();
tip.innerHTML = text;
gantt.$task_data.appendChild(tip);
var width = tip.offsetWidth + 20;
var height = tip.offsetHeight + 40;
var max_height = this.$task.offsetHeight;
var max_width = this.$task.offsetWidth;
var scroll = this.getScrollState();
pos.x += scroll.x;
pos.y += scroll.y;
pos.y = Math.min(Math.max(scroll.y, pos.y), scroll.y+max_height - height);
pos.x = Math.min(Math.max(scroll.x, pos.x), scroll.x+max_width - width);
tip.style.left = pos.x + "px";
tip.style.top = pos.y + "px";
};
gantt._hide_tooltip = function(){
if (this._tooltip_html && this._tooltip_html.parentNode)
this._tooltip_html.parentNode.removeChild(this._tooltip_html);
this._tooltip_id = 0;
};
gantt._is_tooltip = function(ev) {
var node = ev.target || ev.srcElement;
return gantt._is_node_child(node, function(node){
return (node.className == this._tooltip_class);
});
};
gantt._is_task_line = function(ev){
var node = ev.target || ev.srcElement;
return gantt._is_node_child(node, function(node){
return (node == this.$task_data);
});
};
gantt._is_node_child = function(node, condition){
var res = false;
while (node && !res) {
res = condition.call(gantt, node);
node = node.parentNode;
}
return res;
};
gantt._tooltip_pos = function(ev) {
if (ev.pageX || ev.pageY)
var pos = {x:ev.pageX, y:ev.pageY};
var d = _isIE ? document.documentElement : document.body;
var pos = {
x:ev.clientX + d.scrollLeft - d.clientLeft,
y:ev.clientY + d.scrollTop - d.clientTop
};
var box = gantt._get_position(gantt.$task);
pos.x = pos.x - box.x;
pos.y = pos.y - box.y;
return pos;
};
gantt.attachEvent("onMouseMove", function(event_id, ev) { // (gantt event_id, browser event)
if(this.config.tooltip_timeout){
//making events survive timeout in ie
if(document.createEventObject && !document.createEvent)
ev = document.createEventObject(ev);
var delay = this.config.tooltip_timeout;
if(this._tooltip_id && !event_id){
if(!isNaN(this.config.tooltip_hide_timeout)){
delay = this.config.tooltip_hide_timeout;
}
}
clearTimeout(gantt._tooltip_ev_timer);
gantt._tooltip_ev_timer = setTimeout(function(){
gantt._init_tooltip(event_id, ev);
}, delay);
}else{
gantt._init_tooltip(event_id, ev);
}
});
gantt._init_tooltip = function(event_id, ev){
if (this._is_tooltip(ev)) return;
if (event_id == this._tooltip_id && !this._is_task_line(ev)) return;
if (!event_id)
return this._hide_tooltip();
this._tooltip_id = event_id;
var task = this.getTask(event_id);
var text = this.templates.tooltip_text(task.start_date, task.end_date, task);
if (!text)
this._hide_tooltip();
this._show_tooltip(text, this._tooltip_pos(ev));
};
gantt.attachEvent("onMouseLeave", function(ev){
if (gantt._is_tooltip(ev)) return;
this._hide_tooltip();
});
// gantt.attachEvent("onBeforeDrag", function() {
// gantt._tooltip.hide();
// return true;
// });
// gantt.attachEvent("onEventDeleted", function() {
// gantt._tooltip.hide();
// return true;
// });
/* Could be redifined */
gantt.templates.tooltip_date_format = gantt.date.date_to_str("%Y-%m-%d");
gantt.templates.tooltip_text = function(start, end, event) {
return "<b>Task:</b> " + event.text + "<br/><b>Start date:</b> " + gantt.templates.tooltip_date_format(start) + "<br/><b>End date:</b> " + gantt.templates.tooltip_date_format(end);
};

View File

@ -0,0 +1,5 @@
/*
This software is allowed to use under GPL or you need to obtain Commercial or Enterprise License
to use it in non-GPL project. Please contact sales@dhtmlx.com for details
*/
{"version":3,"file":"dhtmlxgantt_tooltip.js.map","sources":["dhtmlxgantt_tooltip.js"],"names":["gantt","_tooltip","_tooltip_class","config","tooltip_timeout","_create_tooltip","this","_tooltip_html","document","createElement","className","_show_tooltip","text","pos","touch","touch_tooltip","tip","innerHTML","$task_data","appendChild","width","offsetWidth","height","offsetHeight","max_height","$task","max_width","scroll","getScrollState","x","y","Math","min","max","style","left","top","_hide_tooltip","parentNode","removeChild","_tooltip_id","_is_tooltip","ev","node","target","srcElement","_is_node_child","_is_task_line","condition","res","call","_tooltip_pos","pageX","pageY","d","_isIE","documentElement","body","clientX","scrollLeft","clientLeft","clientY","scrollTop","clientTop","box","_get_position","attachEvent","event_id","createEventObject","createEvent","delay","isNaN","tooltip_hide_timeout","clearTimeout","_tooltip_ev_timer","setTimeout","_init_tooltip","task","getTask","templates","tooltip_text","start_date","end_date","tooltip_date_format","date","date_to_str","start","end","event"],"mappings":"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"}