- commit
- 573fa67
- parent
- 0abd9a9
- author
- Eric Bower
- date
- 2024-10-21 20:31:59 -0400 EDT
feat: sorting
5 files changed,
+80,
-16
M
Makefile
+4,
-0
1@@ -31,6 +31,10 @@ bp: bp-setup
2 $(DOCKER_BUILDX_BUILD) -t "ghcr.io/picosh/pico/git-web:$(DOCKER_TAG)" --target release-web .
3 .PHONY: bp
4
5+deploy: bp
6+ ssh ppipe pub git-pr-deploy -e
7+.PHONY: deploy
8+
9 smol:
10 curl https://pico.sh/smol.css -o ./static/smol.css
11 .PHONY: smol
+14,
-6
1@@ -1,3 +1,12 @@
2+table, tr {
3+ border-spacing: 0;
4+}
5+
6+td, th {
7+ padding: var(--grid-height);
8+ border-bottom: 1px solid var(--grey-light);
9+}
10+
11 .pill-success {
12 border: 1px solid var(--success);
13 color: var(--success);
14@@ -8,6 +17,11 @@
15 color: var(--review);
16 }
17
18+.pill-admin {
19+ border: 1px solid var(--admin);
20+ color: var(--admin);
21+}
22+
23 .box-sm-review {
24 border: 2px solid var(--review);
25 padding: 0.15rem 0.35rem;
26@@ -17,9 +31,3 @@
27 border: 2px solid var(--review);
28 padding: 0.5rem 0.75rem;
29 }
30-
31-.pill-admin {
32- border: 1px solid var(--admin);
33- color: var(--admin);
34-}
35-
+1,
-3
1@@ -215,13 +215,11 @@ git push origin main
2 </details>
3 </header>
4
5-<hr />
6-
7 <main>
8 {{template "pr-table" .Prs}}
9 </main>
10
11-<footer>
12+<footer class="mt">
13 <div><a href="/rss">rss</a></div>
14 <div class="text-sm">OR with fingerprint, url encoded: <code>/rss?pubkey=SHA256%3Axxx</code></div>
15 </footer>
+1,
-5
1@@ -32,15 +32,11 @@ ssh {{.MetaData.URL}} pr ls {{.ID}}</pre>
2 </div>
3 </header>
4
5-<hr />
6-
7 <main class="group">
8 {{template "pr-table" .Prs}}
9 </main>
10
11-<hr />
12-
13-<footer>
14+<footer class="mt">
15 <a href="/repos/{{.ID}}/rss">rss</a>
16 </footer>
17 {{end}}
M
web.go
+60,
-2
1@@ -101,11 +101,60 @@ type PrTableData struct {
2 MetaData
3 }
4
5+func createPrDataSorter(sort, sortDir string) func(a, b *PrListData) int {
6+ return func(a *PrListData, b *PrListData) int {
7+ if sort == "status" {
8+ statusA := strings.ToLower(a.Status)
9+ statusB := strings.ToLower(b.Status)
10+ if sortDir == "asc" {
11+ return strings.Compare(statusA, statusB)
12+ } else {
13+ return strings.Compare(statusB, statusA)
14+ }
15+ }
16+
17+ if sort == "title" {
18+ titleA := strings.ToLower(a.Title)
19+ titleB := strings.ToLower(b.Title)
20+ if sortDir == "asc" {
21+ return strings.Compare(titleA, titleB)
22+ } else {
23+ return strings.Compare(titleB, titleA)
24+ }
25+ }
26+
27+ if sort == "repo" {
28+ repoA := strings.ToLower(a.RepoID)
29+ repoB := strings.ToLower(b.RepoID)
30+ if sortDir == "asc" {
31+ return strings.Compare(repoA, repoB)
32+ } else {
33+ return strings.Compare(repoB, repoA)
34+ }
35+ }
36+
37+ if sort == "created_at" {
38+ if sortDir == "asc" {
39+ return a.DateOrig.Compare(b.DateOrig)
40+ } else {
41+ return b.DateOrig.Compare(a.DateOrig)
42+ }
43+ }
44+
45+ if sortDir == "desc" {
46+ return int(b.ID) - int(a.ID)
47+ }
48+ return int(a.ID) - int(b.ID)
49+ }
50+}
51+
52 func getPrTableData(web *WebCtx, prs []*PatchRequest, query url.Values) ([]*PrListData, error) {
53 prdata := []*PrListData{}
54 status := strings.ToLower(query.Get("status"))
55 username := strings.ToLower(query.Get("user"))
56 title := strings.ToLower(query.Get("title"))
57+ sort := strings.ToLower(query.Get("sort"))
58+ sortDir := strings.ToLower(query.Get("sort_dir"))
59 hasFilter := status != "" || username != "" || title != ""
60
61 for _, curpr := range prs {
62@@ -157,12 +206,20 @@ func getPrTableData(web *WebCtx, prs []*PatchRequest, query url.Values) ([]*PrLi
63 Url: template.URL(fmt.Sprintf("/prs/%d", curpr.ID)),
64 Text: curpr.Name,
65 },
66- Date: curpr.CreatedAt.Format(web.Backend.Cfg.TimeFormat),
67- Status: curpr.Status,
68+ DateOrig: curpr.CreatedAt,
69+ Date: curpr.CreatedAt.Format(web.Backend.Cfg.TimeFormat),
70+ Status: curpr.Status,
71 }
72 prdata = append(prdata, prls)
73 }
74
75+ if sort != "" {
76+ if sortDir == "" {
77+ sortDir = "asc"
78+ }
79+ slices.SortFunc(prdata, createPrDataSorter(sort, sortDir))
80+ }
81+
82 return prdata, nil
83 }
84
85@@ -217,6 +274,7 @@ type PrListData struct {
86 PrLink LinkData
87 Title string
88 ID int64
89+ DateOrig time.Time
90 Date string
91 Status string
92 }