mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-25 20:46:48 +00:00
- productForm is not accessible on the orders page - putting the check to do the scrollIntoView only if the productForm is available
93 lines
2.3 KiB
JavaScript
93 lines
2.3 KiB
JavaScript
import { Controller } from "stimulus";
|
|
|
|
export default class extends Controller {
|
|
static targets = ["form"];
|
|
static values = { restore: String }; // Query string, eg: "?color=red&size=small"
|
|
|
|
connect() {
|
|
this.#setup();
|
|
}
|
|
|
|
changePage(event) {
|
|
const productsForm = document.querySelector("#products-form");
|
|
if (productsForm) productsForm.scrollIntoView({ behavior: "smooth" });
|
|
|
|
this.page.value = event.target.dataset.page;
|
|
this.submitSearch();
|
|
this.page.value = 1;
|
|
}
|
|
|
|
changePerPage(event) {
|
|
this.per_page.value = parseInt(event.target.value);
|
|
this.submitSearch();
|
|
}
|
|
|
|
changeSorting(event) {
|
|
let current = event.target.dataset.current;
|
|
let column = event.target.dataset.column;
|
|
|
|
this.sort.value = current === `${column} asc` ? `${column} desc` : `${column} asc`;
|
|
|
|
this.submitSearch();
|
|
}
|
|
|
|
submitSearch() {
|
|
this.form.requestSubmit();
|
|
}
|
|
|
|
reset() {
|
|
this.clearForm();
|
|
this.submitSearch();
|
|
}
|
|
|
|
clearForm() {
|
|
this.form.reset();
|
|
this.#clearCustomElements();
|
|
if (this.page) this.page.value = 1;
|
|
if (this.sort) this.sort.value = this.sort.dataset.default;
|
|
}
|
|
|
|
// private
|
|
|
|
#setup() {
|
|
if (this.hasFormTarget) {
|
|
this.form = this.formTarget;
|
|
this.form.controller = this;
|
|
if (this.restoreValue) this.#restoreFormState(this.form, this.restoreValue);
|
|
} else {
|
|
this.form = document.querySelector("form[data-search-target=form]");
|
|
}
|
|
|
|
this.page = this.form.querySelector(".page");
|
|
this.per_page = this.form.querySelector(".per-page");
|
|
this.sort = this.form.querySelector(".sort");
|
|
}
|
|
|
|
#clearCustomElements() {
|
|
window.dispatchEvent(new CustomEvent("flatpickr:clear"));
|
|
|
|
this.form.querySelectorAll(".tomselected").forEach((select) => {
|
|
select.tomselect?.clear();
|
|
});
|
|
}
|
|
|
|
#restoreFormState(form, queryString) {
|
|
const params = new URLSearchParams(queryString);
|
|
|
|
// Apply non-checkbox values
|
|
for (const [key, value] of params.entries()) {
|
|
const input = form.elements[key];
|
|
if (input && input.type !== "checkbox") input.value = value;
|
|
}
|
|
|
|
// Deal with checkbox values
|
|
form.querySelectorAll("[type=checkbox]").forEach((checkbox) => {
|
|
checkbox.checked = !!params.get(checkbox.name);
|
|
});
|
|
|
|
setTimeout(() => {
|
|
window.dispatchEvent(new CustomEvent("flatpickr:change"));
|
|
});
|
|
}
|
|
}
|