wip
This commit is contained in:
129
web/pages/search.go
Normal file
129
web/pages/search.go
Normal file
@@ -0,0 +1,129 @@
|
||||
package pages
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
g "maragu.dev/gomponents"
|
||||
h "maragu.dev/gomponents/html"
|
||||
|
||||
"reichard.io/antholume/pkg/sliceutils"
|
||||
"reichard.io/antholume/pkg/utils"
|
||||
"reichard.io/antholume/search"
|
||||
"reichard.io/antholume/web/assets"
|
||||
"reichard.io/antholume/web/components/ui"
|
||||
"reichard.io/antholume/web/models"
|
||||
)
|
||||
|
||||
var _ Page = (*Search)(nil)
|
||||
|
||||
type Search struct {
|
||||
Query string
|
||||
Source search.Source
|
||||
Results []models.SearchResult
|
||||
Error string
|
||||
}
|
||||
|
||||
func (Search) Route() PageRoute { return SearchPage }
|
||||
|
||||
func (p Search) Render() g.Node {
|
||||
return h.Div(
|
||||
h.Class("flex flex-col gap-4"),
|
||||
h.Div(
|
||||
h.Class("flex flex-col gap-2 p-4 rounded shadow-lg bg-white dark:bg-gray-700"),
|
||||
h.Form(
|
||||
h.Class("flex gap-4 flex-col lg:flex-row"),
|
||||
h.Action("./search"),
|
||||
h.Div(
|
||||
h.Class("flex w-full"),
|
||||
h.Span(
|
||||
h.Class("inline-flex items-center px-3 border-t bg-white border-l border-b border-gray-300 text-gray-500 shadow-sm text-sm"),
|
||||
assets.Icon("search2", 15),
|
||||
),
|
||||
h.Input(
|
||||
h.Type("text"),
|
||||
h.ID("query"),
|
||||
h.Name("query"),
|
||||
h.Value(p.Query),
|
||||
h.Class("flex-1 appearance-none rounded-none border border-gray-300 w-full py-2 px-4 bg-white text-gray-700 placeholder-gray-400 shadow-sm text-base focus:outline-none focus:ring-2 focus:ring-purple-600 focus:border-transparent"),
|
||||
h.Placeholder("Query"),
|
||||
),
|
||||
),
|
||||
h.Div(
|
||||
h.Class("flex relative min-w-[12em]"),
|
||||
h.Span(
|
||||
h.Class("inline-flex items-center px-3 border-t bg-white border-l border-b border-gray-300 text-gray-500 shadow-sm text-sm"),
|
||||
assets.Icon("documents", 15),
|
||||
),
|
||||
h.Select(
|
||||
h.Class("flex-1 appearance-none rounded-none border border-gray-300 w-full py-2 px-4 bg-white text-gray-700 placeholder-gray-400 shadow-sm text-base focus:outline-none focus:ring-2 focus:ring-purple-600 focus:border-transparent"),
|
||||
h.ID("source"),
|
||||
h.Name("source"),
|
||||
h.Option(
|
||||
h.Value("LibGen"),
|
||||
g.If(p.Source == search.SourceLibGen, h.Selected()),
|
||||
g.Text("Library Genesis"),
|
||||
),
|
||||
h.Option(
|
||||
h.Value("Annas Archive"),
|
||||
g.If(p.Source == search.SourceAnnasArchive, h.Selected()),
|
||||
g.Text("Annas Archive"),
|
||||
),
|
||||
),
|
||||
),
|
||||
h.Div(
|
||||
h.Class("lg:w-60"),
|
||||
ui.FormButton(
|
||||
g.Text("Search"),
|
||||
"",
|
||||
ui.ButtonConfig{Variant: ui.ButtonVariantSecondary},
|
||||
),
|
||||
),
|
||||
),
|
||||
g.If(
|
||||
p.Error != "",
|
||||
h.Span(h.Class("text-red-400 text-xs"), g.Text(p.Error)),
|
||||
),
|
||||
),
|
||||
h.Div(
|
||||
h.Class("inline-block min-w-full overflow-hidden rounded shadow"),
|
||||
ui.Table(
|
||||
ui.TableConfig{
|
||||
Columns: []string{"", "Document", "Series", "Type", "Size", "Date"},
|
||||
Rows: p.tableRows(),
|
||||
},
|
||||
),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
func (p Search) tableRows() []ui.TableRow {
|
||||
return sliceutils.Map(p.Results, func(r models.SearchResult) ui.TableRow {
|
||||
return ui.TableRow{
|
||||
"": ui.TableCell{
|
||||
Value: h.Form(
|
||||
h.Action("./search"),
|
||||
h.Method("POST"),
|
||||
h.Input(h.Type("hidden"), h.Name("source"), h.Value(string(p.Source))),
|
||||
h.Input(h.Type("hidden"), h.Name("title"), h.Value(r.Title)),
|
||||
h.Input(h.Type("hidden"), h.Name("author"), h.Value(r.Author)),
|
||||
ui.FormButton(assets.Icon("download", 24), "", ui.ButtonConfig{Variant: ui.ButtonVariantGhost}),
|
||||
),
|
||||
},
|
||||
"Document": ui.TableCell{
|
||||
String: fmt.Sprintf("%s - %s", r.Author, r.Title),
|
||||
},
|
||||
"Series": ui.TableCell{
|
||||
String: utils.FirstNonZero(r.Series, "N/A"),
|
||||
},
|
||||
"Type": ui.TableCell{
|
||||
String: utils.FirstNonZero(r.FileType, "N/A"),
|
||||
},
|
||||
"Size": ui.TableCell{
|
||||
String: utils.FirstNonZero(r.FileSize, "N/A"),
|
||||
},
|
||||
"Date": ui.TableCell{
|
||||
String: utils.FirstNonZero(r.UploadDate, "N/A"),
|
||||
},
|
||||
}
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user