2
0
mirror of https://github.com/esiur/iui.git synced 2026-04-04 15:08:21 +00:00
Files
iui/src/UI/TabbedTarget.js
2021-10-29 17:09:15 +03:00

203 lines
5.5 KiB
JavaScript

import IUIElement from "../Core/IUIElement.js";
import Tab from "./Tab.js";
import { IUI } from "../Core/IUI.js";
import Target from "../Router/Target.js";
export default IUI.module(class TabbedTarget extends Target {
constructor() {
super({
selected: null,
list: [],
_y: 0,
_x: 0,
auto: true,
});
}
create() {
var self = this;
this._register("select");
this._bar = document.createElement("div");
this._bar.classList.add(this.cssClass + "-bar");
this._ext = document.createElement("span");
this._ext.className = this.cssClass + "-bar-ext";
this._bar.appendChild(this._ext);
//this.insertAdjacentElement("afterBegin", this._bar);
this._body = document.createElement("div");
this._body.className = this.cssClass + "-body";
this.appendChild(this._bar);
this.appendChild(this._body);
var items = [];// this.getElementsByClassName("tab");
for (var i = 0; i < this.children.length; i++)
if (this.children[i] instanceof Tab)
items.push(this.children[i]);
this._observer = new ResizeObserver(x => {
self._body.style.height = x[0].target.offsetHeight + "px";// x[0].contentRect.height + "px";
});
items.map(x => self.add(x));
this.addEventListener("touchstart", function (e) {
var x = e.target;
do {
if (x == self)
break;
var sy = window.getComputedStyle(x)["overflow-x"];
if (x.scrollWidth > x.clientWidth && (sy == "scroll" || sy == "auto"))
return;
} while (x = x.parentElement)
self._x = e.originalEvent ? e.originalEvent.touches[0].clientX : e.touches[0].clientX;
self._y = e.originalEvent ? e.originalEvent.touches[0].clientY : e.touches[0].clientY;
}, { passive: true });
this.addEventListener("touchmove", function (e) {
if (!self._x || !self._y) {
return;
}
var xUp = e.originalEvent ? e.originalEvent.touches[0].clientX : e.touches[0].clientX;
var yUp = e.originalEvent ? e.originalEvent.touches[0].clientY : e.touches[0].clientY;
var xDiff = document.dir == "rtl" ? xUp - self._x : self._x - xUp;
var yDiff = self._y - yUp;
var index = self.list.indexOf(self.selected);
if (Math.abs(xDiff) > Math.abs(yDiff)) {/*most significant*/
if (xDiff > 0) {
if (index < self.list.length - 1) {
self.select(self.list[index + 1]);
//self.selected.scrollIntoView();
}
/* left swipe */
} else {
if (index > 0)
self.select(self.list[index - 1]);
/* right swipe */
}
} else {
if (yDiff > 0) {
/* up swipe */
} else {
/* down swipe */
}
}
/* reset values */
self._x = null;
self._y = null;
}, { passive: true });
}
created() {
//this._updateSize();
}
add(item) {
var label = document.createElement("i-check");
label.innerHTML = item.title;
this._ext.insertAdjacentElement("beforebegin", label);
label.className = this.cssClass + "-button";
item.classList.add(this.cssClass + "-content");
label.content = item;
item.label = label;
this._body.append(item);
this.list.push(item);
var self = this;
label.on("check", function (v) {
//if (v && !self._neglect)
self.select(item);
});
if (item.selected)
this.select(item);
return this;
}
//_updateSize() {
// for (var i = 0; i < this._body.children.length; i++) {
// if (this._body.clientHeight < this._body.children[i].offsetHeight) {
// this._body.style.height = this._body.children[i].offsetHeight + "px";
// }
// }
//}
select(item) {
var tab;
if (item instanceof Tab)
tab = item;
else if (typeof o === 'string' || o instanceof String)
for (var i = 0; i < this.list.length; i++)
if (this.list[i].id == item) {
tab = item;
break;
}
else if (!isNaN(item))
tab = this.list[i];
//this._neglect = true;
var self = this;
this.list.forEach(function (i) {
if (i == tab)
tab.label.check(true);// set(true, false);
else {
i.classList.remove(self.cssClass + "-content-active");
i.label.check(false);// set(false, false);
}
});
//this._neglect = false;
tab.classList.add(this.cssClass + "-content-active");
if (this.selected != null)
this._observer.unobserve(this.selected);
this.selected = tab;
this._observer.observe(this.selected);
if (document.dir == "rtl")
this._bar.scrollLeft = tab.label.offsetLeft + tab.label.clientWidth;
else
this._bar.scrollLeft = tab.label.offsetLeft - tab.label.clientWidth;
this._emit("select", tab);
return this;
}
});