import { AbstractNode, NodeMods, INode } from './AbstractNode' import { DataModel } from '../model/DataModel' import { TreeView } from '../view/TreeView' import { Path } from '../model/Path' import { IObject } from './ObjectNode' export class ListNode extends AbstractNode { protected children: INode constructor(values: INode, mods?: NodeMods) { super({ default: () => [], ...mods}) this.children = values } transform(path: Path, value: IObject[]) { if (!(value instanceof Array)) return undefined const res = value.map((obj, index) => this.children.transform(path.push(index), obj) ) return this.transformMod(res) } updateModel(el: Element, path: Path, model: DataModel) { model.set(path, el.querySelector('select')?.value) } renderRaw(path: Path, value: IObject[], view: TreeView) { value = value || [] const button = view.registerClick(el => { view.model.set(path, [...value, this.children.default()]) }) return `
${value.map((obj, index) => { return this.renderEntry(path.push(index), obj, view) }).join('')}
` } private renderEntry(path: Path, value: IObject, view: TreeView) { const button = view.registerClick(el => { view.model.set(path, undefined) }) return `
${this.children.render(path, value, view, {hideLabel: true})}
` } getClassName() { return 'list-node' } }