Skip to content

Commit

Permalink
Merge commit '162d762824dfc5df04a55a7023f23f8870fad19a'
Browse files Browse the repository at this point in the history
  • Loading branch information
lem9 committed Jul 2, 2014
2 parents df3f99f + 162d762 commit 49e5aaf
Show file tree
Hide file tree
Showing 5 changed files with 585 additions and 0 deletions.
331 changes: 331 additions & 0 deletions js/common.js
Expand Up @@ -300,3 +300,334 @@ var PMA_querywindow = (function ($, window) {
}
};
})(jQuery, window);

/**
* Class to handle PMA Drag and Drop Import
* feature
*/
PMA_DROP_IMPORT = {
/**
* @var int, count of total uploads in this view
*/
uploadCount: 0,
/**
* @var int, count of live uploads
*/
liveUploadCount: 0,
/**
* @var string array, allowed extensions
*/
allowedExtensions: ['sql', 'xml', 'ldi', 'mediawiki', 'shp'],
/**
* @var string array, allowed extensions for compressed files
*/
allowedCompressedExtensions: ['gzip', 'bzip2', 'zip'],
/**
* @var obj array to store message returned by import_status.php
*/
importStatus: [],
/**
* Checks if any dropped file has valid extension or not
*
* @param string, filename
*
* @return string, extension for valid extension, '' otherwise
*/
_getExtension: function(file) {
var arr = file.split('.');
ext = arr[arr.length - 1];

//check if compressed
if (jQuery.inArray(ext.toLowerCase(),
PMA_DROP_IMPORT.allowedCompressedExtensions) !== -1) {
ext = arr[arr.length - 2];
}

//Now check for extension
if (jQuery.inArray(ext.toLowerCase(),
PMA_DROP_IMPORT.allowedExtensions) !== -1) {
return ext;
}
return '';
},
/**
* Shows upload progress for different sql uploads
*
* @param: hash (string), hash for specific file upload
* @param: percent (float), file upload percentage
*
* @return void
*/
_setProgress: function(hash, percent) {
$('.pma_sql_import_status div li[data-hash="' +hash +'"]')
.children('progress').val(percent);
},
/**
* Function to upload the file asyncronously
*
* @param formData, FormData object for a specific file
* @param hash, hash of the current file upload
*
* @return void
*/
_sendFileToServer: function(formData, hash) {
var uploadURL ="./import.php"; //Upload URL
var extraData ={};
var jqXHR = $.ajax({
xhr: function() {
var xhrobj = $.ajaxSettings.xhr();
if (xhrobj.upload) {
xhrobj.upload.addEventListener('progress', function(event) {
var percent = 0;
var position = event.loaded || event.position;
var total = event.total;
if (event.lengthComputable) {
percent = Math.ceil(position / total * 100);
}
//Set progress
PMA_DROP_IMPORT._setProgress(hash, percent);
}, false);
}
return xhrobj;
},
url: uploadURL,
type: "POST",
contentType:false,
processData: false,
cache: false,
data: formData,
success: function(data){
PMA_DROP_IMPORT._importFinished(hash, false, data.success);
if (!data.success) {
PMA_DROP_IMPORT.importStatus[PMA_DROP_IMPORT.importStatus.length] = {
hash: hash,
message: data.error
};
}
}
});

// -- provide link to cancel the upload
$('.pma_sql_import_status div li[data-hash="' +hash
+'"] span.filesize').html('<span hash="'
+hash +'" class="pma_drop_file_status" task="cancel">'
+PMA_messages['dropImportMessageCancel'] +'</span>');

// -- add event listener to this link to abort upload operation
$('.pma_sql_import_status div li[data-hash="' +hash
+'"] span.filesize span.pma_drop_file_status')
.on('click', function() {
if ($(this).attr('task') === 'cancel') {
jqXHR.abort();
$(this).html('<span>' +PMA_messages['dropImportMessageAborted'] +'</span>');
PMA_DROP_IMPORT._importFinished(hash, true, false);
} else if ($(this).children("span").html() ===
PMA_messages['dropImportMessageFailed']) {
// -- view information
var $this = $(this);
$.each( PMA_DROP_IMPORT.importStatus,
function( key, value ) {
if (value.hash === hash) {
$(".pma_drop_result:visible").remove();
var filename = $this.parent('span').attr('data-filename');
$("body").append('<div class="pma_drop_result"><h2>'
+PMA_messages['dropImportImportResultHeader'] +' - '
+filename +'<span class="close">x</span></h2>' +value.message +'</div>');
$(".pma_drop_result").draggable(); //to make this dialog draggable
return;
}
});
}
});
},
/**
* Triggered when an object is dragged into the PMA UI
*
* @param event obj
*
* @return void
*/
_dragenter : function (event) {
if (PMA_commonParams.get('db') === '') {
$(".pma_drop_handler").html(PMA_messages['dropImportSelectDB']);
} else {
$(".pma_drop_handler").html(PMA_messages['dropImportDropFiles']);
}
$(".pma_drop_handler").fadeIn();
event.stopPropagation();
event.preventDefault();
},
/**
* Triggered when dragged file is being dragged over PMA UI
*
* @param event obj
*
* @return void
*/
_dragover: function (event) {
$(".pma_drop_handler").fadeIn();
event.stopPropagation();
event.preventDefault();
},
/**
* Triggered when dragged objects are left
*
* @param event obj
*
* @return void
*/
_dragleave: function (event) {
event.stopPropagation();
event.preventDefault();
$(".pma_drop_handler").clearQueue().stop();
$(".pma_drop_handler").fadeOut();
$(".pma_drop_handler").html(PMA_messages['dropImportDropFiles']);
},
/**
* Called when upload has finished
*
* @param string, uniques hash for a certain upload
* @param bool, true if upload was aborted
* @param bool, status of sql upload, as sent by server
*
* @return void
*/
_importFinished: function(hash, aborted, status) {
$('.pma_sql_import_status div li[data-hash="' +hash +'"]')
.children("progress").hide();
var icon = 'icon ic_s_success';
// -- provide link to view upload status
if (!aborted) {
if (status) {
$('.pma_sql_import_status div li[data-hash="' +hash
+'"] span.filesize span.pma_drop_file_status')
.html('<span>' +PMA_messages['dropImportMessageSuccess'] +'</a>');
} else {
$('.pma_sql_import_status div li[data-hash="' +hash
+'"] span.filesize span.pma_drop_file_status')
.html('<span class="underline">' +PMA_messages['dropImportMessageFailed']
+'</a>');
icon = 'icon ic_s_error';
}
} else {
icon = 'icon ic_s_notice';
}
$('.pma_sql_import_status div li[data-hash="' +hash
+'"] span.filesize span.pma_drop_file_status')
.attr('task', 'info');

// Set icon
$('.pma_sql_import_status div li[data-hash="' +hash +'"]')
.prepend('<img src="./themes/dot.gif" title="finished" class="'
+icon +'"> ');

// Decrease liveUploadCount by one
$('.pma_import_count').html(--PMA_DROP_IMPORT.liveUploadCount);
if (!PMA_DROP_IMPORT.liveUploadCount) {
$('.pma_sql_import_status h2 .close').fadeIn();
}
},
/**
* Triggered when dragged objects are dropped to UI
* From this function, the AJAX Upload operation is initated
*
* @param event object
*
* @return void
*/
_drop: function (event) {
var dbname = PMA_commonParams.get('db');
//if no database is selected -- no
if (dbname !== '') {
$(".pma_sql_import_status").slideDown();
var files = event.originalEvent.dataTransfer.files;
for (var i = 0; i < files.length; i++) {
var ext = (PMA_DROP_IMPORT._getExtension(files[i].name));
var hash = AJAX.hash(++PMA_DROP_IMPORT.uploadCount);

$(".pma_sql_import_status div").append('<li data-hash="' +hash +'">'
+((ext !== '') ? '' : '<img src="./themes/dot.gif" title="invalid format" class="icon ic_s_notice"> ')
+escapeHtml(files[i].name) + '<span class="filesize" data-filename="'
+escapeHtml(files[i].name) +'">' +(files[i].size/1024).toFixed(2)
+' kb</span></li>');

//scroll the UI to bottom
$(".pma_sql_import_status div").scrollTop(
$(".pma_sql_import_status div").scrollTop() + 50); //50 hardcoded for now

if (ext !== '') {
// Increment liveUploadCount by one
$('.pma_import_count').html(++PMA_DROP_IMPORT.liveUploadCount);
$('.pma_sql_import_status h2 .close').fadeOut();

$('.pma_sql_import_status div li[data-hash="' +hash +'"]')
.append('<br><progress max="100" value="2"></progress>');

//uploading
var fd = new FormData();
fd.append('import_file', files[i]);
// todo: method to find the value below
fd.append('noplugin', '539de66e760ee');
fd.append('db', dbname);
fd.append('token', PMA_commonParams.get('token'));
fd.append('import_type', 'database');
// todo: method to find the value below
fd.append('MAX_FILE_SIZE', '4194304');
// todo: method to find the value below
fd.append('charset_of_file','utf-8');
// todo: method to find the value below
fd.append('allow_interrupt', 'yes');
fd.append('skip_queries', '0');
fd.append('format',ext);
fd.append('sql_compatibility','NONE');
fd.append('sql_no_auto_value_on_zero','something');
fd.append('ajax_request','true');
fd.append('hash', hash);

// init uploading
PMA_DROP_IMPORT._sendFileToServer(fd, hash);
}
}
}
$(".pma_drop_handler").fadeOut();
event.stopPropagation();
event.preventDefault();
}
};

/**
* Called when some user drags, dragover, leave
* a file to the PMA UI
* @param object Event data
* @return void
*/
$(document).on('dragenter', PMA_DROP_IMPORT._dragenter);
$(document).on('dragover', PMA_DROP_IMPORT._dragover);
$(document).on('dragleave', '.pma_drop_handler', PMA_DROP_IMPORT._dragleave);

//when file is dropped to PMA UI
$(document).on('drop', 'body', PMA_DROP_IMPORT._drop);

// minimizing-maximising the sql ajax upload status
$(document).on('click', '.pma_sql_import_status h2 .minimize', function() {
if ($(this).attr('toggle') === 'off') {
$('.pma_sql_import_status div').css('height','270px');
$(this).attr('toggle','on');
} else {
$('.pma_sql_import_status div').css("height","0px");
$(this).attr('toggle','off');
}
});

// closing sql ajax upload status
$(document).on('click', '.pma_sql_import_status h2 .close', function() {
$('.pma_sql_import_status').fadeOut(function() {
$('.pma_sql_import_status div').html('');
PMA_DROP_IMPORT.importStatus = []; //clear the message array
});
});

// Closing the import result box
$(document).on('click', '.pma_drop_result h2 .close', function(){
$(this).parent('h2').parent('div').remove();
});
9 changes: 9 additions & 0 deletions js/messages.php
Expand Up @@ -400,6 +400,15 @@
$js_messages['strAlertNonUnique'] = __('This table does not contain a unique column. Features related to the grid edit, checkbox, Edit, Copy and Delete links may not work after saving.');
$js_messages['strEnterValidHex'] = __('Please enter a valid hexadecimal string. Valid characters are 0-9, A-F.');

/** Drag & Drop sql import messages */
$js_messages['dropImportMessageCancel'] = __('cancel');
$js_messages['dropImportMessageAborted'] = __('Aborted');
$js_messages['dropImportMessageFailed'] = __('Failed');
$js_messages['dropImportMessageSuccess'] = __('Success');
$js_messages['dropImportImportResultHeader'] = __('Import status');
$js_messages['dropImportDropFiles'] = __('Drop Files Here');
$js_messages['dropImportSelectDB'] = __('Select Database First');

// this approach does not work when the parameter is changed via user prefs
switch ($GLOBALS['cfg']['GridEditing']) {
case 'double-click':
Expand Down
21 changes: 21 additions & 0 deletions libraries/navigation/Navigation.class.php
Expand Up @@ -56,6 +56,7 @@ public function getDisplay()
// closes the tags that were opened by the navigation header
$retval .= '</div>';
$retval .= '</div>';
$retval .= $this->_getDropHandler();
$retval .= '</div>';
}

Expand Down Expand Up @@ -89,6 +90,26 @@ public function hideNavigationItem(
PMA_queryAsControlUser($sqlQuery, false);
}

/**
* Inserts Drag and Drop Import handler
*
* @param: void
* @return: html code for drop handler
*/
private function _getDropHandler()
{
$retval = '';
$retval .= '<div class="pma_drop_handler">' .__('Drop files here') .'</div>';
$retval .= '<div class="pma_sql_import_status">';
$retval .= '<h2>SQL upload ( ';
$retval .= '<span class="pma_import_count">0</span> ';
$retval .= ') <span class="close">x</span>';
$retval .= '<span class="minimize">-</span></h2>';
$retval .= '<div></div>';
$retval .= '</div>';
return $retval;
}

/**
* Remove a hidden item of navigation tree from the
* list of hidden items in PMA database.
Expand Down

0 comments on commit 49e5aaf

Please sign in to comment.