UNPKG

cadviewer-angular

Version:

CADViewer - JavaScript CAD Viewer Library

170 lines (160 loc) 5.09 kB
var Templater = function(list) { var itemSource, templater = this; var init = function() { itemSource = templater.getItemSource(list.item); itemSource = templater.clearSourceItem(itemSource, list.valueNames); }; this.clearSourceItem = function(el, valueNames) { for(var i = 0, il = valueNames.length; i < il; i++) { var elm; if (valueNames[i].data) { for (var j = 0, jl = valueNames[i].data.length; j < jl; j++) { el.setAttribute('data-'+valueNames[i].data[j], ''); } } else if (valueNames[i].attr && valueNames[i].name) { elm = list.utils.getByClass(el, valueNames[i].name, true); if (elm) { elm.setAttribute(valueNames[i].attr, ""); } } else { elm = list.utils.getByClass(el, valueNames[i], true); if (elm) { elm.innerHTML = ""; } } elm = undefined; } return el; }; this.getItemSource = function(item) { if (item === undefined) { var nodes = list.list.childNodes, items = []; for (var i = 0, il = nodes.length; i < il; i++) { // Only textnodes have a data attribute if (nodes[i].data === undefined) { return nodes[i].cloneNode(true); } } } else if (/^tr[\s>]/.exec(item)) { var table = document.createElement('table'); table.innerHTML = item; return table.firstChild; } else if (item.indexOf("<") !== -1) { var div = document.createElement('div'); div.innerHTML = item; return div.firstChild; } else { var source = document.getElementById(list.item); if (source) { return source; } } throw new Error("The list need to have at list one item on init otherwise you'll have to add a template."); }; this.get = function(item, valueNames) { templater.create(item); var values = {}; for(var i = 0, il = valueNames.length; i < il; i++) { var elm; if (valueNames[i].data) { for (var j = 0, jl = valueNames[i].data.length; j < jl; j++) { values[valueNames[i].data[j]] = list.utils.getAttribute(item.elm, 'data-'+valueNames[i].data[j]); } } else if (valueNames[i].attr && valueNames[i].name) { elm = list.utils.getByClass(item.elm, valueNames[i].name, true); values[valueNames[i].name] = elm ? list.utils.getAttribute(elm, valueNames[i].attr) : ""; } else { elm = list.utils.getByClass(item.elm, valueNames[i], true); values[valueNames[i]] = elm ? elm.innerHTML : ""; } elm = undefined; } return values; }; this.set = function(item, values) { var getValueName = function(name) { for (var i = 0, il = list.valueNames.length; i < il; i++) { if (list.valueNames[i].data) { var data = list.valueNames[i].data; for (var j = 0, jl = data.length; j < jl; j++) { if (data[j] === name) { return { data: name }; } } } else if (list.valueNames[i].attr && list.valueNames[i].name && list.valueNames[i].name == name) { return list.valueNames[i]; } else if (list.valueNames[i] === name) { return name; } } }; var setValue = function(name, value) { var elm; var valueName = getValueName(name); if (!valueName) return; if (valueName.data) { item.elm.setAttribute('data-'+valueName.data, value); } else if (valueName.attr && valueName.name) { elm = list.utils.getByClass(item.elm, valueName.name, true); if (elm) { elm.setAttribute(valueName.attr, value); } } else { elm = list.utils.getByClass(item.elm, valueName, true); if (elm) { elm.innerHTML = value; } } elm = undefined; }; if (!templater.create(item)) { for(var v in values) { if (values.hasOwnProperty(v)) { setValue(v, values[v]); } } } }; this.create = function(item) { if (item.elm !== undefined) { return false; } /* If item source does not exists, use the first item in list as source for new items */ var newItem = itemSource.cloneNode(true); newItem.removeAttribute('id'); item.elm = newItem; templater.set(item, item.values()); return true; }; this.remove = function(item) { if (item.elm.parentNode === list.list) { list.list.removeChild(item.elm); } }; this.show = function(item) { templater.create(item); list.list.appendChild(item.elm); }; this.hide = function(item) { if (item.elm !== undefined && item.elm.parentNode === list.list) { list.list.removeChild(item.elm); } }; this.clear = function() { /* .innerHTML = ''; fucks up IE */ if (list.list.hasChildNodes()) { while (list.list.childNodes.length >= 1) { list.list.removeChild(list.list.firstChild); } } }; init(); }; module.exports = function(list) { return new Templater(list); };