cyp/app/js/selection.js

68 lines
1.6 KiB
JavaScript
Raw Normal View History

2020-03-09 21:26:39 +08:00
import * as html from "./html.js";
export default class Selection {
constructor(component) {
this._component = component;
2020-03-09 22:26:36 +08:00
this._items = []; // FIXME ukladat skutecne HTML? co kdyz nastane refresh?
2020-03-09 21:26:39 +08:00
this._node = html.node("cyp-commands", {hidden:true});
}
clear() {
2020-03-10 05:24:31 +08:00
while (this._items.length) { this.remove(this._items[0]); }
2020-03-09 21:26:39 +08:00
}
addCommand(cb, options) {
const button = html.button({icon:options.icon}, "", this._node);
html.node("span", {}, options.label, button);
button.addEventListener("click", _ => cb(this._items));
return button;
}
2020-03-10 05:24:31 +08:00
addCommandAll(items) {
this.addCommand(_ => {
Array.from(this._component.children).forEach(node => this.add(node));
}, {label:"Select all", icon:"plus"});
}
addCommandClear() {
const button = this.addCommand(_ => this.clear(), {icon:"close", label:"Clear"});
button.classList.add("last");
return button;
}
toggle(node) {
if (this._items.includes(node)) {
this.remove(node);
} else {
this.add(node);
}
}
add(node) {
if (this._items.includes(node)) { return; }
2020-03-09 22:26:36 +08:00
const length = this._items.length;
this._items.push(node);
2020-03-09 21:26:39 +08:00
node.classList.add("selected");
2020-03-09 22:26:36 +08:00
if (length == 0) { this._show(); }
2020-03-09 21:26:39 +08:00
}
2020-03-10 05:24:31 +08:00
remove(node) {
2020-03-09 22:26:36 +08:00
const index = this._items.indexOf(node);
this._items.splice(index, 1);
2020-03-09 21:26:39 +08:00
node.classList.remove("selected");
2020-03-09 22:26:36 +08:00
if (this._items.length == 0) { this._hide(); }
2020-03-09 21:26:39 +08:00
}
_show() {
const parent = this._component.closest("cyp-app").querySelector("footer");
parent.appendChild(this._node);
this._node.offsetWidth; // FIXME jde lepe?
this._node.hidden = false;
}
_hide() {
this._node.hidden = true;
this._node.remove();
}
}