gitea package (new): minimal client mirroring caldav's structure
- client.go: token auth, 5s timeout, ErrNotFound
- issues.go: ListIssues(owner, repo, opts) hitting
/repos/{o}/{r}/issues?type=issues&state=…&since=…, ParseRepoRef,
RepoHTMLURL. PullRequest-flagged rows dropped server- and client-side.
- httptest stubs covering parse, 404, ParseRepoRef variants.
web wiring:
- Server.Gitea optional GiteaDeps (Client + in-memory 3-min TTL cache
keyed by owner/repo|state).
- detailIssues iterates every gitea-repo link, sums open issues, captures
last-30d closed (≤20) into a disclosure. Per-repo failures surface as
banner; one missing repo never blanks the section.
- relativeTime renders "Nm/h/d ago" / "yesterday" / fallback date.
Templates:
- issues_section.tmpl: per-repo block, header "Issues (n) + ↗ Gitea repo",
rows with #N · title · labels · milestone · assignees · updated.
Titles open in new tab.
- detail.tmpl: include the partial when Gitea is on and issues != nil.
- CSS: matches the Tasks section visual language.
main.go: GITEA_URL gates the integration (off when unset). GITEA_URL set
but GITEA_TOKEN missing → refuse to start.
deploy/dokploy.yaml: GITEA_URL env + GITEA_TOKEN secret added.
docs/design.md: new §6 mirroring §5's structure (link model, listing
semantics, caching, env contract, parked items).
46 lines
2.0 KiB
Cheetah
46 lines
2.0 KiB
Cheetah
{{define "issues-section"}}
|
|
<section class="issues" id="issues-section">
|
|
<h2>Issues{{if .IssuesOpenTotal}} ({{.IssuesOpenTotal}}){{end}}</h2>
|
|
{{range .Issues}}
|
|
<div class="repo-block" data-repo="{{.Repo}}">
|
|
<h3>
|
|
<a href="{{.RepoURL}}" target="_blank" rel="noopener noreferrer">{{.Repo}}</a>
|
|
<small class="muted"><a href="{{.IssuesURL}}" target="_blank" rel="noopener noreferrer">↗ Gitea repo</a></small>
|
|
</h3>
|
|
{{if .Error}}<p class="banner warn">{{.Error}}</p>{{end}}
|
|
{{if .Open}}
|
|
<ul class="issues open">
|
|
{{range .Open}}
|
|
<li class="issue-row">
|
|
<a class="num" href="{{.HTMLURL}}" target="_blank" rel="noopener noreferrer">#{{.Number}}</a>
|
|
<a class="title" href="{{.HTMLURL}}" target="_blank" rel="noopener noreferrer">{{.Title}}</a>
|
|
{{range .Labels}}<span class="label">{{.}}</span>{{end}}
|
|
{{if .Milestone}}<span class="milestone">{{.Milestone}}</span>{{end}}
|
|
{{range .Assignees}}<span class="assignee">@{{.}}</span>{{end}}
|
|
{{if .UpdatedRel}}<small class="muted">updated {{.UpdatedRel}}</small>{{end}}
|
|
</li>
|
|
{{end}}
|
|
</ul>
|
|
{{else if not .Error}}
|
|
<p class="muted">No open issues.</p>
|
|
{{end}}
|
|
{{if .ClosedRecent}}
|
|
<details>
|
|
<summary class="muted">{{len .ClosedRecent}} closed in last 30 days</summary>
|
|
<ul class="issues closed">
|
|
{{range .ClosedRecent}}
|
|
<li class="issue-row">
|
|
<a class="num" href="{{.HTMLURL}}" target="_blank" rel="noopener noreferrer">#{{.Number}}</a>
|
|
<a class="title" href="{{.HTMLURL}}" target="_blank" rel="noopener noreferrer">{{.Title}}</a>
|
|
{{range .Labels}}<span class="label">{{.}}</span>{{end}}
|
|
{{if .UpdatedRel}}<small class="muted">{{.UpdatedRel}}</small>{{end}}
|
|
</li>
|
|
{{end}}
|
|
</ul>
|
|
</details>
|
|
{{end}}
|
|
</div>
|
|
{{end}}
|
|
</section>
|
|
{{end}}
|