@ribajs/router
Version:
Routing extension for Riba.js inspired by Barba.js
88 lines • 7.61 kB
JavaScript
import { Pjax, Prefetch } from "../services/index.js";
import { Binder } from "@ribajs/core";
import { isObject, isString } from "@ribajs/utils/src/type.js";
import { onRoute, normalizeUrl, isExternalUrl } from "@ribajs/utils/src/url";
export class RouteBinder extends Binder {
static key = "route";
prefetch;
options = {
url: "",
viewId: "main",
removeAfterActivation: false,
newTab: false,
newTabOnExtern: true,
};
_onClick(event) {
const pjax = Pjax.getInstance(this.options.viewId);
if (onRoute(this.options.url, true)) {
console.info("already on this site, do nothing");
event.stopPropagation();
event.preventDefault();
}
else if (isExternalUrl(this.options.url)) {
if (!pjax) {
return;
}
event.stopPropagation();
event.preventDefault();
const newTab = this.options.newTab || this.options.newTabOnExtern;
pjax.goTo(this.options.url, newTab);
}
else {
if (this.options.url) {
if (!pjax) {
return;
}
pjax.onLinkClick(event, this.el, this.options.url, this.options.newTab);
}
}
if (this.options.removeAfterActivation && this.el && this.el.parentNode) {
this.el.parentNode.removeChild(this.el);
}
}
onClick = this._onClick.bind(this);
bind(el) {
el.classList.add("route");
if (window.ssr) {
return;
}
this.onClick = this.onClick.bind(this);
el.addEventListener("click", this.onClick);
}
routine(el, optionsOrUrl) {
if (isString(optionsOrUrl)) {
this.options.url = optionsOrUrl;
}
else if (isObject(optionsOrUrl)) {
this.options = optionsOrUrl;
}
this.options.viewId = this.options.viewId || "main";
this.prefetch = new Prefetch(this.options.viewId);
this.options.newTab = false;
const isAnchorHTMLElement = el.tagName === "A";
if (!this.options.url && isAnchorHTMLElement) {
const url = el.getAttribute("href");
if (url) {
this.options.url = url;
}
}
if (el.getAttribute("target") === "_blank") {
this.options.newTab = true;
}
this.options.url = normalizeUrl(this.options.url).url;
if (isAnchorHTMLElement &&
(!el.href || !el.getAttribute("href")) &&
this.options.url) {
el.setAttribute("href", this.options.url);
el.href = this.options.url;
}
if (!this.options.newTab) {
this.prefetch.initBinder(el, this.options.url);
}
}
unbind(el) {
this.prefetch?.deInitBinder(el, this.options.url);
el.removeEventListener("click", this.onClick);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuYmluZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2JpbmRlcnMvcm91dGUuYmluZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0QyxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBTTdFLE1BQU0sT0FBTyxXQUFZLFNBQVEsTUFBaUM7SUFDaEUsTUFBTSxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUM7SUFFYixRQUFRLENBQVk7SUFFcEIsT0FBTyxHQUFpQjtRQUM5QixHQUFHLEVBQUUsRUFBRTtRQUNQLE1BQU0sRUFBRSxNQUFNO1FBQ2QscUJBQXFCLEVBQUUsS0FBSztRQUM1QixNQUFNLEVBQUUsS0FBSztRQUNiLGNBQWMsRUFBRSxJQUFJO0tBQ3JCLENBQUM7SUFFTSxRQUFRLENBQUMsS0FBWTtRQUUzQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkQsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNwQyxPQUFPLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7WUFDakQsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN6QixDQUFDO2FBQU0sSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDVixPQUFPO1lBQ1QsQ0FBQztZQUNELEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFFdkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUM7WUFDbEUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNWLE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUUsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBRXhFLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUMsQ0FBQztJQUNILENBQUM7SUFFTyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFM0MsSUFBSSxDQUFDLEVBQXFCO1FBQ3hCLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFCLElBQUksTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2YsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxPQUFPLENBQUMsRUFBcUIsRUFBRSxZQUFvQztRQUNqRSxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLFlBQXNCLENBQUM7UUFDNUMsQ0FBQzthQUFNLElBQUksUUFBUSxDQUFDLFlBQTRCLENBQUMsRUFBRSxDQUFDO1lBQ2xELElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBNEIsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDO1FBQ3BELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVsRCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDNUIsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLENBQUMsT0FBTyxLQUFLLEdBQUcsQ0FBQztRQUUvQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksbUJBQW1CLEVBQUUsQ0FBQztZQUM3QyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BDLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ1IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQ3pCLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUM3QixDQUFDO1FBR0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBR3RELElBQ0UsbUJBQW1CO1lBQ25CLENBQUMsQ0FBRSxFQUF3QixDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQ2hCLENBQUM7WUFDRCxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pDLEVBQXdCLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQ3BELENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBRUgsQ0FBQztJQUVELE1BQU0sQ0FBQyxFQUFxQjtRQUMxQixJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsRCxFQUFFLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRCxDQUFDIn0=