@codenameryuu/adonis-datatable
Version:
Server side datatables package for Adonis JS
151 lines (150 loc) • 5.1 kB
JavaScript
export default class Request {
request;
constructor(request) {
this.request = request;
}
input(key, defaultValue) {
const keys = key.split(".");
const columns = this.request.input(keys[0]);
if (!columns) {
return defaultValue;
}
keys.shift();
const value = keys.reduce((acc, curr) => acc && acc[curr], columns);
return value;
}
columns() {
return this.input("columns");
}
isSearchable() {
return this.input("search.value") !== "";
}
isRegex(index) {
return this.input(`columns.${index}.search.regex`) === "true";
}
orderableColumns() {
if (!this.isOrderable()) {
return [];
}
let orderable = [];
for (let i = 0; i < this.input("order").length; i++) {
const orderColumn = this.input(`order.${i}.column`);
const direction = this.input(`order.${i}.dir`);
const orderDirection = direction && direction.toLowerCase() === "asc" ? "asc" : "desc";
if (this.isColumnOrderable(orderColumn)) {
orderable.push({ column: orderColumn, direction: orderDirection });
}
}
return orderable;
}
isOrderable() {
return this.input("order") && this.input("order").length > 0;
}
isColumnOrderable(index) {
return this.input(`columns.${index}.orderable`, "true") === "true";
}
searchableColumnIndex() {
const searchable = [];
const columns = this.input("columns");
for (let index = 0; index < columns.length; index++) {
if (this.isColumnSearchable(index, false)) {
searchable.push(index);
}
}
return searchable;
}
isColumnSearchable(index, columnSearch = true) {
if (columnSearch) {
return ((this.input(`columns.${index}.searchable`, "true") === "true" ||
this.input(`columns.${index}.searchable`, "true") === true) &&
this.columnKeyword(index) !== "");
}
return (this.input(`columns.${index}.searchable`, "true") === "true" ||
this.input(`columns.${index}.searchable`, "true") === true);
}
columnKeyword(index) {
const keyword = this.input(`columns.${index}.search.value`) ?? "";
return this.prepareKeyword(keyword);
}
prepareKeyword(keyword) {
if (Array.isArray(keyword)) {
keyword = keyword;
return keyword.join(" ");
}
return keyword;
}
keyword() {
const keyword = this.input("search.value") ?? "";
return this.prepareKeyword(keyword);
}
columnName(index) {
const column = this.input(`columns.${index}`);
return column && column["name"] && column["name"] !== "" ? column["name"] : column?.["data"];
}
/**
* Determine whether the column has any active ColumnControl search payload.
*
* @see https://datatables.net/extensions/columncontrol/server-side
*/
hasColumnControl(index) {
const columnControl = this.input(`columns.${index}.columnControl`);
if (!columnControl) {
return false;
}
const value = this.input(`columns.${index}.columnControl.search.value`);
const logic = this.input(`columns.${index}.columnControl.search.logic`);
return ((value !== undefined && value !== null && value !== "") ||
logic === "empty" ||
logic === "notEmpty" ||
this.hasColumnControlList(index));
}
/**
* The input based search payload (searchText, searchNumber, searchDateTime).
*/
columnControlSearch(index) {
const search = this.input(`columns.${index}.columnControl.search`);
if (!search) {
return null;
}
return {
value: this.prepareKeyword(search["value"] ?? ""),
logic: search["logic"] ?? "contains",
type: search["type"] ?? "text",
mask: search["mask"],
};
}
/**
* The list of selected values used by the searchList content type.
*/
columnControlList(index) {
const list = this.input(`columns.${index}.columnControl.list`);
if (Array.isArray(list)) {
return list;
}
if (list && typeof list === "object") {
return Object.values(list);
}
return [];
}
hasColumnControlList(index) {
return this.columnControlList(index).length > 0;
}
isPaginationable() {
return this.input("start") !== null && this.input("length") !== null && this.input("length") !== -1;
}
start() {
const start = this.input("start", 0);
return Number(start) ? start : 0;
}
length() {
const length = this.input("length", 0);
return Number(length) ? length : 10;
}
draw() {
const draw = this.input("draw", 0);
return Number(draw) ? draw : 0;
}
all() {
return this.request.all();
}
}