Skip to content

Commit a5278c6

Browse files
author
Vinayaga Sundar
committed
feat : added option to basic insert data from UI instead of Query
1 parent 35042b6 commit a5278c6

5 files changed

Lines changed: 231 additions & 21 deletions

File tree

debug-db/src/main/assets/app.js

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,10 @@ function inflateData(result){
163163
select: 'single',
164164
altEditor: true, // Enable altEditor
165165
buttons: [
166+
{
167+
text : 'Add',
168+
name : 'add' // don not change name
169+
},
166170
{
167171
extend: 'selected', // Bind to Selected row
168172
text: 'Edit',
@@ -208,6 +212,24 @@ function inflateData(result){
208212
deleteTableData(data, callback);
209213
});
210214

215+
216+
217+
$(tableId).on('add-row.dt', function (e, updatedRowData, callback) {
218+
var deleteRowDataArray = JSON.parse(updatedRowData);
219+
220+
console.log(deleteRowDataArray);
221+
222+
//add value for each column
223+
var data = columnHeader;
224+
for(var i = 0; i < data.length; i++) {
225+
data[i].value = deleteRowDataArray[i].value;
226+
data[i].dataType = deleteRowDataArray[i].dataType;
227+
}
228+
229+
//send delete table data request to server
230+
addTableData(data, callback);
231+
});
232+
211233
// hack to fix alignment issue when scrollX is enabled
212234
$(".dataTables_scrollHeadInner").css({"width":"100%"});
213235
$(".table ").css({"width":"100%"});
@@ -272,8 +294,6 @@ function deleteTableData(deleteData, callback) {
272294
}
273295
});
274296

275-
console.log(filteredUpdatedData);
276-
277297
//build request parameters
278298
var requestParameters = {};
279299
requestParameters.dbName = selectedTableElement.attr('data-db-name');
@@ -299,6 +319,47 @@ function deleteTableData(deleteData, callback) {
299319
})
300320
}
301321

322+
function addTableData(deleteData, callback) {
323+
324+
var selectedTableElement = $("#table-list .list-group-item.selected");
325+
var filteredUpdatedData = deleteData.map(function(columnData){
326+
return {
327+
title: columnData.title,
328+
isPrimary: columnData.isPrimary,
329+
value: columnData.value,
330+
dataType: columnData.dataType
331+
}
332+
});
333+
334+
console.log(filteredUpdatedData);
335+
336+
//build request parameters
337+
var requestParameters = {};
338+
requestParameters.dbName = selectedTableElement.attr('data-db-name');
339+
requestParameters.tableName = selectedTableElement.attr('data-table-name');;
340+
requestParameters.addData = encodeURIComponent(JSON.stringify(filteredUpdatedData));
341+
342+
console.log(requestParameters);
343+
344+
//execute request
345+
$.ajax({
346+
url: "addTableData",
347+
type: 'GET',
348+
data: requestParameters,
349+
success: function(response) {
350+
response = JSON.parse(response);
351+
if(response.isSuccessful){
352+
console.log("Data Added successfully");
353+
callback(true);
354+
showSuccessInfo("Data Added Successfully");
355+
} else {
356+
console.log("Data Adding failed");
357+
callback(false);
358+
}
359+
}
360+
});
361+
}
362+
302363
function showSuccessInfo(message){
303364
var snackbarId = "snackbar";
304365
var snackbarElement = $("#"+snackbarId);

debug-db/src/main/assets/dataTables.altEditor.free.js

Lines changed: 100 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -518,20 +518,60 @@
518518

519519
for (var i = 0; i < dt.context[0].aoColumns.length; i++) {
520520
columnDefs.push({
521-
title: dt.context[0].aoColumns[i].sTitle
521+
title: dt.context[0].aoColumns[i].sTitle,
522+
dataType: dt.context[0].aoColumns[i].sType,
523+
isPrimary: dt.context[0].aoColumns[i].isPrimary,
524+
value : "",
522525
})
523526
}
524527

525528

526-
var data = "";
527-
528-
data += "<form name='altEditor-form' role='form'>";
529-
530-
for (var j in columnDefs) {
531-
data += "<div class='form-group'><div class='col-sm-3 col-md-3 col-lg-3 text-right' style='padding-top:7px;'><label for='" + columnDefs[j].title + "'>" + columnDefs[j].title + ":</label></div><div class='col-sm-9 col-md-9 col-lg-9'><input type='text' id='" + columnDefs[j].title + "' name='" + columnDefs[j].title + "' placeholder='" + columnDefs[j].title + "' style='overflow:hidden' class='form-control form-control-sm' value=''></div><div style='clear:both;'></div></div>";
532-
533-
}
534-
data += "</form>";
529+
var data = "";
530+
531+
data += "<form class='form-horizontal' name='altEditor-form' role='form'>";
532+
533+
for (var j in columnDefs) {
534+
var inputSectionHTML = "<div class='form-group'><label for='__INPUT_NAME__' class='col-sm-4 control-label'>__INPUT_NAME__</label>__INPUT_HTML__</div>";
535+
536+
var inputHTML = "<div class='col-sm-7'><input data-type='__INPUT_DATA_TYPE__' __INPUT_READ_ONLY_ATTRIBUTE__ type='__INPUT_TYPE__' id='__INPUT_NAME__' name='__INPUT_NAME__' placeholder='__INPUT_NAME__' style='overflow:hidden' class='form-control' value='__INPUT_VALUE__'></div>";
537+
538+
var option1Checked = "";
539+
var option2Checked = "checked";
540+
if (columnDefs[j].dataType == "boolean") {
541+
if(JSON.parse(columnDefs[j].value)) {
542+
option1Checked = "checked";
543+
option2Checked = "";
544+
}
545+
inputHTML = "<div class='col-sm-7'><div class='checkbox'><label><label class='radio-inline'><input data-type='__INPUT_DATA_TYPE__' __OPTION_1_CHECKED__ type='radio' name='__INPUT_NAME__' id='__INPUT_NAME__' value='1'>true</label><label class='radio-inline'><input data-type='__INPUT_DATA_TYPE__' __OPTION_2_CHECKED__ type='radio' name='__INPUT_NAME__' id='__INPUT_NAME__' value='0'>false</label></div></div>"
546+
}
547+
//set input type
548+
var inputType = "text";
549+
var inputReadOnlyAttribute = "";
550+
switch (columnDefs[j].dataType) {
551+
case 'num':
552+
inputType = "number";
553+
break;
554+
case 'string':
555+
inputType = "text";
556+
break;
557+
}
558+
//set input to read-only if it is a primary key
559+
// if (columnDefs[j].isPrimary) {
560+
// inputReadOnlyAttribute = "readonly"
561+
// }
562+
563+
//append input html
564+
inputSectionHTML = inputSectionHTML.replace(/__INPUT_HTML__/g, inputHTML);
565+
inputSectionHTML = inputSectionHTML.replace(/__INPUT_READ_ONLY_ATTRIBUTE__/g, inputReadOnlyAttribute);
566+
inputSectionHTML = inputSectionHTML.replace(/__INPUT_TYPE__/g, inputType);
567+
inputSectionHTML = inputSectionHTML.replace(/__INPUT_DATA_TYPE__/g, columnDefs[j].dataType);
568+
inputSectionHTML = inputSectionHTML.replace(/__INPUT_VALUE__/g, columnDefs[j].value);
569+
inputSectionHTML = inputSectionHTML.replace(/__INPUT_NAME__/g, columnDefs[j].title);
570+
inputSectionHTML = inputSectionHTML.replace(/__OPTION_1_CHECKED__/g, option1Checked);
571+
inputSectionHTML = inputSectionHTML.replace(/__OPTION_2_CHECKED__/g, option2Checked);
572+
data += inputSectionHTML;
573+
}
574+
data += "</form>";
535575

536576

537577
$('#altEditor-modal').on('show.bs.modal', function() {
@@ -553,19 +593,62 @@
553593
var data = [];
554594

555595
$('form[name="altEditor-form"] input').each(function(i) {
556-
data.push($(this).val());
596+
var addToList = true;
597+
var value = $(this).val();
598+
if($(this).attr('type') == "radio" && $(this).prop('checked') == false) {
599+
addToList = false;
600+
}
601+
value = $(this).attr('type') == "radio" ? $(this).val() == "1" : value;
602+
if (addToList){
603+
data.push({
604+
"value": value,
605+
"dataType": $(this).attr('data-type')
606+
});
607+
}
557608
});
609+
var editButtonCurrentText = $("#editRowBtn").text();
610+
$("#addRowBtn").addClass('disabled');
611+
$("#addRowBtn").text("Saving..");
558612

559-
$('#altEditor-modal .modal-body .alert').remove();
613+
console.log(JSON.stringify(data));
560614

561-
var message = '<div class="alert alert-success" role="alert">\
562-
<strong>Success!</strong> This record has been added.\
563-
</div>';
615+
that._emitEvent("add-row", [
616+
JSON.stringify(data),
617+
function(isAdded) {
564618

565-
$('#altEditor-modal .modal-body').append(message);
566619

567-
dt.row.add(data).draw(false);
620+
//set error message and other properties based on whether update is successfull or not
621+
var alertAdditionClasses = "alert-success";
622+
var alertMessage = "This record has been added";
623+
var alertHeading = "Success";
624+
if (!isAdded) {
625+
alertAdditionClasses = "alert-danger";
626+
alertMessage = "Error occurred while adding this record";
627+
alertHeading = "Error";
628+
}
629+
630+
//create alert element html and append it to modal
631+
var messageHTML = '\
632+
<div class="alert __ALERT_ADDITION_CLASSES__" role="alert">\
633+
<strong>__ALERT_HEADING__!</strong>\
634+
__ALERT_MESSAGE__.\
635+
</div>\
636+
';
637+
messageHTML = messageHTML.replace(/__ALERT_ADDITION_CLASSES__/g, alertAdditionClasses);
638+
messageHTML = messageHTML.replace(/__ALERT_HEADING__/g, alertHeading);
639+
messageHTML = messageHTML.replace(/__ALERT_MESSAGE__/g, alertMessage);
640+
$('#altEditor-modal .modal-body').append(messageHTML);
568641

642+
//update datatable, if update is successfull
643+
if (isAdded) {
644+
dt.row().data(data);
645+
//remove existing alert elements
646+
$('#altEditor-modal').modal('hide');
647+
}
648+
$("#addRowBtn").removeClass('disabled');
649+
$("#addRowBtn").text(editButtonCurrentText);
650+
}
651+
]);
569652
},
570653

571654
_getExecutionLocationFolder: function() {

debug-db/src/main/java/com/amitshekhar/server/RequestHandler.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ public void handle(Socket socket) throws IOException {
104104
} else if (route.startsWith("getTableList")) {
105105
final String response = getTableListResponse(route);
106106
bytes = response.getBytes();
107+
} else if (route.startsWith("addTableData")) {
108+
final String response = addTableDataAndGetResponse(route);
109+
bytes = response.getBytes();
107110
} else if (route.startsWith("updateTableData")) {
108111
final String response = updateTableDataAndGetResponse(route);
109112
bytes = response.getBytes();
@@ -260,6 +263,29 @@ private String getTableListResponse(String route) {
260263
return mGson.toJson(response);
261264
}
262265

266+
267+
private String addTableDataAndGetResponse(String route) {
268+
UpdateRowResponse response;
269+
try {
270+
Uri uri = Uri.parse(URLDecoder.decode(route, "UTF-8"));
271+
String tableName = uri.getQueryParameter("tableName");
272+
String updatedData = uri.getQueryParameter("addData");
273+
List<RowDataRequest> rowDataRequests = mGson.fromJson(updatedData, new TypeToken<List<RowDataRequest>>() {
274+
}.getType());
275+
if (Constants.APP_SHARED_PREFERENCES.equals(mSelectedDatabase)) {
276+
response = PrefHelper.addOrUpdateRow(mContext, tableName, rowDataRequests);
277+
} else {
278+
response = DatabaseHelper.addRow(mDatabase, tableName, rowDataRequests);
279+
}
280+
return mGson.toJson(response);
281+
} catch (Exception e) {
282+
e.printStackTrace();
283+
response = new UpdateRowResponse();
284+
response.isSuccessful = false;
285+
return mGson.toJson(response);
286+
}
287+
}
288+
263289
private String updateTableDataAndGetResponse(String route) {
264290
UpdateRowResponse response;
265291
try {
@@ -269,7 +295,7 @@ private String updateTableDataAndGetResponse(String route) {
269295
List<RowDataRequest> rowDataRequests = mGson.fromJson(updatedData, new TypeToken<List<RowDataRequest>>() {
270296
}.getType());
271297
if (Constants.APP_SHARED_PREFERENCES.equals(mSelectedDatabase)) {
272-
response = PrefHelper.updateRow(mContext, tableName, rowDataRequests);
298+
response = PrefHelper.addOrUpdateRow(mContext, tableName, rowDataRequests);
273299
} else {
274300
response = DatabaseHelper.updateRow(mDatabase, tableName, rowDataRequests);
275301
}

debug-db/src/main/java/com/amitshekhar/utils/DatabaseHelper.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,46 @@ private static List<TableDataResponse.TableInfo> getTableInfo(SQLiteDatabase db,
190190
return null;
191191
}
192192

193+
194+
public static UpdateRowResponse addRow(SQLiteDatabase db, String tableName,
195+
List<RowDataRequest> rowDataRequests) {
196+
UpdateRowResponse updateRowResponse = new UpdateRowResponse();
197+
198+
if (rowDataRequests == null || tableName == null) {
199+
updateRowResponse.isSuccessful = false;
200+
return updateRowResponse;
201+
}
202+
203+
ContentValues contentValues = new ContentValues();
204+
205+
for (RowDataRequest rowDataRequest : rowDataRequests) {
206+
if (Constants.NULL.equals(rowDataRequest.value)) {
207+
rowDataRequest.value = null;
208+
}
209+
210+
switch (rowDataRequest.dataType) {
211+
case DataType.INTEGER:
212+
contentValues.put(rowDataRequest.title, Long.valueOf(rowDataRequest.value));
213+
break;
214+
case DataType.REAL:
215+
contentValues.put(rowDataRequest.title, Double.valueOf(rowDataRequest.value));
216+
break;
217+
case DataType.TEXT:
218+
contentValues.put(rowDataRequest.title, rowDataRequest.value);
219+
break;
220+
default:
221+
contentValues.put(rowDataRequest.title, rowDataRequest.value);
222+
break;
223+
}
224+
}
225+
226+
db.insert(tableName, null, contentValues);
227+
updateRowResponse.isSuccessful = true;
228+
return updateRowResponse;
229+
230+
}
231+
232+
193233
public static UpdateRowResponse updateRow(SQLiteDatabase db, String tableName, List<RowDataRequest> rowDataRequests) {
194234

195235
UpdateRowResponse updateRowResponse = new UpdateRowResponse();

debug-db/src/main/java/com/amitshekhar/utils/PrefHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public static TableDataResponse getAllPrefData(Context context, String tag) {
141141

142142
}
143143

144-
public static UpdateRowResponse updateRow(Context context, String tableName, List<RowDataRequest> rowDataRequests) {
144+
public static UpdateRowResponse addOrUpdateRow(Context context, String tableName, List<RowDataRequest> rowDataRequests) {
145145
UpdateRowResponse updateRowResponse = new UpdateRowResponse();
146146

147147
if (tableName == null) {

0 commit comments

Comments
 (0)