From 0e55c083a9583b013b8a5c8c97743b5b9f8a9152 Mon Sep 17 00:00:00 2001 From: Aris Feryanto Date: Thu, 28 Jul 2011 16:46:51 +0800 Subject: [PATCH 1/2] Grid edit: update relation and transformation correctly --- js/makegrid.js | 95 +++++++++++++++---------------------- tbl_replace.php | 121 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 159 insertions(+), 57 deletions(-) diff --git a/js/makegrid.js b/js/makegrid.js index 0d504adc00..06aa5746b9 100644 --- a/js/makegrid.js +++ b/js/makegrid.js @@ -515,63 +515,45 @@ g.isCellEditActive = false; if (data) { - $this_field = field == undefined ? $(g.currentEditCell) : $(field); - $this_field_span = $this_field.children('span'); - - var is_null = $this_field.data('value') == null; - if (is_null) { - $this_field_span.html('NULL'); - $this_field.addClass('null'); - } else { - $this_field.removeClass('null'); - /** - * @var new_html String containing value of the data field after edit - */ + if (data === true) { + // replace current edited field with the new value + var $this_field = $(g.currentEditCell); var new_html = $this_field.data('value'); - - if($this_field.is(':not(.relation, .enum, .set)')) { - if($this_field.is('.transformed')) { - var field_name = getFieldName($this_field); - if (typeof data.transformations != 'undefined') { - $.each(data.transformations, function(key, value) { - if(key == field_name) { - if($this_field.is('.text_plain, .application_octetstream')) { - new_html = value; - return false; - } else { - var new_value = $this_field.data('value'); - new_html = $(value).append(new_value); - return false; - } - } - }) - } - } else if ($this_field.is('.truncated')) { + var is_null = $this_field.data('value') == null; + if (is_null) { + $this_field_span.html('NULL'); + $this_field.addClass('null'); + } else { + $this_field.removeClass('null'); + 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, '
'); - } else { - if($this_field.is('.relation')) { - var field_name = getFieldName($this_field); - if (typeof data.relations != 'undefined') { - $.each(data.relations, function(key, value) { - if(key == field_name) { - new_html = $(value); - return false; - } - }) - } - } } - $this_field_span.html(new_html); + $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); + }); + } } + // refresh the grid this.reposRsz(); this.reposDrop(); - } // end of if "data" is defined, i.e. post successful + } }, /** @@ -896,22 +878,22 @@ * @var is_null String capturing whether 'checkbox_null__' is checked. */ var is_null = $this_field.data('value') == null; - var value; - var addQuotes = true; fields_name.push(field_name); fields.push($this_field.data('value')); - + if (!is_null) { this_field_params[field_name] = $this_field.data('value'); + + var cell_index = $this_field.index('.to_be_saved'); if($this_field.is(":not(.relation, .enum, .set, .bit)")) { if($this_field.is('.transformed')) { - $.extend(transform_fields, this_field_params); + transform_fields[cell_index] = {}; + $.extend(transform_fields[cell_index], this_field_params); } - } else if ($this_field.is('.bit')) { - addQuotes = false; } else if($this_field.is('.relation')) { - $.extend(relation_fields, this_field_params); + relation_fields[cell_index] = {}; + $.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 '; @@ -926,10 +908,6 @@ new_clause = new_clause.substring(0, new_clause.length-5); new_clause = PMA_urlencode(new_clause); $this_field.parent('tr').data('new_clause', new_clause); - - rel_fields_list += $.param(relation_fields) + '&'; - transform_fields_list += $.param(transform_fields) + '&'; - }); // end of loop for every edited cells in a row me_fields_name.push(fields_name); @@ -937,6 +915,9 @@ }); // end of loop for every edited rows + rel_fields_list = $.param(relation_fields); + transform_fields_list = $.param(transform_fields); + // Make the Ajax post after setting all parameters /** * @var post_params Object containing parameters for the POST request @@ -989,7 +970,7 @@ // remove the "Save edited cells" button $('.save_edited').hide(); // remove the to_be_saved class - $('.to_be_saved').removeClass('to_be_saved'); + $(g.t).find('.to_be_saved').removeClass('to_be_saved'); g.isCellEdited = false; } else { diff --git a/tbl_replace.php b/tbl_replace.php index 48d01fc6de..75d041d81d 100644 --- a/tbl_replace.php +++ b/tbl_replace.php @@ -405,6 +405,127 @@ if (! empty($error_messages)) { unset($error_messages, $warning_messages, $total_affected_rows, $last_messages, $last_message); if ($GLOBALS['is_ajax_request'] == true) { + /** + * If we are in grid editing, we need to process the relational and + * transformed fields, if they were edited. After that, output the correct + * link/transformed value and exit + * + * Logic taken from libraries/display_tbl.lib.php + */ + + if (isset($_REQUEST['rel_fields_list']) && $_REQUEST['rel_fields_list'] != '') { + //handle relations work here for updated row. + require_once './libraries/relation.lib.php'; + + $map = PMA_getForeigners($db, $table, '', 'both'); + + $rel_fields = array(); + parse_str($_REQUEST['rel_fields_list'], $rel_fields); + + // loop for each relation cell + foreach ( $rel_fields as $cell_index => $curr_cell_rel_field) { + + foreach ( $curr_cell_rel_field as $rel_field => $rel_field_value) { + + $where_comparison = "='" . $rel_field_value . "'"; + $display_field = PMA_getDisplayField($map[$rel_field]['foreign_db'], $map[$rel_field]['foreign_table']); + + // Field to display from the foreign table? + if (isset($display_field) && strlen($display_field)) { + $dispsql = 'SELECT ' . PMA_backquote($display_field) + . ' FROM ' . PMA_backquote($map[$rel_field]['foreign_db']) + . '.' . PMA_backquote($map[$rel_field]['foreign_table']) + . ' WHERE ' . PMA_backquote($map[$rel_field]['foreign_field']) + . $where_comparison; + $dispresult = PMA_DBI_try_query($dispsql, null, PMA_DBI_QUERY_STORE); + if ($dispresult && PMA_DBI_num_rows($dispresult) > 0) { + list($dispval) = PMA_DBI_fetch_row($dispresult, 0); + } else { + //$dispval = __('Link not found'); + } + @PMA_DBI_free_result($dispresult); + } else { + $dispval = ''; + } // end if... else... + + if ('K' == $_SESSION['tmp_user_values']['relational_display']) { + // user chose "relational key" in the display options, so + // the title contains the display field + $title = (! empty($dispval))? ' title="' . htmlspecialchars($dispval) . '"' : ''; + } else { + $title = ' title="' . htmlspecialchars($rel_field_value) . '"'; + } + + $_url_params = array( + 'db' => $map[$rel_field]['foreign_db'], + 'table' => $map[$rel_field]['foreign_table'], + 'pos' => '0', + 'sql_query' => 'SELECT * FROM ' + . PMA_backquote($map[$rel_field]['foreign_db']) . '.' . PMA_backquote($map[$rel_field]['foreign_table']) + . ' WHERE ' . PMA_backquote($map[$rel_field]['foreign_field']) + . $where_comparison + ); + $output = ''; + + if ('D' == $_SESSION['tmp_user_values']['relational_display']) { + // user chose "relational display field" in the + // display options, so show display field in the cell + $output .= (!empty($dispval)) ? htmlspecialchars($dispval) : ''; + } else { + // otherwise display data in the cell + $output .= htmlspecialchars($rel_field_value); + } + $output .= ''; + $extra_data['relations'][$cell_index] = $output; + } + } // end of loop for each relation cell + } + + if (isset($_REQUEST['do_transformations']) && $_REQUEST['do_transformations'] == true ) { + require_once './libraries/transformations.lib.php'; + //if some posted fields need to be transformed, generate them here. + $mime_map = PMA_getMIME($db, $table); + + if ($mime_map === false) { + $mime_map = array(); + } + + $edited_values = array(); + parse_str($_REQUEST['transform_fields_list'], $edited_values); + + foreach($mime_map as $transformation) { + $include_file = PMA_securePath($transformation['transformation']); + $column_name = $transformation['column_name']; + + foreach ($edited_values as $cell_index => $curr_cell_edited_values) { + if (isset($curr_cell_edited_values[$column_name])) { + $column_data = $curr_cell_edited_values[$column_name]; + + $_url_params = array( + 'db' => $db, + 'table' => $table, + 'where_clause' => $_REQUEST['where_clause'], + 'transform_key' => $column_name, + ); + + if (file_exists('./libraries/transformations/' . $include_file)) { + $transformfunction_name = str_replace('.inc.php', '', $transformation['transformation']); + + require_once './libraries/transformations/' . $include_file; + + if (function_exists('PMA_transformation_' . $transformfunction_name)) { + $transform_function = 'PMA_transformation_' . $transformfunction_name; + $transform_options = PMA_transformation_getOptions((isset($transformation['transformation_options']) ? $transformation['transformation_options'] : '')); + $transform_options['wrapper_link'] = PMA_generate_common_url($_url_params); + } + } + + $extra_data['transformations'][$cell_index] = $transform_function($column_data, $transform_options); + } + } // end of loop for each transformation cell + } // end of loop for each $mime_map + } + /**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']); From d1c219b94eecf70b34fba9715ac6f5279c761c91 Mon Sep 17 00:00:00 2001 From: Aris Feryanto Date: Thu, 28 Jul 2011 17:45:59 +0800 Subject: [PATCH 2/2] Grid edit: modification checking for TEXT data type --- js/functions.js | 2 ++ js/makegrid.js | 96 ++++++++++++++++++++++++++++++------------------- 2 files changed, 61 insertions(+), 37 deletions(-) diff --git a/js/functions.js b/js/functions.js index 8c858882c3..77d6373800 100644 --- a/js/functions.js +++ b/js/functions.js @@ -2981,6 +2981,8 @@ function PMA_createqTip($elements, content, options) { function PMA_getCellValue(td) { if ($(td).is('.null')) { return ''; + } else if ($(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 { diff --git a/js/makegrid.js b/js/makegrid.js index 06aa5746b9..e8f82b9acf 100644 --- a/js/makegrid.js +++ b/js/makegrid.js @@ -738,43 +738,62 @@ }) } else if($td.is('.truncated, .transformed')) { - /** @lends jQuery */ - //handle truncated/transformed values values - $editArea.addClass('edit_area_loading'); + 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) { + $editArea.find('textarea').val($(this).val()); + }); + $editArea.append('
' + g.cellEditHint + '
'); + } else { + /** @lends jQuery */ + //handle truncated/transformed values values + $editArea.addClass('edit_area_loading'); - /** - * @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); + // initialize the original data + $td.data('original_data', null); - // Make the Ajax call and get the data, wrap it and insert it - $.post('sql.php', { - 'token' : window.parent.token, - 'server' : window.parent.server, - 'db' : window.parent.db, - 'ajax_request' : true, - 'sql_query' : sql_query, - 'inline_edit' : true - }, function(data) { - $editArea.removeClass('edit_area_loading'); - if(data.success == true) { - // get the truncated data length - g.maxTruncatedLen = PMA_getCellValue(g.currentEditCell).length - 3; - - $(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) { - $editArea.find('textarea').val($(this).val()); - }); - $editArea.append('
' + g.cellEditHint + '
'); - } - else { - PMA_ajaxShowMessage(data.error); - } - }) // end $.post() + /** + * @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); + + // Make the Ajax call and get the data, wrap it and insert it + $.post('sql.php', { + 'token' : window.parent.token, + 'server' : window.parent.server, + 'db' : window.parent.db, + 'ajax_request' : true, + 'sql_query' : sql_query, + 'inline_edit' : true + }, function(data) { + $editArea.removeClass('edit_area_loading'); + if(data.success == true) { + if ($td.is('.truncated')) { + // get the truncated data length + g.maxTruncatedLen = $(g.currentEditCell).text().length - 3; + } + + $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) { + $editArea.find('textarea').val($(this).val()); + }); + $editArea.append('
' + g.cellEditHint + '
'); + } + else { + PMA_ajaxShowMessage(data.error); + } + }) // end $.post() + } g.isEditCellTextEditable = true; } else { $editArea.append(''); @@ -969,8 +988,11 @@ // remove the "Save edited cells" button $('.save_edited').hide(); - // remove the to_be_saved class - $(g.t).find('.to_be_saved').removeClass('to_be_saved'); + // update saved fields + $(g.t).find('.to_be_saved') + .removeClass('to_be_saved') + .data('value', null) + .data('original_data', null); g.isCellEdited = false; } else {