@opengis/fastify-table
Version:
core-plugins
86 lines (74 loc) • 3.83 kB
JavaScript
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>`;
}