1 /* vim: set expandtab sw=4 ts=4 sts=4: */
3 * @fileoverview events handling from normalization page
9 // eslint-disable-next-line no-unused-vars
10 /* global centralColumnList:writable */ // js/functions.js
13 * AJAX scripts for normalization.php
17 var normalizeto = '1nf';
19 var dataParsed = null;
21 function appendHtmlColumnsList () {
26 'db': CommonParams.get('db'),
27 'table': CommonParams.get('table'),
28 'server': CommonParams.get('server'),
32 if (data.success === true) {
33 $('select[name=makeAtomic]').html(data.message);
39 function goTo3NFStep1 (newTables) {
40 var tables = newTables;
41 if (Object.keys(tables).length === 1) {
42 tables = [CommonParams.get('table')];
48 'db': CommonParams.get('db'),
49 'server': CommonParams.get('server'),
53 $('#page_content').find('h3').html(Messages.str3NFNormalization);
54 $('#mainContent').find('legend').html(data.legendText);
55 $('#mainContent').find('h4').html(data.headText);
56 $('#mainContent').find('p').html(data.subText);
57 $('#mainContent').find('#extra').html(data.extra);
58 $('#extra').find('form').each(function () {
59 var formId = $(this).attr('id');
60 var colName = $(this).data('colname');
61 $('#' + formId + ' input[value=\'' + colName + '\']').next().remove();
62 $('#' + formId + ' input[value=\'' + colName + '\']').remove();
64 $('#mainContent').find('#newCols').html('');
65 $('.tblFooters').html('');
67 if (data.subText !== '') {
69 .attr({ type: 'button', value: Messages.strDone })
70 .on('click', function () {
71 processDependencies('', true);
73 .appendTo('.tblFooters');
79 function goTo2NFStep1 () {
84 'db': CommonParams.get('db'),
85 'table': CommonParams.get('table'),
86 'server': CommonParams.get('server'),
89 $('#page_content h3').html(Messages.str2NFNormalization);
90 $('#mainContent legend').html(data.legendText);
91 $('#mainContent h4').html(data.headText);
92 $('#mainContent p').html(data.subText);
93 $('#mainContent #extra').html(data.extra);
94 $('#mainContent #newCols').html('');
95 if (data.subText !== '') {
97 .attr({ type: 'submit', value: Messages.strDone, })
98 .on('click', function () {
99 processDependencies(data.primary_key);
101 .appendTo('.tblFooters');
103 if (normalizeto === '3nf') {
104 $('#mainContent #newCols').html(Messages.strToNextStep);
105 setTimeout(function () {
106 goTo3NFStep1([CommonParams.get('table')]);
113 function goToFinish1NF () {
114 if (normalizeto !== '1nf') {
118 $('#mainContent legend').html(Messages.strEndStep);
119 $('#mainContent h4').html(
120 '<h3>' + Functions.sprintf(Messages.strFinishMsg, Functions.escapeHtml(CommonParams.get('table'))) + '</h3>'
122 $('#mainContent p').html('');
123 $('#mainContent #extra').html('');
124 $('#mainContent #newCols').html('');
125 $('.tblFooters').html('');
128 // eslint-disable-next-line no-unused-vars
129 function goToStep4 () {
133 'ajax_request': true,
134 'db': CommonParams.get('db'),
135 'table': CommonParams.get('table'),
136 'server': CommonParams.get('server'),
139 $('#mainContent legend').html(data.legendText);
140 $('#mainContent h4').html(data.headText);
141 $('#mainContent p').html(data.subText);
142 $('#mainContent #extra').html(data.extra);
143 $('#mainContent #newCols').html('');
144 $('.tblFooters').html('');
145 for (var pk in primaryKey) {
146 $('#extra input[value=\'' + Functions.escapeJsString(primaryKey[pk]) + '\']').attr('disabled','disabled');
152 function goToStep3 () {
156 'ajax_request': true,
157 'db': CommonParams.get('db'),
158 'table': CommonParams.get('table'),
159 'server': CommonParams.get('server'),
162 $('#mainContent legend').html(data.legendText);
163 $('#mainContent h4').html(data.headText);
164 $('#mainContent p').html(data.subText);
165 $('#mainContent #extra').html(data.extra);
166 $('#mainContent #newCols').html('');
167 $('.tblFooters').html('');
168 primaryKey = JSON.parse(data.primary_key);
169 for (var pk in primaryKey) {
170 $('#extra input[value=\'' + Functions.escapeJsString(primaryKey[pk]) + '\']').attr('disabled','disabled');
176 function goToStep2 (extra) {
180 'ajax_request': true,
181 'db': CommonParams.get('db'),
182 'table': CommonParams.get('table'),
183 'server': CommonParams.get('server'),
186 $('#mainContent legend').html(data.legendText);
187 $('#mainContent h4').html(data.headText);
188 $('#mainContent p').html(data.subText);
189 $('#mainContent #extra,#mainContent #newCols').html('');
190 $('.tblFooters').html('');
191 if (data.hasPrimaryKey === '1') {
192 if (extra === 'goToStep3') {
193 $('#mainContent h4').html(Messages.strPrimaryKeyAdded);
194 $('#mainContent p').html(Messages.strToNextStep);
196 if (extra === 'goToFinish1NF') {
199 setTimeout(function () {
204 // form to select columns to make primary
205 $('#mainContent #extra').html(data.extra);
211 function goTo2NFFinish (pd) {
213 for (var dependson in pd) {
214 tables[dependson] = $('#extra input[name="' + dependson + '"]').val();
217 'ajax_request': true,
218 'db': CommonParams.get('db'),
219 'table': CommonParams.get('table'),
220 'server': CommonParams.get('server'),
221 'pd': JSON.stringify(pd),
222 'newTablesName':JSON.stringify(tables),
223 'createNewTables2NF':1 };
226 url: 'normalization.php',
229 success: function (data) {
230 if (data.success === true) {
231 if (data.queryError === false) {
232 if (normalizeto === '3nf') {
233 $('#pma_navigation_reload').trigger('click');
234 goTo3NFStep1(tables);
237 $('#mainContent legend').html(data.legendText);
238 $('#mainContent h4').html(data.headText);
239 $('#mainContent p').html('');
240 $('#mainContent #extra').html('');
241 $('.tblFooters').html('');
243 Functions.ajaxShowMessage(data.extra, false);
245 $('#pma_navigation_reload').trigger('click');
247 Functions.ajaxShowMessage(data.error, false);
253 function goTo3NFFinish (newTables) {
254 for (var table in newTables) {
255 for (var newtbl in newTables[table]) {
256 var updatedname = $('#extra input[name="' + newtbl + '"]').val();
257 newTables[table][updatedname] = newTables[table][newtbl];
258 if (updatedname !== newtbl) {
259 delete newTables[table][newtbl];
264 'ajax_request': true,
265 'db': CommonParams.get('db'),
266 'server': CommonParams.get('server'),
267 'newTables':JSON.stringify(newTables),
268 'createNewTables3NF':1 };
271 url: 'normalization.php',
274 success: function (data) {
275 if (data.success === true) {
276 if (data.queryError === false) {
277 $('#mainContent legend').html(data.legendText);
278 $('#mainContent h4').html(data.headText);
279 $('#mainContent p').html('');
280 $('#mainContent #extra').html('');
281 $('.tblFooters').html('');
283 Functions.ajaxShowMessage(data.extra, false);
285 $('#pma_navigation_reload').trigger('click');
287 Functions.ajaxShowMessage(data.error, false);
295 function goTo2NFStep2 (pd, primaryKey) {
296 $('#newCols').html('');
297 $('#mainContent legend').html(Messages.strStep + ' 2.2 ' + Messages.strConfirmPd);
298 $('#mainContent h4').html(Messages.strSelectedPd);
299 $('#mainContent p').html(Messages.strPdHintNote);
300 var extra = '<div class="dependencies_box">';
302 for (var dependson in pd) {
303 if (dependson !== primaryKey) {
305 extra += '<p class="displayblock desc">' + Functions.escapeHtml(dependson) + ' -> ' + Functions.escapeHtml(pd[dependson].toString()) + '</p>';
309 extra += '<p class="displayblock desc">' + Messages.strNoPdSelected + '</p>';
314 'ajax_request': true,
315 'db': CommonParams.get('db'),
316 'table': CommonParams.get('table'),
317 'server': CommonParams.get('server'),
318 'pd': JSON.stringify(pd),
319 'getNewTables2NF':1 };
322 url: 'normalization.php',
325 success: function (data) {
326 if (data.success === true) {
327 extra += data.message;
329 Functions.ajaxShowMessage(data.error, false);
334 $('#mainContent #extra').html(extra);
335 $('.tblFooters').html('<input type="button" class="btn btn-primary" value="' + Messages.strBack + '" id="backEditPd"><input type="button" class="btn btn-primary" id="goTo2NFFinish" value="' + Messages.strGo + '">');
336 $('#goTo2NFFinish').on('click', function () {
341 function goTo3NFStep2 (pd, tablesTds) {
342 $('#newCols').html('');
343 $('#mainContent legend').html(Messages.strStep + ' 3.2 ' + Messages.strConfirmTd);
344 $('#mainContent h4').html(Messages.strSelectedTd);
345 $('#mainContent p').html(Messages.strPdHintNote);
346 var extra = '<div class="dependencies_box">';
348 for (var table in tablesTds) {
349 for (var i in tablesTds[table]) {
350 var dependson = tablesTds[table][i];
351 if (dependson !== '' && dependson !== table) {
353 extra += '<p class="displayblock desc">' + Functions.escapeHtml(dependson) + ' -> ' + Functions.escapeHtml(pd[dependson].toString()) + '</p>';
358 extra += '<p class="displayblock desc">' + Messages.strNoTdSelected + '</p>';
363 'ajax_request': true,
364 'db': CommonParams.get('db'),
365 'tables': JSON.stringify(tablesTds),
366 'server': CommonParams.get('server'),
367 'pd': JSON.stringify(pd),
368 'getNewTables3NF':1 };
371 url: 'normalization.php',
374 success: function (data) {
376 if (data.success === true) {
377 extra += dataParsed.html;
379 Functions.ajaxShowMessage(data.error, false);
384 $('#mainContent #extra').html(extra);
385 $('.tblFooters').html('<input type="button" class="btn btn-primary" value="' + Messages.strBack + '" id="backEditPd"><input type="button" class="btn btn-primary" id="goTo3NFFinish" value="' + Messages.strGo + '">');
386 $('#goTo3NFFinish').on('click', function () {
390 goTo3NFFinish(dataParsed.newTables);
394 function processDependencies (primaryKey, isTransitive) {
400 $('#extra form').each(function () {
402 if (isTransitive === true) {
403 tblname = $(this).data('tablename');
405 if (!(tblname in tablesTds)) {
406 tablesTds[tblname] = [];
408 tablesTds[tblname].push(pk);
410 var formId = $(this).attr('id');
411 $('#' + formId + ' input[type=checkbox]:not(:checked)').prop('checked', false);
413 $('#' + formId + ' input[type=checkbox]:checked').each(function () {
414 dependsOn += $(this).val() + ', ';
415 $(this).attr('checked','checked');
417 if (dependsOn === '') {
420 dependsOn = dependsOn.slice(0, -2);
422 if (! (dependsOn in pd)) {
425 pd[dependsOn].push($(this).data('colname'));
426 if (isTransitive === true) {
427 if (!(tblname in tablesTds)) {
428 tablesTds[tblname] = [];
430 if ($.inArray(dependsOn, tablesTds[tblname]) === -1) {
431 tablesTds[tblname].push(dependsOn);
435 backup = $('#mainContent').html();
436 if (isTransitive === true) {
437 goTo3NFStep2(pd, tablesTds);
439 goTo2NFStep2(pd, pk);
444 function moveRepeatingGroup (repeatingCols) {
445 var newTable = $('input[name=repeatGroupTable]').val();
446 var newColumn = $('input[name=repeatGroupColumn]').val();
448 $('input[name=repeatGroupTable]').trigger('focus');
452 $('input[name=repeatGroupColumn]').trigger('focus');
456 'ajax_request': true,
457 'db': CommonParams.get('db'),
458 'table': CommonParams.get('table'),
459 'server': CommonParams.get('server'),
460 'repeatingColumns': repeatingCols,
462 'newColumn':newColumn,
463 'primary_columns':primaryKey.toString()
467 url: 'normalization.php',
470 success: function (data) {
471 if (data.success === true) {
472 if (data.queryError === false) {
475 Functions.ajaxShowMessage(data.message, false);
476 $('#pma_navigation_reload').trigger('click');
478 Functions.ajaxShowMessage(data.error, false);
483 AJAX.registerTeardown('normalization.js', function () {
484 $('#extra').off('click', '#selectNonAtomicCol');
485 $('#splitGo').off('click');
486 $('.tblFooters').off('click', '#saveSplit');
487 $('#extra').off('click', '#addNewPrimary');
488 $('.tblFooters').off('click', '#saveNewPrimary');
489 $('#extra').off('click', '#removeRedundant');
490 $('#mainContent p').off('click', '#createPrimaryKey');
491 $('#mainContent').off('click', '#backEditPd');
492 $('#mainContent').off('click', '#showPossiblePd');
493 $('#mainContent').off('click', '.pickPd');
496 AJAX.registerOnload('normalization.js', function () {
498 normalizeto = $('#mainContent').data('normalizeto');
499 $('#extra').on('click', '#selectNonAtomicCol', function () {
500 if ($(this).val() === 'no_such_col') {
503 selectedCol = $(this).val();
507 $('#splitGo').on('click', function () {
508 if (!selectedCol || selectedCol === '') {
511 var numField = $('#numField').val();
515 'ajax_request': true,
516 'db': CommonParams.get('db'),
517 'table': CommonParams.get('table'),
518 'server': CommonParams.get('server'),
520 'numFields': numField
523 if (data.success === true) {
524 $('#newCols').html(data.message);
525 $('.default_value').hide();
526 $('.enum_notice').hide();
529 .attr({ type: 'submit', id: 'saveSplit', value: Messages.strSave })
530 .appendTo('.tblFooters');
533 .attr({ type: 'submit', id: 'cancelSplit', value: Messages.strCancel })
534 .on('click', function () {
535 $('#newCols').html('');
536 $(this).parent().html('');
538 .appendTo('.tblFooters');
544 $('.tblFooters').on('click','#saveSplit', function () {
545 centralColumnList = [];
546 if ($('#newCols #field_0_1').val() === '') {
547 $('#newCols #field_0_1').trigger('focus');
550 var argsep = CommonParams.get('arg_separator');
551 var datastring = $('#newCols :input').serialize();
552 datastring += argsep + 'ajax_request=1' + argsep + 'do_save_data=1' + argsep + 'field_where=last';
553 $.post('tbl_addfield.php', datastring, function (data) {
558 'ajax_request': true,
559 'db': CommonParams.get('db'),
560 'table': CommonParams.get('table'),
561 'server': CommonParams.get('server'),
562 'dropped_column': selectedCol,
564 'sql_query': 'ALTER TABLE `' + CommonParams.get('table') + '` DROP `' + selectedCol + '`;',
568 if (data.success === true) {
569 appendHtmlColumnsList();
570 $('#newCols').html('');
571 $('.tblFooters').html('');
573 Functions.ajaxShowMessage(data.error, false);
579 Functions.ajaxShowMessage(data.error, false);
584 $('#extra').on('click', '#addNewPrimary', function () {
588 'ajax_request': true,
589 'db': CommonParams.get('db'),
590 'table': CommonParams.get('table'),
591 'server': CommonParams.get('server'),
592 'addNewPrimary': true
595 if (data.success === true) {
596 $('#newCols').html(data.message);
597 $('.default_value').hide();
598 $('.enum_notice').hide();
601 .attr({ type: 'submit', id: 'saveNewPrimary', value: Messages.strSave })
602 .appendTo('.tblFooters');
604 .attr({ type: 'submit', id: 'cancelSplit', value: Messages.strCancel })
605 .on('click', function () {
606 $('#newCols').html('');
607 $(this).parent().html('');
609 .appendTo('.tblFooters');
611 Functions.ajaxShowMessage(data.error, false);
617 $('.tblFooters').on('click', '#saveNewPrimary', function () {
618 var datastring = $('#newCols :input').serialize();
619 var argsep = CommonParams.get('arg_separator');
620 datastring += argsep + 'field_key[0]=primary_0' + argsep + 'ajax_request=1' + argsep + 'do_save_data=1' + argsep + 'field_where=last';
621 $.post('tbl_addfield.php', datastring, function (data) {
622 if (data.success === true) {
623 $('#mainContent h4').html(Messages.strPrimaryKeyAdded);
624 $('#mainContent p').html(Messages.strToNextStep);
625 $('#mainContent #extra').html('');
626 $('#mainContent #newCols').html('');
627 $('.tblFooters').html('');
628 setTimeout(function () {
632 Functions.ajaxShowMessage(data.error, false);
636 $('#extra').on('click', '#removeRedundant', function () {
637 var dropQuery = 'ALTER TABLE `' + CommonParams.get('table') + '` ';
638 $('#extra input[type=checkbox]:checked').each(function () {
639 dropQuery += 'DROP `' + $(this).val() + '`, ';
641 dropQuery = dropQuery.slice(0, -2);
645 'ajax_request': true,
646 'db': CommonParams.get('db'),
647 'table': CommonParams.get('table'),
648 'server': CommonParams.get('server'),
649 'sql_query': dropQuery,
653 if (data.success === true) {
654 goToStep2('goToFinish1NF');
656 Functions.ajaxShowMessage(data.error, false);
661 $('#extra').on('click', '#moveRepeatingGroup', function () {
662 var repeatingCols = '';
663 $('#extra input[type=checkbox]:checked').each(function () {
664 repeatingCols += $(this).val() + ', ';
667 if (repeatingCols !== '') {
668 var newColName = $('#extra input[type=checkbox]:checked:first').val();
669 repeatingCols = repeatingCols.slice(0, -2);
670 var confirmStr = Functions.sprintf(Messages.strMoveRepeatingGroup, Functions.escapeHtml(repeatingCols), Functions.escapeHtml(CommonParams.get('table')));
671 confirmStr += '<input type="text" name="repeatGroupTable" placeholder="' + Messages.strNewTablePlaceholder + '">' +
672 '( ' + Functions.escapeHtml(primaryKey.toString()) + ', <input type="text" name="repeatGroupColumn" placeholder="' + Messages.strNewColumnPlaceholder + '" value="' + Functions.escapeHtml(newColName) + '">)' +
674 $('#newCols').html(confirmStr);
677 .attr({ type: 'submit', value: Messages.strCancel })
678 .on('click', function () {
679 $('#newCols').html('');
680 $('#extra input[type=checkbox]').prop('checked', false);
682 .appendTo('.tblFooters');
684 .attr({ type: 'submit', value: Messages.strGo })
685 .on('click', function () {
686 moveRepeatingGroup(repeatingCols);
688 .appendTo('.tblFooters');
691 $('#mainContent p').on('click', '#createPrimaryKey', function (event) {
692 event.preventDefault();
695 'server': CommonParams.get('server'),
696 'db': CommonParams.get('db'),
697 'table': CommonParams.get('table'),
700 'index': { 'Key_name':'PRIMARY' },
703 var title = Messages.strAddPrimaryKey;
704 Functions.indexEditorDialog(url, title, function () {
706 $('.sqlqueryresults').remove();
707 $('.result_query').remove();
708 $('.tblFooters').html('');
709 goToStep2('goToStep3');
713 $('#mainContent').on('click', '#backEditPd', function () {
714 $('#mainContent').html(backup);
716 $('#mainContent').on('click', '#showPossiblePd', function () {
717 if ($(this).hasClass('hideList')) {
718 $(this).html('+ ' + Messages.strShowPossiblePd);
719 $(this).removeClass('hideList');
720 $('#newCols').slideToggle('slow');
723 if ($('#newCols').html() !== '') {
724 $('#showPossiblePd').html('- ' + Messages.strHidePd);
725 $('#showPossiblePd').addClass('hideList');
726 $('#newCols').slideToggle('slow');
729 $('#newCols').insertAfter('#mainContent h4');
730 $('#newCols').html('<div class="center">' + Messages.strLoading + '<br>' + Messages.strWaitForPd + '</div>');
734 'ajax_request': true,
735 'db': CommonParams.get('db'),
736 'table': CommonParams.get('table'),
737 'server': CommonParams.get('server'),
740 $('#showPossiblePd').html('- ' + Messages.strHidePd);
741 $('#showPossiblePd').addClass('hideList');
742 $('#newCols').html(data.message);
745 $('#mainContent').on('click', '.pickPd', function () {
746 var strColsLeft = $(this).next('.determinants').html();
747 var colsLeft = strColsLeft.split(',');
748 var strColsRight = $(this).next().next().html();
749 var colsRight = strColsRight.split(',');
750 for (var i in colsRight) {
751 $('form[data-colname="' + colsRight[i].trim() + '"] input[type="checkbox"]').prop('checked', false);
752 for (var j in colsLeft) {
753 $('form[data-colname="' + colsRight[i].trim() + '"] input[value="' + colsLeft[j].trim() + '"]').prop('checked', true);