aboutsummaryrefslogtreecommitdiff
path: root/srcs/phpmyadmin/js/table/structure.js
diff options
context:
space:
mode:
Diffstat (limited to 'srcs/phpmyadmin/js/table/structure.js')
-rw-r--r--srcs/phpmyadmin/js/table/structure.js505
1 files changed, 505 insertions, 0 deletions
diff --git a/srcs/phpmyadmin/js/table/structure.js b/srcs/phpmyadmin/js/table/structure.js
new file mode 100644
index 0000000..8be0671
--- /dev/null
+++ b/srcs/phpmyadmin/js/table/structure.js
@@ -0,0 +1,505 @@
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * @fileoverview functions used on the table structure page
+ * @name Table Structure
+ *
+ * @requires jQuery
+ * @requires jQueryUI
+ * @required js/functions.js
+ */
+
+// eslint-disable-next-line no-unused-vars
+/* global primaryIndexes:writable, indexes:writable, fulltextIndexes:writable, spatialIndexes:writable */ // js/functions.js
+/* global sprintf */ // js/vendor/sprintf.js
+
+/**
+ * AJAX scripts for tbl_structure.php
+ *
+ * Actions ajaxified here:
+ * Drop Column
+ * Add Primary Key
+ * Drop Primary Key/Index
+ *
+ */
+
+/**
+ * Reload fields table
+ */
+function reloadFieldForm () {
+ $.post($('#fieldsForm').attr('action'), $('#fieldsForm').serialize() + CommonParams.get('arg_separator') + 'ajax_request=true', function (formData) {
+ var $tempDiv = $('<div id=\'temp_div\'><div>').append(formData.message);
+ $('#fieldsForm').replaceWith($tempDiv.find('#fieldsForm'));
+ $('#addColumns').replaceWith($tempDiv.find('#addColumns'));
+ $('#move_columns_dialog').find('ul').replaceWith($tempDiv.find('#move_columns_dialog ul'));
+ $('#moveColumns').removeClass('move-active');
+ });
+ $('#page_content').show();
+}
+
+function checkFirst () {
+ if ($('select[name=after_field] option:selected').data('pos') === 'first') {
+ $('input[name=field_where]').val('first');
+ } else {
+ $('input[name=field_where]').val('after');
+ }
+}
+/**
+ * Unbind all event handlers before tearing down a page
+ */
+AJAX.registerTeardown('table/structure.js', function () {
+ $(document).off('click', 'a.drop_column_anchor.ajax');
+ $(document).off('click', 'a.add_key.ajax');
+ $(document).off('click', '#move_columns_anchor');
+ $(document).off('click', '#printView');
+ $(document).off('submit', '.append_fields_form.ajax');
+ $('body').off('click', '#fieldsForm.ajax button[name="submit_mult"], #fieldsForm.ajax input[name="submit_mult"]');
+ $(document).off('click', 'a[name^=partition_action].ajax');
+ $(document).off('click', '#remove_partitioning.ajax');
+});
+
+AJAX.registerOnload('table/structure.js', function () {
+ // Re-initialize variables.
+ primaryIndexes = [];
+ indexes = [];
+ fulltextIndexes = [];
+ spatialIndexes = [];
+
+ /**
+ *Ajax action for submitting the "Column Change" and "Add Column" form
+ */
+ $('.append_fields_form.ajax').off();
+ $(document).on('submit', '.append_fields_form.ajax', function (event) {
+ event.preventDefault();
+ /**
+ * @var the_form object referring to the export form
+ */
+ var $form = $(this);
+ var fieldCnt = $form.find('input[name=orig_num_fields]').val();
+
+
+ function submitForm () {
+ var $msg = Functions.ajaxShowMessage(Messages.strProcessingRequest);
+ $.post($form.attr('action'), $form.serialize() + CommonParams.get('arg_separator') + 'do_save_data=1', function (data) {
+ if ($('.sqlqueryresults').length !== 0) {
+ $('.sqlqueryresults').remove();
+ } else if ($('.error:not(.tab)').length !== 0) {
+ $('.error:not(.tab)').remove();
+ }
+ if (typeof data.success !== 'undefined' && data.success === true) {
+ $('#page_content')
+ .empty()
+ .append(data.message)
+ .show();
+ Functions.highlightSql($('#page_content'));
+ $('.result_query .notice').remove();
+ reloadFieldForm();
+ $form.remove();
+ Functions.ajaxRemoveMessage($msg);
+ Functions.initSlider();
+ Navigation.reload();
+ } else {
+ Functions.ajaxShowMessage(data.error, false);
+ }
+ }); // end $.post()
+ }
+
+ function checkIfConfirmRequired ($form) {
+ var i = 0;
+ var id;
+ var elm;
+ var val;
+ var nameOrig;
+ var elmOrig;
+ var valOrig;
+ var checkRequired = false;
+ for (i = 0; i < fieldCnt; i++) {
+ id = '#field_' + i + '_5';
+ elm = $(id);
+ val = elm.val();
+
+ nameOrig = 'input[name=field_collation_orig\\[' + i + '\\]]';
+ elmOrig = $form.find(nameOrig);
+ valOrig = elmOrig.val();
+
+ if (val && valOrig && val !== valOrig) {
+ checkRequired = true;
+ break;
+ }
+ }
+ return checkRequired;
+ }
+
+ /*
+ * First validate the form; if there is a problem, avoid submitting it
+ *
+ * Functions.checkTableEditForm() needs a pure element and not a jQuery object,
+ * this is why we pass $form[0] as a parameter (the jQuery object
+ * is actually an array of DOM elements)
+ */
+ if (Functions.checkTableEditForm($form[0], fieldCnt)) {
+ // OK, form passed validation step
+
+ Functions.prepareForAjaxRequest($form);
+ if (Functions.checkReservedWordColumns($form)) {
+ // User wants to submit the form
+
+ // If Collation is changed, Warn and Confirm
+ if (checkIfConfirmRequired($form)) {
+ var question = sprintf(
+ Messages.strChangeColumnCollation, 'https://wiki.phpmyadmin.net/pma/Garbled_data'
+ );
+ $form.confirm(question, $form.attr('action'), function () {
+ submitForm();
+ });
+ } else {
+ submitForm();
+ }
+ }
+ }
+ }); // end change table button "do_save_data"
+
+ /**
+ * Attach Event Handler for 'Drop Column'
+ */
+ $(document).on('click', 'a.drop_column_anchor.ajax', function (event) {
+ event.preventDefault();
+ /**
+ * @var curr_table_name String containing the name of the current table
+ */
+ var currTableName = $(this).closest('form').find('input[name=table]').val();
+ /**
+ * @var curr_row Object reference to the currently selected row (i.e. field in the table)
+ */
+ var $currRow = $(this).parents('tr');
+ /**
+ * @var curr_column_name String containing name of the field referred to by {@link curr_row}
+ */
+ var currColumnName = $currRow.children('th').children('label').text().trim();
+ currColumnName = Functions.escapeHtml(currColumnName);
+ /**
+ * @var $after_field_item Corresponding entry in the 'After' field.
+ */
+ var $afterFieldItem = $('select[name=\'after_field\'] option[value=\'' + currColumnName + '\']');
+ /**
+ * @var question String containing the question to be asked for confirmation
+ */
+ var question = Functions.sprintf(Messages.strDoYouReally, 'ALTER TABLE `' + Functions.escapeHtml(currTableName) + '` DROP `' + Functions.escapeHtml(currColumnName) + '`;');
+ var $thisAnchor = $(this);
+ $thisAnchor.confirm(question, $thisAnchor.attr('href'), function (url) {
+ var $msg = Functions.ajaxShowMessage(Messages.strDroppingColumn, false);
+ var params = Functions.getJsConfirmCommonParam(this, $thisAnchor.getPostData());
+ params += CommonParams.get('arg_separator') + 'ajax_page_request=1';
+ $.post(url, params, function (data) {
+ if (typeof data !== 'undefined' && data.success === true) {
+ Functions.ajaxRemoveMessage($msg);
+ if ($('.result_query').length) {
+ $('.result_query').remove();
+ }
+ if (data.sql_query) {
+ $('<div class="result_query"></div>')
+ .html(data.sql_query)
+ .prependTo('#structure_content');
+ Functions.highlightSql($('#page_content'));
+ }
+ // Adjust the row numbers
+ for (var $row = $currRow.next(); $row.length > 0; $row = $row.next()) {
+ var newVal = parseInt($row.find('td:nth-child(2)').text(), 10) - 1;
+ $row.find('td:nth-child(2)').text(newVal);
+ }
+ $afterFieldItem.remove();
+ $currRow.hide('medium').remove();
+
+ // Remove the dropped column from select menu for 'after field'
+ $('select[name=after_field]').find(
+ '[value="' + currColumnName + '"]'
+ ).remove();
+
+ // by default select the (new) last option to add new column
+ // (in case last column is dropped)
+ $('select[name=after_field] option:last').attr('selected','selected');
+
+ // refresh table stats
+ if (data.tableStat) {
+ $('#tablestatistics').html(data.tableStat);
+ }
+ // refresh the list of indexes (comes from sql.php)
+ $('.index_info').replaceWith(data.indexes_list);
+ Navigation.reload();
+ } else {
+ Functions.ajaxShowMessage(Messages.strErrorProcessingRequest + ' : ' + data.error, false);
+ }
+ }); // end $.post()
+ });
+ }); // end of Drop Column Anchor action
+
+ /**
+ * Attach Event Handler for 'Print' link
+ */
+ $(document).on('click', '#printView', function (event) {
+ event.preventDefault();
+
+ // Take to preview mode
+ Functions.printPreview();
+ }); // end of Print View action
+
+ /**
+ * Ajax Event handler for adding keys
+ */
+ $(document).on('click', 'a.add_key.ajax', function (event) {
+ event.preventDefault();
+
+ var $this = $(this);
+ var currTableName = $this.closest('form').find('input[name=table]').val();
+ var currColumnName = $this.parents('tr').children('th').children('label').text().trim();
+
+ var addClause = '';
+ if ($this.is('.add_primary_key_anchor')) {
+ addClause = 'ADD PRIMARY KEY';
+ } else if ($this.is('.add_index_anchor')) {
+ addClause = 'ADD INDEX';
+ } else if ($this.is('.add_unique_anchor')) {
+ addClause = 'ADD UNIQUE';
+ } else if ($this.is('.add_spatial_anchor')) {
+ addClause = 'ADD SPATIAL';
+ } else if ($this.is('.add_fulltext_anchor')) {
+ addClause = 'ADD FULLTEXT';
+ }
+ var question = Functions.sprintf(Messages.strDoYouReally, 'ALTER TABLE `' +
+ Functions.escapeHtml(currTableName) + '` ' + addClause + '(`' + Functions.escapeHtml(currColumnName) + '`);');
+
+ var $thisAnchor = $(this);
+
+ $thisAnchor.confirm(question, $thisAnchor.attr('href'), function (url) {
+ Functions.ajaxShowMessage();
+ AJAX.source = $this;
+
+ var params = Functions.getJsConfirmCommonParam(this, $thisAnchor.getPostData());
+ params += CommonParams.get('arg_separator') + 'ajax_page_request=1';
+ $.post(url, params, AJAX.responseHandler);
+ });
+ }); // end Add key
+
+ /**
+ * Inline move columns
+ **/
+ $(document).on('click', '#move_columns_anchor', function (e) {
+ e.preventDefault();
+
+ if ($(this).hasClass('move-active')) {
+ return;
+ }
+
+ /**
+ * @var button_options Object that stores the options passed to jQueryUI
+ * dialog
+ */
+ var buttonOptions = {};
+
+ buttonOptions[Messages.strGo] = function (event) {
+ event.preventDefault();
+ var $msgbox = Functions.ajaxShowMessage();
+ var $this = $(this);
+ var $form = $this.find('form');
+ var serialized = $form.serialize();
+ // check if any columns were moved at all
+ if (serialized === $form.data('serialized-unmoved')) {
+ Functions.ajaxRemoveMessage($msgbox);
+ $this.dialog('close');
+ return;
+ }
+ $.post($form.prop('action'), serialized + CommonParams.get('arg_separator') + 'ajax_request=true', function (data) {
+ if (data.success === false) {
+ Functions.ajaxRemoveMessage($msgbox);
+ $this
+ .clone()
+ .html(data.error)
+ .dialog({
+ title: $(this).prop('title'),
+ height: 230,
+ width: 900,
+ modal: true,
+ buttons: buttonOptionsError
+ }); // end dialog options
+ } else {
+ // sort the fields table
+ var $fieldsTable = $('table#tablestructure tbody');
+ // remove all existing rows and remember them
+ var $rows = $fieldsTable.find('tr').remove();
+ // loop through the correct order
+ for (var i in data.columns) {
+ var theColumn = data.columns[i];
+ var $theRow = $rows
+ .find('input:checkbox[value=\'' + theColumn + '\']')
+ .closest('tr');
+ // append the row for this column to the table
+ $fieldsTable.append($theRow);
+ }
+ var $firstrow = $fieldsTable.find('tr').eq(0);
+ // Adjust the row numbers and colors
+ for (var $row = $firstrow; $row.length > 0; $row = $row.next()) {
+ $row
+ .find('td:nth-child(2)')
+ .text($row.index() + 1)
+ .end()
+ .removeClass('odd even')
+ .addClass($row.index() % 2 === 0 ? 'odd' : 'even');
+ }
+ Functions.ajaxShowMessage(data.message);
+ $this.dialog('close');
+ }
+ });
+ };
+ buttonOptions[Messages.strPreviewSQL] = function () {
+ // Function for Previewing SQL
+ var $form = $('#move_column_form');
+ Functions.previewSql($form);
+ };
+ buttonOptions[Messages.strCancel] = function () {
+ $(this).dialog('close');
+ };
+
+ var buttonOptionsError = {};
+ buttonOptionsError[Messages.strOK] = function () {
+ $(this).dialog('close').remove();
+ };
+
+ var columns = [];
+
+ $('#tablestructure').find('tbody tr').each(function () {
+ var colName = $(this).find('input:checkbox').eq(0).val();
+ var hiddenInput = $('<input>')
+ .prop({
+ name: 'move_columns[]',
+ type: 'hidden'
+ })
+ .val(colName);
+ columns[columns.length] = $('<li></li>')
+ .addClass('placeholderDrag')
+ .text(colName)
+ .append(hiddenInput);
+ });
+
+ var colList = $('#move_columns_dialog').find('ul')
+ .find('li').remove().end();
+ for (var i in columns) {
+ colList.append(columns[i]);
+ }
+ colList.sortable({
+ axis: 'y',
+ containment: $('#move_columns_dialog').find('div'),
+ tolerance: 'pointer'
+ }).disableSelection();
+ var $form = $('#move_columns_dialog').find('form');
+ $form.data('serialized-unmoved', $form.serialize());
+
+ $('#move_columns_dialog').dialog({
+ modal: true,
+ buttons: buttonOptions,
+ open: function () {
+ if ($('#move_columns_dialog').parents('.ui-dialog').height() > $(window).height()) {
+ $('#move_columns_dialog').dialog('option', 'height', $(window).height());
+ }
+ },
+ beforeClose: function () {
+ $('#move_columns_anchor').removeClass('move-active');
+ }
+ });
+ });
+
+ /**
+ * Handles multi submits in table structure page such as change, browse, drop, primary etc.
+ */
+ $('body').on('click', '#fieldsForm.ajax button[name="submit_mult"], #fieldsForm.ajax input[name="submit_mult"]', function (e) {
+ e.preventDefault();
+ var $button = $(this);
+ var $form = $button.parents('form');
+ var argsep = CommonParams.get('arg_separator');
+ var submitData = $form.serialize() + argsep + 'ajax_request=true' + argsep + 'ajax_page_request=true' + argsep + 'submit_mult=' + $button.val();
+ Functions.ajaxShowMessage();
+ AJAX.source = $form;
+ $.post($form.attr('action'), submitData, AJAX.responseHandler);
+ });
+
+ /**
+ * Handles clicks on Action links in partition table
+ */
+ $(document).on('click', 'a[name^=partition_action].ajax', function (e) {
+ e.preventDefault();
+ var $link = $(this);
+
+ function submitPartitionAction (url) {
+ var params = 'ajax_request=true&ajax_page_request=true&' + $link.getPostData();
+ Functions.ajaxShowMessage();
+ AJAX.source = $link;
+ $.post(url, params, AJAX.responseHandler);
+ }
+
+ if ($link.is('#partition_action_DROP')) {
+ $link.confirm(Messages.strDropPartitionWarning, $link.attr('href'), function (url) {
+ submitPartitionAction(url);
+ });
+ } else if ($link.is('#partition_action_TRUNCATE')) {
+ $link.confirm(Messages.strTruncatePartitionWarning, $link.attr('href'), function (url) {
+ submitPartitionAction(url);
+ });
+ } else {
+ submitPartitionAction($link.attr('href'));
+ }
+ });
+
+ /**
+ * Handles remove partitioning
+ */
+ $(document).on('click', '#remove_partitioning.ajax', function (e) {
+ e.preventDefault();
+ var $link = $(this);
+ var question = Messages.strRemovePartitioningWarning;
+ $link.confirm(question, $link.attr('href'), function (url) {
+ var params = Functions.getJsConfirmCommonParam({
+ 'ajax_request' : true,
+ 'ajax_page_request' : true
+ }, $link.getPostData());
+ Functions.ajaxShowMessage();
+ AJAX.source = $link;
+ $.post(url, params, AJAX.responseHandler);
+ });
+ });
+
+ $(document).on('change', 'select[name=after_field]', function () {
+ checkFirst();
+ });
+});
+
+/** Handler for "More" dropdown in structure table rows */
+AJAX.registerOnload('table/structure.js', function () {
+ var windowwidth = $(window).width();
+ if (windowwidth > 768) {
+ if (! $('#fieldsForm').hasClass('HideStructureActions')) {
+ $('.table-structure-actions').width(function () {
+ var width = 5;
+ $(this).find('li').each(function () {
+ width += $(this).outerWidth(true);
+ });
+ return width;
+ });
+ }
+ }
+
+ $('.jsresponsive').css('max-width', (windowwidth - 35) + 'px');
+ var tableRows = $('.central_columns');
+ $.each(tableRows, function (index, item) {
+ if ($(item).hasClass('add_button')) {
+ $(item).on('click', function () {
+ $('input:checkbox').prop('checked', false);
+ $('#checkbox_row_' + (index + 1)).prop('checked', true);
+ $('button[value=add_to_central_columns]').trigger('click');
+ });
+ } else {
+ $(item).on('click', function () {
+ $('input:checkbox').prop('checked', false);
+ $('#checkbox_row_' + (index + 1)).prop('checked', true);
+ $('button[value=remove_from_central_columns]').trigger('click');
+ });
+ }
+ });
+});