mirror of
https://github.com/odoo/owl.git
synced 2025-10-06 19:59:41 +07:00
125 lines
3.4 KiB
JavaScript
125 lines
3.4 KiB
JavaScript
|
|
import { Component, mount, useState, onPatched} from "@odoo/owl";
|
||
|
|
|
||
|
|
// -----------------------------------------------------------------------------
|
||
|
|
// Data generation
|
||
|
|
// -----------------------------------------------------------------------------
|
||
|
|
|
||
|
|
let idCounter = 1;
|
||
|
|
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"];
|
||
|
|
const colours = ["red", "yellow", "blue", "green", "pink", "brown", "purple", "brown", "white", "black", "orange"];
|
||
|
|
const nouns = ["table", "chair", "house", "bbq", "desk", "car", "pony", "cookie", "sandwich", "burger", "pizza", "mouse", "keyboard"];
|
||
|
|
|
||
|
|
function _random (max) { return Math.round(Math.random() * 1000) % max; };
|
||
|
|
|
||
|
|
function buildData(count) {
|
||
|
|
const data = new Array(count);
|
||
|
|
for (let i = 0; i < count; i++) {
|
||
|
|
const label = `${adjectives[_random(adjectives.length)]} ${colours[_random(colours.length)]} ${nouns[_random(nouns.length)]}`;
|
||
|
|
data[i] = {
|
||
|
|
id: idCounter++,
|
||
|
|
label,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
return data;
|
||
|
|
}
|
||
|
|
|
||
|
|
// -----------------------------------------------------------------------------
|
||
|
|
// Components
|
||
|
|
// -----------------------------------------------------------------------------
|
||
|
|
class Button extends Component {
|
||
|
|
static template = "Button";
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
class Row extends Component {
|
||
|
|
static template = "Row";
|
||
|
|
}
|
||
|
|
|
||
|
|
class Root extends Component {
|
||
|
|
static template = "Root";
|
||
|
|
static components = { Button, Row };
|
||
|
|
|
||
|
|
setup() {
|
||
|
|
this.state = useState({
|
||
|
|
rows: [],
|
||
|
|
selectedRowId: null
|
||
|
|
});
|
||
|
|
this.benchmarking = false;
|
||
|
|
onPatched(() => {
|
||
|
|
if (this.benchmarking) {
|
||
|
|
this.stop();
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
start(descr) {
|
||
|
|
this.benchmarking = `[${descr}]`;
|
||
|
|
console.time(this.benchmarking);
|
||
|
|
}
|
||
|
|
stop() {
|
||
|
|
console.timeEnd(this.benchmarking);
|
||
|
|
this.benchmarking = false;
|
||
|
|
}
|
||
|
|
|
||
|
|
run() {
|
||
|
|
this.start('add1000');
|
||
|
|
this.state.rows = buildData(1000);
|
||
|
|
this.state.selectedRowId = null;
|
||
|
|
}
|
||
|
|
|
||
|
|
runLots() {
|
||
|
|
this.start('add10_000');
|
||
|
|
this.state.rows = buildData(10_000);
|
||
|
|
this.state.selectedRowId = null;
|
||
|
|
}
|
||
|
|
|
||
|
|
add() {
|
||
|
|
this.start('append1000');
|
||
|
|
this.state.rows = this.state.rows.concat(buildData(1000));
|
||
|
|
}
|
||
|
|
|
||
|
|
update() {
|
||
|
|
this.start('update1/10th');
|
||
|
|
let index = 0;
|
||
|
|
const rows = this.state.rows;
|
||
|
|
while (index < rows.length) {
|
||
|
|
rows[index].label = rows[index].label + " !!!";
|
||
|
|
index += 10;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
clear() {
|
||
|
|
this.start('clear');
|
||
|
|
this.state.rows = [];
|
||
|
|
this.state.selectedRowId = null;
|
||
|
|
}
|
||
|
|
|
||
|
|
swapRows() {
|
||
|
|
this.start('swap');
|
||
|
|
const rows = this.state.rows;
|
||
|
|
if (rows.length > 998) {
|
||
|
|
let tmp = rows[1];
|
||
|
|
rows[1] = rows[998];
|
||
|
|
rows[998] = tmp;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
selectRow(id) {
|
||
|
|
this.start('select');
|
||
|
|
this.state.selectedRowId = id;
|
||
|
|
}
|
||
|
|
|
||
|
|
removeRow(id) {
|
||
|
|
this.start('remove1');
|
||
|
|
const rows = this.state.rows;
|
||
|
|
rows.splice(rows.findIndex(row => row.id === id), 1);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
// dev=false for benchmarking. we don't want to benchmark dev code!
|
||
|
|
mount(Root, document.body, { templates: TEMPLATES, dev: false });
|