diff --git a/categories/categories.go b/categories/categories.go index a963e82..0bfc989 100644 --- a/categories/categories.go +++ b/categories/categories.go @@ -15,11 +15,14 @@ type Category struct { Children []*Category } -var CategoriesTree []*Category -var CategoriesFlat map[int]*Category +var CategoriesTree []*Category = nil +var CategoriesFlat map[int]*Category = nil // Cavet: slight cheat. All parents must have Category_id < their children. func LoadCategories(db *sql.DB) { + if CategoriesFlat != nil { + return //already loaded + } CategoriesTree = []*Category{} CategoriesFlat = make(map[int]*Category) @@ -99,6 +102,14 @@ func Delete(db *sql.DB, id int) error { return err } +func GetListOfChildrenIds(id int) []int { + list := []int{id} + for _,category := range CategoriesFlat[id].Children { + list = append(list, GetListOfChildrenIds(category.Id)...) + } + return list +} + func (category *Category) ChangeParent(db *sql.DB, parent *Category) error { var err error if parent == nil { diff --git a/js/funcs.js b/js/funcs.js index 71444ef..915fd0b 100644 --- a/js/funcs.js +++ b/js/funcs.js @@ -21,8 +21,12 @@ $(document).ready( function () { $(".add-category-col").addClass("has-error"); } }); + + $("form.search .filter-category").change(function (e) { + e.target.parentElement.submit(); + }); - $(".category-change-parent").change(function (e) { + $("form.change-parent .category-change-parent").change(function (e) { e.target.parentElement.submit(); }); diff --git a/news/news.go b/news/news.go index e262e73..de15038 100644 --- a/news/news.go +++ b/news/news.go @@ -94,10 +94,14 @@ func Get(db *sql.DB, id int) (*News, error) { } // Load and return in NewsContainer format all the unexported news items -func LoadPage(db *sql.DB, offset, amount int) ([]*News, int, error) { +func LoadPage(db *sql.DB, offset, amount int, categoryFilter []int) ([]*News, int, error) { categories.LoadCategories(db) // required by addContainer - - rows, err := db.Query("SELECT " + SQL_NEWS_FIELDS + " FROM news ORDER BY timestamp DESC LIMIT $1 OFFSET $2", amount, offset) + + where := "" + if categoryFilter != nil { + where = "WHERE id in $3" + } + rows, err := db.Query("SELECT " + SQL_NEWS_FIELDS + " FROM news " + where + " ORDER BY timestamp DESC LIMIT $1 OFFSET $2", amount, offset, categoryFilter) if err != nil { fmt.Println("DB errpr reading LoadPage news: ", err) return nil, 0, err diff --git a/route_handlers.go b/route_handlers.go index 9ea0cbf..17fac36 100644 --- a/route_handlers.go +++ b/route_handlers.go @@ -405,6 +405,7 @@ func categoryDeleteHandler(w http.ResponseWriter, r *http.Request, user *user.Us func newsFormHandler(w http.ResponseWriter, r *http.Request, user *user.User, session *sessions.Session) { flashes := GetFlashes(session) session.Save(r, w) + categories.LoadCategories(db) var offset = 0 var amount = 100 @@ -412,8 +413,14 @@ func newsFormHandler(w http.ResponseWriter, r *http.Request, user *user.User, se if eOffset == nil { offset = amount * argOffset } + + categoryFilterId, cidErr := strconv.Atoi(r.FormValue("category")) + categoryFilter := []int{} + if cidErr == nil { + categories.GetListOfChildrenIds(categoryFilterId) + } - news, count, err := news.LoadPage(db, offset, amount) + news, count, err := news.LoadPage(db, offset, amount, categoryFilter) if err != nil { session.AddFlash("Error loading news", flash_err) } diff --git a/templates/layout.html b/templates/layout.html index 36b107c..227c008 100644 --- a/templates/layout.html +++ b/templates/layout.html @@ -80,3 +80,32 @@ {{end}} {{end}} + + + + + +{{define "select-category"}} + +{{end}} + +{{define "option-category"}} + + {{range $child := .category.Children}} + {{template "option-category" dict "category" $child "id" $.id}} + {{end}} +{{end}} \ No newline at end of file diff --git a/templates/pages/categories.html b/templates/pages/categories.html index 6397d0d..9e17b44 100644 --- a/templates/pages/categories.html +++ b/templates/pages/categories.html @@ -6,12 +6,12 @@ {{end}}