mirror of
				https://github.com/osmarks/mycorrhiza.git
				synced 2025-10-31 15:43:00 +00:00 
			
		
		
		
	Categories: Implement category pages
This commit is contained in:
		| @@ -27,7 +27,11 @@ func WithHypha(hyphaName string) (categoryList []string) { | |||||||
| func Contents(catName string) (hyphaList []string) { | func Contents(catName string) (hyphaList []string) { | ||||||
| 	mutex.RLock() | 	mutex.RLock() | ||||||
| 	defer mutex.RUnlock() | 	defer mutex.RUnlock() | ||||||
| 	return categoryToHyphae[catName].hyphaList | 	if node, ok := categoryToHyphae[catName]; ok { | ||||||
|  | 		return node.hyphaList | ||||||
|  | 	} else { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| var mutex sync.RWMutex | var mutex sync.RWMutex | ||||||
|   | |||||||
| @@ -2,9 +2,13 @@ package views | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"github.com/bouncepaw/mycorrhiza/hyphae/categories" | 	"github.com/bouncepaw/mycorrhiza/hyphae/categories" | ||||||
|  | 	"github.com/bouncepaw/mycorrhiza/l18n" | ||||||
|  | 	"github.com/bouncepaw/mycorrhiza/user" | ||||||
| 	"github.com/bouncepaw/mycorrhiza/util" | 	"github.com/bouncepaw/mycorrhiza/util" | ||||||
| 	"html/template" | 	"html/template" | ||||||
|  | 	"io" | ||||||
| 	"log" | 	"log" | ||||||
|  | 	"net/http" | ||||||
| 	"strings" | 	"strings" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -24,15 +28,42 @@ const categoriesCardTmpl = `{{$hyphaName := .HyphaName | |||||||
| 	{{end}} | 	{{end}} | ||||||
| 		<li class="categories-card__entry categories-card__add-to-cat"> | 		<li class="categories-card__entry categories-card__add-to-cat"> | ||||||
| 			<form method="POST" action="/add-to-category" class="categories-card__add-form"> | 			<form method="POST" action="/add-to-category" class="categories-card__add-form"> | ||||||
| 				<label for="_cat-name"> | 				<input type="text" name="cat" id="_cat-name"> | ||||||
| 				<input type="text"> | 				<input type="hidden" name="hypha" value="{{$hyphaName}}"> | ||||||
| 				<input type="submit" value="Add to category"> | 				<input type="submit" value="Add to category"> | ||||||
| 			</form> | 			</form> | ||||||
| 		</li> | 		</li> | ||||||
| 	</ul> | 	</ul> | ||||||
| </aside>` | </aside>` | ||||||
|  |  | ||||||
| var categoriesCardT *template.Template | const categoryPageTmpl = `{{$catName := .CatName | ||||||
|  | }}<main class="main-width category"> | ||||||
|  | 	<h1>Category <i>{{$catName}}</i></h1> | ||||||
|  | {{if len .Hyphae}} | ||||||
|  | 	<p>This page lists all hyphae in the category.</p> | ||||||
|  | {{else}} | ||||||
|  | 	<p>This category has no hyphae.</p> | ||||||
|  | {{end}} | ||||||
|  | 	<ul class="category__entries"> | ||||||
|  | 	{{range .Hyphae}} | ||||||
|  | 		<li class="category__entry"> | ||||||
|  | 			<a class="wikilink" href="/hypha/{{.}}">{{beautifulName .}}</a> | ||||||
|  | 		</li> | ||||||
|  | 	{{end}} | ||||||
|  | 		<li class="category__entry category__add-to-cat"> | ||||||
|  | 			<form method="POST" action="/add-to-category" class="category__add-form"> | ||||||
|  | 				<input type="text" name="hypha" id="_hypha-name" placeholder="Hypha name"> | ||||||
|  | 				<input type="hidden" name="cat" value="{{$catName}}"> | ||||||
|  | 				<input type="submit" value="Add hypha to category"> | ||||||
|  | 			</form> | ||||||
|  | 		</li> | ||||||
|  | 	</ul> | ||||||
|  | </main>` | ||||||
|  |  | ||||||
|  | var ( | ||||||
|  | 	categoriesCardT *template.Template | ||||||
|  | 	categoryPageT   *template.Template | ||||||
|  | ) | ||||||
|  |  | ||||||
| func init() { | func init() { | ||||||
| 	categoriesCardT = template.Must(template. | 	categoriesCardT = template.Must(template. | ||||||
| @@ -41,6 +72,12 @@ func init() { | |||||||
| 			"beautifulName": util.BeautifulName, | 			"beautifulName": util.BeautifulName, | ||||||
| 		}). | 		}). | ||||||
| 		Parse(categoriesCardTmpl)) | 		Parse(categoriesCardTmpl)) | ||||||
|  | 	categoryPageT = template.Must(template. | ||||||
|  | 		New("category page"). | ||||||
|  | 		Funcs(template.FuncMap{ | ||||||
|  | 			"beautifulName": util.BeautifulName, | ||||||
|  | 		}). | ||||||
|  | 		Parse(categoryPageTmpl)) | ||||||
| } | } | ||||||
|  |  | ||||||
| func categoryCardHTML(hyphaName string) string { | func categoryCardHTML(hyphaName string) string { | ||||||
| @@ -57,3 +94,23 @@ func categoryCardHTML(hyphaName string) string { | |||||||
| 	} | 	} | ||||||
| 	return buf.String() | 	return buf.String() | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func CategoryPageHTML(w io.Writer, rq *http.Request, catName string) { | ||||||
|  | 	var buf strings.Builder | ||||||
|  | 	err := categoryPageT.Execute(&buf, struct { | ||||||
|  | 		CatName string | ||||||
|  | 		Hyphae  []string | ||||||
|  | 	}{ | ||||||
|  | 		catName, | ||||||
|  | 		categories.Contents(catName), | ||||||
|  | 	}) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Println(err) | ||||||
|  | 	} | ||||||
|  | 	io.WriteString(w, BaseHTML( | ||||||
|  | 		"Category "+util.BeautifulName(catName), | ||||||
|  | 		buf.String(), | ||||||
|  | 		l18n.FromRequest(rq), | ||||||
|  | 		user.FromRequest(rq), | ||||||
|  | 	)) | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										30
									
								
								web/categories.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								web/categories.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | |||||||
|  | package web | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"github.com/bouncepaw/mycorrhiza/util" | ||||||
|  | 	"github.com/bouncepaw/mycorrhiza/views" | ||||||
|  | 	"github.com/gorilla/mux" | ||||||
|  | 	"net/http" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func initCategories(r *mux.Router) { | ||||||
|  | 	r.PathPrefix("/add-to-category").HandlerFunc(handlerAddToCategory).Methods("POST") | ||||||
|  | 	r.PathPrefix("/remove-from-category").HandlerFunc(handlerRemoveFromCategory).Methods("POST") | ||||||
|  | 	r.PathPrefix("/category/").HandlerFunc(handlerCategory).Methods("GET") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func handlerCategory(w http.ResponseWriter, rq *http.Request) { | ||||||
|  | 	util.PrepareRq(rq) | ||||||
|  | 	var ( | ||||||
|  | 		catName = util.HyphaNameFromRq(rq, "category") | ||||||
|  | 	) | ||||||
|  | 	views.CategoryPageHTML(w, rq, catName) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func handlerRemoveFromCategory(w http.ResponseWriter, rq *http.Request) { | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func handlerAddToCategory(w http.ResponseWriter, rq *http.Request) { | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -108,6 +108,7 @@ func Handler() http.Handler { | |||||||
| 	initStuff(wikiRouter) | 	initStuff(wikiRouter) | ||||||
| 	initSearch(wikiRouter) | 	initSearch(wikiRouter) | ||||||
| 	initBacklinks(wikiRouter) | 	initBacklinks(wikiRouter) | ||||||
|  | 	initCategories(wikiRouter) | ||||||
|  |  | ||||||
| 	// Admin routes. | 	// Admin routes. | ||||||
| 	if cfg.UseAuth { | 	if cfg.UseAuth { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Timur Ismagilov
					Timur Ismagilov