Skip to content
Snippets Groups Projects
Commit da0927ab authored by Jonas Blatt's avatar Jonas Blatt :ant:
Browse files

Merge branch 'feat/dmnapp/purehtmljs' into 'develop'

Feat/dmnapp/purehtmljs

See merge request jonasblatt/ma-jonasblatt-dmn-verifier!9
parents d5299874 ed57c077
No related branches found
No related tags found
No related merge requests found
Showing
with 338 additions and 39 deletions
...@@ -12,7 +12,10 @@ public class SubsumptionVerification extends AbstractVerificationType { ...@@ -12,7 +12,10 @@ public class SubsumptionVerification extends AbstractVerificationType {
private static final SubsumptionVerification instance = new SubsumptionVerification(); private static final SubsumptionVerification instance = new SubsumptionVerification();
private SubsumptionVerification() { private SubsumptionVerification() {
super(new Name("SubsumptionVerification"), new Description("test")); // TODO super(
new Name("SubsumptionVerification"),
new Name("Rule Subsumptions"),
new Description("test")); // TODO
} }
public static SubsumptionVerification getInstance() { public static SubsumptionVerification getInstance() {
......
...@@ -17,6 +17,10 @@ public interface VerificationType extends ValueObject { ...@@ -17,6 +17,10 @@ public interface VerificationType extends ValueObject {
@JsonbProperty("name") @JsonbProperty("name")
Name getName(); Name getName();
@NotNull
@JsonbProperty("niceName")
Name getNiceName();
@NotNull @NotNull
@JsonbProperty("description") @JsonbProperty("description")
Description getDescription(); Description getDescription();
......
# Configuration file # Configuration file
# Quarkus cors settings # Quarkus cors settings
quarkus.http.cors=true quarkus.http.cors=true
quarkus.http.cors.origins=http://localhost:8081,http://localhost:80 %dev.quarkus.http.cors.origins=http://localhost:8081,http://192.168.2.109:8081
quarkus.http.cors.origins=http://localhost,http://dmn.fg-bks.uni-koblenz.de,http://141.26.209.83
quarkus.http.cors.headers=accept,authorization,content-type,x-requested-with quarkus.http.cors.headers=accept,authorization,content-type,x-requested-with
quarkus.http.cors.methods=GET, POST, OPTIONS quarkus.http.cors.methods=GET,POST,OPTIONS
# Amount of threads for calculating the verifications # Amount of threads for calculating the verifications
verifier.threads=8 verifier.threads=8
# No parallel execution in dev mode # No parallel execution in dev mode
......
dmnverifierfrontend/src/main/resources/META-INF/resources/css/img/download.png

32.8 KiB

dmnverifierfrontend/src/main/resources/META-INF/resources/css/img/emptyFile.png

5.22 KiB

dmnverifierfrontend/src/main/resources/META-INF/resources/css/img/upload.png

33.4 KiB

/** General configuration */
html, body { html, body {
height: 100%;
padding: 0; padding: 0;
margin: 0; font-size: 11pt;
font-size: 10pt; }
h1 {
font-weight: 400;
line-height: 1.2;
font-size: 1.8em;
font-family: Impact, Charcoal, sans-serif;
margin-top: 8px;
color: #0b3004;
} }
h2 { h2 {
margin: 10px; margin: 10px;
} }
input { select {
color: blue; -moz-appearance: none;
-webkit-appearance: none;
appearance: none;
border: none;
border-radius: 2px;
color: #0b3004;
cursor: pointer;
font-family: 'Open Sans', sans-serif;
font-size: 14px;
height: 35px;
outline: none;
padding-left: 5px;
}
select option {
color: #000;
}
select optgroup {
color: #111;
}
select::-ms-expand {
display: none;
}
select:focus::-ms-value {
background-color: transparent;
}
.clickable {
box-shadow: 2px 2px 3px 2px rgba(0, 0, 0, .3);
}
.clickable:hover {
box-shadow: 1px 1px 2px 1px rgba(0, 0, 0, .3);
}
.clickable:active {
box-shadow: 0 0 1px 0 rgba(0, 0, 0, .3);
}
/** Top-line configuration */
.dmn-root {
margin: -2px;
}
.dmn-top {
height: 60px;
padding-left: 6px;
padding-top: 6px;
display: flex;
flex-direction: row;
justify-content: space-around;
}
.dmn-top-item {
flex-grow: 20;
}
.dmn-top-item > input {
display: none;
}
.dmn-top-item > label {
height: 52px;
border: 2px solid #0b3004;
border-radius: 5px;
display: block;
background-size: cover;
background-position: center;
}
.dmn-upload {
flex-grow: 1;
border: 2px black;
}
.dmn-upload > label {
background-image: url("img/upload.png");
width: 50px;
}
.dmn-empty-file {
flex-grow: 1;
}
.dmn-empty-file > label {
background-image: url("img/emptyFile.png");
width: 50px;
}
.dmn-download {
flex-grow: 1;
}
.dmn-download > label {
background-image: url("img/download.png");
width: 50px;
}
/** Verifier configuration */
#dmn-verifier-header {
padding: 3px;
display: flex;
justify-content: flex-start;
align-items: flex-start;
}
#dmn-button-verify {
flex-grow: 1;
max-width: 90px;
height: 35px;
background: white;
border-radius: 2px;
}
.dmn-verifier-header-item {
margin: 8px 12px;
}
.dmn-verifier-select {
flex-grow: 4;
} }
#dmn-file-upload { #dmn-verifier-types {
width: 100%; flex-grow: 1;
max-width: 200px;
} }
.dmn-ERROR { .dmn-ERROR {
...@@ -29,6 +162,6 @@ input { ...@@ -29,6 +162,6 @@ input {
list-style-image: url("img/FATAL_ERROR.png"); list-style-image: url("img/FATAL_ERROR.png");
} }
.dmn-INFORMATION { .dmn-INFO {
list-style-image: url("img/INFO.png"); list-style-image: url("img/INFO.png");
} }
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/DMN/20151101/dmn.xsd" xmlns:biodi="http://bpmn.io/schema/dmn/biodi/1.0" id="Definitions_1kjh9a2" name="DRD" namespace="http://camunda.org/schema/1.0/dmn">
<decision id="Decision_13nychf" name="Decision 1">
<extensionElements>
<biodi:bounds x="120" y="145" width="180" height="80" />
</extensionElements>
<decisionTable id="decisionTable_1">
<input id="input_1">
<inputExpression id="inputExpression_1" typeRef="string">
<text></text>
</inputExpression>
</input>
<output id="output_1" typeRef="string" />
</decisionTable>
</decision>
</definitions>
...@@ -18,22 +18,42 @@ ...@@ -18,22 +18,42 @@
<link href="css/dmnEditorTabs.css" rel="stylesheet" type="text/css"/> <link href="css/dmnEditorTabs.css" rel="stylesheet" type="text/css"/>
</head> </head>
<body> <body>
<input id="dmn-file-upload" type="file"> <div class="dmn-root">
<div id="content-dmn"> <div class="dmn-top">
<div class="editor-parent"> <div class="dmn-top-item dmn-upload">
<div class="editor-container"></div> <label class="clickable" for="dmn-file-upload">
<div class="editor-tabs"></div> </label>
<input id="dmn-file-upload" type="file"/>
</div>
<div class="dmn-top-item dmn-empty-file">
<label class="clickable" for="dmn-file-empty">
</label>
<input id="dmn-file-empty" type="button"/>
</div>
<div class="dmn-top-item dmn-download">
<label class="clickable" for="dmn-file-download">
</label>
<input id="dmn-file-download" type="button"/>
</div>
<div class="dmn-top-item">
<h1>Verification for Decision Modeling Notation</h1>
</div>
</div> </div>
<div id="content-dmn">
<div class="editor-parent">
<div class="editor-container"></div>
<div class="editor-tabs"></div>
</div>
</div>
<div id="root-dmn-verifier"></div>
</div> </div>
<div id="root-dmn-verifier"></div>
</div>
<!-- load jquery --> <!-- load jquery -->
<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.js" type="text/javascript"></script> <script src="https://unpkg.com/jquery@3.4.1/dist/jquery.js" type="text/javascript"></script>
<!-- load dmn modeler --> <!-- load dmn modeler -->
<script src="https://unpkg.com/dmn-js@7.0.1/dist/dmn-modeler.development.js"></script> <script src="https://unpkg.com/dmn-js@7.0.1/dist/dmn-modeler.development.js"></script>
<script src="js/upload.js" type="text/javascript"></script> <script src="js/dmnUpload.js" type="text/javascript"></script>
<script src="js/dmnDownload.js" type="text/javascript"></script>
<script src="js/dmnViewer.js" type="text/javascript"></script> <script src="js/dmnViewer.js" type="text/javascript"></script>
<script src="js/dmnVerifier.js" type="text/javascript"></script> <script src="js/dmnVerifier.js" type="text/javascript"></script>
</body> </body>
......
document.addEventListener("DOMContentLoaded", function () {
$('#dmn-file-download').on('click', exportDiagram());
});
function download(filename, dmnXml) {
let el = document.createElement('a');
el.setAttribute('href',
'data:text/xml;charset=utf-8,' + encodeURIComponent(dmnXml));
el.setAttribute('download', filename);
el.style.display = 'none';
document.body.appendChild(el);
el.click();
document.body.removeChild(el);
}
document.addEventListener("DOMContentLoaded", function () { document.addEventListener("DOMContentLoaded", function () {
$('#dmn-file-upload').on('change', loadDmnFromFile); $('#dmn-file-upload').on('change', loadDmnFromFile);
$('#dmn-file-empty').on('click', loadEmptyFile);
}); });
function loadDmnFromFile(evt) { function loadDmnFromFile(evt) {
...@@ -13,4 +14,15 @@ function loadDmnFromFile(evt) { ...@@ -13,4 +14,15 @@ function loadDmnFromFile(evt) {
fileReader.readAsText(dmnFile, "UTF-8"); fileReader.readAsText(dmnFile, "UTF-8");
} }
function loadEmptyFile() {
$.ajax({
url: 'dmn/emptyDMN.dmn',
type: 'GET',
contentType: 'text/xml',
success: function (data) {
openDiagram(data);
}
});
}
...@@ -55,6 +55,7 @@ ...@@ -55,6 +55,7 @@
* @type {object} * @type {object}
* @property {string} description * @property {string} description
* @property {string} name * @property {string} name
* @property {string} niceName
* @property {VerificationClassification} classification * @property {VerificationClassification} classification
*/ */
...@@ -63,4 +64,5 @@ ...@@ -63,4 +64,5 @@
* @type {object} * @type {object}
* @property {string} description * @property {string} description
* @property {string} name * @property {string} name
* * @property {string} niceName
*/ */
let rootUrl = 'http://localhost:8080/'; let rootUrl = 'http://192.168.2.109:8080/';
let dmnApi = rootUrl + 'api/dmn/'; let dmnApi = rootUrl + 'api/dmn/';
/** /**
...@@ -7,16 +7,61 @@ let dmnApi = rootUrl + 'api/dmn/'; ...@@ -7,16 +7,61 @@ let dmnApi = rootUrl + 'api/dmn/';
*/ */
let verifierResults = {}; let verifierResults = {};
/**
*
* @type {Array.<VerificationType>}
*/
let types = [];
let $verifierTypes;
// load types
$.ajax({
url: dmnApi + 'verification/type',
type: 'GET',
contentType: 'text/xml',
success: function (data) {
types = data;
// sort types by classification and name
types.sort(function (
/** VerificationType */ firstEl, /** VerificationType */ secondEl) {
if (firstEl.classification.name
=== secondEl.classification.name) {
if (firstEl.niceName === secondEl.niceName) {
return 0;
}
return firstEl.niceName < secondEl.niceName ? -1 : 1;
} else if (firstEl.classification.name
< secondEl.classification.name) {
return -1;
} else {
return 1;
}
});
$verifierTypes = renderTypeOptions();
}
});
function cleanDmnVerifierRoot() { function cleanDmnVerifierRoot() {
let $root = $('#root-dmn-verifier').empty(); let $root = $('#root-dmn-verifier').empty();
$root.append($(` let $header = $(`
<button id="button-dmn-verify" onClick="checkVerifications()"> <div id="dmn-verifier-header">
Get verifications</button> `);
// add types
$header.append($verifierTypes);
// Add Button
$header.append($(`
<button class="clickable dmn-verifier-header-item" id="dmn-button-verify" onClick="checkVerifications()">
Verify</button>
`)); `));
// add header to root
$root.append($header);
$root.append($(`<div id="dmn-verifier-content">`));
return $root; return $root;
} }
function checkVerifications() { function checkVerifications() {
cleanDmnVerifierRoot();
getVerifications(); getVerifications();
} }
...@@ -28,8 +73,13 @@ function getVerifications() { ...@@ -28,8 +73,13 @@ function getVerifications() {
} else { } else {
console.log('Requesting dmn verifications..'); console.log('Requesting dmn verifications..');
} }
let apiPath = dmnApi + 'verification';
// check, if a verifier is preselected
if ($verifierTypes[0].selectedOptions[0].value !== 'all') {
apiPath += "/type/" + $verifierTypes[0].selectedOptions[0].value;
}
$.ajax({ $.ajax({
url: dmnApi + 'verification', url: apiPath,
type: 'POST', type: 'POST',
contentType: 'text/xml', contentType: 'text/xml',
data: xml, data: xml,
...@@ -63,31 +113,73 @@ function getVerifications() { ...@@ -63,31 +113,73 @@ function getVerifications() {
}); });
} }
function renderTypeOptions() {
let $select = $(`
<select name="verifier" id="dmn-verifier-types"
class="dmn-verifier-header-item dmn-verifier-select clickable">
`);
$select.append($(`<option value="all">All verifier</option>`));
let currentOpt = '';
let $curGroup;
for (let i = 0; i < types.length; i++) {
let bolNewGroup = currentOpt
!== types[i].classification.niceName;
if (bolNewGroup) {
if (currentOpt === currentOpt) {
$select.append($curGroup);
}
$curGroup = ($(
`<optgroup label="${types[i].classification.niceName}">
`));
currentOpt = types[i].classification.niceName;
}
$curGroup.append($(`
<option value="${types[i].name}">${types[i].niceName}</option>`
));
}
$select.append($curGroup);
return $select;
}
function renderDmnVerifierOptions() { function renderDmnVerifierOptions() {
// reset div let $header = $('#dmn-verifier-header');
let $root = cleanDmnVerifierRoot();
let $select = $(` let $select = $(`
<select name="verifier" id="verifier" onchange="renderVerifierResult(this)"> <select name="verifier" id="verifier"
class="dmn-verifier-header-item dmn-verifier-select clickable"
onchange="renderVerifierResult(this)">
`); `);
$select.append($(`<option>Select a verifier</option>`)); $select.append($(`<option>Select a verifier</option>`));
let currentOpt = ''; let currentOpt = '';
let $curGroup; let $curGroup;
for (let i = 0; i < verifierResults.verifier.length; i++) { for (let i = 0; i < verifierResults.verifier.length; i++) {
let verifier = verifierResults.verifier[i];
let bolNewGroup = currentOpt let bolNewGroup = currentOpt
!== verifierResults.verifier[i].type.classification.name; !== verifier.type.classification.niceName;
if (bolNewGroup) { if (bolNewGroup) {
if (currentOpt === currentOpt) { if (currentOpt === currentOpt) {
$select.append($curGroup); $select.append($curGroup);
} }
$curGroup = ($( $curGroup = ($(
`<optgroup label="${verifierResults.verifier[i].type.classification.name}"> `<optgroup label="${verifier.type.classification.niceName}">
`)); `));
currentOpt = verifierResults.verifier[i].type.classification.name; currentOpt = verifier.type.classification.niceName;
} }
$curGroup.append(renderSelectEntry(verifierResults.verifier[i])); if (verifierResults.verifier.length === 1) {
$curGroup.append($(`
<option value="${verifier.type.name}" selected>${verifier.type.niceName} (${verifier.size})</option>
`));
} else {
$curGroup.append($(`
<option value="${verifier.type.name}">${verifier.type.niceName} (${verifier.size})</option>
`));
}
}
$select.append($curGroup);
$header.append($select);
if (verifierResults.verifier.length === 1) {
renderVerifierResult($select[0].selectedOptions[0]);
} }
$root.append($select);
$root.append($(`<div id="verifier-entries">`));
} }
/** /**
...@@ -97,7 +189,7 @@ function renderDmnVerifierOptions() { ...@@ -97,7 +189,7 @@ function renderDmnVerifierOptions() {
*/ */
function renderSelectEntry(verifier) { function renderSelectEntry(verifier) {
return $(` return $(`
<option value="${verifier.type.name}">${verifier.type.name} (${verifier.size})</option> <option value="${verifier.type.name}">${verifier.type.niceName} (${verifier.size})</option>
`); `);
} }
...@@ -108,11 +200,11 @@ function renderSelectEntry(verifier) { ...@@ -108,11 +200,11 @@ function renderSelectEntry(verifier) {
*/ */
function renderVerifierResult(verifierSelect) { function renderVerifierResult(verifierSelect) {
let verifier = findVerifierByName(verifierSelect.value); let verifier = findVerifierByName(verifierSelect.value);
let $verifierEntries = $('#verifier-entries'); let $verifierEntries = $('#dmn-verifier-content');
$verifierEntries.empty(); $verifierEntries.empty();
if (verifier !== undefined) { if (verifier !== undefined) {
$verifierEntries.append($(` $verifierEntries.append($(`
<div>${verifier.type.name}: ${verifier.type.description}</div> <div>${verifier.type.niceName}: ${verifier.type.description}</div>
`)); `));
let $entryList = $(`<ul>`); let $entryList = $(`<ul>`);
$verifierEntries.append($entryList); $verifierEntries.append($entryList);
......
...@@ -12,13 +12,15 @@ $tabs.delegate('.tab', 'click', function (e) { ...@@ -12,13 +12,15 @@ $tabs.delegate('.tab', 'click', function (e) {
dmnModeler.open(view); dmnModeler.open(view);
}); });
// calc height
let dmnModelerHeight = $(window).height() / 2.5;
/** /**
* *
* @type {DmnJS} * @type {DmnJS}
*/ */
let dmnModeler = new DmnJS({ let dmnModeler = new DmnJS({
container: $container, container: $container,
height: 450, height: dmnModelerHeight,
width: '100%', width: '100%',
keyboard: { keyboard: {
bindTo: window bindTo: window
...@@ -52,7 +54,7 @@ function exportDiagram() { ...@@ -52,7 +54,7 @@ function exportDiagram() {
} else { } else {
console.log('saving dmn..'); console.log('saving dmn..');
} }
// TODO, download download("dmnTable.dmn", xml);
}); });
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment