@codenameryuu/adonis-datatable
Version:
Package server side datatables on AdonisJS 6
169 lines (168 loc) • 5.9 kB
JavaScript
import lodash from 'lodash';
import Helper from './utils/helper.js';
export default class DataProcessor {
$results;
templates;
start;
config;
$output = [];
$appendColumns = {};
$editColumns = {};
$rawColumns = [];
$onlyColumns = [];
$excessColumns = [];
$escapeColumns = [];
$includeIndex = false;
$exceptions = ['DT_RowId', 'DT_RowClass', 'DT_RowData', 'DT_RowAttr'];
constructor($results, columnDef, templates, start = 0, config) {
this.$results = $results;
this.templates = templates;
this.start = start;
this.config = config;
this.$appendColumns = columnDef['append'] ?? {};
this.$editColumns = columnDef['edit'] ?? {};
this.$rawColumns = columnDef['raw'] ?? [];
this.$onlyColumns = columnDef['only'] ?? [];
this.$excessColumns = columnDef['excess'] ?? [];
this.$escapeColumns = columnDef['escape'] ?? [];
this.$includeIndex = columnDef['index'] ?? false;
}
process(isObject = true) {
const indexColumn = this.config.get('index_column', 'DT_RowIndex');
for (const row of Object.values(this.$results)) {
const data = Helper.serializeToObject(row);
let value = this.addColumns(data, row);
value = this.editColumns(value, row);
value = this.setupRowVariables(value, row);
value = this.selectOnlyNeededColumns(value);
value = this.removeExcessColumns(value);
if (this.$includeIndex) {
value[indexColumn] = ++this.start;
}
this.$output.push(isObject ? value : this.convertToArray(value));
}
return this.escapeColumns(this.$output);
}
addColumns(data, row) {
for (const value of Object.values(this.$appendColumns)) {
const content = value['content'];
const resultContent = Helper.compileContent(content, data, row);
data = Helper.objectIncludeIn({ ...value, content: resultContent }, data);
}
return data;
}
editColumns(data, row) {
for (const value of Object.values(this.$editColumns)) {
const resultContent = Helper.compileContent(value['content'], data, row);
lodash.set(data, value['name'], resultContent);
}
return data;
}
setupRowVariables(data, row) {
return new RowProcessor(data, row)
.rowValue('DT_RowId', this.templates['DT_RowId'])
.rowValue('DT_RowClass', this.templates['DT_RowClass'])
.rowData('DT_RowData', this.templates['DT_RowData'])
.rowData('DT_RowAttr', this.templates['DT_RowAttr'])
.getData();
}
selectOnlyNeededColumns(data) {
if (!this.$onlyColumns.length) {
return data;
}
else {
const results = {};
for (const value of Object.values(this.$onlyColumns)) {
lodash.set(results, value, lodash.get(data, value));
}
for (const value of Object.values(this.$exceptions)) {
if (lodash.get(data, value)) {
lodash.set(results, value, lodash.get(data, value));
}
}
return results;
}
}
removeExcessColumns(data) {
for (const value of Object.values(this.$excessColumns)) {
lodash.unset(data, value);
}
return data;
}
convertToArray(array) {
const data = [];
for (const [key, value] of Object.entries(array)) {
if (!data.includes(value)) {
data[key] = value;
}
}
return data;
}
escapeColumns(output) {
return output.map((row) => {
if (this.$escapeColumns === '*') {
row = this.escapeRow(row);
}
else if (Array.isArray(this.$escapeColumns)) {
const columns = this.$escapeColumns.filter((col) => !this.$rawColumns.includes(col));
for (const key of columns) {
const content = lodash.get(row, key);
lodash.set(row, key, Helper.escape(content));
}
}
return row;
});
}
escapeRow(row) {
const rawColumns = this.$rawColumns;
const arrayDot = lodash.transform(row, (result, value, key) => {
if (value) {
result[key] = value;
}
});
Object.keys(arrayDot).forEach((key) => {
if (!rawColumns.includes(key)) {
const value = lodash.get(arrayDot, key);
if (lodash.isString(value) || lodash.isElement(value)) {
arrayDot[key] = Helper.escape(value);
}
}
});
Object.keys(arrayDot).forEach((key) => {
lodash.set(row, key, arrayDot[key]);
});
return row;
}
}
class RowProcessor {
data;
row;
constructor(data, row) {
this.data = data;
this.row = row;
}
rowValue(attribute, template) {
if (template) {
if (typeof template !== 'function' && lodash.get(this.data, template)) {
this.data[attribute] = lodash.get(this.data, template);
}
else {
this.data[attribute] = Helper.compileContent(template, this.data, this.row);
}
}
return this;
}
rowData(attribute, template) {
if (Object.keys(template).length) {
let data = {};
for (const [index, value] of Object.entries(template)) {
data[index] = Helper.compileContent(value, this.data, this.row);
}
this.data[attribute] = data;
}
return this;
}
getData() {
return this.data;
}
}