Added support for Datatables

Added support for ajax-based server side validation (useful for validation of emails, duplicate usernames, etc.)
User form more or less ready in the basic version (i.e. without permission management)
This commit is contained in:
Tomas Bures 2017-06-21 02:14:14 +02:00
parent f776170854
commit c81f5544e6
26 changed files with 1097 additions and 167 deletions

54
lib/dt-helpers.js Normal file
View file

@ -0,0 +1,54 @@
'use strict';
const knex = require('../lib/knex');
async function ajaxList(params, queryFun, columns) {
return await knex.transaction(async (tx) => {
const query = queryFun(tx);
const recordsTotalQuery = query.clone().count('* as recordsTotal').first();
const recordsTotal = (await recordsTotalQuery).recordsTotal;
query.where(function() {
let searchVal = '%' + params.search.value.replace(/\\/g, '\\\\').replace(/([%_])/g, '\\$1') + '%';
for (let colIdx = 0; colIdx < params.columns.length; colIdx++) {
const col = params.columns[colIdx];
if (col.searchable === 'true') {
this.orWhere(columns[parseInt(col.data)], 'like', searchVal);
}
}
});
const recordsFilteredQuery = query.clone().count('* as recordsFiltered').first();
const recordsFiltered = (await recordsFilteredQuery).recordsFiltered;
query.offset(parseInt(params.start));
const limit = parseInt(params.length);
if (limit >= 0) {
query.limit(limit);
}
query.select(columns);
for (const order of params.order) {
query.orderBy(columns[params.columns[order.column].data], order.dir);
}
const rows = await query;
const rowsOfArray = rows.map(row => Object.keys(row).map(key => row[key]));
const result = {
draw: params.draw,
recordsTotal,
recordsFiltered,
data: rowsOfArray
};
return result;
});
}
module.exports = {
ajaxList
};