i want to show data from API into datatable using AJAX Request, this is my API response:
{
"title": "success",
"data": {
"name": "yogi",
"email": "yogi#gmail.com",
"activity": [
{
"name": "pergi"
},
{
"name": "belanja"
},
{
"name": "makan"
},
{
"name": "tidur"
}
]
}
}
and this is my datatable script:
$(document).ready(function () {
$("#activity-list").DataTable({
processing: true,
serverSide: true,
ajax: {
url: `${baseurl}/api/user/${user_id}/activity`,
dataSrc: function (json) {
let results = [];
for (let i = 0; i < json.data.activity.length; i++) {
results.push({
name: json.data.name,
email: json.data.email,
activity: json.data.activity[i].name,
});
}
return results;
},
},
});
});
why the data doesn't appear, instead i got error message?
The only thing you are missing is the columns option, which maps your results array to the HTML table's columns:
$("#activity-list").DataTable({
processing: true,
serverSide: true,
columns: [
{ data: "name" },
{ data: "email" },
{ data: "activity" }
],
ajax: {
url: '[my test URL here]',
dataSrc: function (json) {
let results = [];
for (let i = 0; i < json.data.activity.length; i++) {
results.push({
name: json.data.name,
email: json.data.email,
activity: json.data.activity[i].name,
});
}
return results;
}
}
});
This assumes you have a HTML table defined which already has the column headers you want to display:
<table id="activity-list" class="display dataTable cell-border" style="width:100%">
<thead>
<tr>
<th>Name</th>
<th>Email</th>
<th>Activity</th>
</tr>
</thead>
</table>
(Or, you could add those headings to the DataTables columns option using title, if you prefer.)
Related
I have a dataTables table which its data is loaded by ajax call. Each row has 5 columns. The configuration is as follow:
<table id="table" class="table table-bordered table-hover" style="width: 100%">
<thead>
<tr>
<th>#Html.DisplayNameFor(model => model.FirstName)</th>
<th>#Html.DisplayNameFor(model => model.LastName)</th>
<th>#Html.DisplayNameFor(model => model.PersonnelId)</th>
<th>#Html.DisplayNameFor(model => model.NationalId)</th>
<th>#Html.DisplayNameFor(model => model.Companies)</th>
<th>Operations</th>
</tr>
</thead>
</table>
for initialization i use:
var table = $('.table').DataTable({
"proccessing": true,
"serverSide": true,
"ajax": {
url: "server_api.php",
type: 'POST'
},
"columns": [
{ "data": "FirstName" },
{ "data": "LastName" },
{ "data": "PersonnelId" },
{ "data": "NationalId" },
{ "data": "Companies" }
]
});
Considering each row has an Id, how can i add Delete / Edit for each row in the operations column?
I solved the problem. To add data to an additional column you need to
add a column when initializing and
fill the column cell in the rowCallback function.
The code is:
var table = $('.table')
.DataTable({
"proccessing": true,
"serverSide": true,
"ajax": {
url: "server_api.php",
type: 'POST'
},
"columns": [
{ "data": "FirstName" },
{ "data": "LastName" },
{ "data": "PersonnelId" },
{ "data": "NationalId" },
{ "data": "Companies" },
{ "render" : function() {return ""; }
],
"rowCallback": function (row, data) {
var additionalColIdx = 5; // Index of new column
$(`td:eq({additionalColIdx})`, row).html("Edit" + " / " +
"Delete");
}
});
I'm trying to initialise a datatable using an object array located in the DOM
I have simple datatable initialisation code:
$(document).ready(function () {
$('#ManageSubReps').DataTable({
data: GetSRData(),
columns: [
{ "data": "username" },
{ "data": "AspNetUserRoleName" },
{ "data": "Name" },
{ "data": "Address" },
{ "data": "City" },
{ "data": "State" },
{ "data": "Zip" },
{ "data": "EmailAddress" },
{ "data": "HomePhone" },
{ "data": "CellPhone" },
{ "data": "New_Rep" },
{ "data": "Stand_By" },
{ "data": "DateApproved" },
{ "data": "AspNetUserID" }
]
});
});
My GetSRData function looks like this:
function GetSRData() {
return #Html.Raw(Model.JsonData)
}
My server side code looks like this:
public ActionResult ManagerSubReps(){
var model = new ManageSubRepsViewModel();
model.JsonData = JsonConvert.SerializeObject(new {data = _iManageSubRepsManager.GetSubRepsAsync(Session["CID"])});
return View(model);
}
A snipped of my data looks like this:
{"data":[{"username":"01001MC","MASTER":null,"Name":"A name","Address":"105 Address Dr.","City":"Agawam","State":"MA","Zip":"89898","EmailAddress":"blerb#yahoo.com","HomePhone":"","CellPhone":"8767878767","New_Rep":"False","Stand_By":"False","DateApproved":null,"AspNetUserID":null,"AspNetUserRoleName":null},{"username":"01002RG","MASTER":"False","Name":"Blooby palooby","Address":"7 Eaton drive, gumbie#Gmail.Com","City":"Amherst","State":"MA","Zip":"35656","EmailAddress":"chumpy#GMAIL.COM","HomePhone":"","CellPhone":"8986786654","New_Rep":"False","Stand_By":"False","DateApproved":null,"AspNetUserID":null,"AspNetUserRoleName":null}]}
HTML:
<table id="ManageSubReps" class="compact display">
<thead>
<tr>
<th>Username</th>
<th>Role</th>
<th class="dt-left">Name</th>
<th class="dt-left">Address</th>
<th class="dt-left">City</th>
<th>State</th>
<th>Zip</th>
<th class="dt-left">Email</th>
<th>Home Phone</th>
<th>Cell Phone</th>
<th>New Rep</th>
<th>Stand By</th>
<th>Approved Date</th>
<th></th>
</tr>
</thead>
</table>
When I return my data and try to initiliase the datatable, two things can happen:
If I remove the "data" part of the Json object then datatales will render the datatables but will not have any data in
If I leave the "data" part of the Json object then datatables will give me the error: 'Request unknown parameter '0' for row 0, column 0'. Which basically means that it cannot distinguish the data and form the datatable with the data.
I have checked the column data and it matches perfectly fine. I cannot figure out what the issue is.
Can anyone help?
EDIT: I know the issue has something to do with the data being a string, as I call HTML.Raw() on it. However, Im unsure of how to pass the data from the model without this
try ajax instead of data & fully qualified url(controller/api method) for getting ajax data:
$(document).ready(function() {
$('#ManageSubReps').DataTable( {
"processing": true,
"serverSide": true,
"ajax": "ManagerSubReps",
columns: [
{ "data": "username" },
{ "data": "AspNetUserRoleName" },
{ "data": "Name" },
{ "data": "Address" },
{ "data": "City" },
{ "data": "State" },
{ "data": "Zip" },
{ "data": "EmailAddress" },
{ "data": "HomePhone" },
{ "data": "CellPhone" },
{ "data": "New_Rep" },
{ "data": "Stand_By" },
{ "data": "DateApproved" },
{ "data": "AspNetUserID" }
]
} );
} );
refer https://datatables.net/examples/server_side/object_data.html for more details.
Suppose I have the following json to display in my DataTable:
// JSON structure for each row in this example:
// {
// "engine": {value},
// "browser": {value},
// "platform": {value},
// "version": {value},
// "grade": {value}
// }
$('#example').dataTable( {
"ajaxSource": "sources/objects.txt",
"columns": [
{ "data": "engine" },
{ "data": "browser" },
{ "data": "platform" },
{ "data": "version" },
{ "data": "grade" }
]
} );
What I want is, Add an Index Column to this data table for number the row.
Something like this :
"columns": [
{"data" : "Index"}, <------- this should number my rows
{ "data": "engine" },
{ "data": "browser" },
{ "data": "platform" },
{ "data": "version" },
{ "data": "grade" }
]
Note: I don't have any Index as data passed in my Json(Although I can do that, is there any better solution to handle this in my Javascript itself? )
Help appreciated..!
Try this.
"render": function ( data, type, full, meta ) {
return meta.row + 1;
} },
The concept is that you have to create the initial "Index" values either in javascript or in the server. The values can be zero or just empty strings or whatever (there is no need to calculate a counter or something). For example you can create an index column in javascript after you have received the data:
for (var i=0; i<data.length; i++){
data[i].index = 0;
}
So now that you have the index column in your data you declare it as the first column of your table:
$('#example').dataTable( {
.....
"columns": [
{ "data": "index" },
{ "data": "engine" },
{ "data": "browser" },
{ "data": "platform" },
{ "data": "version" },
{ "data": "grade" }
]
} );
Now the index values are all 0. To create the real index values that will be shown in the table you need to add an event handler that listens to the ordering and searching of the table. On these events the real index values will be calculated as described in the
datatables example:
datatable_object.on( 'order.dt search.dt', function () {
datatable_object.column(0, {search:'applied', order:'applied'}).nodes().each( function (cell, i) {
cell.innerHTML = i+1;
} );
} ).draw();
When the table is searched or ordered (ordering is done by default when the table is created - see default value of the order option), the innerHtml of the "Index" cells will be calculated based on the index of the row.
Just add the code below to your datatables
{ 'data': 'id', defaultContent: '' },
"columnDefs": [ ////define column 1 , make searchable false
{
"searchable": false,
"orderable": false,
"targets": 0
},
Below is the updated code:
var table=$('#example').dataTable( {
"ajaxSource": "sources/objects.txt",
"columns": [
{ 'data': 'id', defaultContent: '' },
{ "data": "engine" },
{ "data": "browser" },
{ "data": "platform" },
{ "data": "version" },
{ "data": "grade" },
"columnDefs": [ ////define column 1
{
"searchable": false,
"orderable": false,
"targets": 0
},
]
});
And the following line will add number to your id(index) column:
if (t.data().length != 0) {
t.on('order.dt search.dt', function () {
t.column(0, { search: 'applied', order: 'applied' }).nodes().each(function (cell, i) {
cell.innerHTML = i + 1;
t.cell(cell).invalidate('dom');
});
}).draw();
Live example: http://live.datatables.net/woboviqi/2/edit
Need to use DT_RowIndex for indexing rows. Like this - ## Heading ##
"columns": [
{ "data": 'DT_RowIndex'}, // row index
{ "data": "engine" },
{ "data": "browser" },
{ "data": "platform" },
{ "data": "version" },
{ "data": "grade" }
]
You can use unshift()
"columns": [
{ "data": "engine" },
{ "data": "browser" },
{ "data": "platform" },
{ "data": "version" },
{ "data": "grade" }
].unshift({"data" : "Index"})
Or by using an temp array
var cols = [{
"data": "engine"
}, {
"data": "browser"
}, {
"data": "platform"
}, {
"data": "version"
}, {
"data": "grade"
}];
cols.unshift({
"data": "Index"
})
....
"columns": cols
Have a look on this URL: Data table Index column
It might help you.
Here is my code you can refer to:
My DataTable is complete custom.
I'm fetching data from the database using Ajax and CodeIgniter.
HTML
<table width="100%" class="table table-striped table-hover" id="table_id_dataTable">
<thead>
<tr>
<th>Sr No</th>
<th>Column 2</th>
<th>Column 3</th>
<th>Column 4</th>
<th>Column 5</th>
</tr>
</thead>
<tfoot>
<tr>
<th>Sr No</th>
<th>Column 2</th>
<th>Column 3</th>
<th>Column 4</th>
<th>Column 5</th>
</tr>
</tfoot>
<tbody>
</tbody>
</table>
JS Script
var temp_table = $('#table_id_of_dataTable').DataTable({
"language": {
"zeroRecords": "No records found."
},
"ajax": {
"type": "POST",
"url": "<?php echo base_url('Controller/method'); ?>"
},
"responsive": true,
"columnDefs": [
{
"searchable": false,
"orderable": false,
"targets": 0
}
],
"order": [
[1, 'asc']
],
"columns": [
{ "data": null }, // <-- This is will your index column
{ "data": "column_2_element_name_given_in_controller" },
{ "data": "column_3_element_name_given_in_controller" },
{ "data": "column_4_element_name_given_in_controller" },
{ "data": "column_5_element_name_given_in_controller" }
]
});
// Here we create the index column in jquery datatable
temp_table.on('order.dt search.dt', function() {
temp_nuggets_table.column(0, {
search: 'applied',
order: 'applied'
}).nodes().each(function(cell, i) {
cell.innerHTML = i + 1;
});
}).draw();
Hope it helps!
That is simple... This work for me.
Cell: function ( data, type, full, counter ) {
return data.index + 1
}
enter link description here
Try this:
var table=$('#example').dataTable( {
"ajaxSource": "sources/objects.txt",
"columns": [
{
"data": null, "render": function (data, type, full, meta) {
return meta.row + 1;
}
},
{ "data": "engine" },
{ "data": "browser" },
{ "data": "platform" },
{ "data": "version" },
{ "data": "grade" }
});
table.on('order.dt search.dt', function () {
table.column(0, { search: 'applied', order: 'applied' }).nodes().each(function (cell, i) {
cell.innerHTML = i + 1;
});
}).draw();
enter link description here
Try this:
var table=$('#example').dataTable( {
"ajaxSource": "sources/objects.txt",
"columns": [
{
"data": null, "render": function (data, type, full, meta) {
return meta.row + 1;
}
},
{ "data": "engine" },
{ "data": "browser" },
{ "data": "platform" },
{ "data": "version" },
{ "data": "grade" }
});
I'm trying to fill JQuery Datatable with data via ajax:
HTML
<table id="table-productMaterials">
<thead>
<tr>
<th>Id</th>
<th>Name</th>
<th>Quantity</th>
<th>Status</th>
</tr>
</thead>
</table>
Javascript
$(document).ready(function () {
var options = {
"processing": true,
"ajax": {
"url": "ProductMaterials.ashx?action=get",
"type": "POST",
"data": {
"productId": $('#product_id').val()
},
"columns": [
{ "data": "Id" },
{ "data": "MaterialName" },
{ "data": "Quantity" },
{ "data": "Status" }
]
},
};
table = $('#table-productMaterials').DataTable(options);
});
Generic handler output:
{"data": [{"Id":1,"Quantity":15.00,"Status":"1","MaterialName":"Iron","ProductName":"French onion soup"},{"Id":3,"Quantity":14.00,"Status":"1","MaterialName":"Nails","ProductName":"French onion soup"}]}
error message when reloading data:
DataTables warning: table id=table-productMaterials - Requested unknown parameter '0' for row 0. For more information about this error, please see http://datatables.net/tn/4
I refered to this page and read an example but can't seem to get this resolved. What I'm making wrong?
You have to place the columns property outside of the ajax property like this:
$(document).ready(function () {
var options = {
"processing": true,
"ajax": {
"url": "ProductMaterials.ashx?action=get",
"type": "POST",
"data": {
"productId": $('#product_id').val()
},
},
"columns": [
{ "data": "Id" },
{ "data": "MaterialName" },
{ "data": "Quantity" },
{ "data": "Status" }
]
};
table = $('#table-productMaterials').DataTable(options);
});
Then it will work.
I have this script bellow, what I'm looking for is to click on any row and alert the "DT_rowID" cell value. For the moment the error message is : Uncaught ReferenceError: table is not defined
$(document).ready(function() {
$("body").append('<table cellpadding="0" cellspacing="0" border="0" class="display" id="example"><tbody></tbody></table>');
var string_id = "http://127.0.0.1:8080/get_data_datatable.php?q=";
$.ajax({
url: 'http://127.0.0.1:8080/search.php?q=exosome',
dataType: 'json',
type: 'get',
async: true,
success: function(data) {
jQuery.each(data.ids, function(i, val) {
string_id = string_id + val + ",";
});
var table = $('#example').dataTable({
"ajax": string_id,
"columns": [{
"title": "Product name",
"data": "product_name"
}, {
"title": "Quantity",
"data": "product_quantity"
}, {
"title": "Price",
"data": "price_sell"
}, {
"title": "Currency",
"data": "currency_sell"
}, {
"title": "Category",
"data": "category"
}, {
"title": "Supplier",
"data": "supplier_id"
}, {
"title": "DT_rowID",
"data": "product_version_id",
"bVisible": false
}]
});
}
});
$("#example").css('cursor', 'hand');
$('#example').on('click', 'tr', function() {
alert(table.cell(this).data());
});
});
This will work as long as that column remains the last one in the table:
// Added 'tbody' to prevent alert from firing when header row is clicked
$('#example tbody').on('click', 'tr', function() {
// $(this) is the <tr> element the user clicked
// td:last finds the last cell within that <tr>
alert($(this).find('td:last').text());
});
jsFiddle: http://jsfiddle.net/th708qf9/1/