diff --git a/static/index.html b/static/index.html index 3f1a57339..fae030114 100644 --- a/static/index.html +++ b/static/index.html @@ -339,6 +339,8 @@

SSH Connection

diff --git a/static/js/app.js b/static/js/app.js index 7347c5568..d2cc3aee6 100644 --- a/static/js/app.js +++ b/static/js/app.js @@ -454,7 +454,7 @@ function buildTable(results, sortColumn, sortOrder, options) { // Add all actual row data here for (i in row) { - r += "
" + escapeHtml(row[i]) + "
"; + r += "
" + escapeHtml(row[i]) + "
"; } // Add row action button @@ -1222,6 +1222,15 @@ function bindTableHeaderMenu() { var isEmpty = $("#results").hasClass("empty"); var isAllowed = browseMode == "browse" || browseMode == "query"; + if ( browseMode == 'browse' ){ + $('.dropdown-menu li a[data-action="copy_as_insert"]').show(); + $('.dropdown-menu li a[data-action="copy_as_update"]').show(); + } else { + $('.dropdown-menu li a[data-action="copy_as_insert"]').hide(); + $('.dropdown-menu li a[data-action="copy_as_update"]').hide(); + } + + if (isEmpty || !isAllowed) { e.preventDefault(); this.closemenu(); @@ -1232,6 +1241,12 @@ function bindTableHeaderMenu() { var menuItem = $(e.target); switch(menuItem.data("action")) { + case "copy_as_insert": + copyAsInsert(context); + break; + case "copy_as_update": + copyAsUpdate(context); + break; case "display_value": var value = $(context).text(); $("#content_modal .content").text(value); @@ -1254,6 +1269,81 @@ function bindTableHeaderMenu() { }); } +function copyAsInsert(context){ + var values = getValuesFromContext(context); + var columns = getColumnsFromResults(); + var tableName = $("#results").data("table"); + if(tableName === undefined){ + alert('table must be selected.'); + return; + } + var str = "INSERT INTO "+tableName+"("+columns.join(',')+") VALUES("+values.map(function(o){return o.value}).join(",")+")"; + copyToClipboard(str); +} + +function copyAsUpdate(context){ + var values = getValuesFromContext(context); + var columns = getColumnsFromResults(); + var tableName = $("#results").data("table"); + if(tableName === undefined){ + alert('table must be selected.'); + return; + } + var where = []; + var set = []; + columns.forEach(function(row, index){ + var val = values[index]; + set.push(row+"="+val.value); + if(val.isNull){ + where.push(row+" IS "+val.value); + return; + } + where.push(row+"="+val.value); + }) + var str = "UPDATE "+tableName+" SET "+set.join(',')+' WHERE '+ where.join(' AND '); + copyToClipboard(str); +} + +function getColumnsFromResults(){ + let columns = []; + $("#results_header th").each(function(){ + columns.push(this.innerText); + }) + return columns; +} + +function getValuesFromContext(context){ + let values = []; + $(context).parent().children().each(function(){ + const isNull = $(this).find("span[class*='null']").length; + const fieldType = this.dataset["type"] ?? "string"; + let obj = {isNull:false, value:''}; + if (isNull){ + obj.isNull = true; + obj.value = 'NULL'; + values.push(obj); + return; + } + switch (fieldType) { + case 'string': + obj.value = "'"+this.innerText+"'"; + values.push(obj); + break; + case 'number': + case 'boolean': + obj.value = this.innerText; + values.push(obj); + break; + default: + obj.value = this.innerText; + values.push(obj); + break; + + } + }) + return values; +} + function bindCurrentDatabaseMenu() { $("#current_database").contextmenu({ target: "#current_database_context_menu",