X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=POLICY-SDK-APP%2Fsrc%2Fmain%2Fwebapp%2Fapp%2FpolicyApp%2Fpolicy-models%2FEditor%2FPolicyTemplateController%2FDCAEMicroServicePolicyController.js;h=dca8e916692d18c485c2e4b3ad4d0eb712170663;hb=733918bc47b890af057416cdac3c321374acc321;hp=d0f44d46ee92f92a368530b700e73bc06fe2dca2;hpb=e0addf5b588a1244f9679becd90999dfcb4c3a94;p=policy%2Fengine.git diff --git a/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Editor/PolicyTemplateController/DCAEMicroServicePolicyController.js b/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Editor/PolicyTemplateController/DCAEMicroServicePolicyController.js index d0f44d46e..dca8e9166 100644 --- a/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Editor/PolicyTemplateController/DCAEMicroServicePolicyController.js +++ b/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Editor/PolicyTemplateController/DCAEMicroServicePolicyController.js @@ -1,8 +1,8 @@ /*- * ============LICENSE_START======================================================= - * ECOMP Policy Engine + * ONAP Policy Engine * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,13 +17,44 @@ * limitations under the License. * ============LICENSE_END========================================================= */ -angular.module('abs').controller('dcaeMicroServiceController', function ($scope, $window, $compile, PolicyAppService, modalService, $modal, Notification) { +angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$window', '$compile', 'PolicyAppService', 'policyNavigator', 'modalService', '$modal', 'Notification', function ($scope, $window, $compile, PolicyAppService, PolicyNavigator, modalService, $modal, Notification) { $("#dialog").hide(); + + $scope.policyNavigator; $scope.isCheck = false; $scope.savebutton = true; - $scope.finalPath = null; + $scope.refreshCheck = false; + + var layer = 0; + + if(!$scope.temp.policy.editPolicy && !$scope.temp.policy.readOnly){ + $scope.temp.policy = { + policyType : "Config", + configPolicyType : "Micro Service" + } + }; + + $scope.refresh = function(){ + if($scope.refreshCheck){ + $scope.policyNavigator.refresh(); + } + $scope.modal('createNewPolicy', true); + $scope.temp.policy = ""; + }; + + $scope.modal = function(id, hide) { + return $('#' + id).modal(hide ? 'hide' : 'show'); + }; + + $('#ttlDate').datepicker({ + dateFormat: 'dd/mm/yy', + changeMonth: true, + changeYear: true, + onSelect: function(date) { + angular.element($('#ttlDate')).triggerHandler('input'); + } + }); -// $scope.temp.policy.ttlDate = "2016-12-31"; if ($scope.temp.policy.editPolicy != undefined|| $scope.temp.policy.readOnly != undefined){ if ($scope.temp.policy.configName == undefined){ $scope.isCheck = false; @@ -34,12 +65,12 @@ angular.module('abs').controller('dcaeMicroServiceController', function ($scope, $scope.isCheck = false; } - PolicyAppService.getData('getDictionary/get_EcompNameDataByName').then(function (data) { + PolicyAppService.getData('getDictionary/get_OnapNameDataByName').then(function (data) { var j = data; $scope.data = JSON.parse(j.data); console.log($scope.data); - $scope.ecompNameDictionaryDatas = JSON.parse($scope.data.ecompNameDictionaryDatas); - console.log($scope.ecompNameDictionaryDatas); + $scope.onapNameDictionaryDatas = JSON.parse($scope.data.onapNameDictionaryDatas); + console.log($scope.onapNameDictionaryDatas); }, function (error) { console.log("failed"); }); @@ -68,7 +99,10 @@ angular.module('abs').controller('dcaeMicroServiceController', function ($scope, var j = data; $scope.data = JSON.parse(j.data); console.log($scope.data); - $scope.microServiceCongigNameDictionaryDatas = JSON.parse($scope.data.microServiceCongigNameDictionaryDatas); + console.log("$scope.data.microServiceConfigNameDictionaryDatas : " + $scope.data.microServiceConfigNameDictionaryDatas); + if($scope.data.microServiceConfigNameDictionaryDatas){ + $scope.microServiceCongigNameDictionaryDatas = JSON.parse($scope.data.microServiceConfigNameDictionaryDatas); + } console.log($scope.microServiceCongigNameDictionaryDatas); }, function (error) { console.log("failed"); @@ -136,24 +170,57 @@ angular.module('abs').controller('dcaeMicroServiceController', function ($scope, $scope.choices = []; $scope.attributeDatas = [{"attributes" : $scope.choices}]; - - $scope.addNewChoice = function(value) { - console.log(value); + $scope.isInitEditTemplate = true; //just initially create the edit template, didn't click add button yet. + addNewChoice = function(value) { + console.log("input value : " + value); if(value != undefined){ if (value.startsWith('div.')){ value = value.replace('div.',''); } + + console.log(" document.getElementById : div."+value); var parentElement = document.getElementById("div."+value); + console.log("parentElement : " + parentElement); var div = document.getElementById(value+"@0"); if(div != null){ var clone = div.cloneNode(true); - var addElement = parentElement.childElementCount + 1; + var addElement = parentElement.childElementCount; clone.id = ''+value+'@'+addElement; clone.value = ''; - document.getElementById("div."+value).appendChild(clone); - plainAttributeKeys.push(''+value+'@'+addElement); + if($scope.temp.policy.editPolicy || $scope.temp.policy.readOnly){ //if it's view or edit + if($scope.temp.policy.ruleData[clone.id] || ($scope.temp.policy.editPolicy && !$scope.isInitEditTemplate)){ // Only append child if its value found in ruleData or edit mode + if($scope.temp.policy.ruleData[clone.id]){ + clone.value = $scope.temp.policy.ruleData[clone.id]; + } + if(!clone.className.includes("child_single")){ + clone.className += ' child_single'; //here cloned is single element + } + document.getElementById("div."+value).appendChild(clone); + plainAttributeKeys.push(''+value+'@'+addElement); + } + }else{ //not view or edit + if(!clone.className.includes("child_single")){ + clone.className += ' child_single'; //here cloned is single element + } + document.getElementById("div."+value).appendChild(clone); + plainAttributeKeys.push(''+value+'@'+addElement); + } }else{ + + if(parentElement == null){ + return; + } div = document.getElementById("div."+value+"@0"); + if(div){ + + if(!div.className.includes('children_group border')){ + layer++; + if(layer > 4){ + layer = 1 + }; + div.className += ' children_group border' + layer; //here is div with a group of children. + } + } var childElement = parentElement.firstElementChild; var countParent = parentElement.childElementCount; var childElementString = childElement.innerHTML; @@ -179,14 +246,10 @@ angular.module('abs').controller('dcaeMicroServiceController', function ($scope, for(var i=0; i1){ - if (dictionary!= null || dictionary.length>1){ - for (m=0; m < dictionary.length; m += 1){ - var keyCompare = dictionary[m].name; - var valueCompare = dictionary[m].value; - var valueModel = dictionary[m].modelName; - var conpairService = serviceName; - if (valueModel.includes('-v')){ - conpairService = service; - } - if(valueModel.localeCompare(conpairService) == 0){ - console.log(valueCompare); - dictionaryList.push(dictionary[m]); - if (!dictionaryNameList.includes(dictionary[m].name)){ - dictionaryNameList.push(dictionary[m].name) - } - } - } - } + if (dictionary!= null && dictionary.length>1){ + for (m=0; m < dictionary.length; m += 1){ + var keyCompare = dictionary[m].name; + var valueCompare = dictionary[m].value; + var valueModel = dictionary[m].modelName; + var conpairService = serviceName; + if (valueModel.includes('-v')){ + conpairService = service; + } + if(valueModel.localeCompare(conpairService) == 0){ + console.log(valueCompare); + dictionaryList.push(dictionary[m]); + if (!dictionaryNameList.includes(dictionary[m].name)){ + dictionaryNameList.push(dictionary[m].name) + } + } + } } $scope.temp.policy.ruleGridData = []; + if($scope.temp.policy.editPolicy || $scope.temp.policy.readOnly){ + dataOrderInfo = $scope.dataOrderInfo; + } + $scope.jsonLayout($scope.dcaeJsonDate); }); - if($scope.temp.policy.editPolicy || $scope.temp.policy.readOnly){ + + if($scope.temp.policy.editPolicy || $scope.temp.policy.readOnly){ // If it's veiw or edit + + if($scope.temp.policy.editPolicy){ + $scope.isInitEditTemplate = true; + } + var checkData = []; var data = []; - if($scope.temp.policy.ruleData != null){ - var propNames = Object.getOwnPropertyNames($scope.temp.policy.ruleData); - propNames.forEach(function(name) { - data.push(name); - }); - for(a = 0; a < data.length; a++){ - var splitPlainAttributeKey1 = data[a].split("."); - if(splitPlainAttributeKey1[0].indexOf("@") != -1){ - var key = splitPlainAttributeKey1[0]; - checkData.push(key); - } - } - var unique = checkData.filter(onlyUnique); - for(i =0; i < unique.length; i++){ - if(unique[i].indexOf("@0") == -1){ - var finalkey = unique[i].split("@")[0]; - $scope.addNewChoice(finalkey); - } - } - } + // If ruleData contains extra elements created by clicked add button + if($scope.temp.policy.ruleData != null){ + var propNames = Object.getOwnPropertyNames($scope.temp.policy.ruleData); + propNames.forEach(function(name) { + data.push(name); + }); + + var extraElements = data; + + if(plainAttributeKeys != null){ + for(var b = 0; b < plainAttributeKeys.length; b++){ // Remove already populated elements from data array + var newValue = plainAttributeKeys[b].split("*"); + for(var a = 0; a < data.length; a++){ + if(data[a] === newValue[0] || data[a] === (newValue[0]+"@0")){ + extraElements.splice(a, 1); + } + } + } + + //--- Populate these extra elements created by clicked add button + for(var a = 0; a < extraElements.length; a++){ + if(extraElements[a].includes("@")){ + var index = extraElements[a].lastIndexOf("@"); + if(index > 0){ + // Get the number after @ + var n = getNumOfDigits(extraElements[a], index+1); + + var key = extraElements[a].substring(0, index+n+1); //include @x in key also by n+2 since x can be 1,12, etc + console.log("key: " + key); + checkData.push(key); + } + } + } + var unique = checkData.filter(onlyUnique); + var parentLevelElements = []; + if(unique){ + //--- get all root level exta elments first (only contains one "@") + for(var i =0; i < unique.length; i++){ + var firstIndex = unique[i].indexOf("@"); + var lastIndex = unique[i].lastIndexOf("@"); + if(firstIndex == lastIndex){ + var newKey = unique[i].substring(0, firstIndex); + console.log("root element: " + newKey); + parentLevelElements.push(newKey); + unique[i] = "*processed*"; + } + } + } + //if no layout order info, keep the process as before + if(!dataOrderInfo){ + for(var i =0; i < unique.length; i++){ + //remove @x and let addNewChoice add @1 or @2... + //var newKey = unique[i].substring(0, unique[i].length-2); + var index = unique[i].lastIndexOf("@"); + var newKey = unique[i].substring(0, index); + console.log("newKey: " + newKey); + addNewChoice(newKey); + } + }else{ + + for (var i = 0; i < $scope.labelManyKeys.length; i++) { + //console.log("dataOrderInfo["+i+"]"+ dataOrderInfo[i]); + var label = $scope.labelManyKeys[i]; + + if(parentLevelElements){ + for (var k = 0; k < parentLevelElements.length; k++){ + if(label == parentLevelElements[k]){ + addNewChoice(label); + } + } + + } + + } + + //---reset to default + dataOrderInfo = []; + $scope.labelManyKeys = []; + + //---process none labels + for (var j = 0; j < unique.length; j++){ + if(unique[j] != "*processed*"){ + // if not created yet + if(!document.getElementById(unique[j])){ + var index = unique[j].lastIndexOf("@"); + var newKey = unique[j].substring(0, index); + + var newElement = document.getElementById("div."+unique[j]); + + //check weather it has been created already + if(newElement != null){ + continue; + }else{ + newElement = document.getElementById(unique[j]); + if(newElement != null){ + continue; + } + } + //if not created yet, then create it. + addNewChoice(newKey); + + } + } + } + } + } + } + } var ele = angular.element(document.getElementById("DynamicTemplate")); $compile(ele.contents())($scope); $scope.$apply(); + }, error : function(data){ alert("Error While Retriving the Template Layout Pattren."); } }); + } }; + function getNumOfDigits(str_value, index){ + // Get the number after @ + var str = str_value.substring(index, str_value.length); + var c = ''; + var n = 0; + for (var x = 0; x < str.length; x++){ + c = str.charAt(x); + if(!isNaN(c)){ + n++; + }else{ + break; + } + } + return n; + } + function getDictionary(attribute){ var dicName = attribute; if(attribute){ @@ -384,11 +607,20 @@ angular.module('abs').controller('dcaeMicroServiceController', function ($scope, } function getList(attribute) { - + var enumName = attribute; + console.log("In getList: attribute => " + attribute); + if(attribute){ + if(attribute.includes(":")){ + enumName = attribute.split(":")[0]; + } + } var baseEnum = $scope.dcaeModelData.enumValues; - var enumList = baseEnum.split(splitEnum); + var enumList = []; + if(baseEnum != null){ + enumList = baseEnum.split(splitEnum); + } var enumAttributes; - var patternTest = new RegExp(attribute); + var patternTest = new RegExp(enumName); for (k=0; k < enumList.length; k += 1){ if(patternTest.test(enumList[k]) == true){ enumAttributes = enumList[k].trim(); @@ -399,12 +631,9 @@ angular.module('abs').controller('dcaeMicroServiceController', function ($scope, enumAttributes = enumAttributes.replace("[", ""); enumAttributes = enumAttributes.replace("]", ""); enumAttributes = enumAttributes.replace(/ /g, ''); - var dropListAfterCommaSplit = enumAttributes.split(splitEqual); listemunerateValues = dropListAfterCommaSplit[1].split(splitComma); - - enumKeyList.push(attribute); - + //enumKeyList.push(attribute); return listemunerateValues; } @@ -424,25 +653,49 @@ angular.module('abs').controller('dcaeMicroServiceController', function ($scope, } var lableList = []; - function deconstructJSON(dataTest, level , name) { - var array = false; - var label = level; + $scope.layOutElementList = []; + $scope.layOutOnlyLableList = []; + + var elementOrderNum = 0; + + function deconstructJSON(layOutData, level , name) { + + var array = false; + var label = level; var stringValue = "java.lang.String"; + var string = "string"; var intValue = "int"; + var integerValue = "integer"; var double = "double"; var boolean = "boolean"; var baseLevel = level; + var list = "list"; + var String = "String"; + + var attributekey = ""; if (name.length > 1){ label = label + name + '.'; } - for (key in dataTest) { - array = isArray(dataTest[key]); - console.log(key , dataTest[key]); - if (!!dataTest[key] && typeof(dataTest[key])=="object") { + for (key in layOutData) { + array = isArray(layOutData[key]); + console.log("key: " + key , "value: " + layOutData[key]); + + if (!!layOutData[key] && typeof(layOutData[key])=="object") { + if (array==false && key!=="0"){ - $scope.labelLayout(label, key, array ); + + if($scope.dataOrderInfo){ + var labelObject = {"label" : key, "level" : label, "array" : array}; + //save it to the list + $scope.layOutOnlyLableList.push(labelObject); + + }else { + //call label layout + $scope.labelLayout(label, key, array ); + } + } if (array == true && key!=0){ @@ -452,22 +705,33 @@ angular.module('abs').controller('dcaeMicroServiceController', function ($scope, if (lableList.length > 0){ array = true; } - if ( key=="0"){ + if ( key==="0"){ var newKey = lableList.pop(); - $scope.labelLayout(baseLevel, newKey, array ); + + if($scope.dataOrderInfo){ + + var labelObject = {"label" : newKey, "level" : baseLevel, "array" : array}; + //save it to the list + $scope.layOutOnlyLableList.push(labelObject); + + }else { + //call label layout + $scope.labelLayout(baseLevel, newKey, array ); + } + if (array){ label = baseLevel + newKey + '@0.'; } else { label = baseLevel + newKey + '.'; } } - deconstructJSON(dataTest[key] , label, key); + deconstructJSON(layOutData[key] , label, key); } else { var attirbuteLabel = label; var defaultValue=''; var isRequired = false; - if (dataTest[key].includes('defaultValue-')){ - defaultValue = dataTest[key].split('defaultValue-')[1]; + if (layOutData[key].includes('defaultValue-')){ + defaultValue = layOutData[key].split('defaultValue-')[1]; } if (key==="0"){ @@ -478,46 +742,214 @@ angular.module('abs').controller('dcaeMicroServiceController', function ($scope, attributekey = key.split(); } - if (dataTest[key].includes('required-true')){ + if (layOutData[key].includes('required-true')){ isRequired = true; } - console.log("attirbuteLabel = " + attirbuteLabel); - switch (dataTest[key].split(splitcolon)[0]){ + + var subAttributes = $scope.dcaeModelData.sub_attributes; + + if(subAttributes){ + var jsonObject = JSON.parse(subAttributes); + + var lablInfo = findVal(jsonObject, attributekey); + console.log("deconstructJSON:findValue : " + attributekey +": "+ lablInfo); + if (lablInfo){ + if(lablInfo.includes('required-true')){ + isRequired = true; + } + }else{ + var allkeys = Object.keys(jsonObject); + if(allkeys){ + for (var k = 0; k < allkeys.length; k++) { + var keyValue = allkeys[k]; + console.log(" keyValue:jsonObject["+keyValue+ "]: " + jsonObject[keyValue]); + if(jsonObject[keyValue]){ + var tempObject = jsonObject[keyValue]; + if(tempObject && tempObject[key]){ + if (tempObject[key].includes('required-true')){ + isRequired = true; + } + } + } + } + } + } + } + + var elementObject = {}; + switch (layOutData[key].split(splitcolon)[0]){ + case stringValue: - $scope.attributeBox(attributekey, array, attirbuteLabel, defaultValue, isRequired); - break; + case string: + if($scope.dataOrderInfo){ + elementOrderNum++; + elementObject = {"id": elementOrderNum,"attributekey" : attributekey, "array": array, "attirbuteLabel" : attirbuteLabel, "defaultValue": defaultValue, "isRequired": isRequired, "type":"text"}; + $scope.layOutElementList.push(elementObject); + }else{ + $scope.attributeBox(attributekey, array, attirbuteLabel, defaultValue, isRequired, "text"); + } + break; case intValue: - $scope.attributeBox(attributekey, array, attirbuteLabel, defaultValue, isRequired); - break; + case integerValue: + if($scope.dataOrderInfo){ + elementOrderNum++; + elementObject = {"id": elementOrderNum,"attributekey" : attributekey, "array": array, "attirbuteLabel" : attirbuteLabel, "defaultValue": defaultValue,"isRequired": isRequired, "type":"number"}; + $scope.layOutElementList.push(elementObject); + }else{ + $scope.attributeBox(attributekey, array, attirbuteLabel, defaultValue, isRequired, "number"); + } + break; case double: - $scope.attributeBox(attributekey, array, attirbuteLabel, defaultValue, isRequired); + if($scope.dataOrderInfo){ + elementOrderNum++; + elementObject = {"id": elementOrderNum,"attributekey" : attributekey, "array": array, "attirbuteLabel" : attirbuteLabel, "defaultValue": defaultValue,"isRequired": isRequired, "type":"double"}; + $scope.layOutElementList.push(elementObject); + }else{ + $scope.attributeBox(attributekey, array, attirbuteLabel, defaultValue, isRequired, "double"); + } break; case boolean: - $scope.dropBoxLayout(attirbuteLabel, attributekey, array, dataTest[key], getBooleanList()); + if($scope.dataOrderInfo){ + elementOrderNum++; + elementObject = {"id": elementOrderNum,"attributekey" : attributekey, "array": array, "attirbuteLabel" : attirbuteLabel, "defaultValue": layOutData[key], "list": getBooleanList, "isRequired": isRequired, "type":"dropBox"}; + $scope.layOutElementList.push(elementObject); + }else{ + $scope.dropBoxLayout(attirbuteLabel, attributekey, array, layOutData[key], getBooleanList()); + } break; default: - if (dataTest[key].includes('dictionary-')){ - var list = getDictionary(dataTest[key].split('dictionary-')[1]); + if (layOutData[key].includes('dictionary-')){ + var list = getDictionary(layOutData[key].split('dictionary-')[1]); }else{ - var list = getList(dataTest[key]); + //--- get dropdown values from enumValues + var list = getList(layOutData[key]); } - if (list.length===0){ - $scope.attributeBox(attributekey, array, attirbuteLabel, defaultValue, isRequired); + if (list.length===0){ //not dropdown element + if($scope.dataOrderInfo){ + elementOrderNum++; + elementObject = {"id": elementOrderNum,"attributekey" : attributekey, "array": array, "attirbuteLabel" : attirbuteLabel, "defaultValue": defaultValue,"isRequired": isRequired, "type":"text"}; + $scope.layOutElementList.push(elementObject); + + }else{ + $scope.attributeBox(attributekey, array, attirbuteLabel, defaultValue, isRequired, "text"); + } }else{ - $scope.dropBoxLayout(attirbuteLabel, attributekey, array, dataTest[key], list); + if($scope.dataOrderInfo){ + elementOrderNum++; + elementObject = {"id": elementOrderNum, "attributekey" : attributekey, "array": array, "attirbuteLabel" : attirbuteLabel, "defaultValue": layOutData[key],"isRequired": isRequired, "list":list, "type":"dropBox"}; + $scope.layOutElementList.push(elementObject); + }else{ + $scope.dropBoxLayout(attirbuteLabel, attributekey, array, layOutData[key], list, isRequired); + } } break; } } } } + + + $scope.validContionalRequired = function(parentId) { + console.log("ng-blur event: parentId : " + parentId); + var c = document.getElementById(parentId).children; + var i; + var hasValue = false; + for (i = 0; i < c.length; i++) { + if(c[i].getAttribute("data-conditional")){ + console.log(c[i].getAttribute("data-conditional")); + console.log(c[i].value); + if(c[i].value != null && c[i].value.trim() != ""){ + hasValue = true; + } + } + } + + for (i = 0; i < c.length; i++) { + if(c[i].getAttribute("data-conditional")){ + if(hasValue){ + c[i].setAttribute("required", true); + }else{ + c[i].removeAttribute("required"); + } + } + } + } + + $scope.jsonLayout = function(layOutData){ + + deconstructJSON(layOutData , "", ""); + + var orderValue = $scope.dataOrderInfo; + var layOutElementList = $scope.layOutElementList; + var labelList = $scope.layOutOnlyLableList; + + //reset to default + elementOrderNum = 0; + $scope.layOutElementList = []; + $scope.layOutOnlyLableList = []; + + // Only layout in order if order info provided + if(orderValue){ + + if(orderValue.includes("[")){ + orderValue = orderValue.replace("[", "") ; + orderValue = orderValue.replace("]", "") ; + } + + orderValue = orderValue.split(',') ; + + for (var i = 0; i < orderValue.length; i++) { + console.log("orderValue["+i+"]"+ orderValue[i]); + var key = orderValue[i].trim(); + + //--- Create labels first {"label" : newKey, "level" : baseLevel, "array" : array}; + if(labelList){ + for (var k = 0; k < labelList.length; k++){ + + var label = labelList[k].label.toString().trim(); + var level = labelList[k].level.toString().trim(); + var array = labelList[k].array; + + if(key == label){ + $scope.labelLayout(level, label, array); + //in case to have duplicate label names + labelList[k].label = "*processed*"; + break; + } + } + } + //--- then layout each element based on its order defined in YAML file + for (var j = 0; j < layOutElementList.length; j++) { + + var attributekey = layOutElementList[j].attributekey.toString().trim(); + + if(key == attributekey){ - $scope.jsonLayout = function(dataTest){ - deconstructJSON(dataTest , "", ""); + var attirbuteLabel = layOutElementList[j].attirbuteLabel.toString().trim(); + var defaultValue = layOutElementList[j].defaultValue.toString().trim(); + var isRequired = layOutElementList[j].isRequired; + + console.log("layOutElementList[" +j+ "]: id:" + layOutElementList[j].id + ", attributekey:"+ layOutElementList[j].attributekey + ", attirbuteLabel:" + layOutElementList[j].attirbuteLabel); + console.log("layOutElementList[" +j+ "]: type:" + layOutElementList[j].type); + if (layOutElementList[j].type == "dropBox"){ + $scope.dropBoxLayout(attirbuteLabel, attributekey, layOutElementList[j].array, defaultValue, layOutElementList[j].list, isRequired); + + }else{ + $scope.attributeBox(attributekey, layOutElementList[j].array, attirbuteLabel, defaultValue, isRequired, layOutElementList[j].type); + + } + + //in case to have duplicate attribute names + layOutElementList[j].attributekey = "*processed*"; + break; + } + } + } + } } - $scope.attributeBox = function(attibuteKey, attributeManyKey, labelValue, defaultValue, isRequired){ + $scope.attributeBox = function(attibuteKey, attributeManyKey, labelValue, defaultValue, isRequired, dataType ){ $scope.temp.policy.ruleGridData.push(attibuteKey); var br = document.createElement("BR"); @@ -525,11 +957,11 @@ angular.module('abs').controller('dcaeMicroServiceController', function ($scope, var labeltext = null; var requiredLabName = ""; if (matching.includes(attibuteKey)){ - labeltext = document.createTextNode(attibuteKey + "*!"); + labeltext = document.createTextNode(attibuteKey + "*!"); + isRequired = true; //set required as true for matching element }else { - //var labeltext = document.createTextNode(refattributeLabel); if(isRequired){ - requiredLabName = attibuteKey + " *"; + requiredLabName = attibuteKey + " * "; labeltext = document.createTextNode(requiredLabName); }else{ labeltext = document.createTextNode(attibuteKey); @@ -550,45 +982,96 @@ angular.module('abs').controller('dcaeMicroServiceController', function ($scope, var textField = document.createElement("INPUT"); textField.setAttribute("class" , "form-control"); - textField.setAttribute("type" , "text"); + if(dataType){ + if(dataType == "double"){ + textField.setAttribute("type" , "number"); + textField.setAttribute("step" , "any"); + }else{ + textField.setAttribute("type" , dataType); + } + } textField.setAttribute("style" , "width:300px;"); textField.setAttribute("ng-disabled" , "temp.policy.readOnly"); var checkKey; + var id = ""; if(attributeManyKey){ checkKey = labelValue + attibuteKey+'@0'; - textField.setAttribute("id" , ''+labelValue + attibuteKey+'@0'+''); + textField.setAttribute("id" , ''+labelValue + attibuteKey+'@0'+''); var divTag = document.createElement("div"); divTag.setAttribute("id", "div."+ labelValue +attibuteKey); var addButton = document.createElement("BUTTON"); var buttonaddLabel = document.createTextNode("+"); addButton.appendChild(buttonaddLabel); addButton.setAttribute("id", labelValue + attibuteKey); - addButton.setAttribute("class", "btn btn-default"); - addButton.setAttribute("ng-click" , 'addNewChoice("'+labelValue + attibuteKey+'");'); + addButton.setAttribute("class", "btn btn-add-remove"); + addButton.setAttribute("onclick" , 'addNewChoice("'+labelValue + attibuteKey+'");'); addButton.setAttribute("ng-disabled" , "temp.policy.readOnly"); var removeButton = document.createElement("BUTTON"); var buttonremoveLabel = document.createTextNode("-"); removeButton.appendChild(buttonremoveLabel); - removeButton.setAttribute("class", "btn btn-default"); - removeButton.setAttribute("ng-click" , 'removeChoice("'+labelValue + attibuteKey+'");'); + removeButton.setAttribute("class", "btn btn-add-remove"); + removeButton.setAttribute("onclick" , 'removeChoice("'+labelValue + attibuteKey+'");'); removeButton.setAttribute("ng-disabled" , "temp.policy.readOnly"); document.getElementById(divID).appendChild(addButton); document.getElementById(divID).appendChild(removeButton); - document.getElementById(divID).appendChild(label); - document.getElementById(divID).appendChild(textField); - document.getElementById(divID).appendChild(br); + document.getElementById(divID).appendChild(label); + id = "div."+labelValue+attibuteKey; + //var divTag = document.createElement("div"); + divTag.setAttribute("id", id); + document.getElementById(divID).appendChild(divTag); + textField.className += ' first_child'; + if(isRequired){ + textField.setAttribute("required", "true"); + } + divTag.appendChild(textField); document.getElementById(divID).appendChild(divTag); + }else{ checkKey = labelValue + attibuteKey; textField.setAttribute("id" , ''+labelValue +attibuteKey+''); - if(requiredLabName.includes("*")){ - textField.setAttribute("required", "true"); + if(document.getElementById(divID).hasAttribute('required') || !document.getElementById(divID).hasAttribute('data-conditional')){ + if(requiredLabName.includes("*") || isRequired){ + textField.setAttribute("required", "true"); + } + }else if (document.getElementById(divID).hasAttribute('data-conditional')){ + if(requiredLabName.includes("*")){ + var requiredNode = document.createElement('span'); + requiredNode.setAttribute("class", "mstooltip"); + requiredNode.textContent = "?"; + label.appendChild(requiredNode); + + var requiredNodeToolTip = document.createElement('span'); + requiredNodeToolTip.setAttribute("class", "tooltiptext"); + requiredNodeToolTip.textContent = "Conditional Required"; + requiredNode.appendChild(requiredNodeToolTip); + + textField.setAttribute("data-conditional", divID); + textField.setAttribute("ng-blur", "validContionalRequired('"+divID+"')"); + } } + document.getElementById(divID).appendChild(label); document.getElementById(divID).appendChild(textField); document.getElementById(divID).appendChild(br); } + + if(divID.includes("@0") && divID.includes("div.")){ + var firstChild_Id = divID.split("@0")[0]; + var firstChild_element = document.getElementById(firstChild_Id); + if(firstChild_element){ + + if(!firstChild_element.className.includes('children_group border')){ + layer++; + if(layer > 4){ + layer = 1 + }; + firstChild_element.className += ' children_group border' + layer; //here is div with a group of children. + } + } + } + console.log('firstChild_Id: ' + firstChild_Id); + console.log('divID: ' + divID); if (defaultValue.length > 0){ if(defaultValue.includes(":")){ @@ -597,33 +1080,28 @@ angular.module('abs').controller('dcaeMicroServiceController', function ($scope, defaultValue = ""; } } - document.getElementById(checkKey).value = defaultValue; + if(defaultValue != "undefined" && defaultValue != undefined && defaultValue != "null"){ + document.getElementById(checkKey).value = defaultValue; + } } if($scope.temp.policy.ruleData != null){ //document.getElementById(checkKey).value = $scope.temp.policy.ruleData[checkKey]; if (attributeManyKey){ var newCheckKey = checkKey.replace(attibuteKey + '@0',attibuteKey); - document.getElementById(newCheckKey +'@0').value = $scope.temp.policy.ruleData[newCheckKey +'@0']; - var i =1 ; - while(true){ - var newValue = $scope.temp.policy.ruleData[newCheckKey+'@'+i]; - if(newValue==null){ - break; - }else{ - $scope.addNewChoice(newCheckKey); - document.getElementById(newCheckKey+'@'+i).value = newValue; - i = i+1; - } - } - + if($scope.temp.policy.ruleData[newCheckKey +'@0'] != undefined && $scope.temp.policy.ruleData[newCheckKey +'@0'] != "undefined"){ + document.getElementById(newCheckKey +'@0').value = $scope.temp.policy.ruleData[newCheckKey +'@0']; + } }else{ - document.getElementById(checkKey).value = $scope.temp.policy.ruleData[checkKey]; + if($scope.temp.policy.ruleData[checkKey] != undefined && $scope.temp.policy.ruleData[checkKey] != "undefined"){ + document.getElementById(checkKey).value = $scope.temp.policy.ruleData[checkKey]; + } } } plainAttributeKeys.push(labelValue + attibuteKey+'*'+attributeManyKey); }; + $scope.labelManyKeys = []; $scope.labelLayout = function(labelValue, lableName, labelManyKey ){ var label = document.createElement("Label") var divID = labelValue; @@ -639,22 +1117,40 @@ angular.module('abs').controller('dcaeMicroServiceController', function ($scope, var divID = 'div.'+ labelValue.substring(0, labelValue.length-1); } - var labeltext = document.createTextNode(lableName); + var subAttributes = $scope.dcaeModelData.sub_attributes; + var jsonObject = JSON.parse(subAttributes); + var lablInfo = findVal(jsonObject, lableName); + console.log("findValue : " + lableName +": "+ lablInfo); + var star = ""; + var required = null; + if(lablInfo){ + if(typeof lablInfo === 'string' ){ + if(lablInfo.includes("required-true")){ + star = " *"; + required = true; + }else if (lablInfo.includes("required-false")){ + required = false + } + } + } + + var labeltext = document.createTextNode(lableName + star); label.appendChild(labeltext); + if(labelManyKey){ var addButton = document.createElement("BUTTON"); var buttonLabel = document.createTextNode("+"); addButton.appendChild(buttonLabel); - addButton.setAttribute("class", "btn btn-default"); - addButton.setAttribute("ng-click" , 'addNewChoice("'+labelValue + lableName+'");'); + addButton.setAttribute("class", "btn btn-add-remove"); + addButton.setAttribute("onclick" , 'addNewChoice("'+labelValue + lableName+'");'); addButton.setAttribute("ng-disabled" , "temp.policy.readOnly"); var removeButton = document.createElement("BUTTON"); var buttonremoveLabel = document.createTextNode("-"); removeButton.appendChild(buttonremoveLabel); - removeButton.setAttribute("class", "btn btn-default"); - removeButton.setAttribute("ng-click" , 'removeChoice("'+labelValue +lableName+'");'); + removeButton.setAttribute("class", "btn btn-add-remove"); + removeButton.setAttribute("onclick" , 'removeChoice("'+labelValue +lableName+'");'); removeButton.setAttribute("ng-disabled" , "temp.policy.readOnly"); document.getElementById(divID).appendChild(addButton); document.getElementById(divID).appendChild(removeButton); @@ -665,76 +1161,163 @@ angular.module('abs').controller('dcaeMicroServiceController', function ($scope, document.getElementById(divID).appendChild(divTag); var divTag = document.createElement("div"); - divTag.setAttribute("id", id +'@0'); + divTag.setAttribute("id", id +'@0'); + + if(!divTag.className.includes('children_group border')){ + layer++; + if(layer > 4){ + layer = 1 + }; + divTag.className += ' children_group border' + layer; //here is div with a group of children. + } + if(required){ + divTag.setAttribute("required", required); + }else if(required == false){ + divTag.setAttribute("data-conditional", "yes"); + } + document.getElementById(id).appendChild(divTag); + + $scope.labelManyKeys.push(lableName); + }else{ var divTag = document.createElement("div"); divTag.setAttribute("id", "div."+labelValue+lableName); + + if(!divTag.className.includes('children_group border')){ + layer++; + if(layer > 4){ + layer = 1 + }; + divTag.className += ' children_group border' + layer; //here is div with a group of children. + } + if(required){ + divTag.setAttribute("required", required); + }else if(required == false){ + divTag.setAttribute("data-conditional", "yes"); + } document.getElementById(divID).appendChild(label); - document.getElementById(divID).appendChild(divTag); + document.getElementById(divID).appendChild(divTag); } }; - $scope.dropBoxLayout = function(labelLevel, attributeName, many , refValue, listemunerateValues){ - var br = document.createElement("BR"); - - if (labelLevel.length < 1){ - var divID = "DynamicTemplate"; - } else if (labelLevel.endsWith('.')){ - var divID = 'div.'+ labelLevel.substring(0, labelLevel.length-1); - } - - - var label = document.createElement("Label") - if (matching.includes(attributeName)){ - var labeltext = document.createTextNode(attributeName + "*!"); - }else { - var labeltext = document.createTextNode(attributeName); - } - label.appendChild(labeltext); - - var listField = document.createElement("SELECT"); - listField.setAttribute("class" , "form-control"); - listField.setAttribute("style" , "width:300px;"); - listField.setAttribute("ng-disabled" , "temp.policy.readOnly"); - - for (i=0; i < listemunerateValues.length; i += 1) { - option = document.createElement('option'); - option.setAttribute('value', listemunerateValues[i]); - option.appendChild(document.createTextNode(listemunerateValues[i])); - listField.appendChild(option); - } - listField.setAttribute("id" , ''+ labelLevel + attributeName + '');; - document.getElementById(divID).appendChild(label); - document.getElementById(divID).appendChild(br); + $scope.dropBoxLayout = function(labelLevel, attributeName, many , refValue, listemunerateValues, isRequired){ + var br = document.createElement("BR"); + + if (labelLevel.length < 1){ + var divID = "DynamicTemplate"; + } else if (labelLevel.endsWith('.')){ + var divID = 'div.'+ labelLevel.substring(0, labelLevel.length-1); + } + + + var label = document.createElement("Label") - if(many == true){ - document.getElementById(divID).appendChild(listField).multiple = true; - plainAttributeKeys.push(labelLevel + attributeName+'*'+true); - }else { - document.getElementById(divID).appendChild(listField).multiple = false; - plainAttributeKeys.push(labelLevel + attributeName+'*'+false); - } + var refAttributes = $scope.dcaeModelData.ref_attributes; + if(isRequired != true && refAttributes){ //check refAttributes also + var refAttributesList = refAttributes.split(splitComma); + for (k = 0; k < refAttributesList.length; k++){ + var refAttribute = refAttributesList[k].split(splitEqual); + if (attributeName == refAttribute[0].trim() && refAttribute[1].includes("required-true")){ + isRequired = true; + } + } + } + + if (matching.includes(attributeName)){ + var labeltext = document.createTextNode(attributeName + "*!"); + label.appendChild(labeltext); + isRequired = true; //set required as true for matching element + }else { + var labeltext = document.createTextNode(attributeName); + if(isRequired){ + var requiredLabName = attributeName+ " * "; + labeltext = document.createTextNode(requiredLabName); + }else{ + labeltext = document.createTextNode(attributeName); + } + + label.appendChild(labeltext); + } + label.appendChild(labeltext); + // if this field is required, but its parent is not required + if(isRequired && document.getElementById(divID).hasAttribute('data-conditional')){ + var requiredNode = document.createElement('span'); + requiredNode.setAttribute("class", "mstooltip"); + requiredNode.textContent = "?"; + label.appendChild(requiredNode); + + var requiredNodeToolTip = document.createElement('span'); + requiredNodeToolTip.setAttribute("class", "tooltiptext"); + requiredNodeToolTip.textContent = "Conditional Required"; + requiredNode.appendChild(requiredNodeToolTip); - if($scope.temp.policy.ruleData != null){ - if (many == true){ - document.getElementById(labelLevel +attributeName).options[0].selected = false; + } + + var listField = document.createElement("SELECT"); + listField.setAttribute("class" , "form-control"); + listField.setAttribute("style" , "width:300px;"); + listField.setAttribute("ng-disabled" , "temp.policy.readOnly"); + + if(isRequired){ + if(document.getElementById(divID).hasAttribute('data-conditional')){ + listField.setAttribute("data-conditional", divID); + listField.setAttribute("ng-blur", "validContionalRequired('"+divID+"')"); + }else{ + listField.setAttribute("required", true); + } + } + if( many != true || isRequired != true){ // add an empty option for not required or not multiple select element + var optionFirst = document.createElement('option'); + optionFirst.setAttribute('value', ""); + listField.appendChild(optionFirst); + } + for (i=0; i < listemunerateValues.length; i += 1) { - var testValue = $scope.temp.policy.ruleData[labelLevel +attributeName+'@' + i]; - if (testValue === undefined){ - testValue = $scope.temp.policy.ruleData[labelLevel +attributeName]; - } - var location = listemunerateValues.indexOf(testValue); - if (location!=-1){ - document.getElementById(labelLevel +attributeName).options[location].selected = true; - } - } + if(listemunerateValues[i].includes("equal-sign")){ + listemunerateValues[i] = listemunerateValues[i].replace('equal-sign','='); + } + option = document.createElement('option'); + option.setAttribute('value', listemunerateValues[i]); + option.appendChild(document.createTextNode(listemunerateValues[i])); + option.setAttribute('value', listemunerateValues[i]); + listField.appendChild(option); + } + listField.setAttribute("id" , ''+ labelLevel + attributeName + ''); + + enumKeyList.push(attributeName); + + document.getElementById(divID).appendChild(label); + document.getElementById(divID).appendChild(br); + + if(many == true){ + document.getElementById(divID).appendChild(listField).multiple = true; + plainAttributeKeys.push(labelLevel + attributeName+'*'+true); }else { - document.getElementById(labelLevel + attributeName).value = $scope.temp.policy.ruleData[labelLevel + attributeName]; - + document.getElementById(divID).appendChild(listField).multiple = false; + plainAttributeKeys.push(labelLevel + attributeName+'*'+false); } - } - }; + + if($scope.temp.policy.ruleData != null){ + if (many == true){ + document.getElementById(labelLevel +attributeName).options[0].selected = false; + for (i=0; i < listemunerateValues.length; i += 1) { + var testValue = $scope.temp.policy.ruleData[labelLevel +attributeName+'@' + i]; + if (testValue === undefined){ + testValue = $scope.temp.policy.ruleData[labelLevel +attributeName]; + } + var location = listemunerateValues.indexOf(testValue); + if (location!=-1){ + document.getElementById(labelLevel +attributeName).options[location].selected = true; + } + } + }else { + if($scope.temp.policy.ruleData[labelLevel + attributeName] != undefined && $scope.temp.policy.ruleData[labelLevel + attributeName] != "undefined"){ + document.getElementById(labelLevel + attributeName).value = $scope.temp.policy.ruleData[labelLevel + attributeName]; + } + } + } + }; function onlyUnique(value, index, self) { return self.indexOf(value) === index; @@ -750,6 +1333,11 @@ angular.module('abs').controller('dcaeMicroServiceController', function ($scope, } $scope.savePolicy = function(policy){ + if(policy.itemContent != undefined){ + $scope.refreshCheck = true; + $scope.policyNavigator = policy.itemContent; + policy.itemContent = ""; + } $scope.savebutton = false; var splitAt = '*'; var dot ='.'; @@ -757,7 +1345,7 @@ angular.module('abs').controller('dcaeMicroServiceController', function ($scope, if(plainAttributeKeys != null){ for(a = 0; a < plainAttributeKeys.length; a++){ var splitPlainAttributeKey = plainAttributeKeys[a].split(splitAt); - console.log(splitPlainAttributeKey[1]); + console.log("splitPlainAttributeKey: " + splitPlainAttributeKey); var searchElement = document.getElementById(splitPlainAttributeKey[0]); var key = splitPlainAttributeKey[0]; if(searchElement == null){ @@ -774,28 +1362,20 @@ angular.module('abs').controller('dcaeMicroServiceController', function ($scope, if (elumentLocation > 1){ enumKey = keySplit[keySplit.length - 1]; } - var aWhiteSpace = " "; - if (enumKeyList.indexOf(enumKey) != -1){ - if (splitPlainAttributeKey[1].indexOf("true") !== -1){ + //check it is undefined or not + if (enumKeyList != undefined && enumKeyList.indexOf(enumKey) != -1){ + if (splitPlainAttributeKey[1]!= undefined && splitPlainAttributeKey[1].indexOf("true") !== -1){ var multiSlect = []; for ( var i = 0; i < searchElement.selectedOptions.length; i++) { multiSlect.push(searchElement.selectedOptions[i].value); } jsonPolicy[key]= multiSlect; }else{ - //set a space due to empty value caused JSON format error in PolicyRestAdapter and remove it in back-end. - if(searchElement.value == ""){ - searchElement.value = aWhiteSpace; - } console.log(" searchElement.value = > " + searchElement.value); jsonPolicy[key]= searchElement.value; } } else { if(searchElement.value != null){ - //set a default value due to empty value caused JSON format error in PolicyRestAdapter - if(searchElement.value == ""){ - searchElement.value = aWhiteSpace; - } console.log(" searchElement.value = > " + searchElement.value); jsonPolicy[key]= searchElement.value; } @@ -867,6 +1447,11 @@ angular.module('abs').controller('dcaeMicroServiceController', function ($scope, }else{ jsonPolicy[key]= searchElement.value; } + if(searchElement.getAttribute("required")){ + if(!searchElement.value){ + return; + } + } } else { if(searchElement.value != null){ jsonPolicy[key]= searchElement.value; @@ -881,6 +1466,32 @@ angular.module('abs').controller('dcaeMicroServiceController', function ($scope, } } var uuu = "policyController/validate_policy.htm"; + + console.log("$scope.isCheck:" + $scope.isCheck); + + if($scope.isCheck == true){ + if(("configName" in policy) == false){ + Notification.error("Validation Failed: configName is required"); + $scope.savebutton = true; + return; + } + if(("location" in policy) == false){ + Notification.error("Validation Failed: location is required"); + $scope.savebutton = true; + return; + } + if(("uuid" in policy) == false){ + Notification.error("Validation Failed: uuid is required"); + $scope.savebutton = true; + return; + } + if(("policyScope" in policy) == false){ + Notification.error("Validation Failed: policyScope is required"); + $scope.savebutton = true; + return; + } + } + var postData={policyData: policy, policyJSON : jsonPolicy}; $.ajax({ type : 'POST', @@ -926,4 +1537,4 @@ angular.module('abs').controller('dcaeMicroServiceController', function ($scope, } return obj; } -}); \ No newline at end of file +}]); \ No newline at end of file