From f549f06d019911640272d1263098b87206c94ec3 Mon Sep 17 00:00:00 2001 From: baigner <benedikt.aigner@rwth-aachen.de> Date: Tue, 14 Aug 2018 09:28:13 +0200 Subject: [PATCH] VISTOMS update: Adding design competences dynamically works now! Former-commit-id: c9f9b028ce22abc694c9059b422ee444c78aa4ed --- kadmos/vistoms/templates/VISTOMS.html | 1009 +++++++++--------- kadmos/vistoms/templates/cmdows_template.xml | 20 +- kadmos/vistoms/vistoms.py | 141 ++- 3 files changed, 588 insertions(+), 582 deletions(-) diff --git a/kadmos/vistoms/templates/VISTOMS.html b/kadmos/vistoms/templates/VISTOMS.html index 89ee0900c..573bee8bd 100644 --- a/kadmos/vistoms/templates/VISTOMS.html +++ b/kadmos/vistoms/templates/VISTOMS.html @@ -262,469 +262,14 @@ - function createNewGraph(theData, theCurrentGraph=null) + function createNewGraph(theData,aNewGraphID) { - bootbox.hideAll(); - - var html = d3.select("html") - var form_content = html.append("div").attr("class","form-content").attr("style","display:none") - var form = form_content.append("form").attr("class","form").attr("role","form") - var form_group, input; - - //Tool information - form_group = form.append("div").attr("class","form-group") - form_group.append("text").text("Name") - input = form_group.append("input") - .attr("id","graph_name") - .attr("class","form-control") - .attr("name","graph_name") - .attr("placeholder","Add a graph name here...") - //Tool information - form_group = form.append("div").attr("class","form-group") - form_group.append("text").text("Description") - input = form_group.append("input") - .attr("id","graph_description") - .attr("class","form-control") - .attr("name","graph_description") - .attr("placeholder","Add a graph description here...") - - var modal = bootbox.dialog({ - message: $(".form-content").html(), - title: "Create new graph", - size: "large", - buttons: [ - { - label: "Cancel", - className: "btn btn-default pull-left", - callback: function() { - modal.modal("hide"); - d3.selectAll(".form-content").remove(); - } - }, - { - label: "OK", - className: "btn btn-primary pull-left", - callback: function() { - - //get form data - var graph_name = $('form #graph_name').val(); - var graph_description = $('form #graph_description').val(); - - - var bootboxContent = {title: "Create new graph", message: '<p>Please be patient...</p>'}; - var xhr = $.ajax({ - type: 'POST', - url: '/kadmos_create_new_graph', - data: {'graph_name':graph_name, 'graph_description':graph_description}, - success: function(result) - { - if (result.includes("ERROR:")) - { - bootboxContent.message = result - kadmosErrorMessage(bootboxContent); - } - else - { - var updatedData = {}; - if (theData != "REP__GRAPH_DATA__REP") - { - updatedData = theData; - var graphData = JSON.parse(result); - updatedData.graphs.push(graphData.graphs[0]); - } - else - { - updatedData = JSON.parse(result); - } - - clearView(); - makeKadmosMenu(updatedData); - mainPage(); - - bootboxContent.message = "Success!" - kadmosSuccessMessage(bootboxContent) - } - }, - error: function(result) - { - bootboxContent.message = result - kadmosErrorMessage(bootboxContent); - } - }); - kadmosHavePatience(xhr, bootboxContent) - modal.modal("hide"); - d3.selectAll(".form-content").remove(); - } - } - ], - onEscape: function() { - modal.modal("hide"); - d3.selectAll(".form-content").remove(); - } - }); - - } - - - //aigner: HIER WEITER!!! - function addDesignCompetence(theData, theCurrentGraph=null) - { - console.log(data) - bootbox.hideAll(); - - var html = d3.select("html") - var form_content = html.append("div").attr("class","form-content").attr("style","display:none") - var form = form_content.append("form").attr("class","form").attr("role","form") - var form_group, input; - - //Tool information - form_group = form.append("div").attr("class","form-group") - form_group.append("text").text("Name") - input = form_group.append("input") - .attr("id","function_node") - .attr("class","form-control") - .attr("name","function_node") - .attr("placeholder","Add a tool name here...") - //Tool input xml - form_group = form.append("div").attr("class","form-group") - form_group.append("text").text("Tool input XML") - input = form_group.append("input") - .attr("type","file") - .attr("id","input_xml") - .attr("name","input_xml") - //Tool output xml - form_group = form.append("div").attr("class","form-group") - form_group.append("text").text("Tool output XML") - input = form_group.append("input") - .attr("type","file") - .attr("id","output_xml") - .attr("name","output_xml") - - - var modal = bootbox.dialog({ - message: $(".form-content").html(), - title: "Add design competence", - size: "large", - buttons: [ - { - label: "Cancel", - className: "btn btn-default pull-left", - callback: function() { - modal.modal("hide"); - d3.selectAll(".form-content").remove(); - } - }, - { - label: "OK", - className: "btn btn-primary pull-left", - callback: function() { - - //get form data - var form_data = { - function_node: $('form #function_node').val(), - input_nodes_xPath: $('form #input_nodes_xPath').val(), - input_nodes_name: $('form #input_nodes_name').val(), - output_node_xPath: $('form #output_node_xPath').val(), - equation: $('form #equation').val(), - language: $('form #language').val() - } - - - var bootboxContent = {title: "Add design competence", message: '<p>Please be patient...</p>'}; - var xhr = $.ajax({ - type: 'POST', - url: '/kadmos_add_design_competence', - data: {'graphID':graphID, 'currentOrder':nodeOrder, 'form_data':JSON.stringify(form_data)}, - success: function(result) - { - if (result.includes("ERROR:")) - { - bootboxContent.message = result - kadmosErrorMessage(bootboxContent); - } - else - { - var updatedData = {}; - updatedData = theData; - var graphData = JSON.parse(result); - for (var i = 0; i < updatedData.graphs.length; i++) - { - if (graphID == updatedData.graphs[i].id) - { - updatedData.graphs[i] = graphData.graphs[0]; - } - } - - clearView(); - makeKadmosMenu(updatedData); - xdsm_script(updatedData,graphID); - - bootboxContent.message = "Success!" - kadmosSuccessMessage(bootboxContent) - } - }, - error: function(result) - { - bootboxContent.message = result - kadmosErrorMessage(bootboxContent); - } - }); - kadmosHavePatience(xhr, bootboxContent) - kadmosHavePatience(xhr, bootboxContent) - modal.modal("hide"); - d3.selectAll(".form-content").remove(); - - //aigner: After the competence has been added, add metadata for the competence - addDCMetadata(data,theCurrentGraph) - } - } - ], - onEscape: function() { - modal.modal("hide"); - d3.selectAll(".form-content").remove(); - } - }); - - } - - //aigner: HIER WEITER!!! --> Add contacts if not already existing - function addDCMetadata(theData, theCurrentGraph, aNode=null) - { - bootbox.hideAll(); - - var metadata; - if (aNode != null) - { - metadata = aNode.metadata; - } - - var html = d3.select("html") - var form_content = html.append("div").attr("class","form-content").attr("style","display:none") - var form = form_content.append("form").attr("class","form").attr("role","form") - var form_group, input; - - //General information - form_group = form.append("div").attr("class","form-group") - form_group.append("label").text("General information") - form_group = form.append("div").attr("class","form-group") - form_group.append("text").text("Description") - input = form_group.append("textarea") - .attr("id","description") - .attr("class","form-control") - .attr("name","description") - .attr("placeholder","Add a description for the DC here") - - form_group = form.append("div").attr("class","form-group") - form_group.append("text").text("Status") - input = form_group.append("select").attr("id","status").style("margin-left","5px") - input.append("option").attr("type","select").attr("value","-").text("Please select...") - input.append("option").attr("type","select").attr("value","Available").text("Available") - input.append("option").attr("type","select").attr("value","N/A").text("N/A") - var contacts = [] - if (theCurrentGraph.organization.contacts){contacts=theCurrentGraph.organization.contacts}; - console.log(theCurrentGraph) - form_group = form.append("div").attr("class","form-group") - form_group.append("text").text("Owner") - input = form_group.append("select").attr("id","owner_uid").style("margin-left","5px") - input.append("option").attr("type","select").attr("value","-").text("Please select...") - contacts.forEach(function(contact){ - input.append("option").attr("type","select").attr("value",contact.attrib.uID).text(contact.name + " (" + contact.company + ")") - }) - form_group = form.append("div").attr("class","form-group") - form_group.append("text").text("Creator") - input = form_group.append("select").attr("id","creator_uid").style("margin-left","5px") - input.append("option").attr("type","select").attr("value","-").text("Please select...") - contacts.forEach(function(contact){ - input.append("option").attr("type","select").attr("value",contact.attrib.uID).text(contact.name + " (" + contact.company + ")") - }) - form_group = form.append("div").attr("class","form-group") - form_group.append("text").text("Operator") - input = form_group.append("select").attr("id","operator_uid").style("margin-left","5px") - input.append("option").attr("type","select").attr("value","-").text("Please select...") - contacts.forEach(function(contact){ - input.append("option").attr("type","select").attr("value",contact.attrib.uID).text(contact.name + " (" + contact.company + ")") - }) - - //Information on tool execution - form_group = form.append("div").attr("class","form-group").style("margin-top","40px") - form_group.append("label").text("Execution information") - form_group = form.append("div").attr("class","form-group") - form_group.append("text").text("Operating System") - input = form_group.append("select").attr("id","operating_system").style("margin-left","5px") - input.append("option").attr("type","select").attr("value","-").text("Please select...") - input.append("option").attr("type","select").attr("value","windows").text("Windows") - input.append("option").attr("type","select").attr("value","linux").text("Linux") - input.append("option").attr("type","select").attr("value","mac").text("Mac OS") - input.append("option").attr("type","select").attr("value","other").text("Other") - form_group = form.append("div").attr("class","form-group") - form_group.append("text").text("Integration platform") - input = form_group.append("input") - .attr("id","integration_platform") - .attr("class","form-control") - .attr("name","integration_platform") - .attr("placeholder","Integration platform (e.g. RCE, Optimus)") - form_group = form.append("div").attr("class","form-group") - form_group.append("text").text("Execution command") - input = form_group.append("textarea") - .attr("id","command") - .attr("class","form-control") - .attr("cols","40") - .attr("rows","5") - .attr("name","command") - .attr("placeholder","Execution command") - form_group = form.append("div").attr("class","form-group") - input = form_group.append("input") - .attr("id","description_cmd") - .attr("class","form-control") - .attr("name","description_cmd") - .attr("placeholder","Details on the exectuion command (optional)") - form_group = form.append("div").attr("class","form-group") - input = form_group.append("input") - .attr("id","software_requirements") - .attr("class","form-control") - .attr("name","software_requirements") - .attr("placeholder","Software requirements") - form_group = form.append("div").attr("class","form-group") - input = form_group.append("input") - .attr("id","hardware_requirements") - .attr("class","form-control") - .attr("name","hardware_requirements") - .attr("placeholder","Hardware requirements") - - //Information on tool licensing - form_group = form.append("div").attr("class","form-group").style("margin-top","40px") - form_group.append("label").text("License information (optional)") - input = form_group.append("input") - .attr("id","license_type") - .attr("class","form-control") - .attr("name","license_type") - .attr("placeholder","License type (e.g. open-source, commercial)") - form_group = form.append("div").attr("class","form-group") - input = form_group.append("input") - .attr("id","license_specification") - .attr("class","form-control") - .attr("name","license_specification") - .attr("placeholder","License specification (e.g. Apache License 2.0)") - form_group = form.append("div").attr("class","form-group") - input = form_group.append("input") - .attr("id","license_info") - .attr("class","form-control") - .attr("name","license_info") - .attr("placeholder","License information (e.g. https://www.apache.org/licenses/LICENSE-2.0)") - //Information on tool sources - form_group = form.append("div").attr("class","form-group").style("margin-top","40px") - form_group.append("label").text("Source information (optional)") - input = form_group.append("input") - .attr("id","repository_link") - .attr("class","form-control") - .attr("name","repository_link") - .attr("placeholder","Repository link") - form_group = form.append("div").attr("class","form-group") - input = form_group.append("input") - .attr("id","download_link") - .attr("class","form-control") - .attr("name","download_link") - .attr("placeholder","Download link") - form_group = form.append("div").attr("class","form-group") - input = form_group.append("input") - .attr("id","references") - .attr("class","form-control") - .attr("name","references") - .attr("placeholder","References") - - - var modal = bootbox.dialog({ - message: $(".form-content").html(), - title: "Add Competence Metadata", - size: "large", - buttons: [ - { - label: "Cancel", - className: "btn btn-default pull-left", - callback: function() { - modal.modal("hide"); - d3.selectAll(".form-content").remove(); - } - }, - { - label: "OK", - className: "btn btn-primary pull-left", - callback: function() { - var metadata = { - uID: aNode.uID, - description: $('form #description').val(), - status: $('form #status').val(), - owner_uid: $('form #owner_uid').val(), - creator_uid: $('form #creator_uid').val(), - operator_uid: $('form #operator_uid').val() - } - var metadata_str = JSON.stringify(metadata) - var bootboxContent = {title: "Get graph elements", message: '<p>Please be patient...</p>'}; - var xhr = $.ajax( - { - type: 'POST', - url: '/kadmos_add_DC_metadata', - data: {'graphID':graphID, 'currentOrder':nodeOrder, 'nodeName':metadata.uID, 'metadata_str':metadata_str}, - success: function(result) - { - if (result.includes("ERROR:")) - { - bootboxContent.message = result - kadmosErrorMessage(bootboxContent); - } - else - { - var updatedData = {}; - updatedData = theData; - var graphData = JSON.parse(result); - for (var i = 0; i < updatedData.graphs.length; i++) - { - if (graphID == updatedData.graphs[i].id) - { - updatedData.graphs[i] = graphData.graphs[0]; - } - } - - clearView(); - makeKadmosMenu(updatedData); - xdsm_script(updatedData,graphID); - - bootboxContent.message = "Success!" - kadmosSuccessMessage(bootboxContent) - } - }, - error: function(result) - { - bootboxContent.message = result - kadmosErrorMessage(bootboxContent); - } - }); - kadmosHavePatience(xhr, bootboxContent) - modal.modal("hide"); - d3.selectAll(".form-content").remove(); - } - } - ], - onEscape: function() { - modal.modal("hide"); - d3.selectAll(".form-content").remove(); - } - }); - - - } - - function sendDCMetadata(aMetadata) - { - } - - - function makeKadmosMenu(data, initial=false) + function makeKadmosMenu(data, initial=false) { //First of all, clear everything if it is already there var visPackDiv = d3.select(".visPackDiv"); @@ -1079,9 +624,9 @@ var selectValue; function onchange() { - selectValue = d3.select('#addselect').property('value') - if (include(selectValue,"Create")) + if (include(d3.select('#addselect').property('value'),"Create")) { + selectValue = "Create" if (file){ fileText.remove(); file.remove(); @@ -1089,16 +634,13 @@ if (submit){submit.remove();} submit = label.append("button") .style("margin-top","10pt") - .attr("type","button") + .attr("type","submit") .attr("class","btn btn-primary") .text("Go!") - submit.on("mousedown", function() - { - createNewGraph(data); - }) } - else if (include(selectValue,"KDMS")) + else if (include(d3.select('#addselect').property('value'),"KDMS")) { + selectValue = "KDMS" if (file){ fileText.remove(); file.remove(); @@ -1111,8 +653,9 @@ file = label.append("input").attr("type","file").attr("name","file[]").attr("multiple","") submit = label.append("input").attr("type","submit").attr("value","Submit"); } - else if (include(selectValue,"CMDOWS")) - { + else if (include(d3.select('#addselect').property('value'),"CMDOWS")) + { + selectValue = "CMDOWS" if (file){ fileText.remove(); file.remove(); @@ -1125,8 +668,9 @@ file = label.append("input").attr("type","file").attr("name","file[]") submit = label.append("input").attr("type","submit").attr("value","Submit"); } - else if (include(selectValue,"Database")) + else if (include(d3.select('#addselect').property('value'),"Database")) { + selectValue = "Database" if (file){ fileText.remove(); file.remove(); @@ -1149,61 +693,162 @@ formData.append('newGraphID', newGraphID); formData.append('fileType',selectValue) - - - //aigner: Upload file to VISTOMS and inspect it - //########################################################## - var bootboxContent = {title: "Upload file to VISTOMS", message: '<p>Please be patient...</p>'}; - var xhr = $.ajax({ - type: 'POST', - url: '/kadmos_upload_file', - data: formData, - processData: false, - contentType: false, - success: function(result) - { - if (result.includes("ERROR:")) - { - - - bootboxContent.message = result - kadmosErrorMessage(bootboxContent); - - clearView(); - makeKadmosMenu(data); - mainPage(); - } - else + + if (selectValue == "Create") + { + bootbox.hideAll(); + var html = d3.select("html") + var form_content = html.append("div").attr("class","form-content").attr("style","display:none") + var form = form_content.append("form").attr("class","form").attr("role","form") + var form_group, input; + + //Tool information + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Name") + input = form_group.append("input") + .attr("id","graph_name") + .attr("class","form-control") + .attr("name","graph_name") + .attr("placeholder","Add a graph name here...") + //Tool information + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Description") + input = form_group.append("input") + .attr("id","graph_description") + .attr("class","form-control") + .attr("name","graph_description") + .attr("placeholder","Add a graph description here...") + + bootbox.dialog({ + message: $(".form-content").html(), + title: "Create new graph", + size: "large", + buttons: [ + { + label: "Cancel", + className: "btn btn-default pull-left", + callback: function() { + d3.selectAll(".form-content").remove(); + } + }, + { + label: "OK", + className: "btn btn-primary pull-left", + callback: function() { + + //get form data + var graph_name = $('form #graph_name').val(); + var graph_description = $('form #graph_description').val(); + + + var bootboxContent = {title: "Create new graph", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_create_new_graph', + data: {'graph_name':graph_name, 'graph_description':graph_description, 'graphID':newGraphID}, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + + clearView(); + makeKadmosMenu(data); + mainPage(); + } + else + { + var updatedData = {}; + if (data != "REP__GRAPH_DATA__REP") + { + updatedData = data; + var graphData = JSON.parse(result); + updatedData.graphs.push(graphData.graphs[0]); + } + else + { + updatedData = JSON.parse(result); + } + + clearView(); + makeKadmosMenu(updatedData); + mainPage(); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + } + } + ] + }); + } + else + { + //aigner: Upload file to VISTOMS and inspect it + //########################################################## + var bootboxContent = {title: "Upload file to VISTOMS", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_upload_file', + data: formData, + processData: false, + contentType: false, + success: function(result) { - var updatedData = {}; - if (data != "REP__GRAPH_DATA__REP") + if (result.includes("ERROR:")) { - updatedData = data; - var graphData = JSON.parse(result); - updatedData.graphs.push(graphData.graphs[0]); + + + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + + clearView(); + makeKadmosMenu(data); + mainPage(); } else { - updatedData = JSON.parse(result); + var updatedData = {}; + if (data != "REP__GRAPH_DATA__REP") + { + updatedData = data; + var graphData = JSON.parse(result); + updatedData.graphs.push(graphData.graphs[0]); + } + else + { + updatedData = JSON.parse(result); + } + + clearView(); + makeKadmosMenu(updatedData); + mainPage(); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } - - clearView(); - makeKadmosMenu(updatedData); - mainPage(); - - bootboxContent.message = "Success!" - kadmosSuccessMessage(bootboxContent) - + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); } - }, - error: function(result) - { - bootboxContent.message = result - kadmosErrorMessage(bootboxContent); - } - }); - kadmosHavePatience(xhr, bootboxContent) - //########################################################## + }); + kadmosHavePatience(xhr, bootboxContent) + //########################################################## + + } }); if (theGraphs) @@ -1567,7 +1212,7 @@ //#####################################################################// function xdsm_script(data,graphID) - { + { (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ // https://d3js.org Version 4.3.0. Copyright 2016 Mike Bostock. (function (global, factory) { @@ -19229,7 +18874,6 @@ }; } - var myLoader = loader({width: 960, height: 500, container: "#loader_container", id: "loader"}); //aigner: NEW! @@ -19625,9 +19269,7 @@ onMouseOver: function(elm, d, i) {}, childrenItems: [] } - ] - - + ] var graphs, currentGraph, varCategories; @@ -19641,7 +19283,7 @@ } } varCategories = data.categories; - + //aigner: Get xdsm data var mdo = currentGraph.xdsm; @@ -19907,7 +19549,7 @@ } function deleteNode(aNode) - { + { bootbox.hideAll(); bootbox.confirm("Are you sure you want to do this?", function(sure) { @@ -20394,6 +20036,8 @@ } } + + clearView(); makeKadmosMenu(updatedData); xdsm_script(updatedData,newGraphID); @@ -20620,6 +20264,325 @@ }) + + //aigner: HIER WEITER!!! + function addDesignCompetence(theData, theCurrentGraph=null) + { + bootbox.hideAll(); + bootbox.dialog({ + title: "Add design competence", + message: "<form id='inp_outp_form' method='post' enctype='multipart/form-data'>" + +"<label>" + +"<text>Competence name</text>" + +"<br>" + +"<input name='function_node' id='function_node' placeholder='Add a tool name here...'></input>" + +"<br>" + +"<br>" + +"<text>Upload input file:</text>" + +"<input type='file' name='input_xml' />" + +"<br>" + +"<text>Upload output file:</text>" + +"<input type='file' name='output_xml' />" + +"<br>" + +"<input type='submit' value='Submit'/>" + +"</label></form>", + buttons : + { + cancel: { + label: "Cancel", + className: 'btn-danger' + } + } + }); + + $('#inp_outp_form').on('submit',function(event){ + event.preventDefault(); + var formData = new FormData($('#inp_outp_form')[0]); + formData.append('graphID', graphID); + formData.append('currentOrder',nodeOrder); + formData.append('function_node', $('form #function_node').val()); + + var bootboxContent = {title: "Add design competence", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax({ + type: 'POST', + url: '/kadmos_add_design_competence', + data: formData, + processData: false, + contentType: false, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = {}; + updatedData = theData; + var graphData = JSON.parse(result); + for (var i = 0; i < updatedData.graphs.length; i++) + { + if (graphID == updatedData.graphs[i].id) + { + updatedData.graphs[i] = graphData.graphs[0]; + } + } + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,graphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + d3.selectAll(".form-content").remove(); + }); + } + + //aigner: HIER WEITER!!! --> Add contacts if not already existing + function addDCMetadata(theData, theCurrentGraph, aNode=null) + { + bootbox.hideAll(); + + var metadata; + if (aNode != null) + { + metadata = aNode.metadata; + } + + var html = d3.select("html") + var form_content = html.append("div").attr("class","form-content").attr("style","display:none") + var form = form_content.append("form").attr("class","form").attr("role","form") + var form_group, input; + + //General information + form_group = form.append("div").attr("class","form-group") + form_group.append("label").text("General information") + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Description") + input = form_group.append("textarea") + .attr("id","description") + .attr("class","form-control") + .attr("name","description") + .attr("placeholder","Add a description for the DC here") + + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Status") + input = form_group.append("select").attr("id","status").style("margin-left","5px") + input.append("option").attr("type","select").attr("value","-").text("Please select...") + input.append("option").attr("type","select").attr("value","Available").text("Available") + input.append("option").attr("type","select").attr("value","N/A").text("N/A") + var contacts = [] + if (theCurrentGraph.organization.contacts){contacts=theCurrentGraph.organization.contacts}; + console.log(theCurrentGraph) + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Owner") + input = form_group.append("select").attr("id","owner_uid").style("margin-left","5px") + input.append("option").attr("type","select").attr("value","-").text("Please select...") + contacts.forEach(function(contact){ + input.append("option").attr("type","select").attr("value",contact.attrib.uID).text(contact.name + " (" + contact.company + ")") + }) + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Creator") + input = form_group.append("select").attr("id","creator_uid").style("margin-left","5px") + input.append("option").attr("type","select").attr("value","-").text("Please select...") + contacts.forEach(function(contact){ + input.append("option").attr("type","select").attr("value",contact.attrib.uID).text(contact.name + " (" + contact.company + ")") + }) + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Operator") + input = form_group.append("select").attr("id","operator_uid").style("margin-left","5px") + input.append("option").attr("type","select").attr("value","-").text("Please select...") + contacts.forEach(function(contact){ + input.append("option").attr("type","select").attr("value",contact.attrib.uID).text(contact.name + " (" + contact.company + ")") + }) + + + //Information on tool execution + form_group = form.append("div").attr("class","form-group").style("margin-top","40px") + form_group.append("label").text("Execution information") + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Operating System") + input = form_group.append("select").attr("id","operating_system").style("margin-left","5px") + input.append("option").attr("type","select").attr("value","-").text("Please select...") + input.append("option").attr("type","select").attr("value","windows").text("Windows") + input.append("option").attr("type","select").attr("value","linux").text("Linux") + input.append("option").attr("type","select").attr("value","mac").text("Mac OS") + input.append("option").attr("type","select").attr("value","other").text("Other") + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Integration platform") + input = form_group.append("input") + .attr("id","integration_platform") + .attr("class","form-control") + .attr("name","integration_platform") + .attr("placeholder","Integration platform (e.g. RCE, Optimus)") + form_group = form.append("div").attr("class","form-group") + form_group.append("text").text("Execution command") + input = form_group.append("textarea") + .attr("id","command") + .attr("class","form-control") + .attr("cols","40") + .attr("rows","5") + .attr("name","command") + .attr("placeholder","Execution command") + form_group = form.append("div").attr("class","form-group") + input = form_group.append("input") + .attr("id","description_cmd") + .attr("class","form-control") + .attr("name","description_cmd") + .attr("placeholder","Details on the exectuion command (optional)") + form_group = form.append("div").attr("class","form-group") + input = form_group.append("input") + .attr("id","software_requirements") + .attr("class","form-control") + .attr("name","software_requirements") + .attr("placeholder","Software requirements") + form_group = form.append("div").attr("class","form-group") + input = form_group.append("input") + .attr("id","hardware_requirements") + .attr("class","form-control") + .attr("name","hardware_requirements") + .attr("placeholder","Hardware requirements") + + //Information on tool licensing + form_group = form.append("div").attr("class","form-group").style("margin-top","40px") + form_group.append("label").text("License information (optional)") + input = form_group.append("input") + .attr("id","license_type") + .attr("class","form-control") + .attr("name","license_type") + .attr("placeholder","License type (e.g. open-source, commercial)") + form_group = form.append("div").attr("class","form-group") + input = form_group.append("input") + .attr("id","license_specification") + .attr("class","form-control") + .attr("name","license_specification") + .attr("placeholder","License specification (e.g. Apache License 2.0)") + form_group = form.append("div").attr("class","form-group") + input = form_group.append("input") + .attr("id","license_info") + .attr("class","form-control") + .attr("name","license_info") + .attr("placeholder","License information (e.g. https://www.apache.org/licenses/LICENSE-2.0)") + + //Information on tool sources + form_group = form.append("div").attr("class","form-group").style("margin-top","40px") + form_group.append("label").text("Source information (optional)") + input = form_group.append("input") + .attr("id","repository_link") + .attr("class","form-control") + .attr("name","repository_link") + .attr("placeholder","Repository link") + form_group = form.append("div").attr("class","form-group") + input = form_group.append("input") + .attr("id","download_link") + .attr("class","form-control") + .attr("name","download_link") + .attr("placeholder","Download link") + form_group = form.append("div").attr("class","form-group") + input = form_group.append("input") + .attr("id","references") + .attr("class","form-control") + .attr("name","references") + .attr("placeholder","References") + + + var modal = bootbox.dialog({ + message: $(".form-content").html(), + title: "Add Competence Metadata", + size: "large", + buttons: [ + { + label: "Cancel", + className: "btn btn-default pull-left", + callback: function() { + modal.modal("hide"); + d3.selectAll(".form-content").remove(); + } + }, + { + label: "OK", + className: "btn btn-primary pull-left", + callback: function() { + var metadata = { + uID: aNode.uID, + description: $('form #description').val(), + status: $('form #status').val(), + owner_uid: $('form #owner_uid').val(), + creator_uid: $('form #creator_uid').val(), + operator_uid: $('form #operator_uid').val() + } + var metadata_str = JSON.stringify(metadata) + var bootboxContent = {title: "Get graph elements", message: '<p>Please be patient...</p>'}; + var xhr = $.ajax( + { + type: 'POST', + url: '/kadmos_add_DC_metadata', + data: {'graphID':graphID, 'currentOrder':nodeOrder, 'nodeName':metadata.uID, 'metadata_str':metadata_str}, + success: function(result) + { + if (result.includes("ERROR:")) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + else + { + var updatedData = {}; + updatedData = theData; + var graphData = JSON.parse(result); + for (var i = 0; i < updatedData.graphs.length; i++) + { + if (graphID == updatedData.graphs[i].id) + { + updatedData.graphs[i] = graphData.graphs[0]; + } + } + + clearView(); + makeKadmosMenu(updatedData); + xdsm_script(updatedData,graphID); + + bootboxContent.message = "Success!" + kadmosSuccessMessage(bootboxContent) + } + }, + error: function(result) + { + bootboxContent.message = result + kadmosErrorMessage(bootboxContent); + } + }); + kadmosHavePatience(xhr, bootboxContent) + modal.modal("hide"); + d3.selectAll(".form-content").remove(); + } + } + ], + onEscape: function() { + modal.modal("hide"); + d3.selectAll(".form-content").remove(); + } + }); + + + } + + function sendDCMetadata(aMetadata) + { + + } + + var addCBButton = revertDiv.append("button") .attr("class","btn btn-success") .attr("data-toggle","tooltip") diff --git a/kadmos/vistoms/templates/cmdows_template.xml b/kadmos/vistoms/templates/cmdows_template.xml index d4c810155..3d99617e3 100644 --- a/kadmos/vistoms/templates/cmdows_template.xml +++ b/kadmos/vistoms/templates/cmdows_template.xml @@ -1,20 +1,11 @@ <?xml version='1.0' encoding='UTF-8'?> <cmdows xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://bitbucket.org/imcovangent/cmdows/raw/master/schema/0.7/cmdows.xsd"> <header> - <creator>Lukas Mueller</creator> - <description>RCG CMDOWS file of the super-sonic business jet test case optimization problem</description> + <creator>Benedikt Aigner</creator> + <description>CMDOWS template</description> <timestamp>2018-03-21T18:06:39.928759</timestamp> <fileVersion>0.1</fileVersion> <cmdowsVersion>0.7</cmdowsVersion> - <updates> - <update> - <modification>KADMOS export of a repository connectivity graph (RCG).</modification> - <creator>Lukas Mueller</creator> - <timestamp>2018-03-21T18:06:39.928759</timestamp> - <fileVersion>0.1</fileVersion> - <cmdowsVersion>0.7</cmdowsVersion> - </update> - </updates> </header> <executableBlocks> <designCompetences> @@ -32,11 +23,4 @@ </designCompetences> <mathematicalFunctions></mathematicalFunctions> </executableBlocks> - <parameters></parameters> - <workflow> - <dataGraph> - <name>RCG</name> - <edges></edges> - </dataGraph> - </workflow> </cmdows> diff --git a/kadmos/vistoms/vistoms.py b/kadmos/vistoms/vistoms.py index df1dd7ebc..45ac83d0c 100644 --- a/kadmos/vistoms/vistoms.py +++ b/kadmos/vistoms/vistoms.py @@ -11,11 +11,13 @@ import webbrowser import zipfile from copy import deepcopy from shutil import copyfile +import xml.etree.ElementTree as ET import networkx as nx from flask import Flask, render_template, request, jsonify from kadmos.cmdows.cmdows import find_cmdows_file -from kadmos.graph import load, FundamentalProblemGraph +from kadmos.graph import load, FundamentalProblemGraph, KadmosGraph + app = Flask(__name__) @@ -97,6 +99,7 @@ def kadmos_upload_file(): actual_database_dir = os.path.join(database_dir, database_listdir[0]) for file in os.listdir(actual_database_dir): file_list.append(os.path.join(actual_database_dir, file)) + cmdows_file = find_cmdows_file(file_list) graphFileName = cmdows_file else: @@ -155,33 +158,26 @@ def kadmos_create_new_graph(): # Get request form graph_name = request.form['graph_name'] graph_description = request.form['graph_description'] + graphID = request.form['graphID'] # Open cmdows template file and load it as graph cmdows_template = os.path.join('templates', 'cmdows_template.xml') graph_template = load(cmdows_template, check_list=['consistent_root', 'invalid_leaf_elements']) - # Determine graph_id - graph_ids = [] - for aFile in os.listdir(UPLOAD_FOLDER): - if aFile.endswith('.kdms'): - filename = aFile.split('.kdms')[0] - graph_ids.append(int(filename.split('_')[1])) - graph_id_int = max(graph_ids)+1 - graph_id = format(graph_id_int, "02") - # Allocate graph name, description and id graph_template.graph['name'] = graph_name graph_template.graph['description'] = graph_description - graph_template.graph['id'] = graph_id + graph_template.graph['id'] = graphID # Delete dummy design competence graph_template.remove_node('dummy') # Save empty graph as kdms file - graph_template.save(os.path.join(UPLOAD_FOLDER, 'tmp_'+graph_id+'.kdms'), file_type='kdms', graph_check_critical=False, mpg=None) + graph_template.save(os.path.join(UPLOAD_FOLDER, 'tmp_'+graphID+'.kdms'), file_type='kdms', + graph_check_critical=False, mpg=None) # Add graph to vistoms data - newVistomsData = graph_template.vistoms_add_json(mpg=None, graph_id=graph_id) + newVistomsData = graph_template.vistoms_add_json(mpg=None, graph_id=graphID) return newVistomsData @@ -339,7 +335,10 @@ def kadmos_save_vistoms_graph(): graphID = request.form['graphID'] newGraphName = request.form['newGraphName'] newGraphID = request.form['newGraphID'] - function_order = request.form['currentOrder'].split(',') + + function_order = None + if request.form['currentOrder'].split(',') != '': + function_order = request.form['currentOrder'].split(',') tmpDir = UPLOAD_FOLDER graphFileName = TEMP_FILE + '_' + graphID + '.kdms' @@ -353,9 +352,10 @@ def kadmos_save_vistoms_graph(): newFileName = TEMP_FILE + '_' + newGraphID + '.kdms' graph.graph['name'] = newGraphName + graph.graph['id'] = newGraphID graph.save(os.path.join(UPLOAD_FOLDER, newFileName), file_type="kdms", graph_check_critical=False, mpg=mpg) - newVistomsData = graph.vistoms_add_json(function_order=function_order,mpg=mpg, graph_id=newGraphID) + newVistomsData = graph.vistoms_add_json(function_order=function_order, mpg=mpg, graph_id=newGraphID) return newVistomsData @@ -804,7 +804,9 @@ def kadmos_add_DC_metadata(): try: # Get request form graphID = request.form['graphID'] - function_order = request.form['currentOrder'].split(',') + function_order = None + if request.form['currentOrder'].split(',') != '': + function_order = request.form['currentOrder'].split(',') nodeName = request.form['nodeName'] metadata_str = request.form['metadata_str'] @@ -876,7 +878,7 @@ def kadmos_add_mathematical_function(): try: # Get request form graphID = request.form['graphID'] - function_order = [] + function_order = None if request.form['currentOrder'] != '': function_order = request.form['currentOrder'].split(',') form_data_str = request.form['form_data'] @@ -917,6 +919,8 @@ def kadmos_add_mathematical_function(): output_nodes=output_nodes) # Add the new mathematical function to the function list (function_order) + if function_order is None: + function_order = [] function_order.append(function_node) # The graph with the added mathematical function is now saved as json data for vistoms @@ -945,9 +949,10 @@ def kadmos_add_design_competence(): try: # Get request form graphID = request.form['graphID'] - input_file = request.form['input'] - output_file = request.form['output'] - cmdows_file = request.form['cmdows'] + current_order = request.form['currentOrder'] + function_node = request.form['function_node'].replace(" ", "") + input_xml = request.files['input_xml'] + output_xml = request.files['output_xml'] # Save previous graph as backup before making the changes @@ -962,18 +967,44 @@ def kadmos_add_design_competence(): graph = load(os.path.join(path, graphFileName), file_check_critical=False) mpg = None - # Here the dc cmdows file and database is created - check_list = ['consistent_root', 'invalid_leaf_elements'] - graph_dc = load(check_list=check_list) - - # Here the two graphs are merged - new_graph = nx.compose(graph, graph_dc) + # Here the dc cmdows file is loaded + # Save the template cmdows file in the tmp folder + cmdows_template = os.path.join('templates', 'cmdows_template.xml') + cmdows_file = os.path.join(UPLOAD_FOLDER,'cmdows_template.xml') + # Write the new competence to the CMDOWS template xml file + tree = ET.parse(cmdows_template) + root = tree.getroot() + dc_element = root.find("./executableBlocks/designCompetences/designCompetence") + dc_element.find("ID").text = function_node + uid = function_node + dc_element.set('uID', uid) + tree.write(cmdows_file) + + # Copy the uploaded input/outut files to the tmp folder + input_xml_file = os.path.join(UPLOAD_FOLDER, function_node+'-input.xml') + output_xml_file = os.path.join(UPLOAD_FOLDER, function_node+'-output.xml') + input_xml.save(input_xml_file) + output_xml.save(output_xml_file) + + # Load design competence with cmdows template file + graph_dc = load(cmdows_file, check_list=['consistent_root', 'invalid_leaf_elements']) + + os.remove(cmdows_file) + os.remove(input_xml_file) + os.remove(output_xml_file) + + # Here the original graph and the new graph including the design competence are merged + new_graph = KadmosGraph(nx.compose(graph, graph_dc)) + # new_graph.graph['name'] = graph.graph['name'] + # new_graph.graph['id'] = graphID + # new_graph.graph['description'] = graph.graph['description'] # Add the graph with the updated function order to VISTOMS newVistomsData = new_graph.vistoms_add_json(graph_id=graphID, mpg=mpg) # Save the graph in temp/tmp.kdms - new_graph.save(os.path.join(UPLOAD_FOLDER, TEMP_FILE+'_'+graphID+'.kdms'), file_type='kdms', graph_check_critical=False, mpg=mpg) + new_graph.save(os.path.join(UPLOAD_FOLDER, TEMP_FILE+'_'+graphID+'.kdms'), file_type='kdms', + graph_check_critical=False, mpg=mpg) return newVistomsData @@ -994,7 +1025,9 @@ def kadmos_change_node_pos(): # Get request form graphID = request.form['graphID'] nodeName = str(request.form['nodeName']) - function_order = request.form['currentOrder'].split(',') + function_order = None + if request.form['currentOrder'].split(',') != '': + function_order = request.form['currentOrder'].split(',') newPos = int(request.form['newPos']) # Save previous graph as backup before making the changes @@ -1042,7 +1075,9 @@ def kadmos_delete_node(): # Get request form graphID = request.form['graphID'] nodeName = str(request.form['nodeName']) - function_order = request.form['currentOrder'].split(',') + function_order = None + if request.form['currentOrder'].split(',') != '': + function_order = request.form['currentOrder'].split(',') # Save previous graph as backup before making the changes savePreviousGraph(graphID) @@ -1088,7 +1123,9 @@ def kadmos_delete_edge(): graphID = request.form['graphID'] nodeName = str(request.form['nodeName']) edgeName = str(request.form['edgeName']) - function_order = request.form['currentOrder'].split(',') + function_order = None + if request.form['currentOrder'].split(',') != '': + function_order = request.form['currentOrder'].split(',') # Save previous graph as backup before making the changes savePreviousGraph(graphID) @@ -1129,7 +1166,9 @@ def kadmos_exclude_DCs(): # Get request form graphID = request.form['graphID'] nodeList = request.form['nodeList'].split(',') - function_order = request.form['currentOrder'].split(',') + function_order = None + if request.form['currentOrder'].split(',') != '': + function_order = request.form['currentOrder'].split(',') # Save previous graph as backup before making the changes savePreviousGraph(graphID) @@ -1175,7 +1214,9 @@ def kadmos_merge_seq_DCs(): try: # Get request form graphID = request.form['graphID'] - function_order = request.form['currentOrder'].split(',') + function_order = None + if request.form['currentOrder'].split(',') != '': + function_order = request.form['currentOrder'].split(',') nodeList = request.form['nodeList'].split(',') # Save previous graph as backup before making the changes @@ -1226,7 +1267,9 @@ def kadmos_merge_parallel_DCs(): try: # Get request form graphID = request.form['graphID'] - function_order = request.form['currentOrder'].split(',') + function_order = None + if request.form['currentOrder'].split(',') != '': + function_order = request.form['currentOrder'].split(',') nodeList = request.form['nodeList'].split(',') # Save previous graph as backup before making the changes @@ -1277,7 +1320,9 @@ def kadmos_merge_func_mod_DCs(): try: # Get request form graphID = request.form['graphID'] - function_order = request.form['currentOrder'].split(',') + function_order = None + if request.form['currentOrder'].split(',') != '': + function_order = request.form['currentOrder'].split(',') nodeList = request.form['nodeList'].split(',') # Save previous graph as backup before making the changes @@ -1333,7 +1378,9 @@ def kadmos_remove_collision(): # Get request form graphID = request.form['graphID'] nodeList = request.form['nodeList'].split(',') - function_order = request.form['currentorder'].split(',') + function_order = None + if request.form['currentOrder'].split(',') != '': + function_order = request.form['currentOrder'].split(',') # Save previous graph as backup before making the changes savePreviousGraph(graphID) @@ -1431,7 +1478,9 @@ def kadmos_make_all_variables_valid(): try: # get request form graphID = request.form['graphID'] - function_order = request.form['currentOrder'].split(',') + function_order = None + if request.form['currentOrder'].split(',') != '': + function_order = request.form['currentOrder'].split(',') # Save previous graph as backup before making the changes savePreviousGraph(graphID) @@ -1479,7 +1528,9 @@ def kadmos_add_function_problem_roles(): try: # get request form graphID = request.form['graphID'] - function_order = request.form['currentOrder'].split(',') + function_order = None + if request.form['currentOrder'].split(',') != '': + function_order = request.form['currentOrder'].split(',') # Save previous graph as backup before making the changes savePreviousGraph(graphID) @@ -1525,7 +1576,9 @@ def kadmos_mark_variable(): try: # get request form graphID = request.form['graphID'] - function_order = request.form['currentOrder'].split(',') + function_order = None + if request.form['currentOrder'].split(',') != '': + function_order = request.form['currentOrder'].split(',') variableData_str = request.form['variableData_str'] # read json data variableData_py = json.loads(variableData_str) @@ -1581,7 +1634,9 @@ def kadmos_unmark_variable(): try: # get request form graphID = request.form['graphID'] - function_order = request.form['currentOrder'].split(',') + function_order = None + if request.form['currentOrder'].split(',') != '': + function_order = request.form['currentOrder'].split(',') xPath = request.form['xPath'] # Save previous graph as backup before making the changes @@ -1625,7 +1680,9 @@ def kadmos_remove_unused_outputs(): try: # get request form graphID = request.form['graphID'] - function_order = request.form['currentOrder'].split(',') + function_order = None + if request.form['currentOrder'].split(',') != '': + function_order = request.form['currentOrder'].split(',') cleanUp_str = request.form['cleanUp'] if cleanUp_str == 'True': cleanUp = True @@ -1758,7 +1815,9 @@ def kadmos_impose_MDAO_architecture(): try: # Get request form graphID = request.form['graphID'] - function_order = request.form['currentOrder'].split(',') + function_order = None + if request.form['currentOrder'].split(',') != '': + function_order = request.form['currentOrder'].split(',') mdao_architecture = request.form['mdao_architecture'] doe_method = request.form['doe_method'] coupling_decomposition = request.form['coupling_decomposition'] -- GitLab