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 = `
`;
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("");
for (var i=0; i ", { "id": "litab" + activeIndex + "-" + i })
.append(jQuery(" ", { "href": "#tab" + activeIndex + "-" + i, "title": sql, "class": "wpda_tooltip" })
.html(" " + (i+1) + ". sql cmd ")));
}
var tabs = jQuery("
", { "id": "tabs" + activeIndex }).append(ul);
for (var i=0; i ", { "id": "tab" + activeIndex + "-" + i, "style": "display:"+style })
.append(tabResultDiv));
}
jQuery("#wpda_query_builder_tabs_" + activeIndex).empty().append(tabs);
jQuery("#wpda_query_builder_tabs_" + activeIndex).show();
for (var i=0; iDone');
} else {
if (msg.status === null || msg.status === undefined) {
jQuery("#wpda_query_builder_result_" + activeIndex).html("WP Data Access error: Query failed");
} else {
if (msg.status.last_result === null || msg.status.last_result === undefined) {
if (typeof msg.status !== "string") {
jQuery("#wpda_query_builder_result_" + activeIndex).html("WP Data Access error: Query OK");
} else {
jQuery("#wpda_query_builder_result_" + activeIndex).html(msg.status);
}
} else {
if (msg.status.last_error === "") {
if (msg.status.last_result.length > 0) {
rows = msg.status.last_result;
first_row = rows[0];
header = "";
for (var col in first_row) {
header += "" + col + " ";
}
header += " ";
body = "";
for (var i = 0; i < rows.length; i++) {
body += "";
for (var col in rows[i]) {
let columnClassName = "";
if (msg.columns === null || msg.columns === undefined) {
// No data type available
} else {
columnClassName = "wpda_data_type_" + getColumnDataType(msg.columns, col);
}
if (rows[i][col] === null) {
columnClassName += " wpda_data_value_null";
}
body +=
"" +
jQuery("").text(rows[i][col]).html() +
" ";
}
body += " ";
}
table =
jQuery('')
.append(jQuery(' ').append(header))
.append(jQuery(' ').append(body));
jQuery("#wpda_query_builder_menubar_" + activeIndex).show();
jQuery("#wpda_query_builder_result_" + activeIndex).html(table);
rowLabel = rows.length === 1 ? "row" : "rows";
html = rows.length + " " + rowLabel;
if (msg.status.queries !== null) {
html += " (" + msg.status.queries[msg.status.num_queries - 1][1].toFixed(5) + " sec)";
}
jQuery("#wpda_query_builder_statusbar_" + activeIndex + " span.wpda_query_builder_statusbar_message").html(
html
);
jQuery("#wpda_query_builder_statusbar_" + activeIndex).show();
jQuery("#wpda_query_builder_json_" + activeIndex).jsonViewer(msg.status);
jQuery("#wpda_query_builder_json_" + activeIndex + " ul li a.json-toggle").click();
setResultDivHeight(activeIndex);
} else {
rowLabel = msg.status.rows_affected === 1 ? "row" : "rows";
html = "Query OK, " + msg.status.rows_affected + " " + rowLabel + " affected";
if (msg.status.queries !== null) {
html += " (" + msg.status.queries[msg.status.num_queries - 1][1].toFixed(5) + " sec)"
}
jQuery("#wpda_query_builder_menubar_" + activeIndex).hide();
jQuery("#wpda_query_builder_result_" + activeIndex).html("");
jQuery("#wpda_query_builder_statusbar_" + activeIndex + " span.wpda_query_builder_statusbar_message").html(html);
jQuery("#wpda_query_builder_statusbar_" + activeIndex).show();
jQuery("#wpda_query_builder_json_" + activeIndex).jsonViewer(msg.status);
jQuery("#wpda_query_builder_json_" + activeIndex + " ul li a.json-toggle").click();
}
} else {
error = `WordPress database error: ${msg.status.last_error}${msg.status.last_query}`;
jQuery("#wpda_query_builder_result_" + activeIndex).html(error);
}
}
}
}
}
function getColumnDataType(columns, columnName) {
for (let i=0; i ", {
value: queryName,
text: queryName
})
.attr("data-dbs", msg.data[queryName].schema_name)
.attr("data-sql", msg.data[queryName].query)
.attr("data-vqb", msg.data[queryName].is_visual === true)
);
}
}
jQuery("#wpda_query_builder_open_select").attr("disabled", false);
jQuery("#wpda_query_builder_open_open").attr("disabled", false);
jQuery("#wpda_query_builder_open_openall").attr("disabled", false);
jQuery("#wpda_query_builder_open_delete").attr("disabled", false);
} else {
jQuery("#wpda_query_builder_open_select")
.append(
jQuery(" ", {
value: "",
text: "Nothing found..."
})
);
jQuery("#wpda_query_builder_open_select").attr("disabled", true);
jQuery("#wpda_query_builder_open_open").attr("disabled", true);
jQuery("#wpda_query_builder_open_openall").attr("disabled", true);
jQuery("#wpda_query_builder_open_delete").attr("disabled", true);
}
}
).fail(
function (msg) {
console.log("ERROR");
console.log(msg);
}
);
jQuery("#wpda_query_builder_open").show();
}
function closeQuery() {
jQuery("#wpda_query_builder_open").hide();
}
function deleteQuery() {
if ( confirm("Delete query? This action cannot be undone!") ) {
wpda_sqlqueryname = jQuery("#wpda_query_builder_open_select").find(":selected").text();
jQuery.ajax({
method: 'POST',
url: wpda_home_url + "?action=wpda_query_builder_delete_sql",
data: {
wpda_wpnonce: wpda_wpnonce,
wpda_sqlqueryname: wpda_sqlqueryname
}
}).done(
function (msg) {
closeQuery();
}
).fail(
function (msg) {
console.log(msg);
}
);
}
}
function exportTable(exportType, tabIndex) {
switch (exportType) {
case "CSV":
downloadCSV(
jQuery("#wpda_query_builder_result_" + tabIndex + " table").html(),
jQuery("#wpda_query_builder_label_value_" + tabIndex).text() + ".csv"
);
break;
case "JSON":
downloadJSON(
jQuery("#wpda_query_builder_result_" + tabIndex + " table").html(),
jQuery("#wpda_query_builder_label_value_" + tabIndex).text() + ".json"
);
break;
case "XML":
downloadXML(
jQuery("#wpda_query_builder_result_" + tabIndex + " table").html(),
jQuery("#wpda_query_builder_label_value_" + tabIndex).text() + ".xml"
);
}
}
function downloadCSV(html, fileName) {
csv = [];
rows = jQuery(html).find("tr");
for (i=0; i");
for (i=0; i");
for (j=0; j ").text(bodyCols[j].innerText));
}
table.append(row);
}
xml = jQuery(" ").append(table);
return jQuery.parseXML(xml[0].outerHTML);
}
function downloadJSON(html, fileName) {
xmlDoc = createXML(html, fileName);
json = jQuery.xml2json(new XMLSerializer().serializeToString(xmlDoc.documentElement));
downloadExport(fileName, "text/json", JSON.stringify(json));
}
function downloadXML(html, fileName) {
xmlDoc = createXML(html, fileName);
downloadExport(fileName, "text/xml", new XMLSerializer().serializeToString(xmlDoc.documentElement));
}
function downloadExport(fileName, mimeType, content) {
download = jQuery(" ", {
href: "data:" + mimeType + ";charset=utf-8," + content,
download: fileName
}).appendTo('body');
download[0].click();
download.remove();
}
function unsavedChanges() {
hasEdited = false;
for (var tabindex in isChanged) {
if (isChanged[tabindex]===true) {
hasEdited = true;
}
}
return hasEdited;
}
jQuery(window).on('keydown', function(event) {
if ((event.ctrlKey || event.metaKey) && String.fromCharCode(event.which).toLowerCase()==='s') {
if (jQuery(event.target).hasClass('CodeMirror-code')) {
saveQuery(jQuery(event.target).closest(".wpda_query_builder").data("id"))
event.preventDefault();
}
}
});
jQuery(window).on('beforeunload', function() {
if (unsavedChanges()) {
return 'Your changes will not be saved! Are you sure you want to leave this page?';
}
});