bardelman-dhtmlx-gantt-redux
Version:
An open source JavaScript Gantt chart that helps you illustrate a project schedule in a nice-looking chart.
204 lines (164 loc) • 5.27 kB
JavaScript
function fileDragAndDrop(){
var overlay = null,
uid = Date.now();
function callListeners(file){
for(var i in this.listeners){
if(this.listeners[i])
this.listeners[i](file);
}
}
var showHighlight = false,
timeout = 0;
return {
root: null,
listeners: {},
fileTypeMessage: "Only MPP and XML files are supported!",
dndFileTypeMessage: "Please try XML or MPP project file.",
dndHint: "Drop MPP or XML file into Gantt",
onDrop: function(listener){
var id = uid++;
this.listeners[id] = listener;
return id;
},
removeListener: function(id){
delete this.listeners[id];
},
mode:"msp",
isExcelMimeType: function(fileTransferItem){
if(!fileTransferItem) return false;
var excelTypes = {
"application/vnd.ms-excel":true,
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":true
};
return excelTypes[fileTransferItem.type];
},
isExcelFile: function(file){
var ext = file.name.split(".").pop();
var excelExtensions = {
"xls": true,
"xlsx": true
};
return !!(excelExtensions[ext]);
},
isPrimaveraP6MimeType: function(fileTransferItem){
if(!fileTransferItem) return false;
var types = {
"application/xer":true
};
return types[fileTransferItem.type];
},
isPrimaveraP6File: function(file){
var ext = file.name.split(".").pop();
var extensions = {
"xer": true,
"xml": true
};
return !!(extensions[ext]);
},
isMsProjectMimeType: function(fileTransferItem){
if(!fileTransferItem) return false;
var msTypes = {
"text/xml":true,
"application/xml":true,
"application/vnd.ms-project": true,
"application/msproj": true,
"application/msproject": true,
"application/x-msproject": true,
"application/x-ms-project": true,
"application/x-dos_ms_project": true,
"application/mpp": true,
"zz-application/zz-winassoc-mpp": true
};
return msTypes[fileTransferItem.type];
},
isMsProjectFile: function(file){
var ext = file.name.split(".").pop();
var msProjExtensions = {
"mpp": true,
"xml": true
};
return !!(msProjExtensions[ext]);
},
init: function(div){
this.root = div;
div.addEventListener("dragover", gantt.bind(function(event){
event.preventDefault && event.preventDefault();
showHighlight = true;
this.showHover(event);
}, this), false);
div.addEventListener("dragenter", gantt.bind(function(event){
event.preventDefault && event.preventDefault();
showHighlight = true;
this.showHover(event);
}, this), false);
div.addEventListener("dragleave", gantt.bind(function(event){
showHighlight = false;
clearTimeout( timeout );
timeout = setTimeout( gantt.bind(function(){
if( !showHighlight ){ this.hideOverlay(); }
}, this), 200 );
}, this), false);
div.addEventListener("dragend", gantt.bind(function(event){
this.hideOverlay();
showHighlight = false;
}, this), false);
div.addEventListener("drop", gantt.bind(function(event){
event.preventDefault && event.preventDefault();
showHighlight = false;
this.hideOverlay();
var files = event.dataTransfer.files;
var file = files[0];
var checkFileType = this.isMsProjectFile;
if(this.mode == "excel"){
checkFileType = this.isExcelFile;
}else if(this.mode == "primaveraP6"){
checkFileType = this.isPrimaveraP6File;
}
if(checkFileType.call(this, file)){
callListeners.call(this, file);
}else{
gantt.message("The extension of <b>" +file.name+ "</b> " + this.fileTypeMessage);
}
return false;
}, this), false);
},
hideOverlay: function(){
if(!overlay) return;
overlay.parentNode.removeChild(overlay);
overlay = null;
},
showHover: function showFileHover(event){
if(event.dataTransfer && event.dataTransfer.items && event.dataTransfer.items[0]){
var checkMimeType = this.isMsProjectMimeType;
if(this.mode == "excel"){
checkMimeType = this.isExcelMimeType;
}else if(this.mode == "primaveraP6"){
checkMimeType = this.isMsProjectMimeType;
}
if(!checkMimeType.call(this, event.dataTransfer.items[0])){
this.showOverlay('<div class="gantt-file-hover-content-upload-image"></div>' +
'<div class="gantt-file-hover-content-upload-message">'+this.dndFileTypeMessage+'</div>', true);
}else{
this.showOverlay('<div class="gantt-file-hover-content-upload-image"></div>' +
'<div class="gantt-file-hover-content-upload-message">'+this.dndHint+'</div>');
}
}
},
showUpload: function showFileInProgress(){
this.showOverlay('<div class="gantt-file-upload-spinner"><div class="gantt-file-upload-spinner-inner"></div></div>' +
'<div class="gantt-file-hover-content-upload-message">Loading…</div>');
},
showOverlay: function showOverlay(innerHTML, invalid){
if(!this.root) return;
if(overlay) return;
overlay = document.createElement("div");
overlay.className = "gantt-file-hover" + (invalid ? " not-supported" : "");
overlay.innerHTML = '<div class="gantt-file-hover-inner">' +
'<div class="gantt-file-hover-content-pending">' +
innerHTML +
'</div>' +
'</div>';
this.root.appendChild(overlay);
}
};
}