const TAB_DEFAULT_LABEL = 'New Query'; var editors = {}; var tabIndex = 0; var tabs = []; var isChanged = {}; var isVisual = {}; var dbHints = {} var columnLink = {}; function tabActivate(activeIndex) { jQuery(".wpda_query_builder").hide(); jQuery("#wpda_query_builder_" + activeIndex).show(); jQuery(".nav-tab").removeClass("nav-tab-active"); jQuery("#wpda_query_builder_label_" + activeIndex).addClass("nav-tab-active"); } function tabNew(tabName = TAB_DEFAULT_LABEL, query = '', schema_name = wpda_default_database) { tabIndex++; if (tabName===TAB_DEFAULT_LABEL) { tabName += " (" + tabIndex + ")"; dbsName = ''; } else { dbsName = tabName; } tabLabel = ` ${tabName} `; jQuery("#wpda_query_builder nav.nav-tab-wrapper").append(tabLabel); document.getElementById("wpda_query_builder_label_value_" + tabIndex).ondblclick = function(){ event.preventDefault(); var sel = window.getSelection(); var range = document.createRange(); range.selectNodeContents(this); sel.removeAllRanges(); sel.addRange(range); }; // let vqbButton = ''; if (vqbInstalled) { vqbButton = ` Visual Query Builder `; } tabContent = `
${vqbButton} Execute Save ?
${queryResult(tabIndex)}
`; jQuery("#wpda_query_builder").append(tabContent); editors['tab' + tabIndex] = wp.codeEditor.initialize(jQuery('#wpda_query_builder_sql_' + tabIndex), cm_settings); editors['tab' + tabIndex].codemirror.setOption('tabindex', tabIndex); editors['tab' + tabIndex].codemirror.on('change', function(cm_editor) { isChanged[cm_editor.getOption('tabindex')] = true; }); jQuery("#wpda_query_builder_dbs_" + tabIndex).val(schema_name); jQuery('.wpda_tooltip').tooltip({ track: true }); new ClipboardJS(".wpda_copy_to_clipboard"); jQuery(".wpda_copy_to_clipboard").on("click", { tabIndex: tabIndex }, function() { cm = editors['tab' + tabIndex].codemirror; cm.save(); jQuery(this).attr("data-clipboard-text", jQuery("#wpda_query_builder_sql_" + tabIndex).val()); jQuery.notify('Query copied to clipboard', 'success'); }); tabActivate(tabIndex); isChanged[tabIndex] = false; isVisual[tabIndex] = false; setHints(tabIndex); jQuery('.wpda_tooltip').tooltip({ tooltipClass: "wpda_tooltip_dashboard" }); } function setHints(activeIndex) { var schemaName = jQuery("#wpda_query_builder_dbs_" + activeIndex).val(); if (!dbHints[schemaName]) { jQuery.ajax({ method: 'POST', url: wpda_home_url + "?action=wpda_query_builder_get_db_hints", data: { wpda_wpnonce: wpda_wpnonce, wpda_schemaname: schemaName } }).done( function (msg) { if (msg.status && msg.tables && msg.status === "OK") { tabTables = Object.assign({}, msg.tables); for (var table in msg.tables) { for (var i = 0; i < msg.tables[table].length; i++) { tabTables[msg.tables[table][i]] = []; } } editors['tab' + activeIndex].codemirror.options.hintOptions = { tables: tabTables } // Save tables for new tabs dbHints[schemaName] = tabTables; // Update visual component if enabled if (isVisual[activeIndex]) { updateVisual(activeIndex); } } else { editors['tab' + activeIndex].codemirror.options.hintOptions = { tables: null } } } ).fail( function (msg) { console.log("WP Data Access ERROR:"); console.log(msg); editors['tab' + activeIndex].codemirror.options.hintOptions = { tables: null } } ); } else { editors['tab' + activeIndex].codemirror.options.hintOptions = { tables: dbHints[schemaName] } // Update visual component if enabled if (isVisual[activeIndex]) { updateVisual(activeIndex); } } editors['tab' + activeIndex].codemirror.on('keyup', (cm, event) => { if (!jQuery("#wpda_sql_hints").is(":checked")) { return; } if ( event.key==="Backspace" || event.key==="Escape" || event.key==="ArrowUp" || event.key==="ArrowDown" ) { return; } editors['tab' + activeIndex].codemirror.execCommand('autocomplete'); }); } function queryResult(activeIndex) { return `
`; } function tabClose(activeIndex) { if (isChanged[activeIndex]) { if (!confirm('Your changes will not be saved! Are you sure you want to leave this page?')) { return; } } jQuery("#wpda_query_builder_label_" + activeIndex).remove(); jQuery("#wpda_query_builder_" + activeIndex).remove(); delete editors['tab' + activeIndex]; delete isChanged[activeIndex]; if (jQuery(".wpda_query_builder").length>0) { if (jQuery(".nav-tab-active").data("id")===undefined) { tabActivate(jQuery(".nav-tab").data("id")); } } else { tabNew(); } } function tabOpen() { var queryName = jQuery("#wpda_query_builder_open_select").find(":selected").text(); tabNew( queryName, jQuery("#wpda_query_builder_open_select").find(":selected").data("sql"), jQuery("#wpda_query_builder_open_select").find(":selected").data("dbs") ); closeQuery(); if (jQuery("#wpda_query_builder_open_select").find(":selected").data("vqb")==true) { // Restore Visual Query Builder getVisualQueryBuilder(tabIndex, queryName); } } function tabOpenAll() { jQuery("#wpda_query_builder_open_select option").each( function() { tabNew( jQuery(this).text(), jQuery(this).data("sql"), jQuery(this).data("dbs") ); closeQuery(); } ); } function showData(activeIndex, msg) { if ( msg.tabs.length > 0 ) { // Multiple SQL commands jQuery("#wpda_query_builder_result_" + activeIndex).html(''); showTabs(activeIndex, msg); } else { // Single SQL command jQuery("#wpda_query_builder_tabs_" + activeIndex).empty().hide(); showRows(activeIndex, msg); } } function queryTabClose(activeIndex, tabIndex) { jQuery("li#litab" + activeIndex + "-" + tabIndex).remove(); jQuery("div#tab" + activeIndex + "-" + tabIndex).remove(); var li = jQuery("div#tabs" + activeIndex + " ul li")[0].id; jQuery("#" + li).find("a").click(); } function showTabs(activeIndex, msg) { var ul = jQuery("