@ribajs/bs5
Version:
Bootstrap 5 module for Riba.js
447 lines • 33.1 kB
JavaScript
import { Component } from "@ribajs/core";
import { TouchEventsService } from "@ribajs/extras";
import { EventDispatcher } from "@ribajs/events";
import { TOGGLE_BUTTON } from "../../constants/index.js";
import { Bs5Service } from "../../services/index.js";
import { hasChildNodesTrim } from "@ribajs/utils/src/dom.js";
import { debounce } from "@ribajs/utils/src/control";
export class Bs5SidebarComponent extends Component {
static tagName = "bs5-sidebar";
static states = [
"hidden",
"side-left",
"side-right",
"overlap-left",
"overlap-right",
"move-left",
"move-right",
];
computedStyle;
autobind = true;
_debug = false;
bs5;
touch = new TouchEventsService(this);
static get observedAttributes() {
return [
"id",
"container-selector",
"position",
"mode",
"width",
"auto-show",
"auto-hide",
"force-hide-on-location-pathnames",
"force-show-on-location-pathnames",
"watch-new-page-ready-event",
"close-on-swipe",
"prevent-scrolling-on-overlap",
];
}
events;
routerEvents = new EventDispatcher("main");
defaults = {
containerSelector: undefined,
state: "hidden",
oldState: "hidden",
id: undefined,
width: "250px",
position: "left",
mode: "overlap",
autoShow: false,
autoHide: false,
watchNewPageReadyEvent: true,
forceHideOnLocationPathnames: [],
forceShowOnLocationPathnames: [],
closeOnSwipe: true,
preventScrollingOnOverlap: true,
hide: this.hide,
show: this.show,
toggle: this.toggle,
};
scope = {
...this.defaults,
};
constructor() {
super();
this.bs5 = Bs5Service.getSingleton();
this.onEnvironmentChanges = this.onEnvironmentChanges.bind(this);
}
setState(state) {
this.scope.oldState = this.scope.state;
this.scope.state = state;
this.onStateChange();
}
getState() {
return this.scope.state;
}
getShowMode() {
const mode = `${this.scope.mode}-${this.scope.position}`;
return mode;
}
hide() {
this.setState("hidden");
}
show() {
const state = this.getShowMode();
this.setState(state);
}
toggle() {
this.debug("toggle state: " + this.scope.state);
if (this.scope.state === "hidden") {
this.show();
}
else {
this.hide();
}
this.debug("toggled state: " + this.scope.state);
}
preventScrolling(scrollEl = document.body) {
scrollEl.style.overflow = "hidden";
}
allowScrolling(scrollEl = document.body) {
if (scrollEl.style.overflow === "hidden") {
scrollEl.style.overflow = "";
}
}
connectedCallback() {
super.connectedCallback();
this.init(Bs5SidebarComponent.observedAttributes);
this.computedStyle = window.getComputedStyle(this);
this.addEventListeners();
this.onEnvironmentChanges();
}
onBreakpoint() {
this.onEnvironmentChanges();
}
addEventListeners() {
this.addEventListener("swipe", this.onSwipe);
this.bs5.events.on("breakpoint:changed", this.onBreakpoint, this);
}
removeEventListeners() {
this.events?.off(TOGGLE_BUTTON.eventNames.init, this.triggerState, this);
this.events?.off(TOGGLE_BUTTON.eventNames.toggle, this.toggle, this);
this.routerEvents.off("newPageReady", this.onEnvironmentChanges, this);
this.bs5.events.off("breakpoint:changed", this.onBreakpoint, this);
}
initToggleButtonEventDispatcher() {
if (this.events) {
this.events.off(TOGGLE_BUTTON.eventNames.toggle, this.toggle, this);
this.events.off(TOGGLE_BUTTON.eventNames.init, this.triggerState, this);
}
const namespace = TOGGLE_BUTTON.nsPrefix + this.scope.id;
this.debug(`Init event dispatcher for namespace ${namespace}`);
this.events = new EventDispatcher(namespace);
this.events.on(TOGGLE_BUTTON.eventNames.toggle, this.toggle, this);
this.events.on(TOGGLE_BUTTON.eventNames.init, this.triggerState, this);
}
initRouterEventDispatcher() {
if (this.scope.watchNewPageReadyEvent) {
this.routerEvents.on("newPageReady", this.onEnvironmentChanges, this);
}
}
_onSwipe(event) {
if (!this.scope.closeOnSwipe) {
return;
}
if (this.scope.state === "side-left" || this.scope.state === "side-right") {
return;
}
if (this.scope.position === "left" && event.detail.direction === "left") {
this.hide();
}
if (this.scope.position === "right" && event.detail.direction === "right") {
this.hide();
}
}
onSwipe = this._onSwipe.bind(this);
onHidden() {
const translateX = this.scope.position === "left" ? "-100%" : "100%";
this.style.transform = `translateX(${translateX})`;
this.width = this.scope.width;
this.setContainersStyle(this.scope.state);
if (this.scope.preventScrollingOnOverlap) {
this.allowScrolling();
}
}
onMove(state) {
this.style.transform = `translateX(0)`;
this.style.width = this.scope.width;
this.width = this.scope.width;
this.setContainersStyle(state);
if (this.scope.preventScrollingOnOverlap) {
this.allowScrolling();
}
}
onSide(state) {
this.style.transform = `translateX(0)`;
this.style.width = this.scope.width;
this.width = this.scope.width;
this.setContainersStyle(state);
if (this.scope.preventScrollingOnOverlap) {
this.allowScrolling();
}
}
onOverlap(state) {
this.style.transform = `translateX(0)`;
this.width = this.scope.width;
this.setContainersStyle(state);
if (this.scope.preventScrollingOnOverlap) {
this.preventScrolling();
}
}
triggerState() {
this.events?.trigger("state", this.scope.state);
}
onStateChange() {
switch (this.scope.state) {
case "side-left":
case "side-right":
this.onSide(this.scope.state);
break;
case "overlap-left":
case "overlap-right":
this.onOverlap(this.scope.state);
break;
case "move-left":
case "move-right":
this.onMove(this.scope.state);
break;
default:
this.onHidden();
break;
}
this.classList.remove(...Bs5SidebarComponent.states);
this.classList.add(this.scope.state);
if (this.events) {
this.events.trigger(TOGGLE_BUTTON.eventNames.toggled, this.scope.state);
}
this.dispatchEvent(new CustomEvent(TOGGLE_BUTTON.eventNames.toggled, {
detail: this.scope.state,
}));
}
get width() {
if (this.scope.width === this.defaults.width) {
return this.offsetWidth + "px";
}
return this.scope.width;
}
set width(width) {
this.scope.width = width;
this.style.width = width;
}
setStateByEnvironment() {
if (this.scope.forceHideOnLocationPathnames.includes(window.location.pathname)) {
return this.hide();
}
if (this.scope.forceShowOnLocationPathnames.includes(window.location.pathname)) {
return this.show();
}
if (this.scope.autoHide) {
return this.hide();
}
if (this.scope.autoShow) {
return this.show();
}
}
_onEnvironmentChanges() {
this.setStateByEnvironment();
}
onEnvironmentChanges = debounce(this._onEnvironmentChanges.bind(this));
getContainers() {
return this.scope.containerSelector
? document.querySelectorAll(this.scope.containerSelector)
: undefined;
}
initContainers(state) {
this.setContainersStyle(state);
}
setContainersStyle(state) {
const containers = this.getContainers() || [];
if (containers) {
for (let i = 0; i < containers.length; i++) {
const container = containers[i];
this.setContainerStyle(container, state);
}
}
}
setContainerStyle(container, state) {
const currStyle = container.style;
if (state) {
const width = this.width;
const conStyle = window.getComputedStyle(container);
if (this.scope.mode === "move" && state.startsWith("overlap-")) {
switch (conStyle.position) {
case "fixed":
case "absolute":
currStyle.left = "0";
currStyle.right = "0";
break;
default:
currStyle.marginLeft = "0";
currStyle.marginRight = "0";
break;
}
}
switch (state) {
case "side-left":
switch (conStyle.position) {
case "fixed":
case "absolute":
currStyle.left = width;
break;
default:
currStyle.marginLeft = width;
break;
}
break;
case "side-right":
switch (conStyle.position) {
case "fixed":
case "absolute":
currStyle.right = width;
break;
default:
currStyle.marginRight = width;
break;
}
break;
case "move-left":
switch (conStyle.position) {
case "fixed":
case "absolute":
currStyle.left = width;
currStyle.right = `-${width}`;
break;
default:
currStyle.marginLeft = width;
currStyle.marginRight = `-${width}`;
break;
}
break;
case "move-right":
switch (conStyle.position) {
case "fixed":
case "absolute":
currStyle.right = width;
currStyle.left = `-${width}`;
break;
default:
currStyle.marginRight = width;
currStyle.marginLeft = `-${width}`;
break;
}
break;
case "hidden":
switch (this.scope.oldState) {
case "side-left":
switch (conStyle.position) {
case "fixed":
case "absolute":
currStyle.left = "0";
break;
default:
currStyle.marginLeft = "0";
break;
}
break;
case "side-right":
switch (conStyle.position) {
case "fixed":
case "absolute":
currStyle.right = "0";
break;
default:
currStyle.marginRight = "0";
break;
}
break;
case "move-left":
switch (conStyle.position) {
case "fixed":
case "absolute":
currStyle.left = "0";
currStyle.right = "0";
break;
default:
currStyle.marginRight = "0";
currStyle.marginLeft = "0";
break;
}
break;
case "move-right":
switch (conStyle.position) {
case "fixed":
case "absolute":
currStyle.right = "0";
currStyle.left = "0";
break;
default:
currStyle.marginRight = "0";
currStyle.marginLeft = "0";
break;
}
break;
default:
break;
}
default:
break;
}
}
container.style.transition = this.computedStyle
? this.computedStyle.transition
: "";
}
async beforeBind() {
await super.beforeBind();
this.scope.oldState = this.getShowMode();
this.initRouterEventDispatcher();
return this.onEnvironmentChanges();
}
async afterBind() {
this.onEnvironmentChanges();
await super.afterBind();
}
requiredAttributes() {
return ["id"];
}
parsedAttributeChangedCallback(attributeName, oldValue, newValue, namespace) {
super.parsedAttributeChangedCallback(attributeName, oldValue, newValue, namespace);
if (attributeName === "containerSelector") {
}
if (attributeName === "id") {
this.initToggleButtonEventDispatcher();
}
switch (attributeName) {
case "containerSelector":
this.initContainers(this.scope.state);
break;
case "id":
this.initToggleButtonEventDispatcher();
break;
case "width":
this.width = newValue;
case "mode":
this.onStateChange();
this.initContainers(this.scope.state);
break;
case "autoHide":
case "autoShow":
this.setStateByEnvironment();
break;
default:
break;
}
}
disconnectedCallback() {
super.disconnectedCallback();
this.removeEventListeners();
}
template() {
if (!hasChildNodesTrim(this)) {
console.warn("No child elements found, this component as no template so you need to define your own as child of this component.");
}
return null;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnM1LXNpZGViYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvYnM1LXNpZGViYXIvYnM1LXNpZGViYXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQW9CLE1BQU0sY0FBYyxDQUFDO0FBQzNELE9BQU8sRUFBRSxrQkFBa0IsRUFBa0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQU9yRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFckQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLFNBQVM7SUFDekMsTUFBTSxDQUFDLE9BQU8sR0FBRyxhQUFhLENBQUM7SUFFL0IsTUFBTSxDQUFDLE1BQU0sR0FBRztRQUNyQixRQUFRO1FBQ1IsV0FBVztRQUNYLFlBQVk7UUFDWixjQUFjO1FBQ2QsZUFBZTtRQUNmLFdBQVc7UUFDWCxZQUFZO0tBQ2IsQ0FBQztJQUVRLGFBQWEsQ0FBdUI7SUFFcEMsUUFBUSxHQUFHLElBQUksQ0FBQztJQUVuQixNQUFNLEdBQUcsS0FBSyxDQUFDO0lBRVosR0FBRyxDQUFhO0lBRWhCLEtBQUssR0FBdUIsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVuRSxNQUFNLEtBQUssa0JBQWtCO1FBQzNCLE9BQU87WUFDTCxJQUFJO1lBQ0osb0JBQW9CO1lBQ3BCLFVBQVU7WUFDVixNQUFNO1lBQ04sT0FBTztZQUNQLFdBQVc7WUFDWCxXQUFXO1lBQ1gsa0NBQWtDO1lBQ2xDLGtD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