This repository has been archived on 2025-06-21. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
suitedesk/libraries/dhtmlxgantt/sources/ext/dhtmlxgantt_multiselect.js

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;
});