initial commit
This commit is contained in:
127
app/mailadm/layouts/main.go.tpl
Normal file
127
app/mailadm/layouts/main.go.tpl
Normal file
@@ -0,0 +1,127 @@
|
||||
{{define "main"}}
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="description" content="Mail Admin.">
|
||||
|
||||
<title>mailadm</title>
|
||||
|
||||
<script src="/htmx.org@1.9.2.js" integrity="sha384-L6OqL9pRWyyFU3+/bjdSri+iIphTN/bvYyM37tICVyOJkWZLpP2vGn6VUEXgzg6h" crossorigin="anonymous"></script>
|
||||
<link rel="stylesheet" href="/pure-min@3.0.0.css" integrity="sha384-X38yfunGUhNzHpBaEBsWLO+A0HDYOQi8ufWDkZ0k9e0eXz/tH3II7uKZ9msv++Ls" crossorigin="anonymous">
|
||||
<link rel="stylesheet" href="/layout.css" crossorigin="anonymous">
|
||||
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
|
||||
<link rel="manifest" href="/site.webmanifest">
|
||||
</head>
|
||||
|
||||
<body id="layout" class="content pure-g">
|
||||
|
||||
<nav id="nav" class="pure-u">
|
||||
<input id="menu-toggle" type="checkbox" />
|
||||
<label class='menu-button-container' for="menu-toggle">
|
||||
<div class='menu-button'></div>
|
||||
|
||||
<div class="nav-inner">
|
||||
<button class="primary-button pure-button">Compose</button>
|
||||
|
||||
<div class="pure-menu">
|
||||
<ul class="pure-menu-list">
|
||||
<li class="pure-menu-item"><a href="#" class="pure-menu-link">Inbox <span class="email-count">(2)</span></a></li>
|
||||
<li class="pure-menu-item"><a href="#" class="pure-menu-link">Important</a></li>
|
||||
<li class="pure-menu-item"><a href="#" class="pure-menu-link">Sent</a></li>
|
||||
<li class="pure-menu-item"><a href="#" class="pure-menu-link">Drafts</a></li>
|
||||
<li class="pure-menu-item"><a href="#" class="pure-menu-link">Trash</a></li>
|
||||
<li class="pure-menu-heading">Labels</li>
|
||||
<li class="pure-menu-item"><a href="#" class="pure-menu-link"><span class="email-label-personal"></span>Personal</a></li>
|
||||
<li class="pure-menu-item"><a href="#" class="pure-menu-link"><span class="email-label-work"></span>Work</a></li>
|
||||
<li class="pure-menu-item"><a href="#" class="pure-menu-link"><span class="email-label-travel"></span>Travel</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div id="list" class="pure-u-1">
|
||||
<div class="email-item email-item-selected pure-g">
|
||||
<div class="pure-u">
|
||||
<img width="64" height="64" alt="Tilo Mitra's avatar" class="email-avatar" src="/img/common/tilo-avatar.png">
|
||||
</div>
|
||||
|
||||
<div class="pure-u-3-4">
|
||||
<h5 class="email-name">Tilo Mitra</h5>
|
||||
<h4 class="email-subject">Hello from Toronto</h4>
|
||||
<p class="email-desc">
|
||||
Hey, I just wanted to check in with you from Toronto. I got here earlier today.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="email-item email-item-unread pure-g">
|
||||
<div class="pure-u">
|
||||
<img width="64" height="64" alt="Eric Ferraiuolo's avatar" class="email-avatar" src="/img/common/ericf-avatar.png">
|
||||
</div>
|
||||
|
||||
<div class="pure-u-3-4">
|
||||
<h5 class="email-name">Eric Ferraiuolo</h5>
|
||||
<h4 class="email-subject">Re: Pull Requests</h4>
|
||||
<p class="email-desc">
|
||||
Hey, I had some feedback for pull request #51. We should center the menu so it looks better on mobile.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="email-item pure-g">
|
||||
<div class="pure-u">
|
||||
<img width="64" height="64" alt="Reid Burke's avatar" class="email-avatar" src="/img/common/reid-avatar.png">
|
||||
</div>
|
||||
|
||||
<div class="pure-u-3-4">
|
||||
<h5 class="email-name">Reid Burke</h5>
|
||||
<h4 class="email-subject">Re: Design Language</h4>
|
||||
<p class="email-desc">
|
||||
Excepteur sint occaecat cupidatat non proident, sunt in culpa.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="email-item pure-g">
|
||||
<div class="pure-u">
|
||||
<img width="64" height="64" alt="Yahoo! Finance's Avatar" class="email-avatar" src="/img/common/yfinance-avatar.png">
|
||||
</div>
|
||||
|
||||
<div class="pure-u-3-4">
|
||||
<h5 class="email-name">Yahoo! Finance</h5>
|
||||
<h4 class="email-subject">How to protect your finances from winter storms</h4>
|
||||
<p class="email-desc">
|
||||
Mauris tempor mi vitae sem aliquet pharetra. Fusce in dui purus, nec malesuada mauris.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="email-item pure-g">
|
||||
<div class="pure-u">
|
||||
<img width="64" height="64" alt="Yahoo! News' avatar" class="email-avatar" src="/img/common/ynews-avatar.png">
|
||||
</div>
|
||||
|
||||
<div class="pure-u-3-4">
|
||||
<h5 class="email-name">Yahoo! News</h5>
|
||||
<h4 class="email-subject">Summary for April 3rd, 2021</h4>
|
||||
<p class="email-desc">
|
||||
We found 10 news articles that you may like.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<secton id="main" class="pure-u-1">
|
||||
{{template "content" .}}
|
||||
</section>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
{{end}}
|
||||
74
app/mailadm/mailadm.go
Normal file
74
app/mailadm/mailadm.go
Normal file
@@ -0,0 +1,74 @@
|
||||
package mailadm
|
||||
|
||||
import (
|
||||
"embed"
|
||||
"io/fs"
|
||||
"log"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"text/template"
|
||||
|
||||
"go.sour.is/pkg/lg"
|
||||
)
|
||||
|
||||
var (
|
||||
//go:embed pages/* layouts/*
|
||||
files embed.FS
|
||||
templates map[string]*template.Template
|
||||
)
|
||||
|
||||
type mailadm struct{}
|
||||
|
||||
func New() *mailadm {
|
||||
return &mailadm{}
|
||||
}
|
||||
|
||||
func (s *mailadm) RegisterHTTP(mux *http.ServeMux) {
|
||||
mux.Handle("/mailadm/", lg.Htrace(s, "mailadm"))
|
||||
|
||||
s.loadTemplates()
|
||||
}
|
||||
func (s *mailadm) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
if r.URL.Path == "/mailadm/clicked" {
|
||||
templates["edit.go.tpl"].Execute(w, r.URL.Query())
|
||||
return
|
||||
}
|
||||
|
||||
templates["home.go.tpl"].Execute(w, nil)
|
||||
}
|
||||
|
||||
var funcMap = map[string]any{
|
||||
"addone": func(s string) string {
|
||||
if i, err := strconv.Atoi(s); err == nil {
|
||||
return strconv.Itoa(i + 1)
|
||||
}
|
||||
return s
|
||||
},
|
||||
}
|
||||
|
||||
func (s *mailadm) loadTemplates() error {
|
||||
if templates != nil {
|
||||
return nil
|
||||
}
|
||||
templates = make(map[string]*template.Template)
|
||||
tmplFiles, err := fs.ReadDir(files, "pages")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, tmpl := range tmplFiles {
|
||||
if tmpl.IsDir() {
|
||||
continue
|
||||
}
|
||||
pt := template.New(tmpl.Name())
|
||||
pt.Funcs(funcMap)
|
||||
pt, err = pt.ParseFS(files, "pages/"+tmpl.Name(), "layouts/*.go.tpl")
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
|
||||
return err
|
||||
}
|
||||
templates[tmpl.Name()] = pt
|
||||
}
|
||||
return nil
|
||||
}
|
||||
3
app/mailadm/pages/edit.go.tpl
Normal file
3
app/mailadm/pages/edit.go.tpl
Normal file
@@ -0,0 +1,3 @@
|
||||
<button hx-get="/mailadm/clicked?times={{ addone ( .Get "times" ) }}" hx-swap="outerHTML">
|
||||
Clicked {{ .Get "times" }} times!
|
||||
</button>
|
||||
8
app/mailadm/pages/home.go.tpl
Normal file
8
app/mailadm/pages/home.go.tpl
Normal file
@@ -0,0 +1,8 @@
|
||||
{{template "main" .}}
|
||||
|
||||
{{define "content"}}
|
||||
<h2>What is this?</h2>
|
||||
<button hx-get="/mailadm/clicked?times=1" hx-swap="outerHTML">
|
||||
Click Me!
|
||||
</button>
|
||||
{{end}}
|
||||
Reference in New Issue
Block a user