handsontable = {
const styles = html`<link href="https://cdn.jsdelivr.net/npm/handsontable@7.2.2/dist/handsontable.full.min.css" rel="stylesheet" media="screen">`;
document.head.appendChild(styles);
const isDomElement = element =>
element instanceof Element || element instanceof HTMLDocument;
return (options, transform, valueMapping) => {
options = options || {};
transform = transform || (x => x);
valueMapping = valueMapping || (x => x);
if (Array.isArray(options.colHeaders)) {
options.colHeaders = options.colHeaders.map(h =>
isDomElement(h) ? h.outerHTML : h
);
}
const element = html`<div style="${options.style || ''}"></div>`;
const hot = createHandsontable(element, {
licenseKey: 'non-commercial-and-evaluation',
...options
});
hot.updateSettings({
afterChange: function(changes, source) {
if (options.afterChange !== undefined) {
options.afterChange(changes, source);
}
element.value = (hot.getSourceData() || []).map(transform);
element.dispatchEvent(new CustomEvent("input"));
},
afterColumnSort: function(currentSortConfig, destinationSortConfig) {
if (options.afterColumnSort !== undefined) {
options.afterColumnSort(currentSortConfig, destinationSortConfig);
}
element.value = (hot.getSourceData() || []).map(transform);
element.dispatchEvent(new CustomEvent("input"));
}
});
element.hot = hot;
element.value = valueMapping((hot.getSourceData() || []).map(transform));
return element;
};
}