import { Component, NewState, Util, RefreshState } from '@web/state' import { VirtualScroll } from '@web/base' Component.register('DataTable', container => { const vs = VirtualScroll() if (!container.state) container.state = NewState({}) const state = container.state Object.assign(state, { list: [], fields: [], _renderedList: [], prevHeight: 0, postHeight: 0, _listStartIndex: 0, perf: { refreshTime: 0, refreshCount: 0, scrollCount: 0, totalNodes: 0 } }) container.refresh = () => { const start = performance.now() const res = vs.calc(container, state.list) if (res) { state.perf.refreshCount++ Object.assign(state, { prevHeight: res.prevHeight, postHeight: res.postHeight, _listStartIndex: res.listStartIndex, _renderedList: res.renderedList }) state.perf.refreshTime += (performance.now() - start) state.perf.totalNodes += res.renderedList.length } } container.onItemUpdate = (index, node) => vs.update(index + (state._listStartIndex || 0), node) state.__watch('list', list => { state._listStartIndex = 0 state._renderedList = vs.reset(list, container) || [] setTimeout(() => { if (state.list === list) vs.init(list, container.refresh) }) }) state.__watch('fields', fields => { if (!fields) return const gridTemplate = fields.map(f => `var(--w-${f.id}, ${f.width || 150}px)`).join(' ') container.style.setProperty('--dt-grid-template', gridTemplate) }) container.onScroll = () => { state.perf.scrollCount++ container.refresh() } }, Util.makeDom(/*html*/`