I did not invest the time to send an official proposal (or just do a PR) yet. It’s not that urgent any more as we now have an official way to change the URL from JS using liveSocket.js().patch() / liveSocket.js().navigate(), so the patch_params approach I sent earlier can be done without using private API like this:
window.addEventListener("link:patch-params", (e) => {
const type = e.detail?.type || "patch";
const path = e.detail?.path || document.location.pathname;
const params = new URLSearchParams(e.detail?.params || "");
const removeParams = e.detail?.remove_params || [];
const searchParams = new URLSearchParams(document.location.search);
Array.from(params.keys()).forEach((key) => searchParams.delete(key));
Array.from(params.entries()).forEach(([key, value]) => {
searchParams.append(key, value);
});
removeParams.forEach((key) => {
searchParams.delete(key);
});
const search = searchParams.toString();
const href = search ? (path + "?" + search) : path;
if (type == "patch") {
liveSocket.js().patch(href, { replace: e.detail?.replace });
} else if (type == "navigate") {
liveSocket.js().navigate(href, { replace: e.detail?.replace });
} else {
document.location.href = href;
}
});
Now, since the idea of that script is to serialize the operations to do in the JS command, passing a function for map/filter is not something we can do. Instead, you could extend the snippet I shared with a new option, e.g. drop_matching: ["sort[]", "first_col"] and then add extra JS to handle that.






















