summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Manuel <nilslice@gmail.com>2016-10-02 01:46:05 -0700
committerSteve Manuel <nilslice@gmail.com>2016-10-02 01:46:05 -0700
commit37d3f13e071cfdb5e063c67dec604c10dbc6ddde (patch)
treec9f2d885dd1c1c38ef6f9c07b24c58a4ff73d6a2
parent0ae265fd9c8496e107b8794bcf583885b20dd37c (diff)
refactor editor view buffer to include the Item default fields.. may wantto reconsider this later as the two packages are now very closely tied. also added UI structural changes
-rw-r--r--management/editor/editor.go42
-rw-r--r--management/editor/elements.go81
-rw-r--r--management/manager/manager.go8
3 files changed, 75 insertions, 56 deletions
diff --git a/management/editor/editor.go b/management/editor/editor.go
index f49c4e3..c0f2e49 100644
--- a/management/editor/editor.go
+++ b/management/editor/editor.go
@@ -2,7 +2,9 @@
// structs so that admins can manage content
package editor
-import "bytes"
+import (
+ "bytes"
+)
// Editable ensures data is editable
type Editable interface {
@@ -31,14 +33,52 @@ func Form(post Editable, fields ...Field) ([]byte, error) {
editor := post.Editor()
editor.ViewBuf = &bytes.Buffer{}
+ editor.ViewBuf.Write([]byte(`<table><tbody class="row"><tr class="col s8"><td>`))
for _, f := range fields {
addFieldToEditorView(editor, f)
}
+ editor.ViewBuf.Write([]byte(`</td></tr>`))
+
+ // content items with Item embedded have some default fields we need to render
+ editor.ViewBuf.Write([]byte(`<tr class="col s4"><td>`))
+ addPostDefaultFieldsToEditorView(post, editor)
+
+ submit := `
+<div class="input-field">
+ <input class="right waves-effect waves-light btn green" type="submit" value="Save"/>
+</div>
+`
+ editor.ViewBuf.Write([]byte(submit + `</td></tr></tbody></table>`))
+
return editor.ViewBuf.Bytes(), nil
}
func addFieldToEditorView(e *Editor, f Field) {
e.ViewBuf.Write(f.View)
}
+
+func addPostDefaultFieldsToEditorView(p Editable, e *Editor) {
+ defaults := []Field{
+ Field{
+ View: Input("Timestamp", p, map[string]string{
+ "label": "Publish Date",
+ "type": "date",
+ }),
+ },
+ Field{
+ View: Input("Slug", p, map[string]string{
+ "label": "URL Slug",
+ "type": "text",
+ "disabled": "true",
+ "placeholder": "Will be set automatically",
+ }),
+ },
+ }
+
+ for _, f := range defaults {
+ addFieldToEditorView(e, f)
+ }
+
+}
diff --git a/management/editor/elements.go b/management/editor/elements.go
index 4ea0be0..dd71aa1 100644
--- a/management/editor/elements.go
+++ b/management/editor/elements.go
@@ -4,6 +4,7 @@ import (
"bytes"
"fmt"
"reflect"
+ "strings"
)
type element struct {
@@ -48,6 +49,7 @@ func Select(fieldName string, p interface{}, attrs, options map[string]string) [
// may need to alloc a buffer, as we will probably loop through options
// and append the []byte from domElement() called for each option
+ attrs["class"] = "browser-default"
sel := newElement("select", attrs["label"], fieldName, p, attrs)
var opts []*element
@@ -69,29 +71,22 @@ func Select(fieldName string, p interface{}, attrs, options map[string]string) [
opts = append(opts, cta, reset)
- var val string
for k, v := range options {
+ optAttrs := map[string]string{"value": k}
if k == fieldVal {
- val = "true"
- } else {
- val = "false"
+ optAttrs["selected"] = "true"
}
opt := &element{
TagName: "option",
- Attrs: map[string]string{"value": k, "selected": val},
+ Attrs: optAttrs,
data: v,
viewBuf: &bytes.Buffer{},
}
- // if val is false (unselected option), delete the attr for clarity
- if val == "false" {
- delete(opt.Attrs, "selected")
- }
-
opts = append(opts, opt)
}
- return domElementWithChildren(sel, opts)
+ return domElementWithChildrenSelect(sel, opts)
}
// Checkbox returns the []byte of a set of <input type="checkbox"> HTML elements
@@ -100,15 +95,9 @@ func Select(fieldName string, p interface{}, attrs, options map[string]string) [
// 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 Checkbox(fieldName string, p interface{}, attrs, options map[string]string) []byte {
- // options are the value attr and the display value, i.e.
- /*
- <label>
- {map value}
- <input type="checkbox" name="{fieldName}" value="{map key}"/>
- </label>
- */
-
+ attrs["class"] = "input-field col s12"
div := newElement("div", attrs["label"], "", p, attrs)
+
var opts []*element
// get the pre-checked options if this is already an existing post
@@ -120,12 +109,13 @@ func Checkbox(fieldName string, p interface{}, attrs, options map[string]string)
inputAttrs := map[string]string{
"type": "checkbox",
"value": k,
+ "id": strings.Join(strings.Split(v, " "), "-"),
}
// check if k is in the pre-checked values and set to checked
for _, x := range checked {
if k == x {
- inputAttrs["checked"] = "true"
+ inputAttrs["checked"] = "checked"
}
}
@@ -150,8 +140,9 @@ func Checkbox(fieldName string, p interface{}, attrs, options map[string]string)
// domElementSelfClose is a special DOM element which is parsed as a
// self-closing tag and thus needs to be created differently
func domElementSelfClose(e *element) []byte {
+ e.viewBuf.Write([]byte(`<div class="input-field col s12">`))
if e.label != "" {
- e.viewBuf.Write([]byte(`<label>` + e.label))
+ e.viewBuf.Write([]byte(`<label class="active" for="` + strings.Join(strings.Split(e.label, " "), "-") + `">` + e.label + `</label>`))
}
e.viewBuf.Write([]byte(`<` + e.TagName + ` value="`))
e.viewBuf.Write([]byte(e.data + `" `))
@@ -162,19 +153,14 @@ func domElementSelfClose(e *element) []byte {
e.viewBuf.Write([]byte(` name="` + e.Name + `"`))
e.viewBuf.Write([]byte(` />`))
- if e.label != "" {
- e.viewBuf.Write([]byte(`</label>`))
- }
-
+ e.viewBuf.Write([]byte(`</div>`))
return e.viewBuf.Bytes()
}
// domElementCheckbox is a special DOM element which is parsed as a
// checkbox input tag and thus needs to be created differently
func domElementCheckbox(e *element) []byte {
- if e.label != "" {
- e.viewBuf.Write([]byte(`<label>`))
- }
+ e.viewBuf.Write([]byte(`<p class="col s6">`))
e.viewBuf.Write([]byte(`<` + e.TagName + ` `))
for attr, value := range e.Attrs {
@@ -182,18 +168,19 @@ func domElementCheckbox(e *element) []byte {
}
e.viewBuf.Write([]byte(` name="` + e.Name + `"`))
e.viewBuf.Write([]byte(` /> `))
-
if e.label != "" {
- e.viewBuf.Write([]byte(e.label + `</label>`))
+ e.viewBuf.Write([]byte(`<label for="` + strings.Join(strings.Split(e.label, " "), "-") + `">` + e.label + `</label>`))
}
-
+ e.viewBuf.Write([]byte(`</p>`))
return e.viewBuf.Bytes()
}
// domElement creates a DOM element
func domElement(e *element) []byte {
+ e.viewBuf.Write([]byte(`<div class="input-field col s12">`))
+
if e.label != "" {
- e.viewBuf.Write([]byte(`<label>` + e.label))
+ e.viewBuf.Write([]byte(`<label class="active" for="` + strings.Join(strings.Split(e.label, " "), "-") + `">` + e.label + `</label>`))
}
e.viewBuf.Write([]byte(`<` + e.TagName + ` `))
@@ -206,17 +193,13 @@ func domElement(e *element) []byte {
e.viewBuf.Write([]byte(e.data))
e.viewBuf.Write([]byte(`</` + e.TagName + `>`))
- if e.label != "" {
- e.viewBuf.Write([]byte(`</label>`))
- }
-
+ e.viewBuf.Write([]byte(`</div>`))
return e.viewBuf.Bytes()
}
-func domElementWithChildren(e *element, children []*element) []byte {
- if e.label != "" {
- e.viewBuf.Write([]byte(`<label>` + e.label))
- }
+func domElementWithChildrenSelect(e *element, children []*element) []byte {
+ e.viewBuf.Write([]byte(`<div class="input-field col s6">`))
+
e.viewBuf.Write([]byte(`<` + e.TagName + ` `))
for attr, value := range e.Attrs {
@@ -233,34 +216,32 @@ func domElementWithChildren(e *element, children []*element) []byte {
e.viewBuf.Write([]byte(`</` + e.TagName + `>`))
if e.label != "" {
- e.viewBuf.Write([]byte(`</label>`))
+ e.viewBuf.Write([]byte(`<label class="active">` + e.label + `</label>`))
}
+ e.viewBuf.Write([]byte(`</div>`))
return e.viewBuf.Bytes()
}
func domElementWithChildrenCheckbox(e *element, children []*element) []byte {
- if e.label != "" {
- e.viewBuf.Write([]byte(`<label>` + e.label))
- }
e.viewBuf.Write([]byte(`<` + e.TagName + ` `))
for attr, value := range e.Attrs {
e.viewBuf.Write([]byte(attr + `="` + value + `" `))
}
- e.viewBuf.Write([]byte(` name="` + e.Name + `"`))
+
e.viewBuf.Write([]byte(` >`))
+ if e.label != "" {
+ e.viewBuf.Write([]byte(`<label class="active">` + e.label + `</label>`))
+ }
+
// loop over children and create domElement for each child
for _, child := range children {
e.viewBuf.Write(domElementCheckbox(child))
}
- e.viewBuf.Write([]byte(`</` + e.TagName + `>`))
-
- if e.label != "" {
- e.viewBuf.Write([]byte(`</label>`))
- }
+ e.viewBuf.Write([]byte(`</` + e.TagName + `><div class="clear padding">&nbsp;</div>`))
return e.viewBuf.Bytes()
}
diff --git a/management/manager/manager.go b/management/manager/manager.go
index 690a0a5..75092c0 100644
--- a/management/manager/manager.go
+++ b/management/manager/manager.go
@@ -9,14 +9,12 @@ import (
)
const managerHTML = `
-<a href="/admin/edit?type={{.Kind}}" class="button">New {{.Kind}}</a>
-<div class="editor">
+<div class="card editor">
<form method="post" action="/admin/edit">
- {{ .Editor }}
<input type="hidden" name="id" value="{{.ID}}"/>
<input type="hidden" name="type" value="{{.Kind}}"/>
- <input type="submit" value="Save"/>
- </form>
+ {{ .Editor }}
+ </form>
</div>
`