made the category hierarchy on Find Communities "live"
This commit is contained in:
+28
-2
@@ -11,6 +11,8 @@ package database
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"slices"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -19,8 +21,8 @@ type Category struct {
|
|||||||
CatId int32 `db:"catid"`
|
CatId int32 `db:"catid"`
|
||||||
Parent int32 `db:"parent"`
|
Parent int32 `db:"parent"`
|
||||||
SymLink int32 `db:"symlink"`
|
SymLink int32 `db:"symlink"`
|
||||||
HideDirectory int32 `db:"hide_dir"`
|
HideDirectory bool `db:"hide_dir"`
|
||||||
HideSearch int32 `db:"hide_search"`
|
HideSearch bool `db:"hide_search"`
|
||||||
Name string `db:"name"`
|
Name string `db:"name"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -113,3 +115,27 @@ func AmGetCategoryHierarchy(catid int32) ([]*Category, error) {
|
|||||||
}
|
}
|
||||||
return rc, nil
|
return rc, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* AmGetSubCategories returns a list of all subcategories of the given category ID.
|
||||||
|
* Parameters:
|
||||||
|
* catid - The parent category ID to use. May be -1 to return all "top level" categories.
|
||||||
|
* Returns:
|
||||||
|
* List of subcategories of this category.
|
||||||
|
* Standard Go error status.
|
||||||
|
*/
|
||||||
|
func AmGetSubCategories(catid int32) ([]*Category, error) {
|
||||||
|
err := loadCategories()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
rc := make([]*Category, 0)
|
||||||
|
for i, cat := range allCategories {
|
||||||
|
if catid == cat.Parent {
|
||||||
|
rc = append(rc, &(allCategories[i]))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
slices.SortFunc(rc, func(a, b *Category) int {
|
||||||
|
return strings.Compare(a.Name, b.Name)
|
||||||
|
})
|
||||||
|
return rc, nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -9,7 +9,53 @@
|
|||||||
// Package main contains the high-level Amsterdam logic.
|
// Package main contains the high-level Amsterdam logic.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import "git.erbosoft.com/amy/amsterdam/ui"
|
import (
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"git.erbosoft.com/amy/amsterdam/database"
|
||||||
|
"git.erbosoft.com/amy/amsterdam/ui"
|
||||||
|
)
|
||||||
|
|
||||||
|
// loadCategoryInformation loads the current category information to the context.
|
||||||
|
func loadCategoryInformation(ctxt ui.AmContext) error {
|
||||||
|
u := ctxt.CurrentUser()
|
||||||
|
catid := int32(-1)
|
||||||
|
p := ctxt.Parameter("catid")
|
||||||
|
if p != "" {
|
||||||
|
v, err := strconv.Atoi(p)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
catid = int32(v)
|
||||||
|
} else if ctxt.IsSession("find.catid") {
|
||||||
|
x := ctxt.GetSession("find.catid")
|
||||||
|
if xx, ok := x.(int32); ok {
|
||||||
|
catid = xx
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if catid > -1 {
|
||||||
|
cat, err := database.AmGetCategory(catid) // this step also resolves symlinks
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
catid = cat.CatId
|
||||||
|
}
|
||||||
|
ctxt.SetSession("find.catid", catid)
|
||||||
|
ctxt.VarMap().Set("catid", catid)
|
||||||
|
ctxt.VarMap().Set("showHiddenCat", database.AmTestPermission("Global.ShowHiddenCategories", u.BaseLevel))
|
||||||
|
hier, err := database.AmGetCategoryHierarchy(catid)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
ctxt.VarMap().Set("catHierarchy", hier)
|
||||||
|
subs, err := database.AmGetSubCategories(catid)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
ctxt.VarMap().Set("catSubs", subs)
|
||||||
|
// TODO: set matching communities as well
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
/* FindPage renders the Amsterdam "Find" page.
|
/* FindPage renders the Amsterdam "Find" page.
|
||||||
* Parameters:
|
* Parameters:
|
||||||
@@ -33,11 +79,17 @@ func FindPage(ctxt ui.AmContext) (string, any, error) {
|
|||||||
if mode == "" {
|
if mode == "" {
|
||||||
mode = "COM"
|
mode = "COM"
|
||||||
}
|
}
|
||||||
|
ctxt.SetSession("find.mode", mode)
|
||||||
|
ctxt.VarMap().Set("mode", mode)
|
||||||
switch mode {
|
switch mode {
|
||||||
case "COM":
|
case "COM":
|
||||||
ctxt.VarMap().Set("field", "name")
|
ctxt.VarMap().Set("field", "name")
|
||||||
ctxt.VarMap().Set("oper", "st")
|
ctxt.VarMap().Set("oper", "st")
|
||||||
ctxt.VarMap().Set("term", "")
|
ctxt.VarMap().Set("term", "")
|
||||||
|
err := loadCategoryInformation(ctxt)
|
||||||
|
if err != nil {
|
||||||
|
return ui.ErrorPage(ctxt, err)
|
||||||
|
}
|
||||||
case "USR":
|
case "USR":
|
||||||
ctxt.VarMap().Set("field", "name")
|
ctxt.VarMap().Set("field", "name")
|
||||||
ctxt.VarMap().Set("oper", "st")
|
ctxt.VarMap().Set("oper", "st")
|
||||||
@@ -49,9 +101,7 @@ func FindPage(ctxt ui.AmContext) (string, any, error) {
|
|||||||
ctxt.VarMap().Set("term", "")
|
ctxt.VarMap().Set("term", "")
|
||||||
}
|
}
|
||||||
|
|
||||||
ctxt.VarMap().Set("mode", mode)
|
|
||||||
ctxt.VarMap().Set("amsterdam_pageTitle", "Find")
|
ctxt.VarMap().Set("amsterdam_pageTitle", "Find")
|
||||||
ctxt.SetLeftMenu("top")
|
ctxt.SetLeftMenu("top")
|
||||||
ctxt.SetSession("find.mode", mode)
|
|
||||||
return "framed_template", "find.jet", nil
|
return "framed_template", "find.jet", nil
|
||||||
}
|
}
|
||||||
|
|||||||
+33
-82
@@ -11,7 +11,7 @@
|
|||||||
<div class="mb-6">
|
<div class="mb-6">
|
||||||
<div class="flex items-baseline gap-2">
|
<div class="flex items-baseline gap-2">
|
||||||
<h1 class="text-blue-800 text-4xl font-bold">Find:</h1>
|
<h1 class="text-blue-800 text-4xl font-bold">Find:</h1>
|
||||||
<nav class="text-blue-800 text-lg">
|
<nav class="text-blue-800 text-2xl">
|
||||||
{{ if mode == "COM" }}
|
{{ if mode == "COM" }}
|
||||||
<span class="font-bold">Communities</span>
|
<span class="font-bold">Communities</span>
|
||||||
{{ else }}
|
{{ else }}
|
||||||
@@ -45,6 +45,9 @@
|
|||||||
<form method="POST" action="/find">
|
<form method="POST" action="/find">
|
||||||
<input type="hidden" name="mode" value="{{ mode }}">
|
<input type="hidden" name="mode" value="{{ mode }}">
|
||||||
<input type="hidden" name="ofs" value="0">
|
<input type="hidden" name="ofs" value="0">
|
||||||
|
{{ if mode == "COM" }}
|
||||||
|
<input type="hidden" name="catid" value="{{ catid }}">
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
<div class="bg-gray-50 p-6 rounded-lg">
|
<div class="bg-gray-50 p-6 rounded-lg">
|
||||||
{{ if mode == "COM" }}
|
{{ if mode == "COM" }}
|
||||||
@@ -140,94 +143,42 @@
|
|||||||
<div class="max-w-3xl">
|
<div class="max-w-3xl">
|
||||||
<hr class="border-gray-400 mb-4">
|
<hr class="border-gray-400 mb-4">
|
||||||
|
|
||||||
<h2 class="text-lg font-bold text-black mb-4">Category: Top</h2>
|
<h2 class="text-lg font-bold text-black mb-4">
|
||||||
|
Category:
|
||||||
|
{{ if catid == -1 }}
|
||||||
|
Top
|
||||||
|
{{ else }}
|
||||||
|
<a href="/find?mode=COM&catid=-1" class="text-blue-700 hover:text-blue-900 font-bold">Top</a>
|
||||||
|
{{ end }}
|
||||||
|
{{ last := len(catHierarchy) - 1 }}
|
||||||
|
{{ range i, cat := catHierarchy }}
|
||||||
|
:
|
||||||
|
{{ if i == last }}
|
||||||
|
{{ cat.Name }}
|
||||||
|
{{ else }}
|
||||||
|
<a href="/find?mode=COM&catid={{ cat.CatId }}"
|
||||||
|
class="text-blue-700 hover:text-blue-900 font-bold">{{ cat.Name }}</a>
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
{{ if len(catSubs) > 0 }}
|
||||||
<div class="bg-gray-50 p-6 rounded-lg">
|
<div class="bg-gray-50 p-6 rounded-lg">
|
||||||
<h3 class="text-base font-bold text-black mb-4">Subcategories:</h3>
|
<h3 class="text-base font-bold text-black mb-4">Subcategories:</h3>
|
||||||
|
|
||||||
<div class="grid grid-cols-1 md:grid-cols-1 gap-1">
|
<div class="grid grid-cols-1 md:grid-cols-1 gap-1">
|
||||||
|
{{ range _, cat := catSubs }}
|
||||||
|
{{ if !cat.HideDirectory || showHiddenCat }}
|
||||||
<div class="flex items-start gap-1">
|
<div class="flex items-start gap-1">
|
||||||
<span class="text-lg pt-0.5">🟣</span>
|
<span class="text-sm pt-0.5">🟣</span>
|
||||||
<a href="http://necrovenice:8080/venice/find.js.vs?disp=0&cat=1"
|
<a href="/find?mode=COM&catid={{ cat.CatId }}"
|
||||||
class="text-blue-700 hover:text-blue-900 font-bold text-sm">Arts</a>
|
class="text-blue-700 hover:text-blue-900 font-bold text-sm">{{ cat.Name }}</a>
|
||||||
</div>
|
{{ if cat.SymLink != -1 }}<span class="text-sm pt-0.5">🔗</span>{{ end }}
|
||||||
<div class="flex items-start gap-1">
|
|
||||||
<span class="text-lg pt-0.5">🟣</span>
|
|
||||||
<a href="http://necrovenice:8080/venice/find.js.vs?disp=0&cat=2"
|
|
||||||
class="text-blue-700 hover:text-blue-900 font-bold text-sm">Business</a>
|
|
||||||
</div>
|
|
||||||
<div class="flex items-start gap-1">
|
|
||||||
<span class="text-lg pt-0.5">🟣</span>
|
|
||||||
<a href="http://necrovenice:8080/venice/find.js.vs?disp=0&cat=3"
|
|
||||||
class="text-blue-700 hover:text-blue-900 font-bold text-sm">Computers</a>
|
|
||||||
</div>
|
|
||||||
<div class="flex items-start gap-1">
|
|
||||||
<span class="text-lg pt-0.5">🟣</span>
|
|
||||||
<a href="http://necrovenice:8080/venice/find.js.vs?disp=0&cat=4"
|
|
||||||
class="text-blue-700 hover:text-blue-900 font-bold text-sm">Games</a>
|
|
||||||
</div>
|
|
||||||
<div class="flex items-start gap-1">
|
|
||||||
<span class="text-lg pt-0.5">🟣</span>
|
|
||||||
<a href="http://necrovenice:8080/venice/find.js.vs?disp=0&cat=5"
|
|
||||||
class="text-blue-700 hover:text-blue-900 font-bold text-sm">Health</a>
|
|
||||||
</div>
|
|
||||||
<div class="flex items-start gap-1">
|
|
||||||
<span class="text-lg pt-0.5">🟣</span>
|
|
||||||
<a href="http://necrovenice:8080/venice/find.js.vs?disp=0&cat=6"
|
|
||||||
class="text-blue-700 hover:text-blue-900 font-bold text-sm">Home</a>
|
|
||||||
</div>
|
|
||||||
<div class="flex items-start gap-1">
|
|
||||||
<span class="text-lg pt-0.5">🟣</span>
|
|
||||||
<a href="http://necrovenice:8080/venice/find.js.vs?disp=0&cat=7"
|
|
||||||
class="text-blue-700 hover:text-blue-900 font-bold text-sm">News</a>
|
|
||||||
</div>
|
|
||||||
<div class="flex items-start gap-1">
|
|
||||||
<span class="text-lg pt-0.5">🟣</span>
|
|
||||||
<a href="http://necrovenice:8080/venice/find.js.vs?disp=0&cat=8"
|
|
||||||
class="text-blue-700 hover:text-blue-900 font-bold text-sm">Recreation</a>
|
|
||||||
</div>
|
|
||||||
<div class="flex items-start gap-1">
|
|
||||||
<span class="text-lg pt-0.5">🟣</span>
|
|
||||||
<a href="http://necrovenice:8080/venice/find.js.vs?disp=0&cat=9"
|
|
||||||
class="text-blue-700 hover:text-blue-900 font-bold text-sm">Reference and Education</a>
|
|
||||||
</div>
|
|
||||||
<div class="flex items-start gap-1">
|
|
||||||
<span class="text-lg pt-0.5">🟣</span>
|
|
||||||
<a href="http://necrovenice:8080/venice/find.js.vs?disp=0&cat=10"
|
|
||||||
class="text-blue-700 hover:text-blue-900 font-bold text-sm">Regional</a>
|
|
||||||
</div>
|
|
||||||
<div class="flex items-start gap-1">
|
|
||||||
<span class="text-lg pt-0.5">🟣</span>
|
|
||||||
<a href="http://necrovenice:8080/venice/find.js.vs?disp=0&cat=11"
|
|
||||||
class="text-blue-700 hover:text-blue-900 font-bold text-sm">Science</a>
|
|
||||||
</div>
|
|
||||||
<div class="flex items-start gap-1">
|
|
||||||
<span class="text-lg pt-0.5">🟣</span>
|
|
||||||
<a href="http://necrovenice:8080/venice/find.js.vs?disp=0&cat=12"
|
|
||||||
class="text-blue-700 hover:text-blue-900 font-bold text-sm">Shopping</a>
|
|
||||||
</div>
|
|
||||||
<div class="flex items-start gap-1">
|
|
||||||
<span class="text-lg pt-0.5">🟣</span>
|
|
||||||
<a href="http://necrovenice:8080/venice/find.js.vs?disp=0&cat=13"
|
|
||||||
class="text-blue-700 hover:text-blue-900 font-bold text-sm">Society</a>
|
|
||||||
</div>
|
|
||||||
<div class="flex items-start gap-1">
|
|
||||||
<span class="text-lg pt-0.5">🟣</span>
|
|
||||||
<a href="http://necrovenice:8080/venice/find.js.vs?disp=0&cat=14"
|
|
||||||
class="text-blue-700 hover:text-blue-900 font-bold text-sm">Sports</a>
|
|
||||||
</div>
|
|
||||||
<div class="flex items-start gap-1">
|
|
||||||
<span class="text-lg pt-0.5">🟣</span>
|
|
||||||
<a href="http://necrovenice:8080/venice/find.js.vs?disp=0&cat=15"
|
|
||||||
class="text-blue-700 hover:text-blue-900 font-bold text-sm">System</a>
|
|
||||||
</div>
|
|
||||||
<div class="flex items-start gap-1">
|
|
||||||
<span class="text-lg pt-0.5">🟣</span>
|
|
||||||
<a href="http://necrovenice:8080/venice/find.js.vs?disp=0&cat=0"
|
|
||||||
class="text-blue-700 hover:text-blue-900 font-bold text-sm">Unclassified</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
</div>
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user