0.0.12 • Published 8 years ago
rethinkdb-datatables v0.0.12
rethinkdb-datatables
A Node.js RethinkDB query builder to be consumed by datatables.
Install
npm install rethinkdb-datatables
Quick start
server-side
var r = require('rethinkdb');
var queryBuilder = require('rethinkdb-datatables');
//Note: if you need to filter, don't use r.row here
//because this query will be nested when counting total records
var tableSelectionQuery = r.db('test').table('example');
var options = {
searchable: ['id', 'stringField', 'arrayField'],
pluckable: ['id', 'stringField', 'arrayField', 'timestamp'],
//primaryKey will then be used as the <td> row id in your html table by datatables
primaryKey: 'someOtherKey',
regexCaseSensitive: true
};
var defaultOptions = {
searchable: '<This will be built based on your initDatatables columns option>',
pluckable: '<This will be built based on your initDatatables columns option>',
primaryKey: 'id',
regexCaseSensitive: false
};
//No need for redundant try-catch anymore
queryBuilder.buildDataTablesQuery(paramsFromDataTables, r, tableSelectionQuery, options, function(err, preparedQuery) {
if (err) return cb(err);
r.connect({host: 'localhost'; port: 28015}, function(err, conn) {
//You may have to pass arrayLimit within run if you have > 100k documents
preparedQuery.run(conn, function(err, result) {
conn.close();
//Send response back depending on your framework i.e:
res.send(200, res);
});
});
});
client-side
index.html
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='utf-8'>
</head>
<body>
<div>
<table id='target-table'>
<thead>
<tr>
<th>ID</th>
<th>String</th>
<th>Array</th>
<th>Time</th>
</tr>
</thead>
<tfoot>
<tr>
<th>ID</th>
<th>String</th>
<th>Array</th>
<th>Time</th>
</tr>
</tfoot>
<tbody>
</tbody>
</table>
</div>
<!-- jQuery -->
<script type='text/javascript' src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.0/jquery.min.js'></script>
<!-- Datatables -->
<script type='text/javascript' src='https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.12/js/jquery.dataTables.min.js'></script>
<!-- Moment.js -->
<script type='text/javascript' src='https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.14.1/moment.js'></script>
</body>
</html>
index.js
$(document).ready(function() {
initDatatables();
});
function initDatatables() {
var oTable = $('#target-table').DataTable({
serverSide: true,
ajax: {
url: '<YOUR_API_URL>',
type: 'POST',
dataType: 'json'
},
columns: [
{data: 'id', orderable: true, searchable: true, name: 'id'},
{data: 'stringField', orderable: true, searchable: true, name: 'stringField'},
{data: 'arrayField', orderable: false, searchable: true, name: 'arrayField'},
{data: 'timestamp', orderable: true, searchable: false, name: 'timestamp'}
],
columnDef: [
{
targets: [2],//arrayField
render: function (data, type, row) {
var arrayString = '';
data.forEach(function(each) {
arrayString += each + ', ';
});
return arrayString;
}
}, {
targets: [3],//timestamp
render: function (data, type, row) {
return moment(data).format('YYYY-MM-DD HH:mm');
},
width: '12%'
}
],
order: [
[0, 'desc']
],
deferRender: true,
search: {
regex: true
}
});
}