added download button

This commit is contained in:
2017-09-25 09:04:36 +02:00
parent 3ba670a52f
commit e76662ec89
3 changed files with 37 additions and 17 deletions

View File

@@ -7,13 +7,13 @@ import strutils
import sets import sets
from sequtils import map, apply from sequtils import map, apply
var pkgMap : OrderedTable[string, JsonNode] var pkgMap : JsonNode
type DownloadPanel = ref object type DownloadPanel = ref object
badge : Node badge : Node
listgroup : Node listgroup : Node
pkgs : HashSet[string] pkgs : HashSet[string]
body : Node footer : Node
proc newDownloadPanel(parent : Node) : DownloadPanel = proc newDownloadPanel(parent : Node) : DownloadPanel =
let dp = DownloadPanel() let dp = DownloadPanel()
@@ -26,7 +26,6 @@ proc newDownloadPanel(parent : Node) : DownloadPanel =
"h3": "h3":
class ["panel-title"] class ["panel-title"]
"a": "a":
#attrs {"data-toggle": "collapse", "href": "#dlist"}
text "Package list " text "Package list "
"span": "span":
class ["badge", "pull-right"] class ["badge", "pull-right"]
@@ -39,7 +38,7 @@ proc newDownloadPanel(parent : Node) : DownloadPanel =
cb: cb:
dp.listgroup = node dp.listgroup = node
"div": "div":
class ["panel-body"] class ["panel-footer"]
style { style {
"text-align" : "right", "text-align" : "right",
"display" :"none" "display" :"none"
@@ -51,14 +50,33 @@ proc newDownloadPanel(parent : Node) : DownloadPanel =
class ["glyphicon", "glyphicon-download"] class ["glyphicon", "glyphicon-download"]
cb: cb:
node.appendChild(document.createTextNode(" Download")) node.appendChild(document.createTextNode(" Download"))
let clickHandler = proc(e : Event) =
let pkglist : seq[string] = sequtils.toSeq(dp.pkgs.items())
let r = newXMLHTTPRequest()
let load_cb = proc(e : Event) =
var blob : Blob = r.responseAsBlob #newBlob(r.response, "application/x-tar")
let anchor = document.createElement("a")
let url = createObjectURL(blob)
anchor.setAttribute("href", url)
anchor.setAttribute("download", "archive.tar")
anchor.click()
revokeObjectURL(url)
r.addEventListener("load", load_cb)
r.open("post", "rest/pkg/downloadTar")
r.responseType = "blob"
r.setRequestHeader("Accept", "application/x-tar")
r.setRequestHeader("Content-Type", "application/json")
r.send($(%*pkglist))
node.addEventListener("click", clickHandler)
cb: cb:
dp.body = node dp.footer = node
dp dp
proc updateBadge(dp : DownloadPanel) = proc updateBadge(dp : DownloadPanel) =
let st = if dp.pkgs.len() > 0: "block" else: "none" let st = if dp.pkgs.len() > 0: "block" else: "none"
dp.body.style.display = st dp.footer.style.display = st
dp.badge.style.display = st dp.badge.style.display = st
dp.badge.textContent = $dp.pkgs.len() dp.badge.textContent = $dp.pkgs.len()
@@ -257,13 +275,8 @@ htmlDocument document, document.body:
let r = newXMLHTTPRequest() let r = newXMLHTTPRequest()
let load_cb = proc(e : Event) = let load_cb = proc(e : Event) =
let response = parseJson($r.responseText) pkgMap = parseJson($r.responseText)
pkgMap = response.getFields()
# var keys = newSeq[string]()
# for key in response.getFields().keys():
# keys.add(key)
# echo keys
r.addEventListener("load", load_cb) r.addEventListener("load", load_cb)
r.open("get", "http://oggio88.soon.it/jpacrepo/rest/pkg/map") r.open("get", "rest/pkg/map")
r.setRequestHeader("Accept", "application/json") r.setRequestHeader("Accept", "application/json")
r.send() r.send()

View File

@@ -8,6 +8,7 @@ import javax.inject.Inject;
import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext; import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter; import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.Provider; import javax.ws.rs.ext.Provider;
import java.io.IOException; import java.io.IOException;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -28,7 +29,9 @@ public class CORSFilter implements ContainerResponseFilter
{ {
if (!ctx.cors_enabled) if (!ctx.cors_enabled)
{ {
containerResponseContext.getHeaders().add("Access-Control-Allow-Origin", "*"); MultivaluedMap<String, Object> headers = containerResponseContext.getHeaders();
headers.add("Access-Control-Allow-Origin", "*");
headers.add("Access-Control-Allow-Headers", "Accept, Accept-Language, Content-Language, Content-Type");
} }
} }
} }

View File

@@ -293,7 +293,6 @@ public class PacmanWebService
} }
@GET @GET
@CORSManaged
@Path("/search") @Path("/search")
public List<PkgData> searchPackage( public List<PkgData> searchPackage(
@QueryParam("name") String name, @QueryParam("name") String name,
@@ -354,6 +353,13 @@ public class PacmanWebService
return query.getResultList(); return query.getResultList();
} }
@OPTIONS
@Path("/downloadTar")
@Produces("text/plain; charset=UTF-8")
public Response options() {
return Response.ok("POST, OPTIONS").build();
}
@POST @POST
@Path("/downloadTar") @Path("/downloadTar")
@Produces("application/x-tar") @Produces("application/x-tar")
@@ -389,7 +395,6 @@ public class PacmanWebService
taos.closeArchiveEntry(); taos.closeArchiveEntry();
} }
taos.close(); taos.close();
output.close();
} }
catch (Exception e) catch (Exception e)
{ {
@@ -398,7 +403,6 @@ public class PacmanWebService
finally finally
{ {
taos.close(); taos.close();
output.close();
} }
} }
}; };