From 7679b4509296c98c6cba447e3950e08d10fa4903 Mon Sep 17 00:00:00 2001 From: Dan Ballard Date: Sat, 16 May 2015 12:48:42 -0700 Subject: [PATCH] usabilit changes --- js/funcs.js | 6 +++ news/news.go | 12 +++--- route_handlers.go | 39 ++++++++++++++----- .../{html_template.html => html_template.txt} | 0 templates/pages/add.html | 3 +- templates/pages/added.html | 5 +++ templates/pages/list.html | 6 ++- user/user.go | 2 +- 8 files changed, 55 insertions(+), 18 deletions(-) rename templates/{html_template.html => html_template.txt} (100%) create mode 100644 templates/pages/added.html diff --git a/js/funcs.js b/js/funcs.js index ee053c1..3717a40 100644 --- a/js/funcs.js +++ b/js/funcs.js @@ -8,4 +8,10 @@ $(document).ready( function () { window.location = "/export"; }, }); + + if( $('.addedLink').length > 0) { + setTimeout(function (){ + window.close(); + }, 500); + } }); diff --git a/news/news.go b/news/news.go index f411fe1..2457a6e 100644 --- a/news/news.go +++ b/news/news.go @@ -57,17 +57,18 @@ func addContainer(category_id int, flat, tree map[int]*NewsContainer) { } } -func Unexported(db *sql.DB) (map[int]*NewsContainer, error) { +// returns a tree of news items, the total count, and error +func Unexported(db *sql.DB) (map[int]*NewsContainer, int, error) { categories.LoadCategories(db) rows, err := db.Query("SELECT url, title, category_id, timestamp, notes FROM news WHERE exported is null order by category_id ASC") if err != nil { fmt.Println("DB errpr reading unexported news: ", err) - return nil, err + return nil, 0, err } newsTree := map[int]*NewsContainer{} newsFlat := map[int]*NewsContainer{} - + count := 0 for rows.Next() { news := News{} var url, title, notes sql.NullString @@ -75,7 +76,7 @@ func Unexported(db *sql.DB) (map[int]*NewsContainer, error) { err := rows.Scan(&url, &title, &category_id, &news.Date, ¬es) if err != nil { fmt.Println("Error reading news from DB: " + err.Error()) - return nil, err + return nil, 0, err } news.Url = nullStringToString(&url) @@ -98,9 +99,10 @@ func Unexported(db *sql.DB) (map[int]*NewsContainer, error) { } container := newsFlat[cid] container.News = append(container.News, news) + count++ } - return newsTree, nil + return newsTree, count, nil } func (this *NewsContainer) HeaderDepth(start int) int { diff --git a/route_handlers.go b/route_handlers.go index 4f1178c..ac85b49 100644 --- a/route_handlers.go +++ b/route_handlers.go @@ -14,7 +14,8 @@ import ( "github.com/dballard/transmet/categories" "github.com/dballard/transmet/news" "bytes" - "html/template" + txtTemplate "text/template" + "net/url" ) func GetFlashes(session *sessions.Session) map[string]interface{} { @@ -139,18 +140,20 @@ func addFormHandler(w http.ResponseWriter, r *http.Request, user *user.User) { session, _ := store.Get(r, "c_user") flashes := GetFlashes(session) + popup := session.Values["popup"] + delete(session.Values, "popup") title := session.Values["title"] delete(session.Values, "title") link := session.Values["link"] delete(session.Values, "link") description := session.Values["description"] - delete(session.Values, "description") + delete(session.Values, "description") session.Save(r, w) if link != nil { fmt.Println("link: '" + link.(string) + "'") //TODO category_id - ShowTemplate("add", w, map[string]interface{}{"user": user, "flashes": flashes, "categories": categories.CategoriesTree, "link": link, "title": title, "description": description}) + ShowTemplate("add", w, map[string]interface{}{"user": user, "flashes": flashes, "categories": categories.CategoriesTree, "link": link, "title": title, "description": description, "popup": popup}) return } @@ -165,15 +168,19 @@ func addFormHandler(w http.ResponseWriter, r *http.Request, user *user.User) { title = getUrlTitle(url) } - ShowTemplate("add", w, map[string]interface{}{"user": user, "flashes": flashes, "link": url, "categories": categories.CategoriesTree, "title": title}) + popup = r.URL.Query().Get("popup") + + ShowTemplate("add", w, map[string]interface{}{"user": user, "flashes": flashes, "link": url, "categories": categories.CategoriesTree, "title": title, "popup": popup}) } func addPostHandler(w http.ResponseWriter, r *http.Request, user *user.User) { session, _ := store.Get(r, "c_user") var news news.News - news.Title = r.FormValue("title") - news.Notes = r.FormValue("notes") + + news.Title, _ = url.QueryUnescape(r.FormValue("title")) + news.Notes, _ = url.QueryUnescape(r.FormValue("notes")) news.Url = r.FormValue("link") + popup := r.FormValue("popup") category_id, err := strconv.Atoi(r.FormValue("category")) if err != nil { category_id = -1 @@ -186,13 +193,18 @@ func addPostHandler(w http.ResponseWriter, r *http.Request, user *user.User) { session.Values["title"] = news.Title session.Values["link"] = news.Url session.Values["notes"] = news.Notes + session.Values["popup"] = popup session.Save(r, w) http.Redirect(w, r, "/add", http.StatusFound) } else { // TODO auto close? redirect session.AddFlash("Added news \""+news.Title+"\"", flash_info) session.Save(r, w) - http.Redirect(w, r, "/", http.StatusFound) + if popup == "1" { + http.Redirect(w, r, "/added", http.StatusFound) + } else { + http.Redirect(w, r, "/", http.StatusFound) + } } } @@ -201,13 +213,13 @@ func templateFormHandler(w http.ResponseWriter, r *http.Request, user *user.User flashes := GetFlashes(session) session.Save(r, w) - news, err := news.Unexported(db) + news, count, err := news.Unexported(db) if err != nil { return } var templateBuf bytes.Buffer - template, err := template.ParseFiles("templates/html_template.html") + template, err := txtTemplate.ParseFiles("templates/html_template.txt") if err != nil { fmt.Println("Error processing html_tempalte:" , err) } @@ -216,7 +228,7 @@ func templateFormHandler(w http.ResponseWriter, r *http.Request, user *user.User fmt.Println("Exec err: ", err) } - ShowTemplate("list", w, map[string]interface{}{"user": user, "flashes": flashes, "template": &templateBuf, "url": config.Url}) + ShowTemplate("list", w, map[string]interface{}{"user": user, "flashes": flashes, "template": &templateBuf, "count": count, "url": config.Url}) } func exportHandler(w http.ResponseWriter, r *http.Request, user *user.User) { @@ -233,6 +245,12 @@ func exportHandler(w http.ResponseWriter, r *http.Request, user *user.User) { http.Redirect(w, r, "/", http.StatusFound) } +func addedHandler(w http.ResponseWriter, r *http.Request, user *user.User) { + session, _ := store.Get(r, "c_user") + flashes := GetFlashes(session) + session.Save(r, w) + ShowTemplate("added", w, map[string]interface{}{"user": user, "flashes": flashes}) +} func init_route_handlers() { http.Handle("/js/", http.StripPrefix("/js/", http.FileServer(http.Dir("js/")))) @@ -247,6 +265,7 @@ func init_route_handlers() { r.HandleFunc("/add", getPostHandler(userHandler(addFormHandler), userHandler(addPostHandler))) r.HandleFunc("/", userHandler(templateFormHandler)) r.HandleFunc("/export", userHandler(exportHandler)) + r.HandleFunc("/added", userHandler(addedHandler)) http.Handle("/", r) diff --git a/templates/html_template.html b/templates/html_template.txt similarity index 100% rename from templates/html_template.html rename to templates/html_template.txt diff --git a/templates/pages/add.html b/templates/pages/add.html index e0f9bce..a9d18d5 100644 --- a/templates/pages/add.html +++ b/templates/pages/add.html @@ -2,6 +2,7 @@

Add Link

{{template "flashes" .}}
+
Link:
Title:
@@ -12,7 +13,7 @@ {{end}}
-
Notes:
+
Notes:
diff --git a/templates/pages/added.html b/templates/pages/added.html new file mode 100644 index 0000000..1565b8c --- /dev/null +++ b/templates/pages/added.html @@ -0,0 +1,5 @@ +{{define "body"}} +

Added Link

+{{template "flashes" .}} + +{{end}} \ No newline at end of file diff --git a/templates/pages/list.html b/templates/pages/list.html index d8bc9b4..2651754 100644 --- a/templates/pages/list.html +++ b/templates/pages/list.html @@ -27,8 +27,12 @@ Click this to mark the current queue of news items as exported (clearing them) +
+
+
{{.count}} news items
+
{{end}} {{define "launch-add"}} -javascript:var d=document,w=window,e=w.getSelection,k=d.getSelection,x=d.selection,s=(e?e():(k)?k():(x?x.createRange().text:0)),f='{{.url}}add',l=d.location,e=encodeURIComponent,u=f+'?url='+e(l.href)+'&title='+e(d.title);a=function(){if(!w.open(u,'t','toolbar=0,resizable=1,scrollbars=1,status=1,width=720,height=570'))l.href=u;};if (/Firefox/.test(navigator.userAgent)) setTimeout(a, 0); else a();void(0) +javascript:var d=document,w=window,e=w.getSelection,k=d.getSelection,x=d.selection,s=(e?e():(k)?k():(x?x.createRange().text:0)),f='{{.url}}add',l=d.location,e=encodeURIComponent,u=f+'?popup=1&url='+e(l.href)+'&title='+e(d.title);a=function(){if(!w.open(u,'t','toolbar=0,resizable=1,scrollbars=1,status=1,width=720,height=410'))l.href=u;};if (/Firefox/.test(navigator.userAgent)) setTimeout(a, 0); else a();void(0) {{end}} \ No newline at end of file diff --git a/user/user.go b/user/user.go index f082edc..b499619 100644 --- a/user/user.go +++ b/user/user.go @@ -24,7 +24,7 @@ func UsernameExists(db *sql.DB, username string) (bool, error) { } func NewUserFromAuth(db *sql.DB, username, password string) *User { - fmt.Println("NewUserFromAuth:", username, ":", password) + fmt.Println("NewUserFromAuth:", username) rows, err := db.Query("SELECT username FROM users WHERE username = $1 AND password IS NOT NULL AND password = crypt($2 , password);", username, password) if err != nil { fmt.Println("Username or auth fail: ", err)