java rewrite
This commit is contained in:
@@ -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")
|
||||
|
Reference in New Issue
Block a user