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)
54 lines
No EOL
1.6 KiB
JavaScript
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
|
|
}; |