Mostly done, first cut

This commit is contained in:
2025-05-01 23:39:51 +09:30
parent badbe5e92f
commit 58b6692d1b
11 changed files with 248 additions and 156 deletions

View File

@@ -4,15 +4,14 @@
<h5>System information</h5>
<table>
<tr><th>Memory in use</th><td>{{ meminfo }}</td></tr>
<tr><th>Database disk size</th><td>{{ niceSizeMB .stats.FileSize }}Mb</td></tr>
<tr><th>Bookmarks DB size</th><td>{{ niceSizeMB .stats.FileSize }}Mb</td></tr>
<tr><th>Bookmarks index size</th><td>{{ niceSizeMB .stats.IndexSize }}Mb</td></tr>
<tr><th>Bookmarks</th><td>{{ .stats.MostRecentBookmarkInfo.Bookmarks }}</td></tr>
<tr><th>Words in index</th><td>{{ .stats.MostRecentBookmarkInfo.IndexedWords }}</td></tr>
<tr><th>Total searches</th><td>{{ .stats.Searches }}</td></tr>
</table>
<h5>Database information</h5>
<img src="/graph/bookmarks">
<img src="/graph/indexed_words">
</div>
<div class="large-6 medium-12 cell">

View File

@@ -2,29 +2,29 @@
<table id="manage-results">
<tr>
<th>&nbsp;</th>
{{ template "manage_results_column_header.html" .column.title }}
<th>title</th>
<th>tags</th>
{{ template "manage_results_column_header.html" .column.created }}
{{ template "manage_results_column_header.html" .column.scraped }}
<th>created</th>
<th>scraped</th>
</tr>
{{ range .bookmarks }}
{{ range .results }}
<tr>
<th><a class="button" href="/edit/{{ .ID }}">edit</a></th>
<th><a class="button" href="/edit/{{ .Bookmark.ID }}">edit</a></th>
<td>
<a href="{{ .URL }}">{{ .Info.Title }}</a>
<a href="{{ .Bookmark.URL }}">{{ .Bookmark.Info.Title }}</a>
<br>
<a href="{{ .URL }}">{{ niceURL .URL }}</a>
<a href="{{ .Bookmark.URL }}">{{ niceURL .Bookmark.URL }}</a>
</td>
<td>
{{ range .Tags }}
{{ range .Bookmark.Tags }}
<span class="label primary">{{ . }}</span>
{{ end }}
</td>
<td class="show-for-large">{{ (nicetime .TimestampCreated).HumanDuration }} ago</td>
<td class="show-for-large">{{ (nicetime .TimestampLastScraped).HumanDuration }} ago</td>
<td class="show-for-large">{{ (nicetime .Bookmark.TimestampCreated).HumanDuration }} ago</td>
<td class="show-for-large">{{ (nicetime .Bookmark.TimestampLastScraped).HumanDuration }} ago</td>
<td>
<a class="button" hx-swap="outerHTML" hx-post="/scrape/{{ .ID }}">scrape</button>
<a class="button" hx-swap="outerHTML" hx-post="/scrape/{{ .Bookmark.ID }}">scrape</button>
</td>
</tr>
{{ end }}

View File

@@ -1,3 +0,0 @@
<th class="{{ .Class }}" hx-post="/manage/results?sort={{ .URLString }}" hx-target="#manage-results">{{ .Name }}&nbsp;{{ .TitleArrow }}
</th>

View File

@@ -1,5 +1,8 @@
<ul>
{{ range .results }}
<li><a href="{{ .URL }}">{{ .Info.Title }}</a> - {{ .URL }}</li>
<li>
<a href="{{ .Bookmark.URL }}">{{ .Bookmark.Info.Title }}</a><br>
{{ .Highlight }}
</li>
{{ end }}
</ul>

View File

@@ -50,26 +50,9 @@ type Server struct {
}
type ColumnInfo struct {
Name string
Param string
Sorted string
Class string
}
func (c ColumnInfo) URLString() string {
if c.Sorted == "asc" {
return "-" + c.Param
}
return c.Param
}
func (c ColumnInfo) TitleArrow() string {
if c.Sorted == "asc" {
return "↑"
} else if c.Sorted == "desc" {
return "↓"
}
return ""
Name string
Param string
Class string
}
// Create creates a new web server instance and sets up routing.
@@ -126,9 +109,8 @@ func Create(bmm *db.BookmarkManager, cmm *db.ConfigManager) *Server {
})
r.GET("/manage", func(c *gin.Context) {
allBookmarks, _ := bmm.ListBookmarks()
meta := gin.H{"page": "manage", "config": config, "bookmarks": allBookmarks}
results, _ := bmm.Search(db.SearchOptions{All: true})
meta := gin.H{"page": "manage", "config": config, "results": results}
c.HTML(http.StatusOK,
"_layout.html", meta,
)
@@ -136,37 +118,18 @@ func Create(bmm *db.BookmarkManager, cmm *db.ConfigManager) *Server {
r.POST("/manage/results", func(c *gin.Context) {
query := c.PostForm("query")
sort := c.Query("sort")
bookmarks := []entity.Bookmark{}
results := make([]entity.BookmarkSearchResult, 0)
if query == "" {
bookmarks, _ = bmm.ListBookmarks()
results, _ = bmm.Search(db.SearchOptions{All: true, Results: 100})
} else {
bookmarks, _ = bmm.Search(db.SearchOptions{Query: query, Sort: sort})
results, _ = bmm.Search(db.SearchOptions{Query: query})
}
meta := gin.H{"config": config, "bookmarks": bookmarks}
meta := gin.H{"config": config, "results": results}
colTitle := &ColumnInfo{Name: "Title/URL", Param: "title"}
colCreated := &ColumnInfo{Name: "Created", Param: "created", Class: "show-for-large"}
colScraped := &ColumnInfo{Name: "Scraped", Param: "scraped", Class: "show-for-large"}
if sort == "title" {
colTitle.Sorted = "asc"
}
if sort == "-title" {
colTitle.Sorted = "desc"
}
if sort == "scraped" {
colScraped.Sorted = "asc"
}
if sort == "-scraped" {
colScraped.Sorted = "desc"
}
if sort == "created" {
colCreated.Sorted = "asc"
}
if sort == "-created" {
colCreated.Sorted = "desc"
}
cols := gin.H{
"title": colTitle,
@@ -175,9 +138,7 @@ func Create(bmm *db.BookmarkManager, cmm *db.ConfigManager) *Server {
}
meta["column"] = cols
c.HTML(http.StatusOK,
"manage_results.html", meta,
)
c.HTML(http.StatusOK, "manage_results.html", meta)
})
@@ -466,10 +427,7 @@ func Create(bmm *db.BookmarkManager, cmm *db.ConfigManager) *Server {
func plotPoints(sortedKeys []time.Time, dbStats entity.DBStats, p *plot.Plot, k string) {
if k == "indexed_words" {
p.Title.Text = "Indexed words over time"
p.Y.Label.Text = "Words indexed"
} else if k == "bookmarks" {
if k == "bookmarks" {
p.Title.Text = "Bookmarks over time"
p.Y.Label.Text = "Bookmarks"
} else {
@@ -480,9 +438,7 @@ func plotPoints(sortedKeys []time.Time, dbStats entity.DBStats, p *plot.Plot, k
pts := make(plotter.XYs, len(sortedKeys))
for i := range sortedKeys {
pts[i].X = float64(sortedKeys[i].Unix())
if k == "indexed_words" {
pts[i].Y = float64(dbStats.History[sortedKeys[i]].IndexedWords)
} else if k == "bookmarks" {
if k == "bookmarks" {
pts[i].Y = float64(dbStats.History[sortedKeys[i]].Bookmarks)
} else {
panic("bad key")