Rewrite filters.js as CommonJS, add basic test

This commit is contained in:
Łukasz Mierzwa
2017-07-22 18:55:36 -07:00
parent d166222a86
commit bc7be22e5f
2 changed files with 137 additions and 132 deletions

View File

@@ -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("<span class='badge tag-badge' id='tag-counter-" + chksum + "' data-badge-id='" + chksum + "'></span>");
}
});
};
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("<span class='badge tag-badge' id='tag-counter-" + chksum + "' data-badge-id='" + chksum + "'></span>");
}
});
}
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;

View File

@@ -0,0 +1,7 @@
const filters = require("./filters");
test("filters addBadge()", () => {
// mock data attr with default filter
//document.body.innerHTML = "<div id='filter' data-default-filter='foo=bar'></div>";
filters.addBadge("foo=bar");
});