diff --git a/assets/static/filters.js b/assets/static/filters.js index 5cd9148c5..8bafaf898 100644 --- a/assets/static/filters.js +++ b/assets/static/filters.js @@ -1,146 +1,144 @@ -/* globals sha1 */ // sha1.js +const $ = require("jquery"); +const sha1 = require("js-sha1"); +const Cookies = require("js-cookie"); +require("bootstrap-tagsinput"); -/* globals Autocomplete, Cookies, QueryString, Unsee */ +const autocomplete = require("./autocomplete"); +const unsee = require("./unsee"); +const querystring = require("./querystring"); -/* exported Filters */ -var Filters = (function() { +var selectors = { + filter: "#filter", + icon: "#filter-icon" +}; - var selectors = { - filter: "#filter", - icon: "#filter-icon" - }; - - var addBadge = function(text) { - $.each($("span.tag"), function(i, tag) { - if ($(tag).text() == text) { - var chksum = sha1(text); - $(tag).prepend(""); - } - }); - }; - - var update = function() { - Filters.Updating(); - - // update location so it's easy to share it - QueryString.Set("q", Filters.GetFilters().join(",")); - - // reload alerts - Unsee.Reload(); - }; - - var init = function() { - var initialFilter; - - if ($(selectors.filter).data("default-used") == "false" || $(selectors.filter).data("default-used") === false) { - // user passed ?q=filter string - initialFilter = $(selectors.filter).val(); - } else { - // no ?q=filter string, check if we have default filter cookie - initialFilter = Cookies.get("defaultFilter.v2"); - if (initialFilter === undefined) { - // no cookie, use global default - initialFilter = $(selectors.filter).data("default-filter"); - } +function addBadge(text) { + $.each($("span.tag"), function(i, tag) { + if ($(tag).text() == text) { + var chksum = sha1(text); + $(tag).prepend(""); } + }); +} - var initialFilterArr = initialFilter.split(","); - $(selectors.filter).val(""); - $(".filterbar :input").tagsinput({ - typeaheadjs: { - minLength: 1, - hint: true, - limit: 12, - name: "autocomplete", - source: Autocomplete.Autocomplete() - } - }); - $.each(initialFilterArr, function(i, filter) { - $(selectors.filter).tagsinput("add", filter); - addBadge(filter); - }); +function getFilters() { + return $(selectors.filter).tagsinput("items"); +} - $(selectors.filter).on("itemAdded itemRemoved", function(event) { - Filters.SetFilters(); - // add counter badge to new tag - if (event.type == "itemAdded") { - addBadge(event.item); - } - }); - - $(selectors.filter).tagsinput("focus"); - - // stop when user is typing in the filter bar - $(".bootstrap-tagsinput").typing({ - start: function(event) { - if (event.keyCode != 8 && event.keyCode != 13) Unsee.Pause(); - }, - stop: function(event) { - if (event.keyCode != 8 && event.keyCode != 13) Unsee.WaitForNextReload(); - }, - delay: 1000 - }); - - // fix body padding if needed, input might endup using more than 1 line - $(".bootstrap-tagsinput").bind("DOMSubtreeModified", function() { - $("body").css("padding-top", $(".navbar").height()); - }); - $("input.tt-input").on("change keypress", function() { - $("body").css("padding-top", $(".navbar").height()); - }); - - $(".filterbar").on("resize", function(){ - // hack for fixing padding since input can grow and change height - $("body").css("padding-top", $(".navbar").height()); - }); - - }; - - var getFilters = function() { - return $(selectors.filter).tagsinput("items"); - }; - - var reloadBadges = function(filterData) { - $.each(filterData, function(i, filter) { - $.each($("span.tag-badge"), function(j, tag) { - if (sha1(filter.text) == $(tag).data("badge-id")) { - $(tag).html(filter.hits.toString()); - if (filter.isValid === true) { - $(tag).parent().addClass("label-info").removeClass("label-danger"); - } else { - $(tag).parent().addClass("label-danger").removeClass("label-info"); - } +function reloadBadges(filterData) { + $.each(filterData, function(i, filter) { + $.each($("span.tag-badge"), function(j, tag) { + if (sha1(filter.text) == $(tag).data("badge-id")) { + $(tag).html(filter.hits.toString()); + if (filter.isValid === true) { + $(tag).parent().addClass("label-info").removeClass("label-danger"); + } else { + $(tag).parent().addClass("label-danger").removeClass("label-info"); } - }); + } }); - }; + }); +} - var addFilter = function(text) { - $(selectors.filter).tagsinput("add", text); - }; +function addFilter(text) { + $(selectors.filter).tagsinput("add", text); +} - var setUpdating = function() { - // visual hint that alerts are reloaded due to filter change - $(selectors.icon).removeClass("fa-search fa-pause").addClass("fa-circle-o-notch fa-spin"); - }; +function setUpdating() { + // visual hint that alerts are reloaded due to filter change + $(selectors.icon).removeClass("fa-search fa-pause").addClass("fa-circle-o-notch fa-spin"); +} - var updateDone = function() { - $(selectors.icon).removeClass("fa-circle-o-notch fa-spin fa-pause").addClass("fa-search"); - }; +function updateDone() { + $(selectors.icon).removeClass("fa-circle-o-notch fa-spin fa-pause").addClass("fa-search"); +} - var setPause = function() { - $(selectors.icon).removeClass("fa-circle-o-notch fa-spin fa-search").addClass("fa-pause"); - }; +function setPause() { + $(selectors.icon).removeClass("fa-circle-o-notch fa-spin fa-search").addClass("fa-pause"); +} - return { - Init: init, - AddFilter: addFilter, - SetFilters: update, - GetFilters: getFilters, - ReloadBadges: reloadBadges, - UpdateCompleted: updateDone, - Updating: setUpdating, - Pause: setPause - }; +function setFilters() { + setUpdating(); -}()); + // update location so it's easy to share it + querystring.update("q", getFilters().join(",")); + + // reload alerts + unsee.triggerReload(); +} + +function init() { + var initialFilter; + + if ($(selectors.filter).data("default-used") == "false" || $(selectors.filter).data("default-used") === false) { + // user passed ?q=filter string + initialFilter = $(selectors.filter).val(); + } else { + // no ?q=filter string, check if we have default filter cookie + initialFilter = Cookies.get("defaultFilter.v2"); + if (initialFilter === undefined) { + // no cookie, use global default + initialFilter = $(selectors.filter).data("default-filter"); + } + } + + var initialFilterArr = initialFilter.split(","); + $(selectors.filter).val(""); + $(".filterbar :input").tagsinput({ + typeaheadjs: { + minLength: 1, + hint: true, + limit: 12, + name: "autocomplete", + source: autocomplete.getAutocomplete() + } + }); + $.each(initialFilterArr, function(i, filter) { + $(selectors.filter).tagsinput("add", filter); + addBadge(filter); + }); + + $(selectors.filter).on("itemAdded itemRemoved", function(event) { + setFilters(); + // add counter badge to new tag + if (event.type == "itemAdded") { + addBadge(event.item); + } + }); + + $(selectors.filter).tagsinput("focus"); + + // stop when user is typing in the filter bar + $(".bootstrap-tagsinput").typing({ + start: function(event) { + if (event.keyCode != 8 && event.keyCode != 13) unsee.pause(); + }, + stop: function(event) { + if (event.keyCode != 8 && event.keyCode != 13) unsee.resume(); + }, + delay: 1000 + }); + + // fix body padding if needed, input might endup using more than 1 line + $(".bootstrap-tagsinput").bind("DOMSubtreeModified", function() { + $("body").css("padding-top", $(".navbar").height()); + }); + $("input.tt-input").on("change keypress", function() { + $("body").css("padding-top", $(".navbar").height()); + }); + + $(".filterbar").on("resize", function(){ + // hack for fixing padding since input can grow and change height + $("body").css("padding-top", $(".navbar").height()); + }); + +} + +exports.init = init; +exports.addFilter = addFilter; +exports.setFilters = setFilters; +exports.getFilters = getFilters; +exports.reloadBadges = reloadBadges; +exports.updateDone = updateDone; +exports.setUpdating = setUpdating; +exports.setPause = setPause; diff --git a/assets/static/filters.test.js b/assets/static/filters.test.js new file mode 100644 index 000000000..4f3c2d5bb --- /dev/null +++ b/assets/static/filters.test.js @@ -0,0 +1,7 @@ +const filters = require("./filters"); + +test("filters addBadge()", () => { + // mock data attr with default filter + //document.body.innerHTML = "
"; + filters.addBadge("foo=bar"); +});