fix search paging, empty subscribed community search, my subscriptions dropdown. fixes #39

This commit is contained in:
Ryan Stafford 2023-07-23 13:53:02 -04:00
parent ed7d9422d7
commit b6ce673292
10 changed files with 108 additions and 18 deletions

View file

@ -502,21 +502,52 @@ form.nsfw div {
position: relative; position: relative;
color: #000; color: #000;
} }
#settingspopup { #mycommunities, #settingspopup {
background-color: white; background-color: white;
border: 1px solid #888; border: 1px solid #888;
display: none; display: none;
position: absolute; position: absolute;
z-index: 100;
}
#mycommunities {
top: 17px;
padding: 5px 0px;
border-width: 0px 1px 1px 0px;
}
#mycommunities div {
margin: 0px 5px;
}
#mycommunities a:first-child {
text-align: right;
}
#mycommunities a {
text-decoration: none;
color: #369;
text-transform: uppercase;
font-size: 9px;
display: block;
padding: 0px 3px;
}
.dark #mycommunities a {
color: #8cb3d9;
}
.dark #mycommunities a:hover {
background-color: #3e3e3e;
}
#mycommunities a:hover {
background-color: #c7def7;
}
#settingspopup {
right: 10px; right: 10px;
top: 45px; top: 45px;
} }
#settingspopup form { #settingspopup form {
margin: 0px; margin: 0px;
} }
.dark #settingspopup { .dark #settingspopup, .dark #mycommunities {
background-color: #262626; background-color: #262626;
} }
#settingspopup.open { #settingspopup.open, #mycommunities.open {
display: inline-block; display: inline-block;
} }
.expando.open{ .expando.open{
@ -807,11 +838,11 @@ nav .communities a.more {
color: orangered !important; color: orangered !important;
} }
nav a { nav .communities a {
text-decoration: none; text-decoration: none;
color: black; color: black;
} }
nav > a:hover { nav .title a:hover {
text-decoration: underline; text-decoration: underline;
} }

View file

@ -237,6 +237,24 @@ function formSubmit(e) {
return false return false
} }
function toggleMyCommunities(e) {
e.preventDefault()
var mycommunities = document.getElementById("mycommunities")
if (mycommunities.className.indexOf("open") > -1) {
mycommunities.className = ""
return false
}
mycommunities.className = "open"
mycommunities.innerHTML = "<div>loading</div>"
request(e.target.href + "&xhr=1", "", function(res) {
mycommunities.innerHTML = '<div><a href="'+e.target.href+'">view all »</a>'
mycommunities.innerHTML += res
}, function() {
mycommunities.className = ""
})
return false
}
function openSettings(e) { function openSettings(e) {
e.preventDefault() e.preventDefault()
var settings = document.getElementById("settingspopup") var settings = document.getElementById("settingspopup")
@ -332,6 +350,9 @@ function setup() {
if (settings = document.getElementById("opensettings")) { if (settings = document.getElementById("opensettings")) {
settings.addEventListener("click", openSettings) settings.addEventListener("click", openSettings)
} }
if (settings = document.getElementById("openmycommunities")) {
settings.addEventListener("click", toggleMyCommunities)
}
if (hidechildren = document.getElementById("hidechildren")){ if (hidechildren = document.getElementById("hidechildren")){
hidechildren.addEventListener("click", hideAllChildComments) hidechildren.addEventListener("click", hideAllChildComments)
} }

View file

@ -416,6 +416,12 @@ func GetFrontpage(w http.ResponseWriter, r *http.Request, ps httprouter.Params)
} }
} }
func GetCommunities(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
r.URL.Path = "/search"
r.URL.RawQuery = "searchtype=Communities"
http.Redirect(w, r, r.URL.String(), 301)
}
func ResolveId(r *http.Request, class string, id string, host string) string { func ResolveId(r *http.Request, class string, id string, host string) string {
remoteAddr := r.RemoteAddr remoteAddr := r.RemoteAddr
if r.Header.Get("CF-Connecting-IP") != "" { if r.Header.Get("CF-Connecting-IP") != "" {
@ -1284,6 +1290,7 @@ func GetRouter() *httprouter.Router {
router.POST("/:host/create_post", middleware(UserOp)) router.POST("/:host/create_post", middleware(UserOp))
router.GET("/:host/create_community", middleware(GetCreateCommunity)) router.GET("/:host/create_community", middleware(GetCreateCommunity))
router.POST("/:host/create_community", middleware(UserOp)) router.POST("/:host/create_community", middleware(UserOp))
router.GET("/:host/communities", middleware(GetCommunities))
} else { } else {
router.ServeFiles("/_/static/*filepath", http.Dir("public")) router.ServeFiles("/_/static/*filepath", http.Dir("public"))
router.GET("/", middleware(GetFrontpage)) router.GET("/", middleware(GetFrontpage))
@ -1315,6 +1322,7 @@ func GetRouter() *httprouter.Router {
router.POST("/create_post", middleware(UserOp)) router.POST("/create_post", middleware(UserOp))
router.GET("/create_community", middleware(GetCreateCommunity)) router.GET("/create_community", middleware(GetCreateCommunity))
router.POST("/create_community", middleware(UserOp)) router.POST("/create_community", middleware(UserOp))
router.GET("/communities", middleware(GetCommunities))
} }
return router return router
} }

View file

@ -527,7 +527,24 @@ func (state *State) GetPosts() {
func (state *State) Search(searchtype string) { func (state *State) Search(searchtype string) {
if state.Query == "" && searchtype == "Communities" { if state.Query == "" && searchtype == "Communities" {
if state.Listing == "Subscribed" {
if state.Page > 1 {
return
}
state.GetSite()
for _, c := range state.Site.MyUser.MustValue().Follows {
state.Communities = append(state.Communities, types.CommunityView{
Community: c.Community,
Subscribed: "Subscribed",
})
}
sort.Slice(state.Communities, func(a, b int) bool {
return state.Communities[a].Community.Name < state.Communities[b].Community.Name
})
return
}
resp, err := state.Client.Communities(context.Background(), types.ListCommunities{ resp, err := state.Client.Communities(context.Background(), types.ListCommunities{
Type: types.NewOptional(types.ListingType(state.Listing)),
Sort: types.NewOptional(types.SortType(state.Sort)), Sort: types.NewOptional(types.SortType(state.Sort)),
Limit: types.NewOptional(int64(25)), Limit: types.NewOptional(int64(25)),
Page: types.NewOptional(int64(state.Page)), Page: types.NewOptional(int64(state.Page)),

View file

@ -1,17 +1,17 @@
<div class="community"> <div class="community">
<form method="POST" class="member {{ membership .Subscribed }}"> <form method="POST" class="member {{ membership .Subscribed }}">
<input name="op" type="submit" value="{{ membership .Subscribed}}"> <input name="op" type="submit" value="{{ membership .Subscribed}}">
<input type="hidden" name="communityid" value ="{{.Community.ID}}"> <input type="hidden" name="communityid" value ="{{ .Community.ID }}">
</form> </form>
<span class="title"><a href="{{localize .Community.ActorID}}">c/{{fullcname .Community}}: {{.Community.Title}}</a></span> <span class="title"><a href="{{ if .Community.Local }}./c/{{.Community.Name}}{{else}}{{ localize .Community.ActorID }}{{end}}">c/{{fullcname .Community}}: {{.Community.Title}}</a></span>
<div class="details"> <div class="details">
{{ if .Community.Description.IsValid }} {{ if .Community.Description.IsValid }}
<div class="description"> <div class="description">
{{markdown "" .Community.Description.String}} {{ markdown "" .Community.Description.String }}
</div> </div>
{{ end }} {{ end }}
<div class="gray"> <div class="gray">
{{printer .Counts.Subscribers}} subscribers, {{ if .Counts.Subscribers }}{{ printer .Counts.Subscribers }} subscribers,{{end}}
a community founded {{ humanize .Community.Published.Time }} a community founded {{ humanize .Community.Published.Time }}
</div> </div>
</div> </div>

View file

@ -2,7 +2,7 @@
<head> <head>
<title>{{ if and .Community (ne .Community.CommunityView.Community.Title "")}}{{.Community.CommunityView.Community.Title}}{{else if ne .CommunityName ""}}/c/{{.CommunityName}}{{ else if .User}}overview for {{.User.PersonView.Person.Name}}{{else}}{{ host .Host }}{{end}}</title> <title>{{ if and .Community (ne .Community.CommunityView.Community.Title "")}}{{.Community.CommunityView.Community.Title}}{{else if ne .CommunityName ""}}/c/{{.CommunityName}}{{ else if .User}}overview for {{.User.PersonView.Person.Name}}{{else}}{{ host .Host }}{{end}}</title>
<link rel="shortcut icon" href="/{{.Host}}/icon.jpg"> <link rel="shortcut icon" href="/{{.Host}}/icon.jpg">
<link rel="stylesheet" href="/_/static/style.css?v=25"> <link rel="stylesheet" href="/_/static/style.css?v=27">
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
</head> </head>
<body {{ if .Dark }}class="dark"{{end}}> <body {{ if .Dark }}class="dark"{{end}}>
@ -59,6 +59,6 @@
{{ template "sidebar.html" . }} {{ template "sidebar.html" . }}
</main> </main>
{{ end }} {{ end }}
<script src="/_/static/utils.js?v=20"></script> <script src="/_/static/utils.js?v=21"></script>
</body> </body>
</html> </html>

View file

@ -3,7 +3,7 @@
<title>{{if and .Posts .PostID }}{{ (index .Posts 0).Post.Name}} : {{.CommunityName}}{{else if and .Community (ne .Community.CommunityView.Community.Title "")}}{{.Community.CommunityView.Community.Title}}{{else if ne .CommunityName ""}}/c/{{.CommunityName}}{{ else if .User}}overview for {{.User.PersonView.Person.Name}}{{else}}{{ host .Host }}{{end}}</title> <title>{{if and .Posts .PostID }}{{ (index .Posts 0).Post.Name}} : {{.CommunityName}}{{else if and .Community (ne .Community.CommunityView.Community.Title "")}}{{.Community.CommunityView.Community.Title}}{{else if ne .CommunityName ""}}/c/{{.CommunityName}}{{ else if .User}}overview for {{.User.PersonView.Person.Name}}{{else}}{{ host .Host }}{{end}}</title>
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="shortcut icon" href="/{{.Host}}/icon.jpg"> <link rel="shortcut icon" href="/{{.Host}}/icon.jpg">
<link rel="stylesheet" href="/_/static/style.css?v=26"> <link rel="stylesheet" href="/_/static/style.css?v=27">
</head> </head>
<body{{ if .Dark }} class="dark"{{end}}> <body{{ if .Dark }} class="dark"{{end}}>
<noscript> <noscript>
@ -34,6 +34,7 @@
{{ if or (ne .Query "") .Communities }} {{ if or (ne .Query "") .Communities }}
<form class="search" method="GET"> <form class="search" method="GET">
<input type="hidden" name="sort" value="{{.Sort}}"> <input type="hidden" name="sort" value="{{.Sort}}">
<input type="hidden" name="listingType" value="{{.Listing}}">
<div>search</div> <div>search</div>
<div class="query"> <div class="query">
<input type="text" name="q" value="{{.Query}}"> <input type="text" name="q" value="{{.Query}}">
@ -139,7 +140,7 @@
{{ end }} {{ end }}
{{ end }} {{ end }}
<script src="/_/static/utils.js?v=20"></script> <script src="/_/static/utils.js?v=21"></script>
{{ template "sidebar.html" . }} {{ template "sidebar.html" . }}
</main> </main>
{{ end }} {{ end }}

View file

@ -1,5 +1,8 @@
<nav> <nav>
<div class="communities"> <div class="communities">
{{ if .Session }}
<a id="openmycommunities" href="/{{.Host}}/search?searchtype=Communities&listingType=Subscribed&sort=TopMonth&page=0">my communities ▼</a>
{{ end }}
<a href="/{{.Host}}">home</a> <a href="/{{.Host}}">home</a>
<span> - </span> <span> - </span>
<a href="/{{.Host}}?listingType=All">all</a> <a href="/{{.Host}}?listingType=All">all</a>
@ -9,8 +12,9 @@
<a href="/{{$host}}/c/{{fullcname $c.Community}}">{{$c.Community.Name}}</a> <a href="/{{$host}}/c/{{fullcname $c.Community}}">{{$c.Community.Name}}</a>
<span> - </span> <span> - </span>
{{ end }} {{ end }}
<a href="/{{$host}}/search?searchtype=Communities&sort=TopAll" class="more">more »</a> <a href="/{{$host}}/search?searchtype=Communities&sort=TopMonth" class="more">more »</a>
</div> </div>
<div id="mycommunities"></div>
<div class="right"> <div class="right">
{{ if .Session }} {{ if .Session }}
<a href="/{{.Host}}/u/{{ .Session.UserName}}">{{ .Session.UserName }}</a> <a href="/{{.Host}}/u/{{ .Session.UserName}}">{{ .Session.UserName }}</a>

View file

@ -1,9 +1,8 @@
{{ $host := .Host }} {{ $host := .Host }}
<div class="{{ if .User }}user {{end}}side"> <div class="{{ if .User }}user {{end}}side">
{{ if not .SearchType }}
<form method="GET" action="/{{.Host}}/search"> <form method="GET" action="/{{.Host}}/search">
<input type="text" placeholder="search" name="q" value="{{.Query}}"> <input type="text" placeholder="search" name="q" value="">
{{ if .User }} {{ if .User }}
<input type="hidden" name="username" value="{{.UserName}}"> <input type="hidden" name="username" value="{{.UserName}}">
{{ else if .Community }} {{ else if .Community }}
@ -11,7 +10,6 @@
{{ end }} {{ end }}
<input type="hidden" name="sort" value="New"> <input type="hidden" name="sort" value="New">
</form> </form>
{{ end }}
{{ if .User }} {{ if .User }}
<h1>{{ .User.PersonView.Person.Name }}</h1> <h1>{{ .User.PersonView.Person.Name }}</h1>

View file

@ -1,11 +1,21 @@
{{ $state := . }}
{{ if or .PostID .CommentID }} {{ if or .PostID .CommentID }}
{{ range $i, $comment := .Comments }} {{ range $i, $comment := .Comments }}
{{ template "comment.html" $comment }} {{ template "comment.html" $comment }}
{{ end }} {{ end }}
{{ else if .Activities }} {{ else if .Activities }}
{{ template "activities.html" . }} {{ template "activities.html" . }}
{{ else }} {{ else if .Posts }}
{{ range $post := .Posts }} {{ range $post := .Posts }}
{{ template "post.html" $post }} {{ template "post.html" $post }}
{{ end }} {{ end }}
{{ else if .Communities }}
{{ range .Communities }}
{{ if not $state.Page }}
<a href="/{{ $state.Host}}/{{ if .Community.Local }}c/{{.Community.Name}}{{else}}{{ localize .Community.ActorID }}{{end}}">{{fullcname .Community }}</a>
{{ else }}
{{ template "community.html" . }}
{{ end }}
{{ end }}
{{ else }}
{{ end }} {{ end }}