diff options
| author | Kristian Lyngstol <kly@kly.no> | 2019-01-07 00:05:59 +0100 | 
|---|---|---|
| committer | Kristian Lyngstol <kly@kly.no> | 2019-01-07 00:05:59 +0100 | 
| commit | ed9e8db8f953f3064c3e21d9da75c0802f21ab1b (patch) | |
| tree | 05f733cd7eb2b4edcdac7caa089bb4830e12bc2a /web/js/nms-ui-boxes.js | |
| parent | 0bd74cf3010de984d36eed04b6318b7b30e25373 (diff) | |
More big stuff: Re-do the oplog
This is still a bit of a mess, but I'm establishing a new way of doing things,
it'll be awesome, I swear...
Diffstat (limited to 'web/js/nms-ui-boxes.js')
| -rw-r--r-- | web/js/nms-ui-boxes.js | 123 | 
1 files changed, 109 insertions, 14 deletions
| diff --git a/web/js/nms-ui-boxes.js b/web/js/nms-ui-boxes.js index ac4445e..385d601 100644 --- a/web/js/nms-ui-boxes.js +++ b/web/js/nms-ui-boxes.js @@ -61,16 +61,93 @@ class nmsBox {  	}  	add(box) {  		this._boxes.push(box); -		this.html.appendChild(box.html); +		box.attach(this.html) +		box.show()  	} -	close() { -		for (var x in this._boxes) { -			this._boxes[x].close(); +	insert(box) { +		this._boxes.unshift(box) +		box.attach(this.html) +		box.show(true,-1) +	} + +	/* This is provided so as to allow attaching to non-nmsBox-objects. +	 * E.g.: attach the root to a HTML element directly. +	 * If you just use foo = document.getElement..., +	 * foo.appendChild(box.html), then .hide() will work fine, +	 * but there's no way to do .show() afterwards. +	 * +	 * Be aware: +	 * - we want to AVOID the child knowing too much about the parent +	 * - HTML elements can only ever be part of a single parent +	 *   element. This means that it is safe to attach(root1), .show(), +	 *   atach(root2), show() ... The DOM object wil be removed from root1. +	 * - Due to the above, we should probably actually adress that, since +	 *   there are valid reasons for showing the same nmsBox twice (e.g.: +	 *   showing a list of tons of stuff, and also a "top 5") +	 */ +	attach(root) { +		if (!(root instanceof HTMLElement)) { +			root = document.getElementById(root) +		} +		console.assert(root instanceof HTMLElement) +		this._root = root; +	} +	show(show = true,where=1) { +		if (!show) { +			this.hide() +			return +		} +		if (this._root instanceof HTMLElement) { +			if (where>0) { +				this._root.appendChild(this.html); +			} else { +				this._root.insertBefore(this.html,this._root.firstElementChild) +			} +		}  +	} +	_remove(source,box) { +		source.html.removeChild(box.html) +		if (box._root == source) { +			box._root = undefined; +		} +		var x = source._boxes.indexOf(box) +		delete source._boxes[x] +	} +	_includes(source,box) { +		if (source._boxes.indexOf(box) >= 0) { +			return true; +		} else { +			return false;  		} -		if (this.html.parentElement != null) { +	} +	/* +	 * This redirect is to make it easier for subclasses that +	 * override add() to make it eaiser to add logical +	 * childs, e.g. adding to a table really adds to ._tbody, +	 * not the true top-element of the table. +	 */ +	remove(box) { +		this._remove(this,box) +	} +	includes(box) { +		return this._includes(this,box); +	} +	hide() { +		if (this.html.parentElement instanceof HTMLElement) {  			this.html.parentElement.removeChild(this.html);  		}  	} +	destroy() { +		this.hide() +		for (var i in this._boxes) { +			var x = this._boxes[i]; +			x.hide() +			x.destroy() +			delete this._boxes[i] +		} +		delete this.html; +		delete this; +	}  	update() {  		for (var x in this._boxes) {  			this._boxes[x].update(); @@ -112,13 +189,15 @@ class nmsTable extends nmsBox {  			this.add(content[v]);  		}  	} -	/* Can take either a single nmsBox-object that will be added as-is, -	 * or an array of items that will be added as individual cells -	 */  -	add(content) { +	remove(box) { +		this._remove(this._tbody,box) +	} +	includes(box) { +		return this._tbody.includes(box) +	} +	_makeBox(content) {  		if (content instanceof nmsBox) { -			this._tbody.add(content) -			return; +			return content;  		}  		var tr;  		var td1; @@ -138,7 +217,16 @@ class nmsTable extends nmsBox {  			}  			tr.add(td);  		} -		this._tbody.add(tr); +		return tr; +	} +	/* Can take either a single nmsBox-object that will be added as-is, +	 * or an array of items that will be added as individual cells +	 */  +	add(content) { +		this._tbody.add(this._makeBox(content)); +	} +	insert(box) { +		this._tbody.insert(this._makeBox(box));	  	}  } @@ -160,8 +248,15 @@ class nmsPanel extends nmsBox{  		this._topBox.add(this.nav);  		this._topBox.add(this._body);  		super.add(this._topBox); -		this._root = document.getElementById("metaContainer"); -		this._root.appendChild(this.html); +	} +	attach(root = document.getElementById("metaContainer")) { +		super.attach(root) +	} +	show() { +		if (!this._root) { +			this.attach() +		} +		super.show()  	}  	/* Mainly just to make the constructor more readable. */  	makeHeading(title) { | 
