(function(window) { //"use strict"; window.ls.container.get("view").add({ selector: "data-forms-filter", controller: function(document, container, expression, element, form, di) { let name = element.dataset["formsFilter"] || ""; let events = element.dataset["event"] || ""; let serialize = function(obj, prefix) { let str = [], p; for (p in obj) { if (obj.hasOwnProperty(p)) { let k = prefix ? prefix + "[" + p + "]" : p, v = obj[p]; if (v === "") { continue; } str.push( v !== null && typeof v === "object" ? serialize(v, k) : encodeURIComponent(k) + "=" + encodeURIComponent(v) ); } } return str.join("&"); }; let parse = function(filter) { if (filter === "") { return null; } let operatorsMap = ["!=", ">=", "<=", "=", ">", "<"]; let operator = null; for (let key = 0; key < operatorsMap.length; key++) { if (filter.indexOf(operatorsMap[key]) > -1) { operator = operatorsMap[key]; } } if (operator === null) { throw new Error("Invalid operator"); } filter = filter.split(operator); if (filter.length !== 2) { throw new Error("Invalid filter expression"); } return { key: filter[0], value: filter[1], operator: operator }; }; let flatten = function(params) { let list = {}; for (let key in params) { if (params.hasOwnProperty(key)) { if (key !== "filters") { list[key] = params[key]; } else { for (let i = 0; i < params[key].length; i++) { let filter = parse(params[key][i]); if (null === filter) { continue; } list["filters-" + filter.key] = params[key][i]; } } } } return list; }; let apply = function(params) { let cached = container.get(name); cached = cached ? cached.params : []; params = Object.assign(cached, params); container.set( name, { name: name, params: params, query: serialize(params), forward: parseInt(params.offset) + parseInt(params.limit), backward: parseInt(params.offset) - parseInt(params.limit), keys: flatten(params) }, true, name ); document.dispatchEvent( new CustomEvent(name + "-changed", { bubbles: false, cancelable: true }) ); }; switch (element.tagName) { case "INPUT": break; case "TEXTAREA": break; case "BUTTON": element.addEventListener("click", function() { apply( JSON.parse(expression.parse(element.dataset["params"] || "{}")) ); }); break; case "FORM": element.addEventListener("input", function() { apply(form.toJson(element)); }); element.addEventListener("change", function() { apply(form.toJson(element)); }); element.addEventListener("reset", function() { setTimeout(function() { apply(form.toJson(element)); }, 0); }); events = events.trim().split(","); for (let y = 0; y < events.length; y++) { if (events[y] === "init") { element.addEventListener( "rendered", function() { apply(form.toJson(element)); }, { once: true } ); } else { //document.addEventListener(events[y], function (e) { // e.target.removeEventListener(e.type, arguments.callee); // apply(form.toJson(element)); //}); } element.setAttribute("data-event", "none"); // Avoid re-attaching event } break; default: break; } } }); })(window);