Added copy as insert and copy as update

Fixes #649
This commit is contained in:
Jonas Falck 2023-02-28 22:48:52 +01:00 committed by Jonas Falck
parent cf86131808
commit ab913bfac8
2 changed files with 93 additions and 1 deletions

View File

@ -339,6 +339,8 @@
<ul class="dropdown-menu" role="menu">
<li><a href="#" data-action="display_value">Display Value</a></li>
<li><a href="#" data-action="copy_value">Copy Value</a></li>
<li><a href="#" data-action="copy_as_insert">Copy row as INSERT</a></li>
<li><a href="#" data-action="copy_as_update">Copy row as UPDATE</a></li>
<li><a href="#" data-action="filter_by_value">Filter Rows By Value</a></li>
</ul>
</div>

View File

@ -454,7 +454,7 @@ function buildTable(results, sortColumn, sortOrder, options) {
// Add all actual row data here
for (i in row) {
r += "<td data-col='" + i + "'><div>" + escapeHtml(row[i]) + "</div></td>";
r += "<td data-type='"+ typeof row[i]+"' data-col='" + i + "'><div>" + escapeHtml(row[i]) + "</div></td>";
}
// 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",