feat(frontend): add three-column results layout with left sidebar navigation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
2e7075adf1
commit
0e79b729fe
3 changed files with 122 additions and 23 deletions
|
|
@ -50,6 +50,15 @@ type PageData struct {
|
|||
UnresponsiveEngines [][2]string
|
||||
PageNumbers []PageNumber
|
||||
ShowHeader bool
|
||||
// New fields for three-column layout
|
||||
Categories []string
|
||||
CategoryIcons map[string]string
|
||||
DisabledCategories []string
|
||||
ActiveCategory string
|
||||
TimeFilters []FilterOption
|
||||
TypeFilters []FilterOption
|
||||
ActiveTime string
|
||||
ActiveType string
|
||||
}
|
||||
|
||||
// ResultView is a template-friendly wrapper around a MainResult.
|
||||
|
|
@ -73,6 +82,12 @@ type InfoboxView struct {
|
|||
ImgSrc string
|
||||
}
|
||||
|
||||
// FilterOption represents a filter radio option for the sidebar.
|
||||
type FilterOption struct {
|
||||
Label string
|
||||
Value string
|
||||
}
|
||||
|
||||
var (
|
||||
tmplFull *template.Template
|
||||
tmplIndex *template.Template
|
||||
|
|
@ -116,12 +131,52 @@ func OpenSearchXML(baseURL string) ([]byte, error) {
|
|||
}
|
||||
|
||||
// FromResponse builds PageData from a search response and request params.
|
||||
func FromResponse(resp contracts.SearchResponse, query string, pageno int) PageData {
|
||||
func FromResponse(resp contracts.SearchResponse, query string, pageno int, activeCategory, activeTime, activeType string) PageData {
|
||||
// Set defaults
|
||||
if activeCategory == "" {
|
||||
activeCategory = "all"
|
||||
}
|
||||
|
||||
pd := PageData{
|
||||
Query: query,
|
||||
Pageno: pageno,
|
||||
NumberOfResults: resp.NumberOfResults,
|
||||
UnresponsiveEngines: resp.UnresponsiveEngines,
|
||||
|
||||
// New: categories with icons
|
||||
Categories: []string{"all", "news", "images", "videos", "maps"},
|
||||
DisabledCategories: []string{"shopping", "music", "weather"},
|
||||
CategoryIcons: map[string]string{
|
||||
"all": "🌐",
|
||||
"news": "📰",
|
||||
"images": "🖼️",
|
||||
"videos": "🎬",
|
||||
"maps": "🗺️",
|
||||
"shopping": "🛒",
|
||||
"music": "🎵",
|
||||
"weather": "🌤️",
|
||||
},
|
||||
ActiveCategory: activeCategory,
|
||||
|
||||
// Time filters
|
||||
TimeFilters: []FilterOption{
|
||||
{Label: "Any time", Value: ""},
|
||||
{Label: "Past hour", Value: "h"},
|
||||
{Label: "Past 24 hours", Value: "d"},
|
||||
{Label: "Past week", Value: "w"},
|
||||
{Label: "Past month", Value: "m"},
|
||||
{Label: "Past year", Value: "y"},
|
||||
},
|
||||
ActiveTime: activeTime,
|
||||
|
||||
// Type filters
|
||||
TypeFilters: []FilterOption{
|
||||
{Label: "All results", Value: ""},
|
||||
{Label: "News", Value: "news"},
|
||||
{Label: "Videos", Value: "video"},
|
||||
{Label: "Images", Value: "image"},
|
||||
},
|
||||
ActiveType: activeType,
|
||||
}
|
||||
|
||||
// Convert results.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue