Merge pull request #9 from tailscale-dev/Xe/recent-paste-homepage
cmd/web: show up to top 5 recent pastes on homescreen
This commit is contained in:
commit
336965494b
|
@ -82,12 +82,47 @@ func (s *Server) TailnetIndex(w http.ResponseWriter, r *http.Request) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
q := `
|
||||||
|
SELECT p.id
|
||||||
|
, p.filename
|
||||||
|
, p.created_at
|
||||||
|
, u.display_name
|
||||||
|
FROM pastes p
|
||||||
|
INNER JOIN users u
|
||||||
|
ON p.user_id = u.id
|
||||||
|
ORDER BY p.rowid DESC
|
||||||
|
LIMIT 5
|
||||||
|
`
|
||||||
|
|
||||||
|
jpis := make([]JoinedPasteInfo, 0, 5)
|
||||||
|
|
||||||
|
rows, err := s.db.QueryContext(r.Context(), q)
|
||||||
|
if err != nil {
|
||||||
|
s.ShowError(w, r, err, http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
defer rows.Close()
|
||||||
|
for rows.Next() {
|
||||||
|
jpi := JoinedPasteInfo{}
|
||||||
|
|
||||||
|
err := rows.Scan(&jpi.ID, &jpi.Filename, &jpi.CreatedAt, &jpi.PasterDisplayName)
|
||||||
|
if err != nil {
|
||||||
|
s.ShowError(w, r, err, http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
jpis = append(jpis, jpi)
|
||||||
|
}
|
||||||
|
|
||||||
err = s.tmpls.ExecuteTemplate(w, "create.tmpl", struct {
|
err = s.tmpls.ExecuteTemplate(w, "create.tmpl", struct {
|
||||||
UserInfo *tailcfg.UserProfile
|
UserInfo *tailcfg.UserProfile
|
||||||
Title string
|
Title string
|
||||||
|
RecentPastes []JoinedPasteInfo
|
||||||
}{
|
}{
|
||||||
UserInfo: ui.UserProfile,
|
UserInfo: ui.UserProfile,
|
||||||
Title: "Create new paste",
|
Title: "Create new paste",
|
||||||
|
RecentPastes: jpis,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("%s: %v", r.RemoteAddr, err)
|
log.Printf("%s: %v", r.RemoteAddr, err)
|
||||||
|
@ -214,6 +249,13 @@ VALUES
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type JoinedPasteInfo struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
Filename string `json:"fname"`
|
||||||
|
CreatedAt string `json:"created_at"`
|
||||||
|
PasterDisplayName string `json:"created_by"`
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Server) TailnetPasteIndex(w http.ResponseWriter, r *http.Request) {
|
func (s *Server) TailnetPasteIndex(w http.ResponseWriter, r *http.Request) {
|
||||||
userInfo, err := upsertUserInfo(r.Context(), s.db, s.lc, r.RemoteAddr)
|
userInfo, err := upsertUserInfo(r.Context(), s.db, s.lc, r.RemoteAddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -223,13 +265,6 @@ func (s *Server) TailnetPasteIndex(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
||||||
_ = userInfo
|
_ = userInfo
|
||||||
|
|
||||||
type JoinedPasteInfo struct {
|
|
||||||
ID string `json:"id"`
|
|
||||||
Filename string `json:"fname"`
|
|
||||||
CreatedAt string `json:"created_at"`
|
|
||||||
PasterDisplayName string `json:"created_by"`
|
|
||||||
}
|
|
||||||
|
|
||||||
q := `
|
q := `
|
||||||
SELECT p.id
|
SELECT p.id
|
||||||
, p.filename
|
, p.filename
|
||||||
|
|
|
@ -9,5 +9,18 @@
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
|
{{if len .RecentPastes | eq 0}}
|
||||||
|
<p>There are no pastes in the list. Create one to share with your team!</p>
|
||||||
|
{{else}}
|
||||||
|
<h2>Recent pastes</h2>
|
||||||
|
<ul>
|
||||||
|
{{range .RecentPastes}}
|
||||||
|
<li><a href="/paste/{{.ID}}">{{.Filename}}</a> - {{.CreatedAt}} - {{.PasterDisplayName}}</li>
|
||||||
|
{{end}}
|
||||||
|
</ul>
|
||||||
|
|
||||||
<a href="/paste/list">See all pastes</a>
|
<a href="/paste/list">See all pastes</a>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
{{template "footer" .}}
|
{{template "footer" .}}
|
||||||
|
|
Loading…
Reference in a new issue