releases.html
·
115 lines
·
6.0 KB
| 1 | {{define "content"}} |
| 2 | <div class="container"> |
| 3 | {{template "repo_header" .}} |
| 4 | |
| 5 | <div class="flex items-center justify-between flex-wrap gap-2 mb-4"> |
| 6 | <div class="flex items-center gap-2 text-sm text-muted"> |
| 7 | <span class="font-medium text-foreground">{{len .Releases}}</span> |
| 8 | <span>{{pluralT .Lang (len .Releases) "releases.count"}}</span> |
| 9 | <span>·</span> |
| 10 | <span class="font-medium text-foreground">{{.TagCount}}</span> |
| 11 | <span>{{pluralT .Lang .TagCount "releases.tags"}}</span> |
| 12 | </div> |
| 13 | |
| 14 | {{if .CanWrite}} |
| 15 | <a href="/{{.Repo.OwnerUsername}}/{{.Repo.Name}}/releases/new" class="btn btn-primary btn-sm"> |
| 16 | {{icon "plus" "size-3.5"}} |
| 17 | <span>{{t .Lang "releases.new"}}</span> |
| 18 | </a> |
| 19 | {{end}} |
| 20 | </div> |
| 21 | |
| 22 | {{if .Releases}} |
| 23 | <div class="flex flex-col gap-6"> |
| 24 | {{range .Releases}} |
| 25 | {{$rel := .}} |
| 26 | <article class="card" id="{{.TagName}}"> |
| 27 | <div class="card-header flex items-center justify-between flex-wrap gap-2"> |
| 28 | <div class="flex items-center gap-2.5 flex-wrap min-w-0"> |
| 29 | <h2 class="text-base font-bold" style="margin:0;">{{.Title}}</h2> |
| 30 | <a href="/{{$.Repo.OwnerUsername}}/{{$.Repo.Name}}/tree/{{.TagName}}" class="badge badge-primary font-mono text-xs flex items-center gap-1"> |
| 31 | {{icon "tag" "size-3"}} |
| 32 | <span>{{.TagName}}</span> |
| 33 | </a> |
| 34 | {{if .IsPrerelease}} |
| 35 | <span class="badge badge-outline text-xs" style="color:hsl(var(--warning-fg, 38 92% 50%));border-color:currentColor;"> |
| 36 | {{t $.Lang "releases.prerelease"}} |
| 37 | </span> |
| 38 | {{end}} |
| 39 | </div> |
| 40 | |
| 41 | <div class="flex items-center gap-2 text-xs text-muted flex-shrink-0"> |
| 42 | <div class="flex items-center gap-1.5"> |
| 43 | {{avatar .AuthorUsername .AuthorAvatar}} |
| 44 | <a href="/{{.AuthorUsername}}" class="font-medium text-foreground">@{{.AuthorUsername}}</a> |
| 45 | <span>·</span> |
| 46 | <span>{{formatDate .PublishedAt}}</span> |
| 47 | </div> |
| 48 | {{if $.CanWrite}} |
| 49 | <a href="/{{$.Repo.OwnerUsername}}/{{$.Repo.Name}}/releases/{{.ID}}/edit" class="btn btn-ghost btn-icon text-muted" style="width:1.8rem;height:1.8rem;" title="{{t $.Lang "releases.edit"}}"> |
| 50 | {{icon "edit" "size-3.5"}} |
| 51 | </a> |
| 52 | <form method="post" action="/{{$.Repo.OwnerUsername}}/{{$.Repo.Name}}/releases/{{.ID}}/delete" onsubmit="return confirm('{{t $.Lang "releases.delete_confirm"}}');" style="margin:0;"> |
| 53 | <input type="hidden" name="_csrf" value="{{$.CSRFToken}}"> |
| 54 | <button type="submit" class="btn btn-ghost btn-icon text-muted" style="width:1.8rem;height:1.8rem;" title="{{t $.Lang "releases.delete"}}"> |
| 55 | {{icon "trash" "size-3.5"}} |
| 56 | </button> |
| 57 | </form> |
| 58 | {{end}} |
| 59 | </div> |
| 60 | </div> |
| 61 | |
| 62 | <div class="card-body markdown-body"> |
| 63 | {{if .BodyHTML}} |
| 64 | {{.BodyHTML}} |
| 65 | {{else}} |
| 66 | <span class="text-xs text-muted">—</span> |
| 67 | {{end}} |
| 68 | </div> |
| 69 | |
| 70 | <!-- Release Assets: uploaded files + generated source archives --> |
| 71 | <div class="card-body" style="border-top:1px solid hsl(var(--border));padding:0.6rem 0.9rem;background:hsl(var(--muted));"> |
| 72 | <div class="text-xs font-semibold text-muted uppercase mb-2" style="letter-spacing:0.04em;">{{t $.Lang "releases.assets"}}</div> |
| 73 | <div class="flex flex-col gap-1.5"> |
| 74 | {{range .Assets}} |
| 75 | <div class="flex items-center justify-between gap-3"> |
| 76 | <a href="/{{$.Repo.OwnerUsername}}/{{$.Repo.Name}}/releases/{{$rel.ID}}/assets/{{.ID}}/download" class="flex items-center gap-2 text-xs font-mono font-medium hover:underline min-w-0" style="color:hsl(var(--primary));"> |
| 77 | {{icon "file" "size-3.5"}} |
| 78 | <span class="truncate">{{.Filename}}</span> |
| 79 | </a> |
| 80 | <div class="flex items-center gap-2 flex-shrink-0"> |
| 81 | <span class="text-xs text-muted">{{formatSize .Size}}</span> |
| 82 | {{if $.CanWrite}} |
| 83 | <form method="post" action="/{{$.Repo.OwnerUsername}}/{{$.Repo.Name}}/releases/{{$rel.ID}}/assets/{{.ID}}/delete" onsubmit="return confirm('{{t $.Lang "releases.asset_delete_confirm"}}');" style="margin:0;"> |
| 84 | <input type="hidden" name="_csrf" value="{{$.CSRFToken}}"> |
| 85 | <button type="submit" class="btn btn-ghost btn-icon text-muted" style="width:1.6rem;height:1.6rem;" title="{{t $.Lang "releases.asset_delete"}}"> |
| 86 | {{icon "trash" "size-3"}} |
| 87 | </button> |
| 88 | </form> |
| 89 | {{end}} |
| 90 | </div> |
| 91 | </div> |
| 92 | {{end}} |
| 93 | |
| 94 | <a href="/{{$.Repo.OwnerUsername}}/{{$.Repo.Name}}/archive/{{.TagName}}.zip" class="flex items-center gap-2 text-xs font-mono font-medium hover:underline" style="color:hsl(var(--primary));"> |
| 95 | {{icon "download" "size-3.5"}} |
| 96 | <span>{{t $.Lang "releases.source_zip"}}</span> |
| 97 | </a> |
| 98 | <a href="/{{$.Repo.OwnerUsername}}/{{$.Repo.Name}}/archive/{{.TagName}}.tar.gz" class="flex items-center gap-2 text-xs font-mono font-medium hover:underline" style="color:hsl(var(--primary));"> |
| 99 | {{icon "download" "size-3.5"}} |
| 100 | <span>{{t $.Lang "releases.source_tar"}}</span> |
| 101 | </a> |
| 102 | </div> |
| 103 | </div> |
| 104 | </article> |
| 105 | {{end}} |
| 106 | </div> |
| 107 | {{else}} |
| 108 | {{if .CanWrite}} |
| 109 | {{template "ui_empty_state" (dict "Icon" "tag" "Title" (t .Lang "releases.empty") "ActionHref" (printf "/%s/%s/releases/new" .Repo.OwnerUsername .Repo.Name) "ActionLabel" (t .Lang "releases.new") "ActionIcon" "plus")}} |
| 110 | {{else}} |
| 111 | {{template "ui_empty_state" (dict "Icon" "tag" "Title" (t .Lang "releases.empty"))}} |
| 112 | {{end}} |
| 113 | {{end}} |
| 114 | </div> |
| 115 | {{end}} |