diff --git a/public/callback/main.js b/public/callback/main.js
index 395b862..ef9be74 100644
--- a/public/callback/main.js
+++ b/public/callback/main.js
@@ -11,10 +11,36 @@ window.onload = async function () {
technicalInformationTextArea.value += key + ": " + value + "\n";
});
}
+ const token = localStorage.getItem("gitlab-api-token");
+ const instanceType = parameters.get("type");
+ localStorage.setItem("instance-type", instanceType);
+ if(instanceType=="github"){
+ const owner = parameters.get("owner");
+ const repo = parameters.get("repo");
+ const artifactId = parameters.get("artifactId");
+ console.log(owner, repo, artifactId);
+ localStorage.setItem("owner", owner);
+ localStorage.setItem("repo", repo);
+ localStorage.setItem("artifactId", artifactId);
+ window.location = "../curation/";
+
+
+ }else{
+ const url = parameters.get("url");
+ const repo = parameters.get("repo");
+ const artifactId = parameters.get("artifactId");
+ console.log(url, repo, artifactId);
+ localStorage.setItem("url", url);
+ localStorage.setItem("repo", repo);
+ localStorage.setItem("artifactId", artifactId);
+ window.location = "../curation/";
+
+
+ }
- const gitLabProjectId = parameters.get("gitlab_project_id");
+ /* const gitLabProjectId = parameters.get("gitlab_project_id");
- const get_latest = parameters.get("latest");
+ let get_latest = parameters.get("latest");
const gitLabPipelineId = parameters.get("gitlab_pipeline_id");
const gitLabJobId = parameters.get("gitlab_job_id");
@@ -27,7 +53,6 @@ window.onload = async function () {
await new Promise(r => setTimeout(r, 5000));
}
- const token = localStorage.getItem("gitlab-api-token");
if (token) {
if(get_latest==1){
await latest(gitLabProjectId, token);
@@ -37,12 +62,14 @@ window.onload = async function () {
return;
} else {
alert("Please set up the GitLab connection, then go to the dashboard!");
- window.location = "../gitlab-setup/";
+ window.location = "../git-login/";
return;
- }
+ }*/
+}
+
+
-}
async function latest(projectId, token) {
const jobResponse = await fetch(
diff --git a/public/curation/curation.js b/public/curation/curation.js
index 80186cd..baf2450 100644
--- a/public/curation/curation.js
+++ b/public/curation/curation.js
@@ -5,10 +5,7 @@ import { addToBatch } from "./safe_comments.js";
* Fetches json_document and displays their contents in a table.
* @param {Path} json_document - document do fetch data from.
*/
-export function displayJSON(json_document){
- fetch(json_document)
- .then(response => response.json())
- .then(data => {
+export function displayJSON(data){
const colorPalette = ["rgb(34, 198, 227)", "purple", "rgb(23, 124, 207)", "rgb(116, 75, 196)", "pink"];
let colorPolicies = {"Curation": "red"};
if(data["policies"]){
@@ -18,10 +15,12 @@ export function displayJSON(json_document){
console.log(colorPolicies);
//Get data snippet from url
const params = new URLSearchParams(location.search);
- if(params.has("id")){
- const id = params.get("id")
- data = get_data_snippet(data, "@id", id);
-
+ if(params.size > 0){
+ for (const [key, value] of params) {
+ console.log("search for",key, value);
+ data = get_data_snippet(data, key, value);
+ }
+
//If your seeing a data snippet, create button to go back
const back = document.createElement("button");
back.innerText = "Back to Overview";
@@ -43,10 +42,15 @@ export function displayJSON(json_document){
keys.forEach(element => {
+
// Get a something with Name as p Header
if(element.toLowerCase().includes("name")){
+ if(!Array.isArray(data[element])){
+ document.getElementById("project-name").innerHTML = element.charAt(0).toUpperCase() + element.slice(1) +' '+data[element]+'';
+ }else{
document.getElementById("project-name").innerHTML = element.charAt(0).toUpperCase() + element.slice(1) +' '+data[element][0]+'';
- }
+ }
+ }
// Apply and fill in the template for Policies
if(element=="policies"){
header.style.display = "block";
@@ -107,14 +111,18 @@ export function displayJSON(json_document){
const slcomment = mvalue.querySelector("#single-line-comment"),
slcommentPopup = mvalue.querySelector("#single-line-comment-popup");
const input = mvalue.querySelector("#comment");
- mvalue.querySelector('input[type="submit"]').addEventListener("click", () => {
- addToBatch(element, data[element], input.value);
- });
- slcomment.addEventListener('click', (event)=>{
+ slcomment.addEventListener('click', (event)=>{
event.stopPropagation();
- console.log("clicked");
+ if (event.target !== slcomment) {
+ return;
+ }
slcommentPopup.style.visibility = "visible";
})
+ mvalue.querySelector('input[type="submit"]').addEventListener("click", () => {
+ addToBatch(element, data[element], input.value);
+ slcommentPopup.style.visibility = "hidden";
+ });
+
document.addEventListener('click', function(e) {
if ( slcommentPopup.style.visibility === "visible" && !slcommentPopup.contains(e.target) ) {
slcommentPopup.style.visibility = "hidden";
@@ -122,7 +130,7 @@ export function displayJSON(json_document){
})
})
- })
+
//Extend Checkbox for metadata source
const checkbox = document.querySelector("#extended");
checkbox.addEventListener('change', (event)=>{
@@ -152,9 +160,15 @@ function get_data_snippet(data, skey, svalue){
const obj = stack.pop();
for(let i=0; i {
+ if(!Array.isArray(e[k]) && typeof e[k] === "string"){
+ e[k] = [e[k]];
+ }
+ })
+
const text = document.createTextNode(`${e.familyName[0]}, ${e.givenName[0]} `);
tooltiptag.appendChild(document.createTextNode("See Details"));
tooltiptag.appendChild(document.createElement("br"));
@@ -75,6 +81,12 @@ function extract_info(cell, obj, tag, colorPolicies){
if(!Array.isArray(e[k])){
for (let key in e[k]) {
const pair_in_list = document.createElement("p");
+ if(!Array.isArray(e[k][key]) && typeof e[k][key] === "string"){
+ names.push(`${k}:${key}: ${e[k][key]}`);
+ pair_in_list.appendChild(document.createTextNode(`${k}:${key}: ${e[k][key]}`));
+
+ }
+ else{
names.push(`${k}:${key}: ${e[k][key][0]}`);
pair_in_list.appendChild(document.createTextNode(`${k}:${key}: ${e[k][key][0]}`));
if(e[k][key][2] && e[k][key][2]["conflict"]){
@@ -82,7 +94,7 @@ function extract_info(cell, obj, tag, colorPolicies){
tooltiptag.style.color = colorPolicies[e[k][key][2]["conflict"]];
hasConfict = true;
- }
+ }}
pair.appendChild(pair_in_list);
}
}else{
@@ -105,7 +117,18 @@ function extract_info(cell, obj, tag, colorPolicies){
}
function link_to_person(data){
- window.location.href += `?id=${data["@id"][0]}`;
+ if(data["@id"]){
+ if(!Array.isArray(data["@id"])){
+ data["@id"] = [data["@id"]];
+ }
+ window.location.href += `?@id=${data["@id"][0]}`;
+ }else{
+ if(!Array.isArray(data["familyName"])){
+ data["familyName"] = [data["familyName"]];
+ }
+ window.location.href += `?familyName=${data["familyName"][0]}`;
+ }
+
}
export {extract_info};
diff --git a/public/curation/github_artifacts.js b/public/curation/github_artifacts.js
new file mode 100644
index 0000000..7caa3f4
--- /dev/null
+++ b/public/curation/github_artifacts.js
@@ -0,0 +1,70 @@
+import { BlobReader, TextWriter, ZipReader } from "https://cdn.jsdelivr.net/npm/@zip.js/zip.js@2.7.72/+esm";
+import { Octokit } from "https://esm.sh/@octokit/rest";
+import { displayJSON } from "./curation.js";
+
+const showDebugInformation = false;
+
+async function githubArtifacts() {
+ const token = localStorage.getItem("gitlab-api-token");
+ if (!token) {
+ alert("Please set up the GitLab connection first");
+ window.location = "../";
+ return;
+ }
+ const owner = localStorage.getItem("owner");
+ const repo = localStorage.getItem("repo");
+ const artifactId = localStorage.getItem("artifactId");
+
+ const octokit = new Octokit({
+ auth: token
+})
+
+//https://softwarepub.github.io/software-card/callback/?type=github&owner=softwarepub&repo=software-card-showcase&artifactId=7291062769
+//https://github.com/softwarepub/software-card-showcase/actions/runs/26636754684/artifacts/7290497137
+ // --- Job artifacts ---
+const artifact = await octokit.request(`GET /repos/${owner}/${repo}/actions/artifacts/${artifactId}/zip`, {
+ owner: `${owner}`,
+ repo: `${repo}`,
+ artifact_id: `${artifactId}`,
+ archive_format: 'zip',
+ headers: {
+ 'X-GitHub-Api-Version': '2026-03-10'
+ }
+})
+if (artifact.status !== 200) {
+ alert("Fetching artifacts failed");
+ }
+
+
+const response = await fetch(artifact.url);
+
+
+ // this is a zip file :-(
+ const artifactsData = await response.blob();
+
+
+ const zipFileReader = new BlobReader(artifactsData);
+ const zipReader = new ZipReader(zipFileReader);
+ const fileEntries = await zipReader.getEntries();
+
+
+ do {
+ var fileEntry = fileEntries.shift();
+ if (showDebugInformation) {
+ console.log(fileEntry);
+ }
+ } while (fileEntry["filename"] != "hermes.json");
+
+ const reportWriter = new TextWriter();
+ const reportText = await fileEntry.getData(reportWriter);
+ await zipReader.close();
+
+ console.log(reportText);
+ displayJSON(JSON.parse(reportText)["curate"]);
+
+ //const reportContentsTextArea = document.getElementById("report-contents");
+ //reportContentsTextArea.value = reportText;
+
+};
+
+export {githubArtifacts};
\ No newline at end of file
diff --git a/public/curation/gitlab_artifacts.js b/public/curation/gitlab_artifacts.js
new file mode 100644
index 0000000..c08488f
--- /dev/null
+++ b/public/curation/gitlab_artifacts.js
@@ -0,0 +1,57 @@
+import { BlobReader, TextWriter, ZipReader } from "https://cdn.jsdelivr.net/npm/@zip.js/zip.js@2.7.72/+esm";
+import { displayJSON } from "./curation.js";
+
+const showDebugInformation = false;
+
+async function gitlabArtifacts () {
+ const token = localStorage.getItem("gitlab-api-token");
+ if (!token) {
+ alert("Please set up the GitLab connection first!");
+ window.location = "../";
+ return;
+ }
+
+ const url = localStorage.getItem("url");
+ const repo = localStorage.getItem("repo");
+ const artifactId = localStorage.getItem("artifactId");
+
+ //https://softwarepub.github.io/software-card/callback?type=gitlab&url=https://codebase.helmholtz.cloud&repo=21313&artifactId=3159194
+
+ // --- Job artifacts ---
+
+ const jobArtifactsResponse = await fetch(
+ `https://codebase.helmholtz.cloud/api/v4/projects/${repo}/jobs/${artifactId}/artifacts`,
+ { headers: { "Content-Type": "application/json", "PRIVATE-TOKEN": token } }
+ );
+
+ if (!jobArtifactsResponse.ok) {
+ alert("Fetching artifacts failed");
+ return;
+ }
+ console.log(jobArtifactsResponse);
+
+ // this is a zip file :-(
+ const artifactsData = await jobArtifactsResponse.blob();
+
+ const zipFileReader = new BlobReader(artifactsData);
+ const zipReader = new ZipReader(zipFileReader);
+ const fileEntries = await zipReader.getEntries();
+
+ do {
+ var fileEntry = fileEntries.shift();
+ if (showDebugInformation) {
+ console.log(fileEntry);
+ }
+ } while (fileEntry["filename"] != ".hermes/curate/hermes.json");
+
+ const reportWriter = new TextWriter();
+ const reportText = await fileEntry.getData(reportWriter);
+ await zipReader.close();
+
+
+ console.log(reportText);
+ displayJSON(JSON.parse(reportText));
+
+}
+
+ export {gitlabArtifacts};
\ No newline at end of file
diff --git a/public/curation/safe_comments.js b/public/curation/safe_comments.js
index d386673..76d4f45 100644
--- a/public/curation/safe_comments.js
+++ b/public/curation/safe_comments.js
@@ -1,5 +1,6 @@
import { addComment } from '../modules/storage.js'
export async function addToBatch(value, data, comment){
+ //TODO: Value is first of string right now
addComment(value, data, comment);
}
diff --git a/public/curation/script.js b/public/curation/script.js
index 41f9d41..4c878d3 100644
--- a/public/curation/script.js
+++ b/public/curation/script.js
@@ -1,6 +1,7 @@
import {drawHexagon, drawRadar } from "../radar.js";
import { displayJSON } from "./curation.js";
-
+import { githubArtifacts } from "./github_artifacts.js";
+import { gitlabArtifacts } from "./gitlab_artifacts.js";
//Draw radar plot
const canvas = document.getElementById('radar');
@@ -16,4 +17,14 @@ drawRadar(ctx, canvas.offsetWidth/2,canvas.offsetHeight/2, [15,15,10,15,15,12],
drawRadar(ctx, canvas.offsetWidth/2,canvas.offsetHeight/2, [20,20,9,10,20,15], "blue", "rgba(94, 148, 215, 0.34)");
//View for Curation
-displayJSON("../.hermes/process/transport.json");
+const type = localStorage.getItem("instance-type");
+if(type=="github"){
+ githubArtifacts();
+}else if(type=="gitlab"){
+ gitlabArtifacts();
+}else{
+ fetch("../.hermes/process/transport.json")
+ .then(response => response.json())
+ .then(data => {
+ displayJSON(data);})
+}
\ No newline at end of file
diff --git a/public/curation/send_report.js b/public/curation/send_report.js
index 1ed4172..0e7f465 100644
--- a/public/curation/send_report.js
+++ b/public/curation/send_report.js
@@ -30,7 +30,7 @@ ${comment.comment}
const username = User.getUsername();
const platform = User.getGitPlatform();
console.log(platform);
- var [projectId, pipelineId, jobId] = await retrievePipeline();
+ const projectId = localStorage.getItem("repo");
if(platform.host == "github"){
issueGithub(token, username, message);
}else{
@@ -56,20 +56,22 @@ const response = await fetch(
);
const data = await response.json();
+ alert("Send to GitLab");
}
async function issueGithub(token, username, message){
+ const owner = localStorage.getItem("owner");
+ const repo = localStorage.getItem("repo");
//TODO Test for Github
const octokit = new Octokit({
auth: token
})
try{
- await octokit.request('POST /repos/SKernchen/SoftwareCaRD-Test/issues', {
- owner: `${username}`,
- repo: 'SoftwareCaRD-test',
+ await octokit.request(`POST /repos/${owner}/${repo}/issues`, {
+ owner: `${owner}`,
+ repo: `${repo}`,
title: `Curation Report`,
- labels: ['curation'],
body: message,
headers: {
'X-GitHub-Api-Version': '2022-11-28'
diff --git a/public/style.css b/public/style.css
index 9449a16..6ef05a8 100644
--- a/public/style.css
+++ b/public/style.css
@@ -275,10 +275,11 @@ border-color: transparent transparent #555 transparent;
position: absolute;
visibility: hidden;
background-color: #bababa;
+ color: white;
padding: 5px;
border-radius: 12px;
- top: 17px;
- left: -250px;
+ top: 25px;
+ left: -300%;
z-index: 1;
}
.single-line-comment-popup::after {
@@ -292,6 +293,15 @@ border-width: 5px;
border-style: solid;
border-color: transparent transparent #bababa transparent;
}
+.single-line-comment-popup [type=submit] {
+ top: 100%;
+ border-radius: 12px;
+ background-color: rgb(23, 124, 207) ;
+ color: white;
+ border-color: white;
+ padding: 4px;
+ margin-top: 5px;
+}
input[type=text]{
width:500px;