@opengis/fastify-table
Version:
core-plugins
105 lines (104 loc) • 4.05 kB
JavaScript
/* eslint-disable no-console */
import setToken from "../../plugins/crud/funcs/setToken.js";
import { handlebars } from "../index.js";
import buttonEdit from "./utils/buttonEdit.js";
import buttonDel from "./utils/buttonDel.js";
function format(d, key, data, hash) {
if (!key?.includes)
return "";
if (d === true)
return "Так";
if (d === false)
return "Ні";
if (key === "actions") {
return `<div class="flex items-center gap-2">${(hash.form ? buttonEdit(d) : "") + buttonDel(d)}</div>`;
}
if (key.startsWith("{{")) {
return handlebars.compile(key)(data);
}
if (key.startsWith("{{") &&
key.includes(" ") &&
!(key.match(/\{\{([^\s]+)/)?.[1] in handlebars.helpers)) {
return null;
}
if (!d)
return "-";
return d;
}
export default async function tableList(data, opt) {
const { hash } = opt;
// no data
// const time = Date.now();
if (hash.nodata && !data?.length) {
const noDataText = typeof hash.nodata === "string"
? hash.nodata
: '<div class="bg-gray-200 text-center p-6 rounded-xl"><h3 class="text-lg font-semibold">Інформація відсутня</h3></div>';
return noDataText;
}
if (!hash.columns)
return "columns empty";
const keys = hash.columns
.split(hash.divider || ",")
.map((el) => hash.comma
? el.trim().replace(new RegExp(hash.comma, "g"), ",")
: el.trim())
.concat(hash.uid && hash.table && hash.id && !hash.noactions
? ["Дії", "actions"]
: []);
const result = [];
result.push('<thead class="text-left font-medium text-gray-700"> <tr>');
// thead
const skip = {};
for (let i = 0; i < keys.length; i += 2) {
const name = keys[i];
// check hbs
if (name.includes("{{")) {
console.log(hash);
}
const nameHBS = name.includes("{{")
? await handlebars.compile(name)({ ...data, hash })
: false;
// console.log(name, data, nameHBS)
skip[name] = name.includes("{{") && !nameHBS;
if (skip[name])
continue;
const isActionsColumn = hash.noactions && i === keys.length - 2;
result.push(`<th class="py-2 min-w-[200px] ${isActionsColumn
? "last:min-w-[60px] last:max-w-[60px] last:bg-white last:sticky last:right-0"
: ""}">
${nameHBS || name}
</th>`);
}
result.push('</tr></thead><tbody class="divide-y divide-gray-200">');
// body
for (let k = 0; k < data.length; k += 1) {
const row = data[k];
result.push('<tr class="bg-white odd:bg-gray-50 ">');
const obj = { form: hash.form, table: hash.table, id: row[hash.id] };
const token = hash.table
? setToken({ ids: [JSON.stringify(obj)], uid: hash.uid, array: 1 })[0]
: null;
for (let i = 0; i < keys.length; i += 2) {
const name = keys[i];
const key = keys[i + 1];
if (!key)
continue;
if (skip[name])
continue;
const tokenData = key === "actions" ? token : null;
const d1 = key.includes("{{")
? (await handlebars.compile(key)({ ...row, token, hash })) || "-"
: null;
const isActionsColumn = hash.noactions && i === keys.length - 2;
result.push(`<td class="py-2 pr-5 ${isActionsColumn ? "last:sticky last:right-0" : ""}">
${d1 ||
format(tokenData || row[key], key, row, hash)}
</td>`);
}
// action token
result.push("</tr>");
}
result.push("</tbody>");
// console.log(Date.now() - time)
return `<table class="min-w-full relative divide-y-2 divide-gray-200 bg-white min-w-full overflow-auto divide-y-2 divide-gray-200 bg-white text-[12px] text-gray-600">${result.join("")}</table>`;
}