|
| 1 | +// variant of https://github.com/krausest/js-framework-benchmark/blob/master/frameworks/keyed/vanillajs-lite/src/Main.js |
| 2 | + |
| 3 | +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']; |
| 4 | +const colours = ['red', 'yellow', 'blue', 'green', 'pink', 'brown', 'purple', 'brown', 'white', 'black', 'orange']; |
| 5 | +const nouns = ['table', 'chair', 'house', 'bbq', 'desk', 'car', 'pony', 'cookie', 'sandwich', 'burger', 'pizza', 'mouse', 'keyboard']; |
| 6 | + |
| 7 | +const { round, random } = Math; |
| 8 | +const pick = list => list[round(random() * 1000) % list.length]; |
| 9 | +const label = () => `${pick(adjectives)} ${pick(colours)} ${pick(nouns)}`; |
| 10 | + |
| 11 | +let TR, ID = 1, SEL = 0, SIZE = 0, DATA = []; |
| 12 | + |
| 13 | +// creats rows but it keep track of created data so |
| 14 | +// that it's possible to modify it and reflect next time it's needed |
| 15 | +export const create = (count, add) => { |
| 16 | + if (count < 1) { |
| 17 | + if (count < 0) return DATA; |
| 18 | + else TR = null; |
| 19 | + } |
| 20 | + if (add) count += SIZE; |
| 21 | + else DATA = []; |
| 22 | + for (let i = add ? SIZE : 0; i < count; i++) { |
| 23 | + const id = ID++; |
| 24 | + DATA[i] = { id, label: label(), selected: SEL === id }; |
| 25 | + } |
| 26 | + SIZE = count; |
| 27 | + return DATA; |
| 28 | +}; |
| 29 | + |
| 30 | +// create once a handler that keep data state updated |
| 31 | +// by selecting something or removing it |
| 32 | +export const handle = type => ({ currentTarget }) => { |
| 33 | + const tr = currentTarget.closest('tr'); |
| 34 | + const id = +tr.id; |
| 35 | + switch (type) { |
| 36 | + case 'select': { |
| 37 | + if (SEL === id) return; |
| 38 | + if (TR) TR.className = ''; |
| 39 | + tr.className = 'danger'; |
| 40 | + TR = tr; |
| 41 | + SEL = id; |
| 42 | + break; |
| 43 | + } |
| 44 | + case 'remove': { |
| 45 | + if (SEL === id) { |
| 46 | + TR = null; |
| 47 | + SEL = 0; |
| 48 | + } |
| 49 | + DATA.splice(DATA.findIndex(row => row.id === id), 1); |
| 50 | + SIZE--; |
| 51 | + tr.remove(); |
| 52 | + break; |
| 53 | + } |
| 54 | + } |
| 55 | +}; |
0 commit comments