diff options
| -rw-r--r-- | classes/Pref_Filters.php | 35 | ||||
| -rw-r--r-- | classes/RSSUtils.php | 5 | ||||
| -rw-r--r-- | js/CommonFilters.js | 57 |
3 files changed, 48 insertions, 49 deletions
diff --git a/classes/Pref_Filters.php b/classes/Pref_Filters.php index b3e378ccc..cfad881a4 100644 --- a/classes/Pref_Filters.php +++ b/classes/Pref_Filters.php @@ -129,29 +129,34 @@ 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"]; - - $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>" . - "</li>"; + $entry, $excerpt_length); + + $rv['items'][] = [ + 'title' => $entry['title'], + 'feed_title' => $entry['feed_title'], + 'date' => mb_substr($entry['date_entered'], 0, 16), + 'content_preview' => $entry['content_preview'], + ]; } } 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..b7bb69a15 100644 --- a/js/CommonFilters.js +++ b/js/CommonFilters.js @@ -30,52 +30,45 @@ 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]}); + results_list.innerHTML += result.items.reduce((current, item) => current + `<li><span class='title'>${item.title}</span><br> + <span class='feed'>${item.feed_title}</span>, <span class='date'>${item.date}</span> + <div class='preview text-muted'>${item.content_preview}</div></li>`, ''); - results_list.innerHTML += tmp.innerHTML; + // 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); + + return; + } } - if (test_dialog.results < 30 && offset < test_dialog.max_offset) { + // all done-- either the backend found no more pre-filtering entries, or test limits were reached + test_dialog.domNode.querySelector(".loading-indicator").hide(); - // get the next batch - window.setTimeout(function () { - test_dialog.getTestResults(params, offset + test_dialog.limit); - }, 0); + 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 { - // all done - - test_dialog.domNode.querySelector(".loading-indicator").hide(); - - 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); - } - + loading_message.innerHTML = __("Found at least %d articles matching this filter:") + .replace("%d", test_dialog.results); } } else if (!result) { |