From 9ca8deed232d9285fdf1f9a4531bfff2f12e9dd5 Mon Sep 17 00:00:00 2001 From: Dan Ballard Date: Fri, 8 May 2015 00:07:30 -0700 Subject: [PATCH] load tags into tree, display them as tree with depth 2, ordered --- tags/tags.go | 42 ++++++++++++++++++---------------------- templates/pages/add.html | 5 ++++- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/tags/tags.go b/tags/tags.go index 73c9dee..17b6abe 100644 --- a/tags/tags.go +++ b/tags/tags.go @@ -4,47 +4,43 @@ import ( "database/sql" _ "github.com/lib/pq" "fmt" - "strings" - "strconv" ) type Tag struct { + Id int Name string Parent sql.NullInt64 - Children []int + Children []*Tag } -var Tags map[int]*Tag +var Tags []*Tag func LoadTags(db *sql.DB) { - Tags = make(map[int]*Tag) - rows, err := db.Query("select tags.tag_id, tags.name, tags.parent_id, array_agg(distinct(parent_of.tag_id)) as children from tags left join tags as parent_of on parent_of.parent_id=tags.tag_id group by tags.tag_id") + Tags = []*Tag{} + //rows, err := db.Query("select tags.tag_id, tags.name, tags.parent_id, array_agg(distinct(parent_of.tag_id)) as children from tags left join tags as parent_of on parent_of.parent_id=tags.tag_id group by tags.tag_id") + rows, err := db.Query("select tags.tag_id, tags.name, tags.parent_id from tags order by tag_id,tags.parent_id desc") if err != nil { fmt.Println("DB Error loading tags:", err) return } - + + var flatMap map[int]*Tag = make(map[int]*Tag) + for rows.Next() { - tag := &Tag{Children: nil} + tag := &Tag{Children: []*Tag{}} - var children sql.NullString - var tag_id int - err = rows.Scan(&tag_id, &tag.Name, &tag.Parent, &children) + err = rows.Scan(&tag.Id, &tag.Name, &tag.Parent) if err != nil { fmt.Println("tags DB Error: ", err) } - if children.Valid { - var childrenStr = children.String[1 : len(children.String)-1] - if childrenStr != "NULL" { - pids := strings.Split(childrenStr, ",") - for _, spid := range pids { - pid, _ := strconv.Atoi(spid) - tag.Children = append(tag.Children, pid) - } - } - } - - Tags[tag_id] = tag + flatMap[tag.Id] = tag + + if tag.Parent.Valid { + pid := int(tag.Parent.Int64) + flatMap[pid].Children = append(flatMap[pid].Children, tag) + } else { + Tags = append(Tags, tag) + } } } \ No newline at end of file diff --git a/templates/pages/add.html b/templates/pages/add.html index 5b5c915..8f563ba 100644 --- a/templates/pages/add.html +++ b/templates/pages/add.html @@ -21,5 +21,8 @@ {{define "option-tag"}} - + + {{range $child := .Children}} + {{template "option-tag" $child}} + {{end}} {{end}} \ No newline at end of file