mirror of
https://github.com/MarginaliaSearch/MarginaliaSearch.git
synced 2025-10-05 21:22:39 +02:00
(search) Persist language choice in the search form
This commit is contained in:
@@ -12,7 +12,6 @@ import nu.marginalia.db.DbDomainQueries;
|
||||
import nu.marginalia.model.EdgeDomain;
|
||||
import nu.marginalia.model.EdgeUrl;
|
||||
import nu.marginalia.model.crawl.DomainIndexingState;
|
||||
import nu.marginalia.search.command.SearchParameters;
|
||||
import nu.marginalia.search.model.*;
|
||||
import nu.marginalia.search.results.UrlDeduplicator;
|
||||
import nu.marginalia.search.svc.SearchQueryCountService;
|
||||
@@ -141,6 +140,7 @@ public class SearchOperator {
|
||||
.problems(problems)
|
||||
.evalResult(evalResult)
|
||||
.results(clusteredResults)
|
||||
.languageIsoCode(userParams.languageIsoCode())
|
||||
.filters(new SearchFilters(userParams))
|
||||
.focusDomain(focusDomain)
|
||||
.focusDomainId(focusDomainId)
|
||||
|
@@ -3,7 +3,7 @@ package nu.marginalia.search;
|
||||
import nu.marginalia.api.searchquery.RpcQueryLimits;
|
||||
import nu.marginalia.api.searchquery.RpcTemporalBias;
|
||||
import nu.marginalia.api.searchquery.model.query.*;
|
||||
import nu.marginalia.search.command.SearchParameters;
|
||||
import nu.marginalia.search.model.SearchParameters;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
@@ -3,6 +3,7 @@ package nu.marginalia.search.command;
|
||||
import com.google.inject.Inject;
|
||||
import io.jooby.ModelAndView;
|
||||
import nu.marginalia.search.command.commands.*;
|
||||
import nu.marginalia.search.model.SearchParameters;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
@@ -1,6 +1,7 @@
|
||||
package nu.marginalia.search.command;
|
||||
|
||||
import io.jooby.ModelAndView;
|
||||
import nu.marginalia.search.model.SearchParameters;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
|
@@ -4,7 +4,7 @@ import com.google.inject.Inject;
|
||||
import io.jooby.MapModelAndView;
|
||||
import io.jooby.ModelAndView;
|
||||
import nu.marginalia.search.command.SearchCommandInterface;
|
||||
import nu.marginalia.search.command.SearchParameters;
|
||||
import nu.marginalia.search.model.SearchParameters;
|
||||
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
@@ -4,7 +4,7 @@ import com.google.inject.Inject;
|
||||
import io.jooby.MapModelAndView;
|
||||
import io.jooby.ModelAndView;
|
||||
import nu.marginalia.search.command.SearchCommandInterface;
|
||||
import nu.marginalia.search.command.SearchParameters;
|
||||
import nu.marginalia.search.model.SearchParameters;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
@@ -5,8 +5,8 @@ import io.jooby.MapModelAndView;
|
||||
import io.jooby.ModelAndView;
|
||||
import nu.marginalia.search.JteRenderer;
|
||||
import nu.marginalia.search.command.SearchCommandInterface;
|
||||
import nu.marginalia.search.command.SearchParameters;
|
||||
import nu.marginalia.search.model.NavbarModel;
|
||||
import nu.marginalia.search.model.SearchParameters;
|
||||
import nu.marginalia.search.svc.SearchUnitConversionService;
|
||||
|
||||
import java.util.Map;
|
||||
|
@@ -8,8 +8,8 @@ import nu.marginalia.api.math.MathClient;
|
||||
import nu.marginalia.api.math.model.DictionaryResponse;
|
||||
import nu.marginalia.search.JteRenderer;
|
||||
import nu.marginalia.search.command.SearchCommandInterface;
|
||||
import nu.marginalia.search.command.SearchParameters;
|
||||
import nu.marginalia.search.model.NavbarModel;
|
||||
import nu.marginalia.search.model.SearchParameters;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
|
@@ -5,9 +5,9 @@ import io.jooby.MapModelAndView;
|
||||
import io.jooby.ModelAndView;
|
||||
import nu.marginalia.search.SearchOperator;
|
||||
import nu.marginalia.search.command.SearchCommandInterface;
|
||||
import nu.marginalia.search.command.SearchParameters;
|
||||
import nu.marginalia.search.model.DecoratedSearchResults;
|
||||
import nu.marginalia.search.model.NavbarModel;
|
||||
import nu.marginalia.search.model.SearchParameters;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
@@ -4,7 +4,7 @@ import com.google.inject.Inject;
|
||||
import io.jooby.MapModelAndView;
|
||||
import io.jooby.ModelAndView;
|
||||
import nu.marginalia.search.command.SearchCommandInterface;
|
||||
import nu.marginalia.search.command.SearchParameters;
|
||||
import nu.marginalia.search.model.SearchParameters;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
|
@@ -1,7 +1,6 @@
|
||||
package nu.marginalia.search.model;
|
||||
|
||||
import nu.marginalia.WebsiteUrl;
|
||||
import nu.marginalia.search.command.SearchParameters;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -15,9 +14,12 @@ public class DecoratedSearchResults {
|
||||
private final List<String> problems;
|
||||
private final String evalResult;
|
||||
|
||||
private final String languageIsoCode;
|
||||
|
||||
public DecoratedSearchResults(SearchParameters params,
|
||||
List<String> problems,
|
||||
String evalResult,
|
||||
String languageIsoCode,
|
||||
List<ClusteredUrlDetails> results,
|
||||
String focusDomain,
|
||||
int focusDomainId,
|
||||
@@ -26,6 +28,7 @@ public class DecoratedSearchResults {
|
||||
this.params = params;
|
||||
this.problems = problems;
|
||||
this.evalResult = evalResult;
|
||||
this.languageIsoCode = languageIsoCode;
|
||||
this.results = results;
|
||||
this.focusDomain = focusDomain;
|
||||
this.focusDomainId = focusDomainId;
|
||||
@@ -43,6 +46,10 @@ public class DecoratedSearchResults {
|
||||
return params;
|
||||
}
|
||||
|
||||
public String getLanguageIsoCode() {
|
||||
return languageIsoCode;
|
||||
}
|
||||
|
||||
public List<String> getProblems() {
|
||||
return problems;
|
||||
}
|
||||
@@ -138,16 +145,23 @@ public class DecoratedSearchResults {
|
||||
private int focusDomainId;
|
||||
private SearchFilters filters;
|
||||
private List<ResultsPage> resultPages;
|
||||
private String languageIsoCode;
|
||||
private WebsiteUrl websiteUrl;
|
||||
|
||||
DecoratedSearchResultsBuilder() {
|
||||
}
|
||||
|
||||
|
||||
public DecoratedSearchResultsBuilder params(SearchParameters params) {
|
||||
this.params = params;
|
||||
return this;
|
||||
}
|
||||
|
||||
public DecoratedSearchResultsBuilder languageIsoCode(String languageIsoCode) {
|
||||
this.languageIsoCode = languageIsoCode;
|
||||
return this;
|
||||
}
|
||||
|
||||
public DecoratedSearchResultsBuilder problems(List<String> problems) {
|
||||
this.problems = problems;
|
||||
return this;
|
||||
@@ -184,7 +198,7 @@ public class DecoratedSearchResults {
|
||||
}
|
||||
|
||||
public DecoratedSearchResults build() {
|
||||
return new DecoratedSearchResults(this.params, this.problems, this.evalResult, this.results, this.focusDomain, this.focusDomainId, this.filters, this.resultPages);
|
||||
return new DecoratedSearchResults(this.params, this.problems, this.evalResult, this.languageIsoCode, this.results, this.focusDomain, this.focusDomainId, this.filters, this.resultPages);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
package nu.marginalia.search.command;
|
||||
package nu.marginalia.search.model;
|
||||
|
||||
import nu.marginalia.api.searchquery.model.query.SearchQuery;
|
||||
|
@@ -1,6 +1,4 @@
|
||||
package nu.marginalia.search.model;
|
||||
|
||||
import nu.marginalia.search.command.SearchParameters;
|
||||
|
||||
public record SearchErrorMessageModel(String errorTitle, String errorRest, SearchParameters parameters, SearchFilters filters) {
|
||||
}
|
||||
|
@@ -1,7 +1,6 @@
|
||||
package nu.marginalia.search.model;
|
||||
|
||||
import nu.marginalia.WebsiteUrl;
|
||||
import nu.marginalia.search.command.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
package nu.marginalia.search.command;
|
||||
package nu.marginalia.search.model;
|
||||
|
||||
import nu.marginalia.api.searchquery.model.query.SearchQuery;
|
||||
|
@@ -1,4 +1,4 @@
|
||||
package nu.marginalia.search.command;
|
||||
package nu.marginalia.search.model;
|
||||
|
||||
import nu.marginalia.WebsiteUrl;
|
||||
import nu.marginalia.api.searchquery.RpcTemporalBias;
|
||||
@@ -6,14 +6,13 @@ import nu.marginalia.api.searchquery.model.query.NsfwFilterTier;
|
||||
import nu.marginalia.api.searchquery.model.query.QueryStrategy;
|
||||
import nu.marginalia.api.searchquery.model.query.SpecificationLimit;
|
||||
import nu.marginalia.model.EdgeDomain;
|
||||
import nu.marginalia.search.model.SearchProfile;
|
||||
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Objects;
|
||||
import java.util.StringJoiner;
|
||||
|
||||
import static nu.marginalia.search.command.SearchRecentParameter.RECENT;
|
||||
import static nu.marginalia.search.model.SearchRecentParameter.RECENT;
|
||||
|
||||
public record SearchParameters(WebsiteUrl url,
|
||||
String query,
|
@@ -1,4 +1,4 @@
|
||||
package nu.marginalia.search.command;
|
||||
package nu.marginalia.search.model;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
@@ -1,4 +1,4 @@
|
||||
package nu.marginalia.search.command;
|
||||
package nu.marginalia.search.model;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
@@ -3,10 +3,10 @@ package nu.marginalia.search.svc;
|
||||
import com.google.inject.Inject;
|
||||
import io.jooby.MapModelAndView;
|
||||
import io.jooby.ModelAndView;
|
||||
import nu.marginalia.search.command.SearchParameters;
|
||||
import nu.marginalia.search.model.NavbarModel;
|
||||
import nu.marginalia.search.model.SearchErrorMessageModel;
|
||||
import nu.marginalia.search.model.SearchFilters;
|
||||
import nu.marginalia.search.model.SearchParameters;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
|
@@ -6,8 +6,8 @@ import io.jooby.annotation.GET;
|
||||
import io.jooby.annotation.Path;
|
||||
import io.jooby.annotation.QueryParam;
|
||||
import nu.marginalia.WebsiteUrl;
|
||||
import nu.marginalia.search.command.*;
|
||||
import nu.marginalia.search.model.SearchProfile;
|
||||
import nu.marginalia.search.command.CommandEvaluator;
|
||||
import nu.marginalia.search.model.*;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
|
@@ -1,5 +1,5 @@
|
||||
@import nu.marginalia.api.math.model.DictionaryEntry
|
||||
@import nu.marginalia.search.command.SearchParameters
|
||||
@import nu.marginalia.search.model.SearchParameters
|
||||
@import nu.marginalia.search.model.NavbarModel
|
||||
@import nu.marginalia.search.model.SearchFilters
|
||||
@import nu.marginalia.api.math.model.DictionaryResponse
|
||||
@@ -24,7 +24,7 @@
|
||||
<div class="flex items-center">
|
||||
<div class="hidden sm:block md:w-32 md:mr-16 md:ml-16"><h1 class="text-md sm:text-xl mr-8 font-serif whitespace-nowrap"><a href="/">Marginalia Search</a></h1></div>
|
||||
<div class="w-full p-2 border-none backdrop-blur-sm">
|
||||
@template.serp.part.searchform(query = parameters.query(), profile = parameters.profileStr(), filters = filters)
|
||||
@template.serp.part.searchform(query = parameters.query(), profile = parameters.profileStr(), languageIsoCode = "en", filters = filters)
|
||||
</div>
|
||||
<div class="grow"></div>
|
||||
<button class="fixed bottom-10 right-5 sm:hidden text-sm bg-margeblue text-white p-4 rounded-xl active:text-slate-200" id="filter-button">
|
||||
|
@@ -17,7 +17,7 @@
|
||||
<div class="max-w-[1400px] mx-auto px-4 py-4">
|
||||
<div class="flex items-center">
|
||||
<h1 class="text-md sm:text-xl mr-8 font-serif whitespace-nowrap"><a href="/">Marginalia Search</a></h1>
|
||||
@template.serp.part.searchform(query = model.parameters().query(), profile = model.parameters().profileStr(), filters = model.filters())
|
||||
@template.serp.part.searchform(query = model.parameters().query(), profile = model.parameters().profileStr(), filters = model.filters(), languageIsoCode = "en")
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
@@ -20,7 +20,7 @@
|
||||
<div class="flex items-center">
|
||||
<div class="hidden sm:block md:w-32 md:mr-16 md:ml-16"><h1 class="text-md sm:text-xl mr-8 font-serif whitespace-nowrap"><a href="/">Marginalia Search</a></h1></div>
|
||||
<div class="w-full p-2 border-none backdrop-blur-sm">
|
||||
@template.serp.part.searchform(query = results.getParams().query(), profile = results.getProfile(), filters = results.getFilters())
|
||||
@template.serp.part.searchform(query = results.getParams().query(), profile = results.getProfile(), filters = results.getFilters(), languageIsoCode = results.getLanguageIsoCode())
|
||||
</div>
|
||||
<div class="grow"></div>
|
||||
<button class="fixed bottom-10 right-5 finepointer:hidden md:hidden text-sm bg-margeblue text-white p-4 rounded-xl active:text-slate-200" id="filter-button">
|
||||
|
@@ -1,5 +1,5 @@
|
||||
@import nu.marginalia.model.idx.DocumentFlags
|
||||
@import nu.marginalia.search.command.SearchParameters
|
||||
@import nu.marginalia.search.model.SearchParameters
|
||||
@import nu.marginalia.search.model.ClusteredUrlDetails
|
||||
@import nu.marginalia.search.model.UrlDetails
|
||||
@param ClusteredUrlDetails result
|
||||
|
@@ -2,6 +2,7 @@
|
||||
|
||||
@param String query
|
||||
@param String profile
|
||||
@param String languageIsoCode
|
||||
@param SearchFilters filters
|
||||
|
||||
|
||||
@@ -40,6 +41,7 @@
|
||||
@if (filters.reduceAdtechOption.isSet()) <input type="hidden" name="adtech" value="${filters.reduceAdtechOption.value()}"> @endif
|
||||
@if (filters.searchTitleOption.isSet()) <input type="hidden" name="searchTitle" value="${filters.searchTitleOption.value()}"> @endif
|
||||
@if (filters.showRecentOption.isSet()) <input type="hidden" name="recent" value="${filters.showRecentOption.value()}"> @endif
|
||||
@if (languageIsoCode != null && !"en".equalsIgnoreCase(languageIsoCode)) <input type="hidden" name="lang" value="${languageIsoCode}"> @endif
|
||||
|
||||
<input type="hidden" name="profile" value="${profile}">
|
||||
|
||||
|
@@ -24,7 +24,7 @@
|
||||
<div class="flex items-center">
|
||||
<div class="hidden sm:block md:w-32 md:mr-16 md:ml-16"><h1 class="text-md sm:text-xl mr-8 font-serif whitespace-nowrap"><a href="/">Marginalia Search</a></h1></div>
|
||||
<div class="w-full p-2 border-none backdrop-blur-sm">
|
||||
@template.serp.part.searchform(query = "", profile = SearchProfile.NO_FILTER.filterId, filters = new SearchFilters(websiteUrl))
|
||||
@template.serp.part.searchform(query = "", profile = SearchProfile.NO_FILTER.filterId, filters = new SearchFilters(websiteUrl), languageIsoCode = "en")
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -1,4 +1,4 @@
|
||||
@import nu.marginalia.search.command.SearchParameters
|
||||
@import nu.marginalia.search.model.SearchParameters
|
||||
@import nu.marginalia.search.model.NavbarModel
|
||||
@import nu.marginalia.search.model.SearchFilters
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
package nu.marginalia.search.command.commands;
|
||||
|
||||
import nu.marginalia.WebsiteUrl;
|
||||
import nu.marginalia.search.command.SearchParameters;
|
||||
import nu.marginalia.search.model.SearchParameters;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
|
@@ -13,7 +13,6 @@ import nu.marginalia.domclassifier.DomSampleClassification;
|
||||
import nu.marginalia.model.EdgeDomain;
|
||||
import nu.marginalia.model.EdgeUrl;
|
||||
import nu.marginalia.model.crawl.DomainIndexingState;
|
||||
import nu.marginalia.search.command.SearchParameters;
|
||||
import nu.marginalia.search.model.*;
|
||||
import nu.marginalia.search.svc.SearchCrosstalkService;
|
||||
import nu.marginalia.search.svc.SearchFlagSiteService;
|
||||
@@ -95,6 +94,7 @@ public class MockedSearchResults {
|
||||
params,
|
||||
List.of("Not enough search engine oil"),
|
||||
null,
|
||||
"en",
|
||||
mockSearchResultsList(),
|
||||
"",
|
||||
-1,
|
||||
@@ -110,6 +110,7 @@ public class MockedSearchResults {
|
||||
params,
|
||||
List.of("Not enough search engine oil"),
|
||||
null,
|
||||
"en",
|
||||
mockSearchResultsList(),
|
||||
"example.marginalia.nu",
|
||||
1,
|
||||
|
Reference in New Issue
Block a user