241 lines
No EOL
6.1 KiB
JavaScript
241 lines
No EOL
6.1 KiB
JavaScript
/*
|
|
@license
|
|
|
|
dhtmlxGantt v.3.2.0 Stardard
|
|
This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
|
|
|
|
(c) Dinamenta, UAB.
|
|
*/
|
|
gantt.config.multiselect = true;
|
|
gantt.config.multiselect_one_level = false;
|
|
|
|
gantt._multiselect = {
|
|
selected: {},
|
|
one_level: true,
|
|
active: true,
|
|
isActive: function(){
|
|
this.update_state();
|
|
return this.active;
|
|
},
|
|
update_state: function(){
|
|
this.one_level = gantt.config.multiselect_one_level;
|
|
var active = this.active;
|
|
this.active = gantt.config.multiselect;
|
|
if(this.active != active){
|
|
this.reset();
|
|
}
|
|
},
|
|
reset: function () {
|
|
this.selected = {};
|
|
},
|
|
set_last_selected: function (id) {
|
|
this.last_selected = id;
|
|
},
|
|
getLastSelected: function () {
|
|
return this.last_selected ? this.last_selected : null;
|
|
},
|
|
select: function (id, e) {
|
|
if(gantt.callEvent("onBeforeTaskMultiSelect", [id, true, e])){
|
|
this.selected[id] = true;
|
|
this.set_last_selected(id);
|
|
gantt.callEvent("onTaskMultiSelect", [id, true, e]);
|
|
}
|
|
},
|
|
toggle: function (id, e) {
|
|
if(this.selected[id]){
|
|
this.unselect(id, e);
|
|
}else{
|
|
this.select(id, e);
|
|
}
|
|
},
|
|
unselect: function (id, e) {
|
|
if(gantt.callEvent("onBeforeTaskMultiSelect", [id, false, e])){
|
|
this.selected[id] = false;
|
|
if(this.last_selected == id)
|
|
this.last_selected = null;
|
|
|
|
gantt.callEvent("onTaskMultiSelect", [id, true, e]);
|
|
}
|
|
},
|
|
isSelected: function (id) {
|
|
return !!this.selected[id];
|
|
},
|
|
getSelected: function () {
|
|
var res = [];
|
|
for (var i in this.selected) {
|
|
if (this.selected[i]) {
|
|
res.push(i);
|
|
}
|
|
}
|
|
|
|
res.sort(function(a, b){
|
|
return gantt.calculateTaskLevel(gantt.getTask(a)) > gantt.calculateTaskLevel(gantt.getTask(b)) ? 1 : -1;
|
|
});
|
|
|
|
return res;
|
|
},
|
|
forSelected: function (callback) {
|
|
var selected = this.getSelected();
|
|
for (var i = 0; i < selected.length; i++) {
|
|
callback(selected[i]);
|
|
}
|
|
},
|
|
is_same_level: function(id){
|
|
if(!this.one_level)
|
|
return true;
|
|
var last = this.getLastSelected();
|
|
if(!last)
|
|
return true;
|
|
|
|
if(!(gantt.isTaskExists(last) && gantt.isTaskExists(id)))
|
|
return true;
|
|
|
|
return !!(gantt.calculateTaskLevel(gantt.getTask(last)) == gantt.calculateTaskLevel(gantt.getTask(id)));
|
|
},
|
|
_after_select: function(target){
|
|
gantt.refreshTask(target);
|
|
},
|
|
_do_selection: function(e) {
|
|
/* add onclick handler to gantt container, hook up multiselection */
|
|
if(!this.isActive())
|
|
return true;
|
|
var target_ev = gantt.locate(e);
|
|
var selected = this.getSelected();
|
|
if (!target_ev)
|
|
return true;
|
|
|
|
if(!gantt.callEvent("onBeforeMultiSelect", [e])){
|
|
return true;
|
|
}
|
|
|
|
if (e.ctrlKey) {
|
|
if (target_ev) {
|
|
this.toggle(target_ev, e);
|
|
this._after_select(target_ev);
|
|
}
|
|
} else if (e.shiftKey && selected.length) {
|
|
var last = this.getLastSelected();
|
|
if (!last)
|
|
last = selected[selected.length - 1];
|
|
if (target_ev && last != target_ev) {
|
|
var last_si = gantt.getGlobalTaskIndex(last);
|
|
var cur_si = gantt.getGlobalTaskIndex(target_ev);
|
|
var tmp = target_ev;
|
|
while (gantt.getGlobalTaskIndex(tmp) != last_si) {
|
|
this.select(tmp);
|
|
this._after_select(tmp);
|
|
tmp = (last_si > cur_si) ? gantt.getNext(tmp) : gantt.getPrev(tmp);
|
|
}
|
|
this.forSelected(dhtmlx.bind(function (task_id) {
|
|
var index = gantt.getGlobalTaskIndex(task_id);
|
|
if ((index > last_si && index > cur_si) || (index < last_si && index < cur_si)) {
|
|
this.unselect(task_id);
|
|
gantt.refreshTask(task_id);
|
|
}
|
|
}, this));
|
|
}
|
|
|
|
}
|
|
else {
|
|
this.forSelected(dhtmlx.bind(function (task_id) {
|
|
if (task_id != target_ev) {
|
|
this.unselect(task_id);
|
|
gantt.refreshTask(task_id);
|
|
}
|
|
}, this));
|
|
if (!this.isSelected(target_ev)) {
|
|
|
|
this.select(target_ev);
|
|
this._after_select(target_ev);
|
|
}
|
|
}
|
|
|
|
if(!this.isSelected(target_ev)){
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
};
|
|
|
|
|
|
(function(){
|
|
var old_selectTask = gantt.selectTask;
|
|
gantt.selectTask = function(id){
|
|
var res = old_selectTask.call(this, id);
|
|
if(this.config.multiselect)
|
|
this._multiselect.select(id);
|
|
|
|
return res;
|
|
};
|
|
var old_unselectTask = gantt.unselectTask;
|
|
gantt.unselectTask = function(id){
|
|
var res = old_unselectTask.call(this, id);
|
|
if(this.config.multiselect)
|
|
this._multiselect.unselect(id);
|
|
|
|
return res;
|
|
};
|
|
|
|
gantt.toggleTaskSelection = function(id){
|
|
if(this.config.multiselect)
|
|
this._multiselect.toggle(id);
|
|
};
|
|
gantt.getSelectedTasks = function(){
|
|
return this._multiselect.getSelected();
|
|
};
|
|
gantt.eachSelectedTask = function(callback){
|
|
return this._multiselect.forSelected(callback);
|
|
};
|
|
gantt.isSelectedTask = function(id){
|
|
return this._multiselect.isSelected(id);
|
|
};
|
|
gantt.getLastSelectedTask = function(){
|
|
return this._multiselect.getLastSelected();
|
|
};
|
|
|
|
})();
|
|
|
|
gantt.attachEvent("onTaskIdChange", function (id, new_id) {
|
|
var multiselect = gantt._multiselect;
|
|
if(!multiselect.isActive())
|
|
return true;
|
|
|
|
if (gantt.isSelectedTask(id)) {
|
|
multiselect.unselect(id, null);
|
|
multiselect.select(new_id, null);
|
|
gantt.refreshTask(new_id);
|
|
}
|
|
});
|
|
|
|
gantt.attachEvent("onAfterTaskDelete", function (id, item) {
|
|
var multiselect = gantt._multiselect;
|
|
if(!multiselect.isActive())
|
|
return true;
|
|
|
|
if (multiselect.selected[id])
|
|
multiselect.unselect(id, null);
|
|
|
|
multiselect.forSelected(function (task_id) {
|
|
if (!gantt.isTaskExists(task_id))
|
|
multiselect.unselect(task_id, null);
|
|
});
|
|
});
|
|
|
|
gantt.attachEvent("onBeforeTaskMultiSelect", function(id, select, e){
|
|
var multiselect = gantt._multiselect;
|
|
if(select && multiselect.isActive()){
|
|
return multiselect.is_same_level(id);
|
|
}
|
|
return true;
|
|
});
|
|
|
|
gantt.attachEvent("onTaskClick", function(id, e){
|
|
var res = gantt._multiselect._do_selection(e);
|
|
gantt.callEvent("onMultiSelect", [e]);
|
|
return res;
|
|
});
|
|
gantt.attachEvent("onEmptyClick", function (e){
|
|
gantt._multiselect._do_selection(e);
|
|
gantt.callEvent("onMultiSelect", [e]);
|
|
return true;
|
|
}); |