1// SPDX-License-Identifier: AGPL-3.0-or-later
2
3package web
4
5import "html/template"
6
7// View models handed to the templ components. Components only loop and
8// branch on these; the handlers build them from the use case results.
9
10// Crumb is one segment of the path in the header.
11type Crumb struct {
12 Label string
13 Href string
14 Current bool
15}
16
17// Section is a repository tab under the header, reached by its key.
18type Section struct {
19 Key string // mnemonic key
20 Label string
21 Href string
22 Current bool
23 // Count is shown after the label when it is not empty: the open merge
24 // requests.
25 Count string
26}
27
28// RefItem is a branch or tag in the ref switcher.
29type RefItem struct {
30 Name string
31 Href string
32 Current bool
33}
34
35// CmdItem is one target of the ":" command line.
36type CmdItem struct{ Kind, Label, Href string }
37
38// Layout is the input of the page shell.
39type Layout struct {
40 Title string
41 // Owner is the owner's name (ERMITE_OWNER), shown when signed in.
42 Owner string
43 Version string
44 SourceURL string
45 Assets Assets
46 Crumbs []Crumb
47 Ref string // ref shown in the header, "" outside a repo view
48 Short string // short sha shown after the ref
49 Sections []Section
50 Repo string
51 SHA string // full sha of the ref, for the permalink key
52 RefPath string // the URL segment that `y` rewrites: the ref name
53 Heads []RefItem
54 Tags []RefItem
55 Cmd []CmdItem
56 HasRail bool
57 // Lede is a line above the content and the rail, so both start level.
58 Lede string
59 // Live connects the page to the event stream (/-/events).
60 Live bool
61 // LiveURL is the stream the page follows, with its query.
62 LiveURL string
63 // PathsURL is the list of the file paths of the commit the page shows
64 // (/{repo}/paths/{sha}) and BlobBase the URL its file links start with;
65 // both are "" when the page has no commit to search.
66 PathsURL, BlobBase string
67 // Passkeys tells that the passkey routes exist: the header then links to
68 // them.
69 Passkeys bool
70 // MR loads the script of the merge request page (mr.js).
71 MR bool
72}
73
74// Link is a plain label + href pair.
75type Link struct{ Label, Href string }
76
77// HomeRow is one repository in the home list.
78type HomeRow struct {
79 ID string
80 Name string
81 Href string
82 Desc string
83 Pushed string
84 PushedAt string // RFC 3339, "" when never pushed
85 Branch string
86 Cursor bool
87 // Private marks a private repository; only set for a signed-in visitor.
88 Private bool
89 // Fresh marks a row that a push just updated (live updates only).
90 Fresh bool
91}
92
93// SortLink is one way to order the home list; it links to that order.
94type SortLink struct {
95 Label string
96 Href string
97 Mark string // "▲" or "▼" on the current order, "" otherwise
98 // State says the current direction and what the link does, for screen
99 // readers (the mark is hidden from them); "" off the current order.
100 State string
101}
102
103// HomePage is the repository list.
104type HomePage struct {
105 Sorts []SortLink
106 Rows []HomeRow
107}
108
109// Fact is one key/value row of the facts block.
110type Fact struct {
111 Key, Val, ID, Time string
112}
113
114// Clone is a block of copyable shell lines, one [copy] button per line.
115type Clone struct {
116 ID string
117 Lines []string
118}
119
120// Heading is one README outline entry.
121type Heading struct {
122 Level int
123 ID string
124 Text string
125}
126
127// Readme is a rendered README. HTML comes from the Markdown renderer (raw
128// HTML dropped, URLs filtered) or is escaped plain text.
129type Readme struct {
130 Name string
131 HTML template.HTML
132 // Note replaces the content when the file is not rendered (too large).
133 Note string
134}
135
136// CommitRow is one commit in the commit table.
137type CommitRow struct {
138 ID string
139 Short string
140 Subject string
141 CHref string
142 Author string
143 When string
144 WhenAt string
145 Merge bool
146 Branches []string
147 Tags []string
148 Cursor bool
149 // Checks is the combined state of the CI checks of the commit; empty when
150 // it has none.
151 Checks ChecksSummary
152}
153
154// SummaryPage is the repository summary.
155type SummaryPage struct {
156 Facts []Fact
157 Clone Clone
158 Recent []CommitRow
159 Readme *Readme
160 Outline []Heading
161 AllHref string
162 // Latest is the newest tag, nil when the repository has none.
163 Latest *LatestTag
164 // Actions is the recent runs of the rail, nil when the viewer cannot read
165 // CI (or the server runs none).
166 Actions *RecentActions
167}
168
169// RecentActions is the "Recent actions" block of the summary rail: the newest
170// runs. With no run the block is in the page but hidden, so that the first
171// run reaches it live.
172type RecentActions struct {
173 Runs []RunRow
174 AllHref string
175}
176
177// LatestTag is the newest tag of a repository, shown in the summary rail.
178// Name is empty when there are too many tags to date them; Count and
179// RefsHref still lead to the full list.
180type LatestTag struct {
181 Name, Href, Subject, When, WhenAt string
182 Count int
183 RefsHref string
184}
185
186// RefRow is a branch or a tag in the refs table.
187type RefRow struct {
188 Name, Href, Short, CHref, Subject, When, WhenAt string
189 Default, Cursor bool
190 // Checks is the combined state of the CI checks of the commit.
191 Checks ChecksSummary
192}
193
194// RefsPage lists the branches and tags of a repository.
195type RefsPage struct {
196 Branches []RefRow
197 Tags []RefRow
198 Latest string
199 Default string
200 // Note says the lists were cut.
201 Note string
202}
203
204// StatePage is a 404, 500 or empty-repository state.
205type StatePage struct {
206 Code string // "404", "500", "empty"
207 Title string
208 Lines []string
209 Clone *Clone
210 Back []Link
211}
212
213// LoginPage is the confirmation of a login link: a form with one button.
214type LoginPage struct {
215 Title string
216 Lines []string
217 Action string // where the form posts
218 Button string
219}
220
221// PasskeyLoginPage is the sign-in page: one button the script drives.
222type PasskeyLoginPage struct {
223 Title string
224 Lines []string
225 Button string
226 // Begin and Finish are the endpoints the script posts to.
227 Begin, Finish string
228}
229
230// PasskeyRow is one passkey on the passkeys page.
231type PasskeyRow struct {
232 Name string
233 // Created and LastUsed are relative ("3d ago"); the At fields are the
234 // RFC 3339 forms, "" when never.
235 Created, CreatedAt string
236 LastUsed, LastUsedAt string
237 Synced bool
238 // Remove is where the remove form posts.
239 Remove string
240}
241
242// PasskeysPage lists the passkeys and adds one.
243type PasskeysPage struct {
244 Rows []PasskeyRow
245 Begin, Finish string
246 // Full tells that no more passkeys can be added.
247 Full bool
248 Max int
249}