summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--classes/Pref_Filters.php29
-rw-r--r--classes/RSSUtils.php5
-rw-r--r--js/CommonFilters.js60
3 files changed, 47 insertions, 47 deletions
diff --git a/classes/Pref_Filters.php b/classes/Pref_Filters.php
index b3e378ccc..0c0a0ea03 100644
--- a/classes/Pref_Filters.php
+++ b/classes/Pref_Filters.php
@@ -129,28 +129,31 @@ class Pref_Filters extends Handler_Protected {
if (count($scope_qparts) > 0)
$query->where_raw(join($filter['match_any_rule'] ? ' OR ' : ' AND ', $scope_qparts));
- $rv = [];
+ $entries = $query->find_array();
- foreach ($query->find_array() as $line) {
- $rc = RSSUtils::get_article_filters(array($filter), $line['title'], $line['content'], $line['link'],
- $line['author'], explode(",", $line['tag_cache']));
+ $rv = [
+ 'pre_filtering_count' => count($entries),
+ 'items' => [],
+ ];
+
+ foreach ($entries as $entry) {
+ $rc = RSSUtils::get_article_filters(array($filter), $entry['title'], $entry['content'], $entry['link'],
+ $entry['author'], explode(",", $entry['tag_cache']));
if (count($rc) > 0) {
- $line["content_preview"] = truncate_string(strip_tags($line["content"]), 200, '…');
+ $entry["content_preview"] = truncate_string(strip_tags($entry["content"]), 200, '…');
$excerpt_length = 100;
PluginHost::getInstance()->chain_hooks_callback(PluginHost::HOOK_QUERY_HEADLINES,
- function ($result) use (&$line) {
- $line = $result;
+ function ($result) use (&$entry) {
+ $entry = $result;
},
- $line, $excerpt_length);
-
- $content_preview = $line["content_preview"];
+ $entry, $excerpt_length);
- $rv[] = "<li><span class='title'>" . $line["title"] . "</span><br/>" .
- "<span class='feed'>" . $line['feed_title'] . "</span>, <span class='date'>" . mb_substr($line["date_entered"], 0, 16) . "</span>" .
- "<div class='preview text-muted'>" . $content_preview . "</div>" .
+ $rv['items'][] = "<li><span class='title'>" . $entry["title"] . "</span><br/>" .
+ "<span class='feed'>" . $entry['feed_title'] . "</span>, <span class='date'>" . mb_substr($entry["date_entered"], 0, 16) . "</span>" .
+ "<div class='preview text-muted'>" . $entry["content_preview"] . "</div>" .
"</li>";
}
}
diff --git a/classes/RSSUtils.php b/classes/RSSUtils.php
index 3ede6bf3e..b68f7e296 100644
--- a/classes/RSSUtils.php
+++ b/classes/RSSUtils.php
@@ -1514,10 +1514,11 @@ class RSSUtils {
} */
/**
+ * @todo rename this method to indicate it returns the filter actions that should be ran
* @param array<int, array<string, mixed>> $filters
* @param array<int, string> $tags
- * @param array<int, array<string, mixed>>|null $matched_rules
- * @param array<int, array<string, mixed>>|null $matched_filters
+ * @param array<int, array<string, mixed>>|null &$matched_rules
+ * @param array<int, array<string, mixed>>|null &$matched_filters
*
* @return array<int, array<string, string>> An array of filter action arrays with keys "type" and "param"
*/
diff --git a/js/CommonFilters.js b/js/CommonFilters.js
index fb1cfacb9..7b7d64958 100644
--- a/js/CommonFilters.js
+++ b/js/CommonFilters.js
@@ -30,52 +30,48 @@ const Filters = {
params.offset = offset;
params.limit = test_dialog.limit;
- console.log("getTestResults:" + offset);
-
xhr.json("backend.php", params, (result) => {
try {
if (result && test_dialog && test_dialog.open) {
- test_dialog.results += result.length;
-
- console.log("got results:" + result.length);
-
const loading_message = test_dialog.domNode.querySelector(".loading-message");
const results_list = test_dialog.domNode.querySelector(".filter-results-list");
- loading_message.innerHTML = __("Looking for articles (%d processed, %f found)...")
- .replace("%f", test_dialog.results)
- .replace("%d", offset);
+ if (result.pre_filtering_count > 0) {
+ test_dialog.results += result.items.length;
- console.log(offset + " " + test_dialog.max_offset);
+ loading_message.innerHTML = __("Looking for articles (%d processed, %f found)...")
+ .replace("%f", test_dialog.results)
+ .replace("%d", offset);
- for (let i = 0; i < result.length; i++) {
- const tmp = dojo.create("div", { innerHTML: result[i]});
+ for (let i = 0; i < result.items.length; i++) {
+ const tmp = dojo.create("div", { innerHTML: result.items[i]});
- results_list.innerHTML += tmp.innerHTML;
- }
-
- if (test_dialog.results < 30 && offset < test_dialog.max_offset) {
+ results_list.innerHTML += tmp.innerHTML;
+ }
- // get the next batch
- window.setTimeout(function () {
- test_dialog.getTestResults(params, offset + test_dialog.limit);
- }, 0);
+ // get the next batch if there may be more available and testing limits haven't been reached
+ if (result.pre_filtering_count === test_dialog.limit &&
+ test_dialog.results < 30 &&
+ offset < test_dialog.max_offset) {
+ window.setTimeout(function () {
+ test_dialog.getTestResults(params, offset + test_dialog.limit);
+ }, 0);
- } else {
- // all done
-
- test_dialog.domNode.querySelector(".loading-indicator").hide();
+ return;
+ }
+ }
- if (test_dialog.results == 0) {
- results_list.innerHTML = `<li class="text-center text-muted">
- ${__('No recent articles matching this filter have been found.')}</li>`;
+ // all done-- either the backend found no more pre-filtering entries, or test limits were reached
+ test_dialog.domNode.querySelector(".loading-indicator").hide();
- loading_message.innerHTML = __("Articles matching this filter:");
- } else {
- loading_message.innerHTML = __("Found at least %d articles matching this filter:")
- .replace("%d", test_dialog.results);
- }
+ if (test_dialog.results == 0) {
+ results_list.innerHTML = `<li class="text-center text-muted">
+ ${__('No recent articles matching this filter have been found.')}</li>`;
+ loading_message.innerHTML = __("Articles matching this filter:");
+ } else {
+ loading_message.innerHTML = __("Found at least %d articles matching this filter:")
+ .replace("%d", test_dialog.results);
}
} else if (!result) {