|
| 1 | +"use strict"; |
| 2 | + |
| 3 | +new class App { |
| 4 | + index = 1; data = []; labels = null; invalidLabels = true; |
| 5 | + tbody = document.getElementsByTagName('tbody')[0]; |
| 6 | + constructor() { |
| 7 | + this.tbody.onclick = this.onclick(); |
| 8 | + for (let key of ['run', 'runlots', 'add', 'update', 'clear', 'swaprows']) { |
| 9 | + document.getElementById(key).onclick = (e) => { e.stopPropagation(); this[key](); } |
| 10 | + } |
| 11 | + }; |
| 12 | + run(n = 1000) { if (this.data.length) this.clear(); this.add(n); }; |
| 13 | + runlots() { this.run(10000) }; |
| 14 | + add(n = 1000) { |
| 15 | + const adjectives = ["pretty", "large", "big", "small", "tall", "short", "long", "handsome", "plain", "quaint", "clean", "elegant", "easy", "angry", "crazy", "helpful", "mushy", "odd", "unsightly", "adorable", "important", "inexpensive", "cheap", "expensive", "fancy"]; |
| 16 | + const colours = ["red", "yellow", "blue", "green", "pink", "brown", "purple", "brown", "white", "black", "orange"]; |
| 17 | + const nouns = ["table", "chair", "house", "bbq", "desk", "car", "pony", "cookie", "sandwich", "burger", "pizza", "mouse", "keyboard"]; |
| 18 | + const l1 = adjectives.length, l2 = colours.length,l3 = nouns.length; |
| 19 | + |
| 20 | + const nt = 5; // n / 25; // Math.round(n / 50); |
| 21 | + let i, j = 0, r1, r2, r3;; |
| 22 | + |
| 23 | + const itemTemplateContainer = document.getElementById('itemTemplate'); // .content; // .cloneNode(true); |
| 24 | + const itemTemplates = document.createDocumentFragment(); |
| 25 | + const itemTemplate = itemTemplateContainer.firstElementChild; |
| 26 | + if (itemTemplateContainer.children.length >= nt) { |
| 27 | + for (i = 0; i < nt; i++) itemTemplates.appendChild(itemTemplate.cloneNode(true)) |
| 28 | + } else { |
| 29 | + for (i = itemTemplateContainer.children.length; i < nt; i++) itemTemplateContainer.appendChild(itemTemplate.cloneNode(true)); |
| 30 | + itemTemplates.append(...itemTemplateContainer.cloneNode(true).children) |
| 31 | + } |
| 32 | + const ids = Array.prototype.map.call(itemTemplates.querySelectorAll(`td:first-child`), i => i.firstChild) |
| 33 | + const labels = Array.prototype.map.call(itemTemplates.querySelectorAll(`a.lbl`), i => i.firstChild); |
| 34 | + |
| 35 | + while ((n -= nt) >= 0) { |
| 36 | + for (i = 0; i < nt; i++, j++) { |
| 37 | + r1 = Math.round(Math.random() * 1000) % l1; |
| 38 | + r2 = Math.round(Math.random() * 1000) % l2; |
| 39 | + r3 = Math.round(Math.random() * 1000) % l3; |
| 40 | + ids[i].nodeValue = this.index++; |
| 41 | + this.data.push(labels[i].nodeValue = `${adjectives[r1]} ${colours[r2]} ${nouns[r3]}`); |
| 42 | + } |
| 43 | + this.tbody.appendChild(itemTemplates.cloneNode(true)); |
| 44 | + } this.invalidLabels = true; |
| 45 | + }; |
| 46 | + update() { |
| 47 | + if (this.invalidLabels) this.labels = this.tbody.querySelectorAll('a.lbl'); this.invalidLabels = false; |
| 48 | + const labels = this.labels, length = labels.length, data = this.data; |
| 49 | + let i; for (i = 0; i < length; i += 10) labels[i].firstChild.nodeValue = data[i] += ' !!!'; |
| 50 | + }; |
| 51 | + clear() { this.tbody.textContent = ''; this.data = []; this.invalidLabels = true; }; |
| 52 | + |
| 53 | + swaprows() { |
| 54 | + const tbody = this.tbody, data = this.data; |
| 55 | + if (tbody.children.length < 999) return; this.invalidLabels = true; |
| 56 | + const first = tbody.firstElementChild; |
| 57 | + [data[1], data[998]] = [data[998], data[1]]; |
| 58 | + tbody.insertBefore(tbody.insertBefore(first.nextElementSibling, |
| 59 | + tbody.children[998]).nextElementSibling, first.nextElementSibling); |
| 60 | + }; |
| 61 | + onclick() { |
| 62 | + let selected; |
| 63 | + return (e) => { |
| 64 | + e.stopPropagation; |
| 65 | + if (e.target.matches('a.lbl')) { |
| 66 | + e.preventDefault; |
| 67 | + const element = e.target.parentNode.parentNode; |
| 68 | + if (element === selected) selected.className = selected.className ? "" : "danger"; |
| 69 | + else { |
| 70 | + if (selected) selected.className = ""; |
| 71 | + element.className = "danger"; selected = element; |
| 72 | + } |
| 73 | + } else if (e.target.matches('span.remove')) { |
| 74 | + const element = e.target.parentNode.parentNode.parentNode; |
| 75 | + const index = Array.prototype.indexOf.call(this.tbody.children, element); |
| 76 | + element.remove(); this.invalidLabels = true; |
| 77 | + this.data.splice(index, 1); |
| 78 | + } |
| 79 | + } |
| 80 | + } |
| 81 | +}(); |
0 commit comments