Spaces:
Running
Running
Merge pull request #260 from neon-mmd/feat-inform-user-when-no-engines-are-selected
Browse files- Cargo.lock +5 -5
- Cargo.toml +1 -1
- public/images/no_selection.png +0 -0
- public/static/themes/simple.css +8 -4
- public/templates/search.html +15 -1
- src/models/aggregation_models.rs +14 -0
- src/server/routes/search.rs +24 -11
Cargo.lock
CHANGED
@@ -510,7 +510,7 @@ checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa"
|
|
510 |
dependencies = [
|
511 |
"camino",
|
512 |
"cargo-platform",
|
513 |
-
"semver 1.0.
|
514 |
"serde",
|
515 |
"serde_json",
|
516 |
]
|
@@ -2864,7 +2864,7 @@ version = "0.4.0"
|
|
2864 |
source = "registry+https://github.com/rust-lang/crates.io-index"
|
2865 |
checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
|
2866 |
dependencies = [
|
2867 |
-
"semver 1.0.
|
2868 |
]
|
2869 |
|
2870 |
[[package]]
|
@@ -3002,9 +3002,9 @@ dependencies = [
|
|
3002 |
|
3003 |
[[package]]
|
3004 |
name = "semver"
|
3005 |
-
version = "1.0.
|
3006 |
source = "registry+https://github.com/rust-lang/crates.io-index"
|
3007 |
-
checksum = "
|
3008 |
dependencies = [
|
3009 |
"serde",
|
3010 |
]
|
@@ -3932,7 +3932,7 @@ dependencies = [
|
|
3932 |
|
3933 |
[[package]]
|
3934 |
name = "websurfx"
|
3935 |
-
version = "0.
|
3936 |
dependencies = [
|
3937 |
"actix-cors",
|
3938 |
"actix-files",
|
|
|
510 |
dependencies = [
|
511 |
"camino",
|
512 |
"cargo-platform",
|
513 |
+
"semver 1.0.19",
|
514 |
"serde",
|
515 |
"serde_json",
|
516 |
]
|
|
|
2864 |
source = "registry+https://github.com/rust-lang/crates.io-index"
|
2865 |
checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
|
2866 |
dependencies = [
|
2867 |
+
"semver 1.0.19",
|
2868 |
]
|
2869 |
|
2870 |
[[package]]
|
|
|
3002 |
|
3003 |
[[package]]
|
3004 |
name = "semver"
|
3005 |
+
version = "1.0.19"
|
3006 |
source = "registry+https://github.com/rust-lang/crates.io-index"
|
3007 |
+
checksum = "ad977052201c6de01a8ef2aa3378c4bd23217a056337d1d6da40468d267a4fb0"
|
3008 |
dependencies = [
|
3009 |
"serde",
|
3010 |
]
|
|
|
3932 |
|
3933 |
[[package]]
|
3934 |
name = "websurfx"
|
3935 |
+
version = "0.23.0"
|
3936 |
dependencies = [
|
3937 |
"actix-cors",
|
3938 |
"actix-files",
|
Cargo.toml
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
[package]
|
2 |
name = "websurfx"
|
3 |
-
version = "0.
|
4 |
edition = "2021"
|
5 |
description = "An open-source alternative to Searx that provides clean, ad-free, and organic results with incredible speed while keeping privacy and security in mind."
|
6 |
repository = "https://github.com/neon-mmd/websurfx"
|
|
|
1 |
[package]
|
2 |
name = "websurfx"
|
3 |
+
version = "0.23.0"
|
4 |
edition = "2021"
|
5 |
description = "An open-source alternative to Searx that provides clean, ad-free, and organic results with incredible speed while keeping privacy and security in mind."
|
6 |
repository = "https://github.com/neon-mmd/websurfx"
|
public/images/no_selection.png
ADDED
![]() |
public/static/themes/simple.css
CHANGED
@@ -155,7 +155,8 @@ body {
|
|
155 |
height: 1.2rem;
|
156 |
}
|
157 |
.results .result_disallowed,
|
158 |
-
.results .result_filtered
|
|
|
159 |
display: flex;
|
160 |
justify-content: center;
|
161 |
align-items: center;
|
@@ -166,18 +167,21 @@ body {
|
|
166 |
}
|
167 |
|
168 |
.results .result_disallowed .user_query,
|
169 |
-
.results .result_filtered .user_query
|
|
|
170 |
color: var(--background-color);
|
171 |
font-weight: 300;
|
172 |
}
|
173 |
|
174 |
.results .result_disallowed img,
|
175 |
-
.results .result_filtered img
|
|
|
176 |
width: 30rem;
|
177 |
}
|
178 |
|
179 |
.results .result_disallowed div,
|
180 |
-
.results .result_filtered div
|
|
|
181 |
display: flex;
|
182 |
flex-direction: column;
|
183 |
gap: 1rem;
|
|
|
155 |
height: 1.2rem;
|
156 |
}
|
157 |
.results .result_disallowed,
|
158 |
+
.results .result_filtered,
|
159 |
+
.results .result_engine_not_selected {
|
160 |
display: flex;
|
161 |
justify-content: center;
|
162 |
align-items: center;
|
|
|
167 |
}
|
168 |
|
169 |
.results .result_disallowed .user_query,
|
170 |
+
.results .result_filtered .user_query,
|
171 |
+
.results .result_engine_not_selected .user_query {
|
172 |
color: var(--background-color);
|
173 |
font-weight: 300;
|
174 |
}
|
175 |
|
176 |
.results .result_disallowed img,
|
177 |
+
.results .result_filtered img,
|
178 |
+
.results .result_engine_not_selected img {
|
179 |
width: 30rem;
|
180 |
}
|
181 |
|
182 |
.results .result_disallowed div,
|
183 |
+
.results .result_filtered div,
|
184 |
+
.results .result_engine_not_selected div {
|
185 |
display: flex;
|
186 |
flex-direction: column;
|
187 |
gap: 1rem;
|
public/templates/search.html
CHANGED
@@ -45,6 +45,20 @@
|
|
45 |
</div>
|
46 |
<img src="./images/filter.png" alt="Image of a paper inside a funnel" />
|
47 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
48 |
{{else}}
|
49 |
<div class="result_not_found">
|
50 |
<p>Your search - {{{this.pageQuery}}} - did not match any documents.</p>
|
@@ -56,7 +70,7 @@
|
|
56 |
</ul>
|
57 |
<img src="./images/no_results.gif" alt="Man fishing gif" />
|
58 |
</div>
|
59 |
-
{{/if}} {{/if}} {{/if}}
|
60 |
</div>
|
61 |
<div class="page_navigation">
|
62 |
<button type="button" onclick="navigate_backward()">
|
|
|
45 |
</div>
|
46 |
<img src="./images/filter.png" alt="Image of a paper inside a funnel" />
|
47 |
</div>
|
48 |
+
{{else}} {{#if noEnginesSelected}}
|
49 |
+
<div class="result_engine_not_selected">
|
50 |
+
<div class="description">
|
51 |
+
<p>
|
52 |
+
No results could be fetched for your search "<span class="user_query">{{{this.pageQuery}}}</span>" .
|
53 |
+
</p>
|
54 |
+
<p class="description_paragraph">Dear user,</p>
|
55 |
+
<p class="description_paragraph">
|
56 |
+
No results could be retrieved from the upstream search engines as no
|
57 |
+
upstream search engines were selected from the settings page.
|
58 |
+
</p>
|
59 |
+
</div>
|
60 |
+
<img src="./images/no_selection.png" alt="Image of a white cross inside a red circle" />
|
61 |
+
</div>
|
62 |
{{else}}
|
63 |
<div class="result_not_found">
|
64 |
<p>Your search - {{{this.pageQuery}}} - did not match any documents.</p>
|
|
|
70 |
</ul>
|
71 |
<img src="./images/no_results.gif" alt="Man fishing gif" />
|
72 |
</div>
|
73 |
+
{{/if}} {{/if}} {{/if}} {{/if}}
|
74 |
</div>
|
75 |
<div class="page_navigation">
|
76 |
<button type="button" onclick="navigate_backward()">
|
src/models/aggregation_models.rs
CHANGED
@@ -124,6 +124,9 @@ pub struct SearchResults {
|
|
124 |
pub filtered: bool,
|
125 |
/// Stores the safe search level `safesearch` provided in the search url.
|
126 |
pub safe_search_level: u8,
|
|
|
|
|
|
|
127 |
}
|
128 |
|
129 |
impl SearchResults {
|
@@ -150,6 +153,7 @@ impl SearchResults {
|
|
150 |
disallowed: Default::default(),
|
151 |
filtered: Default::default(),
|
152 |
safe_search_level: Default::default(),
|
|
|
153 |
}
|
154 |
}
|
155 |
|
@@ -186,4 +190,14 @@ impl SearchResults {
|
|
186 |
pub fn set_safe_search_level(&mut self, safe_search_level: u8) {
|
187 |
self.safe_search_level = safe_search_level;
|
188 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
189 |
}
|
|
|
124 |
pub filtered: bool,
|
125 |
/// Stores the safe search level `safesearch` provided in the search url.
|
126 |
pub safe_search_level: u8,
|
127 |
+
/// Stores the flag option which holds the check value that whether any search engines were
|
128 |
+
/// selected or not.
|
129 |
+
pub no_engines_selected: bool,
|
130 |
}
|
131 |
|
132 |
impl SearchResults {
|
|
|
153 |
disallowed: Default::default(),
|
154 |
filtered: Default::default(),
|
155 |
safe_search_level: Default::default(),
|
156 |
+
no_engines_selected: Default::default(),
|
157 |
}
|
158 |
}
|
159 |
|
|
|
190 |
pub fn set_safe_search_level(&mut self, safe_search_level: u8) {
|
191 |
self.safe_search_level = safe_search_level;
|
192 |
}
|
193 |
+
|
194 |
+
/// A getter function that gets the value of `no_engines_selected`.
|
195 |
+
pub fn no_engines_selected(&self) -> bool {
|
196 |
+
self.no_engines_selected
|
197 |
+
}
|
198 |
+
|
199 |
+
/// A setter function to set the `no_engines_selected` to true.
|
200 |
+
pub fn set_no_engines_selected(&mut self) {
|
201 |
+
self.no_engines_selected = true;
|
202 |
+
}
|
203 |
}
|
src/server/routes/search.rs
CHANGED
@@ -205,16 +205,26 @@ async fn results(
|
|
205 |
},
|
206 |
};
|
207 |
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
218 |
}
|
219 |
None => {
|
220 |
aggregate(
|
@@ -229,7 +239,10 @@ async fn results(
|
|
229 |
.await?
|
230 |
}
|
231 |
};
|
232 |
-
if results.engine_errors_info().is_empty()
|
|
|
|
|
|
|
233 |
results.set_filtered();
|
234 |
}
|
235 |
results.add_style(&config.style);
|
|
|
205 |
},
|
206 |
};
|
207 |
|
208 |
+
match engines.is_empty() {
|
209 |
+
false => {
|
210 |
+
aggregate(
|
211 |
+
query,
|
212 |
+
page,
|
213 |
+
config.aggregator.random_delay,
|
214 |
+
config.debug,
|
215 |
+
&engines,
|
216 |
+
config.request_timeout,
|
217 |
+
safe_search_level,
|
218 |
+
)
|
219 |
+
.await?
|
220 |
+
}
|
221 |
+
true => {
|
222 |
+
let mut search_results = SearchResults::default();
|
223 |
+
search_results.set_no_engines_selected();
|
224 |
+
search_results.set_page_query(query);
|
225 |
+
search_results
|
226 |
+
}
|
227 |
+
}
|
228 |
}
|
229 |
None => {
|
230 |
aggregate(
|
|
|
239 |
.await?
|
240 |
}
|
241 |
};
|
242 |
+
if results.engine_errors_info().is_empty()
|
243 |
+
&& results.results().is_empty()
|
244 |
+
&& !results.no_engines_selected()
|
245 |
+
{
|
246 |
results.set_filtered();
|
247 |
}
|
248 |
results.add_style(&config.style);
|