aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2020-10-30 13:41:25 -0400
committerDrew DeVault <sir@cmpwn.com>2020-10-30 13:41:25 -0400
commit417d9bbd646248daebde2ab0ccc2fcbcb8911426 (patch)
treeab3934a3809613f9ed411ca5ba67293e64796f67
parent2bef9425fb249b015f6046b71f1d26cceda279d1 (diff)
downloadalps-417d9bbd646248daebde2ab0ccc2fcbcb8911426.tar.gz
alps-417d9bbd646248daebde2ab0ccc2fcbcb8911426.zip
Implement folder creation UI
-rw-r--r--plugins/base/routes.go44
-rw-r--r--themes/alps/new-mailbox.html23
-rw-r--r--themes/alps/util.html5
3 files changed, 71 insertions, 1 deletions
diff --git a/plugins/base/routes.go b/plugins/base/routes.go
index 7e30513..c031cb0 100644
--- a/plugins/base/routes.go
+++ b/plugins/base/routes.go
@@ -31,6 +31,9 @@ func registerRoutes(p *alps.GoPlugin) {
p.GET("/mailbox/:mbox", handleGetMailbox)
p.POST("/mailbox/:mbox", handleGetMailbox)
+ p.GET("/new-mailbox", handleNewMailbox)
+ p.POST("/new-mailbox", handleNewMailbox)
+
p.GET("/message/:mbox/:uid", func(ctx *alps.Context) error {
return handleGetPart(ctx, false)
})
@@ -259,6 +262,47 @@ func handleGetMailbox(ctx *alps.Context) error {
})
}
+type NewMailboxRenderData struct {
+ IMAPBaseRenderData
+ Error string
+}
+
+func handleNewMailbox(ctx *alps.Context) error {
+ ibase, err := newIMAPBaseRenderData(ctx, alps.NewBaseRenderData(ctx))
+ if err != nil {
+ return err
+ }
+ ibase.BaseRenderData.WithTitle("Create new folder")
+
+ if ctx.Request().Method == http.MethodPost {
+ name := ctx.FormValue("name")
+ if name == "" {
+ return ctx.Render(http.StatusOK, "new-mailbox.html", &NewMailboxRenderData{
+ IMAPBaseRenderData: *ibase,
+ Error: "Name is required",
+ })
+ }
+
+ err := ctx.Session.DoIMAP(func(c *imapclient.Client) error {
+ return c.Create(name)
+ })
+
+ if err != nil {
+ return ctx.Render(http.StatusOK, "new-mailbox.html", &NewMailboxRenderData{
+ IMAPBaseRenderData: *ibase,
+ Error: err.Error(),
+ })
+ }
+
+ return ctx.Redirect(http.StatusFound, fmt.Sprintf("/mailbox/%s", url.PathEscape(name)))
+ }
+
+ return ctx.Render(http.StatusOK, "new-mailbox.html", &NewMailboxRenderData{
+ IMAPBaseRenderData: *ibase,
+ Error: "",
+ })
+}
+
func handleLogin(ctx *alps.Context) error {
username := ctx.FormValue("username")
password := ctx.FormValue("password")
diff --git a/themes/alps/new-mailbox.html b/themes/alps/new-mailbox.html
new file mode 100644
index 0000000..d202783
--- /dev/null
+++ b/themes/alps/new-mailbox.html
@@ -0,0 +1,23 @@
+{{template "head.html" .}}
+{{template "nav.html" .}}
+{{template "util.html" .}}
+
+<div class="page-wrap">
+ {{ template "aside" . }}
+ <div class="container">
+ <main class="create-update">
+ <form method="POST">
+ <h2>Create new folder</h2>
+ <label for="name">Name</label>
+ <input type="text" name="name" id="name" autofocus />
+ {{ if .Error }}<p>{{ .Error }}</p>{{ end }}
+ <div class="actions">
+ <button type="submit">Save</button>
+ <a class="button-link" href="/">Cancel</a>
+ </div>
+ </form>
+ </main>
+ </div>
+</div>
+
+{{template "foot.html"}}
diff --git a/themes/alps/util.html b/themes/alps/util.html
index 89e5cac..5ee456a 100644
--- a/themes/alps/util.html
+++ b/themes/alps/util.html
@@ -26,7 +26,7 @@
<!-- the logo image, dimensions 200x32 may be present or not -->
<a href="/compose" class="new
{{ if eq $.GlobalData.URL.Path "/compose" }}active{{ end }}
- ">Compose&nbsp;Mail</a>
+ ">Compose&nbsp;mail</a>
{{ with .CategorizedMailboxes }}
{{ with .Common.Inbox }}{{ template "mbox-link" . }}{{ end}}
{{ with .Common.Drafts }}{{ template "mbox-link" . }}{{ end}}
@@ -42,5 +42,8 @@
{{ end }}
{{ end }}
{{ end }}
+ <a href="/new-mailbox" class="new
+ {{ if eq $.GlobalData.URL.Path "/new-mailbox" }}active{{ end }}
+ ">Create&nbsp;new&nbsp;folder</a>
</aside>
{{ end }}