From e1da98ae8551e2ffcc925481231ee95d2f9954c5 Mon Sep 17 00:00:00 2001 From: Aris Feryanto Date: Fri, 29 Jul 2011 11:43:00 +0800 Subject: [PATCH 01/10] Grid edit: fix bug - notice line above SQL query now shown correctly --- tbl_replace.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tbl_replace.php b/tbl_replace.php index 75d041d81d..22bf81349c 100644 --- a/tbl_replace.php +++ b/tbl_replace.php @@ -528,7 +528,7 @@ if ($GLOBALS['is_ajax_request'] == true) { /**Get the total row count of the table*/ $extra_data['row_count'] = PMA_Table::countRecords($_REQUEST['db'],$_REQUEST['table']); - $extra_data['sql_query'] = PMA_showMessage(NULL, $GLOBALS['display_query']); + $extra_data['sql_query'] = PMA_showMessage($message, $GLOBALS['display_query']); PMA_ajaxResponse($message, $message->isSuccess(), $extra_data); } From 351afca2c70d1e91ce65990d5f64bf1da0601af9 Mon Sep 17 00:00:00 2001 From: Aris Feryanto Date: Fri, 29 Jul 2011 12:48:39 +0800 Subject: [PATCH 02/10] Grid edit: null-related things --- js/makegrid.js | 18 +++++++++++++----- libraries/tbl_replace_fields.inc.php | 2 +- tbl_replace.php | 4 ++-- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/js/makegrid.js b/js/makegrid.js index 6599672bf7..cc72920468 100644 --- a/js/makegrid.js +++ b/js/makegrid.js @@ -530,7 +530,7 @@ var new_html = $this_field.data('value'); var is_null = $this_field.data('value') == null; if (is_null) { - $this_field_span.html('NULL'); + $this_field.find('span').html('NULL'); $this_field.addClass('null'); } else { $this_field.removeClass('null'); @@ -541,8 +541,8 @@ } // replace '\n' with
new_html = new_html.replace(/\n/g, '
'); + $this_field.find('span').html(new_html); } - $this_field.find('span').html(new_html); } else { // update edited fields with new value from "data" if (data.transformations != undefined) { @@ -874,6 +874,7 @@ */ var me_fields_name = Array(); var me_fields = Array(); + var me_fields_null = Array(); // loop each edited row $('.to_be_saved').parents('tr').each(function() { @@ -887,6 +888,7 @@ */ var fields_name = Array(); var fields = Array(); + var fields_null = Array(); // loop each edited cell in a row $(this).find('.to_be_saved').each(function() { @@ -914,12 +916,16 @@ /** * @var is_null String capturing whether 'checkbox_null__' is checked. */ - var is_null = $this_field.data('value') == null; + var is_null = $this_field.data('value') === null; fields_name.push(field_name); - fields.push($this_field.data('value')); - if (!is_null) { + if (is_null) { + fields_null.push('on'); + fields.push(''); + } else { + fields_null.push(''); + fields.push($this_field.data('value')); this_field_params[field_name] = $this_field.data('value'); var cell_index = $this_field.index('.to_be_saved'); @@ -949,6 +955,7 @@ me_fields_name.push(fields_name); me_fields.push(fields); + me_fields_null.push(fields_null); }); // end of loop for every edited rows @@ -969,6 +976,7 @@ 'where_clause' : full_where_clause, 'fields[multi_edit]' : me_fields, 'fields_name[multi_edit]' : me_fields_name, + 'fields_null[multi_edit]' : me_fields_null, 'rel_fields_list' : rel_fields_list, 'do_transformations' : transformation_fields, 'transform_fields_list' : transform_fields_list, diff --git a/libraries/tbl_replace_fields.inc.php b/libraries/tbl_replace_fields.inc.php index 32da9c085d..f1a0b9ed02 100644 --- a/libraries/tbl_replace_fields.inc.php +++ b/libraries/tbl_replace_fields.inc.php @@ -95,7 +95,7 @@ if (false !== $possibly_uploaded_val) { // Was the Null checkbox checked for this field? // (if there is a value, we ignore the Null checkbox: this could // be possible if Javascript is disabled in the browser) - if (isset($me_fields_null[$key]) + if (! empty($me_fields_null[$key]) && ($val == "''" || $val == '')) { $val = 'NULL'; } diff --git a/tbl_replace.php b/tbl_replace.php index 22bf81349c..08750e43d8 100644 --- a/tbl_replace.php +++ b/tbl_replace.php @@ -271,8 +271,8 @@ foreach ($loop_array as $rownumber => $where_clause) { // avoid setting a field to NULL when it's already NULL // (field had the null checkbox before the update // field still has the null checkbox) - if (!(! empty($me_fields_null_prev[$key]) - && isset($me_fields_null[$key]))) { + if (empty($me_fields_null_prev[$key]) + || empty($me_fields_null[$key])) { $query_values[] = PMA_backquote($me_fields_name[$key]) . ' = ' . $cur_value; } } From 8f08c0283d5cecf338a6747ab832330cdbd2ecef Mon Sep 17 00:00:00 2001 From: Aris Feryanto Date: Fri, 29 Jul 2011 14:41:28 +0800 Subject: [PATCH 03/10] Grid edit: correctly update the WHERE clause --- js/makegrid.js | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/js/makegrid.js b/js/makegrid.js index cc72920468..3756f777ad 100644 --- a/js/makegrid.js +++ b/js/makegrid.js @@ -880,7 +880,7 @@ $('.to_be_saved').parents('tr').each(function() { var where_clause = $(this).find('.where_clause').val(); full_where_clause.push(unescape(where_clause.replace(/[+]/g, ' '))); - var new_clause = ''; + var new_clause = where_clause; /** * multi edit variables, for current row @@ -939,17 +939,13 @@ $.extend(relation_fields[cell_index], this_field_params); } if (where_clause.indexOf(field_name) > -1) { - new_clause += '`' + window.parent.table + '`.' + '`' + field_name + "` = '" + this_field_params[field_name].replace(/'/g,"''") + "'" + ' AND '; + var old_sub_clause_regex = new RegExp(PMA_urlencode('`' + window.parent.table + '`.' + '`' + field_name + '`') + '[+]%3D[+][^+]*'); + var new_sub_clause = '`' + window.parent.table + '`.' + '`' + field_name + "` = '" + this_field_params[field_name].replace(/'/g,"''") + "'"; + new_clause = new_clause.replace(old_sub_clause_regex, new_sub_clause); } } - /* - * update the where_clause, remove the last appended ' AND ' - * */ - - // prepare and save new_clause - new_clause = new_clause.substring(0, new_clause.length-5); - new_clause = PMA_urlencode(new_clause); + // save new_clause $this_field.parent('tr').data('new_clause', new_clause); }); // end of loop for every edited cells in a row @@ -1011,7 +1007,13 @@ $('.to_be_saved').each(function() { var new_clause = $(this).parent('tr').data('new_clause'); if (new_clause != '') { - $(this).parent('tr').find('.where_clause').attr('value', new_clause); + var $where_clause = $(this).parent('tr').find('.where_clause'); + var old_clause = $where_clause.attr('value'); + $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)); + }); } }); // remove possible previous feedback message From 926f5950a97154bf8028641b60af6bceb0ba6dbe Mon Sep 17 00:00:00 2001 From: Aris Feryanto Date: Fri, 29 Jul 2011 14:43:00 +0800 Subject: [PATCH 04/10] Grid edit: detect nonunique class --- js/makegrid.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/makegrid.js b/js/makegrid.js index 3756f777ad..700a32c0aa 100644 --- a/js/makegrid.js +++ b/js/makegrid.js @@ -868,7 +868,7 @@ /** * @var nonunique Boolean, whether the rows in this table is unique or not */ - var nonunique = $('.to_be_saved').is('.nonunique') ? 0 : 1; + var nonunique = $('.inline_edit_anchor').is('.nonunique') ? 0 : 1; /** * multi edit variables */ From ac1703e7ff720ebb95dbf7af0331219bbcb6ab17 Mon Sep 17 00:00:00 2001 From: Aris Feryanto Date: Fri, 29 Jul 2011 15:58:28 +0800 Subject: [PATCH 05/10] Grid edit: fix for WHERE clause handling --- js/makegrid.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/js/makegrid.js b/js/makegrid.js index 700a32c0aa..5264effe2e 100644 --- a/js/makegrid.js +++ b/js/makegrid.js @@ -938,9 +938,11 @@ relation_fields[cell_index] = {}; $.extend(relation_fields[cell_index], this_field_params); } - if (where_clause.indexOf(field_name) > -1) { - var old_sub_clause_regex = new RegExp(PMA_urlencode('`' + window.parent.table + '`.' + '`' + field_name + '`') + '[+]%3D[+][^+]*'); - var new_sub_clause = '`' + window.parent.table + '`.' + '`' + field_name + "` = '" + this_field_params[field_name].replace(/'/g,"''") + "'"; + if (where_clause.indexOf(PMA_urlencode(field_name)) > -1) { + var fields_str = PMA_urlencode('`' + window.parent.table + '`.' + '`' + field_name + '` = '); + fields_str = fields_str.replace(/[+]/g, '[+]'); // replace '+' sign with '[+]' (regex) + var old_sub_clause_regex = new RegExp(fields_str + '[^+]*'); + var new_sub_clause = PMA_urlencode('`' + window.parent.table + '`.' + '`' + field_name + "` = '" + this_field_params[field_name].replace(/'/g,"''") + "'"); new_clause = new_clause.replace(old_sub_clause_regex, new_sub_clause); } } From 1e2f73c6e90c95747a668d7f6b24ed6b61df65cc Mon Sep 17 00:00:00 2001 From: Aris Feryanto Date: Fri, 29 Jul 2011 16:14:06 +0800 Subject: [PATCH 06/10] Fix bug: PMA_urlencode didn't encode space character correctly --- js/sql.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/sql.js b/js/sql.js index e762bb53c0..a1072fd117 100644 --- a/js/sql.js +++ b/js/sql.js @@ -20,7 +20,7 @@ function PMA_urldecode(str) { } function PMA_urlencode(str) { - return encodeURIComponent(str.replace(/\%20/g, '+')); + return encodeURIComponent(str).replace(/\%20/g, '+'); } /** From 8ae900a3f894cdd8215fc6a73873d6d2ee16385f Mon Sep 17 00:00:00 2001 From: Aris Feryanto Date: Fri, 29 Jul 2011 17:01:16 +0800 Subject: [PATCH 07/10] Grid edit: fix bug - alert everytime leave Browse page --- js/makegrid.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/js/makegrid.js b/js/makegrid.js index 5264effe2e..21042171f6 100644 --- a/js/makegrid.js +++ b/js/makegrid.js @@ -1417,7 +1417,9 @@ g.postEditedCell(); }); $(window).bind('beforeunload', function(e) { - return g.isCellEdited ? g.saveCellWarning : null; + if (g.isCellEdited) { + g.saveCellWarning; + } }); // add table class From c2790e11958adcb97a7d7579a7ad8ed4bfdf8b69 Mon Sep 17 00:00:00 2001 From: Aris Feryanto Date: Fri, 29 Jul 2011 17:12:42 +0800 Subject: [PATCH 08/10] Grid edit: fix disabled state --- js/makegrid.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/js/makegrid.js b/js/makegrid.js index 21042171f6..22da282b62 100644 --- a/js/makegrid.js +++ b/js/makegrid.js @@ -488,7 +488,7 @@ g.isCellEditActive = false; g.currentEditCell = cell; $(g.cEdit).find('input[type=text]').focus(); - $(g.cEdit).find('*').attr('disabled', false); + $(g.cEdit).find('*').removeAttr('disabled'); } } else { g.hideEditCell(); @@ -984,12 +984,12 @@ }; if (!g.saveCellsAtOnce) { - $(g.cEdit).find('*').attr('disabled', true); + $(g.cEdit).find('*').attr('disabled', 'disabled'); var $editArea = $(g.cEdit).find('.edit_area'); $editArea.addClass('edit_area_posting'); } else { $('.save_edited').addClass('saving_edited_data') - .attr('disabled', true); + .find('input').attr('disabled', 'disabled'); // disable the save button } $.ajax({ @@ -1002,7 +1002,7 @@ $editArea.removeClass('edit_area_posting'); } else { $('.save_edited').removeClass('saving_edited_data') - .attr('disabled', false); + .find('input').removeAttr('disabled'); // enable the save button back } if(data.success == true) { PMA_ajaxShowMessage(data.message); From 5cf1288f91e314288e362ed6834c76acac2c13d2 Mon Sep 17 00:00:00 2001 From: Aris Feryanto Date: Fri, 29 Jul 2011 17:59:55 +0800 Subject: [PATCH 09/10] Grid edit: 2 fixes - update edited field correctly when SaveCellsAtOnce is false; enable edit field after save AJAX request is complete --- js/makegrid.js | 105 +++++++++++++++++++--------------- libraries/display_tbl.lib.php | 7 +++ 2 files changed, 66 insertions(+), 46 deletions(-) diff --git a/js/makegrid.js b/js/makegrid.js index 22da282b62..bcd4ef78b1 100644 --- a/js/makegrid.js +++ b/js/makegrid.js @@ -34,6 +34,12 @@ saveCellWarning: '', // string, warning text when user want to leave a page with unsaved edited data lastXHR : null, // last XHR object used in AJAX request + // common hidden inputs + token: null, + server: null, + db: null, + table: null, + // functions dragStartRsz: function(e, obj) { // start column resize var n = $(this.cRsz).find('div').index(obj); @@ -284,10 +290,10 @@ sendColPrefs: function() { $.post('sql.php', { ajax_request: true, - db: window.parent.db, - table: window.parent.table, - token: window.parent.token, - server: window.parent.server, + db: g.db, + table: g.table, + token: g.token, + server: g.server, set_col_prefs: true, col_order: this.colOrder.toString(), col_visib: this.colVisib.toString(), @@ -518,13 +524,8 @@ g.lastXHR = null; } - // hide the cell editing area - $(g.cEdit).hide(); - $(g.cEdit).find('input[type=text]').blur(); - g.isCellEditActive = false; - if (data) { - if (data === true) { + 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'); @@ -543,26 +544,30 @@ new_html = new_html.replace(/\n/g, '
'); $this_field.find('span').html(new_html); } - } else { - // update edited fields with new value from "data" - if (data.transformations != undefined) { - $.each(data.transformations, function(cell_index, value) { - var $this_field = $(g.t).find('.to_be_saved:eq(' + cell_index + ')'); - $this_field.find('span').html(value); - }); - } - if (data.relations != undefined) { - $.each(data.relations, function(cell_index, value) { - var $this_field = $(g.t).find('.to_be_saved:eq(' + cell_index + ')'); - $this_field.find('span').html(value); - }); - } + } + if (data.transformations != undefined) { + $.each(data.transformations, function(cell_index, value) { + var $this_field = $(g.t).find('.to_be_saved:eq(' + cell_index + ')'); + $this_field.find('span').html(value); + }); + } + if (data.relations != undefined) { + $.each(data.relations, function(cell_index, value) { + var $this_field = $(g.t).find('.to_be_saved:eq(' + cell_index + ')'); + $this_field.find('span').html(value); + }); } // refresh the grid this.reposRsz(); this.reposDrop(); } + + // hide the cell editing area + $(g.cEdit).hide(); + $(g.cEdit).find('input[type=text]').blur(); + g.isCellEditActive = false; + g.currentEditCell = null; }, /** @@ -673,11 +678,11 @@ var post_params = { 'ajax_request' : true, 'get_relational_values' : true, - 'server' : window.parent.server, - 'db' : window.parent.db, - 'table' : window.parent.table, + 'server' : g.server, + 'db' : g.db, + 'table' : g.table, 'column' : field_name, - 'token' : window.parent.token, + 'token' : g.token, 'curr_value' : relation_curr_value, 'relation_key_or_display_column' : relation_key_or_display_column } @@ -709,11 +714,11 @@ var post_params = { 'ajax_request' : true, 'get_enum_values' : true, - 'server' : window.parent.server, - 'db' : window.parent.db, - 'table' : window.parent.table, + 'server' : g.server, + 'db' : g.db, + 'table' : g.table, 'column' : field_name, - 'token' : window.parent.token, + 'token' : g.token, 'curr_value' : curr_value } g.lastXHR = $.post('sql.php', post_params, function(data) { @@ -737,11 +742,11 @@ var post_params = { 'ajax_request' : true, 'get_set_values' : true, - 'server' : window.parent.server, - 'db' : window.parent.db, - 'table' : window.parent.table, + 'server' : g.server, + 'db' : g.db, + 'table' : g.table, 'column' : field_name, - 'token' : window.parent.token, + 'token' : g.token, 'curr_value' : curr_value } @@ -778,13 +783,13 @@ /** * @var sql_query String containing the SQL query used to retrieve value of truncated/transformed data */ - var sql_query = 'SELECT `' + field_name + '` FROM `' + window.parent.table + '` WHERE ' + PMA_urldecode(where_clause); + var sql_query = 'SELECT `' + field_name + '` FROM `' + g.table + '` WHERE ' + PMA_urldecode(where_clause); // Make the Ajax call and get the data, wrap it and insert it g.lastXHR = $.post('sql.php', { - 'token' : window.parent.token, - 'server' : window.parent.server, - 'db' : window.parent.db, + 'token' : g.token, + 'server' : g.server, + 'db' : g.db, 'ajax_request' : true, 'sql_query' : sql_query, 'inline_edit' : true @@ -939,10 +944,10 @@ $.extend(relation_fields[cell_index], this_field_params); } if (where_clause.indexOf(PMA_urlencode(field_name)) > -1) { - var fields_str = PMA_urlencode('`' + window.parent.table + '`.' + '`' + field_name + '` = '); + var fields_str = PMA_urlencode('`' + g.table + '`.' + '`' + field_name + '` = '); fields_str = fields_str.replace(/[+]/g, '[+]'); // replace '+' sign with '[+]' (regex) var old_sub_clause_regex = new RegExp(fields_str + '[^+]*'); - var new_sub_clause = PMA_urlencode('`' + window.parent.table + '`.' + '`' + field_name + "` = '" + this_field_params[field_name].replace(/'/g,"''") + "'"); + var new_sub_clause = PMA_urlencode('`' + g.table + '`.' + '`' + field_name + "` = '" + this_field_params[field_name].replace(/'/g,"''") + "'"); new_clause = new_clause.replace(old_sub_clause_regex, new_sub_clause); } } @@ -966,10 +971,10 @@ */ var post_params = {'ajax_request' : true, 'sql_query' : full_sql_query, - 'token' : window.parent.token, - 'server' : window.parent.server, - 'db' : window.parent.db, - 'table' : window.parent.table, + 'token' : g.token, + 'server' : g.server, + 'db' : g.db, + 'table' : g.table, 'clause_is_unique' : nonunique, 'where_clause' : full_where_clause, 'fields[multi_edit]' : me_fields, @@ -999,6 +1004,7 @@ success: function(data) { if (!g.saveCellsAtOnce) { + $(g.cEdit).find('*').removeAttr('disabled'); $editArea.removeClass('edit_area_posting'); } else { $('.save_edited').removeClass('saving_edited_data') @@ -1200,6 +1206,13 @@ // initialize cell editing configuration g.saveCellsAtOnce = $('#save_cells_at_once').val(); + // assign common hidden inputs + var $common_hidden_inputs = $('.common_hidden_inputs'); + g.token = $common_hidden_inputs.find('input[name=token]').val(); + g.server = $common_hidden_inputs.find('input[name=server]').val(); + g.db = $common_hidden_inputs.find('input[name=db]').val(); + g.table = $common_hidden_inputs.find('input[name=table]').val(); + // initialize column order $col_order = $('#col_order'); if ($col_order.length > 0) { diff --git a/libraries/display_tbl.lib.php b/libraries/display_tbl.lib.php index 472fbebbd9..cfb7cc6e78 100644 --- a/libraries/display_tbl.lib.php +++ b/libraries/display_tbl.lib.php @@ -397,6 +397,13 @@ function PMA_displayTableNavigation($pos_next, $pos_prev, $sql_query, $id_for_di '; ?> '; ?> '; ?> + '; + echo PMA_generate_common_hidden_inputs($db, $table); + echo ''; + ?>
From 4f5d6a59aaff7ba27b43df8beed7ed94d96dbafa Mon Sep 17 00:00:00 2001 From: Aris Feryanto Date: Fri, 29 Jul 2011 18:11:33 +0800 Subject: [PATCH 10/10] Grid edit: fix bug - wrong update on isCellEditActive value --- js/makegrid.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/js/makegrid.js b/js/makegrid.js index bcd4ef78b1..417e0ead8f 100644 --- a/js/makegrid.js +++ b/js/makegrid.js @@ -491,7 +491,6 @@ $(g.cEdit).find('input') .val(value); - g.isCellEditActive = false; g.currentEditCell = cell; $(g.cEdit).find('input[type=text]').focus(); $(g.cEdit).find('*').removeAttr('disabled'); @@ -513,7 +512,6 @@ hideEditCell: function(force, data, field) { if (g.isCellEditActive && !force) { // cell is being edited, post the edited data - g.isCellEditActive = false; g.saveOrPostEditedCell(); return; }