diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/ps/core/dmn/domain/vdmn/VTypeRef.java b/dmnverifierapi/src/main/java/de/unikoblenz/ps/core/dmn/domain/vdmn/VTypeRef.java index 979a7141c2803665305cd905321dffb30fe34a91..ab147a7e49b483932115945ca0ac875dfe3cc4b7 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/ps/core/dmn/domain/vdmn/VTypeRef.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/ps/core/dmn/domain/vdmn/VTypeRef.java @@ -20,10 +20,19 @@ public enum VTypeRef { * LocalDateTime}. */ DATE("date", LocalDateTime.class, DateBoundary.class), + /** + * Datetime format, which is represented as {@link DateBoundary} and as java type {@link + * LocalDateTime}. + */ + DATETIME("dateTime", LocalDateTime.class, DateBoundary.class), /** * String format, which is represented as {@link StringBoundary} and as java type {@link String}. */ STRING("string", String.class, StringBoundary.class), + /** + * Any format, which is represented as {@link StringBoundary} and as java type {@link String}. + */ + ANY("any", String.class, StringBoundary.class), /** * Integer format, which is represented as {@link IntegerBoundary} and as java type {@link * Integer}. @@ -39,7 +48,10 @@ public enum VTypeRef { */ DOUBLE("double", Double.class, DoubleBoundary.class), /** Long format, which is represented as {@link LongBoundary} and as java type {@link Long}. */ - LONG("long", Long.class, LongBoundary.class); + LONG("long", Long.class, LongBoundary.class), + + /** Number format, which is represented as {@link LongBoundary} and as java type {@link Long}. */ + NUMBER("number", Long.class, LongBoundary.class); private String name; private Class<?> javaClass; diff --git a/dmnverifierapi/src/main/resources/application.properties b/dmnverifierapi/src/main/resources/application.properties index d5afb4f4a83fb23ef8e35fe626858b139c731e06..b718eeddb1d37f13145e221390998934e040c388 100644 --- a/dmnverifierapi/src/main/resources/application.properties +++ b/dmnverifierapi/src/main/resources/application.properties @@ -38,3 +38,4 @@ verifier.MissingInputColumnVerification=true verifier.MissingColumnVerification=true verifier.PartialReductionVerification=true verifier.MissingRulesVerification=true +quarkus.console.color=true diff --git a/dmnverifierfrontend/src/main/resources/META-INF/resources/dmn/emptyDMN.dmn b/dmnverifierfrontend/src/main/resources/META-INF/resources/dmn/emptyDMN.dmn index f6fbeeac420da80fc9bf42df7cd00b2e662b2547..aad29301a320a8c018ce980b7ffec82f8e01997d 100644 --- a/dmnverifierfrontend/src/main/resources/META-INF/resources/dmn/emptyDMN.dmn +++ b/dmnverifierfrontend/src/main/resources/META-INF/resources/dmn/emptyDMN.dmn @@ -1,16 +1,18 @@ <?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_genid1" name="DRD" namespace="http://camunda.org/schema/1.0/dmn"> - <decision id="Decision_genid2" 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> +<definitions xmlns="https://www.omg.org/spec/DMN/20191111/MODEL/" xmlns:dmndi="https://www.omg.org/spec/DMN/20191111/DMNDI/" xmlns:dc="http://www.omg.org/spec/DMN/20180521/DC/" id="dish" name="Dish" namespace="http://camunda.org/schema/1.0/dmn" exporter="Camunda Modeler" exporterVersion="5.6.0"> + <decision id="Decision_155sesi" name="Decision 1"> + <decisionTable id="DecisionTable_04qiort"> + <input id="InputClause_1gu3xrb"> + <inputExpression id="LiteralExpression_0l1tttf" typeRef="string" /> </input> - <output id="output_1" typeRef="string" /> + <output id="OutputClause_0pfifw9" typeRef="string" /> </decisionTable> </decision> + <dmndi:DMNDI> + <dmndi:DMNDiagram id="DMNDiagram_05sfxgt"> + <dmndi:DMNShape id="DMNShape_02411es" dmnElementRef="Decision_155sesi"> + <dc:Bounds height="80" width="180" x="160" y="80" /> + </dmndi:DMNShape> + </dmndi:DMNDiagram> + </dmndi:DMNDI> </definitions> diff --git a/dmnverifierfrontend/src/main/resources/META-INF/resources/index.html b/dmnverifierfrontend/src/main/resources/META-INF/resources/index.html index 9b7f0fa274b4563517bd217553d483e551fac7aa..be2b84c43ad06be6198fac850e0f0a554f7a4a06 100644 --- a/dmnverifierfrontend/src/main/resources/META-INF/resources/index.html +++ b/dmnverifierfrontend/src/main/resources/META-INF/resources/index.html @@ -4,16 +4,16 @@ <meta charset="UTF-8"> <meta content="width=device-width, initial-scale=1.0" name="viewport"> <title>DMN App</title> - <link href="https://unpkg.com/dmn-js@7.1.0/dist/assets/diagram-js.css" rel="stylesheet"> - <link href="https://unpkg.com/dmn-js@7.1.0/dist/assets/dmn-js-shared.css" rel="stylesheet"> - <link href="https://unpkg.com/dmn-js@7.1.0/dist/assets/dmn-js-drd.css" rel="stylesheet"> - <link href="https://unpkg.com/dmn-js@7.1.0/dist/assets/dmn-js-decision-table.css" + <link href="https://unpkg.com/dmn-js@14.1.5/dist/assets/diagram-js.css" rel="stylesheet"> + <link href="https://unpkg.com/dmn-js@14.1.5/dist/assets/dmn-js-shared.css" rel="stylesheet"> + <link href="https://unpkg.com/dmn-js@14.1.5/dist/assets/dmn-js-drd.css" rel="stylesheet"> + <link href="https://unpkg.com/dmn-js@14.1.5/dist/assets/dmn-js-decision-table.css" rel="stylesheet"> - <link href="https://unpkg.com/dmn-js@7.1.0/dist/assets/dmn-js-decision-table-controls.css" + <link href="https://unpkg.com/dmn-js@14.1.5/dist/assets/dmn-js-decision-table-controls.css" rel="stylesheet"> - <link href="https://unpkg.com/dmn-js@7.1.0/dist/assets/dmn-js-literal-expression.css" + <link href="https://unpkg.com/dmn-js@14.1.5/dist/assets/dmn-js-literal-expression.css" rel="stylesheet"> - <link href="https://unpkg.com/dmn-js@7.1.0/dist/assets/dmn-font/css/dmn.css" rel="stylesheet"> + <link href="https://unpkg.com/dmn-js@14.1.5/dist/assets/dmn-font/css/dmn.css" rel="stylesheet"> <link href="https://cdnjs.cloudflare.com/ajax/libs/jquery-modal/0.9.1/jquery.modal.min.css" rel="stylesheet"/> <link href="assets/css/select2.min.css" rel="stylesheet"/> @@ -70,7 +70,7 @@ <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-modal/0.9.1/jquery.modal.min.js"></script> <!-- load dmn modeler --> -<script src="https://unpkg.com/dmn-js@7.1.0/dist/dmn-modeler.development.js"></script> +<script src="https://unpkg.com/dmn-js@14.1.5/dist/dmn-modeler.development.js"></script> <script src="js/dmnUpDownload.js" type="text/javascript"></script> <script src="js/dmnViewer.js" type="text/javascript"></script> diff --git a/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnCamundaApi.js b/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnCamundaApi.js index f89cd5fe603a93a022b6e13ba399f13b07da7baf..890fd6d22f108617711f69c3a5308309c035b1bb 100644 --- a/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnCamundaApi.js +++ b/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnCamundaApi.js @@ -83,8 +83,8 @@ function diconnectCamunda() { refreshParams(); } -function deployDmn() { - let dmnXml = exportDiagram(); +async function deployDmn() { + let {dmnXml} = await exportDiagram(); if (dmnXml) { if (confirm("Do you really want to deploy this dmn?")) { var fileStringArray = [dmnXml]; diff --git a/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnUpDownload.js b/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnUpDownload.js index 918f6a744e26ddc6f9221e715888881f0a8e0f96..ed927ba8038cba245b9a81204fd59a26b84bd940 100644 --- a/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnUpDownload.js +++ b/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnUpDownload.js @@ -1,88 +1,89 @@ const SESSION_KEY_CURRENT_DMN = 'dmnSession'; $(document).ready(function () { - $('#dmn-file-upload').on('change', loadDmnFromFile); - $('#dmn-file-empty').on('click', loadEmptyFile); - $('#dmn-file-download').on('click', download); - // try to load dmn from session - loadSessionDmn(); + $('#dmn-file-upload').on('change', loadDmnFromFile); + $('#dmn-file-empty').on('click', loadEmptyFile); + $('#dmn-file-download').on('click', download); + // try to load dmn from session + loadSessionDmn(); }); function loadDmnFromFile(evt) { - let files = evt.target.files; - let dmnFile = files[0]; - let fileReader = new FileReader(); - fileReader.onload = function (fileLoadedEvent) { - let textFromFileLoaded = fileLoadedEvent.target.result; - openDiagram(textFromFileLoaded); - }; - fileReader.readAsText(dmnFile, "UTF-8"); - evt.target.value = null; + let files = evt.target.files; + let dmnFile = files[0]; + let fileReader = new FileReader(); + fileReader.onload = function (fileLoadedEvent) { + let textFromFileLoaded = fileLoadedEvent.target.result; + openDiagram(textFromFileLoaded); + }; + fileReader.readAsText(dmnFile, "UTF-8"); + evt.target.value = null; } function loadEmptyFile(caller, path) { - if (!path) { - path = 'dmn/emptyDMN.dmn'; - } - $.ajax({ - url: path, - type: 'GET', - cache: false, - contentType: 'text/xml', - success: function (data) { - if (typeof data === 'object') { - data = new XMLSerializer().serializeToString(data); - } - data = data.replace("genid1", generateId(8)) - .replace("genid2", generateId(8)); - openDiagram(data); + if (!path) { + path = 'dmn/emptyDMN.dmn'; } - }); + $.ajax({ + url: path, + type: 'GET', + cache: false, + contentType: 'text/xml', + success: function (data) { + if (typeof data === 'object') { + data = new XMLSerializer().serializeToString(data); + } + data = data.replace("genid1", generateId(8)) + .replace("genid2", generateId(8)); + openDiagram(data); + } + }); } -function download() { - let dmnXml = exportDiagram(); - if (dmnXml !== undefined) { - var filename = "dmnTable.dmn"; - var pom = document.createElement('a'); - var bb = new Blob([dmnXml], {type: 'text/xml'}); - pom.setAttribute('href', window.URL.createObjectURL(bb)); - pom.setAttribute('download', filename); - pom.dataset.downloadurl = ['text/plain', pom.download, pom.href].join(':'); - pom.draggable = true; - pom.classList.add('dragout'); - pom.click(); - } +async function download() { + const {dmnXml} = await exportDiagram(); + if (dmnXml !== undefined) { + var filename = "dmnTable.dmn"; + var pom = document.createElement('a'); + var bb = new Blob([dmnXml], {type: 'text/xml'}); + pom.setAttribute('href', window.URL.createObjectURL(bb)); + pom.setAttribute('download', filename); + pom.dataset.downloadurl = ['text/plain', pom.download, pom.href].join(':'); + pom.draggable = true; + pom.classList.add('dragout'); + pom.click(); + } } + function loadSessionDmn() { - // Check, if there is a provided url - let searchParams = new URLSearchParams(window.location.search); - if (searchParams.has('dmnurl')) { - loadEmptyFile(this, searchParams.get('dmnurl')); - searchParams.delete('dmnurl'); - } else { - // Get saved dmn from sessionStorage - let dmn = localStorage.getItem(SESSION_KEY_CURRENT_DMN); - if (dmn === null || dmn === "undefined") { - loadEmptyFile(); + // Check, if there is a provided url + let searchParams = new URLSearchParams(window.location.search); + if (searchParams.has('dmnurl')) { + loadEmptyFile(this, searchParams.get('dmnurl')); + searchParams.delete('dmnurl'); } else { - openDiagram(dmn); + // Get saved dmn from sessionStorage + let dmn = localStorage.getItem(SESSION_KEY_CURRENT_DMN); + if (dmn === null || dmn === "undefined") { + loadEmptyFile(); + } else { + openDiagram(dmn); + } } - } } -function saveSessionDmn() { - // Save data to sessionStorage - let dmnXml = exportDiagram(); - localStorage.setItem(SESSION_KEY_CURRENT_DMN, dmnXml); +async function saveSessionDmn() { + // Save data to sessionStorage + let {dmnXml} = await exportDiagram(); + localStorage.setItem(SESSION_KEY_CURRENT_DMN, dmnXml); } function generateId(length) { - var result = ''; - var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - var charactersLength = characters.length; - for (var i = 0; i < length; i++) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); - } - return result; + var result = ''; + var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + var charactersLength = characters.length; + for (var i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; } diff --git a/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnVerifier.js b/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnVerifier.js index 819da4eb9e7177315ea5f6dde85b459345b7acee..5e21805fa949ee985e5d3547b05bd6bddca28097 100644 --- a/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnVerifier.js +++ b/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnVerifier.js @@ -3,9 +3,9 @@ let inactiveBackend = true; let activeRequest = false; $(document).ready(async function () { - // load types - dmnApi = await (await fetch("/api/dmnvertificationapiurl/")).text() + "api/dmn/"; - loadAvailableTypes(); + // load types + dmnApi = await (await fetch("/api/dmnvertificationapiurl/")).text() + "api/dmn/"; + loadAvailableTypes(); }); /** * Global definition for verification results @@ -48,244 +48,244 @@ const $checkBoxReverify = $(` let $reverifyElement = $(`<label>Reverify</label>`).append($checkBoxReverify); function handleStatus() { - let $dot = $('#backend-status'); - if (inactiveBackend) { - verifierResults = {}; - $dot.removeClass('active'); - $dot.addClass('inactive'); - alert( - "Error: The backend is currently not available. Please try again later.") - } else { - $dot.removeClass('inactive'); - $dot.addClass('active'); - } - cleanDmnVerifierRoot(); + let $dot = $('#backend-status'); + if (inactiveBackend) { + verifierResults = {}; + $dot.removeClass('active'); + $dot.addClass('inactive'); + alert( + "Error: The backend is currently not available. Please try again later.") + } else { + $dot.removeClass('inactive'); + $dot.addClass('active'); + } + cleanDmnVerifierRoot(); } function loadAvailableTypes() { - $.ajax({ - timeout: 1000, - url: dmnApi + 'verification/types', - type: 'GET', - error: function (err) { - inactiveBackend = true; - types = []; - handleStatus(); - }, - success: function (data) { - inactiveBackend = false; - 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; + $.ajax({ + timeout: 1000, + url: dmnApi + 'verification/types', + type: 'GET', + error: function (err) { + inactiveBackend = true; + types = []; + handleStatus(); + }, + success: function (data) { + inactiveBackend = false; + 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(); + handleStatus(); } - }); - $verifierTypes = renderTypeOptions(); - handleStatus(); - } - }); + }); } function cleanDmnVerifierRoot() { - let $root = $('#root-dmn-verifier').empty(); - let $header = $(` + let $root = $('#root-dmn-verifier').empty(); + let $header = $(` <div id="dmn-verifier-header"> `); - // check, if backend is available - if ($verifierTypes === undefined) { - $header.append($buttonReconnect); - } else { - $header.append($buttonClean); - $header.append($verifierTypes); - $verifierTypes.select2({ - containerCssClass: "dmn-verifier-header-item dmn-verifier-select clickable", - placeholder: { - id: -1, - text: "All verifier" - }, - width: 'resolve', - allowClear: true, - }); - // Add Button Verifications - $header.append($buttonVerify); - $header.append($reverifyElement); - $select.empty(); - $header.append($select); - } + // check, if backend is available + if ($verifierTypes === undefined) { + $header.append($buttonReconnect); + } else { + $header.append($buttonClean); + $header.append($verifierTypes); + $verifierTypes.select2({ + containerCssClass: "dmn-verifier-header-item dmn-verifier-select clickable", + placeholder: { + id: -1, + text: "All verifier" + }, + width: 'resolve', + allowClear: true, + }); + // Add Button Verifications + $header.append($buttonVerify); + $header.append($reverifyElement); + $select.empty(); + $header.append($select); + } // add header to root - $root.append($header); - $('.select2-search__field').css('width', ''); - $root.append($(`<div id="dmn-verifier-content">`)); - return $root; + $root.append($header); + $('.select2-search__field').css('width', ''); + $root.append($(`<div id="dmn-verifier-content">`)); + return $root; } -function checkVerifications(showErrorMessage) { - if (!activeRequest) { - activeRequest = true; - saveSessionDmn(); - //cleanDmnVerifierRoot(); - setTimeout(function () { - getVerifications(showErrorMessage) - }, 20); - } +async function checkVerifications(showErrorMessage) { + if (!activeRequest) { + activeRequest = true; + await saveSessionDmn(); + //cleanDmnVerifierRoot(); + setTimeout(function () { + getVerifications(showErrorMessage) + }, 20); + } } -function getVerifications(showErrorMessage) { - dmnModeler.saveXML({format: true}, function (err, xml) { +async function getVerifications(showErrorMessage) { + let err = undefined; + const {xml} = await dmnModeler.saveXML({format: true}); if (err) { - return alert(err); + return alert(err); } 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] === undefined) { - apiPath += '?'; + apiPath += '?'; } else { - apiPath += "/types"; - apiPath += '?'; - for (let i = 0; i < $verifierTypes[0].selectedOptions.length; i++) { - apiPath += 'typeName=' + $verifierTypes[0].selectedOptions[i].value - + '&'; - } + apiPath += "/types"; + apiPath += '?'; + for (let i = 0; i < $verifierTypes[0].selectedOptions.length; i++) { + apiPath += 'typeName=' + $verifierTypes[0].selectedOptions[i].value + + '&'; + } } apiPath += 'token=' + getMetricToken(); $.ajax({ - timeout: 0, // ?? - url: apiPath, - type: 'POST', - contentType: 'text/xml', - data: xml, + timeout: 0, // ?? + url: apiPath, + type: 'POST', + contentType: 'text/xml', + data: xml, - error: function (err) { - activeRequest = false; - cleanDmnVerifierRoot(); - if (showErrorMessage) { - alert( - 'Error: There was a fatal error while parsing the xml of the dmn.'); - } - }, - success: function (data) { - cleanDmnVerifierRoot(); - activeRequest = false; - console.log('successful dmn verification request:'); - verifierResults = data; - // sort the list 1. classification, 2. size of entries - verifierResults.verifier.sort(function ( - /** VerifierResult */ firstEl, /** VerifierResult */ secondEl) { - if (firstEl.type.classification.name - === secondEl.type.classification.name) { - if (firstEl.size === secondEl.size) { - return firstEl.type.name < secondEl.type.name ? -1 : 1; - } else if (firstEl.size < secondEl.size) { - return 1; - } else { - return -1; + error: function (err) { + activeRequest = false; + cleanDmnVerifierRoot(); + if (showErrorMessage) { + alert( + 'Error: There was a fatal error while parsing the xml of the dmn.'); } - } else if (firstEl.type.classification.name - < secondEl.type.classification.name) { - return -1; - } else { - return 1; - } - }); - renderDmnVerifierOptions(); - } + }, + success: function (data) { + cleanDmnVerifierRoot(); + activeRequest = false; + console.log('successful dmn verification request:'); + verifierResults = data; + // sort the list 1. classification, 2. size of entries + verifierResults.verifier.sort(function ( + /** VerifierResult */ firstEl, /** VerifierResult */ secondEl) { + if (firstEl.type.classification.name + === secondEl.type.classification.name) { + if (firstEl.size === secondEl.size) { + return firstEl.type.name < secondEl.type.name ? -1 : 1; + } else if (firstEl.size < secondEl.size) { + return 1; + } else { + return -1; + } + } else if (firstEl.type.classification.name + < secondEl.type.classification.name) { + return -1; + } else { + return 1; + } + }); + renderDmnVerifierOptions(); + } }); - }); } function renderTypeOptions() { - let $select = $(` + let $select = $(` <select name="verifier[]" id="dmn-verifier-types" multiple="multiple" title="Preselect verifications" class="dmn-verifier-header-item dmn-verifier-select clickable"> `); - 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}"> + 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($(` + currentOpt = types[i].classification.niceName; + } + $curGroup.append($(` <option value="${types[i].name}">${types[i].niceName}</option>` - )); + )); - } - $select.append($curGroup); - return $select; + } + $select.append($curGroup); + return $select; } function renderDmnVerifierOptions() { - cleanHighlightFunction(); - let currentOpt = ''; - let $curGroup; - let selOpt = false; - $select.append($(`<option>Select a verifier</option>`)); - if (lastTypeSelect && lastTypeSelect === 'all') { - $select.append( - $(`<option value="all" selected>All verification results</option>`)); - selOpt = true; - } else { - $select.append($(`<option value="all">All verification results</option>`)); - } - for (let i = 0; i < verifierResults.verifier.length; i++) { - let verifier = verifierResults.verifier[i]; - let bolNewGroup = currentOpt - !== verifier.type.classification.niceName; - if (bolNewGroup) { - if (currentOpt === currentOpt) { - $select.append($curGroup); - } - $curGroup = ($(` + cleanHighlightFunction(); + let currentOpt = ''; + let $curGroup; + let selOpt = false; + $select.append($(`<option>Select a verifier</option>`)); + if (lastTypeSelect && lastTypeSelect === 'all') { + $select.append( + $(`<option value="all" selected>All verification results</option>`)); + selOpt = true; + } else { + $select.append($(`<option value="all">All verification results</option>`)); + } + for (let i = 0; i < verifierResults.verifier.length; i++) { + let verifier = verifierResults.verifier[i]; + let bolNewGroup = currentOpt + !== verifier.type.classification.niceName; + if (bolNewGroup) { + if (currentOpt === currentOpt) { + $select.append($curGroup); + } + $curGroup = ($(` <optgroup label="${verifier.type.classification.niceName}"> `)); - currentOpt = verifier.type.classification.niceName; - } - let $option; - if (verifierResults.verifier.length === 1 || - lastTypeSelect !== undefined && lastTypeSelect === verifier.type.name) { - selOpt = true; - $option = $(` + currentOpt = verifier.type.classification.niceName; + } + let $option; + if (verifierResults.verifier.length === 1 || + lastTypeSelect !== undefined && lastTypeSelect === verifier.type.name) { + selOpt = true; + $option = $(` <option value="${verifier.type.name}" selected>${verifier.type.niceName} (${verifier.size})</option> `); - } else { - $option = $(` + } else { + $option = $(` <option value="${verifier.type.name}">${verifier.type.niceName} (${verifier.size})</option> `); + } + if (verifier.size === 0) { + $option.css('color', '#999') + } + $curGroup.append($option); } - if (verifier.size === 0) { - $option.css('color', '#999') - } - $curGroup.append($option); - } - $select.append($curGroup); + $select.append($curGroup); - if (selOpt) { - renderVerifierResult($select[0].selectedOptions[0]); - } + if (selOpt) { + renderVerifierResult($select[0].selectedOptions[0]); + } } /** @@ -293,28 +293,28 @@ function renderDmnVerifierOptions() { * @param {Option} verifierSelect */ function renderVerifierResult(verifierSelect) { - cleanHighlightFunction(); - let $verifierContent = $('#dmn-verifier-content'); - $verifierContent.empty(); - $verifierContent.css('display', 'none'); - if (verifierSelect.value === 'all') { - lastTypeSelect = 'all'; - for (const [key, option] of Object.entries($select[0].options)) { - let verifier = findVerifierByName(option.value); - if (verifier && verifier.size > 0) { - renderVerifier(verifier); - } - } - } else { - let verifier = findVerifierByName(verifierSelect.value); - if (verifier === undefined) { - lastTypeSelect = undefined; + cleanHighlightFunction(); + let $verifierContent = $('#dmn-verifier-content'); + $verifierContent.empty(); + $verifierContent.css('display', 'none'); + if (verifierSelect.value === 'all') { + lastTypeSelect = 'all'; + for (const [key, option] of Object.entries($select[0].options)) { + let verifier = findVerifierByName(option.value); + if (verifier && verifier.size > 0) { + renderVerifier(verifier); + } + } } else { - lastTypeSelect = verifier.type.name; - renderVerifier(verifier); + let verifier = findVerifierByName(verifierSelect.value); + if (verifier === undefined) { + lastTypeSelect = undefined; + } else { + lastTypeSelect = verifier.type.name; + renderVerifier(verifier); + } } - } - $verifierContent.show(); + $verifierContent.show(); } /** @@ -322,26 +322,26 @@ function renderVerifierResult(verifierSelect) { * @param {VerifierResult} verifier */ function renderVerifier(verifier) { - let $verifierContent = $('#dmn-verifier-content'); - let $verifierType = $(`<div class="verifier-type"></div>`); - let $verifierEntries = $(`<div class="verifier-entries"></div>`); + let $verifierContent = $('#dmn-verifier-content'); + let $verifierType = $(`<div class="verifier-type"></div>`); + let $verifierEntries = $(`<div class="verifier-entries"></div>`); - // name and description of verifier - $verifierType.append($(` + // name and description of verifier + $verifierType.append($(` <div class="verifier-type-name"><h2>${verifier.type.niceName}</h2></div> `)); - $verifierType.append($(` + $verifierType.append($(` <div class="verifier-type-description"><p>${verifier.type.description}</p></div> `)); - // Add entries if min 1 result - if (verifier.entries.length > 0) { - for (let i = 0; i < verifier.entries.length; i++) { - $verifierEntries.append(renderVerificationEntry(verifier.entries[i])); + // Add entries if min 1 result + if (verifier.entries.length > 0) { + for (let i = 0; i < verifier.entries.length; i++) { + $verifierEntries.append(renderVerificationEntry(verifier.entries[i])); + } } - } - $verifierContent.append($verifierType); - $verifierContent.append($verifierEntries); + $verifierContent.append($verifierType); + $verifierContent.append($verifierEntries); } /** @@ -349,18 +349,18 @@ function renderVerifier(verifier) { * @param {VerificationEntry} verificationEntry */ function renderVerificationEntry(verificationEntry) { - let $entryContainer = $( - `<div id="ver-entry-${verificationEntry.id}" class="verification-container"></div>`); - $entryContainer.append($(` + let $entryContainer = $( + `<div id="ver-entry-${verificationEntry.id}" class="verification-container"></div>`); + $entryContainer.append($(` <span class="dmn-verification-icon dmn-${verificationEntry.verificationClassification}"/> `)); - $entryContainer.append($(` + $entryContainer.append($(` <div class="verification-message">${verificationEntry.message}</div> `)); - let $fixButtons = $(`<div class="verification-container-fix-buttons"></div>`); - renderFixButtons($fixButtons, verificationEntry); - $entryContainer.append($fixButtons); - return $entryContainer; + let $fixButtons = $(`<div class="verification-container-fix-buttons"></div>`); + renderFixButtons($fixButtons, verificationEntry); + $entryContainer.append($fixButtons); + return $entryContainer; } /** @@ -369,17 +369,17 @@ function renderVerificationEntry(verificationEntry) { * @param {VerificationEntry} verificationEntry */ function renderFixButtons($fixButtons, verificationEntry) { - for (let i = 0; i < verificationEntry.verificationFixes.length; i++) { - let fix = verificationEntry.verificationFixes[i]; - let $fixButton = $(` + for (let i = 0; i < verificationEntry.verificationFixes.length; i++) { + let fix = verificationEntry.verificationFixes[i]; + let $fixButton = $(` <button class="verification-fix-button clickable">${fix.fixName}</button> `); - $fixButton.on('click', function () { - performVerificationFix(verificationEntry, fix, verificationEntry.id, - $fixButton); - }); - $fixButtons.append($fixButton); - } + $fixButton.on('click', function () { + performVerificationFix(verificationEntry, fix, verificationEntry.id, + $fixButton); + }); + $fixButtons.append($fixButton); + } } /** @@ -389,24 +389,24 @@ function renderFixButtons($fixButtons, verificationEntry) { * @return VerifierResult */ function findVerifierByName(verifierName) { - for (let i = 0; i < verifierResults.verifier.length; i++) { - if (verifierResults.verifier[i].type.name === verifierName) { - return verifierResults.verifier[i]; + for (let i = 0; i < verifierResults.verifier.length; i++) { + if (verifierResults.verifier[i].type.name === verifierName) { + return verifierResults.verifier[i]; + } } - } - return undefined; + return undefined; } function getMetricToken() { - var token = localStorage.getItem('metricToken'); - if (token === null || token === 'undefined') { - var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - var charactersLength = characters.length; - token = ''; - for (var i = 0; i < 20; i++) { - token += characters.charAt(Math.floor(Math.random() * charactersLength)); + var token = localStorage.getItem('metricToken'); + if (token === null || token === 'undefined') { + var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + var charactersLength = characters.length; + token = ''; + for (var i = 0; i < 20; i++) { + token += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + localStorage.setItem('metricToken', token); } - localStorage.setItem('metricToken', token); - } - return token; + return token; } diff --git a/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnVerifierActions.js b/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnVerifierActions.js index d768b16ddc2a627623cb004c7c677ba3957f9c36..b4e22510daf7a5e04a07b96b8b4fc78c2be7cfb0 100644 --- a/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnVerifierActions.js +++ b/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnVerifierActions.js @@ -58,7 +58,7 @@ function getRandomNewPointInCycle(sourceX, sourceY, w, offsetX, offsetY) { * @param id fix row id * @param $callerButton */ -function performVerificationFix(verificationEntry, fix, id, $callerButton) { +async function performVerificationFix(verificationEntry, fix, id, $callerButton) { console.log("FIX", fix); // highlight row cleanHighlightFunction(); @@ -89,7 +89,7 @@ function performVerificationFix(verificationEntry, fix, id, $callerButton) { if (cud) { $callerButton.css('display', 'none'); if ($checkBoxReverify[0].checked) { - checkVerifications(); + await checkVerifications(); } } performHighlightFunction(); diff --git a/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnViewer.js b/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnViewer.js index 620e40e648c067279017a7a3513f77c4202ff31d..bcc5a491a8c5f689c8458cc2493a5e88bd863113 100644 --- a/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnViewer.js +++ b/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnViewer.js @@ -1,15 +1,15 @@ let $container = $('.editor-container'); let $tabs = $('.editor-tabs'); let CLASS_NAMES = { - drd: 'dmn-icon-lasso-tool', - decisionTable: 'dmn-icon-decision-table', - literalExpression: 'dmn-icon-literal-expression' + drd: 'dmn-icon-lasso-tool', + decisionTable: 'dmn-icon-decision-table', + literalExpression: 'dmn-icon-literal-expression' }; $tabs.delegate('.tab', 'click', function (e) { - var viewIdx = parseInt(this.getAttribute('data-id'), 10); - var view = dmnModeler.getViews()[viewIdx]; - dmnModeler.open(view); + var viewIdx = parseInt(this.getAttribute('data-id'), 10); + var view = dmnModeler.getViews()[viewIdx]; + dmnModeler.open(view); }); let eventsDefinedDrd = false; @@ -21,79 +21,72 @@ let dmnModelerHeight = $(window).height() / 2.5; * @type {DmnJS} */ let dmnModeler = new DmnJS({ - container: $container, - height: dmnModelerHeight, - keyboard: { - bindTo: window - } + container: $container, + height: dmnModelerHeight, + keyboard: { + bindTo: window + } }); -dmnModeler.on('views.changed', function (event) { - // save dmn in Session - saveSessionDmn(); - var {views, activeView} = event; - // clear tabs - $tabs.empty(); - // add fullscreen - $tabs.append($(` +dmnModeler.on('views.changed', async function (event) { + // save dmn in Session + await saveSessionDmn(); + var {views, activeView} = event; + // clear tabs + $tabs.empty(); + // add fullscreen + $tabs.append($(` <div class="toggle-fullscreen clickable" onclick="toggleFullscreen()"> </div> `)); - // add tabs - views.forEach(function (v, idx) { - const className = CLASS_NAMES[v.type]; - var tab = $(` + // add tabs + views.forEach(function (v, idx) { + const className = CLASS_NAMES[v.type]; + var tab = $(` <div class="tab clickable ${v === activeView ? 'active' : ''}" data-id="${idx}" id="tab-dec-${v.element.id}"> <span class="${className}"></span> ${v.element.name || v.element.id} </div> `); - $tabs.append(tab); - }); - const eventBus = dmnModeler.getActiveViewer().get("eventBus"); - if (!eventsDefinedDrd) { - eventsDefinedDrd = true; - eventBus.on( - "element.changed", - 1200, - function (ev, b) { - if (!inactiveBackend && renderHighlightFunction.length === 0 - && $checkBoxReverify[0].checked) { - checkVerifications(); - } - }, this); - } - if (!eventsDefinedTable && ("addInput" in eventBus._listeners)) { - eventsDefinedTable = true; - eventBus.on( - ["elements.changed"], - 1200, - function (ev, b) { - if (!inactiveBackend && renderHighlightFunction.length === 0 - && $checkBoxReverify[0].checked) { - checkVerifications(); - } - }, this); - } - performHighlightFunction(); + $tabs.append(tab); + }); + const eventBus = dmnModeler.getActiveViewer().get("eventBus"); + if (!eventsDefinedDrd) { + eventsDefinedDrd = true; + eventBus.on( + "element.changed", + 1200, + function (ev, b) { + if (!inactiveBackend && renderHighlightFunction.length === 0 + && $checkBoxReverify[0].checked) { + checkVerifications(); + } + }, this); + } + if (!eventsDefinedTable && ("addInput" in eventBus._listeners)) { + eventsDefinedTable = true; + eventBus.on( + ["elements.changed"], + 1200, + function (ev, b) { + if (!inactiveBackend && renderHighlightFunction.length === 0 + && $checkBoxReverify[0].checked) { + checkVerifications(); + } + }, this); + } + performHighlightFunction(); } ); /** * Save diagram contents and print them to the console. */ -function exportDiagram() { - let retXml = undefined; - dmnModeler.saveXML({format: false}, function (err, xml) { - if (err) { - console.log('could not export DMN 1.1 diagram'); - } else { - console.log('exporting DMN 1.1 diagram..'); - retXml = xml; - } - }); - return retXml; +async function exportDiagram() { + const {xml} = await dmnModeler.saveXML({format: true}) + console.log('exporting DMN 1.3 diagram..'); + return xml; } /** @@ -101,39 +94,35 @@ function exportDiagram() { * * @param {String} dmnXML diagram to display */ -function openDiagram(dmnXML) { - // clean - cleanDmnVerifierRoot(); - // import diagram - dmnModeler.importXML(dmnXML, function (err) { - if (err) { - return console.error('could not open DMN'); - } +async function openDiagram(dmnXML) { + // clean + cleanDmnVerifierRoot(); + // import diagram + await dmnModeler.importXML(dmnXML); // fetch currently active view var activeView = dmnModeler.getActiveView(); // apply initial logic in DRD view if (activeView.type === 'drd') { - var activeEditor = dmnModeler.getActiveViewer(); - // access active editor components - var canvas = activeEditor.get('canvas'); - // zoom to fit full viewport - canvas.zoom('fit-viewport'); + var activeEditor = dmnModeler.getActiveViewer(); + // access active editor components + var canvas = activeEditor.get('canvas'); + // zoom to fit full viewport + canvas.zoom('fit-viewport'); } - }); } function toggleFullscreen() { - $(".dmn-js-parent").toggleClass('fullscreen'); - $("#root-dmn-verifier").toggleClass('hidden'); - $("#dmn-top").toggleClass('hidden'); - $(".editor-tabs").toggleClass('fullscreen-tabs'); - // calc height - if ($(".dmn-js-parent").hasClass('fullscreen')) { - $(".dmn-js-parent").css('height', ''); - } else { - let dmnModelerHeight = $(window).height() / 2.5; - $(".dmn-js-parent").css('height', dmnModelerHeight + 'px'); - } + $(".dmn-js-parent").toggleClass('fullscreen'); + $("#root-dmn-verifier").toggleClass('hidden'); + $("#dmn-top").toggleClass('hidden'); + $(".editor-tabs").toggleClass('fullscreen-tabs'); + // calc height + if ($(".dmn-js-parent").hasClass('fullscreen')) { + $(".dmn-js-parent").css('height', ''); + } else { + let dmnModelerHeight = $(window).height() / 2.5; + $(".dmn-js-parent").css('height', dmnModelerHeight + 'px'); + } } /** @@ -141,29 +130,29 @@ function toggleFullscreen() { * @param id */ function openViewWithId(id) { - var views = dmnModeler.getViews(); - views.forEach(function (view) { - if (view.element.id === id) { - dmnModeler.open(view); - } - }); + var views = dmnModeler.getViews(); + views.forEach(function (view) { + if (view.element.id === id) { + dmnModeler.open(view); + } + }); } // ----- let renderHighlightFunction = []; function performHighlightFunction() { - for (let i = 0; i < renderHighlightFunction.length; i++) { - renderHighlightFunction[i].highlight(); - } + for (let i = 0; i < renderHighlightFunction.length; i++) { + renderHighlightFunction[i].highlight(); + } } function cleanHighlightFunction() { - $('.verification-container').removeClass('highlight-soft'); - for (let i = 0; i < renderHighlightFunction.length; i++) { - renderHighlightFunction[i].clean(); - } - renderHighlightFunction = []; + $('.verification-container').removeClass('highlight-soft'); + for (let i = 0; i < renderHighlightFunction.length; i++) { + renderHighlightFunction[i].clean(); + } + renderHighlightFunction = []; } /** @@ -171,9 +160,9 @@ function cleanHighlightFunction() { * @param {Array<VerificationEntryElement>} elements */ function highlightMultipleDecisions(elements) { - elements.forEach(function (el) { - highlightSingleDecision(el.identifier['decisionId']); - }); + elements.forEach(function (el) { + highlightSingleDecision(el.identifier['decisionId']); + }); } /** @@ -181,12 +170,12 @@ function highlightMultipleDecisions(elements) { * @param decisionId */ function highlightSingleDecision(decisionId) { - // node - let $decisionNode = $( - '[data-element-id=' + decisionId + '] > g > rect'); - $decisionNode.css('fill', 'darkred'); - // tab - $('#tab-dec-' + decisionId).addClass('highlight'); + // node + let $decisionNode = $( + '[data-element-id=' + decisionId + '] > g > rect'); + $decisionNode.css('fill', 'darkred'); + // tab + $('#tab-dec-' + decisionId).addClass('highlight'); } /** @@ -194,9 +183,9 @@ function highlightSingleDecision(decisionId) { * @param {Array<VerificationEntryElement>} elements */ function cleanMultipleDecisions(elements) { - elements.forEach(function (el) { - cleanSingleDecision(el.identifier['decisionId']); - }); + elements.forEach(function (el) { + cleanSingleDecision(el.identifier['decisionId']); + }); } /** @@ -204,12 +193,12 @@ function cleanMultipleDecisions(elements) { * @param decisionId */ function cleanSingleDecision(decisionId) { - // node - let $decisionNode = $( - '[data-element-id=' + decisionId + '] > g > rect'); - $decisionNode.css('fill', 'white'); - // tab - $('#tab-dec-' + decisionId).removeClass('highlight'); + // node + let $decisionNode = $( + '[data-element-id=' + decisionId + '] > g > rect'); + $decisionNode.css('fill', 'white'); + // tab + $('#tab-dec-' + decisionId).removeClass('highlight'); } /** @@ -217,22 +206,22 @@ function cleanSingleDecision(decisionId) { * @param {Array<VerificationEntryElement>}elements */ function highlightRules(elements) { - renderHighlightFunction.push({ - highlight: function () { - highlightMultipleDecisions(elements); - elements.forEach(function (el) { - $('[data-row-id=' + el.identifier['ruleId'] + ']').addClass( - 'highlight'); - }); - }, - clean: function () { - cleanMultipleDecisions(elements); - elements.forEach(function (el) { - $('[data-row-id=' + el.identifier['ruleId'] + ']').removeClass( - 'highlight'); - }); - } - }); + renderHighlightFunction.push({ + highlight: function () { + highlightMultipleDecisions(elements); + elements.forEach(function (el) { + $('[data-row-id=' + el.identifier['ruleId'] + ']').addClass( + 'highlight'); + }); + }, + clean: function () { + cleanMultipleDecisions(elements); + elements.forEach(function (el) { + $('[data-row-id=' + el.identifier['ruleId'] + ']').removeClass( + 'highlight'); + }); + } + }); } /** @@ -241,22 +230,22 @@ function highlightRules(elements) { * @param {string} identifier */ function highlightColumns(elements, identifier) { - renderHighlightFunction.push({ - highlight: function () { - highlightMultipleDecisions(elements); - elements.forEach(function (el) { - $('[data-col-id=' + el.identifier[identifier] + ']').addClass( - 'highlight'); - }); - }, - clean: function () { - cleanMultipleDecisions(elements); - elements.forEach(function (el) { - $('[data-col-id=' + el.identifier[identifier] + ']').removeClass( - 'highlight'); - }); - } - }); + renderHighlightFunction.push({ + highlight: function () { + highlightMultipleDecisions(elements); + elements.forEach(function (el) { + $('[data-col-id=' + el.identifier[identifier] + ']').addClass( + 'highlight'); + }); + }, + clean: function () { + cleanMultipleDecisions(elements); + elements.forEach(function (el) { + $('[data-col-id=' + el.identifier[identifier] + ']').removeClass( + 'highlight'); + }); + } + }); } /** @@ -265,22 +254,22 @@ function highlightColumns(elements, identifier) { * @param {string} identifier */ function highlightDataEntries(elements, identifier) { - renderHighlightFunction.push({ - highlight: function () { - highlightMultipleDecisions(elements); - elements.forEach(function (el) { - $('[data-element-id=' + el.identifier[identifier] + ']').addClass( - 'highlight'); - }); - }, - clean: function () { - cleanMultipleDecisions(elements); - elements.forEach(function (el) { - $('[data-element-id=' + el.identifier[identifier] + ']').removeClass( - 'highlight'); - }); - } - }); + renderHighlightFunction.push({ + highlight: function () { + highlightMultipleDecisions(elements); + elements.forEach(function (el) { + $('[data-element-id=' + el.identifier[identifier] + ']').addClass( + 'highlight'); + }); + }, + clean: function () { + cleanMultipleDecisions(elements); + elements.forEach(function (el) { + $('[data-element-id=' + el.identifier[identifier] + ']').removeClass( + 'highlight'); + }); + } + }); } /** @@ -288,20 +277,20 @@ function highlightDataEntries(elements, identifier) { * @param {Array<VerificationEntryElement>}elements */ function highlightInputData(elements) { - renderHighlightFunction.push({ - highlight: function () { - elements.forEach(function (el) { - $('[data-element-id=' + el.identifier['inputDataId'] + '] > g > rect') - .css('fill', 'darkred'); - }); - }, - clean: function () { - elements.forEach(function (el) { - $('[data-element-id=' + el.identifier['inputDataId'] + '] > g > rect') - .css('fill', 'white'); - }); - } - }); + renderHighlightFunction.push({ + highlight: function () { + elements.forEach(function (el) { + $('[data-element-id=' + el.identifier['inputDataId'] + '] > g > rect') + .css('fill', 'darkred'); + }); + }, + clean: function () { + elements.forEach(function (el) { + $('[data-element-id=' + el.identifier['inputDataId'] + '] > g > rect') + .css('fill', 'white'); + }); + } + }); } /** @@ -309,13 +298,13 @@ function highlightInputData(elements) { * @param {Array<VerificationEntryElement>}elements */ function highlightDecision(elements) { - console.log(elements); - renderHighlightFunction.push({ - highlight: function () { - highlightMultipleDecisions(elements) - }, - clean: function () { - cleanMultipleDecisions(elements); - } - }); + console.log(elements); + renderHighlightFunction.push({ + highlight: function () { + highlightMultipleDecisions(elements) + }, + clean: function () { + cleanMultipleDecisions(elements); + } + }); }