Loading vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/client/VOSpaceClient.java +0 −1 Original line number Diff line number Diff line Loading @@ -24,7 +24,6 @@ import java.net.http.HttpResponse; import java.net.http.HttpResponse.BodyHandlers; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Scanner; import java.util.concurrent.CompletionException; import java.util.concurrent.ForkJoinPool; Loading vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/NodesController.java +16 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; import net.ivoa.xml.uws.v1.JobSummary; import net.ivoa.xml.vospace.v2.ContainerNode; import net.ivoa.xml.vospace.v2.Node; import net.ivoa.xml.vospace.v2.Property; Loading Loading @@ -134,6 +135,21 @@ public class NodesController extends BaseController { return ResponseEntity.noContent().build(); } @PostMapping(value = "/move") public void moveNode(@RequestBody Map<String, Object> params) { String target = getRequiredParam(params, "target"); String direction = getRequiredParam(params, "direction"); Transfer transfer = new Transfer(); transfer.setTarget(target); transfer.setDirection(direction); JobSummary job = client.startTransferJob(transfer); // TODO: polling } protected String getPath(String prefix) { String requestURL = servletRequest.getRequestURL().toString(); return NodeUtils.getPathFromRequestURLString(requestURL, prefix); Loading vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/service/NodesHtmlGenerator.java +25 −7 Original line number Diff line number Diff line Loading @@ -130,18 +130,36 @@ public class NodesHtmlGenerator { private void addActionsCell(NodeInfo nodeInfo, Element row) { Element cell = row.appendElement("td"); Element dotsMenu = cell.appendElement("span"); dotsMenu.attr("class", "dots-menu icon dots-menu-icon pointer"); Element dropdown = dotsMenu.appendElement("span"); dropdown.attr("class", "dots-menu-content dropdown-menu"); String nodePathJs = makeJsArg(nodeInfo.getPath()); if (nodeInfo.isWritable()) { Element shareIcon = cell.appendElement("span"); shareIcon.attr("class", "icon share-icon pointer"); shareIcon.attr("onclick", "shareNode(" + makeJsArg(nodeInfo.getPath()) Element shareBtn = dropdown.appendElement("button"); shareBtn.text("Share"); shareBtn.attr("type", "button"); shareBtn.attr("class", "dropdown-item"); shareBtn.attr("onclick", "shareNode(" + nodePathJs + "," + makeJsArg(nodeInfo.getGroupRead()) + "," + makeJsArg(nodeInfo.getGroupWrite()) + ")"); } if (nodeInfo.isDeletable()) { cell.append(" "); Element deleteIcon = cell.appendElement("span"); deleteIcon.attr("class", "icon trash-icon pointer"); deleteIcon.attr("onclick", "deleteNode(" + makeJsArg(nodeInfo.getPath()) + ")"); Element renameBtn = dropdown.appendElement("button"); renameBtn.text("Rename"); renameBtn.attr("type", "button"); renameBtn.attr("class", "dropdown-item"); renameBtn.attr("onclick", "renameNode(" + nodePathJs + ")"); Element deleteBtn = dropdown.appendElement("button"); deleteBtn.text("Delete"); deleteBtn.attr("type", "button"); deleteBtn.attr("class", "dropdown-item"); deleteBtn.attr("onclick", "deleteNode(" + nodePathJs + ")"); } } Loading vospace-ui-frontend/src/App.vue +31 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,19 @@ export default { self.$store.dispatch('checkJobs'); } }, 1000); // Add event listener for dots menus document.addEventListener('click', function(event) { if (event.target.classList.contains('dots-menu')) { event.target.classList.toggle('active') } else { if (event.target.closest('.dots-menu') === null) { for (let menu of document.querySelectorAll('.dots-menu')) { menu.classList.remove('active'); } } } }); } } </script> Loading Loading @@ -111,4 +124,22 @@ export default { .node-busy+.icon { margin-right: 3px; } .dots-menu { position: relative; } .dots-menu-content { display: none; position: absolute; /*background-color: #f9f9f9; min-width: 160px; box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); padding: 12px 16px; z-index: 1;*/ } .dots-menu.active .dots-menu-content { display: block; } </style> vospace-ui-frontend/src/api/server/index.js +12 −0 Original line number Diff line number Diff line Loading @@ -180,5 +180,17 @@ export default { }, data }, true, true); }, moveNode(data) { let url = BASE_API_URL + 'move'; return apiRequest({ method: 'POST', url: url, withCredentials: true, headers: { 'Cache-Control': 'no-cache' }, data }, true, true); } } Loading
vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/client/VOSpaceClient.java +0 −1 Original line number Diff line number Diff line Loading @@ -24,7 +24,6 @@ import java.net.http.HttpResponse; import java.net.http.HttpResponse.BodyHandlers; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Scanner; import java.util.concurrent.CompletionException; import java.util.concurrent.ForkJoinPool; Loading
vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/NodesController.java +16 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; import net.ivoa.xml.uws.v1.JobSummary; import net.ivoa.xml.vospace.v2.ContainerNode; import net.ivoa.xml.vospace.v2.Node; import net.ivoa.xml.vospace.v2.Property; Loading Loading @@ -134,6 +135,21 @@ public class NodesController extends BaseController { return ResponseEntity.noContent().build(); } @PostMapping(value = "/move") public void moveNode(@RequestBody Map<String, Object> params) { String target = getRequiredParam(params, "target"); String direction = getRequiredParam(params, "direction"); Transfer transfer = new Transfer(); transfer.setTarget(target); transfer.setDirection(direction); JobSummary job = client.startTransferJob(transfer); // TODO: polling } protected String getPath(String prefix) { String requestURL = servletRequest.getRequestURL().toString(); return NodeUtils.getPathFromRequestURLString(requestURL, prefix); Loading
vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/service/NodesHtmlGenerator.java +25 −7 Original line number Diff line number Diff line Loading @@ -130,18 +130,36 @@ public class NodesHtmlGenerator { private void addActionsCell(NodeInfo nodeInfo, Element row) { Element cell = row.appendElement("td"); Element dotsMenu = cell.appendElement("span"); dotsMenu.attr("class", "dots-menu icon dots-menu-icon pointer"); Element dropdown = dotsMenu.appendElement("span"); dropdown.attr("class", "dots-menu-content dropdown-menu"); String nodePathJs = makeJsArg(nodeInfo.getPath()); if (nodeInfo.isWritable()) { Element shareIcon = cell.appendElement("span"); shareIcon.attr("class", "icon share-icon pointer"); shareIcon.attr("onclick", "shareNode(" + makeJsArg(nodeInfo.getPath()) Element shareBtn = dropdown.appendElement("button"); shareBtn.text("Share"); shareBtn.attr("type", "button"); shareBtn.attr("class", "dropdown-item"); shareBtn.attr("onclick", "shareNode(" + nodePathJs + "," + makeJsArg(nodeInfo.getGroupRead()) + "," + makeJsArg(nodeInfo.getGroupWrite()) + ")"); } if (nodeInfo.isDeletable()) { cell.append(" "); Element deleteIcon = cell.appendElement("span"); deleteIcon.attr("class", "icon trash-icon pointer"); deleteIcon.attr("onclick", "deleteNode(" + makeJsArg(nodeInfo.getPath()) + ")"); Element renameBtn = dropdown.appendElement("button"); renameBtn.text("Rename"); renameBtn.attr("type", "button"); renameBtn.attr("class", "dropdown-item"); renameBtn.attr("onclick", "renameNode(" + nodePathJs + ")"); Element deleteBtn = dropdown.appendElement("button"); deleteBtn.text("Delete"); deleteBtn.attr("type", "button"); deleteBtn.attr("class", "dropdown-item"); deleteBtn.attr("onclick", "deleteNode(" + nodePathJs + ")"); } } Loading
vospace-ui-frontend/src/App.vue +31 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,19 @@ export default { self.$store.dispatch('checkJobs'); } }, 1000); // Add event listener for dots menus document.addEventListener('click', function(event) { if (event.target.classList.contains('dots-menu')) { event.target.classList.toggle('active') } else { if (event.target.closest('.dots-menu') === null) { for (let menu of document.querySelectorAll('.dots-menu')) { menu.classList.remove('active'); } } } }); } } </script> Loading Loading @@ -111,4 +124,22 @@ export default { .node-busy+.icon { margin-right: 3px; } .dots-menu { position: relative; } .dots-menu-content { display: none; position: absolute; /*background-color: #f9f9f9; min-width: 160px; box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); padding: 12px 16px; z-index: 1;*/ } .dots-menu.active .dots-menu-content { display: block; } </style>
vospace-ui-frontend/src/api/server/index.js +12 −0 Original line number Diff line number Diff line Loading @@ -180,5 +180,17 @@ export default { }, data }, true, true); }, moveNode(data) { let url = BASE_API_URL + 'move'; return apiRequest({ method: 'POST', url: url, withCredentials: true, headers: { 'Cache-Control': 'no-cache' }, data }, true, true); } }