mailtrain/lib/dt-helpers.js
Tomas Bures c81f5544e6 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)
2017-06-21 02:14:14 +02:00

54 lines
No EOL
1.6 KiB
JavaScript

'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
};