import { always, cond, equals, is, T, mergeLeft } from "ramda";
import Handlebars from "handlebars/dist/cjs/handlebars";
import moment from "moment";
import presetConfig from './presetConfig'
const tablefy = (list = []) => {
const defaultData = (title) => ({
headerFilter: "input",
minWidth: 80,
headerFilterPlaceholder: title,
download: false,
print: false,
vertAlign: "middle",
sorter: "string",
responsive: 0
})
if (!is(Array, list)) return []
return list.map((el) => mergeLeft(el, defaultData(el?.title || "")))
}
const math = (value, operator, operand) => {
var left = parseFloat(value);
var right = parseFloat(operand);
switch(operator) {
case "+":
return left + right;
case "-":
return left - right;
case "*":
return left * right;
case "/":
return left / right;
case "%":
return left % right;
default:
return "";
}
}
const link = (col) => ({
...col,
formatter: (cell, { prefix = "", text, key = "id" }, onRendered) => {
onRendered(function () {
let row = cell.getRow().getData();
if (!text && !cell.getValue()) {
return null;
}
if (!row[key]) return null;
cell.getElement().innerHTML = `${text || cell.getValue()}`;
});
},
});
[
['math', math],
['presetConfig', (record, pack) => presetConfig(pack, record)],
[
"dt_shift",
(date, shift, param) => {
return date ? moment(date).add(shift, param) : "нд";
},
],
[
"dt_format",
(date) => {
return date ? moment(date).format("DD.MM.YYYY HH:mm") : "нд";
},
],
[
"dt_db_format",
(date) => {
return date ? moment(date).format("YYYY-MM-DDTHH:mm:ss") : "нд";
},
],
[
"from_now",
(date) => {
return moment(date).fromNow()
},
],
[
"json_parse",
(item) => {
return `
${item}
`
},
],
[
"time_from_sec",
(ms) => {
if (!ms) return "н/д"
return `${moment(moment().subtract(Math.round(ms), 'milliseconds')).fromNow()}`.replace("назад", '')
},
],
[
"lenght",
(list) => {
return is(Array, list) ? list.length : 0;
},
],
[
"more",
(one, two) => {
return one > two;
},
],
[
"less",
(one, two) => {
return one < two;
},
],
[
"or",
(one, two) => {
return one || two;
},
],
[
"eq",
(one, two) => {
return one === two;
},
],
[
"endOf",
(date, param) => moment(date).endOf(param)
],
[
"startOf",
(date, param) => moment(date).startOf(param)
],
[
"render",
(list, key) => {
return list.map(el => el[key]).join(", ")
}
],
[
"get",
(map, key) => {
return map[key] ? `${map[key]}` : ""
}
],
[
"get_from",
(map, key) => {
return map[key] ? `${map[key]}` : ""
}
],
[
"uint8parse",
(list) => pipe(
(x) => Uint8Array.from(x, e => e.charCodeAt(0)),
Array.from
)(list)
],
[
"filter_aoo",
(list = [], key, _availible_list) => {
const availible_list = pipe(
(x) => Uint8Array.from(x, e => e.charCodeAt(0)),
Array.from
)(_availible_list)
return list.filter((el) =>
availible_list.includes(el[key]))
}
]
].forEach(([name, func]) => {
Handlebars.registerHelper(name, func);
});
const render = (col) => ({
...col,
formatter: (cell, _, onRendered) => {
onRendered(function () {
if (`${col.render}`.includes("{{") && `${col.render}`.includes("}}")) {
let record = cell.getRow().getData();
cell.getElement().innerHTML = Handlebars.compile(col.render)(
{...record, __record__: record}
);
} else if (typeof col.render === "function") {
cell.getElement().innerHTML = col.render(cell.getRow().getData(), cell.getRow());
}
});
},
});
let sorter = (a, b) => {
let [a_field, b_field] = [a["field"], b["field"]];
if (a_field.includes("id") && b_field.includes("id"))
return a_field.localeCompare(b_field);
if (a_field.includes("id")) return -1;
if (b_field.includes("id")) return 1;
if (a_field.includes("dt") && b_field.includes("dt"))
return b_field.localeCompare(a_field);
if (a_field.includes("dt")) return -1;
if (b_field.includes("dt")) return 1;
if (a_field.includes("imei") && b_field.includes("imei"))
return b_field.localeCompare(a_field);
if (a_field.includes("imei")) return -1;
if (b_field.includes("imei")) return 1;
return a_field.localeCompare(b_field);
};
const prepCol = (col) =>
cond([
[() => is(String, col.render), () => render(col)],
[() => is(Function, col.render), () => render(col)],
[equals("link"), () => link(col)],
[T, always(col)],
])(col.mode);
const prepColumns = (cols) =>
is(Array, cols) ? cols.map((col) => prepCol(col)) : [];
const renderGroupHeader = ({ groupHeader, value, count, group, extra }) => {
const groupData = group._group;
if (groupData.level == 0) {
const {company_id, param, train_info: train, date: _date} = groupData.groupList[0].rows[0].data
const date = `${_date}`.replace(/\s(.*)/gm, "")
const icident_group = extra.find((el) =>
el.date === date &&
el.company_id == company_id &&
el.train == train &&
el.param == param
) || {}
return Handlebars.compile(groupHeader)({
_value: value,
_count: count,
extra: extra,
icident_group: icident_group
});
}
return `${value} (${count} записей)`;
};
const groupByFunction = (groupBy) => (data) =>
Handlebars.compile(groupBy)(data);
const makedFiltering = (id, filterParams, selectedFilter, clearFilters) => {
const table = document.querySelector(`#${id}`)
const isFiltering = document.querySelector(`${id}-filters`)
if(id && filterParams) {
filterParams.unshift([])
const filtersContainer = document.createElement('div')
filtersContainer.setAttribute("id", `${id}-filters`)
filtersContainer.classList.add("col-span-12")
filtersContainer.innerHTML = `
Фильтр по статусу
`
if(!isFiltering) {
table.before(filtersContainer)
}
else {
isFiltering.remove()
table.before(filtersContainer)
}
const selectFilters = document.querySelectorAll(`#${id}-selectFilter`)
const selectOptions = document.querySelectorAll(`#${id}-selectFilter option`)
const buttonClearFilters = document.querySelector(`#${id}-filtersClear`)
selectFilters.forEach((el) => {
el.onchange = (e) => {
if(e.target.value) {
selectOptions[0].removeAttribute('selected')
selectedFilter(e.target.value)
} else {
clearFilters()
e.target.setAttribute('selected', 'selected')
}
}
})
buttonClearFilters.onclick = () => {
clearFilters()
selectOptions[0].setAttribute('selected', 'selected')
}
}
}
const validation = (value, pagination) => {
const pipe = (...fns) => (...x) => fns.reduce((error, validator) => error || validator(...x), undefined)
const minPage = length => value => {
value = value.replace(/\s+/g, '')
return value >= length ? undefined : `Номер страницы должен быть больше или равен ${length}`
}
const maxPage = length => value => {
value = value.replace(/\s+/g, '')
return length >= value ? undefined : `Номер страницы должен быть меньше или равен ${length}`
}
const onlyDigits = value => {
const pattern = /^([\d])*$/g
return pattern.test(value) ? undefined : `Номер страницы должен содержать только цифры`
}
const composedValidators = pipe(onlyDigits, minPage(1), maxPage(pagination.total_pages))
return composedValidators(value)
}
const pipe = (x) => (...fns) => fns.reduce((r, fn) => fn(r), x)
export {prepColumns, sorter, renderGroupHeader, groupByFunction, makedFiltering, tablefy, validation, pipe};