ugit/internal/html/repo_search.go

79 lines
2.0 KiB
Go

package html
import (
_ "embed"
"fmt"
"go.jolheiser.com/ugit/internal/git"
. "maragu.dev/gomponents"
. "maragu.dev/gomponents/html"
)
type SearchContext struct {
BaseContext
RepoHeaderComponentContext
Results []git.GrepResult
}
func (s SearchContext) DedupeResults() [][]git.GrepResult {
var (
results [][]git.GrepResult
currentFile string
)
var idx int
for _, result := range s.Results {
if result.File == currentFile {
results[idx-1] = append(results[idx-1], result)
continue
}
results = append(results, []git.GrepResult{result})
currentFile = result.File
idx++
}
return results
}
//go:embed repo_search.js
var repoSearchJS string
func repoSearchResult(repo, ref string, results []git.GrepResult) Node {
return Group([]Node{
Div(Class("text-text mt-5"),
A(Class("underline decoration-text/50 decoration-dashed hover:decoration-solid"), Href(fmt.Sprintf("/%s/tree/%s/%s#L%d", repo, ref, results[0].File, results[0].Line)), Text(results[0].File)),
),
Div(Class("code"),
Raw(results[0].Content),
),
If(len(results) > 1,
Details(Class("text-text cursor-pointer"),
Summary(Textf("%d more", len(results[1:]))),
Map(results[1:], func(result git.GrepResult) Node {
return Group([]Node{
Div(Class("text-text mt-5 ml-5"),
A(Class("underline decoration-text/50 decoration-dashed hover:decoration-solid"), Href(fmt.Sprintf("/%s/tree/%s/%s#L%d", repo, ref, result.File, result.Line)), Text(results[0].File)),
),
Div(Class("code ml-5"),
Raw(result.Content),
),
})
}),
),
),
})
}
func RepoSearchTemplate(sc SearchContext) Node {
dedupeResults := sc.DedupeResults()
return base(sc.BaseContext, []Node{
repoHeaderComponent(sc.RepoHeaderComponentContext),
Map(dedupeResults, func(results []git.GrepResult) Node {
return repoSearchResult(sc.RepoHeaderComponentContext.Name, sc.RepoHeaderComponentContext.Ref, results)
}),
If(len(dedupeResults) == 0,
P(Class("text-text mt-5 text-lg"), Text("No results")),
),
Script(Text(repoSearchJS)),
}...)
}