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",