1 /* vim: set expandtab sw=4 ts=4 sts=4: */
3 * @fileoverview events handling from normalization page
10 * AJAX scripts for normalization.php
14 var normalizeto = '1nf';
16 function appendHtmlColumnsList()
21 "token": PMA_commonParams.get('token'),
23 "db": PMA_commonParams.get('db'),
24 "table": PMA_commonParams.get('table'),
28 if (data.success === true) {
29 $('select[name=makeAtomic]').html(data.message);
34 function goTo3NFStep1(newTables)
36 if (Object.keys(newTables).length === 1) {
37 newTables = [PMA_commonParams.get('table')];
42 "token": PMA_commonParams.get('token'),
44 "db": PMA_commonParams.get('db'),
48 $("#page_content h3").html(PMA_messages.str3NFNormalization);
49 $("#mainContent legend").html(data.legendText);
50 $("#mainContent h4").html(data.headText);
51 $("#mainContent p").html(data.subText);
52 $("#mainContent #extra").html(data.extra);
53 $("#extra form").each(function() {
54 form_id = $(this).attr('id');
55 colname = $(this).data('colname');
56 $("#"+form_id+" input[value='"+colname+"']").next().remove();
57 $("#"+form_id+" input[value='"+colname+"']").remove();
59 $("#mainContent #newCols").html('');
60 $('.tblFooters').html('');
61 if (data.subText !== "") {
62 $('.tblFooters').html('<input type="button" onClick="processDependencies(\'\', true);" value="'+PMA_messages.strDone+'"/>');
67 function goTo2NFStep1() {
71 "token": PMA_commonParams.get('token'),
73 "db": PMA_commonParams.get('db'),
74 "table": PMA_commonParams.get('table'),
77 $("#page_content h3").html(PMA_messages.str2NFNormalization);
78 $("#mainContent legend").html(data.legendText);
79 $("#mainContent h4").html(data.headText);
80 $("#mainContent p").html(data.subText);
81 $("#mainContent #extra").html(data.extra);
82 $("#mainContent #newCols").html('');
83 if (data.subText !== '') {
84 $('.tblFooters').html('<input type="submit" value="'+PMA_messages.strDone+'" onclick="processDependencies(\''+data.primary_key+'\');">');
86 if (normalizeto === '3nf') {
87 $("#mainContent #newCols").html(PMA_messages.strToNextStep);
88 setTimeout(function() {
89 goTo3NFStep1([PMA_commonParams.get('table')]);
96 function goToFinish1NF()
98 if (normalizeto !== '1nf') {
102 $("#mainContent legend").html(PMA_messages.strEndStep);
103 $("#mainContent h4").html(
104 "<h3>" + PMA_sprintf(PMA_messages.strFinishMsg, PMA_commonParams.get('table')) + "</h3>"
106 $("#mainContent p").html('');
107 $("#mainContent #extra").html('');
108 $("#mainContent #newCols").html('');
109 $('.tblFooters').html('');
117 "token": PMA_commonParams.get('token'),
118 "ajax_request": true,
119 "db": PMA_commonParams.get('db'),
120 "table": PMA_commonParams.get('table'),
123 $("#mainContent legend").html(data.legendText);
124 $("#mainContent h4").html(data.headText);
125 $("#mainContent p").html(data.subText);
126 $("#mainContent #extra").html(data.extra);
127 $("#mainContent #newCols").html('');
128 $('.tblFooters').html('');
129 for(var pk in primary_key) {
130 $("#extra input[value='"+primary_key[pk]+"']").attr("disabled","disabled");
141 "token": PMA_commonParams.get('token'),
142 "ajax_request": true,
143 "db": PMA_commonParams.get('db'),
144 "table": PMA_commonParams.get('table'),
147 $("#mainContent legend").html(data.legendText);
148 $("#mainContent h4").html(data.headText);
149 $("#mainContent p").html(data.subText);
150 $("#mainContent #extra").html(data.extra);
151 $("#mainContent #newCols").html('');
152 $('.tblFooters').html('');
153 primary_key = $.parseJSON(data.primary_key);
154 for(var pk in primary_key) {
155 $("#extra input[value='"+primary_key[pk]+"']").attr("disabled","disabled");
161 function goToStep2(extra)
166 "token": PMA_commonParams.get('token'),
167 "ajax_request": true,
168 "db": PMA_commonParams.get('db'),
169 "table": PMA_commonParams.get('table'),
172 $("#mainContent legend").html(data.legendText);
173 $("#mainContent h4").html(data.headText);
174 $("#mainContent p").html(data.subText);
175 $("#mainContent #extra,#mainContent #newCols").html('');
176 $('.tblFooters').html('');
177 if (data.hasPrimaryKey === "1") {
178 if(extra === 'goToStep3') {
179 $("#mainContent h4").html(PMA_messages.strPrimaryKeyAdded);
180 $("#mainContent p").html(PMA_messages.strToNextStep);
182 if(extra === 'goToFinish1NF') {
185 setTimeout(function() {
190 //form to select columns to make primary
191 $("#mainContent #extra").html(data.extra);
197 function goTo2NFFinish(pd)
200 for (var dependson in pd) {
201 tables[dependson] = $('#extra input[name="'+dependson+'"]').val();
203 datastring = {"token": PMA_commonParams.get('token'),
204 "ajax_request": true,
205 "db": PMA_commonParams.get('db'),
206 "table": PMA_commonParams.get('table'),
207 "pd": JSON.stringify(pd),
208 "newTablesName":JSON.stringify(tables),
209 "createNewTables2NF":1};
212 url: "normalization.php",
215 success: function(data) {
216 if (data.success === true) {
217 if(data.queryError === false) {
218 if (normalizeto === '3nf') {
219 $("#pma_navigation_reload").click();
220 goTo3NFStep1(tables);
223 $("#mainContent legend").html(data.legendText);
224 $("#mainContent h4").html(data.headText);
225 $("#mainContent p").html('');
226 $("#mainContent #extra").html('');
227 $('.tblFooters').html('');
229 PMA_ajaxShowMessage(data.extra, false);
231 $("#pma_navigation_reload").click();
233 PMA_ajaxShowMessage(data.error, false);
239 function goTo3NFFinish(newTables)
241 for (var table in newTables) {
242 for (var newtbl in newTables[table]) {
243 updatedname = $('#extra input[name="'+newtbl+'"]').val();
244 newTables[table][updatedname] = newTables[table][newtbl];
245 if (updatedname !== newtbl) {
246 delete newTables[table][newtbl];
250 datastring = {"token": PMA_commonParams.get('token'),
251 "ajax_request": true,
252 "db": PMA_commonParams.get('db'),
253 "newTables":JSON.stringify(newTables),
254 "createNewTables3NF":1};
257 url: "normalization.php",
260 success: function(data) {
261 if (data.success === true) {
262 if(data.queryError === false) {
263 $("#mainContent legend").html(data.legendText);
264 $("#mainContent h4").html(data.headText);
265 $("#mainContent p").html('');
266 $("#mainContent #extra").html('');
267 $('.tblFooters').html('');
269 PMA_ajaxShowMessage(data.extra, false);
271 $("#pma_navigation_reload").click();
273 PMA_ajaxShowMessage(data.error, false);
279 function goTo2NFStep2(pd, primary_key)
281 $("#newCols").html('');
282 $("#mainContent legend").html(PMA_messages.strStep+' 2.2 '+PMA_messages.strConfirmPd);
283 $("#mainContent h4").html(PMA_messages.strSelectedPd);
284 $("#mainContent p").html(PMA_messages.strPdHintNote);
285 var extra = '<div class="dependencies_box">';
287 for (var dependson in pd) {
288 if (dependson !== primary_key) {
290 extra += '<p class="displayblock desc">'+escapeHtml(dependson) +" -> "+escapeHtml(pd[dependson].toString())+'</p>';
294 extra += '<p class="displayblock desc">'+PMA_messages.strNoPdSelected+'</p>';
298 datastring = {"token": PMA_commonParams.get('token'),
299 "ajax_request": true,
300 "db": PMA_commonParams.get('db'),
301 "table": PMA_commonParams.get('table'),
302 "pd": JSON.stringify(pd),
303 "getNewTables2NF":1};
306 url: "normalization.php",
309 success: function(data) {
310 if (data.success === true) {
311 extra += data.message;
313 PMA_ajaxShowMessage(data.error, false);
318 $("#mainContent #extra").html(extra);
319 $('.tblFooters').html('<input type="button" value="'+PMA_messages.strBack+'" id="backEditPd"/><input type="button" id="goTo2NFFinish" value="'+PMA_messages.strGo+'"/>');
320 $("#goTo2NFFinish").click(function(){
325 function goTo3NFStep2(pd, tablesTds)
327 $("#newCols").html('');
328 $("#mainContent legend").html(PMA_messages.strStep+' 3.2 '+PMA_messages.strConfirmTd);
329 $("#mainContent h4").html(PMA_messages.strSelectedTd);
330 $("#mainContent p").html(PMA_messages.strPdHintNote);
331 var extra = '<div class="dependencies_box">';
333 for (var table in tablesTds) {
334 for (var i in tablesTds[table]) {
335 dependson = tablesTds[table][i];
336 if (dependson !== '' && dependson !== table) {
338 extra += '<p class="displayblock desc">'+escapeHtml(dependson) +" -> "+escapeHtml(pd[dependson].toString())+'</p>';
343 extra += '<p class="displayblock desc">'+PMA_messages.strNoTdSelected+'</p>';
347 datastring = {"token": PMA_commonParams.get('token'),
348 "ajax_request": true,
349 "db": PMA_commonParams.get('db'),
350 "tables": JSON.stringify(tablesTds),
351 "pd": JSON.stringify(pd),
352 "getNewTables3NF":1};
355 url: "normalization.php",
358 success: function(data) {
359 data_parsed = $.parseJSON(data.message);
360 if (data.success === true) {
361 extra += data_parsed.html;
363 PMA_ajaxShowMessage(data.error, false);
368 $("#mainContent #extra").html(extra);
369 $('.tblFooters').html('<input type="button" value="'+PMA_messages.strBack+'" id="backEditPd"/><input type="button" id="goTo3NFFinish" value="'+PMA_messages.strGo+'"/>');
370 $("#goTo3NFFinish").click(function(){
374 goTo3NFFinish(data_parsed.newTables);
378 function processDependencies(primary_key, isTransitive)
383 pd[primary_key] = [];
384 $("#extra form").each(function() {
385 if (isTransitive === true) {
386 tblname = $(this).data('tablename');
387 primary_key = tblname;
388 if (!(tblname in tablesTds)) {
389 tablesTds[tblname] = [];
391 tablesTds[tblname].push(primary_key);
393 form_id = $(this).attr('id');
394 $('#'+form_id+' input[type=checkbox]:not(:checked)').removeAttr('checked');
396 $('#'+form_id+' input[type=checkbox]:checked').each(function(){
397 dependsOn += $(this).val()+', ';
398 $(this).attr("checked","checked");
400 if (dependsOn === '') {
401 dependsOn = primary_key;
403 dependsOn = dependsOn.slice(0, -2);
405 if (! (dependsOn in pd)) {
408 pd[dependsOn].push($(this).data('colname'));
409 if (isTransitive === true) {
410 if (!(tblname in tablesTds)) {
411 tablesTds[tblname] = [];
413 if ($.inArray(dependsOn, tablesTds[tblname]) === -1) {
414 tablesTds[tblname].push(dependsOn);
418 backup = $("#mainContent").html();
419 if (isTransitive === true) {
420 goTo3NFStep2(pd, tablesTds);
422 goTo2NFStep2(pd, primary_key);
427 function moveRepeatingGroup(repeatingCols) {
428 newTable = $("input[name=repeatGroupTable]").val();
429 newColumn = $("input[name=repeatGroupColumn]").val();
431 $("input[name=repeatGroupTable]").focus();
435 $("input[name=repeatGroupColumn]").focus();
438 datastring = {"token": PMA_commonParams.get('token'),
439 "ajax_request": true,
440 "db": PMA_commonParams.get('db'),
441 "table": PMA_commonParams.get('table'),
442 "repeatingColumns": repeatingCols,
444 "newColumn":newColumn,
445 "primary_columns":primary_key.toString()
449 url: "normalization.php",
452 success: function(data) {
453 if (data.success === true) {
454 if(data.queryError === false) {
457 PMA_ajaxShowMessage(data.message, false);
458 $("#pma_navigation_reload").click();
460 PMA_ajaxShowMessage(data.error, false);
465 AJAX.registerTeardown('normalization.js', function () {
466 $("#extra").off("click", "#selectNonAtomicCol");
467 $("#splitGo").unbind('click');
468 $('.tblFooters').off("click", "#saveSplit");
469 $("#extra").off("click", "#addNewPrimary");
470 $(".tblFooters").off("click", "#saveNewPrimary");
471 $("#extra").off("click", "#removeRedundant");
472 $("#mainContent p").off("click", "#createPrimaryKey");
473 $("#mainContent").off("click", "#backEditPd");
474 $("#mainContent").off("click", "#showPossiblePd");
475 $("#mainContent").off("click", ".pickPd");
478 AJAX.registerOnload('normalization.js', function() {
480 normalizeto = $("#mainContent").data('normalizeto');
481 $("#extra").on("click", "#selectNonAtomicCol", function() {
482 if ($(this).val() === 'no_such_col') {
485 selectedCol = $(this).val();
489 $("#splitGo").click(function() {
490 if(!selectedCol || selectedCol === '') {
493 var numField = $("#numField").val();
497 "token": PMA_commonParams.get('token'),
498 "ajax_request": true,
499 "db": PMA_commonParams.get('db'),
500 "table": PMA_commonParams.get('table'),
502 "numFields": numField
505 if (data.success === true) {
506 $('#newCols').html(data.message);
507 $('.default_value').hide();
508 $('.enum_notice').hide();
509 $('.tblFooters').html("<input type='submit' id='saveSplit' value='"+PMA_messages.strSave+"'/>" +
510 "<input type='submit' id='cancelSplit' value='"+PMA_messages.strCancel+"' "+
511 "onclick=\"$('#newCols').html('');$(this).parent().html('')\"/>");
517 $('.tblFooters').on("click","#saveSplit", function() {
518 central_column_list = [];
519 if ($("#newCols #field_0_1").val() === '') {
520 $("#newCols #field_0_1").focus();
523 datastring = $('#newCols :input').serialize();
524 datastring += "&ajax_request=1&do_save_data=1&field_where=last";
525 $.post("tbl_addfield.php", datastring, function(data) {
530 "token": PMA_commonParams.get('token'),
531 "ajax_request": true,
532 "db": PMA_commonParams.get('db'),
533 "table": PMA_commonParams.get('table'),
534 "dropped_column": selectedCol,
535 "sql_query": 'ALTER TABLE `' + PMA_commonParams.get('table') + '` DROP `' + selectedCol + '`;',
539 if (data.success === true) {
540 appendHtmlColumnsList();
541 $('#newCols').html('');
542 $('.tblFooters').html('');
544 PMA_ajaxShowMessage(data.error, false);
550 PMA_ajaxShowMessage(data.error, false);
555 $("#extra").on("click", "#addNewPrimary", function() {
559 "token": PMA_commonParams.get('token'),
560 "ajax_request": true,
561 "db": PMA_commonParams.get('db'),
562 "table": PMA_commonParams.get('table'),
563 "addNewPrimary": true
566 if (data.success === true) {
567 $('#newCols').html(data.message);
568 $('.default_value').hide();
569 $('.enum_notice').hide();
570 $('.tblFooters').html("<input type='submit' id='saveNewPrimary' value='"+PMA_messages.strSave+"'/>" +
571 "<input type='submit' id='cancelSplit' value='"+PMA_messages.strCancel+"' "+
572 "onclick=\"$('#newCols').html('');$(this).parent().html('')\"/>");
574 PMA_ajaxShowMessage(data.error, false);
580 $(".tblFooters").on("click", "#saveNewPrimary", function() {
581 datastring = $('#newCols :input').serialize();
582 datastring += "&field_key[0]=primary_0&ajax_request=1&do_save_data=1&field_where=last";
583 $.post("tbl_addfield.php", datastring, function(data) {
584 if (data.success === true) {
585 $("#mainContent h4").html(PMA_messages.strPrimaryKeyAdded);
586 $("#mainContent p").html(PMA_messages.strToNextStep);
587 $("#mainContent #extra").html('');
588 $("#mainContent #newCols").html('');
589 $('.tblFooters').html('');
590 setTimeout(function() {
594 PMA_ajaxShowMessage(data.error, false);
598 $("#extra").on("click", "#removeRedundant", function() {
599 var dropQuery = 'ALTER TABLE `' + PMA_commonParams.get('table') + '` ';
600 $("#extra input[type=checkbox]:checked").each(function() {
601 dropQuery += 'DROP `' + $(this).val() + '`, ';
603 dropQuery = dropQuery.slice(0, -2);
607 "token": PMA_commonParams.get('token'),
608 "ajax_request": true,
609 "db": PMA_commonParams.get('db'),
610 "table": PMA_commonParams.get('table'),
611 "sql_query": dropQuery,
615 if (data.success === true) {
616 goToStep2('goToFinish1NF');
618 PMA_ajaxShowMessage(data.error, false);
623 $("#extra").on("click", "#moveRepeatingGroup", function() {
624 var repeatingCols = '';
625 $("#extra input[type=checkbox]:checked").each(function() {
626 repeatingCols += $(this).val() + ', ';
629 if (repeatingCols !== '') {
630 newColName = $("#extra input[type=checkbox]:checked:first").val();
631 repeatingCols = repeatingCols.slice(0, -2);
632 confirmStr = PMA_sprintf(PMA_messages.strMoveRepeatingGroup, escapeHtml(repeatingCols), escapeHtml(PMA_commonParams.get('table')));
633 confirmStr += '<input type="text" name="repeatGroupTable" placeholder="'+PMA_messages.strNewTablePlaceholder+'"/>'+
634 '( '+escapeHtml(primary_key.toString())+', <input type="text" name="repeatGroupColumn" placeholder="'+PMA_messages.strNewColumnPlaceholder+'" value="'+escapeHtml(newColName)+'">)'+
636 $("#newCols").html(confirmStr);
637 $('.tblFooters').html('<input type="submit" value="'+PMA_messages.strCancel+'" onclick="$(\'#newCols\').html(\'\');$(\'#extra input[type=checkbox]\').removeAttr(\'checked\')"/>'+
638 '<input type="submit" value="'+PMA_messages.strGo+'" onclick="moveRepeatingGroup(\''+repeatingCols+'\')"/>');
641 $("#mainContent p").on("click", "#createPrimaryKey", function(event) {
642 event.preventDefault();
643 var url = { create_index: 1,
644 server: PMA_commonParams.get('server'),
645 db: PMA_commonParams.get('db'),
646 table: PMA_commonParams.get('table'),
647 token: PMA_commonParams.get('token'),
650 index: {Key_name:'PRIMARY'},
653 var title = PMA_messages.strAddPrimaryKey;
654 indexEditorDialog(url, title, function(){
656 $(".sqlqueryresults").remove();
657 $('.result_query').remove();
658 $('.tblFooters').html('');
659 goToStep2('goToStep3');
663 $("#mainContent").on("click", "#backEditPd", function(){
664 $("#mainContent").html(backup);
666 $("#mainContent").on("click", "#showPossiblePd", function(){
667 if($(this).hasClass('hideList')) {
668 $(this).html('+ '+PMA_messages.strShowPossiblePd);
669 $(this).removeClass('hideList');
670 $("#newCols").slideToggle("slow");
673 if($("#newCols").html() !== '') {
674 $("#showPossiblePd").html('- '+PMA_messages.strHidePd);
675 $("#showPossiblePd").addClass('hideList');
676 $("#newCols").slideToggle("slow");
679 $("#newCols").insertAfter("#mainContent h4");
680 $("#newCols").html('<div class="center">'+PMA_messages.strLoading+'<br/>'+PMA_messages.strWaitForPd+'</div>');
684 "token": PMA_commonParams.get('token'),
685 "ajax_request": true,
686 "db": PMA_commonParams.get('db'),
687 "table": PMA_commonParams.get('table'),
690 $("#showPossiblePd").html('- '+PMA_messages.strHidePd);
691 $("#showPossiblePd").addClass('hideList');
692 $("#newCols").html(data.message);
695 $("#mainContent").on("click", ".pickPd", function(){
696 var strColsLeft = $(this).next('.determinants').html();
697 var colsLeft = strColsLeft.split(',');
698 var strColsRight = $(this).next().next().html();
699 var colsRight = strColsRight.split(',');
700 for (var i in colsRight) {
701 $('form[data-colname="'+colsRight[i].trim()+'"] input[type="checkbox"]').prop('checked', false);
702 for (var j in colsLeft) {
703 $('form[data-colname="'+colsRight[i].trim()+'"] input[value="'+colsLeft[j].trim()+'"]').prop('checked', true);