simple page edit screen
Iris Lightshard nilix@nilfm.cc
PGP Signature
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEkFh6dA+k/6CXFXU4O3+8IhROY5gFAmKZlIYACgkQO3+8IhRO Y5gREQ//XVTDx0pEMij5XX6UWDoZCBtet33cDYGJR9NCAWPfdc2VwPj/IDVMzRvv bLkhi6HrFtdftkyQ4FxTAlZdySdCgw9C7IBEmYZ1bXFi8Hi4VYtKnD3ZX8ZpEU5G mABwdhcLw0ES+6zgBnEftP1idrD+drbiX646ThNiHljFGRI1inveCeXTDzjNpz5j aNjuX9iNCv8AWz4/waWhWuo7XA+qJUx7/wZCeCbkdp+TR4J6qE26Xoth5XuGTmEY cQWsMGr6C4uFoY5EYanTjmTBMCPLNPKBeITFZ9aIh9XEb4D+lXK2bWxI0FBAVYSN ubfnE+ZQBZichJxSZkRLVFqJwaS7Go1fKsWvwaFFtEmoFBU4+RPTCOLINNVP97E0 YQfDsVLfmx+2FfRsXNI+yOS+1xaZzJhLT7ef86gX9uGizpXlduvWyY+dOsZ7htF3 SxLezXWCieNgS1L0jbursJ13+pcE+nbEbSHbCI6SYSpmZcWJqNJ15G7Tl/9JPRQb d2HBu5dGO5Mndl9yIXBZ0gkCu5pd5V2n27UTSpuvkWBjIUll8Fg/D+rY7ZwNpc00 8J5Ijqe07jUd4BIldGaO7Yw1Kv/glmtHdNWgOR3ONrkLm0SNlPntcqxLQO96AQbm 0NBGypxvtOLOjH616kW6kz+Ru/3OCbcLH9gN9gQgCwRoRpRc3y0= =PQpZ -----END PGP SIGNATURE-----
5 files changed,
54 insertions(+),
17 deletions(-)
M
archetype/adapter.go
→
archetype/adapter.go
@@ -3,8 +3,8 @@
type EditMode int const ( - EditModeLiteralTextArea EditMode = iota - EditModeEscapedContentEditable + EditModeLiteralTextArea EditMode = iota + EditModeEscapedContentEditable ) type Adapter interface {
M
archetype/eureka.go
→
archetype/eureka.go
@@ -28,7 +28,7 @@ return "eureka"
} func (self *EurekaAdapter) EditMode() EditMode { - return EditModeLiteralTextArea + return EditModeLiteralTextArea } func (self *EurekaAdapter) GetConfig(key string) (interface{}, error) {
M
lfo/middleware.go
→
lfo/middleware.go
@@ -1,17 +1,28 @@
package lfo import ( - "context" - "net/http" - core "nilfm.cc/git/nirvash/archetype" + "context" + "net/http" + core "nilfm.cc/git/nirvash/archetype" ) func WithAdapter(next http.Handler, adapter core.Adapter) http.Handler { - handlerFunc := func(w http.ResponseWriter, req *http.Request) { - *req = *req.WithContext(context.WithValue(req.Context(), "adapter", adapter)) - next.ServeHTTP(w, req) - } - - return http.HandlerFunc(handlerFunc) + handlerFunc := func(w http.ResponseWriter, req *http.Request) { + *req = *req.WithContext(context.WithValue(req.Context(), "adapter", adapter)) + next.ServeHTTP(w, req) + } + + return http.HandlerFunc(handlerFunc) } +func WithEditModes(next http.Handler) http.Handler { + handlerFunc := func(w http.ResponseWriter, req *http.Request) { + *req = *req.WithContext(context.WithValue(req.Context(), "edit-modes", map[string]core.EditMode{ + "Literal": core.EditModeLiteralTextArea, + "Escaped": core.EditModeEscapedContentEditable, + })) + next.ServeHTTP(w, req) + } + + return http.HandlerFunc(handlerFunc) +}
M
nirvash.go
→
nirvash.go
@@ -39,11 +39,18 @@
rtr.Post("/login", middleware.Authorize("/", udb, "/login?tryagain=1")) rtr.Get("/", middleware.Protected( - shell.WithAdapter( - renderer.Template( - "templates/cms_list.html", - "templates/header.html", - "templates/footer.html"), cfg.Adapter), http.MethodGet, udb, "/login")) + shell.WithAdapter( + renderer.Template( + "templates/cms_list.html", + "templates/header.html", + "templates/footer.html"), cfg.Adapter), http.MethodGet, udb, "/login")) + + rtr.Get(`/edit/(?P<Slug>\S+)`, middleware.Protected( + shell.WithAdapter( + renderer.Template( + "templates/cms_edit.html", + "templates/header.html", + "templates/footer.html"), cfg.Adapter), http.MethodGet, udb, "/login")) http.ListenAndServe(":8080", rtr) }
A
templates/cms_edit.html
@@ -0,0 +1,19 @@
+{{ $slug := ((.Context).Value "params").Slug }} +{{ $page := ((.Context).Value "adapter").GetPage $slug }} +{{ $editMode := ((.Context).Value "adapter").EditMode }} +{{ $editModes := (.Context).Value "edit-modes" }} + +{{ template "header" . }} + +<form method="POST" action="/save/{{$slug}}"> +<textarea name="title">{{($page).Title}}</textarea> +<span>last edited {{($page).Edited}}</span> +{{ if eq $editMode 0 }} + <textarea name="content">{{($page).Content}}</textarea> +{{ else }} + <div contenteditable>{{($page).Content}}</div> +{{ end }} +<input type="submit" value="Save"/> +</form> + +{{ template "footer" . }}