diff --git a/js/sql.js b/js/sql.js index 219b28c40..2e896ee55 100644 --- a/js/sql.js +++ b/js/sql.js @@ -227,9 +227,9 @@ $(document).ready(function() { $form = $(this); PMA_ajaxShowMessage(); - if (! $form.find('input:hidden').is('#ajax_request_hidden')) { - $form.append(''); - } + if (! $form.find('input:hidden').is('#ajax_request_hidden')) { + $form.append(''); + } $.post($(this).attr('action'), $(this).serialize() , function(data) { if(data.success == true) { @@ -429,14 +429,57 @@ $(document).ready(function() { * @see getFieldName() */ var field_name = getFieldName($this_field, disp_mode); + /** + * @var relation_curr_value String current value of the field (for fields that are foreign keyed). + */ + var relation_curr_value = $this_field.find('a').text(); + /** + * @var enum_curr_value String current value of the field (for fields that are of type enum). + */ + var enum_curr_value = $this_field.text(); + + if($this_field.is(':not(.not_null)')){ + // add a checkbox to mark null for all the field that are nullable. + $this_field.html('
Null :
'); + // check the 'checkbox_null_' if the value is null + if($this_field.is('.null')) { + $('.checkbox_null_' + field_name).attr('checked', true); + } + + // if the select/editor is changed un-check the 'checkbox_null_'. + if ($this_field.is('.enum, .set')) { + var $editor = $this_field.find('select'); + } else if ($this_field.is('.relation')) { + var $editor = $this_field.find('select'); + } else { + var $editor = $this_field.find('textarea'); + } + $editor.live('change', function(e) { + $('.checkbox_null_' + field_name).attr('checked', false); + }) + + // if 'chechbox_null_' is clicked empty the select/editor. + $('.checkbox_null_' + field_name).bind('click', function(e) { + if ($this_field.is('.enum, .set')) { + $this_field.find('select').selectedIndex = -1; + } else if ($this_field.is('.relation')) { + $this_field.find('select').attr('value', ''); + } else { + $this_field.find('textarea').empty(); + } + }) + + } else { + $this_field.html('
'); + } // In each input sibling, wrap the current value in a textarea // and store the current value in a hidden span if($this_field.is(':not(.truncated, .transformed, .relation, .enum, .null)')) { // handle non-truncated, non-transformed, non-relation values // We don't need to get any more data, just wrap the value - $this_field.html('') - .append(''+data_value+''); + $this_field.append(''); + $this_field.append(''+data_value+''); $(".original_data").hide(); } else if($this_field.is('.truncated, .transformed')) { @@ -457,8 +500,8 @@ $(document).ready(function() { 'inline_edit' : true }, function(data) { if(data.success == true) { - $this_field.html('') - .append(''+data_value+''); + $this_field.append(''); + $this_field.append(''+data_value+''); $(".original_data").hide(); } else { @@ -470,11 +513,6 @@ $(document).ready(function() { /** @lends jQuery */ //handle relations - /** - * @var curr_value String containing the current value of this relational field - */ - var curr_value = $this_field.find('a').text(); - /** * @var post_params Object containing parameters for the POST request */ @@ -485,22 +523,18 @@ $(document).ready(function() { 'table' : window.parent.table, 'column' : field_name, 'token' : window.parent.token, - 'curr_value' : curr_value + 'curr_value' : relation_curr_value } $.post('sql.php', post_params, function(data) { - $this_field.html(data.dropdown) - .append(''+data_value+''); + $this_field.append(data.dropdown); + $this_field.append(''+data_value+''); $(".original_data").hide(); }) // end $.post() } else if($this_field.is('.enum')) { /** @lends jQuery */ //handle enum fields - /** - * @var curr_value String containing the current value of this relational field - */ - var curr_value = $this_field.text(); /** * @var post_params Object containing parameters for the POST request @@ -512,19 +546,19 @@ $(document).ready(function() { 'table' : window.parent.table, 'column' : field_name, 'token' : window.parent.token, - 'curr_value' : curr_value + 'curr_value' : enum_curr_value } $.post('sql.php', post_params, function(data) { - $this_field.html(data.dropdown) - .append(''+data_value+''); + $this_field.append(data.dropdown); + $this_field.append(''+data_value+''); $(".original_data").hide(); }) // end $.post() } else if($this_field.is('.null')) { //handle null fields - $this_field.html('') - .append('NULL'); + $this_field.append(''); + $this_field.append('NULL'); $(".original_data").hide(); } }) @@ -584,10 +618,6 @@ $(document).ready(function() { } // Collect values of all fields to submit, we don't know which changed - /** - * @var params_to_submit Array containing the name/value pairs of all fields - */ - var params_to_submit = {}; /** * @var relation_fields Array containing the name/value pairs of relational fields */ @@ -601,6 +631,11 @@ $(document).ready(function() { */ var transformation_fields = false; + /** + * @var sql_query String containing the SQL query to update this row + */ + var sql_query = 'UPDATE ' + window.parent.table + ' SET '; + $input_siblings.each(function() { /** @lends jQuery */ /** @@ -621,50 +656,43 @@ $(document).ready(function() { if($this_field.is('.transformed')) { transformation_fields = true; } + /** + * @var is_null String capturing whether 'checkbox_null_' is checked. + */ + var is_null = $this_field.find('input:checkbox').is(':checked'); + var value; - if($this_field.is(":not(.relation, .enum)")) { - this_field_params[field_name] = $this_field.find('textarea').val(); - if($this_field.is('.transformed')) { - $.extend(transform_fields, this_field_params); + if (is_null) { + sql_query += ' ' + field_name + "=NULL , "; + } else { + if($this_field.is(":not(.relation, .enum)")) { + this_field_params[field_name] = $this_field.find('textarea').val(); + if($this_field.is('.transformed')) { + $.extend(transform_fields, this_field_params); + } } + else { + // results from a drop-down + $test_element = $this_field.find('select'); + if ($test_element.length != 0) { + this_field_params[field_name] = $test_element.val(); + } + + // results from Browse foreign value + $test_element = $this_field.find('span.curr_value'); + if ($test_element.length != 0) { + this_field_params[field_name] = $test_element.text(); + } + + if($this_field.is('.relation')) { + $.extend(relation_fields, this_field_params); + } + } + + sql_query += ' ' + field_name + "='" + this_field_params[field_name].replace(/'/g, "''") + "' , "; } - else { - // results from a drop-down - $test_element = $this_field.find('select'); - if ($test_element.length != 0) { - this_field_params[field_name] = $test_element.val(); - } - - // results from Browse foreign value - $test_element = $this_field.find('span.curr_value'); - if ($test_element.length != 0) { - this_field_params[field_name] = $test_element.text(); - } - - if($this_field.is('.relation')) { - $.extend(relation_fields, this_field_params); - } - } - - $.extend(params_to_submit, this_field_params); }) - /** - * @var sql_query String containing the SQL query to update this row - */ - var sql_query = 'UPDATE ' + window.parent.table + ' SET '; - - // $.each() not used here since it cause problems when there is a column - // in the table with the name 'length'. See bug #3184827 - var value; - for (var key in params_to_submit) { - value = params_to_submit[key]; - if (value.length == 0) { - sql_query += ' ' + key + "=NULL, "; - } else { - sql_query += ' ' + key + "='" + value.replace(/'/g, "''") + "' , "; - } - } //Remove the last ',' appended in the above loop sql_query = sql_query.replace(/,\s$/, ''); sql_query += ' WHERE ' + PMA_urldecode(where_clause); @@ -706,57 +734,64 @@ $(document).ready(function() { $input_siblings.each(function() { // Inline edit post has been successful. $this_sibling = $(this); - if($this_sibling.is(':not(.relation, .enum)')) { - /** - * @var new_html String containing value of the data field after edit - */ - var new_html = $this_sibling.find('textarea').val(); - if($this_sibling.is('.transformed')) { - var field_name = getFieldName($this_sibling, disp_mode); - $.each(data.transformations, function(key, value) { - if(key == field_name) { - if($this_sibling.is('.text_plain, .application_octetstream')) { - new_html = value; - return false; + var is_null = $this_sibling.find('input:checkbox').is(':checked'); + if (is_null) { + $this_sibling.html('NULL'); + $this_sibling.addClass('null'); + } else { + $this_sibling.removeClass('null'); + if($this_sibling.is(':not(.relation, .enum)')) { + /** + * @var new_html String containing value of the data field after edit + */ + var new_html = $this_sibling.find('textarea').val(); + + if($this_sibling.is('.transformed')) { + var field_name = getFieldName($this_sibling, disp_mode); + $.each(data.transformations, function(key, value) { + if(key == field_name) { + if($this_sibling.is('.text_plain, .application_octetstream')) { + new_html = value; + return false; + } + else { + var new_value = $this_sibling.find('textarea').val(); + new_html = $(value).append(new_value); + return false; + } } - else { - var new_value = $this_sibling.find('textarea').val(); + }) + } + } + else { + var new_html = ''; + var new_value = ''; + $test_element = $this_sibling.find('select'); + if ($test_element.length != 0) { + new_value = $test_element.val(); + } + + $test_element = $this_sibling.find('span.curr_value'); + if ($test_element.length != 0) { + new_value = $test_element.text(); + } + + if($this_sibling.is('.relation')) { + var field_name = getFieldName($this_sibling, disp_mode); + $.each(data.relations, function(key, value) { + if(key == field_name) { new_html = $(value).append(new_value); return false; } - } - }) + }) + } + if($this_sibling.is('.enum')) { + new_html = new_value; + } } + $this_sibling.html(new_html); } - else { - var new_html = ''; - var new_value = ''; - $test_element = $this_sibling.find('select'); - if ($test_element.length != 0) { - new_value = $test_element.val(); - } - - $test_element = $this_sibling.find('span.curr_value'); - if ($test_element.length != 0) { - new_value = $test_element.text(); - } - - - if($this_sibling.is('.relation')) { - var field_name = getFieldName($this_sibling, disp_mode); - $.each(data.relations, function(key, value) { - if(key == field_name) { - new_html = $(value).append(new_value); - return false; - } - }) - } - if($this_sibling.is('.enum')) { - new_html = new_value; - } - } - $this_sibling.html(new_html); }) } else { diff --git a/libraries/display_tbl.lib.php b/libraries/display_tbl.lib.php index a06ac6370..a57abb253 100644 --- a/libraries/display_tbl.lib.php +++ b/libraries/display_tbl.lib.php @@ -1234,11 +1234,13 @@ function PMA_displayTableBody(&$dt_result, &$is_display, $map, $analyzed_sql) { // 2. Displays the rows' values for ($i = 0; $i < $fields_cnt; ++$i) { $meta = $fields_meta[$i]; + $not_null_class = $meta->not_null ? 'not_null' : ''; + $relation_class = isset($map[$meta->name]) ? 'relation' : ''; $pointer = $i; $is_field_truncated = false; //If the previous column had blob data, we need to reset the class // to $inline_edit_class - $class = 'data ' . $inline_edit_class . ' ' . $alternating_color_class; + $class = 'data ' . $inline_edit_class . ' ' . $not_null_class . ' ' . $alternating_color_class . ' ' . $relation_class; // See if this column should get highlight because it's used in the // where-query. @@ -2426,7 +2428,6 @@ function PMA_prepare_row_data($class, $condition_field, $analyzed_sql, $meta, $m $result = ' class="' . $class . ($condition_field ? ' condition' : '') . $nowrap . ' ' . ($is_field_truncated ? ' truncated' : '') . ($transform_function != $default_function ? ' transformed' : '') - . (isset($map[$meta->name]) ? ' relation' : '') . $enum_class . $mime_type_class . '">'; if (isset($analyzed_sql[0]['select_expr']) && is_array($analyzed_sql[0]['select_expr'])) { diff --git a/themes/original/css/theme_right.css.php b/themes/original/css/theme_right.css.php index 272221d36..b1bc75310 100644 --- a/themes/original/css/theme_right.css.php +++ b/themes/original/css/theme_right.css.php @@ -159,6 +159,12 @@ fieldset.tblFooters { clear: both; } +div.null_div { + height: 20px; + text-align: center; + font-style:normal; +} + fieldset .formelement { float: ; margin-: 0.5em; @@ -235,6 +241,14 @@ th.condition { border: 1px solid ; } +/** + * cells with the value NULL + */ +td.null { + font-style: italic; + text-align: ; +} + table .value { text-align: ; white-space: normal;