diff --git a/resources/report/js/filters.js b/resources/report/js/filters.js new file mode 100644 index 00000000..5eba1307 --- /dev/null +++ b/resources/report/js/filters.js @@ -0,0 +1,124 @@ +var filters = { + /* Filter functions return true if the given plugin passes the filter and + should be displayed, otherwise false. */ + + searchFilter: function(plugin, needle) { + if (needle.length == 0) { + return true; + } + + if (plugin.name.toLowerCase().indexOf(needle) != -1 + || plugin.getCrcString().toLowerCase().indexOf(needle) != -1 + || plugin.version.toLowerCase().indexOf(needle) != -1) { + + return true; + } + + var tags = plugin.getTagStrings(); + if (tags.added.toLowerCase().indexOf(needle) != -1 + || tags.removed.toLowerCase().indexOf(needle) != -1) { + + return true; + } + + for (var i = 0; i < plugin.messages.length; ++i) { + if (plugin.messages[i].content[0].str.toLowerCase().indexOf(needle) != -1) { + return true; + } + } + }, + + messagelessFilter: function(plugin) { + if (document.getElementById('hideMessagelessPlugins').checked) { + /* If any messages exist, check if they are hidden or not. Note + that the messages may not be present as elements, so the check + is actually if they would be hidden according to the message + filters. */ + + if (this.allMessageFilter()) { + for (var i = 0; i < plugin.messages.length; ++i) { + if (this.noteFilter(plugin.messages[i]) + && this.doNotCleanFilter(plugin.messages[i])) { + + return true; + } + } + } + + return false; + } else { + return true; + } + }, + + applyPluginFilters: function(plugins) { + var search = document.getElementById('searchBox').value.toLowerCase(); + var hiddenPluginNo = 0; + var filteredPlugins = []; + + plugins.forEach(function(plugin){ + if (this.messagelessFilter(plugin) + && this.searchFilter(plugin, search)) { + + filteredPlugins.push(plugin); + return; + } + ++hiddenPluginNo; + }, this); + + document.getElementById('hiddenPluginNo').textContent = hiddenPluginNo; + + return filteredPlugins; + }, + + /* Message filter functions are run from within plugin cards, when the card's + messages are to be added as elements. Each filter should return true if the + message is to be displayed. */ + + noteFilter: function(message) { + if (document.getElementById('hideNotes').checked) { + return message.type != 'say'; + } else { + return true; + } + }, + + doNotCleanFilter: function(message) { + if (document.getElementById('hideDoNotCleanMessages').checked) { + return message.content[0].str.indexOf(l10n.jed.translate("Do not clean").fetch()) == -1; + } else { + return true; + } + }, + + allMessageFilter: function() { + return !document.getElementById('hideAllPluginMessages').checked; + }, + + applyMessageFilters: function(messages) { + var hiddenMessageNo = 0; + var filteredMessages = []; + + if (this.allMessageFilter()) { + messages.forEach(function(message){ + if (this.noteFilter(message) + && this.doNotCleanFilter(message)) { + + filteredMessages.push(message); + return; + } + ++hiddenMessageNo; + }, this); + } + + document.getElementById('hiddenMessageNo').textContent = hiddenMessageNo; + + return filteredMessages; + }, +}; + +function setFilteredUIData(evt) { + var filtered = filters.applyPluginFilters(loot.game.plugins); + document.getElementById('cardsNav').lastElementChild.data = filtered; + document.getElementById('main').lastElementChild.data = filtered; +} \ No newline at end of file diff --git a/resources/report/js/script.js b/resources/report/js/script.js index f193185c..e82d79d2 100644 --- a/resources/report/js/script.js +++ b/resources/report/js/script.js @@ -431,7 +431,6 @@ function applyFilters(evt) { getConflictingPluginsFromFilter().then(function(conflicts) { for (var i = 0; i < cards.length; ++i) { var isConflictingPlugin = false; - var isMessageless = true; var hasInactivePluginMessages = false; var messages = cards[i].getElementsByTagName('ul')[0].getElementsByTagName('li'); if (cards[i].getAttribute('data-active') == 'false') { @@ -441,33 +440,14 @@ function applyFilters(evt) { isConflictingPlugin = true; } for (var j = 0; j < messages.length; ++j) { - var hasPluginMessages = false; - var hasNotes = false; - var hasDoNotCleanMessages = false; - if (messages[j].parentElement.parentElement.id != 'generalMessages') { - hasPluginMessages = true; - } - if (messages[j].className.indexOf('say') != -1) { - hasNotes = true; - } - if (messages[j].textContent.indexOf(l10n.jed.translate("Do not clean.").fetch()) != -1) { - hasDoNotCleanMessages = true; - } - if ((document.getElementById('hideAllPluginMessages').checked && hasPluginMessages) - || (document.getElementById('hideNotes').checked && hasNotes) - || (document.getElementById('hideDoNotCleanMessages').checked && hasDoNotCleanMessages) - || (document.getElementById('hideInactivePluginMessages').checked && hasInactivePluginMessages)) { + if (document.getElementById('hideInactivePluginMessages').checked && hasInactivePluginMessages) { hideElement(messages[j]); ++hiddenMessageNo; } else { showElement(messages[j]); } - if (messages[j].className.indexOf('hidden') == -1) { - isMessageless = false; - } } - if ((document.getElementById('hideMessagelessPlugins').checked && isMessageless) - || conflicts.length > 0 && !isConflictingPlugin) { + if (conflicts.length > 0 && !isConflictingPlugin) { hideElement(cards[i]); hideElement(entries[i]); ++hiddenPluginNo; @@ -481,45 +461,6 @@ function applyFilters(evt) { }); } -function searchFilter(plugins) { - var search = document.getElementById('searchBox').value.toLowerCase(); - if (search.length > 0) { - var hiddenPluginNo = 0; - var hiddenMessageNo = 0; - var filteredPlugins = []; - /* Check each plugin entry to see if the current search string exists in - its name, version, crc, Bash Tag or message strings. */ - plugins.forEach(function(plugin){ - if (plugin.name.toLowerCase().indexOf(search) != -1 - || plugin.getCrcString().toLowerCase().indexOf(search) != -1 - || plugin.version.toLowerCase().indexOf(search) != -1) { - - filteredPlugins.push(plugin); - return; - } - - var tags = plugin.getTagStrings(); - if (tags.added.toLowerCase().indexOf(search) != -1 - || tags.removed.toLowerCase().indexOf(search) != -1) { - - filteredPlugins.push(plugin); - return; - } - - for (var i = 0; i < plugin.messages.length; ++i) { - if (plugin.messages[i].content[0].str.toLowerCase().indexOf(search) != -1) { - filteredPlugins.push(plugin); - return; - } - } - }); - - return filteredPlugins; - } else { - return plugins; - } -} - function showMessageDialog(title, text, yesNo, closeCallback) { var dialog = document.createElement('loot-message-dialog'); if (yesNo) { @@ -580,8 +521,7 @@ function changeGame(evt) { document.getElementById('main').lastElementChild.scrollToItem(0); /* Now update virtual lists. */ - document.getElementById('cardsNav').lastElementChild.data = loot.game.plugins; - document.getElementById('main').lastElementChild.data = loot.game.plugins; + setFilteredUIData(); /* Update the list sizes to take into account data changes. */ document.getElementById('cardsNav').lastElementChild.updateSize(); @@ -920,6 +860,9 @@ function areSettingsValid() { } function switchSidebarTab(evt) { evt.target.nextElementSibling.selected = evt.target.selected; + if (evt.target.selected == 0) { + document.getElementById('cardsNav').lastElementChild.updateSize(); + } } function showAboutDialog(evt) { @@ -979,12 +922,6 @@ function closeSettingsDialog(evt) { function showSettingsDialog(evt) { document.getElementById('settingsDialog').showModal(); } - -function handleSearch(evt) { - var filtered = searchFilter(loot.game.plugins); - document.getElementById('cardsNav').lastElementChild.data = filtered; - document.getElementById('main').lastElementChild.data = filtered; -} function focusSearch(evt) { if (evt.ctrlKey && evt.keyCode == 70) { //'f' document.getElementById('searchBox').focus(); @@ -1172,11 +1109,11 @@ function setupEventHandlers() { document.getElementById('hideDoNotCleanMessages').addEventListener('change', applyFilters, false); document.getElementById('hideInactivePluginMessages').addEventListener('change', applyFilters, false); document.getElementById('hideAllPluginMessages').addEventListener('change', applyFilters, false); - document.getElementById('hideMessagelessPlugins').addEventListener('change', applyFilters, false); + document.getElementById('hideMessagelessPlugins').addEventListener('change', setFilteredUIData, false); document.body.addEventListener('loot-filter-conflicts', handleConflictsFilter, false); /* Set up event handlers for content filter. */ - document.getElementById('searchBox').addEventListener('change', handleSearch, false); + document.getElementById('searchBox').addEventListener('change', setFilteredUIData, false); window.addEventListener('keyup', focusSearch, false); /* Set up handlers for buttons. */ @@ -1338,10 +1275,9 @@ function initVars() { loot.game.masterlist = game.masterlist; loot.game.globalMessages = game.globalMessages; loot.game.plugins = game.plugins; - document.getElementById('cardsNav').querySelector('core-list').data = loot.game.plugins; - document.getElementById('main').querySelector('core-list').data = loot.game.plugins; + document.getElementById('cardsNav').lastElementChild.data = loot.game.plugins; + document.getElementById('main').lastElementChild.data = loot.game.plugins; - applySavedFilters(); closeProgressDialog(); return ''; }).catch(processCefError); @@ -1439,7 +1375,7 @@ window.addEventListener('polymer-ready', function(e) { /* Set the plugin list's scroll target to its parent. */ document.getElementById('main').querySelector('core-list').scrollTarget = document.getElementById('main'); - require(['bower_components/marked/lib/marked', 'js/l10n', 'js/plugin'], function(markedResponse, l10nResponse) { + require(['bower_components/marked/lib/marked', 'js/l10n', 'js/plugin', 'js/filters'], function(markedResponse, l10nResponse) { marked = markedResponse; l10n = l10nResponse; /* Make sure settings are what I want. */