all repos — searchix @ 82cfb98df7f9e38f295d3ea1d46b343914947307

Search engine for NixOS, nix-darwin, home-manager and NUR users

internal/components/data.go (view raw)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package components

import (
	"net/url"
	"slices"
	"strconv"

	"alin.ovh/searchix/frontend"
	"alin.ovh/searchix/internal/config"
	search "alin.ovh/searchix/internal/index"
	"alin.ovh/searchix/internal/pagination"
)

type TemplateData struct {
	Sources       []*config.Source
	Source        *config.Source
	Query         string
	ExtraHeadHTML string
	Code          int
	Message       string
	Assets        *frontend.AssetCollection
	SearchNav     SearchNav
}

type ResultData struct {
	TemplateData
	Query        string
	FacetQueries url.Values
	Results      *search.Result
}

type SearchNav struct {
	URL url.URL

	Prev string
	Next string
	All  string

	pagination *pagination.Pagination
}

func NewSearchNav(u url.URL) SearchNav {
	return SearchNav{URL: u}
}

func (u SearchNav) WithPagination(page *pagination.Pagination) SearchNav {
	u.pagination = page

	q := u.URL.Query()
	urlBase := u.URL.Path

	if page.Next != 0 {
		q.Set("page", strconv.Itoa(page.Next))
		u.Next = urlBase + "?" + q.Encode()
	}

	if page.Prev != 0 {
		if page.Prev == 1 {
			q.Del("page")
		} else {
			q.Set("page", strconv.Itoa(page.Prev))
		}
		u.Prev = urlBase + "?" + q.Encode()
	}

	if page.CanShowAll {
		q.Set("page", "0")
		u.All = urlBase + "?" + q.Encode()
	}

	return u
}

func (u SearchNav) HasFacet(field string, term string) bool {
	return slices.Contains(u.URL.Query()[field], term)
}

func (u SearchNav) AddFacet(field string, term string) string {
	nu := u.URL
	q := nu.Query()
	q.Add(field, term)
	nu.RawQuery = q.Encode()

	return nu.String()
}

func (u SearchNav) RemoveFacet(field string, term string) string {
	nu := u.URL
	q := nu.Query()
	q[field] = slices.DeleteFunc(q[field], func(v string) bool {
		return v == term
	})
	nu.RawQuery = q.Encode()

	return nu.String()
}