From 294e36bdb68dd06ef28ab66931d947e70ffce5da Mon Sep 17 00:00:00 2001 From: Smita Kumari Date: Thu, 5 Jun 2014 18:21:48 +0530 Subject: [PATCH] pick a column from central list Signed-off-by: Smita Kumari small bug fix Signed-off-by: Smita Kumari added own style Signed-off-by: Smita Kumari not display column name that already exist in tabl Signed-off-by: Smita Kumari added search to the pick column dialog Signed-off-by: Smita Kumari Fix coding style Signed-off-by: Smita Kumari check for central columns configuration relation Signed-off-by: Smita Kumari pagination in pick coulumn dialog Signed-off-by: Smita Kumari code cleanup Signed-off-by: Smita Kumari Fix coding style Signed-off-by: Smita Kumari --- db_central_columns.php | 4 + js/db_central_columns.js | 5 +- js/functions.js | 155 +++++++++++++++++- js/messages.php | 6 + libraries/central_columns.lib.php | 47 +++++- libraries/tbl_columns_definition_form.inc.php | 7 +- libraries/tbl_columns_definition_form.lib.php | 35 ++-- .../PMA_tbl_columns_definition_form_test.php | 3 +- 8 files changed, 242 insertions(+), 20 deletions(-) diff --git a/db_central_columns.php b/db_central_columns.php index 2fa8ac1e5b..02e1dc9779 100644 --- a/db_central_columns.php +++ b/db_central_columns.php @@ -32,6 +32,10 @@ if (isset($_POST['populateColumns'])) { echo PMA_getHTMLforColumnDropdown($db, $selected_tbl); exit; } +if (isset($_POST['getColumnList'])) { + echo PMA_getCentralColumnsListRaw($db, $_POST['cur_table']); + exit; +} if (isset($_POST['add_column'])) { $selected_col = array(); $selected_tbl = htmlspecialchars($_POST['table-select']); diff --git a/js/db_central_columns.js b/js/db_central_columns.js index a523de9fbb..417f6abe31 100644 --- a/js/db_central_columns.js +++ b/js/db_central_columns.js @@ -115,7 +115,7 @@ AJAX.registerOnload('db_central_columns.js', function () { }); $('#table-select').change(function(e) { var selectvalue = $(this).val(); - var default_column_select = ''; + var default_column_select = $('#column-select').html(); var href = "db_central_columns.php"; var params = { 'ajax_request' : true, @@ -124,8 +124,7 @@ AJAX.registerOnload('db_central_columns.js', function () { 'selectedTable' : selectvalue, 'populateColumns' : true }; - $('#column-select').html(''); - + $('#column-select').html(''); if (selectvalue !== "") { $.post(href, params, function (data) { $('#column-select').html(default_column_select); diff --git a/js/functions.js b/js/functions.js index f9d98d8193..4b26da1c75 100644 --- a/js/functions.js +++ b/js/functions.js @@ -39,6 +39,10 @@ var codemirror_inline_editor = false; */ var chart_activeTimeouts = {}; +/** + * @var central_column_list array to hold the columns in central list per db. + */ +var central_column_list = []; /** * Make sure that ajax requests will not be cached * by appending a random variable to their parameters @@ -53,7 +57,7 @@ $.ajaxPrefilter(function (options, originalOptions, jqXHR) { }); /** - * Show notices for ENUM columns; add/hide the default value + * Show notices for ENUM columns; add/hide the default value * */ function PMA_verifyColumnsProperties() @@ -2664,6 +2668,48 @@ function PMA_validateDefaultValue($null_checkbox) } } +/** + * function to populate the input fields on picking a coulmn from central list + * + * @param string input_id input id of the name field for the column to be populated + * @param integer offset of the selected column in central list of columns + */ +function autoPopulate(input_id, offset) +{ + var db = PMA_commonParams.get('db'); + var table = PMA_commonParams.get('table'); + input_id = input_id.substring(0, input_id.length - 1); + $('#'+input_id+'1').val(central_column_list[db+'_'+table][offset].col_name); + var col_type = central_column_list[db+'_'+table][offset].col_type.toUpperCase(); + $('#'+input_id+'2').val(col_type); + $('#'+input_id+'3').val(central_column_list[db+'_'+table][offset].col_length); + if(col_type === 'ENUM' || col_type === 'SET') { + $('#'+input_id+'3').next().show(); + } else { + $('#'+input_id+'3').next().hide(); + } + var col_default = central_column_list[db+'_'+table][offset].col_default.toUpperCase(); + if (col_default !== '' && col_default !== 'NULL' && col_default !== 'CURRENT_TIMESTAMP') { + $('#'+input_id+'4').val("USER_DEFINED"); + $('#'+input_id+'4').next().next().show(); + $('#'+input_id+'4').next().next().val(central_column_list[db+'_'+table][offset].col_default); + } else { + $('#'+input_id+'4').val(central_column_list[db+'_'+table][offset].col_default); + $('#'+input_id+'4').next().next().hide(); + } + $('#'+input_id+'5').val(central_column_list[db+'_'+table][offset].col_collation); + $('#'+input_id+'6').val(central_column_list[db+'_'+table][offset].col_extra); + if(central_column_list[db+'_'+table][offset].col_extra.toUpperCase() === 'AUTO_INCREMENT') { + $('#'+input_id+'9').attr("checked","checked"); + } else { + $('#'+input_id+'9').removeAttr("checked"); + } + if(central_column_list[db+'_'+table][offset].col_isNull !== '0') { + $('#'+input_id+'7').attr("checked","checked"); + } else { + $('#'+input_id+'7').removeAttr("checked"); + } +} /** * Unbind all event handlers before tearing down a page @@ -2672,6 +2718,7 @@ AJAX.registerTeardown('functions.js', function () { $("a.open_enum_editor").die('click'); $("input.add_value").die('click'); $("#enum_editor td.drop").die('click'); + $('a.central_columns_dialog').die('click'); }); /** * @var $enum_editor_dialog An object that points to the jQuery @@ -2830,6 +2877,112 @@ AJAX.registerOnload('functions.js', function () { return false; }); + $('a.central_columns_dialog').live('click',function(e) { + var href = "db_central_columns.php"; + var db = PMA_commonParams.get('db'); + var table = PMA_commonParams.get('table'); + var maxRows = $(this).data('maxrows'); + var params = { + 'ajax_request' : true, + 'token' : PMA_commonParams.get('token'), + 'db' : PMA_commonParams.get('db'), + 'cur_table' : PMA_commonParams.get('table'), + 'getColumnList':true + }; + var colid = $(this).closest('td').find("input").attr("id"); + var fields = ''; + if (! (db+'_'+table in central_column_list)) { + central_column_list.push(db+'_'+table); + $.ajax({ + type: 'POST', + url: href, + data: params, + success: function (data) { + central_column_list[db+'_'+table] = $.parseJSON(data.message); + }, + async:false + }); + } + var i = 0; + var list_size = central_column_list[db+'_'+table].length; + var min = (list_size<=maxRows)?list_size:maxRows; + for (i = 0; i
'+central_column_list[db+'_'+table][i].col_type; + if(central_column_list[db+'_'+table][i].col_length !== '') { + fields += '('+central_column_list[db+'_'+table][i].col_length+') '; + } + fields += central_column_list[db+'_'+table][i].col_extra+''+ + ''; + } + var result_pointer = i; + var search_in = ''; + if (fields === '') { + fields = $.sprintf(PMA_messages.strEmptyCentralList, "'"+db+"'"); + search_in = ''; + } + var seeMore = ''; + if (list_size > maxRows) { + seeMore = "
"+PMA_messages.seeMore+"
"; + } + var central_columns_dialog = "
" + + "
" + + search_in+ + "" + fields + "
" + + "
"+ + seeMore+ + "
"; + + var width = parseInt( + (parseInt($('html').css('font-size'), 10) / 13) * 500, + 10 + ); + if (! width) { + width = 500; + } + var buttonOptions = {}; + var $central_columns_dialog = $(central_columns_dialog).dialog({ + minWidth: width, + modal: true, + title: PMA_messages.pickColumnTitle, + buttons: buttonOptions, + open: function () { + $('#col_list').on("click",".pick", function(){ + $central_columns_dialog.remove(); + }); + $(".filter_rows").on("keyup", function () { + $.uiTableFilter($("#col_list"), $(this).val()); + }); + $("#seeMore").click(function() { + fields = ''; + min = (list_size<=maxRows+result_pointer)?list_size:maxRows+result_pointer; + for (i = result_pointer; i < min; i++) { + fields += '
'+central_column_list[db+'_'+table][i].col_name+ + '
'+central_column_list[db+'_'+table][i].col_type; + if(central_column_list[db+'_'+table][i].col_length !== '') { + fields += '('+central_column_list[db+'_'+table][i].col_length+') '; + } + fields += central_column_list[db+'_'+table][i].col_extra+''+ + '
'; + } + $("#col_list").append(fields); + result_pointer = i; + if (result_pointer === list_size) { + $('.tblFooters').hide(); + } + return false; + }); + $(this).closest('.ui-dialog').find('.ui-dialog-buttonpane button:first').focus(); + }, + close: function () { + $('#col_list').off("click",".pick"); + $(".filter_rows").off("keyup"); + $(this).remove(); + } + }); + return false; + }); + // When "add a new value" is clicked, append an empty text field $("input.add_value").live('click', function (e) { e.preventDefault(); diff --git a/js/messages.php b/js/messages.php index 5c31c098f7..59b82aab48 100644 --- a/js/messages.php +++ b/js/messages.php @@ -275,6 +275,12 @@ $js_messages['strEdit'] = __('Edit'); $js_messages['strNotValidRowNumber'] = __('%d is not valid row number.'); $js_messages['strBrowseForeignValues'] = __('Browse foreign values'); +/* For Central list of columns */ +$js_messages['pickColumn'] = __('Pick'); +$js_messages['pickColumnTitle'] = __('Column selector'); +$js_messages['searchList'] = __('Search this list'); +$js_messages['strEmptyCentralList'] = __('No columns in the central list. Make sure Central columns list for database %s has columns that is not present in current table.'); +$js_messages['seeMore'] = __('See more'); /* For server_variables.js */ $js_messages['strSave'] = __('Save'); diff --git a/libraries/central_columns.lib.php b/libraries/central_columns.lib.php index 384b8d582c..da430125c9 100644 --- a/libraries/central_columns.lib.php +++ b/libraries/central_columns.lib.php @@ -71,6 +71,17 @@ function PMA_getColumnsList($db, $from=0, $num=25) return $has_list; } +/* to do block, need to complete +function PMA_getCentralColumnsCount($db) +{ + $pmadb = $GLOBALS['cfg']['Server']['pmadb']; + $GLOBALS['dbi']->selectDb($pmadb); + $central_list_table = $GLOBALS['cfg']['Server']['central_columns']; + $query = 'SELECT count(db_name) FROM ' . + * PMA_Util::backquote($central_list_table) . ' ' + . 'WHERE db_name = \'' . $db . '\';'; + return $GLOBALS['dbi']->fetchResult($query); +}*/ /** * return the existing columns in central list among the given list of columns * @@ -523,7 +534,7 @@ function PMA_getHTMLforTableDropdown($db) $tables = $GLOBALS['dbi']->getTables($db); $selectHtml = '' . PMA_getHTMLforTableDropdown($db) . '' . '' . '' @@ -672,4 +683,34 @@ function PMA_getHTMLforCentralColumnsTableRow($row, $odd_row, $row_num, $db) $tableHtml .= ''; return $tableHtml; } + +/** + * get the list of columns in given database excluding + * the columns present in current table + * + * @param string $db selected database + * @param string $table current table name + * + * @return encoded list of columns present in central list for the given database + */ +function PMA_getCentralColumnsListRaw($db, $table) +{ + $cfgCentralColumns = PMA_centralColumnsGetParams(); + $centralTable = $cfgCentralColumns['table']; + $GLOBALS['dbi']->selectDb($cfgCentralColumns['db']); + if (empty($table) || $table == '') { + $query = 'SELECT * FROM ' . PMA_Util::backquote($centralTable) . ' ' + . 'WHERE db_name = \'' . $db . '\';'; + } else { + $columns = (array) $GLOBALS['dbi']->getColumnNames($db, $table); + $columns = implode("','", $columns); + $columns = "'" . $columns . "'"; + $query = 'SELECT * FROM ' . PMA_Util::backquote($centralTable) . ' ' + . 'WHERE db_name = \'' . $db . '\' ' + . 'AND col_name NOT IN (' . $columns . ');'; + } + $columns_list = (array)$GLOBALS['dbi']->fetchResult($query); + return json_encode($columns_list); +} + ?> diff --git a/libraries/tbl_columns_definition_form.inc.php b/libraries/tbl_columns_definition_form.inc.php index a8db58d7f3..9351523d56 100644 --- a/libraries/tbl_columns_definition_form.inc.php +++ b/libraries/tbl_columns_definition_form.inc.php @@ -164,6 +164,9 @@ $html = PMA_getHtmlForTableCreateOrAddField( ); unset($_form_params); - -PMA_Response::getInstance()->addHTML($html); +$response = PMA_Response::getInstance(); +$header = $response->getHeader(); +$scripts = $header->getScripts(); +$scripts->addFile('jquery/jquery.uitablefilter.js'); +$response->addHTML($html); ?> diff --git a/libraries/tbl_columns_definition_form.lib.php b/libraries/tbl_columns_definition_form.lib.php index 903634962a..c74c64e902 100644 --- a/libraries/tbl_columns_definition_form.lib.php +++ b/libraries/tbl_columns_definition_form.lib.php @@ -512,7 +512,7 @@ function PMA_handleRegeneration($columnNumber, $submit_fulltext, $comments_map, } /** - * Function to update default value info in $columnMeta and get this array + * Function to update default value info in $columnMeta and get this array * * @param array $columnMeta column meta * @param bool $isDefault whether the row value is default @@ -557,11 +557,13 @@ function PMA_getColumnMetaForDefault($columnMeta, $isDefault) * @param int $ci cell index * @param int $ci_offset cell index offset * @param array $columnMeta column meta + * @param array $cfgRelation configuration relation * * @return string */ -function PMA_getHtmlForColumnName($columnNumber, $ci, $ci_offset, $columnMeta) -{ +function PMA_getHtmlForColumnName( + $columnNumber, $ci, $ci_offset, $columnMeta, $cfgRelation +) { $title = ''; if (isset($columnMeta['column_status'])) { if ($columnMeta['column_status']['isReferenced']) { @@ -590,7 +592,18 @@ function PMA_getHtmlForColumnName($columnNumber, $ci, $ci_offset, $columnMeta) . (isset($columnMeta['Field']) ? htmlspecialchars($columnMeta['Field']) : '') . '"' . ' />'; - + if ($cfgRelation['central_columnswork'] && !(isset($columnMeta['column_status']) + && !$columnMeta['column_status']['isEditable']) + ) { + $html .= '

'; + $html .= ' ' + . __('Pick from Central Columns') . '' + . '

'; + } return $html; } @@ -1183,13 +1196,15 @@ function PMA_getHtmlForColumnAttributes($columnNumber, $columnMeta, $type_upper, // column name $content_cell[$ci] = PMA_getHtmlForColumnName( - $columnNumber, $ci, $ci_offset, isset($columnMeta) ? $columnMeta : null + $columnNumber, $ci, $ci_offset, isset($columnMeta) ? $columnMeta : null, + $cfgRelation ); $ci++; // column type $content_cell[$ci] = PMA_getHtmlForColumnType( - $columnNumber, $ci, $ci_offset, $type_upper, isset($columnMeta) ? $columnMeta : null + $columnNumber, $ci, $ci_offset, $type_upper, + isset($columnMeta) ? $columnMeta : null ); $ci++; @@ -1296,7 +1311,7 @@ function PMA_getHtmlForColumnAttributes($columnNumber, $columnMeta, $type_upper, * @param array $form_params form parameters * @param int $columnNumber column/field number * @param string $type type in lowercase without the length - * @param array $extracted_columnspec details about the column spec + * @param array $extracted_columnspec details about the column spec * * @return array */ @@ -1345,7 +1360,7 @@ function PMA_getFormParamsForOldColumn( $form_params['field_attribute_orig[' . $columnNumber . ']'] = ''; } - // old column null + // old column null if (isset($columnMeta['Null'])) { $form_params['field_null_orig[' . $columnNumber . ']'] = $columnMeta['Null']; @@ -1353,7 +1368,7 @@ function PMA_getFormParamsForOldColumn( $form_params['field_null_orig[' . $columnNumber . ']'] = ''; } - // old column extra (for auto_increment) + // old column extra (for auto_increment) if (isset($columnMeta['Extra'])) { $form_params['field_extra_orig[' . $columnNumber . ']'] = $columnMeta['Extra']; @@ -1361,7 +1376,7 @@ function PMA_getFormParamsForOldColumn( $form_params['field_extra_orig[' . $columnNumber . ']'] = ''; } - // old column comment + // old column comment if (isset($columnMeta['Comment'])) { $form_params['field_comments_orig[' . $columnNumber . ']'] = $columnMeta['Comment']; diff --git a/test/libraries/PMA_tbl_columns_definition_form_test.php b/test/libraries/PMA_tbl_columns_definition_form_test.php index 5f7de35cfb..eb2b3d5a12 100644 --- a/test/libraries/PMA_tbl_columns_definition_form_test.php +++ b/test/libraries/PMA_tbl_columns_definition_form_test.php @@ -616,10 +616,11 @@ class PMA_TblColumnsDefinitionFormTest extends PHPUnit_Framework_TestCase */ public function testGetHtmlForColumnName() { + $cfgRelation = array('central_columnswork' => true); $result = PMA_getHtmlForColumnName( 2, 4, 4, array('Field' => "fieldname", 'column_status' => array('isReferenced' => false, - 'isForeignKey' => false, 'isEditable' => true)) + 'isForeignKey' => false, 'isEditable' => true)), $cfgRelation ); $this->assertTag(