// Controller to present path editor form func PathEditorForm(w *wrapper.Wrapper) { pathid := w.APIParams[0] f := form.NewForm() f.AddText("title", "text").AddLabel("Title").Required() f.AddText("path", "text").AddLabel("Path").Required() f.AddText("template", "text").AddLabel("Template").Required() f.AddCheckBox("wildcard").AddLabel("Wildcard") ops := []map[string]string{ map[string]string{"name": "published", "value": "published"}, map[string]string{"name": "unpublished", "value": "unpublished"}, } f.AddRadio("status", ops).AddLabel("Status").Required() f.AddText("id", "text").Hidden() var p paths.Path var err error if pathid != "new" { p, err = paths.LoadPath(pathid, w) if err != nil { errmessage := fmt.Sprintf("Could not retrieve path %s by %s: %s", w.APIParams[0], w.Request.Host, err.Error()) w.SiteConfig.Logger.Error(errmessage) services.AddMessage("Error retrieving path information.", "Error", w) w.Serve() return } } else { p = paths.NewPath() } f.FormData = p f.Register(w) w.SetTemplate("admin/form.html") w.SetPayload("form", f) w.Serve() return }
// Controller for path sort form. func SortPathForm(w *wrapper.Wrapper) { var parentid string if len(w.APIParams) > 0 { parentid = w.APIParams[0] } else { http.Error(w.Writer, "Forbidden", 403) w.Serve() return } p, err := paths.LoadPath(parentid, w) if err != nil { errmessage := fmt.Sprintf("Path not found to sort for %s by %s.", parentid, w.Request.Host) w.SiteConfig.Logger.Error(errmessage) services.AddMessage("This element was not found", "Error", w) w.Serve() return } else { if len(p.Elements) > 0 { w.SetPayload("elements", p.Elements) } else { services.AddMessage("This has no elements assigned yet.", "Error", w) } w.SetTemplate("admin/element_sorter.html") w.Serve() return } }
// Controller for content editing form. func ContentEditorForm(w *wrapper.Wrapper) { elementid := w.APIParams[0] e, err := elements.LoadContentElement(elementid, w) if err != nil { errmessage := fmt.Sprintf("Element not found to edit for %s by %s", elementid, w.Request.Host) w.SiteConfig.Logger.Error(errmessage) services.AddMessage("This element was not found", "Error", w) w.Serve() return } if e.ContentValues.Type == "" { errmessage := fmt.Sprintf("No content type set for %s", elementid, w.Request.Host) w.SiteConfig.Logger.Error(errmessage) services.AddMessage("This element doesn't have a content type set. Set a content type to edit values.", "Error", w) w.Serve() return } var ct contenttypes.ContentType ct, err = contenttypes.LoadContentTypeT(e.ContentValues.Type, w) if err != nil { errmessage := fmt.Sprintf("Unable to find content type %s : %s", e.ContentValues.Type, err.Error()) w.SiteConfig.Logger.Error(errmessage) services.AddMessage("Unable to find content type.", "Error", w) w.Serve() return } f := form.NewForm() f.Fields = ct.Form f.FormData = e.ContentValues.Content f.Register(w) w.SetTemplate("admin/form.html") w.SetPayload("form", f) w.Serve() return }
func SlugUrlEditorForm(w *wrapper.Wrapper) { slugid := w.APIParams[0] e, err := elements.LoadSlugElement(slugid, w) if err != nil { errmessage := fmt.Sprintf("Element not found to edit for %s by %s", slugid, w.Request.Host) w.SiteConfig.Logger.Error(errmessage) services.AddMessage("Unable to load slug parent", "Error", w) w.Serve() return } f := form.NewForm() data := make(map[string]string) for slug, id := range e.Slugs { data[id] = slug e := elements.NewElement() err = elements.GetById(id, &e, w) if err != nil { errmessage := fmt.Sprintf("Content not found %s : %s", id, err.Error()) w.SiteConfig.Logger.Error(errmessage) services.AddMessage("There was a problem loading some slug elements.", "Error", w) w.Serve() return } f.AddText(id, "text").AddLabel(e.Title).Required() } f.FormData = data f.Register(w) w.SetTemplate("admin/form.html") w.SetPayload("form", f) w.Serve() return }
func EditContentTypeForm(w *wrapper.Wrapper) { f := form.NewForm() ct := new(ContentType) if w.APIParams[0] != "new" { c := w.DbSession.DB("").C("content_types") i := bson.M{"_id": bson.ObjectIdHex(w.APIParams[0])} err := c.Find(i).One(ct) if err != nil { errmessage := fmt.Sprintf("Content Type not found %s : %s", w.APIParams[0], err.Error()) w.SiteConfig.Logger.Error(errmessage) services.AddMessage("Your content types was not found ", "Error", w) w.Serve() return } var elements []map[string]interface{} for _, field := range ct.Form { element := make(map[string]interface{}) element["type"] = field.Type element["key"] = field.Key element["label"] = field.TemplateOptions.Label element["placeholder"] = field.TemplateOptions.Placeholder element["rows"] = field.TemplateOptions.Rows element["cols"] = field.TemplateOptions.Cols element["options"] = "" for _, opt := range field.TemplateOptions.Options { element["options"] = fmt.Sprintf("%s%s|%s\n", element["options"], opt["name"], opt["value"]) } elements = append(elements, element) } data := make(map[string]interface{}) data["elements"] = elements data["content_type"] = ct.Type f.FormData = data } else { data := make(map[string]interface{}) fd := make([]map[string]string, 0) data["elements"] = fd data["content_type"] = "" f.FormData = data } f.AddText("content_type", "text").AddLabel("Content Type Name") f.AddRepeatSection("elements", "Add another field", FieldFormGroup()) f.Register(w) w.SetPayload("form", f) w.SetTemplate("admin/form.html") w.Serve() return }
// The controller function to retrieve elements ids from the path func PathValues(w *wrapper.Wrapper) { // Request is never url based so we can Never cache this request. // TODO: move no caching into a reusable function. w.Writer.Header().Add("Cache-Control", "no-cache, no-store, must-revalidate") w.Writer.Header().Add("Pragma", "no-cache") w.Writer.Header().Add("Expires", "0") p := paths.NewPath() u := w.Request.Header.Get("CurrentPath") if u == "" { http.Error(w.Writer, "Forbidden", 403) w.Serve() return } qp, err := p.PathMatch(u, "published", w) if err != nil { if err.Error() == "not found" { if "/"+w.SiteConfig.FourOFour != u { services.Redirect("/"+w.SiteConfig.FourOFour, w) w.Serve() return } else { services.AddMessage("There was a problem with the system.", "Error", w) w.Serve() return } } } var v []elements.Element for _, eid := range p.Elements { e := elements.NewElement() err = elements.GetById(eid, &e, w) if err != nil { errmessage := fmt.Sprintf("Content not found %s : %s", eid, err.Error()) w.SiteConfig.Logger.Error(errmessage) } else { v = append(v, e) } } w.SetPayload("mongolar_slug", qp) w.SetContent(v) w.SetTemplate(p.Template) w.Serve() return }
// Controller to ddisplay form to change content type for conteent element func ContentTypeEditorForm(w *wrapper.Wrapper) { elementid := w.APIParams[0] e, err := elements.LoadContentElement(elementid, w) if err != nil { errmessage := fmt.Sprintf("Element not found to edit for %s by %s", elementid, w.Request.Host) w.SiteConfig.Logger.Error(errmessage) services.AddMessage("This element was not found", "Error", w) w.Serve() return } cts := make([]contenttypes.ContentType, 0) cts, err = contenttypes.AllContentTypes(w) if err != nil { errmessage := fmt.Sprintf("Unable to query all Content Types: %s", err.Error()) w.SiteConfig.Logger.Error(errmessage) services.AddMessage("Unable to retrieve content types.", "Error", w) w.Serve() return } opts := make([]map[string]string, 0) for _, ct := range cts { opt := map[string]string{ "name": ct.Type, "value": ct.Type, } opts = append(opts, opt) } f := form.NewForm() f.AddSelect("type", opts) data := map[string]string{"type": e.ContentValues.Type} f.FormData = data f.Register(w) w.SetTemplate("admin/form.html") w.SetPayload("form", f) w.Serve() return }
// Controller for adding existing element form. func AddExistingChildForm(w *wrapper.Wrapper) { elems, err := elements.ElementList(w) if err != nil { errmessage := fmt.Sprintf("Unable to retrieve a list of all elements: %s", err.Error()) w.SiteConfig.Logger.Error(errmessage) services.AddMessage("There was a problem retrieving the element list.", "Error", w) w.Serve() return } options := make([]map[string]string, 0) for _, element := range elems { option := map[string]string{"name": element.Title, "value": element.MongoId.Hex(), "group": element.Controller} options = append(options, option) } f := form.NewForm() f.AddSelect("element", options).AddLabel("Element").Required() f.Register(w) w.SetTemplate("admin/form.html") w.SetPayload("form", f) w.Serve() return }
// Controller to edit an elements properties // TODO: break this into smaller functions to make it easier to maintain func ElementEditor(w *wrapper.Wrapper) { var elementid string if len(w.APIParams) > 0 { elementid = w.APIParams[0] } else { http.Error(w.Writer, "Forbidden", 403) } if w.Request.Method != "POST" { f := form.NewForm() f.AddText("title", "text").AddLabel("Title") op := make([]map[string]string, 0) for _, ec := range w.SiteConfig.ElementControllers { uc := []rune(ec) uc[0] = unicode.ToUpper(uc[0]) name := string(uc) op = append(op, map[string]string{"name": name, "value": ec}) } f.AddSelect("controller", op).AddLabel("Controller") f.AddText("template", "text").AddLabel("Template") f.AddText("dyn", "text").AddLabel("Dynamic Id") f.AddText("classes", "text").AddLabel("Classes") f.AddText("id", "text").Hidden() if elementid != "new" { e := elements.NewElement() err := elements.GetById(elementid, &e, w) if err != nil { errmessage := fmt.Sprintf("Element not found to edit for %s by %s", elementid, w.Request.Host, err.Error()) w.SiteConfig.Logger.Error(errmessage) services.AddMessage("This element was not found", "Error", w) w.Serve() return } // Have to do this for namespacing stuff on the AngularJs side. data := map[string]string{ "controller": e.Controller, "template": e.Template, "dyn": e.DynamicId, "classes": e.Classes, "id": e.MongoId.Hex(), "title": e.Title, } f.FormData = data } f.Register(w) w.SetTemplate("admin/form.html") w.SetPayload("form", f) } else { post := make(map[string]string) err := form.GetValidFormData(w, &post) if err != nil { return } else { c := w.DbSession.DB("").C("elements") if post["mongolarid"] == "new" { p := elements.Element{ Controller: post["controller"], DynamicId: post["dyn"], Template: post["template"], Title: post["title"], Classes: post["classes"], } err := c.Insert(p) if err != nil { errmessage := fmt.Sprintf("Unable to save new element by %s : %s", w.Request.Host, err.Error()) w.SiteConfig.Logger.Error(errmessage) services.AddMessage("There was a problem saving your element.", "Error", w) } else { services.AddMessage("Your element was saved.", "Success", w) } } else { p := bson.M{ "$set": bson.M{ "template": post["template"], "title": post["title"], "dynamic_id": post["dyn"], "controller": post["controller"], "classes": post["classes"], }, } s := bson.M{"_id": bson.ObjectIdHex(post["mongolarid"])} err := c.Update(s, p) if err != nil { errmessage := fmt.Sprintf("Unable to save element %s by %s : %s", post["mongolarid"], w.Request.Host, err.Error()) w.SiteConfig.Logger.Error(errmessage) services.AddMessage("There was a problem saving your element.", "Error", w) } else { services.AddMessage("Your element was saved.", "Success", w) dynamic := services.Dynamic{ Target: post["mongolarid"], Id: post["mongolarid"], Controller: "admin/element", Template: "admin/element.html", } services.SetDynamic(dynamic, w) } } } } w.Serve() return }
// Controller to retrive a list of all orphaned elements. func OrphanElements(w *wrapper.Wrapper) { assigned := make([]bson.ObjectId, 0) paths, err := paths.PathList(w) if err != nil { errmessage := fmt.Sprintf("Could not retrieve path elements for orphan list: %s", err.Error()) w.SiteConfig.Logger.Error(errmessage) services.AddMessage("Could not retrieve path elements.", "Error", w) w.Serve() } for _, path := range paths { for _, element := range path.Elements { id := bson.ObjectIdHex(element) assigned = append(assigned, id) } } wrappers := make([]elements.WrapperElement, 0) c := w.DbSession.DB("").C("elements") s := bson.M{"controller": "wrapper"} i := c.Find(s).Limit(50).Iter() err = i.All(&wrappers) if err != nil { errmessage := fmt.Sprintf("Could not retrieve wrapper elements for orphan list: %s", err.Error()) w.SiteConfig.Logger.Error(errmessage) services.AddMessage("Could not retrieve wrapper elements.", "Error", w) w.Serve() } for _, wrapper := range wrappers { for _, eid := range wrapper.Elements { bsonid := bson.ObjectIdHex(eid) assigned = append(assigned, bsonid) } } slugs := make([]elements.SlugElement, 0) s = bson.M{"controller": "slug"} i = c.Find(s).Limit(50).Iter() err = i.All(&slugs) if err != nil { errmessage := fmt.Sprintf("Could not retrieve slug elements for orphan list: %s", err.Error()) w.SiteConfig.Logger.Error(errmessage) services.AddMessage("Could not retrieve slug elements.", "Error", w) w.Serve() } for _, slug := range slugs { for _, eid := range slug.Slugs { bsonid := bson.ObjectIdHex(eid) assigned = append(assigned, bsonid) } } unassigned := new([]elements.Element) s = bson.M{"_id": bson.M{"$nin": assigned}} i = c.Find(s).Limit(50).Iter() err = i.All(unassigned) if err != nil { errmessage := fmt.Sprintf("Could not retrieve unassigned elements: %s", err.Error()) w.SiteConfig.Logger.Error(errmessage) services.AddMessage("Could not retrieve unassigned elements.", "Error", w) w.Serve() } w.SetTemplate("admin/orphan_path_elements.html") w.SetPayload("elements", unassigned) w.Serve() return }
// Controller to edit a menu element // TODO: break this into smaller functions func MenuEditor(w *wrapper.Wrapper) { if len(w.APIParams) == 0 { http.Error(w.Writer, "Forbidden", 403) return } menuid := w.APIParams[0] if w.Request.Method != "POST" { e, err := elements.LoadMenuElement(menuid, w) if err != nil { errmessage := fmt.Sprintf("Element not found to edit for %s by %s.", menuid, w.Request.Host) w.SiteConfig.Logger.Error(errmessage) services.AddMessage("This element was not found", "Error", w) w.Serve() return } if e.MenuItems == nil { items := make(map[string][]map[string]string) items["menu_items"] = make([]map[string]string, 0) w.SetPayload("menu", items) } else { w.SetPayload("menu", e) } w.SetPayload("title", e.Title) w.SetTemplate("admin/menu_editor.html") w.Serve() return } else { e, err := elements.LoadMenuElement(menuid, w) if err != nil { errmessage := fmt.Sprintf("Element not found to edit for %s by %s.", menuid, w.Request.Host) w.SiteConfig.Logger.Error(errmessage) services.AddMessage("This element was not found", "Error", w) w.Serve() return } err = json.NewDecoder(w.Request.Body).Decode(&e) if err != nil { errmessage := fmt.Sprintf("Unable to update marshall menu elements by %s: %s", w.Request.Host, err.Error()) w.SiteConfig.Logger.Error(errmessage) services.AddMessage("Unable to save menu element.", "Error", w) w.Serve() return } err = e.Save(w) if err != nil { errmessage := fmt.Sprintf("Unable to update menu element %s by %s: %s", menuid, w.Request.Host, err.Error()) w.SiteConfig.Logger.Error(errmessage) services.AddMessage("Unable to save menu element.", "Error", w) w.Serve() return } dynamic := services.Dynamic{ Target: "modaleditor", Controller: "", Template: "", Id: "", } services.SetDynamic(dynamic, w) services.AddMessage("You menu element have been updated.", "Success", w) w.Serve() } }