UNPKG

@ribajs/bs5

Version:

Bootstrap 5 module for Riba.js

447 lines 33.1 kB
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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