diff --git a/common/pages.go b/common/pages.go index ff97fc37..f899add9 100644 --- a/common/pages.go +++ b/common/pages.go @@ -201,6 +201,7 @@ type TopicListPage struct { ForumList []Forum DefaultForum int Sort TopicListSort + SelectedFids []int QuickTools Paginator } @@ -799,8 +800,8 @@ type AreYouSure struct { } // TODO: Write a test for this -func DefaultHeader(w http.ResponseWriter, user *User) *Header { - return &Header{Site: Site, Theme: Themes[fallbackTheme], CurrentUser: user, Writer: w} +func DefaultHeader(w http.ResponseWriter, u *User) *Header { + return &Header{Site: Site, Theme: Themes[fallbackTheme], CurrentUser: u, Writer: w} } func SimpleDefaultHeader(w http.ResponseWriter) *Header { return &Header{Site: Site, Theme: Themes[fallbackTheme], CurrentUser: &GuestUser, Writer: w} diff --git a/common/template_init.go b/common/template_init.go index 1020cb6d..b26bfc8f 100644 --- a/common/template_init.go +++ b/common/template_init.go @@ -114,10 +114,10 @@ func tmplInitHeaders(u, u2, u3 *User) (*Header, *Header, *Header) { Theme: Themes[DefaultThemeBox.Load().(string)], CurrentUser: u, NoticeList: []string{"test"}, - Stylesheets: []HScript{HScript{"panel.css",""}}, - Scripts: []HScript{HScript{"whatever.js",""}}, - PreScriptsAsync: []HScript{HScript{"whatever.js",""}}, - ScriptsAsync: []HScript{HScript{"whatever.js",""}}, + Stylesheets: []HScript{HScript{"panel.css", ""}}, + Scripts: []HScript{HScript{"whatever.js", ""}}, + PreScriptsAsync: []HScript{HScript{"whatever.js", ""}}, + ScriptsAsync: []HScript{HScript{"whatever.js", ""}}, Widgets: PageWidgets{ LeftSidebar: template.HTML("lalala"), }, @@ -227,9 +227,9 @@ func compileCommons(c *tmpl.CTemplateSet, head, head2 *Header, forumList []Forum }*/ var topicsList []TopicsRowMut - topic := Topic{1, "/topic/topic-title.1","Topic Title", "The topic content.", 1, false, false, now, now, user3.ID, 1, 1, "", "::1", 1, 0, 1, 1, "classname",0,"",nil} - topicsList = append(topicsList, TopicsRowMut{&TopicsRow{topic,1, user2, "", 0, user3, "General", "/forum/general.2"}, false}) - topicListPage := TopicListPage{htitle("Topic List"), topicsList, forumList, Config.DefaultForum, TopicListSort{"lastupdated", false}, QuickTools{false, false, false}, Paginator{[]int{1}, 1, 1}} + topic := Topic{1, "/topic/topic-title.1", "Topic Title", "The topic content.", 1, false, false, now, now, user3.ID, 1, 1, "", "::1", 1, 0, 1, 1, "classname", 0, "", nil} + topicsList = append(topicsList, TopicsRowMut{&TopicsRow{topic, 1, user2, "", 0, user3, "General", "/forum/general.2"}, false}) + topicListPage := TopicListPage{htitle("Topic List"), topicsList, forumList, Config.DefaultForum, TopicListSort{"lastupdated", false}, []int{1}, QuickTools{false, false, false}, Paginator{[]int{1}, 1, 1}} o.Add("topics", "c.TopicListPage", topicListPage) o.Add("topics_mini", "c.TopicListPage", topicListPage) @@ -311,9 +311,9 @@ func compileTemplates(wg *sync.WaitGroup, c *tmpl.CTemplateSet, themeName string t.Add("profile", "c.ProfilePage", ppage) var topicsList []TopicsRowMut - topic := Topic{1, "topic-title", "Topic Title", "The topic content.", 1, false, false, now, now, user3.ID, 1, 1, "", "::1", 1, 0, 1, 1, "classname",0,"",nil} - topicsList = append(topicsList, TopicsRowMut{&TopicsRow{topic,0, user2, "", 0, user3, "General", "/forum/general.2"}, false}) - topicListPage := TopicListPage{htitle("Topic List"), topicsList, forumList, Config.DefaultForum, TopicListSort{"lastupdated", false}, QuickTools{false, false, false}, Paginator{[]int{1}, 1, 1}} + topic := Topic{1, "topic-title", "Topic Title", "The topic content.", 1, false, false, now, now, user3.ID, 1, 1, "", "::1", 1, 0, 1, 1, "classname", 0, "", nil} + topicsList = append(topicsList, TopicsRowMut{&TopicsRow{topic, 0, user2, "", 0, user3, "General", "/forum/general.2"}, false}) + topicListPage := TopicListPage{htitle("Topic List"), topicsList, forumList, Config.DefaultForum, TopicListSort{"lastupdated", false}, []int{1}, QuickTools{false, false, false}, Paginator{[]int{1}, 1, 1}} forumItem := BlankForum(1, "general-forum.1", "General Forum", "Where the general stuff happens", true, "all", 0, "", 0) forumPage := ForumPage{htitle("General Forum"), topicsList, forumItem, false, false, Paginator{[]int{1}, 1, 1}} @@ -351,7 +351,7 @@ func compileTemplates(wg *sync.WaitGroup, c *tmpl.CTemplateSet, themeName string } t.AddStd("login", "c.Page", Page{htitle("Login Page"), tList, nil}) - t.AddStd("register", "c.RegisterPage", RegisterPage{htitle("Registration Page"), false, "",[]RegisterVerify{RegisterVerify{true,&RegisterVerifyImageGrid{"What?",[]RegisterVerifyImageGridImage{RegisterVerifyImageGridImage{"something.png"}}}}}}) + t.AddStd("register", "c.RegisterPage", RegisterPage{htitle("Registration Page"), false, "", []RegisterVerify{RegisterVerify{true, &RegisterVerifyImageGrid{"What?", []RegisterVerifyImageGridImage{RegisterVerifyImageGridImage{"something.png"}}}}}}) t.AddStd("error", "c.ErrorPage", ErrorPage{htitle("Error"), "A problem has occurred in the system."}) ipSearchPage := IPSearchPage{htitle("IP Search"), map[int]*User{1: user2}, "::1"} @@ -540,7 +540,7 @@ func compileJSTemplates(wg *sync.WaitGroup, c *tmpl.CTemplateSet, themeName stri t := TItemHold(make(map[string]TItem)) - topic := Topic{1, "topic-title", "Topic Title", "The topic content.", 1, false, false, now, now, user3.ID, 1, 1, "", "::1", 1, 0, 1, 0, "classname",1,"",nil} + topic := Topic{1, "topic-title", "Topic Title", "The topic content.", 1, false, false, now, now, user3.ID, 1, 1, "", "::1", 1, 0, 1, 0, "classname", 1, "", nil} topicsRow := TopicsRowMut{&TopicsRow{topic, 0, user2, "", 0, user3, "General", "/forum/general.2"}, false} t.AddStd("topics_topic", "c.TopicsRowMut", topicsRow) diff --git a/common/topic_list.go b/common/topic_list.go index 71f7c6d2..39ab32ff 100644 --- a/common/topic_list.go +++ b/common/topic_list.go @@ -309,7 +309,7 @@ func (tList *DefaultTopicList) GetListByForum(f *Forum, page, orderby int) (topi // TODO: Use something other than TopicsRow as we don't need to store the forum name and link on each and every topic item? reqUserList := make(map[int]bool) for rows.Next() { - t := TopicsRow{Topic:Topic{ID: 0}} + t := TopicsRow{Topic: Topic{ID: 0}} err := rows.Scan(&t.ID, &t.Title, &t.Content, &t.CreatedBy, &t.IsClosed, &t.Sticky, &t.CreatedAt, &t.LastReplyAt, &t.LastReplyBy, &t.LastReplyID, &t.ViewCount, &t.PostCount, &t.LikeCount) if err != nil { return nil, Paginator{nil, 1, 1}, err @@ -389,7 +389,7 @@ func (tList *DefaultTopicList) GetListByCanSee(canSee []int, page, orderby int, // ? - Would it be useful, if we could post in social groups from /topics/? for _, fid := range canSee { f := Forums.DirtyGet(fid) - if f.Name != "" && f.Active && (f.ParentType == "" || f.ParentType == "forum") && f.TopicCount != 0 { + if f.Name != "" && f.Active && (f.ParentType == "" || f.ParentType == "forum") /*&& f.TopicCount != 0*/ { fcopy := f.Copy() // TODO: Add a hook here for plugin_guilds !! forumList = append(forumList, fcopy) @@ -397,8 +397,8 @@ func (tList *DefaultTopicList) GetListByCanSee(canSee []int, page, orderby int, } inSlice := func(haystack []int, needle int) bool { - for _, item := range haystack { - if needle == item { + for _, it := range haystack { + if needle == it { return true } } @@ -443,10 +443,10 @@ func (tList *DefaultTopicList) GetList(page, orderby int, filterIDs []int) (topi if err != nil { return nil, nil, Paginator{nil, 1, 1}, err } - + //log.Printf("cCanSee: %+v\n", cCanSee) inSlice := func(haystack []int, needle int) bool { - for _, item := range haystack { - if needle == item { + for _, it := range haystack { + if needle == it { return true } } @@ -463,13 +463,14 @@ func (tList *DefaultTopicList) GetList(page, orderby int, filterIDs []int) (topi } else { canSee = cCanSee } + //log.Printf("canSee: %+v\n", canSee) // We need a list of the visible forums for Quick Topic // ? - Would it be useful, if we could post in social groups from /topics/? var topicCount int for _, fid := range canSee { f := Forums.DirtyGet(fid) - if f.Name != "" && f.Active && (f.ParentType == "" || f.ParentType == "forum") && f.TopicCount != 0 { + if f.Name != "" && f.Active && (f.ParentType == "" || f.ParentType == "forum") /*&& f.TopicCount != 0*/ { fcopy := f.Copy() // TODO: Add a hook here for plugin_guilds forumList = append(forumList, fcopy) @@ -495,6 +496,9 @@ func (tList *DefaultTopicList) GetList(page, orderby int, filterIDs []int) (topi // TODO: Rename this to TopicListStore and pass back a TopicList instance holding the pagination data and topic list rather than passing them back one argument at a time // TODO: Make orderby an enum of sorts func (tList *DefaultTopicList) getList(page, orderby, topicCount int, argList []interface{}, qlist string) (topicList []*TopicsRow, paginator Paginator, err error) { + if topicCount == 0 { + return nil, Paginator{nil, 1, 1}, err + } //log.Printf("argList: %+v\n",argList) //log.Printf("qlist: %+v\n",qlist) var orderq string diff --git a/public/global.js b/public/global.js index ecbd9175..f502f7a5 100644 --- a/public/global.js +++ b/public/global.js @@ -554,12 +554,12 @@ function mainInit(){ // TODO: Try to de-duplicate some of these fetch calls fetch(url+q+"&js=1",{credentials:"same-origin"}) - .then(resp => { - if(!resp.ok) throw(url+q+"&js=1 failed to load"); - return resp.json(); - }).then(dat => { - if(!"Topics" in dat) throw("no Topics in data"); - let topics = dat["Topics"]; + .then(r => { + if(!r.ok) throw(url+q+"&js=1 failed to load"); + return r.json(); + }).then(d => { + if(!"Topics" in d) throw("no Topics in data"); + let topics = d["Topics"]; log("ajax navigated to different page"); // TODO: Fix the data race where the function hasn't been loaded yet @@ -569,10 +569,10 @@ function mainInit(){ let obj = {Title:document.title,Url:url+q}; history.pushState(obj,obj.Title,obj.Url); - rebuildPaginator(dat.LastPage); + rebuildPaginator(d.LastPage); rebindPaginator(); }).catch(e => { - log("Unable to get script '"+url+q+"&js=1"+"'",e); + log("Unable to get script "+url+q+"&js=1",e); console.trace(); }); }); @@ -587,14 +587,14 @@ function mainInit(){ // TODO: Take mostviewed into account let url = "//"+window.location.host+"/topics/?fids="+fid; - fetch(url+"&js=1",{credentials: "same-origin"}) - .then(resp => { - if(!resp.ok) throw(url+"&js=1 failed to load"); - return resp.json(); - }).then(dat => { - log("data",dat); - if(!"Topics" in dat) throw("no Topics in data"); - let topics = dat["Topics"]; + fetch(url+"&js=1",{credentials:"same-origin"}) + .then(r => { + if(!r.ok) throw(url+"&js=1 failed to load"); + return r.json(); + }).then(d => { + log("data",d); + if(!"Topics" in d) throw("no Topics in data"); + let topics = d["Topics"]; log("ajax navigated to "+that.innerText); // TODO: Fix the data race where the function hasn't been loaded yet @@ -608,7 +608,7 @@ function mainInit(){ else document.title = baseTitle; let obj = {Title:document.title,Url:url}; history.pushState(obj,obj.Title,obj.Url); - rebuildPaginator(dat.LastPage) + rebuildPaginator(d.LastPage) rebindPaginator(); $(".filter_item").each(function(){ @@ -616,16 +616,18 @@ function mainInit(){ }); that.classList.add("filter_selected"); $(".topic_list_title h1").text(that.innerText); + $(".link_select .link_option .link_recent").attr("href","//"+window.location.host+"/topics/?fids="+fid); + $(".link_select .link_option .link_most_viewed").attr("href","//"+window.location.host+"/topics/most-viewed/?fids="+fid); unbindPage(); bindPage(); }).catch(e => { - log("Unable to get script '"+url+"&js=1"+"'",e); + log("Unable to get script "+url+"&js=1",e); console.trace(); }); }); - if (document.getElementById("topicsItemList")!==null) rebindPaginator(); - if (document.getElementById("forumItemList")!==null) rebindPaginator(); + if(document.getElementById("topicsItemList")!==null) rebindPaginator(); + if(document.getElementById("forumItemList")!==null) rebindPaginator(); // TODO: Show a search button when JS is disabled? $(".widget_search_input").keypress(function(e) { @@ -642,12 +644,12 @@ function mainInit(){ // TODO: Try to de-duplicate some of these fetch calls fetch(url+q+"&js=1",{credentials:"same-origin"}) - .then(resp => { - if(!resp.ok) throw(url+q+"&js=1 failed to load"); - return resp.json(); - }).then(data => { - if(!"Topics" in data) throw("no Topics in data"); - let topics = data["Topics"]; + .then(r => { + if(!r.ok) throw(url+q+"&js=1 failed to load"); + return r.json(); + }).then(d => { + if(!"Topics" in d) throw("no Topics in data"); + let topics = d["Topics"]; log("ajax navigated to search page"); // TODO: Fix the data race where the function hasn't been loaded yet @@ -661,10 +663,10 @@ function mainInit(){ else document.title = baseTitle; let obj = {Title: document.title, Url: url+q}; history.pushState(obj,obj.Title,obj.Url); - rebuildPaginator(data.LastPage); + rebuildPaginator(d.LastPage); rebindPaginator(); }).catch(e => { - log("Unable to get script '"+url+q+"&js=1"+"'",e); + log("Unable to get script "+url+q+"&js=1",e); console.trace(); }); }); @@ -906,14 +908,14 @@ function mainInit(){ } } return resp.text(); - }).then(dat => { - document.querySelector("#back").outerHTML = dat; - if(h!==null) h(dat); + }).then(d => { + document.querySelector("#back").outerHTML = d; + if(h!==null) h(d); $(".elapsed").remove(); let obj = {Title:document.title,Url:base}; history.pushState(obj,obj.Title,obj.Url); }).catch(e => { - log("Unable to get script '"+href+""+"'",e); + log("Unable to get script "+href,e); console.trace(); }); } diff --git a/routes/topic_list.go b/routes/topic_list.go index fdf3b6c7..4e641331 100644 --- a/routes/topic_list.go +++ b/routes/topic_list.go @@ -239,7 +239,8 @@ func TopicListCommon(w http.ResponseWriter, r *http.Request, user *c.User, h *c. } h.Title = phrases.GetTitlePhrase("topics_search") - pi := c.TopicListPage{h, topicList2, forumList, c.Config.DefaultForum, c.TopicListSort{torder, false}, c.QuickTools{canDelete, canLock, canMove}, pagi} + //log.Printf("cfids: %+v\n", cfids) + pi := c.TopicListPage{h, topicList2, forumList, c.Config.DefaultForum, c.TopicListSort{torder, false}, cfids, c.QuickTools{canDelete, canLock, canMove}, pagi} return renderTemplate("topics", w, r, h, pi) } @@ -305,7 +306,7 @@ func TopicListCommon(w http.ResponseWriter, r *http.Request, user *c.User, h *c. topicList2[i] = c.TopicsRowMut{t, canMod} } - pi := c.TopicListPage{h, topicList2, forumList, c.Config.DefaultForum, c.TopicListSort{torder, false}, c.QuickTools{canDelete, canLock, canMove}, pagi} + pi := c.TopicListPage{h, topicList2, forumList, c.Config.DefaultForum, c.TopicListSort{torder, false}, fids, c.QuickTools{canDelete, canLock, canMove}, pagi} if r.FormValue("i") == "1" { return renderTemplate("topics_mini", w, r, h, pi) } diff --git a/templates/topics_inner.html b/templates/topics_inner.html index 251b2f3c..438ac08f 100644 --- a/templates/topics_inner.html +++ b/templates/topics_inner.html @@ -11,10 +11,10 @@ {{if eq .Sort.SortBy "mostviewed"}}{{lang "topic_list.most_viewed_filter"}}{{else}}{{lang "topic_list.most_recent_filter"}}{{end}}