repos / git-pr

a self-hosted git collaboration server
git clone https://github.com/picosh/git-pr.git

commit
573fa67
parent
0abd9a9
author
Eric Bower
date
2024-10-21 20:31:59 -0400 EDT
feat: sorting
5 files changed,  +80, -16
M web.go
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
M static/git-pr.css
+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-
M tmpl/index.html
+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>
M tmpl/repo-detail.html
+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 }