UNPKG

@ribajs/bs4

Version:

Bootstrap 4 module for Riba.js

274 lines 20.9 kB
import { Component } from "@ribajs/core"; import { EventDispatcher } from "@ribajs/events"; import { getViewportDimensions, hasChildNodesTrim, } from "@ribajs/utils/src/dom.js"; import { TOGGLE_BUTTON } from "../../constants/index.js"; import { debounce } from "@ribajs/utils/src/control"; export class Bs4SidebarComponent extends Component { static tagName = "bs4-sidebar"; computedStyle; autobind = true; static get observedAttributes() { return [ "id", "container-selector", "position", "width", "auto-show-on-wider-than", "auto-hide-on-slimmer-than", "force-hide-on-location-pathnames", "force-show-on-location-pathnames", "overlay-on-slimmer-than", "watch-new-page-ready-event", ]; } eventDispatcher; routerEvents = new EventDispatcher("main"); scope = { containerSelector: undefined, state: "hidden", oldState: "hidden", id: undefined, width: "250px", position: "left", autoShowOnWiderThan: 1199, autoHideOnSlimmerThan: 1200, watchNewPageReadyEvent: true, forceHideOnLocationPathnames: [], forceShowOnLocationPathnames: [], overlayOnSlimmerThan: 1200, hide: this.hide, show: this.show, toggle: this.toggle, }; constructor() { super(); 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() { let mode; const vw = getViewportDimensions().w; if (vw < this.scope.overlayOnSlimmerThan) { mode = ("overlay-" + this.scope.position); } else { mode = ("side-" + this.scope.position); } return mode; } hide() { this.setState("hidden"); } show() { const state = this.getShowMode(); this.setState(state); } toggle() { if (this.scope.state === "hidden") { this.show(); } else { this.hide(); } } connectedCallback() { super.connectedCallback(); this.init(Bs4SidebarComponent.observedAttributes); this.computedStyle = window.getComputedStyle(this); window.addEventListener("resize", this.onEnvironmentChanges, { passive: true, }); this.onEnvironmentChanges(); } initToggleButtonEventDispatcher() { if (this.eventDispatcher) { this.eventDispatcher.off(TOGGLE_BUTTON.eventNames.toggle, this.toggle, this); this.eventDispatcher.off(TOGGLE_BUTTON.eventNames.init, this.triggerState, this); } this.eventDispatcher = new EventDispatcher(TOGGLE_BUTTON.nsPrefix + this.scope.id); this.eventDispatcher.on(TOGGLE_BUTTON.eventNames.toggle, this.toggle, this); this.eventDispatcher.on(TOGGLE_BUTTON.eventNames.init, this.triggerState, this); } initRouterEventDispatcher() { if (this.scope.watchNewPageReadyEvent) { this.routerEvents.on("newPageReady", this.onEnvironmentChanges, this); } } onHidden() { this.setContainersStyle(this.scope.state); const translateX = this.scope.position === "left" ? "-100%" : "100%"; this.setAttribute("style", `transform:translateX(${translateX});width:${this.scope.width};`); } onSide(state) { this.setContainersStyle(state); this.setAttribute("style", `transform:translateX(0);width:${this.scope.width};`); } onOverlay(state) { this.setContainersStyle(state); this.setAttribute("style", `transform:translateX(0);width:${this.scope.width};`); } triggerState() { this.eventDispatcher?.trigger("state", this.scope.state); } onStateChange() { switch (this.scope.state) { case "side-left": case "side-right": this.onSide(this.scope.state); break; case "overlay-left": case "overlay-right": this.onOverlay(this.scope.state); break; default: this.onHidden(); break; } if (this.eventDispatcher) { this.eventDispatcher.trigger(TOGGLE_BUTTON.eventNames.toggled, this.scope.state); } } get width() { return this.offsetWidth ? this.offsetWidth + "px" : this.scope.width; } setStateByEnvironment() { if (this.scope.forceHideOnLocationPathnames.includes(window.location.pathname)) { return this.hide(); } if (this.scope.forceShowOnLocationPathnames.includes(window.location.pathname)) { return this.show(); } const vw = getViewportDimensions().w; if (this.scope.autoHideOnSlimmerThan > -1 && vw < this.scope.autoHideOnSlimmerThan) { return this.hide(); } if (this.scope.autoShowOnWiderThan > -1 && vw > this.scope.autoShowOnWiderThan) { 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); switch (state) { case "side-left": switch (conStyle.position) { case "fixed": currStyle.left = width; break; default: currStyle.marginLeft = width; break; } break; case "side-right": switch (conStyle.position) { case "fixed": currStyle.right = width; break; default: currStyle.marginRight = width; break; } break; case "hidden": switch (this.scope.oldState) { case "side-left": switch (conStyle.position) { case "fixed": currStyle.left = "0"; break; default: currStyle.marginLeft = "0"; break; } break; case "side-right": switch (conStyle.position) { case "fixed": currStyle.right = "0"; break; default: currStyle.marginRight = "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") { this.initContainers(this.scope.state); } if (attributeName === "id") { this.initToggleButtonEventDispatcher(); } } disconnectedCallback() { super.disconnectedCallback(); this.eventDispatcher?.off(TOGGLE_BUTTON.eventNames.init, this.triggerState, this); this.eventDispatcher?.off(TOGGLE_BUTTON.eventNames.toggle, this.toggle, this); this.routerEvents.off("newPageReady", this.onEnvironmentChanges, this); window.removeEventListener("resize", this.onEnvironmentChanges, false); } 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnM0LXNpZGViYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvYnM0LXNpZGViYXIvYnM0LXNpZGViYXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQW9CLE1BQU0sY0FBYyxDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLGlCQUFpQixHQUNsQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFNckQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLFNBQVM7SUFDekMsTUFBTSxDQUFDLE9BQU8sR0FBRyxhQUFhLENBQUM7SUFFNUIsYUFBYSxDQUF1QjtJQUVwQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBRTFCLE1BQU0sS0FBSyxrQkFBa0I7UUFDM0IsT0FBTztZQUNMLElBQUk7WUFDSixvQkFBb0I7WUFDcEIsVUFBVTtZQUNWLE9BQU87WUFDUCx5QkFBeUI7WUFDekIsMkJBQTJCO1lBQzNCLGtDQUFrQztZQUNsQyxrQ0FBa0M7WUFDbEMseUJBQXlCO1lBQ3pCLDRCQUE0QjtTQUM3QixDQUFDO0lBQ0osQ0FBQztJQUVTLGVBQWUsQ0FBbUI7SUFFbEMsWUFBWSxHQUFHLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTlDLEtBQUssR0FBVTtRQUVwQixpQkFBaUIsRUFBRSxTQUFTO1FBQzVCLEtBQUssRUFBRSxRQUFRO1FBQ2YsUUFBUSxFQUFFLFFBQVE7UUFDbEIsRUFBRSxFQUFFLFNBQVM7UUFDYixLQUFLLEVBQUUsT0FBTztRQUdkLFFBQVEsRUFBRSxNQUFNO1FBQ2hCLG1CQUFtQixFQUFFLElB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