Skip to content

Commit

Permalink
Merge pull request #1408 from madhuracj/tracking
Browse files Browse the repository at this point in the history
Tracking improvements. Implements rfe #1562
  • Loading branch information
lem9 committed Nov 25, 2014
2 parents acb40eb + 70f432f commit 9ca5ea6
Show file tree
Hide file tree
Showing 8 changed files with 210 additions and 111 deletions.
1 change: 1 addition & 0 deletions ChangeLog
Expand Up @@ -3,6 +3,7 @@ phpMyAdmin - ChangeLog

4.4.0.0 (not yet released)
+ rfe #1553 InnoDB presently supports one FULLTEXT index creation at a time
+ rfe #1562 Allow tracking multiple table at once from database level tracking page

4.3.0.0 (not yet released)
+ rfe #1502 Smart sorting for int keys
Expand Down
114 changes: 101 additions & 13 deletions db_tracking.php
Expand Up @@ -17,7 +17,7 @@
$response = PMA_Response::getInstance();
$header = $response->getHeader();
$scripts = $header->getScripts();
$scripts->addFile('db_structure.js');
$scripts->addFile('db_tracking.js');

/**
* If we are not in an Ajax request, then do the common work and show the links etc.
Expand All @@ -32,16 +32,51 @@
// Work to do?
// (here, do not use $_REQUEST['db] as it can be crafted)
if (isset($_REQUEST['delete_tracking']) && isset($_REQUEST['table'])) {

PMA_Tracker::deleteTracking($GLOBALS['db'], $_REQUEST['table']);
PMA_Message::success(
__('Tracking data deleted successfully.')
)->display();

} elseif (isset($_REQUEST['submit_create_version'])) {

PMA_createTrackingForMultipleTables($_REQUEST['selected']);
PMA_Message::success(
sprintf(
__(
'Version %1$s was created for selected tables,'
. ' tracking is active for them.'
),
htmlspecialchars($_REQUEST['version'])
)
)->display();

} elseif (isset($_REQUEST['submit_mult'])) {

if (! empty($_REQUEST['selected_tbl'])) {
if ($_REQUEST['submit_mult'] == 'drop_tracking') {

foreach ($_REQUEST['selected_tbl'] as $table) {
PMA_Tracker::deleteTracking($GLOBALS['db'], $table);
}
PMA_Message::success(
__('Tracking data deleted successfully.')
)->display();

/**
* If in an Ajax request, generate the success message and use
* {@link PMA_Response()} to send the output
*/
if ($GLOBALS['is_ajax_request'] == true) {
$response = PMA_Response::getInstance();
$response->addJSON('message', PMA_Message::success());
exit;
} elseif ($_REQUEST['submit_mult'] == 'track') {

echo PMA_getHtmlForDataDefinitionAndManipulationStatements(
'db_tracking.php' . $url_query,
0,
$GLOBALS['db'],
$_REQUEST['selected_tbl']
);
exit;
}
} else {
PMA_Message::notice(
__('No tables selected.')
)->display();
}
}

Expand Down Expand Up @@ -76,10 +111,15 @@
<div id="tracked_tables">
<h3><?php echo __('Tracked tables');?></h3>

<form method="post" action="db_tracking.php" name="trackedForm"
id="trackedForm" class="ajax">
<?php
echo PMA_URL_getHiddenInputs($GLOBALS['db'])
?>
<table id="versions" class="data">
<thead>
<tr>
<th><?php echo __('Database');?></th>
<th></th>
<th><?php echo __('Table');?></th>
<th><?php echo __('Last version');?></th>
<th><?php echo __('Created');?></th>
Expand Down Expand Up @@ -125,7 +165,10 @@
. '&amp;delete_tracking=true&amp';
?>
<tr class="noclick <?php echo $style;?>">
<td><?php echo htmlspecialchars($version_data['db_name']);?></td>
<td class="center">
<input type="checkbox" name="selected_tbl[]" class="checkall"
value="<?php echo htmlspecialchars($version_data['table_name']);?>"/>
</td>
<td><?php echo htmlspecialchars($version_data['table_name']);?></td>
<td><?php echo $version_data['version'];?></td>
<td><?php echo $version_data['date_created'];?></td>
Expand Down Expand Up @@ -157,6 +200,24 @@
?>
</tbody>
</table>
<?php
echo '<img class="selectallarrow" '
. 'src="' . $pmaThemeImage . 'arrow_' . $text_dir . '.png" '
. 'width="38" height="22" alt="' . __('With selected:') . '" />';

echo '<input type="checkbox" id="trackedForm_checkall" '
. 'class="checkall_box" title="' . __('Check All') . '" />'
. '<label for="trackedForm_checkall">' . __('Check All') . '</label>';

echo '<i style="margin-left: 2em">'
. __('With selected:') . '</i>';

echo PMA_Util::getButtonOrImage(
'submit_mult', 'mult_submit', 'submit_mult_drop_tracking',
__('Drop'), 'b_drop.png', 'drop_tracking'
);
?>
</form>
</div>
<?php
}
Expand Down Expand Up @@ -200,12 +261,17 @@
if (count($my_tables) > 0) {
?>
<h3><?php echo __('Untracked tables');?></h3>

<form method="post" action="db_tracking.php" name="untrackedForm"
id="untrackedForm" class="ajax">
<?php
echo PMA_URL_getHiddenInputs($GLOBALS['db'])
?>
<table id="noversions" class="data">
<thead>
<tr>
<th style="width: 300px"><?php echo __('Table');?></th>
<th></th>
<th style="width: 300px"><?php echo __('Table');?></th>
<th><?php echo __('Action');?></th>
</tr>
</thead>
<tbody>
Expand All @@ -222,6 +288,10 @@
$my_link .= '</a>';
?>
<tr class="noclick <?php echo $style;?>">
<td class="center">
<input type="checkbox" name="selected_tbl[]" class="checkall"
value="<?php echo htmlspecialchars($tablename);?>"/>
</td>
<td><?php echo htmlspecialchars($tablename);?></td>
<td><?php echo $my_link;?></td>
</tr>
Expand All @@ -237,6 +307,24 @@
</tbody>
</table>
<?php
echo '<img class="selectallarrow" '
. 'src="' . $pmaThemeImage . 'arrow_' . $text_dir . '.png" '
. 'width="38" height="22" alt="' . __('With selected:') . '" />';

echo '<input type="checkbox" id="untrackedForm_checkall" '
. 'class="checkall_box" title="' . __('Check All') . '" />'
. '<label for="untrackedForm_checkall">' . __('Check All') . '</label>';

echo '<i style="margin-left: 2em">'
. __('With selected:') . '</i>';

echo PMA_Util::getButtonOrImage(
'submit_mult', 'mult_submit', 'submit_mult_track',
__('Track table'), 'eye.png', 'track'
);
?>
</form>
<?php
}
// If available print out database log
if (count($data['ddlog']) > 0) {
Expand Down
85 changes: 0 additions & 85 deletions js/db_structure.js
Expand Up @@ -26,7 +26,6 @@ AJAX.registerTeardown('db_structure.js', function () {
$('#fkc_checkbox').unbind('change');
$("a.truncate_table_anchor.ajax").die('click');
$("a.drop_table_anchor.ajax").die('click');
$('a.drop_tracking_anchor.ajax').die('click');
$('#real_end_input').die('click');
$("a.favorite_table_anchor.ajax").die('click');
$('a.real_row_count').off('click');
Expand Down Expand Up @@ -369,90 +368,6 @@ AJAX.registerOnload('db_structure.js', function () {
}); // end $.PMA_confirm()
}); //end of Drop Table Ajax action

/**
* Ajax Event handler for 'Drop tracking'
*/
$('a.drop_tracking_anchor.ajax').live('click', function (event) {
event.preventDefault();

var $anchor = $(this);

/**
* @var curr_tracking_row Object containing reference to the current tracked table's row
*/
var $curr_tracking_row = $anchor.parents('tr');
/**
* @var question String containing the question to be asked for confirmation
*/
var question = PMA_messages.strDeleteTrackingData;

$anchor.PMA_confirm(question, $anchor.attr('href'), function (url) {

PMA_ajaxShowMessage(PMA_messages.strDeletingTrackingData);

$.get(url, {'is_js_confirmed': 1, 'ajax_request': true}, function (data) {
if (typeof data !== 'undefined' && data.success === true) {
var $tracked_table = $curr_tracking_row.parents('table');
var table_name = $curr_tracking_row.find('td:nth-child(2)').text();

// Check how many rows will be left after we remove
if ($tracked_table.find('tbody tr').length === 1) {
// We are removing the only row it has
$('#tracked_tables').hide("slow").remove();
} else {
// There are more rows left after the deletion
toggleRowColors($curr_tracking_row.next());
$curr_tracking_row.hide("slow", function () {
$(this).remove();
});
}

// Make the removed table visible in the list of 'Untracked tables'.
var $untracked_table = $('table#noversions');

// This won't work if no untracked tables are there.
if ($untracked_table.length > 0) {
var $rows = $untracked_table.find('tbody tr');

$rows.each(function (index) {
var $row = $(this);
var tmp_tbl_name = $row.find('td:first-child').text();
var is_last_iteration = (index == ($rows.length - 1));

if (tmp_tbl_name > table_name || is_last_iteration) {
var $cloned = $row.clone();

// Change the table name of the cloned row.
$cloned.find('td:first-child').text(table_name);

// Change the link of the cloned row.
var new_url = $cloned
.find('td:nth-child(2) a')
.attr('href')
.replace('table=' + tmp_tbl_name, 'table=' + encodeURIComponent(table_name));
$cloned.find('td:nth-child(2) a').attr('href', new_url);

// Insert the cloned row in an appropriate location.
if (tmp_tbl_name > table_name) {
$cloned.insertBefore($row);
toggleRowColors($row);
return false;
} else {
$cloned.insertAfter($row);
toggleRowColors($cloned);
}
}
});
}

PMA_ajaxShowMessage(data.message);
} else {
PMA_ajaxShowMessage(PMA_messages.strErrorProcessingRequest + " : " + data.error, false);
}
}); // end $.get()
}); // end $.PMA_confirm()
}); //end Drop Tracking

//Calculate Real End for InnoDB
/**
* Ajax Event handler for calculating the real end for a InnoDB table
Expand Down
60 changes: 60 additions & 0 deletions js/db_tracking.js
@@ -0,0 +1,60 @@
/**
* Unbind all event handlers before tearing down the page
*/
AJAX.registerTeardown('db_tracking.js', function () {
$('body').off('click', '#trackedForm.ajax button[name="submit_mult"], #trackedForm.ajax input[name="submit_mult"]');
$('body').off('click', '#untrackedForm.ajax button[name="submit_mult"], #untrackedForm.ajax input[name="submit_mult"]');
$('body').off('click', 'a.drop_tracking_anchor.ajax');
});

/**
* Bind event handlers
*/
AJAX.registerOnload('db_tracking.js', function () {

/**
* Handles multi submit for tracked tables
*/
$('body').on('click', '#trackedForm.ajax button[name="submit_mult"], #trackedForm.ajax input[name="submit_mult"]', function (e) {
e.preventDefault();
var $button = $(this);
var $form = $button.parent('form');
var submitData = $form.serialize() + '&ajax_request=true&ajax_page_request=true&submit_mult=' + $button.val();

if ($button.val() == 'drop_tracking') {
var question = PMA_messages.strDeleteTrackingDataMultiple;
$button.PMA_confirm(question, $form.attr('action'), function (url) {
PMA_ajaxShowMessage(PMA_messages.strDeletingTrackingData);
$.get(url, submitData, AJAX.responseHandler);
});
} else {
PMA_ajaxShowMessage();
$.get($form.attr('action'), submitData, AJAX.responseHandler);
}
});

/**
* Handles multi submit for untracked tables
*/
$('body').on('click', '#untrackedForm.ajax button[name="submit_mult"], #untrackedForm.ajax input[name="submit_mult"]', function (e) {
e.preventDefault();
var $button = $(this);
var $form = $button.parent('form');
var submitData = $form.serialize() + '&ajax_request=true&ajax_page_request=true&submit_mult=' + $button.val();
PMA_ajaxShowMessage();
$.get($form.attr('action'), submitData, AJAX.responseHandler);
});

/**
* Ajax Event handler for 'Drop tracking'
*/
$('body').on('click', 'a.drop_tracking_anchor.ajax', function (e) {
e.preventDefault();
var $anchor = $(this);
var question = PMA_messages.strDeleteTrackingData;
$anchor.PMA_confirm(question, $anchor.attr('href'), function (url) {
PMA_ajaxShowMessage(PMA_messages.strDeletingTrackingData);
$.get(url, {'ajax_page_request': true, 'ajax_request': true}, AJAX.responseHandler);
});
});
});
3 changes: 2 additions & 1 deletion js/messages.php
Expand Up @@ -37,7 +37,8 @@
$js_messages['strDropDatabaseStrongWarning'] = __('You are about to DESTROY a complete database!');
$js_messages['strDropTableStrongWarning'] = __('You are about to DESTROY a complete table!');
$js_messages['strTruncateTableStrongWarning'] = __('You are about to TRUNCATE a complete table!');
$js_messages['strDeleteTrackingData'] = __('Delete tracking data for this table');
$js_messages['strDeleteTrackingData'] = __('Delete tracking data for this table?');
$js_messages['strDeleteTrackingDataMultiple'] = __('Delete tracking data for these tables?');
$js_messages['strDeletingTrackingData'] = __('Deleting tracking data');
$js_messages['strDroppingPrimaryKeyIndex'] = __('Dropping Primary Key/Index');
$js_messages['strDroppingForeignKey'] = __('Dropping Foreign key.');
Expand Down

0 comments on commit 9ca5ea6

Please sign in to comment.