diff --git a/ChangeLog b/ChangeLog index f70eae5870..85e45ab7e8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -57,6 +57,7 @@ phpMyAdmin - ChangeLog - [core] Remove library PHPExcel, due to license issues - [export] Remove native Excel export modules (xls and xlsx formats) - [import] Remove native Excel import modules (xls and xlsx formats) +- bug #3392920 [edit] BLOB emptied after editing another column 3.4.4.0 (not yet released) - bug #3323060 [parser] SQL parser breaks AJAX requests if query has unclosed quotes diff --git a/js/functions.js b/js/functions.js index 92c4caf21b..022cb808c1 100644 --- a/js/functions.js +++ b/js/functions.js @@ -3307,8 +3307,6 @@ function PMA_getCellValue(td) { return ''; } else if (! $(td).is('.to_be_saved') && $(td).data('original_data')) { return $(td).data('original_data'); - } else if ($(td).is(':not(.transformed, .relation, .enum, .set, .null)')) { - return unescape($(td).find('span').html()).replace(/
/g, "\n"); } else { return $(td).text(); } diff --git a/js/makegrid.js b/js/makegrid.js index aabe9b59cd..70e9b9adb1 100644 --- a/js/makegrid.js +++ b/js/makegrid.js @@ -564,7 +564,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi !g.colRsz && !g.colReorder) { if (!g.isCellEditActive) { - $cell = $(cell); + var $cell = $(cell); // remove all edit area and hide it $(g.cEdit).find('.edit_area').empty().hide(); // reposition the cEdit element @@ -573,24 +573,19 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi left: $cell.position().left }) .show() - .find('input') + .find('.edit_box') .css({ width: $cell.outerWidth(), height: $cell.outerHeight() }); - // fill the cell edit with text from , if it is not null - var value = $cell.is(':not(.null)') ? PMA_getCellValue(cell) : ''; - $(g.cEdit).find('input') - .val(value); + // fill the cell edit with text from + var value = PMA_getCellValue(cell); + $(g.cEdit).find('.edit_box').val(value); g.currentEditCell = cell; - $(g.cEdit).find('input[type=text]').focus(); + $(g.cEdit).find('.edit_box').focus(); $(g.cEdit).find('*').removeAttr('disabled'); } - } else { - if (g.isCellEditActive) { - g.hideEditCell(); - } } }, @@ -605,7 +600,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi */ hideEditCell: function(force, data, field) { if (g.isCellEditActive && !force) { - // cell is being edited, post the edited data + // cell is being edited, save or post the edited data g.saveOrPostEditedCell(); return; } @@ -620,21 +615,19 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi if (g.currentEditCell) { // save value of currently edited cell // replace current edited field with the new value var $this_field = $(g.currentEditCell); - var new_html = $this_field.data('value'); var is_null = $this_field.data('value') == null; if (is_null) { $this_field.find('span').html('NULL'); $this_field.addClass('null'); } else { $this_field.removeClass('null'); + var new_html = $this_field.data('value'); if ($this_field.is('.truncated')) { if (new_html.length > g.maxTruncatedLen) { new_html = new_html.substring(0, g.maxTruncatedLen) + '...'; } } - // replace '\n' with
- new_html = new_html.replace(/\n/g, '
'); - $this_field.find('span').html(new_html); + $this_field.find('span').text(new_html); } } if (data.transformations != undefined) { @@ -657,7 +650,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi // hide the cell editing area $(g.cEdit).hide(); - $(g.cEdit).find('input[type=text]').blur(); + $(g.cEdit).find('.edit_box').blur(); g.isCellEditActive = false; g.currentEditCell = null; // destroy datepicker in edit area, if exist @@ -671,8 +664,17 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi if (!g.isCellEditActive) { // make sure the edit area has not been shown g.isCellEditActive = true; g.isEditCellTextEditable = false; + /** + * @var $td current edited cell + */ var $td = $(g.currentEditCell); + /** + * @var $editArea the editing area + */ var $editArea = $(g.cEdit).find('.edit_area'); + /** + * @var where_clause WHERE clause for the edited cell + */ var where_clause = $td.parent('tr').find('.where_clause').val(); /** * @var field_name String containing the name of this field. @@ -720,24 +722,24 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi if ($td.is('.enum, .set')) { $editArea.find('select').live('change', function(e) { $checkbox.attr('checked', false); - }) + }); } else if ($td.is('.relation')) { $editArea.find('select').live('change', function(e) { $checkbox.attr('checked', false); - }) + }); $editArea.find('.browse_foreign').live('click', function(e) { $checkbox.attr('checked', false); - }) + }); } else { - $(g.cEdit).find('input[type=text]').live('keypress change', function(e) { + $(g.cEdit).find('.edit_box').live('keypress change', function(e) { $checkbox.attr('checked', false); - }) + }); $editArea.find('textarea').live('keydown', function(e) { $checkbox.attr('checked', false); - }) + }); } - // if 'checkbox_null__' is clicked empty the corresponding select/editor. + // if null checkbox is clicked empty the corresponding select/editor. $checkbox.click(function(e) { if ($td.is('.enum')) { $editArea.find('select').attr('value', ''); @@ -745,7 +747,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi $editArea.find('select').find('option').each(function() { var $option = $(this); $option.attr('selected', false); - }) + }); } else if ($td.is('.relation')) { // if the dropdown is there to select the foreign value if ($editArea.find('select').length > 0) { @@ -754,12 +756,11 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi } else { $editArea.find('textarea').val(''); } - $(g.cEdit).find('input[type=text]').val(''); - }) + $(g.cEdit).find('.edit_box').val(''); + }); } - if($td.is('.relation')) { - /** @lends jQuery */ + if ($td.is('.relation')) { //handle relations $editArea.addClass('edit_area_loading'); @@ -770,15 +771,15 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi * @var post_params Object containing parameters for the POST request */ var post_params = { - 'ajax_request' : true, - 'get_relational_values' : true, - 'server' : g.server, - 'db' : g.db, - 'table' : g.table, - 'column' : field_name, - 'token' : g.token, - 'curr_value' : relation_curr_value, - 'relation_key_or_display_column' : relation_key_or_display_column + 'ajax_request' : true, + 'get_relational_values' : true, + 'server' : g.server, + 'db' : g.db, + 'table' : g.table, + 'column' : field_name, + 'token' : g.token, + 'curr_value' : relation_curr_value, + 'relation_key_or_display_column' : relation_key_or_display_column } g.lastXHR = $.post('sql.php', post_params, function(data) { @@ -788,18 +789,18 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi var value = $(data.dropdown).val(); $td.data('original_data', value); // update the text input field, in case where the "Relational display column" is checked - $(g.cEdit).find('input[type=text]').val(value); + $(g.cEdit).find('.edit_box').val(value); $editArea.append(data.dropdown); $editArea.append('
' + g.cellEditHint + '
'); }) // end $.post() $editArea.find('select').live('change', function(e) { - $(g.cEdit).find('input[type=text]').val($(this).val()); + $(g.cEdit).find('.edit_box').val($(this).val()); }) + $editArea.show(); } else if($td.is('.enum')) { - /** @lends jQuery */ //handle enum fields $editArea.addClass('edit_area_loading'); @@ -824,11 +825,11 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi }) // end $.post() $editArea.find('select').live('change', function(e) { - $(g.cEdit).find('input[type=text]').val($(this).val()); + $(g.cEdit).find('.edit_box').val($(this).val()); }) + $editArea.show(); } else if($td.is('.set')) { - /** @lends jQuery */ //handle set fields $editArea.addClass('edit_area_loading'); @@ -854,23 +855,25 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi }) // end $.post() $editArea.find('select').live('change', function(e) { - $(g.cEdit).find('input[type=text]').val($(this).val()); + $(g.cEdit).find('.edit_box').val($(this).val()); }) + $editArea.show(); } else if($td.is('.truncated, .transformed')) { if ($td.is('.to_be_saved')) { // cell has been edited var value = $td.data('value'); - $(g.cEdit).find('input[type=text]').val(value); - $editArea.append(''); - $editArea.find('textarea').live('keyup', function(e) { - $(g.cEdit).find('input[type=text]').val($(this).val()); - }); - $(g.cEdit).find('input[type=text]').live('keyup', function(e) { + $(g.cEdit).find('.edit_box').val(value); + $editArea.append(''); + $editArea.find('textarea') + .val(value) + .live('keyup', function(e) { + $(g.cEdit).find('.edit_box').val($(this).val()); + }); + $(g.cEdit).find('.edit_box').live('keyup', function(e) { $editArea.find('textarea').val($(this).val()); }); $editArea.append('
' + g.cellEditHint + '
'); } else { - /** @lends jQuery */ //handle truncated/transformed values values $editArea.addClass('edit_area_loading'); @@ -900,12 +903,14 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi } $td.data('original_data', data.value); - $(g.cEdit).find('input[type=text]').val(data.value); - $editArea.append(''); - $editArea.find('textarea').live('keyup', function(e) { - $(g.cEdit).find('input[type=text]').val($(this).val()); - }); - $(g.cEdit).find('input[type=text]').live('keyup', function(e) { + $(g.cEdit).find('.edit_box').val(data.value); + $editArea.append(''); + $editArea.find('textarea') + .val(data.value) + .live('keyup', function(e) { + $(g.cEdit).find('.edit_box').val($(this).val()); + }); + $(g.cEdit).find('.edit_box').live('keyup', function(e) { $editArea.find('textarea').val($(this).val()); }); $editArea.append('
' + g.cellEditHint + '
'); @@ -916,8 +921,9 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi }) // end $.post() } g.isEditCellTextEditable = true; + $editArea.show(); } else if ($td.is('.datefield, .datetimefield, .timestampfield')) { - var $input_field = $(g.cEdit).find('input[type=text]'); + var $input_field = $(g.cEdit).find('.edit_box'); // remember current datetime value in $input_field, if it is not null var is_null = $td.is('.null'); @@ -943,19 +949,10 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi } else { $input_field.val(''); } + $editArea.show(); } else { - $editArea.append(''); - $editArea.find('textarea').live('keyup', function(e) { - $(g.cEdit).find('input[type=text]').val($(this).val()); - }); - $(g.cEdit).find('input[type=text]').live('keyup', function(e) { - $editArea.find('textarea').val($(this).val()); - }); - $editArea.append('
' + g.cellEditHint + '
'); g.isEditCellTextEditable = true; } - - $editArea.show(); } }, @@ -1138,7 +1135,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi if (!g.saveCellsAtOnce) { $(g.cEdit).find('*').attr('disabled', 'disabled'); var $editArea = $(g.cEdit).find('.edit_area'); - $editArea.addClass('edit_area_posting'); + $(g.cEdit).find('.edit_box').addClass('edit_box_posting'); } else { $('.save_edited').addClass('saving_edited_data') .find('input').attr('disabled', 'disabled'); // disable the save button @@ -1153,52 +1150,52 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi g.isSaving = false; if (!g.saveCellsAtOnce) { $(g.cEdit).find('*').removeAttr('disabled'); - $editArea.removeClass('edit_area_posting'); + $(g.cEdit).find('.edit_box').removeClass('edit_box_posting'); } else { $('.save_edited').removeClass('saving_edited_data') .find('input').removeAttr('disabled'); // enable the save button back } if(data.success == true) { PMA_ajaxShowMessage(data.message); - $('.to_be_saved').each(function() { - var new_clause = $(this).parent('tr').data('new_clause'); - if (new_clause != '') { - var $where_clause = $(this).parent('tr').find('.where_clause'); - var old_clause = $where_clause.attr('value'); - var decoded_old_clause = PMA_urldecode(old_clause); - var decoded_new_clause = PMA_urldecode(new_clause); + // update where_clause related data in each edited row + $('.to_be_saved').parents('tr').each(function() { + var new_clause = $(this).data('new_clause'); + var $where_clause = $(this).find('.where_clause'); + var old_clause = $where_clause.attr('value'); + var decoded_old_clause = PMA_urldecode(old_clause); + var decoded_new_clause = PMA_urldecode(new_clause); - $where_clause.attr('value', new_clause); - // update Edit, Copy, and Delete links also - $(this).parent('tr').find('a').each(function() { - $(this).attr('href', $(this).attr('href').replace(old_clause, new_clause)); - // update delete confirmation in Delete link - if ($(this).attr('href').indexOf('DELETE') > -1) { - $(this).removeAttr('onclick') - .unbind('click') - .bind('click', function() { - return confirmLink(this, 'DELETE FROM `' + g.db + '`.`' + g.table + '` WHERE ' + - decoded_new_clause + (is_unique ? '' : ' LIMIT 1')); - }); - } - }); - // update the multi edit checkboxes - $(this).parent('tr').find('input[type=checkbox]').each(function() { - var $checkbox = $(this); - var checkbox_name = $checkbox.attr('name'); - var checkbox_value = $checkbox.attr('value'); + $where_clause.attr('value', new_clause); + // update Edit, Copy, and Delete links also + $(this).find('a').each(function() { + $(this).attr('href', $(this).attr('href').replace(old_clause, new_clause)); + // update delete confirmation in Delete link + if ($(this).attr('href').indexOf('DELETE') > -1) { + $(this).removeAttr('onclick') + .unbind('click') + .bind('click', function() { + return confirmLink(this, 'DELETE FROM `' + g.db + '`.`' + g.table + '` WHERE ' + + decoded_new_clause + (is_unique ? '' : ' LIMIT 1')); + }); + } + }); + // update the multi edit checkboxes + $(this).find('input[type=checkbox]').each(function() { + var $checkbox = $(this); + var checkbox_name = $checkbox.attr('name'); + var checkbox_value = $checkbox.attr('value'); - $checkbox.attr('name', checkbox_name.replace(old_clause, new_clause)); - $checkbox.attr('value', checkbox_value.replace(decoded_old_clause, decoded_new_clause)); - }); - } + $checkbox.attr('name', checkbox_name.replace(old_clause, new_clause)); + $checkbox.attr('value', checkbox_value.replace(decoded_old_clause, decoded_new_clause)); + }); }); - // remove possible previous feedback message + // update the display of executed SQL query command $('#result_query').remove(); if (typeof data.sql_query != 'undefined') { // display feedback $('#sqlqueryresults').prepend(data.sql_query); } + // hide and/or update the successfully saved cells g.hideEditCell(true, data); // remove the "Save edited cells" button @@ -1247,6 +1244,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi var value; if ($(g.cEdit).find('.edit_area').is('.edit_area_loading')) { + // the edit area is still loading (retrieving cell data), no need to post need_to_post = false; } else if (is_null) { if (!g.wasEditedCellNull) { @@ -1255,7 +1253,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi } } else { if ($this_field.is('.bit')) { - this_field_params[field_name] = '0b' + $(g.cEdit).find('textarea').val(); + this_field_params[field_name] = '0b' + $(g.cEdit).find('.edit_box').val(); } else if ($this_field.is('.set')) { $test_element = $(g.cEdit).find('select'); this_field_params[field_name] = $test_element.map(function(){ @@ -1273,10 +1271,8 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi if ($test_element.length != 0) { this_field_params[field_name] = $test_element.text(); } - } else if ($this_field.is('.datefield, .datetimefield, .timestampfield')) { - this_field_params[field_name] = $(g.cEdit).find('input[type=text]').val(); } else { - this_field_params[field_name] = $(g.cEdit).find('textarea').val(); + this_field_params[field_name] = $(g.cEdit).find('.edit_box').val(); } if (g.wasEditedCellNull || this_field_params[field_name] != PMA_getCellValue(g.currentEditCell)) { need_to_post = true; @@ -1533,7 +1529,7 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi // adjust g.cEdit g.cEdit.className = 'cEdit'; - $(g.cEdit).html('
'); + $(g.cEdit).html('
'); $(g.cEdit).hide(); // assign cell editing hint @@ -1560,10 +1556,10 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi e.preventDefault(); } }); - $(g.cEdit).find('input[type=text]').focus(function(e) { + $(g.cEdit).find('.edit_box').focus(function(e) { g.showEditArea(); }); - $(g.cEdit).find('input[type=text], select').live('keydown', function(e) { + $(g.cEdit).find('.edit_box, select').live('keydown', function(e) { if (e.which == 13) { // post on pressing "Enter" e.preventDefault(); @@ -1614,9 +1610,6 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi * Initialize grid ******************/ - // add relative position to table so that resize handlers are correctly positioned - $(t).css('position', 'relative'); - // wrap all data cells, except actions cell, with span $(t).find('th, td:not(:has(span))') .wrapInner(''); @@ -1658,6 +1651,9 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi // add table class $(t).addClass('pma_table'); + // add relative position to global div so that resize handlers are correctly positioned + $(g.gDiv).css('position', 'relative'); + // link the global div $(t).before(g.gDiv); $(g.gDiv).append(t); diff --git a/libraries/tbl_replace_fields.inc.php b/libraries/tbl_replace_fields.inc.php index f1a0b9ed02..b408e6c0b3 100644 --- a/libraries/tbl_replace_fields.inc.php +++ b/libraries/tbl_replace_fields.inc.php @@ -101,7 +101,7 @@ if (false !== $possibly_uploaded_val) { } // The Null checkbox was unchecked for this field - if (empty($val) && isset($me_fields_null_prev[$key]) && ! isset($me_fields_null[$key])) { + if (empty($val) && ! empty($me_fields_null_prev[$key]) && ! isset($me_fields_null[$key])) { $val = "''"; } } // end else (field value in the form) diff --git a/themes/original/css/theme_right.css.php b/themes/original/css/theme_right.css.php index 8f64772064..be996e6d38 100644 --- a/themes/original/css/theme_right.css.php +++ b/themes/original/css/theme_right.css.php @@ -2548,17 +2548,21 @@ span.cm-number { margin: 0.3em 0.2em; } +.cEdit .edit_box { + overflow: hidden; + padding: 0; +} + +.cEdit .edit_box_posting { + background: #FFF url(getImgPath(); ?>ajax_clock_small.gif) no-repeat right center; + padding-right: 1.5em; +} + .cEdit .edit_area_loading { background: #FFF url(getImgPath(); ?>ajax_clock_small.gif) no-repeat center; height: 10em; } - -.cEdit .edit_area_posting { - background: #FFF url(getImgPath(); ?>ajax_clock_small.gif) no-repeat center top; - padding-top: 1.5em; -} - .cEdit .goto_link { background: #EEE; color: #555; diff --git a/themes/pmahomme/css/theme_right.css.php b/themes/pmahomme/css/theme_right.css.php index 4fc6f43cba..ca554f18cb 100644 --- a/themes/pmahomme/css/theme_right.css.php +++ b/themes/pmahomme/css/theme_right.css.php @@ -2992,16 +2992,21 @@ span.cm-number { margin: 0.3em 0.2em; } +.cEdit .edit_box { + overflow: hidden; + padding: 0; +} + +.cEdit .edit_box_posting { + background: #FFF url(./themes/pmahomme/img/ajax_clock_small.gif) no-repeat right center; + padding-right: 1.5em; +} + .cEdit .edit_area_loading { background: #FFF url(./themes/pmahomme/img/ajax_clock_small.gif) no-repeat center; height: 10em; } -.cEdit .edit_area_posting { - background: #FFF url(./themes/pmahomme/img/ajax_clock_small.gif) no-repeat center top; - padding-top: 1.5em; -} - .cEdit .goto_link { background: #EEE; color: #555;