all repos — nirvash @ 358d4fb2af62189b913432997462a71b61090eb4

modular CMS using the quartzgun library

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-----
commit

358d4fb2af62189b913432997462a71b61090eb4

parent

3f04afa16e7e6d2f76e114e1b5591f82ea904134

5 files changed, 54 insertions(+), 17 deletions(-)

jump to
M archetype/adapter.goarchetype/adapter.go

@@ -3,8 +3,8 @@

type EditMode int const ( - EditModeLiteralTextArea EditMode = iota - EditModeEscapedContentEditable + EditModeLiteralTextArea EditMode = iota + EditModeEscapedContentEditable ) type Adapter interface {
M archetype/eureka.goarchetype/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.golfo/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.gonirvash.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" . }}