mirror of
https://github.com/daylinmorgan/nimpkgs.git
synced 2024-12-22 02:50:44 -06:00
encode search sort style in url
This commit is contained in:
parent
3509478921
commit
520b3b0461
10 changed files with 55 additions and 25 deletions
|
@ -2,7 +2,7 @@ import std/strutils
|
||||||
import karax/[karax, karaxdsl, vdom]
|
import karax/[karax, karaxdsl, vdom]
|
||||||
import components/[header, button, footer]
|
import components/[header, button, footer]
|
||||||
import pages/pages
|
import pages/pages
|
||||||
import context, utils
|
import context, lib
|
||||||
|
|
||||||
proc render(data: RouterData): VNode =
|
proc render(data: RouterData): VNode =
|
||||||
when defined(debug): console.log ctx
|
when defined(debug): console.log ctx
|
||||||
|
|
|
@ -4,7 +4,7 @@ import karax/[kbase, karax, karaxdsl, vdom, jstrutils, ]
|
||||||
|
|
||||||
import ../[packages, style, context]
|
import ../[packages, style, context]
|
||||||
import ../components/tag
|
import ../components/tag
|
||||||
import ../utils
|
import ../lib
|
||||||
|
|
||||||
randomize()
|
randomize()
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,7 @@ import std/[strutils, uri]
|
||||||
import karax/[kbase, karax, karaxdsl, vdom, jstrutils]
|
import karax/[kbase, karax, karaxdsl, vdom, jstrutils]
|
||||||
|
|
||||||
import ../[packages, style, context]
|
import ../[packages, style, context]
|
||||||
# import ../components/package
|
import ../lib
|
||||||
import ../utils
|
|
||||||
|
|
||||||
type
|
type
|
||||||
Query* = object
|
Query* = object
|
||||||
|
@ -55,15 +54,21 @@ proc searchPackages*(q: Query): seq[NimPackage] =
|
||||||
if q ~= pkg: pkg
|
if q ~= pkg: pkg
|
||||||
|
|
||||||
proc getSearchFromUri*(): kstring =
|
proc getSearchFromUri*(): kstring =
|
||||||
|
result = ""
|
||||||
var url = currentUri()
|
var url = currentUri()
|
||||||
if url.query == "": return ""
|
if url.query == "": return
|
||||||
for k, v in decodeQuery(url.query):
|
for k, v in decodeQuery(url.query):
|
||||||
if k == "query":
|
if k == "query":
|
||||||
return v.kstring
|
return v.kstring
|
||||||
|
|
||||||
proc getSearchInput*() =
|
proc getSearchInput*() =
|
||||||
let searchInput = getVNodeById("search").getInputText
|
let searchInput = getVNodeById("search").getInputText
|
||||||
setSearchUrl(searchInput)()
|
let sortNode = getVNodeById("sort-select")
|
||||||
|
let sortMethod = SortMethod(
|
||||||
|
if sortNode != nil: parseInt(sortNode.getInputText)
|
||||||
|
else: 0
|
||||||
|
)
|
||||||
|
setSearchUrl(searchInput, sortMethod)()
|
||||||
|
|
||||||
proc searchBar*(value = jss""): Vnode =
|
proc searchBar*(value = jss""): Vnode =
|
||||||
buildHtml(tdiv(class = "flex flex-row my-2 grow")):
|
buildHtml(tdiv(class = "flex flex-row my-2 grow")):
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import std/[uri, tables, random]
|
import std/[uri, tables, random]
|
||||||
import karax/[kbase, karaxdsl, vdom, jstrutils]
|
import karax/[kbase, karaxdsl, vdom, jstrutils]
|
||||||
|
|
||||||
import ../[packages, style, context, utils]
|
import ../[packages, style, context, lib]
|
||||||
|
|
||||||
randomize()
|
randomize()
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ import std/[
|
||||||
asyncjs, jsconsole, jsfetch, sequtils, sugar, tables
|
asyncjs, jsconsole, jsfetch, sequtils, sugar, tables
|
||||||
]
|
]
|
||||||
import karax/[kbase, karax], jsony
|
import karax/[kbase, karax], jsony
|
||||||
import packages, utils
|
import packages, lib
|
||||||
|
|
||||||
export tables
|
export tables
|
||||||
|
|
||||||
|
|
|
@ -20,11 +20,21 @@ proc currentUri*(): Uri {.inline.} =
|
||||||
func replace*(c: kstring, sub: string, by = " "): kstring =
|
func replace*(c: kstring, sub: string, by = " "): kstring =
|
||||||
($c).replace(sub, by).jss
|
($c).replace(sub, by).jss
|
||||||
|
|
||||||
proc setSearchUrl*(searchQuery: kstring): proc() =
|
type
|
||||||
|
SortMethod* = enum
|
||||||
|
smAlphabetical = "smAlphabetical", smCommitAge = "commit", smVersionAge = "version"
|
||||||
|
|
||||||
|
proc setSearchUrl*(searchQuery: kstring, sortMethod = smAlphabetical): proc() =
|
||||||
proc() =
|
proc() =
|
||||||
var url = currentUri()
|
var
|
||||||
|
url = currentUri()
|
||||||
|
params: seq[(string, string)]
|
||||||
|
if searchQuery != "":
|
||||||
|
params.add ("query", $searchQuery)
|
||||||
|
if sortMethod != smAlphabetical:
|
||||||
|
params.add ("sort", $sortMethod)
|
||||||
url.anchor = "/search"
|
url.anchor = "/search"
|
||||||
url = url ? {"query": $searchQuery}
|
url = url ? params
|
||||||
window.history.pushState(js{}, "".jss, url.jss)
|
window.history.pushState(js{}, "".jss, url.jss)
|
||||||
let d = getVNodeById("search")
|
let d = getVNodeById("search")
|
||||||
let node = d.dom
|
let node = d.dom
|
|
@ -5,7 +5,7 @@ import std/[
|
||||||
import karax/[kbase]
|
import karax/[kbase]
|
||||||
import jsony
|
import jsony
|
||||||
|
|
||||||
import ./utils
|
import ./lib
|
||||||
export algorithm, tables, times, asyncjs, sugar
|
export algorithm, tables, times, asyncjs, sugar
|
||||||
|
|
||||||
proc parseHook*(s: string, i: var int, v: var kstring) =
|
proc parseHook*(s: string, i: var int, v: var kstring) =
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import std/[algorithm, sequtils, tables, uri, strutils, times]
|
import std/[algorithm, sequtils, tables, uri, strutils, times]
|
||||||
import karax/[kbase, karaxdsl, vdom, jstrutils]
|
import karax/[kbase, karaxdsl, vdom, jstrutils]
|
||||||
|
|
||||||
import ../[context, packages, style, utils]
|
import ../[context, packages, style, lib]
|
||||||
|
|
||||||
type
|
type
|
||||||
Metrics = object
|
Metrics = object
|
||||||
|
|
|
@ -3,7 +3,7 @@ import karax/[kbase, karax, karaxdsl, kdom, vdom, jstrutils, ]
|
||||||
|
|
||||||
import ../[context, packages, style]
|
import ../[context, packages, style]
|
||||||
import ../components/[tag, package]
|
import ../components/[tag, package]
|
||||||
import ../utils
|
import ../lib
|
||||||
import notfound
|
import notfound
|
||||||
|
|
||||||
proc openLink(link: kstring): proc() =
|
proc openLink(link: kstring): proc() =
|
||||||
|
|
|
@ -1,14 +1,15 @@
|
||||||
import std/[algorithm, strutils, sequtils, dom]
|
import std/[algorithm, strutils, sequtils, dom, uri]
|
||||||
|
|
||||||
import karax/[kbase, karax, karaxdsl, vdom, jstrutils, kdom]
|
import karax/[kbase, karax, karaxdsl, vdom, jstrutils, kdom]
|
||||||
|
|
||||||
import ../[packages, context]
|
import ../[packages, context]
|
||||||
import ../components/[package, search]
|
import ../components/[package, search]
|
||||||
import ../utils
|
import ../lib
|
||||||
|
|
||||||
type
|
type
|
||||||
SortMethod = enum
|
# SortMethod = enum
|
||||||
smAlphabetical, smCommitAge, smVersionAge
|
# smAlphabetical, smCommitAge, smVersionAge
|
||||||
|
#
|
||||||
PageContext = object
|
PageContext = object
|
||||||
sortMethod: SortMethod = smAlphabetical
|
sortMethod: SortMethod = smAlphabetical
|
||||||
filteredPackages: seq[NimPackage]
|
filteredPackages: seq[NimPackage]
|
||||||
|
@ -52,15 +53,15 @@ proc alphabeticalPackageList(pkgs: seq[NimPackage]): VNode =
|
||||||
for pkg in packages:
|
for pkg in packages:
|
||||||
pkg.card
|
pkg.card
|
||||||
|
|
||||||
proc selectSortMethod() =
|
|
||||||
let v = getVNodeById("sort-select").getInputText
|
|
||||||
pgCtx.sortMethod = SortMethod(parseInt(v))
|
|
||||||
|
|
||||||
proc sortSelector(): VNode =
|
proc sortSelector(): VNode =
|
||||||
buildHtml(tdiv(class = "flex items-center")):
|
buildHtml(tdiv(class = "flex items-center")):
|
||||||
label(`for` = "sort-select"): text "sort:"
|
label(`for` = "sort-select"): text "sort:"
|
||||||
select(class = "bg-ctp-crust rounded p-3", name = "sort",
|
select(
|
||||||
`id` = "sort-select", onChange = selectSortMethod):
|
class = "bg-ctp-crust rounded p-3",
|
||||||
|
name = "sort",
|
||||||
|
`id` = "sort-select",
|
||||||
|
onChange = getSearchInput
|
||||||
|
):
|
||||||
for i, msg in ["alphabetical", "recent commit", "recent version"]:
|
for i, msg in ["alphabetical", "recent commit", "recent version"]:
|
||||||
if i == ord(pgCtx.sortMethod):
|
if i == ord(pgCtx.sortMethod):
|
||||||
option(value = ($i).cstring, selected = ""): text msg
|
option(value = ($i).cstring, selected = ""): text msg
|
||||||
|
@ -89,8 +90,22 @@ proc filteredPackagesDom(): VNode =
|
||||||
for pkg in pgCtx.filteredPackages:
|
for pkg in pgCtx.filteredPackages:
|
||||||
pkg.card
|
pkg.card
|
||||||
|
|
||||||
|
# TODO: combine with 'getSearchFromUri'
|
||||||
|
proc getSortMethodFromUri*(): SortMethod =
|
||||||
|
result = smAlphabetical
|
||||||
|
var url = currentUri()
|
||||||
|
for k, v in decodeQuery(url.query):
|
||||||
|
if k == "sort":
|
||||||
|
case v
|
||||||
|
of "commit":
|
||||||
|
result = smCommitAge
|
||||||
|
of "version":
|
||||||
|
result = smVersionAge
|
||||||
|
else: discard
|
||||||
|
|
||||||
proc update(pgCtx: var PageContext) =
|
proc update(pgCtx: var PageContext) =
|
||||||
pgCtx.filteredPackages = nimpkgsList()
|
pgCtx.filteredPackages = nimpkgsList()
|
||||||
|
pgCtx.sortMethod = getSortMethodFromUri()
|
||||||
pgCtx.search = getSearchFromUri()
|
pgCtx.search = getSearchFromUri()
|
||||||
pgCtx.filteredPackages = searchPackages(parseQuery(pgCtx.search))
|
pgCtx.filteredPackages = searchPackages(parseQuery(pgCtx.search))
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue