mirror of https://git.jolheiser.com/ugit.git
79 lines
2.0 KiB
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)),
|
|
}...)
|
|
}
|