import m, { CVnode, CVnodeDOM, ClassComponent, CommonAttributes } from "mithril"; import { IListPage } from "../interface/list"; export class ListPage implements ClassComponent> { private container!: HTMLElement; public oncreate({ dom }: CVnodeDOM>) { this.container = dom as HTMLElement; } public onbeforeupdate( { attrs: { visible } }: CVnode>, { attrs: { visible: previous } }: CVnode> ) { if (visible === previous) { // Let visible determine view return visible; } else { this.container.style.height = visible ? "auto" : this.container.getBoundingClientRect().height + "px"; // Always allow view (render visible rows or remove hidden rows) return true; } } public view({ attrs: { items, idx, visible, component, fragment } }: CVnode>) { return m("div", { "data-idx": idx }, visible ? items.map( (item) => m.fragment(fragment(item), [ m(component, item as T & CommonAttributes) ]) ) : null); } }