From b8bbd8655852081b8b773eff658a65ffdffc16ca Mon Sep 17 00:00:00 2001 From: Piyush Vijay Date: Sat, 28 Jul 2018 21:50:03 +0530 Subject: [PATCH] Add central columns to the modular code. Signed-Off-By: Piyush Vijay --- db_central_columns.php | 4 +- js/src/consts/files.js | 6 +- js/src/db_central_columns.js | 247 +++++++++++++++++++++++++++ libraries/classes/CentralColumns.php | 27 +++ 4 files changed, 279 insertions(+), 5 deletions(-) create mode 100644 js/src/db_central_columns.js diff --git a/db_central_columns.php b/db_central_columns.php index 84c71e3d54..8a0845ac6d 100644 --- a/db_central_columns.php +++ b/db_central_columns.php @@ -93,9 +93,7 @@ if (isset($_POST['add_column'])) { $response = Response::getInstance(); $header = $response->getHeader(); $scripts = $header->getScripts(); -$scripts->addFile('vendor/jquery/jquery.uitablefilter.js'); -$scripts->addFile('vendor/jquery/jquery.tablesorter.js'); -$scripts->addFile('db_central_columns.js'); +$scripts->addFile('db_central_columns'); $cfgCentralColumns = $centralColumns->getParams(); $pmadb = $cfgCentralColumns['db']; $pmatable = $cfgCentralColumns['table']; diff --git a/js/src/consts/files.js b/js/src/consts/files.js index df2e719af0..0ea3c6c690 100644 --- a/js/src/consts/files.js +++ b/js/src/consts/files.js @@ -29,7 +29,8 @@ const PhpToJsFileMapping = { sql: ['sql', 'multi_column_sort'], db_structure: ['db_structure'], db_operations: ['db_operations'], - db_tracking: ['db_tracking'] + db_tracking: ['db_tracking'], + db_central_columns: ['db_central_columns'] }; const JsFileList = [ @@ -58,7 +59,8 @@ const JsFileList = [ 'multi_column_sort', 'db_structure', 'db_operations', - 'db_tracking' + 'db_tracking', + 'db_central_columns' ]; export { diff --git a/js/src/db_central_columns.js b/js/src/db_central_columns.js new file mode 100644 index 0000000000..5b36c34407 --- /dev/null +++ b/js/src/db_central_columns.js @@ -0,0 +1,247 @@ +/* vim: set expandtab sw=4 ts=4 sts=4: */ +import { $ } from './utils/extend_jquery'; +import './plugins/jquery/jquery.tablesorter'; +import { PMA_Messages as PMA_messages } from './variables/export_variables'; +import { PMA_ajaxShowMessage } from './utils/show_ajax_messages'; +import PMA_commonParams from './variables/common_params'; +import { AJAX } from './ajax'; +/** + * @fileoverview events handling from central columns page + * @name Central columns + * + * @requires jQuery + */ + +/** + * AJAX scripts for db_central_columns.php + * + * Actions ajaxified here: + * Inline Edit and save of a result row + * Delete a row + * Multiple edit and delete option + * + */ + +export function teardownDbCentralColumns () { + $('.edit').off('click'); + $('.edit_save_form').off('click'); + $('.edit_cancel_form').off('click'); + $('.del_row').off('click'); + $(document).off('keyup', '.filter_rows'); + $('.edit_cancel_form').off('click'); + $('#table-select').off('change'); + $('#column-select').off('change'); + $('#add_col_div').find('>a').off('click'); + $('#add_new').off('submit'); + $('#multi_edit_central_columns').off('submit'); + $('select.default_type').off('change'); + $('button[name=\'delete_central_columns\']').off('click'); + $('button[name=\'edit_central_columns\']').off('click'); +} + +export function onloadDbCentralColumns () { + $('#tableslistcontainer input,#tableslistcontainer select,#tableslistcontainer .default_value,#tableslistcontainer .open_enum_editor').hide(); + $('#tableslistcontainer').find('.checkall').show(); + $('#tableslistcontainer').find('.checkall_box').show(); + if ($('#table_columns').find('tbody tr').length > 0) { + $('#table_columns').tablesorter({ + headers: { + 0: { sorter: false }, + 1: { sorter: false }, // hidden column + 4: { sorter: 'integer' } + } + }); + } + $('#tableslistcontainer').find('button[name="delete_central_columns"]').on('click', function (event) { + event.preventDefault(); + var multi_delete_columns = $('.checkall:checkbox:checked').serialize(); + if (multi_delete_columns === '') { + PMA_ajaxShowMessage(PMA_messages.strRadioUnchecked); + return false; + } + PMA_ajaxShowMessage(); + $('#del_col_name').val(multi_delete_columns); + $('#del_form').submit(); + }); + $('#tableslistcontainer').find('button[name="edit_central_columns"]').on('click', function (event) { + event.preventDefault(); + var editColumnList = $('.checkall:checkbox:checked').serialize(); + if (editColumnList === '') { + PMA_ajaxShowMessage(PMA_messages.strRadioUnchecked); + return false; + } + var argsep = PMA_commonParams.get('arg_separator'); + var editColumnData = editColumnList + '' + argsep + 'edit_central_columns_page=true' + argsep + 'ajax_request=true' + argsep + 'ajax_page_request=true' + argsep + 'db=' + PMA_commonParams.get('db'); + PMA_ajaxShowMessage(); + AJAX.source = $(this); + $.get('db_central_columns.php', editColumnData, AJAX.responseHandler); + }); + $('#multi_edit_central_columns').submit(function (event) { + event.preventDefault(); + event.stopPropagation(); + var argsep = PMA_commonParams.get('arg_separator'); + var multi_column_edit_data = $('#multi_edit_central_columns').serialize() + argsep + 'multi_edit_central_column_save=true' + argsep + 'ajax_request=true' + argsep + 'ajax_page_request=true' + argsep + 'db=' + encodeURIComponent(PMA_commonParams.get('db')); + PMA_ajaxShowMessage(); + AJAX.source = $(this); + $.post('db_central_columns.php', multi_column_edit_data, AJAX.responseHandler); + }); + $('#add_new').find('td').each(function () { + if ($(this).attr('name') !== 'undefined') { + $(this).find('input,select:first').attr('name', $(this).attr('name')); + } + }); + $('#field_0_0').attr('required','required'); + $('#add_new input[type="text"], #add_new input[type="number"], #add_new select') + .css({ + 'width' : '10em', + '-moz-box-sizing' : 'border-box' + }); + window.scrollTo(0, 0); + $(document).on('keyup', '.filter_rows', function () { + // get the column names + var cols = $('th.column_heading').map(function () { + return $.trim($(this).text()); + }).get(); + $.uiTableFilter($('#table_columns'), $(this).val(), cols, null, 'td span'); + }); + $('.edit').on('click', function () { + var rownum = $(this).parent().data('rownum'); + $('#save_' + rownum).show(); + $(this).hide(); + $('#f_' + rownum + ' td span').hide(); + $('#f_' + rownum + ' input, #f_' + rownum + ' select, #f_' + rownum + ' .open_enum_editor').show(); + var attribute_val = $('#f_' + rownum + ' td[name=col_attribute] span').html(); + $('#f_' + rownum + ' select[name=field_attribute\\[' + rownum + '\\] ] option[value="' + attribute_val + '"]').attr('selected','selected'); + if ($('#f_' + rownum + ' .default_type').val() === 'USER_DEFINED') { + $('#f_' + rownum + ' .default_type').siblings('.default_value').show(); + } else { + $('#f_' + rownum + ' .default_type').siblings('.default_value').hide(); + } + }); + $('.del_row').on('click', function (event) { + event.preventDefault(); + event.stopPropagation(); + var $td = $(this); + var question = PMA_messages.strDeleteCentralColumnWarning; + $td.PMA_confirm(question, null, function (url) { + var rownum = $td.data('rownum'); + $('#del_col_name').val('selected_fld%5B%5D=' + $('#checkbox_row_' + rownum).val()); + $('#del_form').submit(); + }); + }); + $('.edit_cancel_form').on('click', function (event) { + event.preventDefault(); + event.stopPropagation(); + var rownum = $(this).data('rownum'); + $('#save_' + rownum).hide(); + $('#edit_' + rownum).show(); + $('#f_' + rownum + ' td span').show(); + $('#f_' + rownum + ' input, #f_' + rownum + ' select,#f_' + rownum + ' .default_value, #f_' + rownum + ' .open_enum_editor').hide(); + $('#tableslistcontainer').find('.checkall').show(); + }); + $('.edit_save_form').on('click', function (event) { + event.preventDefault(); + event.stopPropagation(); + var rownum = $(this).data('rownum'); + $('#f_' + rownum + ' td').each(function () { + if ($(this).attr('name') !== 'undefined') { + $(this).find(':input[type!="hidden"],select:first') + .attr('name', $(this).attr('name')); + } + }); + + if ($('#f_' + rownum + ' .default_type').val() === 'USER_DEFINED') { + $('#f_' + rownum + ' .default_type').attr('name','col_default_sel'); + } else { + $('#f_' + rownum + ' .default_value').attr('name','col_default_val'); + } + + var datastring = $('#f_' + rownum + ' :input').serialize(); + $.ajax({ + type: 'POST', + url: 'db_central_columns.php', + data: datastring + PMA_commonParams.get('arg_separator') + 'ajax_request=true', + dataType: 'json', + success: function (data) { + if (data.message !== '1') { + PMA_ajaxShowMessage( + '
' + + data.message + + '
', + false + ); + } else { + $('#f_' + rownum + ' td input[id=checkbox_row_' + rownum + ']').val($('#f_' + rownum + ' input[name=col_name]').val()).html(); + $('#f_' + rownum + ' td[name=col_name] span').text($('#f_' + rownum + ' input[name=col_name]').val()).html(); + $('#f_' + rownum + ' td[name=col_type] span').text($('#f_' + rownum + ' select[name=col_type]').val()).html(); + $('#f_' + rownum + ' td[name=col_length] span').text($('#f_' + rownum + ' input[name=col_length]').val()).html(); + $('#f_' + rownum + ' td[name=collation] span').text($('#f_' + rownum + ' select[name=collation]').val()).html(); + $('#f_' + rownum + ' td[name=col_attribute] span').text($('#f_' + rownum + ' select[name=col_attribute]').val()).html(); + $('#f_' + rownum + ' td[name=col_isNull] span').text($('#f_' + rownum + ' input[name=col_isNull]').is(':checked') ? 'Yes' : 'No').html(); + $('#f_' + rownum + ' td[name=col_extra] span').text($('#f_' + rownum + ' input[name=col_extra]').is(':checked') ? 'auto_increment' : '').html(); + $('#f_' + rownum + ' td[name=col_default] span').text($('#f_' + rownum + ' :input[name=col_default]').val()).html(); + } + $('#save_' + rownum).hide(); + $('#edit_' + rownum).show(); + $('#f_' + rownum + ' td span').show(); + $('#f_' + rownum + ' input, #f_' + rownum + ' select,#f_' + rownum + ' .default_value, #f_' + rownum + ' .open_enum_editor').hide(); + $('#tableslistcontainer').find('.checkall').show(); + }, + error: function () { + PMA_ajaxShowMessage( + '
' + + PMA_messages.strErrorProcessingRequest + + '
', + false + ); + } + }); + }); + $('#table-select').on('change', function (e) { + var selectvalue = $(this).val(); + var default_column_select = $('#column-select').find('option:first'); + var href = 'db_central_columns.php'; + var params = { + 'ajax_request' : true, + 'server' : PMA_commonParams.get('server'), + 'db' : PMA_commonParams.get('db'), + 'selectedTable' : selectvalue, + 'populateColumns' : true + }; + $('#column-select').html(''); + if (selectvalue !== '') { + $.post(href, params, function (data) { + $('#column-select').empty().append(default_column_select); + $('#column-select').append(data.message); + }); + } + }); + $('#add_column').submit(function (e) { + var selectvalue = $('#column-select').val(); + if (selectvalue === '') { + e.preventDefault(); + e.stopPropagation(); + } + }); + $('#add_col_div').find('>a').on('click', function (event) { + $('#add_new').slideToggle('slow'); + var $addColDivLinkSpan = $('#add_col_div').find('>a span'); + if ($addColDivLinkSpan.html() === '+') { + $addColDivLinkSpan.html('-'); + } else { + $addColDivLinkSpan.html('+'); + } + }); + $('#add_new').submit(function (event) { + $('#add_new').toggle(); + }); + $('#tableslistcontainer').find('select.default_type').on('change', function () { + if ($(this).val() === 'USER_DEFINED') { + $(this).siblings('.default_value').attr('name','col_default'); + $(this).attr('name','col_default_sel'); + } else { + $(this).attr('name','col_default'); + $(this).siblings('.default_value').attr('name','col_default_val'); + } + }); +} diff --git a/libraries/classes/CentralColumns.php b/libraries/classes/CentralColumns.php index 7fcd788968..c8df7d4119 100644 --- a/libraries/classes/CentralColumns.php +++ b/libraries/classes/CentralColumns.php @@ -1078,6 +1078,33 @@ class CentralColumns return -1; } + /** + * build dropdown select html to select column in selected table, + * include only columns which are not already in central list + * + * @param string $db current database to which selected table belongs + * @param string $selected_tbl selected table + * + * @return string html to select column + */ + public function getHtmlForColumnDropdown($db, $selected_tbl) + { + $existing_cols = $this->getFromTable($db, $selected_tbl); + $this->dbi->selectDb($db); + $columns = (array) $this->dbi->getColumnNames( + $db, $selected_tbl + ); + $selectColHtml = ""; + foreach ($columns as $column) { + if (!in_array($column, $existing_cols)) { + $selectColHtml .= ''; + } + } + return $selectColHtml; + } + /** * build html for adding a new user defined column to central list *