summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve <nilslice@gmail.com>2017-01-20 19:16:18 -0800
committerGitHub <noreply@github.com>2017-01-20 19:16:18 -0800
commit0cf0d36f7613bbb2e13c0c8406689de3be9ee8d5 (patch)
treefd657507abc89d80ef20a19a5f4d9881458ae7c8
parent51710940ef4d09e37d20397b5676c4d37dc182ad (diff)
parentb41ed1b96f5078344ab5b9e3b3586dd3963755d4 (diff)
Merge pull request #39 from ponzu-cms/ponzu-dev
[core] Consistent order of saved repeater items
-rw-r--r--system/admin/handlers.go45
-rw-r--r--system/api/external.go45
-rw-r--r--system/db/config.go101
3 files changed, 131 insertions, 60 deletions
diff --git a/system/admin/handlers.go b/system/admin/handlers.go
index 2bea356..3195239 100644
--- a/system/admin/handlers.go
+++ b/system/admin/handlers.go
@@ -1561,23 +1561,48 @@ func editHandler(res http.ResponseWriter, req *http.Request) {
// check for any multi-value fields (ex. checkbox fields)
// and correctly format for db storage. Essentially, we need
// fieldX.0: value1, fieldX.1: value2 => fieldX: []string{value1, value2}
- var discardKeys []string
+ fieldOrderValue := make(map[string]map[string][]string)
+ ordVal := make(map[string][]string)
for k, v := range req.PostForm {
if strings.Contains(k, ".") {
- key := strings.Split(k, ".")[0]
+ fo := strings.Split(k, ".")
- if req.PostForm.Get(key) == "" {
- req.PostForm.Set(key, v[0])
- } else {
- req.PostForm.Add(key, v[0])
- }
+ // put the order and the field value into map
+ field := string(fo[0])
+ order := string(fo[1])
+ fieldOrderValue[field] = ordVal
+
+ // orderValue is 0:[?type=Thing&id=1]
+ orderValue := fieldOrderValue[field]
+ orderValue[order] = v
+ fieldOrderValue[field] = orderValue
- discardKeys = append(discardKeys, k)
+ // discard the post form value with name.N
+ req.PostForm.Del(k)
}
+
}
- for _, discardKey := range discardKeys {
- req.PostForm.Del(discardKey)
+ // add/set the key & value to the post form in order
+ for f, ov := range fieldOrderValue {
+ for i := 0; i < len(ov); i++ {
+ position := fmt.Sprintf("%d", i)
+ fieldValue := ov[position]
+
+ if req.PostForm.Get(f) == "" {
+ for i, fv := range fieldValue {
+ if i == 0 {
+ req.PostForm.Set(f, fv)
+ } else {
+ req.PostForm.Add(f, fv)
+ }
+ }
+ } else {
+ for _, fv := range fieldValue {
+ req.PostForm.Add(f, fv)
+ }
+ }
+ }
}
pt := t
diff --git a/system/api/external.go b/system/api/external.go
index 5d4b302..5a74107 100644
--- a/system/api/external.go
+++ b/system/api/external.go
@@ -79,23 +79,48 @@ func externalContentHandler(res http.ResponseWriter, req *http.Request) {
// check for any multi-value fields (ex. checkbox fields)
// and correctly format for db storage. Essentially, we need
// fieldX.0: value1, fieldX.1: value2 => fieldX: []string{value1, value2}
- var discardKeys []string
+ fieldOrderValue := make(map[string]map[string][]string)
+ ordVal := make(map[string][]string)
for k, v := range req.PostForm {
if strings.Contains(k, ".") {
- key := strings.Split(k, ".")[0]
+ fo := strings.Split(k, ".")
- if req.PostForm.Get(key) == "" {
- req.PostForm.Set(key, v[0])
- } else {
- req.PostForm.Add(key, v[0])
- }
+ // put the order and the field value into map
+ field := string(fo[0])
+ order := string(fo[1])
+ fieldOrderValue[field] = ordVal
- discardKeys = append(discardKeys, k)
+ // orderValue is 0:[?type=Thing&id=1]
+ orderValue := fieldOrderValue[field]
+ orderValue[order] = v
+ fieldOrderValue[field] = orderValue
+
+ // discard the post form value with name.N
+ req.PostForm.Del(k)
}
+
}
- for _, discardKey := range discardKeys {
- req.PostForm.Del(discardKey)
+ // add/set the key & value to the post form in order
+ for f, ov := range fieldOrderValue {
+ for i := 0; i < len(ov); i++ {
+ position := fmt.Sprintf("%d", i)
+ fieldValue := ov[position]
+
+ if req.PostForm.Get(f) == "" {
+ for i, fv := range fieldValue {
+ if i == 0 {
+ req.PostForm.Set(f, fv)
+ } else {
+ req.PostForm.Add(f, fv)
+ }
+ }
+ } else {
+ for _, fv := range fieldValue {
+ req.PostForm.Add(f, fv)
+ }
+ }
+ }
}
// call Accept with the request, enabling developer to add or chack data
diff --git a/system/db/config.go b/system/db/config.go
index 5a93353..2706e97 100644
--- a/system/db/config.go
+++ b/system/db/config.go
@@ -22,53 +22,74 @@ func init() {
// SetConfig sets key:value pairs in the db for configuration settings
func SetConfig(data url.Values) error {
var j []byte
+ err := store.Update(func(tx *bolt.Tx) error {
+ b := tx.Bucket([]byte("__config"))
- // check for any multi-value fields (ex. checkbox fields)
- // and correctly format for db storage. Essentially, we need
- // fieldX.0: value1, fieldX.1: value2 => fieldX: []string{value1, value2}
- var discardKeys []string
- for k, v := range data {
- if strings.Contains(k, ".") {
- key := strings.Split(k, ".")[0]
-
- if data.Get(key) == "" {
- data.Set(key, v[0])
- } else {
- data.Add(key, v[0])
+ // check for any multi-value fields (ex. checkbox fields)
+ // and correctly format for db storage. Essentially, we need
+ // fieldX.0: value1, fieldX.1: value2 => fieldX: []string{value1, value2}
+ fieldOrderValue := make(map[string]map[string][]string)
+ ordVal := make(map[string][]string)
+ for k, v := range data {
+ if strings.Contains(k, ".") {
+ fo := strings.Split(k, ".")
+
+ // put the order and the field value into map
+ field := string(fo[0])
+ order := string(fo[1])
+ fieldOrderValue[field] = ordVal
+
+ // orderValue is 0:[?type=Thing&id=1]
+ orderValue := fieldOrderValue[field]
+ orderValue[order] = v
+ fieldOrderValue[field] = orderValue
+
+ // discard the post form value with name.N
+ data.Del(k)
}
- discardKeys = append(discardKeys, k)
}
- }
-
- for _, discardKey := range discardKeys {
- data.Del(discardKey)
- }
- cfg := &config.Config{}
- dec := schema.NewDecoder()
- dec.SetAliasTag("json") // allows simpler struct tagging when creating a content type
- dec.IgnoreUnknownKeys(true) // will skip over form values submitted, but not in struct
- err := dec.Decode(cfg, data)
- if err != nil {
- return err
- }
+ // add/set the key & value to the post form in order
+ for f, ov := range fieldOrderValue {
+ for i := 0; i < len(ov); i++ {
+ position := fmt.Sprintf("%d", i)
+ fieldValue := ov[position]
+
+ if data.Get(f) == "" {
+ for i, fv := range fieldValue {
+ if i == 0 {
+ data.Set(f, fv)
+ } else {
+ data.Add(f, fv)
+ }
+ }
+ } else {
+ for _, fv := range fieldValue {
+ data.Add(f, fv)
+ }
+ }
+ }
+ }
- // check for "invalidate" value to reset the Etag
- if len(cfg.CacheInvalidate) > 0 && cfg.CacheInvalidate[0] == "invalidate" {
- cfg.Etag = NewEtag()
- cfg.CacheInvalidate = []string{}
- }
+ cfg := &config.Config{}
+ dec := schema.NewDecoder()
+ dec.SetAliasTag("json") // allows simpler struct tagging when creating a content type
+ dec.IgnoreUnknownKeys(true) // will skip over form values submitted, but not in struct
+ err := dec.Decode(cfg, data)
+ if err != nil {
+ return err
+ }
- j, err = json.Marshal(cfg)
- if err != nil {
- return err
- }
+ // check for "invalidate" value to reset the Etag
+ if len(cfg.CacheInvalidate) > 0 && cfg.CacheInvalidate[0] == "invalidate" {
+ cfg.Etag = NewEtag()
+ cfg.CacheInvalidate = []string{}
+ }
- err = store.Update(func(tx *bolt.Tx) error {
- b := tx.Bucket([]byte("__config"))
- if b == nil {
- return bolt.ErrBucketNotFound
+ j, err = json.Marshal(cfg)
+ if err != nil {
+ return err
}
err = b.Put([]byte("settings"), j)
@@ -121,7 +142,7 @@ func ConfigAll() ([]byte, error) {
err := store.View(func(tx *bolt.Tx) error {
b := tx.Bucket([]byte("__config"))
if b == nil {
- return bolt.ErrBucketNotFound
+ return fmt.Errorf("Error finding bucket: %s", "__config")
}
_, err := val.Write(b.Get([]byte("settings")))
if err != nil {