From 9955e38fa21ee75672622adb567dd5e12e2626a3 Mon Sep 17 00:00:00 2001
From: Gusted <postmaster@gusted.xyz>
Date: Mon, 26 Feb 2024 16:17:11 +0100
Subject: [PATCH] [BUG] Remember topic only in repo search

- Backport of #2489
- If the user is searching repositories with an specific topic, adding
any other filter option, such as showing unrelevant repositories or
using another sort Forgejo should remember that 'topic only' was set.
- Adds integration test.
- Resolves #2461

(cherry picked from commit b4360d504cfc00dff8f80c774e70e5facc0aed37)
---
 templates/explore/repo_search.tmpl      |  1 +
 tests/integration/explore_repos_test.go | 14 ++++++++++++++
 2 files changed, 15 insertions(+)

diff --git a/templates/explore/repo_search.tmpl b/templates/explore/repo_search.tmpl
index 136d3f8e81..920880a885 100644
--- a/templates/explore/repo_search.tmpl
+++ b/templates/explore/repo_search.tmpl
@@ -2,6 +2,7 @@
 	<form class="ui form ignore-dirty gt-f1">
 		<input type="hidden" name="sort" value="{{$.SortType}}">
 		<input type="hidden" name="language" value="{{$.Language}}">
+		<input type="hidden" name="topic" value="{{$.TopicOnly}}">
 		<div class="ui fluid action input">
 			{{template "shared/searchinput" dict "Value" .Keyword "AutoFocus" true}}
 			{{if .PageIsExploreRepositories}}
diff --git a/tests/integration/explore_repos_test.go b/tests/integration/explore_repos_test.go
index 26fd1dde64..1afc423152 100644
--- a/tests/integration/explore_repos_test.go
+++ b/tests/integration/explore_repos_test.go
@@ -8,6 +8,8 @@ import (
 	"testing"
 
 	"code.gitea.io/gitea/tests"
+
+	"github.com/stretchr/testify/assert"
 )
 
 func TestExploreRepos(t *testing.T) {
@@ -15,4 +17,16 @@ func TestExploreRepos(t *testing.T) {
 
 	req := NewRequest(t, "GET", "/explore/repos")
 	MakeRequest(t, req, http.StatusOK)
+
+	t.Run("Persistent parameters", func(t *testing.T) {
+		defer tests.PrintCurrentTest(t)()
+
+		req := NewRequest(t, "GET", "/explore/repos?topic=1&language=Go&sort=moststars")
+		resp := MakeRequest(t, req, http.StatusOK)
+		htmlDoc := NewHTMLParser(t, resp.Body)
+
+		assert.EqualValues(t, "moststars", htmlDoc.Find("input[type='hidden'][name='sort']").AttrOr("value", "not found"))
+		assert.EqualValues(t, "Go", htmlDoc.Find("input[type='hidden'][name='language']").AttrOr("value", "not found"))
+		assert.EqualValues(t, "true", htmlDoc.Find("input[type='hidden'][name='topic']").AttrOr("value", "not found"))
+	})
 }