class View { constructor(tag = 'div') { this.root = document.createElement(tag) } $(sel) { return this.root.querySelector(sel) } $$(sel) { return this.root.querySelectorAll(sel) } on(elm, evt, cb) { if (typeof elm === 'string') { elm = this.$(elm) } elm.addEventListener(evt, cb) } } class DefaultView extends View{ constructor(object) { super('div') this.object = object; this.fields = {} this.subviews = {} } render() { Object.keys(this.object.json).forEach(key => { let node = this.getNode(key); if (node) this.root.appendChild(node) }) return this } getNode(name, value=null) { if (this.fields[name]) { return this.fields[name] } value = value === null ? this.object.json[name] : value if (value instanceof StructuredNode) { this.subviews[name] = (new DefaultView(value)).render() const wrap = document.createElement('div') wrap.classList.add('wrapper') if (name.indexOf('[') === -1) { wrap.innerHTML += '' + name + ':' } wrap.appendChild(this.subviews[name].root) this.fields[name] = wrap } else if (value instanceof Array) { const elm = document.createElement('ul') elm.innerHTML += '' + name + ':' value.forEach((o, i) => { const li = document.createElement('li') li.appendChild(this.getNode(name+'['+i+']',o)) elm.appendChild(li) }) this.fields[name] = elm } else { if (value === null || name === 'uid') return const elm = document.createElement('p') elm.innerHTML = `${name}: ${value}` this.fields[name] = elm } return this.fields[name] } }