java rewrite

This commit is contained in:
2022-06-03 23:59:59 +08:00
parent 76608d5713
commit b59dcfd93c
68 changed files with 2218 additions and 1769 deletions

View File

@@ -9,7 +9,7 @@ from sequtils import map, apply
var pkgMap : JsonNode
const serverURL {.strdefine.}: string = "http://woggioni.net/jpacrepo/"
const serverURL {.strdefine.}: string = ""
proc last[T](s : seq[T]) : T = s[s.len - 1]
proc formatByteSize(size : BiggestInt) : string = size.float64.formatEng(precision=1, siPrefix=true, unit = "B")
@@ -73,6 +73,7 @@ proc newDownloadPanel(parent : Element) : DownloadPanel =
let tf= document.createElement("input")
tf.setAttribute("name", "pkgs")
let txt = sequtils.foldl(pkglist, a & " " & b)
echo txt
tf.value(txt)
form.appendChild(tf)
document.body.appendChild(form)
@@ -123,16 +124,18 @@ proc addPkg(dp : DownloadPanel, pkgfile : string) =
req.send()
dp.updateBadge
proc readTableRow(row : Element) : JsonNode =
proc readTableRow(arch : string, row : Element) : JsonNode =
let pkgname = $row.querySelector("td:nth-child(2)").textContent
let version = $row.querySelector("td:nth-child(3) button").textContent
let arch = $row.querySelector("td:nth-child(4) button").textContent
pkgMap[pkgname][version][arch]
let filename = $row.querySelector("td:nth-child(4) button").textContent
for candidate in pkgMap[arch][pkgname][version]:
if filename == candidate["filename"].getStr:
return candidate
proc createDropdown(parent : Element, data :seq[string], onchange : proc(value : string)) =
htmlTreeAppend(parent):
"div":
"span":
var button : Element
classList = ["dropdown"]
"button":
@@ -158,18 +161,18 @@ proc createDropdown(parent : Element, data :seq[string], onchange : proc(value :
type PkgTable = ref object
addButton : Element
proc newPkgTable(parent: Element, searchString : string) : PkgTable =
proc newPkgTable(parent: Element, arch: string, searchString : string, addButtonCallback : proc(e : Event)) : PkgTable =
var pkgtable = PkgTable()
var fragments = newSeq[string]()
for fragment in searchString.splitWhitespace():
fragments.add(fragment)
var searchResult = newOrderedTable[string, JsonNode]()
for key, value in pkgMap:
for key, value in pkgMap[arch]:
for fragment in fragments:
if fragment in key:
searchResult[key] = value
for table in document.querySelectorAll("table.pkgtable"):
table.parentNode.removeChild(table)
for node in parent.querySelectorAll("table.pkgtable"):
parent.removeChild(node)
htmlTreeAppend(parent):
"table":
classList = ["table", "table-striped","pkgtable"]
@@ -190,21 +193,22 @@ proc newPkgTable(parent: Element, searchString : string) : PkgTable =
"th":
text = "Version"
"th":
text = "Arch"
text = "File name"
"th":
text = "Installed size"
"tbody":
cb:
var i = 0
for name, versions in searchResult:
for name, versions in searchResult.mpairs:
closureScope:
htmlTreeAppend(elem):
"tr":
var row : Element
var archCell : Element
var fileNameCell : Element
var sizeCell : Element
let size_change_callback = proc(newValue : string) =
sizeCell.textContent = readTableRow(row)["size"].getInt.formatByteSize
sizeCell.textContent = readTableRow(arch, row)["size"].getInt.formatByteSize
"td":
"div":
@@ -221,36 +225,46 @@ proc newPkgTable(parent: Element, searchString : string) : PkgTable =
data.add(version)
let vs = versions
let change_callback = proc(newValue : string) =
archCell.removeChildren()
fileNameCell.removeChildren()
var newdata = newSeq[string]()
for arch, pkgname in vs[newValue]:
newdata.add(arch)
createDropdown(archCell, newdata, size_change_callback)
createDropdown(fileNameCell, newdata, size_change_callback)
size_change_callback(newValue)
createDropdown(elem, data, change_callback)
"td":
cb:
archCell = elem
fileNameCell = elem
var data = newSeq[string]()
var arches : JsonNode
for v, a in versions:
arches = a
var files : JsonNode
for v, f in versions:
files = f
break
for arch, pkgname in arches:
data.add(arch)
for file in files:
data.add(file["filename"].getStr)
createDropdown(elem, data, size_change_callback)
"td":
cb:
sizeCell = elem
for v, arches in versions:
for key, value in arches:
elem.textContent = value["size"].getInt.formatByteSize
for v, files in versions:
for file in files:
elem.textContent = file["size"].getInt.formatByteSize
return
cb:
row = elem
pkgtable.addButton.addEventListener("click", addButtonCallback)
pkgtable
var selectedArch : string
var archButtons : Element
var table : Element
var searchString : string
var add2DownloadList : proc(e : Event)
proc updateTable(e : Event) =
if pkgMap.len == 0 or searchString.len < 2: return
discard newPkgTable(table, selectedArch, searchString, add2DownloadList)
var dp : DownloadPanel
# var pkgTable : PkgTable
htmlTreeappend document.body:
@@ -264,7 +278,6 @@ htmlTreeappend document.body:
# "z-index" : "-10"
# }
"div":
var table : Element
style = {"background-color" : "rgba(255, 255, 255, 0.25)"}
classList = ["container"]
"div":
@@ -291,17 +304,15 @@ htmlTreeappend document.body:
classList = ["form-control"]
attrs = {"type" : "text"}
cb :
proc add2DownloadList(e : Event) =
add2DownloadList = proc(e : Event) =
let rows = table.querySelectorAll("tbody tr")
for row in rows:
let cbox = row.querySelector("td:first-child input")
if cbox.checked:
dp.addPkg(readTableRow(row)["filename"].getStr)
proc oninput(e : Event) =
if pkgMap.len == 0 or elem.value.len < 2: return
let pkgtable = newPkgTable(table, $elem.value)
pkgtable.addButton.addEventListener("click", add2DownloadList)
elem.addEventListener("input", oninput)
dp.addPkg(readTableRow(selectedArch, row)["filename"].getStr)
oninput:
searchString = $elem.value
updateTable(event)
"div":
classList = ["row"]
"div":
@@ -309,6 +320,11 @@ htmlTreeappend document.body:
cb:
dp = newDownloadPanel(elem)
"div":
"div":
classList = ["btn-group", "btn-group-justified"]
attrs = { "role" : "group" }
cb:
archButtons = elem
classList = ["col-sm-9"]
cb:
table = elem
@@ -317,7 +333,42 @@ htmlTreeappend document.body:
let r = newXMLHTTPRequest()
let load_cb = proc(e : Event) =
pkgMap = parseJson($r.responseText)
pkgMap = parseJson($r.responseText)
var buttons = newSeq[Element]()
var index = 0
for arch in pkgMap.keys:
closureScope:
htmlTreeAppend(archButtons):
"div":
classList = ["btn-group"]
attrs = { "role" : "group"}
"button":
classList = ["btn", "btn-default"]
attrs = {
"type": "button",
}
text = arch
let thisButtonIndex = index
let thisButtonArch = arch
onclick:
let update = thisButtonArch != selectedArch
selectedArch = thisButtonArch
for i in 0..<buttons.len:
let btn = buttons[i]
if(i == thisButtonIndex):
btn.classList.toggle("active")
else:
btn.classList.remove("active")
if update:
updateTable(event)
cb:
buttons.add(elem)
if index == 0:
selectedArch = arch
elem.classList.add("active")
inc(index)
# createDropdown(archDropDown, data, arch_change_callback)
r.addEventListener("load", load_cb)
r.open("get", serverURL & "api/pkg/map")
r.setRequestHeader("Accept", "application/json")