From d62f31d1932125db59c4cf813c54d95a4a0200ee Mon Sep 17 00:00:00 2001 From: Steve Manuel Date: Fri, 16 Sep 2016 20:24:11 -0700 Subject: added basic rendering of editor view for `Editable` data --- editor/editor.go | 41 +++++++++++++++++++ editor/element.go | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ post.go | 93 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 249 insertions(+) create mode 100644 editor/editor.go create mode 100644 editor/element.go create mode 100644 post.go diff --git a/editor/editor.go b/editor/editor.go new file mode 100644 index 0000000..11dc064 --- /dev/null +++ b/editor/editor.go @@ -0,0 +1,41 @@ +// Package editor enables users to create edit views from their content +// structs so that admins can manage content +package editor + +import "bytes" + +// Editable ensures data is editable +type Editable interface { + Editor() *Editor + NewViewBuffer() + Render() []byte +} + +// Editor is a view containing fields to manage content +type Editor struct { + ViewBuf *bytes.Buffer +} + +// Field is used to create the editable view for a field +// within a particular content struct +type Field struct { + View []byte +} + +// New takes editable content and any number of Field funcs to describe the edit +// page for any content struct added by a user +func New(post Editable, fields ...Field) ([]byte, error) { + post.NewViewBuffer() + + editor := post.Editor() + + for _, f := range fields { + addFieldToEditorView(editor, f) + } + + return post.Render(), nil +} + +func addFieldToEditorView(e *Editor, f Field) { + e.ViewBuf.Write(f.View) +} diff --git a/editor/element.go b/editor/element.go new file mode 100644 index 0000000..519ce5d --- /dev/null +++ b/editor/element.go @@ -0,0 +1,115 @@ +package editor + +import ( + "bytes" + "reflect" +) + +// Input returns the []byte of an HTML element with a label. +// IMPORTANT: +// The `fieldName` argument will cause a panic if it is not exactly the string +// form of the struct field that this editor input is representing +func Input(fieldName string, p interface{}, attrs map[string]string) []byte { + var wrapInLabel = true + label, found := attrs["label"] + if !found { + wrapInLabel = false + label = "" + } + + e := newElement("input", label, fieldName, p, attrs) + + return domElementSelfClose(e, wrapInLabel) +} + +// Textarea returns the []byte of a