Merge remote-tracking branch 'origin/master'

This commit is contained in:
Weblate 2014-07-02 12:45:58 +02:00
commit fdbcbb9dc1
5 changed files with 585 additions and 0 deletions

View File

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

View File

@ -400,6 +400,15 @@ $js_messages['strShowAllCol'] = __('Show all');
$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':

View File

@ -56,6 +56,7 @@ class PMA_Navigation
// closes the tags that were opened by the navigation header
$retval .= '</div>';
$retval .= '</div>';
$retval .= $this->_getDropHandler();
$retval .= '</div>';
}
@ -89,6 +90,26 @@ class PMA_Navigation
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.

View File

@ -2954,3 +2954,115 @@ html.ie7 #pma_console .query_input {
padding-bottom: 2em;
cursor: text;
}
.pma_drop_handler {
display: none;
position: fixed;
top: 0px;
left: 0px;
width: 100%;
background: rgba(0, 0, 0, 0.6);
height: 100%;
z-index: 999;
color: white;
font-size: 30pt;
text-align: center;
padding-top: 20%;
}
.pma_sql_import_status {
display: none;
position: fixed;
bottom: 0px;
right: 25px;
width: 400px;
border: 1px solid #999;
background: #f3f3f3;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
border-radius: 4px;
-moz-box-shadow: <?php echo $GLOBALS['text_dir'] === 'rtl' ? '-' : ''; ?>2px 2px 5px #ccc;
-webkit-box-shadow: <?php echo $GLOBALS['text_dir'] === 'rtl' ? '-' : ''; ?>2px 2px 5px #ccc;
box-shadow: <?php echo $GLOBALS['text_dir'] === 'rtl' ? '-' : ''; ?>2px 2px 5px #ccc;
}
.pma_sql_import_status h2,
.pma_drop_result h2 {
background-color: #bbb;
padding: .1em .3em;
margin-top: 0;
margin-bottom: 0;
color: #fff;
font-size: 1.6em;
font-weight: normal;
text-shadow: 0 1px 0 #777;
-moz-box-shadow: <?php echo $GLOBALS['text_dir'] === 'rtl' ? '-' : ''; ?>1px 1px 15px #999 inset;
-webkit-box-shadow: <?php echo $GLOBALS['text_dir'] === 'rtl' ? '-' : ''; ?>1px 1px 15px #999 inset;
box-shadow: <?php echo $GLOBALS['text_dir'] === 'rtl' ? '-' : ''; ?>1px 1px 15px #999 inset;
}
.pma_sql_import_status div {
height: 270px;
overflow-y:auto;
overflow-x:hidden;
list-style-type: none;
}
.pma_sql_import_status div li {
padding: 8px 10px;
border-bottom: 1px solid #bbb;
color: rgb(148, 14, 14);
background: white;
}
.pma_sql_import_status div li .filesize {
float: right;
}
.pma_sql_import_status h2 .minimize {
float: right;
margin-right: 5px;
padding: 0px 10px;
}
.pma_sql_import_status h2 .close {
float: right;
margin-right: 5px;
padding: 0px 10px;
display: none;
}
.pma_sql_import_status h2 .minimize:hover,
.pma_sql_import_status h2 .close:hover,
.pma_drop_result h2 .close:hover {
background: rgba(155, 149, 149, 0.78);
cursor: pointer;
}
.pma_drop_file_status {
color: #235a81;
}
.pma_drop_file_status span.underline:hover {
cursor: pointer;
text-decoration: underline;
}
.pma_drop_result {
position: fixed;
top: 10%;
left: 20%;
width: 60%;
background: white;
min-height: 300px;
z-index: 800;
-webkit-box-shadow: 0px 0px 15px #999;
border-radius: 10px;
cursor: move;
}
.pma_drop_result h2 .close {
float: right;
margin-right: 5px;
padding: 0px 10px;
}

View File

@ -3251,3 +3251,115 @@ html.ie7 #pma_console .query_input {
padding-bottom: 2em;
cursor: text;
}
.pma_drop_handler {
display: none;
position: fixed;
top: 0px;
left: 0px;
width: 100%;
background: rgba(0, 0, 0, 0.6);
height: 100%;
z-index: 999;
color: white;
font-size: 30pt;
text-align: center;
padding-top: 20%;
}
.pma_sql_import_status {
display: none;
position: fixed;
bottom: 0px;
right: 25px;
width: 400px;
border: 1px solid #999;
background: #f3f3f3;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
border-radius: 4px;
-moz-box-shadow: <?php echo $GLOBALS['text_dir'] === 'rtl' ? '-' : ''; ?>2px 2px 5px #ccc;
-webkit-box-shadow: <?php echo $GLOBALS['text_dir'] === 'rtl' ? '-' : ''; ?>2px 2px 5px #ccc;
box-shadow: <?php echo $GLOBALS['text_dir'] === 'rtl' ? '-' : ''; ?>2px 2px 5px #ccc;
}
.pma_sql_import_status h2,
.pma_drop_result h2 {
background-color: #bbb;
padding: .1em .3em;
margin-top: 0;
margin-bottom: 0;
color: #fff;
font-size: 1.6em;
font-weight: normal;
text-shadow: 0 1px 0 #777;
-moz-box-shadow: <?php echo $GLOBALS['text_dir'] === 'rtl' ? '-' : ''; ?>1px 1px 15px #999 inset;
-webkit-box-shadow: <?php echo $GLOBALS['text_dir'] === 'rtl' ? '-' : ''; ?>1px 1px 15px #999 inset;
box-shadow: <?php echo $GLOBALS['text_dir'] === 'rtl' ? '-' : ''; ?>1px 1px 15px #999 inset;
}
.pma_sql_import_status div {
height: 270px;
overflow-y:auto;
overflow-x:hidden;
list-style-type: none;
}
.pma_sql_import_status div li {
padding: 8px 10px;
border-bottom: 1px solid #bbb;
color: rgb(148, 14, 14);
background: white;
}
.pma_sql_import_status div li .filesize {
float: right;
}
.pma_sql_import_status h2 .minimize {
float: right;
margin-right: 5px;
padding: 0px 10px;
}
.pma_sql_import_status h2 .close {
float: right;
margin-right: 5px;
padding: 0px 10px;
display: none;
}
.pma_sql_import_status h2 .minimize:hover,
.pma_sql_import_status h2 .close:hover,
.pma_drop_result h2 .close:hover {
background: rgba(155, 149, 149, 0.78);
cursor: pointer;
}
.pma_drop_file_status {
color: #235a81;
}
.pma_drop_file_status span.underline:hover {
cursor: pointer;
text-decoration: underline;
}
.pma_drop_result {
position: fixed;
top: 10%;
left: 20%;
width: 60%;
background: white;
min-height: 300px;
z-index: 800;
-webkit-box-shadow: 0px 0px 15px #999;
border-radius: 10px;
cursor: move;
}
.pma_drop_result h2 .close {
float: right;
margin-right: 5px;
padding: 0px 10px;
}