'l2' : null,\r
'l3' : null};\r
\r
+ $scope.wizards = {\r
+ accessModelWizard: false,\r
+ actionReferenceWizard: false\r
+ };\r
+\r
$scope.setBreadcrumb = function(level, label, visible){\r
$scope.breadcrumbs[level] = visible ? label : null;\r
if(level === 'l1'){\r
\r
// TENANTS\r
$scope.tenantList = [];\r
+ $scope.selectedTenant = null;\r
$scope.tenantDisplayLabel = ['name' , 'id'];\r
\r
$scope.loadTenants = function() {\r
GBPTenantServices.load(\r
function(tenants) {\r
$scope.tenantList = tenants;\r
+ console.log('$scope.tenantList', $scope.tenantList);\r
},\r
function(){\r
//TODO error\r
DesignGbpFactory.setMainClass();\r
};\r
\r
+ $scope.setTenant = function(selectedTenant) {\r
+ $scope.selectedTenant = selectedTenant;\r
+ $scope.$broadcast('GBP_TENANT_RELOAD', $scope.selectedTenant);\r
+ };\r
+\r
$scope.loadTenants();\r
\r
$scope.$on('GBP_GLOBAL_TENANT_RELOAD',function(){\r
$scope.$broadcast(eventName, val);\r
};\r
\r
+\r
+ // TODO: rework, use $scope.setViewContent or something\r
+ $scope.showWizard = function(wizardName, broadcast, broadcastedData, path) {\r
+ $scope.wizards[wizardName] = true;\r
+\r
+ if ( broadcast ) {\r
+ $scope.sendReloadEventFromRoot(broadcast, {data: broadcastedData, path: path});\r
+ }\r
+ };\r
+\r
+ $scope.closeWizard = function(wizardName) {\r
+ $scope.wizards[wizardName] = false;\r
+ };\r
+\r
+ $scope.updateList = function(list, object, key) {\r
+ var elementPos = list.map(function(x) {return x[key]; }).indexOf(object[key]);\r
+\r
+ if(elementPos < 0) {\r
+ list.push(object);\r
+ }\r
+ else {\r
+ list[elementPos] = object;\r
+ }\r
+ };\r
+\r
}]);\r
\r
gbp.register.controller('governanceCtrl', ['$rootScope','$scope',\r
$scope.menuTpl = 'main-menu';\r
$scope.menuBox = null;\r
$scope.contentTpl = 'main';\r
- $scope.selectedTenant = null;\r
+ // $scope.selectedTenant = null;\r
$scope.rendererList = [];\r
var broadcastObj = {};\r
\r
}\r
};\r
\r
- $scope.setTenant = function(selectedTenant) {\r
- $scope.selectedTenant = selectedTenant;\r
- $scope.$broadcast('GBP_TENANT_RELOAD');\r
- };\r
+ \r
\r
$scope.setViewContent = function(tplName, data, broadcast, tplType) {\r
\r
$scope.$on('GOV_INIT', function(){\r
$scope.menuTpl = 'main-menu';\r
$scope.contentTpl = 'main';\r
- $scope.$emit('GBP_GLOBAL_TENANT_RELOAD');\r
+ // $scope.$emit('GBP_GLOBAL_TENANT_RELOAD');\r
$scope.menuBox = null;\r
});\r
\r
+ $scope.$on('GBP_TENANT_RELOAD', function(e, obj){\r
+ $scope.selectedTenant = obj;\r
+ });\r
+\r
\r
}]);\r
\r
\r
JointGraphFactory.reloadGraph(paper.model);\r
\r
- $scope.selectedTenant.contract.forEach(function(c, i) {\r
- var label = c.description ? $scope.sliceLabel(c.description) : c.id,\r
- width = JointGraphFactory.getLabelLength(label.length);\r
- item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.contract, c, 'Click to see contract info', GBPConstants.colors.graph['subject'], 'Contract');\r
+ if ( $scope.selectedTenant && $scope.selectedTenant.contract ) {\r
+\r
+ $scope.selectedTenant.contract.forEach(function(c, i) {\r
+ var label = c.description ? $scope.sliceLabel(c.description) : c.id,\r
+ width = JointGraphFactory.getLabelLength(label.length);\r
+ item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.contract, c, 'Click to see contract info', GBPConstants.colors.graph['subject'], 'Contract');\r
\r
- itemsArray.contract.push(item);\r
+ itemsArray.contract.push(item);\r
\r
- JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper);\r
- JointGraphFactory.addItem(paper.model, item);\r
- contractItems[c.id] = item;\r
- });\r
+ JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper);\r
+ JointGraphFactory.addItem(paper.model, item);\r
+ contractItems[c.id] = item;\r
+ });\r
\r
- offsetHobj.contract = offsetObj.h;\r
+ offsetHobj.contract = offsetObj.h;\r
\r
- JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, offsetObj.h > 400 ? offsetObj.h : 400);\r
- $scope.selectedTenant['endpoint-group'].forEach(function(e, i) {\r
- var label = e.name || e.id,\r
- width = JointGraphFactory.getLabelLength(label.length);\r
- item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.epg, e, 'Click to see epg info', GBPConstants.colors.graph['pns'], 'EP group');\r
+ }\r
\r
- itemsArray.epg.push(item);\r
+ if ( $scope.selectedTenant && $scope.selectedTenant['endpoint-group'] ) {\r
\r
- JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper);\r
- JointGraphFactory.addItem(paper.model, item);\r
- epgItems[e.id] = item;\r
+ JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, offsetObj.h > 400 ? offsetObj.h : 400);\r
+ $scope.selectedTenant['endpoint-group'].forEach(function(e, i) {\r
+ var label = e.name || e.id,\r
+ width = JointGraphFactory.getLabelLength(label.length);\r
+ item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.epg, e, 'Click to see epg info', GBPConstants.colors.graph['pns'], 'EP group');\r
\r
- createEpgLinks(e, item, contractItems);\r
- });\r
+ itemsArray.epg.push(item);\r
+\r
+ JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper);\r
+ JointGraphFactory.addItem(paper.model, item);\r
+ epgItems[e.id] = item;\r
+\r
+ createEpgLinks(e, item, contractItems);\r
+ });\r
+ \r
+ }\r
\r
offsetHobj.epg = JointGraphOffsetFactory.getCurrentOffset(itemsArray.contract, 'y');\r
JointGraphOffsetFactory.checkObjsHoffsets(itemsArray.epg ,offsetHobj.epg, paper);\r
loadData();\r
}]);\r
\r
- gbp.register.controller('epgDetailCtrl', ['$scope', 'JointGraphFactory', 'TopologyDataLoaders', 'GBPEpgServices', 'JointGraphOffsetFactory', 'GBPConstants',\r
+ gbp.register.controller('epgDetailCtrl', ['$scope', 'JointGraphFactory', 'TopologyDataLoaders', 'GBPEpgServices', 'JointGraphOffsetFactory', 'GBPConstants',\r
function ($scope, JointGraphFactory, TopologyDataLoaders, GBPEpgServices, JointGraphOffsetFactory, GBPConstants) {\r
var paper = JointGraphFactory.createGraph(),\r
epgItem = {},\r
button: false\r
};\r
\r
- $scope.wizards = {\r
- accessModelWizard: false\r
- };\r
\r
- $scope.selectedTenant = null;\r
+ // $scope.selectedTenant = null;\r
\r
$scope.mandatoryProperties = [];\r
$scope.loadTopology = function(type, args) {\r
}\r
};\r
\r
- $scope.setTenant = function() {\r
- $scope.$broadcast('GBP_TENANT_RELOAD');\r
+ $scope.loadTopo = function() {\r
if($scope.selectedTenant) {\r
$scope.loadTopology($scope.topologyType, { tenantId: $scope.selectedTenant.id });\r
}\r
$scope.validateForm = function(form) {\r
return form.$valid;\r
};\r
+ \r
+ $scope.$on('GBP_TENANT_RELOAD', function(e, obj){\r
+ $scope.selectedTenant = obj;\r
+ });\r
\r
- $scope.showWizard = function(wizardName) {\r
- $scope.wizards[wizardName] = true;\r
- };\r
-\r
- $scope.closeWizard = function(wizardName) {\r
- $scope.wizards[wizardName] = false;\r
- };\r
-\r
- \r
}]);\r
\r
gbp.register.controller('topoDataCtrl',['$scope', 'TopoServices', function($scope, TopoServices){\r
//console.info($scope.parameter, ' got GBP_SET_PARAM_VALUE', name, intVal, strVal, event);\r
\r
});\r
+\r
+ $scope.$on('GBP_RESET_PARAM', function(event){\r
+ $scope.value = null;\r
+ });\r
}]);\r
\r
gbp.register.controller('classifiersCtrl', ['$scope', 'GBPClassifierInstanceServices', 'GPBServices', '$filter',\r
});\r
};\r
\r
- $scope.updateList = function(list, object, key) {\r
- var elementPos = list.map(function(x) {return x[key]; }).indexOf(object[key]);\r
+ // $scope.updateList = function(list, object, key) {\r
+ // var elementPos = list.map(function(x) {return x[key]; }).indexOf(object[key]);\r
\r
- if(elementPos < 0) {\r
- list.push(object);\r
- }\r
- else {\r
- list[elementPos] = object;\r
- }\r
- };\r
+ // if(elementPos < 0) {\r
+ // list.push(object);\r
+ // }\r
+ // else {\r
+ // list[elementPos] = object;\r
+ // }\r
+ // };\r
}]);\r
\r
gbp.register.controller('wizardTenantCtrl', ['$scope', '$filter', 'GBPTenantServices', function($scope, $filter, GBPTenantServices){ \r
- $scope.tenantList = [];\r
+ // $scope.tenantList = [];\r
$scope.newTenantObj = GBPTenantServices.createObj();\r
$scope.displayLabel = ['name' , 'id'];\r
\r
tenantEdit: false\r
};\r
\r
- $scope.init = function() {\r
- $scope.getTenants();\r
- };\r
+ // $scope.init = function() {\r
+ // $scope.getTenants();\r
+ // };\r
\r
- $scope.getTenants = function() {\r
- GBPTenantServices.load(\r
- function(data) {\r
- $scope.tenantList = data;\r
- $scope.newTenantObj = GBPTenantServices.createObj();\r
- },\r
- function(){\r
- //TODO error\r
- }\r
- );\r
- };\r
+ // $scope.getTenants = function() {\r
+ // GBPTenantServices.load(\r
+ // function(data) {\r
+ // $scope.tenantList = data;\r
+ // $scope.newTenantObj = GBPTenantServices.createObj();\r
+ // },\r
+ // function(){\r
+ // //TODO error\r
+ // }\r
+ // );\r
+ // };\r
\r
$scope.reloadTenants = function(selectedObject) {\r
if(!selectedObject) {\r
});\r
}]);\r
\r
-\r
gbp.register.controller('rendererStateCtrl', ['$scope', 'GPBServices', function($scope, GPBServices){\r
$scope.data = {'subject-feature-definitions' : {}};\r
$scope.view_path = 'src/app/gbp/views/governance';\r
return result[type];\r
};\r
}]);\r
+\r
+ gbp.register.controller('actionReferenceWizardCtrl', ['$scope', '$filter', 'GBPRuleServices', 'GBPActionInstanceServices', function($scope, $filter, GBPRuleServices, GBPActionInstanceServices){ \r
+ $scope.wizardPage = null;\r
+ $scope.path = {};\r
+ $scope.rule = {};\r
+\r
+ $scope.actionInstanceNames = {'options' : [], 'labels' : "name"};\r
+\r
+ var actionInstanceNamesLoad = function() {\r
+ var actionInstancePath = GBPActionInstanceServices.createPathObj($scope.selectedTenant.id);\r
+ GBPActionInstanceServices.load(actionInstancePath, function(data){\r
+ $scope.actionInstanceNames.options = data;\r
+ },function(){\r
+ //TODO: error cbk\r
+ });\r
+ };\r
+\r
+ $scope.init = function() {\r
+ $scope.setPage('reference');\r
+ };\r
+\r
+ $scope.setPage = function(pageName, object) {\r
+ $scope.wizardPage = pageName;\r
+ };\r
+\r
+ $scope.submit = function() {\r
+ //if($scope.validateForm($scope.actionsForm)){\r
+ $scope.actionInstanceNames.options.forEach(function(i) {\r
+ path = GBPActionInstanceServices.createPathObj($scope.path.tenantId, i.name);\r
+ //saveParams();\r
+\r
+ GBPActionInstanceServices.send(path, i, function(data){\r
+ $scope.sendReloadEventFromRoot('GBP_ACTION_INSTANCE_RELOAD');\r
+ }, function(){\r
+ //TODO: error cbk\r
+ });\r
+ });\r
+ \r
+ //}\r
+\r
+ //if($scope.validateForm($scope.rulesForm)){\r
+ path = GBPRuleServices.createPathObj($scope.path.tenantId, $scope.path.contractId, $scope.path.subjectId, $scope.path.ruleId);\r
+ GBPRuleServices.send(path, $scope.rule, function(data){\r
+\r
+ $scope.wizards.actionReferenceWizard = false;\r
+ \r
+ //$scope.sendReloadEventFromRoot('GBP_TENANT_RELOAD');\r
+ }, function(){\r
+ //TODO: error cbk\r
+ });\r
+ //}\r
+ //$scope.\r
+ };\r
+\r
+ $scope.$on('ACTION_RULE_WIZARD_LOAD', function(event, data){\r
+ $scope.rule = angular.copy(data.data);\r
+ $scope.path = data.path;\r
+ });\r
+\r
+ $scope.$on('WIZARD_ACTIONREF_ADD', function(event, data){\r
+ if(!$scope.rule['action-ref']) {\r
+ $scope.rule['action-ref'] = [];\r
+ }\r
+ $scope.updateList($scope.rule['action-ref'], data, "name");\r
+ });\r
+\r
+ $scope.$on('WIZARD_ACTIONREF_DELETE', function(event, data){\r
+ $scope.rule['action-ref'].splice(data, 1);\r
+ });\r
+\r
+ $scope.$on('WIZARD_ACTIONINSTANCE_ADD', function(event, data){\r
+ $scope.updateList($scope.actionInstanceNames.options, data, "name");\r
+\r
+ $scope.setPage('reference');\r
+ });\r
+\r
+ $scope.$on('GBP_TENANT_RELOAD',function(){\r
+ actionInstanceNamesLoad();\r
+ });\r
+\r
+ }]);\r
+\r
+ gbp.register.controller('actionsRefListCtrl', ['$scope', '$filter', function($scope, $filter){ \r
+ \r
+ $scope.actionReferenceForm = false;\r
+\r
+ $scope.showForm = function(object) {\r
+ $scope.actionReferenceForm = true;\r
+ $scope.newActionRefObj = object || null;\r
+ };\r
+\r
+ $scope.closeForm = function() {\r
+ $scope.actionReferenceForm = false;\r
+ };\r
+\r
+ $scope.save = function(){\r
+ $scope.$emit('WIZARD_ACTIONREF_ADD', $scope.newActionRefObj);\r
+ $scope.resetObject();\r
+ };\r
+\r
+ $scope.deleteElemAt = function(index) {\r
+ $scope.$emit('WIZARD_ACTIONREF_DELETE', index);\r
+ $scope.resetObject();\r
+ };\r
+\r
+ $scope.resetObject = function() {\r
+ $scope.newActionRefObj = null;\r
+ };\r
+\r
+ \r
+\r
+ }]);\r
+\r
+ gbp.register.controller('actionInstanceWizardCtrl', ['$scope', '$filter', 'GPBServices', 'GBPActionInstanceServices', function($scope, $filter, GPBServices, GBPActionInstanceServices){ \r
+ $scope.actionDefinitions = {'options' : [], 'labels' : "name"};\r
+ $scope.newActionObj = GBPActionInstanceServices.createObj();\r
+\r
+ var loadDefinitions = function() {\r
+ GPBServices.getDefinitions(function(classifierDefs, actionDefs) {\r
+ $scope.actionDefinitions.options = actionDefs;\r
+ //$scope.getDisplayLabelsFromCtrl('GBP_ACTIONS_LABEL', $scope.actionDefinitions);\r
+ });\r
+ };\r
+\r
+ $scope.reloadDefs = function(){\r
+ $scope.defs = angular.copy($scope.getDefinitionObjParams($scope.newActionObj['action-definition-id']));\r
+\r
+ //TODO: rework\r
+ if($scope.defs.length && $scope.defs[0].name === 'sfc-chain-name') {\r
+ GPBServices.getServiceFunctionChains(function(data) {\r
+ $scope.serviceFunctionChains = data;\r
+ });\r
+ }\r
+ };\r
+\r
+ $scope.getDefinitionObjParams = function(id){\r
+ return GPBServices.getDefinitionObjParams($scope.actionDefinitions.options, id);\r
+ };\r
+\r
+ $scope.save = function(){\r
+ $scope.newActionObj['parameter-value'] = [];\r
+ $scope.$broadcast('GBP_SAVE_PARAM');\r
+ $scope.$emit('WIZARD_ACTIONINSTANCE_ADD', $scope.newActionObj);\r
+ $scope.resetObject();\r
+ };\r
+\r
+ $scope.resetObject = function() {\r
+ $scope.newActionObj = GBPActionInstanceServices.createObj();\r
+ };\r
+\r
+ $scope.saveParam = function() {\r
+ \r
+ };\r
+\r
+ $scope.addParam = function(name, type, value) {\r
+ $scope.newActionObj['parameter-value'].push(GPBServices.createParamObj(name, type, value));\r
+ };\r
+\r
+ loadDefinitions();\r
+\r
+ }]);\r
+\r
});\r
\r
\r
--- /dev/null
+<div ng-controller="actionReferenceWizardCtrl" ng-init="init()">
+ <div class="modal-canvas"></div>
+ <div class="modal-dialog">
+ <div class="modal-header">
+ <i class="icon-remove align-right padding" ng-click="closeWizard('actionReferenceWizard')"></i>
+ <h2>Action reference wizard</h2>
+ </div>
+ <aside class="modal-navigation">
+ <ul>
+ <li class="navigation-item {{wizardPage === 'reference' ? 'selected' : ''}}">References</li>
+ <li class="navigation-item {{wizardPage === 'instance' ? 'selected' : ''}}">Instances</li>
+ </ul>
+ </aside>
+ <section class="modal-content-container">
+ <div ng-show="wizardPage === 'reference'" ng-controller="actionsRefListCtrl">
+ <div class="content">
+ <label class="basicLabel mb0">Action references list:</label>
+ <table class="table table-hover">
+ <thead>
+ <tr>
+ <th>Order</th>
+ <th>Name</th>
+ <th><button class="btn btn-primary" tooltip="Add Action reference" ng-click="showForm()"><i class="icon-plus"></i></button></th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr ng-repeat="action in rule['action-ref'] track by $index | orderBy:'order'">
+ <th>{{action.order}}</th>
+ <td>{{action.name}}</td>
+ <td>
+ <button class="btn btn-primary" ng-click="showForm(action)" tooltil="Edit Action reference" >
+ <i class="icon-pencil"></i>
+ </button>
+ <button class="btn btn-danger" ng-click="deleteElemAt($index)" tooltip="Remove Action reference">
+ <i class="icon-remove"></i>
+ </button>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <div ng-show="actionReferenceForm">
+ <form name="actionRefForm" novalidate="novalidate">
+ <i class="icon-remove align-right padding" ng-click="closeForm()"></i>
+ <div class="rowWrapper">
+ <label class="block basicLabel"><span>Instance name:</span>
+ <i class="icon-exclamation-sign red" tooltip="Required field" ng-show="actionRefForm.name.$error.required"></i>
+ </label>
+ <select class="form-control" ng-model="newActionRefObj.name" ng-options="c.name as getDisplayLabel(c, actionInstanceNames.labels) for c in actionInstanceNames.options" name="name" ng-required="true" >
+ <option>--</option>
+ </select>
+ <button class="btn btn-primary" tooltip="Add Action instance" ng-click="setPage('instance')"><i class="icon-plus"></i></button>
+ </div>
+
+ <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newActionRefObj['order']">
+ <label class="block basicLabel"><span>Order:</span>
+ <i class="icon-exclamation-sign red" tooltip="Invalid pattern" ng-show="errors.int32"></i>
+ </label>
+ <input class="form-control" type="text" ng-model="newActionRefObj.order" ng-change="validate(newActionRefObj.order, errors)"/>
+ </div>
+
+ <div class="rowWrapper">
+ <button ng-click="save()" class="btn btn-primary col-md-12" ng-disabled="!actionRefForm.$valid">Save</button>
+ </div>
+ </form>
+ </div>
+
+ </div>
+ <div class="bottom-navigation clearfix">
+ <button class="btn btn-primary" ng-click="submit()">Submit</button>
+ </div>
+ </div>
+
+ <div ng-show="wizardPage === 'instance'" ng-controller="actionInstanceWizardCtrl" ng-init="init()">
+ <div class="content">
+ <section class="formWrapper clearfix">
+ <form name="actionsForm" novalidate="novalidate">
+ <label class="block">Add actions</label>
+
+ <div class="rowWrapper">
+ <label class="block basicLabel">Name
+ <i class="icon-exclamation-sign red" tooltip="{{actionsForm.name.$error.required ? 'Required field' : actionsForm.name.$error.pattern ? 'Value must start with letter followed by letters and digits without space' : ''}}" ng-show="actionsForm.name.$error.required || actionsForm.name.$error.pattern"></i>
+ </label>
+ <input class="form-control" type="text" name="name" ng-required="true" ng-model="newActionObj.name" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\-_.])*$/"/>
+ </div>
+
+ <div class="rowWrapper" ng-hide="edit === 'view' && !newActionObj['action-definition-id']">
+ <label class="block basicLabel">Definition</label>
+ <select class="form-control" ng-model="newActionObj['action-definition-id']" ng-options="d.id as getDisplayLabel(d, actionDefinitions.labels) for d in actionDefinitions.options" ng-change="reloadDefs()">
+ <option value="">Select option</option>
+ </select>
+ </div>
+
+ <div class="rowWrapper">
+ <div ng-repeat="param in defs">
+ <div class="row-param" ng-controller="paramCtrl" ng-init="init(param, newActionObj['parameter-value'])">
+ <div ng-show="param.type !== 'range' && param.name !== 'sfc-chain-name'">
+ <label class="block basicLabel">{{ parameter.name + ' (' + parameter.type + ')' }}:</label>
+ <input class="form-control" type="text" ng-model="value" ng-disabled="edit === 'view'"></input>
+ </div>
+ <div ng-show="param.name === 'sfc-chain-name'">
+ <label class="block basicLabel">Pick SFC:</label>
+ <input class="form-control" type="text" ng-model="value" disabled></input>
+ <table class="table table-hover">
+ <thead>
+ <tr>
+ <th>Symmetric</th>
+ <th>Name</th>
+ <th>Functions</th>
+ <th>Action</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr ng-repeat="chain in serviceFunctionChains">
+ <th>{{chain.symmetric}}</th>
+ <td>{{chain.name}}</td>
+ <td>
+ <ul>
+ <li ng-repeat="function in chain['sfc-service-function']">
+ {{function.name + ' - ' + function.type}}
+ </li>
+ </ul>
+ </td>
+ <td>
+ <button class="btn btn-primary" ng-click="$parent.value = chain.name" ng-disabled="value === chain.name">
+ {{value === chain.name ? 'picked' : 'pick'}}
+ </button>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <div ng-show="param.type === 'range'">
+ <label class="param-label">{{ parameter.name + ' (' + parameter.type + ')' }}:</label>
+
+ <input class="form-control narrow-input-left" type="text" ng-model="value.min" ng-disabled="edit === 'view'"></input>
+ <input class="form-control narrow-input-right" type="text" ng-model="value.max" ng-disabled="edit === 'view'"></input>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="edit === 'view'" ng-disabled="!actionsForm.$valid">Save</button>
+ </form>
+ </section>
+ </div>
+
+ <div class="bottom-navigation clearfix">
+ <button class="btn btn-primary" ng-click="setPage('reference')">Back</button>
+ </div>
+ </div>
+ </section>
+ </div>
+</div>
\ No newline at end of file