2025-04-30 18:14:22 -04:00
|
|
|
import { Controller } from "@hotwired/stimulus";
|
|
|
|
|
|
|
|
// Connects to data-controller="tabs--components"
|
|
|
|
export default class extends Controller {
|
|
|
|
static classes = ["navBtnActive", "navBtnInactive"];
|
|
|
|
static targets = ["panel", "navBtn"];
|
2025-05-15 10:19:56 -04:00
|
|
|
static values = { sessionKey: String, urlParamKey: String };
|
2025-04-30 18:14:22 -04:00
|
|
|
|
|
|
|
show(e) {
|
|
|
|
const btn = e.target.closest("button");
|
|
|
|
const selectedTabId = btn.dataset.id;
|
|
|
|
|
|
|
|
this.navBtnTargets.forEach((navBtn) => {
|
|
|
|
if (navBtn.dataset.id === selectedTabId) {
|
|
|
|
navBtn.classList.add(...this.navBtnActiveClasses);
|
|
|
|
navBtn.classList.remove(...this.navBtnInactiveClasses);
|
|
|
|
} else {
|
|
|
|
navBtn.classList.add(...this.navBtnInactiveClasses);
|
|
|
|
navBtn.classList.remove(...this.navBtnActiveClasses);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
this.panelTargets.forEach((panel) => {
|
|
|
|
if (panel.dataset.id === selectedTabId) {
|
|
|
|
panel.classList.remove("hidden");
|
|
|
|
} else {
|
|
|
|
panel.classList.add("hidden");
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
if (this.urlParamKeyValue) {
|
|
|
|
const url = new URL(window.location.href);
|
|
|
|
url.searchParams.set(this.urlParamKeyValue, selectedTabId);
|
|
|
|
window.history.replaceState({}, "", url);
|
|
|
|
}
|
2025-05-15 10:19:56 -04:00
|
|
|
|
|
|
|
// Update URL with the selected tab
|
|
|
|
if (this.sessionKeyValue) {
|
|
|
|
this.#updateSessionPreference(selectedTabId);
|
|
|
|
}
|
2025-04-30 18:14:22 -04:00
|
|
|
}
|
2025-05-15 10:19:56 -04:00
|
|
|
|
|
|
|
#updateSessionPreference(selectedTabId) {
|
|
|
|
fetch("/current_session", {
|
|
|
|
method: "PUT",
|
|
|
|
headers: {
|
|
|
|
"Content-Type": "application/x-www-form-urlencoded",
|
|
|
|
"X-CSRF-Token": document.querySelector('[name="csrf-token"]').content,
|
|
|
|
Accept: "application/json",
|
|
|
|
},
|
|
|
|
body: new URLSearchParams({
|
|
|
|
"current_session[tab_key]": this.sessionKeyValue,
|
|
|
|
"current_session[tab_value]": selectedTabId,
|
|
|
|
}).toString(),
|
|
|
|
});
|
|
|
|
}
|
2025-04-30 18:14:22 -04:00
|
|
|
}
|