1
1
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:
Viktor Lofgren
2025-09-12 11:14:54 +02:00
parent 8f893ee6c0
commit cc790644d4
29 changed files with 47 additions and 32 deletions

View File

@@ -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)

View File

@@ -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;

View File

@@ -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;

View File

@@ -1,6 +1,7 @@
package nu.marginalia.search.command;
import io.jooby.ModelAndView;
import nu.marginalia.search.model.SearchParameters;
import java.util.Optional;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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);
}
}
}

View File

@@ -1,4 +1,4 @@
package nu.marginalia.search.command;
package nu.marginalia.search.model;
import nu.marginalia.api.searchquery.model.query.SearchQuery;

View File

@@ -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) {
}

View File

@@ -1,7 +1,6 @@
package nu.marginalia.search.model;
import nu.marginalia.WebsiteUrl;
import nu.marginalia.search.command.*;
import java.util.List;

View File

@@ -1,4 +1,4 @@
package nu.marginalia.search.command;
package nu.marginalia.search.model;
import nu.marginalia.api.searchquery.model.query.SearchQuery;

View File

@@ -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,

View File

@@ -1,4 +1,4 @@
package nu.marginalia.search.command;
package nu.marginalia.search.model;
import javax.annotation.Nullable;

View File

@@ -1,4 +1,4 @@
package nu.marginalia.search.command;
package nu.marginalia.search.model;
import javax.annotation.Nullable;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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">

View File

@@ -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>

View File

@@ -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">

View File

@@ -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

View File

@@ -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}">

View File

@@ -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>

View File

@@ -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

View File

@@ -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;

View File

@@ -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,