diff --git a/http_mutators.go b/http_mutators.go
index d40a16c..0cc3f56 100644
--- a/http_mutators.go
+++ b/http_mutators.go
@@ -71,14 +71,14 @@ var handlerDeleteAsk = factoryHandlerAsker(
"delete-ask",
shroom.CanDelete,
"Delete %s?",
- templates.DeleteAskHTML,
+ views.DeleteAskHTML,
)
var handlerRenameAsk = factoryHandlerAsker(
"rename-ask",
shroom.CanRename,
"Rename %s?",
- templates.RenameAskHTML,
+ views.RenameAskHTML,
)
func factoryHandlerConfirmer(
diff --git a/templates/delete.qtpl b/templates/delete.qtpl
deleted file mode 100644
index 57e21a3..0000000
--- a/templates/delete.qtpl
+++ /dev/null
@@ -1,29 +0,0 @@
-{% import "net/http" %}
-
-This dialog is to be shown to a user when they try to delete a hypha.
-{% func DeleteAskHTML(rq *http.Request, hyphaName string, isOld bool) %}
-{%= navHTML(rq, hyphaName, "delete-ask") %}
-
-
-{% if isOld %}
-
- Delete {%s hyphaName %}?
- Do you really want to delete hypha {%s hyphaName %} ?
- In this version of MycorrhizaWiki you cannot undelete a deleted hypha but the history can still be accessed.
- Confirm
- Cancel
-
-{% else %}
- {%= cannotDeleteDueToNonExistence(hyphaName) %}
-{% endif %}
-
-
-{% endfunc %}
-
-{% func cannotDeleteDueToNonExistence(hyphaName string) %}
-
- Cannot delete {%s hyphaName %}
- This hypha does not exist.
- Go back
-
-{% endfunc %}
diff --git a/templates/delete.qtpl.go b/templates/delete.qtpl.go
deleted file mode 100644
index 3609ec1..0000000
--- a/templates/delete.qtpl.go
+++ /dev/null
@@ -1,156 +0,0 @@
-// Code generated by qtc from "delete.qtpl". DO NOT EDIT.
-// See https://github.com/valyala/quicktemplate for details.
-
-//line templates/delete.qtpl:1
-package templates
-
-//line templates/delete.qtpl:1
-import "net/http"
-
-// This dialog is to be shown to a user when they try to delete a hypha.
-
-//line templates/delete.qtpl:4
-import (
- qtio422016 "io"
-
- qt422016 "github.com/valyala/quicktemplate"
-)
-
-//line templates/delete.qtpl:4
-var (
- _ = qtio422016.Copy
- _ = qt422016.AcquireByteBuffer
-)
-
-//line templates/delete.qtpl:4
-func StreamDeleteAskHTML(qw422016 *qt422016.Writer, rq *http.Request, hyphaName string, isOld bool) {
-//line templates/delete.qtpl:4
- qw422016.N().S(`
-`)
-//line templates/delete.qtpl:5
- streamnavHTML(qw422016, rq, hyphaName, "delete-ask")
-//line templates/delete.qtpl:5
- qw422016.N().S(`
-
-
-`)
-//line templates/delete.qtpl:8
- if isOld {
-//line templates/delete.qtpl:8
- qw422016.N().S(`
-
- Delete `)
-//line templates/delete.qtpl:10
- qw422016.E().S(hyphaName)
-//line templates/delete.qtpl:10
- qw422016.N().S(`?
- Do you really want to delete hypha `)
-//line templates/delete.qtpl:11
- qw422016.E().S(hyphaName)
-//line templates/delete.qtpl:11
- qw422016.N().S(` ?
- In this version of MycorrhizaWiki you cannot undelete a deleted hypha but the history can still be accessed.
- Confirm
- Cancel
-
-`)
-//line templates/delete.qtpl:16
- } else {
-//line templates/delete.qtpl:16
- qw422016.N().S(`
- `)
-//line templates/delete.qtpl:17
- streamcannotDeleteDueToNonExistence(qw422016, hyphaName)
-//line templates/delete.qtpl:17
- qw422016.N().S(`
-`)
-//line templates/delete.qtpl:18
- }
-//line templates/delete.qtpl:18
- qw422016.N().S(`
-
-
-`)
-//line templates/delete.qtpl:21
-}
-
-//line templates/delete.qtpl:21
-func WriteDeleteAskHTML(qq422016 qtio422016.Writer, rq *http.Request, hyphaName string, isOld bool) {
-//line templates/delete.qtpl:21
- qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/delete.qtpl:21
- StreamDeleteAskHTML(qw422016, rq, hyphaName, isOld)
-//line templates/delete.qtpl:21
- qt422016.ReleaseWriter(qw422016)
-//line templates/delete.qtpl:21
-}
-
-//line templates/delete.qtpl:21
-func DeleteAskHTML(rq *http.Request, hyphaName string, isOld bool) string {
-//line templates/delete.qtpl:21
- qb422016 := qt422016.AcquireByteBuffer()
-//line templates/delete.qtpl:21
- WriteDeleteAskHTML(qb422016, rq, hyphaName, isOld)
-//line templates/delete.qtpl:21
- qs422016 := string(qb422016.B)
-//line templates/delete.qtpl:21
- qt422016.ReleaseByteBuffer(qb422016)
-//line templates/delete.qtpl:21
- return qs422016
-//line templates/delete.qtpl:21
-}
-
-//line templates/delete.qtpl:23
-func streamcannotDeleteDueToNonExistence(qw422016 *qt422016.Writer, hyphaName string) {
-//line templates/delete.qtpl:23
- qw422016.N().S(`
-
- Cannot delete `)
-//line templates/delete.qtpl:25
- qw422016.E().S(hyphaName)
-//line templates/delete.qtpl:25
- qw422016.N().S(`
- This hypha does not exist.
- Go back
-
-`)
-//line templates/delete.qtpl:29
-}
-
-//line templates/delete.qtpl:29
-func writecannotDeleteDueToNonExistence(qq422016 qtio422016.Writer, hyphaName string) {
-//line templates/delete.qtpl:29
- qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/delete.qtpl:29
- streamcannotDeleteDueToNonExistence(qw422016, hyphaName)
-//line templates/delete.qtpl:29
- qt422016.ReleaseWriter(qw422016)
-//line templates/delete.qtpl:29
-}
-
-//line templates/delete.qtpl:29
-func cannotDeleteDueToNonExistence(hyphaName string) string {
-//line templates/delete.qtpl:29
- qb422016 := qt422016.AcquireByteBuffer()
-//line templates/delete.qtpl:29
- writecannotDeleteDueToNonExistence(qb422016, hyphaName)
-//line templates/delete.qtpl:29
- qs422016 := string(qb422016.B)
-//line templates/delete.qtpl:29
- qt422016.ReleaseByteBuffer(qb422016)
-//line templates/delete.qtpl:29
- return qs422016
-//line templates/delete.qtpl:29
-}
diff --git a/templates/rename.qtpl b/templates/rename.qtpl
deleted file mode 100644
index 8f35d55..0000000
--- a/templates/rename.qtpl
+++ /dev/null
@@ -1,39 +0,0 @@
-{% import "net/http" %}
-This dialog is to be shown to a user when they try to rename a hypha.
-{% func RenameAskHTML(rq *http.Request, hyphaName string, isOld bool) %}
-{%= navHTML(rq, hyphaName, "rename-ask") %}
-
-
-{%- if isOld -%}
-
- Rename {%s hyphaName %}
-
-
-{%- else -%}
- {%= cannotRenameDueToNonExistence(hyphaName) %}
-{%- endif -%}
-
-
-{% endfunc %}
-
-{% func cannotRenameDueToNonExistence(hyphaName string) %}
-
- Cannot rename {%s hyphaName %}
- This hypha does not exist.
- Go back
-
-{% endfunc %}
diff --git a/templates/rename.qtpl.go b/templates/rename.qtpl.go
deleted file mode 100644
index 973c5f7..0000000
--- a/templates/rename.qtpl.go
+++ /dev/null
@@ -1,160 +0,0 @@
-// Code generated by qtc from "rename.qtpl". DO NOT EDIT.
-// See https://github.com/valyala/quicktemplate for details.
-
-//line templates/rename.qtpl:1
-package templates
-
-//line templates/rename.qtpl:1
-import "net/http"
-
-// This dialog is to be shown to a user when they try to rename a hypha.
-
-//line templates/rename.qtpl:3
-import (
- qtio422016 "io"
-
- qt422016 "github.com/valyala/quicktemplate"
-)
-
-//line templates/rename.qtpl:3
-var (
- _ = qtio422016.Copy
- _ = qt422016.AcquireByteBuffer
-)
-
-//line templates/rename.qtpl:3
-func StreamRenameAskHTML(qw422016 *qt422016.Writer, rq *http.Request, hyphaName string, isOld bool) {
-//line templates/rename.qtpl:3
- qw422016.N().S(`
-`)
-//line templates/rename.qtpl:4
- streamnavHTML(qw422016, rq, hyphaName, "rename-ask")
-//line templates/rename.qtpl:4
- qw422016.N().S(`
-
-
-`)
-//line templates/rename.qtpl:7
- if isOld {
-//line templates/rename.qtpl:7
- qw422016.N().S(`
- Rename `)
-//line templates/rename.qtpl:9
- qw422016.E().S(hyphaName)
-//line templates/rename.qtpl:9
- qw422016.N().S(`
-
-
-`)
-//line templates/rename.qtpl:26
- } else {
-//line templates/rename.qtpl:26
- qw422016.N().S(` `)
-//line templates/rename.qtpl:27
- streamcannotRenameDueToNonExistence(qw422016, hyphaName)
-//line templates/rename.qtpl:27
- qw422016.N().S(`
-`)
-//line templates/rename.qtpl:28
- }
-//line templates/rename.qtpl:28
- qw422016.N().S(`
-
-`)
-//line templates/rename.qtpl:31
-}
-
-//line templates/rename.qtpl:31
-func WriteRenameAskHTML(qq422016 qtio422016.Writer, rq *http.Request, hyphaName string, isOld bool) {
-//line templates/rename.qtpl:31
- qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/rename.qtpl:31
- StreamRenameAskHTML(qw422016, rq, hyphaName, isOld)
-//line templates/rename.qtpl:31
- qt422016.ReleaseWriter(qw422016)
-//line templates/rename.qtpl:31
-}
-
-//line templates/rename.qtpl:31
-func RenameAskHTML(rq *http.Request, hyphaName string, isOld bool) string {
-//line templates/rename.qtpl:31
- qb422016 := qt422016.AcquireByteBuffer()
-//line templates/rename.qtpl:31
- WriteRenameAskHTML(qb422016, rq, hyphaName, isOld)
-//line templates/rename.qtpl:31
- qs422016 := string(qb422016.B)
-//line templates/rename.qtpl:31
- qt422016.ReleaseByteBuffer(qb422016)
-//line templates/rename.qtpl:31
- return qs422016
-//line templates/rename.qtpl:31
-}
-
-//line templates/rename.qtpl:33
-func streamcannotRenameDueToNonExistence(qw422016 *qt422016.Writer, hyphaName string) {
-//line templates/rename.qtpl:33
- qw422016.N().S(`
-
- Cannot rename `)
-//line templates/rename.qtpl:35
- qw422016.E().S(hyphaName)
-//line templates/rename.qtpl:35
- qw422016.N().S(`
- This hypha does not exist.
- Go back
-
-`)
-//line templates/rename.qtpl:39
-}
-
-//line templates/rename.qtpl:39
-func writecannotRenameDueToNonExistence(qq422016 qtio422016.Writer, hyphaName string) {
-//line templates/rename.qtpl:39
- qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/rename.qtpl:39
- streamcannotRenameDueToNonExistence(qw422016, hyphaName)
-//line templates/rename.qtpl:39
- qt422016.ReleaseWriter(qw422016)
-//line templates/rename.qtpl:39
-}
-
-//line templates/rename.qtpl:39
-func cannotRenameDueToNonExistence(hyphaName string) string {
-//line templates/rename.qtpl:39
- qb422016 := qt422016.AcquireByteBuffer()
-//line templates/rename.qtpl:39
- writecannotRenameDueToNonExistence(qb422016, hyphaName)
-//line templates/rename.qtpl:39
- qs422016 := string(qb422016.B)
-//line templates/rename.qtpl:39
- qt422016.ReleaseByteBuffer(qb422016)
-//line templates/rename.qtpl:39
- return qs422016
-//line templates/rename.qtpl:39
-}
diff --git a/views/modal.qtpl b/views/modal.qtpl
new file mode 100644
index 0000000..8ca4ec6
--- /dev/null
+++ b/views/modal.qtpl
@@ -0,0 +1,63 @@
+{% import "net/http" %}
+{% import "github.com/bouncepaw/mycorrhiza/util" %}
+
+{% func DeleteAskHTML(rq *http.Request, hyphaName string, isOld bool) %}
+{%= NavHTML(rq, hyphaName, "delete-ask") %}
+{%= modalBegin(
+ "delete-confirm",
+ hyphaName,
+ "",
+ "Delete "+util.BeautifulName(hyphaName)+"?") %}
+{%= modalReallyWant(hyphaName, "unattach") %}
+ In this version of MycorrhizaWiki you cannot undelete a deleted hypha but the history can still be accessed.
+{%= modalEnd(hyphaName, true) %}
+{% endfunc %}
+
+{% func UnattachAskHTML(rq *http.Request, hyphaName string, isOld bool) %}
+{%= NavHTML(rq, hyphaName, "unattach-ask") %}
+{%= modalBegin(
+ "unattach-confirm",
+ hyphaName,
+ "",
+ "Unattach "+util.BeautifulName(hyphaName)+"?") %}
+{%= modalReallyWant(hyphaName, "unattach") %}
+{%= modalEnd(hyphaName, true) %}
+{% endfunc %}
+
+{% func RenameAskHTML(rq *http.Request, hyphaName string, isOld bool) %}
+{%= NavHTML(rq, hyphaName, "rename-ask") %}
+{%= modalBegin(
+ "rename-confirm",
+ hyphaName,
+ ` method="post" enctype="multipart/form-data"`,
+ "Rename "+util.BeautifulName(hyphaName)) %}
+ New name
+
+
+
+ Rename subhyphae too
+
+ If you rename this hypha, all incoming links and all relative outcoming links will break. You will also lose all history for the new name. Rename carefully.
+{%= modalEnd(hyphaName, false) %}
+{% endfunc %}
+
+{% func modalReallyWant(hyphaName, verb string) %}
+ Do you really want to {%s verb %} hypha {%s hyphaName %} ?
+{% endfunc %}
+
+{% func modalBegin(path, hyphaName, formAttrs, legend string) %}
+
+{% endfunc %}
diff --git a/views/modal.qtpl.go b/views/modal.qtpl.go
new file mode 100644
index 0000000..9e81e54
--- /dev/null
+++ b/views/modal.qtpl.go
@@ -0,0 +1,355 @@
+// Code generated by qtc from "modal.qtpl". DO NOT EDIT.
+// See https://github.com/valyala/quicktemplate for details.
+
+//line views/modal.qtpl:1
+package views
+
+//line views/modal.qtpl:1
+import "net/http"
+
+//line views/modal.qtpl:2
+import "github.com/bouncepaw/mycorrhiza/util"
+
+//line views/modal.qtpl:4
+import (
+ qtio422016 "io"
+
+ qt422016 "github.com/valyala/quicktemplate"
+)
+
+//line views/modal.qtpl:4
+var (
+ _ = qtio422016.Copy
+ _ = qt422016.AcquireByteBuffer
+)
+
+//line views/modal.qtpl:4
+func StreamDeleteAskHTML(qw422016 *qt422016.Writer, rq *http.Request, hyphaName string, isOld bool) {
+//line views/modal.qtpl:4
+ qw422016.N().S(`
+`)
+//line views/modal.qtpl:5
+ StreamNavHTML(qw422016, rq, hyphaName, "delete-ask")
+//line views/modal.qtpl:5
+ qw422016.N().S(`
+`)
+//line views/modal.qtpl:6
+ streammodalBegin(qw422016,
+ "delete-confirm",
+ hyphaName,
+ "",
+ "Delete "+util.BeautifulName(hyphaName)+"?")
+//line views/modal.qtpl:10
+ qw422016.N().S(`
+`)
+//line views/modal.qtpl:11
+ streammodalReallyWant(qw422016, hyphaName, "unattach")
+//line views/modal.qtpl:11
+ qw422016.N().S(`
+ In this version of MycorrhizaWiki you cannot undelete a deleted hypha but the history can still be accessed.
+`)
+//line views/modal.qtpl:13
+ streammodalEnd(qw422016, hyphaName, true)
+//line views/modal.qtpl:13
+ qw422016.N().S(`
+`)
+//line views/modal.qtpl:14
+}
+
+//line views/modal.qtpl:14
+func WriteDeleteAskHTML(qq422016 qtio422016.Writer, rq *http.Request, hyphaName string, isOld bool) {
+//line views/modal.qtpl:14
+ qw422016 := qt422016.AcquireWriter(qq422016)
+//line views/modal.qtpl:14
+ StreamDeleteAskHTML(qw422016, rq, hyphaName, isOld)
+//line views/modal.qtpl:14
+ qt422016.ReleaseWriter(qw422016)
+//line views/modal.qtpl:14
+}
+
+//line views/modal.qtpl:14
+func DeleteAskHTML(rq *http.Request, hyphaName string, isOld bool) string {
+//line views/modal.qtpl:14
+ qb422016 := qt422016.AcquireByteBuffer()
+//line views/modal.qtpl:14
+ WriteDeleteAskHTML(qb422016, rq, hyphaName, isOld)
+//line views/modal.qtpl:14
+ qs422016 := string(qb422016.B)
+//line views/modal.qtpl:14
+ qt422016.ReleaseByteBuffer(qb422016)
+//line views/modal.qtpl:14
+ return qs422016
+//line views/modal.qtpl:14
+}
+
+//line views/modal.qtpl:16
+func StreamUnattachAskHTML(qw422016 *qt422016.Writer, rq *http.Request, hyphaName string, isOld bool) {
+//line views/modal.qtpl:16
+ qw422016.N().S(`
+`)
+//line views/modal.qtpl:17
+ StreamNavHTML(qw422016, rq, hyphaName, "unattach-ask")
+//line views/modal.qtpl:17
+ qw422016.N().S(`
+`)
+//line views/modal.qtpl:18
+ streammodalBegin(qw422016,
+ "unattach-confirm",
+ hyphaName,
+ "",
+ "Unattach "+util.BeautifulName(hyphaName)+"?")
+//line views/modal.qtpl:22
+ qw422016.N().S(`
+`)
+//line views/modal.qtpl:23
+ streammodalReallyWant(qw422016, hyphaName, "unattach")
+//line views/modal.qtpl:23
+ qw422016.N().S(`
+`)
+//line views/modal.qtpl:24
+ streammodalEnd(qw422016, hyphaName, true)
+//line views/modal.qtpl:24
+ qw422016.N().S(`
+`)
+//line views/modal.qtpl:25
+}
+
+//line views/modal.qtpl:25
+func WriteUnattachAskHTML(qq422016 qtio422016.Writer, rq *http.Request, hyphaName string, isOld bool) {
+//line views/modal.qtpl:25
+ qw422016 := qt422016.AcquireWriter(qq422016)
+//line views/modal.qtpl:25
+ StreamUnattachAskHTML(qw422016, rq, hyphaName, isOld)
+//line views/modal.qtpl:25
+ qt422016.ReleaseWriter(qw422016)
+//line views/modal.qtpl:25
+}
+
+//line views/modal.qtpl:25
+func UnattachAskHTML(rq *http.Request, hyphaName string, isOld bool) string {
+//line views/modal.qtpl:25
+ qb422016 := qt422016.AcquireByteBuffer()
+//line views/modal.qtpl:25
+ WriteUnattachAskHTML(qb422016, rq, hyphaName, isOld)
+//line views/modal.qtpl:25
+ qs422016 := string(qb422016.B)
+//line views/modal.qtpl:25
+ qt422016.ReleaseByteBuffer(qb422016)
+//line views/modal.qtpl:25
+ return qs422016
+//line views/modal.qtpl:25
+}
+
+//line views/modal.qtpl:27
+func StreamRenameAskHTML(qw422016 *qt422016.Writer, rq *http.Request, hyphaName string, isOld bool) {
+//line views/modal.qtpl:27
+ qw422016.N().S(`
+`)
+//line views/modal.qtpl:28
+ StreamNavHTML(qw422016, rq, hyphaName, "rename-ask")
+//line views/modal.qtpl:28
+ qw422016.N().S(`
+`)
+//line views/modal.qtpl:29
+ streammodalBegin(qw422016,
+ "rename-confirm",
+ hyphaName,
+ ` method="post" enctype="multipart/form-data"`,
+ "Rename "+util.BeautifulName(hyphaName))
+//line views/modal.qtpl:33
+ qw422016.N().S(`
+ New name
+
+
+
+ Rename subhyphae too
+
+ If you rename this hypha, all incoming links and all relative outcoming links will break. You will also lose all history for the new name. Rename carefully.
+`)
+//line views/modal.qtpl:41
+ streammodalEnd(qw422016, hyphaName, false)
+//line views/modal.qtpl:41
+ qw422016.N().S(`
+`)
+//line views/modal.qtpl:42
+}
+
+//line views/modal.qtpl:42
+func WriteRenameAskHTML(qq422016 qtio422016.Writer, rq *http.Request, hyphaName string, isOld bool) {
+//line views/modal.qtpl:42
+ qw422016 := qt422016.AcquireWriter(qq422016)
+//line views/modal.qtpl:42
+ StreamRenameAskHTML(qw422016, rq, hyphaName, isOld)
+//line views/modal.qtpl:42
+ qt422016.ReleaseWriter(qw422016)
+//line views/modal.qtpl:42
+}
+
+//line views/modal.qtpl:42
+func RenameAskHTML(rq *http.Request, hyphaName string, isOld bool) string {
+//line views/modal.qtpl:42
+ qb422016 := qt422016.AcquireByteBuffer()
+//line views/modal.qtpl:42
+ WriteRenameAskHTML(qb422016, rq, hyphaName, isOld)
+//line views/modal.qtpl:42
+ qs422016 := string(qb422016.B)
+//line views/modal.qtpl:42
+ qt422016.ReleaseByteBuffer(qb422016)
+//line views/modal.qtpl:42
+ return qs422016
+//line views/modal.qtpl:42
+}
+
+//line views/modal.qtpl:44
+func streammodalReallyWant(qw422016 *qt422016.Writer, hyphaName, verb string) {
+//line views/modal.qtpl:44
+ qw422016.N().S(`
+ Do you really want to `)
+//line views/modal.qtpl:45
+ qw422016.E().S(verb)
+//line views/modal.qtpl:45
+ qw422016.N().S(` hypha `)
+//line views/modal.qtpl:45
+ qw422016.E().S(hyphaName)
+//line views/modal.qtpl:45
+ qw422016.N().S(` ?
+`)
+//line views/modal.qtpl:46
+}
+
+//line views/modal.qtpl:46
+func writemodalReallyWant(qq422016 qtio422016.Writer, hyphaName, verb string) {
+//line views/modal.qtpl:46
+ qw422016 := qt422016.AcquireWriter(qq422016)
+//line views/modal.qtpl:46
+ streammodalReallyWant(qw422016, hyphaName, verb)
+//line views/modal.qtpl:46
+ qt422016.ReleaseWriter(qw422016)
+//line views/modal.qtpl:46
+}
+
+//line views/modal.qtpl:46
+func modalReallyWant(hyphaName, verb string) string {
+//line views/modal.qtpl:46
+ qb422016 := qt422016.AcquireByteBuffer()
+//line views/modal.qtpl:46
+ writemodalReallyWant(qb422016, hyphaName, verb)
+//line views/modal.qtpl:46
+ qs422016 := string(qb422016.B)
+//line views/modal.qtpl:46
+ qt422016.ReleaseByteBuffer(qb422016)
+//line views/modal.qtpl:46
+ return qs422016
+//line views/modal.qtpl:46
+}
+
+//line views/modal.qtpl:48
+func streammodalBegin(qw422016 *qt422016.Writer, path, hyphaName, formAttrs, legend string) {
+//line views/modal.qtpl:48
+ qw422016.N().S(`
+
+`)
+//line views/modal.qtpl:63
+}
+
+//line views/modal.qtpl:63
+func writemodalEnd(qq422016 qtio422016.Writer, hyphaName string, shouldFocusOnConfirm bool) {
+//line views/modal.qtpl:63
+ qw422016 := qt422016.AcquireWriter(qq422016)
+//line views/modal.qtpl:63
+ streammodalEnd(qw422016, hyphaName, shouldFocusOnConfirm)
+//line views/modal.qtpl:63
+ qt422016.ReleaseWriter(qw422016)
+//line views/modal.qtpl:63
+}
+
+//line views/modal.qtpl:63
+func modalEnd(hyphaName string, shouldFocusOnConfirm bool) string {
+//line views/modal.qtpl:63
+ qb422016 := qt422016.AcquireByteBuffer()
+//line views/modal.qtpl:63
+ writemodalEnd(qb422016, hyphaName, shouldFocusOnConfirm)
+//line views/modal.qtpl:63
+ qs422016 := string(qb422016.B)
+//line views/modal.qtpl:63
+ qt422016.ReleaseByteBuffer(qb422016)
+//line views/modal.qtpl:63
+ return qs422016
+//line views/modal.qtpl:63
+}
diff --git a/views/unattach.qtpl b/views/unattach.qtpl
deleted file mode 100644
index 1a6f29a..0000000
--- a/views/unattach.qtpl
+++ /dev/null
@@ -1,18 +0,0 @@
-{% import "net/http" %}
-{% import "github.com/bouncepaw/mycorrhiza/util" %}
-
-{% func UnattachAskHTML(rq *http.Request, hyphaName string, isOld bool) %}
-{%= NavHTML(rq, hyphaName, "unattach-ask") %}
-
-{% endfunc %}
diff --git a/views/unattach.qtpl.go b/views/unattach.qtpl.go
deleted file mode 100644
index 5a4f542..0000000
--- a/views/unattach.qtpl.go
+++ /dev/null
@@ -1,91 +0,0 @@
-// Code generated by qtc from "unattach.qtpl". DO NOT EDIT.
-// See https://github.com/valyala/quicktemplate for details.
-
-//line views/unattach.qtpl:1
-package views
-
-//line views/unattach.qtpl:1
-import "net/http"
-
-//line views/unattach.qtpl:2
-import "github.com/bouncepaw/mycorrhiza/util"
-
-//line views/unattach.qtpl:4
-import (
- qtio422016 "io"
-
- qt422016 "github.com/valyala/quicktemplate"
-)
-
-//line views/unattach.qtpl:4
-var (
- _ = qtio422016.Copy
- _ = qt422016.AcquireByteBuffer
-)
-
-//line views/unattach.qtpl:4
-func StreamUnattachAskHTML(qw422016 *qt422016.Writer, rq *http.Request, hyphaName string, isOld bool) {
-//line views/unattach.qtpl:4
- qw422016.N().S(`
-`)
-//line views/unattach.qtpl:5
- StreamNavHTML(qw422016, rq, hyphaName, "unattach-ask")
-//line views/unattach.qtpl:5
- qw422016.N().S(`
-
-`)
-//line views/unattach.qtpl:18
-}
-
-//line views/unattach.qtpl:18
-func WriteUnattachAskHTML(qq422016 qtio422016.Writer, rq *http.Request, hyphaName string, isOld bool) {
-//line views/unattach.qtpl:18
- qw422016 := qt422016.AcquireWriter(qq422016)
-//line views/unattach.qtpl:18
- StreamUnattachAskHTML(qw422016, rq, hyphaName, isOld)
-//line views/unattach.qtpl:18
- qt422016.ReleaseWriter(qw422016)
-//line views/unattach.qtpl:18
-}
-
-//line views/unattach.qtpl:18
-func UnattachAskHTML(rq *http.Request, hyphaName string, isOld bool) string {
-//line views/unattach.qtpl:18
- qb422016 := qt422016.AcquireByteBuffer()
-//line views/unattach.qtpl:18
- WriteUnattachAskHTML(qb422016, rq, hyphaName, isOld)
-//line views/unattach.qtpl:18
- qs422016 := string(qb422016.B)
-//line views/unattach.qtpl:18
- qt422016.ReleaseByteBuffer(qb422016)
-//line views/unattach.qtpl:18
- return qs422016
-//line views/unattach.qtpl:18
-}