Skip to content

Commit bd6529f

Browse files
committed
duplicate those files
1 parent 598e45b commit bd6529f

File tree

2 files changed

+113
-0
lines changed

2 files changed

+113
-0
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { html } from 'uhtml';
2+
3+
import { create } from './utils.js';
4+
5+
// the Jumbotron can be used as component, even if it has no effect/subscription
6+
export default ({ title, data }) => html`
7+
<div class="jumbotron">
8+
<div class="row">
9+
<div class="col-md-6">
10+
<h1 .textContent=${title} />
11+
</div>
12+
<div class="col-md-6">
13+
<div class="row">
14+
<div class="col-sm-6 smallpad">
15+
<button id="run" type="button" class="btn btn-primary btn-block"
16+
onclick=${() => data.value = create(1_000)}
17+
>Create 1,000 rows</button>
18+
</div>
19+
<div class="col-sm-6 smallpad">
20+
<button id="runlots" type="button" class="btn btn-primary btn-block"
21+
onclick=${() => data.value = create(10_000)}
22+
>Create 10,000 rows</button>
23+
</div>
24+
<div class="col-sm-6 smallpad">
25+
<button id="add" type="button" class="btn btn-primary btn-block"
26+
onclick=${() => data.value = create(1_000, true)}
27+
>Append 1,000 rows</button>
28+
</div>
29+
<div class="col-sm-6 smallpad">
30+
<button id="update" type="button" class="btn btn-primary btn-block"
31+
onclick=${() => {
32+
const rows = create(-1);
33+
for (let i = 0; i < rows.length; i += 10) rows[i].label += ' !!!';
34+
data.value = rows;
35+
}}
36+
>Update every 10th row</button>
37+
</div>
38+
<div class="col-sm-6 smallpad">
39+
<button id="clear" type="button" class="btn btn-primary btn-block"
40+
onclick=${() => data.value = create(0)}
41+
>Clear</button>
42+
</div>
43+
<div class="col-sm-6 smallpad">
44+
<button id="swaprows" type="button" class="btn btn-primary btn-block"
45+
onclick=${() => {
46+
const rows = create(-1);
47+
if (998 < rows.length) {
48+
[rows[1], rows[998]] = [rows[998], rows[1]];
49+
data.value = rows;
50+
}
51+
}}
52+
>Swap Rows</button>
53+
</div>
54+
</div>
55+
</div>
56+
</div>
57+
</div>
58+
`;

frameworks/keyed/uhtml/src/utils.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
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

Comments
 (0)