function HyperGrid(
data,
{
tableHeight = 320,
itemHeight = 28,
showHeader = true,
columns = null,
columnWidth = 120,
columnMargin = 5
} = {}
) {
if (!data) {
return "No data";
} else if (!data.length) {
return "Empty data";
}
const renderColumns = columns
? columns.map(c => {
c.width = c.hasOwnProperty("width") ? c.width : columnWidth;
c.margin = c.hasOwnProperty("margin") ? c.margin : columnMargin;
return c;
})
: Object.keys(data[0]).map(key => ({
name: key,
formatter: defaultFormatter,
width: columnWidth,
margin: columnMargin
}));
const parentElement = html`<div class="vtable" style="height: ${tableHeight}px;"></div>`;
const innerElement = document.createElement('div');
parentElement.append(innerElement);
const headerWidth = renderColumns.reduce(
(acc, column) => acc + column.width + column.margin,
0
);
const list = HyperList.create(innerElement, {
width,
itemHeight,
height: tableHeight,
total: data.length,
scrollerElement: "div",
applyPatch: (element, fragment) => {
while (
element.lastElementChild &&
!element.lastElementChild.className.includes("vrow-header")
) {
element.removeChild(element.lastElementChild);
}
if (showHeader && !element.lastElementChild) {
element.appendChild(html`
<div class="vrow-inner vrow-header" style="width: ${headerWidth}px;">
${renderColumns.map(column =>
hypergridCell(html`${column.name}`, column, false, itemHeight)
)}
</div>
`);
}
element.appendChild(fragment);
},
generate(index) {
return html`
<div class="vrow-inner">
${renderColumns.map(column =>
hypergridCell(
html`${column.formatter(data[index], column, index, data)}`,
column,
showHeader,
itemHeight
)
)}
</div>`;
}
});
parentElement.append(hypergridStyle());
return parentElement;
}